@schlessera/brain-ui-react 0.35.0 → 0.36.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 (755) 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 +144 -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 +11 -0
  19. package/dist/components/activity/approval-card.d.ts.map +1 -0
  20. package/dist/components/activity/approval-card.js +46 -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.map +1 -1
  39. package/dist/components/activity/span-bits.js +9 -7
  40. package/dist/components/activity/span-bits.js.map +1 -1
  41. package/dist/components/chat/ask-user-card.d.ts +76 -3
  42. package/dist/components/chat/ask-user-card.d.ts.map +1 -1
  43. package/dist/components/chat/ask-user-card.js +208 -149
  44. package/dist/components/chat/ask-user-card.js.map +1 -1
  45. package/dist/components/chat/ask-user-typed.d.ts +42 -0
  46. package/dist/components/chat/ask-user-typed.d.ts.map +1 -0
  47. package/dist/components/chat/ask-user-typed.js +60 -0
  48. package/dist/components/chat/ask-user-typed.js.map +1 -0
  49. package/dist/components/chat/brain-markdown-links.d.ts +2 -1
  50. package/dist/components/chat/brain-markdown-links.d.ts.map +1 -1
  51. package/dist/components/chat/brain-markdown-links.js +3 -4
  52. package/dist/components/chat/brain-markdown-links.js.map +1 -1
  53. package/dist/components/chat/brain-markdown.d.ts.map +1 -1
  54. package/dist/components/chat/brain-markdown.js +4 -2
  55. package/dist/components/chat/brain-markdown.js.map +1 -1
  56. package/dist/components/chat/chat-page.d.ts.map +1 -1
  57. package/dist/components/chat/chat-page.js +24 -9
  58. package/dist/components/chat/chat-page.js.map +1 -1
  59. package/dist/components/chat/composer-view.d.ts +75 -0
  60. package/dist/components/chat/composer-view.d.ts.map +1 -0
  61. package/dist/components/chat/composer-view.js +31 -0
  62. package/dist/components/chat/composer-view.js.map +1 -0
  63. package/dist/components/chat/composer.d.ts +4 -0
  64. package/dist/components/chat/composer.d.ts.map +1 -1
  65. package/dist/components/chat/composer.js +76 -59
  66. package/dist/components/chat/composer.js.map +1 -1
  67. package/dist/components/chat/markdown-content.d.ts +16 -1
  68. package/dist/components/chat/markdown-content.d.ts.map +1 -1
  69. package/dist/components/chat/markdown-content.js +47 -3
  70. package/dist/components/chat/markdown-content.js.map +1 -1
  71. package/dist/components/chat/mermaid-block.d.ts +4 -0
  72. package/dist/components/chat/mermaid-block.d.ts.map +1 -1
  73. package/dist/components/chat/mermaid-block.js +13 -5
  74. package/dist/components/chat/mermaid-block.js.map +1 -1
  75. package/dist/components/chat/mermaid-share.d.ts +2 -1
  76. package/dist/components/chat/mermaid-share.d.ts.map +1 -1
  77. package/dist/components/chat/mermaid-share.js +7 -8
  78. package/dist/components/chat/mermaid-share.js.map +1 -1
  79. package/dist/components/chat/mermaid-viewer.d.ts.map +1 -1
  80. package/dist/components/chat/mermaid-viewer.js +3 -1
  81. package/dist/components/chat/mermaid-viewer.js.map +1 -1
  82. package/dist/components/chat/message-bubble.d.ts +8 -1
  83. package/dist/components/chat/message-bubble.d.ts.map +1 -1
  84. package/dist/components/chat/message-bubble.js +53 -24
  85. package/dist/components/chat/message-bubble.js.map +1 -1
  86. package/dist/components/chat/message-share.d.ts +2 -1
  87. package/dist/components/chat/message-share.d.ts.map +1 -1
  88. package/dist/components/chat/message-share.js +6 -7
  89. package/dist/components/chat/message-share.js.map +1 -1
  90. package/dist/components/chat/renderers/bind.d.ts +39 -0
  91. package/dist/components/chat/renderers/bind.d.ts.map +1 -0
  92. package/dist/components/chat/renderers/bind.js +43 -0
  93. package/dist/components/chat/renderers/bind.js.map +1 -0
  94. package/dist/components/chat/renderers/brain-ui-tools.d.ts +3 -0
  95. package/dist/components/chat/renderers/brain-ui-tools.d.ts.map +1 -0
  96. package/dist/components/chat/renderers/brain-ui-tools.js +41 -0
  97. package/dist/components/chat/renderers/brain-ui-tools.js.map +1 -0
  98. package/dist/components/chat/renderers/claude-tools.d.ts.map +1 -1
  99. package/dist/components/chat/renderers/claude-tools.js +3 -2
  100. package/dist/components/chat/renderers/claude-tools.js.map +1 -1
  101. package/dist/components/chat/renderers/index.d.ts +10 -2
  102. package/dist/components/chat/renderers/index.d.ts.map +1 -1
  103. package/dist/components/chat/renderers/index.js +15 -10
  104. package/dist/components/chat/renderers/index.js.map +1 -1
  105. package/dist/components/chat/session-drawer.d.ts +4 -0
  106. package/dist/components/chat/session-drawer.d.ts.map +1 -1
  107. package/dist/components/chat/session-drawer.js +32 -32
  108. package/dist/components/chat/session-drawer.js.map +1 -1
  109. package/dist/components/chat/session-list.d.ts +41 -0
  110. package/dist/components/chat/session-list.d.ts.map +1 -0
  111. package/dist/components/chat/session-list.js +10 -0
  112. package/dist/components/chat/session-list.js.map +1 -0
  113. package/dist/components/chat/share-block.d.ts.map +1 -1
  114. package/dist/components/chat/share-block.js +12 -11
  115. package/dist/components/chat/share-block.js.map +1 -1
  116. package/dist/components/chat/share-card.js +2 -2
  117. package/dist/components/chat/share-card.js.map +1 -1
  118. package/dist/components/chat/subagent-view.js +1 -1
  119. package/dist/components/chat/subagent-view.js.map +1 -1
  120. package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
  121. package/dist/components/chat/tool-call-timeline.js +37 -12
  122. package/dist/components/chat/tool-call-timeline.js.map +1 -1
  123. package/dist/components/chat/tool-cards/block-card.d.ts +28 -0
  124. package/dist/components/chat/tool-cards/block-card.d.ts.map +1 -0
  125. package/dist/components/chat/tool-cards/block-card.js +103 -0
  126. package/dist/components/chat/tool-cards/block-card.js.map +1 -0
  127. package/dist/components/chat/tool-cards/image-mask-card.d.ts +70 -0
  128. package/dist/components/chat/tool-cards/image-mask-card.d.ts.map +1 -0
  129. package/dist/components/chat/tool-cards/image-mask-card.js +142 -0
  130. package/dist/components/chat/tool-cards/image-mask-card.js.map +1 -0
  131. package/dist/components/chat/tool-cards/location-card.d.ts +45 -0
  132. package/dist/components/chat/tool-cards/location-card.d.ts.map +1 -0
  133. package/dist/components/chat/tool-cards/location-card.js +128 -0
  134. package/dist/components/chat/tool-cards/location-card.js.map +1 -0
  135. package/dist/components/chat/tool-views.d.ts +13 -2
  136. package/dist/components/chat/tool-views.d.ts.map +1 -1
  137. package/dist/components/chat/tool-views.js +20 -22
  138. package/dist/components/chat/tool-views.js.map +1 -1
  139. package/dist/components/chat/transcript-turn.d.ts +45 -0
  140. package/dist/components/chat/transcript-turn.d.ts.map +1 -0
  141. package/dist/components/chat/transcript-turn.js +25 -0
  142. package/dist/components/chat/transcript-turn.js.map +1 -0
  143. package/dist/components/chat/use-chat-commands.d.ts.map +1 -1
  144. package/dist/components/chat/use-chat-commands.js +13 -16
  145. package/dist/components/chat/use-chat-commands.js.map +1 -1
  146. package/dist/components/chat/welcome-state.d.ts +7 -0
  147. package/dist/components/chat/welcome-state.d.ts.map +1 -1
  148. package/dist/components/chat/welcome-state.js +13 -5
  149. package/dist/components/chat/welcome-state.js.map +1 -1
  150. package/dist/components/connectivity/connection-gate.d.ts.map +1 -1
  151. package/dist/components/connectivity/connection-gate.js +27 -21
  152. package/dist/components/connectivity/connection-gate.js.map +1 -1
  153. package/dist/components/connectivity/login-form.d.ts +31 -0
  154. package/dist/components/connectivity/login-form.d.ts.map +1 -0
  155. package/dist/components/connectivity/login-form.js +19 -0
  156. package/dist/components/connectivity/login-form.js.map +1 -0
  157. package/dist/components/connectivity/login-screen.d.ts +5 -2
  158. package/dist/components/connectivity/login-screen.d.ts.map +1 -1
  159. package/dist/components/connectivity/login-screen.js +41 -31
  160. package/dist/components/connectivity/login-screen.js.map +1 -1
  161. package/dist/components/dev/share-harness.js +1 -1
  162. package/dist/components/dev/share-harness.js.map +1 -1
  163. package/dist/components/files/file-panel.d.ts +1 -1
  164. package/dist/components/files/file-panel.d.ts.map +1 -1
  165. package/dist/components/files/file-panel.js +74 -0
  166. package/dist/components/files/file-panel.js.map +1 -1
  167. package/dist/components/files/file-tree-view.d.ts +45 -0
  168. package/dist/components/files/file-tree-view.d.ts.map +1 -0
  169. package/dist/components/files/file-tree-view.js +51 -0
  170. package/dist/components/files/file-tree-view.js.map +1 -0
  171. package/dist/components/files/file-tree.d.ts +6 -0
  172. package/dist/components/files/file-tree.d.ts.map +1 -1
  173. package/dist/components/files/file-tree.js +39 -43
  174. package/dist/components/files/file-tree.js.map +1 -1
  175. package/dist/components/files/file-viewer-binary.d.ts.map +1 -1
  176. package/dist/components/files/file-viewer-binary.js +3 -2
  177. package/dist/components/files/file-viewer-binary.js.map +1 -1
  178. package/dist/components/files/file-viewer-frame.d.ts +36 -0
  179. package/dist/components/files/file-viewer-frame.d.ts.map +1 -0
  180. package/dist/components/files/file-viewer-frame.js +26 -0
  181. package/dist/components/files/file-viewer-frame.js.map +1 -0
  182. package/dist/components/files/file-viewer.d.ts +5 -0
  183. package/dist/components/files/file-viewer.d.ts.map +1 -1
  184. package/dist/components/files/file-viewer.js +26 -32
  185. package/dist/components/files/file-viewer.js.map +1 -1
  186. package/dist/components/files/frontmatter-chips.d.ts +18 -0
  187. package/dist/components/files/frontmatter-chips.d.ts.map +1 -0
  188. package/dist/components/files/frontmatter-chips.js +11 -0
  189. package/dist/components/files/frontmatter-chips.js.map +1 -0
  190. package/dist/components/files/frontmatter-panel.d.ts +5 -1
  191. package/dist/components/files/frontmatter-panel.d.ts.map +1 -1
  192. package/dist/components/files/frontmatter-panel.js +7 -6
  193. package/dist/components/files/frontmatter-panel.js.map +1 -1
  194. package/dist/components/files/staleness.d.ts +18 -0
  195. package/dist/components/files/staleness.d.ts.map +1 -0
  196. package/dist/components/files/staleness.js +27 -0
  197. package/dist/components/files/staleness.js.map +1 -0
  198. package/dist/components/graph/graph-canvas.d.ts.map +1 -1
  199. package/dist/components/graph/graph-canvas.js +24 -1
  200. package/dist/components/graph/graph-canvas.js.map +1 -1
  201. package/dist/components/graph/graph-controls-column.d.ts +14 -0
  202. package/dist/components/graph/graph-controls-column.d.ts.map +1 -0
  203. package/dist/components/graph/graph-controls-column.js +44 -0
  204. package/dist/components/graph/graph-controls-column.js.map +1 -0
  205. package/dist/components/graph/graph-controls.d.ts +20 -5
  206. package/dist/components/graph/graph-controls.d.ts.map +1 -1
  207. package/dist/components/graph/graph-controls.js +58 -37
  208. package/dist/components/graph/graph-controls.js.map +1 -1
  209. package/dist/components/graph/graph-form.d.ts +82 -0
  210. package/dist/components/graph/graph-form.d.ts.map +1 -0
  211. package/dist/components/graph/graph-form.js +69 -0
  212. package/dist/components/graph/graph-form.js.map +1 -0
  213. package/dist/components/graph/graph-maintenance.d.ts.map +1 -1
  214. package/dist/components/graph/graph-maintenance.js +6 -10
  215. package/dist/components/graph/graph-maintenance.js.map +1 -1
  216. package/dist/components/graph/graph-node-rail.d.ts +13 -0
  217. package/dist/components/graph/graph-node-rail.d.ts.map +1 -0
  218. package/dist/components/graph/graph-node-rail.js +92 -0
  219. package/dist/components/graph/graph-node-rail.js.map +1 -0
  220. package/dist/components/graph/graph-page.d.ts +7 -0
  221. package/dist/components/graph/graph-page.d.ts.map +1 -1
  222. package/dist/components/graph/graph-page.js +102 -12
  223. package/dist/components/graph/graph-page.js.map +1 -1
  224. package/dist/components/graph/graph-scene.d.ts.map +1 -1
  225. package/dist/components/graph/graph-scene.js +100 -24
  226. package/dist/components/graph/graph-scene.js.map +1 -1
  227. package/dist/components/graph/lib/graph-helpers.d.ts +42 -12
  228. package/dist/components/graph/lib/graph-helpers.d.ts.map +1 -1
  229. package/dist/components/graph/lib/graph-helpers.js +33 -41
  230. package/dist/components/graph/lib/graph-helpers.js.map +1 -1
  231. package/dist/components/graph/node-card.d.ts +28 -0
  232. package/dist/components/graph/node-card.d.ts.map +1 -0
  233. package/dist/components/graph/node-card.js +7 -0
  234. package/dist/components/graph/node-card.js.map +1 -0
  235. package/dist/components/graph/node-popover.d.ts +6 -2
  236. package/dist/components/graph/node-popover.d.ts.map +1 -1
  237. package/dist/components/graph/node-popover.js +13 -31
  238. package/dist/components/graph/node-popover.js.map +1 -1
  239. package/dist/components/graph/use-graph-theme.d.ts +32 -4
  240. package/dist/components/graph/use-graph-theme.d.ts.map +1 -1
  241. package/dist/components/graph/use-graph-theme.js +44 -32
  242. package/dist/components/graph/use-graph-theme.js.map +1 -1
  243. package/dist/components/graph/use-node-actions.d.ts +26 -0
  244. package/dist/components/graph/use-node-actions.d.ts.map +1 -0
  245. package/dist/components/graph/use-node-actions.js +54 -0
  246. package/dist/components/graph/use-node-actions.js.map +1 -0
  247. package/dist/components/images/image-share.d.ts +2 -1
  248. package/dist/components/images/image-share.d.ts.map +1 -1
  249. package/dist/components/images/image-share.js +3 -3
  250. package/dist/components/images/image-share.js.map +1 -1
  251. package/dist/components/images/image-viewer.d.ts.map +1 -1
  252. package/dist/components/images/image-viewer.js +3 -1
  253. package/dist/components/images/image-viewer.js.map +1 -1
  254. package/dist/components/images/mask-editor.d.ts.map +1 -1
  255. package/dist/components/images/mask-editor.js +7 -5
  256. package/dist/components/images/mask-editor.js.map +1 -1
  257. package/dist/components/layout/app-shell.d.ts.map +1 -1
  258. package/dist/components/layout/app-shell.js +4 -1
  259. package/dist/components/layout/app-shell.js.map +1 -1
  260. package/dist/components/layout/desktop-palette.d.ts +23 -0
  261. package/dist/components/layout/desktop-palette.d.ts.map +1 -0
  262. package/dist/components/layout/desktop-palette.js +132 -0
  263. package/dist/components/layout/desktop-palette.js.map +1 -0
  264. package/dist/components/layout/key-cap.d.ts +9 -0
  265. package/dist/components/layout/key-cap.d.ts.map +1 -0
  266. package/dist/components/layout/key-cap.js +10 -0
  267. package/dist/components/layout/key-cap.js.map +1 -0
  268. package/dist/components/layout/mobile-tab-bar.d.ts +13 -0
  269. package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -1
  270. package/dist/components/layout/mobile-tab-bar.js +58 -47
  271. package/dist/components/layout/mobile-tab-bar.js.map +1 -1
  272. package/dist/components/layout/shortcut-switch.d.ts +13 -0
  273. package/dist/components/layout/shortcut-switch.d.ts.map +1 -0
  274. package/dist/components/layout/shortcut-switch.js +22 -0
  275. package/dist/components/layout/shortcut-switch.js.map +1 -0
  276. package/dist/components/layout/side-rail.d.ts +24 -0
  277. package/dist/components/layout/side-rail.d.ts.map +1 -1
  278. package/dist/components/layout/side-rail.js +65 -27
  279. package/dist/components/layout/side-rail.js.map +1 -1
  280. package/dist/components/layout/slide-panel.d.ts +12 -2
  281. package/dist/components/layout/slide-panel.d.ts.map +1 -1
  282. package/dist/components/layout/slide-panel.js +11 -2
  283. package/dist/components/layout/slide-panel.js.map +1 -1
  284. package/dist/components/layout/theme.d.ts +22 -0
  285. package/dist/components/layout/theme.d.ts.map +1 -0
  286. package/dist/components/layout/theme.js +44 -0
  287. package/dist/components/layout/theme.js.map +1 -0
  288. package/dist/components/quick-actions/add-form.d.ts +44 -0
  289. package/dist/components/quick-actions/add-form.d.ts.map +1 -0
  290. package/dist/components/quick-actions/add-form.js +30 -0
  291. package/dist/components/quick-actions/add-form.js.map +1 -0
  292. package/dist/components/quick-actions/add-modal.d.ts +7 -0
  293. package/dist/components/quick-actions/add-modal.d.ts.map +1 -1
  294. package/dist/components/quick-actions/add-modal.js +23 -20
  295. package/dist/components/quick-actions/add-modal.js.map +1 -1
  296. package/dist/components/quick-actions/search-modal.d.ts.map +1 -1
  297. package/dist/components/quick-actions/search-modal.js +4 -3
  298. package/dist/components/quick-actions/search-modal.js.map +1 -1
  299. package/dist/components/quick-actions/streaming-modal.d.ts +6 -0
  300. package/dist/components/quick-actions/streaming-modal.d.ts.map +1 -1
  301. package/dist/components/quick-actions/streaming-modal.js +39 -17
  302. package/dist/components/quick-actions/streaming-modal.js.map +1 -1
  303. package/dist/components/quick-actions/streaming-output.d.ts +38 -0
  304. package/dist/components/quick-actions/streaming-output.d.ts.map +1 -0
  305. package/dist/components/quick-actions/streaming-output.js +22 -0
  306. package/dist/components/quick-actions/streaming-output.js.map +1 -0
  307. package/dist/components/quick-actions/whatsup-modal.d.ts +5 -0
  308. package/dist/components/quick-actions/whatsup-modal.d.ts.map +1 -1
  309. package/dist/components/quick-actions/whatsup-modal.js +36 -10
  310. package/dist/components/quick-actions/whatsup-modal.js.map +1 -1
  311. package/dist/components/settings/devices-agents-tab.d.ts +6 -1
  312. package/dist/components/settings/devices-agents-tab.d.ts.map +1 -1
  313. package/dist/components/settings/devices-agents-tab.js +55 -20
  314. package/dist/components/settings/devices-agents-tab.js.map +1 -1
  315. package/dist/components/settings/models-list.d.ts +39 -0
  316. package/dist/components/settings/models-list.d.ts.map +1 -0
  317. package/dist/components/settings/models-list.js +72 -0
  318. package/dist/components/settings/models-list.js.map +1 -0
  319. package/dist/components/settings/models-tab.d.ts +4 -0
  320. package/dist/components/settings/models-tab.d.ts.map +1 -1
  321. package/dist/components/settings/models-tab.js +52 -102
  322. package/dist/components/settings/models-tab.js.map +1 -1
  323. package/dist/components/settings/one-time-agent-credential.js +1 -1
  324. package/dist/components/settings/one-time-agent-credential.js.map +1 -1
  325. package/dist/components/settings/passkey-list.d.ts +35 -0
  326. package/dist/components/settings/passkey-list.d.ts.map +1 -0
  327. package/dist/components/settings/passkey-list.js +34 -0
  328. package/dist/components/settings/passkey-list.js.map +1 -0
  329. package/dist/components/settings/passkey-tab.d.ts +3 -0
  330. package/dist/components/settings/passkey-tab.d.ts.map +1 -1
  331. package/dist/components/settings/passkey-tab.js +53 -45
  332. package/dist/components/settings/passkey-tab.js.map +1 -1
  333. package/dist/components/settings/pi-accounts-list.d.ts +27 -0
  334. package/dist/components/settings/pi-accounts-list.d.ts.map +1 -0
  335. package/dist/components/settings/pi-accounts-list.js +15 -0
  336. package/dist/components/settings/pi-accounts-list.js.map +1 -0
  337. package/dist/components/settings/pi-accounts.d.ts +3 -0
  338. package/dist/components/settings/pi-accounts.d.ts.map +1 -1
  339. package/dist/components/settings/pi-accounts.js +73 -55
  340. package/dist/components/settings/pi-accounts.js.map +1 -1
  341. package/dist/components/settings/principal-list.d.ts +37 -0
  342. package/dist/components/settings/principal-list.d.ts.map +1 -0
  343. package/dist/components/settings/principal-list.js +18 -0
  344. package/dist/components/settings/principal-list.js.map +1 -0
  345. package/dist/components/settings/settings-panel.d.ts +10 -3
  346. package/dist/components/settings/settings-panel.d.ts.map +1 -1
  347. package/dist/components/settings/settings-panel.js +69 -8
  348. package/dist/components/settings/settings-panel.js.map +1 -1
  349. package/dist/components/settings/skills-list.d.ts +53 -0
  350. package/dist/components/settings/skills-list.d.ts.map +1 -0
  351. package/dist/components/settings/skills-list.js +28 -0
  352. package/dist/components/settings/skills-list.js.map +1 -0
  353. package/dist/components/settings/skills-tab.d.ts.map +1 -1
  354. package/dist/components/settings/skills-tab.js +65 -38
  355. package/dist/components/settings/skills-tab.js.map +1 -1
  356. package/dist/components/settings/tool-permissions-list.d.ts +18 -0
  357. package/dist/components/settings/tool-permissions-list.d.ts.map +1 -0
  358. package/dist/components/settings/tool-permissions-list.js +6 -0
  359. package/dist/components/settings/tool-permissions-list.js.map +1 -0
  360. package/dist/components/settings/tool-permissions.d.ts +2 -1
  361. package/dist/components/settings/tool-permissions.d.ts.map +1 -1
  362. package/dist/components/settings/tool-permissions.js +33 -16
  363. package/dist/components/settings/tool-permissions.js.map +1 -1
  364. package/dist/components/settings/web-search-chain.d.ts +41 -0
  365. package/dist/components/settings/web-search-chain.d.ts.map +1 -0
  366. package/dist/components/settings/web-search-chain.js +47 -0
  367. package/dist/components/settings/web-search-chain.js.map +1 -0
  368. package/dist/components/settings/web-search-settings.d.ts +4 -7
  369. package/dist/components/settings/web-search-settings.d.ts.map +1 -1
  370. package/dist/components/settings/web-search-settings.js +54 -76
  371. package/dist/components/settings/web-search-settings.js.map +1 -1
  372. package/dist/components/share/share-menu.d.ts.map +1 -1
  373. package/dist/components/share/share-menu.js +24 -4
  374. package/dist/components/share/share-menu.js.map +1 -1
  375. package/dist/components/voice/dictation-sheet.js +3 -3
  376. package/dist/components/voice/dictation-sheet.js.map +1 -1
  377. package/dist/components/voice/mic-button.js +1 -1
  378. package/dist/components/voice/mic-button.js.map +1 -1
  379. package/dist/components/voice/review-card.js +1 -1
  380. package/dist/components/voice/review-card.js.map +1 -1
  381. package/dist/config.d.ts +5 -2
  382. package/dist/config.d.ts.map +1 -1
  383. package/dist/config.js +15 -5
  384. package/dist/config.js.map +1 -1
  385. package/dist/connection.d.ts +12 -0
  386. package/dist/connection.d.ts.map +1 -0
  387. package/dist/connection.js +421 -0
  388. package/dist/connection.js.map +1 -0
  389. package/dist/default-root.d.ts +3 -0
  390. package/dist/default-root.d.ts.map +1 -0
  391. package/dist/default-root.js +16 -0
  392. package/dist/default-root.js.map +1 -0
  393. package/dist/hooks/use-color-scheme.d.ts +14 -0
  394. package/dist/hooks/use-color-scheme.d.ts.map +1 -0
  395. package/dist/hooks/use-color-scheme.js +37 -0
  396. package/dist/hooks/use-color-scheme.js.map +1 -0
  397. package/dist/hooks/use-hash-routes.d.ts.map +1 -1
  398. package/dist/hooks/use-hash-routes.js +4 -2
  399. package/dist/hooks/use-hash-routes.js.map +1 -1
  400. package/dist/hooks/use-media-query.d.ts +7 -0
  401. package/dist/hooks/use-media-query.d.ts.map +1 -0
  402. package/dist/hooks/use-media-query.js +34 -0
  403. package/dist/hooks/use-media-query.js.map +1 -0
  404. package/dist/hooks/use-share-intake.d.ts.map +1 -1
  405. package/dist/hooks/use-share-intake.js +37 -12
  406. package/dist/hooks/use-share-intake.js.map +1 -1
  407. package/dist/hooks/use-vpn-status.d.ts.map +1 -1
  408. package/dist/hooks/use-vpn-status.js +17 -18
  409. package/dist/hooks/use-vpn-status.js.map +1 -1
  410. package/dist/hooks/use-websocket.d.ts +5 -24
  411. package/dist/hooks/use-websocket.d.ts.map +1 -1
  412. package/dist/hooks/use-websocket.js +11 -384
  413. package/dist/hooks/use-websocket.js.map +1 -1
  414. package/dist/hooks/websocket-handlers/activity.d.ts +2 -2
  415. package/dist/hooks/websocket-handlers/activity.d.ts.map +1 -1
  416. package/dist/hooks/websocket-handlers/activity.js +4 -5
  417. package/dist/hooks/websocket-handlers/activity.js.map +1 -1
  418. package/dist/hooks/websocket-handlers/chat.d.ts +1 -0
  419. package/dist/hooks/websocket-handlers/chat.d.ts.map +1 -1
  420. package/dist/hooks/websocket-handlers/chat.js +27 -5
  421. package/dist/hooks/websocket-handlers/chat.js.map +1 -1
  422. package/dist/hooks/websocket-handlers/connection.d.ts.map +1 -1
  423. package/dist/hooks/websocket-handlers/connection.js +4 -6
  424. package/dist/hooks/websocket-handlers/connection.js.map +1 -1
  425. package/dist/hooks/websocket-handlers/mask.d.ts +1 -1
  426. package/dist/hooks/websocket-handlers/mask.d.ts.map +1 -1
  427. package/dist/hooks/websocket-handlers/mask.js +2 -3
  428. package/dist/hooks/websocket-handlers/mask.js.map +1 -1
  429. package/dist/hooks/websocket-handlers/provider.d.ts.map +1 -1
  430. package/dist/hooks/websocket-handlers/provider.js +4 -6
  431. package/dist/hooks/websocket-handlers/provider.js.map +1 -1
  432. package/dist/hooks/websocket-handlers/types.d.ts +6 -2
  433. package/dist/hooks/websocket-handlers/types.d.ts.map +1 -1
  434. package/dist/index.d.ts +5 -3
  435. package/dist/index.d.ts.map +1 -1
  436. package/dist/index.js +6 -3
  437. package/dist/index.js.map +1 -1
  438. package/dist/lib/api-client.d.ts +289 -0
  439. package/dist/lib/api-client.d.ts.map +1 -1
  440. package/dist/lib/api-client.js +243 -224
  441. package/dist/lib/api-client.js.map +1 -1
  442. package/dist/lib/backend.d.ts +19 -2
  443. package/dist/lib/backend.d.ts.map +1 -1
  444. package/dist/lib/backend.js +15 -9
  445. package/dist/lib/backend.js.map +1 -1
  446. package/dist/lib/diff.d.ts +8 -10
  447. package/dist/lib/diff.d.ts.map +1 -1
  448. package/dist/lib/diff.js +26 -53
  449. package/dist/lib/diff.js.map +1 -1
  450. package/dist/lib/light-dark.d.ts +37 -0
  451. package/dist/lib/light-dark.d.ts.map +1 -0
  452. package/dist/lib/light-dark.js +83 -0
  453. package/dist/lib/light-dark.js.map +1 -0
  454. package/dist/lib/mermaid-theme.d.ts +7 -2
  455. package/dist/lib/mermaid-theme.d.ts.map +1 -1
  456. package/dist/lib/mermaid-theme.js +125 -203
  457. package/dist/lib/mermaid-theme.js.map +1 -1
  458. package/dist/lib/passkeys.d.ts +6 -3
  459. package/dist/lib/passkeys.d.ts.map +1 -1
  460. package/dist/lib/passkeys.js +10 -4
  461. package/dist/lib/passkeys.js.map +1 -1
  462. package/dist/lib/push-registration.d.ts +4 -1
  463. package/dist/lib/push-registration.d.ts.map +1 -1
  464. package/dist/lib/push-registration.js +20 -2
  465. package/dist/lib/push-registration.js.map +1 -1
  466. package/dist/lib/share-intake.d.ts +2 -1
  467. package/dist/lib/share-intake.d.ts.map +1 -1
  468. package/dist/lib/share-intake.js +3 -3
  469. package/dist/lib/share-intake.js.map +1 -1
  470. package/dist/lib/share.d.ts +4 -3
  471. package/dist/lib/share.d.ts.map +1 -1
  472. package/dist/lib/share.js +6 -7
  473. package/dist/lib/share.js.map +1 -1
  474. package/dist/lib/single-key.d.ts +30 -0
  475. package/dist/lib/single-key.d.ts.map +1 -0
  476. package/dist/lib/single-key.js +45 -0
  477. package/dist/lib/single-key.js.map +1 -0
  478. package/dist/lib/tool-names.d.ts +8 -6
  479. package/dist/lib/tool-names.d.ts.map +1 -1
  480. package/dist/lib/tool-names.js +17 -7
  481. package/dist/lib/tool-names.js.map +1 -1
  482. package/dist/root-context.d.ts +229 -0
  483. package/dist/root-context.d.ts.map +1 -0
  484. package/dist/root-context.js +33 -0
  485. package/dist/root-context.js.map +1 -0
  486. package/dist/root.d.ts +38 -0
  487. package/dist/root.d.ts.map +1 -0
  488. package/dist/root.js +47 -0
  489. package/dist/root.js.map +1 -0
  490. package/dist/stores/activity-state.d.ts +29 -0
  491. package/dist/stores/activity-state.d.ts.map +1 -0
  492. package/dist/stores/activity-state.js +282 -0
  493. package/dist/stores/activity-state.js.map +1 -0
  494. package/dist/stores/activity-store.d.ts +10 -41
  495. package/dist/stores/activity-store.d.ts.map +1 -1
  496. package/dist/stores/activity-store.js +9 -271
  497. package/dist/stores/activity-store.js.map +1 -1
  498. package/dist/stores/chat-state.d.ts +212 -0
  499. package/dist/stores/chat-state.d.ts.map +1 -0
  500. package/dist/stores/chat-state.js +466 -0
  501. package/dist/stores/chat-state.js.map +1 -0
  502. package/dist/stores/chat-store.d.ts +4 -162
  503. package/dist/stores/chat-store.d.ts.map +1 -1
  504. package/dist/stores/chat-store.js +7 -418
  505. package/dist/stores/chat-store.js.map +1 -1
  506. package/dist/stores/connection-state.d.ts +40 -0
  507. package/dist/stores/connection-state.d.ts.map +1 -0
  508. package/dist/stores/connection-state.js +30 -0
  509. package/dist/stores/connection-state.js.map +1 -0
  510. package/dist/stores/connection-store.d.ts +4 -40
  511. package/dist/stores/connection-store.d.ts.map +1 -1
  512. package/dist/stores/connection-store.js +7 -27
  513. package/dist/stores/connection-store.js.map +1 -1
  514. package/dist/stores/create-stores.d.ts +23 -0
  515. package/dist/stores/create-stores.d.ts.map +1 -0
  516. package/dist/stores/create-stores.js +28 -0
  517. package/dist/stores/create-stores.js.map +1 -0
  518. package/dist/stores/file-state.d.ts +53 -0
  519. package/dist/stores/file-state.d.ts.map +1 -0
  520. package/dist/stores/file-state.js +341 -0
  521. package/dist/stores/file-state.js.map +1 -0
  522. package/dist/stores/file-store.d.ts +4 -52
  523. package/dist/stores/file-store.d.ts.map +1 -1
  524. package/dist/stores/file-store.js +7 -336
  525. package/dist/stores/file-store.js.map +1 -1
  526. package/dist/stores/graph-state.d.ts +95 -0
  527. package/dist/stores/graph-state.d.ts.map +1 -0
  528. package/dist/stores/graph-state.js +252 -0
  529. package/dist/stores/graph-state.js.map +1 -0
  530. package/dist/stores/graph-store.d.ts +7 -83
  531. package/dist/stores/graph-store.d.ts.map +1 -1
  532. package/dist/stores/graph-store.js +8 -249
  533. package/dist/stores/graph-store.js.map +1 -1
  534. package/dist/stores/mask-state.d.ts +21 -0
  535. package/dist/stores/mask-state.d.ts.map +1 -0
  536. package/dist/stores/mask-state.js +9 -0
  537. package/dist/stores/mask-state.js.map +1 -0
  538. package/dist/stores/mask-store.d.ts +4 -21
  539. package/dist/stores/mask-store.d.ts.map +1 -1
  540. package/dist/stores/mask-store.js +7 -6
  541. package/dist/stores/mask-store.js.map +1 -1
  542. package/dist/stores/principal-state.d.ts +16 -0
  543. package/dist/stores/principal-state.d.ts.map +1 -0
  544. package/dist/stores/principal-state.js +31 -0
  545. package/dist/stores/principal-state.js.map +1 -0
  546. package/dist/stores/principal-store.d.ts +4 -15
  547. package/dist/stores/principal-store.d.ts.map +1 -1
  548. package/dist/stores/principal-store.js +7 -28
  549. package/dist/stores/principal-store.js.map +1 -1
  550. package/dist/stores/provider-state.d.ts +24 -0
  551. package/dist/stores/provider-state.d.ts.map +1 -0
  552. package/dist/stores/provider-state.js +68 -0
  553. package/dist/stores/provider-state.js.map +1 -0
  554. package/dist/stores/provider-store.d.ts +4 -23
  555. package/dist/stores/provider-store.d.ts.map +1 -1
  556. package/dist/stores/provider-store.js +7 -64
  557. package/dist/stores/provider-store.js.map +1 -1
  558. package/dist/stores/share-state.d.ts +29 -0
  559. package/dist/stores/share-state.d.ts.map +1 -0
  560. package/dist/stores/share-state.js +21 -0
  561. package/dist/stores/share-state.js.map +1 -0
  562. package/dist/stores/share-store.d.ts +4 -28
  563. package/dist/stores/share-store.d.ts.map +1 -1
  564. package/dist/stores/share-store.js +7 -18
  565. package/dist/stores/share-store.js.map +1 -1
  566. package/dist/stores/store-environment.d.ts +10 -0
  567. package/dist/stores/store-environment.d.ts.map +1 -0
  568. package/dist/stores/store-environment.js +2 -0
  569. package/dist/stores/store-environment.js.map +1 -0
  570. package/dist/stores/ui-state.d.ts +71 -0
  571. package/dist/stores/ui-state.d.ts.map +1 -0
  572. package/dist/stores/ui-state.js +58 -0
  573. package/dist/stores/ui-state.js.map +1 -0
  574. package/dist/stores/ui-store.d.ts +4 -45
  575. package/dist/stores/ui-store.d.ts.map +1 -1
  576. package/dist/stores/ui-store.js +7 -36
  577. package/dist/stores/ui-store.js.map +1 -1
  578. package/dist/styles.css +1 -1
  579. package/dist/theme.css +150 -97
  580. package/dist/voice/asr-clients.d.ts +2 -1
  581. package/dist/voice/asr-clients.d.ts.map +1 -1
  582. package/dist/voice/asr-clients.js +16 -17
  583. package/dist/voice/asr-clients.js.map +1 -1
  584. package/dist/voice/use-dictation.d.ts.map +1 -1
  585. package/dist/voice/use-dictation.js +12 -8
  586. package/dist/voice/use-dictation.js.map +1 -1
  587. package/dist/voice/voice-state.d.ts +25 -0
  588. package/dist/voice/voice-state.d.ts.map +1 -0
  589. package/dist/voice/voice-state.js +29 -0
  590. package/dist/voice/voice-state.js.map +1 -0
  591. package/dist/voice/voice-store.d.ts +4 -25
  592. package/dist/voice/voice-store.d.ts.map +1 -1
  593. package/dist/voice/voice-store.js +7 -26
  594. package/dist/voice/voice-store.js.map +1 -1
  595. package/package.json +3 -2
  596. package/src/components/activity/activity-page.tsx +334 -160
  597. package/src/components/activity/activity-run-detail.tsx +81 -47
  598. package/src/components/activity/activity-run-list.tsx +27 -59
  599. package/src/components/activity/activity-views.tsx +155 -0
  600. package/src/components/activity/approval-card.tsx +80 -0
  601. package/src/components/activity/digest-card.tsx +25 -61
  602. package/src/components/activity/digest-summary.tsx +52 -0
  603. package/src/components/activity/push-switch.tsx +62 -0
  604. package/src/components/activity/push-toggle.tsx +51 -81
  605. package/src/components/activity/span-bits.tsx +8 -7
  606. package/src/components/chat/ask-user-card.tsx +292 -356
  607. package/src/components/chat/ask-user-typed.ts +77 -0
  608. package/src/components/chat/brain-markdown-links.tsx +4 -4
  609. package/src/components/chat/brain-markdown.tsx +4 -2
  610. package/src/components/chat/chat-page.tsx +38 -9
  611. package/src/components/chat/composer-view.tsx +194 -0
  612. package/src/components/chat/composer.tsx +117 -296
  613. package/src/components/chat/markdown-content.tsx +53 -2
  614. package/src/components/chat/mermaid-block.tsx +13 -5
  615. package/src/components/chat/mermaid-share.ts +8 -7
  616. package/src/components/chat/mermaid-viewer.tsx +3 -1
  617. package/src/components/chat/message-bubble.tsx +78 -94
  618. package/src/components/chat/message-share.ts +7 -7
  619. package/src/components/chat/renderers/bind.tsx +94 -0
  620. package/src/components/chat/renderers/brain-ui-tools.tsx +56 -0
  621. package/src/components/chat/renderers/claude-tools.tsx +3 -2
  622. package/src/components/chat/renderers/index.ts +15 -10
  623. package/src/components/chat/session-drawer.tsx +41 -138
  624. package/src/components/chat/session-list.tsx +113 -0
  625. package/src/components/chat/share-block.tsx +16 -12
  626. package/src/components/chat/share-card.tsx +2 -2
  627. package/src/components/chat/subagent-view.tsx +4 -4
  628. package/src/components/chat/tool-call-timeline.tsx +59 -22
  629. package/src/components/chat/tool-cards/block-card.tsx +145 -0
  630. package/src/components/chat/tool-cards/image-mask-card.tsx +214 -0
  631. package/src/components/chat/tool-cards/location-card.tsx +159 -0
  632. package/src/components/chat/tool-views.tsx +21 -60
  633. package/src/components/chat/transcript-turn.tsx +108 -0
  634. package/src/components/chat/use-chat-commands.ts +14 -16
  635. package/src/components/chat/welcome-state.tsx +36 -91
  636. package/src/components/connectivity/connection-gate.tsx +32 -24
  637. package/src/components/connectivity/login-form.tsx +122 -0
  638. package/src/components/connectivity/login-screen.tsx +45 -100
  639. package/src/components/dev/share-harness.tsx +2 -2
  640. package/src/components/files/file-panel.tsx +168 -0
  641. package/src/components/files/file-tree-view.tsx +127 -0
  642. package/src/components/files/file-tree.tsx +55 -109
  643. package/src/components/files/file-viewer-binary.tsx +3 -2
  644. package/src/components/files/file-viewer-frame.tsx +113 -0
  645. package/src/components/files/file-viewer.tsx +40 -95
  646. package/src/components/files/frontmatter-chips.tsx +42 -0
  647. package/src/components/files/frontmatter-panel.tsx +6 -71
  648. package/src/components/files/staleness.ts +29 -0
  649. package/src/components/graph/graph-canvas.tsx +24 -1
  650. package/src/components/graph/graph-controls-column.tsx +92 -0
  651. package/src/components/graph/graph-controls.tsx +83 -127
  652. package/src/components/graph/graph-form.tsx +183 -0
  653. package/src/components/graph/graph-maintenance.tsx +9 -14
  654. package/src/components/graph/graph-node-rail.tsx +147 -0
  655. package/src/components/graph/graph-page.tsx +189 -49
  656. package/src/components/graph/graph-scene.tsx +200 -30
  657. package/src/components/graph/lib/graph-helpers.ts +65 -43
  658. package/src/components/graph/node-card.tsx +64 -0
  659. package/src/components/graph/node-popover.tsx +28 -117
  660. package/src/components/graph/use-graph-theme.ts +69 -32
  661. package/src/components/graph/use-node-actions.ts +56 -0
  662. package/src/components/images/image-share.ts +4 -2
  663. package/src/components/images/image-viewer.tsx +3 -1
  664. package/src/components/images/mask-editor.tsx +7 -4
  665. package/src/components/layout/app-shell.tsx +5 -1
  666. package/src/components/layout/desktop-palette.tsx +151 -0
  667. package/src/components/layout/key-cap.tsx +15 -0
  668. package/src/components/layout/mobile-tab-bar.tsx +80 -157
  669. package/src/components/layout/shortcut-switch.tsx +32 -0
  670. package/src/components/layout/side-rail.tsx +70 -150
  671. package/src/components/layout/slide-panel.tsx +29 -2
  672. package/src/components/layout/theme.tsx +67 -0
  673. package/src/components/quick-actions/add-form.tsx +188 -0
  674. package/src/components/quick-actions/add-modal.tsx +32 -153
  675. package/src/components/quick-actions/search-modal.tsx +5 -3
  676. package/src/components/quick-actions/streaming-modal.tsx +42 -71
  677. package/src/components/quick-actions/streaming-output.tsx +112 -0
  678. package/src/components/quick-actions/whatsup-modal.tsx +38 -60
  679. package/src/components/settings/devices-agents-tab.tsx +60 -152
  680. package/src/components/settings/models-list.tsx +299 -0
  681. package/src/components/settings/models-tab.tsx +63 -337
  682. package/src/components/settings/one-time-agent-credential.tsx +1 -1
  683. package/src/components/settings/passkey-list.tsx +201 -0
  684. package/src/components/settings/passkey-tab.tsx +53 -197
  685. package/src/components/settings/pi-accounts-list.tsx +128 -0
  686. package/src/components/settings/pi-accounts.tsx +71 -170
  687. package/src/components/settings/principal-list.tsx +172 -0
  688. package/src/components/settings/settings-panel.tsx +232 -21
  689. package/src/components/settings/skills-list.tsx +276 -0
  690. package/src/components/settings/skills-tab.tsx +82 -269
  691. package/src/components/settings/tool-permissions-list.tsx +54 -0
  692. package/src/components/settings/tool-permissions.tsx +27 -46
  693. package/src/components/settings/web-search-chain.tsx +300 -0
  694. package/src/components/settings/web-search-settings.tsx +58 -328
  695. package/src/components/share/share-menu.tsx +19 -4
  696. package/src/components/voice/dictation-sheet.tsx +5 -5
  697. package/src/components/voice/mic-button.tsx +1 -1
  698. package/src/components/voice/review-card.tsx +1 -1
  699. package/src/config.ts +21 -7
  700. package/src/connection.ts +443 -0
  701. package/src/default-root.ts +16 -0
  702. package/src/hooks/use-color-scheme.ts +36 -0
  703. package/src/hooks/use-hash-routes.ts +4 -2
  704. package/src/hooks/use-media-query.ts +32 -0
  705. package/src/hooks/use-share-intake.ts +32 -12
  706. package/src/hooks/use-vpn-status.ts +18 -17
  707. package/src/hooks/use-websocket.ts +12 -428
  708. package/src/hooks/websocket-handlers/activity.ts +4 -5
  709. package/src/hooks/websocket-handlers/chat.ts +26 -5
  710. package/src/hooks/websocket-handlers/connection.ts +4 -6
  711. package/src/hooks/websocket-handlers/mask.ts +2 -3
  712. package/src/hooks/websocket-handlers/provider.ts +4 -6
  713. package/src/hooks/websocket-handlers/types.ts +6 -2
  714. package/src/index.ts +7 -3
  715. package/src/lib/api-client.ts +426 -384
  716. package/src/lib/backend.ts +20 -10
  717. package/src/lib/diff.ts +28 -62
  718. package/src/lib/light-dark.ts +83 -0
  719. package/src/lib/mermaid-theme.ts +183 -214
  720. package/src/lib/passkeys.ts +12 -4
  721. package/src/lib/push-registration.ts +19 -2
  722. package/src/lib/share-intake.ts +6 -3
  723. package/src/lib/share.ts +7 -4
  724. package/src/lib/single-key.ts +47 -0
  725. package/src/lib/tool-names.ts +31 -8
  726. package/src/root-context.tsx +40 -0
  727. package/src/root.ts +83 -0
  728. package/src/stores/activity-state.ts +295 -0
  729. package/src/stores/activity-store.ts +11 -285
  730. package/src/stores/chat-state.ts +795 -0
  731. package/src/stores/chat-store.ts +11 -705
  732. package/src/stores/connection-state.ts +78 -0
  733. package/src/stores/connection-store.ts +11 -76
  734. package/src/stores/create-stores.ts +31 -0
  735. package/src/stores/file-state.ts +399 -0
  736. package/src/stores/file-store.ts +9 -390
  737. package/src/stores/graph-state.ts +368 -0
  738. package/src/stores/graph-store.ts +10 -355
  739. package/src/stores/mask-state.ts +30 -0
  740. package/src/stores/mask-store.ts +10 -27
  741. package/src/stores/principal-state.ts +42 -0
  742. package/src/stores/principal-store.ts +10 -37
  743. package/src/stores/provider-state.ts +103 -0
  744. package/src/stores/provider-store.ts +10 -95
  745. package/src/stores/share-state.ts +56 -0
  746. package/src/stores/share-store.ts +11 -54
  747. package/src/stores/store-environment.ts +10 -0
  748. package/src/stores/ui-state.ts +143 -0
  749. package/src/stores/ui-store.ts +11 -93
  750. package/src/styles.css +4 -1
  751. package/src/theme.css +150 -97
  752. package/src/voice/asr-clients.ts +17 -17
  753. package/src/voice/use-dictation.ts +11 -8
  754. package/src/voice/voice-state.ts +57 -0
  755. package/src/voice/voice-store.ts +11 -55
@@ -1,358 +1,13 @@
1
- import { create } from "zustand";
2
- import type {
3
- GraphMetaResponse,
4
- GraphSubgraphResponse,
5
- GraphMaintenanceResponse,
6
- } from "@schlessera/brain-ui-sdk/protocol";
7
- import { apiBase } from "../lib/backend.js";
8
- import { registerDevHandle } from "../config.js";
9
- import { buildQuery, mergeSubgraphs } from "../components/graph/lib/graph-helpers.js";
1
+ import { useRootStore } from "../root-context.js";
2
+ import { defaultRoot } from "../default-root.js";
3
+ export * from "./graph-state.js";
10
4
 
11
- export type GraphMode = "clusters" | "discovery" | "local" | "maintenance";
12
-
13
- export type LocalDirection = "in" | "out" | "both";
14
-
15
- /**
16
- * How a fetch failed. "unavailable" carries the server's gating reason
17
- * (schema too old / not yet computed); "unsupported" means the server predates
18
- * the graph API entirely (404 on /graph/meta).
19
- */
20
- export type GraphErrorKind = "unavailable" | "unsupported" | "network";
21
-
22
- interface GraphError {
23
- kind: GraphErrorKind;
24
- reason?: "schema" | "not_computed";
25
- message: string;
26
- }
27
-
28
- export interface LocalParams {
29
- center: string | null;
30
- depth: 1 | 2 | 3;
31
- direction: LocalDirection;
32
- }
33
-
34
- export interface DiscoveryParams {
35
- /** null = the precomputed default root (direction is fixed there). */
36
- root: string | null;
37
- maxDepth: number;
38
- }
39
-
40
- export interface ClustersParams {
41
- /** null = all communities. */
42
- community: number | null;
43
- isolates: boolean;
44
- }
45
-
46
- export interface MaintenanceParams {
47
- staleDays: number;
48
- }
49
-
50
- export type SizeBy = "degree" | "pagerank";
51
- export type DiscoveryColorBy = "distance" | "folder";
52
-
53
- /** Which finding sections are visible — a client-side filter, no refetch. */
54
- export interface MaintenanceFilters {
55
- orphans: boolean;
56
- unreachable: boolean;
57
- broken: boolean;
58
- stale: boolean;
59
- }
60
-
61
- type FetchState = "idle" | "loading" | "done" | "error";
62
-
63
- interface GraphState {
64
- mode: GraphMode;
65
- meta: GraphMetaResponse | null;
66
- metaState: FetchState;
67
-
68
- local: LocalParams;
69
- discovery: DiscoveryParams;
70
- clusters: ClustersParams;
71
- maintenance: MaintenanceParams;
72
-
73
- /** Scene for the current mode (subgraph modes). */
74
- subgraph: GraphSubgraphResponse | null;
75
- findings: GraphMaintenanceResponse | null;
76
- dataState: FetchState;
77
- error: GraphError | null;
78
-
79
- /** In-scene search query — highlights matching nodes, does not refetch. */
80
- sceneQuery: string;
81
-
82
- // Display-only knobs: they restyle the current scene, never refetch.
83
- clustersSizeBy: SizeBy;
84
- discoveryColorBy: DiscoveryColorBy;
85
- maintenanceFilters: MaintenanceFilters;
86
-
87
- selectedId: number | null;
88
- hoveredId: number | null;
89
-
90
- setMode: (mode: GraphMode) => void;
91
- setLocalParams: (params: Partial<LocalParams>) => void;
92
- setDiscoveryParams: (params: Partial<DiscoveryParams>) => void;
93
- setClustersParams: (params: Partial<ClustersParams>) => void;
94
- setMaintenanceParams: (params: Partial<MaintenanceParams>) => void;
95
- setClustersSizeBy: (sizeBy: SizeBy) => void;
96
- setDiscoveryColorBy: (colorBy: DiscoveryColorBy) => void;
97
- setMaintenanceFilters: (filters: Partial<MaintenanceFilters>) => void;
98
- setSceneQuery: (q: string) => void;
99
- select: (id: number | null) => void;
100
- hover: (id: number | null) => void;
101
-
102
- fetchMeta: (force?: boolean) => Promise<void>;
103
- /** Fetch the scene for the current mode + params (cached per query + computedAt). */
104
- fetchScene: () => Promise<void>;
105
- /** Local mode: pull the depth-1 ego of a node and merge it into the scene. */
106
- expandNode: (path: string) => Promise<void>;
107
- reset: () => void;
108
- }
109
-
110
- /** Cache of scene responses, keyed by `${endpoint}?${query}|${computedAt}`. */
111
- const sceneCache = new Map<string, GraphSubgraphResponse | GraphMaintenanceResponse>();
112
- const SCENE_CACHE_MAX = 40;
113
-
114
- /** Test/dev hook: drop every cached scene. */
115
- export function clearGraphSceneCache(): void {
116
- sceneCache.clear();
117
- }
118
-
119
- /**
120
- * Monotonic tokens for scene and meta fetches. Every call claims a new
121
- * token; only the holder of the latest token may write results (success OR
122
- * error), so a slow older response can never overwrite newer state. Meta
123
- * needs this too: forced mount-time refetches can overlap when the view is
124
- * toggled quickly, and an older /meta response landing last would restore a
125
- * stale computedAt — which is the key every scene-cache lookup hangs off.
126
- */
127
- let sceneRequestToken = 0;
128
- let metaRequestToken = 0;
129
-
130
- function cachePut(key: string, value: GraphSubgraphResponse | GraphMaintenanceResponse) {
131
- if (sceneCache.size >= SCENE_CACHE_MAX) {
132
- const oldest = sceneCache.keys().next().value;
133
- if (oldest !== undefined) sceneCache.delete(oldest);
134
- }
135
- sceneCache.set(key, value);
136
- }
137
-
138
- async function fetchGraphJson<T>(pathAndQuery: string): Promise<T> {
139
- const res = await fetch(`${apiBase()}/graph${pathAndQuery}`);
140
- if (!res.ok) {
141
- const body = await res.json().catch(() => ({}) as Record<string, unknown>);
142
- const err = new Error(
143
- (body as { error?: string }).error || `HTTP ${res.status}`
144
- ) as Error & { status: number; reason?: string };
145
- err.status = res.status;
146
- err.reason = (body as { reason?: string }).reason;
147
- throw err;
148
- }
149
- return res.json() as Promise<T>;
150
- }
151
-
152
- function toGraphError(err: unknown): GraphError {
153
- const e = err as Error & { status?: number; reason?: string };
154
- if (e.status === 404) {
155
- return {
156
- kind: "unsupported",
157
- message: "This server does not know the graph API yet.",
158
- };
159
- }
160
- if (e.status === 503) {
161
- return {
162
- kind: "unavailable",
163
- reason: e.reason === "schema" ? "schema" : "not_computed",
164
- message: e.message || "graph_unavailable",
165
- };
166
- }
167
- return { kind: "network", message: e.message || "Request failed" };
168
- }
169
-
170
- function sceneRequest(state: GraphState): { endpoint: string; query: string } | null {
171
- switch (state.mode) {
172
- case "clusters":
173
- return {
174
- endpoint: "/clusters",
175
- query: buildQuery({
176
- community: state.clusters.community,
177
- isolates: state.clusters.isolates ? 1 : null,
178
- }),
179
- };
180
- case "discovery":
181
- return {
182
- endpoint: "/discovery",
183
- query: buildQuery({
184
- root: state.discovery.root,
185
- maxDepth: state.discovery.maxDepth,
186
- }),
187
- };
188
- case "local":
189
- if (!state.local.center) return null;
190
- return {
191
- endpoint: "/neighborhood",
192
- query: buildQuery({
193
- center: state.local.center,
194
- depth: state.local.depth,
195
- direction: state.local.direction,
196
- }),
197
- };
198
- case "maintenance":
199
- return {
200
- endpoint: "/maintenance",
201
- query: buildQuery({ staleDays: state.maintenance.staleDays }),
202
- };
203
- }
204
- }
205
-
206
- export const useGraphStore = create<GraphState>((set, get) => ({
207
- /**
208
- * Clusters, not Local.
209
- *
210
- * Local is centred on ONE node and has no center until the user picks one,
211
- * so opening the graph landed on an empty canvas with a picker — which reads
212
- * as "the graph is broken", not as "choose a starting point". Clusters is
213
- * the only mode that answers the question someone opening a graph view is
214
- * actually asking: what is in here, and what clumps together.
215
- *
216
- * Local stays one click away, and clicking any node still switches to it
217
- * (node-popover.tsx) — that is the natural way in, rather than the landing
218
- * state.
219
- */
220
- mode: "clusters",
221
- meta: null,
222
- metaState: "idle",
223
-
224
- local: { center: null, depth: 1, direction: "both" },
225
- discovery: { root: null, maxDepth: 8 },
226
- clusters: { community: null, isolates: false },
227
- maintenance: { staleDays: 180 },
228
-
229
- subgraph: null,
230
- findings: null,
231
- dataState: "idle",
232
- error: null,
233
-
234
- sceneQuery: "",
235
- clustersSizeBy: "degree",
236
- discoveryColorBy: "distance",
237
- maintenanceFilters: { orphans: true, unreachable: true, broken: true, stale: true },
238
- selectedId: null,
239
- hoveredId: null,
240
-
241
- setMode: (mode) => {
242
- if (mode === get().mode) return;
243
- set({ mode, subgraph: null, findings: null, dataState: "idle", error: null, selectedId: null, hoveredId: null, sceneQuery: "" });
244
- void get().fetchScene();
245
- },
246
- setLocalParams: (params) => {
247
- set((s) => ({ local: { ...s.local, ...params }, selectedId: null }));
248
- if (get().mode === "local") void get().fetchScene();
5
+ /** Hook reads the current provider. Statics address the default app only. */
6
+ export const useGraphStore = Object.assign(
7
+ function useGraphStore<T>(selector: (state: ReturnType<typeof defaultRoot.stores.graph.getState>) => T): T {
8
+ return useRootStore("graph", selector);
249
9
  },
250
- setDiscoveryParams: (params) => {
251
- set((s) => ({ discovery: { ...s.discovery, ...params }, selectedId: null }));
252
- if (get().mode === "discovery") void get().fetchScene();
253
- },
254
- setClustersParams: (params) => {
255
- set((s) => ({ clusters: { ...s.clusters, ...params }, selectedId: null }));
256
- if (get().mode === "clusters") void get().fetchScene();
257
- },
258
- setMaintenanceParams: (params) => {
259
- set((s) => ({ maintenance: { ...s.maintenance, ...params } }));
260
- if (get().mode === "maintenance") void get().fetchScene();
261
- },
262
- setClustersSizeBy: (sizeBy) => set({ clustersSizeBy: sizeBy }),
263
- setDiscoveryColorBy: (colorBy) => set({ discoveryColorBy: colorBy }),
264
- setMaintenanceFilters: (filters) =>
265
- set((s) => ({ maintenanceFilters: { ...s.maintenanceFilters, ...filters } })),
266
- setSceneQuery: (q) => set({ sceneQuery: q }),
267
- select: (id) => set({ selectedId: id }),
268
- hover: (id) => set({ hoveredId: id }),
269
-
270
- fetchMeta: async (force) => {
271
- const { metaState } = get();
272
- if (!force && (metaState === "loading" || metaState === "done")) return;
273
- const token = ++metaRequestToken;
274
- set({ metaState: "loading" });
275
- try {
276
- const meta = await fetchGraphJson<GraphMetaResponse>("/meta");
277
- if (token !== metaRequestToken) return;
278
- set({ meta, metaState: "done" });
279
- } catch (err) {
280
- if (token !== metaRequestToken) return;
281
- set({ metaState: "error", error: toGraphError(err) });
282
- }
283
- },
284
-
285
- fetchScene: async () => {
286
- const state = get();
287
- const token = ++sceneRequestToken;
288
- const req = sceneRequest(state);
289
- if (!req) {
290
- // Local mode without a center: nothing to fetch, the page shows the picker.
291
- set({ subgraph: null, findings: null, dataState: "idle", error: null });
292
- return;
293
- }
294
- const cacheKey = `${req.endpoint}?${req.query}|${state.meta?.computedAt ?? ""}`;
295
- const cached = sceneCache.get(cacheKey);
296
- if (cached) {
297
- if (state.mode === "maintenance") {
298
- set({ findings: cached as GraphMaintenanceResponse, subgraph: null, dataState: "done", error: null });
299
- } else {
300
- set({ subgraph: cached as GraphSubgraphResponse, findings: null, dataState: "done", error: null });
301
- }
302
- return;
303
- }
304
- set({ dataState: "loading", error: null });
305
- const requestedMode = state.mode;
306
- try {
307
- const data = await fetchGraphJson<GraphSubgraphResponse | GraphMaintenanceResponse>(
308
- `${req.endpoint}${req.query ? `?${req.query}` : ""}`
309
- );
310
- // The cache is always safe to fill; the visible scene belongs to the
311
- // latest request only (rapid param changes race their responses).
312
- cachePut(cacheKey, data);
313
- if (token !== sceneRequestToken) return;
314
- if (requestedMode === "maintenance") {
315
- set({ findings: data as GraphMaintenanceResponse, subgraph: null, dataState: "done" });
316
- } else {
317
- set({ subgraph: data as GraphSubgraphResponse, findings: null, dataState: "done" });
318
- }
319
- } catch (err) {
320
- if (token !== sceneRequestToken) return;
321
- set({ dataState: "error", error: toGraphError(err) });
322
- }
323
- },
324
-
325
- expandNode: async (path) => {
326
- const state = get();
327
- if (state.mode !== "local" || !state.subgraph) return;
328
- try {
329
- const ego = await fetchGraphJson<GraphSubgraphResponse>(
330
- `/neighborhood?${buildQuery({ center: path, depth: 1, direction: "both" })}`
331
- );
332
- const current = get();
333
- if (current.mode !== "local" || !current.subgraph) return;
334
- set({ subgraph: mergeSubgraphs(current.subgraph, ego) });
335
- } catch {
336
- // Expansion is additive sugar — a failure leaves the scene as-is.
337
- }
338
- },
339
-
340
- reset: () =>
341
- set({
342
- subgraph: null,
343
- findings: null,
344
- dataState: "idle",
345
- error: null,
346
- selectedId: null,
347
- hoveredId: null,
348
- sceneQuery: "",
349
- }),
350
- }));
10
+ defaultRoot.stores.graph,
11
+ );
351
12
 
352
- // Dev-only handle for exercising the view with injected fixtures (the
353
- // window.__chatStore precedent), gated on the shell's `devTools` flag.
354
- registerDevHandle(() => {
355
- if (typeof window === "undefined") return;
356
- (window as unknown as { __graphStore?: typeof useGraphStore }).__graphStore =
357
- useGraphStore;
358
- });
13
+ export function clearGraphSceneCache(): void { defaultRoot.stores.graph.clearSceneCache(); }
@@ -0,0 +1,30 @@
1
+ import { createStore } from "zustand/vanilla";
2
+
3
+ /**
4
+ * The pending mask request, if any.
5
+ *
6
+ * Deliberately a small standalone store rather than chat-buffer state: a mask
7
+ * request is modal and at most one is open at a time, and nothing about it
8
+ * needs to survive in a transcript — the answer travels back over the socket
9
+ * and the resulting file is what persists.
10
+ */
11
+ export interface MaskRequest {
12
+ requestId: string;
13
+ imagePath: string;
14
+ instruction?: string;
15
+ turnId?: string;
16
+ }
17
+
18
+ export interface MaskState {
19
+ request: MaskRequest | null;
20
+ open: (request: MaskRequest) => void;
21
+ close: () => void;
22
+ }
23
+
24
+ export function createMaskStore() {
25
+ return createStore<MaskState>((set) => ({
26
+ request: null,
27
+ open: (request) => set({ request }),
28
+ close: () => set({ request: null }),
29
+ }));
30
+ }
@@ -1,28 +1,11 @@
1
- import { create } from "zustand";
1
+ import { useRootStore } from "../root-context.js";
2
+ import { defaultRoot } from "../default-root.js";
3
+ export * from "./mask-state.js";
2
4
 
3
- /**
4
- * The pending mask request, if any.
5
- *
6
- * Deliberately a small standalone store rather than chat-buffer state: a mask
7
- * request is modal and at most one is open at a time, and nothing about it
8
- * needs to survive in a transcript — the answer travels back over the socket
9
- * and the resulting file is what persists.
10
- */
11
- export interface MaskRequest {
12
- requestId: string;
13
- imagePath: string;
14
- instruction?: string;
15
- turnId?: string;
16
- }
17
-
18
- interface MaskState {
19
- request: MaskRequest | null;
20
- open: (request: MaskRequest) => void;
21
- close: () => void;
22
- }
23
-
24
- export const useMaskStore = create<MaskState>((set) => ({
25
- request: null,
26
- open: (request) => set({ request }),
27
- close: () => set({ request: null }),
28
- }));
5
+ /** Hook reads the current provider. Statics address the default app only. */
6
+ export const useMaskStore = Object.assign(
7
+ function useMaskStore<T>(selector: (state: ReturnType<typeof defaultRoot.stores.mask.getState>) => T): T {
8
+ return useRootStore("mask", selector);
9
+ },
10
+ defaultRoot.stores.mask,
11
+ );
@@ -0,0 +1,42 @@
1
+ import type { StoreEnvironment } from "./store-environment.js";
2
+ import { createStore } from "zustand/vanilla";
3
+ import type { MintedAgent } from "../lib/api-client.js";
4
+
5
+ export interface PrincipalState {
6
+ mintPending: boolean;
7
+ mintError: string | null;
8
+ oneTimeCredential: MintedAgent | null;
9
+ mintAgent: (label: string, ttlDays: number) => Promise<void>;
10
+ acknowledgeAgentCredential: () => void;
11
+ }
12
+
13
+ /**
14
+ * Mint state lives above Settings because the response contains an
15
+ * unrecoverable, one-time value. Closing a panel or changing views must not
16
+ * discard either the request in flight or the value it eventually returns.
17
+ */
18
+ export function createPrincipalStore(env: StoreEnvironment) {
19
+ const { api } = env;
20
+ return createStore<PrincipalState>((set, get) => ({
21
+ mintPending: false,
22
+ mintError: null,
23
+ oneTimeCredential: null,
24
+
25
+ mintAgent: async (label, ttlDays) => {
26
+ if (get().mintPending || get().oneTimeCredential) return;
27
+ set({ mintPending: true, mintError: null });
28
+ try {
29
+ const oneTimeCredential = await api.principalMint(label, ttlDays);
30
+ set({ mintPending: false, oneTimeCredential });
31
+ } catch (error) {
32
+ set({
33
+ mintPending: false,
34
+ mintError:
35
+ error instanceof Error ? error.message : "Could not create agent access",
36
+ });
37
+ }
38
+ },
39
+
40
+ acknowledgeAgentCredential: () => set({ oneTimeCredential: null }),
41
+ }));
42
+ }
@@ -1,38 +1,11 @@
1
- import { create } from "zustand";
2
- import { api, type MintedAgent } from "../lib/api-client.js";
3
-
4
- interface PrincipalState {
5
- mintPending: boolean;
6
- mintError: string | null;
7
- oneTimeCredential: MintedAgent | null;
8
- mintAgent: (label: string, ttlDays: number) => Promise<void>;
9
- acknowledgeAgentCredential: () => void;
10
- }
11
-
12
- /**
13
- * Mint state lives above Settings because the response contains an
14
- * unrecoverable, one-time value. Closing a panel or changing views must not
15
- * discard either the request in flight or the value it eventually returns.
16
- */
17
- export const usePrincipalStore = create<PrincipalState>((set, get) => ({
18
- mintPending: false,
19
- mintError: null,
20
- oneTimeCredential: null,
21
-
22
- mintAgent: async (label, ttlDays) => {
23
- if (get().mintPending || get().oneTimeCredential) return;
24
- set({ mintPending: true, mintError: null });
25
- try {
26
- const oneTimeCredential = await api.principalMint(label, ttlDays);
27
- set({ mintPending: false, oneTimeCredential });
28
- } catch (error) {
29
- set({
30
- mintPending: false,
31
- mintError:
32
- error instanceof Error ? error.message : "Could not create agent access",
33
- });
34
- }
1
+ import { useRootStore } from "../root-context.js";
2
+ import { defaultRoot } from "../default-root.js";
3
+ export * from "./principal-state.js";
4
+
5
+ /** Hook reads the current provider. Statics address the default app only. */
6
+ export const usePrincipalStore = Object.assign(
7
+ function usePrincipalStore<T>(selector: (state: ReturnType<typeof defaultRoot.stores.principal.getState>) => T): T {
8
+ return useRootStore("principal", selector);
35
9
  },
36
-
37
- acknowledgeAgentCredential: () => set({ oneTimeCredential: null }),
38
- }));
10
+ defaultRoot.stores.principal,
11
+ );
@@ -0,0 +1,103 @@
1
+ import type { StoreEnvironment } from "./store-environment.js";
2
+ import { createStore } from "zustand/vanilla";
3
+ import type { ProviderInfo } from "@schlessera/brain-ui-sdk/protocol";
4
+ import type { BackendInfo } from "../lib/api-client.js";
5
+
6
+ export interface ProviderState {
7
+ /** Provider combos the server currently offers (metadata only). */
8
+ available: ProviderInfo[];
9
+ /** User's chosen combo for the next new conversation. Persisted. */
10
+ selectedId: string;
11
+ /**
12
+ * Provider the active session is pinned to (from `session_info`). When set,
13
+ * it takes display precedence over `selectedId` and the picker locks.
14
+ */
15
+ pinnedId: string | null;
16
+ /** Capability metadata keyed by backend id. */
17
+ backends: Record<string, BackendInfo>;
18
+ loaded: boolean;
19
+
20
+ loadProviders: () => Promise<void>;
21
+ setSelected: (id: string) => void;
22
+ setPinned: (id: string | null) => void;
23
+ }
24
+
25
+ export function createProviderStore(env: StoreEnvironment) {
26
+ const { api } = env;
27
+ const PROVIDER_ID_KEY = env.storageKey("brain-ui:provider-id");
28
+
29
+ function readSelectedId(): string {
30
+ const storage = env.storage();
31
+ if (!storage) return "";
32
+ return env.storage()?.getItem(PROVIDER_ID_KEY) ?? "";
33
+ }
34
+
35
+
36
+ return createStore<ProviderState>((set, get) => ({
37
+ available: [],
38
+ selectedId: readSelectedId(),
39
+ pinnedId: null,
40
+ backends: {},
41
+ loaded: false,
42
+
43
+ loadProviders: async () => {
44
+ try {
45
+ const { providers, backends } = await api.providers();
46
+ set((s) => {
47
+ // Keep the persisted choice if it's still on offer; otherwise fall
48
+ // back to the first available combo. This runs on every reload of the
49
+ // roster, so hiding the selected model in settings moves the selection
50
+ // instead of leaving the composer pointing at a profile the picker no
51
+ // longer lists.
52
+ const stillValid = providers.some((p) => p.id === s.selectedId);
53
+ const selectedId =
54
+ stillValid && s.selectedId
55
+ ? s.selectedId
56
+ : providers[0]?.id ?? "";
57
+ // Persist the fallback too — otherwise the stale id sits in
58
+ // localStorage and has to be re-resolved on every boot.
59
+ if (
60
+ selectedId !== s.selectedId &&
61
+ env.storage() !== null
62
+ ) {
63
+ env.storage()?.setItem(PROVIDER_ID_KEY, selectedId);
64
+ }
65
+ return {
66
+ available: providers,
67
+ selectedId,
68
+ backends: backends ?? {},
69
+ loaded: true,
70
+ };
71
+ });
72
+ } catch {
73
+ // Soft-fail: leave the picker empty; the composer still works and
74
+ // sends run on the server default.
75
+ set({ loaded: true });
76
+ }
77
+ },
78
+
79
+ setSelected: (id) => {
80
+ if (env.storage() !== null) {
81
+ env.storage()?.setItem(PROVIDER_ID_KEY, id);
82
+ }
83
+ set({ selectedId: id });
84
+ },
85
+
86
+ setPinned: (id) => {
87
+ if (get().pinnedId === id) return;
88
+ set({ pinnedId: id });
89
+ },
90
+ }));
91
+ }
92
+
93
+ /** Resolve the backend metadata for an available provider profile. */
94
+ export function selectBackendForProvider(
95
+ state: Pick<ProviderState, "available" | "backends">,
96
+ providerId: string | null | undefined
97
+ ): BackendInfo | null {
98
+ const backendId = state.available.find(
99
+ (provider) => provider.id === providerId
100
+ )?.backendId;
101
+ return backendId ? state.backends[backendId] ?? null : null;
102
+ }
103
+