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,368 @@
|
|
|
1
|
+
import React, { useEffect, useState, useRef } from 'react';
|
|
2
|
+
import { motion } from 'framer-motion';
|
|
3
|
+
import { toast } from 'react-toastify';
|
|
4
|
+
import { useStore } from '@nanostores/react';
|
|
5
|
+
import { logStore } from '~/lib/stores/logs';
|
|
6
|
+
import { classNames } from '~/utils/classNames';
|
|
7
|
+
import {
|
|
8
|
+
vercelConnection,
|
|
9
|
+
isConnecting,
|
|
10
|
+
isFetchingStats,
|
|
11
|
+
updateVercelConnection,
|
|
12
|
+
fetchVercelStats,
|
|
13
|
+
autoConnectVercel,
|
|
14
|
+
} from '~/lib/stores/vercel';
|
|
15
|
+
|
|
16
|
+
export default function VercelConnection() {
|
|
17
|
+
console.log('VercelConnection component mounted');
|
|
18
|
+
|
|
19
|
+
const connection = useStore(vercelConnection);
|
|
20
|
+
const connecting = useStore(isConnecting);
|
|
21
|
+
const fetchingStats = useStore(isFetchingStats);
|
|
22
|
+
const [isProjectsExpanded, setIsProjectsExpanded] = useState(false);
|
|
23
|
+
const hasInitialized = useRef(false);
|
|
24
|
+
|
|
25
|
+
console.log('VercelConnection initial state:', {
|
|
26
|
+
connection: {
|
|
27
|
+
user: connection.user,
|
|
28
|
+
token: connection.token ? '[TOKEN_EXISTS]' : '[NO_TOKEN]',
|
|
29
|
+
},
|
|
30
|
+
envToken: import.meta.env?.VITE_VERCEL_ACCESS_TOKEN ? '[ENV_TOKEN_EXISTS]' : '[NO_ENV_TOKEN]',
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
// Prevent multiple initializations
|
|
35
|
+
if (hasInitialized.current) {
|
|
36
|
+
console.log('Vercel: Already initialized, skipping');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const initializeConnection = async () => {
|
|
41
|
+
console.log('Vercel initializeConnection:', {
|
|
42
|
+
user: connection.user,
|
|
43
|
+
token: connection.token ? '[TOKEN_EXISTS]' : '[NO_TOKEN]',
|
|
44
|
+
envToken: import.meta.env?.VITE_VERCEL_ACCESS_TOKEN ? '[ENV_TOKEN_EXISTS]' : '[NO_ENV_TOKEN]',
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
hasInitialized.current = true;
|
|
48
|
+
|
|
49
|
+
// Auto-connect using environment variable if no existing connection but token exists
|
|
50
|
+
if (!connection.user && connection.token && import.meta.env?.VITE_VERCEL_ACCESS_TOKEN) {
|
|
51
|
+
console.log('Vercel: Attempting auto-connection');
|
|
52
|
+
|
|
53
|
+
const result = await autoConnectVercel();
|
|
54
|
+
|
|
55
|
+
if (result.success) {
|
|
56
|
+
toast.success('Connected to Vercel automatically');
|
|
57
|
+
} else {
|
|
58
|
+
console.error('Vercel auto-connection failed:', result.error);
|
|
59
|
+
}
|
|
60
|
+
} else if (connection.user && connection.token) {
|
|
61
|
+
// Fetch stats for existing connection
|
|
62
|
+
console.log('Vercel: Fetching stats for existing connection');
|
|
63
|
+
await fetchVercelStats(connection.token);
|
|
64
|
+
} else {
|
|
65
|
+
console.log('Vercel: No auto-connection conditions met');
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
initializeConnection();
|
|
70
|
+
}, []); // Empty dependency array to run only once
|
|
71
|
+
|
|
72
|
+
const handleConnect = async (event: React.FormEvent) => {
|
|
73
|
+
event.preventDefault();
|
|
74
|
+
isConnecting.set(true);
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
const response = await fetch('https://api.vercel.com/v2/user', {
|
|
78
|
+
headers: {
|
|
79
|
+
Authorization: `Bearer ${connection.token}`,
|
|
80
|
+
'Content-Type': 'application/json',
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
throw new Error('Invalid token or unauthorized');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const userData = (await response.json()) as any;
|
|
89
|
+
updateVercelConnection({
|
|
90
|
+
user: userData.user || userData, // Handle both possible structures
|
|
91
|
+
token: connection.token,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
await fetchVercelStats(connection.token);
|
|
95
|
+
toast.success('Successfully connected to Vercel');
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.error('Auth error:', error);
|
|
98
|
+
logStore.logError('Failed to authenticate with Vercel', { error });
|
|
99
|
+
toast.error('Failed to connect to Vercel');
|
|
100
|
+
updateVercelConnection({ user: null, token: '' });
|
|
101
|
+
} finally {
|
|
102
|
+
isConnecting.set(false);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const handleDisconnect = () => {
|
|
107
|
+
updateVercelConnection({ user: null, token: '' });
|
|
108
|
+
toast.success('Disconnected from Vercel');
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
console.log('connection', connection);
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
<motion.div
|
|
115
|
+
className="bg-[#FFFFFF] dark:bg-[#0A0A0A] rounded-lg border border-[#E5E5E5] dark:border-[#1A1A1A]"
|
|
116
|
+
initial={{ opacity: 0, y: 20 }}
|
|
117
|
+
animate={{ opacity: 1, y: 0 }}
|
|
118
|
+
transition={{ delay: 0.3 }}
|
|
119
|
+
>
|
|
120
|
+
<div className="p-6 space-y-6">
|
|
121
|
+
<div className="flex items-center justify-between">
|
|
122
|
+
<div className="flex items-center gap-2">
|
|
123
|
+
<img
|
|
124
|
+
className="w-5 h-5 dark:invert"
|
|
125
|
+
height="24"
|
|
126
|
+
width="24"
|
|
127
|
+
crossOrigin="anonymous"
|
|
128
|
+
src={`https://cdn.simpleicons.org/vercel/black`}
|
|
129
|
+
/>
|
|
130
|
+
<h3 className="text-base font-medium text-bolt-elements-textPrimary">Vercel Connection</h3>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
{!connection.user ? (
|
|
135
|
+
<div className="space-y-4">
|
|
136
|
+
<div>
|
|
137
|
+
<label className="block text-sm text-bolt-elements-textSecondary mb-2">Personal Access Token</label>
|
|
138
|
+
<input
|
|
139
|
+
type="password"
|
|
140
|
+
value={connection.token}
|
|
141
|
+
onChange={(e) => updateVercelConnection({ ...connection, token: e.target.value })}
|
|
142
|
+
disabled={connecting}
|
|
143
|
+
placeholder="Enter your Vercel personal access token"
|
|
144
|
+
className={classNames(
|
|
145
|
+
'w-full px-3 py-2 rounded-lg text-sm',
|
|
146
|
+
'bg-[#F8F8F8] dark:bg-[#1A1A1A]',
|
|
147
|
+
'border border-[#E5E5E5] dark:border-[#333333]',
|
|
148
|
+
'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary',
|
|
149
|
+
'focus:outline-none focus:ring-1 focus:ring-bolt-elements-borderColorActive',
|
|
150
|
+
'disabled:opacity-50',
|
|
151
|
+
)}
|
|
152
|
+
/>
|
|
153
|
+
<div className="mt-2 text-sm text-bolt-elements-textSecondary">
|
|
154
|
+
<a
|
|
155
|
+
href="https://vercel.com/account/tokens"
|
|
156
|
+
target="_blank"
|
|
157
|
+
rel="noopener noreferrer"
|
|
158
|
+
className="text-bolt-elements-borderColorActive hover:underline inline-flex items-center gap-1"
|
|
159
|
+
>
|
|
160
|
+
Get your token
|
|
161
|
+
<div className="i-ph:arrow-square-out w-4 h-4" />
|
|
162
|
+
</a>
|
|
163
|
+
<div className="mt-2 text-xs text-bolt-elements-textSecondary bg-bolt-elements-background-depth-1 p-2 rounded">
|
|
164
|
+
<p className="flex items-center gap-1">
|
|
165
|
+
<span className="i-ph:lightbulb w-3.5 h-3.5 text-bolt-elements-icon-success" />
|
|
166
|
+
<span className="font-medium">Tip:</span> You can also set{' '}
|
|
167
|
+
<code className="px-1 py-0.5 bg-bolt-elements-background-depth-2 rounded text-xs">
|
|
168
|
+
VITE_VERCEL_ACCESS_TOKEN
|
|
169
|
+
</code>{' '}
|
|
170
|
+
in your .env.local for automatic connection.
|
|
171
|
+
</p>
|
|
172
|
+
</div>
|
|
173
|
+
{/* Debug info - remove this later */}
|
|
174
|
+
<div className="mt-2 text-xs text-gray-500">
|
|
175
|
+
<p>Debug: Token present: {connection.token ? '✅' : '❌'}</p>
|
|
176
|
+
<p>Debug: User present: {connection.user ? '✅' : '❌'}</p>
|
|
177
|
+
<p>Debug: Env token: {import.meta.env?.VITE_VERCEL_ACCESS_TOKEN ? '✅' : '❌'}</p>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
<div className="flex gap-2">
|
|
183
|
+
<button
|
|
184
|
+
onClick={handleConnect}
|
|
185
|
+
disabled={connecting || !connection.token}
|
|
186
|
+
className={classNames(
|
|
187
|
+
'px-4 py-2 rounded-lg text-sm flex items-center gap-2',
|
|
188
|
+
'bg-[#303030] text-white',
|
|
189
|
+
'hover:bg-[#5E41D0] hover:text-white',
|
|
190
|
+
'disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-200',
|
|
191
|
+
'transform active:scale-95',
|
|
192
|
+
)}
|
|
193
|
+
>
|
|
194
|
+
{connecting ? (
|
|
195
|
+
<>
|
|
196
|
+
<div className="i-ph:spinner-gap animate-spin" />
|
|
197
|
+
Connecting...
|
|
198
|
+
</>
|
|
199
|
+
) : (
|
|
200
|
+
<>
|
|
201
|
+
<div className="i-ph:plug-charging w-4 h-4" />
|
|
202
|
+
Connect
|
|
203
|
+
</>
|
|
204
|
+
)}
|
|
205
|
+
</button>
|
|
206
|
+
|
|
207
|
+
{/* Debug button - remove this later */}
|
|
208
|
+
<button
|
|
209
|
+
onClick={async () => {
|
|
210
|
+
console.log('Manual auto-connect test');
|
|
211
|
+
|
|
212
|
+
const result = await autoConnectVercel();
|
|
213
|
+
|
|
214
|
+
if (result.success) {
|
|
215
|
+
toast.success('Manual auto-connect successful');
|
|
216
|
+
} else {
|
|
217
|
+
toast.error(`Manual auto-connect failed: ${result.error}`);
|
|
218
|
+
}
|
|
219
|
+
}}
|
|
220
|
+
className="px-3 py-2 rounded-lg text-xs bg-blue-500 text-white hover:bg-blue-600"
|
|
221
|
+
>
|
|
222
|
+
Test Auto-Connect
|
|
223
|
+
</button>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
) : (
|
|
227
|
+
<div className="space-y-6">
|
|
228
|
+
<div className="flex items-center justify-between">
|
|
229
|
+
<div className="flex items-center gap-3">
|
|
230
|
+
<button
|
|
231
|
+
onClick={handleDisconnect}
|
|
232
|
+
className={classNames(
|
|
233
|
+
'px-4 py-2 rounded-lg text-sm flex items-center gap-2',
|
|
234
|
+
'bg-red-500 text-white',
|
|
235
|
+
'hover:bg-red-600',
|
|
236
|
+
)}
|
|
237
|
+
>
|
|
238
|
+
<div className="i-ph:plug w-4 h-4" />
|
|
239
|
+
Disconnect
|
|
240
|
+
</button>
|
|
241
|
+
<span className="text-sm text-bolt-elements-textSecondary flex items-center gap-1">
|
|
242
|
+
<div className="i-ph:check-circle w-4 h-4 text-green-500" />
|
|
243
|
+
Connected to Vercel
|
|
244
|
+
</span>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
|
|
248
|
+
<div className="flex items-center gap-4 p-4 bg-[#F8F8F8] dark:bg-[#1A1A1A] rounded-lg">
|
|
249
|
+
{/* Debug output */}
|
|
250
|
+
<pre className="hidden">{JSON.stringify(connection.user, null, 2)}</pre>
|
|
251
|
+
|
|
252
|
+
<img
|
|
253
|
+
src={`https://vercel.com/api/www/avatar?u=${connection.user?.username || connection.user?.user?.username}`}
|
|
254
|
+
referrerPolicy="no-referrer"
|
|
255
|
+
crossOrigin="anonymous"
|
|
256
|
+
alt="User Avatar"
|
|
257
|
+
className="w-12 h-12 rounded-full border-2 border-bolt-elements-borderColorActive"
|
|
258
|
+
/>
|
|
259
|
+
<div>
|
|
260
|
+
<h4 className="text-sm font-medium text-bolt-elements-textPrimary">
|
|
261
|
+
{connection.user?.username || connection.user?.user?.username || 'Vercel User'}
|
|
262
|
+
</h4>
|
|
263
|
+
<p className="text-sm text-bolt-elements-textSecondary">
|
|
264
|
+
{connection.user?.email || connection.user?.user?.email || 'No email available'}
|
|
265
|
+
</p>
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
|
|
269
|
+
{fetchingStats ? (
|
|
270
|
+
<div className="flex items-center gap-2 text-sm text-bolt-elements-textSecondary">
|
|
271
|
+
<div className="i-ph:spinner-gap w-4 h-4 animate-spin" />
|
|
272
|
+
Fetching Vercel projects...
|
|
273
|
+
</div>
|
|
274
|
+
) : (
|
|
275
|
+
<div>
|
|
276
|
+
<button
|
|
277
|
+
onClick={() => setIsProjectsExpanded(!isProjectsExpanded)}
|
|
278
|
+
className="w-full bg-transparent text-left text-sm font-medium text-bolt-elements-textPrimary mb-3 flex items-center gap-2"
|
|
279
|
+
>
|
|
280
|
+
<div className="i-ph:buildings w-4 h-4" />
|
|
281
|
+
Your Projects ({connection.stats?.totalProjects || 0})
|
|
282
|
+
<div
|
|
283
|
+
className={classNames(
|
|
284
|
+
'i-ph:caret-down w-4 h-4 ml-auto transition-transform',
|
|
285
|
+
isProjectsExpanded ? 'rotate-180' : '',
|
|
286
|
+
)}
|
|
287
|
+
/>
|
|
288
|
+
</button>
|
|
289
|
+
{isProjectsExpanded && connection.stats?.projects?.length ? (
|
|
290
|
+
<div className="grid gap-3">
|
|
291
|
+
{connection.stats.projects.map((project) => (
|
|
292
|
+
<a
|
|
293
|
+
key={project.id}
|
|
294
|
+
href={`https://vercel.com/dashboard/${project.id}`}
|
|
295
|
+
target="_blank"
|
|
296
|
+
rel="noopener noreferrer"
|
|
297
|
+
className="block p-4 rounded-lg border border-bolt-elements-borderColor hover:border-bolt-elements-borderColorActive transition-colors"
|
|
298
|
+
>
|
|
299
|
+
<div className="flex items-center justify-between">
|
|
300
|
+
<div>
|
|
301
|
+
<h5 className="text-sm font-medium text-bolt-elements-textPrimary flex items-center gap-2">
|
|
302
|
+
<div className="i-ph:globe w-4 h-4 text-bolt-elements-borderColorActive" />
|
|
303
|
+
{project.name}
|
|
304
|
+
</h5>
|
|
305
|
+
<div className="flex items-center gap-2 mt-2 text-xs text-bolt-elements-textSecondary">
|
|
306
|
+
{project.targets?.production?.alias && project.targets.production.alias.length > 0 ? (
|
|
307
|
+
<>
|
|
308
|
+
<a
|
|
309
|
+
href={`https://${project.targets.production.alias.find((a: string) => a.endsWith('.vercel.app') && !a.includes('-projects.vercel.app')) || project.targets.production.alias[0]}`}
|
|
310
|
+
target="_blank"
|
|
311
|
+
rel="noopener noreferrer"
|
|
312
|
+
className="hover:text-bolt-elements-borderColorActive"
|
|
313
|
+
>
|
|
314
|
+
{project.targets.production.alias.find(
|
|
315
|
+
(a: string) => a.endsWith('.vercel.app') && !a.includes('-projects.vercel.app'),
|
|
316
|
+
) || project.targets.production.alias[0]}
|
|
317
|
+
</a>
|
|
318
|
+
<span>•</span>
|
|
319
|
+
<span className="flex items-center gap-1">
|
|
320
|
+
<div className="i-ph:clock w-3 h-3" />
|
|
321
|
+
{new Date(project.createdAt).toLocaleDateString()}
|
|
322
|
+
</span>
|
|
323
|
+
</>
|
|
324
|
+
) : project.latestDeployments && project.latestDeployments.length > 0 ? (
|
|
325
|
+
<>
|
|
326
|
+
<a
|
|
327
|
+
href={`https://${project.latestDeployments[0].url}`}
|
|
328
|
+
target="_blank"
|
|
329
|
+
rel="noopener noreferrer"
|
|
330
|
+
className="hover:text-bolt-elements-borderColorActive"
|
|
331
|
+
>
|
|
332
|
+
{project.latestDeployments[0].url}
|
|
333
|
+
</a>
|
|
334
|
+
<span>•</span>
|
|
335
|
+
<span className="flex items-center gap-1">
|
|
336
|
+
<div className="i-ph:clock w-3 h-3" />
|
|
337
|
+
{new Date(project.latestDeployments[0].created).toLocaleDateString()}
|
|
338
|
+
</span>
|
|
339
|
+
</>
|
|
340
|
+
) : null}
|
|
341
|
+
</div>
|
|
342
|
+
</div>
|
|
343
|
+
{project.framework && (
|
|
344
|
+
<div className="text-xs text-bolt-elements-textSecondary px-2 py-1 rounded-md bg-[#F0F0F0] dark:bg-[#252525]">
|
|
345
|
+
<span className="flex items-center gap-1">
|
|
346
|
+
<div className="i-ph:code w-3 h-3" />
|
|
347
|
+
{project.framework}
|
|
348
|
+
</span>
|
|
349
|
+
</div>
|
|
350
|
+
)}
|
|
351
|
+
</div>
|
|
352
|
+
</a>
|
|
353
|
+
))}
|
|
354
|
+
</div>
|
|
355
|
+
) : isProjectsExpanded ? (
|
|
356
|
+
<div className="text-sm text-bolt-elements-textSecondary flex items-center gap-2">
|
|
357
|
+
<div className="i-ph:info w-4 h-4" />
|
|
358
|
+
No projects found in your Vercel account
|
|
359
|
+
</div>
|
|
360
|
+
) : null}
|
|
361
|
+
</div>
|
|
362
|
+
)}
|
|
363
|
+
</div>
|
|
364
|
+
)}
|
|
365
|
+
</div>
|
|
366
|
+
</motion.div>
|
|
367
|
+
);
|
|
368
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as VercelConnection } from './VercelConnection';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { TabVisibilityConfig } from '~/components/@settings/core/types';
|
|
2
|
+
import { DEFAULT_TAB_CONFIG } from '~/components/@settings/core/constants';
|
|
3
|
+
|
|
4
|
+
export const getVisibleTabs = (
|
|
5
|
+
tabConfiguration: { userTabs: TabVisibilityConfig[] },
|
|
6
|
+
notificationsEnabled: boolean,
|
|
7
|
+
): TabVisibilityConfig[] => {
|
|
8
|
+
if (!tabConfiguration?.userTabs || !Array.isArray(tabConfiguration.userTabs)) {
|
|
9
|
+
console.warn('Invalid tab configuration, using defaults');
|
|
10
|
+
return DEFAULT_TAB_CONFIG as TabVisibilityConfig[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// In user mode, only show visible user tabs
|
|
14
|
+
return tabConfiguration.userTabs
|
|
15
|
+
.filter((tab) => {
|
|
16
|
+
if (!tab || typeof tab.id !== 'string') {
|
|
17
|
+
console.warn('Invalid tab entry:', tab);
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Hide notifications tab if notifications are disabled
|
|
22
|
+
if (tab.id === 'notifications' && !notificationsEnabled) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Only show tabs that are explicitly visible and assigned to the user window
|
|
27
|
+
return tab.visible && tab.window === 'user';
|
|
28
|
+
})
|
|
29
|
+
.sort((a, b) => a.order - b.order);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const reorderTabs = (
|
|
33
|
+
tabs: TabVisibilityConfig[],
|
|
34
|
+
startIndex: number,
|
|
35
|
+
endIndex: number,
|
|
36
|
+
): TabVisibilityConfig[] => {
|
|
37
|
+
const result = Array.from(tabs);
|
|
38
|
+
const [removed] = result.splice(startIndex, 1);
|
|
39
|
+
result.splice(endIndex, 0, removed);
|
|
40
|
+
|
|
41
|
+
// Update order property
|
|
42
|
+
return result.map((tab, index) => ({
|
|
43
|
+
...tab,
|
|
44
|
+
order: index,
|
|
45
|
+
}));
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const resetToDefaultConfig = (isDeveloperMode: boolean): TabVisibilityConfig[] => {
|
|
49
|
+
return DEFAULT_TAB_CONFIG.map((tab) => ({
|
|
50
|
+
...tab,
|
|
51
|
+
visible: isDeveloperMode ? true : tab.window === 'user',
|
|
52
|
+
window: isDeveloperMode ? 'developer' : tab.window,
|
|
53
|
+
})) as TabVisibilityConfig[];
|
|
54
|
+
};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import React, { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { IconButton } from '~/components/ui/IconButton';
|
|
3
|
+
import type { ProviderInfo } from '~/types/model';
|
|
4
|
+
import Cookies from 'js-cookie';
|
|
5
|
+
|
|
6
|
+
interface APIKeyManagerProps {
|
|
7
|
+
provider: ProviderInfo;
|
|
8
|
+
apiKey: string;
|
|
9
|
+
setApiKey: (key: string) => void;
|
|
10
|
+
getApiKeyLink?: string;
|
|
11
|
+
labelForGetApiKey?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// cache which stores whether the provider's API key is set via environment variable
|
|
15
|
+
const providerEnvKeyStatusCache: Record<string, boolean> = {};
|
|
16
|
+
|
|
17
|
+
const apiKeyMemoizeCache: { [k: string]: Record<string, string> } = {};
|
|
18
|
+
|
|
19
|
+
export function getApiKeysFromCookies() {
|
|
20
|
+
const storedApiKeys = Cookies.get('apiKeys');
|
|
21
|
+
let parsedKeys: Record<string, string> = {};
|
|
22
|
+
|
|
23
|
+
if (storedApiKeys) {
|
|
24
|
+
parsedKeys = apiKeyMemoizeCache[storedApiKeys];
|
|
25
|
+
|
|
26
|
+
if (!parsedKeys) {
|
|
27
|
+
parsedKeys = apiKeyMemoizeCache[storedApiKeys] = JSON.parse(storedApiKeys);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return parsedKeys;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
35
|
+
export const APIKeyManager: React.FC<APIKeyManagerProps> = ({ provider, apiKey, setApiKey }) => {
|
|
36
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
37
|
+
const [tempKey, setTempKey] = useState(apiKey);
|
|
38
|
+
const [isEnvKeySet, setIsEnvKeySet] = useState(false);
|
|
39
|
+
|
|
40
|
+
// Reset states and load saved key when provider changes
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
// Load saved API key from cookies for this provider
|
|
43
|
+
const savedKeys = getApiKeysFromCookies();
|
|
44
|
+
const savedKey = savedKeys[provider.name] || '';
|
|
45
|
+
|
|
46
|
+
setTempKey(savedKey);
|
|
47
|
+
setApiKey(savedKey);
|
|
48
|
+
setIsEditing(false);
|
|
49
|
+
}, [provider.name]);
|
|
50
|
+
|
|
51
|
+
const checkEnvApiKey = useCallback(async () => {
|
|
52
|
+
// Check cache first
|
|
53
|
+
if (providerEnvKeyStatusCache[provider.name] !== undefined) {
|
|
54
|
+
setIsEnvKeySet(providerEnvKeyStatusCache[provider.name]);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
const response = await fetch(`/api/check-env-key?provider=${encodeURIComponent(provider.name)}`);
|
|
60
|
+
const data = await response.json();
|
|
61
|
+
const isSet = (data as { isSet: boolean }).isSet;
|
|
62
|
+
|
|
63
|
+
// Cache the result
|
|
64
|
+
providerEnvKeyStatusCache[provider.name] = isSet;
|
|
65
|
+
setIsEnvKeySet(isSet);
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error('Failed to check environment API key:', error);
|
|
68
|
+
setIsEnvKeySet(false);
|
|
69
|
+
}
|
|
70
|
+
}, [provider.name]);
|
|
71
|
+
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
checkEnvApiKey();
|
|
74
|
+
}, [checkEnvApiKey]);
|
|
75
|
+
|
|
76
|
+
const handleSave = () => {
|
|
77
|
+
// Save to parent state
|
|
78
|
+
setApiKey(tempKey);
|
|
79
|
+
|
|
80
|
+
// Save to cookies
|
|
81
|
+
const currentKeys = getApiKeysFromCookies();
|
|
82
|
+
const newKeys = { ...currentKeys, [provider.name]: tempKey };
|
|
83
|
+
Cookies.set('apiKeys', JSON.stringify(newKeys));
|
|
84
|
+
|
|
85
|
+
setIsEditing(false);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<div className="flex items-center justify-between py-3 px-1">
|
|
90
|
+
<div className="flex items-center gap-2 flex-1">
|
|
91
|
+
<div className="flex items-center gap-2">
|
|
92
|
+
<span className="text-sm font-medium text-bolt-elements-textSecondary">{provider?.name} API Key:</span>
|
|
93
|
+
{!isEditing && (
|
|
94
|
+
<div className="flex items-center gap-2">
|
|
95
|
+
{apiKey ? (
|
|
96
|
+
<>
|
|
97
|
+
<div className="i-ph:check-circle-fill text-green-500 w-4 h-4" />
|
|
98
|
+
<span className="text-xs text-green-500">Set via UI</span>
|
|
99
|
+
</>
|
|
100
|
+
) : isEnvKeySet ? (
|
|
101
|
+
<>
|
|
102
|
+
<div className="i-ph:check-circle-fill text-green-500 w-4 h-4" />
|
|
103
|
+
<span className="text-xs text-green-500">Set via environment variable</span>
|
|
104
|
+
</>
|
|
105
|
+
) : (
|
|
106
|
+
<>
|
|
107
|
+
<div className="i-ph:x-circle-fill text-red-500 w-4 h-4" />
|
|
108
|
+
<span className="text-xs text-red-500">Not Set (Please set via UI or ENV_VAR)</span>
|
|
109
|
+
</>
|
|
110
|
+
)}
|
|
111
|
+
</div>
|
|
112
|
+
)}
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
<div className="flex items-center gap-2 shrink-0">
|
|
117
|
+
{isEditing ? (
|
|
118
|
+
<div className="flex items-center gap-2">
|
|
119
|
+
<input
|
|
120
|
+
type="password"
|
|
121
|
+
value={tempKey}
|
|
122
|
+
placeholder="Enter API Key"
|
|
123
|
+
onChange={(e) => setTempKey(e.target.value)}
|
|
124
|
+
className="w-[300px] px-3 py-1.5 text-sm rounded border border-bolt-elements-borderColor
|
|
125
|
+
bg-bolt-elements-prompt-background text-bolt-elements-textPrimary
|
|
126
|
+
focus:outline-none focus:ring-2 focus:ring-bolt-elements-focus"
|
|
127
|
+
/>
|
|
128
|
+
<IconButton
|
|
129
|
+
onClick={handleSave}
|
|
130
|
+
title="Save API Key"
|
|
131
|
+
className="bg-green-500/10 hover:bg-green-500/20 text-green-500"
|
|
132
|
+
>
|
|
133
|
+
<div className="i-ph:check w-4 h-4" />
|
|
134
|
+
</IconButton>
|
|
135
|
+
<IconButton
|
|
136
|
+
onClick={() => setIsEditing(false)}
|
|
137
|
+
title="Cancel"
|
|
138
|
+
className="bg-red-500/10 hover:bg-red-500/20 text-red-500"
|
|
139
|
+
>
|
|
140
|
+
<div className="i-ph:x w-4 h-4" />
|
|
141
|
+
</IconButton>
|
|
142
|
+
</div>
|
|
143
|
+
) : (
|
|
144
|
+
<>
|
|
145
|
+
{
|
|
146
|
+
<IconButton
|
|
147
|
+
onClick={() => setIsEditing(true)}
|
|
148
|
+
title="Edit API Key"
|
|
149
|
+
className="bg-blue-500/10 hover:bg-blue-500/20 text-blue-500"
|
|
150
|
+
>
|
|
151
|
+
<div className="i-ph:pencil-simple w-4 h-4" />
|
|
152
|
+
</IconButton>
|
|
153
|
+
}
|
|
154
|
+
{provider?.getApiKeyLink && !apiKey && (
|
|
155
|
+
<IconButton
|
|
156
|
+
onClick={() => window.open(provider?.getApiKeyLink)}
|
|
157
|
+
title="Get API Key"
|
|
158
|
+
className="bg-purple-500/10 hover:bg-purple-500/20 text-purple-500 flex items-center gap-2"
|
|
159
|
+
>
|
|
160
|
+
<span className="text-xs whitespace-nowrap">{provider?.labelForGetApiKey || 'Get API Key'}</span>
|
|
161
|
+
<div className={`${provider?.icon || 'i-ph:key'} w-4 h-4`} />
|
|
162
|
+
</IconButton>
|
|
163
|
+
)}
|
|
164
|
+
</>
|
|
165
|
+
)}
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
);
|
|
169
|
+
};
|