@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
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The typed answer (D38 §1): a composer send while an `ask_user` question is
|
|
3
|
+
* pending is the answer to that question, not a new message.
|
|
4
|
+
*
|
|
5
|
+
* The exchange is submitted through the same path the card's Submit uses —
|
|
6
|
+
* the store records the answers and the socket carries `ask_user_response` —
|
|
7
|
+
* with one difference: the exchange is marked `typed`, so the card quotes the
|
|
8
|
+
* text it took instead of showing a chosen option. Dropping the card would
|
|
9
|
+
* leave the transcript claiming the question was never answered; leaving it
|
|
10
|
+
* pending would ask twice.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { AskUserQuestion, ClientMessage } from "@schlessera/brain-ui-sdk/protocol";
|
|
14
|
+
import type { AskUserExchange, ChatKey, ChatState } from "../../stores/chat-state.js";
|
|
15
|
+
|
|
16
|
+
/** A request the user has neither answered nor dismissed. */
|
|
17
|
+
export function isPendingExchange(
|
|
18
|
+
exchange: AskUserExchange | null | undefined
|
|
19
|
+
): exchange is AskUserExchange {
|
|
20
|
+
return !!exchange && !exchange.answers && !exchange.cancelled;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The question the composer text answers — only when the exchange has exactly
|
|
25
|
+
* one. Answers are submitted for the whole exchange at once and the server
|
|
26
|
+
* resolves the request on the first response, so binding a typed reply to
|
|
27
|
+
* question one of several would leave the others blank and unanswerable. A
|
|
28
|
+
* multi-question prompt keeps the cards' own Submit; the composer text is an
|
|
29
|
+
* ordinary message.
|
|
30
|
+
*/
|
|
31
|
+
export function questionForTypedAnswer(exchange: AskUserExchange): AskUserQuestion | null {
|
|
32
|
+
return exchange.questions.length === 1 ? exchange.questions[0]! : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Binds `text` to the buffer's pending question, if there is one. Returns
|
|
37
|
+
* `true` when the text was consumed as an answer — the caller must then NOT
|
|
38
|
+
* send it as a chat message — and `false` when nothing was pending.
|
|
39
|
+
*/
|
|
40
|
+
export function takeComposerTextAsAnswer(
|
|
41
|
+
chat: Pick<ChatState, "submitAskUserAnswers"> & {
|
|
42
|
+
buffers: ChatState["buffers"];
|
|
43
|
+
draft: ChatState["draft"];
|
|
44
|
+
},
|
|
45
|
+
key: ChatKey,
|
|
46
|
+
text: string,
|
|
47
|
+
send: (message: ClientMessage) => void
|
|
48
|
+
): boolean {
|
|
49
|
+
const buffer = key === null ? chat.draft : chat.buffers[key];
|
|
50
|
+
const exchange = buffer?.askUser;
|
|
51
|
+
if (!isPendingExchange(exchange)) return false;
|
|
52
|
+
const question = questionForTypedAnswer(exchange);
|
|
53
|
+
if (!question) return false;
|
|
54
|
+
const answer = text.trim();
|
|
55
|
+
if (!answer) return false;
|
|
56
|
+
|
|
57
|
+
const answers = { [question.question]: answer };
|
|
58
|
+
chat.submitAskUserAnswers(key, exchange.requestId, answers, undefined, true);
|
|
59
|
+
send({ type: "ask_user_response", requestId: exchange.requestId, answers });
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The composer message a reopened (dismissed, then "Ask again") card sends
|
|
65
|
+
* in place of an `ask_user_response`: the server resolved the request when
|
|
66
|
+
* the turn ended, so the answer has to travel as a normal message that
|
|
67
|
+
* quotes the question it answers. One block per question, the picks as
|
|
68
|
+
* they were recorded.
|
|
69
|
+
*/
|
|
70
|
+
export function reaskMessage(
|
|
71
|
+
questions: readonly Pick<AskUserQuestion, "question">[],
|
|
72
|
+
answers: Record<string, string>
|
|
73
|
+
): string {
|
|
74
|
+
return questions
|
|
75
|
+
.map((q) => `Answering \u201C${q.question}\u201D: ${answers[q.question] ?? ""}`)
|
|
76
|
+
.join("\n\n");
|
|
77
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import type { BrainUiRoot } from "../../root.js";
|
|
4
4
|
import {
|
|
5
5
|
isInternalRepoDir,
|
|
6
6
|
isInternalRepoPath,
|
|
@@ -15,13 +15,13 @@ import { useUIStore } from "../../stores/ui-store.js";
|
|
|
15
15
|
* already an API route — passes through. A repo-relative path is rewritten to
|
|
16
16
|
* the files endpoint, which is where brain content is served from.
|
|
17
17
|
*/
|
|
18
|
-
export function repoImageSrc(src: string): string {
|
|
18
|
+
export function repoImageSrc(src: string, root: BrainUiRoot): string {
|
|
19
19
|
const trimmed = src.trim();
|
|
20
20
|
if (!trimmed) return src;
|
|
21
21
|
if (/^(data:|blob:|https?:\/\/)/i.test(trimmed)) return trimmed;
|
|
22
|
-
if (trimmed.startsWith("/api/")) return trimmed;
|
|
22
|
+
if (trimmed.startsWith("/api/")) return root.backendUrl(trimmed);
|
|
23
23
|
const rel = trimmed.replace(/^\.\//, "").replace(/^\/+/, "");
|
|
24
|
-
return `${apiBase()}/files/content?path=${encodeURIComponent(rel)}&raw=1`;
|
|
24
|
+
return `${root.apiBase()}/files/content?path=${encodeURIComponent(rel)}&raw=1`;
|
|
25
25
|
}
|
|
26
26
|
/** Click target for a repo-relative file reference. Opens the file panel + viewer. */
|
|
27
27
|
export function FileLink({ path, children }: { path: string; children?: React.ReactNode }) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useBrainUiRoot } from "../../root-context.js";
|
|
1
2
|
import React, { memo, useEffect, useMemo } from "react";
|
|
2
3
|
import Markdown from "react-markdown";
|
|
3
4
|
|
|
@@ -83,6 +84,7 @@ export const BrainMarkdown = memo(function BrainMarkdown({ content, className, e
|
|
|
83
84
|
});
|
|
84
85
|
|
|
85
86
|
const BrainMarkdownInner = memo(function BrainMarkdownInner({ content, className, entityTags = false, fileLinks = false }: BrainMarkdownProps) {
|
|
87
|
+
const root = useBrainUiRoot();
|
|
86
88
|
const processed = entityTags ? renderEntityTags(content) : content;
|
|
87
89
|
const ensureWikilinks = useFileStore((s) => s.ensureWikilinks);
|
|
88
90
|
// Entity-tag rendering emits its own markup and must not be re-highlighted.
|
|
@@ -134,7 +136,7 @@ const BrainMarkdownInner = memo(function BrainMarkdownInner({ content, className
|
|
|
134
136
|
* appears. `data:` URIs and absolute URLs are left alone.
|
|
135
137
|
*/
|
|
136
138
|
img: ({ src, alt, ...props }: React.ComponentPropsWithoutRef<"img">) => {
|
|
137
|
-
const resolved = typeof src === "string" ? repoImageSrc(src) : src;
|
|
139
|
+
const resolved = typeof src === "string" ? repoImageSrc(src, root) : src;
|
|
138
140
|
// Inline, an image is only as wide as the viewport. Tapping it opens the
|
|
139
141
|
// zoom viewer, the same way a mermaid diagram does.
|
|
140
142
|
if (typeof resolved !== "string") {
|
|
@@ -166,7 +168,7 @@ const BrainMarkdownInner = memo(function BrainMarkdownInner({ content, className
|
|
|
166
168
|
);
|
|
167
169
|
},
|
|
168
170
|
};
|
|
169
|
-
}, [entityTags, fileLinks]);
|
|
171
|
+
}, [entityTags, fileLinks, root]);
|
|
170
172
|
|
|
171
173
|
return (
|
|
172
174
|
<div className={className ?? "brain-prose"}>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { useBrainUiRoot } from "../../root-context.js";
|
|
1
2
|
import { useState, useRef, useEffect, useLayoutEffect, useCallback } from "react";
|
|
2
3
|
import { ArrowDown, ChevronUp } from "lucide-react";
|
|
3
4
|
import { useChatStore, activeChat } from "../../stores/chat-store.js";
|
|
@@ -18,7 +19,7 @@ import { AddPanel } from "../quick-actions/add-modal.js";
|
|
|
18
19
|
import { FilePanel } from "../files/file-panel.js";
|
|
19
20
|
import { Composer } from "./composer.js";
|
|
20
21
|
import { useChatCommands } from "./use-chat-commands.js";
|
|
21
|
-
import {
|
|
22
|
+
import { Button } from "@schlessera/brain-ui-kit";
|
|
22
23
|
import {
|
|
23
24
|
primeClientEnvironment,
|
|
24
25
|
READING_COLUMN_ATTR,
|
|
@@ -48,6 +49,7 @@ const WINDOW_STEP = 40;
|
|
|
48
49
|
* that on the first re-render.
|
|
49
50
|
*/
|
|
50
51
|
export function ChatPage() {
|
|
52
|
+
const root = useBrainUiRoot();
|
|
51
53
|
const scrollRef = useRef<HTMLDivElement>(null);
|
|
52
54
|
const autoScrollRef = useRef(true);
|
|
53
55
|
const [showScrollButton, setShowScrollButton] = useState(false);
|
|
@@ -139,14 +141,15 @@ export function ChatPage() {
|
|
|
139
141
|
|
|
140
142
|
const handleToolApproval = useCallback(
|
|
141
143
|
(toolUseId: string, approved: boolean, always?: boolean) => {
|
|
142
|
-
|
|
144
|
+
root.stores.chat.getState().resolveToolApproval(sessionId, toolUseId, approved);
|
|
145
|
+
// The transcript's approval card is the only caller: channel "card" (#113).
|
|
143
146
|
if (approved) {
|
|
144
|
-
send({ type: "tool_approval", toolUseId, ...(always ? { always: true } : {}) });
|
|
147
|
+
send({ type: "tool_approval", toolUseId, ...(always ? { always: true } : {}), channel: "card" });
|
|
145
148
|
} else {
|
|
146
|
-
send({ type: "tool_denial", toolUseId, message: "Denied by user" });
|
|
149
|
+
send({ type: "tool_denial", toolUseId, message: "Denied by user", channel: "card" });
|
|
147
150
|
}
|
|
148
151
|
},
|
|
149
|
-
[send, sessionId]
|
|
152
|
+
[send, sessionId, root]
|
|
150
153
|
);
|
|
151
154
|
|
|
152
155
|
const handleAskUserSubmit = useCallback(
|
|
@@ -155,20 +158,37 @@ export function ChatPage() {
|
|
|
155
158
|
answers: Record<string, string>,
|
|
156
159
|
annotations?: Record<string, AskUserAnnotation>
|
|
157
160
|
) => {
|
|
158
|
-
|
|
159
|
-
.getState()
|
|
161
|
+
root.stores.chat.getState()
|
|
160
162
|
.submitAskUserAnswers(sessionId, requestId, answers, annotations);
|
|
161
163
|
send({ type: "ask_user_response", requestId, answers, annotations });
|
|
162
164
|
},
|
|
163
|
-
[send, sessionId]
|
|
165
|
+
[send, sessionId, root]
|
|
164
166
|
);
|
|
165
167
|
|
|
166
168
|
const handleAskUserCancel = useCallback(
|
|
167
169
|
(requestId: string) => {
|
|
168
|
-
|
|
170
|
+
root.stores.chat.getState().cancelAskUser(sessionId, requestId);
|
|
169
171
|
send({ type: "ask_user_cancel", requestId, reason: "User dismissed" });
|
|
170
172
|
},
|
|
171
|
-
[send, sessionId]
|
|
173
|
+
[send, sessionId, root]
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* A dismissed question asked again (seventh drop, ruling 7). The request
|
|
178
|
+
* was resolved server-side when the turn ended, so the answer goes out as
|
|
179
|
+
* an ordinary message — the same path the composer's send takes, minus
|
|
180
|
+
* attachments and provider (a resumed session is pinned to its own).
|
|
181
|
+
*/
|
|
182
|
+
const handleAskUserReask = useCallback(
|
|
183
|
+
(text: string) => {
|
|
184
|
+
const chat = root.stores.chat.getState();
|
|
185
|
+
chat.addUserMessage(sessionId, text, "typed");
|
|
186
|
+
if (!(sessionId === null ? chat.draft : chat.buffers[sessionId])?.isStreaming) {
|
|
187
|
+
chat.startAssistantMessage(sessionId);
|
|
188
|
+
}
|
|
189
|
+
send({ type: "chat_message", text, sessionId: sessionId ?? undefined });
|
|
190
|
+
},
|
|
191
|
+
[send, sessionId, root]
|
|
172
192
|
);
|
|
173
193
|
|
|
174
194
|
const handleSessionResume = useCallback(
|
|
@@ -225,7 +245,7 @@ export function ChatPage() {
|
|
|
225
245
|
open={syncPanelOpen}
|
|
226
246
|
onClose={() => setSyncPanelOpen(false)}
|
|
227
247
|
title="Brain Sync"
|
|
228
|
-
endpoint=
|
|
248
|
+
endpoint="/api/brain/sync"
|
|
229
249
|
/>
|
|
230
250
|
<WhatsupPanel
|
|
231
251
|
open={whatsupPanelOpen}
|
|
@@ -244,6 +264,15 @@ export function ChatPage() {
|
|
|
244
264
|
onClose={() => setFilePanelOpen(false)}
|
|
245
265
|
/>
|
|
246
266
|
|
|
267
|
+
{/* New chat is the Chat header's primary action (D37): a tab is a place
|
|
268
|
+
and starting a chat is an act, so it is neither a rail row nor a bar
|
|
269
|
+
slot. It only appears once there is a conversation to leave. */}
|
|
270
|
+
{hasMessages && (
|
|
271
|
+
<div className="flex shrink-0 items-center justify-end px-4 pt-2 md:px-6">
|
|
272
|
+
<Button label="New chat" icon="compose" tone="ghost" size="sm" block={false} onClick={clearMessages} />
|
|
273
|
+
</div>
|
|
274
|
+
)}
|
|
275
|
+
|
|
247
276
|
{/* Message area */}
|
|
248
277
|
<div className="relative flex-1 overflow-hidden">
|
|
249
278
|
{messages.length === 0 ? (
|
|
@@ -284,6 +313,7 @@ export function ChatPage() {
|
|
|
284
313
|
onToolApproval={handleToolApproval}
|
|
285
314
|
onAskUserSubmit={handleAskUserSubmit}
|
|
286
315
|
onAskUserCancel={handleAskUserCancel}
|
|
316
|
+
onAskUserReask={handleAskUserReask}
|
|
287
317
|
/>
|
|
288
318
|
))}
|
|
289
319
|
</div>
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { BottomSheet, Button, Callout, Composer as KitComposer, Icon, ListRow, type ComposerState } from "@schlessera/brain-ui-kit";
|
|
2
|
+
import { X } from "lucide-react";
|
|
3
|
+
import type { ClipboardEvent, KeyboardEvent, ReactNode, RefObject } from "react";
|
|
4
|
+
import { cn } from "../../lib/utils.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The composer's frame, rendered from props (S7, the `chat` directory).
|
|
8
|
+
* `Composer` is the container: it owns the draft, the attachments and their
|
|
9
|
+
* object URLs, the provider choice, the voice review, the command palette's
|
|
10
|
+
* open state and every store read.
|
|
11
|
+
*
|
|
12
|
+
* The field itself is the kit `Composer` (D37: the composer is kit-owned —
|
|
13
|
+
* it is the one piece of permanent chrome, and a field redrawn per screen is
|
|
14
|
+
* a component nobody can audit). The kit draws attach · field · mic ·
|
|
15
|
+
* send/stop, the provider chip in the hint line and the state-driven
|
|
16
|
+
* placeholder, hint and trailing control. What this frame adds around it is
|
|
17
|
+
* what the design leaves to the app: the slash-command palette above the
|
|
18
|
+
* field, the attachment previews and their errors, the attach MENU behind
|
|
19
|
+
* the paperclip (a docked `BottomSheet` on a phone, a popover on a pointer
|
|
20
|
+
* screen — capture is a menu, not three more icons), the provider list, and
|
|
21
|
+
* two keys the kit does not know: ↑ on an empty draft recalls the last
|
|
22
|
+
* prompt, and esc dismisses the slash palette.
|
|
23
|
+
*
|
|
24
|
+
* Paste-to-attach is caught here too: the kit's textarea has no paste
|
|
25
|
+
* handler of its own, and the event bubbles to this frame with its files.
|
|
26
|
+
*/
|
|
27
|
+
export interface ComposerAttachment {
|
|
28
|
+
previewUrl: string;
|
|
29
|
+
name: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface ComposerProvider {
|
|
33
|
+
label: string;
|
|
34
|
+
/** Fixed for this conversation: the chip is text, not a control. */
|
|
35
|
+
locked: boolean;
|
|
36
|
+
menuOpen: boolean;
|
|
37
|
+
options: { id: string; label: string }[];
|
|
38
|
+
selectedId: string | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface ComposerViewProps {
|
|
42
|
+
value: string;
|
|
43
|
+
state: ComposerState;
|
|
44
|
+
/** Overrides the state's own placeholder (a connection reason, the host's copy). */
|
|
45
|
+
placeholder?: string;
|
|
46
|
+
/** Overrides the state's own hint ("Will queue" while a session runs). */
|
|
47
|
+
hint?: string;
|
|
48
|
+
/** The offline reason, printed in the hint row. */
|
|
49
|
+
blockedWhy?: string;
|
|
50
|
+
paletteOpen: boolean;
|
|
51
|
+
/** The command palette, already rendered by the container, or null. */
|
|
52
|
+
palette: ReactNode;
|
|
53
|
+
attachMenuOpen: boolean;
|
|
54
|
+
attachments: ComposerAttachment[];
|
|
55
|
+
attachErrors: string[];
|
|
56
|
+
provider: ComposerProvider | null;
|
|
57
|
+
/** The container's ref: it focuses the field after a recall or a voice edit. */
|
|
58
|
+
frameRef: RefObject<HTMLDivElement | null>;
|
|
59
|
+
/** The container's ref for the provider popover's outside-click dismissal. */
|
|
60
|
+
providerMenuRef: RefObject<HTMLDivElement | null>;
|
|
61
|
+
onChange: (value: string) => void;
|
|
62
|
+
onSend: () => void;
|
|
63
|
+
onStop: () => void;
|
|
64
|
+
onMic: () => void;
|
|
65
|
+
onAttachToggle: () => void;
|
|
66
|
+
onPickLibrary: () => void;
|
|
67
|
+
onPickCamera: () => void;
|
|
68
|
+
onPasteFiles: (files: File[]) => void;
|
|
69
|
+
onRecall: () => void;
|
|
70
|
+
onEscape: () => void;
|
|
71
|
+
onRemoveAttachment: (index: number) => void;
|
|
72
|
+
onDismissErrors: () => void;
|
|
73
|
+
onProviderToggle: () => void;
|
|
74
|
+
onProviderSelect: (id: string) => void;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function ComposerView(p: ComposerViewProps) {
|
|
78
|
+
function onKeyDown(e: KeyboardEvent<HTMLDivElement>) {
|
|
79
|
+
if ((e.target as HTMLElement).tagName !== "TEXTAREA") return;
|
|
80
|
+
if (e.key === "ArrowUp" && !p.value.trim()) p.onRecall();
|
|
81
|
+
if (e.key === "Escape" && p.paletteOpen) p.onEscape();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function onPaste(e: ClipboardEvent<HTMLDivElement>) {
|
|
85
|
+
const files = e.clipboardData?.files;
|
|
86
|
+
if (!files || files.length === 0) return;
|
|
87
|
+
const images = Array.from(files).filter((f) => f.type.startsWith("image/"));
|
|
88
|
+
if (images.length === 0) return;
|
|
89
|
+
e.preventDefault();
|
|
90
|
+
p.onPasteFiles(images);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const pointer = typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(min-width: 900px)").matches;
|
|
94
|
+
const attachMenu = (
|
|
95
|
+
<div className="flex flex-col">
|
|
96
|
+
<ListRow variant="group" icon="image" iconTone="teal" title="Photo library" subtitle="Pick images already on this device" onClick={p.onPickLibrary} />
|
|
97
|
+
<ListRow variant="group" icon="attach" iconTone="amber" title="Camera" subtitle="Take a photo now" onClick={p.onPickCamera} />
|
|
98
|
+
<ListRow variant="group" icon="copy" iconTone="neutral" title="Paste" subtitle="An image on the clipboard pastes straight into the field" last />
|
|
99
|
+
</div>
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
return (
|
|
103
|
+
<div ref={p.frameRef} data-composer="" className="relative mx-auto max-w-3xl" onKeyDown={onKeyDown} onPaste={onPaste}>
|
|
104
|
+
{p.attachErrors.length > 0 && (
|
|
105
|
+
<div className="mb-2 flex items-start gap-2" role="alert">
|
|
106
|
+
<div className="min-w-0 flex-1">
|
|
107
|
+
<Callout tone="red" variant="banner" icon="failed" mono text={p.attachErrors.join(" · ")} />
|
|
108
|
+
</div>
|
|
109
|
+
<Button label="Dismiss" tone="quiet" size="sm" block={false} onClick={p.onDismissErrors} />
|
|
110
|
+
</div>
|
|
111
|
+
)}
|
|
112
|
+
|
|
113
|
+
{p.attachments.length > 0 && (
|
|
114
|
+
<div className="mb-2 flex flex-wrap gap-2">
|
|
115
|
+
{p.attachments.map((a, i) => (
|
|
116
|
+
<div key={i} className="relative h-16 w-16 shrink-0">
|
|
117
|
+
<img src={a.previewUrl} alt={a.name} className="h-16 w-16 rounded-lg border border-border object-cover" />
|
|
118
|
+
<button
|
|
119
|
+
type="button"
|
|
120
|
+
onClick={() => p.onRemoveAttachment(i)}
|
|
121
|
+
title="Remove"
|
|
122
|
+
aria-label={`Remove ${a.name}`}
|
|
123
|
+
className="absolute -right-1.5 -top-1.5 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-surface text-muted-foreground shadow transition-colors hover:text-destructive"
|
|
124
|
+
>
|
|
125
|
+
<X className="h-3 w-3" />
|
|
126
|
+
</button>
|
|
127
|
+
</div>
|
|
128
|
+
))}
|
|
129
|
+
</div>
|
|
130
|
+
)}
|
|
131
|
+
|
|
132
|
+
{p.palette}
|
|
133
|
+
|
|
134
|
+
{/* The provider list, anchored above the field: the chip that opens it
|
|
135
|
+
sits in the kit's hint line, so the list is the frame's. */}
|
|
136
|
+
{p.provider && p.provider.menuOpen && !p.provider.locked && (
|
|
137
|
+
<div ref={p.providerMenuRef} role="menu" aria-label="Model" className="absolute bottom-full left-4 z-50 mb-1 min-w-[14rem] overflow-hidden rounded-xl border border-[var(--bk-color-edge)] bg-[var(--bk-color-raised)] py-1 shadow-2xl">
|
|
138
|
+
{p.provider.options.map((o) => (
|
|
139
|
+
<button
|
|
140
|
+
key={o.id}
|
|
141
|
+
role="menuitem"
|
|
142
|
+
type="button"
|
|
143
|
+
onClick={() => p.onProviderSelect(o.id)}
|
|
144
|
+
className="flex w-full items-center gap-2 px-3 py-2 text-left text-xs text-foreground transition-colors hover:bg-surface-raised"
|
|
145
|
+
>
|
|
146
|
+
<span className={cn("flex w-3.5 shrink-0", o.id === p.provider!.selectedId ? "opacity-100" : "opacity-0")}>
|
|
147
|
+
<Icon icon="confirm" size={14} color="var(--bk-amber-ink)" />
|
|
148
|
+
</span>
|
|
149
|
+
<span className="truncate">{o.label}</span>
|
|
150
|
+
</button>
|
|
151
|
+
))}
|
|
152
|
+
</div>
|
|
153
|
+
)}
|
|
154
|
+
|
|
155
|
+
{/* Capture is a MENU behind the paperclip (D37): a popover on a pointer
|
|
156
|
+
screen, the kit sheet on a phone. */}
|
|
157
|
+
{p.attachMenuOpen && pointer && (
|
|
158
|
+
<div role="menu" aria-label="Attach" className="absolute bottom-full left-4 z-50 mb-1 w-72 overflow-hidden rounded-xl border border-[var(--bk-color-edge)] bg-[var(--bk-color-raised)] shadow-2xl">
|
|
159
|
+
{attachMenu}
|
|
160
|
+
</div>
|
|
161
|
+
)}
|
|
162
|
+
{p.attachMenuOpen && !pointer && (
|
|
163
|
+
<div
|
|
164
|
+
className="fixed inset-0 z-40 bg-black/60"
|
|
165
|
+
onMouseDown={(e) => {
|
|
166
|
+
if (e.target === e.currentTarget) p.onAttachToggle();
|
|
167
|
+
}}
|
|
168
|
+
>
|
|
169
|
+
<div role="dialog" aria-label="Attach" className="absolute inset-x-0 bottom-0">
|
|
170
|
+
<BottomSheet title="Attach" subtitle="Photo, camera, or paste." docked>
|
|
171
|
+
{attachMenu}
|
|
172
|
+
</BottomSheet>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
)}
|
|
176
|
+
|
|
177
|
+
<KitComposer
|
|
178
|
+
variant="send"
|
|
179
|
+
state={p.state}
|
|
180
|
+
placeholder={p.placeholder}
|
|
181
|
+
hint={p.hint}
|
|
182
|
+
blockedWhy={p.blockedWhy}
|
|
183
|
+
value={p.value}
|
|
184
|
+
provider={p.provider?.label}
|
|
185
|
+
onProvider={p.provider && !p.provider.locked ? p.onProviderToggle : undefined}
|
|
186
|
+
onChange={p.onChange}
|
|
187
|
+
onSend={p.onSend}
|
|
188
|
+
onStop={p.onStop}
|
|
189
|
+
onAttach={p.onAttachToggle}
|
|
190
|
+
onMic={p.onMic}
|
|
191
|
+
/>
|
|
192
|
+
</div>
|
|
193
|
+
);
|
|
194
|
+
}
|