veryfront 0.1.997 → 0.1.998
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/esm/cli/templates/manifest.js +1 -1
- package/esm/deno.d.ts +7 -0
- package/esm/deno.js +11 -3
- package/esm/deps/esm.sh/react-dom@19.2.4.d.ts +2 -0
- package/esm/deps/esm.sh/react-dom@19.2.4.d.ts.map +1 -0
- package/esm/deps/esm.sh/react-dom@19.2.4.js +3 -0
- package/esm/react/react-dom.d.ts +3 -0
- package/esm/react/react-dom.d.ts.map +1 -0
- package/esm/react/react-dom.js +2 -0
- package/esm/src/agent/ag-ui/host-support.d.ts.map +1 -1
- package/esm/src/agent/ag-ui/host-support.js +12 -0
- package/esm/src/agent/react/index.d.ts +4 -2
- package/esm/src/agent/react/index.d.ts.map +1 -1
- package/esm/src/agent/react/index.js +2 -1
- package/esm/src/agent/react/use-agent-metadata.d.ts +5 -0
- package/esm/src/agent/react/use-agent-metadata.d.ts.map +1 -1
- package/esm/src/agent/react/use-agent-metadata.js +18 -9
- package/esm/src/agent/react/use-agents.d.ts +33 -0
- package/esm/src/agent/react/use-agents.d.ts.map +1 -0
- package/esm/src/agent/react/use-agents.js +72 -0
- package/esm/src/agent/react/use-chat/index.d.ts +1 -1
- package/esm/src/agent/react/use-chat/index.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/types.d.ts +3 -2
- package/esm/src/agent/react/use-chat/types.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/use-chat.d.ts +12 -1
- package/esm/src/agent/react/use-chat/use-chat.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/use-chat.js +47 -7
- package/esm/src/agent/react/use-chat/utils.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/utils.js +4 -0
- package/esm/src/agent/runtime/message-adapter.d.ts.map +1 -1
- package/esm/src/agent/runtime/message-adapter.js +3 -1
- package/esm/src/agent/runtime/text-generation-runtime-message-converter.d.ts.map +1 -1
- package/esm/src/agent/runtime/text-generation-runtime-message-converter.js +6 -2
- package/esm/src/chat/index.d.ts +17 -7
- package/esm/src/chat/index.d.ts.map +1 -1
- package/esm/src/chat/index.js +33 -7
- package/esm/src/chat/protocol.d.ts +13 -1
- package/esm/src/chat/protocol.d.ts.map +1 -1
- package/esm/src/chat/upload-handler.d.ts +55 -0
- package/esm/src/chat/upload-handler.d.ts.map +1 -0
- package/esm/src/chat/upload-handler.js +180 -0
- package/esm/src/discovery/import-rewriter.d.ts +1 -1
- package/esm/src/discovery/import-rewriter.d.ts.map +1 -1
- package/esm/src/discovery/import-rewriter.js +2 -0
- package/esm/src/discovery/transpiler.d.ts.map +1 -1
- package/esm/src/discovery/transpiler.js +2 -0
- package/esm/src/react/components/chat/agent-card.d.ts +84 -11
- package/esm/src/react/components/chat/agent-card.d.ts.map +1 -1
- package/esm/src/react/components/chat/agent-card.js +151 -57
- package/esm/src/react/components/chat/agent-picker.d.ts +166 -0
- package/esm/src/react/components/chat/agent-picker.d.ts.map +1 -0
- package/esm/src/react/components/chat/agent-picker.js +183 -0
- package/esm/src/react/components/chat/chat/components/animations.js +1 -1
- package/esm/src/react/components/chat/chat/components/attachment-pill.d.ts +125 -3
- package/esm/src/react/components/chat/chat/components/attachment-pill.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/attachment-pill.js +209 -25
- package/esm/src/react/components/chat/chat/components/attachments-panel.d.ts +149 -0
- package/esm/src/react/components/chat/chat/components/attachments-panel.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/components/attachments-panel.js +187 -0
- package/esm/src/react/components/chat/chat/components/branch-picker.d.ts +13 -2
- package/esm/src/react/components/chat/chat/components/branch-picker.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/branch-picker.js +6 -8
- package/esm/src/react/components/chat/chat/components/chat-messages-skeleton.d.ts +20 -0
- package/esm/src/react/components/chat/chat/components/chat-messages-skeleton.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/components/chat-messages-skeleton.js +31 -0
- package/esm/src/react/components/chat/chat/components/code-block.d.ts +9 -1
- package/esm/src/react/components/chat/chat/components/code-block.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/code-block.js +14 -6
- package/esm/src/react/components/chat/chat/components/drop-zone.d.ts +11 -4
- package/esm/src/react/components/chat/chat/components/drop-zone.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/drop-zone.js +10 -8
- package/esm/src/react/components/chat/chat/components/empty-state.d.ts +2 -1
- package/esm/src/react/components/chat/chat/components/empty-state.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/empty-state.js +7 -8
- package/esm/src/react/components/chat/chat/components/inference-badge.d.ts +6 -2
- package/esm/src/react/components/chat/chat/components/inference-badge.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/inference-badge.js +5 -4
- package/esm/src/react/components/chat/chat/components/inline-citation.d.ts +9 -1
- package/esm/src/react/components/chat/chat/components/inline-citation.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/inline-citation.js +19 -20
- package/esm/src/react/components/chat/chat/components/message-actions.d.ts +28 -5
- package/esm/src/react/components/chat/chat/components/message-actions.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/message-actions.js +24 -36
- package/esm/src/react/components/chat/chat/components/message-edit-form.d.ts +7 -2
- package/esm/src/react/components/chat/chat/components/message-edit-form.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/message-edit-form.js +5 -5
- package/esm/src/react/components/chat/chat/components/message-feedback.d.ts +11 -1
- package/esm/src/react/components/chat/chat/components/message-feedback.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/message-feedback.js +9 -11
- package/esm/src/react/components/chat/chat/components/quick-actions.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/quick-actions.js +3 -1
- package/esm/src/react/components/chat/chat/components/reasoning.d.ts +66 -3
- package/esm/src/react/components/chat/chat/components/reasoning.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/reasoning.js +95 -21
- package/esm/src/react/components/chat/chat/components/sidebar.d.ts +178 -12
- package/esm/src/react/components/chat/chat/components/sidebar.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/sidebar.js +228 -45
- package/esm/src/react/components/chat/chat/components/skill-badge.d.ts +6 -1
- package/esm/src/react/components/chat/chat/components/skill-badge.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/skill-badge.js +6 -5
- package/esm/src/react/components/chat/chat/components/skill-tool.d.ts +37 -0
- package/esm/src/react/components/chat/chat/components/skill-tool.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/components/skill-tool.js +46 -0
- package/esm/src/react/components/chat/chat/components/sources.d.ts +55 -3
- package/esm/src/react/components/chat/chat/components/sources.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/sources.js +50 -16
- package/esm/src/react/components/chat/chat/components/step-indicator.d.ts +42 -3
- package/esm/src/react/components/chat/chat/components/step-indicator.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/step-indicator.js +55 -12
- package/esm/src/react/components/chat/chat/components/tab-switcher.d.ts +1 -1
- package/esm/src/react/components/chat/chat/components/tab-switcher.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/tab-switcher.js +3 -3
- package/esm/src/react/components/chat/chat/components/tool-ui.d.ts +96 -3
- package/esm/src/react/components/chat/chat/components/tool-ui.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/tool-ui.js +158 -36
- package/esm/src/react/components/chat/chat/composition/api.d.ts +4 -2
- package/esm/src/react/components/chat/chat/composition/api.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/api.js +4 -2
- package/esm/src/react/components/chat/chat/composition/chat-composer.d.ts +112 -5
- package/esm/src/react/components/chat/chat/composition/chat-composer.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-composer.js +251 -61
- package/esm/src/react/components/chat/chat/composition/chat-empty-state.d.ts +78 -0
- package/esm/src/react/components/chat/chat/composition/chat-empty-state.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/composition/chat-empty-state.js +63 -0
- package/esm/src/react/components/chat/chat/composition/chat-empty.d.ts +4 -1
- package/esm/src/react/components/chat/chat/composition/chat-empty.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-empty.js +11 -10
- package/esm/src/react/components/chat/chat/composition/chat-message-list.d.ts +11 -3
- package/esm/src/react/components/chat/chat/composition/chat-message-list.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-message-list.js +81 -111
- package/esm/src/react/components/chat/chat/composition/chat-root.d.ts +4 -0
- package/esm/src/react/components/chat/chat/composition/chat-root.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-root.js +3 -1
- package/esm/src/react/components/chat/chat/composition/error-banner.d.ts +4 -0
- package/esm/src/react/components/chat/chat/composition/error-banner.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/error-banner.js +10 -7
- package/esm/src/react/components/chat/chat/composition/message.d.ts +123 -5
- package/esm/src/react/components/chat/chat/composition/message.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/message.js +332 -53
- package/esm/src/react/components/chat/chat/composition/model-avatar.d.ts +6 -1
- package/esm/src/react/components/chat/chat/composition/model-avatar.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/model-avatar.js +3 -4
- package/esm/src/react/components/chat/chat/composition/pending-message.d.ts +31 -0
- package/esm/src/react/components/chat/chat/composition/pending-message.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/composition/pending-message.js +31 -0
- package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts +4 -0
- package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/contexts/composer-context.d.ts +1 -0
- package/esm/src/react/components/chat/chat/contexts/composer-context.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/contexts/conversations-context.d.ts +29 -0
- package/esm/src/react/components/chat/chat/contexts/conversations-context.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/contexts/conversations-context.js +39 -0
- package/esm/src/react/components/chat/chat/contexts/index.d.ts +1 -1
- package/esm/src/react/components/chat/chat/contexts/index.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/contexts/index.js +1 -1
- package/esm/src/react/components/chat/chat/contexts/message-context.d.ts +2 -0
- package/esm/src/react/components/chat/chat/contexts/message-context.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/hooks/use-clipboard.d.ts +10 -0
- package/esm/src/react/components/chat/chat/hooks/use-clipboard.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-clipboard.js +34 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversation.d.ts +21 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversation.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversation.js +54 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversations.d.ts +67 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversations.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversations.js +317 -0
- package/esm/src/react/components/chat/chat/hooks/use-drop-zone.d.ts +27 -0
- package/esm/src/react/components/chat/chat/hooks/use-drop-zone.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-drop-zone.js +50 -0
- package/esm/src/react/components/chat/chat/hooks/use-stick-to-bottom.d.ts +49 -0
- package/esm/src/react/components/chat/chat/hooks/use-stick-to-bottom.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-stick-to-bottom.js +120 -0
- package/esm/src/react/components/chat/chat/hooks/use-upload.d.ts +34 -0
- package/esm/src/react/components/chat/chat/hooks/use-upload.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-upload.js +147 -0
- package/esm/src/react/components/chat/chat/hooks/use-uploads-registry.d.ts +37 -0
- package/esm/src/react/components/chat/chat/hooks/use-uploads-registry.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-uploads-registry.js +178 -0
- package/esm/src/react/components/chat/chat/index.d.ts +171 -31
- package/esm/src/react/components/chat/chat/index.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/index.js +371 -77
- package/esm/src/react/components/chat/chat/persistence/conversation-store.d.ts +63 -0
- package/esm/src/react/components/chat/chat/persistence/conversation-store.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/persistence/conversation-store.js +1 -0
- package/esm/src/react/components/chat/chat/persistence/local-conversation-store.d.ts +13 -0
- package/esm/src/react/components/chat/chat/persistence/local-conversation-store.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/persistence/local-conversation-store.js +102 -0
- package/esm/src/react/components/chat/chat/persistence/memory-conversation-store.d.ts +11 -0
- package/esm/src/react/components/chat/chat/persistence/memory-conversation-store.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/persistence/memory-conversation-store.js +33 -0
- package/esm/src/react/components/chat/chat/utils/message-parts.d.ts +4 -1
- package/esm/src/react/components/chat/chat/utils/message-parts.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/utils/message-parts.js +4 -0
- package/esm/src/react/components/chat/chat-actions.d.ts +164 -0
- package/esm/src/react/components/chat/chat-actions.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat-actions.js +191 -0
- package/esm/src/react/components/chat/chat-agent-picker.d.ts +50 -0
- package/esm/src/react/components/chat/chat-agent-picker.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat-agent-picker.js +40 -0
- package/esm/src/react/components/chat/chat-theme-scope.d.ts +26 -0
- package/esm/src/react/components/chat/chat-theme-scope.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat-theme-scope.js +27 -0
- package/esm/src/react/components/chat/chat-tokens-style.d.ts +21 -0
- package/esm/src/react/components/chat/chat-tokens-style.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat-tokens-style.js +24 -0
- package/esm/src/react/components/chat/chat.d.ts +5 -5
- package/esm/src/react/components/chat/chat.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat.js +5 -5
- package/esm/src/react/components/chat/color-mode.d.ts +46 -0
- package/esm/src/react/components/chat/color-mode.d.ts.map +1 -0
- package/esm/src/react/components/chat/color-mode.js +123 -0
- package/esm/src/react/components/chat/error-boundary.js +2 -2
- package/esm/src/react/components/chat/icons/index.d.ts +8 -0
- package/esm/src/react/components/chat/icons/index.d.ts.map +1 -1
- package/esm/src/react/components/chat/icons/index.js +64 -0
- package/esm/src/react/components/chat/markdown.d.ts +24 -1
- package/esm/src/react/components/chat/markdown.d.ts.map +1 -1
- package/esm/src/react/components/chat/markdown.js +122 -38
- package/esm/src/react/components/chat/model-selector.d.ts +130 -8
- package/esm/src/react/components/chat/model-selector.d.ts.map +1 -1
- package/esm/src/react/components/chat/model-selector.js +148 -121
- package/esm/src/react/components/chat/theme.d.ts +9 -12
- package/esm/src/react/components/chat/theme.d.ts.map +1 -1
- package/esm/src/react/components/chat/theme.js +149 -93
- package/esm/src/react/components/chat/ui/alert.d.ts +30 -0
- package/esm/src/react/components/chat/ui/alert.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/alert.js +35 -0
- package/esm/src/react/components/chat/ui/app-shell.d.ts +155 -0
- package/esm/src/react/components/chat/ui/app-shell.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/app-shell.js +276 -0
- package/esm/src/react/components/chat/ui/avatar.d.ts +24 -0
- package/esm/src/react/components/chat/ui/avatar.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/avatar.js +44 -0
- package/esm/src/react/components/chat/ui/badge.d.ts +24 -0
- package/esm/src/react/components/chat/ui/badge.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/badge.js +30 -0
- package/esm/src/react/components/chat/ui/button.d.ts +44 -0
- package/esm/src/react/components/chat/ui/button.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/button.js +108 -0
- package/esm/src/react/components/chat/ui/card.d.ts +42 -0
- package/esm/src/react/components/chat/ui/card.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/card.js +55 -0
- package/esm/src/react/components/chat/ui/checkbox.d.ts +28 -0
- package/esm/src/react/components/chat/ui/checkbox.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/checkbox.js +36 -0
- package/esm/src/react/components/chat/ui/code-block.d.ts +89 -0
- package/esm/src/react/components/chat/ui/code-block.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/code-block.js +277 -0
- package/esm/src/react/components/chat/ui/collapsible.d.ts +30 -0
- package/esm/src/react/components/chat/ui/collapsible.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/collapsible.js +44 -0
- package/esm/src/react/components/chat/ui/command.d.ts +65 -0
- package/esm/src/react/components/chat/ui/command.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/command.js +121 -0
- package/esm/src/react/components/chat/ui/cva.d.ts +36 -0
- package/esm/src/react/components/chat/ui/cva.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/cva.js +45 -0
- package/esm/src/react/components/chat/ui/dialog.d.ts +55 -0
- package/esm/src/react/components/chat/ui/dialog.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/dialog.js +116 -0
- package/esm/src/react/components/chat/ui/drawer.d.ts +41 -0
- package/esm/src/react/components/chat/ui/drawer.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/drawer.js +92 -0
- package/esm/src/react/components/chat/ui/dropdown-menu.d.ts +63 -0
- package/esm/src/react/components/chat/ui/dropdown-menu.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/dropdown-menu.js +76 -0
- package/esm/src/react/components/chat/ui/file-type.d.ts +26 -0
- package/esm/src/react/components/chat/ui/file-type.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/file-type.js +235 -0
- package/esm/src/react/components/chat/ui/floating.d.ts +29 -0
- package/esm/src/react/components/chat/ui/floating.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/floating.js +90 -0
- package/esm/src/react/components/chat/ui/icon-button.d.ts +19 -0
- package/esm/src/react/components/chat/ui/icon-button.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/icon-button.js +20 -0
- package/esm/src/react/components/chat/ui/index.d.ts +43 -0
- package/esm/src/react/components/chat/ui/index.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/index.js +42 -0
- package/esm/src/react/components/chat/ui/input.d.ts +27 -0
- package/esm/src/react/components/chat/ui/input.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/input.js +41 -0
- package/esm/src/react/components/chat/ui/label.d.ts +29 -0
- package/esm/src/react/components/chat/ui/label.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/label.js +40 -0
- package/esm/src/react/components/chat/ui/list.d.ts +47 -0
- package/esm/src/react/components/chat/ui/list.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/list.js +40 -0
- package/esm/src/react/components/chat/ui/pill.d.ts +26 -0
- package/esm/src/react/components/chat/ui/pill.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/pill.js +39 -0
- package/esm/src/react/components/chat/ui/popover.d.ts +47 -0
- package/esm/src/react/components/chat/ui/popover.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/popover.js +68 -0
- package/esm/src/react/components/chat/ui/progress-bar.d.ts +20 -0
- package/esm/src/react/components/chat/ui/progress-bar.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/progress-bar.js +31 -0
- package/esm/src/react/components/chat/ui/radio.d.ts +25 -0
- package/esm/src/react/components/chat/ui/radio.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/radio.js +29 -0
- package/esm/src/react/components/chat/ui/scroll-fade.d.ts +23 -0
- package/esm/src/react/components/chat/ui/scroll-fade.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/scroll-fade.js +40 -0
- package/esm/src/react/components/chat/ui/select.d.ts +64 -0
- package/esm/src/react/components/chat/ui/select.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/select.js +148 -0
- package/esm/src/react/components/chat/ui/shimmer.d.ts +25 -0
- package/esm/src/react/components/chat/ui/shimmer.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/shimmer.js +24 -0
- package/esm/src/react/components/chat/ui/skeleton.d.ts +14 -0
- package/esm/src/react/components/chat/ui/skeleton.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/skeleton.js +12 -0
- package/esm/src/react/components/chat/ui/slot.d.ts +21 -0
- package/esm/src/react/components/chat/ui/slot.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/slot.js +70 -0
- package/esm/src/react/components/chat/ui/status.d.ts +28 -0
- package/esm/src/react/components/chat/ui/status.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/status.js +23 -0
- package/esm/src/react/components/chat/ui/switch.d.ts +34 -0
- package/esm/src/react/components/chat/ui/switch.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/switch.js +58 -0
- package/esm/src/react/components/chat/ui/tabs.d.ts +44 -0
- package/esm/src/react/components/chat/ui/tabs.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/tabs.js +51 -0
- package/esm/src/react/components/chat/ui/tag.d.ts +22 -0
- package/esm/src/react/components/chat/ui/tag.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/tag.js +27 -0
- package/esm/src/react/components/chat/ui/textarea.d.ts +22 -0
- package/esm/src/react/components/chat/ui/textarea.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/textarea.js +35 -0
- package/esm/src/react/components/chat/ui/tooltip.d.ts +40 -0
- package/esm/src/react/components/chat/ui/tooltip.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/tooltip.js +132 -0
- package/esm/src/react/primitives/input-box.d.ts.map +1 -1
- package/esm/src/react/primitives/input-box.js +17 -4
- package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/framework-candidates.generated.js +9437 -1064
- package/esm/src/server/handlers/dev/projects/html-shell.d.ts +1 -1
- package/esm/src/server/handlers/dev/projects/html-shell.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/projects/html-shell.js +1 -12
- package/esm/src/server/handlers/request/public-agents-list.handler.d.ts +18 -0
- package/esm/src/server/handlers/request/public-agents-list.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/public-agents-list.handler.js +44 -0
- package/esm/src/server/runtime-handler/index.d.ts +1 -1
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +3 -0
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.js +3 -2
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/workflow/blob/local-storage.d.ts +32 -0
- package/esm/src/workflow/blob/local-storage.d.ts.map +1 -0
- package/esm/src/workflow/blob/local-storage.js +179 -0
- package/esm/src/workflow/blob/types.d.ts +5 -0
- package/esm/src/workflow/blob/types.d.ts.map +1 -1
- package/esm/src/workflow/blob/veryfront-cloud-storage.d.ts +11 -0
- package/esm/src/workflow/blob/veryfront-cloud-storage.d.ts.map +1 -1
- package/esm/src/workflow/blob/veryfront-cloud-storage.js +36 -0
- package/package.json +5 -1
- package/esm/src/react/components/chat/chat/components/uploads-panel.d.ts +0 -20
- package/esm/src/react/components/chat/chat/components/uploads-panel.d.ts.map +0 -1
- package/esm/src/react/components/chat/chat/components/uploads-panel.js +0 -49
- package/esm/src/react/components/chat/chat/contexts/thread-list-context.d.ts +0 -28
- package/esm/src/react/components/chat/chat/contexts/thread-list-context.d.ts.map +0 -1
- package/esm/src/react/components/chat/chat/contexts/thread-list-context.js +0 -27
- package/esm/src/react/components/chat/chat/hooks/use-threads.d.ts +0 -28
- package/esm/src/react/components/chat/chat/hooks/use-threads.d.ts.map +0 -1
- package/esm/src/react/components/chat/chat/hooks/use-threads.js +0 -151
- package/esm/src/react/components/chat/chat-with-sidebar.d.ts +0 -110
- package/esm/src/react/components/chat/chat-with-sidebar.d.ts.map +0 -1
- package/esm/src/react/components/chat/chat-with-sidebar.js +0 -167
- package/esm/src/react/components/chat/message.d.ts +0 -42
- package/esm/src/react/components/chat/message.d.ts.map +0 -1
- package/esm/src/react/components/chat/message.js +0 -69
|
@@ -10,23 +10,21 @@
|
|
|
10
10
|
*
|
|
11
11
|
* export default function Page() {
|
|
12
12
|
* const chat = useChat();
|
|
13
|
-
* return
|
|
14
|
-
* <Chat
|
|
15
|
-
* messages={chat.messages}
|
|
16
|
-
* input={chat.input}
|
|
17
|
-
* onChange={chat.handleInputChange}
|
|
18
|
-
* onSubmit={chat.handleSubmit}
|
|
19
|
-
* />
|
|
20
|
-
* );
|
|
13
|
+
* return <Chat chat={chat} />;
|
|
21
14
|
* }
|
|
22
15
|
* ```
|
|
23
16
|
*
|
|
17
|
+
* @example App mode (black box — no wiring)
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <Chat agentId="support" api="/api/ag-ui" />
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
24
22
|
* @example Custom layout (composition)
|
|
25
23
|
* ```tsx
|
|
26
24
|
* <Chat.Root messages={messages} input={input}>
|
|
27
25
|
* <Chat.Empty title="Ask anything" />
|
|
28
26
|
* <Chat.MessageList messages={messages} />
|
|
29
|
-
* <Chat.
|
|
27
|
+
* <Chat.Input input={input} onChange={onChange} />
|
|
30
28
|
* </Chat.Root>
|
|
31
29
|
* ```
|
|
32
30
|
*
|
|
@@ -44,94 +42,140 @@
|
|
|
44
42
|
* @module react/components/chat
|
|
45
43
|
*/
|
|
46
44
|
import * as React from "../../../../../react/react.js";
|
|
47
|
-
import { useVoiceInput } from "../../../../agent/react/index.js";
|
|
45
|
+
import { useChat, useVoiceInput } from "../../../../agent/react/index.js";
|
|
46
|
+
import { useAgentMetadata } from "../../../../agent/react/use-agent-metadata.js";
|
|
48
47
|
import { defaultChatTheme, mergeThemes } from "../theme.js";
|
|
48
|
+
import { useUpload } from "./hooks/use-upload.js";
|
|
49
49
|
// Composition imports (used in the Chat preset)
|
|
50
50
|
import { ChatRoot } from "./composition/chat-root.js";
|
|
51
|
-
import {
|
|
51
|
+
import { ChatInput } from "./composition/chat-composer.js";
|
|
52
52
|
import { ChatMessageList } from "./composition/chat-message-list.js";
|
|
53
53
|
import { ChatEmpty } from "./composition/chat-empty.js";
|
|
54
|
+
import { AgentAvatar } from "./composition/agent-avatar.js";
|
|
54
55
|
import { ChatIf } from "./composition/chat-if.js";
|
|
55
56
|
import { ErrorBanner } from "./composition/error-banner.js";
|
|
56
57
|
import { Message } from "./composition/message.js";
|
|
57
|
-
import {
|
|
58
|
+
import { ChatMessagesSkeleton } from "./components/chat-messages-skeleton.js";
|
|
58
59
|
import { TabSwitcher } from "./components/tab-switcher.js";
|
|
59
|
-
import {
|
|
60
|
+
import { AttachmentsPanel } from "./components/attachments-panel.js";
|
|
60
61
|
import { InferenceBadge } from "./components/inference-badge.js";
|
|
61
62
|
import { QuickActions as QuickActionsComponent } from "./components/quick-actions.js";
|
|
62
63
|
// ---------------------------------------------------------------------------
|
|
63
64
|
// Re-exports — sub-components
|
|
64
65
|
// ---------------------------------------------------------------------------
|
|
65
66
|
export { FadeIn, Loader, Shimmer } from "./components/animations.js";
|
|
66
|
-
export { ReasoningCard } from "./components/reasoning.js";
|
|
67
|
+
export { Reasoning, ReasoningCard, useReasoning, } from "./components/reasoning.js";
|
|
67
68
|
export { ConversationEmptyState, ConversationScrollButton, Suggestion, Suggestions, } from "./components/empty-state.js";
|
|
68
|
-
export {
|
|
69
|
+
export { MessageActionBar } from "./components/message-actions.js";
|
|
69
70
|
export { MessageEditForm } from "./components/message-edit-form.js";
|
|
70
71
|
export { BranchPicker } from "./components/branch-picker.js";
|
|
71
72
|
export { DropZoneOverlay } from "./components/drop-zone.js";
|
|
73
|
+
export { ChatMessagesSkeleton, } from "./components/chat-messages-skeleton.js";
|
|
72
74
|
export { SkillBadge } from "./components/skill-badge.js";
|
|
73
|
-
export { ToolCallCard, ToolStatusBadge } from "./components/tool-ui.js";
|
|
75
|
+
export { ToolCall, ToolCallCard, ToolStatusBadge, useToolCall, } from "./components/tool-ui.js";
|
|
74
76
|
export { InferenceBadge } from "./components/inference-badge.js";
|
|
75
|
-
export { Sources } from "./components/sources.js";
|
|
77
|
+
export { SourcePill, Sources, useSources, } from "./components/sources.js";
|
|
76
78
|
export { InlineCitation } from "./components/inline-citation.js";
|
|
77
79
|
export { MessageFeedback, } from "./components/message-feedback.js";
|
|
78
|
-
export { AttachmentPill, } from "./components/attachment-pill.js";
|
|
80
|
+
export { AttachmentPill, useAttachmentPill, } from "./components/attachment-pill.js";
|
|
79
81
|
export { RichCodeBlock } from "./components/code-block.js";
|
|
80
|
-
export { StepIndicator } from "./components/step-indicator.js";
|
|
81
|
-
|
|
82
|
+
export { StepIndicator, useStepIndicator, } from "./components/step-indicator.js";
|
|
83
|
+
// The sub-components (`ChatSidebar.Root` / `.Item` / …) hang off the compound
|
|
84
|
+
// object, so only the preset needs to be a runtime export. The rest are
|
|
85
|
+
// type-only — they annotate props without widening the public runtime surface.
|
|
86
|
+
export { ChatSidebar, } from "./components/sidebar.js";
|
|
82
87
|
export { TabSwitcher } from "./components/tab-switcher.js";
|
|
83
88
|
export { QuickActions, } from "./components/quick-actions.js";
|
|
84
|
-
export {
|
|
89
|
+
export { AttachmentsPanel, useAttachmentsPanel, } from "./components/attachments-panel.js";
|
|
85
90
|
// Re-exports — hooks
|
|
86
|
-
export {
|
|
91
|
+
export { useConversations, } from "./hooks/use-conversations.js";
|
|
92
|
+
export { useConversation, } from "./hooks/use-conversation.js";
|
|
93
|
+
export { ConversationsContextProvider, ConversationsProvider, useConversationsContext, useConversationsContextOptional, } from "./contexts/conversations-context.js";
|
|
94
|
+
// Local binding for the `<Chat>` optional-provider integration below (the line
|
|
95
|
+
// above only re-exports; it does not import the name for use in this module).
|
|
96
|
+
import { useConversationsContextOptional } from "./contexts/conversations-context.js";
|
|
97
|
+
import { createEmptyConversation, DEFAULT_CONVERSATION_TITLE, deriveTitle, } from "./hooks/use-conversations.js";
|
|
98
|
+
export { localConversationStore, } from "./persistence/local-conversation-store.js";
|
|
99
|
+
export { memoryConversationStore } from "./persistence/memory-conversation-store.js";
|
|
100
|
+
export { useUpload } from "./hooks/use-upload.js";
|
|
101
|
+
export { useUploadsRegistry, } from "./hooks/use-uploads-registry.js";
|
|
102
|
+
export { useStickToBottom, } from "./hooks/use-stick-to-bottom.js";
|
|
87
103
|
// Re-exports — utils
|
|
88
104
|
export { extractSourcesFromParts, getTextContent, groupPartsInOrder, isReasoningPart, isSkillToolPart, isToolPart, } from "./utils/message-parts.js";
|
|
89
105
|
export { downloadMarkdown, exportAsMarkdown } from "./utils/export.js";
|
|
90
106
|
// Re-exports — composition
|
|
91
|
-
export { AgentAvatar,
|
|
107
|
+
export { AgentAvatar, ChatEmpty, ChatEmptyState, ChatIf, ChatInput, ChatMessageList, ChatRoot, ErrorBanner, Message, ModelAvatar, } from "./composition/api.js";
|
|
92
108
|
// Re-exports — contexts
|
|
93
|
-
export { ChatContextProvider, ComposerContextProvider, MessageContextProvider,
|
|
109
|
+
export { ChatContextProvider, ComposerContextProvider, MessageContextProvider, useChatContext, useChatContextOptional, useComposerContext, useComposerContextOptional, useMessageContext, useMessageContextOptional, } from "./contexts/index.js";
|
|
94
110
|
// ---------------------------------------------------------------------------
|
|
95
111
|
// Chat — Preset component
|
|
96
112
|
//
|
|
97
|
-
// Composes ChatRoot, ChatMessageList,
|
|
113
|
+
// Composes ChatRoot, ChatMessageList, ChatInput, ChatEmpty, etc. into a
|
|
98
114
|
// full-featured chat UI with sensible defaults. For custom layouts, use the
|
|
99
115
|
// building blocks directly.
|
|
100
116
|
// ---------------------------------------------------------------------------
|
|
101
|
-
/** Render chat. */
|
|
102
|
-
|
|
103
|
-
const theme = React.useMemo(() => mergeThemes(defaultChatTheme, userTheme), [
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
117
|
+
/** Render the controlled chat (caller supplies `messages`/`input`). */
|
|
118
|
+
const ControlledChat = React.forwardRef(function ControlledChat({ messages = [], input = "", onChange = () => { }, onSubmit, sendMessage, stop, reload, enableVoice = false, onVoice, setInput, isLoading, error, placeholder = "Type a message...", maxHeight = "100%", className, theme: userTheme, renderMessage, renderTool, suggestions, onSuggestionClick, emptyState, initializing = false, skeleton, agent, showScrollButton = false, showMessageActions = true, models, model, activeModel, onModelChange, inferenceMode, showSources = false, onSourceClick, enableAttachments = true, uploadApi, onAttach, onSelectAttachment, onDrop, attachAccept, attachments, onRemoveAttachment, showExport = false, onFeedback, editMessage, getBranches, switchBranch, showSteps = false, showTabs = false, activeTab: controlledTab, onTabChange: controlledTabChange, uploads, onRemoveUpload, quickActions, onQuickAction, toolbarStart, hideTabSwitcher = false, children, }, ref) {
|
|
119
|
+
const theme = React.useMemo(() => mergeThemes(defaultChatTheme, userTheme), [
|
|
120
|
+
userTheme,
|
|
121
|
+
]);
|
|
122
|
+
// --- Attachments (batteries-included) ---
|
|
123
|
+
// The composer's `+` menu and drag-to-attach are on by default: when the
|
|
124
|
+
// caller wires none of the attachment props, `<Chat>` manages the pending
|
|
125
|
+
// files itself so `<Chat />` "just works". Pass any attachment prop to take
|
|
126
|
+
// control; pass `enableAttachments={false}` to hide the control entirely.
|
|
127
|
+
const isAttachControlled = onAttach !== undefined ||
|
|
128
|
+
onDrop !== undefined ||
|
|
129
|
+
attachments !== undefined ||
|
|
130
|
+
onRemoveAttachment !== undefined ||
|
|
131
|
+
onSelectAttachment !== undefined;
|
|
132
|
+
// When the caller wires no attachment props, `<Chat>` self-manages pending
|
|
133
|
+
// files through `useUpload` — the SAME hook app-mode uses — so drag/`+`
|
|
134
|
+
// uploads get an instant thumbnail (`preview`) and a resolved `url` (base64
|
|
135
|
+
// `data:` by default, or a durable POST when `uploadApi` is set). The old
|
|
136
|
+
// path only recorded name/size, so pills had no preview and never sent.
|
|
137
|
+
const upload = useUpload({ api: uploadApi });
|
|
138
|
+
const manageAttachments = enableAttachments && !isAttachControlled;
|
|
139
|
+
const effectiveOnAttach = !enableAttachments
|
|
140
|
+
? undefined
|
|
141
|
+
: isAttachControlled
|
|
142
|
+
? onAttach
|
|
143
|
+
: upload.upload;
|
|
144
|
+
const effectiveOnDrop = !enableAttachments
|
|
145
|
+
? undefined
|
|
146
|
+
: isAttachControlled
|
|
147
|
+
? onDrop
|
|
148
|
+
: upload.upload;
|
|
149
|
+
const effectiveAttachments = isAttachControlled ? attachments : upload.attachments;
|
|
150
|
+
const effectiveOnRemove = !enableAttachments
|
|
151
|
+
? undefined
|
|
152
|
+
: isAttachControlled
|
|
153
|
+
? onRemoveAttachment
|
|
154
|
+
: upload.remove;
|
|
155
|
+
// Self-managed attachments must ride along on submit: the caller's
|
|
156
|
+
// `onSubmit` only carries the input text, so fold the uploaded files into
|
|
157
|
+
// `sendMessage({ text, files })` (then clear). Falls back to `onSubmit` for
|
|
158
|
+
// a text-only turn, when the caller controls attachments, or when no
|
|
159
|
+
// `sendMessage` is available.
|
|
160
|
+
const handleSubmit = React.useCallback((e) => {
|
|
161
|
+
if (manageAttachments && sendMessage) {
|
|
162
|
+
// Wait for pending uploads: sending now would carry only the resolved
|
|
163
|
+
// files and silently drop the one still in flight.
|
|
164
|
+
if (hasPendingAttachments(upload.attachments)) {
|
|
165
|
+
e?.preventDefault();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const files = attachmentsToFileParts(upload.attachments);
|
|
169
|
+
if (files.length > 0) {
|
|
170
|
+
e?.preventDefault();
|
|
171
|
+
void sendMessage({ text: input.trim(), files });
|
|
172
|
+
setInput?.("");
|
|
173
|
+
upload.clear();
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
133
176
|
}
|
|
134
|
-
|
|
177
|
+
onSubmit?.(e);
|
|
178
|
+
}, [manageAttachments, sendMessage, upload, input, setInput, onSubmit]);
|
|
135
179
|
// --- Tab state ---
|
|
136
180
|
const [internalTab, setInternalTab] = React.useState("chat");
|
|
137
181
|
const currentTab = controlledTab ?? internalTab;
|
|
@@ -152,37 +196,287 @@ export const Chat = React.forwardRef(function Chat({ messages, input, onChange,
|
|
|
152
196
|
return undefined;
|
|
153
197
|
}, [onVoice, enableVoice, voice.isSupported, voice.toggle, setInput]);
|
|
154
198
|
const isEmpty = messages.length === 0;
|
|
155
|
-
const isDocsTab = showTabs && currentTab === "
|
|
156
|
-
|
|
157
|
-
? {
|
|
158
|
-
onDragEnter: handleDragEnter,
|
|
159
|
-
onDragLeave: handleDragLeave,
|
|
160
|
-
onDragOver: handleDragOver,
|
|
161
|
-
onDrop: handleFileDrop,
|
|
162
|
-
}
|
|
163
|
-
: {};
|
|
164
|
-
return (React.createElement(ChatRoot, { ref: ref, messages: messages, input: input, isLoading: isLoading, error: error, setInput: setInput, onSubmit: onSubmit, onStop: stop, onReload: reload, model: model, models: models, onModelChange: onModelChange, attachments: attachments, onAttach: onAttach, onRemoveAttachment: onRemoveAttachment, editMessage: editMessage, getBranches: getBranches, switchBranch: switchBranch, onFeedback: onFeedback, showSources: showSources, onSourceClick: onSourceClick, theme: userTheme, maxHeight: maxHeight, className: className, ...dragProps },
|
|
165
|
-
dropHandler && React.createElement(DropZoneOverlay, { visible: dragOver, accept: attachAccept }),
|
|
199
|
+
const isDocsTab = showTabs && currentTab === "attachments";
|
|
200
|
+
return (React.createElement(ChatRoot, { ref: ref, messages: messages, input: input, isLoading: isLoading, error: error, setInput: setInput, onSubmit: handleSubmit, onStop: stop, onReload: reload, model: model, models: models, onModelChange: onModelChange, agent: agent, attachments: effectiveAttachments, onAttach: effectiveOnAttach, onRemoveAttachment: effectiveOnRemove, editMessage: editMessage, getBranches: getBranches, switchBranch: switchBranch, onFeedback: onFeedback, showSources: showSources, onSourceClick: onSourceClick, theme: userTheme, maxHeight: maxHeight, className: className },
|
|
166
201
|
showTabs && !hideTabSwitcher && (React.createElement(TabSwitcher, { activeTab: currentTab, onTabChange: handleTabChange })),
|
|
167
202
|
isDocsTab
|
|
168
|
-
? (React.createElement(
|
|
169
|
-
: isEmpty
|
|
170
|
-
|
|
171
|
-
|
|
203
|
+
? (React.createElement(AttachmentsPanel, { uploads: uploads, onRemoveUpload: onRemoveUpload, onAttach: effectiveOnAttach, attachAccept: attachAccept, onClose: () => handleTabChange("chat"), className: "flex-1 min-h-0" }))
|
|
204
|
+
: isEmpty && (isLoading || initializing)
|
|
205
|
+
// Thread still loading its history (or agent metadata still
|
|
206
|
+
// resolving) → skeleton, not an idle placeholder.
|
|
207
|
+
? (skeleton ?? React.createElement(ChatMessagesSkeleton, null))
|
|
208
|
+
: isEmpty && emptyState
|
|
209
|
+
// Idle hero is opt-in: only rendered when the consumer supplies an
|
|
210
|
+
// `emptyState`. Otherwise an empty thread is just a blank canvas +
|
|
211
|
+
// composer — no "What can I help with?" placeholder.
|
|
212
|
+
? (React.createElement(ChatEmpty, { icon: emptyState.icon, title: emptyState.title, description: emptyState.description, suggestions: suggestions, onSuggestionClick: onSuggestionClick }))
|
|
213
|
+
: (React.createElement(ChatMessageList, { messages: messages, isLoading: isLoading, theme: theme, renderMessage: renderMessage, renderTool: renderTool, model: activeModel || model, showMessageActions: showMessageActions, showSources: showSources, showSteps: showSteps, showScrollButton: showScrollButton, onSourceClick: onSourceClick, inferenceMode: inferenceMode, editMessage: editMessage, getBranches: getBranches, switchBranch: switchBranch, onFeedback: onFeedback })),
|
|
172
214
|
error && React.createElement(ErrorBanner, { error: error, onRetry: reload }),
|
|
173
|
-
!isDocsTab && (React.createElement(
|
|
215
|
+
!isDocsTab && (React.createElement(ChatInput, { input: voice.isListening ? voice.transcript || input : input, onChange: onChange, onSubmit: handleSubmit, isLoading: isLoading, placeholder: voice.isListening ? "Listening..." : placeholder, theme: theme, stop: voice.isListening ? undefined : stop, onVoice: voiceHandler, isListening: voice.isListening, transcript: voice.transcript, models: models, model: model, onModelChange: onModelChange, onAttach: effectiveOnAttach, onSelectAttachment: onSelectAttachment, onDrop: effectiveOnDrop, attachAccept: attachAccept, attachments: effectiveAttachments, onRemoveAttachment: effectiveOnRemove, showExport: showExport, messages: messages, toolbarStart: toolbarStart },
|
|
174
216
|
inferenceMode && inferenceMode !== "cloud" && (React.createElement(InferenceBadge, { inferenceMode: inferenceMode })),
|
|
175
217
|
isEmpty && quickActions && quickActions.length > 0 && (React.createElement(QuickActionsComponent, { actions: quickActions, onActionClick: onQuickAction })))),
|
|
176
218
|
children));
|
|
177
219
|
});
|
|
178
|
-
|
|
220
|
+
ControlledChat.displayName = "ControlledChat";
|
|
221
|
+
/**
|
|
222
|
+
* Map agent-metadata suggestions to `{ label, prompt }`. The chip shows the
|
|
223
|
+
* short `title` ("Triage login issue") while the click sends the full `prompt`
|
|
224
|
+
* ("Triage a customer who cannot sign in after a release.") — so the empty
|
|
225
|
+
* state stays scannable without truncating what the agent actually receives.
|
|
226
|
+
*/
|
|
227
|
+
function agentSuggestionItems(suggestions) {
|
|
228
|
+
const list = suggestions?.suggestions;
|
|
229
|
+
if (!Array.isArray(list))
|
|
230
|
+
return [];
|
|
231
|
+
return list.flatMap((s) => {
|
|
232
|
+
if (s.type !== "prompt" || !("prompt" in s) || !s.prompt)
|
|
233
|
+
return [];
|
|
234
|
+
const title = s.title;
|
|
235
|
+
const label = typeof title === "string" && title.length > 0 ? title : s.prompt;
|
|
236
|
+
return [{ label, prompt: s.prompt }];
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Map uploaded attachments to `file` message parts. Only attachments that
|
|
241
|
+
* finished uploading (have a resolved `url`) are sent — pending/errored ones
|
|
242
|
+
* are skipped so a half-uploaded file never reaches the agent.
|
|
243
|
+
*/
|
|
244
|
+
function attachmentsToFileParts(items) {
|
|
245
|
+
return items
|
|
246
|
+
.filter((a) => Boolean(a.url))
|
|
247
|
+
.map((a) => ({
|
|
248
|
+
type: "file",
|
|
249
|
+
mediaType: a.type ?? "application/octet-stream",
|
|
250
|
+
url: a.url,
|
|
251
|
+
filename: a.name,
|
|
252
|
+
...(a.size != null ? { size: a.size } : {}),
|
|
253
|
+
}));
|
|
254
|
+
}
|
|
255
|
+
/** True while any attachment is still resolving its `url`; submits must wait
|
|
256
|
+
* or the fold above would silently drop the pending file. */
|
|
257
|
+
function hasPendingAttachments(items) {
|
|
258
|
+
return items.some((a) => a.state === "uploading" || a.state === "processing");
|
|
259
|
+
}
|
|
260
|
+
const UncontrolledChat = React.forwardRef(function UncontrolledChat({ agentId, api = "/api/ag-ui", initialMessages, onError, onUpdate, models, suggestions: suggestionsProp, onSuggestionClick, emptyState,
|
|
261
|
+
// App mode defaults the scroll-to-bottom button on (batteries-included).
|
|
262
|
+
showScrollButton = true,
|
|
263
|
+
// Attachments: default-wired through `useUpload` unless the caller
|
|
264
|
+
// controls them. With no `uploadApi`, files inline as base64 `data:` URLs
|
|
265
|
+
// (guest mode — zero backend). Set `uploadApi` to POST to a durable
|
|
266
|
+
// upload endpoint (multipart `file` → `{ url }`) for real users + a project.
|
|
267
|
+
uploadApi, enableAttachments = true, onAttach: userOnAttach, onDrop: userOnDrop, attachments: userAttachments, onRemoveAttachment: userOnRemoveAttachment, onSubmit: userOnSubmit, ...rest }, ref) {
|
|
268
|
+
// Inside a `ConversationsProvider`, bind to the active conversation — seed
|
|
269
|
+
// from its messages/agent and persist changes back. No props: the context
|
|
270
|
+
// carries it, so standalone `<Chat>` (no provider) is unchanged. `active`
|
|
271
|
+
// must match `activeId` so we never seed from a still-loading thread.
|
|
272
|
+
const conversations = useConversationsContextOptional();
|
|
273
|
+
const bound = conversations?.active && conversations.active.id === conversations.activeId
|
|
274
|
+
? conversations.active
|
|
275
|
+
: null;
|
|
276
|
+
const resolvedAgentId = bound?.agentId ?? agentId;
|
|
277
|
+
const chat = useChat({
|
|
278
|
+
api,
|
|
279
|
+
initialMessages: bound ? bound.messages : initialMessages,
|
|
280
|
+
onError,
|
|
281
|
+
body: resolvedAgentId ? { agentId: resolvedAgentId } : undefined,
|
|
282
|
+
});
|
|
283
|
+
const { agent, error: agentError } = useAgentMetadata(resolvedAgentId);
|
|
284
|
+
// --- Persistence sink (explicit prop → provider default → ephemeral) ------
|
|
285
|
+
// Resolve WHERE the live thread persists: an explicit `onUpdate` wins, else
|
|
286
|
+
// a surrounding `ConversationsProvider`'s `save`, else nothing. The sink
|
|
287
|
+
// takes the whole updated conversation; `<Chat>` owns building it (title
|
|
288
|
+
// included) so `useConversations` stays dumb about titling and `useChat`
|
|
289
|
+
// never touches the store.
|
|
290
|
+
const persist = onUpdate ?? conversations?.save;
|
|
291
|
+
// Identity for the emitted conversation: in a provider we ride the bound
|
|
292
|
+
// conversation (id/agentId/createdAt); standalone (explicit `onUpdate`, no
|
|
293
|
+
// provider) we mint one stable id so updates target a single record.
|
|
294
|
+
const syntheticRef = React.useRef(null);
|
|
295
|
+
const persistRef = React.useRef(persist);
|
|
296
|
+
persistRef.current = persist;
|
|
297
|
+
const boundRef = React.useRef(bound);
|
|
298
|
+
boundRef.current = bound;
|
|
299
|
+
const agentIdRef = React.useRef(resolvedAgentId);
|
|
300
|
+
agentIdRef.current = resolvedAgentId;
|
|
301
|
+
// Emit the whole conversation when the live messages change. Keyed on
|
|
302
|
+
// `chat.messages` + `boundId` only (sink/identity read via refs) so the
|
|
303
|
+
// save→setActive round-trip inside a provider can't feed a render loop.
|
|
304
|
+
// Seeded with the mount-time messages so merely *opening* a thread never
|
|
305
|
+
// re-saves it (a fresh `updatedAt` would jump it to the top of the sidebar).
|
|
306
|
+
const boundId = bound?.id;
|
|
307
|
+
const lastEmittedRef = React.useRef(null);
|
|
308
|
+
if (lastEmittedRef.current === null)
|
|
309
|
+
lastEmittedRef.current = chat.messages;
|
|
310
|
+
React.useEffect(() => {
|
|
311
|
+
const sink = persistRef.current;
|
|
312
|
+
if (!sink)
|
|
313
|
+
return;
|
|
314
|
+
if (chat.messages === lastEmittedRef.current)
|
|
315
|
+
return;
|
|
316
|
+
lastEmittedRef.current = chat.messages;
|
|
317
|
+
let base = boundRef.current;
|
|
318
|
+
if (!base) {
|
|
319
|
+
syntheticRef.current ??= createEmptyConversation({ agentId: agentIdRef.current });
|
|
320
|
+
base = syntheticRef.current;
|
|
321
|
+
}
|
|
322
|
+
const keepTitle = base.title !== "" && base.title !== DEFAULT_CONVERSATION_TITLE;
|
|
323
|
+
const title = keepTitle ? base.title : (deriveTitle(chat.messages) || base.title);
|
|
324
|
+
const conversation = {
|
|
325
|
+
...base,
|
|
326
|
+
messages: chat.messages,
|
|
327
|
+
title,
|
|
328
|
+
updatedAt: Date.now(),
|
|
329
|
+
};
|
|
330
|
+
// Fold the derived title back onto the synthetic identity so later emits
|
|
331
|
+
// don't re-derive it every keystroke of a streamed reply.
|
|
332
|
+
if (base === syntheticRef.current)
|
|
333
|
+
syntheticRef.current = conversation;
|
|
334
|
+
sink(conversation);
|
|
335
|
+
}, [chat.messages, boundId]);
|
|
336
|
+
// App mode owns the loading signal: from the very first paint until the
|
|
337
|
+
// agent resolves (or errors) we render the skeleton — never flash an idle
|
|
338
|
+
// placeholder first. Keyed off "agent not yet here" rather than the hook's
|
|
339
|
+
// `isLoading` flag so there's no one-frame gap on mount. Works out of the
|
|
340
|
+
// box — no `isLoading` wiring from the consumer.
|
|
341
|
+
const agentInitializing = Boolean(resolvedAgentId) && !agent && !agentError;
|
|
342
|
+
// Agent-driven empty state: avatar + name + description, shown once the
|
|
343
|
+
// agent resolves (the skeleton covers the load, so the generic
|
|
344
|
+
// "What can I help with?" placeholder never flashes). A consumer-supplied
|
|
345
|
+
// `emptyState` still wins.
|
|
346
|
+
const derivedEmptyState = React.useMemo(() => {
|
|
347
|
+
if (emptyState)
|
|
348
|
+
return emptyState;
|
|
349
|
+
if (!agent)
|
|
350
|
+
return undefined;
|
|
351
|
+
return {
|
|
352
|
+
icon: (React.createElement(AgentAvatar, { name: agent.name, avatarUrl: agent.avatarUrl ?? undefined, className: "size-12" })),
|
|
353
|
+
title: agent.name,
|
|
354
|
+
description: agent.description ?? undefined,
|
|
355
|
+
};
|
|
356
|
+
}, [emptyState, agent]);
|
|
357
|
+
// Chips show the short `title`; the click sends the full `prompt`.
|
|
358
|
+
const suggestionItems = React.useMemo(() => agentSuggestionItems(agent?.suggestions), [agent]);
|
|
359
|
+
const derivedSuggestions = suggestionsProp ??
|
|
360
|
+
(suggestionItems.length > 0 ? suggestionItems.map((s) => s.label) : undefined);
|
|
361
|
+
const handleSuggestion = onSuggestionClick ??
|
|
362
|
+
((label) => {
|
|
363
|
+
const item = suggestionItems.find((s) => s.label === label);
|
|
364
|
+
void chat.sendMessage({ text: item?.prompt ?? label });
|
|
365
|
+
});
|
|
366
|
+
// Batteries-included attachments: unless the caller controls them, files
|
|
367
|
+
// uploaded via the `+` menu / drag land here, ride along on submit as
|
|
368
|
+
// `file` parts, and clear once sent.
|
|
369
|
+
const upload = useUpload({ api: uploadApi });
|
|
370
|
+
const attachControlled = userOnAttach !== undefined ||
|
|
371
|
+
userOnDrop !== undefined ||
|
|
372
|
+
userAttachments !== undefined ||
|
|
373
|
+
userOnRemoveAttachment !== undefined;
|
|
374
|
+
const manageAttachments = enableAttachments && !attachControlled;
|
|
375
|
+
const submitWithAttachments = React.useCallback((e) => {
|
|
376
|
+
e?.preventDefault();
|
|
377
|
+
if (chat.isLoading)
|
|
378
|
+
return;
|
|
379
|
+
// Never send while a file is still uploading: the fold below only
|
|
380
|
+
// carries resolved urls, so submitting now would silently drop the
|
|
381
|
+
// pending attachment (and `clear()` would abort its upload).
|
|
382
|
+
if (hasPendingAttachments(upload.attachments))
|
|
383
|
+
return;
|
|
384
|
+
const text = chat.input.trim();
|
|
385
|
+
const files = attachmentsToFileParts(upload.attachments);
|
|
386
|
+
if (!text && files.length === 0)
|
|
387
|
+
return;
|
|
388
|
+
chat.setInput("");
|
|
389
|
+
upload.clear();
|
|
390
|
+
void chat.sendMessage({ text, files });
|
|
391
|
+
}, [chat, upload]);
|
|
392
|
+
return (React.createElement(ControlledChat, { ref: ref, messages: chat.messages, input: chat.input, onChange: chat.onChange, onSubmit: manageAttachments ? submitWithAttachments : (userOnSubmit ?? chat.onSubmit), stop: chat.stop, reload: () => void chat.reload(), setInput: chat.setInput, isLoading: chat.isLoading, error: chat.error, model: chat.model, activeModel: chat.activeModel, onModelChange: chat.onModelChange, inferenceMode: chat.inferenceMode, models: models, editMessage: chat.editMessage, getBranches: chat.getBranches, switchBranch: chat.switchBranch, emptyState: derivedEmptyState, agent: agent ? { name: agent.name, avatarUrl: agent.avatarUrl ?? undefined } : undefined, initializing: agentInitializing, suggestions: derivedSuggestions, onSuggestionClick: handleSuggestion, showScrollButton: showScrollButton, enableAttachments: enableAttachments, onAttach: manageAttachments ? upload.upload : userOnAttach, onDrop: manageAttachments ? upload.upload : userOnDrop, attachments: manageAttachments ? upload.attachments : userAttachments, onRemoveAttachment: manageAttachments ? upload.remove : userOnRemoveAttachment, ...rest }));
|
|
393
|
+
});
|
|
394
|
+
UncontrolledChat.displayName = "UncontrolledChat";
|
|
395
|
+
/**
|
|
396
|
+
* App-mode `<Chat>` with conversation-thread lifecycle when a
|
|
397
|
+
* `ConversationsProvider` is present: keys by the active id so switching threads
|
|
398
|
+
* remounts `UncontrolledChat` (fresh `useChat` seed), and holds the skeleton
|
|
399
|
+
* while the active thread's messages load from the store. No provider → renders
|
|
400
|
+
* `UncontrolledChat` unchanged.
|
|
401
|
+
*/
|
|
402
|
+
const ConversationBoundChat = React.forwardRef(function ConversationBoundChat(props, ref) {
|
|
403
|
+
const conversations = useConversationsContextOptional();
|
|
404
|
+
if (!conversations || conversations.activeId == null) {
|
|
405
|
+
return React.createElement(UncontrolledChat, { ref: ref, ...props });
|
|
406
|
+
}
|
|
407
|
+
const { active, activeId } = conversations;
|
|
408
|
+
// Wait for the active thread's messages before mounting, so `useChat` seeds
|
|
409
|
+
// from the right thread rather than a still-loading one.
|
|
410
|
+
if (active?.id !== activeId) {
|
|
411
|
+
return React.createElement(React.Fragment, null, props.skeleton ?? React.createElement(ChatMessagesSkeleton, null));
|
|
412
|
+
}
|
|
413
|
+
return React.createElement(UncontrolledChat, { key: activeId, ref: ref, ...props });
|
|
414
|
+
});
|
|
415
|
+
ConversationBoundChat.displayName = "ConversationBoundChat";
|
|
416
|
+
/**
|
|
417
|
+
* Normalize the consolidated `chat={useChat()}` / `agent={…}` objects onto the
|
|
418
|
+
* flat props `ControlledChat` consumes. The object API wins; the legacy flat
|
|
419
|
+
* props remain as a one-release fallback. Agent-driven content (`models`,
|
|
420
|
+
* `suggestions`) folds in too.
|
|
421
|
+
*/
|
|
422
|
+
function resolveControlledProps(props) {
|
|
423
|
+
const { chat, agent } = props;
|
|
424
|
+
const merged = {
|
|
425
|
+
...props,
|
|
426
|
+
models: agent?.models ?? props.models,
|
|
427
|
+
suggestions: props.suggestions ?? agent?.suggestions,
|
|
428
|
+
};
|
|
429
|
+
if (chat) {
|
|
430
|
+
merged.messages = chat.messages;
|
|
431
|
+
merged.input = chat.input;
|
|
432
|
+
merged.onChange = chat.onChange;
|
|
433
|
+
merged.onSubmit = props.onSubmit ?? chat.onSubmit;
|
|
434
|
+
merged.sendMessage = chat.sendMessage;
|
|
435
|
+
merged.stop = chat.stop;
|
|
436
|
+
merged.reload = () => void chat.reload();
|
|
437
|
+
merged.setInput = chat.setInput;
|
|
438
|
+
merged.isLoading = chat.isLoading;
|
|
439
|
+
merged.error = chat.error;
|
|
440
|
+
merged.model = chat.model;
|
|
441
|
+
merged.activeModel = chat.activeModel;
|
|
442
|
+
merged.onModelChange = chat.onModelChange;
|
|
443
|
+
merged.inferenceMode = chat.inferenceMode;
|
|
444
|
+
merged.editMessage = chat.editMessage;
|
|
445
|
+
merged.getBranches = chat.getBranches;
|
|
446
|
+
merged.switchBranch = chat.switchBranch;
|
|
447
|
+
}
|
|
448
|
+
return merged;
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Chat — batteries-included chat surface.
|
|
452
|
+
*
|
|
453
|
+
* - **App mode (uncontrolled):** omit `chat`/`messages` and pass `agentId` +
|
|
454
|
+
* `api`; `<Chat>` wires `useChat` + `useAgentMetadata` internally. Inside a
|
|
455
|
+
* `ConversationsProvider` it also binds to the active conversation.
|
|
456
|
+
* - **Controlled mode:** pass `chat={useChat()}` (preferred) or the legacy
|
|
457
|
+
* flat `messages` + `input` props to drive it yourself.
|
|
458
|
+
*/
|
|
459
|
+
const ChatBase = React.forwardRef(function Chat(props, ref) {
|
|
460
|
+
// Controlled when the caller supplies a `chat` session (or the legacy flat
|
|
461
|
+
// message/input state); otherwise the component self-drives (app mode).
|
|
462
|
+
const isControlled = props.chat !== undefined ||
|
|
463
|
+
(props.messages !== undefined && props.input !== undefined);
|
|
464
|
+
return isControlled
|
|
465
|
+
? React.createElement(ControlledChat, { ref: ref, ...resolveControlledProps(props) })
|
|
466
|
+
: React.createElement(ConversationBoundChat, { ref: ref, ...props });
|
|
467
|
+
});
|
|
468
|
+
ChatBase.displayName = "Chat";
|
|
179
469
|
/** Render chat components. */
|
|
180
|
-
export const
|
|
470
|
+
export const Chat = Object.assign(ChatBase, {
|
|
181
471
|
Root: ChatRoot,
|
|
182
472
|
MessageList: ChatMessageList,
|
|
183
|
-
|
|
473
|
+
Input: ChatInput,
|
|
474
|
+
Composer: ChatInput,
|
|
184
475
|
Empty: ChatEmpty,
|
|
476
|
+
Skeleton: ChatMessagesSkeleton,
|
|
185
477
|
If: ChatIf,
|
|
186
478
|
Message: Message,
|
|
187
479
|
ErrorBanner: ErrorBanner,
|
|
188
480
|
});
|
|
481
|
+
/** @deprecated Back-compat alias — `Chat` is now the compound itself. */
|
|
482
|
+
export const ChatComponents = Chat;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConversationStore — the async, swappable persistence adapter behind
|
|
3
|
+
* {@link useConversations}. Mirrors the `BlobStorage` / `CacheStore` house
|
|
4
|
+
* style: async methods, one action per method, optional capability methods.
|
|
5
|
+
*
|
|
6
|
+
* Swap the whole store (localStorage / IndexedDB / your API) or override a
|
|
7
|
+
* single action by wrapping another store. The React hook drives the calls —
|
|
8
|
+
* `list()` on mount, `load(id)` when active changes, `save()` (debounced) on
|
|
9
|
+
* message/title change, `delete()` on remove — so adapters stay dumb and
|
|
10
|
+
* batching lives in the hook.
|
|
11
|
+
*
|
|
12
|
+
* Two decisions that matter the moment you leave localStorage:
|
|
13
|
+
* - `list()` returns **summaries** (no messages) so a sidebar never hauls every
|
|
14
|
+
* message of every conversation; `load(id)` fetches the full thread on open.
|
|
15
|
+
* - ids are minted client-side, so `save()` is a create-or-update **upsert**
|
|
16
|
+
* (REST: idempotent `PUT {base}/{id}`) — no async "create returns id" dance.
|
|
17
|
+
*
|
|
18
|
+
* @module react/components/chat/persistence/conversation-store
|
|
19
|
+
*/
|
|
20
|
+
import type { ChatMessage } from "../../../../../agent/react/index.js";
|
|
21
|
+
/** Fields shared by a conversation and its list summary. */
|
|
22
|
+
interface ConversationMeta {
|
|
23
|
+
id: string;
|
|
24
|
+
title: string;
|
|
25
|
+
/** Last agent this conversation talked to — lets a switcher restore per-thread. */
|
|
26
|
+
agentId?: string;
|
|
27
|
+
createdAt: number;
|
|
28
|
+
updatedAt: number;
|
|
29
|
+
}
|
|
30
|
+
/** Lightweight conversation metadata — what a list / sidebar needs (no messages). */
|
|
31
|
+
export interface ConversationSummary extends ConversationMeta {
|
|
32
|
+
/** Number of messages, so a list can show "empty" / reuse an empty draft
|
|
33
|
+
* without loading the message blob. Derived from the conversation on save. */
|
|
34
|
+
messageCount: number;
|
|
35
|
+
}
|
|
36
|
+
/** A full conversation — metadata + its messages. Fetched via {@link ConversationStore.load}. */
|
|
37
|
+
export interface Conversation extends ConversationMeta {
|
|
38
|
+
messages: ChatMessage[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Async persistence contract for conversations. Implement all four methods;
|
|
42
|
+
* `subscribe`/`dispose` are optional capabilities (feature-detect them).
|
|
43
|
+
*/
|
|
44
|
+
export interface ConversationStore {
|
|
45
|
+
/** All conversations as summaries (no messages), newest first. */
|
|
46
|
+
list(): Promise<ConversationSummary[]>;
|
|
47
|
+
/** Load one full conversation (with messages). `null` if it does not exist. */
|
|
48
|
+
load(id: string): Promise<Conversation | null>;
|
|
49
|
+
/** Create-or-update by id (upsert). */
|
|
50
|
+
save(conversation: Conversation): Promise<void>;
|
|
51
|
+
/** Delete a conversation. Idempotent — deleting a missing id is not an error. */
|
|
52
|
+
delete(id: string): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Optional: notify when conversations change out-of-band (another tab or
|
|
55
|
+
* device). Returns an unsubscribe fn. Backends that can push (IndexedDB via
|
|
56
|
+
* BroadcastChannel, an API via SSE) implement it; localStorage omits it.
|
|
57
|
+
*/
|
|
58
|
+
subscribe?(onChange: (ids: string[]) => void): () => void;
|
|
59
|
+
/** Optional: release resources (sockets, db handles). */
|
|
60
|
+
dispose?(): void;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=conversation-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-store.d.ts","sourceRoot":"","sources":["../../../../../../../src/src/react/components/chat/chat/persistence/conversation-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEvE,4DAA4D;AAC5D,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qFAAqF;AACrF,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D;mFAC+E;IAC/E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,iGAAiG;AACjG,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACvC,+EAA+E;IAC/E,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC/C,uCAAuC;IACvC,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,iFAAiF;IACjF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC;;;;OAIG;IACH,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC1D,yDAAyD;IACzD,OAAO,CAAC,IAAI,IAAI,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ConversationStore } from "./conversation-store.js";
|
|
2
|
+
/** The slice of the Web Storage API this adapter needs. */
|
|
3
|
+
export interface StorageLike {
|
|
4
|
+
getItem(key: string): string | null;
|
|
5
|
+
setItem(key: string, value: string): void;
|
|
6
|
+
removeItem(key: string): void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* localStorage-backed conversation persistence. Pass a `storage` to back it with
|
|
10
|
+
* something else (tests inject an in-memory store); defaults to `localStorage`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function localConversationStore(storageKey?: string, storage?: StorageLike): ConversationStore;
|
|
13
|
+
//# sourceMappingURL=local-conversation-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-conversation-store.d.ts","sourceRoot":"","sources":["../../../../../../../src/src/react/components/chat/chat/persistence/local-conversation-store.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAgB,iBAAiB,EAAuB,MAAM,yBAAyB,CAAC;AAEpG,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAmCD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,GAAE,MAAoB,EAChC,OAAO,GAAE,WAA8B,GACtC,iBAAiB,CAiDnB"}
|