@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,17 +1,24 @@
|
|
|
1
|
-
import { jsx as _jsx
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
3
|
-
import {
|
|
4
|
-
import { api } from "../../lib/api-client.js";
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
import { useBrainApi } from "../../root-context.js";
|
|
5
4
|
import { formatRelativeTime } from "../../lib/format-time.js";
|
|
6
|
-
import { cn } from "../../lib/utils.js";
|
|
7
5
|
import { usePrincipalStore } from "../../stores/principal-store.js";
|
|
6
|
+
import { PrincipalList } from "./principal-list.js";
|
|
8
7
|
const MAX_LABEL_LENGTH = 64;
|
|
9
8
|
const NOT_ENABLED = "Principal management is not enabled";
|
|
10
9
|
function displayLabel(label) {
|
|
11
10
|
return Array.from(label).slice(0, MAX_LABEL_LENGTH).join("");
|
|
12
11
|
}
|
|
13
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* Active devices and delegated agents, with owner-only mint and revoke
|
|
14
|
+
* controls. This is the container (S7): the principals request, the mint
|
|
15
|
+
* through the principal store and the revoke with its confirm live here;
|
|
16
|
+
* `PrincipalList` draws the list and the form on the kit.
|
|
17
|
+
*/
|
|
14
18
|
export function DevicesAgentsTab({ active }) {
|
|
19
|
+
const api = useBrainApi();
|
|
20
|
+
const lifetime = useRef(0);
|
|
21
|
+
const request = useRef(0);
|
|
15
22
|
const [principals, setPrincipals] = useState([]);
|
|
16
23
|
const [loading, setLoading] = useState(false);
|
|
17
24
|
const [enabled, setEnabled] = useState(true);
|
|
@@ -23,16 +30,23 @@ export function DevicesAgentsTab({ active }) {
|
|
|
23
30
|
const mintError = usePrincipalStore((state) => state.mintError);
|
|
24
31
|
const oneTimeCredential = usePrincipalStore((state) => state.oneTimeCredential);
|
|
25
32
|
const mintAgent = usePrincipalStore((state) => state.mintAgent);
|
|
26
|
-
|
|
33
|
+
const refresh = useCallback(async () => {
|
|
34
|
+
const generation = lifetime.current;
|
|
35
|
+
const token = ++request.current;
|
|
36
|
+
const current = () => generation === lifetime.current && token === request.current;
|
|
27
37
|
setLoading(true);
|
|
28
38
|
setLoadFailed(false);
|
|
29
39
|
setError(null);
|
|
30
40
|
try {
|
|
31
41
|
const data = await api.principals();
|
|
42
|
+
if (!current())
|
|
43
|
+
return;
|
|
32
44
|
setPrincipals(data.principals);
|
|
33
45
|
setEnabled(true);
|
|
34
46
|
}
|
|
35
47
|
catch (err) {
|
|
48
|
+
if (!current())
|
|
49
|
+
return;
|
|
36
50
|
setPrincipals([]);
|
|
37
51
|
if (err instanceof Error && err.message === NOT_ENABLED) {
|
|
38
52
|
setEnabled(false);
|
|
@@ -44,22 +58,32 @@ export function DevicesAgentsTab({ active }) {
|
|
|
44
58
|
}
|
|
45
59
|
}
|
|
46
60
|
finally {
|
|
47
|
-
|
|
61
|
+
if (current())
|
|
62
|
+
setLoading(false);
|
|
48
63
|
}
|
|
49
|
-
}
|
|
64
|
+
}, [api]);
|
|
50
65
|
useEffect(() => {
|
|
66
|
+
lifetime.current++;
|
|
67
|
+
setPrincipals([]);
|
|
68
|
+
setLoading(false);
|
|
69
|
+
setEnabled(true);
|
|
70
|
+
setLoadFailed(false);
|
|
71
|
+
setError(null);
|
|
72
|
+
setLabel("");
|
|
73
|
+
setTtlDays(7);
|
|
51
74
|
if (active)
|
|
52
75
|
void refresh();
|
|
53
|
-
|
|
76
|
+
const invalidate = () => { lifetime.current++; };
|
|
77
|
+
return invalidate;
|
|
78
|
+
}, [active, refresh]);
|
|
54
79
|
useEffect(() => {
|
|
55
80
|
if (!oneTimeCredential)
|
|
56
81
|
return;
|
|
57
82
|
setLabel("");
|
|
58
83
|
if (active)
|
|
59
84
|
void refresh();
|
|
60
|
-
}, [active, oneTimeCredential]);
|
|
61
|
-
function onMint(
|
|
62
|
-
event.preventDefault();
|
|
85
|
+
}, [active, oneTimeCredential, refresh]);
|
|
86
|
+
function onMint() {
|
|
63
87
|
const trimmed = label.trim();
|
|
64
88
|
if (!trimmed || busy)
|
|
65
89
|
return;
|
|
@@ -74,23 +98,34 @@ export function DevicesAgentsTab({ active }) {
|
|
|
74
98
|
: "That device will be signed out immediately.";
|
|
75
99
|
if (!window.confirm(`${consequence} You can't undo this.`))
|
|
76
100
|
return;
|
|
101
|
+
const generation = lifetime.current;
|
|
77
102
|
setError(null);
|
|
78
103
|
try {
|
|
79
104
|
await api.principalRevoke(principal.id);
|
|
105
|
+
if (generation !== lifetime.current)
|
|
106
|
+
return;
|
|
80
107
|
setPrincipals((rows) => rows.filter((row) => row.id !== principal.id));
|
|
81
108
|
if (principal.is_own)
|
|
82
109
|
window.location.reload();
|
|
83
110
|
}
|
|
84
111
|
catch (err) {
|
|
112
|
+
if (generation !== lifetime.current)
|
|
113
|
+
return;
|
|
85
114
|
setError(err instanceof Error ? err.message : "Could not revoke access");
|
|
86
115
|
}
|
|
87
116
|
}
|
|
88
|
-
return (
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
117
|
+
return (_jsx(PrincipalList, { state: loading ? "loading" : !enabled ? "unavailable" : loadFailed ? "error" : "ready", principals: principals.map((principal) => ({
|
|
118
|
+
id: principal.id,
|
|
119
|
+
label: displayLabel(principal.label),
|
|
120
|
+
kind: principal.kind,
|
|
121
|
+
isOwn: principal.is_own,
|
|
122
|
+
created: formatRelativeTime(principal.created_at),
|
|
123
|
+
lastSeen: principal.last_seen_at ? formatRelativeTime(principal.last_seen_at) : "Never",
|
|
124
|
+
expires: formatRelativeTime(principal.expires_at),
|
|
125
|
+
})), error: error ?? mintError, label: label, ttlDays: ttlDays, minting: busy, onLabel: setLabel, onTtlDays: setTtlDays, onMint: onMint, onRevoke: (id) => {
|
|
126
|
+
const principal = principals.find((row) => row.id === id);
|
|
127
|
+
if (principal)
|
|
128
|
+
void onRevoke(principal);
|
|
129
|
+
} }));
|
|
95
130
|
}
|
|
96
131
|
//# sourceMappingURL=devices-agents-tab.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devices-agents-tab.js","sourceRoot":"","sources":["../../../src/components/settings/devices-agents-tab.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"devices-agents-tab.js","sourceRoot":"","sources":["../../../src/components/settings/devices-agents-tab.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type BillingMode, type ModelCatalogEntry, type ModelCatalogResponse, type ThinkingLevel } from "@schlessera/brain-ui-sdk/protocol";
|
|
2
|
+
import { type ReactNode } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* The Models tab's surface, rendered from props (S7, the `settings`
|
|
5
|
+
* directory). `ModelsTab` is the container: the catalog request, the
|
|
6
|
+
* optimistic commits, their ordering gate and their write queue live there;
|
|
7
|
+
* this draws the roster.
|
|
8
|
+
*
|
|
9
|
+
* The per-row choices stay native `<select>`s with the accessible names the
|
|
10
|
+
* tests read — the kit has no select — and the hide toggle stays a native,
|
|
11
|
+
* titled icon button. A hidden model is no longer faded (design-feedback
|
|
12
|
+
* §4, "no opacity de-emphasis"): it reads as hidden from its chip, at full
|
|
13
|
+
* contrast. Refresh, Add and the section errors are the kit's.
|
|
14
|
+
*/
|
|
15
|
+
export interface ModelsCatalogViewProps {
|
|
16
|
+
catalog: ModelCatalogResponse | null;
|
|
17
|
+
loading: boolean;
|
|
18
|
+
refreshing: boolean;
|
|
19
|
+
error: string | null;
|
|
20
|
+
/** The sections the tab hosts below the roster, rendered by the container. */
|
|
21
|
+
sections: ReactNode;
|
|
22
|
+
onToggleHidden: (entry: ModelCatalogEntry) => void;
|
|
23
|
+
onBilling: (entry: ModelCatalogEntry, next: BillingMode | "auto") => void;
|
|
24
|
+
onThinking: (entry: ModelCatalogEntry, next: ThinkingLevel | "auto") => void;
|
|
25
|
+
onDefault: (next: string | null) => void;
|
|
26
|
+
onCustomModels: (models: string[]) => void;
|
|
27
|
+
onRefresh: () => void;
|
|
28
|
+
}
|
|
29
|
+
export declare function ModelsCatalogView(p: ModelsCatalogViewProps): import("react").JSX.Element;
|
|
30
|
+
/**
|
|
31
|
+
* User-managed OpenRouter models: added and removed here by model id, no env
|
|
32
|
+
* change or redeploy. They appear in the roster above as ordinary profiles
|
|
33
|
+
* (api-billed via OPENROUTER_API_KEY). The draft is the section's own.
|
|
34
|
+
*/
|
|
35
|
+
export declare function OpenRouterSection({ models, onChange }: {
|
|
36
|
+
models: string[];
|
|
37
|
+
onChange: (models: string[]) => void;
|
|
38
|
+
}): import("react").JSX.Element;
|
|
39
|
+
//# sourceMappingURL=models-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-list.d.ts","sourceRoot":"","sources":["../../../src/components/settings/models-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,8EAA8E;IAC9E,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACnD,SAAS,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,KAAK,IAAI,CAAC;IAC1E,UAAU,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7E,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,sBAAsB,+BAsE1D;AAwCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAAE,+BAoDjH"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Callout, Chip, Placeholder } from "@schlessera/brain-ui-kit";
|
|
3
|
+
import { Eye, EyeOff, X } from "lucide-react";
|
|
4
|
+
import { THINKING_LEVELS, } from "@schlessera/brain-ui-sdk/protocol";
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
export function ModelsCatalogView(p) {
|
|
7
|
+
const catalog = p.catalog;
|
|
8
|
+
const visibleCount = catalog?.models.filter((m) => !m.hidden).length ?? 0;
|
|
9
|
+
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex-1 overflow-y-auto p-4", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "The list is read from the provider and refreshes on its own. Hide the ones you never pick \u2014 running sessions are unaffected." }), catalog && _jsx(DefaultModelSelect, { catalog: catalog, onChange: p.onDefault }), p.loading ? (_jsx("div", { className: "mt-4", children: _jsx(Placeholder, { variant: "loading", lines: 4 }) })) : (_jsxs("ul", { className: "mt-4 flex flex-col gap-2", children: [catalog?.models.map((entry) => (_jsx(ModelRow, { entry: entry, onToggle: () => p.onToggleHidden(entry), onBilling: (next) => p.onBilling(entry, next), onThinking: (next) => p.onThinking(entry, next) }, entry.id))), catalog?.models.length === 0 && (_jsx("li", { children: _jsx(Placeholder, { variant: "empty", message: "No models available.", icon: "model" }) }))] })), p.error && (_jsx("div", { role: "alert", className: "mt-3", children: _jsx(Callout, { tone: "red", variant: "banner", icon: "failed", mono: true, text: p.error }) })), catalog?.discovery.error && (_jsx("div", { className: "mt-3", children: _jsx(Callout, { tone: "gold", variant: "banner", icon: "unverified", mono: true, text: `Last refresh failed (${catalog.discovery.error}). Showing the last known list.` }) })), catalog && !catalog.discovery.enabled && (_jsx("p", { className: "mt-3 text-xs text-muted-foreground", children: "Discovery is disabled (BRAIN_UI_MODEL_DISCOVERY). Only configured profiles are listed." })), catalog && _jsx(OpenRouterSection, { models: catalog.customModels ?? [], onChange: p.onCustomModels }), p.sections] }), _jsxs("div", { className: "flex items-center justify-between gap-3 border-t border-border p-4", children: [_jsxs("span", { className: "font-[family-name:var(--font-mono)] text-[11px] text-muted-foreground", children: [visibleCount, " in picker \u00B7 ", formatRefreshed(catalog?.refreshedAt ?? null)] }), _jsx(Button, { label: p.refreshing ? "Refreshing…" : "Refresh", icon: "retry", tone: "ghost", size: "sm", block: false, disabled: p.refreshing, onClick: p.onRefresh })] })] }));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The default-model choice: which profile answers when a turn names none —
|
|
13
|
+
* a fresh device's first conversation, a share filed into the brain, any
|
|
14
|
+
* host-initiated action. "Auto" prefers a connected subscription account
|
|
15
|
+
* (e.g. ChatGPT for the gpt profiles) and falls back to the built-in default.
|
|
16
|
+
*/
|
|
17
|
+
function DefaultModelSelect({ catalog, onChange }) {
|
|
18
|
+
const stored = catalog.defaultModelId ?? null;
|
|
19
|
+
const byId = new Map(catalog.models.map((model) => [model.id, model]));
|
|
20
|
+
const resolved = catalog.resolvedDefaultId ? byId.get(catalog.resolvedDefaultId) : undefined;
|
|
21
|
+
// Offer everything visible, plus a stored default that has since been
|
|
22
|
+
// hidden (dropping it from the list would silently rewrite the choice).
|
|
23
|
+
const options = catalog.models.filter((model) => !model.hidden || model.id === stored);
|
|
24
|
+
return (_jsxs("div", { className: "mt-4 flex items-center gap-3 rounded-lg border border-border-subtle bg-surface p-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm text-foreground", children: "Default model" }), _jsx("p", { className: "text-[11px] text-muted-foreground", children: "Used for new conversations, shares, and actions that don't pick one." })] }), _jsxs("select", { value: stored ?? "auto", onChange: (e) => onChange(e.target.value === "auto" ? null : e.target.value), "aria-label": "Default model", className: "h-8 max-w-[45%] shrink-0 truncate rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !stored && resolved ? `Auto (${resolved.label})` : "Auto" }), options.map((model) => (_jsx("option", { value: model.id, children: model.label }, model.id)))] })] }));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* User-managed OpenRouter models: added and removed here by model id, no env
|
|
28
|
+
* change or redeploy. They appear in the roster above as ordinary profiles
|
|
29
|
+
* (api-billed via OPENROUTER_API_KEY). The draft is the section's own.
|
|
30
|
+
*/
|
|
31
|
+
export function OpenRouterSection({ models, onChange }) {
|
|
32
|
+
const [draft, setDraft] = useState("");
|
|
33
|
+
function add() {
|
|
34
|
+
const id = draft.trim();
|
|
35
|
+
if (!id || models.includes(id))
|
|
36
|
+
return;
|
|
37
|
+
onChange([...models, id]);
|
|
38
|
+
setDraft("");
|
|
39
|
+
}
|
|
40
|
+
return (_jsxs("div", { className: "mt-6", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "OpenRouter models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Add any OpenRouter model by its id (needs OPENROUTER_API_KEY on the server). Added models join the list above." }), models.length > 0 && (_jsx("ul", { className: "mt-3 flex flex-col gap-1.5", children: models.map((model) => (_jsxs("li", { className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-surface px-3 py-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate font-[family-name:var(--font-mono)] text-xs text-foreground", children: model }), _jsx("button", { type: "button", onClick: () => onChange(models.filter((m) => m !== model)), title: `Remove ${model}`, "aria-label": `Remove ${model}`, className: "flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-surface-raised hover:text-destructive", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] }, model))) })), _jsxs("div", { className: "mt-3 flex items-center gap-2", children: [_jsx("input", { value: draft, onChange: (e) => setDraft(e.target.value), onKeyDown: (e) => {
|
|
41
|
+
if (e.key === "Enter")
|
|
42
|
+
add();
|
|
43
|
+
}, placeholder: "z.ai/glm-5.3-flash", "aria-label": "OpenRouter model id", className: "h-8 min-w-0 flex-1 rounded-lg border border-border-subtle bg-surface px-2 font-[family-name:var(--font-mono)] text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-primary focus:outline-none" }), _jsx(Button, { label: "Add", icon: "add", tone: "ghost", size: "sm", block: false, disabled: !draft.trim(), onClick: add })] })] }));
|
|
44
|
+
}
|
|
45
|
+
function billingLabel(mode) {
|
|
46
|
+
return mode === "api" ? "API" : "Subscription";
|
|
47
|
+
}
|
|
48
|
+
function ModelRow({ entry, onToggle, onBilling, onThinking, }) {
|
|
49
|
+
const Icon = entry.hidden ? EyeOff : Eye;
|
|
50
|
+
return (_jsxs("li", { className: "flex items-center gap-3 rounded-lg border border-border-subtle bg-surface p-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("p", { className: entry.hidden ? "truncate text-sm text-muted-foreground" : "truncate text-sm text-foreground", children: entry.label }), entry.hidden && _jsx(Chip, { label: "hidden", variant: "kv", tone: "neutral" })] }), _jsxs("p", { className: "truncate text-[11px] text-muted-foreground", children: [entry.id, entry.contextWindow ? ` · ${formatTokens(entry.contextWindow)}` : "", entry.source === "declared" ? " · configured" : ""] })] }), entry.thinkingLevel && (_jsxs("select", { value: entry.thinkingOverride ?? "auto", onChange: (e) => onThinking(e.target.value), "aria-label": `Reasoning effort for ${entry.label}`, className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !entry.thinkingOverride ? `Default (${entry.thinkingLevel})` : "Default" }), THINKING_LEVELS.map((level) => (_jsx("option", { value: level, children: level }, level)))] })), _jsxs("select", { value: entry.billingOverride ?? "auto", onChange: (e) => onBilling(e.target.value), "aria-label": `Billing for ${entry.label}`, className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !entry.billingOverride && entry.billingMode ? `Auto (${billingLabel(entry.billingMode).toLowerCase()})` : "Auto" }), _jsx("option", { value: "subscription", children: "Subscription" }), _jsx("option", { value: "api", children: "API" })] }), _jsx("button", { type: "button", onClick: onToggle, title: entry.hidden ? "Show in picker" : "Hide from picker", "aria-label": entry.hidden ? "Show in picker" : "Hide from picker", "aria-pressed": !entry.hidden, className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-surface-raised hover:text-foreground", children: _jsx(Icon, { className: "h-4 w-4" }) })] }));
|
|
51
|
+
}
|
|
52
|
+
function formatTokens(tokens) {
|
|
53
|
+
if (tokens >= 1_000_000)
|
|
54
|
+
return `${tokens / 1_000_000}M context`;
|
|
55
|
+
if (tokens >= 1_000)
|
|
56
|
+
return `${Math.round(tokens / 1_000)}K context`;
|
|
57
|
+
return `${tokens} context`;
|
|
58
|
+
}
|
|
59
|
+
function formatRefreshed(refreshedAt) {
|
|
60
|
+
if (refreshedAt === null)
|
|
61
|
+
return "never refreshed";
|
|
62
|
+
const minutes = Math.round((Date.now() - refreshedAt) / 60_000);
|
|
63
|
+
if (minutes < 1)
|
|
64
|
+
return "refreshed just now";
|
|
65
|
+
if (minutes < 60)
|
|
66
|
+
return `refreshed ${minutes}m ago`;
|
|
67
|
+
const hours = Math.round(minutes / 60);
|
|
68
|
+
if (hours < 24)
|
|
69
|
+
return `refreshed ${hours}h ago`;
|
|
70
|
+
return `refreshed ${Math.round(hours / 24)}d ago`;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=models-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-list.js","sourceRoot":"","sources":["../../../src/components/settings/models-list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@ import { type BillingMode, type ModelCatalogEntry, type ThinkingLevel } from "@s
|
|
|
5
5
|
* The roster comes from the server (Anthropic model discovery plus any
|
|
6
6
|
* host-declared profiles), so this tab never hardcodes model names. Hiding is
|
|
7
7
|
* presentation only — a session already pinned to a hidden model keeps running.
|
|
8
|
+
*
|
|
9
|
+
* This is the container (S7): the request, the optimistic commits, their
|
|
10
|
+
* ordering gate and their write queue live here; `ModelsCatalogView` draws
|
|
11
|
+
* the roster.
|
|
8
12
|
*/
|
|
9
13
|
export declare function ModelsTab({ active }: {
|
|
10
14
|
active: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models-tab.d.ts","sourceRoot":"","sources":["../../../src/components/settings/models-tab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"models-tab.d.ts","sourceRoot":"","sources":["../../../src/components/settings/models-tab.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EAEtB,KAAK,aAAa,EACnB,MAAM,mCAAmC,CAAC;AAS3C;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,+BAmMxD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI;IAAE,KAAK,EAAE,MAAM,MAAM,OAAO,CAAA;CAAE,CAQlE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,WAAW,GAAG,MAAM,GACzB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAO7B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,aAAa,GAAG,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAQ/B"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useRef, useState } from "react";
|
|
3
|
-
import {
|
|
4
|
-
import { THINKING_LEVELS, } from "@schlessera/brain-ui-sdk/protocol";
|
|
5
|
-
import { api } from "../../lib/api-client.js";
|
|
3
|
+
import { useBrainUiRoot } from "../../root-context.js";
|
|
6
4
|
import { useProviderStore } from "../../stores/provider-store.js";
|
|
7
|
-
import {
|
|
5
|
+
import { ModelsCatalogView } from "./models-list.js";
|
|
8
6
|
import { PiAccountsSection } from "./pi-accounts.js";
|
|
9
7
|
import { WebSearchSection } from "./web-search-settings.js";
|
|
10
8
|
import { ToolPermissionsSection } from "./tool-permissions.js";
|
|
@@ -14,8 +12,15 @@ import { ToolPermissionsSection } from "./tool-permissions.js";
|
|
|
14
12
|
* The roster comes from the server (Anthropic model discovery plus any
|
|
15
13
|
* host-declared profiles), so this tab never hardcodes model names. Hiding is
|
|
16
14
|
* presentation only — a session already pinned to a hidden model keeps running.
|
|
15
|
+
*
|
|
16
|
+
* This is the container (S7): the request, the optimistic commits, their
|
|
17
|
+
* ordering gate and their write queue live here; `ModelsCatalogView` draws
|
|
18
|
+
* the roster.
|
|
17
19
|
*/
|
|
18
20
|
export function ModelsTab({ active }) {
|
|
21
|
+
const root = useBrainUiRoot();
|
|
22
|
+
const api = root.api;
|
|
23
|
+
const lifetime = useRef(0);
|
|
19
24
|
const [catalog, setCatalog] = useState(null);
|
|
20
25
|
const [loading, setLoading] = useState(false);
|
|
21
26
|
const [refreshing, setRefreshing] = useState(false);
|
|
@@ -23,32 +28,31 @@ export function ModelsTab({ active }) {
|
|
|
23
28
|
const loadProviders = useProviderStore((s) => s.loadProviders);
|
|
24
29
|
const commitGate = useRef(createRequestGate());
|
|
25
30
|
/** Serializes full-record PUTs — see commitCatalog. */
|
|
26
|
-
const
|
|
31
|
+
const commitQueues = useRef(new WeakMap());
|
|
27
32
|
useEffect(() => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
const generation = ++lifetime.current;
|
|
34
|
+
const latest = commitGate.current.begin();
|
|
35
|
+
const current = () => generation === lifetime.current && latest();
|
|
36
|
+
setCatalog(null);
|
|
37
|
+
setLoading(active);
|
|
38
|
+
setRefreshing(false);
|
|
32
39
|
setError(null);
|
|
33
|
-
|
|
34
|
-
.
|
|
35
|
-
.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
cancelled = true;
|
|
50
|
-
};
|
|
51
|
-
}, [active]);
|
|
40
|
+
if (active) {
|
|
41
|
+
// Returning to a root waits for its accepted writes before reading.
|
|
42
|
+
void (commitQueues.current.get(root) ?? Promise.resolve())
|
|
43
|
+
.then(() => current() ? api.models() : null)
|
|
44
|
+
.then((data) => { if (data && current())
|
|
45
|
+
setCatalog(data); })
|
|
46
|
+
.catch((err) => {
|
|
47
|
+
if (current())
|
|
48
|
+
setError(err instanceof Error ? err.message : "Could not load models");
|
|
49
|
+
})
|
|
50
|
+
.finally(() => { if (generation === lifetime.current)
|
|
51
|
+
setLoading(false); });
|
|
52
|
+
}
|
|
53
|
+
const invalidate = () => { lifetime.current++; };
|
|
54
|
+
return invalidate;
|
|
55
|
+
}, [active, root, api]);
|
|
52
56
|
/**
|
|
53
57
|
* Optimistic-update skeleton shared by the hidden toggle and the billing
|
|
54
58
|
* select: the change is the user's own click, so reflect it immediately,
|
|
@@ -64,7 +68,9 @@ export function ModelsTab({ active }) {
|
|
|
64
68
|
* this change (and its own catch surfaces any error that still matters).
|
|
65
69
|
*/
|
|
66
70
|
async function commitCatalog(optimistic, commit) {
|
|
67
|
-
const
|
|
71
|
+
const generation = lifetime.current;
|
|
72
|
+
const latest = commitGate.current.begin();
|
|
73
|
+
const isCurrent = () => generation === lifetime.current && latest();
|
|
68
74
|
const previous = catalog;
|
|
69
75
|
setCatalog(optimistic);
|
|
70
76
|
setError(null);
|
|
@@ -74,7 +80,7 @@ export function ModelsTab({ active }) {
|
|
|
74
80
|
// even while the client looked right. Each commit waits for the previous
|
|
75
81
|
// one to settle; payloads are built on optimistic state, so the newest
|
|
76
82
|
// write already carries every earlier edit.
|
|
77
|
-
const run =
|
|
83
|
+
const run = (commitQueues.current.get(root) ?? Promise.resolve()).then(async () => {
|
|
78
84
|
try {
|
|
79
85
|
const confirmed = await commit();
|
|
80
86
|
if (isCurrent())
|
|
@@ -88,7 +94,7 @@ export function ModelsTab({ active }) {
|
|
|
88
94
|
}
|
|
89
95
|
}
|
|
90
96
|
});
|
|
91
|
-
|
|
97
|
+
commitQueues.current.set(root, run);
|
|
92
98
|
await run;
|
|
93
99
|
}
|
|
94
100
|
async function toggleHidden(entry) {
|
|
@@ -146,59 +152,32 @@ export function ModelsTab({ active }) {
|
|
|
146
152
|
async function onRefresh() {
|
|
147
153
|
if (refreshing)
|
|
148
154
|
return;
|
|
155
|
+
const generation = lifetime.current;
|
|
156
|
+
const latest = commitGate.current.begin();
|
|
157
|
+
const current = () => generation === lifetime.current && latest();
|
|
149
158
|
setRefreshing(true);
|
|
150
159
|
setError(null);
|
|
151
160
|
try {
|
|
152
|
-
|
|
161
|
+
await (commitQueues.current.get(root) ?? Promise.resolve());
|
|
162
|
+
if (generation !== lifetime.current)
|
|
163
|
+
return;
|
|
164
|
+
const next = await api.refreshModels();
|
|
165
|
+
if (current())
|
|
166
|
+
setCatalog(next);
|
|
153
167
|
// A refresh can surface newly released models — put them in the picker
|
|
154
168
|
// now, not on next load.
|
|
155
169
|
void loadProviders();
|
|
156
170
|
}
|
|
157
171
|
catch (err) {
|
|
158
|
-
|
|
172
|
+
if (current())
|
|
173
|
+
setError(err instanceof Error ? err.message : "Refresh failed");
|
|
159
174
|
}
|
|
160
175
|
finally {
|
|
161
|
-
|
|
176
|
+
if (generation === lifetime.current)
|
|
177
|
+
setRefreshing(false);
|
|
162
178
|
}
|
|
163
179
|
}
|
|
164
|
-
|
|
165
|
-
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex-1 overflow-y-auto p-4", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "The list is read from the provider and refreshes on its own. Hide the ones you never pick \u2014 running sessions are unaffected." }), catalog && (_jsx(DefaultModelSelect, { catalog: catalog, onChange: changeDefault })), loading ? (_jsx("div", { className: "mt-6 flex justify-center", children: _jsx(Loader2, { className: "h-5 w-5 animate-spin text-muted-foreground" }) })) : (_jsxs("ul", { className: "mt-4 flex flex-col gap-2", children: [catalog?.models.map((entry) => (_jsx(ModelRow, { entry: entry, onToggle: () => toggleHidden(entry), onBilling: (next) => changeBilling(entry, next), onThinking: (next) => changeThinking(entry, next) }, entry.id))), catalog?.models.length === 0 && (_jsx("li", { className: "rounded-lg border border-dashed border-border-subtle p-4 text-center text-xs text-muted-foreground", children: "No models available." }))] })), error && (_jsx("p", { role: "alert", className: "mt-3 text-xs text-destructive", children: error })), catalog?.discovery.error && (_jsxs("p", { className: "mt-3 text-xs text-muted-foreground", children: ["Last refresh failed (", catalog.discovery.error, "). Showing the last known list."] })), catalog && !catalog.discovery.enabled && (_jsx("p", { className: "mt-3 text-xs text-muted-foreground", children: "Discovery is disabled (BRAIN_UI_MODEL_DISCOVERY). Only configured profiles are listed." })), catalog && (_jsx(OpenRouterSection, { models: catalog.customModels ?? [], onChange: setCustom })), _jsx(PiAccountsSection, { active: active }), _jsx(WebSearchSection, { active: active }), _jsx(ToolPermissionsSection, { active: active })] }), _jsxs("div", { className: "flex items-center justify-between gap-3 border-t border-border p-4", children: [_jsxs("span", { className: "text-[11px] text-muted-foreground", children: [visibleCount, " in picker \u00B7 ", formatRefreshed(catalog?.refreshedAt ?? null)] }), _jsxs("button", { onClick: onRefresh, disabled: refreshing, className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-surface px-3 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary disabled:opacity-50", children: [_jsx(RefreshCw, { className: cn("h-3.5 w-3.5", refreshing && "animate-spin") }), "Refresh"] })] })] }));
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* The default-model choice: which profile answers when a turn names none —
|
|
169
|
-
* a fresh device's first conversation, a share filed into the brain, any
|
|
170
|
-
* host-initiated action. "Auto" prefers a connected subscription account
|
|
171
|
-
* (e.g. ChatGPT for the gpt profiles) and falls back to the built-in default.
|
|
172
|
-
*/
|
|
173
|
-
function DefaultModelSelect({ catalog, onChange, }) {
|
|
174
|
-
const stored = catalog.defaultModelId ?? null;
|
|
175
|
-
const byId = new Map(catalog.models.map((model) => [model.id, model]));
|
|
176
|
-
const resolved = catalog.resolvedDefaultId
|
|
177
|
-
? byId.get(catalog.resolvedDefaultId)
|
|
178
|
-
: undefined;
|
|
179
|
-
// Offer everything visible, plus a stored default that has since been
|
|
180
|
-
// hidden (dropping it from the list would silently rewrite the choice).
|
|
181
|
-
const options = catalog.models.filter((model) => !model.hidden || model.id === stored);
|
|
182
|
-
return (_jsxs("div", { className: "mt-4 flex items-center gap-3 rounded-lg border border-border-subtle bg-surface p-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm text-foreground", children: "Default model" }), _jsx("p", { className: "text-[11px] text-muted-foreground", children: "Used for new conversations, shares, and actions that don't pick one." })] }), _jsxs("select", { value: stored ?? "auto", onChange: (e) => onChange(e.target.value === "auto" ? null : e.target.value), "aria-label": "Default model", className: "h-8 max-w-[45%] shrink-0 truncate rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !stored && resolved ? `Auto (${resolved.label})` : "Auto" }), options.map((model) => (_jsx("option", { value: model.id, children: model.label }, model.id)))] })] }));
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* User-managed OpenRouter models: added and removed here by model id, no env
|
|
186
|
-
* change or redeploy. They appear in the roster above as ordinary profiles
|
|
187
|
-
* (api-billed via OPENROUTER_API_KEY).
|
|
188
|
-
*/
|
|
189
|
-
function OpenRouterSection({ models, onChange, }) {
|
|
190
|
-
const [draft, setDraft] = useState("");
|
|
191
|
-
function add() {
|
|
192
|
-
const id = draft.trim();
|
|
193
|
-
if (!id || models.includes(id))
|
|
194
|
-
return;
|
|
195
|
-
onChange([...models, id]);
|
|
196
|
-
setDraft("");
|
|
197
|
-
}
|
|
198
|
-
return (_jsxs("div", { className: "mt-6", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "OpenRouter models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Add any OpenRouter model by its id (needs OPENROUTER_API_KEY on the server). Added models join the list above." }), models.length > 0 && (_jsx("ul", { className: "mt-3 flex flex-col gap-1.5", children: models.map((model) => (_jsxs("li", { className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-surface px-3 py-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate font-[family-name:var(--font-mono)] text-xs text-foreground", children: model }), _jsx("button", { onClick: () => onChange(models.filter((m) => m !== model)), title: `Remove ${model}`, className: "flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-surface-raised hover:text-destructive", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] }, model))) })), _jsxs("div", { className: "mt-3 flex gap-2", children: [_jsx("input", { value: draft, onChange: (e) => setDraft(e.target.value), onKeyDown: (e) => {
|
|
199
|
-
if (e.key === "Enter")
|
|
200
|
-
add();
|
|
201
|
-
}, placeholder: "z.ai/glm-5.3-flash", className: "h-8 min-w-0 flex-1 rounded-lg border border-border-subtle bg-surface px-2 font-[family-name:var(--font-mono)] text-xs text-foreground placeholder:text-muted-foreground/50 focus:border-primary focus:outline-none" }), _jsx("button", { onClick: add, disabled: !draft.trim(), className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-3 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary disabled:opacity-50", children: "Add" })] })] }));
|
|
180
|
+
return (_jsx(ModelsCatalogView, { catalog: catalog, loading: loading, refreshing: refreshing, error: error, sections: _jsxs(_Fragment, { children: [_jsx(PiAccountsSection, { active: active }), _jsx(WebSearchSection, { active: active }), _jsx(ToolPermissionsSection, { active: active })] }), onToggleHidden: (entry) => void toggleHidden(entry), onBilling: (entry, next) => void changeBilling(entry, next), onThinking: (entry, next) => void changeThinking(entry, next), onDefault: (next) => void changeDefault(next), onCustomModels: (models) => void setCustom(models), onRefresh: () => void onRefresh() }));
|
|
202
181
|
}
|
|
203
182
|
/**
|
|
204
183
|
* Request-ordering guard for optimistic commits: `begin()` claims a token
|
|
@@ -228,9 +207,6 @@ export function nextBillingOverrides(models, id, next) {
|
|
|
228
207
|
}
|
|
229
208
|
return billing;
|
|
230
209
|
}
|
|
231
|
-
function billingLabel(mode) {
|
|
232
|
-
return mode === "api" ? "API" : "Subscription";
|
|
233
|
-
}
|
|
234
210
|
/**
|
|
235
211
|
* The effort-override record PUT after changing one profile: every other
|
|
236
212
|
* profile keeps its stored override, the changed one is set — or, for "auto",
|
|
@@ -245,30 +221,4 @@ export function nextThinkingOverrides(models, id, next) {
|
|
|
245
221
|
}
|
|
246
222
|
return thinking;
|
|
247
223
|
}
|
|
248
|
-
function ModelRow({ entry, onToggle, onBilling, onThinking, }) {
|
|
249
|
-
const Icon = entry.hidden ? EyeOff : Eye;
|
|
250
|
-
return (_jsxs("li", { className: cn("flex items-center gap-3 rounded-lg border border-border-subtle bg-surface p-3", entry.hidden && "opacity-50"), children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm text-foreground", children: entry.label }), _jsxs("p", { className: "truncate text-[11px] text-muted-foreground", children: [entry.id, entry.contextWindow ? ` · ${formatTokens(entry.contextWindow)}` : "", entry.source === "declared" ? " · configured" : ""] })] }), entry.thinkingLevel && (_jsxs("select", { value: entry.thinkingOverride ?? "auto", onChange: (e) => onThinking(e.target.value), "aria-label": `Reasoning effort for ${entry.label}`, className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !entry.thinkingOverride ? `Default (${entry.thinkingLevel})` : "Default" }), THINKING_LEVELS.map((level) => (_jsx("option", { value: level, children: level }, level)))] })), _jsxs("select", { value: entry.billingOverride ?? "auto", onChange: (e) => onBilling(e.target.value), "aria-label": `Billing for ${entry.label}`, className: "h-8 shrink-0 rounded-lg border border-border-subtle bg-surface px-1.5 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-foreground", children: [_jsx("option", { value: "auto", children: !entry.billingOverride && entry.billingMode
|
|
251
|
-
? `Auto (${billingLabel(entry.billingMode).toLowerCase()})`
|
|
252
|
-
: "Auto" }), _jsx("option", { value: "subscription", children: "Subscription" }), _jsx("option", { value: "api", children: "API" })] }), _jsx("button", { onClick: onToggle, title: entry.hidden ? "Show in picker" : "Hide from picker", "aria-pressed": !entry.hidden, className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-surface-raised hover:text-foreground", children: _jsx(Icon, { className: "h-4 w-4" }) })] }));
|
|
253
|
-
}
|
|
254
|
-
function formatTokens(tokens) {
|
|
255
|
-
if (tokens >= 1_000_000)
|
|
256
|
-
return `${tokens / 1_000_000}M context`;
|
|
257
|
-
if (tokens >= 1_000)
|
|
258
|
-
return `${Math.round(tokens / 1_000)}K context`;
|
|
259
|
-
return `${tokens} context`;
|
|
260
|
-
}
|
|
261
|
-
function formatRefreshed(refreshedAt) {
|
|
262
|
-
if (refreshedAt === null)
|
|
263
|
-
return "never refreshed";
|
|
264
|
-
const minutes = Math.round((Date.now() - refreshedAt) / 60_000);
|
|
265
|
-
if (minutes < 1)
|
|
266
|
-
return "refreshed just now";
|
|
267
|
-
if (minutes < 60)
|
|
268
|
-
return `refreshed ${minutes}m ago`;
|
|
269
|
-
const hours = Math.round(minutes / 60);
|
|
270
|
-
if (hours < 24)
|
|
271
|
-
return `refreshed ${hours}h ago`;
|
|
272
|
-
return `refreshed ${Math.round(hours / 24)}d ago`;
|
|
273
|
-
}
|
|
274
224
|
//# sourceMappingURL=models-tab.js.map
|