@sveda-ai/vue 0.1.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/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/appearance.d.ts +52 -0
- package/dist/appearance.d.ts.map +1 -0
- package/dist/components/chat/AnimatedStreamBlock.vue.d.ts +16 -0
- package/dist/components/chat/AnimatedStreamBlock.vue.d.ts.map +1 -0
- package/dist/components/chat/ChatHistoryDropdown.vue.d.ts +17 -0
- package/dist/components/chat/ChatHistoryDropdown.vue.d.ts.map +1 -0
- package/dist/components/chat/ChatInput.vue.d.ts +30 -0
- package/dist/components/chat/ChatInput.vue.d.ts.map +1 -0
- package/dist/components/chat/ChatMessageActivityBlock.vue.d.ts +13 -0
- package/dist/components/chat/ChatMessageActivityBlock.vue.d.ts.map +1 -0
- package/dist/components/chat/ChatMessageItem.vue.d.ts +15 -0
- package/dist/components/chat/ChatMessageItem.vue.d.ts.map +1 -0
- package/dist/components/chat/ChatMessageList.vue.d.ts +31 -0
- package/dist/components/chat/ChatMessageList.vue.d.ts.map +1 -0
- package/dist/components/chat/ChatPendingIndicator.vue.d.ts +12 -0
- package/dist/components/chat/ChatPendingIndicator.vue.d.ts.map +1 -0
- package/dist/components/chat/ReasoningStream.vue.d.ts +11 -0
- package/dist/components/chat/ReasoningStream.vue.d.ts.map +1 -0
- package/dist/components/chat/index.d.ts +9 -0
- package/dist/components/chat/index.d.ts.map +1 -0
- package/dist/components/shell/SvedaAgentCompletedNotice.vue.d.ts +9 -0
- package/dist/components/shell/SvedaAgentCompletedNotice.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaAgentTasksPanel.vue.d.ts +12 -0
- package/dist/components/shell/SvedaAgentTasksPanel.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaChat.vue.d.ts +22 -0
- package/dist/components/shell/SvedaChat.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaContextUsageBar.vue.d.ts +10 -0
- package/dist/components/shell/SvedaContextUsageBar.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaHistorySheet.vue.d.ts +15 -0
- package/dist/components/shell/SvedaHistorySheet.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaHistorySidebar.vue.d.ts +15 -0
- package/dist/components/shell/SvedaHistorySidebar.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaInputSection.vue.d.ts +25 -0
- package/dist/components/shell/SvedaInputSection.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaLandingView.vue.d.ts +40 -0
- package/dist/components/shell/SvedaLandingView.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaMaxStepsNotice.vue.d.ts +13 -0
- package/dist/components/shell/SvedaMaxStepsNotice.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaMinimizedTrigger.vue.d.ts +15 -0
- package/dist/components/shell/SvedaMinimizedTrigger.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaModelControls.vue.d.ts +12 -0
- package/dist/components/shell/SvedaModelControls.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaModelSelect.vue.d.ts +10 -0
- package/dist/components/shell/SvedaModelSelect.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaQuickPrompts.vue.d.ts +13 -0
- package/dist/components/shell/SvedaQuickPrompts.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaResizeHandles.vue.d.ts +11 -0
- package/dist/components/shell/SvedaResizeHandles.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaTabs.vue.d.ts +17 -0
- package/dist/components/shell/SvedaTabs.vue.d.ts.map +1 -0
- package/dist/components/shell/SvedaToolbar.vue.d.ts +33 -0
- package/dist/components/shell/SvedaToolbar.vue.d.ts.map +1 -0
- package/dist/composables/useSvedaAgentTasks.d.ts +57 -0
- package/dist/composables/useSvedaAgentTasks.d.ts.map +1 -0
- package/dist/composables/useSvedaBootstrap.d.ts +18 -0
- package/dist/composables/useSvedaBootstrap.d.ts.map +1 -0
- package/dist/composables/useSvedaChat.d.ts +264 -0
- package/dist/composables/useSvedaChat.d.ts.map +1 -0
- package/dist/composables/useSvedaChatLayout.d.ts +39 -0
- package/dist/composables/useSvedaChatLayout.d.ts.map +1 -0
- package/dist/composables/useSvedaChatPage.d.ts +309 -0
- package/dist/composables/useSvedaChatPage.d.ts.map +1 -0
- package/dist/composables/useSvedaContextWindow.d.ts +10 -0
- package/dist/composables/useSvedaContextWindow.d.ts.map +1 -0
- package/dist/composables/useSvedaDocuments.d.ts +20 -0
- package/dist/composables/useSvedaDocuments.d.ts.map +1 -0
- package/dist/composables/useSvedaMaxStepsContinue.d.ts +12 -0
- package/dist/composables/useSvedaMaxStepsContinue.d.ts.map +1 -0
- package/dist/composables/useSvedaMessaging.d.ts +55 -0
- package/dist/composables/useSvedaMessaging.d.ts.map +1 -0
- package/dist/composables/useSvedaModel.d.ts +16 -0
- package/dist/composables/useSvedaModel.d.ts.map +1 -0
- package/dist/composables/useSvedaPrompts.d.ts +18 -0
- package/dist/composables/useSvedaPrompts.d.ts.map +1 -0
- package/dist/composables/useSvedaReadable.d.ts +3 -0
- package/dist/composables/useSvedaReadable.d.ts.map +1 -0
- package/dist/composables/useSvedaScroll.d.ts +19 -0
- package/dist/composables/useSvedaScroll.d.ts.map +1 -0
- package/dist/composables/useSvedaShell.d.ts +29 -0
- package/dist/composables/useSvedaShell.d.ts.map +1 -0
- package/dist/composables/useSvedaStreaming.d.ts +46 -0
- package/dist/composables/useSvedaStreaming.d.ts.map +1 -0
- package/dist/composables/useSvedaTool.d.ts +4 -0
- package/dist/composables/useSvedaTool.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +18 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/locales/en.d.ts +4 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/ru.d.ts +4 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6612 -0
- package/dist/launcherIcons.d.ts +5 -0
- package/dist/launcherIcons.d.ts.map +1 -0
- package/dist/lib/assistantMessage.d.ts +89 -0
- package/dist/lib/assistantMessage.d.ts.map +1 -0
- package/dist/lib/chatHistoryMerge.d.ts +20 -0
- package/dist/lib/chatHistoryMerge.d.ts.map +1 -0
- package/dist/lib/chatI18nKeys.d.ts +2 -0
- package/dist/lib/chatI18nKeys.d.ts.map +1 -0
- package/dist/lib/chatMessageVisibility.d.ts +4 -0
- package/dist/lib/chatMessageVisibility.d.ts.map +1 -0
- package/dist/lib/chatTabs.d.ts +9 -0
- package/dist/lib/chatTabs.d.ts.map +1 -0
- package/dist/lib/chatTitle.d.ts +3 -0
- package/dist/lib/chatTitle.d.ts.map +1 -0
- package/dist/lib/chatUiStorage.d.ts +4 -0
- package/dist/lib/chatUiStorage.d.ts.map +1 -0
- package/dist/lib/finalizeMessages.d.ts +21 -0
- package/dist/lib/finalizeMessages.d.ts.map +1 -0
- package/dist/lib/markdown.d.ts +8 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/modelLabels.d.ts +3 -0
- package/dist/lib/modelLabels.d.ts.map +1 -0
- package/dist/lib/pendingStatusRotation.d.ts +3 -0
- package/dist/lib/pendingStatusRotation.d.ts.map +1 -0
- package/dist/lib/useAnimatedText.d.ts +8 -0
- package/dist/lib/useAnimatedText.d.ts.map +1 -0
- package/dist/lib/userMessage.d.ts +17 -0
- package/dist/lib/userMessage.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/plugin.d.ts +64 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/styles.css +5 -0
- package/dist/ui/alert-dialog/AlertDialog.vue.d.ts +18 -0
- package/dist/ui/alert-dialog/AlertDialog.vue.d.ts.map +1 -0
- package/dist/ui/alert-dialog/AlertDialogAction.vue.d.ts +18 -0
- package/dist/ui/alert-dialog/AlertDialogAction.vue.d.ts.map +1 -0
- package/dist/ui/alert-dialog/AlertDialogCancel.vue.d.ts +18 -0
- package/dist/ui/alert-dialog/AlertDialogCancel.vue.d.ts.map +1 -0
- package/dist/ui/alert-dialog/AlertDialogContent.vue.d.ts +32 -0
- package/dist/ui/alert-dialog/AlertDialogContent.vue.d.ts.map +1 -0
- package/dist/ui/alert-dialog/AlertDialogDescription.vue.d.ts +18 -0
- package/dist/ui/alert-dialog/AlertDialogDescription.vue.d.ts.map +1 -0
- package/dist/ui/alert-dialog/AlertDialogFooter.vue.d.ts +17 -0
- package/dist/ui/alert-dialog/AlertDialogFooter.vue.d.ts.map +1 -0
- package/dist/ui/alert-dialog/AlertDialogHeader.vue.d.ts +17 -0
- package/dist/ui/alert-dialog/AlertDialogHeader.vue.d.ts.map +1 -0
- package/dist/ui/alert-dialog/AlertDialogTitle.vue.d.ts +18 -0
- package/dist/ui/alert-dialog/AlertDialogTitle.vue.d.ts.map +1 -0
- package/dist/ui/alert-dialog/AlertDialogTrigger.vue.d.ts +14 -0
- package/dist/ui/alert-dialog/AlertDialogTrigger.vue.d.ts.map +1 -0
- package/dist/ui/alert-dialog/index.d.ts +10 -0
- package/dist/ui/alert-dialog/index.d.ts.map +1 -0
- package/dist/ui/badge/Badge.vue.d.ts +19 -0
- package/dist/ui/badge/Badge.vue.d.ts.map +1 -0
- package/dist/ui/badge/index.d.ts +7 -0
- package/dist/ui/badge/index.d.ts.map +1 -0
- package/dist/ui/button/Button.vue.d.ts +23 -0
- package/dist/ui/button/Button.vue.d.ts.map +1 -0
- package/dist/ui/button/index.d.ts +9 -0
- package/dist/ui/button/index.d.ts.map +1 -0
- package/dist/ui/card/Card.vue.d.ts +17 -0
- package/dist/ui/card/Card.vue.d.ts.map +1 -0
- package/dist/ui/card/CardContent.vue.d.ts +17 -0
- package/dist/ui/card/CardContent.vue.d.ts.map +1 -0
- package/dist/ui/card/CardDescription.vue.d.ts +17 -0
- package/dist/ui/card/CardDescription.vue.d.ts.map +1 -0
- package/dist/ui/card/CardFooter.vue.d.ts +17 -0
- package/dist/ui/card/CardFooter.vue.d.ts.map +1 -0
- package/dist/ui/card/CardHeader.vue.d.ts +17 -0
- package/dist/ui/card/CardHeader.vue.d.ts.map +1 -0
- package/dist/ui/card/CardTitle.vue.d.ts +17 -0
- package/dist/ui/card/CardTitle.vue.d.ts.map +1 -0
- package/dist/ui/card/index.d.ts +7 -0
- package/dist/ui/card/index.d.ts.map +1 -0
- package/dist/ui/checkbox/Checkbox.vue.d.ts +30 -0
- package/dist/ui/checkbox/Checkbox.vue.d.ts.map +1 -0
- package/dist/ui/checkbox/index.d.ts +2 -0
- package/dist/ui/checkbox/index.d.ts.map +1 -0
- package/dist/ui/dialog/Dialog.vue.d.ts +18 -0
- package/dist/ui/dialog/Dialog.vue.d.ts.map +1 -0
- package/dist/ui/dialog/DialogClose.vue.d.ts +14 -0
- package/dist/ui/dialog/DialogClose.vue.d.ts.map +1 -0
- package/dist/ui/dialog/DialogContent.vue.d.ts +32 -0
- package/dist/ui/dialog/DialogContent.vue.d.ts.map +1 -0
- package/dist/ui/dialog/DialogDescription.vue.d.ts +18 -0
- package/dist/ui/dialog/DialogDescription.vue.d.ts.map +1 -0
- package/dist/ui/dialog/DialogFooter.vue.d.ts +17 -0
- package/dist/ui/dialog/DialogFooter.vue.d.ts.map +1 -0
- package/dist/ui/dialog/DialogHeader.vue.d.ts +17 -0
- package/dist/ui/dialog/DialogHeader.vue.d.ts.map +1 -0
- package/dist/ui/dialog/DialogScrollContent.vue.d.ts +32 -0
- package/dist/ui/dialog/DialogScrollContent.vue.d.ts.map +1 -0
- package/dist/ui/dialog/DialogTitle.vue.d.ts +18 -0
- package/dist/ui/dialog/DialogTitle.vue.d.ts.map +1 -0
- package/dist/ui/dialog/DialogTrigger.vue.d.ts +14 -0
- package/dist/ui/dialog/DialogTrigger.vue.d.ts.map +1 -0
- package/dist/ui/dialog/index.d.ts +10 -0
- package/dist/ui/dialog/index.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenu.vue.d.ts +18 -0
- package/dist/ui/dropdown-menu/DropdownMenu.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts +24 -0
- package/dist/ui/dropdown-menu/DropdownMenuCheckboxItem.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuContent.vue.d.ts +32 -0
- package/dist/ui/dropdown-menu/DropdownMenuContent.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuGroup.vue.d.ts +14 -0
- package/dist/ui/dropdown-menu/DropdownMenuGroup.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuItem.vue.d.ts +19 -0
- package/dist/ui/dropdown-menu/DropdownMenuItem.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuLabel.vue.d.ts +19 -0
- package/dist/ui/dropdown-menu/DropdownMenuLabel.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuRadioGroup.vue.d.ts +18 -0
- package/dist/ui/dropdown-menu/DropdownMenuRadioGroup.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuRadioItem.vue.d.ts +22 -0
- package/dist/ui/dropdown-menu/DropdownMenuRadioItem.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuSeparator.vue.d.ts +8 -0
- package/dist/ui/dropdown-menu/DropdownMenuSeparator.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuShortcut.vue.d.ts +17 -0
- package/dist/ui/dropdown-menu/DropdownMenuShortcut.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuSub.vue.d.ts +18 -0
- package/dist/ui/dropdown-menu/DropdownMenuSub.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +34 -0
- package/dist/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuSubTrigger.vue.d.ts +18 -0
- package/dist/ui/dropdown-menu/DropdownMenuSubTrigger.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/DropdownMenuTrigger.vue.d.ts +14 -0
- package/dist/ui/dropdown-menu/DropdownMenuTrigger.vue.d.ts.map +1 -0
- package/dist/ui/dropdown-menu/index.d.ts +16 -0
- package/dist/ui/dropdown-menu/index.d.ts.map +1 -0
- package/dist/ui/input/Input.vue.d.ts +13 -0
- package/dist/ui/input/Input.vue.d.ts.map +1 -0
- package/dist/ui/input/index.d.ts +2 -0
- package/dist/ui/input/index.d.ts.map +1 -0
- package/dist/ui/label/Label.vue.d.ts +18 -0
- package/dist/ui/label/Label.vue.d.ts.map +1 -0
- package/dist/ui/label/index.d.ts +2 -0
- package/dist/ui/label/index.d.ts.map +1 -0
- package/dist/ui/responsive-dialog/ResponsiveDialog.vue.d.ts +32 -0
- package/dist/ui/responsive-dialog/ResponsiveDialog.vue.d.ts.map +1 -0
- package/dist/ui/responsive-dialog/index.d.ts +2 -0
- package/dist/ui/responsive-dialog/index.d.ts.map +1 -0
- package/dist/ui/scroll-area/ScrollArea.vue.d.ts +18 -0
- package/dist/ui/scroll-area/ScrollArea.vue.d.ts.map +1 -0
- package/dist/ui/scroll-area/ScrollBar.vue.d.ts +10 -0
- package/dist/ui/scroll-area/ScrollBar.vue.d.ts.map +1 -0
- package/dist/ui/scroll-area/index.d.ts +3 -0
- package/dist/ui/scroll-area/index.d.ts.map +1 -0
- package/dist/ui/select/Select.vue.d.ts +21 -0
- package/dist/ui/select/Select.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectContent.vue.d.ts +28 -0
- package/dist/ui/select/SelectContent.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectGroup.vue.d.ts +18 -0
- package/dist/ui/select/SelectGroup.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectItem.vue.d.ts +18 -0
- package/dist/ui/select/SelectItem.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectItemText.vue.d.ts +14 -0
- package/dist/ui/select/SelectItemText.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectLabel.vue.d.ts +18 -0
- package/dist/ui/select/SelectLabel.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectScrollDownButton.vue.d.ts +18 -0
- package/dist/ui/select/SelectScrollDownButton.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectScrollUpButton.vue.d.ts +18 -0
- package/dist/ui/select/SelectScrollUpButton.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectSeparator.vue.d.ts +8 -0
- package/dist/ui/select/SelectSeparator.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectTrigger.vue.d.ts +18 -0
- package/dist/ui/select/SelectTrigger.vue.d.ts.map +1 -0
- package/dist/ui/select/SelectValue.vue.d.ts +14 -0
- package/dist/ui/select/SelectValue.vue.d.ts.map +1 -0
- package/dist/ui/select/index.d.ts +12 -0
- package/dist/ui/select/index.d.ts.map +1 -0
- package/dist/ui/sheet/Sheet.vue.d.ts +18 -0
- package/dist/ui/sheet/Sheet.vue.d.ts.map +1 -0
- package/dist/ui/sheet/SheetClose.vue.d.ts +14 -0
- package/dist/ui/sheet/SheetClose.vue.d.ts.map +1 -0
- package/dist/ui/sheet/SheetContent.vue.d.ts +34 -0
- package/dist/ui/sheet/SheetContent.vue.d.ts.map +1 -0
- package/dist/ui/sheet/SheetDescription.vue.d.ts +18 -0
- package/dist/ui/sheet/SheetDescription.vue.d.ts.map +1 -0
- package/dist/ui/sheet/SheetFooter.vue.d.ts +17 -0
- package/dist/ui/sheet/SheetFooter.vue.d.ts.map +1 -0
- package/dist/ui/sheet/SheetHeader.vue.d.ts +17 -0
- package/dist/ui/sheet/SheetHeader.vue.d.ts.map +1 -0
- package/dist/ui/sheet/SheetTitle.vue.d.ts +18 -0
- package/dist/ui/sheet/SheetTitle.vue.d.ts.map +1 -0
- package/dist/ui/sheet/SheetTrigger.vue.d.ts +14 -0
- package/dist/ui/sheet/SheetTrigger.vue.d.ts.map +1 -0
- package/dist/ui/sheet/index.d.ts +14 -0
- package/dist/ui/sheet/index.d.ts.map +1 -0
- package/dist/ui/switch/Switch.vue.d.ts +23 -0
- package/dist/ui/switch/Switch.vue.d.ts.map +1 -0
- package/dist/ui/switch/index.d.ts +2 -0
- package/dist/ui/switch/index.d.ts.map +1 -0
- package/dist/ui/textarea/Textarea.vue.d.ts +13 -0
- package/dist/ui/textarea/Textarea.vue.d.ts.map +1 -0
- package/dist/ui/textarea/index.d.ts +2 -0
- package/dist/ui/textarea/index.d.ts.map +1 -0
- package/dist/ui/toast/Toast.vue.d.ts +96 -0
- package/dist/ui/toast/Toast.vue.d.ts.map +1 -0
- package/dist/ui/toast/ToastAction.vue.d.ts +18 -0
- package/dist/ui/toast/ToastAction.vue.d.ts.map +1 -0
- package/dist/ui/toast/ToastClose.vue.d.ts +8 -0
- package/dist/ui/toast/ToastClose.vue.d.ts.map +1 -0
- package/dist/ui/toast/ToastDescription.vue.d.ts +18 -0
- package/dist/ui/toast/ToastDescription.vue.d.ts.map +1 -0
- package/dist/ui/toast/ToastProvider.vue.d.ts +14 -0
- package/dist/ui/toast/ToastProvider.vue.d.ts.map +1 -0
- package/dist/ui/toast/ToastTitle.vue.d.ts +18 -0
- package/dist/ui/toast/ToastTitle.vue.d.ts.map +1 -0
- package/dist/ui/toast/ToastViewport.vue.d.ts +8 -0
- package/dist/ui/toast/ToastViewport.vue.d.ts.map +1 -0
- package/dist/ui/toast/Toaster.vue.d.ts +3 -0
- package/dist/ui/toast/Toaster.vue.d.ts.map +1 -0
- package/dist/ui/toast/index.d.ts +23 -0
- package/dist/ui/toast/index.d.ts.map +1 -0
- package/dist/ui/toast/use-toast.d.ts +23 -0
- package/dist/ui/toast/use-toast.d.ts.map +1 -0
- package/dist/ui/tooltip/Tooltip.vue.d.ts +18 -0
- package/dist/ui/tooltip/Tooltip.vue.d.ts.map +1 -0
- package/dist/ui/tooltip/TooltipContent.vue.d.ts +26 -0
- package/dist/ui/tooltip/TooltipContent.vue.d.ts.map +1 -0
- package/dist/ui/tooltip/TooltipProvider.vue.d.ts +14 -0
- package/dist/ui/tooltip/TooltipProvider.vue.d.ts.map +1 -0
- package/dist/ui/tooltip/TooltipTrigger.vue.d.ts +14 -0
- package/dist/ui/tooltip/TooltipTrigger.vue.d.ts.map +1 -0
- package/dist/ui/tooltip/index.d.ts +5 -0
- package/dist/ui/tooltip/index.d.ts.map +1 -0
- package/dist/ui/utils.d.ts +2 -0
- package/dist/ui/utils.d.ts.map +1 -0
- package/dist/vue.css +1 -0
- package/package.json +64 -0
- package/src/appearance.ts +568 -0
- package/src/components/chat/AnimatedStreamBlock.vue +94 -0
- package/src/components/chat/ChatHistoryDropdown.vue +226 -0
- package/src/components/chat/ChatInput.vue +571 -0
- package/src/components/chat/ChatMessageActivityBlock.vue +447 -0
- package/src/components/chat/ChatMessageItem.vue +357 -0
- package/src/components/chat/ChatMessageList.vue +178 -0
- package/src/components/chat/ChatPendingIndicator.vue +163 -0
- package/src/components/chat/ReasoningStream.vue +112 -0
- package/src/components/chat/index.ts +8 -0
- package/src/components/shell/SvedaAgentCompletedNotice.vue +25 -0
- package/src/components/shell/SvedaAgentTasksPanel.vue +146 -0
- package/src/components/shell/SvedaChat.vue +514 -0
- package/src/components/shell/SvedaContextUsageBar.vue +33 -0
- package/src/components/shell/SvedaHistorySheet.vue +52 -0
- package/src/components/shell/SvedaHistorySidebar.vue +41 -0
- package/src/components/shell/SvedaInputSection.vue +53 -0
- package/src/components/shell/SvedaLandingView.vue +93 -0
- package/src/components/shell/SvedaMaxStepsNotice.vue +33 -0
- package/src/components/shell/SvedaMinimizedTrigger.vue +43 -0
- package/src/components/shell/SvedaModelControls.vue +47 -0
- package/src/components/shell/SvedaModelSelect.vue +32 -0
- package/src/components/shell/SvedaQuickPrompts.vue +44 -0
- package/src/components/shell/SvedaResizeHandles.vue +31 -0
- package/src/components/shell/SvedaTabs.vue +123 -0
- package/src/components/shell/SvedaToolbar.vue +171 -0
- package/src/composables/useSvedaAgentTasks.ts +93 -0
- package/src/composables/useSvedaBootstrap.ts +36 -0
- package/src/composables/useSvedaChat.ts +593 -0
- package/src/composables/useSvedaChatLayout.ts +539 -0
- package/src/composables/useSvedaChatPage.ts +339 -0
- package/src/composables/useSvedaContextWindow.ts +31 -0
- package/src/composables/useSvedaDocuments.ts +115 -0
- package/src/composables/useSvedaMaxStepsContinue.ts +68 -0
- package/src/composables/useSvedaMessaging.ts +99 -0
- package/src/composables/useSvedaModel.ts +85 -0
- package/src/composables/useSvedaPrompts.ts +59 -0
- package/src/composables/useSvedaReadable.ts +33 -0
- package/src/composables/useSvedaScroll.ts +93 -0
- package/src/composables/useSvedaShell.ts +91 -0
- package/src/composables/useSvedaStreaming.ts +408 -0
- package/src/composables/useSvedaTool.ts +18 -0
- package/src/i18n/index.ts +72 -0
- package/src/i18n/locales/en.ts +58 -0
- package/src/i18n/locales/ru.ts +59 -0
- package/src/index.ts +141 -0
- package/src/launcherIcons.ts +39 -0
- package/src/lib/assistantMessage.ts +437 -0
- package/src/lib/chatHistoryMerge.ts +93 -0
- package/src/lib/chatI18nKeys.ts +62 -0
- package/src/lib/chatMessageVisibility.ts +50 -0
- package/src/lib/chatTabs.ts +54 -0
- package/src/lib/chatTitle.ts +30 -0
- package/src/lib/chatUiStorage.ts +33 -0
- package/src/lib/finalizeMessages.ts +81 -0
- package/src/lib/markdown.ts +90 -0
- package/src/lib/modelLabels.ts +24 -0
- package/src/lib/pendingStatusRotation.ts +26 -0
- package/src/lib/shims-vue.d.ts +6 -0
- package/src/lib/useAnimatedText.ts +78 -0
- package/src/lib/userMessage.ts +55 -0
- package/src/lib/utils.ts +6 -0
- package/src/plugin.ts +164 -0
- package/src/styles.css +5 -0
- package/src/theme.css +95 -0
- package/src/theme.test.mjs +80 -0
- package/src/ui/alert-dialog/AlertDialog.vue +14 -0
- package/src/ui/alert-dialog/AlertDialogAction.vue +17 -0
- package/src/ui/alert-dialog/AlertDialogCancel.vue +24 -0
- package/src/ui/alert-dialog/AlertDialogContent.vue +39 -0
- package/src/ui/alert-dialog/AlertDialogDescription.vue +22 -0
- package/src/ui/alert-dialog/AlertDialogFooter.vue +21 -0
- package/src/ui/alert-dialog/AlertDialogHeader.vue +16 -0
- package/src/ui/alert-dialog/AlertDialogTitle.vue +19 -0
- package/src/ui/alert-dialog/AlertDialogTrigger.vue +11 -0
- package/src/ui/alert-dialog/index.ts +9 -0
- package/src/ui/badge/Badge.vue +16 -0
- package/src/ui/badge/index.ts +27 -0
- package/src/ui/button/Button.vue +56 -0
- package/src/ui/button/index.ts +50 -0
- package/src/ui/card/Card.vue +14 -0
- package/src/ui/card/CardContent.vue +14 -0
- package/src/ui/card/CardDescription.vue +14 -0
- package/src/ui/card/CardFooter.vue +14 -0
- package/src/ui/card/CardHeader.vue +14 -0
- package/src/ui/card/CardTitle.vue +14 -0
- package/src/ui/card/index.ts +6 -0
- package/src/ui/checkbox/Checkbox.vue +41 -0
- package/src/ui/checkbox/index.ts +1 -0
- package/src/ui/dialog/Dialog.vue +14 -0
- package/src/ui/dialog/DialogClose.vue +11 -0
- package/src/ui/dialog/DialogContent.vue +50 -0
- package/src/ui/dialog/DialogDescription.vue +24 -0
- package/src/ui/dialog/DialogFooter.vue +19 -0
- package/src/ui/dialog/DialogHeader.vue +16 -0
- package/src/ui/dialog/DialogScrollContent.vue +59 -0
- package/src/ui/dialog/DialogTitle.vue +29 -0
- package/src/ui/dialog/DialogTrigger.vue +11 -0
- package/src/ui/dialog/index.ts +9 -0
- package/src/ui/dropdown-menu/DropdownMenu.vue +14 -0
- package/src/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +42 -0
- package/src/ui/dropdown-menu/DropdownMenuContent.vue +40 -0
- package/src/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
- package/src/ui/dropdown-menu/DropdownMenuItem.vue +30 -0
- package/src/ui/dropdown-menu/DropdownMenuLabel.vue +21 -0
- package/src/ui/dropdown-menu/DropdownMenuRadioGroup.vue +14 -0
- package/src/ui/dropdown-menu/DropdownMenuRadioItem.vue +43 -0
- package/src/ui/dropdown-menu/DropdownMenuSeparator.vue +21 -0
- package/src/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
- package/src/ui/dropdown-menu/DropdownMenuSub.vue +14 -0
- package/src/ui/dropdown-menu/DropdownMenuSubContent.vue +30 -0
- package/src/ui/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
- package/src/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
- package/src/ui/dropdown-menu/index.ts +16 -0
- package/src/ui/input/Input.vue +32 -0
- package/src/ui/input/index.ts +1 -0
- package/src/ui/label/Label.vue +22 -0
- package/src/ui/label/index.ts +1 -0
- package/src/ui/responsive-dialog/ResponsiveDialog.vue +55 -0
- package/src/ui/responsive-dialog/index.ts +1 -0
- package/src/ui/scroll-area/ScrollArea.vue +29 -0
- package/src/ui/scroll-area/ScrollBar.vue +30 -0
- package/src/ui/scroll-area/index.ts +2 -0
- package/src/ui/select/Select.vue +15 -0
- package/src/ui/select/SelectContent.vue +53 -0
- package/src/ui/select/SelectGroup.vue +19 -0
- package/src/ui/select/SelectItem.vue +44 -0
- package/src/ui/select/SelectItemText.vue +11 -0
- package/src/ui/select/SelectLabel.vue +13 -0
- package/src/ui/select/SelectScrollDownButton.vue +24 -0
- package/src/ui/select/SelectScrollUpButton.vue +24 -0
- package/src/ui/select/SelectSeparator.vue +17 -0
- package/src/ui/select/SelectTrigger.vue +31 -0
- package/src/ui/select/SelectValue.vue +11 -0
- package/src/ui/select/index.ts +11 -0
- package/src/ui/sheet/Sheet.vue +14 -0
- package/src/ui/sheet/SheetClose.vue +11 -0
- package/src/ui/sheet/SheetContent.vue +53 -0
- package/src/ui/sheet/SheetDescription.vue +19 -0
- package/src/ui/sheet/SheetFooter.vue +12 -0
- package/src/ui/sheet/SheetHeader.vue +12 -0
- package/src/ui/sheet/SheetTitle.vue +19 -0
- package/src/ui/sheet/SheetTrigger.vue +11 -0
- package/src/ui/sheet/index.ts +29 -0
- package/src/ui/switch/Switch.vue +55 -0
- package/src/ui/switch/index.ts +1 -0
- package/src/ui/textarea/Textarea.vue +24 -0
- package/src/ui/textarea/index.ts +1 -0
- package/src/ui/toast/Toast.vue +28 -0
- package/src/ui/toast/ToastAction.vue +19 -0
- package/src/ui/toast/ToastClose.vue +22 -0
- package/src/ui/toast/ToastDescription.vue +19 -0
- package/src/ui/toast/ToastProvider.vue +11 -0
- package/src/ui/toast/ToastTitle.vue +19 -0
- package/src/ui/toast/ToastViewport.vue +17 -0
- package/src/ui/toast/Toaster.vue +48 -0
- package/src/ui/toast/index.ts +39 -0
- package/src/ui/toast/use-toast.ts +109 -0
- package/src/ui/tooltip/Tooltip.vue +14 -0
- package/src/ui/tooltip/TooltipContent.vue +39 -0
- package/src/ui/tooltip/TooltipProvider.vue +11 -0
- package/src/ui/tooltip/TooltipTrigger.vue +11 -0
- package/src/ui/tooltip/index.ts +4 -0
- package/src/ui/utils.ts +1 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import SvedaContextUsageBar from './SvedaContextUsageBar.vue';
|
|
3
|
+
import SvedaModelControls from './SvedaModelControls.vue';
|
|
4
|
+
import ChatInput from '../chat/ChatInput.vue';
|
|
5
|
+
|
|
6
|
+
const inputMessage = defineModel('inputMessage', { type: String, default: '' });
|
|
7
|
+
const pendingFiles = defineModel('pendingFiles', { type: Array, default: () => [] });
|
|
8
|
+
const selectedChatModel = defineModel('selectedChatModel', { type: String, required: true });
|
|
9
|
+
const thinkingEnabled = defineModel('thinkingEnabled', { type: Boolean, default: true });
|
|
10
|
+
|
|
11
|
+
defineProps({
|
|
12
|
+
isLoading: { type: Boolean, default: false },
|
|
13
|
+
hasCurrentChat: { type: Boolean, default: false },
|
|
14
|
+
isStreaming: { type: Boolean, default: false },
|
|
15
|
+
statusBanner: { type: String, default: '' },
|
|
16
|
+
modelSelectPlaceholder: { type: String, required: true },
|
|
17
|
+
models: { type: Array, default: () => [] },
|
|
18
|
+
thinkingTooltip: { type: String, required: true },
|
|
19
|
+
contextWindowUsagePercent: { type: Number, required: true },
|
|
20
|
+
contextWindowTooltip: { type: String, required: true },
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const emit = defineEmits(['send', 'stop']);
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<template>
|
|
27
|
+
<ChatInput
|
|
28
|
+
v-model="inputMessage"
|
|
29
|
+
v-model:pending-files="pendingFiles"
|
|
30
|
+
:is-loading="isLoading"
|
|
31
|
+
:has-current-chat="hasCurrentChat"
|
|
32
|
+
:is-streaming="isStreaming"
|
|
33
|
+
:status-banner="statusBanner"
|
|
34
|
+
@send="emit('send')"
|
|
35
|
+
@stop="emit('stop')"
|
|
36
|
+
>
|
|
37
|
+
<template #bottom-left>
|
|
38
|
+
<SvedaModelControls
|
|
39
|
+
v-model="selectedChatModel"
|
|
40
|
+
v-model:thinking-enabled="thinkingEnabled"
|
|
41
|
+
:placeholder="modelSelectPlaceholder"
|
|
42
|
+
:models="models"
|
|
43
|
+
:thinking-tooltip="thinkingTooltip"
|
|
44
|
+
/>
|
|
45
|
+
</template>
|
|
46
|
+
<template #bottom-outside>
|
|
47
|
+
<SvedaContextUsageBar
|
|
48
|
+
:percent="contextWindowUsagePercent"
|
|
49
|
+
:tooltip="contextWindowTooltip"
|
|
50
|
+
/>
|
|
51
|
+
</template>
|
|
52
|
+
</ChatInput>
|
|
53
|
+
</template>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import SvedaContextUsageBar from './SvedaContextUsageBar.vue';
|
|
3
|
+
import SvedaModelControls from './SvedaModelControls.vue';
|
|
4
|
+
import SvedaQuickPrompts from './SvedaQuickPrompts.vue';
|
|
5
|
+
import ChatInput from '../chat/ChatInput.vue';
|
|
6
|
+
import { useSvedaT } from '../../i18n/index';
|
|
7
|
+
|
|
8
|
+
const t = useSvedaT();
|
|
9
|
+
|
|
10
|
+
defineProps({
|
|
11
|
+
inputMessage: String,
|
|
12
|
+
isLoading: Boolean,
|
|
13
|
+
hasCurrentChat: Boolean,
|
|
14
|
+
isStreaming: Boolean,
|
|
15
|
+
pendingFiles: {
|
|
16
|
+
type: Array,
|
|
17
|
+
default: () => [],
|
|
18
|
+
},
|
|
19
|
+
selectedChatModel: String,
|
|
20
|
+
thinkingEnabled: Boolean,
|
|
21
|
+
contextWindowUsagePercent: Number,
|
|
22
|
+
showQuickPromptButtons: Boolean,
|
|
23
|
+
quickPromptButtons: Array,
|
|
24
|
+
models: {
|
|
25
|
+
type: Array,
|
|
26
|
+
default: () => [],
|
|
27
|
+
},
|
|
28
|
+
thinkingTooltip: String,
|
|
29
|
+
statusBanner: {
|
|
30
|
+
type: String,
|
|
31
|
+
default: '',
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const emit = defineEmits([
|
|
36
|
+
'update:inputMessage',
|
|
37
|
+
'update:selectedChatModel',
|
|
38
|
+
'update:thinkingEnabled',
|
|
39
|
+
'update:pendingFiles',
|
|
40
|
+
'send',
|
|
41
|
+
'stop',
|
|
42
|
+
'sendQuickPrompt',
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
const onInputUpdate = val => emit('update:inputMessage', val);
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<template>
|
|
49
|
+
<div class="flex min-h-0 flex-1 flex-col justify-center overflow-y-auto px-4 py-8">
|
|
50
|
+
<div class="flex w-full flex-col gap-3">
|
|
51
|
+
<slot name="top"></slot>
|
|
52
|
+
<ChatInput
|
|
53
|
+
:model-value="inputMessage"
|
|
54
|
+
:pending-files="pendingFiles"
|
|
55
|
+
@update:model-value="onInputUpdate"
|
|
56
|
+
@update:pending-files="val => emit('update:pendingFiles', val)"
|
|
57
|
+
:is-loading="isLoading"
|
|
58
|
+
:has-current-chat="hasCurrentChat"
|
|
59
|
+
:is-streaming="isStreaming"
|
|
60
|
+
:status-banner="statusBanner"
|
|
61
|
+
no-border
|
|
62
|
+
@send="$emit('send')"
|
|
63
|
+
@stop="$emit('stop')"
|
|
64
|
+
>
|
|
65
|
+
<template #bottom-left>
|
|
66
|
+
<SvedaModelControls
|
|
67
|
+
:model-value="selectedChatModel"
|
|
68
|
+
@update:model-value="$emit('update:selectedChatModel', $event)"
|
|
69
|
+
:thinking-enabled="thinkingEnabled"
|
|
70
|
+
@update:thinking-enabled="$emit('update:thinkingEnabled', $event)"
|
|
71
|
+
:placeholder="t('modelSelectPlaceholder')"
|
|
72
|
+
:models="models"
|
|
73
|
+
:thinking-tooltip="thinkingTooltip"
|
|
74
|
+
/>
|
|
75
|
+
</template>
|
|
76
|
+
<template #bottom-outside>
|
|
77
|
+
<SvedaContextUsageBar
|
|
78
|
+
:percent="contextWindowUsagePercent"
|
|
79
|
+
:tooltip="t('contextWindowPercent', { percent: contextWindowUsagePercent })"
|
|
80
|
+
/>
|
|
81
|
+
</template>
|
|
82
|
+
</ChatInput>
|
|
83
|
+
<SvedaQuickPrompts
|
|
84
|
+
v-if="showQuickPromptButtons"
|
|
85
|
+
class="px-4"
|
|
86
|
+
:prompts="quickPromptButtons"
|
|
87
|
+
:title="t('quickPromptsTitle')"
|
|
88
|
+
:disabled="isLoading || isStreaming"
|
|
89
|
+
@select="$emit('sendQuickPrompt', $event)"
|
|
90
|
+
/>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</template>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { Button } from '../../ui/button';
|
|
3
|
+
import { Play } from 'lucide-vue-next';
|
|
4
|
+
|
|
5
|
+
defineProps({
|
|
6
|
+
message: { type: String, required: true },
|
|
7
|
+
continueLabel: { type: String, required: true },
|
|
8
|
+
loading: { type: Boolean, default: false },
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const emit = defineEmits(['continue']);
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<template>
|
|
15
|
+
<div class="flex shrink-0 justify-center px-4 py-2">
|
|
16
|
+
<div class="flex max-w-md flex-col items-center gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 px-4 py-3 text-center shadow-sm">
|
|
17
|
+
<p class="text-xs text-foreground">
|
|
18
|
+
{{ message }}
|
|
19
|
+
</p>
|
|
20
|
+
<Button
|
|
21
|
+
type="button"
|
|
22
|
+
variant="secondary"
|
|
23
|
+
size="sm"
|
|
24
|
+
class="h-8 gap-2 rounded-[var(--sveda-radius)] px-3 text-xs"
|
|
25
|
+
:disabled="loading"
|
|
26
|
+
@click="emit('continue')"
|
|
27
|
+
>
|
|
28
|
+
<Play class="h-3.5 w-3.5" />
|
|
29
|
+
{{ continueLabel }}
|
|
30
|
+
</Button>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</template>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { Button } from '../../ui/button';
|
|
3
|
+
import { computed } from 'vue';
|
|
4
|
+
import { svedaLauncherIconComponent } from '../../launcherIcons';
|
|
5
|
+
|
|
6
|
+
const props = defineProps({
|
|
7
|
+
label: { type: String, required: true },
|
|
8
|
+
icon: { type: String, default: 'sparkles' },
|
|
9
|
+
logoSrc: { type: String, default: '' },
|
|
10
|
+
logoAlt: { type: String, default: '' },
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
defineEmits(['open']);
|
|
14
|
+
|
|
15
|
+
const Icon = computed(() => svedaLauncherIconComponent(props.icon));
|
|
16
|
+
|
|
17
|
+
const triggerClass =
|
|
18
|
+
'flex h-10 min-w-[200px] items-center justify-start gap-2 rounded-bl-none rounded-br-none rounded-tl-[var(--sveda-radius)] rounded-tr-none bg-primary px-3 text-primary-foreground shadow-2xl transition-all hover:bg-primary/90 min-[768px]:min-w-0 min-[1872px]:h-14 min-[1872px]:justify-center min-[1872px]:gap-3 min-[1872px]:rounded-[var(--sveda-radius)] min-[1872px]:px-4 [&_svg]:!h-6 [&_svg]:!w-6 min-[1872px]:[&_svg]:!h-10 min-[1872px]:[&_svg]:!w-10';
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<template>
|
|
22
|
+
<Button
|
|
23
|
+
size="lg"
|
|
24
|
+
:class="triggerClass"
|
|
25
|
+
@click="$emit('open')"
|
|
26
|
+
>
|
|
27
|
+
<img
|
|
28
|
+
v-if="logoSrc"
|
|
29
|
+
:src="logoSrc"
|
|
30
|
+
:alt="logoAlt"
|
|
31
|
+
class="h-6 w-6 flex-shrink-0 object-cover min-[1872px]:h-10 min-[1872px]:w-10"
|
|
32
|
+
/>
|
|
33
|
+
<component
|
|
34
|
+
:is="Icon"
|
|
35
|
+
v-else
|
|
36
|
+
class="h-6 w-6 flex-shrink-0"
|
|
37
|
+
/>
|
|
38
|
+
<span
|
|
39
|
+
v-if="label"
|
|
40
|
+
class="font-semibold"
|
|
41
|
+
>{{ label }}</span>
|
|
42
|
+
</Button>
|
|
43
|
+
</template>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import SvedaModelSelect from './SvedaModelSelect.vue';
|
|
3
|
+
import { Switch } from '../../ui/switch';
|
|
4
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip';
|
|
5
|
+
import { Brain } from 'lucide-vue-next';
|
|
6
|
+
import { computed } from 'vue';
|
|
7
|
+
|
|
8
|
+
const chatModel = defineModel({ type: String, required: true });
|
|
9
|
+
const thinkingEnabled = defineModel('thinkingEnabled', { type: Boolean, default: true });
|
|
10
|
+
|
|
11
|
+
const props = defineProps({
|
|
12
|
+
placeholder: { type: String, required: true },
|
|
13
|
+
thinkingTooltip: { type: String, required: true },
|
|
14
|
+
models: { type: Array, default: () => [] },
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const selectedSupportsThinking = computed(
|
|
18
|
+
() => props.models.some(option => option.id === chatModel.value && option.supportsThinking)
|
|
19
|
+
);
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<template>
|
|
23
|
+
<div class="flex items-center gap-1">
|
|
24
|
+
<SvedaModelSelect
|
|
25
|
+
v-model="chatModel"
|
|
26
|
+
:placeholder="placeholder"
|
|
27
|
+
:models="models"
|
|
28
|
+
/>
|
|
29
|
+
<TooltipProvider v-if="selectedSupportsThinking">
|
|
30
|
+
<Tooltip>
|
|
31
|
+
<TooltipTrigger as-child>
|
|
32
|
+
<div class="flex cursor-default items-center gap-1 rounded-md px-0.5 py-0.5 text-muted-foreground hover:bg-muted/50 hover:text-foreground">
|
|
33
|
+
<Brain class="h-3.5 w-3.5 shrink-0" />
|
|
34
|
+
<Switch
|
|
35
|
+
v-model="thinkingEnabled"
|
|
36
|
+
size="sm"
|
|
37
|
+
:aria-label="thinkingTooltip"
|
|
38
|
+
/>
|
|
39
|
+
</div>
|
|
40
|
+
</TooltipTrigger>
|
|
41
|
+
<TooltipContent class="max-w-xs">
|
|
42
|
+
{{ thinkingTooltip }}
|
|
43
|
+
</TooltipContent>
|
|
44
|
+
</Tooltip>
|
|
45
|
+
</TooltipProvider>
|
|
46
|
+
</div>
|
|
47
|
+
</template>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '../../ui/select';
|
|
3
|
+
|
|
4
|
+
const model = defineModel({ type: String, required: true });
|
|
5
|
+
|
|
6
|
+
defineProps({
|
|
7
|
+
placeholder: { type: String, required: true },
|
|
8
|
+
models: { type: Array, default: () => [] },
|
|
9
|
+
});
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<template>
|
|
13
|
+
<Select v-model="model">
|
|
14
|
+
<SelectTrigger
|
|
15
|
+
class="h-7 w-fit min-w-[110px] border-none bg-transparent px-2 text-xs text-muted-foreground shadow-none hover:bg-muted/50 hover:text-foreground focus:ring-0 focus:ring-offset-0"
|
|
16
|
+
>
|
|
17
|
+
<SelectValue :placeholder="placeholder" />
|
|
18
|
+
</SelectTrigger>
|
|
19
|
+
<SelectContent>
|
|
20
|
+
<SelectGroup>
|
|
21
|
+
<SelectItem
|
|
22
|
+
v-for="option in models"
|
|
23
|
+
:key="option.id"
|
|
24
|
+
:value="option.id"
|
|
25
|
+
class="text-xs"
|
|
26
|
+
>
|
|
27
|
+
{{ option.label }}
|
|
28
|
+
</SelectItem>
|
|
29
|
+
</SelectGroup>
|
|
30
|
+
</SelectContent>
|
|
31
|
+
</Select>
|
|
32
|
+
</template>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { Button } from '../../ui/button';
|
|
3
|
+
|
|
4
|
+
defineProps({
|
|
5
|
+
prompts: { type: Array, required: true },
|
|
6
|
+
disabled: { type: Boolean, default: false },
|
|
7
|
+
title: { type: String, required: true },
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
defineEmits(['select']);
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<div
|
|
15
|
+
class="w-full"
|
|
16
|
+
role="group"
|
|
17
|
+
:aria-label="title"
|
|
18
|
+
>
|
|
19
|
+
<div class="quick-prompts-row -mx-1 flex gap-2 overflow-x-auto px-1 pb-1">
|
|
20
|
+
<Button
|
|
21
|
+
v-for="prompt in prompts"
|
|
22
|
+
:key="prompt.label"
|
|
23
|
+
type="button"
|
|
24
|
+
variant="secondary"
|
|
25
|
+
size="sm"
|
|
26
|
+
class="h-8 shrink-0 rounded-[var(--sveda-radius)] border border-border/60 bg-muted/80 px-3 text-xs font-normal text-muted-foreground shadow-none hover:bg-muted hover:text-foreground"
|
|
27
|
+
:disabled="disabled"
|
|
28
|
+
@click="$emit('select', prompt.prompt)"
|
|
29
|
+
>
|
|
30
|
+
{{ prompt.label }}
|
|
31
|
+
</Button>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</template>
|
|
35
|
+
|
|
36
|
+
<style scoped>
|
|
37
|
+
.quick-prompts-row {
|
|
38
|
+
scrollbar-color: hsl(var(--foreground) / 0.2) transparent;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.quick-prompts-row::-webkit-scrollbar-track {
|
|
42
|
+
background: transparent;
|
|
43
|
+
}
|
|
44
|
+
</style>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
defineProps({
|
|
3
|
+
isMobile: { type: Boolean, required: true },
|
|
4
|
+
viewMode: { type: String, required: true },
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
defineEmits(['start-resize']);
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<div
|
|
12
|
+
v-if="!isMobile && viewMode === 'fixed'"
|
|
13
|
+
class="absolute bottom-3 left-0 top-3 z-10 w-1 cursor-ew-resize hover:bg-primary/30"
|
|
14
|
+
@mousedown="$emit('start-resize', 'fixed-left', $event)"
|
|
15
|
+
></div>
|
|
16
|
+
<div
|
|
17
|
+
v-if="!isMobile && viewMode === 'floating'"
|
|
18
|
+
class="absolute left-0 top-0 z-10 h-3 w-3 cursor-nw-resize rounded-br hover:bg-primary/20"
|
|
19
|
+
@mousedown="$emit('start-resize', 'top-left', $event)"
|
|
20
|
+
></div>
|
|
21
|
+
<div
|
|
22
|
+
v-if="!isMobile && viewMode === 'floating'"
|
|
23
|
+
class="absolute left-3 right-3 top-0 z-10 h-1 cursor-n-resize hover:bg-primary/30"
|
|
24
|
+
@mousedown="$emit('start-resize', 'top', $event)"
|
|
25
|
+
></div>
|
|
26
|
+
<div
|
|
27
|
+
v-if="!isMobile && viewMode === 'floating'"
|
|
28
|
+
class="absolute bottom-3 left-0 top-3 z-10 w-1 cursor-w-resize hover:bg-primary/30"
|
|
29
|
+
@mousedown="$emit('start-resize', 'left', $event)"
|
|
30
|
+
></div>
|
|
31
|
+
</template>
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { Button } from '../../ui/button';
|
|
3
|
+
import { ScrollArea, ScrollBar } from '../../ui/scroll-area';
|
|
4
|
+
import { buildChatTabTitleMap } from '../../lib/chatTabs';
|
|
5
|
+
import { Loader2, Plus, X } from 'lucide-vue-next';
|
|
6
|
+
import { computed, unref } from 'vue';
|
|
7
|
+
import { useSvedaT } from '../../i18n/index';
|
|
8
|
+
|
|
9
|
+
const t = useSvedaT();
|
|
10
|
+
|
|
11
|
+
const props = defineProps({
|
|
12
|
+
tabs: {
|
|
13
|
+
type: Array,
|
|
14
|
+
required: true,
|
|
15
|
+
},
|
|
16
|
+
currentChatId: {
|
|
17
|
+
type: String,
|
|
18
|
+
default: null,
|
|
19
|
+
},
|
|
20
|
+
streamingChatIds: {
|
|
21
|
+
type: Object,
|
|
22
|
+
default: () => new Set(),
|
|
23
|
+
},
|
|
24
|
+
unreadChatIds: {
|
|
25
|
+
type: Object,
|
|
26
|
+
default: () => new Set(),
|
|
27
|
+
},
|
|
28
|
+
compact: {
|
|
29
|
+
type: Boolean,
|
|
30
|
+
default: false,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const emit = defineEmits(['select-chat', 'close-tab', 'new-chat']);
|
|
35
|
+
|
|
36
|
+
const visibleTabs = computed(() => props.tabs.filter(tab => tab?.id));
|
|
37
|
+
|
|
38
|
+
const tabTitles = computed(() => buildChatTabTitleMap(visibleTabs.value, t));
|
|
39
|
+
|
|
40
|
+
const resolveIdSet = value => {
|
|
41
|
+
const resolved = unref(value);
|
|
42
|
+
if (resolved instanceof Set) {
|
|
43
|
+
return resolved;
|
|
44
|
+
}
|
|
45
|
+
return new Set();
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const isStreaming = chatId => resolveIdSet(props.streamingChatIds).has(chatId);
|
|
49
|
+
|
|
50
|
+
const hasUnread = chatId => !isStreaming(chatId) && resolveIdSet(props.unreadChatIds).has(chatId);
|
|
51
|
+
|
|
52
|
+
const tabTriggerClass = chatId =>
|
|
53
|
+
[
|
|
54
|
+
'inline-flex h-10 max-w-56 shrink-0 items-center gap-1.5 whitespace-nowrap border-b-2 border-transparent px-4 py-2 text-sm font-medium text-foreground/70 transition-all hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
|
|
55
|
+
props.currentChatId === chatId
|
|
56
|
+
? 'border-primary bg-muted/60 text-foreground shadow-sm'
|
|
57
|
+
: '',
|
|
58
|
+
].join(' ');
|
|
59
|
+
|
|
60
|
+
const closeTab = (chatId, event) => {
|
|
61
|
+
event.stopPropagation();
|
|
62
|
+
emit('close-tab', chatId);
|
|
63
|
+
};
|
|
64
|
+
</script>
|
|
65
|
+
|
|
66
|
+
<template>
|
|
67
|
+
<div
|
|
68
|
+
v-if="visibleTabs.length > 0"
|
|
69
|
+
class="flex shrink-0 items-stretch border-b border-border/50 bg-background/70"
|
|
70
|
+
:class="compact ? 'px-3' : 'px-4 md:px-6'"
|
|
71
|
+
>
|
|
72
|
+
<ScrollArea class="min-w-0 flex-1">
|
|
73
|
+
<div class="flex h-12 min-w-max items-end gap-px px-1">
|
|
74
|
+
<div
|
|
75
|
+
v-for="tab in visibleTabs"
|
|
76
|
+
:key="tab.id"
|
|
77
|
+
role="button"
|
|
78
|
+
tabindex="0"
|
|
79
|
+
:class="tabTriggerClass(tab.id)"
|
|
80
|
+
@click="emit('select-chat', tab.id)"
|
|
81
|
+
@keydown.enter.prevent="emit('select-chat', tab.id)"
|
|
82
|
+
@keydown.space.prevent="emit('select-chat', tab.id)"
|
|
83
|
+
>
|
|
84
|
+
<Loader2
|
|
85
|
+
v-if="isStreaming(tab.id)"
|
|
86
|
+
class="h-3.5 w-3.5 shrink-0 animate-spin text-primary"
|
|
87
|
+
:aria-label="t('chatTabRunning')"
|
|
88
|
+
/>
|
|
89
|
+
<span
|
|
90
|
+
v-else-if="hasUnread(tab.id)"
|
|
91
|
+
class="h-2 w-2 shrink-0 rounded-full bg-primary"
|
|
92
|
+
:aria-label="t('chatTabUnread')"
|
|
93
|
+
/>
|
|
94
|
+
<span class="min-w-0 truncate">
|
|
95
|
+
{{ tabTitles.get(tab.id) }}
|
|
96
|
+
</span>
|
|
97
|
+
<button
|
|
98
|
+
type="button"
|
|
99
|
+
class="ml-0.5 rounded-sm p-0.5 text-muted-foreground opacity-70 hover:bg-background/80 hover:text-foreground hover:opacity-100"
|
|
100
|
+
:aria-label="t('closeChatTab')"
|
|
101
|
+
@mousedown.stop
|
|
102
|
+
@click.stop="closeTab(tab.id, $event)"
|
|
103
|
+
>
|
|
104
|
+
<X class="h-3 w-3" />
|
|
105
|
+
</button>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
<ScrollBar orientation="horizontal" />
|
|
109
|
+
</ScrollArea>
|
|
110
|
+
|
|
111
|
+
<div class="flex shrink-0 items-center border-l border-border/40 pl-1">
|
|
112
|
+
<Button
|
|
113
|
+
variant="ghostTransparent"
|
|
114
|
+
size="icon"
|
|
115
|
+
class="h-9 w-9 shrink-0 text-muted-foreground hover:text-foreground"
|
|
116
|
+
:aria-label="t('newChat')"
|
|
117
|
+
@click="emit('new-chat')"
|
|
118
|
+
>
|
|
119
|
+
<Plus class="h-4 w-4" />
|
|
120
|
+
</Button>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
</template>
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { Button } from '../../ui/button';
|
|
3
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip';
|
|
4
|
+
import { History, Maximize2, MessageSquare, Minimize2, PanelRight, Sparkles, X } from 'lucide-vue-next';
|
|
5
|
+
import { computed } from 'vue';
|
|
6
|
+
import { useSvedaT } from '../../i18n/index';
|
|
7
|
+
|
|
8
|
+
const t = useSvedaT();
|
|
9
|
+
|
|
10
|
+
const props = defineProps({
|
|
11
|
+
isMobile: { type: Boolean, required: true },
|
|
12
|
+
viewMode: { type: String, required: true },
|
|
13
|
+
isImmersiveDesktop: { type: Boolean, required: true },
|
|
14
|
+
showHistorySidebar: { type: Boolean, required: true },
|
|
15
|
+
immersiveUiEnabled: { type: Boolean, default: true },
|
|
16
|
+
viewModeToggleEnabled: { type: Boolean, default: true },
|
|
17
|
+
title: { type: String, required: true },
|
|
18
|
+
viewModeFloatingLabel: { type: String, required: true },
|
|
19
|
+
viewModeFixedLabel: { type: String, required: true },
|
|
20
|
+
immersiveEnterLabel: { type: String, required: true },
|
|
21
|
+
immersiveExitLabel: { type: String, required: true },
|
|
22
|
+
immersiveBrandName: { type: String, default: '' },
|
|
23
|
+
immersiveBrandLogo: { type: String, default: null },
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
defineEmits([
|
|
27
|
+
'toggle-history-sidebar',
|
|
28
|
+
'exit-immersive',
|
|
29
|
+
'enter-immersive',
|
|
30
|
+
'toggle-view-mode',
|
|
31
|
+
'new-chat',
|
|
32
|
+
'minimize',
|
|
33
|
+
]);
|
|
34
|
+
|
|
35
|
+
const headerClass = computed(() => {
|
|
36
|
+
const base =
|
|
37
|
+
'flex h-14 shrink-0 flex-row items-center justify-between border-b border-border/50 bg-background/70 px-4 backdrop-blur supports-[backdrop-filter]:bg-background/70 md:px-6 xl:h-16';
|
|
38
|
+
if (props.viewMode === 'immersive') {
|
|
39
|
+
return `${base} rounded-none`;
|
|
40
|
+
}
|
|
41
|
+
if (props.isMobile || props.viewMode === 'fixed') {
|
|
42
|
+
return `${base} rounded-none`;
|
|
43
|
+
}
|
|
44
|
+
return `${base} rounded-t-[var(--sveda-radius)]`;
|
|
45
|
+
});
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<template>
|
|
49
|
+
<TooltipProvider>
|
|
50
|
+
<header :class="headerClass">
|
|
51
|
+
<div
|
|
52
|
+
v-if="!isImmersiveDesktop"
|
|
53
|
+
class="flex min-w-0 flex-1 items-center gap-2"
|
|
54
|
+
>
|
|
55
|
+
<Tooltip>
|
|
56
|
+
<TooltipTrigger as-child>
|
|
57
|
+
<Button
|
|
58
|
+
variant="ghostTransparent"
|
|
59
|
+
size="icon"
|
|
60
|
+
class="h-9 w-9 text-muted-foreground hover:text-foreground"
|
|
61
|
+
:class="{ 'bg-muted/60 text-foreground': showHistorySidebar }"
|
|
62
|
+
@click="$emit('toggle-history-sidebar')"
|
|
63
|
+
>
|
|
64
|
+
<History class="h-4 w-4" />
|
|
65
|
+
</Button>
|
|
66
|
+
</TooltipTrigger>
|
|
67
|
+
<TooltipContent>
|
|
68
|
+
<p>{{ t('chatHistory') }}</p>
|
|
69
|
+
</TooltipContent>
|
|
70
|
+
</Tooltip>
|
|
71
|
+
<h2 class="min-w-0 flex-1 truncate text-left text-sm font-medium leading-tight text-foreground xl:text-base">
|
|
72
|
+
{{ title }}
|
|
73
|
+
</h2>
|
|
74
|
+
</div>
|
|
75
|
+
<div
|
|
76
|
+
v-else
|
|
77
|
+
class="flex min-w-0 flex-1 items-center gap-4"
|
|
78
|
+
>
|
|
79
|
+
<div class="w-[min(20rem,33vw)] min-w-0">
|
|
80
|
+
<div class="flex items-center gap-2">
|
|
81
|
+
<img
|
|
82
|
+
v-if="immersiveBrandLogo"
|
|
83
|
+
:src="immersiveBrandLogo"
|
|
84
|
+
:alt="immersiveBrandName"
|
|
85
|
+
class="size-7 shrink-0 rounded"
|
|
86
|
+
/>
|
|
87
|
+
<Sparkles
|
|
88
|
+
v-else
|
|
89
|
+
class="size-5 shrink-0 text-primary"
|
|
90
|
+
/>
|
|
91
|
+
<span class="truncate text-lg font-bold leading-none text-foreground">
|
|
92
|
+
{{ immersiveBrandName }}
|
|
93
|
+
</span>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
<h2 class="min-w-0 flex-1 truncate text-left text-sm font-medium leading-tight text-foreground xl:text-base">
|
|
97
|
+
{{ title }}
|
|
98
|
+
</h2>
|
|
99
|
+
</div>
|
|
100
|
+
<div class="flex shrink-0 items-center gap-0.5">
|
|
101
|
+
<Tooltip v-if="immersiveUiEnabled && !isMobile && viewMode === 'immersive'">
|
|
102
|
+
<TooltipTrigger as-child>
|
|
103
|
+
<Button
|
|
104
|
+
variant="ghostTransparent"
|
|
105
|
+
size="icon"
|
|
106
|
+
class="h-9 w-9 text-muted-foreground hover:text-foreground"
|
|
107
|
+
@click="$emit('exit-immersive')"
|
|
108
|
+
>
|
|
109
|
+
<Minimize2 class="h-4 w-4" />
|
|
110
|
+
</Button>
|
|
111
|
+
</TooltipTrigger>
|
|
112
|
+
<TooltipContent>
|
|
113
|
+
<p>{{ immersiveExitLabel }}</p>
|
|
114
|
+
</TooltipContent>
|
|
115
|
+
</Tooltip>
|
|
116
|
+
<Tooltip v-if="immersiveUiEnabled && !isMobile && viewMode !== 'immersive'">
|
|
117
|
+
<TooltipTrigger as-child>
|
|
118
|
+
<Button
|
|
119
|
+
variant="ghostTransparent"
|
|
120
|
+
size="icon"
|
|
121
|
+
class="h-9 w-9 text-muted-foreground hover:text-foreground"
|
|
122
|
+
@click="$emit('enter-immersive')"
|
|
123
|
+
>
|
|
124
|
+
<Maximize2 class="h-4 w-4" />
|
|
125
|
+
</Button>
|
|
126
|
+
</TooltipTrigger>
|
|
127
|
+
<TooltipContent>
|
|
128
|
+
<p>{{ immersiveEnterLabel }}</p>
|
|
129
|
+
</TooltipContent>
|
|
130
|
+
</Tooltip>
|
|
131
|
+
<Tooltip v-if="viewModeToggleEnabled && !isMobile && viewMode !== 'immersive'">
|
|
132
|
+
<TooltipTrigger as-child>
|
|
133
|
+
<Button
|
|
134
|
+
variant="ghostTransparent"
|
|
135
|
+
size="icon"
|
|
136
|
+
class="h-9 w-9 text-muted-foreground hover:text-foreground"
|
|
137
|
+
@click="$emit('toggle-view-mode')"
|
|
138
|
+
>
|
|
139
|
+
<PanelRight
|
|
140
|
+
v-if="viewMode === 'floating'"
|
|
141
|
+
class="h-4 w-4"
|
|
142
|
+
/>
|
|
143
|
+
<MessageSquare
|
|
144
|
+
v-else
|
|
145
|
+
class="h-4 w-4"
|
|
146
|
+
/>
|
|
147
|
+
</Button>
|
|
148
|
+
</TooltipTrigger>
|
|
149
|
+
<TooltipContent>
|
|
150
|
+
<p>{{ viewMode === 'floating' ? viewModeFixedLabel : viewModeFloatingLabel }}</p>
|
|
151
|
+
</TooltipContent>
|
|
152
|
+
</Tooltip>
|
|
153
|
+
<Tooltip>
|
|
154
|
+
<TooltipTrigger as-child>
|
|
155
|
+
<Button
|
|
156
|
+
variant="ghostTransparent"
|
|
157
|
+
size="icon"
|
|
158
|
+
class="h-9 w-9 text-muted-foreground hover:text-foreground"
|
|
159
|
+
@click="$emit('minimize')"
|
|
160
|
+
>
|
|
161
|
+
<X class="h-4 w-4" />
|
|
162
|
+
</Button>
|
|
163
|
+
</TooltipTrigger>
|
|
164
|
+
<TooltipContent>
|
|
165
|
+
<p>{{ t('toolbarMinimize') }}</p>
|
|
166
|
+
</TooltipContent>
|
|
167
|
+
</Tooltip>
|
|
168
|
+
</div>
|
|
169
|
+
</header>
|
|
170
|
+
</TooltipProvider>
|
|
171
|
+
</template>
|