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,233 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { motion } from 'framer-motion';
|
|
3
|
+
import { Button } from '~/components/ui/Button';
|
|
4
|
+
import { classNames } from '~/utils/classNames';
|
|
5
|
+
import { useGitHubConnection } from '~/lib/hooks';
|
|
6
|
+
|
|
7
|
+
interface ConnectionTestResult {
|
|
8
|
+
status: 'success' | 'error' | 'testing';
|
|
9
|
+
message: string;
|
|
10
|
+
timestamp?: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface GitHubConnectionProps {
|
|
14
|
+
connectionTest: ConnectionTestResult | null;
|
|
15
|
+
onTestConnection: () => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function GitHubConnection({ connectionTest, onTestConnection }: GitHubConnectionProps) {
|
|
19
|
+
const { isConnected, isLoading, isConnecting, connect, disconnect, error } = useGitHubConnection();
|
|
20
|
+
|
|
21
|
+
const [token, setToken] = React.useState('');
|
|
22
|
+
const [tokenType, setTokenType] = React.useState<'classic' | 'fine-grained'>('classic');
|
|
23
|
+
|
|
24
|
+
const handleConnect = async (e: React.FormEvent) => {
|
|
25
|
+
e.preventDefault();
|
|
26
|
+
console.log('handleConnect called with token:', token ? 'token provided' : 'no token', 'tokenType:', tokenType);
|
|
27
|
+
|
|
28
|
+
if (!token.trim()) {
|
|
29
|
+
console.log('No token provided, returning early');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
console.log('Calling connect function...');
|
|
35
|
+
await connect(token, tokenType);
|
|
36
|
+
console.log('Connect function completed successfully');
|
|
37
|
+
setToken(''); // Clear token on successful connection
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.log('Connect function failed:', error);
|
|
40
|
+
|
|
41
|
+
// Error handling is done in the hook
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
if (isLoading) {
|
|
46
|
+
return (
|
|
47
|
+
<div className="flex items-center justify-center p-8">
|
|
48
|
+
<div className="flex items-center gap-2">
|
|
49
|
+
<div className="i-ph:spinner-gap-bold animate-spin w-4 h-4" />
|
|
50
|
+
<span className="text-bolt-elements-textSecondary">Loading connection...</span>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<motion.div
|
|
58
|
+
className="bg-bolt-elements-background dark:bg-bolt-elements-background border border-bolt-elements-borderColor dark:border-bolt-elements-borderColor rounded-lg"
|
|
59
|
+
initial={{ opacity: 0, y: 20 }}
|
|
60
|
+
animate={{ opacity: 1, y: 0 }}
|
|
61
|
+
transition={{ delay: 0.2 }}
|
|
62
|
+
>
|
|
63
|
+
<div className="p-6 space-y-6">
|
|
64
|
+
{!isConnected && (
|
|
65
|
+
<div className="text-xs text-bolt-elements-textSecondary bg-bolt-elements-background-depth-1 dark:bg-bolt-elements-background-depth-1 p-3 rounded-lg mb-4">
|
|
66
|
+
<p className="flex items-center gap-1 mb-1">
|
|
67
|
+
<span className="i-ph:lightbulb w-3.5 h-3.5 text-bolt-elements-icon-success dark:text-bolt-elements-icon-success" />
|
|
68
|
+
<span className="font-medium">Tip:</span> You can also set the{' '}
|
|
69
|
+
<code className="px-1 py-0.5 bg-bolt-elements-background-depth-2 dark:bg-bolt-elements-background-depth-2 rounded">
|
|
70
|
+
VITE_GITHUB_ACCESS_TOKEN
|
|
71
|
+
</code>{' '}
|
|
72
|
+
environment variable to connect automatically.
|
|
73
|
+
</p>
|
|
74
|
+
<p>
|
|
75
|
+
For fine-grained tokens, also set{' '}
|
|
76
|
+
<code className="px-1 py-0.5 bg-bolt-elements-background-depth-2 dark:bg-bolt-elements-background-depth-2 rounded">
|
|
77
|
+
VITE_GITHUB_TOKEN_TYPE=fine-grained
|
|
78
|
+
</code>
|
|
79
|
+
</p>
|
|
80
|
+
</div>
|
|
81
|
+
)}
|
|
82
|
+
|
|
83
|
+
<form onSubmit={handleConnect} className="space-y-4">
|
|
84
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
85
|
+
<div>
|
|
86
|
+
<label className="block text-sm text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary mb-2">
|
|
87
|
+
Token Type
|
|
88
|
+
</label>
|
|
89
|
+
<select
|
|
90
|
+
value={tokenType}
|
|
91
|
+
onChange={(e) => setTokenType(e.target.value as 'classic' | 'fine-grained')}
|
|
92
|
+
disabled={isConnecting || isConnected}
|
|
93
|
+
className={classNames(
|
|
94
|
+
'w-full px-3 py-2 rounded-lg text-sm',
|
|
95
|
+
'bg-bolt-elements-background-depth-1 dark:bg-bolt-elements-background-depth-1',
|
|
96
|
+
'border border-bolt-elements-borderColor dark:border-bolt-elements-borderColor',
|
|
97
|
+
'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
|
|
98
|
+
'focus:outline-none focus:ring-1 focus:ring-bolt-elements-item-contentAccent dark:focus:ring-bolt-elements-item-contentAccent',
|
|
99
|
+
'disabled:opacity-50',
|
|
100
|
+
)}
|
|
101
|
+
>
|
|
102
|
+
<option value="classic">Personal Access Token (Classic)</option>
|
|
103
|
+
<option value="fine-grained">Fine-grained Token</option>
|
|
104
|
+
</select>
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
<div>
|
|
108
|
+
<label className="block text-sm text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary mb-2">
|
|
109
|
+
{tokenType === 'classic' ? 'Personal Access Token' : 'Fine-grained Token'}
|
|
110
|
+
</label>
|
|
111
|
+
<input
|
|
112
|
+
type="password"
|
|
113
|
+
value={token}
|
|
114
|
+
onChange={(e) => setToken(e.target.value)}
|
|
115
|
+
disabled={isConnecting || isConnected}
|
|
116
|
+
placeholder={`Enter your GitHub ${
|
|
117
|
+
tokenType === 'classic' ? 'personal access token' : 'fine-grained token'
|
|
118
|
+
}`}
|
|
119
|
+
className={classNames(
|
|
120
|
+
'w-full px-3 py-2 rounded-lg text-sm',
|
|
121
|
+
'bg-[#F8F8F8] dark:bg-[#1A1A1A]',
|
|
122
|
+
'border border-[#E5E5E5] dark:border-[#333333]',
|
|
123
|
+
'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary',
|
|
124
|
+
'focus:outline-none focus:ring-1 focus:ring-bolt-elements-borderColorActive',
|
|
125
|
+
'disabled:opacity-50',
|
|
126
|
+
)}
|
|
127
|
+
/>
|
|
128
|
+
<div className="mt-2 text-sm text-bolt-elements-textSecondary">
|
|
129
|
+
<a
|
|
130
|
+
href={`https://github.com/settings/tokens${tokenType === 'fine-grained' ? '/beta' : '/new'}`}
|
|
131
|
+
target="_blank"
|
|
132
|
+
rel="noopener noreferrer"
|
|
133
|
+
className="text-bolt-elements-borderColorActive hover:underline inline-flex items-center gap-1"
|
|
134
|
+
>
|
|
135
|
+
Get your token
|
|
136
|
+
<div className="i-ph:arrow-square-out w-4 h-4" />
|
|
137
|
+
</a>
|
|
138
|
+
<span className="mx-2">•</span>
|
|
139
|
+
<span>
|
|
140
|
+
Required scopes:{' '}
|
|
141
|
+
{tokenType === 'classic' ? 'repo, read:org, read:user' : 'Repository access, Organization access'}
|
|
142
|
+
</span>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
{error && (
|
|
148
|
+
<div className="p-4 rounded-lg bg-red-50 border border-red-200 dark:bg-red-900/20 dark:border-red-700">
|
|
149
|
+
<p className="text-sm text-red-800 dark:text-red-200">{error}</p>
|
|
150
|
+
</div>
|
|
151
|
+
)}
|
|
152
|
+
|
|
153
|
+
<div className="flex items-center justify-between">
|
|
154
|
+
{!isConnected ? (
|
|
155
|
+
<button
|
|
156
|
+
type="submit"
|
|
157
|
+
disabled={isConnecting || !token.trim()}
|
|
158
|
+
className={classNames(
|
|
159
|
+
'px-4 py-2 rounded-lg text-sm flex items-center gap-2',
|
|
160
|
+
'bg-[#303030] text-white',
|
|
161
|
+
'hover:bg-[#5E41D0] hover:text-white',
|
|
162
|
+
'disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-200',
|
|
163
|
+
'transform active:scale-95',
|
|
164
|
+
)}
|
|
165
|
+
>
|
|
166
|
+
{isConnecting ? (
|
|
167
|
+
<>
|
|
168
|
+
<div className="i-ph:spinner-gap animate-spin" />
|
|
169
|
+
Connecting...
|
|
170
|
+
</>
|
|
171
|
+
) : (
|
|
172
|
+
<>
|
|
173
|
+
<div className="i-ph:plug-charging w-4 h-4" />
|
|
174
|
+
Connect
|
|
175
|
+
</>
|
|
176
|
+
)}
|
|
177
|
+
</button>
|
|
178
|
+
) : (
|
|
179
|
+
<div className="flex items-center justify-between w-full">
|
|
180
|
+
<div className="flex items-center gap-4">
|
|
181
|
+
<button
|
|
182
|
+
onClick={disconnect}
|
|
183
|
+
type="button"
|
|
184
|
+
className={classNames(
|
|
185
|
+
'px-4 py-2 rounded-lg text-sm flex items-center gap-2',
|
|
186
|
+
'bg-red-500 text-white',
|
|
187
|
+
'hover:bg-red-600',
|
|
188
|
+
)}
|
|
189
|
+
>
|
|
190
|
+
<div className="i-ph:plug w-4 h-4" />
|
|
191
|
+
Disconnect
|
|
192
|
+
</button>
|
|
193
|
+
<span className="text-sm text-bolt-elements-textSecondary flex items-center gap-1">
|
|
194
|
+
<div className="i-ph:check-circle w-4 h-4 text-green-500" />
|
|
195
|
+
Connected to GitHub
|
|
196
|
+
</span>
|
|
197
|
+
</div>
|
|
198
|
+
<div className="flex items-center gap-2">
|
|
199
|
+
<Button
|
|
200
|
+
variant="outline"
|
|
201
|
+
onClick={() => window.open('https://github.com/dashboard', '_blank', 'noopener,noreferrer')}
|
|
202
|
+
className="flex items-center gap-2 hover:bg-bolt-elements-item-backgroundActive/10 hover:text-bolt-elements-textPrimary dark:hover:text-bolt-elements-textPrimary transition-colors"
|
|
203
|
+
>
|
|
204
|
+
<div className="i-ph:layout w-4 h-4" />
|
|
205
|
+
Dashboard
|
|
206
|
+
</Button>
|
|
207
|
+
<Button
|
|
208
|
+
onClick={onTestConnection}
|
|
209
|
+
disabled={connectionTest?.status === 'testing'}
|
|
210
|
+
variant="outline"
|
|
211
|
+
className="flex items-center gap-2 hover:bg-bolt-elements-item-backgroundActive/10 hover:text-bolt-elements-textPrimary dark:hover:text-bolt-elements-textPrimary transition-colors"
|
|
212
|
+
>
|
|
213
|
+
{connectionTest?.status === 'testing' ? (
|
|
214
|
+
<>
|
|
215
|
+
<div className="i-ph:spinner-gap w-4 h-4 animate-spin" />
|
|
216
|
+
Testing...
|
|
217
|
+
</>
|
|
218
|
+
) : (
|
|
219
|
+
<>
|
|
220
|
+
<div className="i-ph:plug-charging w-4 h-4" />
|
|
221
|
+
Test Connection
|
|
222
|
+
</>
|
|
223
|
+
)}
|
|
224
|
+
</Button>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
)}
|
|
228
|
+
</div>
|
|
229
|
+
</form>
|
|
230
|
+
</div>
|
|
231
|
+
</motion.div>
|
|
232
|
+
);
|
|
233
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import React, { Component } from 'react';
|
|
2
|
+
import type { ReactNode, ErrorInfo } from 'react';
|
|
3
|
+
import { Button } from '~/components/ui/Button';
|
|
4
|
+
import { AlertTriangle } from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
fallback?: ReactNode;
|
|
9
|
+
onError?: (error: Error, errorInfo: ErrorInfo) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface State {
|
|
13
|
+
hasError: boolean;
|
|
14
|
+
error: Error | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class GitHubErrorBoundary extends Component<Props, State> {
|
|
18
|
+
constructor(props: Props) {
|
|
19
|
+
super(props);
|
|
20
|
+
this.state = { hasError: false, error: null };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
static getDerivedStateFromError(error: Error): State {
|
|
24
|
+
return { hasError: true, error };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
componentDidCatch(error: Error, errorInfo: ErrorInfo) {
|
|
28
|
+
console.error('GitHub Error Boundary caught an error:', error, errorInfo);
|
|
29
|
+
|
|
30
|
+
if (this.props.onError) {
|
|
31
|
+
this.props.onError(error, errorInfo);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
handleRetry = () => {
|
|
36
|
+
this.setState({ hasError: false, error: null });
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
render() {
|
|
40
|
+
if (this.state.hasError) {
|
|
41
|
+
if (this.props.fallback) {
|
|
42
|
+
return this.props.fallback;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<div className="flex flex-col items-center justify-center p-8 text-center space-y-4 bg-bolt-elements-background-depth-1 border border-bolt-elements-borderColor rounded-lg">
|
|
47
|
+
<div className="w-12 h-12 rounded-full bg-red-50 dark:bg-red-900/20 flex items-center justify-center">
|
|
48
|
+
<AlertTriangle className="w-6 h-6 text-red-500" />
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<div>
|
|
52
|
+
<h3 className="text-lg font-medium text-bolt-elements-textPrimary mb-2">GitHub Integration Error</h3>
|
|
53
|
+
<p className="text-sm text-bolt-elements-textSecondary mb-4 max-w-md">
|
|
54
|
+
Something went wrong while loading GitHub data. This could be due to network issues, API limits, or a
|
|
55
|
+
temporary problem.
|
|
56
|
+
</p>
|
|
57
|
+
|
|
58
|
+
{this.state.error && (
|
|
59
|
+
<details className="text-xs text-bolt-elements-textTertiary mb-4">
|
|
60
|
+
<summary className="cursor-pointer hover:text-bolt-elements-textSecondary">Show error details</summary>
|
|
61
|
+
<pre className="mt-2 p-2 bg-bolt-elements-background-depth-2 rounded text-left overflow-auto">
|
|
62
|
+
{this.state.error.message}
|
|
63
|
+
</pre>
|
|
64
|
+
</details>
|
|
65
|
+
)}
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div className="flex gap-2">
|
|
69
|
+
<Button variant="outline" size="sm" onClick={this.handleRetry}>
|
|
70
|
+
Try Again
|
|
71
|
+
</Button>
|
|
72
|
+
<Button variant="outline" size="sm" onClick={() => window.location.reload()}>
|
|
73
|
+
Reload Page
|
|
74
|
+
</Button>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return this.props.children;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Higher-order component for wrapping components with error boundary
|
|
85
|
+
export function withGitHubErrorBoundary<P extends object>(component: React.ComponentType<P>) {
|
|
86
|
+
return function WrappedComponent(props: P) {
|
|
87
|
+
return <GitHubErrorBoundary>{React.createElement(component, props)}</GitHubErrorBoundary>;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Hook for handling async errors in GitHub operations
|
|
92
|
+
export function useGitHubErrorHandler() {
|
|
93
|
+
const handleError = React.useCallback((error: unknown, context?: string) => {
|
|
94
|
+
console.error(`GitHub Error ${context ? `(${context})` : ''}:`, error);
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* You could integrate with error tracking services here
|
|
98
|
+
* For example: Sentry, LogRocket, etc.
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
return error instanceof Error ? error.message : 'An unknown error occurred';
|
|
102
|
+
}, []);
|
|
103
|
+
|
|
104
|
+
return { handleError };
|
|
105
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import React, { useState, useCallback, useMemo } from 'react';
|
|
2
|
+
import { motion, AnimatePresence } from 'framer-motion';
|
|
3
|
+
import { Button } from '~/components/ui/Button';
|
|
4
|
+
import { classNames } from '~/utils/classNames';
|
|
5
|
+
import { Loader2, ChevronDown, RefreshCw, AlertCircle, CheckCircle } from 'lucide-react';
|
|
6
|
+
|
|
7
|
+
interface ProgressiveLoaderProps {
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
isRefreshing?: boolean;
|
|
10
|
+
error?: string | null;
|
|
11
|
+
onRetry?: () => void;
|
|
12
|
+
onRefresh?: () => void;
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
className?: string;
|
|
15
|
+
loadingMessage?: string;
|
|
16
|
+
refreshingMessage?: string;
|
|
17
|
+
showProgress?: boolean;
|
|
18
|
+
progressSteps?: Array<{
|
|
19
|
+
key: string;
|
|
20
|
+
label: string;
|
|
21
|
+
completed: boolean;
|
|
22
|
+
loading?: boolean;
|
|
23
|
+
error?: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function GitHubProgressiveLoader({
|
|
28
|
+
isLoading,
|
|
29
|
+
isRefreshing = false,
|
|
30
|
+
error,
|
|
31
|
+
onRetry,
|
|
32
|
+
onRefresh,
|
|
33
|
+
children,
|
|
34
|
+
className = '',
|
|
35
|
+
loadingMessage = 'Loading...',
|
|
36
|
+
refreshingMessage = 'Refreshing...',
|
|
37
|
+
showProgress = false,
|
|
38
|
+
progressSteps = [],
|
|
39
|
+
}: ProgressiveLoaderProps) {
|
|
40
|
+
const [isExpanded, setIsExpanded] = useState(false);
|
|
41
|
+
|
|
42
|
+
// Calculate progress percentage
|
|
43
|
+
const progress = useMemo(() => {
|
|
44
|
+
if (!showProgress || progressSteps.length === 0) {
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const completed = progressSteps.filter((step) => step.completed).length;
|
|
49
|
+
|
|
50
|
+
return Math.round((completed / progressSteps.length) * 100);
|
|
51
|
+
}, [showProgress, progressSteps]);
|
|
52
|
+
|
|
53
|
+
const handleToggleExpanded = useCallback(() => {
|
|
54
|
+
setIsExpanded((prev) => !prev);
|
|
55
|
+
}, []);
|
|
56
|
+
|
|
57
|
+
// Loading state with progressive steps
|
|
58
|
+
if (isLoading) {
|
|
59
|
+
return (
|
|
60
|
+
<div className={classNames('flex flex-col items-center justify-center py-8', className)}>
|
|
61
|
+
<div className="relative mb-4">
|
|
62
|
+
<Loader2 className="w-8 h-8 animate-spin text-bolt-elements-item-contentAccent" />
|
|
63
|
+
{showProgress && progress > 0 && (
|
|
64
|
+
<div className="absolute inset-0 flex items-center justify-center">
|
|
65
|
+
<span className="text-xs font-medium text-bolt-elements-item-contentAccent">{progress}%</span>
|
|
66
|
+
</div>
|
|
67
|
+
)}
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<div className="text-center space-y-2">
|
|
71
|
+
<p className="text-sm font-medium text-bolt-elements-textPrimary">{loadingMessage}</p>
|
|
72
|
+
|
|
73
|
+
{showProgress && progressSteps.length > 0 && (
|
|
74
|
+
<div className="w-full max-w-sm">
|
|
75
|
+
{/* Progress bar */}
|
|
76
|
+
<div className="w-full bg-bolt-elements-background-depth-2 rounded-full h-2 mb-3">
|
|
77
|
+
<motion.div
|
|
78
|
+
className="bg-bolt-elements-item-contentAccent h-2 rounded-full"
|
|
79
|
+
initial={{ width: 0 }}
|
|
80
|
+
animate={{ width: `${progress}%` }}
|
|
81
|
+
transition={{ duration: 0.5, ease: 'easeOut' }}
|
|
82
|
+
/>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
{/* Steps toggle */}
|
|
86
|
+
<button
|
|
87
|
+
onClick={handleToggleExpanded}
|
|
88
|
+
className="flex items-center justify-center gap-2 text-xs text-bolt-elements-textSecondary hover:text-bolt-elements-textPrimary transition-colors"
|
|
89
|
+
>
|
|
90
|
+
<span>Show details</span>
|
|
91
|
+
<ChevronDown
|
|
92
|
+
className={classNames(
|
|
93
|
+
'w-3 h-3 transform transition-transform duration-200',
|
|
94
|
+
isExpanded ? 'rotate-180' : '',
|
|
95
|
+
)}
|
|
96
|
+
/>
|
|
97
|
+
</button>
|
|
98
|
+
|
|
99
|
+
{/* Progress steps */}
|
|
100
|
+
<AnimatePresence>
|
|
101
|
+
{isExpanded && (
|
|
102
|
+
<motion.div
|
|
103
|
+
initial={{ opacity: 0, height: 0 }}
|
|
104
|
+
animate={{ opacity: 1, height: 'auto' }}
|
|
105
|
+
exit={{ opacity: 0, height: 0 }}
|
|
106
|
+
transition={{ duration: 0.2 }}
|
|
107
|
+
className="mt-3 space-y-2 overflow-hidden"
|
|
108
|
+
>
|
|
109
|
+
{progressSteps.map((step) => (
|
|
110
|
+
<div key={step.key} className="flex items-center gap-2 text-xs">
|
|
111
|
+
{step.error ? (
|
|
112
|
+
<AlertCircle className="w-3 h-3 text-red-500 flex-shrink-0" />
|
|
113
|
+
) : step.completed ? (
|
|
114
|
+
<CheckCircle className="w-3 h-3 text-green-500 flex-shrink-0" />
|
|
115
|
+
) : step.loading ? (
|
|
116
|
+
<Loader2 className="w-3 h-3 animate-spin text-bolt-elements-item-contentAccent flex-shrink-0" />
|
|
117
|
+
) : (
|
|
118
|
+
<div className="w-3 h-3 rounded-full border border-bolt-elements-borderColor flex-shrink-0" />
|
|
119
|
+
)}
|
|
120
|
+
<span
|
|
121
|
+
className={classNames(
|
|
122
|
+
step.error
|
|
123
|
+
? 'text-red-500'
|
|
124
|
+
: step.completed
|
|
125
|
+
? 'text-green-600 dark:text-green-400'
|
|
126
|
+
: step.loading
|
|
127
|
+
? 'text-bolt-elements-textPrimary'
|
|
128
|
+
: 'text-bolt-elements-textSecondary',
|
|
129
|
+
)}
|
|
130
|
+
>
|
|
131
|
+
{step.label}
|
|
132
|
+
</span>
|
|
133
|
+
</div>
|
|
134
|
+
))}
|
|
135
|
+
</motion.div>
|
|
136
|
+
)}
|
|
137
|
+
</AnimatePresence>
|
|
138
|
+
</div>
|
|
139
|
+
)}
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Error state
|
|
146
|
+
if (error) {
|
|
147
|
+
return (
|
|
148
|
+
<div className={classNames('flex flex-col items-center justify-center py-8 text-center space-y-4', className)}>
|
|
149
|
+
<div className="w-10 h-10 rounded-full bg-red-50 dark:bg-red-900/20 flex items-center justify-center">
|
|
150
|
+
<AlertCircle className="w-5 h-5 text-red-500" />
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
<div>
|
|
154
|
+
<h3 className="text-sm font-medium text-bolt-elements-textPrimary mb-1">Failed to Load</h3>
|
|
155
|
+
<p className="text-xs text-bolt-elements-textSecondary mb-4 max-w-sm">{error}</p>
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
<div className="flex gap-2">
|
|
159
|
+
{onRetry && (
|
|
160
|
+
<Button variant="outline" size="sm" onClick={onRetry} className="text-xs">
|
|
161
|
+
<RefreshCw className="w-3 h-3 mr-1" />
|
|
162
|
+
Try Again
|
|
163
|
+
</Button>
|
|
164
|
+
)}
|
|
165
|
+
{onRefresh && (
|
|
166
|
+
<Button variant="outline" size="sm" onClick={onRefresh} className="text-xs">
|
|
167
|
+
<RefreshCw className="w-3 h-3 mr-1" />
|
|
168
|
+
Refresh
|
|
169
|
+
</Button>
|
|
170
|
+
)}
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Success state - render children with optional refresh indicator
|
|
177
|
+
return (
|
|
178
|
+
<div className={classNames('relative', className)}>
|
|
179
|
+
{isRefreshing && (
|
|
180
|
+
<div className="absolute top-0 right-0 z-10">
|
|
181
|
+
<div className="flex items-center gap-2 px-2 py-1 bg-bolt-elements-background-depth-1 border border-bolt-elements-borderColor rounded-lg shadow-sm">
|
|
182
|
+
<Loader2 className="w-3 h-3 animate-spin text-bolt-elements-item-contentAccent" />
|
|
183
|
+
<span className="text-xs text-bolt-elements-textSecondary">{refreshingMessage}</span>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
)}
|
|
187
|
+
|
|
188
|
+
{children}
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Hook for managing progressive loading steps
|
|
194
|
+
export function useProgressiveLoader() {
|
|
195
|
+
const [steps, setSteps] = useState<
|
|
196
|
+
Array<{
|
|
197
|
+
key: string;
|
|
198
|
+
label: string;
|
|
199
|
+
completed: boolean;
|
|
200
|
+
loading?: boolean;
|
|
201
|
+
error?: boolean;
|
|
202
|
+
}>
|
|
203
|
+
>([]);
|
|
204
|
+
|
|
205
|
+
const addStep = useCallback((key: string, label: string) => {
|
|
206
|
+
setSteps((prev) => [
|
|
207
|
+
...prev.filter((step) => step.key !== key),
|
|
208
|
+
{ key, label, completed: false, loading: false, error: false },
|
|
209
|
+
]);
|
|
210
|
+
}, []);
|
|
211
|
+
|
|
212
|
+
const updateStep = useCallback(
|
|
213
|
+
(
|
|
214
|
+
key: string,
|
|
215
|
+
updates: {
|
|
216
|
+
completed?: boolean;
|
|
217
|
+
loading?: boolean;
|
|
218
|
+
error?: boolean;
|
|
219
|
+
label?: string;
|
|
220
|
+
},
|
|
221
|
+
) => {
|
|
222
|
+
setSteps((prev) => prev.map((step) => (step.key === key ? { ...step, ...updates } : step)));
|
|
223
|
+
},
|
|
224
|
+
[],
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
const removeStep = useCallback((key: string) => {
|
|
228
|
+
setSteps((prev) => prev.filter((step) => step.key !== key));
|
|
229
|
+
}, []);
|
|
230
|
+
|
|
231
|
+
const clearSteps = useCallback(() => {
|
|
232
|
+
setSteps([]);
|
|
233
|
+
}, []);
|
|
234
|
+
|
|
235
|
+
const startStep = useCallback(
|
|
236
|
+
(key: string) => {
|
|
237
|
+
updateStep(key, { loading: true, error: false });
|
|
238
|
+
},
|
|
239
|
+
[updateStep],
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
const completeStep = useCallback(
|
|
243
|
+
(key: string) => {
|
|
244
|
+
updateStep(key, { completed: true, loading: false, error: false });
|
|
245
|
+
},
|
|
246
|
+
[updateStep],
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
const errorStep = useCallback(
|
|
250
|
+
(key: string) => {
|
|
251
|
+
updateStep(key, { error: true, loading: false });
|
|
252
|
+
},
|
|
253
|
+
[updateStep],
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
return {
|
|
257
|
+
steps,
|
|
258
|
+
addStep,
|
|
259
|
+
updateStep,
|
|
260
|
+
removeStep,
|
|
261
|
+
clearSteps,
|
|
262
|
+
startStep,
|
|
263
|
+
completeStep,
|
|
264
|
+
errorStep,
|
|
265
|
+
};
|
|
266
|
+
}
|