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,327 @@
|
|
|
1
|
+
import ignore from 'ignore';
|
|
2
|
+
import { useGit } from '~/lib/hooks/useGit';
|
|
3
|
+
import type { Message } from 'ai';
|
|
4
|
+
import { detectProjectCommands, createCommandsMessage, escapeBoltTags } from '~/utils/projectCommands';
|
|
5
|
+
import { generateId } from '~/utils/fileUtils';
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
import { toast } from 'react-toastify';
|
|
8
|
+
import { LoadingOverlay } from '~/components/ui/LoadingOverlay';
|
|
9
|
+
|
|
10
|
+
import { classNames } from '~/utils/classNames';
|
|
11
|
+
import { Button } from '~/components/ui/Button';
|
|
12
|
+
import type { IChatMetadata } from '~/lib/persistence/db';
|
|
13
|
+
import { X, Github, GitBranch } from 'lucide-react';
|
|
14
|
+
|
|
15
|
+
// Import the new repository selector components
|
|
16
|
+
import { GitHubRepositorySelector } from '~/components/@settings/tabs/github/components/GitHubRepositorySelector';
|
|
17
|
+
import { GitLabRepositorySelector } from '~/components/@settings/tabs/gitlab/components/GitLabRepositorySelector';
|
|
18
|
+
|
|
19
|
+
const IGNORE_PATTERNS = [
|
|
20
|
+
'node_modules/**',
|
|
21
|
+
'.git/**',
|
|
22
|
+
'.github/**',
|
|
23
|
+
'.vscode/**',
|
|
24
|
+
'dist/**',
|
|
25
|
+
'build/**',
|
|
26
|
+
'.next/**',
|
|
27
|
+
'coverage/**',
|
|
28
|
+
'.cache/**',
|
|
29
|
+
'.idea/**',
|
|
30
|
+
'**/*.log',
|
|
31
|
+
'**/.DS_Store',
|
|
32
|
+
'**/npm-debug.log*',
|
|
33
|
+
'**/yarn-debug.log*',
|
|
34
|
+
'**/yarn-error.log*',
|
|
35
|
+
|
|
36
|
+
// Include this so npm install runs much faster '**/*lock.json',
|
|
37
|
+
'**/*lock.yaml',
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const ig = ignore().add(IGNORE_PATTERNS);
|
|
41
|
+
|
|
42
|
+
const MAX_FILE_SIZE = 100 * 1024; // 100KB limit per file
|
|
43
|
+
const MAX_TOTAL_SIZE = 500 * 1024; // 500KB total limit
|
|
44
|
+
|
|
45
|
+
interface GitCloneButtonProps {
|
|
46
|
+
className?: string;
|
|
47
|
+
importChat?: (description: string, messages: Message[], metadata?: IChatMetadata) => Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export default function GitCloneButton({ importChat, className }: GitCloneButtonProps) {
|
|
51
|
+
const { ready, gitClone } = useGit();
|
|
52
|
+
const [loading, setLoading] = useState(false);
|
|
53
|
+
const [isDialogOpen, setIsDialogOpen] = useState(false);
|
|
54
|
+
const [selectedProvider, setSelectedProvider] = useState<'github' | 'gitlab' | null>(null);
|
|
55
|
+
|
|
56
|
+
const handleClone = async (repoUrl: string) => {
|
|
57
|
+
if (!ready) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
setLoading(true);
|
|
62
|
+
setIsDialogOpen(false);
|
|
63
|
+
setSelectedProvider(null);
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
const { workdir, data } = await gitClone(repoUrl);
|
|
67
|
+
|
|
68
|
+
if (importChat) {
|
|
69
|
+
const filePaths = Object.keys(data).filter((filePath) => !ig.ignores(filePath));
|
|
70
|
+
const textDecoder = new TextDecoder('utf-8');
|
|
71
|
+
|
|
72
|
+
let totalSize = 0;
|
|
73
|
+
const skippedFiles: string[] = [];
|
|
74
|
+
const fileContents = [];
|
|
75
|
+
|
|
76
|
+
for (const filePath of filePaths) {
|
|
77
|
+
const { data: content, encoding } = data[filePath];
|
|
78
|
+
|
|
79
|
+
// Skip binary files
|
|
80
|
+
if (
|
|
81
|
+
content instanceof Uint8Array &&
|
|
82
|
+
!filePath.match(/\.(txt|md|astro|mjs|js|jsx|ts|tsx|json|html|css|scss|less|yml|yaml|xml|svg|vue|svelte)$/i)
|
|
83
|
+
) {
|
|
84
|
+
skippedFiles.push(filePath);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
const textContent =
|
|
90
|
+
encoding === 'utf8' ? content : content instanceof Uint8Array ? textDecoder.decode(content) : '';
|
|
91
|
+
|
|
92
|
+
if (!textContent) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Check file size
|
|
97
|
+
const fileSize = new TextEncoder().encode(textContent).length;
|
|
98
|
+
|
|
99
|
+
if (fileSize > MAX_FILE_SIZE) {
|
|
100
|
+
skippedFiles.push(`${filePath} (too large: ${Math.round(fileSize / 1024)}KB)`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Check total size
|
|
105
|
+
if (totalSize + fileSize > MAX_TOTAL_SIZE) {
|
|
106
|
+
skippedFiles.push(`${filePath} (would exceed total size limit)`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
totalSize += fileSize;
|
|
111
|
+
fileContents.push({
|
|
112
|
+
path: filePath,
|
|
113
|
+
content: textContent,
|
|
114
|
+
});
|
|
115
|
+
} catch (e: any) {
|
|
116
|
+
skippedFiles.push(`${filePath} (error: ${e.message})`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const commands = await detectProjectCommands(fileContents);
|
|
121
|
+
const commandsMessage = createCommandsMessage(commands);
|
|
122
|
+
|
|
123
|
+
const filesMessage: Message = {
|
|
124
|
+
role: 'assistant',
|
|
125
|
+
content: `Cloning the repo ${repoUrl} into ${workdir}
|
|
126
|
+
${
|
|
127
|
+
skippedFiles.length > 0
|
|
128
|
+
? `\nSkipped files (${skippedFiles.length}):
|
|
129
|
+
${skippedFiles.map((f) => `- ${f}`).join('\n')}`
|
|
130
|
+
: ''
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
<boltArtifact id="imported-files" title="Git Cloned Files" type="bundled">
|
|
134
|
+
${fileContents
|
|
135
|
+
.map(
|
|
136
|
+
(file) =>
|
|
137
|
+
`<boltAction type="file" filePath="${file.path}">
|
|
138
|
+
${escapeBoltTags(file.content)}
|
|
139
|
+
</boltAction>`,
|
|
140
|
+
)
|
|
141
|
+
.join('\n')}
|
|
142
|
+
</boltArtifact>`,
|
|
143
|
+
id: generateId(),
|
|
144
|
+
createdAt: new Date(),
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const messages = [filesMessage];
|
|
148
|
+
|
|
149
|
+
if (commandsMessage) {
|
|
150
|
+
messages.push(commandsMessage);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
await importChat(`Git Project:${repoUrl.split('/').slice(-1)[0]}`, messages);
|
|
154
|
+
}
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error('Error during import:', error);
|
|
157
|
+
toast.error('Failed to import repository');
|
|
158
|
+
} finally {
|
|
159
|
+
setLoading(false);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
return (
|
|
164
|
+
<>
|
|
165
|
+
<Button
|
|
166
|
+
onClick={() => {
|
|
167
|
+
setSelectedProvider(null);
|
|
168
|
+
setIsDialogOpen(true);
|
|
169
|
+
}}
|
|
170
|
+
title="Clone a repo"
|
|
171
|
+
variant="default"
|
|
172
|
+
size="lg"
|
|
173
|
+
className={classNames(
|
|
174
|
+
'gap-2 bg-bolt-elements-background-depth-1',
|
|
175
|
+
'text-bolt-elements-textPrimary',
|
|
176
|
+
'hover:bg-bolt-elements-background-depth-2',
|
|
177
|
+
'border border-bolt-elements-borderColor',
|
|
178
|
+
'h-10 px-4 py-2 min-w-[120px] justify-center',
|
|
179
|
+
'transition-all duration-200 ease-in-out',
|
|
180
|
+
className,
|
|
181
|
+
)}
|
|
182
|
+
disabled={!ready || loading}
|
|
183
|
+
>
|
|
184
|
+
Clone a repo
|
|
185
|
+
<div className="flex items-center gap-1 ml-2">
|
|
186
|
+
<Github className="w-4 h-4" />
|
|
187
|
+
<GitBranch className="w-4 h-4" />
|
|
188
|
+
</div>
|
|
189
|
+
</Button>
|
|
190
|
+
|
|
191
|
+
{/* Provider Selection Dialog */}
|
|
192
|
+
{isDialogOpen && !selectedProvider && (
|
|
193
|
+
<div className="fixed inset-0 bg-black/50 backdrop-blur-sm z-50 flex items-center justify-center p-4">
|
|
194
|
+
<div className="bg-white dark:bg-gray-950 rounded-xl shadow-xl border border-bolt-elements-borderColor dark:border-bolt-elements-borderColor max-w-md w-full">
|
|
195
|
+
<div className="p-6">
|
|
196
|
+
<div className="flex items-center justify-between mb-4">
|
|
197
|
+
<h3 className="text-lg font-semibold text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary">
|
|
198
|
+
Choose Repository Provider
|
|
199
|
+
</h3>
|
|
200
|
+
<button
|
|
201
|
+
onClick={() => setIsDialogOpen(false)}
|
|
202
|
+
className="p-2 rounded-lg bg-transparent hover:bg-bolt-elements-background-depth-1 dark:hover:bg-bolt-elements-background-depth-1 text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary hover:text-bolt-elements-textPrimary dark:hover:text-bolt-elements-textPrimary transition-all duration-200 hover:scale-105 active:scale-95"
|
|
203
|
+
>
|
|
204
|
+
<X className="w-5 h-5 transition-transform duration-200 hover:rotate-90" />
|
|
205
|
+
</button>
|
|
206
|
+
</div>
|
|
207
|
+
|
|
208
|
+
<div className="space-y-3">
|
|
209
|
+
<button
|
|
210
|
+
onClick={() => setSelectedProvider('github')}
|
|
211
|
+
className="w-full p-4 rounded-lg bg-bolt-elements-background-depth-1 dark:bg-bolt-elements-background-depth-1 hover:bg-bolt-elements-background-depth-2 dark:hover:bg-bolt-elements-background-depth-2 border border-bolt-elements-borderColor dark:border-bolt-elements-borderColor hover:border-bolt-elements-borderColorActive dark:hover:border-bolt-elements-borderColorActive transition-all duration-200 text-left group"
|
|
212
|
+
>
|
|
213
|
+
<div className="flex items-center gap-3">
|
|
214
|
+
<div className="w-10 h-10 rounded-lg bg-blue-500/10 dark:bg-blue-500/20 flex items-center justify-center group-hover:bg-blue-500/20 dark:group-hover:bg-blue-500/30 transition-colors">
|
|
215
|
+
<Github className="w-6 h-6 text-blue-600 dark:text-blue-400" />
|
|
216
|
+
</div>
|
|
217
|
+
<div>
|
|
218
|
+
<div className="font-medium text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary">
|
|
219
|
+
GitHub
|
|
220
|
+
</div>
|
|
221
|
+
<div className="text-sm text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary">
|
|
222
|
+
Clone from GitHub repositories
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
</button>
|
|
227
|
+
|
|
228
|
+
<button
|
|
229
|
+
onClick={() => setSelectedProvider('gitlab')}
|
|
230
|
+
className="w-full p-4 rounded-lg bg-bolt-elements-background-depth-1 dark:bg-bolt-elements-background-depth-1 hover:bg-bolt-elements-background-depth-2 dark:hover:bg-bolt-elements-background-depth-2 border border-bolt-elements-borderColor dark:border-bolt-elements-borderColor hover:border-bolt-elements-borderColorActive dark:hover:border-bolt-elements-borderColorActive transition-all duration-200 text-left group"
|
|
231
|
+
>
|
|
232
|
+
<div className="flex items-center gap-3">
|
|
233
|
+
<div className="w-10 h-10 rounded-lg bg-orange-500/10 dark:bg-orange-500/20 flex items-center justify-center group-hover:bg-orange-500/20 dark:group-hover:bg-orange-500/30 transition-colors">
|
|
234
|
+
<GitBranch className="w-6 h-6 text-orange-600 dark:text-orange-400" />
|
|
235
|
+
</div>
|
|
236
|
+
<div>
|
|
237
|
+
<div className="font-medium text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary">
|
|
238
|
+
GitLab
|
|
239
|
+
</div>
|
|
240
|
+
<div className="text-sm text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary">
|
|
241
|
+
Clone from GitLab repositories
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
</div>
|
|
245
|
+
</button>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
)}
|
|
251
|
+
|
|
252
|
+
{/* GitHub Repository Selection */}
|
|
253
|
+
{isDialogOpen && selectedProvider === 'github' && (
|
|
254
|
+
<div className="fixed inset-0 bg-black/50 backdrop-blur-sm z-50 flex items-center justify-center p-4">
|
|
255
|
+
<div className="bg-white dark:bg-gray-950 rounded-xl shadow-xl border border-bolt-elements-borderColor dark:border-bolt-elements-borderColor w-full max-w-4xl max-h-[90vh] overflow-hidden">
|
|
256
|
+
<div className="p-6 border-b border-bolt-elements-borderColor dark:border-bolt-elements-borderColor flex items-center justify-between">
|
|
257
|
+
<div className="flex items-center gap-3">
|
|
258
|
+
<div className="w-10 h-10 rounded-lg bg-blue-500/10 dark:bg-blue-500/20 flex items-center justify-center">
|
|
259
|
+
<Github className="w-6 h-6 text-blue-600 dark:text-blue-400" />
|
|
260
|
+
</div>
|
|
261
|
+
<div>
|
|
262
|
+
<h3 className="text-lg font-semibold text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary">
|
|
263
|
+
Import GitHub Repository
|
|
264
|
+
</h3>
|
|
265
|
+
<p className="text-sm text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary">
|
|
266
|
+
Clone a repository from GitHub to your workspace
|
|
267
|
+
</p>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
<button
|
|
271
|
+
onClick={() => {
|
|
272
|
+
setIsDialogOpen(false);
|
|
273
|
+
setSelectedProvider(null);
|
|
274
|
+
}}
|
|
275
|
+
className="p-2 rounded-lg bg-transparent hover:bg-bolt-elements-background-depth-1 dark:hover:bg-bolt-elements-background-depth-1 text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary hover:text-bolt-elements-textPrimary dark:hover:text-bolt-elements-textPrimary transition-all duration-200 hover:scale-105 active:scale-95"
|
|
276
|
+
>
|
|
277
|
+
<X className="w-5 h-5 transition-transform duration-200 hover:rotate-90" />
|
|
278
|
+
</button>
|
|
279
|
+
</div>
|
|
280
|
+
|
|
281
|
+
<div className="p-6 max-h-[calc(90vh-140px)] overflow-y-auto">
|
|
282
|
+
<GitHubRepositorySelector onClone={handleClone} />
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
)}
|
|
287
|
+
|
|
288
|
+
{/* GitLab Repository Selection */}
|
|
289
|
+
{isDialogOpen && selectedProvider === 'gitlab' && (
|
|
290
|
+
<div className="fixed inset-0 bg-black/50 backdrop-blur-sm z-50 flex items-center justify-center p-4">
|
|
291
|
+
<div className="bg-white dark:bg-gray-950 rounded-xl shadow-xl border border-bolt-elements-borderColor dark:border-bolt-elements-borderColor w-full max-w-4xl max-h-[90vh] overflow-hidden">
|
|
292
|
+
<div className="p-6 border-b border-bolt-elements-borderColor dark:border-bolt-elements-borderColor flex items-center justify-between">
|
|
293
|
+
<div className="flex items-center gap-3">
|
|
294
|
+
<div className="w-10 h-10 rounded-lg bg-orange-500/10 dark:bg-orange-500/20 flex items-center justify-center">
|
|
295
|
+
<GitBranch className="w-6 h-6 text-orange-600 dark:text-orange-400" />
|
|
296
|
+
</div>
|
|
297
|
+
<div>
|
|
298
|
+
<h3 className="text-lg font-semibold text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary">
|
|
299
|
+
Import GitLab Repository
|
|
300
|
+
</h3>
|
|
301
|
+
<p className="text-sm text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary">
|
|
302
|
+
Clone a repository from GitLab to your workspace
|
|
303
|
+
</p>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
<button
|
|
307
|
+
onClick={() => {
|
|
308
|
+
setIsDialogOpen(false);
|
|
309
|
+
setSelectedProvider(null);
|
|
310
|
+
}}
|
|
311
|
+
className="p-2 rounded-lg bg-transparent hover:bg-bolt-elements-background-depth-1 dark:hover:bg-bolt-elements-background-depth-1 text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary hover:text-bolt-elements-textPrimary dark:hover:text-bolt-elements-textPrimary transition-all duration-200 hover:scale-105 active:scale-95"
|
|
312
|
+
>
|
|
313
|
+
<X className="w-5 h-5 transition-transform duration-200 hover:rotate-90" />
|
|
314
|
+
</button>
|
|
315
|
+
</div>
|
|
316
|
+
|
|
317
|
+
<div className="p-6 max-h-[calc(90vh-140px)] overflow-y-auto">
|
|
318
|
+
<GitLabRepositorySelector onClone={handleClone} />
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
)}
|
|
323
|
+
|
|
324
|
+
{loading && <LoadingOverlay message="Please wait while we clone the repository..." />}
|
|
325
|
+
</>
|
|
326
|
+
);
|
|
327
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import type { Message } from 'ai';
|
|
3
|
+
import { toast } from 'react-toastify';
|
|
4
|
+
import { MAX_FILES, isBinaryFile, shouldIncludeFile } from '~/utils/fileUtils';
|
|
5
|
+
import { createChatFromFolder } from '~/utils/folderImport';
|
|
6
|
+
import { logStore } from '~/lib/stores/logs'; // Assuming logStore is imported from this location
|
|
7
|
+
import { Button } from '~/components/ui/Button';
|
|
8
|
+
import { classNames } from '~/utils/classNames';
|
|
9
|
+
|
|
10
|
+
interface ImportFolderButtonProps {
|
|
11
|
+
className?: string;
|
|
12
|
+
importChat?: (description: string, messages: Message[]) => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const ImportFolderButton: React.FC<ImportFolderButtonProps> = ({ className, importChat }) => {
|
|
16
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
17
|
+
|
|
18
|
+
const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
19
|
+
const allFiles = Array.from(e.target.files || []);
|
|
20
|
+
|
|
21
|
+
const filteredFiles = allFiles.filter((file) => {
|
|
22
|
+
const path = file.webkitRelativePath.split('/').slice(1).join('/');
|
|
23
|
+
const include = shouldIncludeFile(path);
|
|
24
|
+
|
|
25
|
+
return include;
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
if (filteredFiles.length === 0) {
|
|
29
|
+
const error = new Error('No valid files found');
|
|
30
|
+
logStore.logError('File import failed - no valid files', error, { folderName: 'Unknown Folder' });
|
|
31
|
+
toast.error('No files found in the selected folder');
|
|
32
|
+
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (filteredFiles.length > MAX_FILES) {
|
|
37
|
+
const error = new Error(`Too many files: ${filteredFiles.length}`);
|
|
38
|
+
logStore.logError('File import failed - too many files', error, {
|
|
39
|
+
fileCount: filteredFiles.length,
|
|
40
|
+
maxFiles: MAX_FILES,
|
|
41
|
+
});
|
|
42
|
+
toast.error(
|
|
43
|
+
`This folder contains ${filteredFiles.length.toLocaleString()} files. This product is not yet optimized for very large projects. Please select a folder with fewer than ${MAX_FILES.toLocaleString()} files.`,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const folderName = filteredFiles[0]?.webkitRelativePath.split('/')[0] || 'Unknown Folder';
|
|
50
|
+
setIsLoading(true);
|
|
51
|
+
|
|
52
|
+
const loadingToast = toast.loading(`Importing ${folderName}...`);
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
const fileChecks = await Promise.all(
|
|
56
|
+
filteredFiles.map(async (file) => ({
|
|
57
|
+
file,
|
|
58
|
+
isBinary: await isBinaryFile(file),
|
|
59
|
+
})),
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const textFiles = fileChecks.filter((f) => !f.isBinary).map((f) => f.file);
|
|
63
|
+
const binaryFilePaths = fileChecks
|
|
64
|
+
.filter((f) => f.isBinary)
|
|
65
|
+
.map((f) => f.file.webkitRelativePath.split('/').slice(1).join('/'));
|
|
66
|
+
|
|
67
|
+
if (textFiles.length === 0) {
|
|
68
|
+
const error = new Error('No text files found');
|
|
69
|
+
logStore.logError('File import failed - no text files', error, { folderName });
|
|
70
|
+
toast.error('No text files found in the selected folder');
|
|
71
|
+
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (binaryFilePaths.length > 0) {
|
|
76
|
+
logStore.logWarning(`Skipping binary files during import`, {
|
|
77
|
+
folderName,
|
|
78
|
+
binaryCount: binaryFilePaths.length,
|
|
79
|
+
});
|
|
80
|
+
toast.info(`Skipping ${binaryFilePaths.length} binary files`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const messages = await createChatFromFolder(textFiles, binaryFilePaths, folderName);
|
|
84
|
+
|
|
85
|
+
if (importChat) {
|
|
86
|
+
await importChat(folderName, [...messages]);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
logStore.logSystem('Folder imported successfully', {
|
|
90
|
+
folderName,
|
|
91
|
+
textFileCount: textFiles.length,
|
|
92
|
+
binaryFileCount: binaryFilePaths.length,
|
|
93
|
+
});
|
|
94
|
+
toast.success('Folder imported successfully');
|
|
95
|
+
} catch (error) {
|
|
96
|
+
logStore.logError('Failed to import folder', error, { folderName });
|
|
97
|
+
console.error('Failed to import folder:', error);
|
|
98
|
+
toast.error('Failed to import folder');
|
|
99
|
+
} finally {
|
|
100
|
+
setIsLoading(false);
|
|
101
|
+
toast.dismiss(loadingToast);
|
|
102
|
+
e.target.value = ''; // Reset file input
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<>
|
|
108
|
+
<input
|
|
109
|
+
type="file"
|
|
110
|
+
id="folder-import"
|
|
111
|
+
className="hidden"
|
|
112
|
+
webkitdirectory=""
|
|
113
|
+
directory=""
|
|
114
|
+
onChange={handleFileChange}
|
|
115
|
+
{...({} as any)}
|
|
116
|
+
/>
|
|
117
|
+
<Button
|
|
118
|
+
onClick={() => {
|
|
119
|
+
const input = document.getElementById('folder-import');
|
|
120
|
+
input?.click();
|
|
121
|
+
}}
|
|
122
|
+
title="Import Folder"
|
|
123
|
+
variant="default"
|
|
124
|
+
size="lg"
|
|
125
|
+
className={classNames(
|
|
126
|
+
'gap-2 bg-bolt-elements-background-depth-1',
|
|
127
|
+
'text-bolt-elements-textPrimary',
|
|
128
|
+
'hover:bg-bolt-elements-background-depth-2',
|
|
129
|
+
'border border-bolt-elements-borderColor',
|
|
130
|
+
'h-10 px-4 py-2 min-w-[120px] justify-center',
|
|
131
|
+
'transition-all duration-200 ease-in-out',
|
|
132
|
+
className,
|
|
133
|
+
)}
|
|
134
|
+
disabled={isLoading}
|
|
135
|
+
>
|
|
136
|
+
<span className="i-ph:upload-simple w-4 h-4" />
|
|
137
|
+
{isLoading ? 'Importing...' : 'Import Folder'}
|
|
138
|
+
</Button>
|
|
139
|
+
</>
|
|
140
|
+
);
|
|
141
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { AnimatePresence, motion } from 'framer-motion';
|
|
2
|
+
import type { LlmErrorAlertType } from '~/types/actions';
|
|
3
|
+
import { classNames } from '~/utils/classNames';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
alert: LlmErrorAlertType;
|
|
7
|
+
clearAlert: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default function LlmErrorAlert({ alert, clearAlert }: Props) {
|
|
11
|
+
const { title, description, provider, errorType } = alert;
|
|
12
|
+
|
|
13
|
+
const getErrorIcon = () => {
|
|
14
|
+
switch (errorType) {
|
|
15
|
+
case 'authentication':
|
|
16
|
+
return 'i-ph:key-duotone';
|
|
17
|
+
case 'rate_limit':
|
|
18
|
+
return 'i-ph:clock-duotone';
|
|
19
|
+
case 'quota':
|
|
20
|
+
return 'i-ph:warning-circle-duotone';
|
|
21
|
+
default:
|
|
22
|
+
return 'i-ph:warning-duotone';
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const getErrorMessage = () => {
|
|
27
|
+
switch (errorType) {
|
|
28
|
+
case 'authentication':
|
|
29
|
+
return `Authentication failed with ${provider}. Please check your API key.`;
|
|
30
|
+
case 'rate_limit':
|
|
31
|
+
return `Rate limit exceeded for ${provider}. Please wait before retrying.`;
|
|
32
|
+
case 'quota':
|
|
33
|
+
return `Quota exceeded for ${provider}. Please check your account limits.`;
|
|
34
|
+
default:
|
|
35
|
+
return 'An error occurred while processing your request.';
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<AnimatePresence>
|
|
41
|
+
<motion.div
|
|
42
|
+
initial={{ opacity: 0, y: -20 }}
|
|
43
|
+
animate={{ opacity: 1, y: 0 }}
|
|
44
|
+
exit={{ opacity: 0, y: -20 }}
|
|
45
|
+
transition={{ duration: 0.3 }}
|
|
46
|
+
className="rounded-lg border border-bolt-elements-borderColor bg-bolt-elements-background-depth-2 p-4 mb-2"
|
|
47
|
+
>
|
|
48
|
+
<div className="flex items-start">
|
|
49
|
+
<motion.div
|
|
50
|
+
className="flex-shrink-0"
|
|
51
|
+
initial={{ scale: 0 }}
|
|
52
|
+
animate={{ scale: 1 }}
|
|
53
|
+
transition={{ delay: 0.2 }}
|
|
54
|
+
>
|
|
55
|
+
<div className={`${getErrorIcon()} text-xl text-bolt-elements-button-danger-text`}></div>
|
|
56
|
+
</motion.div>
|
|
57
|
+
|
|
58
|
+
<div className="ml-3 flex-1">
|
|
59
|
+
<motion.h3
|
|
60
|
+
initial={{ opacity: 0 }}
|
|
61
|
+
animate={{ opacity: 1 }}
|
|
62
|
+
transition={{ delay: 0.1 }}
|
|
63
|
+
className="text-sm font-medium text-bolt-elements-textPrimary"
|
|
64
|
+
>
|
|
65
|
+
{title}
|
|
66
|
+
</motion.h3>
|
|
67
|
+
|
|
68
|
+
<motion.div
|
|
69
|
+
initial={{ opacity: 0 }}
|
|
70
|
+
animate={{ opacity: 1 }}
|
|
71
|
+
transition={{ delay: 0.2 }}
|
|
72
|
+
className="mt-2 text-sm text-bolt-elements-textSecondary"
|
|
73
|
+
>
|
|
74
|
+
<p>{getErrorMessage()}</p>
|
|
75
|
+
|
|
76
|
+
{description && (
|
|
77
|
+
<div className="text-xs text-bolt-elements-textSecondary p-2 bg-bolt-elements-background-depth-3 rounded mt-4 mb-4">
|
|
78
|
+
Error Details: {description}
|
|
79
|
+
</div>
|
|
80
|
+
)}
|
|
81
|
+
</motion.div>
|
|
82
|
+
|
|
83
|
+
<motion.div
|
|
84
|
+
className="mt-4"
|
|
85
|
+
initial={{ opacity: 0, y: 10 }}
|
|
86
|
+
animate={{ opacity: 1, y: 0 }}
|
|
87
|
+
transition={{ delay: 0.3 }}
|
|
88
|
+
>
|
|
89
|
+
<div className="flex gap-2">
|
|
90
|
+
<button
|
|
91
|
+
onClick={clearAlert}
|
|
92
|
+
className={classNames(
|
|
93
|
+
'px-2 py-1.5 rounded-md text-sm font-medium',
|
|
94
|
+
'bg-bolt-elements-button-secondary-background',
|
|
95
|
+
'hover:bg-bolt-elements-button-secondary-backgroundHover',
|
|
96
|
+
'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-bolt-elements-button-secondary-background',
|
|
97
|
+
'text-bolt-elements-button-secondary-text',
|
|
98
|
+
)}
|
|
99
|
+
>
|
|
100
|
+
Dismiss
|
|
101
|
+
</button>
|
|
102
|
+
</div>
|
|
103
|
+
</motion.div>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
</motion.div>
|
|
107
|
+
</AnimatePresence>
|
|
108
|
+
);
|
|
109
|
+
}
|