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
@@ -0,0 +1,119 @@
1
+ // @vitest-environment jsdom
2
+ import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'
3
+ import { afterEach, beforeEach, expect, it, vi } from 'vitest'
4
+ import { demoAgent } from '../model'
5
+ import type { AgentSession } from '../session'
6
+ import { CompactionPanel } from './compaction-panel'
7
+
8
+ const loadHistory = vi.fn<AgentSession['loadHistory']>()
9
+ const push = vi.fn<AgentSession['push']>()
10
+ let session: AgentSession
11
+
12
+ beforeEach(() => {
13
+ loadHistory.mockReset().mockResolvedValue([])
14
+ push.mockReset()
15
+ session = {
16
+ state: demoAgent.reducer.initialState,
17
+ hydrated: true,
18
+ events: [],
19
+ index: 10,
20
+ connection: { status: 'live', reconnects: 0 },
21
+ history: { complete: false, loading: false, oldestLoaded: null },
22
+ loadHistory,
23
+ push,
24
+ reconnect: vi.fn<() => void>(),
25
+ }
26
+ })
27
+ afterEach(cleanup)
28
+
29
+ async function toggle(panel: HTMLDetailsElement, open: boolean) {
30
+ await act(async () => {
31
+ panel.open = open
32
+ fireEvent(panel, new Event('toggle'))
33
+ })
34
+ }
35
+
36
+ it('uses seeded settings immediately and loads diagnostic history only on open', async () => {
37
+ session.state = {
38
+ ...session.state,
39
+ compactionSettings: { mode: 'manual', thresholdTokens: 1234 },
40
+ }
41
+ const view = render(<CompactionPanel session={session} />)
42
+ expect((screen.getByLabelText('Mode') as HTMLSelectElement).value).toBe(
43
+ 'manual',
44
+ )
45
+ expect(
46
+ (screen.getByLabelText('Threshold in tokens') as HTMLInputElement).value,
47
+ ).toBe('1234')
48
+ expect(push).not.toHaveBeenCalled()
49
+ expect(loadHistory).not.toHaveBeenCalled()
50
+ const panel =
51
+ view.container.querySelector<HTMLDetailsElement>('.agent-compaction')!
52
+ await toggle(panel, true)
53
+ expect(loadHistory).toHaveBeenCalledTimes(1)
54
+ await toggle(panel, false)
55
+ await toggle(panel, true)
56
+ expect(loadHistory).toHaveBeenCalledTimes(1)
57
+ session.state = {
58
+ ...session.state,
59
+ compactionSettings: { mode: 'disabled' },
60
+ compactionSettingsId: 'new',
61
+ }
62
+ session.events = [
63
+ {
64
+ id: 'old',
65
+ sessionId: 'one',
66
+ index: 2,
67
+ createdAt: new Date(),
68
+ type: 'compaction.settings.updated',
69
+ payload: { mode: 'automatic' },
70
+ },
71
+ ]
72
+ view.rerender(<CompactionPanel session={session} />)
73
+ expect((screen.getByLabelText('Mode') as HTMLSelectElement).value).toBe(
74
+ 'disabled',
75
+ )
76
+ expect(push).not.toHaveBeenCalled()
77
+ })
78
+
79
+ it('keeps diagnostic read failures local and retries only when requested', async () => {
80
+ loadHistory.mockRejectedValueOnce(new Error('History failed'))
81
+ const view = render(
82
+ <>
83
+ <input aria-label="composer" />
84
+ <CompactionPanel session={session} />
85
+ </>,
86
+ )
87
+ await toggle(view.container.querySelector('details')!, true)
88
+ expect(screen.getByRole('alert').textContent).toBe('History failed')
89
+ expect(screen.getByLabelText('composer')).toBeDefined()
90
+ expect((screen.getByLabelText('Mode') as HTMLSelectElement).value).toBe(
91
+ 'automatic',
92
+ )
93
+ await act(async () =>
94
+ fireEvent.click(
95
+ screen.getByRole('button', { name: 'Load earlier events' }),
96
+ ),
97
+ )
98
+ expect(loadHistory).toHaveBeenCalledTimes(2)
99
+ expect(screen.queryByRole('alert')).toBeNull()
100
+ expect(push).not.toHaveBeenCalled()
101
+ })
102
+
103
+ it('pushes the settings event and reports a failed save outside the form', async () => {
104
+ push.mockImplementationOnce(() =>
105
+ Object.assign(Promise.reject(new Error('Save failed')), {
106
+ confirmed: Promise.resolve([]),
107
+ }),
108
+ )
109
+ const view = render(<CompactionPanel session={session} />)
110
+ await toggle(view.container.querySelector('details')!, true)
111
+ await act(async () =>
112
+ fireEvent.click(screen.getByRole('button', { name: 'Set to 1 token' })),
113
+ )
114
+ expect(push).toHaveBeenCalledWith({
115
+ type: 'compaction.settings.updated',
116
+ payload: { mode: 'manual', thresholdTokens: 1 },
117
+ })
118
+ expect(screen.getByRole('alert').textContent).toBe('Save failed')
119
+ })
@@ -1,15 +1,15 @@
1
1
  'use client'
2
2
 
3
3
  import type { FormEvent, ReactNode } from 'react'
4
- import { useEffect, useId, useRef, useState } from 'react'
5
- import type { AIState } from 'experimental-a2/ai'
6
- import { formatActivityTime } from '@/app/components/activity-feed'
4
+ import { useId, useRef, useState } from 'react'
5
+ import { formatActivityTime } from '../../components/activity-feed'
6
+ import type { AgentSession } from '../session'
7
7
  import {
8
8
  agentModel,
9
9
  compactionSettingsSchema,
10
- latestCompactionSettings,
11
- type AgentEvent,
10
+ type AgentState,
12
11
  type CompactionSettings,
12
+ type AgentEvent,
13
13
  } from '../model'
14
14
 
15
15
  const number = new Intl.NumberFormat('en-US')
@@ -19,13 +19,15 @@ const tokens = (value: number | undefined): string =>
19
19
  : `${number.format(value)} ${value === 1 ? 'token' : 'tokens'}`
20
20
 
21
21
  function SettingsForm({
22
- agentId,
23
22
  settings,
24
23
  closed,
24
+ saving,
25
+ save,
25
26
  }: {
26
- agentId: string
27
27
  settings: CompactionSettings
28
28
  closed: boolean
29
+ saving: boolean
30
+ save: (settings: CompactionSettings) => void
29
31
  }): ReactNode {
30
32
  const modeId = useId()
31
33
  const thresholdId = useId()
@@ -33,46 +35,11 @@ function SettingsForm({
33
35
  const [threshold, setThreshold] = useState(
34
36
  settings.mode === 'manual' ? String(settings.thresholdTokens) : '',
35
37
  )
36
- const [saving, setSaving] = useState(false)
37
38
  const [error, setError] = useState<string | null>(null)
38
- const [notice, setNotice] = useState<string | null>(null)
39
- const pending = useRef<AbortController | null>(null)
40
-
41
- useEffect(() => () => pending.current?.abort(), [])
42
-
43
- const save = async (next: CompactionSettings): Promise<void> => {
44
- pending.current?.abort()
45
- const controller = new AbortController()
46
- pending.current = controller
47
- setSaving(true)
48
- setError(null)
49
- setNotice(null)
50
- try {
51
- const response = await fetch(
52
- `/agent/${encodeURIComponent(agentId)}/compaction`,
53
- {
54
- method: 'POST',
55
- headers: { 'content-type': 'application/json' },
56
- body: JSON.stringify({ id: crypto.randomUUID(), settings: next }),
57
- signal: controller.signal,
58
- },
59
- )
60
- if (!response.ok)
61
- throw new Error('Could not save compaction settings. Try again.')
62
- setNotice('Saved. The live feed will confirm the latest settings.')
63
- } catch (cause) {
64
- if (!controller.signal.aborted)
65
- setError(cause instanceof Error ? cause.message : String(cause))
66
- } finally {
67
- if (pending.current === controller) {
68
- pending.current = null
69
- setSaving(false)
70
- }
71
- }
72
- }
73
39
 
74
40
  const submit = (event: FormEvent): void => {
75
41
  event.preventDefault()
42
+ setError(null)
76
43
  const parsed = compactionSettingsSchema.safeParse(
77
44
  mode === 'manual'
78
45
  ? { mode, thresholdTokens: Number(threshold) }
@@ -82,7 +49,7 @@ function SettingsForm({
82
49
  setError('Enter a positive whole-number threshold.')
83
50
  return
84
51
  }
85
- void save(parsed.data)
52
+ save(parsed.data)
86
53
  }
87
54
 
88
55
  return (
@@ -124,14 +91,14 @@ function SettingsForm({
124
91
  <button
125
92
  type="button"
126
93
  className="secondary"
127
- onClick={() => void save({ mode: 'manual', thresholdTokens: 1 })}
94
+ onClick={() => save({ mode: 'manual', thresholdTokens: 1 })}
128
95
  >
129
96
  Set to 1 token
130
97
  </button>
131
98
  <button
132
99
  type="button"
133
100
  className="secondary"
134
- onClick={() => void save({ mode: 'automatic' })}
101
+ onClick={() => save({ mode: 'automatic' })}
135
102
  >
136
103
  Reset to automatic
137
104
  </button>
@@ -147,11 +114,6 @@ function SettingsForm({
147
114
  Existing summaries remain in use. This stops future compaction.
148
115
  </p>
149
116
  ) : null}
150
- {notice ? (
151
- <p role="status" className="hint">
152
- {notice}
153
- </p>
154
- ) : null}
155
117
  {error ? (
156
118
  <p role="alert" className="error">
157
119
  {error}
@@ -161,17 +123,36 @@ function SettingsForm({
161
123
  )
162
124
  }
163
125
 
164
- export function CompactionPanel({
165
- agentId,
126
+ function CompactionDetails({
166
127
  state,
167
128
  events,
129
+ complete,
130
+ push,
168
131
  }: {
169
- agentId: string
170
- state: AIState
132
+ state: AgentState
171
133
  events: readonly AgentEvent[]
134
+ complete: boolean
135
+ push: AgentSession['push']
172
136
  }): ReactNode {
173
- const { settings, id } = latestCompactionSettings(events)
174
- const metadata = state.modelMetadata[agentModel]
137
+ const settings = state.compactionSettings
138
+ const id = state.compactionSettingsId
139
+ // The save outlives the form, which remounts when the optimistic push lands.
140
+ const [saving, setSaving] = useState(false)
141
+ const [saveError, setSaveError] = useState<string | null>(null)
142
+ const save = async (next: CompactionSettings): Promise<void> => {
143
+ setSaving(true)
144
+ setSaveError(null)
145
+ try {
146
+ await push({ type: 'compaction.settings.updated', payload: next })
147
+ } catch (cause) {
148
+ setSaveError(cause instanceof Error ? cause.message : String(cause))
149
+ } finally {
150
+ setSaving(false)
151
+ }
152
+ }
153
+ const model =
154
+ state.activeGeneration?.model ?? state.modelChoice.model ?? agentModel
155
+ const metadata = state.modelMetadata[model]
175
156
  const limits = metadata?.status === 'resolved' ? metadata.limits : undefined
176
157
  const automaticThreshold =
177
158
  limits === undefined ? undefined : Math.floor(limits.contextWindow * 0.75)
@@ -188,127 +169,189 @@ export function CompactionPanel({
188
169
  .filter((event) => event.type === 'ai.compaction.requested')
189
170
  .map((event) => [event.payload.generationId, event.payload]),
190
171
  )
191
- const compacting = state.compaction?.status === 'running'
172
+ return (
173
+ <div className="compaction-controls">
174
+ <p className="hint">
175
+ Model: <code>{model}</code>. Limits are saved for this session.
176
+ </p>
177
+ <dl className="compaction-metrics">
178
+ <div>
179
+ <dt>Context window</dt>
180
+ <dd>{tokens(limits?.contextWindow)}</dd>
181
+ </div>
182
+ <div>
183
+ <dt>Model output ceiling</dt>
184
+ <dd>{tokens(limits?.maxOutputTokens)}</dd>
185
+ </div>
186
+ <div>
187
+ <dt>Automatic trigger · 75%</dt>
188
+ <dd>{tokens(automaticThreshold)}</dd>
189
+ </div>
190
+ <div>
191
+ <dt>Threshold for next step</dt>
192
+ <dd>
193
+ {settings.mode === 'disabled'
194
+ ? 'Disabled'
195
+ : tokens(effectiveThreshold)}
196
+ </dd>
197
+ </div>
198
+ <div>
199
+ <dt>Last loaded step input · reported</dt>
200
+ <dd>{tokens(lastStep?.payload.usage?.inputTokens)}</dd>
201
+ </div>
202
+ <div>
203
+ <dt>Last loaded step input · raw estimate</dt>
204
+ <dd>{tokens(lastStep?.payload.inputTokenEstimate)}</dd>
205
+ </div>
206
+ </dl>
207
+ <p className="hint">
208
+ The raw estimate excludes provider metadata. Compaction adjusts it using
209
+ the previous step’s reported usage when the model matches and the prompt
210
+ has not shrunk.
211
+ </p>
212
+ {limits === undefined ? (
213
+ <p className="hint">
214
+ {metadata?.status === 'unavailable'
215
+ ? 'Gateway did not report limits for this model. You can set a custom threshold.'
216
+ : metadata?.status === 'pending'
217
+ ? 'Model limits have been requested but are not resolved yet. The agent can continue.'
218
+ : 'Send a message to discover the model limits, or set a custom threshold first.'}
219
+ </p>
220
+ ) : null}
221
+ <SettingsForm
222
+ key={id}
223
+ settings={settings}
224
+ closed={state.status === 'closed'}
225
+ saving={saving}
226
+ save={(next) => void save(next)}
227
+ />
228
+ {saveError ? (
229
+ <p role="alert" className="error">
230
+ {saveError}
231
+ </p>
232
+ ) : null}
233
+ <details className="compaction-history">
234
+ <summary>
235
+ Loaded compactions <span>{completed.length}</span>
236
+ </summary>
237
+ {completed.length === 0 ? (
238
+ <p className="hint">
239
+ {complete
240
+ ? 'No completed compactions yet.'
241
+ : 'No completed compactions in the loaded history.'}
242
+ </p>
243
+ ) : (
244
+ <ol>
245
+ {completed.map((event) => {
246
+ const trigger = requested.get(event.payload.generationId)
247
+ return (
248
+ <li key={event.id}>
249
+ <div className="compaction-marker">
250
+ <strong>Context compacted · #{event.index}</strong>
251
+ <time dateTime={event.createdAt.toISOString()}>
252
+ {formatActivityTime(event.createdAt)}
253
+ </time>
254
+ </div>
255
+ <p className="hint">
256
+ {event.payload.throughIndex === undefined
257
+ ? `Through message ${event.payload.throughMessageId}`
258
+ : `Summarized through event #${event.payload.throughIndex}`}{' '}
259
+ · {tokens(event.payload.usage?.inputTokens)} in ·{' '}
260
+ {tokens(event.payload.usage?.outputTokens)} out
261
+ </p>
262
+ {trigger?.inputTokens === undefined ? null : (
263
+ <p className="hint">
264
+ Trigger: {tokens(trigger.inputTokens)} against a{' '}
265
+ {tokens(trigger.thresholdTokens)} threshold. Raw estimate:{' '}
266
+ {tokens(trigger.inputTokenEstimate)}.
267
+ </p>
268
+ )}
269
+ {event.payload.summary ? (
270
+ <details>
271
+ <summary>View summary</summary>
272
+ <pre>{event.payload.summary}</pre>
273
+ </details>
274
+ ) : null}
275
+ </li>
276
+ )
277
+ })}
278
+ </ol>
279
+ )}
280
+ </details>
281
+ </div>
282
+ )
283
+ }
192
284
 
285
+ export function CompactionPanel({
286
+ session,
287
+ }: {
288
+ session: AgentSession
289
+ }): ReactNode {
290
+ const { state, events, history, loadHistory, push } = session
291
+ const opened = useRef(false)
292
+ const [historyError, setHistoryError] = useState<string | null>(null)
293
+ const loadEarlier = async (): Promise<void> => {
294
+ setHistoryError(null)
295
+ try {
296
+ await loadHistory()
297
+ } catch (error) {
298
+ setHistoryError(
299
+ error instanceof Error ? error.message : 'Could not load history.',
300
+ )
301
+ }
302
+ }
193
303
  return (
194
- <details className="agent-compaction">
304
+ <details
305
+ className="agent-compaction"
306
+ onToggle={(event) => {
307
+ if (
308
+ event.target !== event.currentTarget ||
309
+ !event.currentTarget.open ||
310
+ opened.current
311
+ )
312
+ return
313
+ opened.current = true
314
+ if (!history.complete) void loadEarlier()
315
+ }}
316
+ >
195
317
  <summary>
196
318
  <span className="compaction-chevron" aria-hidden="true">
197
319
  ›
198
320
  </span>
199
321
  <strong>Compaction</strong>
200
- <span className={`badge${compacting ? ' live' : ''}`}>
201
- {compacting
322
+ <span
323
+ className={`badge${state.compaction?.status === 'running' ? ' live' : ''}`}
324
+ >
325
+ {state.compaction?.status === 'running'
202
326
  ? 'Compacting…'
203
- : settings.mode === 'disabled'
327
+ : state.compactionSettings.mode === 'disabled'
204
328
  ? 'Disabled'
205
- : settings.mode === 'manual'
206
- ? `Custom · ${tokens(settings.thresholdTokens)}`
329
+ : state.compactionSettings.mode === 'manual'
330
+ ? `Custom · ${tokens(state.compactionSettings.thresholdTokens)}`
207
331
  : 'Automatic'}
208
332
  </span>
209
333
  </summary>
210
- <div className="compaction-controls">
211
- <p className="hint">
212
- Model: <code>{agentModel}</code>. Limits are saved for this session.
213
- </p>
214
- <dl className="compaction-metrics">
215
- <div>
216
- <dt>Context window</dt>
217
- <dd>{tokens(limits?.contextWindow)}</dd>
218
- </div>
219
- <div>
220
- <dt>Model output ceiling</dt>
221
- <dd>{tokens(limits?.maxOutputTokens)}</dd>
222
- </div>
223
- <div>
224
- <dt>Automatic trigger · 75%</dt>
225
- <dd>{tokens(automaticThreshold)}</dd>
226
- </div>
227
- <div>
228
- <dt>Threshold for next step</dt>
229
- <dd>
230
- {settings.mode === 'disabled'
231
- ? 'Disabled'
232
- : tokens(effectiveThreshold)}
233
- </dd>
234
- </div>
235
- <div>
236
- <dt>Last step input · reported</dt>
237
- <dd>{tokens(lastStep?.payload.usage?.inputTokens)}</dd>
238
- </div>
239
- <div>
240
- <dt>Last step input · raw estimate</dt>
241
- <dd>{tokens(lastStep?.payload.inputTokenEstimate)}</dd>
242
- </div>
243
- </dl>
244
- <p className="hint">
245
- The raw estimate excludes provider metadata. Compaction adjusts it
246
- using the previous step’s reported usage when the model matches and
247
- the prompt has not shrunk.
334
+ <CompactionDetails
335
+ state={state}
336
+ events={events}
337
+ complete={history.complete}
338
+ push={push}
339
+ />
340
+ {historyError ? (
341
+ <p role="alert" className="error">
342
+ {historyError}
248
343
  </p>
249
- {limits === undefined ? (
250
- <p className="hint">
251
- {metadata?.status === 'unavailable'
252
- ? 'Gateway did not report limits for this model. You can set a custom threshold.'
253
- : metadata?.status === 'pending'
254
- ? 'Model limits have been requested but are not resolved yet. The agent can continue.'
255
- : 'Send a message to discover the model limits, or set a custom threshold first.'}
256
- </p>
257
- ) : null}
258
- <SettingsForm
259
- key={id}
260
- agentId={agentId}
261
- settings={settings}
262
- closed={state.status === 'closed'}
263
- />
264
- <details className="compaction-history">
265
- <summary>
266
- Completed compactions <span>{completed.length}</span>
267
- </summary>
268
- {completed.length === 0 ? (
269
- <p className="hint">
270
- No completed compactions yet. Each completion will stay here after
271
- reload.
272
- </p>
273
- ) : (
274
- <ol>
275
- {completed.map((event) => {
276
- const trigger = requested.get(event.payload.generationId)
277
- return (
278
- <li key={event.id}>
279
- <div className="compaction-marker">
280
- <strong>Context compacted · #{event.index}</strong>
281
- <time dateTime={event.createdAt.toISOString()}>
282
- {formatActivityTime(event.createdAt)}
283
- </time>
284
- </div>
285
- <p className="hint">
286
- {event.payload.throughIndex === undefined
287
- ? `Through message ${event.payload.throughMessageId}`
288
- : `Summarized through event #${event.payload.throughIndex}`}{' '}
289
- · {tokens(event.payload.usage?.inputTokens)} in ·{' '}
290
- {tokens(event.payload.usage?.outputTokens)} out
291
- </p>
292
- {trigger?.inputTokens === undefined ? null : (
293
- <p className="hint">
294
- Trigger: {tokens(trigger.inputTokens)} against a{' '}
295
- {tokens(trigger.thresholdTokens)} threshold. Raw
296
- estimate: {tokens(trigger.inputTokenEstimate)}.
297
- </p>
298
- )}
299
- {event.payload.summary ? (
300
- <details>
301
- <summary>View summary</summary>
302
- <pre>{event.payload.summary}</pre>
303
- </details>
304
- ) : null}
305
- </li>
306
- )
307
- })}
308
- </ol>
309
- )}
310
- </details>
311
- </div>
344
+ ) : null}
345
+ {!history.complete ? (
346
+ <button
347
+ type="button"
348
+ className="secondary"
349
+ disabled={history.loading}
350
+ onClick={() => void loadEarlier()}
351
+ >
352
+ {history.loading ? 'Loading history…' : 'Load earlier events'}
353
+ </button>
354
+ ) : null}
312
355
  </details>
313
356
  )
314
357
  }
@@ -1,7 +1,5 @@
1
1
  import type { ReactNode } from 'react'
2
- import { demoAgent } from '../model'
3
2
  import { agentServer } from '../server'
4
- import { SessionProvider } from '../session'
5
3
  import { AgentClient } from './agent-client'
6
4
 
7
5
  export default async function AgentSessionPage({
@@ -11,19 +9,7 @@ export default async function AgentSessionPage({
11
9
  }): Promise<ReactNode> {
12
10
  const { agentId } = await params
13
11
  const session = agentServer.session(agentId)
14
- const { state, index } = await session.state(demoAgent.reducer)
15
- const events = (await session.history()).filter(
16
- (event) => event.index <= index,
17
- )
12
+ const initial = await session.state()
18
13
 
19
- return (
20
- <SessionProvider
21
- sessionId={agentId}
22
- initialState={state}
23
- initialIndex={index}
24
- initialEvents={events}
25
- >
26
- <AgentClient agentId={agentId} />
27
- </SessionProvider>
28
- )
14
+ return <AgentClient agentId={agentId} initial={initial} />
29
15
  }
@@ -1,4 +1,7 @@
1
1
  import { agentServer } from '../server'
2
2
 
3
- export const GET = agentServer.fetch
4
- export const POST = agentServer.fetch
3
+ function events(request: Request): Promise<Response> {
4
+ return agentServer.fetch(request)
5
+ }
6
+
7
+ export { events as GET, events as POST }