@sqlrooms/ai 0.25.0-rc.0 → 0.26.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -33
- package/dist/index.d.ts +8 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -23
- package/dist/index.js.map +1 -1
- package/dist/tools/defaultInstructions.d.ts +8 -0
- package/dist/tools/defaultInstructions.d.ts.map +1 -0
- package/dist/tools/defaultInstructions.js +64 -0
- package/dist/tools/defaultInstructions.js.map +1 -0
- package/dist/tools/defaultTools.d.ts +14 -0
- package/dist/tools/defaultTools.d.ts.map +1 -0
- package/dist/tools/defaultTools.js +13 -0
- package/dist/tools/defaultTools.js.map +1 -0
- package/dist/tools/query/QueryToolResult.d.ts.map +1 -0
- package/dist/tools/query/QueryToolResult.js.map +1 -0
- package/dist/tools/query/queryTool.d.ts +25 -0
- package/dist/tools/query/queryTool.d.ts.map +1 -0
- package/dist/tools/query/queryTool.js +108 -0
- package/dist/tools/query/queryTool.js.map +1 -0
- package/package.json +13 -18
- package/dist/AiSettingsSlice.d.ts +0 -113
- package/dist/AiSettingsSlice.d.ts.map +0 -1
- package/dist/AiSettingsSlice.js +0 -174
- package/dist/AiSettingsSlice.js.map +0 -1
- package/dist/AiSlice.d.ts +0 -453
- package/dist/AiSlice.d.ts.map +0 -1
- package/dist/AiSlice.js +0 -416
- package/dist/AiSlice.js.map +0 -1
- package/dist/analysis.d.ts +0 -79
- package/dist/analysis.d.ts.map +0 -1
- package/dist/analysis.js +0 -218
- package/dist/analysis.js.map +0 -1
- package/dist/components/AnalysisAnswer.d.ts +0 -15
- package/dist/components/AnalysisAnswer.d.ts.map +0 -1
- package/dist/components/AnalysisAnswer.js +0 -102
- package/dist/components/AnalysisAnswer.js.map +0 -1
- package/dist/components/AnalysisResult.d.ts +0 -22
- package/dist/components/AnalysisResult.d.ts.map +0 -1
- package/dist/components/AnalysisResult.js +0 -39
- package/dist/components/AnalysisResult.js.map +0 -1
- package/dist/components/AnalysisResultsContainer.d.ts +0 -5
- package/dist/components/AnalysisResultsContainer.d.ts.map +0 -1
- package/dist/components/AnalysisResultsContainer.js +0 -26
- package/dist/components/AnalysisResultsContainer.js.map +0 -1
- package/dist/components/ErrorMessage.d.ts +0 -4
- package/dist/components/ErrorMessage.d.ts.map +0 -1
- package/dist/components/ErrorMessage.js +0 -8
- package/dist/components/ErrorMessage.js.map +0 -1
- package/dist/components/MessageContainer.d.ts +0 -10
- package/dist/components/MessageContainer.d.ts.map +0 -1
- package/dist/components/MessageContainer.js +0 -9
- package/dist/components/MessageContainer.js.map +0 -1
- package/dist/components/ModelSelector.d.ts +0 -13
- package/dist/components/ModelSelector.d.ts.map +0 -1
- package/dist/components/ModelSelector.js +0 -29
- package/dist/components/ModelSelector.js.map +0 -1
- package/dist/components/QueryControls.d.ts +0 -10
- package/dist/components/QueryControls.d.ts.map +0 -1
- package/dist/components/QueryControls.js +0 -55
- package/dist/components/QueryControls.js.map +0 -1
- package/dist/components/SessionControls.d.ts +0 -17
- package/dist/components/SessionControls.d.ts.map +0 -1
- package/dist/components/SessionControls.js +0 -20
- package/dist/components/SessionControls.js.map +0 -1
- package/dist/components/session/DeleteSessionButton.d.ts +0 -19
- package/dist/components/session/DeleteSessionButton.d.ts.map +0 -1
- package/dist/components/session/DeleteSessionButton.js +0 -54
- package/dist/components/session/DeleteSessionButton.js.map +0 -1
- package/dist/components/session/DeleteSessionDialog.d.ts +0 -27
- package/dist/components/session/DeleteSessionDialog.d.ts.map +0 -1
- package/dist/components/session/DeleteSessionDialog.js +0 -19
- package/dist/components/session/DeleteSessionDialog.js.map +0 -1
- package/dist/components/session/SessionActions.d.ts +0 -18
- package/dist/components/session/SessionActions.d.ts.map +0 -1
- package/dist/components/session/SessionActions.js +0 -19
- package/dist/components/session/SessionActions.js.map +0 -1
- package/dist/components/session/SessionDropdown.d.ts +0 -18
- package/dist/components/session/SessionDropdown.d.ts.map +0 -1
- package/dist/components/session/SessionDropdown.js +0 -21
- package/dist/components/session/SessionDropdown.js.map +0 -1
- package/dist/components/session/SessionTitle.d.ts +0 -18
- package/dist/components/session/SessionTitle.d.ts.map +0 -1
- package/dist/components/session/SessionTitle.js +0 -22
- package/dist/components/session/SessionTitle.js.map +0 -1
- package/dist/components/session/SessionType.d.ts +0 -24
- package/dist/components/session/SessionType.d.ts.map +0 -1
- package/dist/components/session/SessionType.js +0 -2
- package/dist/components/session/SessionType.js.map +0 -1
- package/dist/components/session/index.d.ts +0 -7
- package/dist/components/session/index.d.ts.map +0 -1
- package/dist/components/session/index.js +0 -7
- package/dist/components/session/index.js.map +0 -1
- package/dist/components/settings/AiModelParameters.d.ts +0 -6
- package/dist/components/settings/AiModelParameters.d.ts.map +0 -1
- package/dist/components/settings/AiModelParameters.js +0 -91
- package/dist/components/settings/AiModelParameters.js.map +0 -1
- package/dist/components/settings/AiModelUsage.d.ts +0 -18
- package/dist/components/settings/AiModelUsage.d.ts.map +0 -1
- package/dist/components/settings/AiModelUsage.js +0 -60
- package/dist/components/settings/AiModelUsage.js.map +0 -1
- package/dist/components/settings/AiModelsSettings.d.ts +0 -10
- package/dist/components/settings/AiModelsSettings.d.ts.map +0 -1
- package/dist/components/settings/AiModelsSettings.js +0 -229
- package/dist/components/settings/AiModelsSettings.js.map +0 -1
- package/dist/components/settings/AiProvidersSettings.d.ts +0 -3
- package/dist/components/settings/AiProvidersSettings.d.ts.map +0 -1
- package/dist/components/settings/AiProvidersSettings.js +0 -88
- package/dist/components/settings/AiProvidersSettings.js.map +0 -1
- package/dist/components/settings/AiSettingsPanel.d.ts +0 -17
- package/dist/components/settings/AiSettingsPanel.d.ts.map +0 -1
- package/dist/components/settings/AiSettingsPanel.js +0 -20
- package/dist/components/settings/AiSettingsPanel.js.map +0 -1
- package/dist/components/tools/QueryToolResult.d.ts.map +0 -1
- package/dist/components/tools/QueryToolResult.js.map +0 -1
- package/dist/components/tools/ToolErrorMessage.d.ts +0 -39
- package/dist/components/tools/ToolErrorMessage.d.ts.map +0 -1
- package/dist/components/tools/ToolErrorMessage.js +0 -20
- package/dist/components/tools/ToolErrorMessage.js.map +0 -1
- package/dist/components/tools/ToolResult.d.ts +0 -11
- package/dist/components/tools/ToolResult.d.ts.map +0 -1
- package/dist/components/tools/ToolResult.js +0 -29
- package/dist/components/tools/ToolResult.js.map +0 -1
- package/dist/components/tools/ToolResultErrorBoundary.d.ts +0 -19
- package/dist/components/tools/ToolResultErrorBoundary.d.ts.map +0 -1
- package/dist/components/tools/ToolResultErrorBoundary.js +0 -24
- package/dist/components/tools/ToolResultErrorBoundary.js.map +0 -1
- package/dist/hooks/useScrollToBottom.d.ts +0 -82
- package/dist/hooks/useScrollToBottom.d.ts.map +0 -1
- package/dist/hooks/useScrollToBottom.js +0 -142
- package/dist/hooks/useScrollToBottom.js.map +0 -1
- package/dist/schemas.d.ts +0 -512
- package/dist/schemas.d.ts.map +0 -1
- package/dist/schemas.js +0 -93
- package/dist/schemas.js.map +0 -1
- package/dist/utils.d.ts +0 -15
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -31
- package/dist/utils.js.map +0 -1
- /package/dist/{components/tools → tools/query}/QueryToolResult.d.ts +0 -0
- /package/dist/{components/tools → tools/query}/QueryToolResult.js +0 -0
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React, { useState } from 'react';
|
|
3
|
-
import { Button, Input, Label, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogTrigger, DialogFooter, useDisclosure, useToast, } from '@sqlrooms/ui';
|
|
4
|
-
import { Cone, Settings, Plus, Server, Key, Trash2, CirclePlus, } from 'lucide-react';
|
|
5
|
-
import { useStoreWithAiSettings } from '../../AiSettingsSlice';
|
|
6
|
-
export const AiProvidersSettings = () => {
|
|
7
|
-
const { toast } = useToast();
|
|
8
|
-
const updateProvider = useStoreWithAiSettings((state) => state.aiSettings.updateProvider);
|
|
9
|
-
const addProvider = useStoreWithAiSettings((state) => state.aiSettings.addProvider);
|
|
10
|
-
const removeProvider = useStoreWithAiSettings((state) => state.aiSettings.removeProvider);
|
|
11
|
-
const providers = useStoreWithAiSettings((state) => state.aiSettings.config.providers);
|
|
12
|
-
const modelProviders = React.useMemo(() => {
|
|
13
|
-
const result = {};
|
|
14
|
-
Object.entries(providers).forEach(([key, provider]) => {
|
|
15
|
-
result[key] = {
|
|
16
|
-
apiKey: provider.apiKey,
|
|
17
|
-
baseUrl: provider.baseUrl,
|
|
18
|
-
};
|
|
19
|
-
});
|
|
20
|
-
return result;
|
|
21
|
-
}, [providers]);
|
|
22
|
-
const [expandedProviders, setExpandedProviders] = useState(new Set());
|
|
23
|
-
// Dialog state for adding a new provider
|
|
24
|
-
const { isOpen, onOpen, onClose } = useDisclosure();
|
|
25
|
-
const [newProviderKey, setNewProviderKey] = useState('');
|
|
26
|
-
const [newProviderApiKey, setNewProviderApiKey] = useState('');
|
|
27
|
-
const [newProviderBaseUrl, setNewProviderBaseUrl] = useState('');
|
|
28
|
-
// Dialog state for delete confirmation
|
|
29
|
-
const { isOpen: isDeleteOpen, onOpen: onDeleteOpen, onClose: onDeleteClose, } = useDisclosure();
|
|
30
|
-
const [providerToDelete, setProviderToDelete] = useState(null);
|
|
31
|
-
const handleAddProvider = () => {
|
|
32
|
-
if (newProviderKey) {
|
|
33
|
-
// Check if provider already exists
|
|
34
|
-
if (providers[newProviderKey]) {
|
|
35
|
-
toast({
|
|
36
|
-
title: 'Provider already exists',
|
|
37
|
-
description: `A provider with the key "${newProviderKey}" already exists. Please choose a different key.`,
|
|
38
|
-
variant: 'destructive',
|
|
39
|
-
});
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
addProvider(newProviderKey, newProviderBaseUrl, newProviderApiKey);
|
|
43
|
-
setNewProviderKey('');
|
|
44
|
-
setNewProviderApiKey('');
|
|
45
|
-
setNewProviderBaseUrl('');
|
|
46
|
-
onClose();
|
|
47
|
-
toast({
|
|
48
|
-
title: 'Provider added successfully',
|
|
49
|
-
description: `Provider "${newProviderKey}" has been added.`,
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
const handleUpdateProvider = (providerKey, field, value) => {
|
|
54
|
-
updateProvider(providerKey, { [field]: value });
|
|
55
|
-
};
|
|
56
|
-
const handleDeleteProvider = (providerKey) => {
|
|
57
|
-
setProviderToDelete({ key: providerKey });
|
|
58
|
-
onDeleteOpen();
|
|
59
|
-
};
|
|
60
|
-
const confirmDeleteProvider = () => {
|
|
61
|
-
if (providerToDelete) {
|
|
62
|
-
removeProvider(providerToDelete.key);
|
|
63
|
-
onDeleteClose();
|
|
64
|
-
setProviderToDelete(null);
|
|
65
|
-
toast({
|
|
66
|
-
title: 'Provider deleted successfully',
|
|
67
|
-
description: `Provider "${providerToDelete.key}" and its associated models have been removed.`,
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
const toggleProviderExpanded = (providerKey) => {
|
|
72
|
-
setExpandedProviders((prev) => {
|
|
73
|
-
const newSet = new Set(prev);
|
|
74
|
-
if (newSet.has(providerKey)) {
|
|
75
|
-
newSet.delete(providerKey);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
newSet.add(providerKey);
|
|
79
|
-
}
|
|
80
|
-
return newSet;
|
|
81
|
-
});
|
|
82
|
-
};
|
|
83
|
-
return (_jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "text-md flex items-center gap-2 pb-6 font-medium", children: [_jsx(Cone, { className: "h-4 w-4" }), "Providers"] }), _jsx("div", { className: "space-y-1", children: Object.entries(modelProviders).map(([providerKey, provider]) => {
|
|
84
|
-
const isExpanded = expandedProviders.has(providerKey);
|
|
85
|
-
return (_jsxs("div", { className: "space-y-0 rounded-lg p-0", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Label, { className: "w-20 flex-shrink-0 text-sm", children: providerKey.charAt(0).toUpperCase() + providerKey.slice(1) }), _jsx(Input, { id: `${providerKey}-apiKey`, type: "password", value: provider.apiKey, onChange: (e) => handleUpdateProvider(providerKey, 'apiKey', e.target.value), placeholder: "Enter API key", className: "flex-1" }), _jsx(Button, { variant: "ghost", size: "icon", onClick: () => handleDeleteProvider(providerKey), className: "h-6 h-8 w-6 w-8 p-0 text-gray-500 hover:bg-gray-100 hover:text-gray-700", children: _jsx(Trash2, { className: "h-4 w-4" }) }), _jsx(Button, { variant: "ghost", size: "icon", onClick: () => toggleProviderExpanded(providerKey), className: "h-8 w-8 flex-shrink-0", children: _jsx(Settings, { className: "h-4 w-4" }) })] }), isExpanded && (_jsxs("div", { className: "flex items-center gap-3 pt-1", children: [_jsx("div", { className: "w-20 flex-shrink-0" }), ' ', _jsxs("div", { className: "flex flex-1 items-center gap-3", children: [_jsx(Label, { htmlFor: `${providerKey}-baseUrl`, className: "text-muted-foreground flex-shrink-0 text-xs", children: "baseUrl:" }), _jsx(Input, { id: `${providerKey}-baseUrl`, type: "url", value: provider.baseUrl, onChange: (e) => handleUpdateProvider(providerKey, 'baseUrl', e.target.value), placeholder: "Enter base URL", className: "flex-1" })] }), _jsx("div", { className: "w-16 flex-shrink-0" }), ' '] }))] }, providerKey));
|
|
86
|
-
}) }), _jsx("div", { className: "flex w-full p-2", children: _jsxs(Button, { onClick: onOpen, variant: "secondary", size: "sm", children: [_jsx(CirclePlus, { className: "h-3 w-3" }), "Add"] }) }), _jsxs(Dialog, { open: isOpen, onOpenChange: (open) => (open ? onOpen() : onClose()), children: [_jsx(DialogTrigger, { asChild: true }), _jsxs(DialogContent, { className: "border-0 p-5", children: [_jsxs(DialogHeader, { className: "mb-1", children: [_jsxs(DialogTitle, { className: "flex items-center gap-2 text-base", children: [_jsx(Cone, { className: "h-4 w-4" }), " Add New Provider"] }), _jsx(DialogDescription, { className: "text-xs", children: "Configure a new model provider with API credentials." })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Label, { htmlFor: "new-provider-key", className: "w-20 text-sm", children: "Key" }), _jsxs("div", { className: "relative flex-1", children: [_jsx(Cone, { className: "absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { id: "new-provider-key", value: newProviderKey, onChange: (e) => setNewProviderKey(e.target.value), placeholder: "e.g., anthropic", className: "pl-8" })] })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Label, { htmlFor: "new-provider-api-key", className: "w-20 text-sm", children: "API Key" }), _jsxs("div", { className: "relative flex-1", children: [_jsx(Key, { className: "absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { id: "new-provider-api-key", type: "password", value: newProviderApiKey, onChange: (e) => setNewProviderApiKey(e.target.value), placeholder: "Enter API key", className: "pl-8" })] })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Label, { htmlFor: "new-provider-url", className: "w-20 text-sm", children: "baseUrl" }), _jsxs("div", { className: "relative flex-1", children: [_jsx(Server, { className: "absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { id: "new-provider-url", type: "url", value: newProviderBaseUrl, onChange: (e) => setNewProviderBaseUrl(e.target.value), placeholder: "Enter base URL", className: "pl-8" })] })] }), _jsx("div", { className: "flex justify-end pt-1", children: _jsxs(Button, { size: "sm", onClick: handleAddProvider, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), " Add Provider"] }) })] })] })] }), _jsx(Dialog, { open: isDeleteOpen, onOpenChange: (open) => (open ? onDeleteOpen() : onDeleteClose()), children: _jsxs(DialogContent, { className: "border-0 p-5", children: [_jsxs(DialogHeader, { className: "mb-1", children: [_jsxs(DialogTitle, { className: "text-destructive flex items-center gap-2 text-base", children: [_jsx(Trash2, { className: "h-4 w-4" }), " Delete Provider"] }), _jsx(DialogDescription, { className: "text-xs", children: "This action cannot be undone. This will permanently delete the provider and all its associated models." })] }), _jsxs("div", { className: "py-2", children: [_jsxs("p", { className: "text-sm", children: ["Are you sure you want to delete the provider", ' ', _jsxs("strong", { children: ["\u201C", providerToDelete?.key, "\u201D"] }), "?"] }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "All models associated with this provider will also be removed." })] }), _jsxs(DialogFooter, { className: "gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", onClick: onDeleteClose, children: "Cancel" }), _jsxs(Button, { variant: "destructive", size: "sm", onClick: confirmDeleteProvider, children: [_jsx(Trash2, { className: "mr-2 h-4 w-4" }), "Delete Provider"] })] })] }) })] }));
|
|
87
|
-
};
|
|
88
|
-
//# sourceMappingURL=AiProvidersSettings.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AiProvidersSettings.js","sourceRoot":"","sources":["../../../src/components/settings/AiProvidersSettings.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {FC, useState} from 'react';\nimport {\n Button,\n Input,\n Label,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogTrigger,\n DialogFooter,\n useDisclosure,\n useToast,\n} from '@sqlrooms/ui';\nimport {\n Cone,\n Settings,\n Plus,\n Server,\n Key,\n Trash2,\n CirclePlus,\n} from 'lucide-react';\nimport {useStoreWithAiSettings} from '../../AiSettingsSlice';\n\nexport const AiProvidersSettings: FC = () => {\n const {toast} = useToast();\n const updateProvider = useStoreWithAiSettings(\n (state) => state.aiSettings.updateProvider,\n );\n const addProvider = useStoreWithAiSettings(\n (state) => state.aiSettings.addProvider,\n );\n const removeProvider = useStoreWithAiSettings(\n (state) => state.aiSettings.removeProvider,\n );\n const providers = useStoreWithAiSettings(\n (state) => state.aiSettings.config.providers,\n );\n const modelProviders = React.useMemo(() => {\n const result: Record<string, {apiKey: string; baseUrl: string}> = {};\n Object.entries(providers).forEach(([key, provider]) => {\n result[key] = {\n apiKey: provider.apiKey,\n baseUrl: provider.baseUrl,\n };\n });\n return result;\n }, [providers]);\n\n const [expandedProviders, setExpandedProviders] = useState<Set<string>>(\n new Set(),\n );\n\n // Dialog state for adding a new provider\n const {isOpen, onOpen, onClose} = useDisclosure();\n const [newProviderKey, setNewProviderKey] = useState('');\n const [newProviderApiKey, setNewProviderApiKey] = useState('');\n const [newProviderBaseUrl, setNewProviderBaseUrl] = useState('');\n\n // Dialog state for delete confirmation\n const {\n isOpen: isDeleteOpen,\n onOpen: onDeleteOpen,\n onClose: onDeleteClose,\n } = useDisclosure();\n const [providerToDelete, setProviderToDelete] = useState<{\n key: string;\n } | null>(null);\n\n const handleAddProvider = () => {\n if (newProviderKey) {\n // Check if provider already exists\n if (providers[newProviderKey]) {\n toast({\n title: 'Provider already exists',\n description: `A provider with the key \"${newProviderKey}\" already exists. Please choose a different key.`,\n variant: 'destructive',\n });\n return;\n }\n\n addProvider(newProviderKey, newProviderBaseUrl, newProviderApiKey);\n setNewProviderKey('');\n setNewProviderApiKey('');\n setNewProviderBaseUrl('');\n onClose();\n\n toast({\n title: 'Provider added successfully',\n description: `Provider \"${newProviderKey}\" has been added.`,\n });\n }\n };\n\n const handleUpdateProvider = (\n providerKey: string,\n field: 'apiKey' | 'baseUrl',\n value: string,\n ) => {\n updateProvider(providerKey, {[field]: value});\n };\n\n const handleDeleteProvider = (providerKey: string) => {\n setProviderToDelete({key: providerKey});\n onDeleteOpen();\n };\n\n const confirmDeleteProvider = () => {\n if (providerToDelete) {\n removeProvider(providerToDelete.key);\n onDeleteClose();\n setProviderToDelete(null);\n\n toast({\n title: 'Provider deleted successfully',\n description: `Provider \"${providerToDelete.key}\" and its associated models have been removed.`,\n });\n }\n };\n\n const toggleProviderExpanded = (providerKey: string) => {\n setExpandedProviders((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(providerKey)) {\n newSet.delete(providerKey);\n } else {\n newSet.add(providerKey);\n }\n return newSet;\n });\n };\n\n return (\n <div className=\"space-y-2\">\n <label className=\"text-md flex items-center gap-2 pb-6 font-medium\">\n <Cone className=\"h-4 w-4\" />\n Providers\n </label>\n\n {/* Existing Providers */}\n <div className=\"space-y-1\">\n {Object.entries(modelProviders).map(([providerKey, provider]) => {\n const isExpanded = expandedProviders.has(providerKey);\n\n return (\n <div key={providerKey} className=\"space-y-0 rounded-lg p-0\">\n {/* First row: Provider name, API key input, delete button, and cogwheel button */}\n <div className=\"flex items-center gap-3\">\n <Label className=\"w-20 flex-shrink-0 text-sm\">\n {providerKey.charAt(0).toUpperCase() + providerKey.slice(1)}\n </Label>\n <Input\n id={`${providerKey}-apiKey`}\n type=\"password\"\n value={provider.apiKey}\n onChange={(e) =>\n handleUpdateProvider(providerKey, 'apiKey', e.target.value)\n }\n placeholder=\"Enter API key\"\n className=\"flex-1\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => handleDeleteProvider(providerKey)}\n className=\"h-6 h-8 w-6 w-8 p-0 text-gray-500 hover:bg-gray-100 hover:text-gray-700\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => toggleProviderExpanded(providerKey)}\n className=\"h-8 w-8 flex-shrink-0\"\n >\n <Settings className=\"h-4 w-4\" />\n </Button>\n </div>\n\n {/* Second row: baseUrl input (toggleable) */}\n {isExpanded && (\n <div className=\"flex items-center gap-3 pt-1\">\n <div className=\"w-20 flex-shrink-0\" />{' '}\n {/* Spacer to align with provider name above */}\n <div className=\"flex flex-1 items-center gap-3\">\n <Label\n htmlFor={`${providerKey}-baseUrl`}\n className=\"text-muted-foreground flex-shrink-0 text-xs\"\n >\n baseUrl:\n </Label>\n <Input\n id={`${providerKey}-baseUrl`}\n type=\"url\"\n value={provider.baseUrl}\n onChange={(e) =>\n handleUpdateProvider(\n providerKey,\n 'baseUrl',\n e.target.value,\n )\n }\n placeholder=\"Enter base URL\"\n className=\"flex-1\"\n />\n </div>\n <div className=\"w-16 flex-shrink-0\" />{' '}\n {/* Spacer to align with delete and cogwheel buttons above */}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Add New Provider */}\n <div className=\"flex w-full p-2\">\n <Button onClick={onOpen} variant=\"secondary\" size=\"sm\">\n <CirclePlus className=\"h-3 w-3\" />\n Add\n </Button>\n </div>\n\n {/* Add New Provider Dialog */}\n <Dialog\n open={isOpen}\n onOpenChange={(open) => (open ? onOpen() : onClose())}\n >\n <DialogTrigger asChild>\n {/* handled via onOpen button above */}\n </DialogTrigger>\n <DialogContent className=\"border-0 p-5\">\n <DialogHeader className=\"mb-1\">\n <DialogTitle className=\"flex items-center gap-2 text-base\">\n <Cone className=\"h-4 w-4\" /> Add New Provider\n </DialogTitle>\n <DialogDescription className=\"text-xs\">\n Configure a new model provider with API credentials.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-3\">\n <Label htmlFor=\"new-provider-key\" className=\"w-20 text-sm\">\n Key\n </Label>\n <div className=\"relative flex-1\">\n <Cone className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2\" />\n <Input\n id=\"new-provider-key\"\n value={newProviderKey}\n onChange={(e) => setNewProviderKey(e.target.value)}\n placeholder=\"e.g., anthropic\"\n className=\"pl-8\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <Label htmlFor=\"new-provider-api-key\" className=\"w-20 text-sm\">\n API Key\n </Label>\n <div className=\"relative flex-1\">\n <Key className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2\" />\n <Input\n id=\"new-provider-api-key\"\n type=\"password\"\n value={newProviderApiKey}\n onChange={(e) => setNewProviderApiKey(e.target.value)}\n placeholder=\"Enter API key\"\n className=\"pl-8\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <Label htmlFor=\"new-provider-url\" className=\"w-20 text-sm\">\n baseUrl\n </Label>\n <div className=\"relative flex-1\">\n <Server className=\"absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2\" />\n <Input\n id=\"new-provider-url\"\n type=\"url\"\n value={newProviderBaseUrl}\n onChange={(e) => setNewProviderBaseUrl(e.target.value)}\n placeholder=\"Enter base URL\"\n className=\"pl-8\"\n />\n </div>\n </div>\n\n <div className=\"flex justify-end pt-1\">\n <Button size=\"sm\" onClick={handleAddProvider}>\n <Plus className=\"mr-2 h-4 w-4\" /> Add Provider\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n\n {/* Delete Confirmation Dialog */}\n <Dialog\n open={isDeleteOpen}\n onOpenChange={(open) => (open ? onDeleteOpen() : onDeleteClose())}\n >\n <DialogContent className=\"border-0 p-5\">\n <DialogHeader className=\"mb-1\">\n <DialogTitle className=\"text-destructive flex items-center gap-2 text-base\">\n <Trash2 className=\"h-4 w-4\" /> Delete Provider\n </DialogTitle>\n <DialogDescription className=\"text-xs\">\n This action cannot be undone. This will permanently delete the\n provider and all its associated models.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"py-2\">\n <p className=\"text-sm\">\n Are you sure you want to delete the provider{' '}\n <strong>“{providerToDelete?.key}”</strong>?\n </p>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n All models associated with this provider will also be removed.\n </p>\n </div>\n\n <DialogFooter className=\"gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={onDeleteClose}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={confirmDeleteProvider}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete Provider\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n};\n"]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { FC, PropsWithChildren } from 'react';
|
|
2
|
-
import { UseDisclosureReturnValue } from '@sqlrooms/ui';
|
|
3
|
-
interface AiSettingsPanelProps {
|
|
4
|
-
disclosure: UseDisclosureReturnValue;
|
|
5
|
-
}
|
|
6
|
-
export declare const AiSettingsPanelBase: FC<PropsWithChildren<AiSettingsPanelProps>>;
|
|
7
|
-
export declare const AiSettingsPanel: FC<PropsWithChildren<AiSettingsPanelProps>> & {
|
|
8
|
-
ProvidersSettings: FC;
|
|
9
|
-
ModelsSettings: FC<import("./AiModelsSettings").AiModelsSettingsProps>;
|
|
10
|
-
ModelUsage: FC<{
|
|
11
|
-
className?: string;
|
|
12
|
-
modelUsage?: import("./AiModelUsage").ModelUsageData;
|
|
13
|
-
}>;
|
|
14
|
-
ModelParametersSettings: FC<import("./AiModelParameters").AiModelParametersProps>;
|
|
15
|
-
};
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=AiSettingsPanel.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AiSettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/settings/AiSettingsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAC,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAS,wBAAwB,EAAC,MAAM,cAAc,CAAC;AAQ9D,UAAU,oBAAoB;IAC5B,UAAU,EAAE,wBAAwB,CAAC;CACtC;AAED,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAClC,iBAAiB,CAAC,oBAAoB,CAAC,CAoBxC,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;CAK1B,CAAC"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Button } from '@sqlrooms/ui';
|
|
3
|
-
import { X } from 'lucide-react';
|
|
4
|
-
import { AiModelParameters } from './AiModelParameters';
|
|
5
|
-
import { AiModelUsage } from './AiModelUsage';
|
|
6
|
-
import { AiProvidersSettings } from './AiProvidersSettings';
|
|
7
|
-
import { AiModelsSettings } from './AiModelsSettings';
|
|
8
|
-
export const AiSettingsPanelBase = ({ disclosure, children }) => {
|
|
9
|
-
const { isOpen, onClose } = disclosure;
|
|
10
|
-
if (!isOpen)
|
|
11
|
-
return null;
|
|
12
|
-
return (_jsx("div", { className: "bg-background border-border w-full rounded-lg border shadow-sm", children: _jsxs("div", { className: "relative flex flex-col gap-12 overflow-y-auto p-6", children: [_jsx(Button, { variant: "ghost", size: "icon", onClick: onClose, className: "absolute right-2 top-2 z-10", children: _jsx(X, { className: "h-4 w-4" }) }), children] }) }));
|
|
13
|
-
};
|
|
14
|
-
export const AiSettingsPanel = Object.assign(AiSettingsPanelBase, {
|
|
15
|
-
ProvidersSettings: AiProvidersSettings,
|
|
16
|
-
ModelsSettings: AiModelsSettings,
|
|
17
|
-
ModelUsage: AiModelUsage,
|
|
18
|
-
ModelParametersSettings: AiModelParameters,
|
|
19
|
-
});
|
|
20
|
-
//# sourceMappingURL=AiSettingsPanel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AiSettingsPanel.js","sourceRoot":"","sources":["../../../src/components/settings/AiSettingsPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,MAAM,EAA2B,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAC,CAAC,EAAC,MAAM,cAAc,CAAC;AAE/B,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAMpD,MAAM,CAAC,MAAM,mBAAmB,GAE5B,CAAC,EAAC,UAAU,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC7B,MAAM,EAAC,MAAM,EAAE,OAAO,EAAC,GAAG,UAAU,CAAC;IACrC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,OAAO,CACL,cAAK,SAAS,EAAC,gEAAgE,YAC7E,eAAK,SAAS,EAAC,mDAAmD,aAChE,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,6BAA6B,YAEvC,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,GAClB,EACR,QAAQ,IACL,GACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE;IAChE,iBAAiB,EAAE,mBAAmB;IACtC,cAAc,EAAE,gBAAgB;IAChC,UAAU,EAAE,YAAY;IACxB,uBAAuB,EAAE,iBAAiB;CAC3C,CAAC,CAAC","sourcesContent":["import {FC, PropsWithChildren} from 'react';\nimport {Button, UseDisclosureReturnValue} from '@sqlrooms/ui';\nimport {X} from 'lucide-react';\n\nimport {AiModelParameters} from './AiModelParameters';\nimport {AiModelUsage} from './AiModelUsage';\nimport {AiProvidersSettings} from './AiProvidersSettings';\nimport {AiModelsSettings} from './AiModelsSettings';\n\ninterface AiSettingsPanelProps {\n disclosure: UseDisclosureReturnValue;\n}\n\nexport const AiSettingsPanelBase: FC<\n PropsWithChildren<AiSettingsPanelProps>\n> = ({disclosure, children}) => {\n const {isOpen, onClose} = disclosure;\n if (!isOpen) return null;\n\n return (\n <div className=\"bg-background border-border w-full rounded-lg border shadow-sm\">\n <div className=\"relative flex flex-col gap-12 overflow-y-auto p-6\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n className=\"absolute right-2 top-2 z-10\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n {children}\n </div>\n </div>\n );\n};\n\nexport const AiSettingsPanel = Object.assign(AiSettingsPanelBase, {\n ProvidersSettings: AiProvidersSettings,\n ModelsSettings: AiModelsSettings,\n ModelUsage: AiModelUsage,\n ModelParametersSettings: AiModelParameters,\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"QueryToolResult.d.ts","sourceRoot":"","sources":["../../../src/components/tools/QueryToolResult.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,UAAU,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;CAC1B,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CA2C1D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"QueryToolResult.js","sourceRoot":"","sources":["../../../src/components/tools/QueryToolResult.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AASvC,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,MAAM,EAAC,KAAK,EAAE,QAAQ,EAAC,GAAG,KAAK,CAAC;IAChC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,6GAA6G,aAC1H,cAAK,SAAS,EAAC,sCAAsC,YAAE,QAAQ,GAAO,EACtE,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,UAAU,IACT,IAAI,EAAE,QAAQ,EACd,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,SAAS,EACnB,SAAS,EAAC,UAAU,GACpB,GACE,IACF,EACN,cAAK,SAAS,EAAC,yBAAyB,YACtC,MAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,UAAU,CAAC,MAAM,aAC1D,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,EACjC,aAAI,SAAS,EAAC,SAAS,kCAAuB,IACvC,GACL,EAEL,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC,CACvB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CACjB,KAAC,cAAc,IACb,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,UAAU,EAAE,UAAU,GACtB,CACH,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,aAAa,wBAAc,CAC3C,CACF,CAAC,CAAC,CAAC,CACF,KAAC,cAAc,IACb,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,QAAQ,EACf,UAAU,EAAE,UAAU,GACtB,CACH,IACA,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import {DataTableModal} from '@sqlrooms/data-table';\nimport {Button, CopyButton, useDisclosure} from '@sqlrooms/ui';\nimport * as arrow from 'apache-arrow';\nimport {TableIcon} from 'lucide-react';\n\ntype QueryToolResultProps = {\n title: string;\n sqlQuery: string;\n /** Provided in case the query result is already an arrow table */\n arrowTable?: arrow.Table;\n};\n\nexport function QueryToolResult(props: QueryToolResultProps) {\n const {title, sqlQuery} = props;\n const tableModal = useDisclosure();\n return (\n <>\n <div className=\"text-muted-foreground bg-muted relative max-h-[150px] w-full overflow-auto rounded-md p-2 font-mono text-xs\">\n <pre className=\"whitespace-pre-wrap break-words pr-8\">{sqlQuery}</pre>\n <div className=\"absolute right-1 top-1\">\n <CopyButton\n text={sqlQuery}\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n ariaLabel=\"Copy SQL\"\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"xs\" onClick={tableModal.onOpen}>\n <TableIcon className=\"h-4 w-4\" />\n <h3 className=\"text-xs\">Show Query Result</h3>\n </Button>\n </div>\n\n {'arrowTable' in props ? (\n props.arrowTable ? (\n <DataTableModal\n title={title}\n arrowTable={props.arrowTable}\n tableModal={tableModal}\n />\n ) : (\n <div className=\"p-4 text-xs\">No data</div>\n )\n ) : (\n <DataTableModal\n title={title}\n query={sqlQuery}\n tableModal={tableModal}\n />\n )}\n </>\n );\n}\n"]}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Displays a compact, reusable popover with a warning icon and error details.
|
|
3
|
-
* Intended for tool rendering/processing errors to keep UIs consistent.
|
|
4
|
-
*
|
|
5
|
-
* The popover is controllable to optimize performance by only rendering the
|
|
6
|
-
* JsonMonacoEditor when the popover is actually open.
|
|
7
|
-
*/
|
|
8
|
-
export interface ToolErrorMessageProps {
|
|
9
|
-
/**
|
|
10
|
-
* Error object or message to display inside the popover body.
|
|
11
|
-
*/
|
|
12
|
-
error?: unknown;
|
|
13
|
-
/**
|
|
14
|
-
* Optional structured details to render in a Monaco JSON editor.
|
|
15
|
-
*/
|
|
16
|
-
details?: string | object;
|
|
17
|
-
/**
|
|
18
|
-
* Header text shown at the top of the popover.
|
|
19
|
-
* Defaults to "Tool rendering error".
|
|
20
|
-
*/
|
|
21
|
-
title?: string;
|
|
22
|
-
/**
|
|
23
|
-
* Label shown next to the warning icon in the trigger button.
|
|
24
|
-
* Defaults to "Tool rendering failed".
|
|
25
|
-
*/
|
|
26
|
-
triggerLabel?: string;
|
|
27
|
-
/**
|
|
28
|
-
* Alignment of the popover content relative to its trigger.
|
|
29
|
-
* Defaults to "start".
|
|
30
|
-
*/
|
|
31
|
-
align?: 'start' | 'center' | 'end';
|
|
32
|
-
/**
|
|
33
|
-
* Height for the embedded editor when details are provided.
|
|
34
|
-
* Defaults to 300px.
|
|
35
|
-
*/
|
|
36
|
-
editorHeightPx?: number;
|
|
37
|
-
}
|
|
38
|
-
export declare function ToolErrorMessage(props: ToolErrorMessageProps): import("react/jsx-runtime").JSX.Element;
|
|
39
|
-
//# sourceMappingURL=ToolErrorMessage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolErrorMessage.d.ts","sourceRoot":"","sources":["../../../src/components/tools/ToolErrorMessage.tsx"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAkD5D"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { JsonMonacoEditor } from '@sqlrooms/monaco-editor';
|
|
3
|
-
import { Button, Popover, PopoverContent, PopoverTrigger, useDisclosure, } from '@sqlrooms/ui';
|
|
4
|
-
import { TriangleAlertIcon } from 'lucide-react';
|
|
5
|
-
export function ToolErrorMessage(props) {
|
|
6
|
-
const title = props.title ?? 'Tool rendering error';
|
|
7
|
-
const triggerLabel = props.triggerLabel ?? 'Tool rendering failed';
|
|
8
|
-
const align = props.align ?? 'start';
|
|
9
|
-
const errorText = props.error != null ? String(props.error) : '';
|
|
10
|
-
const editorHeightPx = props.editorHeightPx ?? 300;
|
|
11
|
-
const hasDetails = props.details != null;
|
|
12
|
-
const popoverOpen = useDisclosure();
|
|
13
|
-
return (_jsxs(Popover, { open: popoverOpen.isOpen, onOpenChange: popoverOpen.onToggle, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { className: "w-fit", variant: "ghost", size: "xs", children: _jsxs("p", { className: "flex items-center gap-2 text-xs text-orange-500", children: [_jsx(TriangleAlertIcon, {}), triggerLabel] }) }) }), _jsx(PopoverContent, { align: align, style: { width: '600px', maxWidth: '80%' }, children: _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { className: "border-b text-sm font-medium text-orange-500", children: title }), errorText ? (_jsx("div", { className: "whitespace-pre-wrap font-mono text-xs text-orange-500", children: errorText })) : null, hasDetails && popoverOpen.isOpen ? (_jsx("div", { className: "w-full overflow-hidden rounded-md border", style: { height: editorHeightPx }, children: _jsx(JsonMonacoEditor, { value: props.details, readOnly: true, options: {
|
|
14
|
-
lineNumbers: 'off',
|
|
15
|
-
minimap: { enabled: false },
|
|
16
|
-
scrollBeyondLastLine: false,
|
|
17
|
-
wordWrap: 'on',
|
|
18
|
-
} }) })) : null] }) })] }));
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=ToolErrorMessage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolErrorMessage.js","sourceRoot":"","sources":["../../../src/components/tools/ToolErrorMessage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,MAAM,EACN,OAAO,EACP,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAwC/C,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,sBAAsB,CAAC;IACpD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,uBAAuB,CAAC;IACnE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,GAAG,CAAC;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;IACzC,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IAEpC,OAAO,CACL,MAAC,OAAO,IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,QAAQ,aACnE,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IAAC,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,YACjD,aAAG,SAAS,EAAC,iDAAiD,aAC5D,KAAC,iBAAiB,KAAG,EACpB,YAAY,IACX,GACG,GACM,EACjB,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAC,YACpE,eAAK,SAAS,EAAC,qBAAqB,aAClC,cAAK,SAAS,EAAC,8CAA8C,YAC1D,KAAK,GACF,EACL,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,SAAS,EAAC,uDAAuD,YACnE,SAAS,GACN,CACP,CAAC,CAAC,CAAC,IAAI,EACP,UAAU,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAClC,cACE,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAE,EAAC,MAAM,EAAE,cAAc,EAAC,YAE/B,KAAC,gBAAgB,IACf,KAAK,EAAE,KAAK,CAAC,OAAiD,EAC9D,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE;oCACP,WAAW,EAAE,KAAK;oCAClB,OAAO,EAAE,EAAC,OAAO,EAAE,KAAK,EAAC;oCACzB,oBAAoB,EAAE,KAAK;oCAC3B,QAAQ,EAAE,IAAI;iCACf,GACD,GACE,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,GACS,IACT,CACX,CAAC;AACJ,CAAC","sourcesContent":["import {JsonMonacoEditor} from '@sqlrooms/monaco-editor';\nimport {\n Button,\n Popover,\n PopoverContent,\n PopoverTrigger,\n useDisclosure,\n} from '@sqlrooms/ui';\nimport {TriangleAlertIcon} from 'lucide-react';\n\n/**\n * Displays a compact, reusable popover with a warning icon and error details.\n * Intended for tool rendering/processing errors to keep UIs consistent.\n *\n * The popover is controllable to optimize performance by only rendering the\n * JsonMonacoEditor when the popover is actually open.\n */\nexport interface ToolErrorMessageProps {\n /**\n * Error object or message to display inside the popover body.\n */\n error?: unknown;\n /**\n * Optional structured details to render in a Monaco JSON editor.\n */\n details?: string | object;\n /**\n * Header text shown at the top of the popover.\n * Defaults to \"Tool rendering error\".\n */\n title?: string;\n /**\n * Label shown next to the warning icon in the trigger button.\n * Defaults to \"Tool rendering failed\".\n */\n triggerLabel?: string;\n /**\n * Alignment of the popover content relative to its trigger.\n * Defaults to \"start\".\n */\n align?: 'start' | 'center' | 'end';\n /**\n * Height for the embedded editor when details are provided.\n * Defaults to 300px.\n */\n editorHeightPx?: number;\n}\n\nexport function ToolErrorMessage(props: ToolErrorMessageProps) {\n const title = props.title ?? 'Tool rendering error';\n const triggerLabel = props.triggerLabel ?? 'Tool rendering failed';\n const align = props.align ?? 'start';\n const errorText = props.error != null ? String(props.error) : '';\n const editorHeightPx = props.editorHeightPx ?? 300;\n const hasDetails = props.details != null;\n const popoverOpen = useDisclosure();\n\n return (\n <Popover open={popoverOpen.isOpen} onOpenChange={popoverOpen.onToggle}>\n <PopoverTrigger asChild>\n <Button className=\"w-fit\" variant=\"ghost\" size=\"xs\">\n <p className=\"flex items-center gap-2 text-xs text-orange-500\">\n <TriangleAlertIcon />\n {triggerLabel}\n </p>\n </Button>\n </PopoverTrigger>\n <PopoverContent align={align} style={{width: '600px', maxWidth: '80%'}}>\n <div className=\"flex flex-col gap-2\">\n <div className=\"border-b text-sm font-medium text-orange-500\">\n {title}\n </div>\n {errorText ? (\n <div className=\"whitespace-pre-wrap font-mono text-xs text-orange-500\">\n {errorText}\n </div>\n ) : null}\n {hasDetails && popoverOpen.isOpen ? (\n <div\n className=\"w-full overflow-hidden rounded-md border\"\n style={{height: editorHeightPx}}\n >\n <JsonMonacoEditor\n value={props.details as unknown as object | string | undefined}\n readOnly={true}\n options={{\n lineNumbers: 'off',\n minimap: {enabled: false},\n scrollBeyondLastLine: false,\n wordWrap: 'on',\n }}\n />\n </div>\n ) : null}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ToolInvocation } from 'ai';
|
|
3
|
-
type ToolResultProps = {
|
|
4
|
-
toolInvocation: ToolInvocation;
|
|
5
|
-
additionalData: unknown;
|
|
6
|
-
isCompleted: boolean;
|
|
7
|
-
errorMessage?: string;
|
|
8
|
-
};
|
|
9
|
-
export declare const ToolResult: React.FC<ToolResultProps>;
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=ToolResult.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolResult.d.ts","sourceRoot":"","sources":["../../../src/components/tools/ToolResult.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAC,cAAc,EAAC,MAAM,IAAI,CAAC;AAGlC,KAAK,eAAe,GAAG;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAqEhD,CAAC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useDisclosure } from '@sqlrooms/ui';
|
|
3
|
-
import { useStoreWithAi } from '../../AiSlice';
|
|
4
|
-
import { MessageContainer } from '../MessageContainer';
|
|
5
|
-
import { ToolCallErrorBoundary } from './ToolResultErrorBoundary';
|
|
6
|
-
import { ToolErrorMessage } from './ToolErrorMessage';
|
|
7
|
-
export const ToolResult = ({ toolInvocation, additionalData, isCompleted, errorMessage, }) => {
|
|
8
|
-
const { isOpen: showDetails, onToggle: toggleShowDetails } = useDisclosure(false);
|
|
9
|
-
const { toolName, args, state } = toolInvocation;
|
|
10
|
-
const llmResult = state === 'result' ? toolInvocation.result : null;
|
|
11
|
-
// show reason text before tool call complete
|
|
12
|
-
const text = args.reasoning || '';
|
|
13
|
-
const ToolComponent = useStoreWithAi((state) => state.ai.findToolComponent(toolName));
|
|
14
|
-
// check if args has a property called 'reason'
|
|
15
|
-
const reason = args.reasoning;
|
|
16
|
-
// check if llmResult is an object and has a success property
|
|
17
|
-
const isSuccess = typeof llmResult === 'object' &&
|
|
18
|
-
llmResult !== null &&
|
|
19
|
-
'success' in llmResult &&
|
|
20
|
-
llmResult.success === true;
|
|
21
|
-
return !isCompleted ? (_jsx("div", { className: "text-sm text-gray-500", children: text })) : (_jsxs(MessageContainer, { isSuccess: isSuccess, type: toolName, content: {
|
|
22
|
-
toolName,
|
|
23
|
-
args,
|
|
24
|
-
llmResult,
|
|
25
|
-
additionalData,
|
|
26
|
-
isCompleted,
|
|
27
|
-
}, children: [_jsx("div", { className: "text-sm text-gray-500", children: reason && _jsx("span", { children: reason }) }), ToolComponent && isSuccess && isCompleted && (_jsx(ToolCallErrorBoundary, { children: typeof ToolComponent === 'function' ? (_jsx(ToolComponent, { ...llmResult, ...additionalData })) : (ToolComponent) })), isCompleted && (errorMessage || !isSuccess) && (_jsx(ToolErrorMessage, { error: errorMessage ?? 'Tool call failed', details: toolInvocation, title: "Tool call error", triggerLabel: "Tool call failed", editorHeightPx: 300 }))] }));
|
|
28
|
-
};
|
|
29
|
-
//# sourceMappingURL=ToolResult.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolResult.js","sourceRoot":"","sources":["../../../src/components/tools/ToolResult.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAS,aAAa,EAAC,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAC,qBAAqB,EAAC,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AASpD,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,EACpD,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,GACb,EAAE,EAAE;IACH,MAAM,EAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAC,GACtD,aAAa,CAAC,KAAK,CAAC,CAAC;IAEvB,MAAM,EAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,cAAc,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpE,6CAA6C;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IAElC,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7C,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CACrC,CAAC;IAEF,+CAA+C;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAmB,CAAC;IAExC,6DAA6D;IAC7D,MAAM,SAAS,GACb,OAAO,SAAS,KAAK,QAAQ;QAC7B,SAAS,KAAK,IAAI;QAClB,SAAS,IAAI,SAAS;QACtB,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC;IAE7B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CACpB,cAAK,SAAS,EAAC,uBAAuB,YAAE,IAAI,GAAO,CACpD,CAAC,CAAC,CAAC,CACF,MAAC,gBAAgB,IACf,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE;YACP,QAAQ;YACR,IAAI;YACJ,SAAS;YACT,cAAc;YACd,WAAW;SACZ,aAED,cAAK,SAAS,EAAC,uBAAuB,YACnC,MAAM,IAAI,yBAAO,MAAM,GAAQ,GAC5B,EACL,aAAa,IAAI,SAAS,IAAI,WAAW,IAAI,CAC5C,KAAC,qBAAqB,cACnB,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,CACrC,KAAC,aAAa,OACP,SAAqC,KACrC,cAA0C,GAC/C,CACH,CAAC,CAAC,CAAC,CACF,aAAa,CACd,GACqB,CACzB,EACA,WAAW,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAC9C,KAAC,gBAAgB,IACf,KAAK,EAAE,YAAY,IAAI,kBAAkB,EACzC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAC,iBAAiB,EACvB,YAAY,EAAC,kBAAkB,EAC/B,cAAc,EAAE,GAAG,GACnB,CACH,IACgB,CACpB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {Button, useDisclosure} from '@sqlrooms/ui';\nimport React from 'react';\nimport {useStoreWithAi} from '../../AiSlice';\nimport {MessageContainer} from '../MessageContainer';\nimport {ToolCallErrorBoundary} from './ToolResultErrorBoundary';\nimport {ToolInvocation} from 'ai';\nimport {ToolErrorMessage} from './ToolErrorMessage';\n\ntype ToolResultProps = {\n toolInvocation: ToolInvocation;\n additionalData: unknown;\n isCompleted: boolean;\n errorMessage?: string;\n};\n\nexport const ToolResult: React.FC<ToolResultProps> = ({\n toolInvocation,\n additionalData,\n isCompleted,\n errorMessage,\n}) => {\n const {isOpen: showDetails, onToggle: toggleShowDetails} =\n useDisclosure(false);\n\n const {toolName, args, state} = toolInvocation;\n const llmResult = state === 'result' ? toolInvocation.result : null;\n\n // show reason text before tool call complete\n const text = args.reasoning || '';\n\n const ToolComponent = useStoreWithAi((state) =>\n state.ai.findToolComponent(toolName),\n );\n\n // check if args has a property called 'reason'\n const reason = args.reasoning as string;\n\n // check if llmResult is an object and has a success property\n const isSuccess =\n typeof llmResult === 'object' &&\n llmResult !== null &&\n 'success' in llmResult &&\n llmResult.success === true;\n\n return !isCompleted ? (\n <div className=\"text-sm text-gray-500\">{text}</div>\n ) : (\n <MessageContainer\n isSuccess={isSuccess}\n type={toolName}\n content={{\n toolName,\n args,\n llmResult,\n additionalData,\n isCompleted,\n }}\n >\n <div className=\"text-sm text-gray-500\">\n {reason && <span>{reason}</span>}\n </div>\n {ToolComponent && isSuccess && isCompleted && (\n <ToolCallErrorBoundary>\n {typeof ToolComponent === 'function' ? (\n <ToolComponent\n {...(llmResult as Record<string, unknown>)}\n {...(additionalData as Record<string, unknown>)}\n />\n ) : (\n ToolComponent\n )}\n </ToolCallErrorBoundary>\n )}\n {isCompleted && (errorMessage || !isSuccess) && (\n <ToolErrorMessage\n error={errorMessage ?? 'Tool call failed'}\n details={toolInvocation}\n title=\"Tool call error\"\n triggerLabel=\"Tool call failed\"\n editorHeightPx={300}\n />\n )}\n </MessageContainer>\n );\n};\n"]}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React, { ReactNode } from 'react';
|
|
2
|
-
export declare class ToolCallErrorBoundary extends React.Component<{
|
|
3
|
-
children: ReactNode;
|
|
4
|
-
onError?: () => void;
|
|
5
|
-
}, {
|
|
6
|
-
hasError: boolean;
|
|
7
|
-
error?: Error;
|
|
8
|
-
}> {
|
|
9
|
-
constructor(props: {
|
|
10
|
-
children: ReactNode;
|
|
11
|
-
onError?: () => void;
|
|
12
|
-
});
|
|
13
|
-
static getDerivedStateFromError(): {
|
|
14
|
-
hasError: boolean;
|
|
15
|
-
};
|
|
16
|
-
componentDidCatch(error: Error): void;
|
|
17
|
-
render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=ToolResultErrorBoundary.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolResultErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/components/tools/ToolResultErrorBoundary.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAEvC,qBAAa,qBAAsB,SAAQ,KAAK,CAAC,SAAS,CACxD;IAAC,QAAQ,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAC,EAC3C;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAC,CACnC;gBACa,KAAK,EAAE;QAAC,QAAQ,EAAE,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;KAAC;IAK9D,MAAM,CAAC,wBAAwB;;;IAI/B,iBAAiB,CAAC,KAAK,EAAE,KAAK;IAM9B,MAAM;CAOP"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { ToolErrorMessage } from './ToolErrorMessage';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
export class ToolCallErrorBoundary extends React.Component {
|
|
5
|
-
constructor(props) {
|
|
6
|
-
super(props);
|
|
7
|
-
this.state = { hasError: false };
|
|
8
|
-
}
|
|
9
|
-
static getDerivedStateFromError() {
|
|
10
|
-
return { hasError: true };
|
|
11
|
-
}
|
|
12
|
-
componentDidCatch(error) {
|
|
13
|
-
console.error('Tool call component error:', error);
|
|
14
|
-
this.setState({ error });
|
|
15
|
-
this.props.onError?.();
|
|
16
|
-
}
|
|
17
|
-
render() {
|
|
18
|
-
if (this.state.hasError) {
|
|
19
|
-
return _jsx(ToolErrorMessage, { error: this.state.error });
|
|
20
|
-
}
|
|
21
|
-
return this.props.children;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=ToolResultErrorBoundary.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolResultErrorBoundary.js","sourceRoot":"","sources":["../../../src/components/tools/ToolResultErrorBoundary.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,MAAM,OAAO,qBAAsB,SAAQ,KAAK,CAAC,SAGhD;IACC,YAAY,KAAkD;QAC5D,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,EAAC,QAAQ,EAAE,KAAK,EAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,wBAAwB;QAC7B,OAAO,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;IAC1B,CAAC;IAED,iBAAiB,CAAC,KAAY;QAC5B,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,OAAO,KAAC,gBAAgB,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAI,CAAC;QACvD,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF","sourcesContent":["import {ToolErrorMessage} from './ToolErrorMessage';\nimport React, {ReactNode} from 'react';\n\nexport class ToolCallErrorBoundary extends React.Component<\n {children: ReactNode; onError?: () => void},\n {hasError: boolean; error?: Error}\n> {\n constructor(props: {children: ReactNode; onError?: () => void}) {\n super(props);\n this.state = {hasError: false};\n }\n\n static getDerivedStateFromError() {\n return {hasError: true};\n }\n\n componentDidCatch(error: Error) {\n console.error('Tool call component error:', error);\n this.setState({error});\n this.props.onError?.();\n }\n\n render() {\n if (this.state.hasError) {\n return <ToolErrorMessage error={this.state.error} />;\n }\n\n return this.props.children;\n }\n}\n"]}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { type RefObject } from 'react';
|
|
2
|
-
interface ScrollToBottomResult<T extends HTMLElement | null> {
|
|
3
|
-
showScrollButton: boolean;
|
|
4
|
-
scrollToBottom: () => void;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* A React hook that provides automatic scrolling behavior for containers with dynamic content.
|
|
8
|
-
*
|
|
9
|
-
* This hook helps manage scroll behavior in containers where content is being added dynamically,
|
|
10
|
-
* such as chat interfaces or logs. It automatically scrolls to the bottom when new content is added
|
|
11
|
-
* if the user was already at the bottom, and provides a function to manually scroll to the bottom.
|
|
12
|
-
*
|
|
13
|
-
* @template T - The type of HTMLElement for the container and end references
|
|
14
|
-
*
|
|
15
|
-
* @param options - Configuration options
|
|
16
|
-
* @param options.dataToObserve - The data to observe for changes (messages, items, etc.)
|
|
17
|
-
* @param options.containerRef - Reference to the scrollable container element
|
|
18
|
-
* @param options.endRef - Reference to an element at the end of the content
|
|
19
|
-
* @param options.scrollOnInitialLoad - Whether to scroll to bottom on initial load (default: true)
|
|
20
|
-
*
|
|
21
|
-
* @returns An object containing:
|
|
22
|
-
* - showScrollButton: Boolean indicating if the "scroll to bottom" button should be shown
|
|
23
|
-
* - scrollToBottom: Function to programmatically scroll to the bottom
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```tsx
|
|
27
|
-
* import { useRef } from 'react';
|
|
28
|
-
* import { useScrollToBottom } from './use-scroll-to-bottom';
|
|
29
|
-
*
|
|
30
|
-
* function ChatContainer({ messages }) {
|
|
31
|
-
* const containerRef = useRef<HTMLDivElement>(null);
|
|
32
|
-
* const endRef = useRef<HTMLDivElement>(null);
|
|
33
|
-
*
|
|
34
|
-
* const { showScrollButton, scrollToBottom } = useScrollToBottom({
|
|
35
|
-
* dataToObserve: messages,
|
|
36
|
-
* containerRef,
|
|
37
|
-
* endRef,
|
|
38
|
-
* scrollOnInitialLoad: false // Disable scrolling on initial load
|
|
39
|
-
* });
|
|
40
|
-
*
|
|
41
|
-
* return (
|
|
42
|
-
* <div className="relative h-[500px]">
|
|
43
|
-
* <div ref={containerRef} className="h-full overflow-y-auto p-4">
|
|
44
|
-
* {messages.map((message) => (
|
|
45
|
-
* <div key={message.id} className="mb-4">
|
|
46
|
-
* {message.text}
|
|
47
|
-
* </div>
|
|
48
|
-
* ))}
|
|
49
|
-
* <div ref={endRef} />
|
|
50
|
-
* </div>
|
|
51
|
-
*
|
|
52
|
-
* {showScrollButton && (
|
|
53
|
-
* <button
|
|
54
|
-
* onClick={scrollToBottom}
|
|
55
|
-
* className="absolute bottom-4 right-4 rounded-full bg-blue-500 p-2"
|
|
56
|
-
* >
|
|
57
|
-
* ↓
|
|
58
|
-
* </button>
|
|
59
|
-
* )}
|
|
60
|
-
* </div>
|
|
61
|
-
* );
|
|
62
|
-
* }
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
export declare function useScrollToBottom<T extends HTMLElement | null>({
|
|
66
|
-
/**
|
|
67
|
-
* The data to observe. Can be an array of items or a single item.
|
|
68
|
-
* When the data changes, the hook will scroll to the bottom of the container.
|
|
69
|
-
*/
|
|
70
|
-
dataToObserve, containerRef, endRef,
|
|
71
|
-
/**
|
|
72
|
-
* Whether to scroll to bottom on initial load.
|
|
73
|
-
* @default false
|
|
74
|
-
*/
|
|
75
|
-
scrollOnInitialLoad, }: {
|
|
76
|
-
dataToObserve: unknown;
|
|
77
|
-
containerRef: RefObject<T | null>;
|
|
78
|
-
endRef: RefObject<T | null>;
|
|
79
|
-
scrollOnInitialLoad?: boolean;
|
|
80
|
-
}): ScrollToBottomResult<T>;
|
|
81
|
-
export {};
|
|
82
|
-
//# sourceMappingURL=useScrollToBottom.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollToBottom.d.ts","sourceRoot":"","sources":["../../src/hooks/useScrollToBottom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,SAAS,EAAwB,MAAM,OAAO,CAAC;AAE/E,UAAU,oBAAoB,CAAC,CAAC,SAAS,WAAW,GAAG,IAAI;IACzD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,IAAI,EAAE;AAC9D;;;GAGG;AACH,aAAa,EACb,YAAY,EACZ,MAAM;AACN;;;GAGG;AACH,mBAA2B,GAC5B,EAAE;IACD,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAClC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG,oBAAoB,CAAC,CAAC,CAAC,CA+E1B"}
|