@adonis-agora/agent 0.60.1 → 0.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (707) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +12 -7
  3. package/dist/configure.d.ts +7 -5
  4. package/dist/configure.d.ts.map +1 -1
  5. package/dist/configure.js +9 -5
  6. package/dist/configure.js.map +1 -1
  7. package/dist/providers/a2a_provider.d.ts +14 -0
  8. package/dist/providers/a2a_provider.d.ts.map +1 -0
  9. package/dist/providers/a2a_provider.js +136 -0
  10. package/dist/providers/a2a_provider.js.map +1 -0
  11. package/dist/providers/agent_provider.d.ts.map +1 -1
  12. package/dist/providers/agent_provider.js +195 -11
  13. package/dist/providers/agent_provider.js.map +1 -1
  14. package/dist/providers/mcp_provider.d.ts +3 -0
  15. package/dist/providers/mcp_provider.d.ts.map +1 -1
  16. package/dist/providers/mcp_provider.js +147 -62
  17. package/dist/providers/mcp_provider.js.map +1 -1
  18. package/dist/src/a2a/auth.d.ts +67 -0
  19. package/dist/src/a2a/auth.d.ts.map +1 -0
  20. package/dist/src/a2a/auth.js +47 -0
  21. package/dist/src/a2a/auth.js.map +1 -0
  22. package/dist/src/a2a/define_config.d.ts +74 -0
  23. package/dist/src/a2a/define_config.d.ts.map +1 -0
  24. package/dist/src/a2a/define_config.js +5 -0
  25. package/dist/src/a2a/define_config.js.map +1 -0
  26. package/dist/src/a2a/gate.d.ts +23 -0
  27. package/dist/src/a2a/gate.d.ts.map +1 -0
  28. package/dist/src/a2a/gate.js +56 -0
  29. package/dist/src/a2a/gate.js.map +1 -0
  30. package/dist/src/a2a/handler.d.ts +65 -0
  31. package/dist/src/a2a/handler.d.ts.map +1 -0
  32. package/dist/src/a2a/handler.js +322 -0
  33. package/dist/src/a2a/handler.js.map +1 -0
  34. package/dist/src/a2a/index.d.ts +15 -0
  35. package/dist/src/a2a/index.d.ts.map +1 -0
  36. package/dist/src/a2a/index.js +9 -0
  37. package/dist/src/a2a/index.js.map +1 -0
  38. package/dist/src/a2a/permission-tool.d.ts +17 -0
  39. package/dist/src/a2a/permission-tool.d.ts.map +1 -0
  40. package/dist/src/a2a/permission-tool.js +70 -0
  41. package/dist/src/a2a/permission-tool.js.map +1 -0
  42. package/dist/src/a2a/protocol.d.ts +100 -0
  43. package/dist/src/a2a/protocol.d.ts.map +1 -0
  44. package/dist/src/a2a/protocol.js +106 -0
  45. package/dist/src/a2a/protocol.js.map +1 -0
  46. package/dist/src/a2a/runtime.d.ts +6 -0
  47. package/dist/src/a2a/runtime.d.ts.map +1 -0
  48. package/dist/src/a2a/runtime.js +13 -0
  49. package/dist/src/a2a/runtime.js.map +1 -0
  50. package/dist/src/a2a/server_middleware.d.ts +13 -0
  51. package/dist/src/a2a/server_middleware.d.ts.map +1 -0
  52. package/dist/src/a2a/server_middleware.js +18 -0
  53. package/dist/src/a2a/server_middleware.js.map +1 -0
  54. package/dist/src/a2a/store.d.ts +79 -0
  55. package/dist/src/a2a/store.d.ts.map +1 -0
  56. package/dist/src/a2a/store.js +151 -0
  57. package/dist/src/a2a/store.js.map +1 -0
  58. package/dist/src/a2a/turn.d.ts +80 -0
  59. package/dist/src/a2a/turn.d.ts.map +1 -0
  60. package/dist/src/a2a/turn.js +211 -0
  61. package/dist/src/a2a/turn.js.map +1 -0
  62. package/dist/src/action-proposal-approval.d.ts +26 -0
  63. package/dist/src/action-proposal-approval.d.ts.map +1 -0
  64. package/dist/src/action-proposal-approval.js +28 -0
  65. package/dist/src/action-proposal-approval.js.map +1 -0
  66. package/dist/src/action-proposal-discovery.d.ts +9 -0
  67. package/dist/src/action-proposal-discovery.d.ts.map +1 -0
  68. package/dist/src/action-proposal-discovery.js +20 -0
  69. package/dist/src/action-proposal-discovery.js.map +1 -0
  70. package/dist/src/action-proposal-executor.d.ts +40 -0
  71. package/dist/src/action-proposal-executor.d.ts.map +1 -0
  72. package/dist/src/action-proposal-executor.js +80 -0
  73. package/dist/src/action-proposal-executor.js.map +1 -0
  74. package/dist/src/action-proposal-outcome.d.ts +12 -0
  75. package/dist/src/action-proposal-outcome.d.ts.map +1 -0
  76. package/dist/src/action-proposal-outcome.js +86 -0
  77. package/dist/src/action-proposal-outcome.js.map +1 -0
  78. package/dist/src/action-proposal-preparation.d.ts +20 -0
  79. package/dist/src/action-proposal-preparation.d.ts.map +1 -0
  80. package/dist/src/action-proposal-preparation.js +27 -0
  81. package/dist/src/action-proposal-preparation.js.map +1 -0
  82. package/dist/src/action-proposal-receipt.d.ts +12 -0
  83. package/dist/src/action-proposal-receipt.d.ts.map +1 -0
  84. package/dist/src/action-proposal-receipt.js +4 -0
  85. package/dist/src/action-proposal-receipt.js.map +1 -0
  86. package/dist/src/action-proposal-runtime.d.ts +9 -0
  87. package/dist/src/action-proposal-runtime.d.ts.map +1 -0
  88. package/dist/src/action-proposal-runtime.js +34 -0
  89. package/dist/src/action-proposal-runtime.js.map +1 -0
  90. package/dist/src/action-proposal-service.d.ts +47 -0
  91. package/dist/src/action-proposal-service.d.ts.map +1 -0
  92. package/dist/src/action-proposal-service.js +136 -0
  93. package/dist/src/action-proposal-service.js.map +1 -0
  94. package/dist/src/action-proposal-text.d.ts +72 -0
  95. package/dist/src/action-proposal-text.d.ts.map +1 -0
  96. package/dist/src/action-proposal-text.js +119 -0
  97. package/dist/src/action-proposal-text.js.map +1 -0
  98. package/dist/src/action-proposal-transitions.d.ts +20 -0
  99. package/dist/src/action-proposal-transitions.d.ts.map +1 -0
  100. package/dist/src/action-proposal-transitions.js +311 -0
  101. package/dist/src/action-proposal-transitions.js.map +1 -0
  102. package/dist/src/action-proposal-worker.d.ts +32 -0
  103. package/dist/src/action-proposal-worker.d.ts.map +1 -0
  104. package/dist/src/action-proposal-worker.js +140 -0
  105. package/dist/src/action-proposal-worker.js.map +1 -0
  106. package/dist/src/ag-ui/adapter.d.ts.map +1 -1
  107. package/dist/src/ag-ui/adapter.js +106 -1
  108. package/dist/src/ag-ui/adapter.js.map +1 -1
  109. package/dist/src/ag-ui/core/encoder.d.ts +105 -0
  110. package/dist/src/ag-ui/core/encoder.d.ts.map +1 -0
  111. package/dist/src/ag-ui/core/encoder.js +523 -0
  112. package/dist/src/ag-ui/core/encoder.js.map +1 -0
  113. package/dist/src/ag-ui/core/index.d.ts +12 -0
  114. package/dist/src/ag-ui/core/index.d.ts.map +1 -0
  115. package/dist/src/ag-ui/core/index.js +12 -0
  116. package/dist/src/ag-ui/core/index.js.map +1 -0
  117. package/dist/src/ag-ui/core/input.d.ts +74 -0
  118. package/dist/src/ag-ui/core/input.d.ts.map +1 -0
  119. package/dist/src/ag-ui/core/input.js +228 -0
  120. package/dist/src/ag-ui/core/input.js.map +1 -0
  121. package/dist/src/ag-ui/core/interrupt-id.d.ts +31 -0
  122. package/dist/src/ag-ui/core/interrupt-id.d.ts.map +1 -0
  123. package/dist/src/ag-ui/core/interrupt-id.js +48 -0
  124. package/dist/src/ag-ui/core/interrupt-id.js.map +1 -0
  125. package/dist/src/ag-ui/core/proposal-decision.d.ts +9 -0
  126. package/dist/src/ag-ui/core/proposal-decision.d.ts.map +1 -0
  127. package/dist/src/ag-ui/core/proposal-decision.js +20 -0
  128. package/dist/src/ag-ui/core/proposal-decision.js.map +1 -0
  129. package/dist/src/ag-ui/core/stream.d.ts +27 -0
  130. package/dist/src/ag-ui/core/stream.d.ts.map +1 -0
  131. package/dist/src/ag-ui/core/stream.js +68 -0
  132. package/dist/src/ag-ui/core/stream.js.map +1 -0
  133. package/dist/src/ag-ui/core/types.d.ts +249 -0
  134. package/dist/src/ag-ui/core/types.d.ts.map +1 -0
  135. package/dist/src/ag-ui/core/types.js +35 -0
  136. package/dist/src/ag-ui/core/types.js.map +1 -0
  137. package/dist/src/ag-ui/encoder.d.ts +3 -4
  138. package/dist/src/ag-ui/encoder.d.ts.map +1 -1
  139. package/dist/src/ag-ui/encoder.js +10 -11
  140. package/dist/src/ag-ui/encoder.js.map +1 -1
  141. package/dist/src/ag-ui/frames.d.ts +4 -5
  142. package/dist/src/ag-ui/frames.d.ts.map +1 -1
  143. package/dist/src/ag-ui/frames.js +9 -4
  144. package/dist/src/ag-ui/frames.js.map +1 -1
  145. package/dist/src/ag-ui/index.d.ts +3 -5
  146. package/dist/src/ag-ui/index.d.ts.map +1 -1
  147. package/dist/src/ag-ui/index.js +3 -5
  148. package/dist/src/ag-ui/index.js.map +1 -1
  149. package/dist/src/ag-ui/stream.d.ts +3 -4
  150. package/dist/src/ag-ui/stream.d.ts.map +1 -1
  151. package/dist/src/ag-ui/stream.js +4 -5
  152. package/dist/src/ag-ui/stream.js.map +1 -1
  153. package/dist/src/agent-deps-factory.d.ts +8 -0
  154. package/dist/src/agent-deps-factory.d.ts.map +1 -1
  155. package/dist/src/agent-deps-factory.js +12 -0
  156. package/dist/src/agent-deps-factory.js.map +1 -1
  157. package/dist/src/agent-deps.d.ts +7 -0
  158. package/dist/src/agent-deps.d.ts.map +1 -1
  159. package/dist/src/agent-deps.js.map +1 -1
  160. package/dist/src/agent-loop.d.ts +8 -3
  161. package/dist/src/agent-loop.d.ts.map +1 -1
  162. package/dist/src/agent-loop.js +398 -63
  163. package/dist/src/agent-loop.js.map +1 -1
  164. package/dist/src/agent-service.d.ts +52 -2
  165. package/dist/src/agent-service.d.ts.map +1 -1
  166. package/dist/src/agent-service.js +62 -2
  167. package/dist/src/agent-service.js.map +1 -1
  168. package/dist/src/ai-sdk/ai-sdk-model.js +4 -1
  169. package/dist/src/ai-sdk/ai-sdk-model.js.map +1 -1
  170. package/dist/src/ai-tool-ref.d.ts +6 -1
  171. package/dist/src/ai-tool-ref.d.ts.map +1 -1
  172. package/dist/src/ai-tool-ref.js +32 -16
  173. package/dist/src/ai-tool-ref.js.map +1 -1
  174. package/dist/src/chat-queue-service.d.ts.map +1 -1
  175. package/dist/src/chat-queue-service.js +4 -0
  176. package/dist/src/chat-queue-service.js.map +1 -1
  177. package/dist/src/client/chat-client.d.ts +12 -0
  178. package/dist/src/client/chat-client.d.ts.map +1 -1
  179. package/dist/src/client/chat-client.js +69 -1
  180. package/dist/src/client/chat-client.js.map +1 -1
  181. package/dist/src/client/sse.d.ts +15 -0
  182. package/dist/src/client/sse.d.ts.map +1 -1
  183. package/dist/src/client/sse.js +45 -0
  184. package/dist/src/client/sse.js.map +1 -1
  185. package/dist/src/define_config.d.ts +70 -12
  186. package/dist/src/define_config.d.ts.map +1 -1
  187. package/dist/src/define_config.js.map +1 -1
  188. package/dist/src/engine.d.ts +77 -0
  189. package/dist/src/engine.d.ts.map +1 -0
  190. package/dist/src/engine.js +27 -0
  191. package/dist/src/engine.js.map +1 -0
  192. package/dist/src/genui/builtins.d.ts +73 -3
  193. package/dist/src/genui/builtins.d.ts.map +1 -1
  194. package/dist/src/genui/builtins.js +298 -3
  195. package/dist/src/genui/builtins.js.map +1 -1
  196. package/dist/src/genui/capabilities.d.ts +24 -0
  197. package/dist/src/genui/capabilities.d.ts.map +1 -0
  198. package/dist/src/genui/capabilities.js +81 -0
  199. package/dist/src/genui/capabilities.js.map +1 -0
  200. package/dist/src/genui/catalog.d.ts +77 -0
  201. package/dist/src/genui/catalog.d.ts.map +1 -0
  202. package/dist/src/genui/catalog.js +88 -0
  203. package/dist/src/genui/catalog.js.map +1 -0
  204. package/dist/src/genui/factory.d.ts +8 -8
  205. package/dist/src/genui/factory.d.ts.map +1 -1
  206. package/dist/src/genui/factory.js +3 -1
  207. package/dist/src/genui/factory.js.map +1 -1
  208. package/dist/src/genui/index.d.ts +4 -12
  209. package/dist/src/genui/index.d.ts.map +1 -1
  210. package/dist/src/genui/index.js +6 -18
  211. package/dist/src/genui/index.js.map +1 -1
  212. package/dist/src/genui/public.d.ts +9 -0
  213. package/dist/src/genui/public.d.ts.map +1 -0
  214. package/dist/src/genui/public.js +9 -0
  215. package/dist/src/genui/public.js.map +1 -0
  216. package/dist/src/genui/registry.d.ts +65 -0
  217. package/dist/src/genui/registry.d.ts.map +1 -0
  218. package/dist/src/genui/registry.js +151 -0
  219. package/dist/src/genui/registry.js.map +1 -0
  220. package/dist/src/genui/schema.d.ts +71 -0
  221. package/dist/src/genui/schema.d.ts.map +1 -0
  222. package/dist/src/genui/schema.js +304 -0
  223. package/dist/src/genui/schema.js.map +1 -0
  224. package/dist/src/genui/text.d.ts +35 -0
  225. package/dist/src/genui/text.d.ts.map +1 -0
  226. package/dist/src/genui/text.js +156 -0
  227. package/dist/src/genui/text.js.map +1 -0
  228. package/dist/src/genui/tools.d.ts +91 -0
  229. package/dist/src/genui/tools.d.ts.map +1 -0
  230. package/dist/src/genui/tools.js +292 -0
  231. package/dist/src/genui/tools.js.map +1 -0
  232. package/dist/src/genui/tree.d.ts +56 -0
  233. package/dist/src/genui/tree.d.ts.map +1 -0
  234. package/dist/src/genui/tree.js +188 -0
  235. package/dist/src/genui/tree.js.map +1 -0
  236. package/dist/src/index.d.ts +21 -3
  237. package/dist/src/index.d.ts.map +1 -1
  238. package/dist/src/index.js +19 -2
  239. package/dist/src/index.js.map +1 -1
  240. package/dist/src/mcp/auth.d.ts +17 -1
  241. package/dist/src/mcp/auth.d.ts.map +1 -1
  242. package/dist/src/mcp/auth.js +14 -3
  243. package/dist/src/mcp/auth.js.map +1 -1
  244. package/dist/src/mcp/define_config.d.ts +81 -2
  245. package/dist/src/mcp/define_config.d.ts.map +1 -1
  246. package/dist/src/mcp/define_config.js.map +1 -1
  247. package/dist/src/mcp/index.d.ts +1 -1
  248. package/dist/src/mcp/index.d.ts.map +1 -1
  249. package/dist/src/mcp/index.js.map +1 -1
  250. package/dist/src/mcp/oauth-resource.d.ts +9 -0
  251. package/dist/src/mcp/oauth-resource.d.ts.map +1 -0
  252. package/dist/src/mcp/oauth-resource.js +16 -0
  253. package/dist/src/mcp/oauth-resource.js.map +1 -0
  254. package/dist/src/mcp/server.d.ts +5 -0
  255. package/dist/src/mcp/server.d.ts.map +1 -1
  256. package/dist/src/mcp/server.js +48 -16
  257. package/dist/src/mcp/server.js.map +1 -1
  258. package/dist/src/negotiated-tool-ui.d.ts +10 -0
  259. package/dist/src/negotiated-tool-ui.d.ts.map +1 -0
  260. package/dist/src/negotiated-tool-ui.js +57 -0
  261. package/dist/src/negotiated-tool-ui.js.map +1 -0
  262. package/dist/src/opencode/client.d.ts +202 -0
  263. package/dist/src/opencode/client.d.ts.map +1 -0
  264. package/dist/src/opencode/client.js +2 -0
  265. package/dist/src/opencode/client.js.map +1 -0
  266. package/dist/src/opencode/durable/index.d.ts +33 -0
  267. package/dist/src/opencode/durable/index.d.ts.map +1 -0
  268. package/dist/src/opencode/durable/index.js +38 -0
  269. package/dist/src/opencode/durable/index.js.map +1 -0
  270. package/dist/src/opencode/durable/runner.d.ts +36 -0
  271. package/dist/src/opencode/durable/runner.d.ts.map +1 -0
  272. package/dist/src/opencode/durable/runner.js +88 -0
  273. package/dist/src/opencode/durable/runner.js.map +1 -0
  274. package/dist/src/opencode/durable/workflow.d.ts +40 -0
  275. package/dist/src/opencode/durable/workflow.d.ts.map +1 -0
  276. package/dist/src/opencode/durable/workflow.js +106 -0
  277. package/dist/src/opencode/durable/workflow.js.map +1 -0
  278. package/dist/src/opencode/engine.d.ts +48 -0
  279. package/dist/src/opencode/engine.d.ts.map +1 -0
  280. package/dist/src/opencode/engine.js +98 -0
  281. package/dist/src/opencode/engine.js.map +1 -0
  282. package/dist/src/opencode/event-hub.d.ts +23 -0
  283. package/dist/src/opencode/event-hub.d.ts.map +1 -0
  284. package/dist/src/opencode/event-hub.js +99 -0
  285. package/dist/src/opencode/event-hub.js.map +1 -0
  286. package/dist/src/opencode/forms.d.ts +19 -0
  287. package/dist/src/opencode/forms.d.ts.map +1 -0
  288. package/dist/src/opencode/forms.js +82 -0
  289. package/dist/src/opencode/forms.js.map +1 -0
  290. package/dist/src/opencode/host.d.ts +179 -0
  291. package/dist/src/opencode/host.d.ts.map +1 -0
  292. package/dist/src/opencode/host.js +34 -0
  293. package/dist/src/opencode/host.js.map +1 -0
  294. package/dist/src/opencode/index.d.ts +15 -0
  295. package/dist/src/opencode/index.d.ts.map +1 -0
  296. package/dist/src/opencode/index.js +9 -0
  297. package/dist/src/opencode/index.js.map +1 -0
  298. package/dist/src/opencode/log.d.ts +9 -0
  299. package/dist/src/opencode/log.d.ts.map +1 -0
  300. package/dist/src/opencode/log.js +15 -0
  301. package/dist/src/opencode/log.js.map +1 -0
  302. package/dist/src/opencode/mcp.d.ts +60 -0
  303. package/dist/src/opencode/mcp.d.ts.map +1 -0
  304. package/dist/src/opencode/mcp.js +258 -0
  305. package/dist/src/opencode/mcp.js.map +1 -0
  306. package/dist/src/opencode/runner.d.ts +40 -0
  307. package/dist/src/opencode/runner.d.ts.map +1 -0
  308. package/dist/src/opencode/runner.js +125 -0
  309. package/dist/src/opencode/runner.js.map +1 -0
  310. package/dist/src/opencode/turn.d.ts +167 -0
  311. package/dist/src/opencode/turn.d.ts.map +1 -0
  312. package/dist/src/opencode/turn.js +761 -0
  313. package/dist/src/opencode/turn.js.map +1 -0
  314. package/dist/src/opencode/turns.d.ts +245 -0
  315. package/dist/src/opencode/turns.d.ts.map +1 -0
  316. package/dist/src/opencode/turns.js +867 -0
  317. package/dist/src/opencode/turns.js.map +1 -0
  318. package/dist/src/personas.d.ts.map +1 -1
  319. package/dist/src/personas.js +4 -1
  320. package/dist/src/personas.js.map +1 -1
  321. package/dist/src/react/ag-ui.d.ts +4 -2
  322. package/dist/src/react/ag-ui.d.ts.map +1 -1
  323. package/dist/src/react/ag-ui.js +2 -2
  324. package/dist/src/react/ag-ui.js.map +1 -1
  325. package/dist/src/react/client.d.ts +1 -1
  326. package/dist/src/react/client.d.ts.map +1 -1
  327. package/dist/src/react/client.js +1 -1
  328. package/dist/src/react/client.js.map +1 -1
  329. package/dist/src/react/core/ag-ui-backend.d.ts +85 -0
  330. package/dist/src/react/core/ag-ui-backend.d.ts.map +1 -0
  331. package/dist/src/react/core/ag-ui-backend.js +409 -0
  332. package/dist/src/react/core/ag-ui-backend.js.map +1 -0
  333. package/dist/src/react/core/agent-chat-transport.d.ts +187 -0
  334. package/dist/src/react/core/agent-chat-transport.d.ts.map +1 -0
  335. package/dist/src/react/core/agent-chat-transport.js +796 -0
  336. package/dist/src/react/core/agent-chat-transport.js.map +1 -0
  337. package/dist/src/react/core/approvals/countdown.d.ts +22 -0
  338. package/dist/src/react/core/approvals/countdown.d.ts.map +1 -0
  339. package/dist/src/react/core/approvals/countdown.js +39 -0
  340. package/dist/src/react/core/approvals/countdown.js.map +1 -0
  341. package/dist/src/react/core/approvals/proposals.d.ts +15 -0
  342. package/dist/src/react/core/approvals/proposals.d.ts.map +1 -0
  343. package/dist/src/react/core/approvals/proposals.js +82 -0
  344. package/dist/src/react/core/approvals/proposals.js.map +1 -0
  345. package/dist/src/react/core/approvals/use-action-proposals.d.ts +10 -0
  346. package/dist/src/react/core/approvals/use-action-proposals.d.ts.map +1 -0
  347. package/dist/src/react/core/approvals/use-action-proposals.js +86 -0
  348. package/dist/src/react/core/approvals/use-action-proposals.js.map +1 -0
  349. package/dist/src/react/core/attachments/files.d.ts +39 -0
  350. package/dist/src/react/core/attachments/files.d.ts.map +1 -0
  351. package/dist/src/react/core/attachments/files.js +89 -0
  352. package/dist/src/react/core/attachments/files.js.map +1 -0
  353. package/dist/src/react/core/attachments/use-attachments.d.ts +106 -0
  354. package/dist/src/react/core/attachments/use-attachments.d.ts.map +1 -0
  355. package/dist/src/react/core/attachments/use-attachments.js +217 -0
  356. package/dist/src/react/core/attachments/use-attachments.js.map +1 -0
  357. package/dist/src/react/core/backend.d.ts +234 -0
  358. package/dist/src/react/core/backend.d.ts.map +1 -0
  359. package/dist/src/react/core/backend.js +21 -0
  360. package/dist/src/react/core/backend.js.map +1 -0
  361. package/dist/src/react/core/background-runs.d.ts +32 -0
  362. package/dist/src/react/core/background-runs.d.ts.map +1 -0
  363. package/dist/src/react/core/background-runs.js +47 -0
  364. package/dist/src/react/core/background-runs.js.map +1 -0
  365. package/dist/src/react/core/catalog/use-agents.d.ts +31 -0
  366. package/dist/src/react/core/catalog/use-agents.d.ts.map +1 -0
  367. package/dist/src/react/core/catalog/use-agents.js +28 -0
  368. package/dist/src/react/core/catalog/use-agents.js.map +1 -0
  369. package/dist/src/react/core/catalog/use-models.d.ts +41 -0
  370. package/dist/src/react/core/catalog/use-models.d.ts.map +1 -0
  371. package/dist/src/react/core/catalog/use-models.js +35 -0
  372. package/dist/src/react/core/catalog/use-models.js.map +1 -0
  373. package/dist/src/react/core/catalog/use-resource.d.ts +12 -0
  374. package/dist/src/react/core/catalog/use-resource.d.ts.map +1 -0
  375. package/dist/src/react/core/catalog/use-resource.js +41 -0
  376. package/dist/src/react/core/catalog/use-resource.js.map +1 -0
  377. package/dist/src/react/core/client-wire.d.ts +14 -0
  378. package/dist/src/react/core/client-wire.d.ts.map +1 -0
  379. package/dist/src/react/core/client-wire.js +2 -0
  380. package/dist/src/react/core/client-wire.js.map +1 -0
  381. package/dist/src/react/core/client.d.ts +222 -0
  382. package/dist/src/react/core/client.d.ts.map +1 -0
  383. package/dist/src/react/core/client.js +435 -0
  384. package/dist/src/react/core/client.js.map +1 -0
  385. package/dist/src/react/core/components/ambient-ui.d.ts +22 -0
  386. package/dist/src/react/core/components/ambient-ui.d.ts.map +1 -0
  387. package/dist/src/react/core/components/ambient-ui.js +30 -0
  388. package/dist/src/react/core/components/ambient-ui.js.map +1 -0
  389. package/dist/src/react/core/components/chat-input.d.ts +44 -0
  390. package/dist/src/react/core/components/chat-input.d.ts.map +1 -0
  391. package/dist/src/react/core/components/chat-input.js +69 -0
  392. package/dist/src/react/core/components/chat-input.js.map +1 -0
  393. package/dist/src/react/core/components/index.d.ts +7 -0
  394. package/dist/src/react/core/components/index.d.ts.map +1 -0
  395. package/dist/src/react/core/components/index.js +7 -0
  396. package/dist/src/react/core/components/index.js.map +1 -0
  397. package/dist/src/react/core/components/message-item.d.ts +101 -0
  398. package/dist/src/react/core/components/message-item.d.ts.map +1 -0
  399. package/dist/src/react/core/components/message-item.js +118 -0
  400. package/dist/src/react/core/components/message-item.js.map +1 -0
  401. package/dist/src/react/core/components/message-list.d.ts +85 -0
  402. package/dist/src/react/core/components/message-list.d.ts.map +1 -0
  403. package/dist/src/react/core/components/message-list.js +45 -0
  404. package/dist/src/react/core/components/message-list.js.map +1 -0
  405. package/dist/src/react/core/components/speech-languages.d.ts +22 -0
  406. package/dist/src/react/core/components/speech-languages.d.ts.map +1 -0
  407. package/dist/src/react/core/components/speech-languages.js +38 -0
  408. package/dist/src/react/core/components/speech-languages.js.map +1 -0
  409. package/dist/src/react/core/components/use-speech-recognition.d.ts +19 -0
  410. package/dist/src/react/core/components/use-speech-recognition.d.ts.map +1 -0
  411. package/dist/src/react/core/components/use-speech-recognition.js +92 -0
  412. package/dist/src/react/core/components/use-speech-recognition.js.map +1 -0
  413. package/dist/src/react/core/composer/index.d.ts +4 -0
  414. package/dist/src/react/core/composer/index.d.ts.map +1 -0
  415. package/dist/src/react/core/composer/index.js +4 -0
  416. package/dist/src/react/core/composer/index.js.map +1 -0
  417. package/dist/src/react/core/composer/model.d.ts +83 -0
  418. package/dist/src/react/core/composer/model.d.ts.map +1 -0
  419. package/dist/src/react/core/composer/model.js +53 -0
  420. package/dist/src/react/core/composer/model.js.map +1 -0
  421. package/dist/src/react/core/composer/skills-source.d.ts +29 -0
  422. package/dist/src/react/core/composer/skills-source.d.ts.map +1 -0
  423. package/dist/src/react/core/composer/skills-source.js +61 -0
  424. package/dist/src/react/core/composer/skills-source.js.map +1 -0
  425. package/dist/src/react/core/composer/use-composer-autocomplete.d.ts +78 -0
  426. package/dist/src/react/core/composer/use-composer-autocomplete.d.ts.map +1 -0
  427. package/dist/src/react/core/composer/use-composer-autocomplete.js +244 -0
  428. package/dist/src/react/core/composer/use-composer-autocomplete.js.map +1 -0
  429. package/dist/src/react/core/config/use-agent-config.d.ts +21 -0
  430. package/dist/src/react/core/config/use-agent-config.d.ts.map +1 -0
  431. package/dist/src/react/core/config/use-agent-config.js +57 -0
  432. package/dist/src/react/core/config/use-agent-config.js.map +1 -0
  433. package/dist/src/react/core/elicitation/answers.d.ts +22 -0
  434. package/dist/src/react/core/elicitation/answers.d.ts.map +1 -0
  435. package/dist/src/react/core/elicitation/answers.js +65 -0
  436. package/dist/src/react/core/elicitation/answers.js.map +1 -0
  437. package/dist/src/react/core/feedback/use-message-feedback.d.ts +32 -0
  438. package/dist/src/react/core/feedback/use-message-feedback.d.ts.map +1 -0
  439. package/dist/src/react/core/feedback/use-message-feedback.js +106 -0
  440. package/dist/src/react/core/feedback/use-message-feedback.js.map +1 -0
  441. package/dist/src/react/core/genui/generative-ui.d.ts +76 -0
  442. package/dist/src/react/core/genui/generative-ui.d.ts.map +1 -0
  443. package/dist/src/react/core/genui/generative-ui.js +210 -0
  444. package/dist/src/react/core/genui/generative-ui.js.map +1 -0
  445. package/dist/src/react/core/genui/index.d.ts +5 -0
  446. package/dist/src/react/core/genui/index.d.ts.map +1 -0
  447. package/dist/src/react/core/genui/index.js +5 -0
  448. package/dist/src/react/core/genui/index.js.map +1 -0
  449. package/dist/src/react/core/genui/json-render.d.ts +54 -0
  450. package/dist/src/react/core/genui/json-render.d.ts.map +1 -0
  451. package/dist/src/react/core/genui/json-render.js +64 -0
  452. package/dist/src/react/core/genui/json-render.js.map +1 -0
  453. package/dist/src/react/core/genui/playwright.d.ts +12 -0
  454. package/dist/src/react/core/genui/playwright.d.ts.map +1 -0
  455. package/dist/src/react/core/genui/playwright.js +141 -0
  456. package/dist/src/react/core/genui/playwright.js.map +1 -0
  457. package/dist/src/react/core/genui/react-registry.d.ts +22 -0
  458. package/dist/src/react/core/genui/react-registry.d.ts.map +1 -0
  459. package/dist/src/react/core/genui/react-registry.js +72 -0
  460. package/dist/src/react/core/genui/react-registry.js.map +1 -0
  461. package/dist/src/react/core/genui/server.d.ts +32 -0
  462. package/dist/src/react/core/genui/server.d.ts.map +1 -0
  463. package/dist/src/react/core/genui/server.js +66 -0
  464. package/dist/src/react/core/genui/server.js.map +1 -0
  465. package/dist/src/react/core/genui/types.d.ts +98 -0
  466. package/dist/src/react/core/genui/types.d.ts.map +1 -0
  467. package/dist/src/react/core/genui/types.js +3 -0
  468. package/dist/src/react/core/genui/types.js.map +1 -0
  469. package/dist/src/react/core/genui/use-generative-ui.d.ts +42 -0
  470. package/dist/src/react/core/genui/use-generative-ui.d.ts.map +1 -0
  471. package/dist/src/react/core/genui/use-generative-ui.js +186 -0
  472. package/dist/src/react/core/genui/use-generative-ui.js.map +1 -0
  473. package/dist/src/react/core/http-error.d.ts +33 -0
  474. package/dist/src/react/core/http-error.d.ts.map +1 -0
  475. package/dist/src/react/core/http-error.js +47 -0
  476. package/dist/src/react/core/http-error.js.map +1 -0
  477. package/dist/src/react/core/index.d.ts +35 -0
  478. package/dist/src/react/core/index.d.ts.map +1 -0
  479. package/dist/src/react/core/index.js +34 -0
  480. package/dist/src/react/core/index.js.map +1 -0
  481. package/dist/src/react/core/markdown/agent-markdown.d.ts +39 -0
  482. package/dist/src/react/core/markdown/agent-markdown.d.ts.map +1 -0
  483. package/dist/src/react/core/markdown/agent-markdown.js +22 -0
  484. package/dist/src/react/core/markdown/agent-markdown.js.map +1 -0
  485. package/dist/src/react/core/markdown/index.d.ts +2 -0
  486. package/dist/src/react/core/markdown/index.d.ts.map +1 -0
  487. package/dist/src/react/core/markdown/index.js +2 -0
  488. package/dist/src/react/core/markdown/index.js.map +1 -0
  489. package/dist/src/react/core/media/index.d.ts +64 -0
  490. package/dist/src/react/core/media/index.d.ts.map +1 -0
  491. package/dist/src/react/core/media/index.js +135 -0
  492. package/dist/src/react/core/media/index.js.map +1 -0
  493. package/dist/src/react/core/media/tus.d.ts +13 -0
  494. package/dist/src/react/core/media/tus.d.ts.map +1 -0
  495. package/dist/src/react/core/media/tus.js +59 -0
  496. package/dist/src/react/core/media/tus.js.map +1 -0
  497. package/dist/src/react/core/presentation/phrasing.d.ts +25 -0
  498. package/dist/src/react/core/presentation/phrasing.d.ts.map +1 -0
  499. package/dist/src/react/core/presentation/phrasing.js +58 -0
  500. package/dist/src/react/core/presentation/phrasing.js.map +1 -0
  501. package/dist/src/react/core/presentation/result-view.d.ts +43 -0
  502. package/dist/src/react/core/presentation/result-view.d.ts.map +1 -0
  503. package/dist/src/react/core/presentation/result-view.js +90 -0
  504. package/dist/src/react/core/presentation/result-view.js.map +1 -0
  505. package/dist/src/react/core/presentation/tool-activity.d.ts +106 -0
  506. package/dist/src/react/core/presentation/tool-activity.d.ts.map +1 -0
  507. package/dist/src/react/core/presentation/tool-activity.js +165 -0
  508. package/dist/src/react/core/presentation/tool-activity.js.map +1 -0
  509. package/dist/src/react/core/presentation/use-tool-catalog.d.ts +39 -0
  510. package/dist/src/react/core/presentation/use-tool-catalog.d.ts.map +1 -0
  511. package/dist/src/react/core/presentation/use-tool-catalog.js +77 -0
  512. package/dist/src/react/core/presentation/use-tool-catalog.js.map +1 -0
  513. package/dist/src/react/core/provider.d.ts +68 -0
  514. package/dist/src/react/core/provider.d.ts.map +1 -0
  515. package/dist/src/react/core/provider.js +61 -0
  516. package/dist/src/react/core/provider.js.map +1 -0
  517. package/dist/src/react/core/queue/model.d.ts +73 -0
  518. package/dist/src/react/core/queue/model.d.ts.map +1 -0
  519. package/dist/src/react/core/queue/model.js +2 -0
  520. package/dist/src/react/core/queue/model.js.map +1 -0
  521. package/dist/src/react/core/quota/use-quota.d.ts +35 -0
  522. package/dist/src/react/core/quota/use-quota.d.ts.map +1 -0
  523. package/dist/src/react/core/quota/use-quota.js +47 -0
  524. package/dist/src/react/core/quota/use-quota.js.map +1 -0
  525. package/dist/src/react/core/reasoning/timing.d.ts +38 -0
  526. package/dist/src/react/core/reasoning/timing.d.ts.map +1 -0
  527. package/dist/src/react/core/reasoning/timing.js +73 -0
  528. package/dist/src/react/core/reasoning/timing.js.map +1 -0
  529. package/dist/src/react/core/run-errors.d.ts +37 -0
  530. package/dist/src/react/core/run-errors.d.ts.map +1 -0
  531. package/dist/src/react/core/run-errors.js +37 -0
  532. package/dist/src/react/core/run-errors.js.map +1 -0
  533. package/dist/src/react/core/stored-message-to-ui-message.d.ts +4 -0
  534. package/dist/src/react/core/stored-message-to-ui-message.d.ts.map +1 -0
  535. package/dist/src/react/core/stored-message-to-ui-message.js +216 -0
  536. package/dist/src/react/core/stored-message-to-ui-message.js.map +1 -0
  537. package/dist/src/react/core/stored-thread-to-ui-messages.d.ts +82 -0
  538. package/dist/src/react/core/stored-thread-to-ui-messages.d.ts.map +1 -0
  539. package/dist/src/react/core/stored-thread-to-ui-messages.js +116 -0
  540. package/dist/src/react/core/stored-thread-to-ui-messages.js.map +1 -0
  541. package/dist/src/react/core/threads/threads-events.d.ts +22 -0
  542. package/dist/src/react/core/threads/threads-events.d.ts.map +1 -0
  543. package/dist/src/react/core/threads/threads-events.js +21 -0
  544. package/dist/src/react/core/threads/threads-events.js.map +1 -0
  545. package/dist/src/react/core/threads/use-threads.d.ts +31 -0
  546. package/dist/src/react/core/threads/use-threads.d.ts.map +1 -0
  547. package/dist/src/react/core/threads/use-threads.js +81 -0
  548. package/dist/src/react/core/threads/use-threads.js.map +1 -0
  549. package/dist/src/react/core/transcript/index.d.ts +4 -0
  550. package/dist/src/react/core/transcript/index.d.ts.map +1 -0
  551. package/dist/src/react/core/transcript/index.js +4 -0
  552. package/dist/src/react/core/transcript/index.js.map +1 -0
  553. package/dist/src/react/core/transcript/model.d.ts +399 -0
  554. package/dist/src/react/core/transcript/model.d.ts.map +1 -0
  555. package/dist/src/react/core/transcript/model.js +725 -0
  556. package/dist/src/react/core/transcript/model.js.map +1 -0
  557. package/dist/src/react/core/transcript/use-chat-transcript.d.ts +254 -0
  558. package/dist/src/react/core/transcript/use-chat-transcript.d.ts.map +1 -0
  559. package/dist/src/react/core/transcript/use-chat-transcript.js +572 -0
  560. package/dist/src/react/core/transcript/use-chat-transcript.js.map +1 -0
  561. package/dist/src/react/core/transcript/use-stick-to-bottom.d.ts +33 -0
  562. package/dist/src/react/core/transcript/use-stick-to-bottom.d.ts.map +1 -0
  563. package/dist/src/react/core/transcript/use-stick-to-bottom.js +48 -0
  564. package/dist/src/react/core/transcript/use-stick-to-bottom.js.map +1 -0
  565. package/dist/src/react/core/use-agent-chat.d.ts +341 -0
  566. package/dist/src/react/core/use-agent-chat.d.ts.map +1 -0
  567. package/dist/src/react/core/use-agent-chat.js +1118 -0
  568. package/dist/src/react/core/use-agent-chat.js.map +1 -0
  569. package/dist/src/react/genui/index.d.ts +1 -7
  570. package/dist/src/react/genui/index.d.ts.map +1 -1
  571. package/dist/src/react/genui/index.js +1 -7
  572. package/dist/src/react/genui/index.js.map +1 -1
  573. package/dist/src/react/genui/json-render.d.ts +1 -5
  574. package/dist/src/react/genui/json-render.d.ts.map +1 -1
  575. package/dist/src/react/genui/json-render.js +1 -5
  576. package/dist/src/react/genui/json-render.js.map +1 -1
  577. package/dist/src/react/genui/server.d.ts +2 -0
  578. package/dist/src/react/genui/server.d.ts.map +1 -0
  579. package/dist/src/react/genui/server.js +2 -0
  580. package/dist/src/react/genui/server.js.map +1 -0
  581. package/dist/src/react/genui/server_playwright.d.ts +2 -0
  582. package/dist/src/react/genui/server_playwright.d.ts.map +1 -0
  583. package/dist/src/react/genui/server_playwright.js +2 -0
  584. package/dist/src/react/genui/server_playwright.js.map +1 -0
  585. package/dist/src/react/index.d.ts +5 -7
  586. package/dist/src/react/index.d.ts.map +1 -1
  587. package/dist/src/react/index.js +5 -7
  588. package/dist/src/react/index.js.map +1 -1
  589. package/dist/src/react/markdown.d.ts +1 -6
  590. package/dist/src/react/markdown.d.ts.map +1 -1
  591. package/dist/src/react/markdown.js +1 -6
  592. package/dist/src/react/markdown.js.map +1 -1
  593. package/dist/src/react/media.d.ts +1 -17
  594. package/dist/src/react/media.d.ts.map +1 -1
  595. package/dist/src/react/media.js +1 -17
  596. package/dist/src/react/media.js.map +1 -1
  597. package/dist/src/refusal.d.ts +3 -0
  598. package/dist/src/refusal.d.ts.map +1 -0
  599. package/dist/src/refusal.js +3 -0
  600. package/dist/src/refusal.js.map +1 -0
  601. package/dist/src/spi/action-proposal-outcome-store.d.ts +43 -0
  602. package/dist/src/spi/action-proposal-outcome-store.d.ts.map +1 -0
  603. package/dist/src/spi/action-proposal-outcome-store.js +2 -0
  604. package/dist/src/spi/action-proposal-outcome-store.js.map +1 -0
  605. package/dist/src/spi/action-proposal-store.d.ts +152 -0
  606. package/dist/src/spi/action-proposal-store.d.ts.map +1 -0
  607. package/dist/src/spi/action-proposal-store.js +2 -0
  608. package/dist/src/spi/action-proposal-store.js.map +1 -0
  609. package/dist/src/spi/action-proposal-worker-store.d.ts +17 -0
  610. package/dist/src/spi/action-proposal-worker-store.d.ts.map +1 -0
  611. package/dist/src/spi/action-proposal-worker-store.js +2 -0
  612. package/dist/src/spi/action-proposal-worker-store.js.map +1 -0
  613. package/dist/src/spi/agent-runner.d.ts +6 -0
  614. package/dist/src/spi/agent-runner.d.ts.map +1 -1
  615. package/dist/src/spi/agent-store.d.ts +5 -0
  616. package/dist/src/spi/agent-store.d.ts.map +1 -1
  617. package/dist/src/spi/agent-store.js.map +1 -1
  618. package/dist/src/spi/approval-policy.d.ts +3 -0
  619. package/dist/src/spi/approval-policy.d.ts.map +1 -1
  620. package/dist/src/spi/approval-policy.js +8 -1
  621. package/dist/src/spi/approval-policy.js.map +1 -1
  622. package/dist/src/spi/background-actor-resolver.d.ts +9 -0
  623. package/dist/src/spi/background-actor-resolver.d.ts.map +1 -0
  624. package/dist/src/spi/background-actor-resolver.js +2 -0
  625. package/dist/src/spi/background-actor-resolver.js.map +1 -0
  626. package/dist/src/spi/chat-queue.d.ts +7 -1
  627. package/dist/src/spi/chat-queue.d.ts.map +1 -1
  628. package/dist/src/spi/chat-queue.js.map +1 -1
  629. package/dist/src/spi/protocol-adapter.d.ts +3 -3
  630. package/dist/src/spi/roles-policy.d.ts +7 -0
  631. package/dist/src/spi/roles-policy.d.ts.map +1 -1
  632. package/dist/src/spi/token-stream-sink.d.ts +9 -0
  633. package/dist/src/spi/token-stream-sink.d.ts.map +1 -1
  634. package/dist/src/spi/token-stream-sink.js.map +1 -1
  635. package/dist/src/spi/tool.d.ts +40 -3
  636. package/dist/src/spi/tool.d.ts.map +1 -1
  637. package/dist/src/sse.d.ts.map +1 -1
  638. package/dist/src/sse.js +6 -0
  639. package/dist/src/sse.js.map +1 -1
  640. package/dist/src/stores/lucid-action-proposal-store.d.ts +55 -0
  641. package/dist/src/stores/lucid-action-proposal-store.d.ts.map +1 -0
  642. package/dist/src/stores/lucid-action-proposal-store.js +465 -0
  643. package/dist/src/stores/lucid-action-proposal-store.js.map +1 -0
  644. package/dist/src/stores/lucid-schema.d.ts +8 -6
  645. package/dist/src/stores/lucid-schema.d.ts.map +1 -1
  646. package/dist/src/stores/lucid-schema.js +61 -6
  647. package/dist/src/stores/lucid-schema.js.map +1 -1
  648. package/dist/src/stores/lucid.d.ts +4 -2
  649. package/dist/src/stores/lucid.d.ts.map +1 -1
  650. package/dist/src/stores/lucid.js +46 -14
  651. package/dist/src/stores/lucid.js.map +1 -1
  652. package/dist/src/stores/sqlite-transactions.d.ts +8 -0
  653. package/dist/src/stores/sqlite-transactions.d.ts.map +1 -0
  654. package/dist/src/stores/sqlite-transactions.js +24 -0
  655. package/dist/src/stores/sqlite-transactions.js.map +1 -0
  656. package/dist/src/stream-events.d.ts +4 -0
  657. package/dist/src/stream-events.d.ts.map +1 -1
  658. package/dist/src/testing/chat-queue-store-contract.d.ts.map +1 -1
  659. package/dist/src/testing/chat-queue-store-contract.js +4 -0
  660. package/dist/src/testing/chat-queue-store-contract.js.map +1 -1
  661. package/dist/src/testing/in-memory-action-proposal-store.d.ts +32 -0
  662. package/dist/src/testing/in-memory-action-proposal-store.d.ts.map +1 -0
  663. package/dist/src/testing/in-memory-action-proposal-store.js +159 -0
  664. package/dist/src/testing/in-memory-action-proposal-store.js.map +1 -0
  665. package/dist/src/testing/in-memory-store.d.ts +9 -1
  666. package/dist/src/testing/in-memory-store.d.ts.map +1 -1
  667. package/dist/src/testing/in-memory-store.js +80 -1
  668. package/dist/src/testing/in-memory-store.js.map +1 -1
  669. package/dist/src/testing/index.d.ts +1 -0
  670. package/dist/src/testing/index.d.ts.map +1 -1
  671. package/dist/src/testing/index.js +1 -0
  672. package/dist/src/testing/index.js.map +1 -1
  673. package/dist/src/tool-discovery.d.ts +1 -1
  674. package/dist/src/tool-discovery.d.ts.map +1 -1
  675. package/dist/src/tool-discovery.js +12 -1
  676. package/dist/src/tool-discovery.js.map +1 -1
  677. package/dist/src/tool-registry.d.ts +28 -1
  678. package/dist/src/tool-registry.d.ts.map +1 -1
  679. package/dist/src/tool-registry.js +85 -3
  680. package/dist/src/tool-registry.js.map +1 -1
  681. package/dist/src/tool-result-presentation.d.ts +12 -0
  682. package/dist/src/tool-result-presentation.d.ts.map +1 -0
  683. package/dist/src/tool-result-presentation.js +44 -0
  684. package/dist/src/tool-result-presentation.js.map +1 -0
  685. package/dist/src/tool-retry.d.ts +0 -11
  686. package/dist/src/tool-retry.d.ts.map +1 -1
  687. package/dist/src/tool-retry.js +5 -1
  688. package/dist/src/tool-retry.js.map +1 -1
  689. package/dist/src/tool-ui.d.ts +4 -1
  690. package/dist/src/tool-ui.d.ts.map +1 -1
  691. package/dist/src/tool-ui.js +32 -4
  692. package/dist/src/tool-ui.js.map +1 -1
  693. package/dist/src/types.d.ts +48 -2
  694. package/dist/src/types.d.ts.map +1 -1
  695. package/dist/src/ui-capabilities.d.ts +2 -0
  696. package/dist/src/ui-capabilities.d.ts.map +1 -0
  697. package/dist/src/ui-capabilities.js +4 -0
  698. package/dist/src/ui-capabilities.js.map +1 -0
  699. package/dist/stubs/database/migrations/add_action_proposal_discovery.stub +24 -0
  700. package/dist/stubs/database/migrations/add_action_proposal_runtime.stub +19 -0
  701. package/dist/stubs/database/migrations/create_agent_tables.stub +3 -3
  702. package/package.json +123 -22
  703. package/skills/agent-governance/SKILL.md +12 -4
  704. package/skills/agent-personas-agents/SKILL.md +2 -1
  705. package/skills/agent-setup/SKILL.md +36 -13
  706. package/skills/agent-testing/SKILL.md +22 -0
  707. package/skills/agent-tools/SKILL.md +54 -9
@@ -0,0 +1,796 @@
1
+ import { AgentClient } from './client.js';
2
+ import { reasoningDurationMetadata } from './reasoning/timing.js';
3
+ const DEFAULT_RECONNECT = {
4
+ maxAttempts: 6,
5
+ baseDelayMs: 500,
6
+ maxDelayMs: 8000,
7
+ };
8
+ /**
9
+ * The tool name BOTH elicitation surfaces persist their question set under (core's
10
+ * `ASK_TOOL_NAME`), so a synthesized part and a replayed `tool-ask` row are the same part type.
11
+ * Spelled out rather than imported: every other core import in this package is type-only, and a
12
+ * value import would pull the agent loop into a browser bundle for a three-letter string.
13
+ */
14
+ const ASK_TOOL_NAME = 'ask';
15
+ /**
16
+ * AI SDK v7 `ChatTransport` for the Adonis agent backend. POSTs
17
+ * `/agent/chat`, parses the backend's `meta` + `{delta}` + `done` SSE
18
+ * frames, and re-emits them as the v7 UI-message chunk stream
19
+ * (`start` → `text-start` → `text-delta`* → `text-end` → `finish`).
20
+ *
21
+ * The backend hydrates prior history from its store, so only the latest
22
+ * user message text is sent each turn — keeping payloads tiny and
23
+ * preventing the client from corrupting replayed history.
24
+ *
25
+ * Attachments (image/PDF for a vision-capable model) ride the per-send body:
26
+ * `sendMessage({ text }, { body: { attachments: MessageAttachment[] } })`. They
27
+ * flow to the backend as the turn's `attachments`, get persisted on the user
28
+ * message, and are rendered as native model content parts. Optimistic display of
29
+ * the user's own attachment thumbnails is the consumer's concern (it stages the
30
+ * upload), the same way history rendering reads `StoredMessage.attachments`.
31
+ *
32
+ * Frames beyond text/reasoning/tools become AI SDK data parts (seen by `useChat`'s `onData`):
33
+ * - `ui` → `data-ui` part, `id` = the component id (a repeat id updates it in place)
34
+ * - `approval-requested` → `data-approval-requested` part keyed by the call id, plus the SDK's
35
+ * native `tool-approval-request` (the part moves to `approval-requested`)
36
+ * - `approval-settled` → `data-approval-settled` part keyed by the call id (who decided, through
37
+ * what, remembered or not); the outcome still rides the call's own output
38
+ * - `title`, `cancelled`, `queue` → transient `data-title` / `data-cancelled` / `data-queue` (never
39
+ * stored on the message). A send the server queued (`202`) is reported
40
+ * as a transient `data-queue` too, carrying `queuedSend`
41
+ * - any other kind → `data-<kind>` part carrying the frame minus `kind`, keyed by its `id`
42
+ * when it has one — forwarded, never dropped
43
+ * `parentId` on a tool frame rides the part's `toolMetadata` next to `toolKind`.
44
+ */
45
+ export class AgentChatTransport {
46
+ options;
47
+ currentRunId;
48
+ currentThreadId;
49
+ /**
50
+ * One attempt at a time. The AI SDK keeps a single in-flight response per chat and decides
51
+ * whether its streamed message REPLACES the list's last entry or is appended by comparing that
52
+ * response's message id against the last entry alone. Two attempts writing into one chat
53
+ * therefore append alternating copies of each other's message, and the list ends up holding
54
+ * several entries under each id — which React renders as duplicate keys.
55
+ */
56
+ attemptLive = false;
57
+ backend;
58
+ constructor(options = {}) {
59
+ this.options = options;
60
+ this.backend =
61
+ options.backend ??
62
+ new AgentClient({
63
+ ...(options.baseUrl !== undefined ? { baseUrl: options.baseUrl } : {}),
64
+ ...(options.path !== undefined ? { path: options.path } : {}),
65
+ ...(options.headers !== undefined ? { headers: options.headers } : {}),
66
+ ...(options.getHeaders !== undefined ? { getHeaders: options.getHeaders } : {}),
67
+ ...(options.credentials !== undefined ? { credentials: options.credentials } : {}),
68
+ ...(options.fetch !== undefined ? { fetch: options.fetch } : {}),
69
+ });
70
+ }
71
+ /** Run id of the most recent stream — HITL approve/reject target this. */
72
+ get runId() {
73
+ return this.currentRunId;
74
+ }
75
+ /** Thread id of the most recent stream. */
76
+ get threadId() {
77
+ return this.currentThreadId;
78
+ }
79
+ /**
80
+ * True from the moment a send or resume attempt starts until its chunk stream terminates. A
81
+ * caller that can refuse a turn BEFORE the SDK commits to one — `useAgentChat` wrapping
82
+ * `sendMessage` — reads this; the transport itself can only refuse a resume, which is the one
83
+ * attempt the SDK lets a transport decline.
84
+ */
85
+ get isAttemptLive() {
86
+ return this.attemptLive;
87
+ }
88
+ async sendMessages(options) {
89
+ this.options.onAttemptStart?.();
90
+ this.attemptLive = true;
91
+ try {
92
+ const lastMessage = options.messages.at(-1);
93
+ const message = lastMessage ? extractText(lastMessage) : '';
94
+ const body = {
95
+ ...(this.options.agent !== undefined ? { agent: this.options.agent } : {}),
96
+ ...(this.options.persona !== undefined ? { persona: this.options.persona } : {}),
97
+ ...(this.options.getBody?.() ?? {}),
98
+ ...(options.body ?? {}),
99
+ message,
100
+ };
101
+ const headers = headerRecord(options.headers);
102
+ const response = await this.backend.openChatStream({
103
+ body,
104
+ ...(headers !== undefined ? { headers } : {}),
105
+ ...(options.abortSignal ? { signal: options.abortSignal } : {}),
106
+ });
107
+ if (response.queued !== undefined) {
108
+ // The thread already had a turn running (another tab, another device): the server queued
109
+ // the message instead. Nothing streams; the chat learns it through a transient part.
110
+ this.attemptLive = false;
111
+ return queuedChunkStream(response.queued);
112
+ }
113
+ this.captureHeaderMeta(response);
114
+ if (response.proposalDecision !== undefined) {
115
+ this.attemptLive = false;
116
+ return proposalDecisionChunkStream(response.proposalDecision);
117
+ }
118
+ return this.toChunkStream(response, {
119
+ ...(headers !== undefined ? { headers } : {}),
120
+ ...(options.abortSignal ? { signal: options.abortSignal } : {}),
121
+ });
122
+ }
123
+ catch (error) {
124
+ this.attemptLive = false;
125
+ throw error;
126
+ }
127
+ }
128
+ async reconnectToStream(options) {
129
+ // Already attached: a second reconnect replays the SAME buffered frames into the SAME chat, so
130
+ // it adds a duplicate of the message the first attempt is writing rather than a second turn.
131
+ // React StrictMode runs the SDK's resume effect twice on mount, which makes this the ordinary
132
+ // case and not an edge one. `null` is the SDK's own "nothing to resume" answer and, unlike a
133
+ // throw, leaves it holding no state for an attempt that never happened.
134
+ if (this.attemptLive)
135
+ return null;
136
+ this.options.onAttemptStart?.();
137
+ const runId = this.options.getResumeRunId?.();
138
+ // No buffered run → resolve null without a network round-trip so we
139
+ // never surface a 404 from a doomed resume GET.
140
+ if (runId === undefined)
141
+ return null;
142
+ this.attemptLive = true;
143
+ try {
144
+ const headers = headerRecord(options.headers);
145
+ const response = await this.backend.resumeChatStream({
146
+ runId,
147
+ ...(headers !== undefined ? { headers } : {}),
148
+ });
149
+ if (response === null) {
150
+ this.attemptLive = false;
151
+ this.options.onResumeGone?.(runId);
152
+ return null;
153
+ }
154
+ this.captureHeaderMeta(response);
155
+ this.options.onResumeAttached?.(response.runId ?? runId);
156
+ return this.toChunkStream(response, {
157
+ runId,
158
+ ...(headers !== undefined ? { headers } : {}),
159
+ });
160
+ }
161
+ catch (error) {
162
+ this.attemptLive = false;
163
+ throw error;
164
+ }
165
+ }
166
+ captureHeaderMeta(response) {
167
+ if (response.runId)
168
+ this.currentRunId = response.runId;
169
+ if (response.threadId)
170
+ this.currentThreadId = response.threadId;
171
+ }
172
+ reconnectPolicy() {
173
+ const configured = this.options.reconnect;
174
+ if (configured === false)
175
+ return null;
176
+ return { ...DEFAULT_RECONNECT, ...configured };
177
+ }
178
+ recordMeta(meta) {
179
+ this.currentRunId = meta.runId;
180
+ this.currentThreadId = meta.threadId;
181
+ this.options.onMeta?.(meta);
182
+ }
183
+ /**
184
+ * Parse the backend's SSE byte stream and re-emit it as a valid v7 UI-message chunk stream.
185
+ * Recognized frames:
186
+ * - `event: meta` `data: {"runId","threadId"}` → records identity
187
+ * - `data: <AgentStreamEvent JSON>` → mapped to UI chunks (text / reasoning / tool /
188
+ * `data-*`; see {@link AgentChatTransport} docs)
189
+ * - `event: done` `data: {}` → terminates
190
+ * - `event: error` `data: {code,message}` → error chunk
191
+ *
192
+ * A run is ONE UI message with N steps. Each `step-start`/`step-finish` pair brackets a model
193
+ * call plus its tool execution; text and reasoning open lazily and close at the step boundary, so
194
+ * tool-call cards (input streaming → output) render live between the prose.
195
+ */
196
+ toChunkStream(source, context) {
197
+ let reader = source.body.getReader();
198
+ let decoder = new TextDecoder();
199
+ let buffer = '';
200
+ // Resuming a dropped stream: the run it belongs to, and the sequence number (SSE `id:`) of the
201
+ // last frame this stream has taken in. Only a server that numbers its frames can be resumed.
202
+ let streamRunId = source.runId ?? context.runId;
203
+ let lastSeq;
204
+ let cancelled = false;
205
+ const backend = this.backend;
206
+ const policy = this.reconnectPolicy();
207
+ const notify = (state) => this.options.onConnectionChange?.(state);
208
+ const reportRunError = (failure) => {
209
+ try {
210
+ this.options.onRunError?.({
211
+ ...failure,
212
+ ...(streamRunId !== undefined ? { runId: streamRunId } : {}),
213
+ });
214
+ }
215
+ catch {
216
+ /* a listener that throws must not replace the stream's own terminal */
217
+ }
218
+ };
219
+ const aborted = () => cancelled || context.signal?.aborted === true;
220
+ const canResume = () => policy !== null && lastSeq !== undefined && streamRunId !== undefined && !aborted();
221
+ /**
222
+ * Re-attach after a drop: `GET …/stream?after=<lastSeq>`, backing off between attempts. The
223
+ * chunk state (open step, text run, announced calls) is kept, so the resumed frames continue
224
+ * the message instead of starting another.
225
+ */
226
+ const resume = async () => {
227
+ const runId = streamRunId;
228
+ const after = lastSeq ?? 0;
229
+ const { maxAttempts, baseDelayMs, maxDelayMs } = policy;
230
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
231
+ notify({ status: 'reconnecting', runId, attempt, after });
232
+ await delay(Math.min(maxDelayMs, baseDelayMs * 2 ** (attempt - 1)), context.signal);
233
+ if (aborted())
234
+ return 'aborted';
235
+ try {
236
+ const next = await backend.resumeChatStream({
237
+ runId,
238
+ after,
239
+ ...(context.headers !== undefined ? { headers: context.headers } : {}),
240
+ ...(context.signal !== undefined ? { signal: context.signal } : {}),
241
+ });
242
+ if (next === null) {
243
+ notify({ status: 'gone', runId });
244
+ return 'gone';
245
+ }
246
+ reader = next.body.getReader();
247
+ decoder = new TextDecoder();
248
+ buffer = '';
249
+ notify({ status: 'live' });
250
+ return 'resumed';
251
+ }
252
+ catch {
253
+ if (aborted())
254
+ return 'aborted';
255
+ }
256
+ }
257
+ notify({ status: 'failed', runId });
258
+ return 'failed';
259
+ };
260
+ let started = false;
261
+ let stepOpen = false;
262
+ let stepIndex = 0;
263
+ let textId = null;
264
+ let reasoningId = null;
265
+ // When the open reasoning run started, for the duration stamped on its end when the backend
266
+ // does not report one (see `closeRuns`).
267
+ let reasoningStartedAt = 0;
268
+ // Text/reasoning runs opened within the current step. A pushed UI component closes the open run
269
+ // so prose after it lands AFTER it; the next run then needs an id of its own.
270
+ let textSeq = 0;
271
+ let reasoningSeq = 0;
272
+ // Tool calls this STREAM has already announced. The AI SDK settles a tool part by looking it
273
+ // up by call id and throws — dropping the whole message — when there is none, so an outcome
274
+ // must never be the first a client hears of a call. Per stream, not per transport: a resumed
275
+ // run replays its buffered frames from the beginning.
276
+ const announced = new Set();
277
+ // What each call's tool part carries as `toolMetadata`. The SDK REPLACES a part's metadata with
278
+ // whatever the latest chunk carries, so a `parentId` learnt from `tool-input-start` would be
279
+ // wiped by the `tool-input-available` that follows unless every chunk restates the merge.
280
+ const toolMetadata = new Map();
281
+ const record = (meta) => {
282
+ streamRunId = meta.runId;
283
+ this.recordMeta(meta);
284
+ };
285
+ // Every way out of the read loop below passes through here: the attempt is over the moment its
286
+ // chunk stream terminates, and a latch left set would refuse every later turn.
287
+ const endAttempt = () => {
288
+ this.attemptLive = false;
289
+ };
290
+ return new ReadableStream({
291
+ async pull(controller) {
292
+ function ensureStarted() {
293
+ if (started)
294
+ return;
295
+ started = true;
296
+ // The run rides the message's metadata, so a later call about THIS message (feedback,
297
+ // a resync) can find the rows the server persisted for it.
298
+ // `createdAt` so a live message has a timestamp the way a replayed one does.
299
+ controller.enqueue({
300
+ type: 'start',
301
+ messageMetadata: {
302
+ ...(streamRunId !== undefined ? { runId: streamRunId } : {}),
303
+ createdAt: new Date().toISOString(),
304
+ },
305
+ });
306
+ }
307
+ function openStep() {
308
+ ensureStarted();
309
+ if (stepOpen)
310
+ closeStep();
311
+ stepOpen = true;
312
+ stepIndex += 1;
313
+ textId = null;
314
+ reasoningId = null;
315
+ textSeq = 0;
316
+ reasoningSeq = 0;
317
+ controller.enqueue({ type: 'start-step' });
318
+ }
319
+ function ensureStep() {
320
+ if (!stepOpen)
321
+ openStep();
322
+ }
323
+ /**
324
+ * `reasoningMs` is the backend's own measurement (`step-finish.reasoningMs`) — the number the
325
+ * store persists, so a reloaded thread reads the same duration. Without one, the time this
326
+ * client watched the run stream, which is what the reader saw but reads ~0 on a replay.
327
+ */
328
+ function closeRuns(reasoningMs) {
329
+ if (textId !== null) {
330
+ controller.enqueue({ type: 'text-end', id: textId });
331
+ textId = null;
332
+ }
333
+ if (reasoningId !== null) {
334
+ controller.enqueue({
335
+ type: 'reasoning-end',
336
+ id: reasoningId,
337
+ providerMetadata: reasoningDurationMetadata(reasoningMs ?? Math.max(0, Date.now() - reasoningStartedAt)),
338
+ });
339
+ reasoningId = null;
340
+ }
341
+ }
342
+ function closeStep(reasoningMs) {
343
+ if (!stepOpen)
344
+ return;
345
+ closeRuns(reasoningMs);
346
+ controller.enqueue({ type: 'finish-step' });
347
+ stepOpen = false;
348
+ }
349
+ /** Merge what this frame says about a call into what earlier frames said, and return it. */
350
+ function metadataFor(id, toolKind, parentId) {
351
+ const merged = { ...toolMetadata.get(id) };
352
+ if (toolKind !== undefined)
353
+ merged.toolKind = toolKind;
354
+ // A call's parent is fixed by the first frame that names one.
355
+ if (parentId !== undefined && merged.parentId === undefined)
356
+ merged.parentId = parentId;
357
+ if (Object.keys(merged).length === 0)
358
+ return undefined;
359
+ toolMetadata.set(id, merged);
360
+ return merged;
361
+ }
362
+ /** Forward a frame this transport has no dedicated mapping for as an AI SDK data part. */
363
+ function forwardAsData(event, transient) {
364
+ ensureStarted();
365
+ const { kind, ...data } = event;
366
+ controller.enqueue({
367
+ type: `data-${kind}`,
368
+ ...(typeof data.id === 'string' ? { id: data.id } : {}),
369
+ data,
370
+ ...(transient ? { transient: true } : {}),
371
+ });
372
+ }
373
+ function emit(event) {
374
+ switch (event.kind) {
375
+ case 'step-start':
376
+ openStep();
377
+ break;
378
+ case 'step-finish':
379
+ closeStep(event.reasoningMs);
380
+ // `costUsd` rides the step boundary once the backend reports it (older backends omit
381
+ // it entirely — `undefined`, never a crash). `null` means "priced provider/estimate
382
+ // unavailable", distinct from a real $0 turn — surfaced verbatim as message metadata
383
+ // (merged onto `message.metadata` by the AI SDK) so a UI can render running cost
384
+ // without polling `GET /quota`.
385
+ if (event.costUsd !== undefined) {
386
+ controller.enqueue({
387
+ type: 'message-metadata',
388
+ messageMetadata: { costUsd: event.costUsd },
389
+ });
390
+ }
391
+ break;
392
+ case 'text':
393
+ ensureStep();
394
+ if (textId === null) {
395
+ textId = textSeq === 0 ? `txt-${stepIndex}` : `txt-${stepIndex}.${textSeq}`;
396
+ textSeq += 1;
397
+ controller.enqueue({ type: 'text-start', id: textId });
398
+ }
399
+ controller.enqueue({ type: 'text-delta', id: textId, delta: event.text });
400
+ break;
401
+ case 'reasoning':
402
+ ensureStep();
403
+ if (reasoningId === null) {
404
+ reasoningId =
405
+ reasoningSeq === 0 ? `rsn-${stepIndex}` : `rsn-${stepIndex}.${reasoningSeq}`;
406
+ reasoningSeq += 1;
407
+ reasoningStartedAt = Date.now();
408
+ controller.enqueue({ type: 'reasoning-start', id: reasoningId });
409
+ }
410
+ controller.enqueue({ type: 'reasoning-delta', id: reasoningId, delta: event.text });
411
+ break;
412
+ case 'tool-input-start': {
413
+ ensureStep();
414
+ announced.add(event.id);
415
+ // `toolKind` is absent on older backends — omitted (not `undefined`-valued) so
416
+ // `toolMetadata` itself is only present when there's something to say, letting a
417
+ // UI gate approval affordances on `kind === 'action'` without hardcoding tool names.
418
+ // `parentId` nests the call under another one (see `TranscriptToolCall.children`).
419
+ const metadata = metadataFor(event.id, event.toolKind, event.parentId);
420
+ controller.enqueue({
421
+ type: 'tool-input-start',
422
+ toolCallId: event.id,
423
+ toolName: event.name,
424
+ ...(metadata !== undefined ? { toolMetadata: metadata } : {}),
425
+ });
426
+ break;
427
+ }
428
+ case 'tool-input-delta':
429
+ ensureStep();
430
+ controller.enqueue({
431
+ type: 'tool-input-delta',
432
+ toolCallId: event.id,
433
+ inputTextDelta: event.delta,
434
+ });
435
+ break;
436
+ case 'tool-input-available': {
437
+ ensureStep();
438
+ announced.add(event.id);
439
+ const metadata = metadataFor(event.id, event.toolKind, event.parentId);
440
+ controller.enqueue({
441
+ type: 'tool-input-available',
442
+ toolCallId: event.id,
443
+ toolName: event.name,
444
+ input: event.input,
445
+ ...(metadata !== undefined ? { toolMetadata: metadata } : {}),
446
+ });
447
+ break;
448
+ }
449
+ case 'elicitation':
450
+ ensureStep();
451
+ // An authored intake asks before the turn's first model call, so nothing announced
452
+ // the call this question set is parked under — open it here, carrying the request as
453
+ // the part's input, which is exactly what the store persists as the call's input and
454
+ // therefore what a reloaded thread replays. The model's own `ask` announced its call
455
+ // itself, and re-stating it would fire a consumer's `onToolCall` twice.
456
+ if (!announced.has(event.id)) {
457
+ announced.add(event.id);
458
+ controller.enqueue({
459
+ type: 'tool-input-available',
460
+ toolCallId: event.id,
461
+ toolName: ASK_TOOL_NAME,
462
+ input: {
463
+ ...(event.request.preamble !== undefined
464
+ ? { preamble: event.request.preamble }
465
+ : {}),
466
+ questions: event.request.questions,
467
+ },
468
+ });
469
+ }
470
+ break;
471
+ case 'tool-output':
472
+ ensureStep();
473
+ controller.enqueue({
474
+ type: 'tool-output-available',
475
+ toolCallId: event.id,
476
+ output: event.output,
477
+ });
478
+ break;
479
+ case 'tool-output-error':
480
+ ensureStep();
481
+ controller.enqueue({
482
+ type: 'tool-output-error',
483
+ toolCallId: event.id,
484
+ errorText: event.error,
485
+ });
486
+ break;
487
+ case 'tool-output-denied':
488
+ ensureStep();
489
+ // The SDK's own state for "a person said no": it keeps the part's input and metadata
490
+ // and only moves its state, so a card can say the decision was carried out instead of
491
+ // drawing the red treatment an error gets. The reason (when one was given) rides the
492
+ // persisted call, not this chunk — the SDK's shape carries no room for it.
493
+ controller.enqueue({ type: 'tool-output-denied', toolCallId: event.id });
494
+ break;
495
+ case 'approval-requested':
496
+ ensureStep();
497
+ // Who decides and until when rides a `data-approval-requested` part keyed by the call
498
+ // id — the SDK's approval chunk has no room for it, and restating the call's input
499
+ // chunk to widen its metadata would fire a consumer's `onToolCall` a second time.
500
+ forwardAsData(event, false);
501
+ // The SDK settles an approval against a part it already holds and throws — dropping
502
+ // the whole message — when there is none, so only a call this stream announced moves
503
+ // into the native state. The approval id IS the call id: the lib settles approvals
504
+ // by tool-call id, so a second identifier would only have to be mapped back.
505
+ if (announced.has(event.id)) {
506
+ controller.enqueue({
507
+ type: 'tool-approval-request',
508
+ approvalId: event.id,
509
+ toolCallId: event.id,
510
+ });
511
+ }
512
+ break;
513
+ case 'approval-settled':
514
+ ensureStep();
515
+ // Metadata about a call, like the request: the transcript folds it into that call's
516
+ // `approval`. The call's own state moves on its output frame, not on this one.
517
+ forwardAsData(event, false);
518
+ break;
519
+ case 'ui':
520
+ ensureStep();
521
+ // Positioned content: close the open prose so text written after the component
522
+ // renders after it instead of growing the paragraph above it.
523
+ closeRuns();
524
+ controller.enqueue({
525
+ type: 'data-ui',
526
+ id: event.id,
527
+ data: {
528
+ id: event.id,
529
+ component: event.component,
530
+ props: event.props,
531
+ ...(event.version !== undefined ? { version: event.version } : {}),
532
+ ...(event.toolCallId !== undefined ? { toolCallId: event.toolCallId } : {}),
533
+ },
534
+ });
535
+ break;
536
+ case 'message-metadata':
537
+ ensureStarted();
538
+ controller.enqueue({ type: 'message-metadata', messageMetadata: event.metadata });
539
+ break;
540
+ case 'title':
541
+ case 'cancelled':
542
+ // The thread's queue changed, or this run handed the thread to the next queued message
543
+ // (`started`). Thread-level, like the title.
544
+ case 'queue':
545
+ // Thread- and run-level facts, not message content: seen by `onData`, never stored
546
+ // as a part of the message.
547
+ forwardAsData(event, true);
548
+ break;
549
+ default:
550
+ // A kind this version does not know (a newer server, a runner that is not this
551
+ // library's loop). Forwarded rather than dropped, so a host can render it from
552
+ // `message.parts` / `onData` without waiting for a release that maps it.
553
+ forwardAsData(event, false);
554
+ break;
555
+ }
556
+ }
557
+ function finish() {
558
+ ensureStarted();
559
+ closeStep();
560
+ controller.enqueue({ type: 'finish' });
561
+ controller.close();
562
+ endAttempt();
563
+ }
564
+ function fail(errorText, start = true) {
565
+ if (start)
566
+ ensureStarted();
567
+ controller.enqueue({ type: 'error', errorText });
568
+ controller.close();
569
+ endAttempt();
570
+ }
571
+ /** The stream dropped (or ended without `done`): resume it, or report how it ended. */
572
+ async function recover(error) {
573
+ if (!canResume()) {
574
+ if (error === undefined) {
575
+ finish();
576
+ }
577
+ else {
578
+ fail(error instanceof Error ? error.message : 'Agent stream error', false);
579
+ }
580
+ return false;
581
+ }
582
+ const outcome = await resume();
583
+ if (outcome === 'resumed')
584
+ return true;
585
+ if (outcome === 'failed') {
586
+ fail('Lost the connection to the agent stream');
587
+ }
588
+ else {
589
+ // Gone: the run ended while we were away — what we have is all this stream will get,
590
+ // and the persisted thread holds the rest. Aborted: the user stopped the turn.
591
+ finish();
592
+ }
593
+ return false;
594
+ }
595
+ try {
596
+ while (true) {
597
+ let result;
598
+ try {
599
+ result = await reader.read();
600
+ }
601
+ catch (error) {
602
+ if (await recover(error))
603
+ continue;
604
+ return;
605
+ }
606
+ if (result.done) {
607
+ if (await recover(undefined))
608
+ continue;
609
+ return;
610
+ }
611
+ buffer += decoder.decode(result.value, { stream: true });
612
+ let separator = buffer.indexOf('\n\n');
613
+ while (separator !== -1) {
614
+ const rawEvent = buffer.slice(0, separator);
615
+ buffer = buffer.slice(separator + 2);
616
+ separator = buffer.indexOf('\n\n');
617
+ const frame = parseSseFrame(rawEvent);
618
+ if (frame.id !== undefined) {
619
+ // Already taken in before a reconnect — a server that ignored `after` resends it.
620
+ if (lastSeq !== undefined && frame.id <= lastSeq)
621
+ continue;
622
+ lastSeq = frame.id;
623
+ }
624
+ if (frame.event === 'done') {
625
+ finish();
626
+ return;
627
+ }
628
+ if (frame.event === 'error') {
629
+ const failure = parseErrorFrame(frame.data);
630
+ reportRunError(failure);
631
+ fail(failure.message);
632
+ return;
633
+ }
634
+ if (frame.event === 'meta') {
635
+ const meta = parseMeta(frame.data);
636
+ if (meta)
637
+ record(meta);
638
+ }
639
+ else if (frame.data) {
640
+ const event = parseEvent(frame.data);
641
+ if (event)
642
+ emit(event);
643
+ }
644
+ }
645
+ }
646
+ }
647
+ catch (error) {
648
+ fail(error instanceof Error ? error.message : 'Agent stream error', false);
649
+ }
650
+ },
651
+ cancel() {
652
+ cancelled = true;
653
+ // A stop aborts the request first, which errors the body: cancelling an errored stream
654
+ // rejects with that same AbortError, and nobody is left to hear it.
655
+ reader.cancel().catch(() => undefined);
656
+ endAttempt();
657
+ },
658
+ });
659
+ }
660
+ }
661
+ /** The chunk stream for a send the server queued: one transient `data-queue` part, then the end. */
662
+ function queuedChunkStream(queued) {
663
+ return new ReadableStream({
664
+ start(controller) {
665
+ controller.enqueue({
666
+ type: 'data-queue',
667
+ data: { queue: queued.queue, queuedSend: queued },
668
+ transient: true,
669
+ });
670
+ controller.close();
671
+ },
672
+ });
673
+ }
674
+ /** Split one `event:`/`data:` SSE block into its fields. */
675
+ function parseSseFrame(raw) {
676
+ let event;
677
+ let id;
678
+ const dataLines = [];
679
+ for (const line of raw.split('\n')) {
680
+ if (line.startsWith('event:')) {
681
+ event = line.slice('event:'.length).trim();
682
+ }
683
+ else if (line.startsWith('id:')) {
684
+ const parsed = Number(line.slice('id:'.length).trim());
685
+ if (Number.isSafeInteger(parsed) && parsed > 0)
686
+ id = parsed;
687
+ }
688
+ else if (line.startsWith('data:')) {
689
+ dataLines.push(line.slice('data:'.length).trimStart());
690
+ }
691
+ }
692
+ return {
693
+ event,
694
+ data: dataLines.length > 0 ? dataLines.join('\n') : undefined,
695
+ id,
696
+ };
697
+ }
698
+ function parseMeta(data) {
699
+ if (!data)
700
+ return null;
701
+ try {
702
+ const parsed = JSON.parse(data);
703
+ if (parsed !== null &&
704
+ typeof parsed === 'object' &&
705
+ 'runId' in parsed &&
706
+ 'threadId' in parsed &&
707
+ typeof parsed.runId === 'string' &&
708
+ typeof parsed.threadId === 'string') {
709
+ return { runId: parsed.runId, threadId: parsed.threadId };
710
+ }
711
+ }
712
+ catch {
713
+ /* malformed meta frame — ignore */
714
+ }
715
+ return null;
716
+ }
717
+ /** Read the backend's `event: error` frame (`{code,message}`); a malformed one is a bare failure. */
718
+ function parseErrorFrame(data) {
719
+ const fallback = { code: undefined, message: 'Agent run failed' };
720
+ if (!data)
721
+ return fallback;
722
+ try {
723
+ const parsed = JSON.parse(data);
724
+ if (parsed !== null && typeof parsed === 'object') {
725
+ const record = parsed;
726
+ return {
727
+ code: typeof record.code === 'string' && record.code !== '' ? record.code : undefined,
728
+ message: typeof record.message === 'string' && record.message !== ''
729
+ ? record.message
730
+ : fallback.message,
731
+ };
732
+ }
733
+ }
734
+ catch {
735
+ /* malformed error frame — fall through to the default */
736
+ }
737
+ return fallback;
738
+ }
739
+ /** Parse a `data:` frame as an `AgentStreamEvent`. Returns null for anything without a `kind`. */
740
+ function parseEvent(data) {
741
+ try {
742
+ const parsed = JSON.parse(data);
743
+ if (parsed !== null && typeof parsed === 'object' && 'kind' in parsed) {
744
+ return parsed;
745
+ }
746
+ }
747
+ catch {
748
+ /* not an event frame — ignore */
749
+ }
750
+ return null;
751
+ }
752
+ /** Collect all text parts of a UI message into a single string. */
753
+ function extractText(message) {
754
+ let text = '';
755
+ for (const part of message.parts ?? []) {
756
+ if (part.type === 'text')
757
+ text += part.text;
758
+ }
759
+ return text;
760
+ }
761
+ /** Per-request headers as the AI SDK hands them over, as a plain record (or nothing). */
762
+ function headerRecord(headers) {
763
+ if (headers === undefined)
764
+ return undefined;
765
+ return headers instanceof Headers ? Object.fromEntries(headers.entries()) : headers;
766
+ }
767
+ /** Wait `ms`, resolving early when `signal` aborts. */
768
+ function delay(ms, signal) {
769
+ if (ms <= 0 || signal?.aborted)
770
+ return Promise.resolve();
771
+ return new Promise((resolve) => {
772
+ const timer = setTimeout(done, ms);
773
+ function done() {
774
+ clearTimeout(timer);
775
+ signal?.removeEventListener('abort', done);
776
+ resolve();
777
+ }
778
+ signal?.addEventListener('abort', done, { once: true });
779
+ });
780
+ }
781
+ function proposalDecisionChunkStream(decision) {
782
+ return new ReadableStream({
783
+ start(controller) {
784
+ controller.enqueue({ type: 'start', messageId: `decision:${crypto.randomUUID()}` });
785
+ controller.enqueue({ type: 'data-proposal-decision', data: decision, transient: true });
786
+ if (decision.text !== undefined && decision.text.length > 0) {
787
+ controller.enqueue({ type: 'text-start', id: 'decision' });
788
+ controller.enqueue({ type: 'text-delta', id: 'decision', delta: decision.text });
789
+ controller.enqueue({ type: 'text-end', id: 'decision' });
790
+ }
791
+ controller.enqueue({ type: 'finish', finishReason: 'stop' });
792
+ controller.close();
793
+ },
794
+ });
795
+ }
796
+ //# sourceMappingURL=agent-chat-transport.js.map