@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,40 +1,54 @@
1
- import { useEffect, useMemo, useState } from "react";
2
- import {
3
- Activity as ActivityIcon,
4
- AlertTriangle,
5
- RefreshCw,
6
- Timer,
7
- } from "lucide-react";
1
+ import { useBrainUiRoot } from "../../root-context.js";
2
+ import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from "react";
3
+ import { Activity as ActivityIcon, AlertTriangle, RefreshCw } from "lucide-react";
8
4
  import type { ActivitySpan } from "@schlessera/brain-ui-sdk/protocol";
9
5
 
10
- import {
11
- api,
12
- type ActivityIntent,
13
- type ActivityRollups,
14
- type ActivityRunSummary,
6
+ import type {
7
+ ActivityIntent,
8
+ ActivityRollups,
9
+ ActivityRunSummary,
15
10
  } from "../../lib/api-client.js";
16
- import { sendClientMessage } from "../../hooks/use-websocket.js";
17
11
  import { useActivityStore } from "../../stores/activity-store.js";
18
- import { useChatStore } from "../../stores/chat-store.js";
19
- import { useUIStore } from "../../stores/ui-store.js";
12
+ import { useChatStore, pendingApprovals } from "../../stores/chat-store.js";
13
+ import { EmptyState, FilterRow, InlineToast, Label } from "@schlessera/brain-ui-kit";
20
14
  import { cn } from "../../lib/utils.js";
15
+ import { ApprovalCard, approvalOutcome } from "./approval-card.js";
16
+ import { useUIStore } from "../../stores/ui-store.js";
21
17
  import { formatRelativeTime } from "../chat/tool-views.js";
22
18
  import { RollupCards } from "./activity-rollups.js";
23
19
  import { LiveRow, RunRow } from "./activity-run-list.js";
24
- import { RunDetail } from "./activity-run-detail.js";
20
+ import { RunDetail, RunTraceSteps } from "./activity-run-detail.js";
21
+ import { IntentCard } from "./activity-views.js";
22
+ import { focusAfterDecision, singleKey } from "../../lib/single-key.js";
23
+ import { useFinePointer } from "../../hooks/use-fine-pointer.js";
25
24
  import { PushToggle } from "./push-toggle.js";
26
25
  import { SettingsPanel } from "../settings/settings-panel.js";
27
26
 
28
27
  /**
29
- * The Activity surface: an INDEX of all agent activity live runs first,
30
- * then history with cost/token rollups. Deliberately not a residence:
31
- * a session run deep-links back into its chat, a subagent into the drill-in
32
- * stack; only a cron run (which has no chat around it) details here.
28
+ * The Actions surface (D37): one queue, three lenses`needs you` (pending
29
+ * approvals from every transcript, then the inbox), `running` (live runs),
30
+ * `done` (history and the rollups). "What needs me" and "what has been
31
+ * happening" are two lenses on one queue, so the rail has one destination
32
+ * and this page has a filter. Deliberately not a residence: a session run
33
+ * deep-links back into its chat, a subagent into the drill-in stack; only a
34
+ * cron run (which has no chat around it) details here.
33
35
  *
34
36
  * Live rows ride the index-view activity subscription while this surface is
35
- * open; history and rollups come from the REST activity API.
37
+ * open; history and rollups come from the REST activity API. The hash stays
38
+ * `#/activity` — the route is a contract with push notifications.
39
+ *
40
+ * Panes (D4): below `laptop:` the run detail replaces the queue, as on the
41
+ * phone. From `laptop:` the queue is a 360px list column beside the detail
42
+ * pane, and from `wide:` a 300px evidence rail on the right carries the
43
+ * run's trace and the last decision's receipt. Each pane scrolls on its own.
44
+ * The detail is one element at every width — the list hides under it below
45
+ * `laptop:` — so a deep link selects the same run everywhere.
36
46
  */
47
+ export type ActionsLens = "needs-you" | "running" | "done";
37
48
  export function ActivityPage() {
49
+ const root = useBrainUiRoot();
50
+ const api = root.api;
51
+ const request = useRef(0);
38
52
  const supported = useActivityStore((s) => s.supported);
39
53
  const connectionEpoch = useActivityStore((s) => s.connectionEpoch);
40
54
  const liveSpans = useActivityStore((s) => s.spans);
@@ -50,39 +64,80 @@ export function ActivityPage() {
50
64
  const [pricingStale, setPricingStale] = useState(false);
51
65
 
52
66
  const inbox = useActivityStore((s) => s.inbox);
67
+ // Derived from the buffer references, not selected as a fresh array: a
68
+ // selector returning a new array every call re-renders without end.
69
+ const buffers = useChatStore((s) => s.buffers);
70
+ const draft = useChatStore((s) => s.draft);
71
+ const approvals = useMemo(() => pendingApprovals({ buffers, draft }), [buffers, draft]);
72
+ const resolveToolApproval = useChatStore((s) => s.resolveToolApproval);
73
+ /**
74
+ * The lens the reader picked, or — until they pick one — the one that has
75
+ * something in it: what needs you, else what is running, else what is
76
+ * done. A page that opens on an empty "needs you" when a run is live would
77
+ * be reassurance in the wrong place.
78
+ */
79
+ const [picked, setLens] = useState<ActionsLens | null>(null);
80
+ /**
81
+ * The receipt for the last DECISION — Allowed, Always allowed, Denied —
82
+ * shown above the `EmptyState` that replaces a drained section (D37) and
83
+ * in the evidence rail: a keyboard user is told "that is done" instead of
84
+ * being dropped at the document top. A decision earns a toast by the
85
+ * sixth pass's own criterion (§4: "a toast is for effects you can take
86
+ * back or that happen out of sight"): its effect happens in the run, out
87
+ * of sight, and the card leaving says nothing about what the run did
88
+ * with the answer.
89
+ *
90
+ * A DISMISSAL sets no receipt. Acknowledging an inbox item is neither —
91
+ * it cannot be taken back (the activity API has no un-acknowledge) and
92
+ * the row vanishing under the cursor is the whole effect. An `InlineToast`
93
+ * whose point is Undo, shipped without Undo, "teaches that the kit's
94
+ * receipts are decorative"; so until un-acknowledge exists, dismissal is
95
+ * silent and the row leaving the list is the receipt. Grow un-acknowledge
96
+ * and the toast returns with its Undo.
97
+ */
98
+ const [receipt, setReceipt] = useState<{ text: string; target: string; effect: string } | null>(null);
99
+ const [drained, setDrained] = useState(false);
53
100
  const loadInbox = useActivityStore((s) => s.loadInbox);
54
101
  const acknowledgeIntent = useActivityStore((s) => s.acknowledgeIntent);
55
102
  const acknowledgeAllIntents = useActivityStore((s) => s.acknowledgeAllIntents);
56
103
 
57
- const refresh = () => {
58
- api
59
- .activityRuns({ limit: 100 })
60
- .then(setRuns)
61
- .catch((err) => setError(err instanceof Error ? err.message : String(err)));
62
- api.activityRollups(7).then(setRollups).catch(() => {});
63
- // Surface the pricing warning only when the table is stale AND refreshes
64
- // are failing — a merely-aging table heals itself. A rejection (including
65
- // 404 from a server that predates the route) means no signal: stay quiet.
66
- api
67
- .pricingState()
68
- .then((s) => setPricingStale(Boolean(s.stale && s.error)))
69
- .catch(() => setPricingStale(false));
104
+ const refresh = useCallback(() => {
105
+ const token = ++request.current;
106
+ const current = () => token === request.current;
107
+ setError(null);
108
+ api.activityRuns({ limit: 100 })
109
+ .then((runs) => { if (current()) setRuns(runs); })
110
+ .catch((err) => { if (current()) setError(err instanceof Error ? err.message : String(err)); });
111
+ api.activityRollups(7)
112
+ .then((rollups) => { if (current()) setRollups(rollups); })
113
+ .catch(() => {});
114
+ // A stale table is only a warning while refreshes are failing. Older
115
+ // servers have no pricing route, so a rejection remains a quiet state.
116
+ api.pricingState()
117
+ .then((s) => { if (current()) setPricingStale(Boolean(s.stale && s.error)); })
118
+ .catch(() => { if (current()) setPricingStale(false); });
70
119
  void loadInbox();
71
- };
120
+ }, [api, loadInbox]);
72
121
 
73
- // Re-runs on every reconnect (connectionEpoch): the new socket has no
74
- // server-side subscriptions, and the REST refresh heals whatever finished
75
- // while disconnected.
122
+ useEffect(() => {
123
+ setRuns(null);
124
+ setRollups(null);
125
+ setError(null);
126
+ setPricingStale(false);
127
+ setDetailRunId(null);
128
+ }, [root]);
129
+
130
+ // Reconnects heal the REST snapshot and establish a new subscription.
131
+ // Cleanup also invalidates responses from the old root or request generation.
76
132
  useEffect(() => {
77
133
  refresh();
78
- if (supported) {
79
- sendClientMessage({ type: "activity_subscribe", view: "index" });
80
- return () => {
81
- sendClientMessage({ type: "activity_unsubscribe", view: "index" });
82
- };
83
- }
84
- return undefined;
85
- }, [supported, connectionEpoch]);
134
+ if (supported) root.connection.send({ type: "activity_subscribe", view: "index" });
135
+ const invalidate = () => { request.current++; };
136
+ return () => {
137
+ invalidate();
138
+ if (supported) root.connection.send({ type: "activity_unsubscribe", view: "index" });
139
+ };
140
+ }, [supported, connectionEpoch, root, refresh]);
86
141
 
87
142
  // Deep-link consumer: `#/activity/<runId>` (the push notification landing
88
143
  // spot — the shell routes it here but leaves the hash intact) opens that
@@ -154,12 +209,60 @@ export function ActivityPage() {
154
209
  }
155
210
  }
156
211
 
157
- if (detailRunId) {
158
- return <RunDetail runId={detailRunId} onBack={() => showDetail(null)} />;
212
+ const keys = useUIStore((s) => s.singleKeyShortcuts);
213
+ // The keys bind on `keys` alone; they are PRINTED only while a mouse or
214
+ // trackpad is present (#86, #100), like the approval card's caps. A
215
+ // touch-only tablet past `laptop:` would otherwise read keys it cannot fire.
216
+ const finePointer = useFinePointer();
217
+ const printKeys = keys && finePointer;
218
+ const INTENT_CARD = "[data-intent-card] > [role=\"button\"]";
219
+ /**
220
+ * `j` / `k` move inside the focused list and `d` dismisses the focused
221
+ * card (D36): all three act only while a card in this list holds focus,
222
+ * and the footer prints them. After a dismiss, focus goes to the next
223
+ * card, else the previous, else the page heading.
224
+ */
225
+ function onInboxKeyDown(event: KeyboardEvent<HTMLDivElement>) {
226
+ if (!keys) return;
227
+ const key = singleKey(event);
228
+ if (key !== "j" && key !== "k" && key !== "d") return;
229
+ const cards = [...event.currentTarget.querySelectorAll<HTMLElement>(INTENT_CARD)];
230
+ const here = cards.findIndex((card) => card.contains(event.target as Node));
231
+ if (here === -1) return;
232
+ event.preventDefault();
233
+ if (key === "d") {
234
+ const intent = inbox[here];
235
+ focusAfterDecision(cards[here]!, INTENT_CARD, "[data-needs-you-heading]");
236
+ if (intent) dismiss(intent);
237
+ return;
238
+ }
239
+ cards[(here + (key === "j" ? 1 : -1) + cards.length) % cards.length]?.focus();
240
+ }
241
+
242
+ /** Silent by rule (see `receipt`): the row leaving is the receipt. `drained`
243
+ * still flips so the empty state's heading takes focus after the last one. */
244
+ function dismiss(intent: ActivityIntent) {
245
+ setDrained(inbox.length + approvals.length <= 1);
246
+ void acknowledgeIntent(intent.id);
247
+ }
248
+ function dismissAll() {
249
+ setDrained(approvals.length === 0);
250
+ void acknowledgeAllIntents();
159
251
  }
252
+ function decideApproval(key: string | null, toolUseId: string, approved: boolean, asked?: boolean) {
253
+ const tool = approvals.find((a) => a.tool.id === toolUseId)?.tool;
254
+ const { receipt, frame } = approvalOutcome(tool, toolUseId, approved, asked);
255
+ setReceipt(receipt);
256
+ setDrained(inbox.length + approvals.length <= 1);
257
+ resolveToolApproval(key, toolUseId, approved);
258
+ root.connection.send(frame);
259
+ }
260
+ const needsYouCount = inbox.length + approvals.length;
261
+ const runningCount = liveRoots.length + restLive.length;
262
+ const lens: ActionsLens = picked ?? (needsYouCount > 0 || drained ? "needs-you" : runningCount > 0 ? "running" : "done");
160
263
 
161
264
  return (
162
- <div className="flex h-full flex-col overflow-y-auto">
265
+ <div className="flex h-full min-h-0 flex-1 flex-col laptop:flex-row">
163
266
  {/* Hosted here like GraphPage does: the chat page (the usual host) is
164
267
  hidden while this view is active, so the staleness deep-link below
165
268
  needs its own panel mount. */}
@@ -167,133 +270,211 @@ export function ActivityPage() {
167
270
  open={settingsPanelOpen}
168
271
  onClose={() => setSettingsPanelOpen(false)}
169
272
  />
170
- <div className="flex items-center gap-2 border-b border-border-subtle px-4 py-3">
171
- <ActivityIcon className="h-4 w-4 text-muted-foreground" />
172
- <h1 className="text-sm font-medium">Activity</h1>
173
- <div className="ml-auto flex items-center gap-2">
174
- {pricingStale && (
175
- <button
176
- type="button"
177
- onClick={() => openSettings("models")}
178
- className="flex items-center gap-1 rounded-md p-1.5 text-amber-500 transition-colors hover:bg-surface-raised hover:text-amber-400"
179
- aria-label="Pricing refresh is failing — costs may use stale rates. Open Settings"
180
- title="Pricing refresh is failing — costs may use stale rates. Open Settings"
181
- >
182
- <AlertTriangle className="h-3.5 w-3.5" />
183
- <span className="hidden text-[10px] sm:inline">Pricing stale</span>
184
- </button>
185
- )}
186
- <PushToggle />
187
- </div>
188
- <button
189
- type="button"
190
- onClick={refresh}
191
- className="rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-surface-raised hover:text-foreground"
192
- aria-label="Refresh"
193
- >
194
- <RefreshCw className="h-3.5 w-3.5" />
195
- </button>
196
- </div>
197
-
198
- <div className="mx-auto w-full max-w-3xl space-y-6 p-4">
199
- {error && (
200
- <p className="text-xs text-destructive">Could not load activity: {error}</p>
273
+ {/* The list column. Below `laptop:` it is the whole page and an open
274
+ detail replaces it; from `laptop:` it is 360px beside the detail. */}
275
+ <section
276
+ aria-label="Actions queue"
277
+ className={cn(
278
+ "min-h-0 flex-col overflow-y-auto laptop:flex laptop:w-[360px] laptop:flex-none laptop:border-r laptop:border-border-subtle",
279
+ detailRunId ? "hidden" : "flex flex-1"
201
280
  )}
202
-
203
- {inbox.length > 0 && (
204
- <section>
205
- <div className="mb-2 flex items-center">
206
- <h2 className="text-xs font-medium uppercase tracking-wide text-muted-foreground">
207
- Needs attention
208
- </h2>
281
+ >
282
+ <div className="flex items-center gap-2 border-b border-border-subtle px-4 py-3">
283
+ <ActivityIcon className="h-4 w-4 text-muted-foreground" />
284
+ <h1 className="text-sm font-medium outline-none" tabIndex={-1} data-activity-heading="">Actions</h1>
285
+ <div className="ml-auto flex items-center gap-2">
286
+ {pricingStale && (
209
287
  <button
210
288
  type="button"
211
- onClick={() => void acknowledgeAllIntents()}
212
- className="ml-auto text-[11px] text-muted-foreground transition-colors hover:text-foreground"
289
+ onClick={() => openSettings("models")}
290
+ className="flex items-center gap-1 rounded-md p-1.5 text-primary transition-colors hover:bg-surface-raised hover:text-primary/80"
291
+ aria-label="Pricing refresh is failing — costs may use stale rates. Open Settings"
292
+ title="Pricing refresh is failing — costs may use stale rates. Open Settings"
213
293
  >
214
- Dismiss all
294
+ <AlertTriangle className="h-3.5 w-3.5" />
295
+ <span className="hidden text-[10px] sm:inline">Pricing stale</span>
215
296
  </button>
216
- </div>
217
- <div className="space-y-1">
218
- {inbox.map((intent) => (
219
- <div
220
- key={intent.id}
221
- className={cn(
222
- "flex items-center gap-2 rounded-lg border px-3 py-2 text-xs",
223
- intent.kind === "failure"
224
- ? "border-destructive/30 bg-destructive/5"
225
- : "border-border-subtle bg-surface"
226
- )}
227
- >
228
- {intent.kind === "failure" ? (
229
- <AlertTriangle className="h-3.5 w-3.5 shrink-0 text-destructive" />
230
- ) : intent.kind === "stuck" ? (
231
- <Timer className="h-3.5 w-3.5 shrink-0 text-amber-500" />
232
- ) : (
233
- <ActivityIcon className="h-3.5 w-3.5 shrink-0 text-muted-foreground" />
234
- )}
235
- <button
236
- type="button"
237
- className="min-w-0 flex-1 truncate text-left hover:underline"
238
- onClick={() => {
239
- void acknowledgeIntent(intent.id);
240
- openIntent(intent);
241
- }}
242
- >
243
- {intent.title}
244
- </button>
245
- <span className="shrink-0 text-[10px] text-muted-foreground/60">
246
- {formatRelativeTime(intent.createdAt)}
247
- </span>
297
+ )}
298
+ <PushToggle />
299
+ </div>
300
+ <button
301
+ type="button"
302
+ onClick={refresh}
303
+ className="rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-surface-raised hover:text-foreground"
304
+ aria-label="Refresh"
305
+ >
306
+ <RefreshCw className="h-3.5 w-3.5" />
307
+ </button>
308
+ </div>
309
+
310
+ <div className="mx-auto w-full max-w-3xl space-y-6 p-4 laptop:max-w-none">
311
+ {error && (
312
+ <p className="text-xs text-destructive">Could not load activity: {error}</p>
313
+ )}
314
+
315
+ <FilterRow
316
+ items={[
317
+ { label: `needs you ${needsYouCount}`, onClick: () => setLens("needs-you") },
318
+ { label: `running ${runningCount}`, onClick: () => setLens("running") },
319
+ { label: `done ${history.length}`, onClick: () => setLens("done") },
320
+ ]}
321
+ active={lens === "needs-you" ? 0 : lens === "running" ? 1 : 2}
322
+ />
323
+
324
+ {lens === "needs-you" && (
325
+ <section aria-labelledby="needs-you-heading">
326
+ <div className="mb-2 flex items-center">
327
+ <h2 id="needs-you-heading" className="text-xs font-medium uppercase tracking-wide text-muted-foreground outline-none" tabIndex={-1} data-needs-you-heading="">
328
+ Needs you
329
+ </h2>
330
+ {inbox.length > 0 && (
248
331
  <button
249
332
  type="button"
250
- onClick={() => void acknowledgeIntent(intent.id)}
251
- className="shrink-0 rounded p-1 text-muted-foreground transition-colors hover:text-foreground"
252
- aria-label="Dismiss"
333
+ onClick={dismissAll}
334
+ className="ml-auto text-[11px] text-muted-foreground transition-colors hover:text-foreground"
253
335
  >
254
- ×
336
+ Dismiss all
255
337
  </button>
338
+ )}
339
+ </div>
340
+ {needsYouCount === 0 ? (
341
+ <div className="flex flex-col gap-3">
342
+ {receipt && <InlineToast text={receipt.text} target={receipt.target} effect={receipt.effect} tone="teal" undoLabel="" />}
343
+ {/* A drained section becomes the empty state, and its heading
344
+ takes focus after the last decision (D37) — never the
345
+ document top. */}
346
+ <EmptyState variant="caught_up" meta="" focusTitle={drained} />
256
347
  </div>
257
- ))}
258
- </div>
259
- </section>
260
- )}
348
+ ) : (
349
+ <>
350
+ {approvals.length > 0 && (
351
+ <div className="mb-3 space-y-2">
352
+ {approvals.map(({ key, tool }) => (
353
+ <ApprovalCard
354
+ key={tool.id}
355
+ tool={tool}
356
+ origin={key ? `session ${key.slice(0, 8)}` : "this conversation"}
357
+ keys={keys}
358
+ onDecide={(approved, always) => decideApproval(key, tool.id, approved, always)}
359
+ />
360
+ ))}
361
+ </div>
362
+ )}
363
+ <div className="space-y-2" onKeyDown={onInboxKeyDown}>
364
+ {inbox.map((intent) => (
365
+ <div key={intent.id} data-intent-card="">
366
+ <IntentCard
367
+ intent={intent}
368
+ when={formatRelativeTime(intent.createdAt)}
369
+ keyHint={printKeys}
370
+ onOpen={() => {
371
+ void acknowledgeIntent(intent.id);
372
+ openIntent(intent);
373
+ }}
374
+ onDismiss={() => dismiss(intent)}
375
+ />
376
+ </div>
377
+ ))}
378
+ </div>
379
+ {printKeys && (
380
+ <p className="mt-1.5 font-[family-name:var(--font-mono)] text-[10px] text-muted-foreground/70 laptop:hidden">
381
+ j / k move · d dismiss · ⏎ open{approvals.length > 0 ? " · a allow" : ""}
382
+ </p>
383
+ )}
384
+ </>
385
+ )}
386
+ </section>
387
+ )}
261
388
 
262
- {rollups && <RollupCards rollups={rollups} />}
389
+ {lens === "running" && (
390
+ <section>
391
+ <h2 className="mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
392
+ Running now
393
+ </h2>
394
+ {liveRoots.length === 0 && restLive.length === 0 ? (
395
+ <p className="text-xs text-muted-foreground/70">Nothing is running.</p>
396
+ ) : (
397
+ <div className="space-y-1">
398
+ {liveRoots.map((span) => (
399
+ <LiveRow key={span.runId} span={span} onOpen={openRun} />
400
+ ))}
401
+ {restLive.map((run) => (
402
+ <RunRow key={run.runId} run={run} onOpen={openRun} />
403
+ ))}
404
+ </div>
405
+ )}
406
+ </section>
407
+ )}
263
408
 
264
- <section>
265
- <h2 className="mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
266
- Running now
267
- </h2>
268
- {liveRoots.length === 0 && restLive.length === 0 ? (
269
- <p className="text-xs text-muted-foreground/70">Nothing is running.</p>
270
- ) : (
271
- <div className="space-y-1">
272
- {liveRoots.map((span) => (
273
- <LiveRow key={span.runId} span={span} onOpen={openRun} />
274
- ))}
275
- {restLive.map((run) => (
276
- <RunRow key={run.runId} run={run} onOpen={openRun} />
277
- ))}
278
- </div>
409
+ {lens === "done" && (
410
+ <>
411
+ {rollups && <RollupCards rollups={rollups} />}
412
+ <section>
413
+ <h2 className="mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
414
+ History
415
+ </h2>
416
+ {history.length === 0 ? (
417
+ <p className="text-xs text-muted-foreground/70">No recorded runs yet.</p>
418
+ ) : (
419
+ <div className="space-y-1">
420
+ {history.map((run) => (
421
+ <RunRow key={run.runId} run={run} onOpen={openRun} />
422
+ ))}
423
+ </div>
424
+ )}
425
+ </section>
426
+ </>
279
427
  )}
280
- </section>
428
+ </div>
429
+ {/* The column's footer (D4): the printed keys, pinned under the list
430
+ from `laptop:`. Only while the keys can fire — they act inside the
431
+ inbox list — so a lens without cards advertises nothing, and
432
+ only with a fine pointer (#100). */}
433
+ {printKeys && lens === "needs-you" && inbox.length > 0 && (
434
+ <p className="sticky bottom-0 mt-auto hidden border-t border-border-subtle bg-background px-4 py-2 font-[family-name:var(--font-mono)] text-[10px] text-muted-foreground/70 laptop:block">
435
+ j / k move · d dismiss
436
+ </p>
437
+ )}
438
+ </section>
439
+
440
+ {/* The detail pane. Below `laptop:` it shows only with a selection and
441
+ takes the whole page; from `laptop:` it is always there, holding the
442
+ selected run or the prompt to pick one. */}
443
+ <div className={cn("min-h-0 min-w-0 flex-1 flex-col", detailRunId ? "flex" : "hidden laptop:flex")}>
444
+ {detailRunId ? (
445
+ <RunDetail runId={detailRunId} onBack={() => showDetail(null)} embedded />
446
+ ) : (
447
+ <div className="flex h-full items-center justify-center overflow-y-auto p-4">
448
+ <EmptyState
449
+ variant="quiet"
450
+ title="Pick a run"
451
+ body="Its trace, attempts and what it was holding show here."
452
+ meta=""
453
+ minHeight={0}
454
+ />
455
+ </div>
456
+ )}
457
+ </div>
281
458
 
282
- <section>
283
- <h2 className="mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
284
- History
285
- </h2>
286
- {history.length === 0 ? (
287
- <p className="text-xs text-muted-foreground/70">No recorded runs yet.</p>
288
- ) : (
289
- <div className="space-y-1">
290
- {history.map((run) => (
291
- <RunRow key={run.runId} run={run} onOpen={openRun} />
292
- ))}
459
+ {/* The evidence rail, `wide:` only: the run's trace as a record, and
460
+ the receipt for the last decision made on this page. */}
461
+ {detailRunId && (
462
+ <aside
463
+ aria-label="Run evidence"
464
+ className="hidden min-h-0 w-[300px] shrink-0 flex-col gap-4 overflow-y-auto border-l border-border-subtle bg-surface p-4 wide:flex"
465
+ >
466
+ <div className="flex flex-col gap-2">
467
+ <Label text="Trace" icon="steps" meta="this run" />
468
+ <RunTraceSteps runId={detailRunId} />
469
+ </div>
470
+ {receipt && (
471
+ <div className="flex flex-col gap-2">
472
+ <Label text="Last decision" icon="resolved" />
473
+ <InlineToast text={receipt.text} target={receipt.target} effect={receipt.effect} tone="teal" undoLabel="" />
293
474
  </div>
294
475
  )}
295
- </section>
296
- </div>
476
+ </aside>
477
+ )}
297
478
  </div>
298
479
  );
299
480
  }