crca 1.4.0__py3-none-any.whl
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.
- .github/ISSUE_TEMPLATE/bug_report.md +65 -0
- .github/ISSUE_TEMPLATE/feature_request.md +41 -0
- .github/PULL_REQUEST_TEMPLATE.md +20 -0
- .github/workflows/publish-manual.yml +61 -0
- .github/workflows/publish.yml +64 -0
- .gitignore +214 -0
- CRCA.py +4156 -0
- LICENSE +201 -0
- MANIFEST.in +43 -0
- PKG-INFO +5035 -0
- README.md +4959 -0
- __init__.py +17 -0
- branches/CRCA-Q.py +2728 -0
- branches/crca_cg/corposwarm.py +9065 -0
- branches/crca_cg/fix_rancher_docker_creds.ps1 +155 -0
- branches/crca_cg/package.json +5 -0
- branches/crca_cg/test_bolt_integration.py +446 -0
- branches/crca_cg/test_corposwarm_comprehensive.py +773 -0
- branches/crca_cg/test_new_features.py +163 -0
- branches/crca_sd/__init__.py +149 -0
- branches/crca_sd/crca_sd_core.py +770 -0
- branches/crca_sd/crca_sd_governance.py +1325 -0
- branches/crca_sd/crca_sd_mpc.py +1130 -0
- branches/crca_sd/crca_sd_realtime.py +1844 -0
- branches/crca_sd/crca_sd_tui.py +1133 -0
- crca-1.4.0.dist-info/METADATA +5035 -0
- crca-1.4.0.dist-info/RECORD +501 -0
- crca-1.4.0.dist-info/WHEEL +4 -0
- crca-1.4.0.dist-info/licenses/LICENSE +201 -0
- docs/CRCA-Q.md +2333 -0
- examples/config.yaml.example +25 -0
- examples/crca_sd_example.py +513 -0
- examples/data_broker_example.py +294 -0
- examples/logistics_corporation.py +861 -0
- examples/palantir_example.py +299 -0
- examples/policy_bench.py +934 -0
- examples/pridnestrovia-sd.py +705 -0
- examples/pridnestrovia_realtime.py +1902 -0
- prompts/__init__.py +10 -0
- prompts/default_crca.py +101 -0
- pyproject.toml +151 -0
- requirements.txt +76 -0
- schemas/__init__.py +43 -0
- schemas/mcpSchemas.py +51 -0
- schemas/policy.py +458 -0
- templates/__init__.py +38 -0
- templates/base_specialized_agent.py +195 -0
- templates/drift_detection.py +325 -0
- templates/examples/causal_agent_template.py +309 -0
- templates/examples/drag_drop_example.py +213 -0
- templates/examples/logistics_agent_template.py +207 -0
- templates/examples/trading_agent_template.py +206 -0
- templates/feature_mixins.py +253 -0
- templates/graph_management.py +442 -0
- templates/llm_integration.py +194 -0
- templates/module_registry.py +276 -0
- templates/mpc_planner.py +280 -0
- templates/policy_loop.py +1168 -0
- templates/prediction_framework.py +448 -0
- templates/statistical_methods.py +778 -0
- tests/sanity.yml +31 -0
- tests/sanity_check +406 -0
- tests/test_core.py +47 -0
- tests/test_crca_excel.py +166 -0
- tests/test_crca_sd.py +780 -0
- tests/test_data_broker.py +424 -0
- tests/test_palantir.py +349 -0
- tools/__init__.py +38 -0
- tools/actuators.py +437 -0
- tools/bolt.diy/Dockerfile +103 -0
- tools/bolt.diy/app/components/@settings/core/AvatarDropdown.tsx +175 -0
- tools/bolt.diy/app/components/@settings/core/ControlPanel.tsx +345 -0
- tools/bolt.diy/app/components/@settings/core/constants.tsx +108 -0
- tools/bolt.diy/app/components/@settings/core/types.ts +114 -0
- tools/bolt.diy/app/components/@settings/index.ts +12 -0
- tools/bolt.diy/app/components/@settings/shared/components/TabTile.tsx +151 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/ConnectionForm.tsx +193 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/ConnectionTestIndicator.tsx +60 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/ErrorState.tsx +102 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/LoadingState.tsx +94 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/ServiceHeader.tsx +72 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/index.ts +6 -0
- tools/bolt.diy/app/components/@settings/tabs/data/DataTab.tsx +721 -0
- tools/bolt.diy/app/components/@settings/tabs/data/DataVisualization.tsx +384 -0
- tools/bolt.diy/app/components/@settings/tabs/event-logs/EventLogsTab.tsx +1013 -0
- tools/bolt.diy/app/components/@settings/tabs/features/FeaturesTab.tsx +295 -0
- tools/bolt.diy/app/components/@settings/tabs/github/GitHubTab.tsx +281 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubAuthDialog.tsx +173 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubCacheManager.tsx +367 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubConnection.tsx +233 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubErrorBoundary.tsx +105 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubProgressiveLoader.tsx +266 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubRepositoryCard.tsx +121 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubRepositorySelector.tsx +312 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubStats.tsx +291 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubUserProfile.tsx +46 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/shared/GitHubStateIndicators.tsx +264 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/shared/RepositoryCard.tsx +361 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/shared/index.ts +11 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/GitLabTab.tsx +305 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/GitLabAuthDialog.tsx +186 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/GitLabConnection.tsx +253 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/GitLabRepositorySelector.tsx +358 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/RepositoryCard.tsx +79 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/RepositoryList.tsx +142 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/StatsDisplay.tsx +91 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/index.ts +4 -0
- tools/bolt.diy/app/components/@settings/tabs/mcp/McpServerList.tsx +99 -0
- tools/bolt.diy/app/components/@settings/tabs/mcp/McpServerListItem.tsx +70 -0
- tools/bolt.diy/app/components/@settings/tabs/mcp/McpStatusBadge.tsx +37 -0
- tools/bolt.diy/app/components/@settings/tabs/mcp/McpTab.tsx +239 -0
- tools/bolt.diy/app/components/@settings/tabs/netlify/NetlifyTab.tsx +1393 -0
- tools/bolt.diy/app/components/@settings/tabs/netlify/components/NetlifyConnection.tsx +990 -0
- tools/bolt.diy/app/components/@settings/tabs/netlify/components/index.ts +1 -0
- tools/bolt.diy/app/components/@settings/tabs/notifications/NotificationsTab.tsx +300 -0
- tools/bolt.diy/app/components/@settings/tabs/profile/ProfileTab.tsx +181 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/cloud/CloudProvidersTab.tsx +308 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/ErrorBoundary.tsx +68 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/HealthStatusBadge.tsx +64 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/LoadingSkeleton.tsx +107 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/LocalProvidersTab.tsx +556 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/ModelCard.tsx +106 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/ProviderCard.tsx +120 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/SetupGuide.tsx +671 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/StatusDashboard.tsx +91 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/types.ts +44 -0
- tools/bolt.diy/app/components/@settings/tabs/settings/SettingsTab.tsx +215 -0
- tools/bolt.diy/app/components/@settings/tabs/supabase/SupabaseTab.tsx +1089 -0
- tools/bolt.diy/app/components/@settings/tabs/vercel/VercelTab.tsx +909 -0
- tools/bolt.diy/app/components/@settings/tabs/vercel/components/VercelConnection.tsx +368 -0
- tools/bolt.diy/app/components/@settings/tabs/vercel/components/index.ts +1 -0
- tools/bolt.diy/app/components/@settings/utils/tab-helpers.ts +54 -0
- tools/bolt.diy/app/components/chat/APIKeyManager.tsx +169 -0
- tools/bolt.diy/app/components/chat/Artifact.tsx +296 -0
- tools/bolt.diy/app/components/chat/AssistantMessage.tsx +192 -0
- tools/bolt.diy/app/components/chat/BaseChat.module.scss +47 -0
- tools/bolt.diy/app/components/chat/BaseChat.tsx +522 -0
- tools/bolt.diy/app/components/chat/Chat.client.tsx +670 -0
- tools/bolt.diy/app/components/chat/ChatAlert.tsx +108 -0
- tools/bolt.diy/app/components/chat/ChatBox.tsx +334 -0
- tools/bolt.diy/app/components/chat/CodeBlock.module.scss +10 -0
- tools/bolt.diy/app/components/chat/CodeBlock.tsx +85 -0
- tools/bolt.diy/app/components/chat/DicussMode.tsx +17 -0
- tools/bolt.diy/app/components/chat/ExamplePrompts.tsx +37 -0
- tools/bolt.diy/app/components/chat/FilePreview.tsx +38 -0
- tools/bolt.diy/app/components/chat/GitCloneButton.tsx +327 -0
- tools/bolt.diy/app/components/chat/ImportFolderButton.tsx +141 -0
- tools/bolt.diy/app/components/chat/LLMApiAlert.tsx +109 -0
- tools/bolt.diy/app/components/chat/MCPTools.tsx +129 -0
- tools/bolt.diy/app/components/chat/Markdown.module.scss +171 -0
- tools/bolt.diy/app/components/chat/Markdown.spec.ts +48 -0
- tools/bolt.diy/app/components/chat/Markdown.tsx +252 -0
- tools/bolt.diy/app/components/chat/Messages.client.tsx +102 -0
- tools/bolt.diy/app/components/chat/ModelSelector.tsx +797 -0
- tools/bolt.diy/app/components/chat/NetlifyDeploymentLink.client.tsx +51 -0
- tools/bolt.diy/app/components/chat/ProgressCompilation.tsx +110 -0
- tools/bolt.diy/app/components/chat/ScreenshotStateManager.tsx +33 -0
- tools/bolt.diy/app/components/chat/SendButton.client.tsx +39 -0
- tools/bolt.diy/app/components/chat/SpeechRecognition.tsx +28 -0
- tools/bolt.diy/app/components/chat/StarterTemplates.tsx +38 -0
- tools/bolt.diy/app/components/chat/SupabaseAlert.tsx +199 -0
- tools/bolt.diy/app/components/chat/SupabaseConnection.tsx +339 -0
- tools/bolt.diy/app/components/chat/ThoughtBox.tsx +43 -0
- tools/bolt.diy/app/components/chat/ToolInvocations.tsx +409 -0
- tools/bolt.diy/app/components/chat/UserMessage.tsx +101 -0
- tools/bolt.diy/app/components/chat/VercelDeploymentLink.client.tsx +158 -0
- tools/bolt.diy/app/components/chat/chatExportAndImport/ExportChatButton.tsx +49 -0
- tools/bolt.diy/app/components/chat/chatExportAndImport/ImportButtons.tsx +96 -0
- tools/bolt.diy/app/components/deploy/DeployAlert.tsx +197 -0
- tools/bolt.diy/app/components/deploy/DeployButton.tsx +277 -0
- tools/bolt.diy/app/components/deploy/GitHubDeploy.client.tsx +171 -0
- tools/bolt.diy/app/components/deploy/GitHubDeploymentDialog.tsx +1041 -0
- tools/bolt.diy/app/components/deploy/GitLabDeploy.client.tsx +171 -0
- tools/bolt.diy/app/components/deploy/GitLabDeploymentDialog.tsx +764 -0
- tools/bolt.diy/app/components/deploy/NetlifyDeploy.client.tsx +246 -0
- tools/bolt.diy/app/components/deploy/VercelDeploy.client.tsx +235 -0
- tools/bolt.diy/app/components/editor/codemirror/BinaryContent.tsx +7 -0
- tools/bolt.diy/app/components/editor/codemirror/CodeMirrorEditor.tsx +555 -0
- tools/bolt.diy/app/components/editor/codemirror/EnvMasking.ts +80 -0
- tools/bolt.diy/app/components/editor/codemirror/cm-theme.ts +192 -0
- tools/bolt.diy/app/components/editor/codemirror/indent.ts +68 -0
- tools/bolt.diy/app/components/editor/codemirror/languages.ts +112 -0
- tools/bolt.diy/app/components/git/GitUrlImport.client.tsx +147 -0
- tools/bolt.diy/app/components/header/Header.tsx +42 -0
- tools/bolt.diy/app/components/header/HeaderActionButtons.client.tsx +54 -0
- tools/bolt.diy/app/components/mandate/MandateSubmission.tsx +167 -0
- tools/bolt.diy/app/components/observability/DeploymentStatus.tsx +168 -0
- tools/bolt.diy/app/components/observability/EventTimeline.tsx +119 -0
- tools/bolt.diy/app/components/observability/FileDiffViewer.tsx +121 -0
- tools/bolt.diy/app/components/observability/GovernanceStatus.tsx +197 -0
- tools/bolt.diy/app/components/observability/GovernorMetrics.tsx +246 -0
- tools/bolt.diy/app/components/observability/LogStream.tsx +244 -0
- tools/bolt.diy/app/components/observability/MandateDetails.tsx +201 -0
- tools/bolt.diy/app/components/observability/ObservabilityDashboard.tsx +200 -0
- tools/bolt.diy/app/components/sidebar/HistoryItem.tsx +187 -0
- tools/bolt.diy/app/components/sidebar/Menu.client.tsx +536 -0
- tools/bolt.diy/app/components/sidebar/date-binning.ts +59 -0
- tools/bolt.diy/app/components/txt +1 -0
- tools/bolt.diy/app/components/ui/BackgroundRays/index.tsx +18 -0
- tools/bolt.diy/app/components/ui/BackgroundRays/styles.module.scss +246 -0
- tools/bolt.diy/app/components/ui/Badge.tsx +53 -0
- tools/bolt.diy/app/components/ui/BranchSelector.tsx +270 -0
- tools/bolt.diy/app/components/ui/Breadcrumbs.tsx +101 -0
- tools/bolt.diy/app/components/ui/Button.tsx +46 -0
- tools/bolt.diy/app/components/ui/Card.tsx +55 -0
- tools/bolt.diy/app/components/ui/Checkbox.tsx +32 -0
- tools/bolt.diy/app/components/ui/CloseButton.tsx +49 -0
- tools/bolt.diy/app/components/ui/CodeBlock.tsx +103 -0
- tools/bolt.diy/app/components/ui/Collapsible.tsx +9 -0
- tools/bolt.diy/app/components/ui/ColorSchemeDialog.tsx +378 -0
- tools/bolt.diy/app/components/ui/Dialog.tsx +449 -0
- tools/bolt.diy/app/components/ui/Dropdown.tsx +63 -0
- tools/bolt.diy/app/components/ui/EmptyState.tsx +154 -0
- tools/bolt.diy/app/components/ui/FileIcon.tsx +346 -0
- tools/bolt.diy/app/components/ui/FilterChip.tsx +92 -0
- tools/bolt.diy/app/components/ui/GlowingEffect.tsx +192 -0
- tools/bolt.diy/app/components/ui/GradientCard.tsx +100 -0
- tools/bolt.diy/app/components/ui/IconButton.tsx +84 -0
- tools/bolt.diy/app/components/ui/Input.tsx +22 -0
- tools/bolt.diy/app/components/ui/Label.tsx +20 -0
- tools/bolt.diy/app/components/ui/LoadingDots.tsx +27 -0
- tools/bolt.diy/app/components/ui/LoadingOverlay.tsx +32 -0
- tools/bolt.diy/app/components/ui/PanelHeader.tsx +20 -0
- tools/bolt.diy/app/components/ui/PanelHeaderButton.tsx +36 -0
- tools/bolt.diy/app/components/ui/Popover.tsx +29 -0
- tools/bolt.diy/app/components/ui/Progress.tsx +22 -0
- tools/bolt.diy/app/components/ui/RepositoryStats.tsx +87 -0
- tools/bolt.diy/app/components/ui/ScrollArea.tsx +41 -0
- tools/bolt.diy/app/components/ui/SearchInput.tsx +80 -0
- tools/bolt.diy/app/components/ui/SearchResultItem.tsx +134 -0
- tools/bolt.diy/app/components/ui/Separator.tsx +22 -0
- tools/bolt.diy/app/components/ui/SettingsButton.tsx +35 -0
- tools/bolt.diy/app/components/ui/Slider.tsx +73 -0
- tools/bolt.diy/app/components/ui/StatusIndicator.tsx +90 -0
- tools/bolt.diy/app/components/ui/Switch.tsx +37 -0
- tools/bolt.diy/app/components/ui/Tabs.tsx +52 -0
- tools/bolt.diy/app/components/ui/TabsWithSlider.tsx +112 -0
- tools/bolt.diy/app/components/ui/ThemeSwitch.tsx +29 -0
- tools/bolt.diy/app/components/ui/Tooltip.tsx +122 -0
- tools/bolt.diy/app/components/ui/index.ts +38 -0
- tools/bolt.diy/app/components/ui/use-toast.ts +66 -0
- tools/bolt.diy/app/components/workbench/DiffView.tsx +796 -0
- tools/bolt.diy/app/components/workbench/EditorPanel.tsx +174 -0
- tools/bolt.diy/app/components/workbench/ExpoQrModal.tsx +55 -0
- tools/bolt.diy/app/components/workbench/FileBreadcrumb.tsx +150 -0
- tools/bolt.diy/app/components/workbench/FileTree.tsx +565 -0
- tools/bolt.diy/app/components/workbench/Inspector.tsx +126 -0
- tools/bolt.diy/app/components/workbench/InspectorPanel.tsx +146 -0
- tools/bolt.diy/app/components/workbench/LockManager.tsx +262 -0
- tools/bolt.diy/app/components/workbench/PortDropdown.tsx +91 -0
- tools/bolt.diy/app/components/workbench/Preview.tsx +1049 -0
- tools/bolt.diy/app/components/workbench/ScreenshotSelector.tsx +293 -0
- tools/bolt.diy/app/components/workbench/Search.tsx +257 -0
- tools/bolt.diy/app/components/workbench/Workbench.client.tsx +506 -0
- tools/bolt.diy/app/components/workbench/terminal/Terminal.tsx +131 -0
- tools/bolt.diy/app/components/workbench/terminal/TerminalManager.tsx +68 -0
- tools/bolt.diy/app/components/workbench/terminal/TerminalTabs.tsx +277 -0
- tools/bolt.diy/app/components/workbench/terminal/theme.ts +36 -0
- tools/bolt.diy/app/components/workflow/WorkflowPhase.tsx +109 -0
- tools/bolt.diy/app/components/workflow/WorkflowStatus.tsx +60 -0
- tools/bolt.diy/app/components/workflow/WorkflowTimeline.tsx +150 -0
- tools/bolt.diy/app/entry.client.tsx +7 -0
- tools/bolt.diy/app/entry.server.tsx +80 -0
- tools/bolt.diy/app/root.tsx +156 -0
- tools/bolt.diy/app/routes/_index.tsx +175 -0
- tools/bolt.diy/app/routes/api.bug-report.ts +254 -0
- tools/bolt.diy/app/routes/api.chat.ts +463 -0
- tools/bolt.diy/app/routes/api.check-env-key.ts +41 -0
- tools/bolt.diy/app/routes/api.configured-providers.ts +110 -0
- tools/bolt.diy/app/routes/api.corporate-swarm-status.ts +55 -0
- tools/bolt.diy/app/routes/api.enhancer.ts +137 -0
- tools/bolt.diy/app/routes/api.export-api-keys.ts +44 -0
- tools/bolt.diy/app/routes/api.git-info.ts +69 -0
- tools/bolt.diy/app/routes/api.git-proxy.$.ts +178 -0
- tools/bolt.diy/app/routes/api.github-branches.ts +166 -0
- tools/bolt.diy/app/routes/api.github-deploy.ts +67 -0
- tools/bolt.diy/app/routes/api.github-stats.ts +198 -0
- tools/bolt.diy/app/routes/api.github-template.ts +242 -0
- tools/bolt.diy/app/routes/api.github-user.ts +287 -0
- tools/bolt.diy/app/routes/api.gitlab-branches.ts +143 -0
- tools/bolt.diy/app/routes/api.gitlab-deploy.ts +67 -0
- tools/bolt.diy/app/routes/api.gitlab-projects.ts +105 -0
- tools/bolt.diy/app/routes/api.health.ts +8 -0
- tools/bolt.diy/app/routes/api.llmcall.ts +298 -0
- tools/bolt.diy/app/routes/api.mandate.ts +351 -0
- tools/bolt.diy/app/routes/api.mcp-check.ts +16 -0
- tools/bolt.diy/app/routes/api.mcp-update-config.ts +23 -0
- tools/bolt.diy/app/routes/api.models.$provider.ts +2 -0
- tools/bolt.diy/app/routes/api.models.ts +90 -0
- tools/bolt.diy/app/routes/api.netlify-deploy.ts +240 -0
- tools/bolt.diy/app/routes/api.netlify-user.ts +142 -0
- tools/bolt.diy/app/routes/api.supabase-user.ts +199 -0
- tools/bolt.diy/app/routes/api.supabase.query.ts +92 -0
- tools/bolt.diy/app/routes/api.supabase.ts +56 -0
- tools/bolt.diy/app/routes/api.supabase.variables.ts +32 -0
- tools/bolt.diy/app/routes/api.system.diagnostics.ts +142 -0
- tools/bolt.diy/app/routes/api.system.disk-info.ts +311 -0
- tools/bolt.diy/app/routes/api.system.git-info.ts +332 -0
- tools/bolt.diy/app/routes/api.update.ts +21 -0
- tools/bolt.diy/app/routes/api.vercel-deploy.ts +497 -0
- tools/bolt.diy/app/routes/api.vercel-user.ts +161 -0
- tools/bolt.diy/app/routes/api.workflow-status.$proposalId.ts +309 -0
- tools/bolt.diy/app/routes/chat.$id.tsx +8 -0
- tools/bolt.diy/app/routes/execute.$mandateId.tsx +432 -0
- tools/bolt.diy/app/routes/git.tsx +25 -0
- tools/bolt.diy/app/routes/observability.$mandateId.tsx +50 -0
- tools/bolt.diy/app/routes/webcontainer.connect.$id.tsx +32 -0
- tools/bolt.diy/app/routes/webcontainer.preview.$id.tsx +97 -0
- tools/bolt.diy/app/routes/workflow.$proposalId.tsx +170 -0
- tools/bolt.diy/app/styles/animations.scss +49 -0
- tools/bolt.diy/app/styles/components/code.scss +9 -0
- tools/bolt.diy/app/styles/components/editor.scss +135 -0
- tools/bolt.diy/app/styles/components/resize-handle.scss +30 -0
- tools/bolt.diy/app/styles/components/terminal.scss +3 -0
- tools/bolt.diy/app/styles/components/toast.scss +23 -0
- tools/bolt.diy/app/styles/diff-view.css +72 -0
- tools/bolt.diy/app/styles/index.scss +73 -0
- tools/bolt.diy/app/styles/variables.scss +255 -0
- tools/bolt.diy/app/styles/z-index.scss +37 -0
- tools/bolt.diy/app/types/GitHub.ts +182 -0
- tools/bolt.diy/app/types/GitLab.ts +103 -0
- tools/bolt.diy/app/types/actions.ts +85 -0
- tools/bolt.diy/app/types/artifact.ts +5 -0
- tools/bolt.diy/app/types/context.ts +26 -0
- tools/bolt.diy/app/types/design-scheme.ts +93 -0
- tools/bolt.diy/app/types/global.d.ts +13 -0
- tools/bolt.diy/app/types/mandate.ts +333 -0
- tools/bolt.diy/app/types/model.ts +25 -0
- tools/bolt.diy/app/types/netlify.ts +94 -0
- tools/bolt.diy/app/types/supabase.ts +54 -0
- tools/bolt.diy/app/types/template.ts +8 -0
- tools/bolt.diy/app/types/terminal.ts +9 -0
- tools/bolt.diy/app/types/theme.ts +1 -0
- tools/bolt.diy/app/types/vercel.ts +67 -0
- tools/bolt.diy/app/utils/buffer.ts +29 -0
- tools/bolt.diy/app/utils/classNames.ts +65 -0
- tools/bolt.diy/app/utils/constants.ts +147 -0
- tools/bolt.diy/app/utils/debounce.ts +13 -0
- tools/bolt.diy/app/utils/debugLogger.ts +1284 -0
- tools/bolt.diy/app/utils/diff.spec.ts +11 -0
- tools/bolt.diy/app/utils/diff.ts +117 -0
- tools/bolt.diy/app/utils/easings.ts +3 -0
- tools/bolt.diy/app/utils/fileLocks.ts +96 -0
- tools/bolt.diy/app/utils/fileUtils.ts +121 -0
- tools/bolt.diy/app/utils/folderImport.ts +73 -0
- tools/bolt.diy/app/utils/formatSize.ts +12 -0
- tools/bolt.diy/app/utils/getLanguageFromExtension.ts +24 -0
- tools/bolt.diy/app/utils/githubStats.ts +9 -0
- tools/bolt.diy/app/utils/gitlabStats.ts +54 -0
- tools/bolt.diy/app/utils/logger.ts +162 -0
- tools/bolt.diy/app/utils/markdown.ts +155 -0
- tools/bolt.diy/app/utils/mobile.ts +4 -0
- tools/bolt.diy/app/utils/os.ts +4 -0
- tools/bolt.diy/app/utils/path.ts +19 -0
- tools/bolt.diy/app/utils/projectCommands.ts +197 -0
- tools/bolt.diy/app/utils/promises.ts +19 -0
- tools/bolt.diy/app/utils/react.ts +6 -0
- tools/bolt.diy/app/utils/sampler.ts +49 -0
- tools/bolt.diy/app/utils/selectStarterTemplate.ts +255 -0
- tools/bolt.diy/app/utils/shell.ts +384 -0
- tools/bolt.diy/app/utils/stacktrace.ts +27 -0
- tools/bolt.diy/app/utils/stripIndent.ts +23 -0
- tools/bolt.diy/app/utils/terminal.ts +11 -0
- tools/bolt.diy/app/utils/unreachable.ts +3 -0
- tools/bolt.diy/app/vite-env.d.ts +2 -0
- tools/bolt.diy/assets/entitlements.mac.plist +25 -0
- tools/bolt.diy/assets/icons/icon.icns +0 -0
- tools/bolt.diy/assets/icons/icon.ico +0 -0
- tools/bolt.diy/assets/icons/icon.png +0 -0
- tools/bolt.diy/bindings.js +78 -0
- tools/bolt.diy/bindings.sh +33 -0
- tools/bolt.diy/docker-compose.yaml +145 -0
- tools/bolt.diy/electron/main/index.ts +201 -0
- tools/bolt.diy/electron/main/tsconfig.json +30 -0
- tools/bolt.diy/electron/main/ui/menu.ts +29 -0
- tools/bolt.diy/electron/main/ui/window.ts +54 -0
- tools/bolt.diy/electron/main/utils/auto-update.ts +110 -0
- tools/bolt.diy/electron/main/utils/constants.ts +4 -0
- tools/bolt.diy/electron/main/utils/cookie.ts +40 -0
- tools/bolt.diy/electron/main/utils/reload.ts +35 -0
- tools/bolt.diy/electron/main/utils/serve.ts +71 -0
- tools/bolt.diy/electron/main/utils/store.ts +3 -0
- tools/bolt.diy/electron/main/utils/vite-server.ts +44 -0
- tools/bolt.diy/electron/main/vite.config.ts +44 -0
- tools/bolt.diy/electron/preload/index.ts +22 -0
- tools/bolt.diy/electron/preload/tsconfig.json +7 -0
- tools/bolt.diy/electron/preload/vite.config.ts +31 -0
- tools/bolt.diy/electron-builder.yml +64 -0
- tools/bolt.diy/electron-update.yml +4 -0
- tools/bolt.diy/eslint.config.mjs +57 -0
- tools/bolt.diy/functions/[[path]].ts +12 -0
- tools/bolt.diy/icons/angular.svg +1 -0
- tools/bolt.diy/icons/astro.svg +8 -0
- tools/bolt.diy/icons/chat.svg +1 -0
- tools/bolt.diy/icons/expo-brand.svg +1 -0
- tools/bolt.diy/icons/expo.svg +4 -0
- tools/bolt.diy/icons/logo-text.svg +1 -0
- tools/bolt.diy/icons/logo.svg +4 -0
- tools/bolt.diy/icons/mcp.svg +1 -0
- tools/bolt.diy/icons/nativescript.svg +1 -0
- tools/bolt.diy/icons/netlify.svg +10 -0
- tools/bolt.diy/icons/nextjs.svg +1 -0
- tools/bolt.diy/icons/nuxt.svg +1 -0
- tools/bolt.diy/icons/qwik.svg +1 -0
- tools/bolt.diy/icons/react.svg +1 -0
- tools/bolt.diy/icons/remix.svg +24 -0
- tools/bolt.diy/icons/remotion.svg +1 -0
- tools/bolt.diy/icons/shadcn.svg +21 -0
- tools/bolt.diy/icons/slidev.svg +60 -0
- tools/bolt.diy/icons/solidjs.svg +1 -0
- tools/bolt.diy/icons/stars.svg +1 -0
- tools/bolt.diy/icons/svelte.svg +1 -0
- tools/bolt.diy/icons/typescript.svg +1 -0
- tools/bolt.diy/icons/vite.svg +1 -0
- tools/bolt.diy/icons/vue.svg +1 -0
- tools/bolt.diy/load-context.ts +9 -0
- tools/bolt.diy/notarize.cjs +31 -0
- tools/bolt.diy/package.json +218 -0
- tools/bolt.diy/playwright.config.preview.ts +35 -0
- tools/bolt.diy/pre-start.cjs +26 -0
- tools/bolt.diy/public/apple-touch-icon-precomposed.png +0 -0
- tools/bolt.diy/public/apple-touch-icon.png +0 -0
- tools/bolt.diy/public/favicon.ico +0 -0
- tools/bolt.diy/public/favicon.svg +4 -0
- tools/bolt.diy/public/icons/AmazonBedrock.svg +1 -0
- tools/bolt.diy/public/icons/Anthropic.svg +4 -0
- tools/bolt.diy/public/icons/Cohere.svg +4 -0
- tools/bolt.diy/public/icons/Deepseek.svg +5 -0
- tools/bolt.diy/public/icons/Default.svg +4 -0
- tools/bolt.diy/public/icons/Google.svg +4 -0
- tools/bolt.diy/public/icons/Groq.svg +4 -0
- tools/bolt.diy/public/icons/HuggingFace.svg +4 -0
- tools/bolt.diy/public/icons/Hyperbolic.svg +3 -0
- tools/bolt.diy/public/icons/LMStudio.svg +5 -0
- tools/bolt.diy/public/icons/Mistral.svg +4 -0
- tools/bolt.diy/public/icons/Ollama.svg +4 -0
- tools/bolt.diy/public/icons/OpenAI.svg +4 -0
- tools/bolt.diy/public/icons/OpenAILike.svg +4 -0
- tools/bolt.diy/public/icons/OpenRouter.svg +4 -0
- tools/bolt.diy/public/icons/Perplexity.svg +4 -0
- tools/bolt.diy/public/icons/Together.svg +4 -0
- tools/bolt.diy/public/icons/xAI.svg +5 -0
- tools/bolt.diy/public/inspector-script.js +292 -0
- tools/bolt.diy/public/logo-dark-styled.png +0 -0
- tools/bolt.diy/public/logo-dark.png +0 -0
- tools/bolt.diy/public/logo-light-styled.png +0 -0
- tools/bolt.diy/public/logo-light.png +0 -0
- tools/bolt.diy/public/logo.svg +15 -0
- tools/bolt.diy/public/social_preview_index.jpg +0 -0
- tools/bolt.diy/scripts/clean.js +45 -0
- tools/bolt.diy/scripts/electron-dev.mjs +181 -0
- tools/bolt.diy/scripts/setup-env.sh +41 -0
- tools/bolt.diy/scripts/update-imports.sh +7 -0
- tools/bolt.diy/scripts/update.sh +52 -0
- tools/bolt.diy/services/execution-governor/Dockerfile +41 -0
- tools/bolt.diy/services/execution-governor/config.ts +42 -0
- tools/bolt.diy/services/execution-governor/index.ts +683 -0
- tools/bolt.diy/services/execution-governor/metrics.ts +141 -0
- tools/bolt.diy/services/execution-governor/package.json +31 -0
- tools/bolt.diy/services/execution-governor/priority-queue.ts +139 -0
- tools/bolt.diy/services/execution-governor/tsconfig.json +21 -0
- tools/bolt.diy/services/execution-governor/types.ts +145 -0
- tools/bolt.diy/services/headless-executor/Dockerfile +43 -0
- tools/bolt.diy/services/headless-executor/executor.ts +210 -0
- tools/bolt.diy/services/headless-executor/index.ts +323 -0
- tools/bolt.diy/services/headless-executor/package.json +27 -0
- tools/bolt.diy/services/headless-executor/tsconfig.json +21 -0
- tools/bolt.diy/services/headless-executor/types.ts +38 -0
- tools/bolt.diy/test-workflows.sh +240 -0
- tools/bolt.diy/tests/integration/corporate-swarm.test.ts +208 -0
- tools/bolt.diy/tests/mandates/budget-limited.json +34 -0
- tools/bolt.diy/tests/mandates/complex.json +53 -0
- tools/bolt.diy/tests/mandates/constraint-enforced.json +36 -0
- tools/bolt.diy/tests/mandates/simple.json +35 -0
- tools/bolt.diy/tsconfig.json +37 -0
- tools/bolt.diy/types/istextorbinary.d.ts +15 -0
- tools/bolt.diy/uno.config.ts +279 -0
- tools/bolt.diy/vite-electron.config.ts +76 -0
- tools/bolt.diy/vite.config.ts +112 -0
- tools/bolt.diy/worker-configuration.d.ts +22 -0
- tools/bolt.diy/wrangler.toml +6 -0
- tools/code_generator.py +461 -0
- tools/file_operations.py +465 -0
- tools/mandate_generator.py +337 -0
- tools/mcpClientUtils.py +1216 -0
- tools/sensors.py +285 -0
- utils/Agent_types.py +15 -0
- utils/AnyToStr.py +0 -0
- utils/HHCS.py +277 -0
- utils/__init__.py +30 -0
- utils/agent.py +3627 -0
- utils/aop.py +2948 -0
- utils/canonical.py +143 -0
- utils/conversation.py +1195 -0
- utils/doctrine_versioning +230 -0
- utils/formatter.py +474 -0
- utils/ledger.py +311 -0
- utils/out_types.py +16 -0
- utils/rollback.py +339 -0
- utils/router.py +929 -0
- utils/tui.py +1908 -0
|
@@ -0,0 +1,721 @@
|
|
|
1
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
import { Button } from '~/components/ui/Button';
|
|
3
|
+
import { ConfirmationDialog, SelectionDialog } from '~/components/ui/Dialog';
|
|
4
|
+
import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '~/components/ui/Card';
|
|
5
|
+
import { motion } from 'framer-motion';
|
|
6
|
+
import { useDataOperations } from '~/lib/hooks/useDataOperations';
|
|
7
|
+
import { openDatabase } from '~/lib/persistence/db';
|
|
8
|
+
import { getAllChats, type Chat } from '~/lib/persistence/chats';
|
|
9
|
+
import { DataVisualization } from './DataVisualization';
|
|
10
|
+
import { classNames } from '~/utils/classNames';
|
|
11
|
+
import { toast } from 'react-toastify';
|
|
12
|
+
|
|
13
|
+
// Create a custom hook to connect to the boltHistory database
|
|
14
|
+
function useBoltHistoryDB() {
|
|
15
|
+
const [db, setDb] = useState<IDBDatabase | null>(null);
|
|
16
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
17
|
+
const [error, setError] = useState<Error | null>(null);
|
|
18
|
+
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const initDB = async () => {
|
|
21
|
+
try {
|
|
22
|
+
setIsLoading(true);
|
|
23
|
+
|
|
24
|
+
const database = await openDatabase();
|
|
25
|
+
setDb(database || null);
|
|
26
|
+
setIsLoading(false);
|
|
27
|
+
} catch (err) {
|
|
28
|
+
setError(err instanceof Error ? err : new Error('Unknown error initializing database'));
|
|
29
|
+
setIsLoading(false);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
initDB();
|
|
34
|
+
|
|
35
|
+
return () => {
|
|
36
|
+
if (db) {
|
|
37
|
+
db.close();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}, []);
|
|
41
|
+
|
|
42
|
+
return { db, isLoading, error };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Extend the Chat interface to include the missing properties
|
|
46
|
+
interface ExtendedChat extends Chat {
|
|
47
|
+
title?: string;
|
|
48
|
+
updatedAt?: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Helper function to create a chat label and description
|
|
52
|
+
function createChatItem(chat: Chat): ChatItem {
|
|
53
|
+
return {
|
|
54
|
+
id: chat.id,
|
|
55
|
+
|
|
56
|
+
// Use description as title if available, or format a short ID
|
|
57
|
+
label: (chat as ExtendedChat).title || chat.description || `Chat ${chat.id.slice(0, 8)}`,
|
|
58
|
+
|
|
59
|
+
// Format the description with message count and timestamp
|
|
60
|
+
description: `${chat.messages.length} messages - Last updated: ${new Date((chat as ExtendedChat).updatedAt || Date.parse(chat.timestamp)).toLocaleString()}`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface SettingsCategory {
|
|
65
|
+
id: string;
|
|
66
|
+
label: string;
|
|
67
|
+
description: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
interface ChatItem {
|
|
71
|
+
id: string;
|
|
72
|
+
label: string;
|
|
73
|
+
description: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function DataTab() {
|
|
77
|
+
// Use our custom hook for the boltHistory database
|
|
78
|
+
const { db, isLoading: dbLoading } = useBoltHistoryDB();
|
|
79
|
+
const fileInputRef = useRef<HTMLInputElement>(null);
|
|
80
|
+
const apiKeyFileInputRef = useRef<HTMLInputElement>(null);
|
|
81
|
+
const chatFileInputRef = useRef<HTMLInputElement>(null);
|
|
82
|
+
|
|
83
|
+
// State for confirmation dialogs
|
|
84
|
+
const [showResetInlineConfirm, setShowResetInlineConfirm] = useState(false);
|
|
85
|
+
const [showDeleteInlineConfirm, setShowDeleteInlineConfirm] = useState(false);
|
|
86
|
+
const [showSettingsSelection, setShowSettingsSelection] = useState(false);
|
|
87
|
+
const [showChatsSelection, setShowChatsSelection] = useState(false);
|
|
88
|
+
|
|
89
|
+
// State for settings categories and available chats
|
|
90
|
+
const [settingsCategories] = useState<SettingsCategory[]>([
|
|
91
|
+
{ id: 'core', label: 'Core Settings', description: 'User profile and main settings' },
|
|
92
|
+
{ id: 'providers', label: 'Providers', description: 'API keys and provider configurations' },
|
|
93
|
+
{ id: 'features', label: 'Features', description: 'Feature flags and settings' },
|
|
94
|
+
{ id: 'ui', label: 'UI', description: 'UI configuration and preferences' },
|
|
95
|
+
{ id: 'connections', label: 'Connections', description: 'External service connections' },
|
|
96
|
+
{ id: 'debug', label: 'Debug', description: 'Debug settings and logs' },
|
|
97
|
+
{ id: 'updates', label: 'Updates', description: 'Update settings and notifications' },
|
|
98
|
+
]);
|
|
99
|
+
|
|
100
|
+
const [availableChats, setAvailableChats] = useState<ExtendedChat[]>([]);
|
|
101
|
+
const [chatItems, setChatItems] = useState<ChatItem[]>([]);
|
|
102
|
+
|
|
103
|
+
// Data operations hook with boltHistory database
|
|
104
|
+
const {
|
|
105
|
+
isExporting,
|
|
106
|
+
isImporting,
|
|
107
|
+
isResetting,
|
|
108
|
+
isDownloadingTemplate,
|
|
109
|
+
handleExportSettings,
|
|
110
|
+
handleExportSelectedSettings,
|
|
111
|
+
handleExportAllChats,
|
|
112
|
+
handleExportSelectedChats,
|
|
113
|
+
handleImportSettings,
|
|
114
|
+
handleImportChats,
|
|
115
|
+
handleResetSettings,
|
|
116
|
+
handleResetChats,
|
|
117
|
+
handleDownloadTemplate,
|
|
118
|
+
handleImportAPIKeys,
|
|
119
|
+
} = useDataOperations({
|
|
120
|
+
customDb: db || undefined, // Pass the boltHistory database, converting null to undefined
|
|
121
|
+
onReloadSettings: () => window.location.reload(),
|
|
122
|
+
onReloadChats: () => {
|
|
123
|
+
// Reload chats after reset
|
|
124
|
+
if (db) {
|
|
125
|
+
getAllChats(db).then((chats) => {
|
|
126
|
+
// Cast to ExtendedChat to handle additional properties
|
|
127
|
+
const extendedChats = chats as ExtendedChat[];
|
|
128
|
+
setAvailableChats(extendedChats);
|
|
129
|
+
setChatItems(extendedChats.map((chat) => createChatItem(chat)));
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
onResetSettings: () => setShowResetInlineConfirm(false),
|
|
134
|
+
onResetChats: () => setShowDeleteInlineConfirm(false),
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// Loading states for operations not provided by the hook
|
|
138
|
+
const [isDeleting, setIsDeleting] = useState(false);
|
|
139
|
+
const [isImportingKeys, setIsImportingKeys] = useState(false);
|
|
140
|
+
|
|
141
|
+
// Load available chats
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
if (db) {
|
|
144
|
+
console.log('Loading chats from boltHistory database', {
|
|
145
|
+
name: db.name,
|
|
146
|
+
version: db.version,
|
|
147
|
+
objectStoreNames: Array.from(db.objectStoreNames),
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
getAllChats(db)
|
|
151
|
+
.then((chats) => {
|
|
152
|
+
console.log('Found chats:', chats.length);
|
|
153
|
+
|
|
154
|
+
// Cast to ExtendedChat to handle additional properties
|
|
155
|
+
const extendedChats = chats as ExtendedChat[];
|
|
156
|
+
setAvailableChats(extendedChats);
|
|
157
|
+
|
|
158
|
+
// Create ChatItems for selection dialog
|
|
159
|
+
setChatItems(extendedChats.map((chat) => createChatItem(chat)));
|
|
160
|
+
})
|
|
161
|
+
.catch((error) => {
|
|
162
|
+
console.error('Error loading chats:', error);
|
|
163
|
+
toast.error('Failed to load chats: ' + (error instanceof Error ? error.message : 'Unknown error'));
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}, [db]);
|
|
167
|
+
|
|
168
|
+
// Handle file input changes
|
|
169
|
+
const handleFileInputChange = useCallback(
|
|
170
|
+
(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
171
|
+
const file = event.target.files?.[0];
|
|
172
|
+
|
|
173
|
+
if (file) {
|
|
174
|
+
handleImportSettings(file);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
[handleImportSettings],
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
const handleAPIKeyFileInputChange = useCallback(
|
|
181
|
+
(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
182
|
+
const file = event.target.files?.[0];
|
|
183
|
+
|
|
184
|
+
if (file) {
|
|
185
|
+
setIsImportingKeys(true);
|
|
186
|
+
handleImportAPIKeys(file).finally(() => setIsImportingKeys(false));
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
[handleImportAPIKeys],
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
const handleChatFileInputChange = useCallback(
|
|
193
|
+
(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
194
|
+
const file = event.target.files?.[0];
|
|
195
|
+
|
|
196
|
+
if (file) {
|
|
197
|
+
handleImportChats(file);
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
[handleImportChats],
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
// Wrapper for reset chats to handle loading state
|
|
204
|
+
const handleResetChatsWithState = useCallback(() => {
|
|
205
|
+
setIsDeleting(true);
|
|
206
|
+
handleResetChats().finally(() => setIsDeleting(false));
|
|
207
|
+
}, [handleResetChats]);
|
|
208
|
+
|
|
209
|
+
return (
|
|
210
|
+
<div className="space-y-12">
|
|
211
|
+
{/* Hidden file inputs */}
|
|
212
|
+
<input ref={fileInputRef} type="file" accept=".json" onChange={handleFileInputChange} className="hidden" />
|
|
213
|
+
<input
|
|
214
|
+
ref={apiKeyFileInputRef}
|
|
215
|
+
type="file"
|
|
216
|
+
accept=".json"
|
|
217
|
+
onChange={handleAPIKeyFileInputChange}
|
|
218
|
+
className="hidden"
|
|
219
|
+
/>
|
|
220
|
+
<input
|
|
221
|
+
ref={chatFileInputRef}
|
|
222
|
+
type="file"
|
|
223
|
+
accept=".json"
|
|
224
|
+
onChange={handleChatFileInputChange}
|
|
225
|
+
className="hidden"
|
|
226
|
+
/>
|
|
227
|
+
|
|
228
|
+
{/* Reset Settings Confirmation Dialog */}
|
|
229
|
+
<ConfirmationDialog
|
|
230
|
+
isOpen={showResetInlineConfirm}
|
|
231
|
+
onClose={() => setShowResetInlineConfirm(false)}
|
|
232
|
+
title="Reset All Settings?"
|
|
233
|
+
description="This will reset all your settings to their default values. This action cannot be undone."
|
|
234
|
+
confirmLabel="Reset Settings"
|
|
235
|
+
cancelLabel="Cancel"
|
|
236
|
+
variant="destructive"
|
|
237
|
+
isLoading={isResetting}
|
|
238
|
+
onConfirm={handleResetSettings}
|
|
239
|
+
/>
|
|
240
|
+
|
|
241
|
+
{/* Delete Chats Confirmation Dialog */}
|
|
242
|
+
<ConfirmationDialog
|
|
243
|
+
isOpen={showDeleteInlineConfirm}
|
|
244
|
+
onClose={() => setShowDeleteInlineConfirm(false)}
|
|
245
|
+
title="Delete All Chats?"
|
|
246
|
+
description="This will permanently delete all your chat history. This action cannot be undone."
|
|
247
|
+
confirmLabel="Delete All"
|
|
248
|
+
cancelLabel="Cancel"
|
|
249
|
+
variant="destructive"
|
|
250
|
+
isLoading={isDeleting}
|
|
251
|
+
onConfirm={handleResetChatsWithState}
|
|
252
|
+
/>
|
|
253
|
+
|
|
254
|
+
{/* Settings Selection Dialog */}
|
|
255
|
+
<SelectionDialog
|
|
256
|
+
isOpen={showSettingsSelection}
|
|
257
|
+
onClose={() => setShowSettingsSelection(false)}
|
|
258
|
+
title="Select Settings to Export"
|
|
259
|
+
items={settingsCategories}
|
|
260
|
+
onConfirm={(selectedIds) => {
|
|
261
|
+
handleExportSelectedSettings(selectedIds);
|
|
262
|
+
setShowSettingsSelection(false);
|
|
263
|
+
}}
|
|
264
|
+
confirmLabel="Export Selected"
|
|
265
|
+
/>
|
|
266
|
+
|
|
267
|
+
{/* Chats Selection Dialog */}
|
|
268
|
+
<SelectionDialog
|
|
269
|
+
isOpen={showChatsSelection}
|
|
270
|
+
onClose={() => setShowChatsSelection(false)}
|
|
271
|
+
title="Select Chats to Export"
|
|
272
|
+
items={chatItems}
|
|
273
|
+
onConfirm={(selectedIds) => {
|
|
274
|
+
handleExportSelectedChats(selectedIds);
|
|
275
|
+
setShowChatsSelection(false);
|
|
276
|
+
}}
|
|
277
|
+
confirmLabel="Export Selected"
|
|
278
|
+
/>
|
|
279
|
+
|
|
280
|
+
{/* Chats Section */}
|
|
281
|
+
<div>
|
|
282
|
+
<h2 className="text-xl font-semibold mb-4 text-bolt-elements-textPrimary">Chats</h2>
|
|
283
|
+
{dbLoading ? (
|
|
284
|
+
<div className="flex items-center justify-center p-4">
|
|
285
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-6 h-6 mr-2" />
|
|
286
|
+
<span>Loading chats database...</span>
|
|
287
|
+
</div>
|
|
288
|
+
) : (
|
|
289
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
290
|
+
<Card>
|
|
291
|
+
<CardHeader>
|
|
292
|
+
<div className="flex items-center mb-2">
|
|
293
|
+
<motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
|
|
294
|
+
<div className="i-ph-download-duotone w-5 h-5" />
|
|
295
|
+
</motion.div>
|
|
296
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
297
|
+
Export All Chats
|
|
298
|
+
</CardTitle>
|
|
299
|
+
</div>
|
|
300
|
+
<CardDescription>Export all your chats to a JSON file.</CardDescription>
|
|
301
|
+
</CardHeader>
|
|
302
|
+
<CardFooter>
|
|
303
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
304
|
+
<Button
|
|
305
|
+
onClick={async () => {
|
|
306
|
+
try {
|
|
307
|
+
if (!db) {
|
|
308
|
+
toast.error('Database not available');
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
console.log('Database information:', {
|
|
313
|
+
name: db.name,
|
|
314
|
+
version: db.version,
|
|
315
|
+
objectStoreNames: Array.from(db.objectStoreNames),
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
if (availableChats.length === 0) {
|
|
319
|
+
toast.warning('No chats available to export');
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
await handleExportAllChats();
|
|
324
|
+
} catch (error) {
|
|
325
|
+
console.error('Error exporting chats:', error);
|
|
326
|
+
toast.error(
|
|
327
|
+
`Failed to export chats: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
}}
|
|
331
|
+
disabled={isExporting || availableChats.length === 0}
|
|
332
|
+
variant="outline"
|
|
333
|
+
size="sm"
|
|
334
|
+
className={classNames(
|
|
335
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
336
|
+
isExporting || availableChats.length === 0 ? 'cursor-not-allowed' : '',
|
|
337
|
+
)}
|
|
338
|
+
>
|
|
339
|
+
{isExporting ? (
|
|
340
|
+
<>
|
|
341
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
342
|
+
Exporting...
|
|
343
|
+
</>
|
|
344
|
+
) : availableChats.length === 0 ? (
|
|
345
|
+
'No Chats to Export'
|
|
346
|
+
) : (
|
|
347
|
+
'Export All'
|
|
348
|
+
)}
|
|
349
|
+
</Button>
|
|
350
|
+
</motion.div>
|
|
351
|
+
</CardFooter>
|
|
352
|
+
</Card>
|
|
353
|
+
|
|
354
|
+
<Card>
|
|
355
|
+
<CardHeader>
|
|
356
|
+
<div className="flex items-center mb-2">
|
|
357
|
+
<motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
|
|
358
|
+
<div className="i-ph:list-checks w-5 h-5" />
|
|
359
|
+
</motion.div>
|
|
360
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
361
|
+
Export Selected Chats
|
|
362
|
+
</CardTitle>
|
|
363
|
+
</div>
|
|
364
|
+
<CardDescription>Choose specific chats to export.</CardDescription>
|
|
365
|
+
</CardHeader>
|
|
366
|
+
<CardFooter>
|
|
367
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
368
|
+
<Button
|
|
369
|
+
onClick={() => setShowChatsSelection(true)}
|
|
370
|
+
disabled={isExporting || chatItems.length === 0}
|
|
371
|
+
variant="outline"
|
|
372
|
+
size="sm"
|
|
373
|
+
className={classNames(
|
|
374
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
375
|
+
isExporting || chatItems.length === 0 ? 'cursor-not-allowed' : '',
|
|
376
|
+
)}
|
|
377
|
+
>
|
|
378
|
+
{isExporting ? (
|
|
379
|
+
<>
|
|
380
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
381
|
+
Exporting...
|
|
382
|
+
</>
|
|
383
|
+
) : (
|
|
384
|
+
'Select Chats'
|
|
385
|
+
)}
|
|
386
|
+
</Button>
|
|
387
|
+
</motion.div>
|
|
388
|
+
</CardFooter>
|
|
389
|
+
</Card>
|
|
390
|
+
|
|
391
|
+
<Card>
|
|
392
|
+
<CardHeader>
|
|
393
|
+
<div className="flex items-center mb-2">
|
|
394
|
+
<motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
|
|
395
|
+
<div className="i-ph-upload-duotone w-5 h-5" />
|
|
396
|
+
</motion.div>
|
|
397
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
398
|
+
Import Chats
|
|
399
|
+
</CardTitle>
|
|
400
|
+
</div>
|
|
401
|
+
<CardDescription>Import chats from a JSON file.</CardDescription>
|
|
402
|
+
</CardHeader>
|
|
403
|
+
<CardFooter>
|
|
404
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
405
|
+
<Button
|
|
406
|
+
onClick={() => chatFileInputRef.current?.click()}
|
|
407
|
+
disabled={isImporting}
|
|
408
|
+
variant="outline"
|
|
409
|
+
size="sm"
|
|
410
|
+
className={classNames(
|
|
411
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
412
|
+
isImporting ? 'cursor-not-allowed' : '',
|
|
413
|
+
)}
|
|
414
|
+
>
|
|
415
|
+
{isImporting ? (
|
|
416
|
+
<>
|
|
417
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
418
|
+
Importing...
|
|
419
|
+
</>
|
|
420
|
+
) : (
|
|
421
|
+
'Import Chats'
|
|
422
|
+
)}
|
|
423
|
+
</Button>
|
|
424
|
+
</motion.div>
|
|
425
|
+
</CardFooter>
|
|
426
|
+
</Card>
|
|
427
|
+
|
|
428
|
+
<Card>
|
|
429
|
+
<CardHeader>
|
|
430
|
+
<div className="flex items-center mb-2">
|
|
431
|
+
<motion.div
|
|
432
|
+
className="text-red-500 dark:text-red-400 mr-2"
|
|
433
|
+
whileHover={{ scale: 1.1 }}
|
|
434
|
+
whileTap={{ scale: 0.9 }}
|
|
435
|
+
>
|
|
436
|
+
<div className="i-ph-trash-duotone w-5 h-5" />
|
|
437
|
+
</motion.div>
|
|
438
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
439
|
+
Delete All Chats
|
|
440
|
+
</CardTitle>
|
|
441
|
+
</div>
|
|
442
|
+
<CardDescription>Delete all your chat history.</CardDescription>
|
|
443
|
+
</CardHeader>
|
|
444
|
+
<CardFooter>
|
|
445
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
446
|
+
<Button
|
|
447
|
+
onClick={() => setShowDeleteInlineConfirm(true)}
|
|
448
|
+
disabled={isDeleting || chatItems.length === 0}
|
|
449
|
+
variant="outline"
|
|
450
|
+
size="sm"
|
|
451
|
+
className={classNames(
|
|
452
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
453
|
+
isDeleting || chatItems.length === 0 ? 'cursor-not-allowed' : '',
|
|
454
|
+
)}
|
|
455
|
+
>
|
|
456
|
+
{isDeleting ? (
|
|
457
|
+
<>
|
|
458
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
459
|
+
Deleting...
|
|
460
|
+
</>
|
|
461
|
+
) : (
|
|
462
|
+
'Delete All'
|
|
463
|
+
)}
|
|
464
|
+
</Button>
|
|
465
|
+
</motion.div>
|
|
466
|
+
</CardFooter>
|
|
467
|
+
</Card>
|
|
468
|
+
</div>
|
|
469
|
+
)}
|
|
470
|
+
</div>
|
|
471
|
+
|
|
472
|
+
{/* Settings Section */}
|
|
473
|
+
<div>
|
|
474
|
+
<h2 className="text-xl font-semibold mb-4 text-bolt-elements-textPrimary">Settings</h2>
|
|
475
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
476
|
+
<Card>
|
|
477
|
+
<CardHeader>
|
|
478
|
+
<div className="flex items-center mb-2">
|
|
479
|
+
<motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
|
|
480
|
+
<div className="i-ph-download-duotone w-5 h-5" />
|
|
481
|
+
</motion.div>
|
|
482
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
483
|
+
Export All Settings
|
|
484
|
+
</CardTitle>
|
|
485
|
+
</div>
|
|
486
|
+
<CardDescription>Export all your settings to a JSON file.</CardDescription>
|
|
487
|
+
</CardHeader>
|
|
488
|
+
<CardFooter>
|
|
489
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
490
|
+
<Button
|
|
491
|
+
onClick={handleExportSettings}
|
|
492
|
+
disabled={isExporting}
|
|
493
|
+
variant="outline"
|
|
494
|
+
size="sm"
|
|
495
|
+
className={classNames(
|
|
496
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
497
|
+
isExporting ? 'cursor-not-allowed' : '',
|
|
498
|
+
)}
|
|
499
|
+
>
|
|
500
|
+
{isExporting ? (
|
|
501
|
+
<>
|
|
502
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
503
|
+
Exporting...
|
|
504
|
+
</>
|
|
505
|
+
) : (
|
|
506
|
+
'Export All'
|
|
507
|
+
)}
|
|
508
|
+
</Button>
|
|
509
|
+
</motion.div>
|
|
510
|
+
</CardFooter>
|
|
511
|
+
</Card>
|
|
512
|
+
|
|
513
|
+
<Card>
|
|
514
|
+
<CardHeader>
|
|
515
|
+
<div className="flex items-center mb-2">
|
|
516
|
+
<motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
|
|
517
|
+
<div className="i-ph-filter-duotone w-5 h-5" />
|
|
518
|
+
</motion.div>
|
|
519
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
520
|
+
Export Selected Settings
|
|
521
|
+
</CardTitle>
|
|
522
|
+
</div>
|
|
523
|
+
<CardDescription>Choose specific settings to export.</CardDescription>
|
|
524
|
+
</CardHeader>
|
|
525
|
+
<CardFooter>
|
|
526
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
527
|
+
<Button
|
|
528
|
+
onClick={() => setShowSettingsSelection(true)}
|
|
529
|
+
disabled={isExporting || settingsCategories.length === 0}
|
|
530
|
+
variant="outline"
|
|
531
|
+
size="sm"
|
|
532
|
+
className={classNames(
|
|
533
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
534
|
+
isExporting || settingsCategories.length === 0 ? 'cursor-not-allowed' : '',
|
|
535
|
+
)}
|
|
536
|
+
>
|
|
537
|
+
{isExporting ? (
|
|
538
|
+
<>
|
|
539
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
540
|
+
Exporting...
|
|
541
|
+
</>
|
|
542
|
+
) : (
|
|
543
|
+
'Select Settings'
|
|
544
|
+
)}
|
|
545
|
+
</Button>
|
|
546
|
+
</motion.div>
|
|
547
|
+
</CardFooter>
|
|
548
|
+
</Card>
|
|
549
|
+
|
|
550
|
+
<Card>
|
|
551
|
+
<CardHeader>
|
|
552
|
+
<div className="flex items-center mb-2">
|
|
553
|
+
<motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
|
|
554
|
+
<div className="i-ph-upload-duotone w-5 h-5" />
|
|
555
|
+
</motion.div>
|
|
556
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
557
|
+
Import Settings
|
|
558
|
+
</CardTitle>
|
|
559
|
+
</div>
|
|
560
|
+
<CardDescription>Import settings from a JSON file.</CardDescription>
|
|
561
|
+
</CardHeader>
|
|
562
|
+
<CardFooter>
|
|
563
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
564
|
+
<Button
|
|
565
|
+
onClick={() => fileInputRef.current?.click()}
|
|
566
|
+
disabled={isImporting}
|
|
567
|
+
variant="outline"
|
|
568
|
+
size="sm"
|
|
569
|
+
className={classNames(
|
|
570
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
571
|
+
isImporting ? 'cursor-not-allowed' : '',
|
|
572
|
+
)}
|
|
573
|
+
>
|
|
574
|
+
{isImporting ? (
|
|
575
|
+
<>
|
|
576
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
577
|
+
Importing...
|
|
578
|
+
</>
|
|
579
|
+
) : (
|
|
580
|
+
'Import Settings'
|
|
581
|
+
)}
|
|
582
|
+
</Button>
|
|
583
|
+
</motion.div>
|
|
584
|
+
</CardFooter>
|
|
585
|
+
</Card>
|
|
586
|
+
|
|
587
|
+
<Card>
|
|
588
|
+
<CardHeader>
|
|
589
|
+
<div className="flex items-center mb-2">
|
|
590
|
+
<motion.div
|
|
591
|
+
className="text-red-500 dark:text-red-400 mr-2"
|
|
592
|
+
whileHover={{ scale: 1.1 }}
|
|
593
|
+
whileTap={{ scale: 0.9 }}
|
|
594
|
+
>
|
|
595
|
+
<div className="i-ph-arrow-counter-clockwise-duotone w-5 h-5" />
|
|
596
|
+
</motion.div>
|
|
597
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
598
|
+
Reset All Settings
|
|
599
|
+
</CardTitle>
|
|
600
|
+
</div>
|
|
601
|
+
<CardDescription>Reset all settings to their default values.</CardDescription>
|
|
602
|
+
</CardHeader>
|
|
603
|
+
<CardFooter>
|
|
604
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
605
|
+
<Button
|
|
606
|
+
onClick={() => setShowResetInlineConfirm(true)}
|
|
607
|
+
disabled={isResetting}
|
|
608
|
+
variant="outline"
|
|
609
|
+
size="sm"
|
|
610
|
+
className={classNames(
|
|
611
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
612
|
+
isResetting ? 'cursor-not-allowed' : '',
|
|
613
|
+
)}
|
|
614
|
+
>
|
|
615
|
+
{isResetting ? (
|
|
616
|
+
<>
|
|
617
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
618
|
+
Resetting...
|
|
619
|
+
</>
|
|
620
|
+
) : (
|
|
621
|
+
'Reset All'
|
|
622
|
+
)}
|
|
623
|
+
</Button>
|
|
624
|
+
</motion.div>
|
|
625
|
+
</CardFooter>
|
|
626
|
+
</Card>
|
|
627
|
+
</div>
|
|
628
|
+
</div>
|
|
629
|
+
|
|
630
|
+
{/* API Keys Section */}
|
|
631
|
+
<div>
|
|
632
|
+
<h2 className="text-xl font-semibold mb-4 text-bolt-elements-textPrimary">API Keys</h2>
|
|
633
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
634
|
+
<Card>
|
|
635
|
+
<CardHeader>
|
|
636
|
+
<div className="flex items-center mb-2">
|
|
637
|
+
<motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
|
|
638
|
+
<div className="i-ph-file-text-duotone w-5 h-5" />
|
|
639
|
+
</motion.div>
|
|
640
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
641
|
+
Download Template
|
|
642
|
+
</CardTitle>
|
|
643
|
+
</div>
|
|
644
|
+
<CardDescription>Download a template file for your API keys.</CardDescription>
|
|
645
|
+
</CardHeader>
|
|
646
|
+
<CardFooter>
|
|
647
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
648
|
+
<Button
|
|
649
|
+
onClick={handleDownloadTemplate}
|
|
650
|
+
disabled={isDownloadingTemplate}
|
|
651
|
+
variant="outline"
|
|
652
|
+
size="sm"
|
|
653
|
+
className={classNames(
|
|
654
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
655
|
+
isDownloadingTemplate ? 'cursor-not-allowed' : '',
|
|
656
|
+
)}
|
|
657
|
+
>
|
|
658
|
+
{isDownloadingTemplate ? (
|
|
659
|
+
<>
|
|
660
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
661
|
+
Downloading...
|
|
662
|
+
</>
|
|
663
|
+
) : (
|
|
664
|
+
'Download'
|
|
665
|
+
)}
|
|
666
|
+
</Button>
|
|
667
|
+
</motion.div>
|
|
668
|
+
</CardFooter>
|
|
669
|
+
</Card>
|
|
670
|
+
|
|
671
|
+
<Card>
|
|
672
|
+
<CardHeader>
|
|
673
|
+
<div className="flex items-center mb-2">
|
|
674
|
+
<motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
|
|
675
|
+
<div className="i-ph-upload-duotone w-5 h-5" />
|
|
676
|
+
</motion.div>
|
|
677
|
+
<CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
|
|
678
|
+
Import API Keys
|
|
679
|
+
</CardTitle>
|
|
680
|
+
</div>
|
|
681
|
+
<CardDescription>Import API keys from a JSON file.</CardDescription>
|
|
682
|
+
</CardHeader>
|
|
683
|
+
<CardFooter>
|
|
684
|
+
<motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
|
|
685
|
+
<Button
|
|
686
|
+
onClick={() => apiKeyFileInputRef.current?.click()}
|
|
687
|
+
disabled={isImportingKeys}
|
|
688
|
+
variant="outline"
|
|
689
|
+
size="sm"
|
|
690
|
+
className={classNames(
|
|
691
|
+
'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
|
|
692
|
+
isImportingKeys ? 'cursor-not-allowed' : '',
|
|
693
|
+
)}
|
|
694
|
+
>
|
|
695
|
+
{isImportingKeys ? (
|
|
696
|
+
<>
|
|
697
|
+
<div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
|
|
698
|
+
Importing...
|
|
699
|
+
</>
|
|
700
|
+
) : (
|
|
701
|
+
'Import Keys'
|
|
702
|
+
)}
|
|
703
|
+
</Button>
|
|
704
|
+
</motion.div>
|
|
705
|
+
</CardFooter>
|
|
706
|
+
</Card>
|
|
707
|
+
</div>
|
|
708
|
+
</div>
|
|
709
|
+
|
|
710
|
+
{/* Data Visualization */}
|
|
711
|
+
<div>
|
|
712
|
+
<h2 className="text-xl font-semibold mb-4 text-bolt-elements-textPrimary">Data Usage</h2>
|
|
713
|
+
<Card>
|
|
714
|
+
<CardContent className="p-5">
|
|
715
|
+
<DataVisualization chats={availableChats} />
|
|
716
|
+
</CardContent>
|
|
717
|
+
</Card>
|
|
718
|
+
</div>
|
|
719
|
+
</div>
|
|
720
|
+
);
|
|
721
|
+
}
|