@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.
- package/README.md +82 -4
- package/dist/components/activity/activity-page.d.ts +17 -5
- package/dist/components/activity/activity-page.d.ts.map +1 -1
- package/dist/components/activity/activity-page.js +148 -50
- package/dist/components/activity/activity-page.js.map +1 -1
- package/dist/components/activity/activity-run-detail.d.ts +16 -1
- package/dist/components/activity/activity-run-detail.d.ts.map +1 -1
- package/dist/components/activity/activity-run-detail.js +47 -4
- package/dist/components/activity/activity-run-detail.js.map +1 -1
- package/dist/components/activity/activity-run-list.d.ts +7 -1
- package/dist/components/activity/activity-run-list.d.ts.map +1 -1
- package/dist/components/activity/activity-run-list.js +16 -8
- package/dist/components/activity/activity-run-list.js.map +1 -1
- package/dist/components/activity/activity-views.d.ts +63 -0
- package/dist/components/activity/activity-views.d.ts.map +1 -0
- package/dist/components/activity/activity-views.js +52 -0
- package/dist/components/activity/activity-views.js.map +1 -0
- package/dist/components/activity/approval-card.d.ts +29 -0
- package/dist/components/activity/approval-card.d.ts.map +1 -0
- package/dist/components/activity/approval-card.js +73 -0
- package/dist/components/activity/approval-card.js.map +1 -0
- package/dist/components/activity/digest-card.d.ts +3 -0
- package/dist/components/activity/digest-card.d.ts.map +1 -1
- package/dist/components/activity/digest-card.js +20 -16
- package/dist/components/activity/digest-card.js.map +1 -1
- package/dist/components/activity/digest-summary.d.ts +19 -0
- package/dist/components/activity/digest-summary.d.ts.map +1 -0
- package/dist/components/activity/digest-summary.js +20 -0
- package/dist/components/activity/digest-summary.js.map +1 -0
- package/dist/components/activity/push-switch.d.ts +25 -0
- package/dist/components/activity/push-switch.d.ts.map +1 -0
- package/dist/components/activity/push-switch.js +14 -0
- package/dist/components/activity/push-switch.js.map +1 -0
- package/dist/components/activity/push-toggle.d.ts +7 -0
- package/dist/components/activity/push-toggle.d.ts.map +1 -1
- package/dist/components/activity/push-toggle.js +72 -47
- package/dist/components/activity/push-toggle.js.map +1 -1
- package/dist/components/activity/span-bits.d.ts +11 -0
- package/dist/components/activity/span-bits.d.ts.map +1 -1
- package/dist/components/activity/span-bits.js +50 -7
- package/dist/components/activity/span-bits.js.map +1 -1
- package/dist/components/chat/ask-user-card.d.ts +76 -3
- package/dist/components/chat/ask-user-card.d.ts.map +1 -1
- package/dist/components/chat/ask-user-card.js +208 -149
- package/dist/components/chat/ask-user-card.js.map +1 -1
- package/dist/components/chat/ask-user-typed.d.ts +42 -0
- package/dist/components/chat/ask-user-typed.d.ts.map +1 -0
- package/dist/components/chat/ask-user-typed.js +60 -0
- package/dist/components/chat/ask-user-typed.js.map +1 -0
- package/dist/components/chat/brain-markdown-links.d.ts +2 -1
- package/dist/components/chat/brain-markdown-links.d.ts.map +1 -1
- package/dist/components/chat/brain-markdown-links.js +3 -4
- package/dist/components/chat/brain-markdown-links.js.map +1 -1
- package/dist/components/chat/brain-markdown.d.ts.map +1 -1
- package/dist/components/chat/brain-markdown.js +4 -2
- package/dist/components/chat/brain-markdown.js.map +1 -1
- package/dist/components/chat/chat-page.d.ts.map +1 -1
- package/dist/components/chat/chat-page.js +27 -11
- package/dist/components/chat/chat-page.js.map +1 -1
- package/dist/components/chat/composer-view.d.ts +75 -0
- package/dist/components/chat/composer-view.d.ts.map +1 -0
- package/dist/components/chat/composer-view.js +31 -0
- package/dist/components/chat/composer-view.js.map +1 -0
- package/dist/components/chat/composer.d.ts +4 -0
- package/dist/components/chat/composer.d.ts.map +1 -1
- package/dist/components/chat/composer.js +76 -59
- package/dist/components/chat/composer.js.map +1 -1
- package/dist/components/chat/markdown-content.d.ts +16 -1
- package/dist/components/chat/markdown-content.d.ts.map +1 -1
- package/dist/components/chat/markdown-content.js +47 -3
- package/dist/components/chat/markdown-content.js.map +1 -1
- package/dist/components/chat/mermaid-block.d.ts +4 -0
- package/dist/components/chat/mermaid-block.d.ts.map +1 -1
- package/dist/components/chat/mermaid-block.js +13 -5
- package/dist/components/chat/mermaid-block.js.map +1 -1
- package/dist/components/chat/mermaid-share.d.ts +2 -1
- package/dist/components/chat/mermaid-share.d.ts.map +1 -1
- package/dist/components/chat/mermaid-share.js +7 -8
- package/dist/components/chat/mermaid-share.js.map +1 -1
- package/dist/components/chat/mermaid-viewer.d.ts.map +1 -1
- package/dist/components/chat/mermaid-viewer.js +3 -1
- package/dist/components/chat/mermaid-viewer.js.map +1 -1
- package/dist/components/chat/message-bubble.d.ts +8 -1
- package/dist/components/chat/message-bubble.d.ts.map +1 -1
- package/dist/components/chat/message-bubble.js +53 -24
- package/dist/components/chat/message-bubble.js.map +1 -1
- package/dist/components/chat/message-share.d.ts +2 -1
- package/dist/components/chat/message-share.d.ts.map +1 -1
- package/dist/components/chat/message-share.js +6 -7
- package/dist/components/chat/message-share.js.map +1 -1
- package/dist/components/chat/renderers/bind.d.ts +39 -0
- package/dist/components/chat/renderers/bind.d.ts.map +1 -0
- package/dist/components/chat/renderers/bind.js +43 -0
- package/dist/components/chat/renderers/bind.js.map +1 -0
- package/dist/components/chat/renderers/brain-ui-tools.d.ts +3 -0
- package/dist/components/chat/renderers/brain-ui-tools.d.ts.map +1 -0
- package/dist/components/chat/renderers/brain-ui-tools.js +41 -0
- package/dist/components/chat/renderers/brain-ui-tools.js.map +1 -0
- package/dist/components/chat/renderers/claude-tools.d.ts.map +1 -1
- package/dist/components/chat/renderers/claude-tools.js +3 -2
- package/dist/components/chat/renderers/claude-tools.js.map +1 -1
- package/dist/components/chat/renderers/index.d.ts +10 -2
- package/dist/components/chat/renderers/index.d.ts.map +1 -1
- package/dist/components/chat/renderers/index.js +15 -10
- package/dist/components/chat/renderers/index.js.map +1 -1
- package/dist/components/chat/session-drawer.d.ts +4 -0
- package/dist/components/chat/session-drawer.d.ts.map +1 -1
- package/dist/components/chat/session-drawer.js +32 -32
- package/dist/components/chat/session-drawer.js.map +1 -1
- package/dist/components/chat/session-list.d.ts +41 -0
- package/dist/components/chat/session-list.d.ts.map +1 -0
- package/dist/components/chat/session-list.js +10 -0
- package/dist/components/chat/session-list.js.map +1 -0
- package/dist/components/chat/share-block.d.ts.map +1 -1
- package/dist/components/chat/share-block.js +12 -11
- package/dist/components/chat/share-block.js.map +1 -1
- package/dist/components/chat/share-card.js +2 -2
- package/dist/components/chat/share-card.js.map +1 -1
- package/dist/components/chat/subagent-view.js +1 -1
- package/dist/components/chat/subagent-view.js.map +1 -1
- package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
- package/dist/components/chat/tool-call-timeline.js +45 -14
- package/dist/components/chat/tool-call-timeline.js.map +1 -1
- package/dist/components/chat/tool-cards/block-card.d.ts +28 -0
- package/dist/components/chat/tool-cards/block-card.d.ts.map +1 -0
- package/dist/components/chat/tool-cards/block-card.js +103 -0
- package/dist/components/chat/tool-cards/block-card.js.map +1 -0
- package/dist/components/chat/tool-cards/image-mask-card.d.ts +70 -0
- package/dist/components/chat/tool-cards/image-mask-card.d.ts.map +1 -0
- package/dist/components/chat/tool-cards/image-mask-card.js +142 -0
- package/dist/components/chat/tool-cards/image-mask-card.js.map +1 -0
- package/dist/components/chat/tool-cards/location-card.d.ts +45 -0
- package/dist/components/chat/tool-cards/location-card.d.ts.map +1 -0
- package/dist/components/chat/tool-cards/location-card.js +128 -0
- package/dist/components/chat/tool-cards/location-card.js.map +1 -0
- package/dist/components/chat/tool-views.d.ts +19 -2
- package/dist/components/chat/tool-views.d.ts.map +1 -1
- package/dist/components/chat/tool-views.js +28 -22
- package/dist/components/chat/tool-views.js.map +1 -1
- package/dist/components/chat/transcript-turn.d.ts +45 -0
- package/dist/components/chat/transcript-turn.d.ts.map +1 -0
- package/dist/components/chat/transcript-turn.js +25 -0
- package/dist/components/chat/transcript-turn.js.map +1 -0
- package/dist/components/chat/use-chat-commands.d.ts.map +1 -1
- package/dist/components/chat/use-chat-commands.js +13 -16
- package/dist/components/chat/use-chat-commands.js.map +1 -1
- package/dist/components/chat/welcome-state.d.ts +7 -0
- package/dist/components/chat/welcome-state.d.ts.map +1 -1
- package/dist/components/chat/welcome-state.js +13 -5
- package/dist/components/chat/welcome-state.js.map +1 -1
- package/dist/components/connectivity/connection-gate.d.ts.map +1 -1
- package/dist/components/connectivity/connection-gate.js +27 -21
- package/dist/components/connectivity/connection-gate.js.map +1 -1
- package/dist/components/connectivity/login-form.d.ts +31 -0
- package/dist/components/connectivity/login-form.d.ts.map +1 -0
- package/dist/components/connectivity/login-form.js +19 -0
- package/dist/components/connectivity/login-form.js.map +1 -0
- package/dist/components/connectivity/login-screen.d.ts +5 -2
- package/dist/components/connectivity/login-screen.d.ts.map +1 -1
- package/dist/components/connectivity/login-screen.js +41 -31
- package/dist/components/connectivity/login-screen.js.map +1 -1
- package/dist/components/dev/share-harness.js +1 -1
- package/dist/components/dev/share-harness.js.map +1 -1
- package/dist/components/files/file-panel.d.ts +1 -1
- package/dist/components/files/file-panel.d.ts.map +1 -1
- package/dist/components/files/file-panel.js +74 -0
- package/dist/components/files/file-panel.js.map +1 -1
- package/dist/components/files/file-tree-view.d.ts +45 -0
- package/dist/components/files/file-tree-view.d.ts.map +1 -0
- package/dist/components/files/file-tree-view.js +51 -0
- package/dist/components/files/file-tree-view.js.map +1 -0
- package/dist/components/files/file-tree.d.ts +6 -0
- package/dist/components/files/file-tree.d.ts.map +1 -1
- package/dist/components/files/file-tree.js +39 -43
- package/dist/components/files/file-tree.js.map +1 -1
- package/dist/components/files/file-viewer-binary.d.ts.map +1 -1
- package/dist/components/files/file-viewer-binary.js +3 -2
- package/dist/components/files/file-viewer-binary.js.map +1 -1
- package/dist/components/files/file-viewer-frame.d.ts +36 -0
- package/dist/components/files/file-viewer-frame.d.ts.map +1 -0
- package/dist/components/files/file-viewer-frame.js +26 -0
- package/dist/components/files/file-viewer-frame.js.map +1 -0
- package/dist/components/files/file-viewer.d.ts +5 -0
- package/dist/components/files/file-viewer.d.ts.map +1 -1
- package/dist/components/files/file-viewer.js +26 -32
- package/dist/components/files/file-viewer.js.map +1 -1
- package/dist/components/files/frontmatter-chips.d.ts +18 -0
- package/dist/components/files/frontmatter-chips.d.ts.map +1 -0
- package/dist/components/files/frontmatter-chips.js +11 -0
- package/dist/components/files/frontmatter-chips.js.map +1 -0
- package/dist/components/files/frontmatter-panel.d.ts +5 -1
- package/dist/components/files/frontmatter-panel.d.ts.map +1 -1
- package/dist/components/files/frontmatter-panel.js +7 -6
- package/dist/components/files/frontmatter-panel.js.map +1 -1
- package/dist/components/files/staleness.d.ts +18 -0
- package/dist/components/files/staleness.d.ts.map +1 -0
- package/dist/components/files/staleness.js +27 -0
- package/dist/components/files/staleness.js.map +1 -0
- package/dist/components/graph/graph-canvas.d.ts.map +1 -1
- package/dist/components/graph/graph-canvas.js +24 -1
- package/dist/components/graph/graph-canvas.js.map +1 -1
- package/dist/components/graph/graph-controls-column.d.ts +14 -0
- package/dist/components/graph/graph-controls-column.d.ts.map +1 -0
- package/dist/components/graph/graph-controls-column.js +44 -0
- package/dist/components/graph/graph-controls-column.js.map +1 -0
- package/dist/components/graph/graph-controls.d.ts +20 -5
- package/dist/components/graph/graph-controls.d.ts.map +1 -1
- package/dist/components/graph/graph-controls.js +58 -37
- package/dist/components/graph/graph-controls.js.map +1 -1
- package/dist/components/graph/graph-form.d.ts +82 -0
- package/dist/components/graph/graph-form.d.ts.map +1 -0
- package/dist/components/graph/graph-form.js +69 -0
- package/dist/components/graph/graph-form.js.map +1 -0
- package/dist/components/graph/graph-maintenance.d.ts.map +1 -1
- package/dist/components/graph/graph-maintenance.js +6 -10
- package/dist/components/graph/graph-maintenance.js.map +1 -1
- package/dist/components/graph/graph-node-rail.d.ts +13 -0
- package/dist/components/graph/graph-node-rail.d.ts.map +1 -0
- package/dist/components/graph/graph-node-rail.js +92 -0
- package/dist/components/graph/graph-node-rail.js.map +1 -0
- package/dist/components/graph/graph-page.d.ts +7 -0
- package/dist/components/graph/graph-page.d.ts.map +1 -1
- package/dist/components/graph/graph-page.js +102 -12
- package/dist/components/graph/graph-page.js.map +1 -1
- package/dist/components/graph/graph-scene.d.ts.map +1 -1
- package/dist/components/graph/graph-scene.js +100 -24
- package/dist/components/graph/graph-scene.js.map +1 -1
- package/dist/components/graph/lib/graph-helpers.d.ts +42 -12
- package/dist/components/graph/lib/graph-helpers.d.ts.map +1 -1
- package/dist/components/graph/lib/graph-helpers.js +33 -41
- package/dist/components/graph/lib/graph-helpers.js.map +1 -1
- package/dist/components/graph/node-card.d.ts +28 -0
- package/dist/components/graph/node-card.d.ts.map +1 -0
- package/dist/components/graph/node-card.js +7 -0
- package/dist/components/graph/node-card.js.map +1 -0
- package/dist/components/graph/node-popover.d.ts +6 -2
- package/dist/components/graph/node-popover.d.ts.map +1 -1
- package/dist/components/graph/node-popover.js +13 -31
- package/dist/components/graph/node-popover.js.map +1 -1
- package/dist/components/graph/use-graph-theme.d.ts +32 -4
- package/dist/components/graph/use-graph-theme.d.ts.map +1 -1
- package/dist/components/graph/use-graph-theme.js +44 -32
- package/dist/components/graph/use-graph-theme.js.map +1 -1
- package/dist/components/graph/use-node-actions.d.ts +26 -0
- package/dist/components/graph/use-node-actions.d.ts.map +1 -0
- package/dist/components/graph/use-node-actions.js +54 -0
- package/dist/components/graph/use-node-actions.js.map +1 -0
- package/dist/components/images/image-share.d.ts +2 -1
- package/dist/components/images/image-share.d.ts.map +1 -1
- package/dist/components/images/image-share.js +3 -3
- package/dist/components/images/image-share.js.map +1 -1
- package/dist/components/images/image-viewer.d.ts.map +1 -1
- package/dist/components/images/image-viewer.js +3 -1
- package/dist/components/images/image-viewer.js.map +1 -1
- package/dist/components/images/mask-editor.d.ts.map +1 -1
- package/dist/components/images/mask-editor.js +7 -5
- package/dist/components/images/mask-editor.js.map +1 -1
- package/dist/components/layout/app-shell.d.ts.map +1 -1
- package/dist/components/layout/app-shell.js +4 -1
- package/dist/components/layout/app-shell.js.map +1 -1
- package/dist/components/layout/desktop-palette.d.ts +23 -0
- package/dist/components/layout/desktop-palette.d.ts.map +1 -0
- package/dist/components/layout/desktop-palette.js +132 -0
- package/dist/components/layout/desktop-palette.js.map +1 -0
- package/dist/components/layout/key-cap.d.ts +9 -0
- package/dist/components/layout/key-cap.d.ts.map +1 -0
- package/dist/components/layout/key-cap.js +10 -0
- package/dist/components/layout/key-cap.js.map +1 -0
- package/dist/components/layout/mobile-tab-bar.d.ts +13 -0
- package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -1
- package/dist/components/layout/mobile-tab-bar.js +58 -47
- package/dist/components/layout/mobile-tab-bar.js.map +1 -1
- package/dist/components/layout/shortcut-switch.d.ts +13 -0
- package/dist/components/layout/shortcut-switch.d.ts.map +1 -0
- package/dist/components/layout/shortcut-switch.js +22 -0
- package/dist/components/layout/shortcut-switch.js.map +1 -0
- package/dist/components/layout/side-rail.d.ts +28 -0
- package/dist/components/layout/side-rail.d.ts.map +1 -1
- package/dist/components/layout/side-rail.js +72 -27
- package/dist/components/layout/side-rail.js.map +1 -1
- package/dist/components/layout/slide-panel.d.ts +25 -2
- package/dist/components/layout/slide-panel.d.ts.map +1 -1
- package/dist/components/layout/slide-panel.js +13 -4
- package/dist/components/layout/slide-panel.js.map +1 -1
- package/dist/components/layout/theme.d.ts +22 -0
- package/dist/components/layout/theme.d.ts.map +1 -0
- package/dist/components/layout/theme.js +44 -0
- package/dist/components/layout/theme.js.map +1 -0
- package/dist/components/quick-actions/add-form.d.ts +44 -0
- package/dist/components/quick-actions/add-form.d.ts.map +1 -0
- package/dist/components/quick-actions/add-form.js +32 -0
- package/dist/components/quick-actions/add-form.js.map +1 -0
- package/dist/components/quick-actions/add-modal.d.ts +7 -0
- package/dist/components/quick-actions/add-modal.d.ts.map +1 -1
- package/dist/components/quick-actions/add-modal.js +23 -20
- package/dist/components/quick-actions/add-modal.js.map +1 -1
- package/dist/components/quick-actions/search-modal.d.ts.map +1 -1
- package/dist/components/quick-actions/search-modal.js +8 -5
- package/dist/components/quick-actions/search-modal.js.map +1 -1
- package/dist/components/quick-actions/streaming-modal.d.ts +6 -0
- package/dist/components/quick-actions/streaming-modal.d.ts.map +1 -1
- package/dist/components/quick-actions/streaming-modal.js +53 -18
- package/dist/components/quick-actions/streaming-modal.js.map +1 -1
- package/dist/components/quick-actions/streaming-output.d.ts +38 -0
- package/dist/components/quick-actions/streaming-output.d.ts.map +1 -0
- package/dist/components/quick-actions/streaming-output.js +22 -0
- package/dist/components/quick-actions/streaming-output.js.map +1 -0
- package/dist/components/quick-actions/whatsup-modal.d.ts +5 -0
- package/dist/components/quick-actions/whatsup-modal.d.ts.map +1 -1
- package/dist/components/quick-actions/whatsup-modal.js +51 -10
- package/dist/components/quick-actions/whatsup-modal.js.map +1 -1
- package/dist/components/settings/devices-agents-tab.d.ts +6 -1
- package/dist/components/settings/devices-agents-tab.d.ts.map +1 -1
- package/dist/components/settings/devices-agents-tab.js +55 -20
- package/dist/components/settings/devices-agents-tab.js.map +1 -1
- package/dist/components/settings/models-list.d.ts +39 -0
- package/dist/components/settings/models-list.d.ts.map +1 -0
- package/dist/components/settings/models-list.js +72 -0
- package/dist/components/settings/models-list.js.map +1 -0
- package/dist/components/settings/models-tab.d.ts +4 -0
- package/dist/components/settings/models-tab.d.ts.map +1 -1
- package/dist/components/settings/models-tab.js +52 -102
- package/dist/components/settings/models-tab.js.map +1 -1
- package/dist/components/settings/one-time-agent-credential.js +1 -1
- package/dist/components/settings/one-time-agent-credential.js.map +1 -1
- package/dist/components/settings/passkey-list.d.ts +35 -0
- package/dist/components/settings/passkey-list.d.ts.map +1 -0
- package/dist/components/settings/passkey-list.js +34 -0
- package/dist/components/settings/passkey-list.js.map +1 -0
- package/dist/components/settings/passkey-tab.d.ts +3 -0
- package/dist/components/settings/passkey-tab.d.ts.map +1 -1
- package/dist/components/settings/passkey-tab.js +53 -45
- package/dist/components/settings/passkey-tab.js.map +1 -1
- package/dist/components/settings/pi-accounts-list.d.ts +27 -0
- package/dist/components/settings/pi-accounts-list.d.ts.map +1 -0
- package/dist/components/settings/pi-accounts-list.js +15 -0
- package/dist/components/settings/pi-accounts-list.js.map +1 -0
- package/dist/components/settings/pi-accounts.d.ts +3 -0
- package/dist/components/settings/pi-accounts.d.ts.map +1 -1
- package/dist/components/settings/pi-accounts.js +73 -55
- package/dist/components/settings/pi-accounts.js.map +1 -1
- package/dist/components/settings/principal-list.d.ts +37 -0
- package/dist/components/settings/principal-list.d.ts.map +1 -0
- package/dist/components/settings/principal-list.js +18 -0
- package/dist/components/settings/principal-list.js.map +1 -0
- package/dist/components/settings/settings-panel.d.ts +10 -3
- package/dist/components/settings/settings-panel.d.ts.map +1 -1
- package/dist/components/settings/settings-panel.js +71 -10
- package/dist/components/settings/settings-panel.js.map +1 -1
- package/dist/components/settings/skills-list.d.ts +53 -0
- package/dist/components/settings/skills-list.d.ts.map +1 -0
- package/dist/components/settings/skills-list.js +28 -0
- package/dist/components/settings/skills-list.js.map +1 -0
- package/dist/components/settings/skills-tab.d.ts.map +1 -1
- package/dist/components/settings/skills-tab.js +65 -38
- package/dist/components/settings/skills-tab.js.map +1 -1
- package/dist/components/settings/tool-permissions-list.d.ts +18 -0
- package/dist/components/settings/tool-permissions-list.d.ts.map +1 -0
- package/dist/components/settings/tool-permissions-list.js +6 -0
- package/dist/components/settings/tool-permissions-list.js.map +1 -0
- package/dist/components/settings/tool-permissions.d.ts +2 -1
- package/dist/components/settings/tool-permissions.d.ts.map +1 -1
- package/dist/components/settings/tool-permissions.js +33 -16
- package/dist/components/settings/tool-permissions.js.map +1 -1
- package/dist/components/settings/web-search-chain.d.ts +41 -0
- package/dist/components/settings/web-search-chain.d.ts.map +1 -0
- package/dist/components/settings/web-search-chain.js +47 -0
- package/dist/components/settings/web-search-chain.js.map +1 -0
- package/dist/components/settings/web-search-settings.d.ts +4 -7
- package/dist/components/settings/web-search-settings.d.ts.map +1 -1
- package/dist/components/settings/web-search-settings.js +54 -76
- package/dist/components/settings/web-search-settings.js.map +1 -1
- package/dist/components/share/share-menu.d.ts.map +1 -1
- package/dist/components/share/share-menu.js +24 -4
- package/dist/components/share/share-menu.js.map +1 -1
- package/dist/components/voice/dictation-sheet.js +3 -3
- package/dist/components/voice/dictation-sheet.js.map +1 -1
- package/dist/components/voice/mic-button.js +1 -1
- package/dist/components/voice/mic-button.js.map +1 -1
- package/dist/components/voice/review-card.js +1 -1
- package/dist/components/voice/review-card.js.map +1 -1
- package/dist/config.d.ts +5 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -5
- package/dist/config.js.map +1 -1
- package/dist/connection.d.ts +12 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +421 -0
- package/dist/connection.js.map +1 -0
- package/dist/default-root.d.ts +3 -0
- package/dist/default-root.d.ts.map +1 -0
- package/dist/default-root.js +16 -0
- package/dist/default-root.js.map +1 -0
- package/dist/hooks/use-color-scheme.d.ts +14 -0
- package/dist/hooks/use-color-scheme.d.ts.map +1 -0
- package/dist/hooks/use-color-scheme.js +37 -0
- package/dist/hooks/use-color-scheme.js.map +1 -0
- package/dist/hooks/use-fine-pointer.d.ts +12 -0
- package/dist/hooks/use-fine-pointer.d.ts.map +1 -0
- package/dist/hooks/use-fine-pointer.js +15 -0
- package/dist/hooks/use-fine-pointer.js.map +1 -0
- package/dist/hooks/use-hash-routes.d.ts.map +1 -1
- package/dist/hooks/use-hash-routes.js +4 -2
- package/dist/hooks/use-hash-routes.js.map +1 -1
- package/dist/hooks/use-media-query.d.ts +9 -0
- package/dist/hooks/use-media-query.d.ts.map +1 -0
- package/dist/hooks/use-media-query.js +38 -0
- package/dist/hooks/use-media-query.js.map +1 -0
- package/dist/hooks/use-share-intake.d.ts.map +1 -1
- package/dist/hooks/use-share-intake.js +37 -12
- package/dist/hooks/use-share-intake.js.map +1 -1
- package/dist/hooks/use-vpn-status.d.ts.map +1 -1
- package/dist/hooks/use-vpn-status.js +17 -18
- package/dist/hooks/use-vpn-status.js.map +1 -1
- package/dist/hooks/use-websocket.d.ts +5 -24
- package/dist/hooks/use-websocket.d.ts.map +1 -1
- package/dist/hooks/use-websocket.js +11 -384
- package/dist/hooks/use-websocket.js.map +1 -1
- package/dist/hooks/websocket-handlers/activity.d.ts +2 -2
- package/dist/hooks/websocket-handlers/activity.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/activity.js +4 -5
- package/dist/hooks/websocket-handlers/activity.js.map +1 -1
- package/dist/hooks/websocket-handlers/chat.d.ts +1 -0
- package/dist/hooks/websocket-handlers/chat.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/chat.js +28 -6
- package/dist/hooks/websocket-handlers/chat.js.map +1 -1
- package/dist/hooks/websocket-handlers/connection.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/connection.js +4 -6
- package/dist/hooks/websocket-handlers/connection.js.map +1 -1
- package/dist/hooks/websocket-handlers/mask.d.ts +1 -1
- package/dist/hooks/websocket-handlers/mask.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/mask.js +2 -3
- package/dist/hooks/websocket-handlers/mask.js.map +1 -1
- package/dist/hooks/websocket-handlers/provider.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/provider.js +4 -6
- package/dist/hooks/websocket-handlers/provider.js.map +1 -1
- package/dist/hooks/websocket-handlers/types.d.ts +6 -2
- package/dist/hooks/websocket-handlers/types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +289 -0
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +243 -224
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/backend.d.ts +19 -2
- package/dist/lib/backend.d.ts.map +1 -1
- package/dist/lib/backend.js +15 -9
- package/dist/lib/backend.js.map +1 -1
- package/dist/lib/diff.d.ts +8 -10
- package/dist/lib/diff.d.ts.map +1 -1
- package/dist/lib/diff.js +26 -53
- package/dist/lib/diff.js.map +1 -1
- package/dist/lib/light-dark.d.ts +37 -0
- package/dist/lib/light-dark.d.ts.map +1 -0
- package/dist/lib/light-dark.js +83 -0
- package/dist/lib/light-dark.js.map +1 -0
- package/dist/lib/mermaid-theme.d.ts +7 -2
- package/dist/lib/mermaid-theme.d.ts.map +1 -1
- package/dist/lib/mermaid-theme.js +125 -203
- package/dist/lib/mermaid-theme.js.map +1 -1
- package/dist/lib/passkeys.d.ts +6 -3
- package/dist/lib/passkeys.d.ts.map +1 -1
- package/dist/lib/passkeys.js +10 -4
- package/dist/lib/passkeys.js.map +1 -1
- package/dist/lib/push-registration.d.ts +4 -1
- package/dist/lib/push-registration.d.ts.map +1 -1
- package/dist/lib/push-registration.js +20 -2
- package/dist/lib/push-registration.js.map +1 -1
- package/dist/lib/share-intake.d.ts +2 -1
- package/dist/lib/share-intake.d.ts.map +1 -1
- package/dist/lib/share-intake.js +3 -3
- package/dist/lib/share-intake.js.map +1 -1
- package/dist/lib/share.d.ts +4 -3
- package/dist/lib/share.d.ts.map +1 -1
- package/dist/lib/share.js +6 -7
- package/dist/lib/share.js.map +1 -1
- package/dist/lib/single-key.d.ts +30 -0
- package/dist/lib/single-key.d.ts.map +1 -0
- package/dist/lib/single-key.js +45 -0
- package/dist/lib/single-key.js.map +1 -0
- package/dist/lib/tool-names.d.ts +8 -6
- package/dist/lib/tool-names.d.ts.map +1 -1
- package/dist/lib/tool-names.js +17 -7
- package/dist/lib/tool-names.js.map +1 -1
- package/dist/root-context.d.ts +229 -0
- package/dist/root-context.d.ts.map +1 -0
- package/dist/root-context.js +33 -0
- package/dist/root-context.js.map +1 -0
- package/dist/root.d.ts +38 -0
- package/dist/root.d.ts.map +1 -0
- package/dist/root.js +47 -0
- package/dist/root.js.map +1 -0
- package/dist/stores/activity-state.d.ts +29 -0
- package/dist/stores/activity-state.d.ts.map +1 -0
- package/dist/stores/activity-state.js +282 -0
- package/dist/stores/activity-state.js.map +1 -0
- package/dist/stores/activity-store.d.ts +10 -41
- package/dist/stores/activity-store.d.ts.map +1 -1
- package/dist/stores/activity-store.js +9 -271
- package/dist/stores/activity-store.js.map +1 -1
- package/dist/stores/chat-state.d.ts +233 -0
- package/dist/stores/chat-state.d.ts.map +1 -0
- package/dist/stores/chat-state.js +477 -0
- package/dist/stores/chat-state.js.map +1 -0
- package/dist/stores/chat-store.d.ts +4 -162
- package/dist/stores/chat-store.d.ts.map +1 -1
- package/dist/stores/chat-store.js +7 -418
- package/dist/stores/chat-store.js.map +1 -1
- package/dist/stores/connection-state.d.ts +40 -0
- package/dist/stores/connection-state.d.ts.map +1 -0
- package/dist/stores/connection-state.js +30 -0
- package/dist/stores/connection-state.js.map +1 -0
- package/dist/stores/connection-store.d.ts +4 -40
- package/dist/stores/connection-store.d.ts.map +1 -1
- package/dist/stores/connection-store.js +7 -27
- package/dist/stores/connection-store.js.map +1 -1
- package/dist/stores/create-stores.d.ts +23 -0
- package/dist/stores/create-stores.d.ts.map +1 -0
- package/dist/stores/create-stores.js +28 -0
- package/dist/stores/create-stores.js.map +1 -0
- package/dist/stores/file-state.d.ts +53 -0
- package/dist/stores/file-state.d.ts.map +1 -0
- package/dist/stores/file-state.js +341 -0
- package/dist/stores/file-state.js.map +1 -0
- package/dist/stores/file-store.d.ts +4 -52
- package/dist/stores/file-store.d.ts.map +1 -1
- package/dist/stores/file-store.js +7 -336
- package/dist/stores/file-store.js.map +1 -1
- package/dist/stores/graph-state.d.ts +95 -0
- package/dist/stores/graph-state.d.ts.map +1 -0
- package/dist/stores/graph-state.js +252 -0
- package/dist/stores/graph-state.js.map +1 -0
- package/dist/stores/graph-store.d.ts +7 -83
- package/dist/stores/graph-store.d.ts.map +1 -1
- package/dist/stores/graph-store.js +8 -249
- package/dist/stores/graph-store.js.map +1 -1
- package/dist/stores/mask-state.d.ts +21 -0
- package/dist/stores/mask-state.d.ts.map +1 -0
- package/dist/stores/mask-state.js +9 -0
- package/dist/stores/mask-state.js.map +1 -0
- package/dist/stores/mask-store.d.ts +4 -21
- package/dist/stores/mask-store.d.ts.map +1 -1
- package/dist/stores/mask-store.js +7 -6
- package/dist/stores/mask-store.js.map +1 -1
- package/dist/stores/principal-state.d.ts +16 -0
- package/dist/stores/principal-state.d.ts.map +1 -0
- package/dist/stores/principal-state.js +31 -0
- package/dist/stores/principal-state.js.map +1 -0
- package/dist/stores/principal-store.d.ts +4 -15
- package/dist/stores/principal-store.d.ts.map +1 -1
- package/dist/stores/principal-store.js +7 -28
- package/dist/stores/principal-store.js.map +1 -1
- package/dist/stores/provider-state.d.ts +24 -0
- package/dist/stores/provider-state.d.ts.map +1 -0
- package/dist/stores/provider-state.js +68 -0
- package/dist/stores/provider-state.js.map +1 -0
- package/dist/stores/provider-store.d.ts +4 -23
- package/dist/stores/provider-store.d.ts.map +1 -1
- package/dist/stores/provider-store.js +7 -64
- package/dist/stores/provider-store.js.map +1 -1
- package/dist/stores/share-state.d.ts +29 -0
- package/dist/stores/share-state.d.ts.map +1 -0
- package/dist/stores/share-state.js +21 -0
- package/dist/stores/share-state.js.map +1 -0
- package/dist/stores/share-store.d.ts +4 -28
- package/dist/stores/share-store.d.ts.map +1 -1
- package/dist/stores/share-store.js +7 -18
- package/dist/stores/share-store.js.map +1 -1
- package/dist/stores/store-environment.d.ts +10 -0
- package/dist/stores/store-environment.d.ts.map +1 -0
- package/dist/stores/store-environment.js +2 -0
- package/dist/stores/store-environment.js.map +1 -0
- package/dist/stores/ui-state.d.ts +71 -0
- package/dist/stores/ui-state.d.ts.map +1 -0
- package/dist/stores/ui-state.js +58 -0
- package/dist/stores/ui-state.js.map +1 -0
- package/dist/stores/ui-store.d.ts +4 -45
- package/dist/stores/ui-store.d.ts.map +1 -1
- package/dist/stores/ui-store.js +7 -36
- package/dist/stores/ui-store.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme.css +150 -97
- package/dist/voice/asr-clients.d.ts +2 -1
- package/dist/voice/asr-clients.d.ts.map +1 -1
- package/dist/voice/asr-clients.js +16 -17
- package/dist/voice/asr-clients.js.map +1 -1
- package/dist/voice/use-dictation.d.ts.map +1 -1
- package/dist/voice/use-dictation.js +12 -8
- package/dist/voice/use-dictation.js.map +1 -1
- package/dist/voice/voice-state.d.ts +25 -0
- package/dist/voice/voice-state.d.ts.map +1 -0
- package/dist/voice/voice-state.js +29 -0
- package/dist/voice/voice-state.js.map +1 -0
- package/dist/voice/voice-store.d.ts +4 -25
- package/dist/voice/voice-store.d.ts.map +1 -1
- package/dist/voice/voice-store.js +7 -26
- package/dist/voice/voice-store.js.map +1 -1
- package/package.json +3 -2
- package/src/components/activity/activity-page.tsx +341 -160
- package/src/components/activity/activity-run-detail.tsx +81 -47
- package/src/components/activity/activity-run-list.tsx +27 -59
- package/src/components/activity/activity-views.tsx +155 -0
- package/src/components/activity/approval-card.tsx +117 -0
- package/src/components/activity/digest-card.tsx +25 -61
- package/src/components/activity/digest-summary.tsx +52 -0
- package/src/components/activity/push-switch.tsx +62 -0
- package/src/components/activity/push-toggle.tsx +51 -81
- package/src/components/activity/span-bits.tsx +60 -7
- package/src/components/chat/ask-user-card.tsx +292 -356
- package/src/components/chat/ask-user-typed.ts +77 -0
- package/src/components/chat/brain-markdown-links.tsx +4 -4
- package/src/components/chat/brain-markdown.tsx +4 -2
- package/src/components/chat/chat-page.tsx +41 -11
- package/src/components/chat/composer-view.tsx +194 -0
- package/src/components/chat/composer.tsx +117 -296
- package/src/components/chat/markdown-content.tsx +53 -2
- package/src/components/chat/mermaid-block.tsx +13 -5
- package/src/components/chat/mermaid-share.ts +8 -7
- package/src/components/chat/mermaid-viewer.tsx +3 -1
- package/src/components/chat/message-bubble.tsx +78 -94
- package/src/components/chat/message-share.ts +7 -7
- package/src/components/chat/renderers/bind.tsx +94 -0
- package/src/components/chat/renderers/brain-ui-tools.tsx +56 -0
- package/src/components/chat/renderers/claude-tools.tsx +3 -2
- package/src/components/chat/renderers/index.ts +15 -10
- package/src/components/chat/session-drawer.tsx +41 -138
- package/src/components/chat/session-list.tsx +113 -0
- package/src/components/chat/share-block.tsx +16 -12
- package/src/components/chat/share-card.tsx +2 -2
- package/src/components/chat/subagent-view.tsx +4 -4
- package/src/components/chat/tool-call-timeline.tsx +75 -26
- package/src/components/chat/tool-cards/block-card.tsx +145 -0
- package/src/components/chat/tool-cards/image-mask-card.tsx +214 -0
- package/src/components/chat/tool-cards/location-card.tsx +159 -0
- package/src/components/chat/tool-views.tsx +30 -60
- package/src/components/chat/transcript-turn.tsx +108 -0
- package/src/components/chat/use-chat-commands.ts +14 -16
- package/src/components/chat/welcome-state.tsx +36 -91
- package/src/components/connectivity/connection-gate.tsx +32 -24
- package/src/components/connectivity/login-form.tsx +122 -0
- package/src/components/connectivity/login-screen.tsx +45 -100
- package/src/components/dev/share-harness.tsx +2 -2
- package/src/components/files/file-panel.tsx +168 -0
- package/src/components/files/file-tree-view.tsx +127 -0
- package/src/components/files/file-tree.tsx +55 -109
- package/src/components/files/file-viewer-binary.tsx +3 -2
- package/src/components/files/file-viewer-frame.tsx +113 -0
- package/src/components/files/file-viewer.tsx +40 -95
- package/src/components/files/frontmatter-chips.tsx +42 -0
- package/src/components/files/frontmatter-panel.tsx +6 -71
- package/src/components/files/staleness.ts +29 -0
- package/src/components/graph/graph-canvas.tsx +24 -1
- package/src/components/graph/graph-controls-column.tsx +92 -0
- package/src/components/graph/graph-controls.tsx +83 -127
- package/src/components/graph/graph-form.tsx +183 -0
- package/src/components/graph/graph-maintenance.tsx +9 -14
- package/src/components/graph/graph-node-rail.tsx +147 -0
- package/src/components/graph/graph-page.tsx +189 -49
- package/src/components/graph/graph-scene.tsx +200 -30
- package/src/components/graph/lib/graph-helpers.ts +65 -43
- package/src/components/graph/node-card.tsx +64 -0
- package/src/components/graph/node-popover.tsx +28 -117
- package/src/components/graph/use-graph-theme.ts +69 -32
- package/src/components/graph/use-node-actions.ts +56 -0
- package/src/components/images/image-share.ts +4 -2
- package/src/components/images/image-viewer.tsx +3 -1
- package/src/components/images/mask-editor.tsx +7 -4
- package/src/components/layout/app-shell.tsx +5 -1
- package/src/components/layout/desktop-palette.tsx +151 -0
- package/src/components/layout/key-cap.tsx +15 -0
- package/src/components/layout/mobile-tab-bar.tsx +80 -157
- package/src/components/layout/shortcut-switch.tsx +32 -0
- package/src/components/layout/side-rail.tsx +77 -150
- package/src/components/layout/slide-panel.tsx +49 -6
- package/src/components/layout/theme.tsx +67 -0
- package/src/components/quick-actions/add-form.tsx +196 -0
- package/src/components/quick-actions/add-modal.tsx +32 -153
- package/src/components/quick-actions/search-modal.tsx +15 -5
- package/src/components/quick-actions/streaming-modal.tsx +57 -72
- package/src/components/quick-actions/streaming-output.tsx +112 -0
- package/src/components/quick-actions/whatsup-modal.tsx +53 -59
- package/src/components/settings/devices-agents-tab.tsx +60 -152
- package/src/components/settings/models-list.tsx +299 -0
- package/src/components/settings/models-tab.tsx +63 -337
- package/src/components/settings/one-time-agent-credential.tsx +1 -1
- package/src/components/settings/passkey-list.tsx +201 -0
- package/src/components/settings/passkey-tab.tsx +53 -197
- package/src/components/settings/pi-accounts-list.tsx +128 -0
- package/src/components/settings/pi-accounts.tsx +71 -170
- package/src/components/settings/principal-list.tsx +172 -0
- package/src/components/settings/settings-panel.tsx +239 -25
- package/src/components/settings/skills-list.tsx +276 -0
- package/src/components/settings/skills-tab.tsx +82 -269
- package/src/components/settings/tool-permissions-list.tsx +54 -0
- package/src/components/settings/tool-permissions.tsx +27 -46
- package/src/components/settings/web-search-chain.tsx +300 -0
- package/src/components/settings/web-search-settings.tsx +58 -328
- package/src/components/share/share-menu.tsx +19 -4
- package/src/components/voice/dictation-sheet.tsx +5 -5
- package/src/components/voice/mic-button.tsx +1 -1
- package/src/components/voice/review-card.tsx +1 -1
- package/src/config.ts +21 -7
- package/src/connection.ts +443 -0
- package/src/default-root.ts +16 -0
- package/src/hooks/use-color-scheme.ts +36 -0
- package/src/hooks/use-fine-pointer.ts +15 -0
- package/src/hooks/use-hash-routes.ts +4 -2
- package/src/hooks/use-media-query.ts +35 -0
- package/src/hooks/use-share-intake.ts +32 -12
- package/src/hooks/use-vpn-status.ts +18 -17
- package/src/hooks/use-websocket.ts +12 -428
- package/src/hooks/websocket-handlers/activity.ts +4 -5
- package/src/hooks/websocket-handlers/chat.ts +28 -6
- package/src/hooks/websocket-handlers/connection.ts +4 -6
- package/src/hooks/websocket-handlers/mask.ts +2 -3
- package/src/hooks/websocket-handlers/provider.ts +4 -6
- package/src/hooks/websocket-handlers/types.ts +6 -2
- package/src/index.ts +7 -3
- package/src/lib/api-client.ts +426 -384
- package/src/lib/backend.ts +20 -10
- package/src/lib/diff.ts +28 -62
- package/src/lib/light-dark.ts +83 -0
- package/src/lib/mermaid-theme.ts +183 -214
- package/src/lib/passkeys.ts +12 -4
- package/src/lib/push-registration.ts +19 -2
- package/src/lib/share-intake.ts +6 -3
- package/src/lib/share.ts +7 -4
- package/src/lib/single-key.ts +47 -0
- package/src/lib/tool-names.ts +31 -8
- package/src/root-context.tsx +40 -0
- package/src/root.ts +83 -0
- package/src/stores/activity-state.ts +295 -0
- package/src/stores/activity-store.ts +11 -285
- package/src/stores/chat-state.ts +822 -0
- package/src/stores/chat-store.ts +11 -705
- package/src/stores/connection-state.ts +78 -0
- package/src/stores/connection-store.ts +11 -76
- package/src/stores/create-stores.ts +31 -0
- package/src/stores/file-state.ts +399 -0
- package/src/stores/file-store.ts +9 -390
- package/src/stores/graph-state.ts +368 -0
- package/src/stores/graph-store.ts +10 -355
- package/src/stores/mask-state.ts +30 -0
- package/src/stores/mask-store.ts +10 -27
- package/src/stores/principal-state.ts +42 -0
- package/src/stores/principal-store.ts +10 -37
- package/src/stores/provider-state.ts +103 -0
- package/src/stores/provider-store.ts +10 -95
- package/src/stores/share-state.ts +56 -0
- package/src/stores/share-store.ts +11 -54
- package/src/stores/store-environment.ts +10 -0
- package/src/stores/ui-state.ts +143 -0
- package/src/stores/ui-store.ts +11 -93
- package/src/styles.css +4 -1
- package/src/theme.css +150 -97
- package/src/voice/asr-clients.ts +17 -17
- package/src/voice/use-dictation.ts +11 -8
- package/src/voice/voice-state.ts +57 -0
- package/src/voice/voice-store.ts +11 -55
|
@@ -1,40 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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 {
|
|
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
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
|
|
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
|
-
|
|
158
|
-
|
|
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
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
204
|
-
<
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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={() =>
|
|
212
|
-
className="
|
|
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
|
-
|
|
294
|
+
<AlertTriangle className="h-3.5 w-3.5" />
|
|
295
|
+
<span className="hidden text-[10px] sm:inline">Pricing stale</span>
|
|
215
296
|
</button>
|
|
216
|
-
|
|
217
|
-
<
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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={
|
|
251
|
-
className="
|
|
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
|
-
|
|
259
|
-
|
|
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
|
-
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
-
</
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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
|
-
</
|
|
296
|
-
|
|
476
|
+
</aside>
|
|
477
|
+
)}
|
|
297
478
|
</div>
|
|
298
479
|
);
|
|
299
480
|
}
|