experimental-a2 0.16.0 → 0.17.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 (334) hide show
  1. package/CHANGELOG.md +360 -0
  2. package/dist/{actor-ohPC-81x.d.ts → actor-DBbe5xeE.d.ts} +21 -11
  3. package/dist/actor-DBbe5xeE.d.ts.map +1 -0
  4. package/dist/actor-client.d.ts +2 -5
  5. package/dist/actor-client.d.ts.map +1 -1
  6. package/dist/actor-client.js +13 -4
  7. package/dist/actor-client.js.map +1 -1
  8. package/dist/actor-react.d.ts +5 -3
  9. package/dist/actor-react.d.ts.map +1 -1
  10. package/dist/actor-react.js +20 -10
  11. package/dist/actor-react.js.map +1 -1
  12. package/dist/{actor-shared-B5tJfzt-.js → actor-shared-t7w8xIKP.js} +12 -7
  13. package/dist/actor-shared-t7w8xIKP.js.map +1 -0
  14. package/dist/actor.d.ts +1 -1
  15. package/dist/actor.js +42 -23
  16. package/dist/actor.js.map +1 -1
  17. package/dist/{ai-CrLYwNEx.js → ai-UrWfKeuv.js} +966 -541
  18. package/dist/ai-UrWfKeuv.js.map +1 -0
  19. package/dist/ai-client.d.ts +27 -0
  20. package/dist/ai-client.d.ts.map +1 -0
  21. package/dist/ai-client.js +29 -0
  22. package/dist/ai-client.js.map +1 -0
  23. package/dist/ai-react.d.ts +96 -0
  24. package/dist/ai-react.d.ts.map +1 -0
  25. package/dist/ai-react.js +142 -0
  26. package/dist/ai-react.js.map +1 -0
  27. package/dist/ai-server.browser.js +2 -2
  28. package/dist/ai-server.browser.js.map +1 -1
  29. package/dist/ai-server.d.ts +80 -36
  30. package/dist/ai-server.d.ts.map +1 -1
  31. package/dist/ai-server.js +466 -265
  32. package/dist/ai-server.js.map +1 -1
  33. package/dist/{ai-HJ9fHfYI.d.ts → ai-vpGtcaCB.d.ts} +115 -101
  34. package/dist/ai-vpGtcaCB.d.ts.map +1 -0
  35. package/dist/ai.d.ts +2 -2
  36. package/dist/ai.js +2 -2
  37. package/dist/{client-BYzHjkwU.js → client-COaiaDub.js} +447 -80
  38. package/dist/client-COaiaDub.js.map +1 -0
  39. package/dist/{client-CzyacQpJ.d.ts → client-qRnRUzBS.d.ts} +14 -13
  40. package/dist/client-qRnRUzBS.d.ts.map +1 -0
  41. package/dist/client.d.ts +4 -2
  42. package/dist/client.js +1 -1
  43. package/dist/{contract-CKRg_E4q.js → contract-BYKASlCV.js} +12 -21
  44. package/dist/contract-BYKASlCV.js.map +1 -0
  45. package/dist/{idempotent-replay-DVOlyYbx.js → idempotent-replay-JdgMQRRm.js} +2 -2
  46. package/dist/{idempotent-replay-DVOlyYbx.js.map → idempotent-replay-JdgMQRRm.js.map} +1 -1
  47. package/dist/index.d.ts +6 -5
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +4 -3
  50. package/dist/{errors-DvhSXnxk.d.ts → initial-snapshot-BrLso5x_.d.ts} +7 -3
  51. package/dist/initial-snapshot-BrLso5x_.d.ts.map +1 -0
  52. package/dist/{internal-Dq2qYxou.js → internal-CbVvEwad.js} +23 -2
  53. package/dist/internal-CbVvEwad.js.map +1 -0
  54. package/dist/otel.d.ts +1 -1
  55. package/dist/react-BbJ-g6Uu.d.ts +86 -0
  56. package/dist/react-BbJ-g6Uu.d.ts.map +1 -0
  57. package/dist/react.d.ts +2 -122
  58. package/dist/react.js +107 -100
  59. package/dist/react.js.map +1 -1
  60. package/dist/reducer-BAXc8JyF.js +87 -0
  61. package/dist/reducer-BAXc8JyF.js.map +1 -0
  62. package/dist/{reducer-otzHjuJj.d.ts → reducer-BYu6DT7h.d.ts} +45 -29
  63. package/dist/reducer-BYu6DT7h.d.ts.map +1 -0
  64. package/dist/reducer-runtime-DQwz_J59.js +28 -0
  65. package/dist/reducer-runtime-DQwz_J59.js.map +1 -0
  66. package/dist/scheduler-qstash.d.ts +3 -3
  67. package/dist/scheduler-qstash.d.ts.map +1 -1
  68. package/dist/scheduler-qstash.js +33 -10
  69. package/dist/scheduler-qstash.js.map +1 -1
  70. package/dist/{scheduler-task-BpzhPnRS.js → scheduler-task-X1SToDjP.js} +18 -3
  71. package/dist/scheduler-task-X1SToDjP.js.map +1 -0
  72. package/dist/scheduler-vercel.d.ts +4 -9
  73. package/dist/scheduler-vercel.d.ts.map +1 -1
  74. package/dist/scheduler-vercel.js +25 -44
  75. package/dist/scheduler-vercel.js.map +1 -1
  76. package/dist/{server-DbD7IJVK.d.ts → server-CGM8WzRG.d.ts} +87 -26
  77. package/dist/server-CGM8WzRG.d.ts.map +1 -0
  78. package/dist/{server-BD5ckxZb.js → server-Rj64fNvX.js} +854 -202
  79. package/dist/server-Rj64fNvX.js.map +1 -0
  80. package/dist/server.d.ts +4 -4
  81. package/dist/server.js +2 -2
  82. package/dist/{errors-DCk6ch5n.js → session-clear-DGI4jTQ5.js} +17 -2
  83. package/dist/session-clear-DGI4jTQ5.js.map +1 -0
  84. package/dist/session-clear-Dshpuhff.d.ts +12 -0
  85. package/dist/session-clear-Dshpuhff.d.ts.map +1 -0
  86. package/dist/{store-DyZM6fS5.d.ts → store-Gpkq7WBo.d.ts} +44 -3
  87. package/dist/store-Gpkq7WBo.d.ts.map +1 -0
  88. package/dist/store-N8PXxDAS.js.map +1 -1
  89. package/dist/store-memory.d.ts +1 -1
  90. package/dist/store-memory.d.ts.map +1 -1
  91. package/dist/store-memory.js +182 -69
  92. package/dist/store-memory.js.map +1 -1
  93. package/dist/{store-polling-CmxUbV93.js → store-polling-4_y8lETm.js} +21 -4
  94. package/dist/store-polling-4_y8lETm.js.map +1 -0
  95. package/dist/store-postgres.d.ts +1 -1
  96. package/dist/store-postgres.d.ts.map +1 -1
  97. package/dist/store-postgres.js +399 -108
  98. package/dist/store-postgres.js.map +1 -1
  99. package/dist/{store-presence-polling-C7-XZyW9.js → store-presence-polling-Q1C-k2dd.js} +3 -3
  100. package/dist/{store-presence-polling-C7-XZyW9.js.map → store-presence-polling-Q1C-k2dd.js.map} +1 -1
  101. package/dist/store-redis-http.d.ts +1 -1
  102. package/dist/store-redis-http.d.ts.map +1 -1
  103. package/dist/store-redis-http.js +293 -11
  104. package/dist/store-redis-http.js.map +1 -1
  105. package/dist/store-redis-notify-tqWNnMRu.js +2374 -0
  106. package/dist/store-redis-notify-tqWNnMRu.js.map +1 -0
  107. package/dist/store-redis.d.ts +1 -1
  108. package/dist/store-redis.d.ts.map +1 -1
  109. package/dist/store-redis.js +11 -11
  110. package/dist/store-redis.js.map +1 -1
  111. package/dist/store-sqlite.d.ts +1 -1
  112. package/dist/store-sqlite.d.ts.map +1 -1
  113. package/dist/store-sqlite.js +166 -32
  114. package/dist/store-sqlite.js.map +1 -1
  115. package/dist/stream-buffer-Cx7AAPGq.js +23 -0
  116. package/dist/stream-buffer-Cx7AAPGq.js.map +1 -0
  117. package/dist/{telemetry-B5jzpy6y.d.ts → telemetry-cZH-cibj.d.ts} +2 -2
  118. package/dist/telemetry-cZH-cibj.d.ts.map +1 -0
  119. package/dist/{wire-BO5wWCb1.js → wire-DjfHOvdW.js} +132 -10
  120. package/dist/wire-DjfHOvdW.js.map +1 -0
  121. package/docs/01-quickstart.mdx +2 -2
  122. package/docs/actors/01-introduction.mdx +4 -0
  123. package/docs/actors/04-routes.mdx +14 -1
  124. package/docs/concepts/01-contracts.mdx +95 -0
  125. package/docs/concepts/04-state.mdx +3 -3
  126. package/docs/guides/01-timers.mdx +22 -14
  127. package/docs/guides/02-cancellation.mdx +1 -1
  128. package/docs/guides/03-react.mdx +268 -328
  129. package/docs/guides/04-local-first.mdx +32 -73
  130. package/docs/guides/05-production.mdx +40 -27
  131. package/docs/guides/06-ai-agents.mdx +680 -580
  132. package/docs/guides/09-presence.mdx +3 -7
  133. package/docs/guides/10-transports.mdx +5 -5
  134. package/docs/index.mdx +10 -18
  135. package/docs/reference/01-api.mdx +662 -195
  136. package/docs/reference/02-errors.mdx +2 -1
  137. package/examples/playground/DEPLOY.md +52 -6
  138. package/examples/playground/app/a0/[appId]/loading.tsx +16 -0
  139. package/examples/playground/app/a0/[appId]/page.tsx +48 -0
  140. package/examples/playground/app/a0/a0.css +818 -0
  141. package/examples/playground/app/a0/app-list.tsx +211 -0
  142. package/examples/playground/app/a0/app-view.tsx +55 -0
  143. package/examples/playground/app/a0/apps/[appId]/preview/route.ts +27 -0
  144. package/examples/playground/app/a0/apps/[appId]/route.ts +23 -0
  145. package/examples/playground/app/a0/apps.test.ts +116 -0
  146. package/examples/playground/app/a0/apps.ts +87 -0
  147. package/examples/playground/app/a0/chat.tsx +364 -0
  148. package/examples/playground/app/a0/columns.tsx +109 -0
  149. package/examples/playground/app/a0/context-menu.tsx +116 -0
  150. package/examples/playground/app/a0/cookies.ts +46 -0
  151. package/examples/playground/app/a0/crash-on-request.ts +72 -0
  152. package/examples/playground/app/a0/crashes/route.ts +3 -0
  153. package/examples/playground/app/a0/crashes.test.ts +33 -0
  154. package/examples/playground/app/a0/crashes.ts +28 -0
  155. package/examples/playground/app/a0/devtools.tsx +164 -0
  156. package/examples/playground/app/a0/events/route.ts +6 -0
  157. package/examples/playground/app/a0/flags.ts +30 -0
  158. package/examples/playground/app/a0/layout.tsx +38 -0
  159. package/examples/playground/app/a0/list/route.ts +10 -0
  160. package/examples/playground/app/a0/model.test.ts +56 -0
  161. package/examples/playground/app/a0/model.ts +58 -0
  162. package/examples/playground/app/a0/page.tsx +14 -0
  163. package/examples/playground/app/a0/preview-pane.tsx +145 -0
  164. package/examples/playground/app/a0/preview.test.ts +53 -0
  165. package/examples/playground/app/a0/preview.ts +26 -0
  166. package/examples/playground/app/a0/sandbox-log.ts +69 -0
  167. package/examples/playground/app/a0/sandbox.ts +191 -0
  168. package/examples/playground/app/a0/sandboxes/scheduler/route.ts +6 -0
  169. package/examples/playground/app/a0/scheduler/route.ts +7 -0
  170. package/examples/playground/app/a0/server.ts +158 -0
  171. package/examples/playground/app/a0/session.ts +47 -0
  172. package/examples/playground/app/a0/shell.tsx +150 -0
  173. package/examples/playground/app/a0/short/events/route.ts +9 -0
  174. package/examples/playground/app/a0/splitter.tsx +120 -0
  175. package/examples/playground/app/agent/[agentId]/agent-client.tsx +144 -174
  176. package/examples/playground/app/agent/[agentId]/command-receipt.test.tsx +65 -0
  177. package/examples/playground/app/agent/[agentId]/command-receipt.tsx +27 -0
  178. package/examples/playground/app/agent/[agentId]/compaction-event.tsx +25 -24
  179. package/examples/playground/app/agent/[agentId]/compaction-panel.test.tsx +119 -0
  180. package/examples/playground/app/agent/[agentId]/compaction-panel.tsx +208 -165
  181. package/examples/playground/app/agent/[agentId]/page.tsx +2 -16
  182. package/examples/playground/app/agent/events/route.ts +5 -2
  183. package/examples/playground/app/agent/ingress.test.ts +98 -0
  184. package/examples/playground/app/agent/model-input.test.tsx +58 -0
  185. package/examples/playground/app/agent/model-input.tsx +115 -0
  186. package/examples/playground/app/agent/model.test.ts +73 -0
  187. package/examples/playground/app/agent/model.ts +58 -26
  188. package/examples/playground/app/agent/new-agent-session.tsx +37 -19
  189. package/examples/playground/app/agent/page.tsx +4 -4
  190. package/examples/playground/app/agent/server.ts +15 -14
  191. package/examples/playground/app/agent/session.ts +5 -6
  192. package/examples/playground/app/agent/telemetry.test.ts +168 -0
  193. package/examples/playground/app/agent/telemetry.ts +30 -0
  194. package/examples/playground/app/agent/trace.test.ts +23 -0
  195. package/examples/playground/app/agent/trace.ts +18 -0
  196. package/examples/playground/app/canvas/[canvasId]/canvas-client.tsx +11 -11
  197. package/examples/playground/app/canvas/[canvasId]/page.tsx +1 -2
  198. package/examples/playground/app/canvas/[canvasId]/session.ts +2 -2
  199. package/examples/playground/app/canvas/model.ts +53 -53
  200. package/examples/playground/app/chat/[chatId]/agent-state.test.ts +176 -0
  201. package/examples/playground/app/chat/[chatId]/agent-stream-drawer.tsx +16 -1
  202. package/examples/playground/app/chat/[chatId]/chat-client.tsx +55 -77
  203. package/examples/playground/app/chat/[chatId]/chat-view.ts +37 -3
  204. package/examples/playground/app/chat/[chatId]/page.tsx +7 -15
  205. package/examples/playground/app/chat/[chatId]/session.ts +2 -19
  206. package/examples/playground/app/chat/agent/route.ts +9 -0
  207. package/examples/playground/app/chat/model.test.ts +46 -119
  208. package/examples/playground/app/chat/model.ts +82 -128
  209. package/examples/playground/app/chat/scheduler/route.ts +2 -2
  210. package/examples/playground/app/chat/server.test.ts +108 -0
  211. package/examples/playground/app/chat/server.ts +69 -73
  212. package/examples/playground/app/components/activity-feed.tsx +30 -1
  213. package/examples/playground/app/components/activity-history.test.tsx +35 -0
  214. package/examples/playground/app/components/demo-icons.tsx +89 -0
  215. package/examples/playground/app/components/demos.tsx +33 -0
  216. package/examples/playground/app/components/fast-link.test.tsx +58 -0
  217. package/examples/playground/app/components/fast-link.tsx +55 -0
  218. package/examples/playground/app/components/site-header.tsx +96 -0
  219. package/examples/playground/app/counter/counter-client.tsx +3 -3
  220. package/examples/playground/app/counter/model.test.ts +3 -3
  221. package/examples/playground/app/counter/model.ts +11 -21
  222. package/examples/playground/app/counter/page.tsx +2 -15
  223. package/examples/playground/app/counter/session.ts +2 -2
  224. package/examples/playground/app/documents/[documentId]/code-editor.tsx +12 -1
  225. package/examples/playground/app/documents/[documentId]/document-client.tsx +10 -11
  226. package/examples/playground/app/documents/[documentId]/page.tsx +1 -2
  227. package/examples/playground/app/documents/[documentId]/session.ts +2 -2
  228. package/examples/playground/app/documents/model.ts +27 -27
  229. package/examples/playground/app/globals.css +420 -207
  230. package/examples/playground/app/initial-state.test.tsx +54 -0
  231. package/examples/playground/app/layout.tsx +7 -23
  232. package/examples/playground/app/orders/[orderId]/page.tsx +1 -2
  233. package/examples/playground/app/orders/[orderId]/session.ts +2 -2
  234. package/examples/playground/app/orders/model.ts +49 -49
  235. package/examples/playground/app/page.tsx +13 -102
  236. package/examples/playground/app/recovery/[recoveryId]/page.tsx +1 -2
  237. package/examples/playground/app/recovery/[recoveryId]/session.ts +2 -2
  238. package/examples/playground/app/recovery/model.ts +30 -30
  239. package/examples/playground/instrumentation.ts +5 -0
  240. package/examples/playground/package.json +10 -2
  241. package/examples/playground/scripts/a0-template.ts +77 -0
  242. package/examples/playground/vercel.json +18 -0
  243. package/package.json +3 -1
  244. package/src/actor-client.ts +16 -4
  245. package/src/actor-react.ts +25 -11
  246. package/src/actor-shared.ts +21 -6
  247. package/src/actor.ts +76 -31
  248. package/src/ai-agent-actions.ts +219 -0
  249. package/src/ai-agent.ts +2343 -0
  250. package/src/ai-app-state.ts +91 -0
  251. package/src/ai-client-state.ts +39 -2
  252. package/src/ai-client.ts +62 -0
  253. package/src/ai-context-schema.ts +25 -5
  254. package/src/ai-context.ts +90 -40
  255. package/src/ai-control-server.ts +94 -55
  256. package/src/ai-control.ts +2 -0
  257. package/src/ai-coordinator.ts +23 -22
  258. package/src/ai-message-base.ts +209 -0
  259. package/src/ai-message-projection.ts +382 -58
  260. package/src/ai-progress-batches.ts +26 -0
  261. package/src/ai-projector.ts +95 -14
  262. package/src/ai-react.ts +146 -0
  263. package/src/ai-server.browser.ts +2 -2
  264. package/src/ai-server.ts +20 -1951
  265. package/src/ai-stored-state.ts +48 -163
  266. package/src/ai.ts +343 -276
  267. package/src/bootstrap-stream.ts +72 -0
  268. package/src/bounded-cache.ts +55 -0
  269. package/src/client-render-session.ts +49 -0
  270. package/src/client.ts +688 -151
  271. package/src/contract.ts +92 -42
  272. package/src/deterministic-id.ts +37 -0
  273. package/src/equal-json.ts +32 -0
  274. package/src/errors.ts +13 -1
  275. package/src/index.ts +5 -1
  276. package/src/initial-snapshot.ts +39 -0
  277. package/src/internal.ts +45 -0
  278. package/src/postgres-notification-scope.ts +14 -3
  279. package/src/react.ts +171 -206
  280. package/src/redis-http-reply.ts +256 -0
  281. package/src/redis-http-stream.ts +73 -0
  282. package/src/redis-http-subscriptions.ts +13 -5
  283. package/src/reducer-runtime.ts +52 -0
  284. package/src/reducer.ts +92 -10
  285. package/src/scheduler-qstash.ts +49 -20
  286. package/src/scheduler-task.ts +34 -2
  287. package/src/scheduler-vercel.ts +32 -84
  288. package/src/server-fetch.ts +139 -35
  289. package/src/server.ts +957 -237
  290. package/src/session-clear.ts +23 -0
  291. package/src/session-socket.ts +154 -49
  292. package/src/sse.ts +71 -4
  293. package/src/store-memory.ts +220 -78
  294. package/src/store-polling.ts +18 -4
  295. package/src/store-postgres.ts +461 -114
  296. package/src/store-redis-core.ts +1260 -434
  297. package/src/store-redis-http.ts +18 -2
  298. package/src/store-redis-notify.ts +260 -85
  299. package/src/store-redis.ts +19 -9
  300. package/src/store-sqlite.ts +259 -45
  301. package/src/store.ts +46 -1
  302. package/src/stream-buffer.ts +43 -0
  303. package/src/telemetry.ts +13 -1
  304. package/src/wire.ts +241 -13
  305. package/dist/actor-ohPC-81x.d.ts.map +0 -1
  306. package/dist/actor-shared-B5tJfzt-.js.map +0 -1
  307. package/dist/ai-CrLYwNEx.js.map +0 -1
  308. package/dist/ai-HJ9fHfYI.d.ts.map +0 -1
  309. package/dist/client-BYzHjkwU.js.map +0 -1
  310. package/dist/client-CzyacQpJ.d.ts.map +0 -1
  311. package/dist/contract-CKRg_E4q.js.map +0 -1
  312. package/dist/errors-DCk6ch5n.js.map +0 -1
  313. package/dist/errors-DvhSXnxk.d.ts.map +0 -1
  314. package/dist/internal-Dq2qYxou.js.map +0 -1
  315. package/dist/react.d.ts.map +0 -1
  316. package/dist/reducer-DEMjEY_O.js +0 -29
  317. package/dist/reducer-DEMjEY_O.js.map +0 -1
  318. package/dist/reducer-otzHjuJj.d.ts.map +0 -1
  319. package/dist/scheduler-task-BpzhPnRS.js.map +0 -1
  320. package/dist/server-BD5ckxZb.js.map +0 -1
  321. package/dist/server-DbD7IJVK.d.ts.map +0 -1
  322. package/dist/store-DyZM6fS5.d.ts.map +0 -1
  323. package/dist/store-polling-CmxUbV93.js.map +0 -1
  324. package/dist/store-redis-notify-BVLUfI3j.js +0 -1583
  325. package/dist/store-redis-notify-BVLUfI3j.js.map +0 -1
  326. package/dist/telemetry-B5jzpy6y.d.ts.map +0 -1
  327. package/dist/validate-XKT4FSNn.js +0 -30
  328. package/dist/validate-XKT4FSNn.js.map +0 -1
  329. package/dist/wire-BO5wWCb1.js.map +0 -1
  330. package/examples/playground/app/agent/[agentId]/compaction/route.ts +0 -14
  331. package/examples/playground/app/agent/compaction-settings.test.ts +0 -144
  332. package/examples/playground/app/agent/compaction-settings.ts +0 -49
  333. package/examples/playground/app/agent/compaction-timeline.test.ts +0 -377
  334. package/examples/playground/app/agent/compaction-timeline.ts +0 -208
@@ -0,0 +1,818 @@
1
+ /* A0 fills the window, with the site nav atop its apps list. */
2
+ body:has(.a0-page) {
3
+ height: 100dvh;
4
+ overflow: hidden;
5
+ }
6
+
7
+ main:has(> .a0-page) {
8
+ max-width: none;
9
+ height: 100%;
10
+ margin: 0;
11
+ padding: 0;
12
+ }
13
+
14
+ /* The widths come from the splitters; the chat's defaults to a share. */
15
+ .a0-page {
16
+ display: grid;
17
+ grid-template-columns:
18
+ var(--a0-apps-width) var(--a0-chat-width, minmax(320px, 9fr))
19
+ minmax(0, 11fr);
20
+ height: 100%;
21
+ min-height: 0;
22
+ }
23
+
24
+ body:has(.a0-splitter[data-dragging]) {
25
+ cursor: col-resize;
26
+ user-select: none;
27
+ }
28
+
29
+ body:has(.a0-splitter[data-dragging]) iframe {
30
+ pointer-events: none;
31
+ }
32
+
33
+ .a0-splitter {
34
+ position: absolute;
35
+ z-index: 1;
36
+ top: 0;
37
+ right: -3px;
38
+ bottom: 0;
39
+ width: 6px;
40
+ cursor: col-resize;
41
+ touch-action: none;
42
+ }
43
+
44
+ .a0-splitter:hover,
45
+ .a0-splitter:focus-visible,
46
+ .a0-splitter[data-dragging] {
47
+ background: linear-gradient(var(--accent), var(--accent)) center / 1px 100%
48
+ no-repeat;
49
+ outline: none;
50
+ }
51
+
52
+ /* Buttons here are chrome, not the playground's orange call to action. */
53
+ .a0-icon-button,
54
+ .a0-fast,
55
+ .a0-ghost,
56
+ .a0-app-open {
57
+ justify-self: auto;
58
+ border: 0;
59
+ padding: 0;
60
+ background: transparent;
61
+ color: inherit;
62
+ font-weight: inherit;
63
+ }
64
+
65
+ .a0-icon-button:hover:not(:disabled),
66
+ .a0-ghost:hover:not(:disabled) {
67
+ background: var(--shade);
68
+ color: var(--bright);
69
+ }
70
+
71
+ .a0-fast:hover:not(:disabled),
72
+ .a0-app-open:hover:not(:disabled) {
73
+ background: transparent;
74
+ }
75
+
76
+ .a0-icon-button {
77
+ display: inline-flex;
78
+ flex-shrink: 0;
79
+ align-items: center;
80
+ justify-content: center;
81
+ width: 1.75rem;
82
+ height: 1.75rem;
83
+ color: var(--muted);
84
+ }
85
+
86
+ .a0-label {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 0.5rem;
90
+ height: 2rem;
91
+ color: var(--faint);
92
+ font-size: 0.75rem;
93
+ font-weight: 500;
94
+ letter-spacing: 0;
95
+ text-transform: uppercase;
96
+ }
97
+
98
+ .a0-rule {
99
+ flex: 1;
100
+ height: 1px;
101
+ background: linear-gradient(to right, transparent 50%, var(--faint) 50%);
102
+ background-size: 8px 4px;
103
+ opacity: 0.5;
104
+ }
105
+
106
+ .a0-spin {
107
+ animation: a0-spin 1s linear infinite;
108
+ }
109
+
110
+ @keyframes a0-spin {
111
+ to {
112
+ transform: rotate(360deg);
113
+ }
114
+ }
115
+
116
+ .a0-error {
117
+ color: var(--danger);
118
+ }
119
+
120
+ /* ── apps ────────────────────────────────────────────────────────── */
121
+
122
+ .a0-apps {
123
+ position: relative;
124
+ display: flex;
125
+ flex-direction: column;
126
+ min-width: 0;
127
+ min-height: 0;
128
+ padding: 0 1rem 0.75rem;
129
+ border-right: 1px solid var(--line);
130
+ }
131
+
132
+ .a0-apps .site-header {
133
+ flex-shrink: 0;
134
+ margin: 0 -1rem;
135
+ }
136
+
137
+ .a0-apps .a0-icon-button {
138
+ width: 1.5rem;
139
+ height: 1.5rem;
140
+ }
141
+
142
+ .a0-apps nav {
143
+ display: flex;
144
+ flex-direction: column;
145
+ min-height: 0;
146
+ margin-top: 0.25rem;
147
+ overflow: auto;
148
+ }
149
+
150
+ .a0-app {
151
+ display: flex;
152
+ flex-shrink: 0;
153
+ align-items: center;
154
+ gap: 0.25rem;
155
+ min-height: 2.75rem;
156
+ color: var(--ink);
157
+ }
158
+
159
+ .a0-app[data-current] {
160
+ color: var(--bright);
161
+ }
162
+
163
+ .a0-app-open {
164
+ display: flex;
165
+ flex: 1;
166
+ align-items: center;
167
+ gap: 0.25rem;
168
+ min-width: 0;
169
+ color: inherit;
170
+ text-align: left;
171
+ text-decoration: none;
172
+ }
173
+
174
+ .a0-app svg {
175
+ flex-shrink: 0;
176
+ align-self: flex-start;
177
+ margin-top: 0.2rem;
178
+ color: var(--faint);
179
+ }
180
+
181
+ .a0-app[data-current] > svg,
182
+ .a0-app[data-current] .a0-app-open svg {
183
+ color: var(--accent);
184
+ }
185
+
186
+ .a0-app-lines {
187
+ display: flex;
188
+ flex-direction: column;
189
+ min-width: 0;
190
+ line-height: 1.35;
191
+ }
192
+
193
+ .a0-app-lines > span {
194
+ overflow: hidden;
195
+ text-overflow: ellipsis;
196
+ white-space: nowrap;
197
+ }
198
+
199
+ .a0-app-when {
200
+ color: var(--faint);
201
+ font-size: 0.75rem;
202
+ }
203
+
204
+ .a0-app-open:hover .a0-app-name {
205
+ text-decoration: underline;
206
+ }
207
+
208
+ .a0-app input {
209
+ flex: 1;
210
+ min-width: 0;
211
+ height: 1.5rem;
212
+ padding: 0 0.25rem;
213
+ border: 0;
214
+ background: color-mix(in oklab, var(--accent) 5%, transparent);
215
+ color: var(--accent);
216
+ outline: 2px dashed var(--accent);
217
+ outline-offset: -1px;
218
+ }
219
+
220
+ .a0-app[data-menu] .a0-app-name {
221
+ text-decoration: underline;
222
+ }
223
+
224
+ .a0-menu {
225
+ position: fixed;
226
+ z-index: 10;
227
+ display: flex;
228
+ flex-direction: column;
229
+ min-width: 11rem;
230
+ padding: 0.25rem;
231
+ border: 1px solid var(--line);
232
+ background: var(--surface);
233
+ box-shadow: 0 8px 24px var(--shadow);
234
+ font-size: 0.8125rem;
235
+ }
236
+
237
+ .a0-menu button {
238
+ justify-self: auto;
239
+ padding: 0.375rem 0.625rem;
240
+ border: 0;
241
+ background: transparent;
242
+ color: var(--ink);
243
+ font-weight: inherit;
244
+ text-align: left;
245
+ }
246
+
247
+ .a0-menu button:hover:not(:disabled),
248
+ .a0-menu button:focus-visible {
249
+ background: var(--shade-hover);
250
+ color: var(--bright);
251
+ filter: none;
252
+ outline: none;
253
+ }
254
+
255
+ .a0-menu button[data-danger] {
256
+ color: var(--danger);
257
+ }
258
+
259
+ /* ── chat ────────────────────────────────────────────────────────── */
260
+
261
+ .a0-chat {
262
+ position: relative;
263
+ display: flex;
264
+ flex-direction: column;
265
+ min-width: 0;
266
+ min-height: 0;
267
+ }
268
+
269
+ .a0-title {
270
+ flex-shrink: 0;
271
+ height: 40px;
272
+ margin: 0;
273
+ padding: 0 1.25rem;
274
+ overflow: hidden;
275
+ color: var(--ink);
276
+ font-size: inherit;
277
+ font-weight: 500;
278
+ line-height: 40px;
279
+ text-overflow: ellipsis;
280
+ white-space: nowrap;
281
+ }
282
+
283
+ /* A reversed scroller starts at its end and keeps it in view as it grows,
284
+ before any script runs. */
285
+ .a0-transcript-scroll {
286
+ display: flex;
287
+ flex: 1;
288
+ flex-direction: column-reverse;
289
+ min-height: 0;
290
+ overflow: auto;
291
+ overscroll-behavior: contain;
292
+ scrollbar-color: var(--faint) transparent;
293
+ scrollbar-width: thin;
294
+ }
295
+
296
+ .a0-transcript {
297
+ display: flex;
298
+ flex: 1 0 auto;
299
+ flex-direction: column;
300
+ gap: 0.75rem;
301
+ margin: 0;
302
+ padding: 1rem 1.25rem;
303
+ list-style: none;
304
+ }
305
+
306
+ .a0-suggestions {
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: 0.375rem;
310
+ margin-top: auto;
311
+ }
312
+
313
+ .a0-suggestion {
314
+ display: flex;
315
+ align-items: center;
316
+ gap: 0.5rem;
317
+ justify-self: auto;
318
+ width: 100%;
319
+ padding: 0.5rem 0.75rem;
320
+ border: 1px dashed var(--line);
321
+ background: transparent;
322
+ color: var(--muted);
323
+ font-weight: inherit;
324
+ text-align: left;
325
+ }
326
+
327
+ .a0-suggestion svg {
328
+ flex-shrink: 0;
329
+ color: var(--accent);
330
+ }
331
+
332
+ .a0-suggestion:hover:not(:disabled) {
333
+ border-color: var(--faint);
334
+ background: var(--shade);
335
+ color: var(--bright);
336
+ filter: none;
337
+ }
338
+
339
+ .a0-text {
340
+ max-width: 85%;
341
+ line-height: 1.625;
342
+ white-space: pre-wrap;
343
+ }
344
+
345
+ .a0-text[data-role='user'] {
346
+ align-self: flex-end;
347
+ padding: 0.5rem 0.75rem;
348
+ background: var(--shade);
349
+ color: var(--ink);
350
+ }
351
+
352
+ .a0-text[data-role='assistant'] {
353
+ align-self: flex-start;
354
+ color: var(--muted);
355
+ }
356
+
357
+ .a0-step {
358
+ display: flex;
359
+ align-items: flex-start;
360
+ align-self: flex-start;
361
+ gap: 0.375rem;
362
+ max-width: 100%;
363
+ color: var(--faint);
364
+ font-size: 0.75rem;
365
+ }
366
+
367
+ .a0-step svg {
368
+ flex-shrink: 0;
369
+ margin-top: 0.2rem;
370
+ }
371
+
372
+ .a0-reasoning {
373
+ align-self: stretch;
374
+ color: var(--faint);
375
+ font-size: 0.75rem;
376
+ }
377
+
378
+ .a0-reasoning summary {
379
+ display: flex;
380
+ align-items: center;
381
+ gap: 0.375rem;
382
+ width: fit-content;
383
+ cursor: pointer;
384
+ list-style: none;
385
+ }
386
+
387
+ .a0-reasoning summary::-webkit-details-marker {
388
+ display: none;
389
+ }
390
+
391
+ .a0-reasoning summary:hover {
392
+ color: var(--muted);
393
+ }
394
+
395
+ .a0-reasoning p {
396
+ margin: 0.25rem 0 0 1.125rem;
397
+ white-space: pre-wrap;
398
+ }
399
+
400
+ .a0-step-took {
401
+ flex-shrink: 0;
402
+ color: var(--faint);
403
+ font-variant-numeric: tabular-nums;
404
+ }
405
+
406
+ .a0-step .a0-step-done {
407
+ color: var(--accent);
408
+ }
409
+
410
+ .a0-step-label {
411
+ flex-shrink: 0;
412
+ color: var(--muted);
413
+ }
414
+
415
+ .a0-step[data-failed],
416
+ .a0-step[data-failed] .a0-step-label {
417
+ color: var(--danger);
418
+ }
419
+
420
+ .a0-step code {
421
+ min-width: 0;
422
+ overflow: hidden;
423
+ padding: 0;
424
+ background: none;
425
+ color: color-mix(in oklab, var(--faint) 85%, transparent);
426
+ font-size: inherit;
427
+ text-overflow: ellipsis;
428
+ white-space: nowrap;
429
+ }
430
+
431
+ .a0-send-error {
432
+ margin: 0;
433
+ padding: 0 1.25rem 0.5rem;
434
+ }
435
+
436
+ /* A dotted frame, dashed while focused. */
437
+ .a0-composer {
438
+ display: flex;
439
+ flex-shrink: 0;
440
+ flex-direction: column;
441
+ gap: 0;
442
+ margin: 0.25rem 0.75rem 0.75rem;
443
+ padding: 0;
444
+ border: 0;
445
+ background: color-mix(in oklab, var(--shade) 10%, transparent);
446
+ outline: 2px dotted color-mix(in oklab, var(--muted) 50%, transparent);
447
+ outline-offset: -1px;
448
+ }
449
+
450
+ .a0-composer:focus-within {
451
+ background: color-mix(in oklab, var(--shade) 30%, transparent);
452
+ outline-style: dashed;
453
+ }
454
+
455
+ .a0-composer textarea {
456
+ width: 100%;
457
+ min-height: 4rem;
458
+ padding: 0.75rem 0.75rem 0.25rem;
459
+ border: 0;
460
+ background: transparent;
461
+ color: var(--ink);
462
+ resize: none;
463
+ }
464
+
465
+ .a0-composer textarea:focus-visible {
466
+ outline: none;
467
+ }
468
+
469
+ .a0-composer-bar {
470
+ display: flex;
471
+ align-items: center;
472
+ justify-content: space-between;
473
+ gap: 0.75rem;
474
+ padding: 0.25rem 0.75rem 0.75rem;
475
+ }
476
+
477
+ .a0-composer-model {
478
+ display: flex;
479
+ align-items: center;
480
+ gap: 0.5rem;
481
+ min-width: 0;
482
+ color: var(--faint);
483
+ }
484
+
485
+ /* The model settings read as quiet text until touched. */
486
+ .a0-composer-model input,
487
+ .a0-composer-model select {
488
+ min-width: 0;
489
+ padding: 0.125rem 0.25rem;
490
+ border: 0;
491
+ background: transparent;
492
+ color: var(--faint);
493
+ font-size: 0.8125rem;
494
+ }
495
+
496
+ .a0-composer-model input {
497
+ max-width: 16rem;
498
+ }
499
+
500
+ .a0-composer-model select {
501
+ cursor: pointer;
502
+ }
503
+
504
+ .a0-composer-model input:hover,
505
+ .a0-composer-model input:focus-visible,
506
+ .a0-composer-model select:hover,
507
+ .a0-composer-model select:focus-visible {
508
+ color: var(--ink);
509
+ }
510
+
511
+ .a0-fast {
512
+ display: inline-flex;
513
+ flex-shrink: 0;
514
+ align-items: center;
515
+ justify-content: center;
516
+ width: 1.5rem;
517
+ height: 1.5rem;
518
+ color: var(--faint);
519
+ }
520
+
521
+ .a0-fast:hover:not(:disabled) {
522
+ color: var(--ink);
523
+ }
524
+
525
+ .a0-fast[aria-pressed='true'] {
526
+ color: var(--accent);
527
+ }
528
+
529
+ .a0-composer-actions {
530
+ display: flex;
531
+ flex-shrink: 0;
532
+ align-items: center;
533
+ gap: 0.5rem;
534
+ }
535
+
536
+ .a0-queued {
537
+ color: var(--faint);
538
+ font-size: 0.75rem;
539
+ }
540
+
541
+ .a0-composer-actions button {
542
+ height: 1.75rem;
543
+ padding: 0 0.625rem;
544
+ }
545
+
546
+ .a0-ghost {
547
+ color: var(--muted);
548
+ }
549
+
550
+ /* ── preview ─────────────────────────────────────────────────────── */
551
+
552
+ /* The app fills its column, edge to edge. */
553
+ .a0-preview {
554
+ display: flex;
555
+ min-width: 0;
556
+ min-height: 0;
557
+ border-left: 1px solid var(--line);
558
+ }
559
+
560
+ .a0-preview iframe {
561
+ display: block;
562
+ flex: 1;
563
+ width: 100%;
564
+ height: 100%;
565
+ border: 0;
566
+ background: #fff;
567
+ }
568
+
569
+ .a0-placeholder {
570
+ display: grid;
571
+ place-items: center;
572
+ width: 100%;
573
+ height: 100%;
574
+ background: var(--shade);
575
+ color: var(--faint);
576
+ text-align: center;
577
+ }
578
+
579
+ .a0-placeholder > div {
580
+ display: flex;
581
+ flex-direction: column;
582
+ align-items: center;
583
+ gap: 0.5rem;
584
+ max-width: 18rem;
585
+ }
586
+
587
+ .a0-placeholder p {
588
+ display: flex;
589
+ align-items: center;
590
+ gap: 0.5rem;
591
+ margin: 0;
592
+ }
593
+
594
+ .a0-placeholder .a0-placeholder-title {
595
+ color: var(--ink);
596
+ }
597
+
598
+ /* ── dev tools ───────────────────────────────────────────────────── */
599
+
600
+ /* Open, they take the bottom of the chat and preview columns. */
601
+ .a0-page[data-panel] {
602
+ grid-template-rows: minmax(0, 1fr) min(40%, 22rem);
603
+ }
604
+
605
+ .a0-page[data-panel] .a0-apps {
606
+ grid-row: 1 / -1;
607
+ }
608
+
609
+ .a0-devtools {
610
+ display: flex;
611
+ grid-row: 2;
612
+ grid-column: 2 / -1;
613
+ flex-direction: column;
614
+ min-width: 0;
615
+ min-height: 0;
616
+ border-top: 1px solid var(--line);
617
+ background: var(--bg);
618
+ font-size: 0.75rem;
619
+ }
620
+
621
+ .a0-devtools-bar {
622
+ display: flex;
623
+ flex-shrink: 0;
624
+ align-items: center;
625
+ gap: 1rem;
626
+ height: 2.25rem;
627
+ padding: 0 0.5rem 0 1.25rem;
628
+ border-bottom: 1px solid var(--line);
629
+ }
630
+
631
+ .a0-devtools-title {
632
+ margin-right: auto;
633
+ color: var(--ink);
634
+ font-weight: 500;
635
+ text-transform: uppercase;
636
+ }
637
+
638
+ .a0-devtools-title span {
639
+ margin-left: 0.5rem;
640
+ color: var(--faint);
641
+ font-weight: 400;
642
+ text-transform: none;
643
+ }
644
+
645
+ .a0-devtools-switch {
646
+ display: flex;
647
+ align-items: center;
648
+ gap: 0.375rem;
649
+ color: var(--muted);
650
+ }
651
+
652
+ .a0-devtools-switch input {
653
+ accent-color: var(--accent);
654
+ }
655
+
656
+ .a0-devtools-crash {
657
+ display: inline-flex;
658
+ align-items: center;
659
+ gap: 0.375rem;
660
+ padding: 0.25rem 0.5rem;
661
+ color: var(--danger);
662
+ }
663
+
664
+ .a0-devtools-crash:disabled {
665
+ color: var(--warning);
666
+ opacity: 1;
667
+ }
668
+
669
+ .a0-log-scroll {
670
+ display: flex;
671
+ flex: 1;
672
+ flex-direction: column-reverse;
673
+ min-height: 0;
674
+ overflow: auto;
675
+ overscroll-behavior: contain;
676
+ scrollbar-color: var(--faint) transparent;
677
+ scrollbar-width: thin;
678
+ }
679
+
680
+ .a0-log {
681
+ margin: 0;
682
+ padding: 0.25rem 0;
683
+ list-style: none;
684
+ }
685
+
686
+ .a0-log-row summary {
687
+ display: grid;
688
+ grid-template-columns: 3.5rem 4.5rem 12rem minmax(0, 1fr);
689
+ gap: 0.75rem;
690
+ padding: 0.125rem 1.25rem;
691
+ color: var(--muted);
692
+ cursor: pointer;
693
+ list-style: none;
694
+ white-space: nowrap;
695
+ }
696
+
697
+ .a0-log-row summary::-webkit-details-marker {
698
+ display: none;
699
+ }
700
+
701
+ .a0-log-row summary:hover,
702
+ .a0-log-row[open] summary {
703
+ background: var(--shade);
704
+ }
705
+
706
+ .a0-log-row summary > * {
707
+ overflow: hidden;
708
+ text-overflow: ellipsis;
709
+ }
710
+
711
+ .a0-log-index,
712
+ .a0-log-gap {
713
+ color: var(--faint);
714
+ text-align: right;
715
+ }
716
+
717
+ .a0-log-type {
718
+ color: var(--ink);
719
+ }
720
+
721
+ .a0-log-row code {
722
+ background: none;
723
+ color: var(--faint);
724
+ font-size: inherit;
725
+ }
726
+
727
+ .a0-log-row pre {
728
+ margin: 0;
729
+ padding: 0.5rem 1.25rem 0.75rem 9.75rem;
730
+ overflow: auto;
731
+ background: var(--shade);
732
+ color: var(--ink);
733
+ font-size: inherit;
734
+ white-space: pre-wrap;
735
+ word-break: break-word;
736
+ }
737
+
738
+ .a0-log-older {
739
+ margin: 0.25rem 1.25rem;
740
+ padding: 0.125rem 0.5rem;
741
+ color: var(--muted);
742
+ }
743
+
744
+ .a0-devtools-toggle {
745
+ display: flex;
746
+ align-items: center;
747
+ justify-content: space-between;
748
+ justify-self: auto;
749
+ margin-top: auto;
750
+ padding: 0.25rem 0;
751
+ border: 0;
752
+ background: transparent;
753
+ color: var(--faint);
754
+ font-size: 0.75rem;
755
+ font-weight: inherit;
756
+ }
757
+
758
+ .a0-devtools-toggle:hover:not(:disabled),
759
+ .a0-devtools-toggle[aria-pressed='true'] {
760
+ background: transparent;
761
+ color: var(--ink);
762
+ filter: none;
763
+ }
764
+
765
+ .a0-devtools-toggle kbd {
766
+ font-family: inherit;
767
+ }
768
+
769
+ /* Narrower: the preview goes under the chat. */
770
+ @media (max-width: 1023px) {
771
+ .a0-page {
772
+ grid-template-columns: var(--a0-apps-width) minmax(0, 1fr);
773
+ grid-template-rows: minmax(0, 1fr) minmax(0, 1fr);
774
+ }
775
+
776
+ .a0-apps {
777
+ grid-row: 1 / -1;
778
+ }
779
+
780
+ .a0-chat .a0-splitter {
781
+ display: none;
782
+ }
783
+
784
+ .a0-preview {
785
+ border-top: 1px solid var(--line);
786
+ border-left: 0;
787
+ }
788
+ .a0-page[data-panel] {
789
+ grid-template-rows: minmax(0, 1fr) minmax(0, 1fr) min(40%, 18rem);
790
+ }
791
+
792
+ .a0-devtools {
793
+ grid-row: 3;
794
+ }
795
+ }
796
+
797
+ /* Phone-wide: the site nav on top, then the chat, then the preview. */
798
+ @media (max-width: 639px) {
799
+ .a0-page {
800
+ grid-template-columns: minmax(0, 1fr);
801
+ grid-template-rows: auto minmax(0, 1fr) minmax(0, 1fr);
802
+ }
803
+
804
+ .a0-apps {
805
+ grid-row: auto;
806
+ padding-bottom: 0;
807
+ border-right: 0;
808
+ }
809
+
810
+ .a0-apps > :not(.site-header) {
811
+ display: none;
812
+ }
813
+ }
814
+
815
+ .a0-list-error {
816
+ margin: 0.5rem 0 0;
817
+ font-size: 0.75rem;
818
+ }