experimental-a2 0.16.1 → 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 (333) hide show
  1. package/CHANGELOG.md +352 -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-DgOBltJ_.js → ai-UrWfKeuv.js} +621 -216
  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 +432 -258
  32. package/dist/ai-server.js.map +1 -1
  33. package/dist/{ai-CrEf6p_W.d.ts → ai-vpGtcaCB.d.ts} +114 -100
  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 +671 -581
  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 +656 -194
  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 +6 -3
  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 +92 -72
  256. package/src/ai-coordinator.ts +23 -22
  257. package/src/ai-message-base.ts +209 -0
  258. package/src/ai-message-projection.ts +262 -64
  259. package/src/ai-progress-batches.ts +26 -0
  260. package/src/ai-projector.ts +95 -14
  261. package/src/ai-react.ts +146 -0
  262. package/src/ai-server.browser.ts +2 -2
  263. package/src/ai-server.ts +20 -1964
  264. package/src/ai-stored-state.ts +48 -163
  265. package/src/ai.ts +339 -155
  266. package/src/bootstrap-stream.ts +72 -0
  267. package/src/bounded-cache.ts +55 -0
  268. package/src/client-render-session.ts +49 -0
  269. package/src/client.ts +688 -151
  270. package/src/contract.ts +92 -42
  271. package/src/deterministic-id.ts +37 -0
  272. package/src/equal-json.ts +32 -0
  273. package/src/errors.ts +13 -1
  274. package/src/index.ts +5 -1
  275. package/src/initial-snapshot.ts +39 -0
  276. package/src/internal.ts +45 -0
  277. package/src/postgres-notification-scope.ts +14 -3
  278. package/src/react.ts +171 -206
  279. package/src/redis-http-reply.ts +256 -0
  280. package/src/redis-http-stream.ts +73 -0
  281. package/src/redis-http-subscriptions.ts +13 -5
  282. package/src/reducer-runtime.ts +52 -0
  283. package/src/reducer.ts +92 -10
  284. package/src/scheduler-qstash.ts +49 -20
  285. package/src/scheduler-task.ts +34 -2
  286. package/src/scheduler-vercel.ts +32 -84
  287. package/src/server-fetch.ts +139 -35
  288. package/src/server.ts +957 -237
  289. package/src/session-clear.ts +23 -0
  290. package/src/session-socket.ts +154 -49
  291. package/src/sse.ts +71 -4
  292. package/src/store-memory.ts +220 -78
  293. package/src/store-polling.ts +18 -4
  294. package/src/store-postgres.ts +461 -114
  295. package/src/store-redis-core.ts +1260 -434
  296. package/src/store-redis-http.ts +18 -2
  297. package/src/store-redis-notify.ts +260 -85
  298. package/src/store-redis.ts +19 -9
  299. package/src/store-sqlite.ts +259 -45
  300. package/src/store.ts +46 -1
  301. package/src/stream-buffer.ts +43 -0
  302. package/src/telemetry.ts +13 -1
  303. package/src/wire.ts +241 -13
  304. package/dist/actor-ohPC-81x.d.ts.map +0 -1
  305. package/dist/actor-shared-B5tJfzt-.js.map +0 -1
  306. package/dist/ai-CrEf6p_W.d.ts.map +0 -1
  307. package/dist/ai-DgOBltJ_.js.map +0 -1
  308. package/dist/client-BYzHjkwU.js.map +0 -1
  309. package/dist/client-CzyacQpJ.d.ts.map +0 -1
  310. package/dist/contract-CKRg_E4q.js.map +0 -1
  311. package/dist/errors-DCk6ch5n.js.map +0 -1
  312. package/dist/errors-DvhSXnxk.d.ts.map +0 -1
  313. package/dist/internal-Dq2qYxou.js.map +0 -1
  314. package/dist/react.d.ts.map +0 -1
  315. package/dist/reducer-DEMjEY_O.js +0 -29
  316. package/dist/reducer-DEMjEY_O.js.map +0 -1
  317. package/dist/reducer-otzHjuJj.d.ts.map +0 -1
  318. package/dist/scheduler-task-BpzhPnRS.js.map +0 -1
  319. package/dist/server-BD5ckxZb.js.map +0 -1
  320. package/dist/server-DbD7IJVK.d.ts.map +0 -1
  321. package/dist/store-DyZM6fS5.d.ts.map +0 -1
  322. package/dist/store-polling-CmxUbV93.js.map +0 -1
  323. package/dist/store-redis-notify-BVLUfI3j.js +0 -1583
  324. package/dist/store-redis-notify-BVLUfI3j.js.map +0 -1
  325. package/dist/telemetry-B5jzpy6y.d.ts.map +0 -1
  326. package/dist/validate-XKT4FSNn.js +0 -30
  327. package/dist/validate-XKT4FSNn.js.map +0 -1
  328. package/dist/wire-BO5wWCb1.js.map +0 -1
  329. package/examples/playground/app/agent/[agentId]/compaction/route.ts +0 -14
  330. package/examples/playground/app/agent/compaction-settings.test.ts +0 -144
  331. package/examples/playground/app/agent/compaction-settings.ts +0 -49
  332. package/examples/playground/app/agent/compaction-timeline.test.ts +0 -377
  333. package/examples/playground/app/agent/compaction-timeline.ts +0 -208
@@ -1,19 +1,49 @@
1
+ /* Dark by default; light when the system asks for it. */
1
2
  :root {
2
- --bg: #fbfaf8;
3
- --surface: #ffffff;
4
- --ink: #1a1917;
5
- --muted: #6f6b64;
6
- --line: #e6e2da;
7
- --accent: #0d5c46;
8
- --accent-ink: #ffffff;
9
- --danger: #a3352b;
10
- --code-bg: #f1efe9;
11
- font-family:
12
- ui-sans-serif,
13
- system-ui,
14
- -apple-system,
15
- 'Segoe UI',
16
- sans-serif;
3
+ color-scheme: light dark;
4
+ --bg: #040404;
5
+ --surface: #040404;
6
+ --shade: #161616;
7
+ --shade-hover: #1b1b1b;
8
+ --line: #252525;
9
+ --faint: #7a7a7a;
10
+ --muted: #909090;
11
+ --ink: #dedede;
12
+ --bright: #fafafa;
13
+ --accent: #ff6c02;
14
+ --accent-ink: #040404;
15
+ --danger: #ff6568;
16
+ --success: #4fd18b;
17
+ --warning: #f2b54b;
18
+ --info: #6ea8fe;
19
+ --code-bg: #161616;
20
+ --dot: #404040;
21
+ --shadow: rgb(0 0 0 / 50%);
22
+ font-family: var(--font-geist-mono), ui-monospace, monospace;
23
+ font-size: 87.5%;
24
+ }
25
+
26
+ @media (prefers-color-scheme: light) {
27
+ :root {
28
+ --bg: #fafaf9;
29
+ --surface: #fafaf9;
30
+ --shade: #efefed;
31
+ --shade-hover: #e7e7e4;
32
+ --line: #e0e0dc;
33
+ --faint: #6e6e6c;
34
+ --muted: #52524f;
35
+ --ink: #1c1c1b;
36
+ --bright: #000000;
37
+ --accent: #c2410c;
38
+ --accent-ink: #ffffff;
39
+ --danger: #c81e1e;
40
+ --success: #15803d;
41
+ --warning: #9a5b05;
42
+ --info: #1d4ed8;
43
+ --code-bg: #efefed;
44
+ --dot: #d6d6d2;
45
+ --shadow: rgb(0 0 0 / 12%);
46
+ }
17
47
  }
18
48
 
19
49
  * {
@@ -29,20 +59,31 @@ body {
29
59
  width: 100%;
30
60
  min-width: 0;
31
61
  background: var(--bg);
32
- color: var(--ink);
33
- line-height: 1.55;
62
+ color: var(--muted);
63
+ line-height: 1.6;
64
+ letter-spacing: -0.02em;
65
+ -webkit-font-smoothing: antialiased;
66
+ }
67
+
68
+ input,
69
+ textarea {
70
+ letter-spacing: normal;
71
+ }
72
+
73
+ ::selection {
74
+ background: color-mix(in oklab, var(--accent) 20%, transparent);
34
75
  }
35
76
 
36
77
  code,
37
78
  pre,
38
79
  kbd {
39
- font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
40
- font-size: 0.9em;
80
+ font-family: inherit;
81
+ font-size: 0.92em;
41
82
  }
42
83
 
43
84
  code {
44
85
  background: var(--code-bg);
45
- border-radius: 4px;
86
+ color: var(--ink);
46
87
  padding: 0.1em 0.35em;
47
88
  }
48
89
 
@@ -57,7 +98,7 @@ main {
57
98
 
58
99
  body:has(.chat-page) {
59
100
  display: grid;
60
- grid-template-rows: auto minmax(0, 1fr) auto;
101
+ grid-template-rows: auto minmax(0, 1fr);
61
102
  height: 100dvh;
62
103
  min-height: 0;
63
104
  overflow: hidden;
@@ -69,10 +110,6 @@ main:has(> .chat-page) {
69
110
  padding: 0;
70
111
  }
71
112
 
72
- body:has(.chat-page) .site-footer {
73
- display: none;
74
- }
75
-
76
113
  .sr-only {
77
114
  position: absolute;
78
115
  width: 1px;
@@ -85,14 +122,22 @@ body:has(.chat-page) .site-footer {
85
122
  border: 0;
86
123
  }
87
124
 
125
+ h1,
126
+ h2,
127
+ h3 {
128
+ color: var(--bright);
129
+ letter-spacing: -0.03em;
130
+ }
131
+
88
132
  h1 {
89
- font-size: 1.65rem;
90
- letter-spacing: -0.015em;
133
+ font-size: 1.4rem;
134
+ font-weight: 600;
91
135
  margin: 0 0 0.5rem;
92
136
  }
93
137
 
94
138
  h2 {
95
- font-size: 1.1rem;
139
+ font-size: 1rem;
140
+ font-weight: 600;
96
141
  margin: 2rem 0 0.5rem;
97
142
  }
98
143
 
@@ -102,99 +147,174 @@ p {
102
147
 
103
148
  .lede {
104
149
  color: var(--muted);
105
- font-size: 1.05rem;
106
- max-width: 38rem;
150
+ max-width: 40rem;
107
151
  }
108
152
 
109
153
  a {
110
154
  color: var(--accent);
155
+ text-underline-offset: 3px;
111
156
  }
112
157
 
113
- /* ── header / footer ─────────────────────────────────────────────── */
158
+ strong {
159
+ color: var(--ink);
160
+ }
161
+
162
+ /* ── header ──────────────────────────────────────────────────────── */
114
163
 
115
164
  .site-header {
165
+ display: flex;
166
+ align-items: center;
167
+ gap: 0.4rem;
168
+ height: 40px;
116
169
  min-width: 0;
117
- overflow: hidden;
118
- border-bottom: 1px solid var(--line);
119
- background: var(--surface);
170
+ padding: 0 0.75rem;
171
+ font-size: 15px;
172
+ font-weight: 600;
173
+ letter-spacing: -0.03em;
174
+ text-transform: uppercase;
120
175
  }
121
176
 
122
- .site-header nav {
123
- width: 100%;
124
- min-width: 0;
125
- max-width: 58rem;
126
- margin: 0 auto;
127
- padding: 0.75rem 1.25rem;
177
+ .brand {
128
178
  display: flex;
129
- gap: 1.25rem;
130
- align-items: baseline;
131
- overflow-x: auto;
132
- white-space: nowrap;
133
- scrollbar-width: none;
134
- }
135
-
136
- .site-header a {
179
+ align-items: center;
180
+ gap: 0.4rem;
137
181
  color: var(--ink);
138
182
  text-decoration: none;
139
183
  }
140
184
 
141
- .site-header a:hover {
185
+ .brand svg {
186
+ color: var(--accent);
187
+ }
188
+
189
+ .brand:hover span {
190
+ color: var(--bright);
142
191
  text-decoration: underline;
143
192
  }
144
193
 
145
- .brand {
146
- font-weight: 700;
147
- margin-right: auto;
194
+ .demo-menu {
195
+ position: relative;
148
196
  }
149
197
 
150
- .brand span {
198
+ .demo-menu summary {
199
+ display: flex;
200
+ align-items: center;
201
+ gap: 0.3rem;
202
+ color: var(--faint);
151
203
  font-weight: 400;
152
- color: var(--muted);
204
+ cursor: pointer;
205
+ list-style: none;
153
206
  }
154
207
 
155
- .site-footer {
156
- border-top: 1px solid var(--line);
157
- color: var(--muted);
158
- font-size: 0.85rem;
208
+ .demo-menu summary::-webkit-details-marker {
209
+ display: none;
159
210
  }
160
211
 
161
- .site-footer p {
162
- max-width: 58rem;
163
- margin: 0 auto;
164
- padding: 1rem 1.25rem;
212
+ .demo-menu summary:hover,
213
+ .demo-menu[open] summary {
214
+ color: var(--bright);
165
215
  }
166
216
 
167
- /* ── cards ───────────────────────────────────────────────────────── */
217
+ .demo-menu[open] summary svg {
218
+ transform: rotate(180deg);
219
+ }
168
220
 
169
- .card-grid {
221
+ .demo-menu nav {
222
+ position: absolute;
223
+ top: calc(100% + 8px);
224
+ left: 0;
225
+ z-index: 50;
170
226
  display: grid;
171
- grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
172
- gap: 1rem;
173
- margin: 1.5rem 0;
227
+ min-width: 11rem;
228
+ padding: 0.25rem 0;
229
+ background: var(--shade);
230
+ box-shadow: 0 10px 30px var(--shadow);
231
+ font-size: 14px;
232
+ font-weight: 400;
233
+ letter-spacing: -0.02em;
234
+ text-transform: none;
174
235
  }
175
236
 
176
- .card {
177
- display: block;
178
- background: var(--surface);
179
- border: 1px solid var(--line);
180
- border-radius: 10px;
181
- padding: 1.1rem 1.25rem;
182
- color: inherit;
237
+ .demo-menu nav a {
238
+ display: flex;
239
+ align-items: center;
240
+ justify-content: space-between;
241
+ height: 2rem;
242
+ padding: 0 0.75rem;
243
+ color: var(--ink);
183
244
  text-decoration: none;
184
- transition: border-color 120ms ease;
185
245
  }
186
246
 
187
- .card:hover {
188
- border-color: var(--accent);
247
+ .demo-menu nav a:hover,
248
+ .demo-menu nav a:focus-visible {
249
+ background: var(--shade-hover);
250
+ color: var(--bright);
189
251
  }
190
252
 
191
- .card h2 {
192
- margin: 0 0 0.35rem;
253
+ .demo-menu nav a svg {
254
+ color: var(--accent);
193
255
  }
194
256
 
195
- .card p {
196
- color: var(--muted);
197
- font-size: 0.92rem;
257
+ /* The home page's demos, as app tiles. */
258
+ .app-grid {
259
+ display: grid;
260
+ grid-template-columns: repeat(auto-fill, minmax(6.5rem, 1fr));
261
+ gap: 2rem 1rem;
262
+ margin: 3rem 0 0;
263
+ padding: 0;
264
+ list-style: none;
265
+ }
266
+
267
+ .app-tile {
268
+ display: flex;
269
+ flex-direction: column;
270
+ align-items: center;
271
+ gap: 0.75rem;
272
+ color: var(--ink);
273
+ font-size: 0.875rem;
274
+ text-decoration: none;
275
+ }
276
+
277
+ .app-icon {
278
+ display: grid;
279
+ place-items: center;
280
+ width: 5.5rem;
281
+ height: 5.5rem;
282
+ border: 1px solid var(--line);
283
+ background: var(--shade);
284
+ color: var(--ink);
285
+ transition:
286
+ background 120ms,
287
+ border-color 120ms;
288
+ }
289
+
290
+ .app-icon svg {
291
+ width: 2.75rem;
292
+ height: 2.75rem;
293
+ }
294
+
295
+ .app-icon .accent {
296
+ stroke: var(--accent);
297
+ }
298
+
299
+ .app-icon .accent-fill {
300
+ fill: var(--accent);
301
+ stroke: none;
302
+ }
303
+
304
+ .app-icon .fill {
305
+ fill: currentColor;
306
+ stroke: none;
307
+ }
308
+
309
+ .app-tile:hover,
310
+ .app-tile:focus-visible {
311
+ color: var(--bright);
312
+ }
313
+
314
+ .app-tile:hover .app-icon,
315
+ .app-tile:focus-visible .app-icon {
316
+ border-color: var(--accent);
317
+ background: var(--shade-hover);
198
318
  }
199
319
 
200
320
  /* ── forms & buttons ─────────────────────────────────────────────── */
@@ -204,7 +324,6 @@ form {
204
324
  gap: 0.9rem;
205
325
  background: var(--surface);
206
326
  border: 1px solid var(--line);
207
- border-radius: 10px;
208
327
  padding: 1.25rem;
209
328
  margin: 1.25rem 0;
210
329
  }
@@ -212,8 +331,9 @@ form {
212
331
  label {
213
332
  display: grid;
214
333
  gap: 0.3rem;
334
+ color: var(--ink);
215
335
  font-size: 0.9rem;
216
- font-weight: 600;
336
+ font-weight: 500;
217
337
  }
218
338
 
219
339
  input,
@@ -222,24 +342,32 @@ textarea {
222
342
  font: inherit;
223
343
  padding: 0.5rem 0.65rem;
224
344
  border: 1px solid var(--line);
225
- border-radius: 7px;
345
+ border-radius: 0;
226
346
  background: var(--bg);
227
- color: inherit;
347
+ color: var(--ink);
348
+ }
349
+
350
+ input::placeholder,
351
+ textarea::placeholder {
352
+ color: var(--faint);
353
+ }
354
+
355
+ :focus-visible {
356
+ outline: 2px dashed var(--accent);
357
+ outline-offset: 2px;
228
358
  }
229
359
 
230
360
  input:focus-visible,
231
361
  select:focus-visible,
232
- textarea:focus-visible,
233
- button:focus-visible {
234
- outline: 2px solid var(--accent);
235
- outline-offset: 1px;
362
+ textarea:focus-visible {
363
+ outline-offset: -1px;
236
364
  }
237
365
 
238
366
  button {
239
367
  font: inherit;
240
- font-weight: 600;
241
- padding: 0.55rem 1.1rem;
242
- border-radius: 7px;
368
+ font-weight: 500;
369
+ padding: 0.4rem 0.8rem;
370
+ border-radius: 0;
243
371
  border: 1px solid var(--accent);
244
372
  background: var(--accent);
245
373
  color: var(--accent-ink);
@@ -252,18 +380,28 @@ button:hover:not(:disabled) {
252
380
  }
253
381
 
254
382
  button:disabled {
255
- opacity: 0.45;
383
+ opacity: 0.4;
256
384
  cursor: not-allowed;
257
385
  }
258
386
 
259
387
  button.secondary {
260
- background: transparent;
388
+ border-color: transparent;
389
+ background: color-mix(in oklab, var(--accent) 10%, transparent);
261
390
  color: var(--accent);
262
391
  }
263
392
 
393
+ button.secondary:hover:not(:disabled) {
394
+ background: color-mix(in oklab, var(--accent) 20%, transparent);
395
+ }
396
+
264
397
  button.danger {
265
- background: var(--danger);
266
- border-color: var(--danger);
398
+ border-color: transparent;
399
+ background: color-mix(in oklab, var(--danger) 12%, transparent);
400
+ color: var(--danger);
401
+ }
402
+
403
+ button.danger:hover:not(:disabled) {
404
+ background: color-mix(in oklab, var(--danger) 22%, transparent);
267
405
  }
268
406
 
269
407
  .inline-form {
@@ -284,7 +422,7 @@ button.danger {
284
422
  }
285
423
 
286
424
  .hint {
287
- color: var(--muted);
425
+ color: var(--faint);
288
426
  font-size: 0.85rem;
289
427
  }
290
428
 
@@ -304,36 +442,38 @@ button.danger {
304
442
 
305
443
  .badge {
306
444
  display: inline-block;
307
- padding: 0.15rem 0.6rem;
308
- border-radius: 99px;
309
- font-size: 0.8rem;
310
- font-weight: 600;
445
+ padding: 0.1rem 0.45rem;
311
446
  border: 1px solid var(--line);
312
447
  background: var(--code-bg);
448
+ color: var(--ink);
449
+ font-size: 0.72rem;
450
+ font-weight: 500;
451
+ letter-spacing: 0;
452
+ text-transform: uppercase;
313
453
  }
314
454
 
315
455
  .badge.live {
316
- background: #e8f3ee;
317
- border-color: #bcd9cc;
456
+ background: color-mix(in oklab, var(--accent) 10%, transparent);
457
+ border-color: color-mix(in oklab, var(--accent) 40%, transparent);
318
458
  color: var(--accent);
319
459
  }
320
460
 
321
461
  .badge.done {
322
- background: var(--accent);
323
- border-color: var(--accent);
324
- color: var(--accent-ink);
462
+ background: color-mix(in oklab, var(--success) 10%, transparent);
463
+ border-color: color-mix(in oklab, var(--success) 40%, transparent);
464
+ color: var(--success);
325
465
  }
326
466
 
327
467
  .badge.cut {
328
- background: #f8e9e7;
329
- border-color: #e4c1bc;
468
+ background: color-mix(in oklab, var(--danger) 10%, transparent);
469
+ border-color: color-mix(in oklab, var(--danger) 40%, transparent);
330
470
  color: var(--danger);
331
471
  }
332
472
 
333
473
  .badge.waiting {
334
- background: #fff4d8;
335
- border-color: #e5cb8d;
336
- color: #805a08;
474
+ background: color-mix(in oklab, var(--warning) 10%, transparent);
475
+ border-color: color-mix(in oklab, var(--warning) 40%, transparent);
476
+ color: var(--warning);
337
477
  }
338
478
 
339
479
  /* ── journey timeline ──────────────────────────────────────────── */
@@ -423,7 +563,6 @@ button.danger {
423
563
  margin: 1.5rem 0 0.75rem;
424
564
  padding: 2rem;
425
565
  border: 1px solid var(--line);
426
- border-radius: 10px;
427
566
  background: var(--surface);
428
567
  }
429
568
 
@@ -468,11 +607,11 @@ button.danger {
468
607
  }
469
608
 
470
609
  .conn.live::before {
471
- background: #1a8a5f;
610
+ background: var(--success);
472
611
  }
473
612
 
474
613
  .conn.connecting::before {
475
- background: #c98a1b;
614
+ background: var(--warning);
476
615
  animation: blink 1s steps(2, start) infinite;
477
616
  }
478
617
 
@@ -487,7 +626,6 @@ button.danger {
487
626
  margin: 0.75rem 0;
488
627
  padding: 0;
489
628
  border: 1px solid var(--line);
490
- border-radius: 10px;
491
629
  background: var(--surface);
492
630
  overflow: hidden;
493
631
  }
@@ -537,9 +675,9 @@ button.danger {
537
675
  .activity-status {
538
676
  margin: -0.15rem 0 0.65rem;
539
677
  padding: 0.65rem 0.8rem;
540
- border-left: 3px solid #d5a72f;
541
- background: #fff9e8;
542
- color: #6d5721;
678
+ border-left: 3px solid var(--warning);
679
+ background: color-mix(in oklab, var(--warning) 8%, transparent);
680
+ color: var(--warning);
543
681
  font-size: 0.88rem;
544
682
  }
545
683
 
@@ -548,9 +686,8 @@ button.danger {
548
686
  .timeout-callout {
549
687
  margin: 1.25rem 0;
550
688
  padding: 1rem 1.1rem;
551
- border: 1px solid #e5cb8d;
552
- border-radius: 10px;
553
- background: #fff9e8;
689
+ border: 1px solid color-mix(in oklab, var(--warning) 40%, transparent);
690
+ background: color-mix(in oklab, var(--warning) 8%, transparent);
554
691
  }
555
692
 
556
693
  .timeout-callout h2 {
@@ -560,7 +697,7 @@ button.danger {
560
697
  .proof {
561
698
  padding: 0.65rem 0.8rem;
562
699
  border-left: 3px solid var(--accent);
563
- background: #e8f3ee;
700
+ background: color-mix(in oklab, var(--accent) 10%, transparent);
564
701
  font-size: 0.9rem;
565
702
  }
566
703
 
@@ -677,7 +814,6 @@ button.danger {
677
814
  width: 100%;
678
815
  max-width: none;
679
816
  padding: 0.08rem 0.65rem;
680
- border-radius: 6px;
681
817
  }
682
818
 
683
819
  .msg.group-start {
@@ -691,7 +827,7 @@ button.danger {
691
827
 
692
828
  .msg:hover,
693
829
  .msg:focus-within {
694
- background: #f7f5f1;
830
+ background: var(--shade);
695
831
  }
696
832
 
697
833
  .msg-gutter {
@@ -706,16 +842,15 @@ button.danger {
706
842
  place-items: center;
707
843
  width: 2.25rem;
708
844
  height: 2.25rem;
709
- border-radius: 0.55rem;
710
- background: #e8f3ee;
845
+ background: color-mix(in oklab, var(--accent) 10%, transparent);
711
846
  color: var(--accent);
712
847
  font-size: 0.86rem;
713
848
  font-weight: 800;
714
849
  }
715
850
 
716
851
  .msg.agent .msg-avatar {
717
- background: #e8eef9;
718
- color: #3874c8;
852
+ background: color-mix(in oklab, var(--info) 12%, transparent);
853
+ color: var(--info);
719
854
  }
720
855
 
721
856
  .msg-compact-time {
@@ -765,13 +900,12 @@ button.danger {
765
900
  }
766
901
 
767
902
  .msg.agent .msg-author {
768
- color: #3874c8;
903
+ color: var(--info);
769
904
  }
770
905
 
771
906
  .mention {
772
- background: #e8f3ee;
907
+ background: color-mix(in oklab, var(--accent) 10%, transparent);
773
908
  color: var(--accent);
774
- border-radius: 4px;
775
909
  padding: 0 0.15em;
776
910
  font-weight: 600;
777
911
  }
@@ -805,9 +939,8 @@ button.danger {
805
939
  .chat-agent-error {
806
940
  margin: 0 auto 0.65rem;
807
941
  padding: 0.65rem 0.75rem;
808
- border: 1px solid #e4c1bc;
809
- border-radius: 8px;
810
- background: #fff5f3;
942
+ border: 1px solid color-mix(in oklab, var(--danger) 40%, transparent);
943
+ background: color-mix(in oklab, var(--danger) 8%, transparent);
811
944
  display: flex;
812
945
  align-items: center;
813
946
  justify-content: space-between;
@@ -856,22 +989,17 @@ button.danger {
856
989
  min-height: 7.5rem;
857
990
  padding: 0;
858
991
  overflow: visible;
859
- border: 1px solid #a8a39a;
860
- border-radius: 11px;
861
- background: var(--surface);
992
+ border: 0;
993
+ outline: 2px dotted color-mix(in oklab, var(--muted) 50%, transparent);
994
+ outline-offset: -1px;
995
+ background: transparent;
862
996
  margin: 0;
863
- box-shadow: 0 1px 2px rgb(26 25 23 / 5%);
864
997
  cursor: text;
865
- transition:
866
- border-color 120ms ease,
867
- box-shadow 120ms ease;
868
998
  }
869
999
 
870
1000
  .composer:focus-within {
871
- border-color: var(--ink);
872
- box-shadow:
873
- 0 0 0 1px var(--ink),
874
- 0 3px 10px rgb(26 25 23 / 7%);
1001
+ outline-style: dashed;
1002
+ outline-color: var(--muted);
875
1003
  }
876
1004
 
877
1005
  .composer-input-surface {
@@ -893,9 +1021,9 @@ button.danger {
893
1021
  border: 0;
894
1022
  border-radius: 0;
895
1023
  outline: 0;
896
- background: var(--surface);
897
- font-size: 1rem;
898
- line-height: 1.45;
1024
+ background: transparent;
1025
+ color: var(--ink);
1026
+ line-height: 1.5;
899
1027
  }
900
1028
 
901
1029
  .composer textarea:focus-visible {
@@ -926,8 +1054,7 @@ button.danger {
926
1054
  min-height: 2.15rem;
927
1055
  padding: 0.28rem 0.58rem;
928
1056
  border: 1px solid var(--line);
929
- border-radius: 7px;
930
- background: #f7f5f1;
1057
+ background: var(--shade);
931
1058
  color: var(--ink);
932
1059
  cursor: pointer;
933
1060
  font-size: 0.78rem;
@@ -937,8 +1064,8 @@ button.danger {
937
1064
  }
938
1065
 
939
1066
  .composer-mode-selector:hover {
940
- border-color: #bdb7ac;
941
- background: var(--code-bg);
1067
+ border-color: var(--muted);
1068
+ background: var(--shade-hover);
942
1069
  }
943
1070
 
944
1071
  .composer-mode-selector:has(input:focus-visible) {
@@ -1002,8 +1129,7 @@ button.danger {
1002
1129
  border-top: 1px solid var(--line);
1003
1130
  padding: 0.7rem clamp(0.75rem, 3vw, 2rem)
1004
1131
  calc(0.35rem + env(safe-area-inset-bottom));
1005
- background: var(--surface);
1006
- box-shadow: 0 -8px 22px rgb(56 48 35 / 5%);
1132
+ background: var(--bg);
1007
1133
  }
1008
1134
 
1009
1135
  .chat-composer-dock > * {
@@ -1023,8 +1149,7 @@ button.danger {
1023
1149
  min-width: 12rem;
1024
1150
  background: var(--surface);
1025
1151
  border: 1px solid var(--line);
1026
- border-radius: 8px;
1027
- box-shadow: 0 6px 20px rgb(26 25 23 / 0.08);
1152
+ box-shadow: 0 6px 20px var(--shadow);
1028
1153
  }
1029
1154
 
1030
1155
  .mention-popover button {
@@ -1036,7 +1161,6 @@ button.danger {
1036
1161
  color: inherit;
1037
1162
  font-weight: 500;
1038
1163
  padding: 0.35rem 0.6rem;
1039
- border-radius: 6px;
1040
1164
  }
1041
1165
 
1042
1166
  .mention-popover button.active,
@@ -1053,7 +1177,7 @@ button.danger {
1053
1177
  border: 0;
1054
1178
  border-left: 1px solid var(--line);
1055
1179
  border-radius: 0;
1056
- background: #f7f5f1;
1180
+ background: var(--bg);
1057
1181
  }
1058
1182
 
1059
1183
  .chat-sidebar-toggle {
@@ -1116,11 +1240,11 @@ button.danger {
1116
1240
  border-left: 1px solid var(--line);
1117
1241
  background: var(--surface);
1118
1242
  color: var(--ink);
1119
- box-shadow: -18px 0 45px rgb(26 25 23 / 14%);
1243
+ box-shadow: -18px 0 45px var(--shadow);
1120
1244
  }
1121
1245
 
1122
1246
  .agent-stream-drawer::backdrop {
1123
- background: rgb(26 25 23 / 28%);
1247
+ background: var(--shadow);
1124
1248
  backdrop-filter: blur(2px);
1125
1249
  }
1126
1250
 
@@ -1225,18 +1349,17 @@ button.danger {
1225
1349
  min-width: 0;
1226
1350
  padding: 0.7rem;
1227
1351
  border: 1px solid var(--line);
1228
- border-radius: 8px;
1229
1352
  background: var(--bg);
1230
1353
  }
1231
1354
 
1232
1355
  .agent-stream-part.reasoning {
1233
- border-color: #d8cbea;
1234
- background: #fbf8ff;
1356
+ border-color: color-mix(in oklab, var(--info) 35%, transparent);
1357
+ background: color-mix(in oklab, var(--info) 6%, transparent);
1235
1358
  }
1236
1359
 
1237
1360
  .agent-stream-part.tool {
1238
- border-color: #bcd9cc;
1239
- background: #f5fbf8;
1361
+ border-color: color-mix(in oklab, var(--accent) 40%, transparent);
1362
+ background: color-mix(in oklab, var(--accent) 5%, transparent);
1240
1363
  }
1241
1364
 
1242
1365
  .agent-stream-part > header,
@@ -1284,7 +1407,6 @@ button.danger {
1284
1407
  margin: 0.4rem 0 0;
1285
1408
  padding: 0.55rem;
1286
1409
  overflow: auto;
1287
- border-radius: 6px;
1288
1410
  background: var(--code-bg);
1289
1411
  font-size: 0.68rem;
1290
1412
  white-space: pre-wrap;
@@ -1324,7 +1446,6 @@ button.danger {
1324
1446
  .agent-stream-empty {
1325
1447
  margin: 1rem 0;
1326
1448
  padding: 1rem;
1327
- border-radius: 8px;
1328
1449
  background: var(--code-bg);
1329
1450
  color: var(--muted);
1330
1451
  text-align: center;
@@ -1384,9 +1505,8 @@ button.danger {
1384
1505
  min-height: auto;
1385
1506
  overflow: visible;
1386
1507
  border: 1px solid var(--line);
1387
- border-radius: 8px;
1388
1508
  background: var(--surface);
1389
- box-shadow: 0 8px 26px rgb(26 25 23 / 12%);
1509
+ box-shadow: 0 8px 26px var(--shadow);
1390
1510
  }
1391
1511
 
1392
1512
  .chat-sidebar-toggle {
@@ -1489,11 +1609,16 @@ button.danger {
1489
1609
 
1490
1610
  /* ── durable agent ──────────────────────────────────────────────── */
1491
1611
 
1612
+ .agent-trace {
1613
+ display: inline-block;
1614
+ margin-top: 0.75rem;
1615
+ font-size: 0.8rem;
1616
+ }
1617
+
1492
1618
  .agent-compaction {
1493
1619
  margin: 1rem 0;
1494
1620
  padding: 0.75rem 1rem;
1495
1621
  border: 1px solid var(--line);
1496
- border-radius: 12px;
1497
1622
  background: var(--surface);
1498
1623
  }
1499
1624
 
@@ -1624,7 +1749,6 @@ button.danger {
1624
1749
  .agent-compaction-event {
1625
1750
  padding: 0.65rem 0.85rem;
1626
1751
  border: 1px dashed var(--line);
1627
- border-radius: 9px;
1628
1752
  background: var(--code-bg);
1629
1753
  }
1630
1754
 
@@ -1648,7 +1772,6 @@ button.danger {
1648
1772
  overflow: hidden;
1649
1773
  margin: 1rem 0;
1650
1774
  border: 1px solid var(--line);
1651
- border-radius: 12px;
1652
1775
  background: var(--surface);
1653
1776
  }
1654
1777
 
@@ -1674,7 +1797,6 @@ button.danger {
1674
1797
 
1675
1798
  .agent-message.user > div {
1676
1799
  padding: 0.7rem 0.85rem;
1677
- border-radius: 9px;
1678
1800
  background: var(--code-bg);
1679
1801
  }
1680
1802
 
@@ -1731,14 +1853,13 @@ button.danger {
1731
1853
  padding: 0.75rem 0.85rem;
1732
1854
  border: 1px solid var(--line);
1733
1855
  border-left: 3px solid var(--accent);
1734
- border-radius: 8px;
1735
1856
  background: var(--bg);
1736
1857
  }
1737
1858
 
1738
1859
  .tool-card.approval-requested,
1739
1860
  .tool-card.approval-responded,
1740
1861
  .tool-card.output-denied {
1741
- border-left-color: #c98a1b;
1862
+ border-left-color: var(--warning);
1742
1863
  }
1743
1864
 
1744
1865
  .tool-card > div {
@@ -1774,9 +1895,8 @@ button.danger {
1774
1895
  justify-content: space-between;
1775
1896
  margin: 0 1rem 1rem;
1776
1897
  padding: 1rem 1.1rem;
1777
- border: 1px solid #e5cb8d;
1778
- border-radius: 10px;
1779
- background: #fffaec;
1898
+ border: 1px solid color-mix(in oklab, var(--warning) 40%, transparent);
1899
+ background: color-mix(in oklab, var(--warning) 8%, transparent);
1780
1900
  }
1781
1901
 
1782
1902
  .approval-card h2 {
@@ -1802,7 +1922,6 @@ button.danger {
1802
1922
  .agent-queue {
1803
1923
  margin: 0 1rem 0.85rem;
1804
1924
  border: 1px solid var(--line);
1805
- border-radius: 9px;
1806
1925
  background: var(--bg);
1807
1926
  overflow: hidden;
1808
1927
  }
@@ -1829,7 +1948,6 @@ button.danger {
1829
1948
  .agent-queue-header h3 span {
1830
1949
  min-width: 1.2rem;
1831
1950
  padding: 0 0.3rem;
1832
- border-radius: 4px;
1833
1951
  background: var(--line);
1834
1952
  text-align: center;
1835
1953
  font-size: 0.68rem;
@@ -1842,7 +1960,7 @@ button.danger {
1842
1960
  }
1843
1961
 
1844
1962
  .agent-queue-status.paused {
1845
- color: #885b12;
1963
+ color: var(--warning);
1846
1964
  }
1847
1965
 
1848
1966
  .agent-queue-list {
@@ -1893,7 +2011,6 @@ button.danger {
1893
2011
  height: 1.9rem;
1894
2012
  padding: 0;
1895
2013
  border: 0;
1896
- border-radius: 5px;
1897
2014
  background: transparent;
1898
2015
  color: var(--muted);
1899
2016
  }
@@ -1914,7 +2031,7 @@ button.danger {
1914
2031
  }
1915
2032
 
1916
2033
  .agent-queue-actions .agent-queue-remove:hover:not(:disabled) {
1917
- background: #f8e8e5;
2034
+ background: color-mix(in oklab, var(--danger) 12%, transparent);
1918
2035
  color: var(--danger);
1919
2036
  }
1920
2037
 
@@ -1987,8 +2104,106 @@ button.danger {
1987
2104
  background: var(--surface);
1988
2105
  }
1989
2106
 
1990
- .agent-form textarea {
2107
+ .agent-message-field {
2108
+ display: grid;
2109
+ gap: 0.3rem;
2110
+ min-width: 0;
2111
+ }
2112
+
2113
+ .agent-composer {
2114
+ display: flex;
2115
+ flex-direction: column;
2116
+ min-width: 0;
2117
+ min-height: 8.5rem;
1991
2118
  resize: vertical;
2119
+ overflow: hidden;
2120
+ border: 0;
2121
+ outline: 2px dotted color-mix(in oklab, var(--muted) 50%, transparent);
2122
+ outline-offset: -1px;
2123
+ background: transparent;
2124
+ }
2125
+
2126
+ .agent-composer:focus-within {
2127
+ outline-style: dashed;
2128
+ outline-color: var(--muted);
2129
+ }
2130
+
2131
+ .agent-composer textarea {
2132
+ display: block;
2133
+ flex: 1;
2134
+ width: 100%;
2135
+ min-height: 3rem;
2136
+ padding: 0.65rem;
2137
+ resize: none;
2138
+ border: 0;
2139
+ border-radius: 0;
2140
+ outline: 0;
2141
+ background: transparent;
2142
+ font-weight: 400;
2143
+ line-height: 1.5;
2144
+ }
2145
+
2146
+ .agent-composer textarea:focus-visible {
2147
+ outline: 0;
2148
+ }
2149
+
2150
+ .agent-composer-toolbar {
2151
+ flex-shrink: 0;
2152
+ padding: 0.25rem 0.35rem 0.4rem;
2153
+ }
2154
+
2155
+ .agent-model-controls {
2156
+ display: flex;
2157
+ flex: 1;
2158
+ align-items: center;
2159
+ flex-wrap: wrap;
2160
+ min-width: 0;
2161
+ gap: 0.35rem;
2162
+ }
2163
+
2164
+ .agent-model-choice {
2165
+ flex: 0 1 auto;
2166
+ min-width: 0;
2167
+ max-width: 24rem;
2168
+ }
2169
+
2170
+ .agent-model-controls input,
2171
+ .agent-model-controls select {
2172
+ min-width: 0;
2173
+ max-width: 100%;
2174
+ height: 2.1rem;
2175
+ padding: 0.3rem 0.45rem;
2176
+ border-color: transparent;
2177
+ background: transparent;
2178
+ font-size: 0.85rem;
2179
+ }
2180
+
2181
+ .agent-model-controls input {
2182
+ field-sizing: content;
2183
+ width: auto;
2184
+ text-overflow: ellipsis;
2185
+ }
2186
+
2187
+ .agent-model-controls input:hover,
2188
+ .agent-model-controls select:hover {
2189
+ border-color: var(--line);
2190
+ background: var(--surface);
2191
+ }
2192
+
2193
+ .agent-fast-toggle {
2194
+ display: grid;
2195
+ flex: 0 0 2.1rem;
2196
+ place-items: center;
2197
+ width: 2.1rem;
2198
+ height: 2.1rem;
2199
+ padding: 0;
2200
+ border-color: transparent;
2201
+ background: transparent;
2202
+ color: var(--muted);
2203
+ }
2204
+
2205
+ .agent-fast-toggle[aria-pressed='true'] {
2206
+ color: var(--warning);
1992
2207
  }
1993
2208
 
1994
2209
  .agent-new .agent-transcript {
@@ -2107,9 +2322,8 @@ button.compact {
2107
2322
  .document-editor {
2108
2323
  overflow: hidden;
2109
2324
  border: 1px solid var(--line);
2110
- border-radius: 12px;
2111
2325
  background: var(--surface);
2112
- box-shadow: 0 12px 35px rgb(56 48 35 / 7%);
2326
+ box-shadow: 0 12px 35px var(--shadow);
2113
2327
  }
2114
2328
 
2115
2329
  .document-title {
@@ -2139,7 +2353,7 @@ button.compact {
2139
2353
 
2140
2354
  .document-title::placeholder,
2141
2355
  .document-body .cm-placeholder {
2142
- color: #aaa59c;
2356
+ color: var(--faint);
2143
2357
  }
2144
2358
 
2145
2359
  /* Out of flow: an in-flow placeholder makes a peer's caret at
@@ -2156,7 +2370,7 @@ button.compact {
2156
2370
  .document-body .cm-ySelectionInfo {
2157
2371
  opacity: 1;
2158
2372
  font-family: inherit;
2159
- border-radius: 3px 3px 3px 0;
2373
+ color: #040404;
2160
2374
  padding: 0 4px;
2161
2375
  }
2162
2376
 
@@ -2182,23 +2396,26 @@ button.compact {
2182
2396
 
2183
2397
  .document-body .cm-content {
2184
2398
  padding: 1rem 0.75rem 1.5rem;
2185
- caret-color: var(--accent);
2399
+ }
2400
+
2401
+ .document-body .cm-cursor {
2402
+ border-left-color: var(--accent);
2186
2403
  }
2187
2404
 
2188
2405
  .document-body .cm-gutters {
2189
2406
  border-right: 1px solid var(--line);
2190
- color: #aaa59c;
2407
+ color: var(--faint);
2191
2408
  background: var(--bg);
2192
2409
  }
2193
2410
 
2194
2411
  .document-body .cm-activeLine,
2195
2412
  .document-body .cm-activeLineGutter {
2196
- background: #f6f4ef;
2413
+ background: var(--shade);
2197
2414
  }
2198
2415
 
2199
2416
  .document-body .cm-selectionBackground,
2200
2417
  .document-body .cm-content ::selection {
2201
- background: #cde2da !important;
2418
+ background: color-mix(in oklab, var(--accent) 25%, transparent) !important;
2202
2419
  }
2203
2420
 
2204
2421
  .editor-status {
@@ -2232,7 +2449,7 @@ button.compact {
2232
2449
  }
2233
2450
 
2234
2451
  .sync-state.saving::before {
2235
- background: #c98a1b;
2452
+ background: var(--warning);
2236
2453
  animation: blink 1s steps(2, start) infinite;
2237
2454
  }
2238
2455
 
@@ -2259,14 +2476,15 @@ button.compact {
2259
2476
  position: relative;
2260
2477
  overflow: hidden;
2261
2478
  border: 1px solid var(--line);
2262
- border-radius: 12px;
2263
- background: var(--surface);
2264
- box-shadow: 0 12px 35px rgb(56 48 35 / 7%);
2479
+ background-color: var(--surface);
2480
+ background-image: radial-gradient(var(--dot) 1px, transparent 1.25px);
2481
+ background-size: 16px 16px;
2482
+ background-position: 4px 4px;
2265
2483
  }
2266
2484
 
2267
2485
  .canvas-stage.historical {
2268
- border-color: #e5cb8d;
2269
- background: #fffdf6;
2486
+ border-color: color-mix(in oklab, var(--warning) 40%, transparent);
2487
+ background-color: color-mix(in oklab, var(--warning) 4%, transparent);
2270
2488
  }
2271
2489
 
2272
2490
  .canvas-stage.historical .canvas-svg {
@@ -2334,9 +2552,9 @@ button.compact {
2334
2552
  }
2335
2553
 
2336
2554
  .canvas-status.replaying {
2337
- border-top-color: #e5cb8d;
2338
- background: #fff9e8;
2339
- color: #6d5721;
2555
+ border-top-color: color-mix(in oklab, var(--warning) 40%, transparent);
2556
+ background: color-mix(in oklab, var(--warning) 8%, transparent);
2557
+ color: var(--warning);
2340
2558
  }
2341
2559
 
2342
2560
  .canvas-scrubber {
@@ -2367,11 +2585,6 @@ button.compact {
2367
2585
  }
2368
2586
 
2369
2587
  @media (max-width: 680px) {
2370
- .site-header nav {
2371
- gap: 0.7rem;
2372
- font-size: 0.9rem;
2373
- }
2374
-
2375
2588
  .canvas-toolbar {
2376
2589
  align-items: stretch;
2377
2590
  flex-direction: column;