@schlessera/brain-ui-react 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (761) hide show
  1. package/README.md +82 -4
  2. package/dist/components/activity/activity-page.d.ts +17 -5
  3. package/dist/components/activity/activity-page.d.ts.map +1 -1
  4. package/dist/components/activity/activity-page.js +148 -50
  5. package/dist/components/activity/activity-page.js.map +1 -1
  6. package/dist/components/activity/activity-run-detail.d.ts +16 -1
  7. package/dist/components/activity/activity-run-detail.d.ts.map +1 -1
  8. package/dist/components/activity/activity-run-detail.js +47 -4
  9. package/dist/components/activity/activity-run-detail.js.map +1 -1
  10. package/dist/components/activity/activity-run-list.d.ts +7 -1
  11. package/dist/components/activity/activity-run-list.d.ts.map +1 -1
  12. package/dist/components/activity/activity-run-list.js +16 -8
  13. package/dist/components/activity/activity-run-list.js.map +1 -1
  14. package/dist/components/activity/activity-views.d.ts +63 -0
  15. package/dist/components/activity/activity-views.d.ts.map +1 -0
  16. package/dist/components/activity/activity-views.js +52 -0
  17. package/dist/components/activity/activity-views.js.map +1 -0
  18. package/dist/components/activity/approval-card.d.ts +29 -0
  19. package/dist/components/activity/approval-card.d.ts.map +1 -0
  20. package/dist/components/activity/approval-card.js +73 -0
  21. package/dist/components/activity/approval-card.js.map +1 -0
  22. package/dist/components/activity/digest-card.d.ts +3 -0
  23. package/dist/components/activity/digest-card.d.ts.map +1 -1
  24. package/dist/components/activity/digest-card.js +20 -16
  25. package/dist/components/activity/digest-card.js.map +1 -1
  26. package/dist/components/activity/digest-summary.d.ts +19 -0
  27. package/dist/components/activity/digest-summary.d.ts.map +1 -0
  28. package/dist/components/activity/digest-summary.js +20 -0
  29. package/dist/components/activity/digest-summary.js.map +1 -0
  30. package/dist/components/activity/push-switch.d.ts +25 -0
  31. package/dist/components/activity/push-switch.d.ts.map +1 -0
  32. package/dist/components/activity/push-switch.js +14 -0
  33. package/dist/components/activity/push-switch.js.map +1 -0
  34. package/dist/components/activity/push-toggle.d.ts +7 -0
  35. package/dist/components/activity/push-toggle.d.ts.map +1 -1
  36. package/dist/components/activity/push-toggle.js +72 -47
  37. package/dist/components/activity/push-toggle.js.map +1 -1
  38. package/dist/components/activity/span-bits.d.ts +11 -0
  39. package/dist/components/activity/span-bits.d.ts.map +1 -1
  40. package/dist/components/activity/span-bits.js +50 -7
  41. package/dist/components/activity/span-bits.js.map +1 -1
  42. package/dist/components/chat/ask-user-card.d.ts +76 -3
  43. package/dist/components/chat/ask-user-card.d.ts.map +1 -1
  44. package/dist/components/chat/ask-user-card.js +208 -149
  45. package/dist/components/chat/ask-user-card.js.map +1 -1
  46. package/dist/components/chat/ask-user-typed.d.ts +42 -0
  47. package/dist/components/chat/ask-user-typed.d.ts.map +1 -0
  48. package/dist/components/chat/ask-user-typed.js +60 -0
  49. package/dist/components/chat/ask-user-typed.js.map +1 -0
  50. package/dist/components/chat/brain-markdown-links.d.ts +2 -1
  51. package/dist/components/chat/brain-markdown-links.d.ts.map +1 -1
  52. package/dist/components/chat/brain-markdown-links.js +3 -4
  53. package/dist/components/chat/brain-markdown-links.js.map +1 -1
  54. package/dist/components/chat/brain-markdown.d.ts.map +1 -1
  55. package/dist/components/chat/brain-markdown.js +4 -2
  56. package/dist/components/chat/brain-markdown.js.map +1 -1
  57. package/dist/components/chat/chat-page.d.ts.map +1 -1
  58. package/dist/components/chat/chat-page.js +27 -11
  59. package/dist/components/chat/chat-page.js.map +1 -1
  60. package/dist/components/chat/composer-view.d.ts +75 -0
  61. package/dist/components/chat/composer-view.d.ts.map +1 -0
  62. package/dist/components/chat/composer-view.js +31 -0
  63. package/dist/components/chat/composer-view.js.map +1 -0
  64. package/dist/components/chat/composer.d.ts +4 -0
  65. package/dist/components/chat/composer.d.ts.map +1 -1
  66. package/dist/components/chat/composer.js +76 -59
  67. package/dist/components/chat/composer.js.map +1 -1
  68. package/dist/components/chat/markdown-content.d.ts +16 -1
  69. package/dist/components/chat/markdown-content.d.ts.map +1 -1
  70. package/dist/components/chat/markdown-content.js +47 -3
  71. package/dist/components/chat/markdown-content.js.map +1 -1
  72. package/dist/components/chat/mermaid-block.d.ts +4 -0
  73. package/dist/components/chat/mermaid-block.d.ts.map +1 -1
  74. package/dist/components/chat/mermaid-block.js +13 -5
  75. package/dist/components/chat/mermaid-block.js.map +1 -1
  76. package/dist/components/chat/mermaid-share.d.ts +2 -1
  77. package/dist/components/chat/mermaid-share.d.ts.map +1 -1
  78. package/dist/components/chat/mermaid-share.js +7 -8
  79. package/dist/components/chat/mermaid-share.js.map +1 -1
  80. package/dist/components/chat/mermaid-viewer.d.ts.map +1 -1
  81. package/dist/components/chat/mermaid-viewer.js +3 -1
  82. package/dist/components/chat/mermaid-viewer.js.map +1 -1
  83. package/dist/components/chat/message-bubble.d.ts +8 -1
  84. package/dist/components/chat/message-bubble.d.ts.map +1 -1
  85. package/dist/components/chat/message-bubble.js +53 -24
  86. package/dist/components/chat/message-bubble.js.map +1 -1
  87. package/dist/components/chat/message-share.d.ts +2 -1
  88. package/dist/components/chat/message-share.d.ts.map +1 -1
  89. package/dist/components/chat/message-share.js +6 -7
  90. package/dist/components/chat/message-share.js.map +1 -1
  91. package/dist/components/chat/renderers/bind.d.ts +39 -0
  92. package/dist/components/chat/renderers/bind.d.ts.map +1 -0
  93. package/dist/components/chat/renderers/bind.js +43 -0
  94. package/dist/components/chat/renderers/bind.js.map +1 -0
  95. package/dist/components/chat/renderers/brain-ui-tools.d.ts +3 -0
  96. package/dist/components/chat/renderers/brain-ui-tools.d.ts.map +1 -0
  97. package/dist/components/chat/renderers/brain-ui-tools.js +41 -0
  98. package/dist/components/chat/renderers/brain-ui-tools.js.map +1 -0
  99. package/dist/components/chat/renderers/claude-tools.d.ts.map +1 -1
  100. package/dist/components/chat/renderers/claude-tools.js +3 -2
  101. package/dist/components/chat/renderers/claude-tools.js.map +1 -1
  102. package/dist/components/chat/renderers/index.d.ts +10 -2
  103. package/dist/components/chat/renderers/index.d.ts.map +1 -1
  104. package/dist/components/chat/renderers/index.js +15 -10
  105. package/dist/components/chat/renderers/index.js.map +1 -1
  106. package/dist/components/chat/session-drawer.d.ts +4 -0
  107. package/dist/components/chat/session-drawer.d.ts.map +1 -1
  108. package/dist/components/chat/session-drawer.js +32 -32
  109. package/dist/components/chat/session-drawer.js.map +1 -1
  110. package/dist/components/chat/session-list.d.ts +41 -0
  111. package/dist/components/chat/session-list.d.ts.map +1 -0
  112. package/dist/components/chat/session-list.js +10 -0
  113. package/dist/components/chat/session-list.js.map +1 -0
  114. package/dist/components/chat/share-block.d.ts.map +1 -1
  115. package/dist/components/chat/share-block.js +12 -11
  116. package/dist/components/chat/share-block.js.map +1 -1
  117. package/dist/components/chat/share-card.js +2 -2
  118. package/dist/components/chat/share-card.js.map +1 -1
  119. package/dist/components/chat/subagent-view.js +1 -1
  120. package/dist/components/chat/subagent-view.js.map +1 -1
  121. package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
  122. package/dist/components/chat/tool-call-timeline.js +45 -14
  123. package/dist/components/chat/tool-call-timeline.js.map +1 -1
  124. package/dist/components/chat/tool-cards/block-card.d.ts +28 -0
  125. package/dist/components/chat/tool-cards/block-card.d.ts.map +1 -0
  126. package/dist/components/chat/tool-cards/block-card.js +103 -0
  127. package/dist/components/chat/tool-cards/block-card.js.map +1 -0
  128. package/dist/components/chat/tool-cards/image-mask-card.d.ts +70 -0
  129. package/dist/components/chat/tool-cards/image-mask-card.d.ts.map +1 -0
  130. package/dist/components/chat/tool-cards/image-mask-card.js +142 -0
  131. package/dist/components/chat/tool-cards/image-mask-card.js.map +1 -0
  132. package/dist/components/chat/tool-cards/location-card.d.ts +45 -0
  133. package/dist/components/chat/tool-cards/location-card.d.ts.map +1 -0
  134. package/dist/components/chat/tool-cards/location-card.js +128 -0
  135. package/dist/components/chat/tool-cards/location-card.js.map +1 -0
  136. package/dist/components/chat/tool-views.d.ts +19 -2
  137. package/dist/components/chat/tool-views.d.ts.map +1 -1
  138. package/dist/components/chat/tool-views.js +28 -22
  139. package/dist/components/chat/tool-views.js.map +1 -1
  140. package/dist/components/chat/transcript-turn.d.ts +45 -0
  141. package/dist/components/chat/transcript-turn.d.ts.map +1 -0
  142. package/dist/components/chat/transcript-turn.js +25 -0
  143. package/dist/components/chat/transcript-turn.js.map +1 -0
  144. package/dist/components/chat/use-chat-commands.d.ts.map +1 -1
  145. package/dist/components/chat/use-chat-commands.js +13 -16
  146. package/dist/components/chat/use-chat-commands.js.map +1 -1
  147. package/dist/components/chat/welcome-state.d.ts +7 -0
  148. package/dist/components/chat/welcome-state.d.ts.map +1 -1
  149. package/dist/components/chat/welcome-state.js +13 -5
  150. package/dist/components/chat/welcome-state.js.map +1 -1
  151. package/dist/components/connectivity/connection-gate.d.ts.map +1 -1
  152. package/dist/components/connectivity/connection-gate.js +27 -21
  153. package/dist/components/connectivity/connection-gate.js.map +1 -1
  154. package/dist/components/connectivity/login-form.d.ts +31 -0
  155. package/dist/components/connectivity/login-form.d.ts.map +1 -0
  156. package/dist/components/connectivity/login-form.js +19 -0
  157. package/dist/components/connectivity/login-form.js.map +1 -0
  158. package/dist/components/connectivity/login-screen.d.ts +5 -2
  159. package/dist/components/connectivity/login-screen.d.ts.map +1 -1
  160. package/dist/components/connectivity/login-screen.js +41 -31
  161. package/dist/components/connectivity/login-screen.js.map +1 -1
  162. package/dist/components/dev/share-harness.js +1 -1
  163. package/dist/components/dev/share-harness.js.map +1 -1
  164. package/dist/components/files/file-panel.d.ts +1 -1
  165. package/dist/components/files/file-panel.d.ts.map +1 -1
  166. package/dist/components/files/file-panel.js +74 -0
  167. package/dist/components/files/file-panel.js.map +1 -1
  168. package/dist/components/files/file-tree-view.d.ts +45 -0
  169. package/dist/components/files/file-tree-view.d.ts.map +1 -0
  170. package/dist/components/files/file-tree-view.js +51 -0
  171. package/dist/components/files/file-tree-view.js.map +1 -0
  172. package/dist/components/files/file-tree.d.ts +6 -0
  173. package/dist/components/files/file-tree.d.ts.map +1 -1
  174. package/dist/components/files/file-tree.js +39 -43
  175. package/dist/components/files/file-tree.js.map +1 -1
  176. package/dist/components/files/file-viewer-binary.d.ts.map +1 -1
  177. package/dist/components/files/file-viewer-binary.js +3 -2
  178. package/dist/components/files/file-viewer-binary.js.map +1 -1
  179. package/dist/components/files/file-viewer-frame.d.ts +36 -0
  180. package/dist/components/files/file-viewer-frame.d.ts.map +1 -0
  181. package/dist/components/files/file-viewer-frame.js +26 -0
  182. package/dist/components/files/file-viewer-frame.js.map +1 -0
  183. package/dist/components/files/file-viewer.d.ts +5 -0
  184. package/dist/components/files/file-viewer.d.ts.map +1 -1
  185. package/dist/components/files/file-viewer.js +26 -32
  186. package/dist/components/files/file-viewer.js.map +1 -1
  187. package/dist/components/files/frontmatter-chips.d.ts +18 -0
  188. package/dist/components/files/frontmatter-chips.d.ts.map +1 -0
  189. package/dist/components/files/frontmatter-chips.js +11 -0
  190. package/dist/components/files/frontmatter-chips.js.map +1 -0
  191. package/dist/components/files/frontmatter-panel.d.ts +5 -1
  192. package/dist/components/files/frontmatter-panel.d.ts.map +1 -1
  193. package/dist/components/files/frontmatter-panel.js +7 -6
  194. package/dist/components/files/frontmatter-panel.js.map +1 -1
  195. package/dist/components/files/staleness.d.ts +18 -0
  196. package/dist/components/files/staleness.d.ts.map +1 -0
  197. package/dist/components/files/staleness.js +27 -0
  198. package/dist/components/files/staleness.js.map +1 -0
  199. package/dist/components/graph/graph-canvas.d.ts.map +1 -1
  200. package/dist/components/graph/graph-canvas.js +24 -1
  201. package/dist/components/graph/graph-canvas.js.map +1 -1
  202. package/dist/components/graph/graph-controls-column.d.ts +14 -0
  203. package/dist/components/graph/graph-controls-column.d.ts.map +1 -0
  204. package/dist/components/graph/graph-controls-column.js +44 -0
  205. package/dist/components/graph/graph-controls-column.js.map +1 -0
  206. package/dist/components/graph/graph-controls.d.ts +20 -5
  207. package/dist/components/graph/graph-controls.d.ts.map +1 -1
  208. package/dist/components/graph/graph-controls.js +58 -37
  209. package/dist/components/graph/graph-controls.js.map +1 -1
  210. package/dist/components/graph/graph-form.d.ts +82 -0
  211. package/dist/components/graph/graph-form.d.ts.map +1 -0
  212. package/dist/components/graph/graph-form.js +69 -0
  213. package/dist/components/graph/graph-form.js.map +1 -0
  214. package/dist/components/graph/graph-maintenance.d.ts.map +1 -1
  215. package/dist/components/graph/graph-maintenance.js +6 -10
  216. package/dist/components/graph/graph-maintenance.js.map +1 -1
  217. package/dist/components/graph/graph-node-rail.d.ts +13 -0
  218. package/dist/components/graph/graph-node-rail.d.ts.map +1 -0
  219. package/dist/components/graph/graph-node-rail.js +92 -0
  220. package/dist/components/graph/graph-node-rail.js.map +1 -0
  221. package/dist/components/graph/graph-page.d.ts +7 -0
  222. package/dist/components/graph/graph-page.d.ts.map +1 -1
  223. package/dist/components/graph/graph-page.js +102 -12
  224. package/dist/components/graph/graph-page.js.map +1 -1
  225. package/dist/components/graph/graph-scene.d.ts.map +1 -1
  226. package/dist/components/graph/graph-scene.js +100 -24
  227. package/dist/components/graph/graph-scene.js.map +1 -1
  228. package/dist/components/graph/lib/graph-helpers.d.ts +42 -12
  229. package/dist/components/graph/lib/graph-helpers.d.ts.map +1 -1
  230. package/dist/components/graph/lib/graph-helpers.js +33 -41
  231. package/dist/components/graph/lib/graph-helpers.js.map +1 -1
  232. package/dist/components/graph/node-card.d.ts +28 -0
  233. package/dist/components/graph/node-card.d.ts.map +1 -0
  234. package/dist/components/graph/node-card.js +7 -0
  235. package/dist/components/graph/node-card.js.map +1 -0
  236. package/dist/components/graph/node-popover.d.ts +6 -2
  237. package/dist/components/graph/node-popover.d.ts.map +1 -1
  238. package/dist/components/graph/node-popover.js +13 -31
  239. package/dist/components/graph/node-popover.js.map +1 -1
  240. package/dist/components/graph/use-graph-theme.d.ts +32 -4
  241. package/dist/components/graph/use-graph-theme.d.ts.map +1 -1
  242. package/dist/components/graph/use-graph-theme.js +44 -32
  243. package/dist/components/graph/use-graph-theme.js.map +1 -1
  244. package/dist/components/graph/use-node-actions.d.ts +26 -0
  245. package/dist/components/graph/use-node-actions.d.ts.map +1 -0
  246. package/dist/components/graph/use-node-actions.js +54 -0
  247. package/dist/components/graph/use-node-actions.js.map +1 -0
  248. package/dist/components/images/image-share.d.ts +2 -1
  249. package/dist/components/images/image-share.d.ts.map +1 -1
  250. package/dist/components/images/image-share.js +3 -3
  251. package/dist/components/images/image-share.js.map +1 -1
  252. package/dist/components/images/image-viewer.d.ts.map +1 -1
  253. package/dist/components/images/image-viewer.js +3 -1
  254. package/dist/components/images/image-viewer.js.map +1 -1
  255. package/dist/components/images/mask-editor.d.ts.map +1 -1
  256. package/dist/components/images/mask-editor.js +7 -5
  257. package/dist/components/images/mask-editor.js.map +1 -1
  258. package/dist/components/layout/app-shell.d.ts.map +1 -1
  259. package/dist/components/layout/app-shell.js +4 -1
  260. package/dist/components/layout/app-shell.js.map +1 -1
  261. package/dist/components/layout/desktop-palette.d.ts +23 -0
  262. package/dist/components/layout/desktop-palette.d.ts.map +1 -0
  263. package/dist/components/layout/desktop-palette.js +132 -0
  264. package/dist/components/layout/desktop-palette.js.map +1 -0
  265. package/dist/components/layout/key-cap.d.ts +9 -0
  266. package/dist/components/layout/key-cap.d.ts.map +1 -0
  267. package/dist/components/layout/key-cap.js +10 -0
  268. package/dist/components/layout/key-cap.js.map +1 -0
  269. package/dist/components/layout/mobile-tab-bar.d.ts +13 -0
  270. package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -1
  271. package/dist/components/layout/mobile-tab-bar.js +58 -47
  272. package/dist/components/layout/mobile-tab-bar.js.map +1 -1
  273. package/dist/components/layout/shortcut-switch.d.ts +13 -0
  274. package/dist/components/layout/shortcut-switch.d.ts.map +1 -0
  275. package/dist/components/layout/shortcut-switch.js +22 -0
  276. package/dist/components/layout/shortcut-switch.js.map +1 -0
  277. package/dist/components/layout/side-rail.d.ts +28 -0
  278. package/dist/components/layout/side-rail.d.ts.map +1 -1
  279. package/dist/components/layout/side-rail.js +72 -27
  280. package/dist/components/layout/side-rail.js.map +1 -1
  281. package/dist/components/layout/slide-panel.d.ts +25 -2
  282. package/dist/components/layout/slide-panel.d.ts.map +1 -1
  283. package/dist/components/layout/slide-panel.js +13 -4
  284. package/dist/components/layout/slide-panel.js.map +1 -1
  285. package/dist/components/layout/theme.d.ts +22 -0
  286. package/dist/components/layout/theme.d.ts.map +1 -0
  287. package/dist/components/layout/theme.js +44 -0
  288. package/dist/components/layout/theme.js.map +1 -0
  289. package/dist/components/quick-actions/add-form.d.ts +44 -0
  290. package/dist/components/quick-actions/add-form.d.ts.map +1 -0
  291. package/dist/components/quick-actions/add-form.js +32 -0
  292. package/dist/components/quick-actions/add-form.js.map +1 -0
  293. package/dist/components/quick-actions/add-modal.d.ts +7 -0
  294. package/dist/components/quick-actions/add-modal.d.ts.map +1 -1
  295. package/dist/components/quick-actions/add-modal.js +23 -20
  296. package/dist/components/quick-actions/add-modal.js.map +1 -1
  297. package/dist/components/quick-actions/search-modal.d.ts.map +1 -1
  298. package/dist/components/quick-actions/search-modal.js +8 -5
  299. package/dist/components/quick-actions/search-modal.js.map +1 -1
  300. package/dist/components/quick-actions/streaming-modal.d.ts +6 -0
  301. package/dist/components/quick-actions/streaming-modal.d.ts.map +1 -1
  302. package/dist/components/quick-actions/streaming-modal.js +53 -18
  303. package/dist/components/quick-actions/streaming-modal.js.map +1 -1
  304. package/dist/components/quick-actions/streaming-output.d.ts +38 -0
  305. package/dist/components/quick-actions/streaming-output.d.ts.map +1 -0
  306. package/dist/components/quick-actions/streaming-output.js +22 -0
  307. package/dist/components/quick-actions/streaming-output.js.map +1 -0
  308. package/dist/components/quick-actions/whatsup-modal.d.ts +5 -0
  309. package/dist/components/quick-actions/whatsup-modal.d.ts.map +1 -1
  310. package/dist/components/quick-actions/whatsup-modal.js +51 -10
  311. package/dist/components/quick-actions/whatsup-modal.js.map +1 -1
  312. package/dist/components/settings/devices-agents-tab.d.ts +6 -1
  313. package/dist/components/settings/devices-agents-tab.d.ts.map +1 -1
  314. package/dist/components/settings/devices-agents-tab.js +55 -20
  315. package/dist/components/settings/devices-agents-tab.js.map +1 -1
  316. package/dist/components/settings/models-list.d.ts +39 -0
  317. package/dist/components/settings/models-list.d.ts.map +1 -0
  318. package/dist/components/settings/models-list.js +72 -0
  319. package/dist/components/settings/models-list.js.map +1 -0
  320. package/dist/components/settings/models-tab.d.ts +4 -0
  321. package/dist/components/settings/models-tab.d.ts.map +1 -1
  322. package/dist/components/settings/models-tab.js +52 -102
  323. package/dist/components/settings/models-tab.js.map +1 -1
  324. package/dist/components/settings/one-time-agent-credential.js +1 -1
  325. package/dist/components/settings/one-time-agent-credential.js.map +1 -1
  326. package/dist/components/settings/passkey-list.d.ts +35 -0
  327. package/dist/components/settings/passkey-list.d.ts.map +1 -0
  328. package/dist/components/settings/passkey-list.js +34 -0
  329. package/dist/components/settings/passkey-list.js.map +1 -0
  330. package/dist/components/settings/passkey-tab.d.ts +3 -0
  331. package/dist/components/settings/passkey-tab.d.ts.map +1 -1
  332. package/dist/components/settings/passkey-tab.js +53 -45
  333. package/dist/components/settings/passkey-tab.js.map +1 -1
  334. package/dist/components/settings/pi-accounts-list.d.ts +27 -0
  335. package/dist/components/settings/pi-accounts-list.d.ts.map +1 -0
  336. package/dist/components/settings/pi-accounts-list.js +15 -0
  337. package/dist/components/settings/pi-accounts-list.js.map +1 -0
  338. package/dist/components/settings/pi-accounts.d.ts +3 -0
  339. package/dist/components/settings/pi-accounts.d.ts.map +1 -1
  340. package/dist/components/settings/pi-accounts.js +73 -55
  341. package/dist/components/settings/pi-accounts.js.map +1 -1
  342. package/dist/components/settings/principal-list.d.ts +37 -0
  343. package/dist/components/settings/principal-list.d.ts.map +1 -0
  344. package/dist/components/settings/principal-list.js +18 -0
  345. package/dist/components/settings/principal-list.js.map +1 -0
  346. package/dist/components/settings/settings-panel.d.ts +10 -3
  347. package/dist/components/settings/settings-panel.d.ts.map +1 -1
  348. package/dist/components/settings/settings-panel.js +71 -10
  349. package/dist/components/settings/settings-panel.js.map +1 -1
  350. package/dist/components/settings/skills-list.d.ts +53 -0
  351. package/dist/components/settings/skills-list.d.ts.map +1 -0
  352. package/dist/components/settings/skills-list.js +28 -0
  353. package/dist/components/settings/skills-list.js.map +1 -0
  354. package/dist/components/settings/skills-tab.d.ts.map +1 -1
  355. package/dist/components/settings/skills-tab.js +65 -38
  356. package/dist/components/settings/skills-tab.js.map +1 -1
  357. package/dist/components/settings/tool-permissions-list.d.ts +18 -0
  358. package/dist/components/settings/tool-permissions-list.d.ts.map +1 -0
  359. package/dist/components/settings/tool-permissions-list.js +6 -0
  360. package/dist/components/settings/tool-permissions-list.js.map +1 -0
  361. package/dist/components/settings/tool-permissions.d.ts +2 -1
  362. package/dist/components/settings/tool-permissions.d.ts.map +1 -1
  363. package/dist/components/settings/tool-permissions.js +33 -16
  364. package/dist/components/settings/tool-permissions.js.map +1 -1
  365. package/dist/components/settings/web-search-chain.d.ts +41 -0
  366. package/dist/components/settings/web-search-chain.d.ts.map +1 -0
  367. package/dist/components/settings/web-search-chain.js +47 -0
  368. package/dist/components/settings/web-search-chain.js.map +1 -0
  369. package/dist/components/settings/web-search-settings.d.ts +4 -7
  370. package/dist/components/settings/web-search-settings.d.ts.map +1 -1
  371. package/dist/components/settings/web-search-settings.js +54 -76
  372. package/dist/components/settings/web-search-settings.js.map +1 -1
  373. package/dist/components/share/share-menu.d.ts.map +1 -1
  374. package/dist/components/share/share-menu.js +24 -4
  375. package/dist/components/share/share-menu.js.map +1 -1
  376. package/dist/components/voice/dictation-sheet.js +3 -3
  377. package/dist/components/voice/dictation-sheet.js.map +1 -1
  378. package/dist/components/voice/mic-button.js +1 -1
  379. package/dist/components/voice/mic-button.js.map +1 -1
  380. package/dist/components/voice/review-card.js +1 -1
  381. package/dist/components/voice/review-card.js.map +1 -1
  382. package/dist/config.d.ts +5 -2
  383. package/dist/config.d.ts.map +1 -1
  384. package/dist/config.js +15 -5
  385. package/dist/config.js.map +1 -1
  386. package/dist/connection.d.ts +12 -0
  387. package/dist/connection.d.ts.map +1 -0
  388. package/dist/connection.js +421 -0
  389. package/dist/connection.js.map +1 -0
  390. package/dist/default-root.d.ts +3 -0
  391. package/dist/default-root.d.ts.map +1 -0
  392. package/dist/default-root.js +16 -0
  393. package/dist/default-root.js.map +1 -0
  394. package/dist/hooks/use-color-scheme.d.ts +14 -0
  395. package/dist/hooks/use-color-scheme.d.ts.map +1 -0
  396. package/dist/hooks/use-color-scheme.js +37 -0
  397. package/dist/hooks/use-color-scheme.js.map +1 -0
  398. package/dist/hooks/use-fine-pointer.d.ts +12 -0
  399. package/dist/hooks/use-fine-pointer.d.ts.map +1 -0
  400. package/dist/hooks/use-fine-pointer.js +15 -0
  401. package/dist/hooks/use-fine-pointer.js.map +1 -0
  402. package/dist/hooks/use-hash-routes.d.ts.map +1 -1
  403. package/dist/hooks/use-hash-routes.js +4 -2
  404. package/dist/hooks/use-hash-routes.js.map +1 -1
  405. package/dist/hooks/use-media-query.d.ts +9 -0
  406. package/dist/hooks/use-media-query.d.ts.map +1 -0
  407. package/dist/hooks/use-media-query.js +38 -0
  408. package/dist/hooks/use-media-query.js.map +1 -0
  409. package/dist/hooks/use-share-intake.d.ts.map +1 -1
  410. package/dist/hooks/use-share-intake.js +37 -12
  411. package/dist/hooks/use-share-intake.js.map +1 -1
  412. package/dist/hooks/use-vpn-status.d.ts.map +1 -1
  413. package/dist/hooks/use-vpn-status.js +17 -18
  414. package/dist/hooks/use-vpn-status.js.map +1 -1
  415. package/dist/hooks/use-websocket.d.ts +5 -24
  416. package/dist/hooks/use-websocket.d.ts.map +1 -1
  417. package/dist/hooks/use-websocket.js +11 -384
  418. package/dist/hooks/use-websocket.js.map +1 -1
  419. package/dist/hooks/websocket-handlers/activity.d.ts +2 -2
  420. package/dist/hooks/websocket-handlers/activity.d.ts.map +1 -1
  421. package/dist/hooks/websocket-handlers/activity.js +4 -5
  422. package/dist/hooks/websocket-handlers/activity.js.map +1 -1
  423. package/dist/hooks/websocket-handlers/chat.d.ts +1 -0
  424. package/dist/hooks/websocket-handlers/chat.d.ts.map +1 -1
  425. package/dist/hooks/websocket-handlers/chat.js +28 -6
  426. package/dist/hooks/websocket-handlers/chat.js.map +1 -1
  427. package/dist/hooks/websocket-handlers/connection.d.ts.map +1 -1
  428. package/dist/hooks/websocket-handlers/connection.js +4 -6
  429. package/dist/hooks/websocket-handlers/connection.js.map +1 -1
  430. package/dist/hooks/websocket-handlers/mask.d.ts +1 -1
  431. package/dist/hooks/websocket-handlers/mask.d.ts.map +1 -1
  432. package/dist/hooks/websocket-handlers/mask.js +2 -3
  433. package/dist/hooks/websocket-handlers/mask.js.map +1 -1
  434. package/dist/hooks/websocket-handlers/provider.d.ts.map +1 -1
  435. package/dist/hooks/websocket-handlers/provider.js +4 -6
  436. package/dist/hooks/websocket-handlers/provider.js.map +1 -1
  437. package/dist/hooks/websocket-handlers/types.d.ts +6 -2
  438. package/dist/hooks/websocket-handlers/types.d.ts.map +1 -1
  439. package/dist/index.d.ts +5 -3
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js +6 -3
  442. package/dist/index.js.map +1 -1
  443. package/dist/lib/api-client.d.ts +289 -0
  444. package/dist/lib/api-client.d.ts.map +1 -1
  445. package/dist/lib/api-client.js +243 -224
  446. package/dist/lib/api-client.js.map +1 -1
  447. package/dist/lib/backend.d.ts +19 -2
  448. package/dist/lib/backend.d.ts.map +1 -1
  449. package/dist/lib/backend.js +15 -9
  450. package/dist/lib/backend.js.map +1 -1
  451. package/dist/lib/diff.d.ts +8 -10
  452. package/dist/lib/diff.d.ts.map +1 -1
  453. package/dist/lib/diff.js +26 -53
  454. package/dist/lib/diff.js.map +1 -1
  455. package/dist/lib/light-dark.d.ts +37 -0
  456. package/dist/lib/light-dark.d.ts.map +1 -0
  457. package/dist/lib/light-dark.js +83 -0
  458. package/dist/lib/light-dark.js.map +1 -0
  459. package/dist/lib/mermaid-theme.d.ts +7 -2
  460. package/dist/lib/mermaid-theme.d.ts.map +1 -1
  461. package/dist/lib/mermaid-theme.js +125 -203
  462. package/dist/lib/mermaid-theme.js.map +1 -1
  463. package/dist/lib/passkeys.d.ts +6 -3
  464. package/dist/lib/passkeys.d.ts.map +1 -1
  465. package/dist/lib/passkeys.js +10 -4
  466. package/dist/lib/passkeys.js.map +1 -1
  467. package/dist/lib/push-registration.d.ts +4 -1
  468. package/dist/lib/push-registration.d.ts.map +1 -1
  469. package/dist/lib/push-registration.js +20 -2
  470. package/dist/lib/push-registration.js.map +1 -1
  471. package/dist/lib/share-intake.d.ts +2 -1
  472. package/dist/lib/share-intake.d.ts.map +1 -1
  473. package/dist/lib/share-intake.js +3 -3
  474. package/dist/lib/share-intake.js.map +1 -1
  475. package/dist/lib/share.d.ts +4 -3
  476. package/dist/lib/share.d.ts.map +1 -1
  477. package/dist/lib/share.js +6 -7
  478. package/dist/lib/share.js.map +1 -1
  479. package/dist/lib/single-key.d.ts +30 -0
  480. package/dist/lib/single-key.d.ts.map +1 -0
  481. package/dist/lib/single-key.js +45 -0
  482. package/dist/lib/single-key.js.map +1 -0
  483. package/dist/lib/tool-names.d.ts +8 -6
  484. package/dist/lib/tool-names.d.ts.map +1 -1
  485. package/dist/lib/tool-names.js +17 -7
  486. package/dist/lib/tool-names.js.map +1 -1
  487. package/dist/root-context.d.ts +229 -0
  488. package/dist/root-context.d.ts.map +1 -0
  489. package/dist/root-context.js +33 -0
  490. package/dist/root-context.js.map +1 -0
  491. package/dist/root.d.ts +38 -0
  492. package/dist/root.d.ts.map +1 -0
  493. package/dist/root.js +47 -0
  494. package/dist/root.js.map +1 -0
  495. package/dist/stores/activity-state.d.ts +29 -0
  496. package/dist/stores/activity-state.d.ts.map +1 -0
  497. package/dist/stores/activity-state.js +282 -0
  498. package/dist/stores/activity-state.js.map +1 -0
  499. package/dist/stores/activity-store.d.ts +10 -41
  500. package/dist/stores/activity-store.d.ts.map +1 -1
  501. package/dist/stores/activity-store.js +9 -271
  502. package/dist/stores/activity-store.js.map +1 -1
  503. package/dist/stores/chat-state.d.ts +233 -0
  504. package/dist/stores/chat-state.d.ts.map +1 -0
  505. package/dist/stores/chat-state.js +477 -0
  506. package/dist/stores/chat-state.js.map +1 -0
  507. package/dist/stores/chat-store.d.ts +4 -162
  508. package/dist/stores/chat-store.d.ts.map +1 -1
  509. package/dist/stores/chat-store.js +7 -418
  510. package/dist/stores/chat-store.js.map +1 -1
  511. package/dist/stores/connection-state.d.ts +40 -0
  512. package/dist/stores/connection-state.d.ts.map +1 -0
  513. package/dist/stores/connection-state.js +30 -0
  514. package/dist/stores/connection-state.js.map +1 -0
  515. package/dist/stores/connection-store.d.ts +4 -40
  516. package/dist/stores/connection-store.d.ts.map +1 -1
  517. package/dist/stores/connection-store.js +7 -27
  518. package/dist/stores/connection-store.js.map +1 -1
  519. package/dist/stores/create-stores.d.ts +23 -0
  520. package/dist/stores/create-stores.d.ts.map +1 -0
  521. package/dist/stores/create-stores.js +28 -0
  522. package/dist/stores/create-stores.js.map +1 -0
  523. package/dist/stores/file-state.d.ts +53 -0
  524. package/dist/stores/file-state.d.ts.map +1 -0
  525. package/dist/stores/file-state.js +341 -0
  526. package/dist/stores/file-state.js.map +1 -0
  527. package/dist/stores/file-store.d.ts +4 -52
  528. package/dist/stores/file-store.d.ts.map +1 -1
  529. package/dist/stores/file-store.js +7 -336
  530. package/dist/stores/file-store.js.map +1 -1
  531. package/dist/stores/graph-state.d.ts +95 -0
  532. package/dist/stores/graph-state.d.ts.map +1 -0
  533. package/dist/stores/graph-state.js +252 -0
  534. package/dist/stores/graph-state.js.map +1 -0
  535. package/dist/stores/graph-store.d.ts +7 -83
  536. package/dist/stores/graph-store.d.ts.map +1 -1
  537. package/dist/stores/graph-store.js +8 -249
  538. package/dist/stores/graph-store.js.map +1 -1
  539. package/dist/stores/mask-state.d.ts +21 -0
  540. package/dist/stores/mask-state.d.ts.map +1 -0
  541. package/dist/stores/mask-state.js +9 -0
  542. package/dist/stores/mask-state.js.map +1 -0
  543. package/dist/stores/mask-store.d.ts +4 -21
  544. package/dist/stores/mask-store.d.ts.map +1 -1
  545. package/dist/stores/mask-store.js +7 -6
  546. package/dist/stores/mask-store.js.map +1 -1
  547. package/dist/stores/principal-state.d.ts +16 -0
  548. package/dist/stores/principal-state.d.ts.map +1 -0
  549. package/dist/stores/principal-state.js +31 -0
  550. package/dist/stores/principal-state.js.map +1 -0
  551. package/dist/stores/principal-store.d.ts +4 -15
  552. package/dist/stores/principal-store.d.ts.map +1 -1
  553. package/dist/stores/principal-store.js +7 -28
  554. package/dist/stores/principal-store.js.map +1 -1
  555. package/dist/stores/provider-state.d.ts +24 -0
  556. package/dist/stores/provider-state.d.ts.map +1 -0
  557. package/dist/stores/provider-state.js +68 -0
  558. package/dist/stores/provider-state.js.map +1 -0
  559. package/dist/stores/provider-store.d.ts +4 -23
  560. package/dist/stores/provider-store.d.ts.map +1 -1
  561. package/dist/stores/provider-store.js +7 -64
  562. package/dist/stores/provider-store.js.map +1 -1
  563. package/dist/stores/share-state.d.ts +29 -0
  564. package/dist/stores/share-state.d.ts.map +1 -0
  565. package/dist/stores/share-state.js +21 -0
  566. package/dist/stores/share-state.js.map +1 -0
  567. package/dist/stores/share-store.d.ts +4 -28
  568. package/dist/stores/share-store.d.ts.map +1 -1
  569. package/dist/stores/share-store.js +7 -18
  570. package/dist/stores/share-store.js.map +1 -1
  571. package/dist/stores/store-environment.d.ts +10 -0
  572. package/dist/stores/store-environment.d.ts.map +1 -0
  573. package/dist/stores/store-environment.js +2 -0
  574. package/dist/stores/store-environment.js.map +1 -0
  575. package/dist/stores/ui-state.d.ts +71 -0
  576. package/dist/stores/ui-state.d.ts.map +1 -0
  577. package/dist/stores/ui-state.js +58 -0
  578. package/dist/stores/ui-state.js.map +1 -0
  579. package/dist/stores/ui-store.d.ts +4 -45
  580. package/dist/stores/ui-store.d.ts.map +1 -1
  581. package/dist/stores/ui-store.js +7 -36
  582. package/dist/stores/ui-store.js.map +1 -1
  583. package/dist/styles.css +1 -1
  584. package/dist/theme.css +150 -97
  585. package/dist/voice/asr-clients.d.ts +2 -1
  586. package/dist/voice/asr-clients.d.ts.map +1 -1
  587. package/dist/voice/asr-clients.js +16 -17
  588. package/dist/voice/asr-clients.js.map +1 -1
  589. package/dist/voice/use-dictation.d.ts.map +1 -1
  590. package/dist/voice/use-dictation.js +12 -8
  591. package/dist/voice/use-dictation.js.map +1 -1
  592. package/dist/voice/voice-state.d.ts +25 -0
  593. package/dist/voice/voice-state.d.ts.map +1 -0
  594. package/dist/voice/voice-state.js +29 -0
  595. package/dist/voice/voice-state.js.map +1 -0
  596. package/dist/voice/voice-store.d.ts +4 -25
  597. package/dist/voice/voice-store.d.ts.map +1 -1
  598. package/dist/voice/voice-store.js +7 -26
  599. package/dist/voice/voice-store.js.map +1 -1
  600. package/package.json +3 -2
  601. package/src/components/activity/activity-page.tsx +341 -160
  602. package/src/components/activity/activity-run-detail.tsx +81 -47
  603. package/src/components/activity/activity-run-list.tsx +27 -59
  604. package/src/components/activity/activity-views.tsx +155 -0
  605. package/src/components/activity/approval-card.tsx +117 -0
  606. package/src/components/activity/digest-card.tsx +25 -61
  607. package/src/components/activity/digest-summary.tsx +52 -0
  608. package/src/components/activity/push-switch.tsx +62 -0
  609. package/src/components/activity/push-toggle.tsx +51 -81
  610. package/src/components/activity/span-bits.tsx +60 -7
  611. package/src/components/chat/ask-user-card.tsx +292 -356
  612. package/src/components/chat/ask-user-typed.ts +77 -0
  613. package/src/components/chat/brain-markdown-links.tsx +4 -4
  614. package/src/components/chat/brain-markdown.tsx +4 -2
  615. package/src/components/chat/chat-page.tsx +41 -11
  616. package/src/components/chat/composer-view.tsx +194 -0
  617. package/src/components/chat/composer.tsx +117 -296
  618. package/src/components/chat/markdown-content.tsx +53 -2
  619. package/src/components/chat/mermaid-block.tsx +13 -5
  620. package/src/components/chat/mermaid-share.ts +8 -7
  621. package/src/components/chat/mermaid-viewer.tsx +3 -1
  622. package/src/components/chat/message-bubble.tsx +78 -94
  623. package/src/components/chat/message-share.ts +7 -7
  624. package/src/components/chat/renderers/bind.tsx +94 -0
  625. package/src/components/chat/renderers/brain-ui-tools.tsx +56 -0
  626. package/src/components/chat/renderers/claude-tools.tsx +3 -2
  627. package/src/components/chat/renderers/index.ts +15 -10
  628. package/src/components/chat/session-drawer.tsx +41 -138
  629. package/src/components/chat/session-list.tsx +113 -0
  630. package/src/components/chat/share-block.tsx +16 -12
  631. package/src/components/chat/share-card.tsx +2 -2
  632. package/src/components/chat/subagent-view.tsx +4 -4
  633. package/src/components/chat/tool-call-timeline.tsx +75 -26
  634. package/src/components/chat/tool-cards/block-card.tsx +145 -0
  635. package/src/components/chat/tool-cards/image-mask-card.tsx +214 -0
  636. package/src/components/chat/tool-cards/location-card.tsx +159 -0
  637. package/src/components/chat/tool-views.tsx +30 -60
  638. package/src/components/chat/transcript-turn.tsx +108 -0
  639. package/src/components/chat/use-chat-commands.ts +14 -16
  640. package/src/components/chat/welcome-state.tsx +36 -91
  641. package/src/components/connectivity/connection-gate.tsx +32 -24
  642. package/src/components/connectivity/login-form.tsx +122 -0
  643. package/src/components/connectivity/login-screen.tsx +45 -100
  644. package/src/components/dev/share-harness.tsx +2 -2
  645. package/src/components/files/file-panel.tsx +168 -0
  646. package/src/components/files/file-tree-view.tsx +127 -0
  647. package/src/components/files/file-tree.tsx +55 -109
  648. package/src/components/files/file-viewer-binary.tsx +3 -2
  649. package/src/components/files/file-viewer-frame.tsx +113 -0
  650. package/src/components/files/file-viewer.tsx +40 -95
  651. package/src/components/files/frontmatter-chips.tsx +42 -0
  652. package/src/components/files/frontmatter-panel.tsx +6 -71
  653. package/src/components/files/staleness.ts +29 -0
  654. package/src/components/graph/graph-canvas.tsx +24 -1
  655. package/src/components/graph/graph-controls-column.tsx +92 -0
  656. package/src/components/graph/graph-controls.tsx +83 -127
  657. package/src/components/graph/graph-form.tsx +183 -0
  658. package/src/components/graph/graph-maintenance.tsx +9 -14
  659. package/src/components/graph/graph-node-rail.tsx +147 -0
  660. package/src/components/graph/graph-page.tsx +189 -49
  661. package/src/components/graph/graph-scene.tsx +200 -30
  662. package/src/components/graph/lib/graph-helpers.ts +65 -43
  663. package/src/components/graph/node-card.tsx +64 -0
  664. package/src/components/graph/node-popover.tsx +28 -117
  665. package/src/components/graph/use-graph-theme.ts +69 -32
  666. package/src/components/graph/use-node-actions.ts +56 -0
  667. package/src/components/images/image-share.ts +4 -2
  668. package/src/components/images/image-viewer.tsx +3 -1
  669. package/src/components/images/mask-editor.tsx +7 -4
  670. package/src/components/layout/app-shell.tsx +5 -1
  671. package/src/components/layout/desktop-palette.tsx +151 -0
  672. package/src/components/layout/key-cap.tsx +15 -0
  673. package/src/components/layout/mobile-tab-bar.tsx +80 -157
  674. package/src/components/layout/shortcut-switch.tsx +32 -0
  675. package/src/components/layout/side-rail.tsx +77 -150
  676. package/src/components/layout/slide-panel.tsx +49 -6
  677. package/src/components/layout/theme.tsx +67 -0
  678. package/src/components/quick-actions/add-form.tsx +196 -0
  679. package/src/components/quick-actions/add-modal.tsx +32 -153
  680. package/src/components/quick-actions/search-modal.tsx +15 -5
  681. package/src/components/quick-actions/streaming-modal.tsx +57 -72
  682. package/src/components/quick-actions/streaming-output.tsx +112 -0
  683. package/src/components/quick-actions/whatsup-modal.tsx +53 -59
  684. package/src/components/settings/devices-agents-tab.tsx +60 -152
  685. package/src/components/settings/models-list.tsx +299 -0
  686. package/src/components/settings/models-tab.tsx +63 -337
  687. package/src/components/settings/one-time-agent-credential.tsx +1 -1
  688. package/src/components/settings/passkey-list.tsx +201 -0
  689. package/src/components/settings/passkey-tab.tsx +53 -197
  690. package/src/components/settings/pi-accounts-list.tsx +128 -0
  691. package/src/components/settings/pi-accounts.tsx +71 -170
  692. package/src/components/settings/principal-list.tsx +172 -0
  693. package/src/components/settings/settings-panel.tsx +239 -25
  694. package/src/components/settings/skills-list.tsx +276 -0
  695. package/src/components/settings/skills-tab.tsx +82 -269
  696. package/src/components/settings/tool-permissions-list.tsx +54 -0
  697. package/src/components/settings/tool-permissions.tsx +27 -46
  698. package/src/components/settings/web-search-chain.tsx +300 -0
  699. package/src/components/settings/web-search-settings.tsx +58 -328
  700. package/src/components/share/share-menu.tsx +19 -4
  701. package/src/components/voice/dictation-sheet.tsx +5 -5
  702. package/src/components/voice/mic-button.tsx +1 -1
  703. package/src/components/voice/review-card.tsx +1 -1
  704. package/src/config.ts +21 -7
  705. package/src/connection.ts +443 -0
  706. package/src/default-root.ts +16 -0
  707. package/src/hooks/use-color-scheme.ts +36 -0
  708. package/src/hooks/use-fine-pointer.ts +15 -0
  709. package/src/hooks/use-hash-routes.ts +4 -2
  710. package/src/hooks/use-media-query.ts +35 -0
  711. package/src/hooks/use-share-intake.ts +32 -12
  712. package/src/hooks/use-vpn-status.ts +18 -17
  713. package/src/hooks/use-websocket.ts +12 -428
  714. package/src/hooks/websocket-handlers/activity.ts +4 -5
  715. package/src/hooks/websocket-handlers/chat.ts +28 -6
  716. package/src/hooks/websocket-handlers/connection.ts +4 -6
  717. package/src/hooks/websocket-handlers/mask.ts +2 -3
  718. package/src/hooks/websocket-handlers/provider.ts +4 -6
  719. package/src/hooks/websocket-handlers/types.ts +6 -2
  720. package/src/index.ts +7 -3
  721. package/src/lib/api-client.ts +426 -384
  722. package/src/lib/backend.ts +20 -10
  723. package/src/lib/diff.ts +28 -62
  724. package/src/lib/light-dark.ts +83 -0
  725. package/src/lib/mermaid-theme.ts +183 -214
  726. package/src/lib/passkeys.ts +12 -4
  727. package/src/lib/push-registration.ts +19 -2
  728. package/src/lib/share-intake.ts +6 -3
  729. package/src/lib/share.ts +7 -4
  730. package/src/lib/single-key.ts +47 -0
  731. package/src/lib/tool-names.ts +31 -8
  732. package/src/root-context.tsx +40 -0
  733. package/src/root.ts +83 -0
  734. package/src/stores/activity-state.ts +295 -0
  735. package/src/stores/activity-store.ts +11 -285
  736. package/src/stores/chat-state.ts +822 -0
  737. package/src/stores/chat-store.ts +11 -705
  738. package/src/stores/connection-state.ts +78 -0
  739. package/src/stores/connection-store.ts +11 -76
  740. package/src/stores/create-stores.ts +31 -0
  741. package/src/stores/file-state.ts +399 -0
  742. package/src/stores/file-store.ts +9 -390
  743. package/src/stores/graph-state.ts +368 -0
  744. package/src/stores/graph-store.ts +10 -355
  745. package/src/stores/mask-state.ts +30 -0
  746. package/src/stores/mask-store.ts +10 -27
  747. package/src/stores/principal-state.ts +42 -0
  748. package/src/stores/principal-store.ts +10 -37
  749. package/src/stores/provider-state.ts +103 -0
  750. package/src/stores/provider-store.ts +10 -95
  751. package/src/stores/share-state.ts +56 -0
  752. package/src/stores/share-store.ts +11 -54
  753. package/src/stores/store-environment.ts +10 -0
  754. package/src/stores/ui-state.ts +143 -0
  755. package/src/stores/ui-store.ts +11 -93
  756. package/src/styles.css +4 -1
  757. package/src/theme.css +150 -97
  758. package/src/voice/asr-clients.ts +17 -17
  759. package/src/voice/use-dictation.ts +11 -8
  760. package/src/voice/voice-state.ts +57 -0
  761. package/src/voice/voice-store.ts +11 -55
@@ -1,17 +1,24 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useEffect, useState } from "react";
3
- import { Bot, Laptop, Loader2, Plus, Trash2 } from "lucide-react";
4
- import { api } from "../../lib/api-client.js";
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { useBrainApi } from "../../root-context.js";
5
4
  import { formatRelativeTime } from "../../lib/format-time.js";
6
- import { cn } from "../../lib/utils.js";
7
5
  import { usePrincipalStore } from "../../stores/principal-store.js";
6
+ import { PrincipalList } from "./principal-list.js";
8
7
  const MAX_LABEL_LENGTH = 64;
9
8
  const NOT_ENABLED = "Principal management is not enabled";
10
9
  function displayLabel(label) {
11
10
  return Array.from(label).slice(0, MAX_LABEL_LENGTH).join("");
12
11
  }
13
- /** Active devices and delegated agents, with owner-only mint and revoke controls. */
12
+ /**
13
+ * Active devices and delegated agents, with owner-only mint and revoke
14
+ * controls. This is the container (S7): the principals request, the mint
15
+ * through the principal store and the revoke with its confirm live here;
16
+ * `PrincipalList` draws the list and the form on the kit.
17
+ */
14
18
  export function DevicesAgentsTab({ active }) {
19
+ const api = useBrainApi();
20
+ const lifetime = useRef(0);
21
+ const request = useRef(0);
15
22
  const [principals, setPrincipals] = useState([]);
16
23
  const [loading, setLoading] = useState(false);
17
24
  const [enabled, setEnabled] = useState(true);
@@ -23,16 +30,23 @@ export function DevicesAgentsTab({ active }) {
23
30
  const mintError = usePrincipalStore((state) => state.mintError);
24
31
  const oneTimeCredential = usePrincipalStore((state) => state.oneTimeCredential);
25
32
  const mintAgent = usePrincipalStore((state) => state.mintAgent);
26
- async function refresh() {
33
+ const refresh = useCallback(async () => {
34
+ const generation = lifetime.current;
35
+ const token = ++request.current;
36
+ const current = () => generation === lifetime.current && token === request.current;
27
37
  setLoading(true);
28
38
  setLoadFailed(false);
29
39
  setError(null);
30
40
  try {
31
41
  const data = await api.principals();
42
+ if (!current())
43
+ return;
32
44
  setPrincipals(data.principals);
33
45
  setEnabled(true);
34
46
  }
35
47
  catch (err) {
48
+ if (!current())
49
+ return;
36
50
  setPrincipals([]);
37
51
  if (err instanceof Error && err.message === NOT_ENABLED) {
38
52
  setEnabled(false);
@@ -44,22 +58,32 @@ export function DevicesAgentsTab({ active }) {
44
58
  }
45
59
  }
46
60
  finally {
47
- setLoading(false);
61
+ if (current())
62
+ setLoading(false);
48
63
  }
49
- }
64
+ }, [api]);
50
65
  useEffect(() => {
66
+ lifetime.current++;
67
+ setPrincipals([]);
68
+ setLoading(false);
69
+ setEnabled(true);
70
+ setLoadFailed(false);
71
+ setError(null);
72
+ setLabel("");
73
+ setTtlDays(7);
51
74
  if (active)
52
75
  void refresh();
53
- }, [active]);
76
+ const invalidate = () => { lifetime.current++; };
77
+ return invalidate;
78
+ }, [active, refresh]);
54
79
  useEffect(() => {
55
80
  if (!oneTimeCredential)
56
81
  return;
57
82
  setLabel("");
58
83
  if (active)
59
84
  void refresh();
60
- }, [active, oneTimeCredential]);
61
- function onMint(event) {
62
- event.preventDefault();
85
+ }, [active, oneTimeCredential, refresh]);
86
+ function onMint() {
63
87
  const trimmed = label.trim();
64
88
  if (!trimmed || busy)
65
89
  return;
@@ -74,23 +98,34 @@ export function DevicesAgentsTab({ active }) {
74
98
  : "That device will be signed out immediately.";
75
99
  if (!window.confirm(`${consequence} You can't undo this.`))
76
100
  return;
101
+ const generation = lifetime.current;
77
102
  setError(null);
78
103
  try {
79
104
  await api.principalRevoke(principal.id);
105
+ if (generation !== lifetime.current)
106
+ return;
80
107
  setPrincipals((rows) => rows.filter((row) => row.id !== principal.id));
81
108
  if (principal.is_own)
82
109
  window.location.reload();
83
110
  }
84
111
  catch (err) {
112
+ if (generation !== lifetime.current)
113
+ return;
85
114
  setError(err instanceof Error ? err.message : "Could not revoke access");
86
115
  }
87
116
  }
88
- return (_jsxs("div", { className: "h-full overflow-y-auto p-4", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Devices & agents" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "See where this brain is signed in and create time-limited access for an agent." }), loading ? (_jsx("div", { className: "mt-6 flex justify-center", children: _jsx(Loader2, { className: "h-5 w-5 animate-spin text-muted-foreground" }) })) : !enabled ? (_jsx("p", { className: "mt-4 text-xs text-muted-foreground", children: "Devices and agents can only be managed when password authentication is enabled." })) : loadFailed ? (_jsx("p", { role: "alert", className: "mt-4 text-xs text-destructive", children: error })) : (_jsxs(_Fragment, { children: [_jsxs("ul", { className: "mt-4 flex flex-col gap-2", children: [principals.map((principal) => (_jsx(PrincipalRow, { principal: principal, onRevoke: () => void onRevoke(principal) }, principal.id))), principals.length === 0 ? (_jsx("li", { className: "rounded-lg border border-dashed border-border-subtle p-4 text-center text-xs text-muted-foreground", children: "No active devices or agents." })) : null] }), error || mintError ? (_jsx("p", { role: "alert", className: "mt-3 text-xs text-destructive", children: error ?? mintError })) : null, _jsxs("form", { onSubmit: onMint, className: "mt-6 border-t border-border pt-4", children: [_jsx("h4", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Agent access" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Create a credential an agent can use until it expires or you revoke it." }), _jsx("label", { className: "mt-3 block text-xs font-medium text-foreground", htmlFor: "agent-label", children: "Label" }), _jsx("input", { id: "agent-label", value: label, maxLength: MAX_LABEL_LENGTH, onChange: (event) => setLabel(event.target.value), placeholder: "Build agent", className: "mt-1 w-full rounded-lg border border-border-subtle bg-background px-3 py-2 text-sm text-foreground outline-none focus:border-primary" }), _jsx("label", { className: "mt-3 block text-xs font-medium text-foreground", htmlFor: "agent-ttl", children: "Expires after" }), _jsxs("select", { id: "agent-ttl", value: ttlDays, onChange: (event) => setTtlDays(Number(event.target.value)), className: "mt-1 w-full rounded-lg border border-border-subtle bg-background px-3 py-2 text-sm text-foreground outline-none focus:border-primary", children: [_jsx("option", { value: 1, children: "1 day" }), _jsx("option", { value: 7, children: "7 days" }), _jsx("option", { value: 30, children: "30 days" })] }), _jsxs("button", { type: "submit", disabled: busy || !label.trim(), className: "mt-4 flex w-full items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:brightness-110 disabled:opacity-50", children: [busy ? _jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : _jsx(Plus, { className: "h-4 w-4" }), "Create agent credential"] })] })] }))] }));
89
- }
90
- function PrincipalRow({ principal, onRevoke, }) {
91
- const agent = principal.kind === "agent";
92
- const Icon = agent ? Bot : Laptop;
93
- const kind = principal.is_own ? "This device" : agent ? "Agent" : "Device";
94
- return (_jsx("li", { className: cn("rounded-lg border bg-surface p-3", principal.is_own ? "border-primary/60" : "border-border-subtle"), children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Icon, { className: "mt-0.5 h-4 w-4 shrink-0 text-primary" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [_jsx("span", { className: "break-words text-sm text-foreground", children: displayLabel(principal.label) }), _jsx("span", { className: "rounded bg-surface-raised px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground", children: kind })] }), _jsxs("dl", { className: "mt-1.5 grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5 text-[11px] text-muted-foreground", children: [_jsx("dt", { children: "Created" }), _jsx("dd", { children: formatRelativeTime(principal.created_at) }), _jsx("dt", { children: "Last seen" }), _jsx("dd", { children: principal.last_seen_at ? formatRelativeTime(principal.last_seen_at) : "Never" }), _jsx("dt", { children: "Expires" }), _jsx("dd", { children: formatRelativeTime(principal.expires_at) })] })] }), _jsxs("button", { type: "button", onClick: onRevoke, "aria-label": `Revoke ${displayLabel(principal.label)}`, className: "flex shrink-0 items-center gap-1 rounded px-1.5 py-1 text-xs text-muted-foreground transition-colors hover:text-destructive", children: [_jsx(Trash2, { className: "h-3.5 w-3.5" }), "Revoke"] })] }) }));
117
+ return (_jsx(PrincipalList, { state: loading ? "loading" : !enabled ? "unavailable" : loadFailed ? "error" : "ready", principals: principals.map((principal) => ({
118
+ id: principal.id,
119
+ label: displayLabel(principal.label),
120
+ kind: principal.kind,
121
+ isOwn: principal.is_own,
122
+ created: formatRelativeTime(principal.created_at),
123
+ lastSeen: principal.last_seen_at ? formatRelativeTime(principal.last_seen_at) : "Never",
124
+ expires: formatRelativeTime(principal.expires_at),
125
+ })), error: error ?? mintError, label: label, ttlDays: ttlDays, minting: busy, onLabel: setLabel, onTtlDays: setTtlDays, onMint: onMint, onRevoke: (id) => {
126
+ const principal = principals.find((row) => row.id === id);
127
+ if (principal)
128
+ void onRevoke(principal);
129
+ } }));
95
130
  }
96
131
  //# sourceMappingURL=devices-agents-tab.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"devices-agents-tab.js","sourceRoot":"","sources":["../../../src/components/settings/devices-agents-tab.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devices-agents-tab.js","sourceRoot":"","sources":["../../../src/components/settings/devices-agents-tab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type BillingMode, type ModelCatalogEntry, type ModelCatalogResponse, type ThinkingLevel } from "@schlessera/brain-ui-sdk/protocol";
2
+ import { type ReactNode } from "react";
3
+ /**
4
+ * The Models tab's surface, rendered from props (S7, the `settings`
5
+ * directory). `ModelsTab` is the container: the catalog request, the
6
+ * optimistic commits, their ordering gate and their write queue live there;
7
+ * this draws the roster.
8
+ *
9
+ * The per-row choices stay native `<select>`s with the accessible names the
10
+ * tests read — the kit has no select — and the hide toggle stays a native,
11
+ * titled icon button. A hidden model is no longer faded (design-feedback
12
+ * §4, "no opacity de-emphasis"): it reads as hidden from its chip, at full
13
+ * contrast. Refresh, Add and the section errors are the kit's.
14
+ */
15
+ export interface ModelsCatalogViewProps {
16
+ catalog: ModelCatalogResponse | null;
17
+ loading: boolean;
18
+ refreshing: boolean;
19
+ error: string | null;
20
+ /** The sections the tab hosts below the roster, rendered by the container. */
21
+ sections: ReactNode;
22
+ onToggleHidden: (entry: ModelCatalogEntry) => void;
23
+ onBilling: (entry: ModelCatalogEntry, next: BillingMode | "auto") => void;
24
+ onThinking: (entry: ModelCatalogEntry, next: ThinkingLevel | "auto") => void;
25
+ onDefault: (next: string | null) => void;
26
+ onCustomModels: (models: string[]) => void;
27
+ onRefresh: () => void;
28
+ }
29
+ export declare function ModelsCatalogView(p: ModelsCatalogViewProps): import("react").JSX.Element;
30
+ /**
31
+ * User-managed OpenRouter models: added and removed here by model id, no env
32
+ * change or redeploy. They appear in the roster above as ordinary profiles
33
+ * (api-billed via OPENROUTER_API_KEY). The draft is the section's own.
34
+ */
35
+ export declare function OpenRouterSection({ models, onChange }: {
36
+ models: string[];
37
+ onChange: (models: string[]) => void;
38
+ }): import("react").JSX.Element;
39
+ //# sourceMappingURL=models-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-list.d.ts","sourceRoot":"","sources":["../../../src/components/settings/models-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,8EAA8E;IAC9E,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACnD,SAAS,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,KAAK,IAAI,CAAC;IAC1E,UAAU,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7E,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,sBAAsB,+BAsE1D;AAwCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAAE,+BAoDjH"}
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Callout, Chip, Placeholder } from "@schlessera/brain-ui-kit";
3
+ import { Eye, EyeOff, X } from "lucide-react";
4
+ import { THINKING_LEVELS, } from "@schlessera/brain-ui-sdk/protocol";
5
+ import { useState } from "react";
6
+ export function ModelsCatalogView(p) {
7
+ const catalog = p.catalog;
8
+ const visibleCount = catalog?.models.filter((m) => !m.hidden).length ?? 0;
9
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex-1 overflow-y-auto p-4", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "The list is read from the provider and refreshes on its own. Hide the ones you never pick \u2014 running sessions are unaffected." }), catalog && _jsx(DefaultModelSelect, { catalog: catalog, onChange: p.onDefault }), p.loading ? (_jsx("div", { className: "mt-4", children: _jsx(Placeholder, { variant: "loading", lines: 4 }) })) : (_jsxs("ul", { className: "mt-4 flex flex-col gap-2", children: [catalog?.models.map((entry) => (_jsx(ModelRow, { entry: entry, onToggle: () => p.onToggleHidden(entry), onBilling: (next) => p.onBilling(entry, next), onThinking: (next) => p.onThinking(entry, next) }, entry.id))), catalog?.models.length === 0 && (_jsx("li", { children: _jsx(Placeholder, { variant: "empty", message: "No models available.", icon: "model" }) }))] })), p.error && (_jsx("div", { role: "alert", className: "mt-3", children: _jsx(Callout, { tone: "red", variant: "banner", icon: "failed", mono: true, text: p.error }) })), catalog?.discovery.error && (_jsx("div", { className: "mt-3", children: _jsx(Callout, { tone: "gold", variant: "banner", icon: "unverified", mono: true, text: `Last refresh failed (${catalog.discovery.error}). Showing the last known list.` }) })), catalog && !catalog.discovery.enabled && (_jsx("p", { className: "mt-3 text-xs text-muted-foreground", children: "Discovery is disabled (BRAIN_UI_MODEL_DISCOVERY). Only configured profiles are listed." })), catalog && _jsx(OpenRouterSection, { models: catalog.customModels ?? [], onChange: p.onCustomModels }), p.sections] }), _jsxs("div", { className: "flex items-center justify-between gap-3 border-t border-border p-4", children: [_jsxs("span", { className: "font-[family-name:var(--font-mono)] text-[11px] text-muted-foreground", children: [visibleCount, " in picker \u00B7 ", formatRefreshed(catalog?.refreshedAt ?? null)] }), _jsx(Button, { label: p.refreshing ? "Refreshing…" : "Refresh", icon: "retry", tone: "ghost", size: "sm", block: false, disabled: p.refreshing, onClick: p.onRefresh })] })] }));
10
+ }
11
+ /**
12
+ * The default-model choice: which profile answers when a turn names none —
13
+ * a fresh device's first conversation, a share filed into the brain, any
14
+ * host-initiated action. "Auto" prefers a connected subscription account
15
+ * (e.g. ChatGPT for the gpt profiles) and falls back to the built-in default.
16
+ */
17
+ function DefaultModelSelect({ catalog, onChange }) {
18
+ const stored = catalog.defaultModelId ?? null;
19
+ const byId = new Map(catalog.models.map((model) => [model.id, model]));
20
+ const resolved = catalog.resolvedDefaultId ? byId.get(catalog.resolvedDefaultId) : undefined;
21
+ // Offer everything visible, plus a stored default that has since been
22
+ // hidden (dropping it from the list would silently rewrite the choice).
23
+ const options = catalog.models.filter((model) => !model.hidden || model.id === stored);
24
+ return (_jsxs("div", { className: "mt-4 flex items-center gap-3 rounded-lg border border-border-subtle bg-surface p-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm text-foreground", children: "Default model" }), _jsx("p", { className: "text-[11px] text-muted-foreground", children: "Used for new conversations, shares, and actions that don't pick one." })] }), _jsxs("select", { value: stored ?? "auto", onChange: (e) => onChange(e.target.value === "auto" ? null : e.target.value), "aria-label": "Default model", className: "h-8 max-w-[45%] shrink-0 truncate rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !stored && resolved ? `Auto (${resolved.label})` : "Auto" }), options.map((model) => (_jsx("option", { value: model.id, children: model.label }, model.id)))] })] }));
25
+ }
26
+ /**
27
+ * User-managed OpenRouter models: added and removed here by model id, no env
28
+ * change or redeploy. They appear in the roster above as ordinary profiles
29
+ * (api-billed via OPENROUTER_API_KEY). The draft is the section's own.
30
+ */
31
+ export function OpenRouterSection({ models, onChange }) {
32
+ const [draft, setDraft] = useState("");
33
+ function add() {
34
+ const id = draft.trim();
35
+ if (!id || models.includes(id))
36
+ return;
37
+ onChange([...models, id]);
38
+ setDraft("");
39
+ }
40
+ return (_jsxs("div", { className: "mt-6", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "OpenRouter models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Add any OpenRouter model by its id (needs OPENROUTER_API_KEY on the server). Added models join the list above." }), models.length > 0 && (_jsx("ul", { className: "mt-3 flex flex-col gap-1.5", children: models.map((model) => (_jsxs("li", { className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-surface px-3 py-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate font-[family-name:var(--font-mono)] text-xs text-foreground", children: model }), _jsx("button", { type: "button", onClick: () => onChange(models.filter((m) => m !== model)), title: `Remove ${model}`, "aria-label": `Remove ${model}`, className: "flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-surface-raised hover:text-destructive", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] }, model))) })), _jsxs("div", { className: "mt-3 flex items-center gap-2", children: [_jsx("input", { value: draft, onChange: (e) => setDraft(e.target.value), onKeyDown: (e) => {
41
+ if (e.key === "Enter")
42
+ add();
43
+ }, placeholder: "z.ai/glm-5.3-flash", "aria-label": "OpenRouter model id", className: "h-8 min-w-0 flex-1 rounded-lg border border-border-subtle bg-surface px-2 font-[family-name:var(--font-mono)] text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-primary focus:outline-none" }), _jsx(Button, { label: "Add", icon: "add", tone: "ghost", size: "sm", block: false, disabled: !draft.trim(), onClick: add })] })] }));
44
+ }
45
+ function billingLabel(mode) {
46
+ return mode === "api" ? "API" : "Subscription";
47
+ }
48
+ function ModelRow({ entry, onToggle, onBilling, onThinking, }) {
49
+ const Icon = entry.hidden ? EyeOff : Eye;
50
+ return (_jsxs("li", { className: "flex items-center gap-3 rounded-lg border border-border-subtle bg-surface p-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("p", { className: entry.hidden ? "truncate text-sm text-muted-foreground" : "truncate text-sm text-foreground", children: entry.label }), entry.hidden && _jsx(Chip, { label: "hidden", variant: "kv", tone: "neutral" })] }), _jsxs("p", { className: "truncate text-[11px] text-muted-foreground", children: [entry.id, entry.contextWindow ? ` · ${formatTokens(entry.contextWindow)}` : "", entry.source === "declared" ? " · configured" : ""] })] }), entry.thinkingLevel && (_jsxs("select", { value: entry.thinkingOverride ?? "auto", onChange: (e) => onThinking(e.target.value), "aria-label": `Reasoning effort for ${entry.label}`, className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !entry.thinkingOverride ? `Default (${entry.thinkingLevel})` : "Default" }), THINKING_LEVELS.map((level) => (_jsx("option", { value: level, children: level }, level)))] })), _jsxs("select", { value: entry.billingOverride ?? "auto", onChange: (e) => onBilling(e.target.value), "aria-label": `Billing for ${entry.label}`, className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !entry.billingOverride && entry.billingMode ? `Auto (${billingLabel(entry.billingMode).toLowerCase()})` : "Auto" }), _jsx("option", { value: "subscription", children: "Subscription" }), _jsx("option", { value: "api", children: "API" })] }), _jsx("button", { type: "button", onClick: onToggle, title: entry.hidden ? "Show in picker" : "Hide from picker", "aria-label": entry.hidden ? "Show in picker" : "Hide from picker", "aria-pressed": !entry.hidden, className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-surface-raised hover:text-foreground", children: _jsx(Icon, { className: "h-4 w-4" }) })] }));
51
+ }
52
+ function formatTokens(tokens) {
53
+ if (tokens >= 1_000_000)
54
+ return `${tokens / 1_000_000}M context`;
55
+ if (tokens >= 1_000)
56
+ return `${Math.round(tokens / 1_000)}K context`;
57
+ return `${tokens} context`;
58
+ }
59
+ function formatRefreshed(refreshedAt) {
60
+ if (refreshedAt === null)
61
+ return "never refreshed";
62
+ const minutes = Math.round((Date.now() - refreshedAt) / 60_000);
63
+ if (minutes < 1)
64
+ return "refreshed just now";
65
+ if (minutes < 60)
66
+ return `refreshed ${minutes}m ago`;
67
+ const hours = Math.round(minutes / 60);
68
+ if (hours < 24)
69
+ return `refreshed ${hours}h ago`;
70
+ return `refreshed ${Math.round(hours / 24)}d ago`;
71
+ }
72
+ //# sourceMappingURL=models-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-list.js","sourceRoot":"","sources":["../../../src/components/settings/models-list.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,10 @@ import { type BillingMode, type ModelCatalogEntry, type ThinkingLevel } from "@s
5
5
  * The roster comes from the server (Anthropic model discovery plus any
6
6
  * host-declared profiles), so this tab never hardcodes model names. Hiding is
7
7
  * presentation only — a session already pinned to a hidden model keeps running.
8
+ *
9
+ * This is the container (S7): the request, the optimistic commits, their
10
+ * ordering gate and their write queue live here; `ModelsCatalogView` draws
11
+ * the roster.
8
12
  */
9
13
  export declare function ModelsTab({ active }: {
10
14
  active: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"models-tab.d.ts","sourceRoot":"","sources":["../../../src/components/settings/models-tab.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EAEtB,KAAK,aAAa,EACnB,MAAM,mCAAmC,CAAC;AAQ3C;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,+BA4PxD;AA6HD;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI;IAAE,KAAK,EAAE,MAAM,MAAM,OAAO,CAAA;CAAE,CAQlE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,WAAW,GAAG,MAAM,GACzB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAO7B;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,aAAa,GAAG,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAQ/B"}
1
+ {"version":3,"file":"models-tab.d.ts","sourceRoot":"","sources":["../../../src/components/settings/models-tab.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EAEtB,KAAK,aAAa,EACnB,MAAM,mCAAmC,CAAC;AAS3C;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,+BAmMxD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI;IAAE,KAAK,EAAE,MAAM,MAAM,OAAO,CAAA;CAAE,CAQlE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,WAAW,GAAG,MAAM,GACzB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAO7B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,aAAa,GAAG,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAQ/B"}
@@ -1,10 +1,8 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useRef, useState } from "react";
3
- import { Eye, EyeOff, Loader2, RefreshCw, X } from "lucide-react";
4
- import { THINKING_LEVELS, } from "@schlessera/brain-ui-sdk/protocol";
5
- import { api } from "../../lib/api-client.js";
3
+ import { useBrainUiRoot } from "../../root-context.js";
6
4
  import { useProviderStore } from "../../stores/provider-store.js";
7
- import { cn } from "../../lib/utils.js";
5
+ import { ModelsCatalogView } from "./models-list.js";
8
6
  import { PiAccountsSection } from "./pi-accounts.js";
9
7
  import { WebSearchSection } from "./web-search-settings.js";
10
8
  import { ToolPermissionsSection } from "./tool-permissions.js";
@@ -14,8 +12,15 @@ import { ToolPermissionsSection } from "./tool-permissions.js";
14
12
  * The roster comes from the server (Anthropic model discovery plus any
15
13
  * host-declared profiles), so this tab never hardcodes model names. Hiding is
16
14
  * presentation only — a session already pinned to a hidden model keeps running.
15
+ *
16
+ * This is the container (S7): the request, the optimistic commits, their
17
+ * ordering gate and their write queue live here; `ModelsCatalogView` draws
18
+ * the roster.
17
19
  */
18
20
  export function ModelsTab({ active }) {
21
+ const root = useBrainUiRoot();
22
+ const api = root.api;
23
+ const lifetime = useRef(0);
19
24
  const [catalog, setCatalog] = useState(null);
20
25
  const [loading, setLoading] = useState(false);
21
26
  const [refreshing, setRefreshing] = useState(false);
@@ -23,32 +28,31 @@ export function ModelsTab({ active }) {
23
28
  const loadProviders = useProviderStore((s) => s.loadProviders);
24
29
  const commitGate = useRef(createRequestGate());
25
30
  /** Serializes full-record PUTs — see commitCatalog. */
26
- const commitQueue = useRef(Promise.resolve());
31
+ const commitQueues = useRef(new WeakMap());
27
32
  useEffect(() => {
28
- if (!active)
29
- return;
30
- let cancelled = false;
31
- setLoading(true);
33
+ const generation = ++lifetime.current;
34
+ const latest = commitGate.current.begin();
35
+ const current = () => generation === lifetime.current && latest();
36
+ setCatalog(null);
37
+ setLoading(active);
38
+ setRefreshing(false);
32
39
  setError(null);
33
- api
34
- .models()
35
- .then((data) => {
36
- if (!cancelled)
37
- setCatalog(data);
38
- })
39
- .catch((err) => {
40
- if (!cancelled) {
41
- setError(err instanceof Error ? err.message : "Could not load models");
42
- }
43
- })
44
- .finally(() => {
45
- if (!cancelled)
46
- setLoading(false);
47
- });
48
- return () => {
49
- cancelled = true;
50
- };
51
- }, [active]);
40
+ if (active) {
41
+ // Returning to a root waits for its accepted writes before reading.
42
+ void (commitQueues.current.get(root) ?? Promise.resolve())
43
+ .then(() => current() ? api.models() : null)
44
+ .then((data) => { if (data && current())
45
+ setCatalog(data); })
46
+ .catch((err) => {
47
+ if (current())
48
+ setError(err instanceof Error ? err.message : "Could not load models");
49
+ })
50
+ .finally(() => { if (generation === lifetime.current)
51
+ setLoading(false); });
52
+ }
53
+ const invalidate = () => { lifetime.current++; };
54
+ return invalidate;
55
+ }, [active, root, api]);
52
56
  /**
53
57
  * Optimistic-update skeleton shared by the hidden toggle and the billing
54
58
  * select: the change is the user's own click, so reflect it immediately,
@@ -64,7 +68,9 @@ export function ModelsTab({ active }) {
64
68
  * this change (and its own catch surfaces any error that still matters).
65
69
  */
66
70
  async function commitCatalog(optimistic, commit) {
67
- const isCurrent = commitGate.current.begin();
71
+ const generation = lifetime.current;
72
+ const latest = commitGate.current.begin();
73
+ const isCurrent = () => generation === lifetime.current && latest();
68
74
  const previous = catalog;
69
75
  setCatalog(optimistic);
70
76
  setError(null);
@@ -74,7 +80,7 @@ export function ModelsTab({ active }) {
74
80
  // even while the client looked right. Each commit waits for the previous
75
81
  // one to settle; payloads are built on optimistic state, so the newest
76
82
  // write already carries every earlier edit.
77
- const run = commitQueue.current.then(async () => {
83
+ const run = (commitQueues.current.get(root) ?? Promise.resolve()).then(async () => {
78
84
  try {
79
85
  const confirmed = await commit();
80
86
  if (isCurrent())
@@ -88,7 +94,7 @@ export function ModelsTab({ active }) {
88
94
  }
89
95
  }
90
96
  });
91
- commitQueue.current = run;
97
+ commitQueues.current.set(root, run);
92
98
  await run;
93
99
  }
94
100
  async function toggleHidden(entry) {
@@ -146,59 +152,32 @@ export function ModelsTab({ active }) {
146
152
  async function onRefresh() {
147
153
  if (refreshing)
148
154
  return;
155
+ const generation = lifetime.current;
156
+ const latest = commitGate.current.begin();
157
+ const current = () => generation === lifetime.current && latest();
149
158
  setRefreshing(true);
150
159
  setError(null);
151
160
  try {
152
- setCatalog(await api.refreshModels());
161
+ await (commitQueues.current.get(root) ?? Promise.resolve());
162
+ if (generation !== lifetime.current)
163
+ return;
164
+ const next = await api.refreshModels();
165
+ if (current())
166
+ setCatalog(next);
153
167
  // A refresh can surface newly released models — put them in the picker
154
168
  // now, not on next load.
155
169
  void loadProviders();
156
170
  }
157
171
  catch (err) {
158
- setError(err instanceof Error ? err.message : "Refresh failed");
172
+ if (current())
173
+ setError(err instanceof Error ? err.message : "Refresh failed");
159
174
  }
160
175
  finally {
161
- setRefreshing(false);
176
+ if (generation === lifetime.current)
177
+ setRefreshing(false);
162
178
  }
163
179
  }
164
- const visibleCount = catalog?.models.filter((m) => !m.hidden).length ?? 0;
165
- return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex-1 overflow-y-auto p-4", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "The list is read from the provider and refreshes on its own. Hide the ones you never pick \u2014 running sessions are unaffected." }), catalog && (_jsx(DefaultModelSelect, { catalog: catalog, onChange: changeDefault })), loading ? (_jsx("div", { className: "mt-6 flex justify-center", children: _jsx(Loader2, { className: "h-5 w-5 animate-spin text-muted-foreground" }) })) : (_jsxs("ul", { className: "mt-4 flex flex-col gap-2", children: [catalog?.models.map((entry) => (_jsx(ModelRow, { entry: entry, onToggle: () => toggleHidden(entry), onBilling: (next) => changeBilling(entry, next), onThinking: (next) => changeThinking(entry, next) }, entry.id))), catalog?.models.length === 0 && (_jsx("li", { className: "rounded-lg border border-dashed border-border-subtle p-4 text-center text-xs text-muted-foreground", children: "No models available." }))] })), error && (_jsx("p", { role: "alert", className: "mt-3 text-xs text-destructive", children: error })), catalog?.discovery.error && (_jsxs("p", { className: "mt-3 text-xs text-muted-foreground", children: ["Last refresh failed (", catalog.discovery.error, "). Showing the last known list."] })), catalog && !catalog.discovery.enabled && (_jsx("p", { className: "mt-3 text-xs text-muted-foreground", children: "Discovery is disabled (BRAIN_UI_MODEL_DISCOVERY). Only configured profiles are listed." })), catalog && (_jsx(OpenRouterSection, { models: catalog.customModels ?? [], onChange: setCustom })), _jsx(PiAccountsSection, { active: active }), _jsx(WebSearchSection, { active: active }), _jsx(ToolPermissionsSection, { active: active })] }), _jsxs("div", { className: "flex items-center justify-between gap-3 border-t border-border p-4", children: [_jsxs("span", { className: "text-[11px] text-muted-foreground", children: [visibleCount, " in picker \u00B7 ", formatRefreshed(catalog?.refreshedAt ?? null)] }), _jsxs("button", { onClick: onRefresh, disabled: refreshing, className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-surface px-3 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary disabled:opacity-50", children: [_jsx(RefreshCw, { className: cn("h-3.5 w-3.5", refreshing && "animate-spin") }), "Refresh"] })] })] }));
166
- }
167
- /**
168
- * The default-model choice: which profile answers when a turn names none —
169
- * a fresh device's first conversation, a share filed into the brain, any
170
- * host-initiated action. "Auto" prefers a connected subscription account
171
- * (e.g. ChatGPT for the gpt profiles) and falls back to the built-in default.
172
- */
173
- function DefaultModelSelect({ catalog, onChange, }) {
174
- const stored = catalog.defaultModelId ?? null;
175
- const byId = new Map(catalog.models.map((model) => [model.id, model]));
176
- const resolved = catalog.resolvedDefaultId
177
- ? byId.get(catalog.resolvedDefaultId)
178
- : undefined;
179
- // Offer everything visible, plus a stored default that has since been
180
- // hidden (dropping it from the list would silently rewrite the choice).
181
- const options = catalog.models.filter((model) => !model.hidden || model.id === stored);
182
- return (_jsxs("div", { className: "mt-4 flex items-center gap-3 rounded-lg border border-border-subtle bg-surface p-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm text-foreground", children: "Default model" }), _jsx("p", { className: "text-[11px] text-muted-foreground", children: "Used for new conversations, shares, and actions that don't pick one." })] }), _jsxs("select", { value: stored ?? "auto", onChange: (e) => onChange(e.target.value === "auto" ? null : e.target.value), "aria-label": "Default model", className: "h-8 max-w-[45%] shrink-0 truncate rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !stored && resolved ? `Auto (${resolved.label})` : "Auto" }), options.map((model) => (_jsx("option", { value: model.id, children: model.label }, model.id)))] })] }));
183
- }
184
- /**
185
- * User-managed OpenRouter models: added and removed here by model id, no env
186
- * change or redeploy. They appear in the roster above as ordinary profiles
187
- * (api-billed via OPENROUTER_API_KEY).
188
- */
189
- function OpenRouterSection({ models, onChange, }) {
190
- const [draft, setDraft] = useState("");
191
- function add() {
192
- const id = draft.trim();
193
- if (!id || models.includes(id))
194
- return;
195
- onChange([...models, id]);
196
- setDraft("");
197
- }
198
- return (_jsxs("div", { className: "mt-6", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "OpenRouter models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Add any OpenRouter model by its id (needs OPENROUTER_API_KEY on the server). Added models join the list above." }), models.length > 0 && (_jsx("ul", { className: "mt-3 flex flex-col gap-1.5", children: models.map((model) => (_jsxs("li", { className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-surface px-3 py-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate font-[family-name:var(--font-mono)] text-xs text-foreground", children: model }), _jsx("button", { onClick: () => onChange(models.filter((m) => m !== model)), title: `Remove ${model}`, className: "flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-surface-raised hover:text-destructive", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] }, model))) })), _jsxs("div", { className: "mt-3 flex gap-2", children: [_jsx("input", { value: draft, onChange: (e) => setDraft(e.target.value), onKeyDown: (e) => {
199
- if (e.key === "Enter")
200
- add();
201
- }, placeholder: "z.ai/glm-5.3-flash", className: "h-8 min-w-0 flex-1 rounded-lg border border-border-subtle bg-surface px-2 font-[family-name:var(--font-mono)] text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-primary focus:outline-none" }), _jsx("button", { onClick: add, disabled: !draft.trim(), className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-3 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary disabled:opacity-50", children: "Add" })] })] }));
180
+ return (_jsx(ModelsCatalogView, { catalog: catalog, loading: loading, refreshing: refreshing, error: error, sections: _jsxs(_Fragment, { children: [_jsx(PiAccountsSection, { active: active }), _jsx(WebSearchSection, { active: active }), _jsx(ToolPermissionsSection, { active: active })] }), onToggleHidden: (entry) => void toggleHidden(entry), onBilling: (entry, next) => void changeBilling(entry, next), onThinking: (entry, next) => void changeThinking(entry, next), onDefault: (next) => void changeDefault(next), onCustomModels: (models) => void setCustom(models), onRefresh: () => void onRefresh() }));
202
181
  }
203
182
  /**
204
183
  * Request-ordering guard for optimistic commits: `begin()` claims a token
@@ -228,9 +207,6 @@ export function nextBillingOverrides(models, id, next) {
228
207
  }
229
208
  return billing;
230
209
  }
231
- function billingLabel(mode) {
232
- return mode === "api" ? "API" : "Subscription";
233
- }
234
210
  /**
235
211
  * The effort-override record PUT after changing one profile: every other
236
212
  * profile keeps its stored override, the changed one is set — or, for "auto",
@@ -245,30 +221,4 @@ export function nextThinkingOverrides(models, id, next) {
245
221
  }
246
222
  return thinking;
247
223
  }
248
- function ModelRow({ entry, onToggle, onBilling, onThinking, }) {
249
- const Icon = entry.hidden ? EyeOff : Eye;
250
- return (_jsxs("li", { className: cn("flex items-center gap-3 rounded-lg border border-border-subtle bg-surface p-3", entry.hidden && "opacity-50"), children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm text-foreground", children: entry.label }), _jsxs("p", { className: "truncate text-[11px] text-muted-foreground", children: [entry.id, entry.contextWindow ? ` · ${formatTokens(entry.contextWindow)}` : "", entry.source === "declared" ? " · configured" : ""] })] }), entry.thinkingLevel && (_jsxs("select", { value: entry.thinkingOverride ?? "auto", onChange: (e) => onThinking(e.target.value), "aria-label": `Reasoning effort for ${entry.label}`, className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !entry.thinkingOverride ? `Default (${entry.thinkingLevel})` : "Default" }), THINKING_LEVELS.map((level) => (_jsx("option", { value: level, children: level }, level)))] })), _jsxs("select", { value: entry.billingOverride ?? "auto", onChange: (e) => onBilling(e.target.value), "aria-label": `Billing for ${entry.label}`, className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !entry.billingOverride && entry.billingMode
251
- ? `Auto (${billingLabel(entry.billingMode).toLowerCase()})`
252
- : "Auto" }), _jsx("option", { value: "subscription", children: "Subscription" }), _jsx("option", { value: "api", children: "API" })] }), _jsx("button", { onClick: onToggle, title: entry.hidden ? "Show in picker" : "Hide from picker", "aria-pressed": !entry.hidden, className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-surface-raised hover:text-foreground", children: _jsx(Icon, { className: "h-4 w-4" }) })] }));
253
- }
254
- function formatTokens(tokens) {
255
- if (tokens >= 1_000_000)
256
- return `${tokens / 1_000_000}M context`;
257
- if (tokens >= 1_000)
258
- return `${Math.round(tokens / 1_000)}K context`;
259
- return `${tokens} context`;
260
- }
261
- function formatRefreshed(refreshedAt) {
262
- if (refreshedAt === null)
263
- return "never refreshed";
264
- const minutes = Math.round((Date.now() - refreshedAt) / 60_000);
265
- if (minutes < 1)
266
- return "refreshed just now";
267
- if (minutes < 60)
268
- return `refreshed ${minutes}m ago`;
269
- const hours = Math.round(minutes / 60);
270
- if (hours < 24)
271
- return `refreshed ${hours}h ago`;
272
- return `refreshed ${Math.round(hours / 24)}d ago`;
273
- }
274
224
  //# sourceMappingURL=models-tab.js.map