experimental-a2 0.16.1 → 0.18.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 (406) hide show
  1. package/CHANGELOG.md +373 -0
  2. package/README.md +1 -1
  3. package/dist/{actor-ohPC-81x.d.ts → actor-Bjce9_5U.d.ts} +21 -11
  4. package/dist/actor-Bjce9_5U.d.ts.map +1 -0
  5. package/dist/actor-client.d.ts +2 -5
  6. package/dist/actor-client.d.ts.map +1 -1
  7. package/dist/actor-client.js +13 -4
  8. package/dist/actor-client.js.map +1 -1
  9. package/dist/actor-react.d.ts +5 -3
  10. package/dist/actor-react.d.ts.map +1 -1
  11. package/dist/actor-react.js +20 -10
  12. package/dist/actor-react.js.map +1 -1
  13. package/dist/{actor-shared-B5tJfzt-.js → actor-shared-t7w8xIKP.js} +12 -7
  14. package/dist/actor-shared-t7w8xIKP.js.map +1 -0
  15. package/dist/actor.d.ts +1 -1
  16. package/dist/actor.js +42 -23
  17. package/dist/actor.js.map +1 -1
  18. package/dist/{ai-DgOBltJ_.js → ai-BpOGm-zB.js} +621 -216
  19. package/dist/ai-BpOGm-zB.js.map +1 -0
  20. package/dist/{ai-CrEf6p_W.d.ts → ai-DrUaMyRt.d.ts} +114 -100
  21. package/dist/ai-DrUaMyRt.d.ts.map +1 -0
  22. package/dist/ai-client.d.ts +27 -0
  23. package/dist/ai-client.d.ts.map +1 -0
  24. package/dist/ai-client.js +29 -0
  25. package/dist/ai-client.js.map +1 -0
  26. package/dist/ai-fx.browser.d.ts +1 -0
  27. package/dist/ai-fx.browser.js +6 -0
  28. package/dist/ai-fx.browser.js.map +1 -0
  29. package/dist/ai-fx.d.ts +10 -0
  30. package/dist/ai-fx.d.ts.map +1 -0
  31. package/dist/ai-fx.js +634 -0
  32. package/dist/ai-fx.js.map +1 -0
  33. package/dist/ai-harness-BuLh_EYi.js +273 -0
  34. package/dist/ai-harness-BuLh_EYi.js.map +1 -0
  35. package/dist/ai-harness-DvsPeJeB.d.ts +26 -0
  36. package/dist/ai-harness-DvsPeJeB.d.ts.map +1 -0
  37. package/dist/ai-pi.browser.d.ts +1 -0
  38. package/dist/ai-pi.browser.js +6 -0
  39. package/dist/ai-pi.browser.js.map +1 -0
  40. package/dist/ai-pi.d.ts +17 -0
  41. package/dist/ai-pi.d.ts.map +1 -0
  42. package/dist/ai-pi.js +904 -0
  43. package/dist/ai-pi.js.map +1 -0
  44. package/dist/ai-react.d.ts +96 -0
  45. package/dist/ai-react.d.ts.map +1 -0
  46. package/dist/ai-react.js +142 -0
  47. package/dist/ai-react.js.map +1 -0
  48. package/dist/ai-server.browser.js +2 -2
  49. package/dist/ai-server.browser.js.map +1 -1
  50. package/dist/ai-server.d.ts +109 -43
  51. package/dist/ai-server.d.ts.map +1 -1
  52. package/dist/ai-server.js +526 -283
  53. package/dist/ai-server.js.map +1 -1
  54. package/dist/ai.d.ts +2 -2
  55. package/dist/ai.js +2 -2
  56. package/dist/bounded-cache-CPHWF-8h.js +41 -0
  57. package/dist/bounded-cache-CPHWF-8h.js.map +1 -0
  58. package/dist/{client-BYzHjkwU.js → client-BReKqwZC.js} +447 -80
  59. package/dist/client-BReKqwZC.js.map +1 -0
  60. package/dist/{client-CzyacQpJ.d.ts → client-h_DKFAjj.d.ts} +14 -13
  61. package/dist/client-h_DKFAjj.d.ts.map +1 -0
  62. package/dist/client.d.ts +4 -2
  63. package/dist/client.js +1 -1
  64. package/dist/{contract-CKRg_E4q.js → contract-BYKASlCV.js} +12 -21
  65. package/dist/contract-BYKASlCV.js.map +1 -0
  66. package/dist/{idempotent-replay-DVOlyYbx.js → idempotent-replay-JdgMQRRm.js} +2 -2
  67. package/dist/{idempotent-replay-DVOlyYbx.js.map → idempotent-replay-JdgMQRRm.js.map} +1 -1
  68. package/dist/index.d.ts +6 -5
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +4 -3
  71. package/dist/{errors-DvhSXnxk.d.ts → initial-snapshot-Bx-c0pDP.d.ts} +7 -3
  72. package/dist/initial-snapshot-Bx-c0pDP.d.ts.map +1 -0
  73. package/dist/{internal-Dq2qYxou.js → internal-B2T3U4Rq.js} +29 -2
  74. package/dist/internal-B2T3U4Rq.js.map +1 -0
  75. package/dist/otel.d.ts +1 -1
  76. package/dist/react-BBXgHWFc.d.ts +86 -0
  77. package/dist/react-BBXgHWFc.d.ts.map +1 -0
  78. package/dist/react.d.ts +2 -122
  79. package/dist/react.js +107 -100
  80. package/dist/react.js.map +1 -1
  81. package/dist/reducer-BAXc8JyF.js +87 -0
  82. package/dist/reducer-BAXc8JyF.js.map +1 -0
  83. package/dist/{reducer-otzHjuJj.d.ts → reducer-CqA59Q6U.d.ts} +46 -30
  84. package/dist/reducer-CqA59Q6U.d.ts.map +1 -0
  85. package/dist/reducer-runtime-DQwz_J59.js +28 -0
  86. package/dist/reducer-runtime-DQwz_J59.js.map +1 -0
  87. package/dist/scheduler-qstash.d.ts +3 -3
  88. package/dist/scheduler-qstash.d.ts.map +1 -1
  89. package/dist/scheduler-qstash.js +33 -10
  90. package/dist/scheduler-qstash.js.map +1 -1
  91. package/dist/{scheduler-task-BpzhPnRS.js → scheduler-task-X1SToDjP.js} +18 -3
  92. package/dist/scheduler-task-X1SToDjP.js.map +1 -0
  93. package/dist/scheduler-vercel.d.ts +4 -9
  94. package/dist/scheduler-vercel.d.ts.map +1 -1
  95. package/dist/scheduler-vercel.js +25 -44
  96. package/dist/scheduler-vercel.js.map +1 -1
  97. package/dist/{server-BD5ckxZb.js → server-Dw_k_7kO.js} +904 -219
  98. package/dist/server-Dw_k_7kO.js.map +1 -0
  99. package/dist/{server-DbD7IJVK.d.ts → server-En7cbi3v.d.ts} +116 -26
  100. package/dist/server-En7cbi3v.d.ts.map +1 -0
  101. package/dist/server.d.ts +4 -4
  102. package/dist/server.js +2 -2
  103. package/dist/session-clear-Bo-XTFEy.d.ts +12 -0
  104. package/dist/session-clear-Bo-XTFEy.d.ts.map +1 -0
  105. package/dist/{errors-DCk6ch5n.js → session-clear-DGI4jTQ5.js} +17 -2
  106. package/dist/session-clear-DGI4jTQ5.js.map +1 -0
  107. package/dist/{store-DyZM6fS5.d.ts → store-Djdv0bnZ.d.ts} +73 -3
  108. package/dist/store-Djdv0bnZ.d.ts.map +1 -0
  109. package/dist/store-N8PXxDAS.js.map +1 -1
  110. package/dist/store-memory.d.ts +1 -1
  111. package/dist/store-memory.d.ts.map +1 -1
  112. package/dist/store-memory.js +205 -66
  113. package/dist/store-memory.js.map +1 -1
  114. package/dist/{store-polling-CmxUbV93.js → store-polling-B5FcwJfo.js} +21 -4
  115. package/dist/store-polling-B5FcwJfo.js.map +1 -0
  116. package/dist/store-postgres.d.ts +1 -1
  117. package/dist/store-postgres.d.ts.map +1 -1
  118. package/dist/store-postgres.js +450 -108
  119. package/dist/store-postgres.js.map +1 -1
  120. package/dist/{store-presence-polling-C7-XZyW9.js → store-presence-polling-BAwS8RWn.js} +3 -3
  121. package/dist/{store-presence-polling-C7-XZyW9.js.map → store-presence-polling-BAwS8RWn.js.map} +1 -1
  122. package/dist/store-redis-http.d.ts +1 -1
  123. package/dist/store-redis-http.d.ts.map +1 -1
  124. package/dist/store-redis-http.js +293 -11
  125. package/dist/store-redis-http.js.map +1 -1
  126. package/dist/store-redis-notify-BRITti_o.js +2493 -0
  127. package/dist/store-redis-notify-BRITti_o.js.map +1 -0
  128. package/dist/store-redis.d.ts +1 -1
  129. package/dist/store-redis.d.ts.map +1 -1
  130. package/dist/store-redis.js +11 -11
  131. package/dist/store-redis.js.map +1 -1
  132. package/dist/store-sqlite.d.ts +1 -1
  133. package/dist/store-sqlite.d.ts.map +1 -1
  134. package/dist/store-sqlite.js +197 -33
  135. package/dist/store-sqlite.js.map +1 -1
  136. package/dist/stream-buffer-Cx7AAPGq.js +23 -0
  137. package/dist/stream-buffer-Cx7AAPGq.js.map +1 -0
  138. package/dist/{telemetry-B5jzpy6y.d.ts → telemetry-Cyfqo6Qt.d.ts} +2 -2
  139. package/dist/telemetry-Cyfqo6Qt.d.ts.map +1 -0
  140. package/dist/{wire-BO5wWCb1.js → wire-rSUglYo8.js} +132 -10
  141. package/dist/wire-rSUglYo8.js.map +1 -0
  142. package/docs/01-quickstart.mdx +50 -84
  143. package/docs/{guides/07-examples.mdx → 02-examples.mdx} +10 -20
  144. package/docs/actors/01-introduction.mdx +48 -82
  145. package/docs/actors/02-concurrency.mdx +43 -70
  146. package/docs/actors/03-timers.mdx +28 -42
  147. package/docs/actors/04-routes.mdx +110 -137
  148. package/docs/actors/meta.ts +1 -1
  149. package/docs/agents/01-introduction.mdx +257 -0
  150. package/docs/agents/02-tools.mdx +247 -0
  151. package/docs/agents/03-conversations.mdx +538 -0
  152. package/docs/agents/04-harnesses.mdx +136 -0
  153. package/docs/agents/meta.ts +1 -0
  154. package/docs/client/01-react.mdx +294 -0
  155. package/docs/client/02-transports.mdx +86 -0
  156. package/docs/client/03-presence.mdx +224 -0
  157. package/docs/client/meta.ts +1 -0
  158. package/docs/contract/01-events.mdx +57 -0
  159. package/docs/contract/02-state.mdx +142 -0
  160. package/docs/contract/03-sessions.mdx +175 -0
  161. package/docs/index.mdx +112 -156
  162. package/docs/reference/01-core.mdx +139 -0
  163. package/docs/reference/02-server.mdx +855 -0
  164. package/docs/reference/03-client.mdx +301 -0
  165. package/docs/reference/04-ai.mdx +722 -0
  166. package/docs/reference/05-adapters.mdx +351 -0
  167. package/docs/reference/06-errors.mdx +138 -0
  168. package/docs/reference/meta.ts +1 -1
  169. package/docs/server/01-handlers.mdx +200 -0
  170. package/docs/server/02-timers.mdx +130 -0
  171. package/docs/server/03-cancellation.mdx +141 -0
  172. package/docs/server/04-routes.mdx +243 -0
  173. package/docs/server/05-production.mdx +322 -0
  174. package/docs/server/06-guarantees.mdx +123 -0
  175. package/examples/playground/DEPLOY.md +53 -7
  176. package/examples/playground/app/a0/[appId]/loading.tsx +16 -0
  177. package/examples/playground/app/a0/[appId]/page.tsx +53 -0
  178. package/examples/playground/app/a0/a0.css +818 -0
  179. package/examples/playground/app/a0/app-list.tsx +218 -0
  180. package/examples/playground/app/a0/app-view.tsx +63 -0
  181. package/examples/playground/app/a0/apps/[appId]/preview/route.ts +27 -0
  182. package/examples/playground/app/a0/apps/[appId]/route.ts +28 -0
  183. package/examples/playground/app/a0/apps.test.ts +128 -0
  184. package/examples/playground/app/a0/apps.ts +102 -0
  185. package/examples/playground/app/a0/chat.tsx +410 -0
  186. package/examples/playground/app/a0/columns.tsx +109 -0
  187. package/examples/playground/app/a0/context-menu.tsx +116 -0
  188. package/examples/playground/app/a0/cookies.ts +46 -0
  189. package/examples/playground/app/a0/crash-on-request.ts +72 -0
  190. package/examples/playground/app/a0/crashes/route.ts +3 -0
  191. package/examples/playground/app/a0/crashes.test.ts +33 -0
  192. package/examples/playground/app/a0/crashes.ts +28 -0
  193. package/examples/playground/app/a0/devtools.tsx +164 -0
  194. package/examples/playground/app/a0/events/route.ts +6 -0
  195. package/examples/playground/app/a0/flags.ts +30 -0
  196. package/examples/playground/app/a0/fx/events/route.ts +9 -0
  197. package/examples/playground/app/a0/fx/scheduler/route.ts +7 -0
  198. package/examples/playground/app/a0/fx/short/events/route.ts +11 -0
  199. package/examples/playground/app/a0/layout.tsx +38 -0
  200. package/examples/playground/app/a0/list/route.ts +10 -0
  201. package/examples/playground/app/a0/model.test.ts +73 -0
  202. package/examples/playground/app/a0/model.ts +95 -0
  203. package/examples/playground/app/a0/no-photon.cjs +4 -0
  204. package/examples/playground/app/a0/no-quickjs.cjs +3 -0
  205. package/examples/playground/app/a0/page.tsx +14 -0
  206. package/examples/playground/app/a0/pi/events/route.ts +9 -0
  207. package/examples/playground/app/a0/pi/scheduler/route.ts +7 -0
  208. package/examples/playground/app/a0/pi/short/events/route.ts +11 -0
  209. package/examples/playground/app/a0/preview-pane.tsx +145 -0
  210. package/examples/playground/app/a0/preview.test.ts +53 -0
  211. package/examples/playground/app/a0/preview.ts +26 -0
  212. package/examples/playground/app/a0/sandbox-log.ts +75 -0
  213. package/examples/playground/app/a0/sandbox-session.ts +152 -0
  214. package/examples/playground/app/a0/sandbox.ts +191 -0
  215. package/examples/playground/app/a0/sandboxes/scheduler/route.ts +6 -0
  216. package/examples/playground/app/a0/scheduler/route.ts +7 -0
  217. package/examples/playground/app/a0/server.ts +213 -0
  218. package/examples/playground/app/a0/session.ts +59 -0
  219. package/examples/playground/app/a0/shell.tsx +158 -0
  220. package/examples/playground/app/a0/short/events/route.ts +9 -0
  221. package/examples/playground/app/a0/splitter.tsx +120 -0
  222. package/examples/playground/app/agent/[agentId]/agent-client.tsx +144 -174
  223. package/examples/playground/app/agent/[agentId]/command-receipt.test.tsx +65 -0
  224. package/examples/playground/app/agent/[agentId]/command-receipt.tsx +27 -0
  225. package/examples/playground/app/agent/[agentId]/compaction-event.tsx +25 -24
  226. package/examples/playground/app/agent/[agentId]/compaction-panel.test.tsx +119 -0
  227. package/examples/playground/app/agent/[agentId]/compaction-panel.tsx +208 -165
  228. package/examples/playground/app/agent/[agentId]/page.tsx +2 -16
  229. package/examples/playground/app/agent/events/route.ts +5 -2
  230. package/examples/playground/app/agent/ingress.test.ts +101 -0
  231. package/examples/playground/app/agent/model-input.test.tsx +58 -0
  232. package/examples/playground/app/agent/model-input.tsx +115 -0
  233. package/examples/playground/app/agent/model.test.ts +73 -0
  234. package/examples/playground/app/agent/model.ts +58 -26
  235. package/examples/playground/app/agent/new-agent-session.tsx +37 -19
  236. package/examples/playground/app/agent/page.tsx +4 -4
  237. package/examples/playground/app/agent/server.ts +19 -15
  238. package/examples/playground/app/agent/session.ts +5 -6
  239. package/examples/playground/app/agent/telemetry.test.ts +189 -0
  240. package/examples/playground/app/agent/telemetry.ts +30 -0
  241. package/examples/playground/app/agent/trace.test.ts +23 -0
  242. package/examples/playground/app/agent/trace.ts +18 -0
  243. package/examples/playground/app/canvas/[canvasId]/canvas-client.tsx +12 -12
  244. package/examples/playground/app/canvas/[canvasId]/page.tsx +1 -2
  245. package/examples/playground/app/canvas/[canvasId]/session.ts +2 -2
  246. package/examples/playground/app/canvas/model.ts +53 -53
  247. package/examples/playground/app/chat/[chatId]/agent-state.test.ts +176 -0
  248. package/examples/playground/app/chat/[chatId]/agent-stream-drawer.tsx +16 -1
  249. package/examples/playground/app/chat/[chatId]/chat-client.tsx +55 -77
  250. package/examples/playground/app/chat/[chatId]/chat-view.ts +37 -3
  251. package/examples/playground/app/chat/[chatId]/page.tsx +7 -15
  252. package/examples/playground/app/chat/[chatId]/session.ts +2 -19
  253. package/examples/playground/app/chat/agent/route.ts +9 -0
  254. package/examples/playground/app/chat/model.test.ts +46 -119
  255. package/examples/playground/app/chat/model.ts +82 -128
  256. package/examples/playground/app/chat/scheduler/route.ts +2 -2
  257. package/examples/playground/app/chat/server.test.ts +112 -0
  258. package/examples/playground/app/chat/server.ts +113 -117
  259. package/examples/playground/app/components/activity-feed.tsx +30 -1
  260. package/examples/playground/app/components/activity-history.test.tsx +35 -0
  261. package/examples/playground/app/components/demo-icons.tsx +89 -0
  262. package/examples/playground/app/components/demos.tsx +33 -0
  263. package/examples/playground/app/components/fast-link.test.tsx +58 -0
  264. package/examples/playground/app/components/fast-link.tsx +55 -0
  265. package/examples/playground/app/components/site-header.tsx +96 -0
  266. package/examples/playground/app/counter/counter-client.tsx +3 -3
  267. package/examples/playground/app/counter/model.test.ts +3 -3
  268. package/examples/playground/app/counter/model.ts +11 -21
  269. package/examples/playground/app/counter/page.tsx +2 -15
  270. package/examples/playground/app/counter/session.ts +2 -2
  271. package/examples/playground/app/documents/[documentId]/code-editor.tsx +12 -1
  272. package/examples/playground/app/documents/[documentId]/document-client.tsx +10 -11
  273. package/examples/playground/app/documents/[documentId]/page.tsx +1 -2
  274. package/examples/playground/app/documents/[documentId]/session.ts +2 -2
  275. package/examples/playground/app/documents/model.ts +27 -27
  276. package/examples/playground/app/globals.css +420 -207
  277. package/examples/playground/app/initial-state.test.tsx +54 -0
  278. package/examples/playground/app/layout.tsx +7 -23
  279. package/examples/playground/app/orders/[orderId]/page.tsx +1 -2
  280. package/examples/playground/app/orders/[orderId]/session.ts +2 -2
  281. package/examples/playground/app/orders/model.ts +49 -49
  282. package/examples/playground/app/page.tsx +13 -102
  283. package/examples/playground/app/recovery/[recoveryId]/page.tsx +1 -2
  284. package/examples/playground/app/recovery/[recoveryId]/session.ts +2 -2
  285. package/examples/playground/app/recovery/model.ts +30 -30
  286. package/examples/playground/instrumentation.ts +5 -0
  287. package/examples/playground/next.config.ts +17 -5
  288. package/examples/playground/package.json +13 -2
  289. package/examples/playground/scripts/a0-template.ts +77 -0
  290. package/examples/playground/vercel.json +36 -0
  291. package/package.json +29 -3
  292. package/src/actor-client.ts +16 -4
  293. package/src/actor-react.ts +25 -11
  294. package/src/actor-shared.ts +21 -6
  295. package/src/actor.ts +76 -31
  296. package/src/ai-agent-actions.ts +219 -0
  297. package/src/ai-agent.ts +2517 -0
  298. package/src/ai-app-state.ts +91 -0
  299. package/src/ai-client-state.ts +6 -3
  300. package/src/ai-client.ts +62 -0
  301. package/src/ai-context-schema.ts +25 -5
  302. package/src/ai-context.ts +90 -40
  303. package/src/ai-control-server.ts +92 -72
  304. package/src/ai-coordinator.ts +23 -22
  305. package/src/ai-fx.browser.ts +5 -0
  306. package/src/ai-fx.ts +833 -0
  307. package/src/ai-harness.ts +518 -0
  308. package/src/ai-message-base.ts +209 -0
  309. package/src/ai-message-projection.ts +262 -64
  310. package/src/ai-model-metadata.ts +11 -6
  311. package/src/ai-pi.browser.ts +5 -0
  312. package/src/ai-pi.ts +1263 -0
  313. package/src/ai-progress-batches.ts +26 -0
  314. package/src/ai-projector.ts +95 -14
  315. package/src/ai-react.ts +146 -0
  316. package/src/ai-sdk-step.ts +2 -2
  317. package/src/ai-server.browser.ts +2 -2
  318. package/src/ai-server.ts +23 -1965
  319. package/src/ai-stored-state.ts +48 -163
  320. package/src/ai.ts +339 -155
  321. package/src/bootstrap-stream.ts +72 -0
  322. package/src/bounded-cache.ts +55 -0
  323. package/src/client-render-session.ts +49 -0
  324. package/src/client.ts +688 -151
  325. package/src/contract.ts +92 -42
  326. package/src/deterministic-id.ts +37 -0
  327. package/src/equal-json.ts +32 -0
  328. package/src/errors.ts +13 -1
  329. package/src/index.ts +5 -1
  330. package/src/initial-snapshot.ts +39 -0
  331. package/src/internal.ts +52 -0
  332. package/src/libfx.d.ts +34 -0
  333. package/src/postgres-notification-scope.ts +14 -3
  334. package/src/react.ts +171 -206
  335. package/src/redis-http-reply.ts +256 -0
  336. package/src/redis-http-stream.ts +73 -0
  337. package/src/redis-http-subscriptions.ts +13 -5
  338. package/src/reducer-runtime.ts +52 -0
  339. package/src/reducer.ts +93 -11
  340. package/src/scheduler-qstash.ts +49 -20
  341. package/src/scheduler-task.ts +34 -2
  342. package/src/scheduler-vercel.ts +32 -84
  343. package/src/server-fetch.ts +139 -35
  344. package/src/server.ts +1133 -255
  345. package/src/session-clear.ts +23 -0
  346. package/src/session-socket.ts +154 -49
  347. package/src/sse.ts +71 -4
  348. package/src/store-memory.ts +252 -75
  349. package/src/store-polling.ts +18 -4
  350. package/src/store-postgres.ts +541 -114
  351. package/src/store-redis-core.ts +1450 -493
  352. package/src/store-redis-http.ts +18 -2
  353. package/src/store-redis-notify.ts +262 -85
  354. package/src/store-redis.ts +19 -9
  355. package/src/store-sqlite.ts +319 -45
  356. package/src/store.ts +79 -1
  357. package/src/stream-buffer.ts +43 -0
  358. package/src/telemetry.ts +14 -1
  359. package/src/wire.ts +241 -13
  360. package/dist/actor-ohPC-81x.d.ts.map +0 -1
  361. package/dist/actor-shared-B5tJfzt-.js.map +0 -1
  362. package/dist/ai-CrEf6p_W.d.ts.map +0 -1
  363. package/dist/ai-DgOBltJ_.js.map +0 -1
  364. package/dist/client-BYzHjkwU.js.map +0 -1
  365. package/dist/client-CzyacQpJ.d.ts.map +0 -1
  366. package/dist/contract-CKRg_E4q.js.map +0 -1
  367. package/dist/errors-DCk6ch5n.js.map +0 -1
  368. package/dist/errors-DvhSXnxk.d.ts.map +0 -1
  369. package/dist/internal-Dq2qYxou.js.map +0 -1
  370. package/dist/react.d.ts.map +0 -1
  371. package/dist/reducer-DEMjEY_O.js +0 -29
  372. package/dist/reducer-DEMjEY_O.js.map +0 -1
  373. package/dist/reducer-otzHjuJj.d.ts.map +0 -1
  374. package/dist/scheduler-task-BpzhPnRS.js.map +0 -1
  375. package/dist/server-BD5ckxZb.js.map +0 -1
  376. package/dist/server-DbD7IJVK.d.ts.map +0 -1
  377. package/dist/store-DyZM6fS5.d.ts.map +0 -1
  378. package/dist/store-polling-CmxUbV93.js.map +0 -1
  379. package/dist/store-redis-notify-BVLUfI3j.js +0 -1583
  380. package/dist/store-redis-notify-BVLUfI3j.js.map +0 -1
  381. package/dist/telemetry-B5jzpy6y.d.ts.map +0 -1
  382. package/dist/validate-XKT4FSNn.js +0 -30
  383. package/dist/validate-XKT4FSNn.js.map +0 -1
  384. package/dist/wire-BO5wWCb1.js.map +0 -1
  385. package/docs/concepts/01-contracts.mdx +0 -142
  386. package/docs/concepts/02-handlers.mdx +0 -284
  387. package/docs/concepts/03-durability.mdx +0 -314
  388. package/docs/concepts/04-state.mdx +0 -209
  389. package/docs/guides/01-timers.mdx +0 -185
  390. package/docs/guides/02-cancellation.mdx +0 -161
  391. package/docs/guides/03-react.mdx +0 -384
  392. package/docs/guides/04-local-first.mdx +0 -88
  393. package/docs/guides/05-production.mdx +0 -521
  394. package/docs/guides/06-ai-agents.mdx +0 -1318
  395. package/docs/guides/08-application-data.mdx +0 -113
  396. package/docs/guides/09-presence.mdx +0 -266
  397. package/docs/guides/10-transports.mdx +0 -221
  398. package/docs/reference/01-api.mdx +0 -1896
  399. package/docs/reference/02-errors.mdx +0 -149
  400. package/examples/playground/app/agent/[agentId]/compaction/route.ts +0 -14
  401. package/examples/playground/app/agent/compaction-settings.test.ts +0 -144
  402. package/examples/playground/app/agent/compaction-settings.ts +0 -49
  403. package/examples/playground/app/agent/compaction-timeline.test.ts +0 -377
  404. package/examples/playground/app/agent/compaction-timeline.ts +0 -208
  405. /package/docs/{concepts → contract}/meta.ts +0 -0
  406. /package/docs/{guides → server}/meta.ts +0 -0
@@ -1,4 +1,30 @@
1
1
  import type { UIMessageChunk } from 'ai'
2
+ import type { GenerationProgressPayload } from './ai.ts'
3
+
4
+ /** Progress already in a log may name its generation by ids instead of `startIndex`. */
5
+ export type StoredProgressPayload =
6
+ | GenerationProgressPayload
7
+ | {
8
+ requestId: string
9
+ generationId: string
10
+ responseMessageId: string
11
+ chunks: UIMessageChunk[]
12
+ }
13
+
14
+ export const progressOwnedBy = ({
15
+ payload,
16
+ owner,
17
+ startIndex,
18
+ }: {
19
+ payload: StoredProgressPayload
20
+ owner: { requestId: string; generationId: string; responseMessageId: string }
21
+ startIndex: number
22
+ }): boolean =>
23
+ 'startIndex' in payload
24
+ ? payload.startIndex === startIndex
25
+ : payload.requestId === owner.requestId &&
26
+ payload.generationId === owner.generationId &&
27
+ payload.responseMessageId === owner.responseMessageId
2
28
 
3
29
  export type ProgressBatch = { index: number; chunks: UIMessageChunk[] }
4
30
  type BatchBlock = ProgressBatch[] | { left: BatchBlock; right: BatchBlock }
@@ -1,6 +1,11 @@
1
+ import { sameValue } from './equal-json.ts'
2
+ import type { ToolCalledPayload } from './ai.ts'
1
3
  import type { UIMessage, UIMessageChunk } from 'ai'
2
4
  import { parsePartialJSON } from './parse-partial-json.ts'
3
5
 
6
+ export type ProjectionChunk =
7
+ UIMessageChunk | { type: 'a2-tool-called'; call: ToolCalledPayload }
8
+
4
9
  type MutablePart = Record<string, unknown>
5
10
 
6
11
  type PartialToolCall = {
@@ -22,9 +27,22 @@ const cloneMessage = <M extends UIMessage>(messageId: string, base?: M): M =>
22
27
  : {
23
28
  ...base,
24
29
  id: messageId,
25
- parts: base.parts.map((part) => ({ ...part })),
30
+ parts: [...base.parts],
26
31
  }) as M
27
32
 
33
+ const editPart = ({
34
+ parts,
35
+ part,
36
+ }: {
37
+ parts: MutablePart[]
38
+ part: MutablePart
39
+ }): MutablePart => {
40
+ const index = parts.indexOf(part)
41
+ const next = { ...part }
42
+ parts[index] = next
43
+ return next
44
+ }
45
+
28
46
  const currentStepParts = (parts: MutablePart[]): MutablePart[] => {
29
47
  let start = parts.length - 1
30
48
  while (start >= 0 && parts[start]?.['type'] !== 'step-start') start -= 1
@@ -49,6 +67,30 @@ const findToolPart = (
49
67
  )
50
68
  }
51
69
 
70
+ export const hasToolCall = ({
71
+ message,
72
+ call,
73
+ }: {
74
+ message: UIMessage
75
+ call: ToolCalledPayload
76
+ }): boolean => {
77
+ const part = findToolPart(
78
+ message.parts as unknown as MutablePart[],
79
+ call.toolCallId,
80
+ )
81
+ return (
82
+ part !== undefined &&
83
+ part['state'] !== 'input-streaming' &&
84
+ sameValue(part['input'], call.input) &&
85
+ (part['callProviderMetadata'] !== undefined ||
86
+ call.providerMetadata === undefined) &&
87
+ (part['toolMetadata'] !== undefined || call.toolMetadata === undefined) &&
88
+ (call.providerExecuted === undefined ||
89
+ part['providerExecuted'] === call.providerExecuted) &&
90
+ (call.title === undefined || part['title'] === call.title)
91
+ )
92
+ }
93
+
52
94
  const findApprovalPart = (
53
95
  parts: MutablePart[],
54
96
  approvalId: string,
@@ -92,7 +134,7 @@ const setToolPart = (options: {
92
134
  toolCallId: options.toolCallId,
93
135
  }
94
136
  options.parts.push(part)
95
- }
137
+ } else part = editPart({ parts: options.parts, part })
96
138
 
97
139
  part['state'] = options.state
98
140
  part['input'] = options.input
@@ -134,7 +176,7 @@ export type UIMessageCursor = {
134
176
  export function projectUIMessage<M extends UIMessage>(options: {
135
177
  messageId: string
136
178
  base?: M
137
- chunks: readonly UIMessageChunk[]
179
+ chunks: readonly ProjectionChunk[]
138
180
  }): M {
139
181
  return projectUIMessageStream(options).message
140
182
  }
@@ -143,7 +185,7 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
143
185
  messageId: string
144
186
  base?: M
145
187
  cursor?: UIMessageCursor
146
- chunks: readonly UIMessageChunk[]
188
+ chunks: readonly ProjectionChunk[]
147
189
  }): { message: M; cursor: UIMessageCursor } {
148
190
  const message = cloneMessage(options.messageId, options.base)
149
191
  const record = message as unknown as Record<string, unknown>
@@ -189,14 +231,17 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
189
231
  activeText.set(chunk.id, part)
190
232
  parts.push(part)
191
233
  }
234
+ part = editPart({ parts, part })
235
+ activeText.set(chunk.id, part)
192
236
  part['text'] =
193
237
  `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`
194
238
  setOptional(part, 'providerMetadata', chunk.providerMetadata)
195
239
  break
196
240
  }
197
241
  case 'text-end': {
198
- const part = activeText.get(chunk.id)
199
- if (part) {
242
+ const current = activeText.get(chunk.id)
243
+ if (current) {
244
+ const part = editPart({ parts, part: current })
200
245
  part['state'] = 'done'
201
246
  setOptional(part, 'providerMetadata', chunk.providerMetadata)
202
247
  activeText.delete(chunk.id)
@@ -223,14 +268,17 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
223
268
  activeReasoning.set(chunk.id, part)
224
269
  parts.push(part)
225
270
  }
271
+ part = editPart({ parts, part })
272
+ activeReasoning.set(chunk.id, part)
226
273
  part['text'] =
227
274
  `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`
228
275
  setOptional(part, 'providerMetadata', chunk.providerMetadata)
229
276
  break
230
277
  }
231
278
  case 'reasoning-end': {
232
- const part = activeReasoning.get(chunk.id)
233
- if (part) {
279
+ const current = activeReasoning.get(chunk.id)
280
+ if (current) {
281
+ const part = editPart({ parts, part: current })
234
282
  part['state'] = 'done'
235
283
  setOptional(part, 'providerMetadata', chunk.providerMetadata)
236
284
  activeReasoning.delete(chunk.id)
@@ -327,6 +375,37 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
327
375
  })
328
376
  break
329
377
  }
378
+ case 'a2-tool-called': {
379
+ const call = chunk.call
380
+ const current = findToolPart(parts, call.toolCallId)
381
+ if (current) {
382
+ const existing = editPart({ parts, part: current })
383
+ existing['input'] = call.input
384
+ if (existing['state'] === 'input-streaming')
385
+ existing['state'] = 'input-available'
386
+ if (existing['callProviderMetadata'] === undefined)
387
+ setOptional(existing, 'callProviderMetadata', call.providerMetadata)
388
+ if (existing['toolMetadata'] === undefined)
389
+ setOptional(existing, 'toolMetadata', call.toolMetadata)
390
+ setOptional(existing, 'providerExecuted', call.providerExecuted)
391
+ setOptional(existing, 'title', call.title)
392
+ } else {
393
+ setToolPart({
394
+ parts,
395
+ toolCallId: call.toolCallId,
396
+ toolName: call.toolName,
397
+ dynamic: call.dynamic === true,
398
+ state: 'input-available',
399
+ input: call.input,
400
+ providerExecuted: call.providerExecuted,
401
+ providerMetadata: call.providerMetadata,
402
+ toolMetadata: call.toolMetadata,
403
+ title: call.title,
404
+ })
405
+ }
406
+ partialTools.delete(call.toolCallId)
407
+ break
408
+ }
330
409
  case 'tool-input-available':
331
410
  setToolPart({
332
411
  parts,
@@ -363,8 +442,9 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
363
442
  break
364
443
  }
365
444
  case 'tool-approval-request': {
366
- const part = findToolPart(parts, chunk.toolCallId)
367
- if (!part) break
445
+ const current = findToolPart(parts, chunk.toolCallId)
446
+ if (!current) break
447
+ const part = editPart({ parts, part: current })
368
448
  part['state'] = 'approval-requested'
369
449
  part['approval'] = {
370
450
  id: chunk.approvalId,
@@ -376,8 +456,9 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
376
456
  break
377
457
  }
378
458
  case 'tool-approval-response': {
379
- const part = findApprovalPart(parts, chunk.approvalId)
380
- if (!part) break
459
+ const current = findApprovalPart(parts, chunk.approvalId)
460
+ if (!current) break
461
+ const part = editPart({ parts, part: current })
381
462
  const approval = isRecord(part['approval']) ? part['approval'] : {}
382
463
  part['state'] = 'approval-responded'
383
464
  part['approval'] = {
@@ -441,7 +522,7 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
441
522
  }
442
523
  case 'tool-output-denied': {
443
524
  const part = findToolPart(parts, chunk.toolCallId)
444
- if (part) part['state'] = 'output-denied'
525
+ if (part) editPart({ parts, part })['state'] = 'output-denied'
445
526
  break
446
527
  }
447
528
  case 'start-step':
@@ -496,7 +577,7 @@ export function projectUIMessageStream<M extends UIMessage>(options: {
496
577
  (part) =>
497
578
  part['type'] === chunk.type && part['id'] === chunk.id,
498
579
  )
499
- if (existing) existing['data'] = chunk.data
580
+ if (existing) editPart({ parts, part: existing })['data'] = chunk.data
500
581
  else
501
582
  parts.push({
502
583
  type: chunk.type,
@@ -0,0 +1,146 @@
1
+ 'use client'
2
+ /**
3
+ * experimental-a2/ai/react — one hook for an agent session: its live
4
+ * optimistic `AIState`, and actions that fill in protocol identities.
5
+ *
6
+ * ```tsx
7
+ * import type { assistant } from '@/server/assistant' // erased at build
8
+ * const { messages, indicator, sendMessage, stop } =
9
+ * useAgent<typeof assistant>({ api: '/api/agent', id, initial })
10
+ * ```
11
+ *
12
+ * With a shared `agentContract()`, pass it as `contract` to fold its
13
+ * application state in the browser too.
14
+ */
15
+
16
+ import type { AIEventDefs, AIState } from './ai.ts'
17
+ import { withAgentActions, type UseAgentResult } from './ai-agent-actions.ts'
18
+ import {
19
+ createAgentClient,
20
+ type AgentClient,
21
+ type AgentMessage,
22
+ type AnyAgent,
23
+ } from './ai-client.ts'
24
+ import type { Contract, EventDefs } from './contract.ts'
25
+ import type { InitialSnapshot } from './initial-snapshot.ts'
26
+ import { createClient, type A2Client } from './client.ts'
27
+ import type { Reducer } from './reducer.ts'
28
+ import { useSession, type UseSessionResult } from './react.ts'
29
+
30
+ export type UseAgentOptions<A extends AnyAgent> = {
31
+ /** The session id. */
32
+ id: string
33
+ /** The server-rendered `assistant.session(id).state()`. */
34
+ initial?: InitialSnapshot<AIState<AgentMessage<A>>>
35
+ participant?: string
36
+ } & (
37
+ | {
38
+ /** The route serving the agent's `fetch`; its client is shared. */
39
+ api: string
40
+ contract?: never
41
+ }
42
+ | { client: AgentClient<A> }
43
+ )
44
+
45
+ /**
46
+ * Use a session of an agent served from a shared `agentContract()`, folding
47
+ * its application state in the browser. The contract is a real import here.
48
+ */
49
+ export type UseContractAgentOptions<D extends EventDefs, S extends AIState> = {
50
+ /** The session id. */
51
+ id: string
52
+ /** The server-rendered `agent.session(id).state()`. */
53
+ initial?: InitialSnapshot<S>
54
+ participant?: string
55
+ } & (
56
+ | {
57
+ /** The route serving the agent's `fetch`; its client is shared. */
58
+ api: string
59
+ contract: Contract<D, Record<never, never>, Reducer<D, S>>
60
+ }
61
+ | {
62
+ /** `createClient({ contract, api })`, shared with pushes outside React. */
63
+ client: A2Client<D, S>
64
+ }
65
+ )
66
+
67
+ const clients = new Map<string, AgentClient>()
68
+ const contractClients = new WeakMap<object, Map<string, object>>()
69
+
70
+ /**
71
+ * One client per route for the page's lifetime; its idle sessions expire
72
+ * after the default `gcTime`. It reads `globalThis.fetch` per request, so
73
+ * instrumentation installed later still applies.
74
+ */
75
+ const clientFor = (api: string): AgentClient => {
76
+ let client = clients.get(api)
77
+ if (client === undefined) {
78
+ client = createAgentClient({
79
+ api,
80
+ fetch: (input, init) => globalThis.fetch(input, init),
81
+ })
82
+ clients.set(api, client)
83
+ }
84
+ return client
85
+ }
86
+
87
+ /** One client per contract and route, like `clientFor`. */
88
+ const contractClientFor = <D extends EventDefs, S>(
89
+ contract: Contract<D, Record<never, never>, Reducer<D, S>>,
90
+ api: string,
91
+ ): A2Client<D, S> => {
92
+ let byApi = contractClients.get(contract)
93
+ if (byApi === undefined) {
94
+ byApi = new Map()
95
+ contractClients.set(contract, byApi)
96
+ }
97
+ let client = byApi.get(api) as A2Client<D, S> | undefined
98
+ if (client === undefined) {
99
+ client = createClient({
100
+ contract,
101
+ api,
102
+ fetch: (input, init) => globalThis.fetch(input, init),
103
+ })
104
+ byApi.set(api, client)
105
+ }
106
+ return client
107
+ }
108
+
109
+ /** Use a session of an agent served from a shared `agentContract()`. */
110
+ export function useAgent<D extends EventDefs, S extends AIState>(
111
+ options: UseContractAgentOptions<D, S>,
112
+ ): UseAgentResult<D, S>
113
+ /**
114
+ * Use one agent session. Pass `typeof` the server's `agent()` for its
115
+ * message types; the import is type-only and erased.
116
+ */
117
+ export function useAgent<A extends AnyAgent = AnyAgent>(
118
+ options: UseAgentOptions<A>,
119
+ ): UseAgentResult<AIEventDefs<AgentMessage<A>>, AIState<AgentMessage<A>>>
120
+ export function useAgent(
121
+ options:
122
+ UseAgentOptions<AnyAgent> | UseContractAgentOptions<AIEventDefs, AIState>,
123
+ ): object {
124
+ const session: UseSessionResult<AIEventDefs, AIState> = useSession(
125
+ 'client' in options
126
+ ? options.client
127
+ : options.contract !== undefined
128
+ ? contractClientFor(options.contract, options.api)
129
+ : clientFor(options.api),
130
+ options.id,
131
+ {
132
+ ...(options.initial === undefined ? {} : { initial: options.initial }),
133
+ ...(options.participant === undefined
134
+ ? {}
135
+ : { participant: options.participant }),
136
+ },
137
+ )
138
+ return withAgentActions(session)
139
+ }
140
+
141
+ export type { AgentClient, AgentMessage, AnyAgent }
142
+ export type {
143
+ AgentActions,
144
+ AgentIndicator,
145
+ UseAgentResult,
146
+ } from './ai-agent-actions.ts'
@@ -8,7 +8,6 @@ import type {
8
8
  FinishReason,
9
9
  InferUIMessageChunk,
10
10
  Instructions,
11
- LanguageModel,
12
11
  LanguageModelUsage,
13
12
  ModelMessage,
14
13
  TextStreamPart,
@@ -125,7 +124,8 @@ export type AISDKStepSettings<T extends ToolSet> = Partial<
125
124
  }
126
125
 
127
126
  export type AISDKStepInput<M extends UIMessage, T extends ToolSet> = {
128
- model: LanguageModel
127
+ /** An AI Gateway model ID, resolved through the AI SDK's global provider. */
128
+ model: string
129
129
  tools: T
130
130
  messages: M[]
131
131
  modelMessages?: ModelMessage[]
@@ -1,5 +1,5 @@
1
- /** experimental-a2/ai/server is server-only; agent definitions live in experimental-a2/ai. */
1
+ /** experimental-a2/ai/server is server-only; browsers use experimental-a2/ai/react or /ai/client. */
2
2
  throw new Error(
3
- 'experimental-a2/ai/server is server-only — a client bundle imported it. Import agent from experimental-a2/ai in browser code instead.',
3
+ "experimental-a2/ai/server is server-only — a client bundle imported it. Import its agent's type with `import type`, and use experimental-a2/ai/react or experimental-a2/ai/client in browser code.",
4
4
  )
5
5
  export {}