basalt-ui 1.41.0 → 2.0.1

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 (915) hide show
  1. package/AGENTS.md +46 -43
  2. package/CHANGELOG.md +542 -518
  3. package/MIGRATING.md +964 -37
  4. package/README.md +171 -366
  5. package/agent/rules/basalt-batteries.md +19 -74
  6. package/agent/rules/basalt-charts.md +21 -95
  7. package/agent/rules/basalt-controls.md +23 -131
  8. package/agent/rules/basalt-mantine.md +26 -99
  9. package/agent/rules/basalt-state.md +21 -103
  10. package/agent/rules/basalt-tokens.md +33 -114
  11. package/agent/skills/basalt-app/SKILL.md +229 -72
  12. package/agent/skills/basalt-charts/SKILL.md +23 -57
  13. package/agent/skills/basalt-design/SKILL.md +12 -70
  14. package/agent/templates/AGENTS-block.md.tpl +16 -26
  15. package/agent/templates/DESIGN.md.tpl +1 -1
  16. package/agent/templates/__root.tpl +9 -16
  17. package/agent/templates/main.tpl +21 -0
  18. package/agent/templates/nav.tpl +18 -0
  19. package/configs/oxlint-basalt.json +4 -10
  20. package/configs/oxlint-plugin.js +465 -844
  21. package/configs/oxlint-plugin.test.ts +661 -709
  22. package/configs/oxlint.json +10 -2
  23. package/dist/agent/ai-sdk-transport.d.ts +19 -7
  24. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  25. package/dist/agent/ai-sdk-transport.js +10 -7
  26. package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
  27. package/dist/agent/chat/composer.d.ts.map +1 -0
  28. package/dist/{agent-chat → agent/chat}/composer.js +10 -9
  29. package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
  30. package/dist/agent/chat/message-affordances.d.ts.map +1 -0
  31. package/dist/agent/chat/relative-time.d.ts.map +1 -0
  32. package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
  33. package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
  34. package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
  35. package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
  36. package/dist/agent/chat/thread-feed.d.ts.map +1 -0
  37. package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
  38. package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
  39. package/dist/agent/chat/thread-message.d.ts.map +1 -0
  40. package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
  41. package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
  42. package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
  43. package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
  44. package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
  45. package/dist/agent/chat/tool-chip.d.ts.map +1 -0
  46. package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
  47. package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
  48. package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
  49. package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
  50. package/dist/agent/chat/virtualize.d.ts.map +1 -0
  51. package/dist/agent/error.d.ts +31 -0
  52. package/dist/agent/error.d.ts.map +1 -0
  53. package/dist/agent/error.js +18 -0
  54. package/dist/agent/history.d.ts +2 -36
  55. package/dist/agent/history.d.ts.map +1 -1
  56. package/dist/agent/history.js +0 -32
  57. package/dist/agent/id.d.ts +4 -5
  58. package/dist/agent/id.d.ts.map +1 -1
  59. package/dist/agent/index.d.ts +19 -52
  60. package/dist/agent/index.d.ts.map +1 -1
  61. package/dist/agent/index.js +10 -32
  62. package/dist/agent/outcome.d.ts +3 -14
  63. package/dist/agent/outcome.d.ts.map +1 -1
  64. package/dist/agent/outcome.js +0 -30
  65. package/dist/agent/part-list.d.ts +3 -3
  66. package/dist/agent/part-list.d.ts.map +1 -1
  67. package/dist/agent/parts.d.ts +23 -24
  68. package/dist/agent/parts.d.ts.map +1 -1
  69. package/dist/agent/run-committer.d.ts +23 -0
  70. package/dist/agent/run-committer.d.ts.map +1 -0
  71. package/dist/agent/run-committer.js +41 -0
  72. package/dist/agent/run-records.d.ts +77 -0
  73. package/dist/agent/run-records.d.ts.map +1 -0
  74. package/dist/agent/run-records.js +69 -0
  75. package/dist/agent/thread.d.ts +23 -47
  76. package/dist/agent/thread.d.ts.map +1 -1
  77. package/dist/agent/thread.js +3 -134
  78. package/dist/agent/transport.d.ts +6 -69
  79. package/dist/agent/transport.d.ts.map +1 -1
  80. package/dist/agent/transport.js +0 -18
  81. package/dist/agent/use-agent-thread-runs.d.ts +63 -26
  82. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  83. package/dist/agent/use-agent-thread-runs.js +202 -66
  84. package/dist/charts/BandStrip.d.ts +46 -0
  85. package/dist/charts/BandStrip.d.ts.map +1 -0
  86. package/dist/charts/BandStrip.js +151 -0
  87. package/dist/charts/Bars.d.ts +19 -0
  88. package/dist/charts/Bars.d.ts.map +1 -0
  89. package/dist/charts/Bars.js +77 -0
  90. package/dist/charts/CartesianChart.d.ts +57 -0
  91. package/dist/charts/CartesianChart.d.ts.map +1 -0
  92. package/dist/charts/CartesianChart.js +121 -0
  93. package/dist/charts/ChartCard.d.ts +34 -0
  94. package/dist/charts/ChartCard.d.ts.map +1 -0
  95. package/dist/charts/ChartCard.js +115 -0
  96. package/dist/charts/Donut.d.ts +25 -0
  97. package/dist/charts/Donut.d.ts.map +1 -0
  98. package/dist/charts/Donut.js +191 -0
  99. package/dist/charts/DualPanel.d.ts +47 -0
  100. package/dist/charts/DualPanel.d.ts.map +1 -0
  101. package/dist/charts/DualPanel.js +214 -0
  102. package/dist/charts/Heatmap.d.ts +41 -0
  103. package/dist/charts/Heatmap.d.ts.map +1 -0
  104. package/dist/charts/Heatmap.js +216 -0
  105. package/dist/charts/Lines.d.ts +11 -0
  106. package/dist/charts/Lines.d.ts.map +1 -0
  107. package/dist/charts/Lines.js +114 -0
  108. package/dist/charts/MirroredBars.d.ts +44 -0
  109. package/dist/charts/MirroredBars.d.ts.map +1 -0
  110. package/dist/charts/MirroredBars.js +190 -0
  111. package/dist/charts/Sparkline.d.ts +22 -0
  112. package/dist/charts/Sparkline.d.ts.map +1 -0
  113. package/dist/charts/Sparkline.js +129 -0
  114. package/dist/charts/StackedArea.d.ts +15 -0
  115. package/dist/charts/StackedArea.d.ts.map +1 -0
  116. package/dist/charts/StackedArea.js +46 -0
  117. package/dist/charts/box.d.ts +38 -0
  118. package/dist/charts/box.d.ts.map +1 -0
  119. package/dist/charts/box.js +72 -0
  120. package/dist/charts/card-context.d.ts +3 -0
  121. package/dist/charts/card-context.d.ts.map +1 -0
  122. package/dist/charts/card-context.js +7 -0
  123. package/dist/charts/chart-box.module.css +64 -0
  124. package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
  125. package/dist/charts/chart-card.module.css +25 -0
  126. package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
  127. package/dist/charts/chart-legend.module.css +38 -0
  128. package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
  129. package/dist/charts/compile.d.ts +62 -0
  130. package/dist/charts/compile.d.ts.map +1 -0
  131. package/dist/charts/compile.js +386 -0
  132. package/dist/charts/cursor.d.ts +50 -0
  133. package/dist/charts/cursor.d.ts.map +1 -0
  134. package/dist/charts/cursor.js +157 -0
  135. package/dist/charts/curves.d.ts +12 -0
  136. package/dist/charts/curves.d.ts.map +1 -0
  137. package/dist/charts/curves.js +86 -0
  138. package/dist/charts/donut.module.css +54 -0
  139. package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
  140. package/dist/charts/host.d.ts +17 -0
  141. package/dist/charts/host.d.ts.map +1 -0
  142. package/dist/charts/host.js +35 -0
  143. package/dist/charts/index.d.ts +18 -53
  144. package/dist/charts/index.d.ts.map +1 -1
  145. package/dist/charts/index.js +17 -189
  146. package/dist/charts/legend.d.ts +23 -0
  147. package/dist/charts/legend.d.ts.map +1 -0
  148. package/dist/charts/legend.js +160 -0
  149. package/dist/charts/marks.d.ts +25 -0
  150. package/dist/charts/marks.d.ts.map +1 -0
  151. package/dist/charts/marks.js +128 -0
  152. package/dist/charts/panel.d.ts +56 -0
  153. package/dist/charts/panel.d.ts.map +1 -0
  154. package/dist/charts/panel.js +123 -0
  155. package/dist/charts/scales.d.ts +44 -0
  156. package/dist/charts/scales.d.ts.map +1 -0
  157. package/dist/charts/scales.js +163 -0
  158. package/dist/charts/sizing.d.ts +12 -0
  159. package/dist/charts/sizing.d.ts.map +1 -0
  160. package/dist/charts/sizing.js +33 -0
  161. package/dist/charts/state.d.ts +17 -0
  162. package/dist/charts/state.d.ts.map +1 -0
  163. package/dist/charts/state.js +53 -0
  164. package/dist/charts/theme.d.ts +38 -19
  165. package/dist/charts/theme.d.ts.map +1 -1
  166. package/dist/charts/theme.js +48 -26
  167. package/dist/charts/types.d.ts +227 -0
  168. package/dist/charts/types.d.ts.map +1 -0
  169. package/dist/charts/types.js +4 -0
  170. package/dist/cli/audit-allows.d.ts +4 -17
  171. package/dist/cli/audit-allows.d.ts.map +1 -1
  172. package/dist/cli/config.d.ts +18 -43
  173. package/dist/cli/config.d.ts.map +1 -1
  174. package/dist/cli/config.js +6 -0
  175. package/dist/cli/doctor-upgrade.d.ts +43 -0
  176. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  177. package/dist/cli/doctor-upgrade.js +314 -0
  178. package/dist/cli/doctor.d.ts +14 -29
  179. package/dist/cli/doctor.d.ts.map +1 -1
  180. package/dist/cli/doctor.js +58 -9
  181. package/dist/cli/help.d.ts.map +1 -1
  182. package/dist/cli/help.js +2 -4
  183. package/dist/cli/index.d.ts +48 -172
  184. package/dist/cli/index.d.ts.map +1 -1
  185. package/dist/cli/index.js +39 -132
  186. package/dist/cli/init.d.ts.map +1 -1
  187. package/dist/cli/init.js +43 -37
  188. package/dist/cli/sync.d.ts +5 -21
  189. package/dist/cli/sync.d.ts.map +1 -1
  190. package/dist/cli/sync.js +4 -23
  191. package/dist/cli/tokens-css.d.ts +7 -28
  192. package/dist/cli/tokens-css.d.ts.map +1 -1
  193. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  194. package/dist/commands/ShortcutsHelp.js +4 -5
  195. package/dist/commands/define-commands.d.ts +15 -31
  196. package/dist/commands/define-commands.d.ts.map +1 -1
  197. package/dist/commands/define-commands.js +1 -11
  198. package/dist/commands/define-overlays.d.ts +5 -19
  199. package/dist/commands/define-overlays.d.ts.map +1 -1
  200. package/dist/commands/define-overlays.js +3 -11
  201. package/dist/commands/index.d.ts +10 -40
  202. package/dist/commands/index.d.ts.map +1 -1
  203. package/dist/commands/index.js +9 -46
  204. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  205. package/dist/commands/notifications/bell.d.ts.map +1 -0
  206. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  207. package/dist/commands/notifications/center.d.ts.map +1 -0
  208. package/dist/{notifications → commands/notifications}/center.js +2 -2
  209. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  210. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  211. package/dist/commands/notifications/notify.d.ts +44 -0
  212. package/dist/commands/notifications/notify.d.ts.map +1 -0
  213. package/dist/commands/notifications/notify.js +79 -0
  214. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  215. package/dist/commands/notifications/store.d.ts.map +1 -0
  216. package/dist/{notifications → commands/notifications}/store.js +4 -0
  217. package/dist/commands/projectors.d.ts +1 -131
  218. package/dist/commands/projectors.d.ts.map +1 -1
  219. package/dist/commands/projectors.js +2 -73
  220. package/dist/commands/shell-bridge.d.ts +3 -3
  221. package/dist/commands/shortcut-format.d.ts +5 -4
  222. package/dist/commands/shortcut-format.d.ts.map +1 -1
  223. package/dist/common/errors.d.ts +3 -3
  224. package/dist/common/use-measured-widths.d.ts.map +1 -1
  225. package/dist/common/use-measured-widths.js +5 -3
  226. package/dist/common/validate.d.ts +2 -2
  227. package/dist/content/article-layout.d.ts.map +1 -1
  228. package/dist/content/article-layout.js +3 -3
  229. package/dist/content/article-model.d.ts +1 -46
  230. package/dist/content/article-model.d.ts.map +1 -1
  231. package/dist/content/article-model.js +1 -29
  232. package/dist/content/index.d.ts +11 -41
  233. package/dist/content/index.d.ts.map +1 -1
  234. package/dist/content/index.js +3 -35
  235. package/dist/content/markdown.d.ts +1 -1
  236. package/dist/content/markdown.d.ts.map +1 -1
  237. package/dist/content/markdown.js +1 -1
  238. package/dist/content/mermaid.d.ts.map +1 -1
  239. package/dist/content/mermaid.js +7 -7
  240. package/dist/content/slug.d.ts +1 -8
  241. package/dist/content/slug.d.ts.map +1 -1
  242. package/dist/content/slug.js +1 -8
  243. package/dist/content/url-hardening.d.ts +2 -2
  244. package/dist/content/url-hardening.d.ts.map +1 -1
  245. package/dist/content/url-hardening.js +2 -0
  246. package/dist/controls/actions.d.ts +16 -1
  247. package/dist/controls/actions.d.ts.map +1 -1
  248. package/dist/controls/enum-filter.d.ts +1 -1
  249. package/dist/controls/enum-filter.d.ts.map +1 -1
  250. package/dist/controls/filter-context.d.ts.map +1 -1
  251. package/dist/controls/filter-context.js +3 -1
  252. package/dist/controls/filter-set.js +4 -6
  253. package/dist/controls/form-layout.d.ts +1 -1
  254. package/dist/controls/form-layout.d.ts.map +1 -1
  255. package/dist/controls/form-layout.js +1 -1
  256. package/dist/controls/glyphs.d.ts +0 -2
  257. package/dist/controls/glyphs.d.ts.map +1 -1
  258. package/dist/controls/glyphs.js +0 -7
  259. package/dist/controls/index.d.ts +12 -17
  260. package/dist/controls/index.d.ts.map +1 -1
  261. package/dist/controls/index.js +5 -39
  262. package/dist/controls/multi-select-filter.d.ts +4 -3
  263. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  264. package/dist/controls/number-filter.d.ts +4 -3
  265. package/dist/controls/number-filter.d.ts.map +1 -1
  266. package/dist/controls/number-filter.js +3 -1
  267. package/dist/controls/range-filter.d.ts +4 -3
  268. package/dist/controls/range-filter.d.ts.map +1 -1
  269. package/dist/controls/search-filter.d.ts +4 -3
  270. package/dist/controls/search-filter.d.ts.map +1 -1
  271. package/dist/controls/search-filter.js +19 -14
  272. package/dist/controls/select-filter.d.ts +4 -3
  273. package/dist/controls/select-filter.d.ts.map +1 -1
  274. package/dist/controls/sync-button.d.ts.map +1 -1
  275. package/dist/controls/sync-button.js +12 -15
  276. package/dist/controls/toggle-filter.d.ts +4 -3
  277. package/dist/controls/toggle-filter.d.ts.map +1 -1
  278. package/dist/controls/uncontrolled.d.ts +12 -0
  279. package/dist/controls/uncontrolled.d.ts.map +1 -0
  280. package/dist/controls/view-tabs.d.ts +2 -2
  281. package/dist/controls/view-tabs.d.ts.map +1 -1
  282. package/dist/controls-dates/index.d.ts +0 -1
  283. package/dist/controls-dates/index.d.ts.map +1 -1
  284. package/dist/dashboard/index.d.ts +7 -9
  285. package/dist/dashboard/index.d.ts.map +1 -1
  286. package/dist/dashboard/index.js +3 -23
  287. package/dist/dashboard/section.d.ts +4 -6
  288. package/dist/dashboard/section.d.ts.map +1 -1
  289. package/dist/dashboard/section.js +4 -10
  290. package/dist/dashboard/stat-card.d.ts +4 -4
  291. package/dist/dashboard/stat-card.d.ts.map +1 -1
  292. package/dist/dashboard/stat-card.js +3 -3
  293. package/dist/dashboard/widget-header.module.css +9 -7
  294. package/dist/dev-dock.d.ts.map +1 -1
  295. package/dist/dev-dock.js +6 -1
  296. package/dist/format/date.d.ts +0 -34
  297. package/dist/format/date.d.ts.map +1 -1
  298. package/dist/format/date.js +0 -54
  299. package/dist/format/index.d.ts +7 -22
  300. package/dist/format/index.d.ts.map +1 -1
  301. package/dist/format/index.js +2 -43
  302. package/dist/format/number.d.ts +3 -14
  303. package/dist/format/number.d.ts.map +1 -1
  304. package/dist/format/number.js +0 -13
  305. package/dist/format/shared.d.ts +2 -3
  306. package/dist/format/shared.d.ts.map +1 -1
  307. package/dist/forms/index.d.ts +0 -11
  308. package/dist/forms/index.d.ts.map +1 -1
  309. package/dist/forms/index.js +1 -14
  310. package/dist/guard/index.d.ts +6 -21
  311. package/dist/guard/index.d.ts.map +1 -1
  312. package/dist/guard/index.js +27 -115
  313. package/dist/guard/types.d.ts +7 -18
  314. package/dist/guard/types.d.ts.map +1 -1
  315. package/dist/index.d.ts +16 -48
  316. package/dist/index.d.ts.map +1 -1
  317. package/dist/index.js +21 -117
  318. package/dist/provider/create-router.d.ts +44 -0
  319. package/dist/provider/create-router.d.ts.map +1 -0
  320. package/dist/provider/create-router.js +62 -0
  321. package/dist/provider/hotkeys.d.ts +8 -0
  322. package/dist/provider/hotkeys.d.ts.map +1 -0
  323. package/dist/provider/hotkeys.js +50 -0
  324. package/dist/provider/index.d.ts +33 -110
  325. package/dist/provider/index.d.ts.map +1 -1
  326. package/dist/provider/index.js +182 -82
  327. package/dist/provider/lab-theme.d.ts.map +1 -1
  328. package/dist/provider/route-transition.d.ts +76 -0
  329. package/dist/provider/route-transition.d.ts.map +1 -0
  330. package/dist/provider/route-transition.js +98 -0
  331. package/dist/provider/spotlight-actions.d.ts +10 -0
  332. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  333. package/dist/provider/spotlight-actions.js +55 -0
  334. package/dist/provider/test-router.d.ts +6 -0
  335. package/dist/provider/test-router.d.ts.map +1 -0
  336. package/dist/provider/test-router.js +18 -0
  337. package/dist/query-client.d.ts +4 -20
  338. package/dist/query-client.d.ts.map +1 -1
  339. package/dist/query-client.js +2 -2
  340. package/dist/router-tanstack/index.d.ts +18 -64
  341. package/dist/router-tanstack/index.d.ts.map +1 -1
  342. package/dist/router-tanstack/index.js +2 -16
  343. package/dist/router-tanstack/nav.d.ts +12 -1
  344. package/dist/router-tanstack/nav.d.ts.map +1 -1
  345. package/dist/router-tanstack/nav.js +8 -1
  346. package/dist/router-tanstack/search-store.d.ts +1 -1
  347. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  348. package/dist/router-tanstack/use-nav.d.ts +8 -9
  349. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  350. package/dist/router-tanstack/use-nav.js +20 -1
  351. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  352. package/dist/shell/app-sidebar.js +1 -1
  353. package/dist/shell/index.d.ts +31 -10
  354. package/dist/shell/index.d.ts.map +1 -1
  355. package/dist/shell/index.js +14 -3
  356. package/dist/shell/page-aside.d.ts +2 -2
  357. package/dist/shell/page-aside.d.ts.map +1 -1
  358. package/dist/shell/page-aside.js +31 -12
  359. package/dist/shell/page-bar.d.ts +2 -2
  360. package/dist/shell/page-bar.d.ts.map +1 -1
  361. package/dist/shell/page-bar.js +1 -1
  362. package/dist/state.d.ts +10 -12
  363. package/dist/state.d.ts.map +1 -1
  364. package/dist/state.js +4 -6
  365. package/dist/styles.css +107 -7
  366. package/dist/surfaces.d.ts +28 -103
  367. package/dist/surfaces.d.ts.map +1 -1
  368. package/dist/surfaces.js +54 -143
  369. package/dist/{data → table}/data-table-state.d.ts +1 -1
  370. package/dist/table/data-table-state.d.ts.map +1 -0
  371. package/dist/{data → table}/data-table-state.js +4 -3
  372. package/dist/{data → table}/data-table.d.ts +28 -49
  373. package/dist/table/data-table.d.ts.map +1 -0
  374. package/dist/{data → table}/data-table.js +74 -60
  375. package/dist/table/index.d.ts +18 -0
  376. package/dist/table/index.d.ts.map +1 -0
  377. package/dist/{data/table.js → table/index.js} +1 -1
  378. package/dist/table/query-branch.d.ts.map +1 -0
  379. package/dist/table/table-features.d.ts +69 -0
  380. package/dist/table/table-features.d.ts.map +1 -0
  381. package/dist/table/table-features.js +49 -0
  382. package/dist/telemetry.d.ts +77 -0
  383. package/dist/telemetry.d.ts.map +1 -0
  384. package/dist/telemetry.js +33 -0
  385. package/dist/theme/index.d.ts +10 -21
  386. package/dist/theme/index.d.ts.map +1 -1
  387. package/dist/theme/index.js +3 -14
  388. package/dist/theme/theme-toggle.d.ts.map +1 -1
  389. package/dist/theme/theme-toggle.js +7 -33
  390. package/dist/theme/theme-toggle.module.css +30 -0
  391. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  392. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  393. package/dist/theme-lab/derive-controls.js +5 -3
  394. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  395. package/dist/theme-lab/derive-state.js +2 -1
  396. package/dist/tokens/core.d.ts +360 -0
  397. package/dist/tokens/core.d.ts.map +1 -0
  398. package/dist/tokens/core.js +708 -0
  399. package/dist/tokens/derive.d.ts +1 -1
  400. package/dist/tokens/derive.d.ts.map +1 -1
  401. package/dist/tokens/index.d.ts +5 -373
  402. package/dist/tokens/index.d.ts.map +1 -1
  403. package/dist/tokens/index.js +8 -700
  404. package/dist/tokens/palette.d.ts +2 -6
  405. package/dist/tokens/palette.d.ts.map +1 -1
  406. package/dist/tokens/palette.js +1 -4
  407. package/dist/vite.d.ts +4 -3
  408. package/dist/vite.d.ts.map +1 -1
  409. package/llms.txt +43 -85
  410. package/package.json +80 -173
  411. package/src/agent/ai-sdk-transport.ts +57 -37
  412. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  413. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  414. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  415. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  416. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  417. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  418. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  419. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  420. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  421. package/src/agent/error.ts +43 -0
  422. package/src/agent/history.ts +2 -107
  423. package/src/agent/id.ts +4 -5
  424. package/src/agent/index.ts +23 -112
  425. package/src/agent/outcome.ts +3 -56
  426. package/src/agent/part-list.tsx +3 -3
  427. package/src/agent/parts.ts +23 -22
  428. package/src/agent/run-committer.ts +64 -0
  429. package/src/agent/run-records.ts +147 -0
  430. package/src/agent/thread.ts +24 -231
  431. package/src/agent/transport.ts +6 -96
  432. package/src/agent/use-agent-thread-runs.ts +364 -199
  433. package/src/charts/BandStrip.tsx +276 -0
  434. package/src/charts/Bars.tsx +141 -0
  435. package/src/charts/CartesianChart.tsx +206 -0
  436. package/src/charts/ChartCard.tsx +178 -0
  437. package/src/charts/Donut.tsx +256 -0
  438. package/src/charts/DualPanel.tsx +326 -0
  439. package/src/charts/Heatmap.tsx +282 -0
  440. package/src/charts/Lines.tsx +151 -0
  441. package/src/charts/MirroredBars.tsx +303 -0
  442. package/src/charts/Sparkline.tsx +176 -0
  443. package/src/charts/StackedArea.tsx +80 -0
  444. package/src/charts/box.tsx +96 -0
  445. package/src/charts/card-context.ts +11 -0
  446. package/src/charts/chart-box.module.css +64 -0
  447. package/src/charts/chart-box.module.css.d.ts +12 -0
  448. package/src/charts/chart-card.module.css +25 -0
  449. package/src/charts/chart-card.module.css.d.ts +8 -0
  450. package/src/charts/chart-legend.module.css +38 -0
  451. package/src/charts/chart-legend.module.css.d.ts +10 -0
  452. package/src/charts/compile.ts +585 -0
  453. package/src/charts/cursor.ts +282 -0
  454. package/src/charts/curves.ts +111 -0
  455. package/src/charts/donut.module.css +54 -0
  456. package/src/charts/donut.module.css.d.ts +9 -0
  457. package/src/charts/host.tsx +60 -0
  458. package/src/charts/index.ts +41 -178
  459. package/src/charts/legend.tsx +204 -0
  460. package/src/charts/marks.ts +201 -0
  461. package/src/charts/panel.tsx +227 -0
  462. package/src/charts/scales.ts +237 -0
  463. package/src/charts/sizing.ts +47 -0
  464. package/src/charts/state.tsx +80 -0
  465. package/src/charts/theme.ts +65 -0
  466. package/src/charts/types.ts +242 -0
  467. package/src/cli/audit-allows.ts +8 -30
  468. package/src/cli/config.ts +26 -43
  469. package/src/cli/doctor-upgrade.ts +457 -0
  470. package/src/cli/doctor.ts +89 -72
  471. package/src/cli/help.ts +2 -4
  472. package/src/cli/index.ts +100 -384
  473. package/src/cli/init.ts +60 -51
  474. package/src/cli/sync.ts +13 -68
  475. package/src/cli/tokens-css.ts +7 -28
  476. package/src/commands/ShortcutsHelp.tsx +8 -9
  477. package/src/commands/define-commands.ts +16 -43
  478. package/src/commands/define-overlays.ts +12 -36
  479. package/src/commands/index.ts +11 -94
  480. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  481. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  482. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  483. package/src/commands/notifications/notify.tsx +158 -0
  484. package/src/{notifications → commands/notifications}/store.ts +10 -2
  485. package/src/commands/projectors.ts +5 -225
  486. package/src/commands/shell-bridge.ts +5 -5
  487. package/src/commands/shortcut-format.ts +5 -4
  488. package/src/common/errors.ts +3 -3
  489. package/src/common/use-measured-widths.ts +6 -3
  490. package/src/common/validate.ts +2 -2
  491. package/src/content/article-layout.tsx +37 -38
  492. package/src/content/article-model.ts +1 -84
  493. package/src/content/index.ts +12 -83
  494. package/src/content/markdown.tsx +4 -3
  495. package/src/content/mermaid.tsx +9 -7
  496. package/src/content/slug.ts +1 -16
  497. package/src/content/url-hardening.ts +8 -2
  498. package/src/controls/actions.tsx +24 -1
  499. package/src/controls/enum-filter.tsx +1 -1
  500. package/src/controls/filter-context.tsx +3 -1
  501. package/src/controls/filter-set.tsx +5 -7
  502. package/src/controls/form-layout.tsx +2 -2
  503. package/src/controls/glyphs.tsx +0 -10
  504. package/src/controls/index.ts +13 -64
  505. package/src/controls/multi-select-filter.tsx +5 -4
  506. package/src/controls/number-filter.tsx +8 -4
  507. package/src/controls/range-filter.tsx +5 -4
  508. package/src/controls/search-filter.tsx +25 -19
  509. package/src/controls/select-filter.tsx +5 -4
  510. package/src/controls/sync-button.tsx +18 -20
  511. package/src/controls/toggle-filter.tsx +5 -4
  512. package/src/controls/uncontrolled.ts +12 -0
  513. package/src/controls/view-tabs.tsx +3 -3
  514. package/src/controls-dates/date-range-picker.tsx +1 -1
  515. package/src/controls-dates/index.ts +0 -1
  516. package/src/dashboard/index.ts +7 -48
  517. package/src/dashboard/section.tsx +11 -40
  518. package/src/dashboard/stat-card.tsx +14 -16
  519. package/src/dashboard/widget-header.module.css +9 -7
  520. package/src/dev-dock.tsx +14 -27
  521. package/src/format/date.ts +2 -92
  522. package/src/format/index.ts +7 -53
  523. package/src/format/number.ts +3 -26
  524. package/src/format/shared.ts +2 -3
  525. package/src/forms/index.ts +0 -23
  526. package/src/guard/index.ts +36 -191
  527. package/src/guard/types.ts +6 -19
  528. package/src/index.ts +30 -282
  529. package/src/provider/create-router.tsx +138 -0
  530. package/src/provider/hotkeys.ts +70 -0
  531. package/src/provider/index.tsx +260 -230
  532. package/src/provider/lab-theme.ts +3 -2
  533. package/src/provider/route-transition.ts +199 -0
  534. package/src/provider/spotlight-actions.tsx +69 -0
  535. package/src/provider/test-router.tsx +25 -0
  536. package/src/query-client.ts +4 -22
  537. package/src/router-tanstack/index.ts +18 -112
  538. package/src/router-tanstack/nav.ts +28 -2
  539. package/src/router-tanstack/search-store.ts +9 -2
  540. package/src/router-tanstack/use-nav.ts +47 -13
  541. package/src/shell/app-mobile-nav.tsx +3 -2
  542. package/src/shell/app-sidebar.tsx +1 -1
  543. package/src/shell/aside-docking.ts +1 -1
  544. package/src/shell/index.tsx +61 -20
  545. package/src/shell/page-aside.tsx +47 -23
  546. package/src/shell/page-bar.tsx +3 -3
  547. package/src/shell/page-title.tsx +1 -1
  548. package/src/state.ts +11 -37
  549. package/src/styles.css +107 -7
  550. package/src/surfaces.ts +56 -151
  551. package/src/{data → table}/data-table-state.ts +5 -4
  552. package/src/{data → table}/data-table.tsx +170 -161
  553. package/src/table/index.ts +18 -0
  554. package/src/table/table-features.ts +102 -0
  555. package/src/telemetry.ts +110 -0
  556. package/src/theme/index.ts +22 -47
  557. package/src/theme/theme-toggle.module.css +30 -0
  558. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  559. package/src/theme/theme-toggle.tsx +15 -43
  560. package/src/theme-lab/derive-controls.tsx +5 -3
  561. package/src/theme-lab/derive-state.ts +2 -1
  562. package/src/tokens/core.ts +1163 -0
  563. package/src/tokens/derive.ts +1 -1
  564. package/src/tokens/index.ts +14 -1181
  565. package/src/tokens/palette.ts +3 -7
  566. package/src/vite.ts +3 -3
  567. package/agent/templates/query-client.ts.tpl +0 -26
  568. package/dist/agent/adapter.d.ts +0 -150
  569. package/dist/agent/adapter.d.ts.map +0 -1
  570. package/dist/agent/adapter.js +0 -482
  571. package/dist/agent/use-agent-stream.d.ts +0 -35
  572. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  573. package/dist/agent/use-agent-stream.js +0 -59
  574. package/dist/agent-chat/composer.d.ts.map +0 -1
  575. package/dist/agent-chat/index.d.ts +0 -31
  576. package/dist/agent-chat/index.d.ts.map +0 -1
  577. package/dist/agent-chat/index.js +0 -19
  578. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  579. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  580. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  581. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  582. package/dist/agent-chat/thread-detail-panel.js +0 -115
  583. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  584. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  585. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  586. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  587. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  588. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  589. package/dist/agent-chat/thread-workspace.js +0 -153
  590. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  591. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  592. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  593. package/dist/charts/cursor/resolve.d.ts +0 -75
  594. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  595. package/dist/charts/cursor/resolve.js +0 -91
  596. package/dist/charts/cursor/scope.d.ts +0 -20
  597. package/dist/charts/cursor/scope.d.ts.map +0 -1
  598. package/dist/charts/cursor/scope.js +0 -20
  599. package/dist/charts/cursor/store.d.ts +0 -35
  600. package/dist/charts/cursor/store.d.ts.map +0 -1
  601. package/dist/charts/cursor/store.js +0 -25
  602. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  603. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  604. package/dist/charts/cursor/touch-pin.js +0 -79
  605. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  606. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  607. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  608. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  609. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  610. package/dist/charts/hooks/use-hysteresis.js +0 -12
  611. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  612. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  613. package/dist/charts/hooks/useBandPlot.js +0 -178
  614. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  615. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  616. package/dist/charts/hooks/useChartCursor.js +0 -200
  617. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  618. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  619. package/dist/charts/hooks/useChartSize.js +0 -8
  620. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  621. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  622. package/dist/charts/kinds/BandStrip.js +0 -241
  623. package/dist/charts/kinds/Bars.d.ts +0 -141
  624. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  625. package/dist/charts/kinds/Bars.js +0 -343
  626. package/dist/charts/kinds/Donut.d.ts +0 -77
  627. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  628. package/dist/charts/kinds/Donut.js +0 -245
  629. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  630. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  631. package/dist/charts/kinds/DualPanel.js +0 -471
  632. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  633. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  634. package/dist/charts/kinds/Heatmap.js +0 -243
  635. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  636. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  637. package/dist/charts/kinds/MirroredBars.js +0 -292
  638. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  639. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  640. package/dist/charts/kinds/MultiLine.js +0 -176
  641. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  642. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  643. package/dist/charts/kinds/StackedArea.js +0 -135
  644. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  645. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  646. package/dist/charts/kinds/ZonedLine.js +0 -155
  647. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  648. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  649. package/dist/charts/kinds/band-chrome.js +0 -71
  650. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  651. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  652. package/dist/charts/kinds/donut-layout.js +0 -52
  653. package/dist/charts/layout/auto-margin.d.ts +0 -122
  654. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  655. package/dist/charts/layout/auto-margin.js +0 -81
  656. package/dist/charts/layout/end-labels.d.ts +0 -64
  657. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  658. package/dist/charts/layout/end-labels.js +0 -76
  659. package/dist/charts/layout/log-ticks.d.ts +0 -27
  660. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  661. package/dist/charts/layout/log-ticks.js +0 -42
  662. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  663. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  664. package/dist/charts/primitives/AreaGradient.js +0 -13
  665. package/dist/charts/primitives/Axes.d.ts +0 -83
  666. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  667. package/dist/charts/primitives/Axes.js +0 -168
  668. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  669. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  670. package/dist/charts/primitives/CartesianChart.js +0 -549
  671. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  672. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  673. package/dist/charts/primitives/ChartCard.js +0 -143
  674. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  675. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  676. package/dist/charts/primitives/ChartFrame.js +0 -241
  677. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  678. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  679. package/dist/charts/primitives/ChartLegend.js +0 -292
  680. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  681. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  682. package/dist/charts/primitives/ChartPending.js +0 -117
  683. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  684. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  685. package/dist/charts/primitives/ChartTooltip.js +0 -197
  686. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  687. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  688. package/dist/charts/primitives/Crosshair.js +0 -23
  689. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  690. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  691. package/dist/charts/primitives/HatchPattern.js +0 -31
  692. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  693. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  694. package/dist/charts/primitives/HoverOverlay.js +0 -72
  695. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  696. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  697. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  698. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  699. package/dist/charts/primitives/XZoneRects.js +0 -65
  700. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  701. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  702. package/dist/charts/primitives/ZoneRects.js +0 -30
  703. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  704. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  705. package/dist/charts/primitives/chart-card-context.js +0 -18
  706. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  707. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  708. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  709. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  710. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  711. package/dist/charts/primitives/chart-layout.js +0 -175
  712. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  713. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  714. package/dist/charts/primitives/chart-tier.js +0 -44
  715. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  716. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  717. package/dist/charts/primitives/legend-disclosure.js +0 -153
  718. package/dist/charts/series.d.ts +0 -189
  719. package/dist/charts/series.d.ts.map +0 -1
  720. package/dist/charts/series.js +0 -84
  721. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  722. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  723. package/dist/charts/sparklines/BarSparkline.js +0 -53
  724. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  725. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  726. package/dist/charts/sparklines/LineSparkline.js +0 -51
  727. package/dist/charts/sparklines/index.d.ts +0 -3
  728. package/dist/charts/sparklines/index.d.ts.map +0 -1
  729. package/dist/charts/sparklines/index.js +0 -6
  730. package/dist/charts/utils/domain.d.ts +0 -35
  731. package/dist/charts/utils/domain.d.ts.map +0 -1
  732. package/dist/charts/utils/domain.js +0 -12
  733. package/dist/charts/utils/format.d.ts +0 -8
  734. package/dist/charts/utils/format.d.ts.map +0 -1
  735. package/dist/charts/utils/format.js +0 -20
  736. package/dist/charts/utils/measure-text.d.ts +0 -25
  737. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  738. package/dist/charts/utils/measure-text.js +0 -64
  739. package/dist/charts/utils/ticks.d.ts +0 -103
  740. package/dist/charts/utils/ticks.d.ts.map +0 -1
  741. package/dist/charts/utils/ticks.js +0 -92
  742. package/dist/commands/overlays-mount.d.ts +0 -122
  743. package/dist/commands/overlays-mount.d.ts.map +0 -1
  744. package/dist/commands/overlays-mount.js +0 -125
  745. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  746. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  747. package/dist/commands/useCommandHotkeys.js +0 -45
  748. package/dist/content/article-actions.d.ts +0 -39
  749. package/dist/content/article-actions.d.ts.map +0 -1
  750. package/dist/content/article-actions.js +0 -28
  751. package/dist/content/article-card.d.ts +0 -58
  752. package/dist/content/article-card.d.ts.map +0 -1
  753. package/dist/content/article-card.js +0 -79
  754. package/dist/content/article-card.module.css +0 -111
  755. package/dist/content/mdx.d.ts +0 -20
  756. package/dist/content/mdx.d.ts.map +0 -1
  757. package/dist/content/mdx.js +0 -64
  758. package/dist/controls/compare-filter.d.ts +0 -42
  759. package/dist/controls/compare-filter.d.ts.map +0 -1
  760. package/dist/controls/compare-filter.js +0 -38
  761. package/dist/controls/slider-control.d.ts +0 -36
  762. package/dist/controls/slider-control.d.ts.map +0 -1
  763. package/dist/controls/slider-control.js +0 -64
  764. package/dist/dashboard/widget-grid.d.ts +0 -27
  765. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  766. package/dist/dashboard/widget-grid.js +0 -40
  767. package/dist/dashboard/widget-grid.module.css +0 -69
  768. package/dist/data/data-table-state.d.ts.map +0 -1
  769. package/dist/data/data-table.d.ts.map +0 -1
  770. package/dist/data/query-branch.d.ts.map +0 -1
  771. package/dist/data/table.d.ts +0 -24
  772. package/dist/data/table.d.ts.map +0 -1
  773. package/dist/data/virtual-list.d.ts +0 -133
  774. package/dist/data/virtual-list.d.ts.map +0 -1
  775. package/dist/data/virtual-list.js +0 -157
  776. package/dist/data/virtual.d.ts +0 -21
  777. package/dist/data/virtual.d.ts.map +0 -1
  778. package/dist/data/virtual.js +0 -4
  779. package/dist/forms/FormErrorSummary.d.ts +0 -30
  780. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  781. package/dist/forms/FormErrorSummary.js +0 -30
  782. package/dist/forms/use-field-array.d.ts +0 -60
  783. package/dist/forms/use-field-array.d.ts.map +0 -1
  784. package/dist/forms/use-field-array.js +0 -20
  785. package/dist/forms/use-form-draft.d.ts +0 -76
  786. package/dist/forms/use-form-draft.d.ts.map +0 -1
  787. package/dist/forms/use-form-draft.js +0 -92
  788. package/dist/forms/use-form-submit.d.ts +0 -88
  789. package/dist/forms/use-form-submit.d.ts.map +0 -1
  790. package/dist/forms/use-form-submit.js +0 -63
  791. package/dist/notifications/bell.d.ts.map +0 -1
  792. package/dist/notifications/center.d.ts.map +0 -1
  793. package/dist/notifications/define-notifications.d.ts.map +0 -1
  794. package/dist/notifications/index.d.ts +0 -40
  795. package/dist/notifications/index.d.ts.map +0 -1
  796. package/dist/notifications/index.js +0 -54
  797. package/dist/notifications/mount-guard.d.ts +0 -8
  798. package/dist/notifications/mount-guard.d.ts.map +0 -1
  799. package/dist/notifications/mount-guard.js +0 -18
  800. package/dist/notifications/notify.d.ts +0 -149
  801. package/dist/notifications/notify.d.ts.map +0 -1
  802. package/dist/notifications/notify.js +0 -171
  803. package/dist/notifications/store.d.ts.map +0 -1
  804. package/dist/provider/connectivity-indicator.d.ts +0 -13
  805. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  806. package/dist/provider/connectivity-indicator.js +0 -205
  807. package/dist/provider/connectivity-provider.d.ts +0 -7
  808. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  809. package/dist/provider/connectivity-provider.js +0 -128
  810. package/dist/provider/connectivity-types.d.ts +0 -36
  811. package/dist/provider/connectivity-types.d.ts.map +0 -1
  812. package/dist/provider/use-connectivity.d.ts +0 -3
  813. package/dist/provider/use-connectivity.d.ts.map +0 -1
  814. package/dist/provider/use-connectivity.js +0 -14
  815. package/dist/query-devtools.d.ts +0 -21
  816. package/dist/query-devtools.d.ts.map +0 -1
  817. package/dist/query-devtools.js +0 -13
  818. package/src/agent/adapter.ts +0 -945
  819. package/src/agent/use-agent-stream.ts +0 -154
  820. package/src/agent-chat/index.ts +0 -54
  821. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  822. package/src/agent-chat/thread-workspace.tsx +0 -279
  823. package/src/charts/cursor/resolve.ts +0 -198
  824. package/src/charts/cursor/scope.tsx +0 -35
  825. package/src/charts/cursor/store.ts +0 -58
  826. package/src/charts/cursor/touch-pin.ts +0 -138
  827. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  828. package/src/charts/hooks/use-hysteresis.ts +0 -26
  829. package/src/charts/hooks/useBandPlot.ts +0 -383
  830. package/src/charts/hooks/useChartCursor.ts +0 -367
  831. package/src/charts/hooks/useChartSize.ts +0 -35
  832. package/src/charts/kinds/BandStrip.tsx +0 -449
  833. package/src/charts/kinds/Bars.tsx +0 -589
  834. package/src/charts/kinds/Donut.tsx +0 -368
  835. package/src/charts/kinds/DualPanel.tsx +0 -712
  836. package/src/charts/kinds/Heatmap.tsx +0 -396
  837. package/src/charts/kinds/MirroredBars.tsx +0 -469
  838. package/src/charts/kinds/MultiLine.tsx +0 -322
  839. package/src/charts/kinds/StackedArea.tsx +0 -267
  840. package/src/charts/kinds/ZonedLine.tsx +0 -301
  841. package/src/charts/kinds/band-chrome.tsx +0 -91
  842. package/src/charts/kinds/donut-layout.ts +0 -82
  843. package/src/charts/layout/auto-margin.ts +0 -242
  844. package/src/charts/layout/end-labels.ts +0 -135
  845. package/src/charts/layout/log-ticks.ts +0 -90
  846. package/src/charts/primitives/AreaGradient.tsx +0 -26
  847. package/src/charts/primitives/Axes.tsx +0 -271
  848. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  849. package/src/charts/primitives/ChartCard.tsx +0 -280
  850. package/src/charts/primitives/ChartFrame.tsx +0 -493
  851. package/src/charts/primitives/ChartLegend.tsx +0 -422
  852. package/src/charts/primitives/ChartPending.tsx +0 -243
  853. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  854. package/src/charts/primitives/Crosshair.tsx +0 -43
  855. package/src/charts/primitives/HatchPattern.tsx +0 -55
  856. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  857. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  858. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  859. package/src/charts/primitives/XZoneRects.tsx +0 -132
  860. package/src/charts/primitives/ZoneRects.tsx +0 -67
  861. package/src/charts/primitives/chart-card-context.ts +0 -46
  862. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  863. package/src/charts/primitives/chart-layout.ts +0 -318
  864. package/src/charts/primitives/chart-tier.tsx +0 -76
  865. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  866. package/src/charts/series.ts +0 -276
  867. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  868. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  869. package/src/charts/sparklines/index.ts +0 -2
  870. package/src/charts/theme.tsx +0 -53
  871. package/src/charts/utils/domain.ts +0 -41
  872. package/src/charts/utils/format.ts +0 -19
  873. package/src/charts/utils/measure-text.ts +0 -109
  874. package/src/charts/utils/ticks.ts +0 -239
  875. package/src/commands/overlays-mount.tsx +0 -333
  876. package/src/commands/useCommandHotkeys.ts +0 -114
  877. package/src/content/article-actions.ts +0 -72
  878. package/src/content/article-card.module.css +0 -111
  879. package/src/content/article-card.tsx +0 -174
  880. package/src/content/mdx.tsx +0 -127
  881. package/src/controls/compare-filter.tsx +0 -81
  882. package/src/controls/slider-control.tsx +0 -159
  883. package/src/dashboard/widget-grid.module.css +0 -69
  884. package/src/dashboard/widget-grid.tsx +0 -146
  885. package/src/data/table.ts +0 -39
  886. package/src/data/virtual-list.tsx +0 -356
  887. package/src/data/virtual.ts +0 -26
  888. package/src/forms/FormErrorSummary.tsx +0 -71
  889. package/src/forms/use-field-array.ts +0 -94
  890. package/src/forms/use-form-draft.ts +0 -262
  891. package/src/forms/use-form-submit.ts +0 -199
  892. package/src/notifications/index.ts +0 -88
  893. package/src/notifications/mount-guard.ts +0 -38
  894. package/src/notifications/notify.tsx +0 -379
  895. package/src/provider/connectivity-indicator.tsx +0 -267
  896. package/src/provider/connectivity-provider.tsx +0 -189
  897. package/src/provider/connectivity-types.ts +0 -42
  898. package/src/provider/use-connectivity.ts +0 -26
  899. package/src/query-devtools.tsx +0 -40
  900. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  901. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  902. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  903. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  904. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  905. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  906. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  907. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  908. /package/dist/{data → table}/data-table.module.css +0 -0
  909. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  910. /package/dist/{data → table}/query-branch.d.ts +0 -0
  911. /package/dist/{data → table}/query-branch.js +0 -0
  912. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  913. /package/src/{data → table}/data-table.module.css +0 -0
  914. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  915. /package/src/{data → table}/query-branch.ts +0 -0
@@ -8,10 +8,6 @@
8
8
  * but do NOT let the runtime throw, or one malformed chunk kills the whole transcript. See
9
9
  * `mergeToolPart`'s default branch for that shape.
10
10
  *
11
- * Eden #231 doctrine: the server-side Elysia route MUST declare `: AsyncGenerator<AgentPart>`
12
- * explicitly and carry NO t.Object/t.Union response schema. Validate at yield-time. See
13
- * agent/rules/basalt-agent.md for the full doctrine.
14
- *
15
11
  * Part identity: every variant carries a stable `id` (see `PartBase`). Transports are permitted to
16
12
  * yield a DRAFT — `id` omitted — via `AgentPartDraft`; the consuming hooks (or `withPartIds`)
17
13
  * normalize a draft into a fully-identified part before it is ever accumulated. `parseAgentPart`
@@ -47,25 +43,28 @@ type PartBase = { readonly id: string }
47
43
  export type StartPart = PartBase & {
48
44
  readonly type: 'start'
49
45
  readonly runId: string
50
- readonly resumeToken?: string
46
+ readonly resumeToken?: string | undefined
51
47
  }
52
48
 
53
49
  /**
54
- * A streamed text fragment from the assistant. `offset` is the character position of this delta
55
- * inside its part (undefined = append at the tail) — the mechanism `mergePart` uses to splice a
56
- * replayed delta in place rather than duplicating it.
50
+ * A streamed text fragment from the assistant. `text` is a DELTA, not the cumulative text: parts
51
+ * sharing an `id` are merged into one, in order. `offset` is the character position in that
52
+ * accumulated text where this delta starts (undefined = append at the tail, which is what a plain
53
+ * transport emits; `aiSdkTransport` sets it to the length already seen). The merge writes `text`
54
+ * over `[offset, offset + text.length)`, so replaying a whole run from `offset: 0` rebuilds the same
55
+ * text instead of duplicating it. An out-of-range offset is clamped, never thrown on.
57
56
  */
58
57
  export type TextPart = PartBase & {
59
58
  readonly type: 'text'
60
59
  readonly text: string
61
- readonly offset?: number
60
+ readonly offset?: number | undefined
62
61
  }
63
62
 
64
63
  /** An internal reasoning/thinking fragment (may be hidden in the UI). Same `offset` mechanism as TextPart. */
65
64
  export type ReasoningPart = PartBase & {
66
65
  readonly type: 'reasoning'
67
66
  readonly text: string
68
- readonly offset?: number
67
+ readonly offset?: number | undefined
69
68
  }
70
69
 
71
70
  // ── ToolCallPart — mirrors AI SDK v7's UIToolInvocation ─────────────────────
@@ -89,18 +88,18 @@ export type ReasoningPart = PartBase & {
89
88
  /** The nested approval envelope — mirrors the SDK's shape verbatim, never flattened. */
90
89
  type ToolApproval = {
91
90
  readonly id: string
92
- readonly approved?: boolean
93
- readonly reason?: string
94
- readonly isAutomatic?: boolean
95
- readonly signature?: string
91
+ readonly approved?: boolean | undefined
92
+ readonly reason?: string | undefined
93
+ readonly isAutomatic?: boolean | undefined
94
+ readonly signature?: string | undefined
96
95
  }
97
96
 
98
97
  type ToolCallBase = PartBase & {
99
98
  readonly type: 'tool'
100
99
  readonly toolName: string
101
100
  /** Wall-clock time from first sighting of this toolCallId to its terminal state. */
102
- readonly durationMs?: number
103
- readonly providerExecuted?: boolean
101
+ readonly durationMs?: number | undefined
102
+ readonly providerExecuted?: boolean | undefined
104
103
  }
105
104
 
106
105
  /**
@@ -134,7 +133,7 @@ type Identified = ToolCallBase & { readonly toolCallId: string }
134
133
  * test that built one. A `''` toolCallId is not a value any state accepts; `parseToolCallPart`
135
134
  * normalizes one to absent at the wire boundary, so it never reaches the type or a consumer.
136
135
  */
137
- type MaybeIdentified = ToolCallBase & { readonly toolCallId?: string }
136
+ type MaybeIdentified = ToolCallBase & { readonly toolCallId?: string | undefined }
138
137
 
139
138
  export type ToolCallPart =
140
139
  | (Identified & { readonly state: 'input-streaming'; readonly input?: unknown })
@@ -153,8 +152,8 @@ export type ToolCallPart =
153
152
  readonly state: 'output-available'
154
153
  readonly input: unknown
155
154
  readonly output: unknown
156
- readonly preliminary?: boolean
157
- readonly approval?: ToolApproval & { readonly approved?: true }
155
+ readonly preliminary?: boolean | undefined
156
+ readonly approval?: (ToolApproval & { readonly approved?: true }) | undefined
158
157
  })
159
158
  | (MaybeIdentified & {
160
159
  readonly state: 'output-error'
@@ -163,7 +162,7 @@ export type ToolCallPart =
163
162
  readonly errorText: string
164
163
  /** The only place the raw, un-parsed input survives — what lets a UI render a call whose input never validated. */
165
164
  readonly rawInput?: unknown
166
- readonly approval?: ToolApproval & { readonly approved?: true }
165
+ readonly approval?: (ToolApproval & { readonly approved?: true }) | undefined
167
166
  })
168
167
  | (MaybeIdentified & {
169
168
  readonly state: 'output-denied'
@@ -185,7 +184,7 @@ export function isToolCallSettled(part: ToolCallPart): boolean {
185
184
  export type SourcePart = PartBase & {
186
185
  readonly type: 'source'
187
186
  readonly url: string
188
- readonly title?: string
187
+ readonly title?: string | undefined
189
188
  }
190
189
 
191
190
  /** A fatal or recoverable error emitted in-stream by the agent. */
@@ -208,7 +207,9 @@ export type AgentPart = StartPart | TextPart | ReasoningPart | ToolCallPart | So
208
207
  * `Drafted<AgentPart>` is `Drafted<StartPart> | Drafted<TextPart> | ...` rather than one flattened
209
208
  * (and wrong) shape.
210
209
  */
211
- export type Drafted<T> = T extends unknown ? Omit<T, 'id'> & { readonly id?: string } : never
210
+ export type Drafted<T> = T extends unknown
211
+ ? Omit<T, 'id'> & { readonly id?: string | undefined }
212
+ : never
212
213
  export type AgentPartDraft = Drafted<AgentPart>
213
214
 
214
215
  // ── parseAgentPart ───────────────────────────────────────────────────────────
@@ -0,0 +1,64 @@
1
+ /**
2
+ * The commit side of a run: when accumulated parts reach `useAgentThreadRuns`' `runs` state.
3
+ * Mantine-free and React-free so it is testable on its own.
4
+ */
5
+ import type { PartLike } from './merge'
6
+ import type { LiveRunStatus } from './thread'
7
+
8
+ export type RunCommitter<TPart> = {
9
+ /** Queue a commit; `immediate` (or `wait <= 0`) bypasses the window and drops any pending one. */
10
+ readonly push: (parts: TPart[], status: LiveRunStatus, immediate?: boolean) => void
11
+ /** Commit the pending snapshot now, if any. */
12
+ readonly flush: () => void
13
+ /** Drop the pending snapshot and its timer. */
14
+ readonly cancel: () => void
15
+ }
16
+
17
+ /**
18
+ * Leading + trailing throttle over `runs` commits (the semantics of `useChat`'s stable
19
+ * `throttle`): the first push commits at once, pushes inside the window collapse into one trailing
20
+ * commit of the LATEST snapshot.
21
+ */
22
+ export function createRunCommitter<TPart>(
23
+ wait: number,
24
+ commit: (parts: TPart[], status: LiveRunStatus) => void,
25
+ ): RunCommitter<TPart> {
26
+ let timer: ReturnType<typeof setTimeout> | undefined
27
+ let lastCommitAt = Number.NEGATIVE_INFINITY
28
+ let pending: { parts: TPart[]; status: LiveRunStatus } | undefined
29
+
30
+ const clear = (): void => {
31
+ if (timer === undefined) return
32
+ clearTimeout(timer)
33
+ timer = undefined
34
+ }
35
+ const flush = (): void => {
36
+ clear()
37
+ if (pending === undefined) return
38
+ const { parts, status } = pending
39
+ pending = undefined
40
+ lastCommitAt = Date.now()
41
+ commit(parts, status)
42
+ }
43
+ return {
44
+ push(parts, status, immediate = false) {
45
+ pending = { parts, status }
46
+ const windowOpen = timer === undefined && Date.now() - lastCommitAt >= wait
47
+ if (wait <= 0 || immediate || windowOpen) {
48
+ flush()
49
+ return
50
+ }
51
+ timer ??= setTimeout(flush, Math.max(0, wait - (Date.now() - lastCommitAt)))
52
+ },
53
+ flush,
54
+ cancel() {
55
+ clear()
56
+ pending = undefined
57
+ },
58
+ }
59
+ }
60
+
61
+ /** True for the parts that end `'submitted'`: model output, not the synthetic start/source/error. */
62
+ export function isContentPart(part: PartLike): boolean {
63
+ return part.type === 'text' || part.type === 'reasoning' || part.type === 'tool'
64
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * The per-thread run lifecycle of `useAgentThreadRuns`, in ONE record per thread id.
3
+ *
4
+ * The hook used to keep a run's controller, live parts, "final message landed" flag and how it
5
+ * ended in four parallel maps, written at different places, and `runs` (React state, which only
6
+ * mirrors the last flushed render) was consulted for the rest. Every drift between those was a
7
+ * bug: `stop()` deciding from a stale `runs`, a second `stop()` appending twice. Here a run is
8
+ * begun, ended and swept through three functions, so the pieces change together.
9
+ *
10
+ * A record is LIVE while `ended === undefined`; `ended` is written synchronously where a run stops
11
+ * being driven, long before the `setRuns` it queues renders. That window is what the record
12
+ * covers: it outlives the run only until a render shows the outcome (`sweepFlushed`).
13
+ */
14
+
15
+ /** The part of a rendered `runs` entry this module reads. */
16
+ type RenderedRun<TPart> = { readonly status: string; readonly parts: TPart[] }
17
+
18
+ export type RunEnd = 'settled' | 'failed' | 'stopped'
19
+
20
+ export type RunRecord<TPart> = {
21
+ readonly controller: AbortController
22
+ /** The unthrottled accumulator; `runs` may lag it by one throttle window. Emptied when the run ends. */
23
+ parts: TPart[]
24
+ /** The turn's terminal assistant message is in the thread. */
25
+ appended: boolean
26
+ /** `consumeAndFinalize`'s own `resolveOutcome` is in flight. */
27
+ resolving: boolean
28
+ ended: RunEnd | undefined
29
+ /** A newer run began on the same thread (set by `beginRun` on the record it replaces). */
30
+ superseded: boolean
31
+ }
32
+
33
+ export type RunRecords<TPart> = Map<string, RunRecord<TPart>>
34
+
35
+ /** Registers a live run for `threadId`, replacing whatever record the previous run left. */
36
+ export function beginRun<TPart>(
37
+ records: RunRecords<TPart>,
38
+ threadId: string,
39
+ controller: AbortController,
40
+ ): RunRecord<TPart> {
41
+ const record: RunRecord<TPart> = {
42
+ controller,
43
+ parts: [],
44
+ appended: false,
45
+ resolving: false,
46
+ ended: undefined,
47
+ superseded: false,
48
+ }
49
+ const previous = records.get(threadId)
50
+ if (previous !== undefined) previous.superseded = true
51
+ records.set(threadId, record)
52
+ return record
53
+ }
54
+
55
+ /** Marks a run as no longer driven and drops the content it held. */
56
+ export function endRun<TPart>(record: RunRecord<TPart>, reason: RunEnd): void {
57
+ record.ended = reason
58
+ record.parts = []
59
+ }
60
+
61
+ /** True while `controller`'s run is still the thread's live one. */
62
+ export function isLive<TPart>(
63
+ records: RunRecords<TPart>,
64
+ threadId: string,
65
+ controller: AbortController,
66
+ ): boolean {
67
+ const record = records.get(threadId)
68
+ return record?.controller === controller && record.ended === undefined
69
+ }
70
+
71
+ /** What `stop(threadId)` must do. */
72
+ export type StopPlan<TPart> =
73
+ | { readonly kind: 'noop' }
74
+ /** A failed run: only its error entry goes. */
75
+ | { readonly kind: 'dismiss' }
76
+ /** A live run: abort it, persist its parts, settle the thread. */
77
+ | { readonly kind: 'stop'; readonly record: RunRecord<TPart>; readonly parts: TPart[] }
78
+
79
+ /**
80
+ * True while `threadId` has a live (not yet ended) run.
81
+ */
82
+ export function hasLiveRun<TPart>(records: RunRecords<TPart>, threadId: string): boolean {
83
+ const record = records.get(threadId)
84
+ return record !== undefined && record.ended === undefined
85
+ }
86
+
87
+ /**
88
+ * Decides `stop()` from the record, falling back to the rendered `entry` only when no record
89
+ * exists (an unmount re-run — StrictMode, `<Activity>` — clears records while `runs` state
90
+ * survives). A live `entry` with no record is a phantom nothing drives; it is settled once: the
91
+ * ended tombstone record this WRITES (the side effect in the name) makes a second `stop()` in the
92
+ * same tick a no-op.
93
+ */
94
+ export function planStopWithTombstone<TPart>(
95
+ records: RunRecords<TPart>,
96
+ threadId: string,
97
+ entry: RenderedRun<TPart> | undefined,
98
+ ): StopPlan<TPart> {
99
+ const record = records.get(threadId)
100
+ if (record !== undefined) {
101
+ if (record.ended === undefined) return { kind: 'stop', record, parts: record.parts }
102
+ return record.ended === 'failed' ? { kind: 'dismiss' } : { kind: 'noop' }
103
+ }
104
+ if (entry === undefined) return { kind: 'noop' }
105
+ if (entry.status === 'error') return { kind: 'dismiss' }
106
+ const tombstone = beginRun(records, threadId, new AbortController())
107
+ endRun(tombstone, 'stopped')
108
+ return { kind: 'stop', record: tombstone, parts: entry.parts }
109
+ }
110
+
111
+ /** Thread ids whose failed entry `stopAll()` must dismiss: the records AND what `runs` shows. */
112
+ export function failedThreadIds<TPart>(
113
+ records: RunRecords<TPart>,
114
+ runs: ReadonlyMap<string, RenderedRun<TPart>>,
115
+ ): string[] {
116
+ const ids = new Set<string>()
117
+ for (const [threadId, record] of records) if (record.ended === 'failed') ids.add(threadId)
118
+ for (const [threadId, entry] of runs) if (entry.status === 'error') ids.add(threadId)
119
+ return [...ids]
120
+ }
121
+
122
+ /**
123
+ * A failed entry was dismissed: its record has nothing left to cover. (`sweepFlushed` cannot tell
124
+ * "dismissed" from "not rendered yet", so the dismissal itself drops it.)
125
+ */
126
+ export function dismissRun<TPart>(records: RunRecords<TPart>, threadId: string): void {
127
+ if (records.get(threadId)?.ended === 'failed') records.delete(threadId)
128
+ }
129
+
130
+ /** True unless a newer run has taken the thread over since `record` began. */
131
+ export function isLatestRun<TPart>(record: RunRecord<TPart>): boolean {
132
+ return !record.superseded
133
+ }
134
+
135
+ /** Drops the terminal records a render has already caught up with, so ids are not kept forever. */
136
+ export function sweepFlushed<TPart>(
137
+ records: RunRecords<TPart>,
138
+ runs: ReadonlyMap<string, RenderedRun<TPart>>,
139
+ ): void {
140
+ for (const [threadId, record] of records) {
141
+ // A pending resolver still reports to its record (superseded-ness included): keep it.
142
+ if (record.ended === undefined || record.resolving) continue
143
+ const shown = runs.get(threadId)
144
+ const flushed = record.ended === 'failed' ? shown?.status === 'error' : shown === undefined
145
+ if (flushed) records.delete(threadId)
146
+ }
147
+ }
@@ -1,30 +1,5 @@
1
- /**
2
- * createThreadsStore — persisted, ring-buffered multi-thread registry on createPersistedState.
3
- *
4
- * Mirrors createChatHistoryStore's shape but one level up: instead of a single message list,
5
- * this tracks many AgentThreads (each carrying its own message list plus a distilled
6
- * AgentOutcome for feed rendering). Threads are stored NEWEST-FIRST so index 0 is always the
7
- * most recent. Both threads and each thread's messages are ring-buffered independently.
8
- *
9
- * SSR-safe: the underlying createPersistedState handles the server snapshot (returns initial).
10
- * Cross-tab: the 'storage' event propagates changes to other tabs automatically.
11
- *
12
- * @example
13
- * import { createThreadsStore } from 'basalt-ui/agent'
14
- *
15
- * // Call once at module scope with a stable key:
16
- * const useThreads = createThreadsStore({ key: 'main-threads', version: 1 })
17
- *
18
- * // In a component:
19
- * function ThreadFeed() {
20
- * const { threads, activeId, select, create } = useThreads()
21
- * // ...
22
- * }
23
- */
24
- import { useCallback, useRef } from 'react'
25
- import { createPersistedState } from '../state'
1
+ /** AgentThread / ThreadsStore — the thread contract a consumer-owned store implements. */
26
2
  import type { ChatMessage } from './history'
27
- import { mintThreadId } from './id'
28
3
  import type { AgentOutcome } from './outcome'
29
4
  import type { AgentPart } from './parts'
30
5
 
@@ -37,9 +12,9 @@ import type { AgentPart } from './parts'
37
12
  * `'pending'`/`'streaming'` when `useAgentThreadRuns` mounts with no live run for it (e.g. after a
38
13
  * reload mid-stream) — see `useAgentThreadRuns`'s mount-reconciliation effect.
39
14
  *
40
- * This is one of THREE overlapping status-shaped unions in the agent layer: `StreamStatus`
41
- * (single-turn stream lifecycle, `./use-agent-stream`), this `ThreadStatus` (persisted thread
42
- * lifecycle), and `AgentOutcome['status']` (`./outcome` — the terminal `'done' | 'attention' |
15
+ * This is one of THREE overlapping status-shaped unions in the agent layer: the internal
16
+ * `StreamStatus` (single-turn stream lifecycle, below), this `ThreadStatus`
17
+ * (persisted thread lifecycle), and `AgentOutcome['status']` (`./outcome` — the terminal `'done' | 'attention' |
43
18
  * 'error'` subset of this union, once a turn has settled). Vocabulary note: `StreamStatus`'s
44
19
  * `'idle'` (no turn in flight) corresponds to this union's `'pending'` (thread created, no turn
45
20
  * started yet) — the literal rename is intentionally deferred, see `AgentOutcome['status']`'s doc.
@@ -76,7 +51,7 @@ export type AgentThread<TPart = AgentPart> = {
76
51
  * useAgentThreadRuns to attempt resumption after a disconnected reload. Cleared once the run
77
52
  * finalizes.
78
53
  */
79
- readonly resumeToken?: string
54
+ readonly resumeToken?: string | undefined
80
55
  /**
81
56
  * Freeform consumer metadata (e.g. `{ source: 'sidebar' }`, `{ model: 'gpt-5' }`) — set once at
82
57
  * `create()` time and otherwise opaque to this store. Intentionally untyped: the framework has
@@ -91,27 +66,7 @@ export type AgentThread<TPart = AgentPart> = {
91
66
  * Revisit trigger: promote this to a `TMeta` generic only once a real consumer needs typed,
92
67
  * validated meta (not just a documented convention) — don't add the generic speculatively.
93
68
  */
94
- readonly meta?: Record<string, unknown>
95
- }
96
-
97
- // ── createThreadsStore options ────────────────────────────────────────────────
98
-
99
- export type ThreadsStoreOptions = {
100
- /** localStorage key (namespaced as `basalt:<key>`). Stable — changes key lose history. */
101
- readonly key: string
102
- /** Envelope version. Increment when the AgentThread shape changes to clear old data. */
103
- readonly version: number
104
- /**
105
- * Maximum number of threads to retain. Oldest threads (end of the newest-first array) are
106
- * dropped when exceeded.
107
- * @default 50
108
- */
109
- readonly maxThreads?: number
110
- /**
111
- * Maximum number of messages to retain per thread. Oldest messages are dropped when exceeded.
112
- * @default 100
113
- */
114
- readonly maxMessagesPerThread?: number
69
+ readonly meta?: Record<string, unknown> | undefined
115
70
  }
116
71
 
117
72
  // ── Return type of the factory hook ──────────────────────────────────────────
@@ -124,7 +79,7 @@ export type ThreadsStore<TPart = AgentPart> = {
124
79
  /** Select a thread as active (or clear the selection with null). */
125
80
  readonly select: (id: string | null) => void
126
81
  /** Create a new thread, prepend it, and return its id. Does not change activeId. */
127
- readonly create: (opts?: { readonly meta?: Record<string, unknown> }) => string
82
+ readonly create: (opts?: { readonly meta?: Record<string, unknown> | undefined }) => string
128
83
  /** Append a message to a thread. Trims to maxMessagesPerThread (ring-buffer: drops oldest). */
129
84
  readonly appendMessage: (id: string, message: ChatMessage<TPart>) => void
130
85
  /** Set a thread's distilled outcome. Bumps updatedAt. */
@@ -140,197 +95,35 @@ export type ThreadsStore<TPart = AgentPart> = {
140
95
  /** Remove all threads and clear the active selection. */
141
96
  readonly clear: () => void
142
97
  /**
143
- * Whether `threads` reflects the backing store yet. Always `true` for the localStorage store
144
- * (createPersistedState resolves synchronously); meaningful only for an async, server-backed
145
- * store built with `createAdapterThreadsStore` (./adapter), where it stays `false` until the
146
- * first `listThreads` SUCCEEDS. Pair it with `error` — `!hydrated && error !== undefined` is a
98
+ * Whether `threads` reflects the backing store yet. Always `true` for a synchronous store;
99
+ * meaningful only for an async, server-backed store, where it stays `false` until the first
100
+ * `listThreads` SUCCEEDS. Pair it with `error` — `!hydrated && error !== undefined` is a
147
101
  * failed load, `!hydrated && error === undefined` is still loading.
148
102
  *
149
- * Gating an empty state on this is the CALLER's job when hand-assembling `ThreadFeed` /
150
- * `ThreadDetailPanel`; the shipped `ThreadWorkspace` already does it internally, so an
151
- * async store never flashes "no threads yet" through it before it actually knows.
103
+ * Gating an empty state on this is the CALLER's job when rendering `ThreadFeed`, so an async
104
+ * store never flashes "no threads yet" before it actually knows.
152
105
  */
153
106
  readonly hydrated: boolean
154
107
  /**
155
- * The most recent persistence failure, or `undefined`. Always `undefined` for the localStorage
156
- * store, which has no failure the caller can act on. An async store surfaces the rejected
108
+ * The most recent persistence failure, or `undefined`. Always `undefined` for a synchronous
109
+ * local store, which has no failure the caller can act on. An async store surfaces the rejected
157
110
  * load/write here after rolling its optimistic edit back.
158
111
  */
159
112
  readonly error: unknown
160
113
  }
161
114
 
162
- // ── createThreadsStore ────────────────────────────────────────────────────────
163
-
164
115
  /**
165
- * Creates a stable persisted multi-thread hook for the given key + version.
166
- *
167
- * Call this ONCE per module (not inside a component). The returned hook can be called in any
168
- * component that needs access to the same thread registry. All instances sharing the same key
169
- * stay in sync across tabs via the 'storage' event.
170
- *
171
- * @example
172
- * // src/chat/threads.ts — ONE stable creation per key:
173
- * export const useThreads = createThreadsStore({ key: 'main-threads', version: 1 })
174
- *
175
- * // In a component:
176
- * const { threads, activeId, select, create, appendMessage } = useThreads()
177
- * const id = create({ meta: { source: 'sidebar' } })
178
- * appendMessage(id, { id: crypto.randomUUID(), role: 'user', parts: [...], createdAt: Date.now() })
116
+ * The live status of one in-flight stream, as the chat rows render it. Not exported from the `./agent`
117
+ * barrel (the chat UI imports it from this module); consumers derive it from `ThreadFeedRow`'s `liveStatus` prop. `'submitted'` is a turn
118
+ * sent but not yet producing content: the chat rows treat it as live (Stop shows, the composer is
119
+ * gated) exactly like `'streaming'`.
179
120
  */
180
- export function createThreadsStore<TPart = AgentPart>(
181
- opts: ThreadsStoreOptions,
182
- ): () => ThreadsStore<TPart> {
183
- const maxThreads = opts.maxThreads ?? 50
184
- const maxMessages = opts.maxMessagesPerThread ?? 100
185
-
186
- type Persisted = { threads: AgentThread<TPart>[]; activeId: string | null }
187
-
188
- const usePersistedThreads = createPersistedState<Persisted>({
189
- key: opts.key,
190
- version: opts.version,
191
- initial: { threads: [], activeId: null },
192
- })
193
-
194
- return function useThreadsStore(): ThreadsStore<TPart> {
195
- const [state, setState] = usePersistedThreads()
196
-
197
- // Ref mirrors the latest committed value so that two synchronous action calls in one
198
- // render cycle accumulate correctly. createPersistedState's setter is a whole-value setter
199
- // (not a functional updater), so the second call would otherwise overwrite the first.
200
- const ref = useRef(state)
201
- ref.current = state
202
-
203
- const commit = useCallback(
204
- (next: Persisted): void => {
205
- ref.current = next // sync so a second action in the same tick sees the update
206
- setState(next)
207
- },
208
- [setState],
209
- )
210
-
211
- const select = useCallback(
212
- (id: string | null): void => {
213
- commit({ ...ref.current, activeId: id })
214
- },
215
- [commit],
216
- )
217
-
218
- const create = useCallback(
219
- (createOpts?: { readonly meta?: Record<string, unknown> }): string => {
220
- const id = mintThreadId()
221
- const now = Date.now()
222
- const thread: AgentThread<TPart> = {
223
- id,
224
- messages: [],
225
- outcome: null,
226
- status: 'pending',
227
- read: false,
228
- createdAt: now,
229
- updatedAt: now,
230
- ...(createOpts?.meta !== undefined ? { meta: createOpts.meta } : {}),
231
- }
232
- const threads = [thread, ...ref.current.threads]
233
- // Ring-buffer: drop the oldest threads (the tail) when over maxThreads.
234
- const trimmed = threads.length > maxThreads ? threads.slice(0, maxThreads) : threads
235
- commit({ ...ref.current, threads: trimmed })
236
- return id
237
- },
238
- [commit],
239
- )
240
-
241
- const appendMessage = useCallback(
242
- (id: string, message: ChatMessage<TPart>): void => {
243
- const threads = ref.current.threads.map((thread) => {
244
- if (thread.id !== id) return thread
245
- const messages = [...thread.messages, message]
246
- // Ring-buffer: trim to maxMessages, dropping oldest entries first.
247
- const trimmed =
248
- messages.length > maxMessages ? messages.slice(messages.length - maxMessages) : messages
249
- return { ...thread, messages: trimmed, updatedAt: Date.now() }
250
- })
251
- commit({ ...ref.current, threads })
252
- },
253
- [commit],
254
- )
255
-
256
- const setOutcome = useCallback(
257
- (id: string, outcome: AgentOutcome): void => {
258
- const threads = ref.current.threads.map((thread) =>
259
- thread.id === id ? { ...thread, outcome, updatedAt: Date.now() } : thread,
260
- )
261
- commit({ ...ref.current, threads })
262
- },
263
- [commit],
264
- )
265
-
266
- const setStatus = useCallback(
267
- (id: string, status: ThreadStatus): void => {
268
- const threads = ref.current.threads.map((thread) =>
269
- thread.id === id ? { ...thread, status, updatedAt: Date.now() } : thread,
270
- )
271
- commit({ ...ref.current, threads })
272
- },
273
- [commit],
274
- )
275
-
276
- const setResumeToken = useCallback(
277
- (id: string, token: string | undefined): void => {
278
- const threads = ref.current.threads.map((thread) => {
279
- if (thread.id !== id) return thread
280
- // exactOptionalPropertyTypes: drop the key entirely to clear it rather than assigning
281
- // `resumeToken: undefined` (which the optional-but-not-nullable type disallows).
282
- const { resumeToken: _resumeToken, ...rest } = thread
283
- return {
284
- ...rest,
285
- ...(token !== undefined ? { resumeToken: token } : {}),
286
- updatedAt: Date.now(),
287
- }
288
- })
289
- commit({ ...ref.current, threads })
290
- },
291
- [commit],
292
- )
293
-
294
- const markRead = useCallback(
295
- (id: string): void => {
296
- const threads = ref.current.threads.map((thread) =>
297
- thread.id === id ? { ...thread, read: true } : thread,
298
- )
299
- commit({ ...ref.current, threads })
300
- },
301
- [commit],
302
- )
303
-
304
- const remove = useCallback(
305
- (id: string): void => {
306
- const threads = ref.current.threads.filter((thread) => thread.id !== id)
307
- const activeId = ref.current.activeId === id ? null : ref.current.activeId
308
- commit({ threads, activeId })
309
- },
310
- [commit],
311
- )
121
+ export type StreamStatus = 'idle' | 'submitted' | 'streaming' | 'done' | 'error'
312
122
 
313
- const clear = useCallback((): void => {
314
- commit({ threads: [], activeId: null })
315
- }, [commit])
123
+ /** The two states a turn is in flight in. */
124
+ export type LiveRunStatus = Extract<StreamStatus, 'submitted' | 'streaming'>
316
125
 
317
- return {
318
- threads: state.threads,
319
- activeId: state.activeId,
320
- select,
321
- create,
322
- appendMessage,
323
- setOutcome,
324
- setStatus,
325
- setResumeToken,
326
- markRead,
327
- remove,
328
- clear,
329
- // localStorage resolves synchronously and swallows its own quota errors, so there is never
330
- // a pending load to await nor a failure a caller could act on. See ./adapter for the async
331
- // store where these two carry real information.
332
- hydrated: true,
333
- error: undefined,
334
- }
335
- }
126
+ /** True while a turn is in flight (`'submitted'` or `'streaming'`); `'error'` and the rest are not. */
127
+ export function isLiveStatus(status: StreamStatus | undefined): status is LiveRunStatus {
128
+ return status === 'submitted' || status === 'streaming'
336
129
  }