@schlessera/brain-ui-react 0.35.0 → 0.37.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 (761) hide show
  1. package/README.md +82 -4
  2. package/dist/components/activity/activity-page.d.ts +17 -5
  3. package/dist/components/activity/activity-page.d.ts.map +1 -1
  4. package/dist/components/activity/activity-page.js +148 -50
  5. package/dist/components/activity/activity-page.js.map +1 -1
  6. package/dist/components/activity/activity-run-detail.d.ts +16 -1
  7. package/dist/components/activity/activity-run-detail.d.ts.map +1 -1
  8. package/dist/components/activity/activity-run-detail.js +47 -4
  9. package/dist/components/activity/activity-run-detail.js.map +1 -1
  10. package/dist/components/activity/activity-run-list.d.ts +7 -1
  11. package/dist/components/activity/activity-run-list.d.ts.map +1 -1
  12. package/dist/components/activity/activity-run-list.js +16 -8
  13. package/dist/components/activity/activity-run-list.js.map +1 -1
  14. package/dist/components/activity/activity-views.d.ts +63 -0
  15. package/dist/components/activity/activity-views.d.ts.map +1 -0
  16. package/dist/components/activity/activity-views.js +52 -0
  17. package/dist/components/activity/activity-views.js.map +1 -0
  18. package/dist/components/activity/approval-card.d.ts +29 -0
  19. package/dist/components/activity/approval-card.d.ts.map +1 -0
  20. package/dist/components/activity/approval-card.js +73 -0
  21. package/dist/components/activity/approval-card.js.map +1 -0
  22. package/dist/components/activity/digest-card.d.ts +3 -0
  23. package/dist/components/activity/digest-card.d.ts.map +1 -1
  24. package/dist/components/activity/digest-card.js +20 -16
  25. package/dist/components/activity/digest-card.js.map +1 -1
  26. package/dist/components/activity/digest-summary.d.ts +19 -0
  27. package/dist/components/activity/digest-summary.d.ts.map +1 -0
  28. package/dist/components/activity/digest-summary.js +20 -0
  29. package/dist/components/activity/digest-summary.js.map +1 -0
  30. package/dist/components/activity/push-switch.d.ts +25 -0
  31. package/dist/components/activity/push-switch.d.ts.map +1 -0
  32. package/dist/components/activity/push-switch.js +14 -0
  33. package/dist/components/activity/push-switch.js.map +1 -0
  34. package/dist/components/activity/push-toggle.d.ts +7 -0
  35. package/dist/components/activity/push-toggle.d.ts.map +1 -1
  36. package/dist/components/activity/push-toggle.js +72 -47
  37. package/dist/components/activity/push-toggle.js.map +1 -1
  38. package/dist/components/activity/span-bits.d.ts +11 -0
  39. package/dist/components/activity/span-bits.d.ts.map +1 -1
  40. package/dist/components/activity/span-bits.js +50 -7
  41. package/dist/components/activity/span-bits.js.map +1 -1
  42. package/dist/components/chat/ask-user-card.d.ts +76 -3
  43. package/dist/components/chat/ask-user-card.d.ts.map +1 -1
  44. package/dist/components/chat/ask-user-card.js +208 -149
  45. package/dist/components/chat/ask-user-card.js.map +1 -1
  46. package/dist/components/chat/ask-user-typed.d.ts +42 -0
  47. package/dist/components/chat/ask-user-typed.d.ts.map +1 -0
  48. package/dist/components/chat/ask-user-typed.js +60 -0
  49. package/dist/components/chat/ask-user-typed.js.map +1 -0
  50. package/dist/components/chat/brain-markdown-links.d.ts +2 -1
  51. package/dist/components/chat/brain-markdown-links.d.ts.map +1 -1
  52. package/dist/components/chat/brain-markdown-links.js +3 -4
  53. package/dist/components/chat/brain-markdown-links.js.map +1 -1
  54. package/dist/components/chat/brain-markdown.d.ts.map +1 -1
  55. package/dist/components/chat/brain-markdown.js +4 -2
  56. package/dist/components/chat/brain-markdown.js.map +1 -1
  57. package/dist/components/chat/chat-page.d.ts.map +1 -1
  58. package/dist/components/chat/chat-page.js +27 -11
  59. package/dist/components/chat/chat-page.js.map +1 -1
  60. package/dist/components/chat/composer-view.d.ts +75 -0
  61. package/dist/components/chat/composer-view.d.ts.map +1 -0
  62. package/dist/components/chat/composer-view.js +31 -0
  63. package/dist/components/chat/composer-view.js.map +1 -0
  64. package/dist/components/chat/composer.d.ts +4 -0
  65. package/dist/components/chat/composer.d.ts.map +1 -1
  66. package/dist/components/chat/composer.js +76 -59
  67. package/dist/components/chat/composer.js.map +1 -1
  68. package/dist/components/chat/markdown-content.d.ts +16 -1
  69. package/dist/components/chat/markdown-content.d.ts.map +1 -1
  70. package/dist/components/chat/markdown-content.js +47 -3
  71. package/dist/components/chat/markdown-content.js.map +1 -1
  72. package/dist/components/chat/mermaid-block.d.ts +4 -0
  73. package/dist/components/chat/mermaid-block.d.ts.map +1 -1
  74. package/dist/components/chat/mermaid-block.js +13 -5
  75. package/dist/components/chat/mermaid-block.js.map +1 -1
  76. package/dist/components/chat/mermaid-share.d.ts +2 -1
  77. package/dist/components/chat/mermaid-share.d.ts.map +1 -1
  78. package/dist/components/chat/mermaid-share.js +7 -8
  79. package/dist/components/chat/mermaid-share.js.map +1 -1
  80. package/dist/components/chat/mermaid-viewer.d.ts.map +1 -1
  81. package/dist/components/chat/mermaid-viewer.js +3 -1
  82. package/dist/components/chat/mermaid-viewer.js.map +1 -1
  83. package/dist/components/chat/message-bubble.d.ts +8 -1
  84. package/dist/components/chat/message-bubble.d.ts.map +1 -1
  85. package/dist/components/chat/message-bubble.js +53 -24
  86. package/dist/components/chat/message-bubble.js.map +1 -1
  87. package/dist/components/chat/message-share.d.ts +2 -1
  88. package/dist/components/chat/message-share.d.ts.map +1 -1
  89. package/dist/components/chat/message-share.js +6 -7
  90. package/dist/components/chat/message-share.js.map +1 -1
  91. package/dist/components/chat/renderers/bind.d.ts +39 -0
  92. package/dist/components/chat/renderers/bind.d.ts.map +1 -0
  93. package/dist/components/chat/renderers/bind.js +43 -0
  94. package/dist/components/chat/renderers/bind.js.map +1 -0
  95. package/dist/components/chat/renderers/brain-ui-tools.d.ts +3 -0
  96. package/dist/components/chat/renderers/brain-ui-tools.d.ts.map +1 -0
  97. package/dist/components/chat/renderers/brain-ui-tools.js +41 -0
  98. package/dist/components/chat/renderers/brain-ui-tools.js.map +1 -0
  99. package/dist/components/chat/renderers/claude-tools.d.ts.map +1 -1
  100. package/dist/components/chat/renderers/claude-tools.js +3 -2
  101. package/dist/components/chat/renderers/claude-tools.js.map +1 -1
  102. package/dist/components/chat/renderers/index.d.ts +10 -2
  103. package/dist/components/chat/renderers/index.d.ts.map +1 -1
  104. package/dist/components/chat/renderers/index.js +15 -10
  105. package/dist/components/chat/renderers/index.js.map +1 -1
  106. package/dist/components/chat/session-drawer.d.ts +4 -0
  107. package/dist/components/chat/session-drawer.d.ts.map +1 -1
  108. package/dist/components/chat/session-drawer.js +32 -32
  109. package/dist/components/chat/session-drawer.js.map +1 -1
  110. package/dist/components/chat/session-list.d.ts +41 -0
  111. package/dist/components/chat/session-list.d.ts.map +1 -0
  112. package/dist/components/chat/session-list.js +10 -0
  113. package/dist/components/chat/session-list.js.map +1 -0
  114. package/dist/components/chat/share-block.d.ts.map +1 -1
  115. package/dist/components/chat/share-block.js +12 -11
  116. package/dist/components/chat/share-block.js.map +1 -1
  117. package/dist/components/chat/share-card.js +2 -2
  118. package/dist/components/chat/share-card.js.map +1 -1
  119. package/dist/components/chat/subagent-view.js +1 -1
  120. package/dist/components/chat/subagent-view.js.map +1 -1
  121. package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
  122. package/dist/components/chat/tool-call-timeline.js +45 -14
  123. package/dist/components/chat/tool-call-timeline.js.map +1 -1
  124. package/dist/components/chat/tool-cards/block-card.d.ts +28 -0
  125. package/dist/components/chat/tool-cards/block-card.d.ts.map +1 -0
  126. package/dist/components/chat/tool-cards/block-card.js +103 -0
  127. package/dist/components/chat/tool-cards/block-card.js.map +1 -0
  128. package/dist/components/chat/tool-cards/image-mask-card.d.ts +70 -0
  129. package/dist/components/chat/tool-cards/image-mask-card.d.ts.map +1 -0
  130. package/dist/components/chat/tool-cards/image-mask-card.js +142 -0
  131. package/dist/components/chat/tool-cards/image-mask-card.js.map +1 -0
  132. package/dist/components/chat/tool-cards/location-card.d.ts +45 -0
  133. package/dist/components/chat/tool-cards/location-card.d.ts.map +1 -0
  134. package/dist/components/chat/tool-cards/location-card.js +128 -0
  135. package/dist/components/chat/tool-cards/location-card.js.map +1 -0
  136. package/dist/components/chat/tool-views.d.ts +19 -2
  137. package/dist/components/chat/tool-views.d.ts.map +1 -1
  138. package/dist/components/chat/tool-views.js +28 -22
  139. package/dist/components/chat/tool-views.js.map +1 -1
  140. package/dist/components/chat/transcript-turn.d.ts +45 -0
  141. package/dist/components/chat/transcript-turn.d.ts.map +1 -0
  142. package/dist/components/chat/transcript-turn.js +25 -0
  143. package/dist/components/chat/transcript-turn.js.map +1 -0
  144. package/dist/components/chat/use-chat-commands.d.ts.map +1 -1
  145. package/dist/components/chat/use-chat-commands.js +13 -16
  146. package/dist/components/chat/use-chat-commands.js.map +1 -1
  147. package/dist/components/chat/welcome-state.d.ts +7 -0
  148. package/dist/components/chat/welcome-state.d.ts.map +1 -1
  149. package/dist/components/chat/welcome-state.js +13 -5
  150. package/dist/components/chat/welcome-state.js.map +1 -1
  151. package/dist/components/connectivity/connection-gate.d.ts.map +1 -1
  152. package/dist/components/connectivity/connection-gate.js +27 -21
  153. package/dist/components/connectivity/connection-gate.js.map +1 -1
  154. package/dist/components/connectivity/login-form.d.ts +31 -0
  155. package/dist/components/connectivity/login-form.d.ts.map +1 -0
  156. package/dist/components/connectivity/login-form.js +19 -0
  157. package/dist/components/connectivity/login-form.js.map +1 -0
  158. package/dist/components/connectivity/login-screen.d.ts +5 -2
  159. package/dist/components/connectivity/login-screen.d.ts.map +1 -1
  160. package/dist/components/connectivity/login-screen.js +41 -31
  161. package/dist/components/connectivity/login-screen.js.map +1 -1
  162. package/dist/components/dev/share-harness.js +1 -1
  163. package/dist/components/dev/share-harness.js.map +1 -1
  164. package/dist/components/files/file-panel.d.ts +1 -1
  165. package/dist/components/files/file-panel.d.ts.map +1 -1
  166. package/dist/components/files/file-panel.js +74 -0
  167. package/dist/components/files/file-panel.js.map +1 -1
  168. package/dist/components/files/file-tree-view.d.ts +45 -0
  169. package/dist/components/files/file-tree-view.d.ts.map +1 -0
  170. package/dist/components/files/file-tree-view.js +51 -0
  171. package/dist/components/files/file-tree-view.js.map +1 -0
  172. package/dist/components/files/file-tree.d.ts +6 -0
  173. package/dist/components/files/file-tree.d.ts.map +1 -1
  174. package/dist/components/files/file-tree.js +39 -43
  175. package/dist/components/files/file-tree.js.map +1 -1
  176. package/dist/components/files/file-viewer-binary.d.ts.map +1 -1
  177. package/dist/components/files/file-viewer-binary.js +3 -2
  178. package/dist/components/files/file-viewer-binary.js.map +1 -1
  179. package/dist/components/files/file-viewer-frame.d.ts +36 -0
  180. package/dist/components/files/file-viewer-frame.d.ts.map +1 -0
  181. package/dist/components/files/file-viewer-frame.js +26 -0
  182. package/dist/components/files/file-viewer-frame.js.map +1 -0
  183. package/dist/components/files/file-viewer.d.ts +5 -0
  184. package/dist/components/files/file-viewer.d.ts.map +1 -1
  185. package/dist/components/files/file-viewer.js +26 -32
  186. package/dist/components/files/file-viewer.js.map +1 -1
  187. package/dist/components/files/frontmatter-chips.d.ts +18 -0
  188. package/dist/components/files/frontmatter-chips.d.ts.map +1 -0
  189. package/dist/components/files/frontmatter-chips.js +11 -0
  190. package/dist/components/files/frontmatter-chips.js.map +1 -0
  191. package/dist/components/files/frontmatter-panel.d.ts +5 -1
  192. package/dist/components/files/frontmatter-panel.d.ts.map +1 -1
  193. package/dist/components/files/frontmatter-panel.js +7 -6
  194. package/dist/components/files/frontmatter-panel.js.map +1 -1
  195. package/dist/components/files/staleness.d.ts +18 -0
  196. package/dist/components/files/staleness.d.ts.map +1 -0
  197. package/dist/components/files/staleness.js +27 -0
  198. package/dist/components/files/staleness.js.map +1 -0
  199. package/dist/components/graph/graph-canvas.d.ts.map +1 -1
  200. package/dist/components/graph/graph-canvas.js +24 -1
  201. package/dist/components/graph/graph-canvas.js.map +1 -1
  202. package/dist/components/graph/graph-controls-column.d.ts +14 -0
  203. package/dist/components/graph/graph-controls-column.d.ts.map +1 -0
  204. package/dist/components/graph/graph-controls-column.js +44 -0
  205. package/dist/components/graph/graph-controls-column.js.map +1 -0
  206. package/dist/components/graph/graph-controls.d.ts +20 -5
  207. package/dist/components/graph/graph-controls.d.ts.map +1 -1
  208. package/dist/components/graph/graph-controls.js +58 -37
  209. package/dist/components/graph/graph-controls.js.map +1 -1
  210. package/dist/components/graph/graph-form.d.ts +82 -0
  211. package/dist/components/graph/graph-form.d.ts.map +1 -0
  212. package/dist/components/graph/graph-form.js +69 -0
  213. package/dist/components/graph/graph-form.js.map +1 -0
  214. package/dist/components/graph/graph-maintenance.d.ts.map +1 -1
  215. package/dist/components/graph/graph-maintenance.js +6 -10
  216. package/dist/components/graph/graph-maintenance.js.map +1 -1
  217. package/dist/components/graph/graph-node-rail.d.ts +13 -0
  218. package/dist/components/graph/graph-node-rail.d.ts.map +1 -0
  219. package/dist/components/graph/graph-node-rail.js +92 -0
  220. package/dist/components/graph/graph-node-rail.js.map +1 -0
  221. package/dist/components/graph/graph-page.d.ts +7 -0
  222. package/dist/components/graph/graph-page.d.ts.map +1 -1
  223. package/dist/components/graph/graph-page.js +102 -12
  224. package/dist/components/graph/graph-page.js.map +1 -1
  225. package/dist/components/graph/graph-scene.d.ts.map +1 -1
  226. package/dist/components/graph/graph-scene.js +100 -24
  227. package/dist/components/graph/graph-scene.js.map +1 -1
  228. package/dist/components/graph/lib/graph-helpers.d.ts +42 -12
  229. package/dist/components/graph/lib/graph-helpers.d.ts.map +1 -1
  230. package/dist/components/graph/lib/graph-helpers.js +33 -41
  231. package/dist/components/graph/lib/graph-helpers.js.map +1 -1
  232. package/dist/components/graph/node-card.d.ts +28 -0
  233. package/dist/components/graph/node-card.d.ts.map +1 -0
  234. package/dist/components/graph/node-card.js +7 -0
  235. package/dist/components/graph/node-card.js.map +1 -0
  236. package/dist/components/graph/node-popover.d.ts +6 -2
  237. package/dist/components/graph/node-popover.d.ts.map +1 -1
  238. package/dist/components/graph/node-popover.js +13 -31
  239. package/dist/components/graph/node-popover.js.map +1 -1
  240. package/dist/components/graph/use-graph-theme.d.ts +32 -4
  241. package/dist/components/graph/use-graph-theme.d.ts.map +1 -1
  242. package/dist/components/graph/use-graph-theme.js +44 -32
  243. package/dist/components/graph/use-graph-theme.js.map +1 -1
  244. package/dist/components/graph/use-node-actions.d.ts +26 -0
  245. package/dist/components/graph/use-node-actions.d.ts.map +1 -0
  246. package/dist/components/graph/use-node-actions.js +54 -0
  247. package/dist/components/graph/use-node-actions.js.map +1 -0
  248. package/dist/components/images/image-share.d.ts +2 -1
  249. package/dist/components/images/image-share.d.ts.map +1 -1
  250. package/dist/components/images/image-share.js +3 -3
  251. package/dist/components/images/image-share.js.map +1 -1
  252. package/dist/components/images/image-viewer.d.ts.map +1 -1
  253. package/dist/components/images/image-viewer.js +3 -1
  254. package/dist/components/images/image-viewer.js.map +1 -1
  255. package/dist/components/images/mask-editor.d.ts.map +1 -1
  256. package/dist/components/images/mask-editor.js +7 -5
  257. package/dist/components/images/mask-editor.js.map +1 -1
  258. package/dist/components/layout/app-shell.d.ts.map +1 -1
  259. package/dist/components/layout/app-shell.js +4 -1
  260. package/dist/components/layout/app-shell.js.map +1 -1
  261. package/dist/components/layout/desktop-palette.d.ts +23 -0
  262. package/dist/components/layout/desktop-palette.d.ts.map +1 -0
  263. package/dist/components/layout/desktop-palette.js +132 -0
  264. package/dist/components/layout/desktop-palette.js.map +1 -0
  265. package/dist/components/layout/key-cap.d.ts +9 -0
  266. package/dist/components/layout/key-cap.d.ts.map +1 -0
  267. package/dist/components/layout/key-cap.js +10 -0
  268. package/dist/components/layout/key-cap.js.map +1 -0
  269. package/dist/components/layout/mobile-tab-bar.d.ts +13 -0
  270. package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -1
  271. package/dist/components/layout/mobile-tab-bar.js +58 -47
  272. package/dist/components/layout/mobile-tab-bar.js.map +1 -1
  273. package/dist/components/layout/shortcut-switch.d.ts +13 -0
  274. package/dist/components/layout/shortcut-switch.d.ts.map +1 -0
  275. package/dist/components/layout/shortcut-switch.js +22 -0
  276. package/dist/components/layout/shortcut-switch.js.map +1 -0
  277. package/dist/components/layout/side-rail.d.ts +28 -0
  278. package/dist/components/layout/side-rail.d.ts.map +1 -1
  279. package/dist/components/layout/side-rail.js +72 -27
  280. package/dist/components/layout/side-rail.js.map +1 -1
  281. package/dist/components/layout/slide-panel.d.ts +25 -2
  282. package/dist/components/layout/slide-panel.d.ts.map +1 -1
  283. package/dist/components/layout/slide-panel.js +13 -4
  284. package/dist/components/layout/slide-panel.js.map +1 -1
  285. package/dist/components/layout/theme.d.ts +22 -0
  286. package/dist/components/layout/theme.d.ts.map +1 -0
  287. package/dist/components/layout/theme.js +44 -0
  288. package/dist/components/layout/theme.js.map +1 -0
  289. package/dist/components/quick-actions/add-form.d.ts +44 -0
  290. package/dist/components/quick-actions/add-form.d.ts.map +1 -0
  291. package/dist/components/quick-actions/add-form.js +32 -0
  292. package/dist/components/quick-actions/add-form.js.map +1 -0
  293. package/dist/components/quick-actions/add-modal.d.ts +7 -0
  294. package/dist/components/quick-actions/add-modal.d.ts.map +1 -1
  295. package/dist/components/quick-actions/add-modal.js +23 -20
  296. package/dist/components/quick-actions/add-modal.js.map +1 -1
  297. package/dist/components/quick-actions/search-modal.d.ts.map +1 -1
  298. package/dist/components/quick-actions/search-modal.js +8 -5
  299. package/dist/components/quick-actions/search-modal.js.map +1 -1
  300. package/dist/components/quick-actions/streaming-modal.d.ts +6 -0
  301. package/dist/components/quick-actions/streaming-modal.d.ts.map +1 -1
  302. package/dist/components/quick-actions/streaming-modal.js +53 -18
  303. package/dist/components/quick-actions/streaming-modal.js.map +1 -1
  304. package/dist/components/quick-actions/streaming-output.d.ts +38 -0
  305. package/dist/components/quick-actions/streaming-output.d.ts.map +1 -0
  306. package/dist/components/quick-actions/streaming-output.js +22 -0
  307. package/dist/components/quick-actions/streaming-output.js.map +1 -0
  308. package/dist/components/quick-actions/whatsup-modal.d.ts +5 -0
  309. package/dist/components/quick-actions/whatsup-modal.d.ts.map +1 -1
  310. package/dist/components/quick-actions/whatsup-modal.js +51 -10
  311. package/dist/components/quick-actions/whatsup-modal.js.map +1 -1
  312. package/dist/components/settings/devices-agents-tab.d.ts +6 -1
  313. package/dist/components/settings/devices-agents-tab.d.ts.map +1 -1
  314. package/dist/components/settings/devices-agents-tab.js +55 -20
  315. package/dist/components/settings/devices-agents-tab.js.map +1 -1
  316. package/dist/components/settings/models-list.d.ts +39 -0
  317. package/dist/components/settings/models-list.d.ts.map +1 -0
  318. package/dist/components/settings/models-list.js +72 -0
  319. package/dist/components/settings/models-list.js.map +1 -0
  320. package/dist/components/settings/models-tab.d.ts +4 -0
  321. package/dist/components/settings/models-tab.d.ts.map +1 -1
  322. package/dist/components/settings/models-tab.js +52 -102
  323. package/dist/components/settings/models-tab.js.map +1 -1
  324. package/dist/components/settings/one-time-agent-credential.js +1 -1
  325. package/dist/components/settings/one-time-agent-credential.js.map +1 -1
  326. package/dist/components/settings/passkey-list.d.ts +35 -0
  327. package/dist/components/settings/passkey-list.d.ts.map +1 -0
  328. package/dist/components/settings/passkey-list.js +34 -0
  329. package/dist/components/settings/passkey-list.js.map +1 -0
  330. package/dist/components/settings/passkey-tab.d.ts +3 -0
  331. package/dist/components/settings/passkey-tab.d.ts.map +1 -1
  332. package/dist/components/settings/passkey-tab.js +53 -45
  333. package/dist/components/settings/passkey-tab.js.map +1 -1
  334. package/dist/components/settings/pi-accounts-list.d.ts +27 -0
  335. package/dist/components/settings/pi-accounts-list.d.ts.map +1 -0
  336. package/dist/components/settings/pi-accounts-list.js +15 -0
  337. package/dist/components/settings/pi-accounts-list.js.map +1 -0
  338. package/dist/components/settings/pi-accounts.d.ts +3 -0
  339. package/dist/components/settings/pi-accounts.d.ts.map +1 -1
  340. package/dist/components/settings/pi-accounts.js +73 -55
  341. package/dist/components/settings/pi-accounts.js.map +1 -1
  342. package/dist/components/settings/principal-list.d.ts +37 -0
  343. package/dist/components/settings/principal-list.d.ts.map +1 -0
  344. package/dist/components/settings/principal-list.js +18 -0
  345. package/dist/components/settings/principal-list.js.map +1 -0
  346. package/dist/components/settings/settings-panel.d.ts +10 -3
  347. package/dist/components/settings/settings-panel.d.ts.map +1 -1
  348. package/dist/components/settings/settings-panel.js +71 -10
  349. package/dist/components/settings/settings-panel.js.map +1 -1
  350. package/dist/components/settings/skills-list.d.ts +53 -0
  351. package/dist/components/settings/skills-list.d.ts.map +1 -0
  352. package/dist/components/settings/skills-list.js +28 -0
  353. package/dist/components/settings/skills-list.js.map +1 -0
  354. package/dist/components/settings/skills-tab.d.ts.map +1 -1
  355. package/dist/components/settings/skills-tab.js +65 -38
  356. package/dist/components/settings/skills-tab.js.map +1 -1
  357. package/dist/components/settings/tool-permissions-list.d.ts +18 -0
  358. package/dist/components/settings/tool-permissions-list.d.ts.map +1 -0
  359. package/dist/components/settings/tool-permissions-list.js +6 -0
  360. package/dist/components/settings/tool-permissions-list.js.map +1 -0
  361. package/dist/components/settings/tool-permissions.d.ts +2 -1
  362. package/dist/components/settings/tool-permissions.d.ts.map +1 -1
  363. package/dist/components/settings/tool-permissions.js +33 -16
  364. package/dist/components/settings/tool-permissions.js.map +1 -1
  365. package/dist/components/settings/web-search-chain.d.ts +41 -0
  366. package/dist/components/settings/web-search-chain.d.ts.map +1 -0
  367. package/dist/components/settings/web-search-chain.js +47 -0
  368. package/dist/components/settings/web-search-chain.js.map +1 -0
  369. package/dist/components/settings/web-search-settings.d.ts +4 -7
  370. package/dist/components/settings/web-search-settings.d.ts.map +1 -1
  371. package/dist/components/settings/web-search-settings.js +54 -76
  372. package/dist/components/settings/web-search-settings.js.map +1 -1
  373. package/dist/components/share/share-menu.d.ts.map +1 -1
  374. package/dist/components/share/share-menu.js +24 -4
  375. package/dist/components/share/share-menu.js.map +1 -1
  376. package/dist/components/voice/dictation-sheet.js +3 -3
  377. package/dist/components/voice/dictation-sheet.js.map +1 -1
  378. package/dist/components/voice/mic-button.js +1 -1
  379. package/dist/components/voice/mic-button.js.map +1 -1
  380. package/dist/components/voice/review-card.js +1 -1
  381. package/dist/components/voice/review-card.js.map +1 -1
  382. package/dist/config.d.ts +5 -2
  383. package/dist/config.d.ts.map +1 -1
  384. package/dist/config.js +15 -5
  385. package/dist/config.js.map +1 -1
  386. package/dist/connection.d.ts +12 -0
  387. package/dist/connection.d.ts.map +1 -0
  388. package/dist/connection.js +421 -0
  389. package/dist/connection.js.map +1 -0
  390. package/dist/default-root.d.ts +3 -0
  391. package/dist/default-root.d.ts.map +1 -0
  392. package/dist/default-root.js +16 -0
  393. package/dist/default-root.js.map +1 -0
  394. package/dist/hooks/use-color-scheme.d.ts +14 -0
  395. package/dist/hooks/use-color-scheme.d.ts.map +1 -0
  396. package/dist/hooks/use-color-scheme.js +37 -0
  397. package/dist/hooks/use-color-scheme.js.map +1 -0
  398. package/dist/hooks/use-fine-pointer.d.ts +12 -0
  399. package/dist/hooks/use-fine-pointer.d.ts.map +1 -0
  400. package/dist/hooks/use-fine-pointer.js +15 -0
  401. package/dist/hooks/use-fine-pointer.js.map +1 -0
  402. package/dist/hooks/use-hash-routes.d.ts.map +1 -1
  403. package/dist/hooks/use-hash-routes.js +4 -2
  404. package/dist/hooks/use-hash-routes.js.map +1 -1
  405. package/dist/hooks/use-media-query.d.ts +9 -0
  406. package/dist/hooks/use-media-query.d.ts.map +1 -0
  407. package/dist/hooks/use-media-query.js +38 -0
  408. package/dist/hooks/use-media-query.js.map +1 -0
  409. package/dist/hooks/use-share-intake.d.ts.map +1 -1
  410. package/dist/hooks/use-share-intake.js +37 -12
  411. package/dist/hooks/use-share-intake.js.map +1 -1
  412. package/dist/hooks/use-vpn-status.d.ts.map +1 -1
  413. package/dist/hooks/use-vpn-status.js +17 -18
  414. package/dist/hooks/use-vpn-status.js.map +1 -1
  415. package/dist/hooks/use-websocket.d.ts +5 -24
  416. package/dist/hooks/use-websocket.d.ts.map +1 -1
  417. package/dist/hooks/use-websocket.js +11 -384
  418. package/dist/hooks/use-websocket.js.map +1 -1
  419. package/dist/hooks/websocket-handlers/activity.d.ts +2 -2
  420. package/dist/hooks/websocket-handlers/activity.d.ts.map +1 -1
  421. package/dist/hooks/websocket-handlers/activity.js +4 -5
  422. package/dist/hooks/websocket-handlers/activity.js.map +1 -1
  423. package/dist/hooks/websocket-handlers/chat.d.ts +1 -0
  424. package/dist/hooks/websocket-handlers/chat.d.ts.map +1 -1
  425. package/dist/hooks/websocket-handlers/chat.js +28 -6
  426. package/dist/hooks/websocket-handlers/chat.js.map +1 -1
  427. package/dist/hooks/websocket-handlers/connection.d.ts.map +1 -1
  428. package/dist/hooks/websocket-handlers/connection.js +4 -6
  429. package/dist/hooks/websocket-handlers/connection.js.map +1 -1
  430. package/dist/hooks/websocket-handlers/mask.d.ts +1 -1
  431. package/dist/hooks/websocket-handlers/mask.d.ts.map +1 -1
  432. package/dist/hooks/websocket-handlers/mask.js +2 -3
  433. package/dist/hooks/websocket-handlers/mask.js.map +1 -1
  434. package/dist/hooks/websocket-handlers/provider.d.ts.map +1 -1
  435. package/dist/hooks/websocket-handlers/provider.js +4 -6
  436. package/dist/hooks/websocket-handlers/provider.js.map +1 -1
  437. package/dist/hooks/websocket-handlers/types.d.ts +6 -2
  438. package/dist/hooks/websocket-handlers/types.d.ts.map +1 -1
  439. package/dist/index.d.ts +5 -3
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js +6 -3
  442. package/dist/index.js.map +1 -1
  443. package/dist/lib/api-client.d.ts +289 -0
  444. package/dist/lib/api-client.d.ts.map +1 -1
  445. package/dist/lib/api-client.js +243 -224
  446. package/dist/lib/api-client.js.map +1 -1
  447. package/dist/lib/backend.d.ts +19 -2
  448. package/dist/lib/backend.d.ts.map +1 -1
  449. package/dist/lib/backend.js +15 -9
  450. package/dist/lib/backend.js.map +1 -1
  451. package/dist/lib/diff.d.ts +8 -10
  452. package/dist/lib/diff.d.ts.map +1 -1
  453. package/dist/lib/diff.js +26 -53
  454. package/dist/lib/diff.js.map +1 -1
  455. package/dist/lib/light-dark.d.ts +37 -0
  456. package/dist/lib/light-dark.d.ts.map +1 -0
  457. package/dist/lib/light-dark.js +83 -0
  458. package/dist/lib/light-dark.js.map +1 -0
  459. package/dist/lib/mermaid-theme.d.ts +7 -2
  460. package/dist/lib/mermaid-theme.d.ts.map +1 -1
  461. package/dist/lib/mermaid-theme.js +125 -203
  462. package/dist/lib/mermaid-theme.js.map +1 -1
  463. package/dist/lib/passkeys.d.ts +6 -3
  464. package/dist/lib/passkeys.d.ts.map +1 -1
  465. package/dist/lib/passkeys.js +10 -4
  466. package/dist/lib/passkeys.js.map +1 -1
  467. package/dist/lib/push-registration.d.ts +4 -1
  468. package/dist/lib/push-registration.d.ts.map +1 -1
  469. package/dist/lib/push-registration.js +20 -2
  470. package/dist/lib/push-registration.js.map +1 -1
  471. package/dist/lib/share-intake.d.ts +2 -1
  472. package/dist/lib/share-intake.d.ts.map +1 -1
  473. package/dist/lib/share-intake.js +3 -3
  474. package/dist/lib/share-intake.js.map +1 -1
  475. package/dist/lib/share.d.ts +4 -3
  476. package/dist/lib/share.d.ts.map +1 -1
  477. package/dist/lib/share.js +6 -7
  478. package/dist/lib/share.js.map +1 -1
  479. package/dist/lib/single-key.d.ts +30 -0
  480. package/dist/lib/single-key.d.ts.map +1 -0
  481. package/dist/lib/single-key.js +45 -0
  482. package/dist/lib/single-key.js.map +1 -0
  483. package/dist/lib/tool-names.d.ts +8 -6
  484. package/dist/lib/tool-names.d.ts.map +1 -1
  485. package/dist/lib/tool-names.js +17 -7
  486. package/dist/lib/tool-names.js.map +1 -1
  487. package/dist/root-context.d.ts +229 -0
  488. package/dist/root-context.d.ts.map +1 -0
  489. package/dist/root-context.js +33 -0
  490. package/dist/root-context.js.map +1 -0
  491. package/dist/root.d.ts +38 -0
  492. package/dist/root.d.ts.map +1 -0
  493. package/dist/root.js +47 -0
  494. package/dist/root.js.map +1 -0
  495. package/dist/stores/activity-state.d.ts +29 -0
  496. package/dist/stores/activity-state.d.ts.map +1 -0
  497. package/dist/stores/activity-state.js +282 -0
  498. package/dist/stores/activity-state.js.map +1 -0
  499. package/dist/stores/activity-store.d.ts +10 -41
  500. package/dist/stores/activity-store.d.ts.map +1 -1
  501. package/dist/stores/activity-store.js +9 -271
  502. package/dist/stores/activity-store.js.map +1 -1
  503. package/dist/stores/chat-state.d.ts +233 -0
  504. package/dist/stores/chat-state.d.ts.map +1 -0
  505. package/dist/stores/chat-state.js +477 -0
  506. package/dist/stores/chat-state.js.map +1 -0
  507. package/dist/stores/chat-store.d.ts +4 -162
  508. package/dist/stores/chat-store.d.ts.map +1 -1
  509. package/dist/stores/chat-store.js +7 -418
  510. package/dist/stores/chat-store.js.map +1 -1
  511. package/dist/stores/connection-state.d.ts +40 -0
  512. package/dist/stores/connection-state.d.ts.map +1 -0
  513. package/dist/stores/connection-state.js +30 -0
  514. package/dist/stores/connection-state.js.map +1 -0
  515. package/dist/stores/connection-store.d.ts +4 -40
  516. package/dist/stores/connection-store.d.ts.map +1 -1
  517. package/dist/stores/connection-store.js +7 -27
  518. package/dist/stores/connection-store.js.map +1 -1
  519. package/dist/stores/create-stores.d.ts +23 -0
  520. package/dist/stores/create-stores.d.ts.map +1 -0
  521. package/dist/stores/create-stores.js +28 -0
  522. package/dist/stores/create-stores.js.map +1 -0
  523. package/dist/stores/file-state.d.ts +53 -0
  524. package/dist/stores/file-state.d.ts.map +1 -0
  525. package/dist/stores/file-state.js +341 -0
  526. package/dist/stores/file-state.js.map +1 -0
  527. package/dist/stores/file-store.d.ts +4 -52
  528. package/dist/stores/file-store.d.ts.map +1 -1
  529. package/dist/stores/file-store.js +7 -336
  530. package/dist/stores/file-store.js.map +1 -1
  531. package/dist/stores/graph-state.d.ts +95 -0
  532. package/dist/stores/graph-state.d.ts.map +1 -0
  533. package/dist/stores/graph-state.js +252 -0
  534. package/dist/stores/graph-state.js.map +1 -0
  535. package/dist/stores/graph-store.d.ts +7 -83
  536. package/dist/stores/graph-store.d.ts.map +1 -1
  537. package/dist/stores/graph-store.js +8 -249
  538. package/dist/stores/graph-store.js.map +1 -1
  539. package/dist/stores/mask-state.d.ts +21 -0
  540. package/dist/stores/mask-state.d.ts.map +1 -0
  541. package/dist/stores/mask-state.js +9 -0
  542. package/dist/stores/mask-state.js.map +1 -0
  543. package/dist/stores/mask-store.d.ts +4 -21
  544. package/dist/stores/mask-store.d.ts.map +1 -1
  545. package/dist/stores/mask-store.js +7 -6
  546. package/dist/stores/mask-store.js.map +1 -1
  547. package/dist/stores/principal-state.d.ts +16 -0
  548. package/dist/stores/principal-state.d.ts.map +1 -0
  549. package/dist/stores/principal-state.js +31 -0
  550. package/dist/stores/principal-state.js.map +1 -0
  551. package/dist/stores/principal-store.d.ts +4 -15
  552. package/dist/stores/principal-store.d.ts.map +1 -1
  553. package/dist/stores/principal-store.js +7 -28
  554. package/dist/stores/principal-store.js.map +1 -1
  555. package/dist/stores/provider-state.d.ts +24 -0
  556. package/dist/stores/provider-state.d.ts.map +1 -0
  557. package/dist/stores/provider-state.js +68 -0
  558. package/dist/stores/provider-state.js.map +1 -0
  559. package/dist/stores/provider-store.d.ts +4 -23
  560. package/dist/stores/provider-store.d.ts.map +1 -1
  561. package/dist/stores/provider-store.js +7 -64
  562. package/dist/stores/provider-store.js.map +1 -1
  563. package/dist/stores/share-state.d.ts +29 -0
  564. package/dist/stores/share-state.d.ts.map +1 -0
  565. package/dist/stores/share-state.js +21 -0
  566. package/dist/stores/share-state.js.map +1 -0
  567. package/dist/stores/share-store.d.ts +4 -28
  568. package/dist/stores/share-store.d.ts.map +1 -1
  569. package/dist/stores/share-store.js +7 -18
  570. package/dist/stores/share-store.js.map +1 -1
  571. package/dist/stores/store-environment.d.ts +10 -0
  572. package/dist/stores/store-environment.d.ts.map +1 -0
  573. package/dist/stores/store-environment.js +2 -0
  574. package/dist/stores/store-environment.js.map +1 -0
  575. package/dist/stores/ui-state.d.ts +71 -0
  576. package/dist/stores/ui-state.d.ts.map +1 -0
  577. package/dist/stores/ui-state.js +58 -0
  578. package/dist/stores/ui-state.js.map +1 -0
  579. package/dist/stores/ui-store.d.ts +4 -45
  580. package/dist/stores/ui-store.d.ts.map +1 -1
  581. package/dist/stores/ui-store.js +7 -36
  582. package/dist/stores/ui-store.js.map +1 -1
  583. package/dist/styles.css +1 -1
  584. package/dist/theme.css +150 -97
  585. package/dist/voice/asr-clients.d.ts +2 -1
  586. package/dist/voice/asr-clients.d.ts.map +1 -1
  587. package/dist/voice/asr-clients.js +16 -17
  588. package/dist/voice/asr-clients.js.map +1 -1
  589. package/dist/voice/use-dictation.d.ts.map +1 -1
  590. package/dist/voice/use-dictation.js +12 -8
  591. package/dist/voice/use-dictation.js.map +1 -1
  592. package/dist/voice/voice-state.d.ts +25 -0
  593. package/dist/voice/voice-state.d.ts.map +1 -0
  594. package/dist/voice/voice-state.js +29 -0
  595. package/dist/voice/voice-state.js.map +1 -0
  596. package/dist/voice/voice-store.d.ts +4 -25
  597. package/dist/voice/voice-store.d.ts.map +1 -1
  598. package/dist/voice/voice-store.js +7 -26
  599. package/dist/voice/voice-store.js.map +1 -1
  600. package/package.json +3 -2
  601. package/src/components/activity/activity-page.tsx +341 -160
  602. package/src/components/activity/activity-run-detail.tsx +81 -47
  603. package/src/components/activity/activity-run-list.tsx +27 -59
  604. package/src/components/activity/activity-views.tsx +155 -0
  605. package/src/components/activity/approval-card.tsx +117 -0
  606. package/src/components/activity/digest-card.tsx +25 -61
  607. package/src/components/activity/digest-summary.tsx +52 -0
  608. package/src/components/activity/push-switch.tsx +62 -0
  609. package/src/components/activity/push-toggle.tsx +51 -81
  610. package/src/components/activity/span-bits.tsx +60 -7
  611. package/src/components/chat/ask-user-card.tsx +292 -356
  612. package/src/components/chat/ask-user-typed.ts +77 -0
  613. package/src/components/chat/brain-markdown-links.tsx +4 -4
  614. package/src/components/chat/brain-markdown.tsx +4 -2
  615. package/src/components/chat/chat-page.tsx +41 -11
  616. package/src/components/chat/composer-view.tsx +194 -0
  617. package/src/components/chat/composer.tsx +117 -296
  618. package/src/components/chat/markdown-content.tsx +53 -2
  619. package/src/components/chat/mermaid-block.tsx +13 -5
  620. package/src/components/chat/mermaid-share.ts +8 -7
  621. package/src/components/chat/mermaid-viewer.tsx +3 -1
  622. package/src/components/chat/message-bubble.tsx +78 -94
  623. package/src/components/chat/message-share.ts +7 -7
  624. package/src/components/chat/renderers/bind.tsx +94 -0
  625. package/src/components/chat/renderers/brain-ui-tools.tsx +56 -0
  626. package/src/components/chat/renderers/claude-tools.tsx +3 -2
  627. package/src/components/chat/renderers/index.ts +15 -10
  628. package/src/components/chat/session-drawer.tsx +41 -138
  629. package/src/components/chat/session-list.tsx +113 -0
  630. package/src/components/chat/share-block.tsx +16 -12
  631. package/src/components/chat/share-card.tsx +2 -2
  632. package/src/components/chat/subagent-view.tsx +4 -4
  633. package/src/components/chat/tool-call-timeline.tsx +75 -26
  634. package/src/components/chat/tool-cards/block-card.tsx +145 -0
  635. package/src/components/chat/tool-cards/image-mask-card.tsx +214 -0
  636. package/src/components/chat/tool-cards/location-card.tsx +159 -0
  637. package/src/components/chat/tool-views.tsx +30 -60
  638. package/src/components/chat/transcript-turn.tsx +108 -0
  639. package/src/components/chat/use-chat-commands.ts +14 -16
  640. package/src/components/chat/welcome-state.tsx +36 -91
  641. package/src/components/connectivity/connection-gate.tsx +32 -24
  642. package/src/components/connectivity/login-form.tsx +122 -0
  643. package/src/components/connectivity/login-screen.tsx +45 -100
  644. package/src/components/dev/share-harness.tsx +2 -2
  645. package/src/components/files/file-panel.tsx +168 -0
  646. package/src/components/files/file-tree-view.tsx +127 -0
  647. package/src/components/files/file-tree.tsx +55 -109
  648. package/src/components/files/file-viewer-binary.tsx +3 -2
  649. package/src/components/files/file-viewer-frame.tsx +113 -0
  650. package/src/components/files/file-viewer.tsx +40 -95
  651. package/src/components/files/frontmatter-chips.tsx +42 -0
  652. package/src/components/files/frontmatter-panel.tsx +6 -71
  653. package/src/components/files/staleness.ts +29 -0
  654. package/src/components/graph/graph-canvas.tsx +24 -1
  655. package/src/components/graph/graph-controls-column.tsx +92 -0
  656. package/src/components/graph/graph-controls.tsx +83 -127
  657. package/src/components/graph/graph-form.tsx +183 -0
  658. package/src/components/graph/graph-maintenance.tsx +9 -14
  659. package/src/components/graph/graph-node-rail.tsx +147 -0
  660. package/src/components/graph/graph-page.tsx +189 -49
  661. package/src/components/graph/graph-scene.tsx +200 -30
  662. package/src/components/graph/lib/graph-helpers.ts +65 -43
  663. package/src/components/graph/node-card.tsx +64 -0
  664. package/src/components/graph/node-popover.tsx +28 -117
  665. package/src/components/graph/use-graph-theme.ts +69 -32
  666. package/src/components/graph/use-node-actions.ts +56 -0
  667. package/src/components/images/image-share.ts +4 -2
  668. package/src/components/images/image-viewer.tsx +3 -1
  669. package/src/components/images/mask-editor.tsx +7 -4
  670. package/src/components/layout/app-shell.tsx +5 -1
  671. package/src/components/layout/desktop-palette.tsx +151 -0
  672. package/src/components/layout/key-cap.tsx +15 -0
  673. package/src/components/layout/mobile-tab-bar.tsx +80 -157
  674. package/src/components/layout/shortcut-switch.tsx +32 -0
  675. package/src/components/layout/side-rail.tsx +77 -150
  676. package/src/components/layout/slide-panel.tsx +49 -6
  677. package/src/components/layout/theme.tsx +67 -0
  678. package/src/components/quick-actions/add-form.tsx +196 -0
  679. package/src/components/quick-actions/add-modal.tsx +32 -153
  680. package/src/components/quick-actions/search-modal.tsx +15 -5
  681. package/src/components/quick-actions/streaming-modal.tsx +57 -72
  682. package/src/components/quick-actions/streaming-output.tsx +112 -0
  683. package/src/components/quick-actions/whatsup-modal.tsx +53 -59
  684. package/src/components/settings/devices-agents-tab.tsx +60 -152
  685. package/src/components/settings/models-list.tsx +299 -0
  686. package/src/components/settings/models-tab.tsx +63 -337
  687. package/src/components/settings/one-time-agent-credential.tsx +1 -1
  688. package/src/components/settings/passkey-list.tsx +201 -0
  689. package/src/components/settings/passkey-tab.tsx +53 -197
  690. package/src/components/settings/pi-accounts-list.tsx +128 -0
  691. package/src/components/settings/pi-accounts.tsx +71 -170
  692. package/src/components/settings/principal-list.tsx +172 -0
  693. package/src/components/settings/settings-panel.tsx +239 -25
  694. package/src/components/settings/skills-list.tsx +276 -0
  695. package/src/components/settings/skills-tab.tsx +82 -269
  696. package/src/components/settings/tool-permissions-list.tsx +54 -0
  697. package/src/components/settings/tool-permissions.tsx +27 -46
  698. package/src/components/settings/web-search-chain.tsx +300 -0
  699. package/src/components/settings/web-search-settings.tsx +58 -328
  700. package/src/components/share/share-menu.tsx +19 -4
  701. package/src/components/voice/dictation-sheet.tsx +5 -5
  702. package/src/components/voice/mic-button.tsx +1 -1
  703. package/src/components/voice/review-card.tsx +1 -1
  704. package/src/config.ts +21 -7
  705. package/src/connection.ts +443 -0
  706. package/src/default-root.ts +16 -0
  707. package/src/hooks/use-color-scheme.ts +36 -0
  708. package/src/hooks/use-fine-pointer.ts +15 -0
  709. package/src/hooks/use-hash-routes.ts +4 -2
  710. package/src/hooks/use-media-query.ts +35 -0
  711. package/src/hooks/use-share-intake.ts +32 -12
  712. package/src/hooks/use-vpn-status.ts +18 -17
  713. package/src/hooks/use-websocket.ts +12 -428
  714. package/src/hooks/websocket-handlers/activity.ts +4 -5
  715. package/src/hooks/websocket-handlers/chat.ts +28 -6
  716. package/src/hooks/websocket-handlers/connection.ts +4 -6
  717. package/src/hooks/websocket-handlers/mask.ts +2 -3
  718. package/src/hooks/websocket-handlers/provider.ts +4 -6
  719. package/src/hooks/websocket-handlers/types.ts +6 -2
  720. package/src/index.ts +7 -3
  721. package/src/lib/api-client.ts +426 -384
  722. package/src/lib/backend.ts +20 -10
  723. package/src/lib/diff.ts +28 -62
  724. package/src/lib/light-dark.ts +83 -0
  725. package/src/lib/mermaid-theme.ts +183 -214
  726. package/src/lib/passkeys.ts +12 -4
  727. package/src/lib/push-registration.ts +19 -2
  728. package/src/lib/share-intake.ts +6 -3
  729. package/src/lib/share.ts +7 -4
  730. package/src/lib/single-key.ts +47 -0
  731. package/src/lib/tool-names.ts +31 -8
  732. package/src/root-context.tsx +40 -0
  733. package/src/root.ts +83 -0
  734. package/src/stores/activity-state.ts +295 -0
  735. package/src/stores/activity-store.ts +11 -285
  736. package/src/stores/chat-state.ts +822 -0
  737. package/src/stores/chat-store.ts +11 -705
  738. package/src/stores/connection-state.ts +78 -0
  739. package/src/stores/connection-store.ts +11 -76
  740. package/src/stores/create-stores.ts +31 -0
  741. package/src/stores/file-state.ts +399 -0
  742. package/src/stores/file-store.ts +9 -390
  743. package/src/stores/graph-state.ts +368 -0
  744. package/src/stores/graph-store.ts +10 -355
  745. package/src/stores/mask-state.ts +30 -0
  746. package/src/stores/mask-store.ts +10 -27
  747. package/src/stores/principal-state.ts +42 -0
  748. package/src/stores/principal-store.ts +10 -37
  749. package/src/stores/provider-state.ts +103 -0
  750. package/src/stores/provider-store.ts +10 -95
  751. package/src/stores/share-state.ts +56 -0
  752. package/src/stores/share-store.ts +11 -54
  753. package/src/stores/store-environment.ts +10 -0
  754. package/src/stores/ui-state.ts +143 -0
  755. package/src/stores/ui-store.ts +11 -93
  756. package/src/styles.css +4 -1
  757. package/src/theme.css +150 -97
  758. package/src/voice/asr-clients.ts +17 -17
  759. package/src/voice/use-dictation.ts +11 -8
  760. package/src/voice/voice-state.ts +57 -0
  761. package/src/voice/voice-store.ts +11 -55
package/src/theme.css CHANGED
@@ -6,39 +6,26 @@
6
6
  * @source "../node_modules/@schlessera/brain-ui-react/src";
7
7
  * so the consumer build scans the component sources. Consumers without a
8
8
  * Tailwind build use the precompiled ./styles.css export instead.
9
+ *
10
+ * The kit's tokens come in here, so a consumer cannot forget them: the kit
11
+ * components this package renders read `--bk-*` and draw no colour without
12
+ * it (kit D23). It is the kit's `tokens.css`, not its `theme.css` — that
13
+ * entry carries the kit's own `@theme static` scales, and its `--spacing-2:
14
+ * 2px` would redefine this app's `p-2`. `tokens.css` is plain CSS: the
15
+ * values, the `color-scheme` switch under `[data-theme]`, the one `breathe`
16
+ * keyframe and the interaction rules, and no utility name.
9
17
  */
10
- @theme {
11
- /* Backgrounds - warm-tinted darks */
12
- --color-background: #0c0e12;
13
- --color-surface: #141619;
14
- --color-surface-raised: #1a1d22;
15
- --color-surface-overlay: #1e2128;
16
-
17
- /* Borders */
18
- --color-border: #2a2d35;
19
- --color-border-subtle: #1f2229;
20
-
21
- /* Text hierarchy */
22
- --color-foreground: #e8e4df;
23
- --color-muted: #141619;
24
- --color-muted-foreground: #8a8691;
25
- --color-card: #141619;
26
- --color-card-foreground: #e8e4df;
27
-
28
- /* Primary: Amber */
29
- --color-primary: #e09f3e;
30
- --color-primary-foreground: #0c0e12;
31
-
32
- /* Secondary */
33
- --color-secondary: #1a1d22;
34
- --color-secondary-foreground: #e8e4df;
35
- --color-accent: #5bb5a2;
36
- --color-accent-foreground: #0c0e12;
18
+ @import "@schlessera/brain-ui-kit/tokens.css";
37
19
 
38
- /* Semantic */
39
- --color-destructive: #f87171;
40
- --color-input: #2a2d35;
41
- --color-ring: #e09f3e80;
20
+ @theme {
21
+ /* D22's ladder (D37 confirmed it): the phone bar to 479, the collapsed rail
22
+ from 480, the expanded rail from 900, and a fourth pane from 1280 — with
23
+ the rule that a four-pane screen needs 1440. `md:` stays Tailwind's 768 for
24
+ content paddings; navigation and panes key on these. */
25
+ --breakpoint-tablet: 480px;
26
+ --breakpoint-laptop: 900px;
27
+ --breakpoint-desktop: 1280px;
28
+ --breakpoint-wide: 1440px;
42
29
 
43
30
  /* Radius */
44
31
  --radius: 0.5rem;
@@ -49,15 +36,80 @@
49
36
  --font-mono: "JetBrains Mono", ui-monospace, monospace;
50
37
  }
51
38
 
39
+ /*
40
+ * Colour. Every utility colour is the kit's token, and nothing else: the
41
+ * tokens are `light-dark()` pairs switched by `color-scheme` under
42
+ * `[data-theme]` (kit D32), so a literal hex here would be the one colour
43
+ * in the app that stays dark on paper — which is exactly what these were
44
+ * until the app shell was checked in light. `@theme inline` makes each
45
+ * utility carry `var(--bk-*)` itself rather than a `--color-*` alias on
46
+ * `:root`, so the token resolves where it is used and a light subtree
47
+ * inside a dark page keeps working.
48
+ *
49
+ * Two names per accent, because the kit has two: the INK (`--bk-color-amber`,
50
+ * a dark amber on paper) is for text, borders and rings — `text-primary`,
51
+ * `border-primary` — and the FILL (`--bk-amber-fill`, the same amber in
52
+ * both themes) is for solid or tinted backgrounds — `bg-primary-fill`,
53
+ * `bg-primary-fill/10` — with `--bk-on-fill` as the foreground that sits
54
+ * on it. One name serving both is how a solid amber button turned into dark
55
+ * brown on paper.
56
+ *
57
+ * `tests/theme-neutral.test.ts` holds this file to the rule: no hex, no
58
+ * rgb literal, only `var(--bk-*)` or a `color-mix()` of one.
59
+ */
60
+ @theme inline {
61
+ /* Surfaces, from the canvas up */
62
+ --color-background: var(--bk-color-canvas);
63
+ --color-surface: var(--bk-color-surface);
64
+ --color-surface-raised: var(--bk-color-raised);
65
+ --color-surface-overlay: var(--bk-color-raised);
66
+
67
+ /* Borders */
68
+ --color-border: var(--bk-color-edge);
69
+ --color-border-subtle: var(--bk-color-line);
70
+
71
+ /* Text hierarchy */
72
+ --color-foreground: var(--bk-color-ink);
73
+ --color-muted: var(--bk-color-surface);
74
+ --color-muted-foreground: var(--bk-color-ink-mute);
75
+ --color-card: var(--bk-color-surface);
76
+ --color-card-foreground: var(--bk-color-ink);
77
+
78
+ /* Primary: amber. The MARK is the kit's third weight, for a dot of six
79
+ to eight pixels: a fill that small falls under 3:1 on paper, so the
80
+ kit darkens it (`--bk-amber-mark`) and the app uses it for status dots. */
81
+ --color-primary: var(--bk-color-amber);
82
+ --color-primary-fill: var(--bk-amber-fill);
83
+ --color-primary-mark: var(--bk-amber-mark);
84
+ --color-primary-foreground: var(--bk-on-fill);
85
+
86
+ /* Secondary */
87
+ --color-secondary: var(--bk-color-raised);
88
+ --color-secondary-foreground: var(--bk-color-ink);
89
+
90
+ /* Accent: teal */
91
+ --color-accent: var(--bk-color-teal);
92
+ --color-accent-fill: var(--bk-teal-fill);
93
+ --color-accent-mark: var(--bk-teal-mark);
94
+ --color-accent-foreground: var(--bk-on-fill);
95
+
96
+ /* Semantic */
97
+ --color-destructive: var(--bk-color-red);
98
+ --color-destructive-fill: var(--bk-red-fill);
99
+ --color-destructive-mark: var(--bk-red-mark);
100
+ --color-input: var(--bk-color-edge);
101
+ --color-ring: color-mix(in srgb, var(--bk-color-amber) 50%, transparent);
102
+ }
103
+
52
104
  /* Amber filament line */
53
105
  .filament {
54
106
  height: 1px;
55
107
  background: linear-gradient(
56
108
  to right,
57
109
  transparent 0%,
58
- #e09f3e 30%,
59
- #eab354 50%,
60
- #e09f3e 70%,
110
+ var(--bk-filament-edge) 30%,
111
+ var(--bk-filament-core) 50%,
112
+ var(--bk-filament-edge) 70%,
61
113
  transparent 100%
62
114
  );
63
115
  opacity: 0.7;
@@ -68,13 +120,13 @@
68
120
  opacity: 1;
69
121
  height: 2px;
70
122
  background:
71
- radial-gradient(circle at center, #eab354 0%, transparent 40%) no-repeat,
123
+ radial-gradient(circle at center, var(--bk-filament-core) 0%, transparent 40%) no-repeat,
72
124
  linear-gradient(
73
125
  to right,
74
126
  transparent 0%,
75
- #e09f3e 30%,
76
- #eab354 50%,
77
- #e09f3e 70%,
127
+ var(--bk-filament-edge) 30%,
128
+ var(--bk-filament-core) 50%,
129
+ var(--bk-filament-edge) 70%,
78
130
  transparent 100%
79
131
  );
80
132
  background-size:
@@ -96,28 +148,20 @@
96
148
  }
97
149
  }
98
150
 
99
- /* Breathing animation for streaming indicators */
100
- @keyframes breathe {
101
- 0%,
102
- 100% {
103
- box-shadow: 0 0 0 0 rgba(224, 159, 62, 0.15);
104
- opacity: 1;
105
- }
106
- 50% {
107
- box-shadow: 0 0 8px 2px rgba(224, 159, 62, 0.15);
108
- opacity: 0.6;
109
- }
110
- }
151
+ /* `breathe`, the one ambient keyframe, comes from the kit's tokens.css
152
+ * (imported after this file in styles.css), which also carries its
153
+ * reduced-motion override. Declaring it here as well would sit BEFORE that
154
+ * override in source order and cancel it, so the app declares nothing. */
111
155
 
112
156
  /* Whatsup briefing styling */
113
157
  .whatsup-briefing {
114
158
  font-family: var(--font-body);
115
159
  font-size: 0.875rem;
116
160
  line-height: 1.7;
117
- color: #e8e4df;
161
+ color: var(--bk-color-ink);
118
162
  }
119
163
  .whatsup-briefing h2 {
120
- color: #5bb5a2;
164
+ color: var(--bk-color-teal);
121
165
  font-family: var(--font-display);
122
166
  font-size: 0.9rem;
123
167
  font-weight: 400;
@@ -125,7 +169,7 @@
125
169
  padding-bottom: 0.375rem;
126
170
  margin-bottom: 0.5rem;
127
171
  margin-top: 1.5rem;
128
- border-bottom: 1px solid #2a2d35;
172
+ border-bottom: 1px solid var(--bk-color-edge);
129
173
  }
130
174
  .whatsup-briefing h2:first-child {
131
175
  margin-top: 0;
@@ -133,39 +177,48 @@
133
177
 
134
178
  /* Entity color-coding */
135
179
  .whatsup-briefing .entity-co {
136
- color: #67b8e3;
180
+ color: var(--bk-color-blue);
137
181
  font-weight: 600;
138
182
  }
139
183
  .whatsup-briefing .entity-p {
140
- color: #5bb5a2;
184
+ color: var(--bk-color-teal);
141
185
  font-weight: 600;
142
186
  }
143
187
  .whatsup-briefing .entity-proj {
144
- color: #b197d4;
188
+ color: var(--bk-color-purple);
145
189
  font-weight: 600;
146
190
  }
147
191
  .whatsup-briefing .entity-ev {
148
- color: #e09f3e;
192
+ color: var(--bk-color-amber);
149
193
  font-weight: 600;
150
194
  }
151
195
  .whatsup-briefing .entity-d {
152
- color: #67b8e3;
196
+ color: var(--bk-color-blue);
153
197
  }
154
198
  .whatsup-briefing .entity-st {
155
- color: #eab354;
199
+ color: var(--bk-color-gold);
156
200
  }
157
201
  .whatsup-briefing .entity-f {
158
- color: #8a8691;
202
+ color: var(--bk-color-ink-mute);
159
203
  font-family: var(--font-mono);
160
204
  font-size: 0.85em;
161
205
  }
162
206
 
163
- /* ── Brain prose: unified markdown styles ── */
207
+ /* ── Brain prose: unified markdown styles ──
208
+ *
209
+ * The tints below are derived from the kit's tokens by the kit's own rule
210
+ * (seventh drop, ruling 3): a GROUND takes the FILL hue (`--bk-amber-fill`,
211
+ * `--bk-teal-fill` — a table row's hover at 3%, a blockquote's ground at 4%,
212
+ * a file link's hover ground at 10%), and a LINE takes the INK hue
213
+ * (`--bk-color-amber`, `--bk-color-teal` — a link's underline at 30% resting
214
+ * and 80% hovered, the file link's dotted underline at 40% / 80%). The ink
215
+ * hue at low alpha reads as dirt on paper; the fill hue at full alpha is a
216
+ * 1.9:1 line. */
164
217
  .brain-prose {
165
218
  font-family: var(--font-body);
166
219
  font-size: 0.875rem;
167
220
  line-height: 1.7;
168
- color: #e8e4df;
221
+ color: var(--bk-color-ink);
169
222
  }
170
223
 
171
224
  /* Headings */
@@ -173,7 +226,7 @@
173
226
  font-family: var(--font-display);
174
227
  font-size: 1.5rem;
175
228
  font-weight: 400;
176
- color: #e8e4df;
229
+ color: var(--bk-color-ink);
177
230
  margin-top: 2rem;
178
231
  margin-bottom: 0.75rem;
179
232
  }
@@ -181,17 +234,17 @@
181
234
  font-family: var(--font-display);
182
235
  font-size: 1.15rem;
183
236
  font-weight: 400;
184
- color: #e09f3e;
237
+ color: var(--bk-color-amber);
185
238
  margin-top: 1.75rem;
186
239
  margin-bottom: 0.5rem;
187
240
  padding-bottom: 0.375rem;
188
- border-bottom: 1px solid #2a2d35;
241
+ border-bottom: 1px solid var(--bk-color-edge);
189
242
  }
190
243
  .brain-prose h3 {
191
244
  font-family: var(--font-body);
192
245
  font-size: 0.95rem;
193
246
  font-weight: 600;
194
- color: #e8e4df;
247
+ color: var(--bk-color-ink);
195
248
  margin-top: 1.5rem;
196
249
  margin-bottom: 0.375rem;
197
250
  }
@@ -199,7 +252,7 @@
199
252
  font-family: var(--font-body);
200
253
  font-size: 0.875rem;
201
254
  font-weight: 600;
202
- color: #8a8691;
255
+ color: var(--bk-color-ink-mute);
203
256
  text-transform: uppercase;
204
257
  letter-spacing: 0.04em;
205
258
  margin-top: 1.25rem;
@@ -218,23 +271,23 @@
218
271
  /* Bold / italic */
219
272
  .brain-prose strong {
220
273
  font-weight: 600;
221
- color: #e8e4df;
274
+ color: var(--bk-color-ink);
222
275
  }
223
276
  .brain-prose em {
224
277
  font-style: italic;
225
- color: #c0bcb5;
278
+ color: var(--bk-color-ink-dim);
226
279
  }
227
280
 
228
281
  /* Links */
229
282
  .brain-prose a {
230
- color: #e09f3e;
283
+ color: var(--bk-color-amber);
231
284
  text-decoration: underline;
232
- text-decoration-color: rgba(224, 159, 62, 0.3);
285
+ text-decoration-color: color-mix(in srgb, var(--bk-color-amber) 30%, transparent);
233
286
  text-underline-offset: 2px;
234
287
  transition: color 0.15s;
235
288
  }
236
289
  .brain-prose a:hover {
237
- color: rgba(224, 159, 62, 0.8);
290
+ color: color-mix(in srgb, var(--bk-color-amber) 80%, transparent);
238
291
  }
239
292
 
240
293
  /* Lists */
@@ -256,7 +309,7 @@
256
309
  padding-left: 0.25rem;
257
310
  }
258
311
  .brain-prose li::marker {
259
- color: #5bb5a2;
312
+ color: var(--bk-color-teal);
260
313
  }
261
314
 
262
315
  /* Tables */
@@ -273,28 +326,28 @@
273
326
  font-size: 0.75rem;
274
327
  text-transform: uppercase;
275
328
  letter-spacing: 0.04em;
276
- color: #8a8691;
329
+ color: var(--bk-color-ink-mute);
277
330
  padding: 0.5rem 0.75rem;
278
- border-bottom: 2px solid #2a2d35;
279
- background: #141619;
331
+ border-bottom: 2px solid var(--bk-color-edge);
332
+ background: var(--bk-color-surface);
280
333
  }
281
334
  .brain-prose tbody td {
282
335
  padding: 0.5rem 0.75rem;
283
- border-bottom: 1px solid #1f2229;
336
+ border-bottom: 1px solid var(--bk-color-line);
284
337
  vertical-align: top;
285
338
  }
286
339
  .brain-prose tbody tr:hover {
287
- background: rgba(224, 159, 62, 0.03);
340
+ background: color-mix(in srgb, var(--bk-amber-fill) 3%, transparent);
288
341
  }
289
342
 
290
343
  /* Code - inline */
291
344
  .brain-prose :not(pre) > code {
292
345
  font-family: var(--font-mono);
293
346
  font-size: 0.8em;
294
- background: #1a1d22;
347
+ background: var(--bk-color-raised);
295
348
  padding: 0.125rem 0.375rem;
296
349
  border-radius: 0.25rem;
297
- color: #e8e4df;
350
+ color: var(--bk-color-ink);
298
351
  }
299
352
 
300
353
  /* Code - blocks */
@@ -302,8 +355,8 @@
302
355
  font-family: var(--font-mono);
303
356
  font-size: 0.8125rem;
304
357
  line-height: 1.6;
305
- background: #141619;
306
- border: 1px solid #2a2d35;
358
+ background: var(--bk-color-surface);
359
+ border: 1px solid var(--bk-color-edge);
307
360
  border-radius: 0.5rem;
308
361
  padding: 1rem;
309
362
  overflow-x: auto;
@@ -328,14 +381,14 @@
328
381
 
329
382
  /* Blockquotes */
330
383
  .brain-prose blockquote {
331
- border-left: 3px solid #e09f3e;
332
- background: rgba(224, 159, 62, 0.04);
384
+ border-left: 3px solid var(--bk-color-amber);
385
+ background: color-mix(in srgb, var(--bk-amber-fill) 4%, transparent);
333
386
  padding: 0.75rem 1rem;
334
387
  margin: 0.75rem 0;
335
388
  border-radius: 0 0.375rem 0.375rem 0;
336
389
  }
337
390
  .brain-prose blockquote p {
338
- color: #c0bcb5;
391
+ color: var(--bk-color-ink-dim);
339
392
  font-style: italic;
340
393
  }
341
394
 
@@ -343,7 +396,7 @@
343
396
  .brain-prose hr {
344
397
  border: none;
345
398
  height: 1px;
346
- background: linear-gradient(to right, transparent, #2a2d35 20%, #2a2d35 80%, transparent);
399
+ background: linear-gradient(to right, transparent, var(--bk-color-edge) 20%, var(--bk-color-edge) 80%, transparent);
347
400
  margin: 1.5rem 0;
348
401
  }
349
402
 
@@ -359,7 +412,7 @@
359
412
  color: var(--color-accent);
360
413
  text-decoration: underline;
361
414
  text-decoration-style: dotted;
362
- text-decoration-color: rgba(91, 181, 162, 0.4);
415
+ text-decoration-color: color-mix(in srgb, var(--bk-color-teal) 40%, transparent);
363
416
  text-underline-offset: 3px;
364
417
  font-family: var(--font-mono);
365
418
  font-size: 0.95em;
@@ -370,30 +423,30 @@
370
423
  }
371
424
  .brain-file-link:hover {
372
425
  color: var(--color-foreground);
373
- background-color: rgba(91, 181, 162, 0.1);
374
- text-decoration-color: rgba(91, 181, 162, 0.8);
426
+ background-color: color-mix(in srgb, var(--bk-teal-fill) 10%, transparent);
427
+ text-decoration-color: color-mix(in srgb, var(--bk-color-teal) 80%, transparent);
375
428
  }
376
429
  /* Override .brain-prose a styling when it's a file link */
377
430
  .brain-prose a.brain-file-link {
378
431
  color: var(--color-accent);
379
- text-decoration-color: rgba(91, 181, 162, 0.4);
432
+ text-decoration-color: color-mix(in srgb, var(--bk-color-teal) 40%, transparent);
380
433
  }
381
434
  .brain-prose a.brain-file-link:hover {
382
435
  color: var(--color-foreground);
383
- text-decoration-color: rgba(91, 181, 162, 0.8);
436
+ text-decoration-color: color-mix(in srgb, var(--bk-color-teal) 80%, transparent);
384
437
  }
385
438
 
386
439
  /* Directory links read slightly differently — italic + folder-cue color */
387
440
  .brain-file-link--dir,
388
441
  .brain-prose a.brain-file-link--dir {
389
442
  color: var(--color-primary);
390
- text-decoration-color: rgba(224, 159, 62, 0.4);
443
+ text-decoration-color: color-mix(in srgb, var(--bk-color-amber) 40%, transparent);
391
444
  }
392
445
  .brain-file-link--dir:hover,
393
446
  .brain-prose a.brain-file-link--dir:hover {
394
447
  color: var(--color-foreground);
395
- background-color: rgba(224, 159, 62, 0.1);
396
- text-decoration-color: rgba(224, 159, 62, 0.8);
448
+ background-color: color-mix(in srgb, var(--bk-amber-fill) 10%, transparent);
449
+ text-decoration-color: color-mix(in srgb, var(--bk-color-amber) 80%, transparent);
397
450
  }
398
451
 
399
452
  /* Wikilinks — match file-link styling but use a subtle bracket cue */
@@ -408,7 +461,7 @@
408
461
  color: var(--color-muted-foreground);
409
462
  text-decoration: underline;
410
463
  text-decoration-style: dotted;
411
- text-decoration-color: rgba(138, 134, 145, 0.5);
464
+ text-decoration-color: color-mix(in srgb, var(--bk-color-ink-mute) 50%, transparent);
412
465
  text-underline-offset: 3px;
413
466
  cursor: help;
414
467
  }
@@ -422,8 +475,8 @@
422
475
  /* Tree node highlight flash for openDir() navigation */
423
476
  @keyframes brain-tree-flash {
424
477
  0% {
425
- background-color: rgba(91, 181, 162, 0.35);
426
- box-shadow: inset 0 0 0 1px rgba(91, 181, 162, 0.6);
478
+ background-color: color-mix(in srgb, var(--bk-teal-fill) 35%, transparent);
479
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--bk-color-teal) 60%, transparent);
427
480
  }
428
481
  100% {
429
482
  background-color: transparent;
@@ -1,26 +1,26 @@
1
1
  // Register the built-in ASR clients into the @schlessera/brain-ui-sdk registry.
2
- // Registration is idempotent and wires the store-side extras (audio-level
3
- // meter, end-of-stream -> idle) that fall outside the neutral AsrClient
4
- // interface. use-dictation then resolves a client via createAsrClient().
2
+ // Registration wires the store-side extras (audio-level meter, end-of-stream ->
3
+ // idle) that fall outside the neutral AsrClient interface. use-dictation then
4
+ // resolves a client via createAsrClient().
5
+ //
6
+ // Idempotent because the registry is keyed by providerId, NOT because this
7
+ // module latches: a latch survives `resetAsrClients()`, which would leave the
8
+ // registry permanently empty for everything that ran after the first reset.
5
9
 
6
- import { registerAsrClient } from "@schlessera/brain-ui-sdk/client";
10
+ import type { BrainUiRoot } from "../root.js";
11
+ import { defaultRoot } from "../default-root.js";
7
12
  import { DeepgramClient } from "./asr-deepgram.js";
8
13
  import { WebSpeechClient } from "./asr-webspeech.js";
9
- import { useVoiceStore } from "./voice-store.js";
10
14
 
11
- let registered = false;
12
-
13
- function endToIdle() {
14
- if (useVoiceStore.getState().mode === "dictate") {
15
- useVoiceStore.getState().setMode("idle");
15
+ export function registerAsrClients(root: BrainUiRoot = defaultRoot): void {
16
+ function endToIdle() {
17
+ if (root.stores.voice.getState().mode === "dictate") {
18
+ root.stores.voice.getState().setMode("idle");
19
+ }
16
20
  }
17
- }
18
21
 
19
- export function registerAsrClients(): void {
20
- if (registered) return;
21
- registered = true;
22
22
 
23
- registerAsrClient(
23
+ root.asr.register(
24
24
  "deepgram",
25
25
  (opts) =>
26
26
  new DeepgramClient({
@@ -28,12 +28,12 @@ export function registerAsrClients(): void {
28
28
  token: opts.session.token ?? "",
29
29
  onEvent: opts.onEvent,
30
30
  onError: opts.onError,
31
- onAudioLevel: (level) => useVoiceStore.getState().setAudioLevel(level),
31
+ onAudioLevel: (level) => root.stores.voice.getState().setAudioLevel(level),
32
32
  onClose: endToIdle,
33
33
  })
34
34
  );
35
35
 
36
- registerAsrClient(
36
+ root.asr.register(
37
37
  "webspeech",
38
38
  (opts) =>
39
39
  new WebSpeechClient({
@@ -1,12 +1,11 @@
1
+ import { useBrainUiRoot } from "../root-context.js";
1
2
  import { useCallback, useEffect, useRef } from "react";
2
3
  import { useVoiceStore } from "./voice-store.js";
3
4
  import {
4
- createAsrClient,
5
5
  speechUiHints,
6
6
  type AsrClient,
7
7
  } from "@schlessera/brain-ui-sdk/client";
8
8
  import type { PronunciationOverride } from "@schlessera/brain-ui-sdk/protocol";
9
- import { api } from "../lib/api-client.js";
10
9
  import { registerAsrClients } from "./asr-clients.js";
11
10
 
12
11
  /** Apply pronunciation overrides client-side to a finalized transcript. */
@@ -25,8 +24,10 @@ function applyOverrides(
25
24
  }
26
25
 
27
26
  export function useDictation() {
27
+ const root = useBrainUiRoot();
28
28
  // start() may resolve a client before this hook's effects have run.
29
- registerAsrClients();
29
+ registerAsrClients(root);
30
+ const api = root.api;
30
31
 
31
32
  const clientRef = useRef<AsrClient | null>(null);
32
33
  const overridesRef = useRef<PronunciationOverride[]>([]);
@@ -81,7 +82,7 @@ export function useDictation() {
81
82
  setProviderId(session.providerId);
82
83
 
83
84
  const hints = speechUiHints(session.capabilities);
84
- const client = createAsrClient({
85
+ const client = root.asr.create({
85
86
  session,
86
87
  onEvent: (evt) => {
87
88
  if (evt.type === "partial") {
@@ -119,6 +120,8 @@ export function useDictation() {
119
120
  setMode("idle");
120
121
  }
121
122
  }, [
123
+ root,
124
+ api,
122
125
  resetCapture,
123
126
  setMode,
124
127
  setConnecting,
@@ -139,7 +142,7 @@ export function useDictation() {
139
142
  const client = clientRef.current;
140
143
  clientRef.current = null;
141
144
 
142
- const setDraining = useVoiceStore.getState().setDraining;
145
+ const setDraining = root.stores.voice.getState().setDraining;
143
146
  if (client) {
144
147
  if (commitToReview) {
145
148
  setDraining(true);
@@ -153,7 +156,7 @@ export function useDictation() {
153
156
  }
154
157
  }
155
158
 
156
- const { finalText, partial, reviewText } = useVoiceStore.getState();
159
+ const { finalText, partial, reviewText } = root.stores.voice.getState();
157
160
  const merged = [finalText, partial].filter(Boolean).join(" ").trim();
158
161
  setConnecting(false);
159
162
  setMode("idle");
@@ -164,7 +167,7 @@ export function useDictation() {
164
167
  }
165
168
  resetCapture();
166
169
  },
167
- [resetCapture, setMode, setConnecting, setReviewText]
170
+ [resetCapture, setMode, setConnecting, setReviewText, root]
168
171
  );
169
172
 
170
173
  const cancel = useCallback(() => {
@@ -181,7 +184,7 @@ export function useDictation() {
181
184
  clientRef.current?.stop();
182
185
  clientRef.current = null;
183
186
  };
184
- }, []);
187
+ }, [root]);
185
188
 
186
189
  return { start, stop, cancel };
187
190
  }
@@ -0,0 +1,57 @@
1
+ import { createStore } from "zustand/vanilla";
2
+ import type { VoiceMode } from "@schlessera/brain-ui-sdk/protocol";
3
+
4
+ export interface VoiceState {
5
+ mode: VoiceMode;
6
+ connecting: boolean; // session fetch / mic open in progress (mic not yet live)
7
+ draining: boolean; // post-Done flush in progress
8
+ partial: string;
9
+ finalText: string; // accumulated final transcript for current capture
10
+ audioLevel: number; // 0..1 RMS level for waveform
11
+ reviewText: string; // text waiting in the review card (post-stop)
12
+ providerId: string | null; // active speech provider (from the session response)
13
+ error: string | null;
14
+
15
+ setMode: (mode: VoiceMode) => void;
16
+ setConnecting: (connecting: boolean) => void;
17
+ setDraining: (draining: boolean) => void;
18
+ setPartial: (text: string) => void;
19
+ appendFinal: (text: string) => void;
20
+ setAudioLevel: (level: number) => void;
21
+ setReviewText: (text: string) => void;
22
+ clearReview: () => void;
23
+ setProviderId: (providerId: string | null) => void;
24
+ setError: (err: string | null) => void;
25
+ resetCapture: () => void;
26
+ }
27
+
28
+ export function createVoiceStore() {
29
+ return createStore<VoiceState>((set) => ({
30
+ mode: "idle",
31
+ connecting: false,
32
+ draining: false,
33
+ partial: "",
34
+ finalText: "",
35
+ audioLevel: 0,
36
+ reviewText: "",
37
+ providerId: null,
38
+ error: null,
39
+
40
+ setMode: (mode) => set({ mode }),
41
+ setConnecting: (connecting) => set({ connecting }),
42
+ setDraining: (draining) => set({ draining }),
43
+ setPartial: (partial) => set({ partial }),
44
+ appendFinal: (text) =>
45
+ set((s) => ({
46
+ finalText: (s.finalText ? s.finalText + " " : "") + text.trim(),
47
+ partial: "",
48
+ })),
49
+ setAudioLevel: (audioLevel) => set({ audioLevel }),
50
+ setReviewText: (reviewText) => set({ reviewText }),
51
+ clearReview: () => set({ reviewText: "" }),
52
+ setProviderId: (providerId) => set({ providerId }),
53
+ setError: (error) => set({ error }),
54
+ resetCapture: () =>
55
+ set({ partial: "", finalText: "", audioLevel: 0, error: null }),
56
+ }));
57
+ }