basalt-ui 1.41.0 → 2.0.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 (914) hide show
  1. package/AGENTS.md +46 -43
  2. package/CHANGELOG.md +535 -518
  3. package/MIGRATING.md +945 -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 +14 -43
  173. package/dist/cli/config.d.ts.map +1 -1
  174. package/dist/cli/doctor-upgrade.d.ts +31 -0
  175. package/dist/cli/doctor-upgrade.d.ts.map +1 -0
  176. package/dist/cli/doctor-upgrade.js +269 -0
  177. package/dist/cli/doctor.d.ts +13 -29
  178. package/dist/cli/doctor.d.ts.map +1 -1
  179. package/dist/cli/doctor.js +51 -9
  180. package/dist/cli/help.d.ts.map +1 -1
  181. package/dist/cli/help.js +2 -4
  182. package/dist/cli/index.d.ts +48 -172
  183. package/dist/cli/index.d.ts.map +1 -1
  184. package/dist/cli/index.js +39 -132
  185. package/dist/cli/init.d.ts.map +1 -1
  186. package/dist/cli/init.js +43 -37
  187. package/dist/cli/sync.d.ts +5 -21
  188. package/dist/cli/sync.d.ts.map +1 -1
  189. package/dist/cli/sync.js +4 -23
  190. package/dist/cli/tokens-css.d.ts +7 -28
  191. package/dist/cli/tokens-css.d.ts.map +1 -1
  192. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  193. package/dist/commands/ShortcutsHelp.js +4 -5
  194. package/dist/commands/define-commands.d.ts +15 -31
  195. package/dist/commands/define-commands.d.ts.map +1 -1
  196. package/dist/commands/define-commands.js +1 -11
  197. package/dist/commands/define-overlays.d.ts +5 -19
  198. package/dist/commands/define-overlays.d.ts.map +1 -1
  199. package/dist/commands/define-overlays.js +3 -11
  200. package/dist/commands/index.d.ts +10 -40
  201. package/dist/commands/index.d.ts.map +1 -1
  202. package/dist/commands/index.js +9 -46
  203. package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
  204. package/dist/commands/notifications/bell.d.ts.map +1 -0
  205. package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
  206. package/dist/commands/notifications/center.d.ts.map +1 -0
  207. package/dist/{notifications → commands/notifications}/center.js +2 -2
  208. package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
  209. package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
  210. package/dist/commands/notifications/notify.d.ts +44 -0
  211. package/dist/commands/notifications/notify.d.ts.map +1 -0
  212. package/dist/commands/notifications/notify.js +79 -0
  213. package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
  214. package/dist/commands/notifications/store.d.ts.map +1 -0
  215. package/dist/{notifications → commands/notifications}/store.js +4 -0
  216. package/dist/commands/projectors.d.ts +1 -131
  217. package/dist/commands/projectors.d.ts.map +1 -1
  218. package/dist/commands/projectors.js +2 -73
  219. package/dist/commands/shell-bridge.d.ts +3 -3
  220. package/dist/commands/shortcut-format.d.ts +5 -4
  221. package/dist/commands/shortcut-format.d.ts.map +1 -1
  222. package/dist/common/errors.d.ts +3 -3
  223. package/dist/common/use-measured-widths.d.ts.map +1 -1
  224. package/dist/common/use-measured-widths.js +5 -3
  225. package/dist/common/validate.d.ts +2 -2
  226. package/dist/content/article-layout.d.ts.map +1 -1
  227. package/dist/content/article-layout.js +3 -3
  228. package/dist/content/article-model.d.ts +1 -46
  229. package/dist/content/article-model.d.ts.map +1 -1
  230. package/dist/content/article-model.js +1 -29
  231. package/dist/content/index.d.ts +11 -41
  232. package/dist/content/index.d.ts.map +1 -1
  233. package/dist/content/index.js +3 -35
  234. package/dist/content/markdown.d.ts +1 -1
  235. package/dist/content/markdown.d.ts.map +1 -1
  236. package/dist/content/markdown.js +1 -1
  237. package/dist/content/mermaid.d.ts.map +1 -1
  238. package/dist/content/mermaid.js +7 -7
  239. package/dist/content/slug.d.ts +1 -8
  240. package/dist/content/slug.d.ts.map +1 -1
  241. package/dist/content/slug.js +1 -8
  242. package/dist/content/url-hardening.d.ts +2 -2
  243. package/dist/content/url-hardening.d.ts.map +1 -1
  244. package/dist/content/url-hardening.js +2 -0
  245. package/dist/controls/actions.d.ts +16 -1
  246. package/dist/controls/actions.d.ts.map +1 -1
  247. package/dist/controls/enum-filter.d.ts +1 -1
  248. package/dist/controls/enum-filter.d.ts.map +1 -1
  249. package/dist/controls/filter-context.d.ts.map +1 -1
  250. package/dist/controls/filter-context.js +3 -1
  251. package/dist/controls/filter-set.js +4 -6
  252. package/dist/controls/form-layout.d.ts +1 -1
  253. package/dist/controls/form-layout.d.ts.map +1 -1
  254. package/dist/controls/form-layout.js +1 -1
  255. package/dist/controls/glyphs.d.ts +0 -2
  256. package/dist/controls/glyphs.d.ts.map +1 -1
  257. package/dist/controls/glyphs.js +0 -7
  258. package/dist/controls/index.d.ts +12 -17
  259. package/dist/controls/index.d.ts.map +1 -1
  260. package/dist/controls/index.js +5 -39
  261. package/dist/controls/multi-select-filter.d.ts +4 -3
  262. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  263. package/dist/controls/number-filter.d.ts +4 -3
  264. package/dist/controls/number-filter.d.ts.map +1 -1
  265. package/dist/controls/number-filter.js +3 -1
  266. package/dist/controls/range-filter.d.ts +4 -3
  267. package/dist/controls/range-filter.d.ts.map +1 -1
  268. package/dist/controls/search-filter.d.ts +4 -3
  269. package/dist/controls/search-filter.d.ts.map +1 -1
  270. package/dist/controls/search-filter.js +19 -14
  271. package/dist/controls/select-filter.d.ts +4 -3
  272. package/dist/controls/select-filter.d.ts.map +1 -1
  273. package/dist/controls/sync-button.d.ts.map +1 -1
  274. package/dist/controls/sync-button.js +12 -15
  275. package/dist/controls/toggle-filter.d.ts +4 -3
  276. package/dist/controls/toggle-filter.d.ts.map +1 -1
  277. package/dist/controls/uncontrolled.d.ts +12 -0
  278. package/dist/controls/uncontrolled.d.ts.map +1 -0
  279. package/dist/controls/view-tabs.d.ts +2 -2
  280. package/dist/controls/view-tabs.d.ts.map +1 -1
  281. package/dist/controls-dates/index.d.ts +0 -1
  282. package/dist/controls-dates/index.d.ts.map +1 -1
  283. package/dist/dashboard/index.d.ts +7 -9
  284. package/dist/dashboard/index.d.ts.map +1 -1
  285. package/dist/dashboard/index.js +3 -23
  286. package/dist/dashboard/section.d.ts +4 -6
  287. package/dist/dashboard/section.d.ts.map +1 -1
  288. package/dist/dashboard/section.js +4 -10
  289. package/dist/dashboard/stat-card.d.ts +4 -4
  290. package/dist/dashboard/stat-card.d.ts.map +1 -1
  291. package/dist/dashboard/stat-card.js +3 -3
  292. package/dist/dashboard/widget-header.module.css +9 -7
  293. package/dist/dev-dock.d.ts.map +1 -1
  294. package/dist/dev-dock.js +6 -1
  295. package/dist/format/date.d.ts +0 -34
  296. package/dist/format/date.d.ts.map +1 -1
  297. package/dist/format/date.js +0 -54
  298. package/dist/format/index.d.ts +7 -22
  299. package/dist/format/index.d.ts.map +1 -1
  300. package/dist/format/index.js +2 -43
  301. package/dist/format/number.d.ts +3 -14
  302. package/dist/format/number.d.ts.map +1 -1
  303. package/dist/format/number.js +0 -13
  304. package/dist/format/shared.d.ts +2 -3
  305. package/dist/format/shared.d.ts.map +1 -1
  306. package/dist/forms/index.d.ts +0 -11
  307. package/dist/forms/index.d.ts.map +1 -1
  308. package/dist/forms/index.js +1 -14
  309. package/dist/guard/index.d.ts +6 -21
  310. package/dist/guard/index.d.ts.map +1 -1
  311. package/dist/guard/index.js +27 -115
  312. package/dist/guard/types.d.ts +7 -18
  313. package/dist/guard/types.d.ts.map +1 -1
  314. package/dist/index.d.ts +16 -48
  315. package/dist/index.d.ts.map +1 -1
  316. package/dist/index.js +21 -117
  317. package/dist/provider/create-router.d.ts +44 -0
  318. package/dist/provider/create-router.d.ts.map +1 -0
  319. package/dist/provider/create-router.js +62 -0
  320. package/dist/provider/hotkeys.d.ts +8 -0
  321. package/dist/provider/hotkeys.d.ts.map +1 -0
  322. package/dist/provider/hotkeys.js +50 -0
  323. package/dist/provider/index.d.ts +33 -110
  324. package/dist/provider/index.d.ts.map +1 -1
  325. package/dist/provider/index.js +182 -82
  326. package/dist/provider/lab-theme.d.ts.map +1 -1
  327. package/dist/provider/route-transition.d.ts +76 -0
  328. package/dist/provider/route-transition.d.ts.map +1 -0
  329. package/dist/provider/route-transition.js +98 -0
  330. package/dist/provider/spotlight-actions.d.ts +10 -0
  331. package/dist/provider/spotlight-actions.d.ts.map +1 -0
  332. package/dist/provider/spotlight-actions.js +55 -0
  333. package/dist/provider/test-router.d.ts +6 -0
  334. package/dist/provider/test-router.d.ts.map +1 -0
  335. package/dist/provider/test-router.js +18 -0
  336. package/dist/query-client.d.ts +4 -20
  337. package/dist/query-client.d.ts.map +1 -1
  338. package/dist/query-client.js +2 -2
  339. package/dist/router-tanstack/index.d.ts +18 -64
  340. package/dist/router-tanstack/index.d.ts.map +1 -1
  341. package/dist/router-tanstack/index.js +2 -16
  342. package/dist/router-tanstack/nav.d.ts +12 -1
  343. package/dist/router-tanstack/nav.d.ts.map +1 -1
  344. package/dist/router-tanstack/nav.js +8 -1
  345. package/dist/router-tanstack/search-store.d.ts +1 -1
  346. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  347. package/dist/router-tanstack/use-nav.d.ts +8 -9
  348. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  349. package/dist/router-tanstack/use-nav.js +20 -1
  350. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  351. package/dist/shell/app-sidebar.js +1 -1
  352. package/dist/shell/index.d.ts +31 -10
  353. package/dist/shell/index.d.ts.map +1 -1
  354. package/dist/shell/index.js +14 -3
  355. package/dist/shell/page-aside.d.ts +2 -2
  356. package/dist/shell/page-aside.d.ts.map +1 -1
  357. package/dist/shell/page-aside.js +31 -12
  358. package/dist/shell/page-bar.d.ts +2 -2
  359. package/dist/shell/page-bar.d.ts.map +1 -1
  360. package/dist/shell/page-bar.js +1 -1
  361. package/dist/state.d.ts +10 -12
  362. package/dist/state.d.ts.map +1 -1
  363. package/dist/state.js +4 -6
  364. package/dist/styles.css +107 -7
  365. package/dist/surfaces.d.ts +28 -103
  366. package/dist/surfaces.d.ts.map +1 -1
  367. package/dist/surfaces.js +54 -143
  368. package/dist/{data → table}/data-table-state.d.ts +1 -1
  369. package/dist/table/data-table-state.d.ts.map +1 -0
  370. package/dist/{data → table}/data-table-state.js +4 -3
  371. package/dist/{data → table}/data-table.d.ts +28 -49
  372. package/dist/table/data-table.d.ts.map +1 -0
  373. package/dist/{data → table}/data-table.js +74 -60
  374. package/dist/table/index.d.ts +18 -0
  375. package/dist/table/index.d.ts.map +1 -0
  376. package/dist/{data/table.js → table/index.js} +1 -1
  377. package/dist/table/query-branch.d.ts.map +1 -0
  378. package/dist/table/table-features.d.ts +69 -0
  379. package/dist/table/table-features.d.ts.map +1 -0
  380. package/dist/table/table-features.js +49 -0
  381. package/dist/telemetry.d.ts +77 -0
  382. package/dist/telemetry.d.ts.map +1 -0
  383. package/dist/telemetry.js +33 -0
  384. package/dist/theme/index.d.ts +10 -21
  385. package/dist/theme/index.d.ts.map +1 -1
  386. package/dist/theme/index.js +3 -14
  387. package/dist/theme/theme-toggle.d.ts.map +1 -1
  388. package/dist/theme/theme-toggle.js +7 -33
  389. package/dist/theme/theme-toggle.module.css +30 -0
  390. package/dist/theme/theme-toggle.module.css.d.ts +10 -0
  391. package/dist/theme-lab/derive-controls.d.ts.map +1 -1
  392. package/dist/theme-lab/derive-controls.js +5 -3
  393. package/dist/theme-lab/derive-state.d.ts.map +1 -1
  394. package/dist/theme-lab/derive-state.js +2 -1
  395. package/dist/tokens/core.d.ts +360 -0
  396. package/dist/tokens/core.d.ts.map +1 -0
  397. package/dist/tokens/core.js +708 -0
  398. package/dist/tokens/derive.d.ts +1 -1
  399. package/dist/tokens/derive.d.ts.map +1 -1
  400. package/dist/tokens/index.d.ts +5 -373
  401. package/dist/tokens/index.d.ts.map +1 -1
  402. package/dist/tokens/index.js +8 -700
  403. package/dist/tokens/palette.d.ts +2 -6
  404. package/dist/tokens/palette.d.ts.map +1 -1
  405. package/dist/tokens/palette.js +1 -4
  406. package/dist/vite.d.ts +4 -3
  407. package/dist/vite.d.ts.map +1 -1
  408. package/llms.txt +43 -85
  409. package/package.json +77 -170
  410. package/src/agent/ai-sdk-transport.ts +57 -37
  411. package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
  412. package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
  413. package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
  414. package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
  415. package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
  416. package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
  417. package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
  418. package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
  419. package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
  420. package/src/agent/error.ts +43 -0
  421. package/src/agent/history.ts +2 -107
  422. package/src/agent/id.ts +4 -5
  423. package/src/agent/index.ts +23 -112
  424. package/src/agent/outcome.ts +3 -56
  425. package/src/agent/part-list.tsx +3 -3
  426. package/src/agent/parts.ts +23 -22
  427. package/src/agent/run-committer.ts +64 -0
  428. package/src/agent/run-records.ts +147 -0
  429. package/src/agent/thread.ts +24 -231
  430. package/src/agent/transport.ts +6 -96
  431. package/src/agent/use-agent-thread-runs.ts +364 -199
  432. package/src/charts/BandStrip.tsx +276 -0
  433. package/src/charts/Bars.tsx +141 -0
  434. package/src/charts/CartesianChart.tsx +206 -0
  435. package/src/charts/ChartCard.tsx +178 -0
  436. package/src/charts/Donut.tsx +256 -0
  437. package/src/charts/DualPanel.tsx +326 -0
  438. package/src/charts/Heatmap.tsx +282 -0
  439. package/src/charts/Lines.tsx +151 -0
  440. package/src/charts/MirroredBars.tsx +303 -0
  441. package/src/charts/Sparkline.tsx +176 -0
  442. package/src/charts/StackedArea.tsx +80 -0
  443. package/src/charts/box.tsx +96 -0
  444. package/src/charts/card-context.ts +11 -0
  445. package/src/charts/chart-box.module.css +64 -0
  446. package/src/charts/chart-box.module.css.d.ts +12 -0
  447. package/src/charts/chart-card.module.css +25 -0
  448. package/src/charts/chart-card.module.css.d.ts +8 -0
  449. package/src/charts/chart-legend.module.css +38 -0
  450. package/src/charts/chart-legend.module.css.d.ts +10 -0
  451. package/src/charts/compile.ts +585 -0
  452. package/src/charts/cursor.ts +282 -0
  453. package/src/charts/curves.ts +111 -0
  454. package/src/charts/donut.module.css +54 -0
  455. package/src/charts/donut.module.css.d.ts +9 -0
  456. package/src/charts/host.tsx +60 -0
  457. package/src/charts/index.ts +41 -178
  458. package/src/charts/legend.tsx +204 -0
  459. package/src/charts/marks.ts +201 -0
  460. package/src/charts/panel.tsx +227 -0
  461. package/src/charts/scales.ts +237 -0
  462. package/src/charts/sizing.ts +47 -0
  463. package/src/charts/state.tsx +80 -0
  464. package/src/charts/theme.ts +65 -0
  465. package/src/charts/types.ts +242 -0
  466. package/src/cli/audit-allows.ts +8 -30
  467. package/src/cli/config.ts +14 -43
  468. package/src/cli/doctor-upgrade.ts +392 -0
  469. package/src/cli/doctor.ts +81 -72
  470. package/src/cli/help.ts +2 -4
  471. package/src/cli/index.ts +100 -384
  472. package/src/cli/init.ts +60 -51
  473. package/src/cli/sync.ts +13 -68
  474. package/src/cli/tokens-css.ts +7 -28
  475. package/src/commands/ShortcutsHelp.tsx +8 -9
  476. package/src/commands/define-commands.ts +16 -43
  477. package/src/commands/define-overlays.ts +12 -36
  478. package/src/commands/index.ts +11 -94
  479. package/src/{notifications → commands/notifications}/bell.tsx +2 -2
  480. package/src/{notifications → commands/notifications}/center.tsx +7 -5
  481. package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
  482. package/src/commands/notifications/notify.tsx +158 -0
  483. package/src/{notifications → commands/notifications}/store.ts +10 -2
  484. package/src/commands/projectors.ts +5 -225
  485. package/src/commands/shell-bridge.ts +5 -5
  486. package/src/commands/shortcut-format.ts +5 -4
  487. package/src/common/errors.ts +3 -3
  488. package/src/common/use-measured-widths.ts +6 -3
  489. package/src/common/validate.ts +2 -2
  490. package/src/content/article-layout.tsx +37 -38
  491. package/src/content/article-model.ts +1 -84
  492. package/src/content/index.ts +12 -83
  493. package/src/content/markdown.tsx +4 -3
  494. package/src/content/mermaid.tsx +9 -7
  495. package/src/content/slug.ts +1 -16
  496. package/src/content/url-hardening.ts +8 -2
  497. package/src/controls/actions.tsx +24 -1
  498. package/src/controls/enum-filter.tsx +1 -1
  499. package/src/controls/filter-context.tsx +3 -1
  500. package/src/controls/filter-set.tsx +5 -7
  501. package/src/controls/form-layout.tsx +2 -2
  502. package/src/controls/glyphs.tsx +0 -10
  503. package/src/controls/index.ts +13 -64
  504. package/src/controls/multi-select-filter.tsx +5 -4
  505. package/src/controls/number-filter.tsx +8 -4
  506. package/src/controls/range-filter.tsx +5 -4
  507. package/src/controls/search-filter.tsx +25 -19
  508. package/src/controls/select-filter.tsx +5 -4
  509. package/src/controls/sync-button.tsx +18 -20
  510. package/src/controls/toggle-filter.tsx +5 -4
  511. package/src/controls/uncontrolled.ts +12 -0
  512. package/src/controls/view-tabs.tsx +3 -3
  513. package/src/controls-dates/date-range-picker.tsx +1 -1
  514. package/src/controls-dates/index.ts +0 -1
  515. package/src/dashboard/index.ts +7 -48
  516. package/src/dashboard/section.tsx +11 -40
  517. package/src/dashboard/stat-card.tsx +14 -16
  518. package/src/dashboard/widget-header.module.css +9 -7
  519. package/src/dev-dock.tsx +14 -27
  520. package/src/format/date.ts +2 -92
  521. package/src/format/index.ts +7 -53
  522. package/src/format/number.ts +3 -26
  523. package/src/format/shared.ts +2 -3
  524. package/src/forms/index.ts +0 -23
  525. package/src/guard/index.ts +36 -191
  526. package/src/guard/types.ts +6 -19
  527. package/src/index.ts +30 -282
  528. package/src/provider/create-router.tsx +138 -0
  529. package/src/provider/hotkeys.ts +70 -0
  530. package/src/provider/index.tsx +260 -230
  531. package/src/provider/lab-theme.ts +3 -2
  532. package/src/provider/route-transition.ts +199 -0
  533. package/src/provider/spotlight-actions.tsx +69 -0
  534. package/src/provider/test-router.tsx +25 -0
  535. package/src/query-client.ts +4 -22
  536. package/src/router-tanstack/index.ts +18 -112
  537. package/src/router-tanstack/nav.ts +28 -2
  538. package/src/router-tanstack/search-store.ts +9 -2
  539. package/src/router-tanstack/use-nav.ts +47 -13
  540. package/src/shell/app-mobile-nav.tsx +3 -2
  541. package/src/shell/app-sidebar.tsx +1 -1
  542. package/src/shell/aside-docking.ts +1 -1
  543. package/src/shell/index.tsx +61 -20
  544. package/src/shell/page-aside.tsx +47 -23
  545. package/src/shell/page-bar.tsx +3 -3
  546. package/src/shell/page-title.tsx +1 -1
  547. package/src/state.ts +11 -37
  548. package/src/styles.css +107 -7
  549. package/src/surfaces.ts +56 -151
  550. package/src/{data → table}/data-table-state.ts +5 -4
  551. package/src/{data → table}/data-table.tsx +170 -161
  552. package/src/table/index.ts +18 -0
  553. package/src/table/table-features.ts +102 -0
  554. package/src/telemetry.ts +110 -0
  555. package/src/theme/index.ts +22 -47
  556. package/src/theme/theme-toggle.module.css +30 -0
  557. package/src/theme/theme-toggle.module.css.d.ts +10 -0
  558. package/src/theme/theme-toggle.tsx +15 -43
  559. package/src/theme-lab/derive-controls.tsx +5 -3
  560. package/src/theme-lab/derive-state.ts +2 -1
  561. package/src/tokens/core.ts +1163 -0
  562. package/src/tokens/derive.ts +1 -1
  563. package/src/tokens/index.ts +14 -1181
  564. package/src/tokens/palette.ts +3 -7
  565. package/src/vite.ts +3 -3
  566. package/agent/templates/query-client.ts.tpl +0 -26
  567. package/dist/agent/adapter.d.ts +0 -150
  568. package/dist/agent/adapter.d.ts.map +0 -1
  569. package/dist/agent/adapter.js +0 -482
  570. package/dist/agent/use-agent-stream.d.ts +0 -35
  571. package/dist/agent/use-agent-stream.d.ts.map +0 -1
  572. package/dist/agent/use-agent-stream.js +0 -59
  573. package/dist/agent-chat/composer.d.ts.map +0 -1
  574. package/dist/agent-chat/index.d.ts +0 -31
  575. package/dist/agent-chat/index.d.ts.map +0 -1
  576. package/dist/agent-chat/index.js +0 -19
  577. package/dist/agent-chat/message-affordances.d.ts.map +0 -1
  578. package/dist/agent-chat/relative-time.d.ts.map +0 -1
  579. package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
  580. package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
  581. package/dist/agent-chat/thread-detail-panel.js +0 -115
  582. package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
  583. package/dist/agent-chat/thread-feed.d.ts.map +0 -1
  584. package/dist/agent-chat/thread-message.d.ts.map +0 -1
  585. package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
  586. package/dist/agent-chat/thread-workspace.d.ts +0 -44
  587. package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
  588. package/dist/agent-chat/thread-workspace.js +0 -153
  589. package/dist/agent-chat/tool-chip.d.ts.map +0 -1
  590. package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
  591. package/dist/agent-chat/virtualize.d.ts.map +0 -1
  592. package/dist/charts/cursor/resolve.d.ts +0 -75
  593. package/dist/charts/cursor/resolve.d.ts.map +0 -1
  594. package/dist/charts/cursor/resolve.js +0 -91
  595. package/dist/charts/cursor/scope.d.ts +0 -20
  596. package/dist/charts/cursor/scope.d.ts.map +0 -1
  597. package/dist/charts/cursor/scope.js +0 -20
  598. package/dist/charts/cursor/store.d.ts +0 -35
  599. package/dist/charts/cursor/store.d.ts.map +0 -1
  600. package/dist/charts/cursor/store.js +0 -25
  601. package/dist/charts/cursor/touch-pin.d.ts +0 -45
  602. package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
  603. package/dist/charts/cursor/touch-pin.js +0 -79
  604. package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
  605. package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
  606. package/dist/charts/hooks/use-discrete-cursor.js +0 -198
  607. package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
  608. package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
  609. package/dist/charts/hooks/use-hysteresis.js +0 -12
  610. package/dist/charts/hooks/useBandPlot.d.ts +0 -145
  611. package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
  612. package/dist/charts/hooks/useBandPlot.js +0 -178
  613. package/dist/charts/hooks/useChartCursor.d.ts +0 -75
  614. package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
  615. package/dist/charts/hooks/useChartCursor.js +0 -200
  616. package/dist/charts/hooks/useChartSize.d.ts +0 -29
  617. package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
  618. package/dist/charts/hooks/useChartSize.js +0 -8
  619. package/dist/charts/kinds/BandStrip.d.ts +0 -132
  620. package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
  621. package/dist/charts/kinds/BandStrip.js +0 -241
  622. package/dist/charts/kinds/Bars.d.ts +0 -141
  623. package/dist/charts/kinds/Bars.d.ts.map +0 -1
  624. package/dist/charts/kinds/Bars.js +0 -343
  625. package/dist/charts/kinds/Donut.d.ts +0 -77
  626. package/dist/charts/kinds/Donut.d.ts.map +0 -1
  627. package/dist/charts/kinds/Donut.js +0 -245
  628. package/dist/charts/kinds/DualPanel.d.ts +0 -111
  629. package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
  630. package/dist/charts/kinds/DualPanel.js +0 -471
  631. package/dist/charts/kinds/Heatmap.d.ts +0 -85
  632. package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
  633. package/dist/charts/kinds/Heatmap.js +0 -243
  634. package/dist/charts/kinds/MirroredBars.d.ts +0 -98
  635. package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
  636. package/dist/charts/kinds/MirroredBars.js +0 -292
  637. package/dist/charts/kinds/MultiLine.d.ts +0 -87
  638. package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
  639. package/dist/charts/kinds/MultiLine.js +0 -176
  640. package/dist/charts/kinds/StackedArea.d.ts +0 -73
  641. package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
  642. package/dist/charts/kinds/StackedArea.js +0 -135
  643. package/dist/charts/kinds/ZonedLine.d.ts +0 -97
  644. package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
  645. package/dist/charts/kinds/ZonedLine.js +0 -155
  646. package/dist/charts/kinds/band-chrome.d.ts +0 -31
  647. package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
  648. package/dist/charts/kinds/band-chrome.js +0 -71
  649. package/dist/charts/kinds/donut-layout.d.ts +0 -47
  650. package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
  651. package/dist/charts/kinds/donut-layout.js +0 -52
  652. package/dist/charts/layout/auto-margin.d.ts +0 -122
  653. package/dist/charts/layout/auto-margin.d.ts.map +0 -1
  654. package/dist/charts/layout/auto-margin.js +0 -81
  655. package/dist/charts/layout/end-labels.d.ts +0 -64
  656. package/dist/charts/layout/end-labels.d.ts.map +0 -1
  657. package/dist/charts/layout/end-labels.js +0 -76
  658. package/dist/charts/layout/log-ticks.d.ts +0 -27
  659. package/dist/charts/layout/log-ticks.d.ts.map +0 -1
  660. package/dist/charts/layout/log-ticks.js +0 -42
  661. package/dist/charts/primitives/AreaGradient.d.ts +0 -18
  662. package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
  663. package/dist/charts/primitives/AreaGradient.js +0 -13
  664. package/dist/charts/primitives/Axes.d.ts +0 -83
  665. package/dist/charts/primitives/Axes.d.ts.map +0 -1
  666. package/dist/charts/primitives/Axes.js +0 -168
  667. package/dist/charts/primitives/CartesianChart.d.ts +0 -257
  668. package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
  669. package/dist/charts/primitives/CartesianChart.js +0 -549
  670. package/dist/charts/primitives/ChartCard.d.ts +0 -66
  671. package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
  672. package/dist/charts/primitives/ChartCard.js +0 -143
  673. package/dist/charts/primitives/ChartFrame.d.ts +0 -156
  674. package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
  675. package/dist/charts/primitives/ChartFrame.js +0 -241
  676. package/dist/charts/primitives/ChartLegend.d.ts +0 -67
  677. package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
  678. package/dist/charts/primitives/ChartLegend.js +0 -292
  679. package/dist/charts/primitives/ChartPending.d.ts +0 -113
  680. package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
  681. package/dist/charts/primitives/ChartPending.js +0 -117
  682. package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
  683. package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
  684. package/dist/charts/primitives/ChartTooltip.js +0 -197
  685. package/dist/charts/primitives/Crosshair.d.ts +0 -26
  686. package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
  687. package/dist/charts/primitives/Crosshair.js +0 -23
  688. package/dist/charts/primitives/HatchPattern.d.ts +0 -31
  689. package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
  690. package/dist/charts/primitives/HatchPattern.js +0 -31
  691. package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
  692. package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
  693. package/dist/charts/primitives/HoverOverlay.js +0 -72
  694. package/dist/charts/primitives/HoverOverlay.module.css +0 -13
  695. package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  696. package/dist/charts/primitives/XZoneRects.d.ts +0 -54
  697. package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
  698. package/dist/charts/primitives/XZoneRects.js +0 -65
  699. package/dist/charts/primitives/ZoneRects.d.ts +0 -38
  700. package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
  701. package/dist/charts/primitives/ZoneRects.js +0 -30
  702. package/dist/charts/primitives/chart-card-context.d.ts +0 -33
  703. package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
  704. package/dist/charts/primitives/chart-card-context.js +0 -18
  705. package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
  706. package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
  707. package/dist/charts/primitives/chart-frame-layout.js +0 -175
  708. package/dist/charts/primitives/chart-layout.d.ts +0 -112
  709. package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
  710. package/dist/charts/primitives/chart-layout.js +0 -175
  711. package/dist/charts/primitives/chart-tier.d.ts +0 -16
  712. package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
  713. package/dist/charts/primitives/chart-tier.js +0 -44
  714. package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
  715. package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
  716. package/dist/charts/primitives/legend-disclosure.js +0 -153
  717. package/dist/charts/series.d.ts +0 -189
  718. package/dist/charts/series.d.ts.map +0 -1
  719. package/dist/charts/series.js +0 -84
  720. package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
  721. package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
  722. package/dist/charts/sparklines/BarSparkline.js +0 -53
  723. package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
  724. package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
  725. package/dist/charts/sparklines/LineSparkline.js +0 -51
  726. package/dist/charts/sparklines/index.d.ts +0 -3
  727. package/dist/charts/sparklines/index.d.ts.map +0 -1
  728. package/dist/charts/sparklines/index.js +0 -6
  729. package/dist/charts/utils/domain.d.ts +0 -35
  730. package/dist/charts/utils/domain.d.ts.map +0 -1
  731. package/dist/charts/utils/domain.js +0 -12
  732. package/dist/charts/utils/format.d.ts +0 -8
  733. package/dist/charts/utils/format.d.ts.map +0 -1
  734. package/dist/charts/utils/format.js +0 -20
  735. package/dist/charts/utils/measure-text.d.ts +0 -25
  736. package/dist/charts/utils/measure-text.d.ts.map +0 -1
  737. package/dist/charts/utils/measure-text.js +0 -64
  738. package/dist/charts/utils/ticks.d.ts +0 -103
  739. package/dist/charts/utils/ticks.d.ts.map +0 -1
  740. package/dist/charts/utils/ticks.js +0 -92
  741. package/dist/commands/overlays-mount.d.ts +0 -122
  742. package/dist/commands/overlays-mount.d.ts.map +0 -1
  743. package/dist/commands/overlays-mount.js +0 -125
  744. package/dist/commands/useCommandHotkeys.d.ts +0 -14
  745. package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
  746. package/dist/commands/useCommandHotkeys.js +0 -45
  747. package/dist/content/article-actions.d.ts +0 -39
  748. package/dist/content/article-actions.d.ts.map +0 -1
  749. package/dist/content/article-actions.js +0 -28
  750. package/dist/content/article-card.d.ts +0 -58
  751. package/dist/content/article-card.d.ts.map +0 -1
  752. package/dist/content/article-card.js +0 -79
  753. package/dist/content/article-card.module.css +0 -111
  754. package/dist/content/mdx.d.ts +0 -20
  755. package/dist/content/mdx.d.ts.map +0 -1
  756. package/dist/content/mdx.js +0 -64
  757. package/dist/controls/compare-filter.d.ts +0 -42
  758. package/dist/controls/compare-filter.d.ts.map +0 -1
  759. package/dist/controls/compare-filter.js +0 -38
  760. package/dist/controls/slider-control.d.ts +0 -36
  761. package/dist/controls/slider-control.d.ts.map +0 -1
  762. package/dist/controls/slider-control.js +0 -64
  763. package/dist/dashboard/widget-grid.d.ts +0 -27
  764. package/dist/dashboard/widget-grid.d.ts.map +0 -1
  765. package/dist/dashboard/widget-grid.js +0 -40
  766. package/dist/dashboard/widget-grid.module.css +0 -69
  767. package/dist/data/data-table-state.d.ts.map +0 -1
  768. package/dist/data/data-table.d.ts.map +0 -1
  769. package/dist/data/query-branch.d.ts.map +0 -1
  770. package/dist/data/table.d.ts +0 -24
  771. package/dist/data/table.d.ts.map +0 -1
  772. package/dist/data/virtual-list.d.ts +0 -133
  773. package/dist/data/virtual-list.d.ts.map +0 -1
  774. package/dist/data/virtual-list.js +0 -157
  775. package/dist/data/virtual.d.ts +0 -21
  776. package/dist/data/virtual.d.ts.map +0 -1
  777. package/dist/data/virtual.js +0 -4
  778. package/dist/forms/FormErrorSummary.d.ts +0 -30
  779. package/dist/forms/FormErrorSummary.d.ts.map +0 -1
  780. package/dist/forms/FormErrorSummary.js +0 -30
  781. package/dist/forms/use-field-array.d.ts +0 -60
  782. package/dist/forms/use-field-array.d.ts.map +0 -1
  783. package/dist/forms/use-field-array.js +0 -20
  784. package/dist/forms/use-form-draft.d.ts +0 -76
  785. package/dist/forms/use-form-draft.d.ts.map +0 -1
  786. package/dist/forms/use-form-draft.js +0 -92
  787. package/dist/forms/use-form-submit.d.ts +0 -88
  788. package/dist/forms/use-form-submit.d.ts.map +0 -1
  789. package/dist/forms/use-form-submit.js +0 -63
  790. package/dist/notifications/bell.d.ts.map +0 -1
  791. package/dist/notifications/center.d.ts.map +0 -1
  792. package/dist/notifications/define-notifications.d.ts.map +0 -1
  793. package/dist/notifications/index.d.ts +0 -40
  794. package/dist/notifications/index.d.ts.map +0 -1
  795. package/dist/notifications/index.js +0 -54
  796. package/dist/notifications/mount-guard.d.ts +0 -8
  797. package/dist/notifications/mount-guard.d.ts.map +0 -1
  798. package/dist/notifications/mount-guard.js +0 -18
  799. package/dist/notifications/notify.d.ts +0 -149
  800. package/dist/notifications/notify.d.ts.map +0 -1
  801. package/dist/notifications/notify.js +0 -171
  802. package/dist/notifications/store.d.ts.map +0 -1
  803. package/dist/provider/connectivity-indicator.d.ts +0 -13
  804. package/dist/provider/connectivity-indicator.d.ts.map +0 -1
  805. package/dist/provider/connectivity-indicator.js +0 -205
  806. package/dist/provider/connectivity-provider.d.ts +0 -7
  807. package/dist/provider/connectivity-provider.d.ts.map +0 -1
  808. package/dist/provider/connectivity-provider.js +0 -128
  809. package/dist/provider/connectivity-types.d.ts +0 -36
  810. package/dist/provider/connectivity-types.d.ts.map +0 -1
  811. package/dist/provider/use-connectivity.d.ts +0 -3
  812. package/dist/provider/use-connectivity.d.ts.map +0 -1
  813. package/dist/provider/use-connectivity.js +0 -14
  814. package/dist/query-devtools.d.ts +0 -21
  815. package/dist/query-devtools.d.ts.map +0 -1
  816. package/dist/query-devtools.js +0 -13
  817. package/src/agent/adapter.ts +0 -945
  818. package/src/agent/use-agent-stream.ts +0 -154
  819. package/src/agent-chat/index.ts +0 -54
  820. package/src/agent-chat/thread-detail-panel.tsx +0 -201
  821. package/src/agent-chat/thread-workspace.tsx +0 -279
  822. package/src/charts/cursor/resolve.ts +0 -198
  823. package/src/charts/cursor/scope.tsx +0 -35
  824. package/src/charts/cursor/store.ts +0 -58
  825. package/src/charts/cursor/touch-pin.ts +0 -138
  826. package/src/charts/hooks/use-discrete-cursor.ts +0 -335
  827. package/src/charts/hooks/use-hysteresis.ts +0 -26
  828. package/src/charts/hooks/useBandPlot.ts +0 -383
  829. package/src/charts/hooks/useChartCursor.ts +0 -367
  830. package/src/charts/hooks/useChartSize.ts +0 -35
  831. package/src/charts/kinds/BandStrip.tsx +0 -449
  832. package/src/charts/kinds/Bars.tsx +0 -589
  833. package/src/charts/kinds/Donut.tsx +0 -368
  834. package/src/charts/kinds/DualPanel.tsx +0 -712
  835. package/src/charts/kinds/Heatmap.tsx +0 -396
  836. package/src/charts/kinds/MirroredBars.tsx +0 -469
  837. package/src/charts/kinds/MultiLine.tsx +0 -322
  838. package/src/charts/kinds/StackedArea.tsx +0 -267
  839. package/src/charts/kinds/ZonedLine.tsx +0 -301
  840. package/src/charts/kinds/band-chrome.tsx +0 -91
  841. package/src/charts/kinds/donut-layout.ts +0 -82
  842. package/src/charts/layout/auto-margin.ts +0 -242
  843. package/src/charts/layout/end-labels.ts +0 -135
  844. package/src/charts/layout/log-ticks.ts +0 -90
  845. package/src/charts/primitives/AreaGradient.tsx +0 -26
  846. package/src/charts/primitives/Axes.tsx +0 -271
  847. package/src/charts/primitives/CartesianChart.tsx +0 -1002
  848. package/src/charts/primitives/ChartCard.tsx +0 -280
  849. package/src/charts/primitives/ChartFrame.tsx +0 -493
  850. package/src/charts/primitives/ChartLegend.tsx +0 -422
  851. package/src/charts/primitives/ChartPending.tsx +0 -243
  852. package/src/charts/primitives/ChartTooltip.tsx +0 -265
  853. package/src/charts/primitives/Crosshair.tsx +0 -43
  854. package/src/charts/primitives/HatchPattern.tsx +0 -55
  855. package/src/charts/primitives/HoverOverlay.module.css +0 -13
  856. package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
  857. package/src/charts/primitives/HoverOverlay.tsx +0 -109
  858. package/src/charts/primitives/XZoneRects.tsx +0 -132
  859. package/src/charts/primitives/ZoneRects.tsx +0 -67
  860. package/src/charts/primitives/chart-card-context.ts +0 -46
  861. package/src/charts/primitives/chart-frame-layout.ts +0 -430
  862. package/src/charts/primitives/chart-layout.ts +0 -318
  863. package/src/charts/primitives/chart-tier.tsx +0 -76
  864. package/src/charts/primitives/legend-disclosure.tsx +0 -178
  865. package/src/charts/series.ts +0 -276
  866. package/src/charts/sparklines/BarSparkline.tsx +0 -94
  867. package/src/charts/sparklines/LineSparkline.tsx +0 -71
  868. package/src/charts/sparklines/index.ts +0 -2
  869. package/src/charts/theme.tsx +0 -53
  870. package/src/charts/utils/domain.ts +0 -41
  871. package/src/charts/utils/format.ts +0 -19
  872. package/src/charts/utils/measure-text.ts +0 -109
  873. package/src/charts/utils/ticks.ts +0 -239
  874. package/src/commands/overlays-mount.tsx +0 -333
  875. package/src/commands/useCommandHotkeys.ts +0 -114
  876. package/src/content/article-actions.ts +0 -72
  877. package/src/content/article-card.module.css +0 -111
  878. package/src/content/article-card.tsx +0 -174
  879. package/src/content/mdx.tsx +0 -127
  880. package/src/controls/compare-filter.tsx +0 -81
  881. package/src/controls/slider-control.tsx +0 -159
  882. package/src/dashboard/widget-grid.module.css +0 -69
  883. package/src/dashboard/widget-grid.tsx +0 -146
  884. package/src/data/table.ts +0 -39
  885. package/src/data/virtual-list.tsx +0 -356
  886. package/src/data/virtual.ts +0 -26
  887. package/src/forms/FormErrorSummary.tsx +0 -71
  888. package/src/forms/use-field-array.ts +0 -94
  889. package/src/forms/use-form-draft.ts +0 -262
  890. package/src/forms/use-form-submit.ts +0 -199
  891. package/src/notifications/index.ts +0 -88
  892. package/src/notifications/mount-guard.ts +0 -38
  893. package/src/notifications/notify.tsx +0 -379
  894. package/src/provider/connectivity-indicator.tsx +0 -267
  895. package/src/provider/connectivity-provider.tsx +0 -189
  896. package/src/provider/connectivity-types.ts +0 -42
  897. package/src/provider/use-connectivity.ts +0 -26
  898. package/src/query-devtools.tsx +0 -40
  899. /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
  900. /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
  901. /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
  902. /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
  903. /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
  904. /package/dist/{notifications → commands/notifications}/bell.js +0 -0
  905. /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
  906. /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
  907. /package/dist/{data → table}/data-table.module.css +0 -0
  908. /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
  909. /package/dist/{data → table}/query-branch.d.ts +0 -0
  910. /package/dist/{data → table}/query-branch.js +0 -0
  911. /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
  912. /package/src/{data → table}/data-table.module.css +0 -0
  913. /package/src/{data → table}/data-table.module.css.d.ts +0 -0
  914. /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
  }