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,246 @@
|
|
|
1
|
+
import { toast } from 'react-toastify';
|
|
2
|
+
import { useStore } from '@nanostores/react';
|
|
3
|
+
import { netlifyConnection } from '~/lib/stores/netlify';
|
|
4
|
+
import { workbenchStore } from '~/lib/stores/workbench';
|
|
5
|
+
import { webcontainer } from '~/lib/webcontainer';
|
|
6
|
+
import { path } from '~/utils/path';
|
|
7
|
+
import { useState } from 'react';
|
|
8
|
+
import type { ActionCallbackData } from '~/lib/runtime/message-parser';
|
|
9
|
+
import { chatId } from '~/lib/persistence/useChatHistory';
|
|
10
|
+
|
|
11
|
+
export function useNetlifyDeploy() {
|
|
12
|
+
const [isDeploying, setIsDeploying] = useState(false);
|
|
13
|
+
const netlifyConn = useStore(netlifyConnection);
|
|
14
|
+
const currentChatId = useStore(chatId);
|
|
15
|
+
|
|
16
|
+
const handleNetlifyDeploy = async () => {
|
|
17
|
+
if (!netlifyConn.user || !netlifyConn.token) {
|
|
18
|
+
toast.error('Please connect to Netlify first in the settings tab!');
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (!currentChatId) {
|
|
23
|
+
toast.error('No active chat found');
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
setIsDeploying(true);
|
|
29
|
+
|
|
30
|
+
const artifact = workbenchStore.firstArtifact;
|
|
31
|
+
|
|
32
|
+
if (!artifact) {
|
|
33
|
+
throw new Error('No active project found');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Create a deployment artifact for visual feedback
|
|
37
|
+
const deploymentId = `deploy-artifact`;
|
|
38
|
+
workbenchStore.addArtifact({
|
|
39
|
+
id: deploymentId,
|
|
40
|
+
messageId: deploymentId,
|
|
41
|
+
title: 'Netlify Deployment',
|
|
42
|
+
type: 'standalone',
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const deployArtifact = workbenchStore.artifacts.get()[deploymentId];
|
|
46
|
+
|
|
47
|
+
// Notify that build is starting
|
|
48
|
+
deployArtifact.runner.handleDeployAction('building', 'running', { source: 'netlify' });
|
|
49
|
+
|
|
50
|
+
// Set up build action
|
|
51
|
+
const actionId = 'build-' + Date.now();
|
|
52
|
+
const actionData: ActionCallbackData = {
|
|
53
|
+
messageId: 'netlify build',
|
|
54
|
+
artifactId: artifact.id,
|
|
55
|
+
actionId,
|
|
56
|
+
action: {
|
|
57
|
+
type: 'build' as const,
|
|
58
|
+
content: 'npm run build',
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// Add the action first
|
|
63
|
+
artifact.runner.addAction(actionData);
|
|
64
|
+
|
|
65
|
+
// Then run it
|
|
66
|
+
await artifact.runner.runAction(actionData);
|
|
67
|
+
|
|
68
|
+
if (!artifact.runner.buildOutput) {
|
|
69
|
+
// Notify that build failed
|
|
70
|
+
deployArtifact.runner.handleDeployAction('building', 'failed', {
|
|
71
|
+
error: 'Build failed. Check the terminal for details.',
|
|
72
|
+
source: 'netlify',
|
|
73
|
+
});
|
|
74
|
+
throw new Error('Build failed');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Notify that build succeeded and deployment is starting
|
|
78
|
+
deployArtifact.runner.handleDeployAction('deploying', 'running', { source: 'netlify' });
|
|
79
|
+
|
|
80
|
+
// Get the build files
|
|
81
|
+
const container = await webcontainer;
|
|
82
|
+
|
|
83
|
+
// Remove /home/project from buildPath if it exists
|
|
84
|
+
const buildPath = artifact.runner.buildOutput.path.replace('/home/project', '');
|
|
85
|
+
|
|
86
|
+
console.log('Original buildPath', buildPath);
|
|
87
|
+
|
|
88
|
+
// Check if the build path exists
|
|
89
|
+
let finalBuildPath = buildPath;
|
|
90
|
+
|
|
91
|
+
// List of common output directories to check if the specified build path doesn't exist
|
|
92
|
+
const commonOutputDirs = [buildPath, '/dist', '/build', '/out', '/output', '/.next', '/public'];
|
|
93
|
+
|
|
94
|
+
// Verify the build path exists, or try to find an alternative
|
|
95
|
+
let buildPathExists = false;
|
|
96
|
+
|
|
97
|
+
for (const dir of commonOutputDirs) {
|
|
98
|
+
try {
|
|
99
|
+
await container.fs.readdir(dir);
|
|
100
|
+
finalBuildPath = dir;
|
|
101
|
+
buildPathExists = true;
|
|
102
|
+
console.log(`Using build directory: ${finalBuildPath}`);
|
|
103
|
+
break;
|
|
104
|
+
} catch (error) {
|
|
105
|
+
// Directory doesn't exist, try the next one
|
|
106
|
+
console.log(`Directory ${dir} doesn't exist, trying next option. ${error}`);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (!buildPathExists) {
|
|
112
|
+
throw new Error('Could not find build output directory. Please check your build configuration.');
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function getAllFiles(dirPath: string): Promise<Record<string, string>> {
|
|
116
|
+
const files: Record<string, string> = {};
|
|
117
|
+
const entries = await container.fs.readdir(dirPath, { withFileTypes: true });
|
|
118
|
+
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
121
|
+
|
|
122
|
+
if (entry.isFile()) {
|
|
123
|
+
const content = await container.fs.readFile(fullPath, 'utf-8');
|
|
124
|
+
|
|
125
|
+
// Remove build path prefix from the path
|
|
126
|
+
const deployPath = fullPath.replace(finalBuildPath, '');
|
|
127
|
+
files[deployPath] = content;
|
|
128
|
+
} else if (entry.isDirectory()) {
|
|
129
|
+
const subFiles = await getAllFiles(fullPath);
|
|
130
|
+
Object.assign(files, subFiles);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return files;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const fileContents = await getAllFiles(finalBuildPath);
|
|
138
|
+
|
|
139
|
+
// Use chatId instead of artifact.id
|
|
140
|
+
const existingSiteId = localStorage.getItem(`netlify-site-${currentChatId}`);
|
|
141
|
+
|
|
142
|
+
const response = await fetch('/api/netlify-deploy', {
|
|
143
|
+
method: 'POST',
|
|
144
|
+
headers: {
|
|
145
|
+
'Content-Type': 'application/json',
|
|
146
|
+
},
|
|
147
|
+
body: JSON.stringify({
|
|
148
|
+
siteId: existingSiteId || undefined,
|
|
149
|
+
files: fileContents,
|
|
150
|
+
token: netlifyConn.token,
|
|
151
|
+
chatId: currentChatId,
|
|
152
|
+
}),
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const data = (await response.json()) as any;
|
|
156
|
+
|
|
157
|
+
if (!response.ok || !data.deploy || !data.site) {
|
|
158
|
+
console.error('Invalid deploy response:', data);
|
|
159
|
+
|
|
160
|
+
// Notify that deployment failed
|
|
161
|
+
deployArtifact.runner.handleDeployAction('deploying', 'failed', {
|
|
162
|
+
error: data.error || 'Invalid deployment response',
|
|
163
|
+
source: 'netlify',
|
|
164
|
+
});
|
|
165
|
+
throw new Error(data.error || 'Invalid deployment response');
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const maxAttempts = 20; // 2 minutes timeout
|
|
169
|
+
let attempts = 0;
|
|
170
|
+
let deploymentStatus;
|
|
171
|
+
|
|
172
|
+
while (attempts < maxAttempts) {
|
|
173
|
+
try {
|
|
174
|
+
const statusResponse = await fetch(
|
|
175
|
+
`https://api.netlify.com/api/v1/sites/${data.site.id}/deploys/${data.deploy.id}`,
|
|
176
|
+
{
|
|
177
|
+
headers: {
|
|
178
|
+
Authorization: `Bearer ${netlifyConn.token}`,
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
deploymentStatus = (await statusResponse.json()) as any;
|
|
184
|
+
|
|
185
|
+
if (deploymentStatus.state === 'ready' || deploymentStatus.state === 'uploaded') {
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (deploymentStatus.state === 'error') {
|
|
190
|
+
// Notify that deployment failed
|
|
191
|
+
deployArtifact.runner.handleDeployAction('deploying', 'failed', {
|
|
192
|
+
error: 'Deployment failed: ' + (deploymentStatus.error_message || 'Unknown error'),
|
|
193
|
+
source: 'netlify',
|
|
194
|
+
});
|
|
195
|
+
throw new Error('Deployment failed: ' + (deploymentStatus.error_message || 'Unknown error'));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
attempts++;
|
|
199
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
200
|
+
} catch (error) {
|
|
201
|
+
console.error('Status check error:', error);
|
|
202
|
+
attempts++;
|
|
203
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (attempts >= maxAttempts) {
|
|
208
|
+
// Notify that deployment timed out
|
|
209
|
+
deployArtifact.runner.handleDeployAction('deploying', 'failed', {
|
|
210
|
+
error: 'Deployment timed out',
|
|
211
|
+
source: 'netlify',
|
|
212
|
+
});
|
|
213
|
+
throw new Error('Deployment timed out');
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Store the site ID if it's a new site
|
|
217
|
+
if (data.site) {
|
|
218
|
+
localStorage.setItem(`netlify-site-${currentChatId}`, data.site.id);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Notify that deployment completed successfully
|
|
222
|
+
deployArtifact.runner.handleDeployAction('complete', 'complete', {
|
|
223
|
+
url: deploymentStatus.ssl_url || deploymentStatus.url,
|
|
224
|
+
source: 'netlify',
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Show success toast notification
|
|
228
|
+
toast.success(`🚀 Netlify deployment completed successfully!`);
|
|
229
|
+
|
|
230
|
+
return true;
|
|
231
|
+
} catch (error) {
|
|
232
|
+
console.error('Deploy error:', error);
|
|
233
|
+
toast.error(error instanceof Error ? error.message : 'Deployment failed');
|
|
234
|
+
|
|
235
|
+
return false;
|
|
236
|
+
} finally {
|
|
237
|
+
setIsDeploying(false);
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
return {
|
|
242
|
+
isDeploying,
|
|
243
|
+
handleNetlifyDeploy,
|
|
244
|
+
isConnected: !!netlifyConn.user,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { toast } from 'react-toastify';
|
|
2
|
+
import { useStore } from '@nanostores/react';
|
|
3
|
+
import { vercelConnection } from '~/lib/stores/vercel';
|
|
4
|
+
import { workbenchStore } from '~/lib/stores/workbench';
|
|
5
|
+
import { webcontainer } from '~/lib/webcontainer';
|
|
6
|
+
import { path } from '~/utils/path';
|
|
7
|
+
import { useState } from 'react';
|
|
8
|
+
import type { ActionCallbackData } from '~/lib/runtime/message-parser';
|
|
9
|
+
import { chatId } from '~/lib/persistence/useChatHistory';
|
|
10
|
+
|
|
11
|
+
export function useVercelDeploy() {
|
|
12
|
+
const [isDeploying, setIsDeploying] = useState(false);
|
|
13
|
+
const vercelConn = useStore(vercelConnection);
|
|
14
|
+
const currentChatId = useStore(chatId);
|
|
15
|
+
|
|
16
|
+
const handleVercelDeploy = async () => {
|
|
17
|
+
if (!vercelConn.user || !vercelConn.token) {
|
|
18
|
+
toast.error('Please connect to Vercel first in the settings tab!');
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (!currentChatId) {
|
|
23
|
+
toast.error('No active chat found');
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
setIsDeploying(true);
|
|
29
|
+
|
|
30
|
+
const artifact = workbenchStore.firstArtifact;
|
|
31
|
+
|
|
32
|
+
if (!artifact) {
|
|
33
|
+
throw new Error('No active project found');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Create a deployment artifact for visual feedback
|
|
37
|
+
const deploymentId = `deploy-vercel-project`;
|
|
38
|
+
workbenchStore.addArtifact({
|
|
39
|
+
id: deploymentId,
|
|
40
|
+
messageId: deploymentId,
|
|
41
|
+
title: 'Vercel Deployment',
|
|
42
|
+
type: 'standalone',
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const deployArtifact = workbenchStore.artifacts.get()[deploymentId];
|
|
46
|
+
|
|
47
|
+
// Notify that build is starting
|
|
48
|
+
deployArtifact.runner.handleDeployAction('building', 'running', { source: 'vercel' });
|
|
49
|
+
|
|
50
|
+
const actionId = 'build-' + Date.now();
|
|
51
|
+
const actionData: ActionCallbackData = {
|
|
52
|
+
messageId: 'vercel build',
|
|
53
|
+
artifactId: artifact.id,
|
|
54
|
+
actionId,
|
|
55
|
+
action: {
|
|
56
|
+
type: 'build' as const,
|
|
57
|
+
content: 'npm run build',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Add the action first
|
|
62
|
+
artifact.runner.addAction(actionData);
|
|
63
|
+
|
|
64
|
+
// Then run it
|
|
65
|
+
await artifact.runner.runAction(actionData);
|
|
66
|
+
|
|
67
|
+
if (!artifact.runner.buildOutput) {
|
|
68
|
+
// Notify that build failed
|
|
69
|
+
deployArtifact.runner.handleDeployAction('building', 'failed', {
|
|
70
|
+
error: 'Build failed. Check the terminal for details.',
|
|
71
|
+
source: 'vercel',
|
|
72
|
+
});
|
|
73
|
+
throw new Error('Build failed');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Notify that build succeeded and deployment is starting
|
|
77
|
+
deployArtifact.runner.handleDeployAction('deploying', 'running', { source: 'vercel' });
|
|
78
|
+
|
|
79
|
+
// Get the build files
|
|
80
|
+
const container = await webcontainer;
|
|
81
|
+
|
|
82
|
+
// Remove /home/project from buildPath if it exists
|
|
83
|
+
const buildPath = artifact.runner.buildOutput.path.replace('/home/project', '');
|
|
84
|
+
|
|
85
|
+
// Check if the build path exists
|
|
86
|
+
let finalBuildPath = buildPath;
|
|
87
|
+
|
|
88
|
+
// List of common output directories to check if the specified build path doesn't exist
|
|
89
|
+
const commonOutputDirs = [buildPath, '/dist', '/build', '/out', '/output', '/.next', '/public'];
|
|
90
|
+
|
|
91
|
+
// Verify the build path exists, or try to find an alternative
|
|
92
|
+
let buildPathExists = false;
|
|
93
|
+
|
|
94
|
+
for (const dir of commonOutputDirs) {
|
|
95
|
+
try {
|
|
96
|
+
await container.fs.readdir(dir);
|
|
97
|
+
finalBuildPath = dir;
|
|
98
|
+
buildPathExists = true;
|
|
99
|
+
break;
|
|
100
|
+
} catch {
|
|
101
|
+
// Directory doesn't exist, expected — just skip it
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (!buildPathExists) {
|
|
107
|
+
throw new Error('Could not find build output directory. Please check your build configuration.');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Get all files recursively
|
|
111
|
+
async function getAllFiles(dirPath: string): Promise<Record<string, string>> {
|
|
112
|
+
const files: Record<string, string> = {};
|
|
113
|
+
const entries = await container.fs.readdir(dirPath, { withFileTypes: true });
|
|
114
|
+
|
|
115
|
+
for (const entry of entries) {
|
|
116
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
117
|
+
|
|
118
|
+
if (entry.isFile()) {
|
|
119
|
+
const content = await container.fs.readFile(fullPath, 'utf-8');
|
|
120
|
+
|
|
121
|
+
// Remove build path prefix from the path
|
|
122
|
+
const deployPath = fullPath.replace(finalBuildPath, '');
|
|
123
|
+
files[deployPath] = content;
|
|
124
|
+
} else if (entry.isDirectory()) {
|
|
125
|
+
const subFiles = await getAllFiles(fullPath);
|
|
126
|
+
Object.assign(files, subFiles);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return files;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const fileContents = await getAllFiles(finalBuildPath);
|
|
134
|
+
|
|
135
|
+
// Get all source project files for framework detection
|
|
136
|
+
const allProjectFiles: Record<string, string> = {};
|
|
137
|
+
|
|
138
|
+
async function getAllProjectFiles(dirPath: string): Promise<void> {
|
|
139
|
+
const entries = await container.fs.readdir(dirPath, { withFileTypes: true });
|
|
140
|
+
|
|
141
|
+
for (const entry of entries) {
|
|
142
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
143
|
+
|
|
144
|
+
if (entry.isFile()) {
|
|
145
|
+
try {
|
|
146
|
+
const content = await container.fs.readFile(fullPath, 'utf-8');
|
|
147
|
+
|
|
148
|
+
// Store with relative path from project root
|
|
149
|
+
let relativePath = fullPath;
|
|
150
|
+
|
|
151
|
+
if (fullPath.startsWith('/home/project/')) {
|
|
152
|
+
relativePath = fullPath.replace('/home/project/', '');
|
|
153
|
+
} else if (fullPath.startsWith('./')) {
|
|
154
|
+
relativePath = fullPath.replace('./', '');
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
allProjectFiles[relativePath] = content;
|
|
158
|
+
} catch (error) {
|
|
159
|
+
// Skip binary files or files that can't be read as text
|
|
160
|
+
console.log(`Skipping file ${entry.name}: ${error}`);
|
|
161
|
+
}
|
|
162
|
+
} else if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {
|
|
163
|
+
await getAllProjectFiles(fullPath);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Try to read from the current directory first
|
|
169
|
+
try {
|
|
170
|
+
await getAllProjectFiles('.');
|
|
171
|
+
} catch {
|
|
172
|
+
// Fallback to /home/project if current directory doesn't work
|
|
173
|
+
await getAllProjectFiles('/home/project');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Use chatId instead of artifact.id
|
|
177
|
+
const existingProjectId = localStorage.getItem(`vercel-project-${currentChatId}`);
|
|
178
|
+
|
|
179
|
+
const response = await fetch('/api/vercel-deploy', {
|
|
180
|
+
method: 'POST',
|
|
181
|
+
headers: {
|
|
182
|
+
'Content-Type': 'application/json',
|
|
183
|
+
},
|
|
184
|
+
body: JSON.stringify({
|
|
185
|
+
projectId: existingProjectId || undefined,
|
|
186
|
+
files: fileContents,
|
|
187
|
+
sourceFiles: allProjectFiles,
|
|
188
|
+
token: vercelConn.token,
|
|
189
|
+
chatId: currentChatId,
|
|
190
|
+
}),
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const data = (await response.json()) as any;
|
|
194
|
+
|
|
195
|
+
if (!response.ok || !data.deploy || !data.project) {
|
|
196
|
+
console.error('Invalid deploy response:', data);
|
|
197
|
+
|
|
198
|
+
// Notify that deployment failed
|
|
199
|
+
deployArtifact.runner.handleDeployAction('deploying', 'failed', {
|
|
200
|
+
error: data.error || 'Invalid deployment response',
|
|
201
|
+
source: 'vercel',
|
|
202
|
+
});
|
|
203
|
+
throw new Error(data.error || 'Invalid deployment response');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (data.project) {
|
|
207
|
+
localStorage.setItem(`vercel-project-${currentChatId}`, data.project.id);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Notify that deployment completed successfully
|
|
211
|
+
deployArtifact.runner.handleDeployAction('complete', 'complete', {
|
|
212
|
+
url: data.deploy.url,
|
|
213
|
+
source: 'vercel',
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
// Show success toast notification
|
|
217
|
+
toast.success(`🚀 Vercel deployment completed successfully!`);
|
|
218
|
+
|
|
219
|
+
return true;
|
|
220
|
+
} catch (err) {
|
|
221
|
+
console.error('Vercel deploy error:', err);
|
|
222
|
+
toast.error(err instanceof Error ? err.message : 'Vercel deployment failed');
|
|
223
|
+
|
|
224
|
+
return false;
|
|
225
|
+
} finally {
|
|
226
|
+
setIsDeploying(false);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
return {
|
|
231
|
+
isDeploying,
|
|
232
|
+
handleVercelDeploy,
|
|
233
|
+
isConnected: !!vercelConn.user,
|
|
234
|
+
};
|
|
235
|
+
}
|