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,536 @@
|
|
|
1
|
+
import { motion, type Variants } from 'framer-motion';
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { toast } from 'react-toastify';
|
|
4
|
+
import { Dialog, DialogButton, DialogDescription, DialogRoot, DialogTitle } from '~/components/ui/Dialog';
|
|
5
|
+
import { ThemeSwitch } from '~/components/ui/ThemeSwitch';
|
|
6
|
+
// Settings UI removed: Configuration is environment-only for LLM-native execution
|
|
7
|
+
// import { ControlPanel } from '~/components/@settings/core/ControlPanel';
|
|
8
|
+
// import { SettingsButton, HelpButton } from '~/components/ui/SettingsButton';
|
|
9
|
+
import { Button } from '~/components/ui/Button';
|
|
10
|
+
import { db, deleteById, getAll, chatId, type ChatHistoryItem, useChatHistory } from '~/lib/persistence';
|
|
11
|
+
import { cubicEasingFn } from '~/utils/easings';
|
|
12
|
+
import { HistoryItem } from './HistoryItem';
|
|
13
|
+
import { binDates } from './date-binning';
|
|
14
|
+
import { useSearchFilter } from '~/lib/hooks/useSearchFilter';
|
|
15
|
+
import { classNames } from '~/utils/classNames';
|
|
16
|
+
import { useStore } from '@nanostores/react';
|
|
17
|
+
import { profileStore } from '~/lib/stores/profile';
|
|
18
|
+
|
|
19
|
+
const menuVariants = {
|
|
20
|
+
closed: {
|
|
21
|
+
opacity: 0,
|
|
22
|
+
visibility: 'hidden',
|
|
23
|
+
left: '-340px',
|
|
24
|
+
transition: {
|
|
25
|
+
duration: 0.2,
|
|
26
|
+
ease: cubicEasingFn,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
open: {
|
|
30
|
+
opacity: 1,
|
|
31
|
+
visibility: 'initial',
|
|
32
|
+
left: 0,
|
|
33
|
+
transition: {
|
|
34
|
+
duration: 0.2,
|
|
35
|
+
ease: cubicEasingFn,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
} satisfies Variants;
|
|
39
|
+
|
|
40
|
+
type DialogContent =
|
|
41
|
+
| { type: 'delete'; item: ChatHistoryItem }
|
|
42
|
+
| { type: 'bulkDelete'; items: ChatHistoryItem[] }
|
|
43
|
+
| null;
|
|
44
|
+
|
|
45
|
+
function CurrentDateTime() {
|
|
46
|
+
const [dateTime, setDateTime] = useState(new Date());
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const timer = setInterval(() => {
|
|
50
|
+
setDateTime(new Date());
|
|
51
|
+
}, 60000);
|
|
52
|
+
|
|
53
|
+
return () => clearInterval(timer);
|
|
54
|
+
}, []);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<div className="flex items-center gap-2 px-4 py-2 text-sm text-gray-600 dark:text-gray-400 border-b border-gray-100 dark:border-gray-800/50">
|
|
58
|
+
<div className="h-4 w-4 i-ph:clock opacity-80" />
|
|
59
|
+
<div className="flex gap-2">
|
|
60
|
+
<span>{dateTime.toLocaleDateString()}</span>
|
|
61
|
+
<span>{dateTime.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export const Menu = () => {
|
|
68
|
+
const { duplicateCurrentChat, exportChat } = useChatHistory();
|
|
69
|
+
const menuRef = useRef<HTMLDivElement>(null);
|
|
70
|
+
const [list, setList] = useState<ChatHistoryItem[]>([]);
|
|
71
|
+
const [open, setOpen] = useState(false);
|
|
72
|
+
const [dialogContent, setDialogContent] = useState<DialogContent>(null);
|
|
73
|
+
// Settings UI removed: Configuration is environment-only
|
|
74
|
+
// const [isSettingsOpen, setIsSettingsOpen] = useState(false);
|
|
75
|
+
const profile = useStore(profileStore);
|
|
76
|
+
const [selectionMode, setSelectionMode] = useState(false);
|
|
77
|
+
const [selectedItems, setSelectedItems] = useState<string[]>([]);
|
|
78
|
+
|
|
79
|
+
const { filteredItems: filteredList, handleSearchChange } = useSearchFilter({
|
|
80
|
+
items: list,
|
|
81
|
+
searchFields: ['description'],
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const loadEntries = useCallback(() => {
|
|
85
|
+
if (db) {
|
|
86
|
+
getAll(db)
|
|
87
|
+
.then((list) => list.filter((item) => item.urlId && item.description))
|
|
88
|
+
.then(setList)
|
|
89
|
+
.catch((error) => toast.error(error.message));
|
|
90
|
+
}
|
|
91
|
+
}, []);
|
|
92
|
+
|
|
93
|
+
const deleteChat = useCallback(
|
|
94
|
+
async (id: string): Promise<void> => {
|
|
95
|
+
if (!db) {
|
|
96
|
+
throw new Error('Database not available');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Delete chat snapshot from localStorage
|
|
100
|
+
try {
|
|
101
|
+
const snapshotKey = `snapshot:${id}`;
|
|
102
|
+
localStorage.removeItem(snapshotKey);
|
|
103
|
+
console.log('Removed snapshot for chat:', id);
|
|
104
|
+
} catch (snapshotError) {
|
|
105
|
+
console.error(`Error deleting snapshot for chat ${id}:`, snapshotError);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Delete the chat from the database
|
|
109
|
+
await deleteById(db, id);
|
|
110
|
+
console.log('Successfully deleted chat:', id);
|
|
111
|
+
},
|
|
112
|
+
[db],
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const deleteItem = useCallback(
|
|
116
|
+
(event: React.UIEvent, item: ChatHistoryItem) => {
|
|
117
|
+
event.preventDefault();
|
|
118
|
+
event.stopPropagation();
|
|
119
|
+
|
|
120
|
+
// Log the delete operation to help debugging
|
|
121
|
+
console.log('Attempting to delete chat:', { id: item.id, description: item.description });
|
|
122
|
+
|
|
123
|
+
deleteChat(item.id)
|
|
124
|
+
.then(() => {
|
|
125
|
+
toast.success('Chat deleted successfully', {
|
|
126
|
+
position: 'bottom-right',
|
|
127
|
+
autoClose: 3000,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Always refresh the list
|
|
131
|
+
loadEntries();
|
|
132
|
+
|
|
133
|
+
if (chatId.get() === item.id) {
|
|
134
|
+
// hard page navigation to clear the stores
|
|
135
|
+
console.log('Navigating away from deleted chat');
|
|
136
|
+
window.location.pathname = '/';
|
|
137
|
+
}
|
|
138
|
+
})
|
|
139
|
+
.catch((error) => {
|
|
140
|
+
console.error('Failed to delete chat:', error);
|
|
141
|
+
toast.error('Failed to delete conversation', {
|
|
142
|
+
position: 'bottom-right',
|
|
143
|
+
autoClose: 3000,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Still try to reload entries in case data has changed
|
|
147
|
+
loadEntries();
|
|
148
|
+
});
|
|
149
|
+
},
|
|
150
|
+
[loadEntries, deleteChat],
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
const deleteSelectedItems = useCallback(
|
|
154
|
+
async (itemsToDeleteIds: string[]) => {
|
|
155
|
+
if (!db || itemsToDeleteIds.length === 0) {
|
|
156
|
+
console.log('Bulk delete skipped: No DB or no items to delete.');
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
console.log(`Starting bulk delete for ${itemsToDeleteIds.length} chats`, itemsToDeleteIds);
|
|
161
|
+
|
|
162
|
+
let deletedCount = 0;
|
|
163
|
+
const errors: string[] = [];
|
|
164
|
+
const currentChatId = chatId.get();
|
|
165
|
+
let shouldNavigate = false;
|
|
166
|
+
|
|
167
|
+
// Process deletions sequentially using the shared deleteChat logic
|
|
168
|
+
for (const id of itemsToDeleteIds) {
|
|
169
|
+
try {
|
|
170
|
+
await deleteChat(id);
|
|
171
|
+
deletedCount++;
|
|
172
|
+
|
|
173
|
+
if (id === currentChatId) {
|
|
174
|
+
shouldNavigate = true;
|
|
175
|
+
}
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.error(`Error deleting chat ${id}:`, error);
|
|
178
|
+
errors.push(id);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Show appropriate toast message
|
|
183
|
+
if (errors.length === 0) {
|
|
184
|
+
toast.success(`${deletedCount} chat${deletedCount === 1 ? '' : 's'} deleted successfully`);
|
|
185
|
+
} else {
|
|
186
|
+
toast.warning(`Deleted ${deletedCount} of ${itemsToDeleteIds.length} chats. ${errors.length} failed.`, {
|
|
187
|
+
autoClose: 5000,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Reload the list after all deletions
|
|
192
|
+
await loadEntries();
|
|
193
|
+
|
|
194
|
+
// Clear selection state
|
|
195
|
+
setSelectedItems([]);
|
|
196
|
+
setSelectionMode(false);
|
|
197
|
+
|
|
198
|
+
// Navigate if needed
|
|
199
|
+
if (shouldNavigate) {
|
|
200
|
+
console.log('Navigating away from deleted chat');
|
|
201
|
+
window.location.pathname = '/';
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
[deleteChat, loadEntries, db],
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
const closeDialog = () => {
|
|
208
|
+
setDialogContent(null);
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
const toggleSelectionMode = () => {
|
|
212
|
+
setSelectionMode(!selectionMode);
|
|
213
|
+
|
|
214
|
+
if (selectionMode) {
|
|
215
|
+
// If turning selection mode OFF, clear selection
|
|
216
|
+
setSelectedItems([]);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const toggleItemSelection = useCallback((id: string) => {
|
|
221
|
+
setSelectedItems((prev) => {
|
|
222
|
+
const newSelectedItems = prev.includes(id) ? prev.filter((itemId) => itemId !== id) : [...prev, id];
|
|
223
|
+
console.log('Selected items updated:', newSelectedItems);
|
|
224
|
+
|
|
225
|
+
return newSelectedItems; // Return the new array
|
|
226
|
+
});
|
|
227
|
+
}, []); // No dependencies needed
|
|
228
|
+
|
|
229
|
+
const handleBulkDeleteClick = useCallback(() => {
|
|
230
|
+
if (selectedItems.length === 0) {
|
|
231
|
+
toast.info('Select at least one chat to delete');
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const selectedChats = list.filter((item) => selectedItems.includes(item.id));
|
|
236
|
+
|
|
237
|
+
if (selectedChats.length === 0) {
|
|
238
|
+
toast.error('Could not find selected chats');
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
setDialogContent({ type: 'bulkDelete', items: selectedChats });
|
|
243
|
+
}, [selectedItems, list]); // Keep list dependency
|
|
244
|
+
|
|
245
|
+
const selectAll = useCallback(() => {
|
|
246
|
+
const allFilteredIds = filteredList.map((item) => item.id);
|
|
247
|
+
setSelectedItems((prev) => {
|
|
248
|
+
const allFilteredAreSelected = allFilteredIds.length > 0 && allFilteredIds.every((id) => prev.includes(id));
|
|
249
|
+
|
|
250
|
+
if (allFilteredAreSelected) {
|
|
251
|
+
// Deselect only the filtered items
|
|
252
|
+
const newSelectedItems = prev.filter((id) => !allFilteredIds.includes(id));
|
|
253
|
+
console.log('Deselecting all filtered items. New selection:', newSelectedItems);
|
|
254
|
+
|
|
255
|
+
return newSelectedItems;
|
|
256
|
+
} else {
|
|
257
|
+
// Select all filtered items, adding them to any existing selections
|
|
258
|
+
const newSelectedItems = [...new Set([...prev, ...allFilteredIds])];
|
|
259
|
+
console.log('Selecting all filtered items. New selection:', newSelectedItems);
|
|
260
|
+
|
|
261
|
+
return newSelectedItems;
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}, [filteredList]); // Depends only on filteredList
|
|
265
|
+
|
|
266
|
+
useEffect(() => {
|
|
267
|
+
if (open) {
|
|
268
|
+
loadEntries();
|
|
269
|
+
}
|
|
270
|
+
}, [open, loadEntries]);
|
|
271
|
+
|
|
272
|
+
// Exit selection mode when sidebar is closed
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
if (!open && selectionMode) {
|
|
275
|
+
/*
|
|
276
|
+
* Don't clear selection state anymore when sidebar closes
|
|
277
|
+
* This allows the selection to persist when reopening the sidebar
|
|
278
|
+
*/
|
|
279
|
+
console.log('Sidebar closed, preserving selection state');
|
|
280
|
+
}
|
|
281
|
+
}, [open, selectionMode]);
|
|
282
|
+
|
|
283
|
+
useEffect(() => {
|
|
284
|
+
const enterThreshold = 20;
|
|
285
|
+
const exitThreshold = 20;
|
|
286
|
+
|
|
287
|
+
function onMouseMove(event: MouseEvent) {
|
|
288
|
+
if (event.pageX < enterThreshold) {
|
|
289
|
+
setOpen(true);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (menuRef.current && event.clientX > menuRef.current.getBoundingClientRect().right + exitThreshold) {
|
|
293
|
+
setOpen(false);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
window.addEventListener('mousemove', onMouseMove);
|
|
298
|
+
|
|
299
|
+
return () => {
|
|
300
|
+
window.removeEventListener('mousemove', onMouseMove);
|
|
301
|
+
};
|
|
302
|
+
}, []);
|
|
303
|
+
|
|
304
|
+
const handleDuplicate = async (id: string) => {
|
|
305
|
+
await duplicateCurrentChat(id);
|
|
306
|
+
loadEntries(); // Reload the list after duplication
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
// Settings UI removed: Configuration is environment-only
|
|
310
|
+
|
|
311
|
+
const setDialogContentWithLogging = useCallback((content: DialogContent) => {
|
|
312
|
+
console.log('Setting dialog content:', content);
|
|
313
|
+
setDialogContent(content);
|
|
314
|
+
}, []);
|
|
315
|
+
|
|
316
|
+
return (
|
|
317
|
+
<>
|
|
318
|
+
<motion.div
|
|
319
|
+
ref={menuRef}
|
|
320
|
+
initial="closed"
|
|
321
|
+
animate={open ? 'open' : 'closed'}
|
|
322
|
+
variants={menuVariants}
|
|
323
|
+
style={{ width: '340px' }}
|
|
324
|
+
className={classNames(
|
|
325
|
+
'flex selection-accent flex-col side-menu fixed top-0 h-full rounded-r-2xl',
|
|
326
|
+
'bg-white dark:bg-gray-950 border-r border-bolt-elements-borderColor',
|
|
327
|
+
'shadow-sm text-sm',
|
|
328
|
+
'z-sidebar',
|
|
329
|
+
)}
|
|
330
|
+
>
|
|
331
|
+
<div className="h-12 flex items-center justify-between px-4 border-b border-gray-100 dark:border-gray-800/50 bg-gray-50/50 dark:bg-gray-900/50 rounded-tr-2xl">
|
|
332
|
+
<div className="text-gray-900 dark:text-white font-medium"></div>
|
|
333
|
+
<div className="flex items-center gap-3">
|
|
334
|
+
<button
|
|
335
|
+
onClick={() => window.open('https://stackblitz-labs.github.io/bolt.diy/', '_blank')}
|
|
336
|
+
className="p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
|
|
337
|
+
aria-label="Help"
|
|
338
|
+
>
|
|
339
|
+
<span className="i-ph:question-mark h-4 w-4" />
|
|
340
|
+
</button>
|
|
341
|
+
<span className="font-medium text-sm text-gray-900 dark:text-white truncate">
|
|
342
|
+
{profile?.username || 'Guest User'}
|
|
343
|
+
</span>
|
|
344
|
+
<div className="flex items-center justify-center w-[32px] h-[32px] overflow-hidden bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-500 rounded-full shrink-0">
|
|
345
|
+
{profile?.avatar ? (
|
|
346
|
+
<img
|
|
347
|
+
src={profile.avatar}
|
|
348
|
+
alt={profile?.username || 'User'}
|
|
349
|
+
className="w-full h-full object-cover"
|
|
350
|
+
loading="eager"
|
|
351
|
+
decoding="sync"
|
|
352
|
+
/>
|
|
353
|
+
) : (
|
|
354
|
+
<div className="i-ph:user-fill text-lg" />
|
|
355
|
+
)}
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
</div>
|
|
359
|
+
<CurrentDateTime />
|
|
360
|
+
<div className="flex-1 flex flex-col h-full w-full overflow-hidden">
|
|
361
|
+
<div className="p-4 space-y-3">
|
|
362
|
+
<div className="flex gap-2">
|
|
363
|
+
<a
|
|
364
|
+
href="/"
|
|
365
|
+
className="flex-1 flex gap-2 items-center bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 hover:bg-purple-100 dark:hover:bg-purple-500/20 rounded-lg px-4 py-2 transition-colors"
|
|
366
|
+
>
|
|
367
|
+
<span className="inline-block i-ph:plus-circle h-4 w-4" />
|
|
368
|
+
<span className="text-sm font-medium">Start new chat</span>
|
|
369
|
+
</a>
|
|
370
|
+
<button
|
|
371
|
+
onClick={toggleSelectionMode}
|
|
372
|
+
className={classNames(
|
|
373
|
+
'flex gap-1 items-center rounded-lg px-3 py-2 transition-colors',
|
|
374
|
+
selectionMode
|
|
375
|
+
? 'bg-purple-600 dark:bg-purple-500 text-white border border-purple-700 dark:border-purple-600'
|
|
376
|
+
: 'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-200 dark:border-gray-700',
|
|
377
|
+
)}
|
|
378
|
+
aria-label={selectionMode ? 'Exit selection mode' : 'Enter selection mode'}
|
|
379
|
+
>
|
|
380
|
+
<span className={selectionMode ? 'i-ph:x h-4 w-4' : 'i-ph:check-square h-4 w-4'} />
|
|
381
|
+
</button>
|
|
382
|
+
</div>
|
|
383
|
+
<div className="relative w-full">
|
|
384
|
+
<div className="absolute left-3 top-1/2 -translate-y-1/2">
|
|
385
|
+
<span className="i-ph:magnifying-glass h-4 w-4 text-gray-400 dark:text-gray-500" />
|
|
386
|
+
</div>
|
|
387
|
+
<input
|
|
388
|
+
className="w-full bg-gray-50 dark:bg-gray-900 relative pl-9 pr-3 py-2 rounded-lg focus:outline-none focus:ring-1 focus:ring-purple-500/50 text-sm text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-500 border border-gray-200 dark:border-gray-800"
|
|
389
|
+
type="search"
|
|
390
|
+
placeholder="Search chats..."
|
|
391
|
+
onChange={handleSearchChange}
|
|
392
|
+
aria-label="Search chats"
|
|
393
|
+
/>
|
|
394
|
+
</div>
|
|
395
|
+
</div>
|
|
396
|
+
<div className="flex items-center justify-between text-sm px-4 py-2">
|
|
397
|
+
<div className="font-medium text-gray-600 dark:text-gray-400">Your Chats</div>
|
|
398
|
+
{selectionMode && (
|
|
399
|
+
<div className="flex items-center gap-2">
|
|
400
|
+
<Button variant="ghost" size="sm" onClick={selectAll}>
|
|
401
|
+
{selectedItems.length === filteredList.length ? 'Deselect all' : 'Select all'}
|
|
402
|
+
</Button>
|
|
403
|
+
<Button
|
|
404
|
+
variant="destructive"
|
|
405
|
+
size="sm"
|
|
406
|
+
onClick={handleBulkDeleteClick}
|
|
407
|
+
disabled={selectedItems.length === 0}
|
|
408
|
+
>
|
|
409
|
+
Delete selected
|
|
410
|
+
</Button>
|
|
411
|
+
</div>
|
|
412
|
+
)}
|
|
413
|
+
</div>
|
|
414
|
+
<div className="flex-1 overflow-auto px-3 pb-3">
|
|
415
|
+
{filteredList.length === 0 && (
|
|
416
|
+
<div className="px-4 text-gray-500 dark:text-gray-400 text-sm">
|
|
417
|
+
{list.length === 0 ? 'No previous conversations' : 'No matches found'}
|
|
418
|
+
</div>
|
|
419
|
+
)}
|
|
420
|
+
<DialogRoot open={dialogContent !== null}>
|
|
421
|
+
{binDates(filteredList).map(({ category, items }) => (
|
|
422
|
+
<div key={category} className="mt-2 first:mt-0 space-y-1">
|
|
423
|
+
<div className="text-xs font-medium text-gray-500 dark:text-gray-400 sticky top-0 z-1 bg-white dark:bg-gray-950 px-4 py-1">
|
|
424
|
+
{category}
|
|
425
|
+
</div>
|
|
426
|
+
<div className="space-y-0.5 pr-1">
|
|
427
|
+
{items.map((item) => (
|
|
428
|
+
<HistoryItem
|
|
429
|
+
key={item.id}
|
|
430
|
+
item={item}
|
|
431
|
+
exportChat={exportChat}
|
|
432
|
+
onDelete={(event) => {
|
|
433
|
+
event.preventDefault();
|
|
434
|
+
event.stopPropagation();
|
|
435
|
+
console.log('Delete triggered for item:', item);
|
|
436
|
+
setDialogContentWithLogging({ type: 'delete', item });
|
|
437
|
+
}}
|
|
438
|
+
onDuplicate={() => handleDuplicate(item.id)}
|
|
439
|
+
selectionMode={selectionMode}
|
|
440
|
+
isSelected={selectedItems.includes(item.id)}
|
|
441
|
+
onToggleSelection={toggleItemSelection}
|
|
442
|
+
/>
|
|
443
|
+
))}
|
|
444
|
+
</div>
|
|
445
|
+
</div>
|
|
446
|
+
))}
|
|
447
|
+
<Dialog onBackdrop={closeDialog} onClose={closeDialog}>
|
|
448
|
+
{dialogContent?.type === 'delete' && (
|
|
449
|
+
<>
|
|
450
|
+
<div className="p-6 bg-white dark:bg-gray-950">
|
|
451
|
+
<DialogTitle className="text-gray-900 dark:text-white">Delete Chat?</DialogTitle>
|
|
452
|
+
<DialogDescription className="mt-2 text-gray-600 dark:text-gray-400">
|
|
453
|
+
<p>
|
|
454
|
+
You are about to delete{' '}
|
|
455
|
+
<span className="font-medium text-gray-900 dark:text-white">
|
|
456
|
+
{dialogContent.item.description}
|
|
457
|
+
</span>
|
|
458
|
+
</p>
|
|
459
|
+
<p className="mt-2">Are you sure you want to delete this chat?</p>
|
|
460
|
+
</DialogDescription>
|
|
461
|
+
</div>
|
|
462
|
+
<div className="flex justify-end gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-900 border-t border-gray-100 dark:border-gray-800">
|
|
463
|
+
<DialogButton type="secondary" onClick={closeDialog}>
|
|
464
|
+
Cancel
|
|
465
|
+
</DialogButton>
|
|
466
|
+
<DialogButton
|
|
467
|
+
type="danger"
|
|
468
|
+
onClick={(event) => {
|
|
469
|
+
console.log('Dialog delete button clicked for item:', dialogContent.item);
|
|
470
|
+
deleteItem(event, dialogContent.item);
|
|
471
|
+
closeDialog();
|
|
472
|
+
}}
|
|
473
|
+
>
|
|
474
|
+
Delete
|
|
475
|
+
</DialogButton>
|
|
476
|
+
</div>
|
|
477
|
+
</>
|
|
478
|
+
)}
|
|
479
|
+
{dialogContent?.type === 'bulkDelete' && (
|
|
480
|
+
<>
|
|
481
|
+
<div className="p-6 bg-white dark:bg-gray-950">
|
|
482
|
+
<DialogTitle className="text-gray-900 dark:text-white">Delete Selected Chats?</DialogTitle>
|
|
483
|
+
<DialogDescription className="mt-2 text-gray-600 dark:text-gray-400">
|
|
484
|
+
<p>
|
|
485
|
+
You are about to delete {dialogContent.items.length}{' '}
|
|
486
|
+
{dialogContent.items.length === 1 ? 'chat' : 'chats'}:
|
|
487
|
+
</p>
|
|
488
|
+
<div className="mt-2 max-h-32 overflow-auto border border-gray-100 dark:border-gray-800 rounded-md bg-gray-50 dark:bg-gray-900 p-2">
|
|
489
|
+
<ul className="list-disc pl-5 space-y-1">
|
|
490
|
+
{dialogContent.items.map((item) => (
|
|
491
|
+
<li key={item.id} className="text-sm">
|
|
492
|
+
<span className="font-medium text-gray-900 dark:text-white">{item.description}</span>
|
|
493
|
+
</li>
|
|
494
|
+
))}
|
|
495
|
+
</ul>
|
|
496
|
+
</div>
|
|
497
|
+
<p className="mt-3">Are you sure you want to delete these chats?</p>
|
|
498
|
+
</DialogDescription>
|
|
499
|
+
</div>
|
|
500
|
+
<div className="flex justify-end gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-900 border-t border-gray-100 dark:border-gray-800">
|
|
501
|
+
<DialogButton type="secondary" onClick={closeDialog}>
|
|
502
|
+
Cancel
|
|
503
|
+
</DialogButton>
|
|
504
|
+
<DialogButton
|
|
505
|
+
type="danger"
|
|
506
|
+
onClick={() => {
|
|
507
|
+
/*
|
|
508
|
+
* Pass the current selectedItems to the delete function.
|
|
509
|
+
* This captures the state at the moment the user confirms.
|
|
510
|
+
*/
|
|
511
|
+
const itemsToDeleteNow = [...selectedItems];
|
|
512
|
+
console.log('Bulk delete confirmed for', itemsToDeleteNow.length, 'items', itemsToDeleteNow);
|
|
513
|
+
deleteSelectedItems(itemsToDeleteNow);
|
|
514
|
+
closeDialog();
|
|
515
|
+
}}
|
|
516
|
+
>
|
|
517
|
+
Delete
|
|
518
|
+
</DialogButton>
|
|
519
|
+
</div>
|
|
520
|
+
</>
|
|
521
|
+
)}
|
|
522
|
+
</Dialog>
|
|
523
|
+
</DialogRoot>
|
|
524
|
+
</div>
|
|
525
|
+
<div className="flex items-center justify-between border-t border-gray-200 dark:border-gray-800 px-4 py-3">
|
|
526
|
+
<div className="flex items-center gap-3">
|
|
527
|
+
{/* Settings button removed: Configuration is environment-only */}
|
|
528
|
+
</div>
|
|
529
|
+
<ThemeSwitch />
|
|
530
|
+
</div>
|
|
531
|
+
</div>
|
|
532
|
+
</motion.div>
|
|
533
|
+
{/* ControlPanel removed: Settings UI disabled for LLM-native execution */}
|
|
534
|
+
</>
|
|
535
|
+
);
|
|
536
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { format, isAfter, isThisWeek, isThisYear, isToday, isYesterday, subDays } from 'date-fns';
|
|
2
|
+
import type { ChatHistoryItem } from '~/lib/persistence';
|
|
3
|
+
|
|
4
|
+
type Bin = { category: string; items: ChatHistoryItem[] };
|
|
5
|
+
|
|
6
|
+
export function binDates(_list: ChatHistoryItem[]) {
|
|
7
|
+
const list = _list.toSorted((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp));
|
|
8
|
+
|
|
9
|
+
const binLookup: Record<string, Bin> = {};
|
|
10
|
+
const bins: Array<Bin> = [];
|
|
11
|
+
|
|
12
|
+
list.forEach((item) => {
|
|
13
|
+
const category = dateCategory(new Date(item.timestamp));
|
|
14
|
+
|
|
15
|
+
if (!(category in binLookup)) {
|
|
16
|
+
const bin = {
|
|
17
|
+
category,
|
|
18
|
+
items: [item],
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
binLookup[category] = bin;
|
|
22
|
+
|
|
23
|
+
bins.push(bin);
|
|
24
|
+
} else {
|
|
25
|
+
binLookup[category].items.push(item);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return bins;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function dateCategory(date: Date) {
|
|
33
|
+
if (isToday(date)) {
|
|
34
|
+
return 'Today';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (isYesterday(date)) {
|
|
38
|
+
return 'Yesterday';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (isThisWeek(date)) {
|
|
42
|
+
// e.g., "Mon" instead of "Monday"
|
|
43
|
+
return format(date, 'EEE');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const thirtyDaysAgo = subDays(new Date(), 30);
|
|
47
|
+
|
|
48
|
+
if (isAfter(date, thirtyDaysAgo)) {
|
|
49
|
+
return 'Past 30 Days';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (isThisYear(date)) {
|
|
53
|
+
// e.g., "Jan" instead of "January"
|
|
54
|
+
return format(date, 'LLL');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// e.g., "Jan 2023" instead of "January 2023"
|
|
58
|
+
return format(date, 'LLL yyyy');
|
|
59
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import styles from './styles.module.scss';
|
|
2
|
+
|
|
3
|
+
const BackgroundRays = () => {
|
|
4
|
+
return (
|
|
5
|
+
<div className={`${styles.rayContainer} `}>
|
|
6
|
+
<div className={`${styles.lightRay} ${styles.ray1}`}></div>
|
|
7
|
+
<div className={`${styles.lightRay} ${styles.ray2}`}></div>
|
|
8
|
+
<div className={`${styles.lightRay} ${styles.ray3}`}></div>
|
|
9
|
+
<div className={`${styles.lightRay} ${styles.ray4}`}></div>
|
|
10
|
+
<div className={`${styles.lightRay} ${styles.ray5}`}></div>
|
|
11
|
+
<div className={`${styles.lightRay} ${styles.ray6}`}></div>
|
|
12
|
+
<div className={`${styles.lightRay} ${styles.ray7}`}></div>
|
|
13
|
+
<div className={`${styles.lightRay} ${styles.ray8}`}></div>
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default BackgroundRays;
|