@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,5 +1,5 @@
1
1
  /**
2
- * Mermaid theme variables for the two surfaces a diagram can land on.
2
+ * Mermaid theme variables for the two schemes a diagram can land on.
3
3
  *
4
4
  * Mermaid's stock "dark" theme is a blue-grey palette that reads as foreign
5
5
  * next to the app's warm-neutral chrome, and its "neutral" theme is what the
@@ -7,17 +7,29 @@
7
7
  * variables below, so an in-app diagram and a shared PNG are recognisably the
8
8
  * same product.
9
9
  *
10
- * Two rules kept the palette honest:
11
- * - Surfaces follow the tokens in theme.css, not approximations of them. A
12
- * chat diagram sits on `--color-surface` (#141619), not on the page
13
- * background, because MermaidBlock draws it on a raised plate.
14
- * - Multi-series colors reuse CATEGORICAL_SLOTS from the graph view, which
15
- * is the repo's one CVD-validated categorical palette. Slot order is the
16
- * CVD-safety mechanism there and is preserved here.
10
+ * Every value is a kit token, read for the scheme (`readToken`), because
11
+ * mermaid's `themeVariables` take literal colours and cannot follow a CSS
12
+ * custom property:
13
+ * - The six diagram surfaces are the kit's `--bk-diagram-*` (seventh drop
14
+ * §L6): the grounds are surfaces, and every LINE is information and takes
15
+ * the 3:1 bar. Text is the ink — a node's label never takes its node's
16
+ * colour.
17
+ * - Multi-series colours are the kit's canvas slots, the repo's one
18
+ * CVD-validated categorical palette, respelled per theme in the same
19
+ * order: a series keeps its slot between a dark diagram and its paper
20
+ * export, and the slot order is the CVD-safety mechanism.
21
+ * - A bar that carries `on-fill` text (an active, done or critical task) is
22
+ * a FILL, never an ink or a mark: on paper a darkened accent under
23
+ * near-black text is unreadable.
24
+ *
25
+ * The share pipeline renders in `light`, whatever the screen shows: a share
26
+ * lands in a mail client or a printer, which assume paper.
17
27
  */
18
- import { CATEGORICAL_SLOTS, OTHER_COLOR } from "../components/graph/lib/graph-helpers.js";
28
+ import type { TokenName } from "@schlessera/brain-ui-kit";
29
+
30
+ import { readToken, type ColorScheme } from "./light-dark.js";
19
31
 
20
- export type MermaidTheme = "dark" | "light";
32
+ export type MermaidTheme = ColorScheme;
21
33
 
22
34
  // These variables reach mermaid through initialize(), NOT through a
23
35
  // `%%{init: …}%%` directive: mermaid's directive path rewrites `'` to `"`
@@ -25,222 +37,179 @@ export type MermaidTheme = "dark" | "light";
25
37
  // a font stack cannot survive it. See the note in mermaid.ts.
26
38
  const SANS = '"Plus Jakarta Sans", system-ui, -apple-system, sans-serif';
27
39
 
28
- /** Ordered series colors, long enough for the 12-slot scales mermaid asks for. */
29
- const SERIES = [...CATEGORICAL_SLOTS, OTHER_COLOR, "#67b8e3", "#eab354", "#b197d4"];
40
+ interface DiagramPalette {
41
+ bg: string;
42
+ node: string;
43
+ cluster: string;
44
+ line: string;
45
+ clusterBorder: string;
46
+ text: string;
47
+ /** The raised surface: sequence activations, notes, alternate sections. */
48
+ raised: string;
49
+ /** The card edge, as a neutral bar ground. */
50
+ edge: string;
51
+ muted: string;
52
+ /** The amber ink: titles, note borders, the quadrant point. */
53
+ accent: string;
54
+ /** The teal ink: the active activation, the today line. */
55
+ affirm: string;
56
+ /** The red ink: error text. */
57
+ danger: string;
58
+ /** Text on a fill — near-black in both themes. */
59
+ onFill: string;
60
+ /** The three fills that carry on-fill text: active, done, critical. */
61
+ amberFill: string;
62
+ neutralFill: string;
63
+ redFill: string;
64
+ /** Ordered series colours, long enough for the 12-slot scales mermaid asks for. */
65
+ series: string[];
66
+ }
67
+
68
+ function palette(scheme: ColorScheme): DiagramPalette {
69
+ const t = (name: TokenName) => readToken(name, scheme);
70
+ return {
71
+ bg: t("diagram-bg"),
72
+ node: t("diagram-node"),
73
+ cluster: t("diagram-cluster"),
74
+ line: t("diagram-line"),
75
+ clusterBorder: t("diagram-cluster-border"),
76
+ text: t("diagram-text"),
77
+ raised: t("color-raised"),
78
+ edge: t("color-edge"),
79
+ muted: t("color-ink-mute"),
80
+ accent: t("color-amber"),
81
+ affirm: t("color-teal"),
82
+ danger: t("color-red"),
83
+ onFill: t("on-fill"),
84
+ amberFill: t("amber-fill"),
85
+ neutralFill: t("neutral-fill"),
86
+ redFill: t("red-fill"),
87
+ series: [
88
+ ...[1, 2, 3, 4, 5, 6, 7, 8].map((n) => t(`canvas-slot-${n}` as TokenName)),
89
+ t("canvas-other"),
90
+ t("blue-mark"),
91
+ t("gold-mark"),
92
+ t("purple-mark"),
93
+ ],
94
+ };
95
+ }
30
96
 
31
97
  /** Expand a scale into the `${prefix}0..count-1` (or 1-based) shape mermaid wants. */
32
- function scale(prefix: string, count: number, oneBased = false): Record<string, string> {
98
+ function scale(series: string[], prefix: string, count: number, oneBased = false): Record<string, string> {
33
99
  const out: Record<string, string> = {};
34
100
  for (let i = 0; i < count; i++) {
35
- out[`${prefix}${oneBased ? i + 1 : i}`] = SERIES[i % SERIES.length];
101
+ out[`${prefix}${oneBased ? i + 1 : i}`] = series[i % series.length]!;
36
102
  }
37
103
  return out;
38
104
  }
39
105
 
40
106
  /**
41
- * Dark: the in-app palette. Node fills use `--color-surface-overlay` so nodes
42
- * sit a step above the block's own `--color-surface` plate, and borders use
43
- * #3d4150 rather than `--color-border` (#2a2d35) — a 1px border at the token
44
- * value all but disappears against the plate at diagram scale.
107
+ * The variables for one palette. Node fills use the diagram node surface so
108
+ * nodes sit a step above the block's own plate, and borders use the diagram
109
+ * line — a 1px border at the card-edge value all but disappears against the
110
+ * plate at diagram scale.
45
111
  */
46
- const DARK: Record<string, string | boolean> = {
47
- darkMode: true,
48
- background: "#141619",
49
- fontFamily: SANS,
50
- fontSize: "14px",
51
-
52
- primaryColor: "#1e2128",
53
- primaryTextColor: "#e8e4df",
54
- primaryBorderColor: "#3d4150",
55
- secondaryColor: "#1a1d22",
56
- secondaryTextColor: "#e8e4df",
57
- secondaryBorderColor: "#3d4150",
58
- tertiaryColor: "#0c0e12",
59
- tertiaryTextColor: "#8a8691",
60
- tertiaryBorderColor: "#2a2d35",
61
-
62
- mainBkg: "#1e2128",
63
- nodeBorder: "#3d4150",
64
- nodeTextColor: "#e8e4df",
65
- textColor: "#e8e4df",
66
- lineColor: "#8a8691",
67
- defaultLinkColor: "#8a8691",
68
- titleColor: "#e09f3e",
69
- edgeLabelBackground: "#141619",
70
- clusterBkg: "#0c0e12",
71
- clusterBorder: "#2a2d35",
72
-
73
- noteBkgColor: "#1a1d22",
74
- noteTextColor: "#e8e4df",
75
- noteBorderColor: "#e09f3e",
76
- errorBkgColor: "#2a1a1a",
77
- errorTextColor: "#f87171",
78
-
79
- // Sequence
80
- actorBkg: "#1e2128",
81
- actorBorder: "#3d4150",
82
- actorTextColor: "#e8e4df",
83
- actorLineColor: "#3d4150",
84
- signalColor: "#8a8691",
85
- signalTextColor: "#e8e4df",
86
- labelBoxBkgColor: "#1a1d22",
87
- labelBoxBorderColor: "#2a2d35",
88
- labelTextColor: "#e8e4df",
89
- loopTextColor: "#e8e4df",
90
- activationBkgColor: "#1a1d22",
91
- activationBorderColor: "#5bb5a2",
92
- sequenceNumberColor: "#0c0e12",
93
-
94
- // State / class / journey
95
- labelColor: "#e8e4df",
96
- altBackground: "#0c0e12",
97
- classText: "#e8e4df",
98
-
99
- // Gantt
100
- sectionBkgColor: "#1a1d22",
101
- altSectionBkgColor: "#141619",
102
- sectionBkgColor2: "#1e2128",
103
- gridColor: "#2a2d35",
104
- taskBkgColor: "#2a2d35",
105
- taskTextColor: "#e8e4df",
106
- taskTextOutsideColor: "#e8e4df",
107
- taskTextDarkColor: "#0c0e12",
108
- taskBorderColor: "#3d4150",
109
- doneTaskBkgColor: "#565b66",
110
- doneTaskBorderColor: "#3d4150",
111
- activeTaskBkgColor: "#e09f3e",
112
- activeTaskBorderColor: "#e09f3e",
113
- critBkgColor: "#d03b3b",
114
- critBorderColor: "#d03b3b",
115
- todayLineColor: "#5bb5a2",
116
-
117
- // Pie
118
- pieTitleTextColor: "#e8e4df",
119
- pieSectionTextColor: "#0c0e12",
120
- pieLegendTextColor: "#e8e4df",
121
- pieStrokeColor: "#141619",
122
- pieOuterStrokeColor: "#2a2d35",
123
-
124
- // Quadrant / requirement / misc surfaces that don't inherit cleanly
125
- quadrant1Fill: "#1e2128",
126
- quadrant2Fill: "#1a1d22",
127
- quadrant3Fill: "#141619",
128
- quadrant4Fill: "#1e2128",
129
- quadrantPointFill: "#e09f3e",
130
- quadrantTitleFill: "#e8e4df",
131
- quadrantInternalBorderStrokeFill: "#2a2d35",
132
- quadrantExternalBorderStrokeFill: "#3d4150",
133
- };
112
+ function variables(scheme: ColorScheme, p: DiagramPalette): Record<string, string | boolean> {
113
+ return {
114
+ darkMode: scheme === "dark",
115
+ background: p.bg,
116
+ fontFamily: SANS,
117
+ fontSize: "14px",
118
+
119
+ primaryColor: p.node,
120
+ primaryTextColor: p.text,
121
+ primaryBorderColor: p.line,
122
+ secondaryColor: p.raised,
123
+ secondaryTextColor: p.text,
124
+ secondaryBorderColor: p.line,
125
+ tertiaryColor: p.cluster,
126
+ tertiaryTextColor: p.muted,
127
+ tertiaryBorderColor: p.clusterBorder,
128
+
129
+ mainBkg: p.node,
130
+ nodeBorder: p.line,
131
+ nodeTextColor: p.text,
132
+ textColor: p.text,
133
+ lineColor: p.line,
134
+ defaultLinkColor: p.line,
135
+ titleColor: p.accent,
136
+ edgeLabelBackground: p.bg,
137
+ clusterBkg: p.cluster,
138
+ clusterBorder: p.clusterBorder,
139
+
140
+ noteBkgColor: p.raised,
141
+ noteTextColor: p.text,
142
+ noteBorderColor: p.accent,
143
+ errorBkgColor: p.cluster,
144
+ errorTextColor: p.danger,
145
+
146
+ // Sequence
147
+ actorBkg: p.node,
148
+ actorBorder: p.line,
149
+ actorTextColor: p.text,
150
+ actorLineColor: p.line,
151
+ signalColor: p.line,
152
+ signalTextColor: p.text,
153
+ labelBoxBkgColor: p.raised,
154
+ labelBoxBorderColor: p.clusterBorder,
155
+ labelTextColor: p.text,
156
+ loopTextColor: p.text,
157
+ activationBkgColor: p.raised,
158
+ activationBorderColor: p.affirm,
159
+ sequenceNumberColor: p.onFill,
160
+
161
+ // State / class / journey
162
+ labelColor: p.text,
163
+ altBackground: p.cluster,
164
+ classText: p.text,
165
+
166
+ // Gantt
167
+ sectionBkgColor: p.raised,
168
+ altSectionBkgColor: p.bg,
169
+ sectionBkgColor2: p.node,
170
+ gridColor: p.clusterBorder,
171
+ taskBkgColor: p.edge,
172
+ taskTextColor: p.text,
173
+ taskTextOutsideColor: p.text,
174
+ taskTextDarkColor: p.onFill,
175
+ taskBorderColor: p.line,
176
+ doneTaskBkgColor: p.neutralFill,
177
+ doneTaskBorderColor: p.line,
178
+ activeTaskBkgColor: p.amberFill,
179
+ activeTaskBorderColor: p.amberFill,
180
+ critBkgColor: p.redFill,
181
+ critBorderColor: p.redFill,
182
+ todayLineColor: p.affirm,
183
+
184
+ // Pie
185
+ pieTitleTextColor: p.text,
186
+ pieSectionTextColor: p.onFill,
187
+ pieLegendTextColor: p.text,
188
+ pieStrokeColor: p.bg,
189
+ pieOuterStrokeColor: p.clusterBorder,
190
+
191
+ // Quadrant / requirement / misc surfaces that don't inherit cleanly
192
+ quadrant1Fill: p.node,
193
+ quadrant2Fill: p.raised,
194
+ quadrant3Fill: p.bg,
195
+ quadrant4Fill: p.node,
196
+ quadrantPointFill: p.accent,
197
+ quadrantTitleFill: p.text,
198
+ quadrantInternalBorderStrokeFill: p.clusterBorder,
199
+ quadrantExternalBorderStrokeFill: p.line,
200
+
201
+ ...scale(p.series, "pie", 12, true), // pie1..pie12
202
+ ...scale(p.series, "cScale", 12), // cScale0..11 (journey, timeline, xychart)
203
+ ...scale(p.series, "fillType", 8), // fillType0..7 (class/state/journey sections)
204
+ ...scale(p.series, "git", 8), // git0..git7 (gitgraph branches)
205
+ };
206
+ }
134
207
 
135
208
  /**
136
- * Light: what the share renderer emits. Tuned against the PNG/PDF template's
137
- * own palette (`ui-server/src/render/template.ts`: #ffffff page, #f8fafc
138
- * surface, #e5e7eb border, #1f2937 text) so a diagram doesn't look pasted in.
139
- * The amber and teal are darkened from the app tokens — #e09f3e on white is a
140
- * 1.9:1 line, unusable for edges or titles.
209
+ * Theme variables for a scheme, as mermaid's `themeVariables` object. Read
210
+ * at call time, so a host that re-points a token and a theme switch are both
211
+ * honoured; `mermaid.ts` re-initialises per render anyway.
141
212
  */
142
- const LIGHT: Record<string, string | boolean> = {
143
- darkMode: false,
144
- background: "#ffffff",
145
- fontFamily: SANS,
146
- fontSize: "14px",
147
-
148
- primaryColor: "#f8fafc",
149
- primaryTextColor: "#1f2937",
150
- primaryBorderColor: "#c3c9d2",
151
- secondaryColor: "#f3f4f6",
152
- secondaryTextColor: "#1f2937",
153
- secondaryBorderColor: "#c3c9d2",
154
- tertiaryColor: "#ffffff",
155
- tertiaryTextColor: "#6b7280",
156
- tertiaryBorderColor: "#e5e7eb",
157
-
158
- mainBkg: "#f8fafc",
159
- nodeBorder: "#c3c9d2",
160
- nodeTextColor: "#1f2937",
161
- textColor: "#1f2937",
162
- lineColor: "#6b7280",
163
- defaultLinkColor: "#6b7280",
164
- titleColor: "#9a6516",
165
- edgeLabelBackground: "#ffffff",
166
- clusterBkg: "#f3f4f6",
167
- clusterBorder: "#d7dbe0",
168
-
169
- noteBkgColor: "#fdf6e8",
170
- noteTextColor: "#1f2937",
171
- noteBorderColor: "#9a6516",
172
- errorBkgColor: "#fdecec",
173
- errorTextColor: "#b42323",
174
-
175
- // Sequence
176
- actorBkg: "#f8fafc",
177
- actorBorder: "#c3c9d2",
178
- actorTextColor: "#1f2937",
179
- actorLineColor: "#c3c9d2",
180
- signalColor: "#6b7280",
181
- signalTextColor: "#1f2937",
182
- labelBoxBkgColor: "#f3f4f6",
183
- labelBoxBorderColor: "#d7dbe0",
184
- labelTextColor: "#1f2937",
185
- loopTextColor: "#1f2937",
186
- activationBkgColor: "#f3f4f6",
187
- activationBorderColor: "#2f7d6b",
188
- sequenceNumberColor: "#ffffff",
189
-
190
- // State / class / journey
191
- labelColor: "#1f2937",
192
- altBackground: "#f3f4f6",
193
- classText: "#1f2937",
194
-
195
- // Gantt
196
- sectionBkgColor: "#f8fafc",
197
- altSectionBkgColor: "#ffffff",
198
- sectionBkgColor2: "#f3f4f6",
199
- gridColor: "#e5e7eb",
200
- taskBkgColor: "#e5e7eb",
201
- taskTextColor: "#1f2937",
202
- taskTextOutsideColor: "#1f2937",
203
- taskTextDarkColor: "#1f2937",
204
- taskBorderColor: "#c3c9d2",
205
- doneTaskBkgColor: "#d7dbe0",
206
- doneTaskBorderColor: "#c3c9d2",
207
- activeTaskBkgColor: "#e0a75a",
208
- activeTaskBorderColor: "#9a6516",
209
- critBkgColor: "#e08a8a",
210
- critBorderColor: "#b42323",
211
- todayLineColor: "#2f7d6b",
212
-
213
- // Pie
214
- pieTitleTextColor: "#1f2937",
215
- pieSectionTextColor: "#ffffff",
216
- pieLegendTextColor: "#1f2937",
217
- pieStrokeColor: "#ffffff",
218
- pieOuterStrokeColor: "#d7dbe0",
219
-
220
- // Quadrant
221
- quadrant1Fill: "#f8fafc",
222
- quadrant2Fill: "#f3f4f6",
223
- quadrant3Fill: "#ffffff",
224
- quadrant4Fill: "#f8fafc",
225
- quadrantPointFill: "#9a6516",
226
- quadrantTitleFill: "#1f2937",
227
- quadrantInternalBorderStrokeFill: "#e5e7eb",
228
- quadrantExternalBorderStrokeFill: "#d7dbe0",
229
- };
230
-
231
- const SERIES_SCALES: Record<string, string> = {
232
- ...scale("pie", 12, true), // pie1..pie12
233
- ...scale("cScale", 12), // cScale0..11 (journey, timeline, xychart)
234
- ...scale("fillType", 8), // fillType0..7 (class/state/journey sections)
235
- ...scale("git", 8), // git0..git7 (gitgraph branches)
236
- };
237
-
238
- const THEME_VARIABLES: Record<MermaidTheme, Record<string, string | boolean>> = {
239
- dark: { ...DARK, ...SERIES_SCALES },
240
- light: { ...LIGHT, ...SERIES_SCALES },
241
- };
242
-
243
- /** Theme variables for a target surface, as mermaid's `themeVariables` object. */
244
213
  export function mermaidThemeVariables(theme: MermaidTheme): Record<string, string | boolean> {
245
- return THEME_VARIABLES[theme];
214
+ return variables(theme, palette(theme));
246
215
  }
@@ -4,11 +4,12 @@ import {
4
4
  browserSupportsWebAuthn,
5
5
  browserSupportsWebAuthnAutofill,
6
6
  } from "@simplewebauthn/browser";
7
- import { api } from "./api-client.js";
7
+ import type { BrainApi } from "./api-client.js";
8
8
 
9
9
  /**
10
10
  * Thin ceremony wrappers around @simplewebauthn/browser. All server calls go
11
- * through api-client; success means the server set the session cookie.
11
+ * through the supplied API. Cancellation prevents starting a stale prompt or
12
+ * submitting its result; the browser library owns the page-wide prompt itself.
12
13
  */
13
14
 
14
15
  export function supportsPasskeys(): boolean {
@@ -31,20 +32,27 @@ export function isUserCancel(err: unknown): boolean {
31
32
  * Full login ceremony. With `useBrowserAutofill`, resolves only if the user
32
33
  * picks a passkey from the input's autofill suggestions (conditional UI).
33
34
  */
34
- export async function loginWithPasskey(opts?: {
35
+ export async function loginWithPasskey(api: BrainApi, opts?: {
36
+ signal?: AbortSignal;
35
37
  useBrowserAutofill?: boolean;
36
38
  }): Promise<void> {
39
+ opts?.signal?.throwIfAborted();
37
40
  const optionsJSON = await api.passkeyLoginOptions();
41
+ opts?.signal?.throwIfAborted();
38
42
  const response = await startAuthentication({
39
43
  optionsJSON,
40
44
  useBrowserAutofill: opts?.useBrowserAutofill ?? false,
41
45
  });
46
+ opts?.signal?.throwIfAborted();
42
47
  await api.passkeyLoginVerify(response);
43
48
  }
44
49
 
45
50
  /** Full registration ceremony (requires an authenticated session). */
46
- export async function registerPasskey(label?: string): Promise<void> {
51
+ export async function registerPasskey(api: BrainApi, label?: string, signal?: AbortSignal): Promise<void> {
52
+ signal?.throwIfAborted();
47
53
  const optionsJSON = await api.passkeyRegisterOptions();
54
+ signal?.throwIfAborted();
48
55
  const response = await startRegistration({ optionsJSON });
56
+ signal?.throwIfAborted();
49
57
  await api.passkeyRegisterVerify(response, label);
50
58
  }
@@ -1,11 +1,12 @@
1
- import { api } from "./api-client.js";
1
+ import type { BrainApi } from "./api-client.js";
2
2
 
3
3
  /**
4
4
  * Re-assert an existing browser subscription after authentication changes.
5
5
  * This does not request permission or create a subscription: it only binds an
6
6
  * already-enabled endpoint to the newly issued server principal.
7
7
  */
8
- export async function rebindPushSubscriptionAfterLogin(): Promise<void> {
8
+ export async function rebindPushSubscriptionAfterLogin(api: BrainApi, signal?: AbortSignal): Promise<void> {
9
+ signal?.throwIfAborted();
9
10
  if (
10
11
  typeof Notification === "undefined" ||
11
12
  Notification.permission !== "granted" ||
@@ -23,7 +24,23 @@ export async function rebindPushSubscriptionAfterLogin(): Promise<void> {
23
24
  ? navigator.userAgent.slice(0, 100)
24
25
  : undefined;
25
26
  const registration = await serviceWorker.ready;
27
+ signal?.throwIfAborted();
26
28
  const subscription = await registration.pushManager.getSubscription();
29
+ signal?.throwIfAborted();
27
30
  if (!subscription) return;
31
+ if (subscription.options.applicationServerKey) {
32
+ const { publicKey } = await api.pushPublicKey();
33
+ signal?.throwIfAborted();
34
+ if (!subscriptionMatchesKey(subscription, publicKey)) return;
35
+ }
28
36
  await api.pushSubscribe(subscription.toJSON(), label);
29
37
  }
38
+
39
+ /** A service-worker subscription may belong to another server's VAPID key. */
40
+ export function subscriptionMatchesKey(subscription: PushSubscription, publicKey: string): boolean {
41
+ const key = subscription.options.applicationServerKey;
42
+ if (!key) return true;
43
+ let bin = "";
44
+ for (const b of new Uint8Array(key)) bin += String.fromCharCode(b);
45
+ return btoa(bin).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "") === publicKey;
46
+ }
@@ -4,7 +4,7 @@ import {
4
4
  type ShareIntakeResult,
5
5
  } from "@schlessera/brain-ui-sdk/protocol";
6
6
  import type { StoredShare } from "@schlessera/brain-ui-sdk/share-target";
7
- import { apiBase } from "./backend.js";
7
+ import type { BrainUiRoot } from "../root.js";
8
8
  import {
9
9
  fileToAttachment,
10
10
  validateAttachments,
@@ -75,7 +75,9 @@ export type ShareUploadOutcome =
75
75
  */
76
76
  export async function uploadShare(
77
77
  record: StoredShare,
78
- fetchImpl: typeof fetch = fetch
78
+ fetchImpl: BrainUiRoot["request"],
79
+ apiBase: string,
80
+ signal?: AbortSignal
79
81
  ): Promise<ShareUploadOutcome> {
80
82
  const form = new FormData();
81
83
  if (record.title) form.set("title", record.title);
@@ -85,9 +87,10 @@ export async function uploadShare(
85
87
 
86
88
  let response: Response;
87
89
  try {
88
- response = await fetchImpl(`${apiBase()}/share`, {
90
+ response = await fetchImpl(`${apiBase}/share`, {
89
91
  method: "POST",
90
92
  body: form,
93
+ signal,
91
94
  });
92
95
  } catch (err) {
93
96
  return { ok: false, error: err instanceof Error ? err.message : "network_error" };
package/src/lib/share.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { apiBase } from "./backend.js";
1
+ import type { BrainUiRoot } from "../root.js";
2
2
  import type { RenderRequest } from "@schlessera/brain-ui-sdk/protocol";
3
3
 
4
4
  export type ShareKind = "file" | "text" | "richtext";
@@ -108,11 +108,12 @@ export async function copyRichText(html: string, plain: string): Promise<boolean
108
108
  * /api/files/content?raw=1 endpoint for share-the-bytes flows.
109
109
  */
110
110
  export async function fetchAsFile(
111
+ root: BrainUiRoot,
111
112
  url: string,
112
113
  filename: string,
113
114
  mime?: string
114
115
  ): Promise<File> {
115
- const res = await fetch(url);
116
+ const res = await root.request(url);
116
117
  if (!res.ok) throw new Error(`fetch failed: ${res.status} ${res.statusText}`);
117
118
  const blob = await res.blob();
118
119
  return new File([blob], filename, { type: mime ?? blob.type ?? "application/octet-stream" });
@@ -122,10 +123,11 @@ export async function fetchAsFile(
122
123
  * POST to /api/render and return the resulting File. Throws on non-2xx.
123
124
  */
124
125
  export async function renderToFile(
126
+ root: BrainUiRoot,
125
127
  req: RenderRequest,
126
128
  filename: string
127
129
  ): Promise<File> {
128
- const res = await fetch(`${apiBase()}/render`, {
130
+ const res = await root.request(`${root.apiBase()}/render`, {
129
131
  method: "POST",
130
132
  headers: { "Content-Type": "application/json" },
131
133
  body: JSON.stringify(req),
@@ -151,7 +153,7 @@ export async function renderToFile(
151
153
  /**
152
154
  * One-call helper: render content to PNG/PDF and dispatch the share sheet.
153
155
  */
154
- export async function renderAndShare(opts: {
156
+ export async function renderAndShare(root: BrainUiRoot, opts: {
155
157
  content: string;
156
158
  contentType: RenderRequest["contentType"];
157
159
  format: RenderRequest["format"];
@@ -160,6 +162,7 @@ export async function renderAndShare(opts: {
160
162
  text?: string;
161
163
  }): Promise<boolean> {
162
164
  const file = await renderToFile(
165
+ root,
163
166
  { content: opts.content, contentType: opts.contentType, format: opts.format, title: opts.title },
164
167
  opts.filename
165
168
  );
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Single-letter shortcuts, focus-scoped (D36).
3
+ *
4
+ * The design's rule: `a` / `d` / `s` act only while the card they belong to
5
+ * holds focus; `j` / `k` only inside the focused list; anything global takes
6
+ * a modifier. So a letter is a shortcut exactly when it arrives bare — no
7
+ * modifier — and not from something the reader is typing into. Both checks
8
+ * live here so every list and card applies the same ones.
9
+ */
10
+ export function isEditableTarget(target: EventTarget | null): boolean {
11
+ if (!(target instanceof HTMLElement)) return false;
12
+ if (target.isContentEditable) return true;
13
+ const tag = target.tagName;
14
+ return tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT";
15
+ }
16
+
17
+ /**
18
+ * The letter a keydown means as a shortcut, lowercase, or `null` when it is
19
+ * not one: a modifier is held, the key is not a single character, or the
20
+ * reader is typing into a field.
21
+ */
22
+ export function singleKey(event: {
23
+ key: string;
24
+ metaKey: boolean;
25
+ ctrlKey: boolean;
26
+ altKey: boolean;
27
+ target: EventTarget | null;
28
+ }): string | null {
29
+ if (event.metaKey || event.ctrlKey || event.altKey) return null;
30
+ if (event.key.length !== 1) return null;
31
+ if (isEditableTarget(event.target)) return null;
32
+ return event.key.toLowerCase();
33
+ }
34
+
35
+ /**
36
+ * Where focus goes once a card is decided or dismissed: the next card in
37
+ * document order, else the previous one, else the fallback — the composer
38
+ * for an in-chat approval, the page heading for an inbox. Called BEFORE the
39
+ * card leaves the DOM, so the neighbours are still where they were.
40
+ */
41
+ export function focusAfterDecision(current: Element, cardSelector: string, fallbackSelector: string): void {
42
+ const cards = [...document.querySelectorAll<HTMLElement>(cardSelector)];
43
+ const here = cards.indexOf(current as HTMLElement);
44
+ const next = cards[here + 1] ?? cards[here - 1];
45
+ const target = next ?? document.querySelector<HTMLElement>(fallbackSelector);
46
+ target?.focus();
47
+ }