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,155 @@
|
|
|
1
|
+
# Fix Docker Credential Helper for Rancher Desktop
|
|
2
|
+
# This script removes the problematic credential helper from Docker config
|
|
3
|
+
|
|
4
|
+
$dockerConfigPath = "$env:USERPROFILE\.docker\config.json"
|
|
5
|
+
$separator = "============================================================"
|
|
6
|
+
|
|
7
|
+
Write-Host "`nFixing Docker credential helper for Rancher Desktop..." -ForegroundColor Cyan
|
|
8
|
+
Write-Host $separator -ForegroundColor Cyan
|
|
9
|
+
|
|
10
|
+
# Check if Docker is available
|
|
11
|
+
Write-Host "`nChecking Docker availability..." -ForegroundColor Yellow
|
|
12
|
+
try {
|
|
13
|
+
$dockerVersion = docker --version 2>&1
|
|
14
|
+
if ($LASTEXITCODE -eq 0) {
|
|
15
|
+
Write-Host "SUCCESS: Docker found: $dockerVersion" -ForegroundColor Green
|
|
16
|
+
} else {
|
|
17
|
+
Write-Host "WARNING: Docker command returned error" -ForegroundColor Yellow
|
|
18
|
+
}
|
|
19
|
+
} catch {
|
|
20
|
+
Write-Host "ERROR: Docker not found in PATH. Please ensure Rancher Desktop is installed." -ForegroundColor Red
|
|
21
|
+
exit 1
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
# Check if Docker daemon is running
|
|
25
|
+
Write-Host "`nChecking Docker daemon..." -ForegroundColor Yellow
|
|
26
|
+
try {
|
|
27
|
+
$dockerInfo = docker info 2>&1
|
|
28
|
+
if ($LASTEXITCODE -eq 0) {
|
|
29
|
+
if ($dockerInfo -match "rancher|moby") {
|
|
30
|
+
Write-Host "SUCCESS: Rancher Desktop detected and running" -ForegroundColor Green
|
|
31
|
+
} else {
|
|
32
|
+
Write-Host "SUCCESS: Docker daemon is running" -ForegroundColor Green
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
Write-Host "ERROR: Docker daemon is not running. Please start Rancher Desktop." -ForegroundColor Red
|
|
36
|
+
exit 1
|
|
37
|
+
}
|
|
38
|
+
} catch {
|
|
39
|
+
Write-Host "ERROR: Cannot connect to Docker daemon. Please start Rancher Desktop." -ForegroundColor Red
|
|
40
|
+
exit 1
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# Fix credential helper
|
|
44
|
+
Write-Host "`nChecking Docker config..." -ForegroundColor Yellow
|
|
45
|
+
|
|
46
|
+
if (Test-Path $dockerConfigPath) {
|
|
47
|
+
Write-Host "Found Docker config at: $dockerConfigPath" -ForegroundColor Yellow
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
$configContent = Get-Content $dockerConfigPath -Raw
|
|
51
|
+
$config = $configContent | ConvertFrom-Json
|
|
52
|
+
|
|
53
|
+
if ($config.PSObject.Properties.Name -contains "credsStore") {
|
|
54
|
+
$credsStoreValue = $config.credsStore
|
|
55
|
+
Write-Host "WARNING: Found credential helper: $credsStoreValue" -ForegroundColor Yellow
|
|
56
|
+
Write-Host "Removing credential helper..." -ForegroundColor Yellow
|
|
57
|
+
|
|
58
|
+
# Backup original
|
|
59
|
+
$backupPath = "$dockerConfigPath.backup.$(Get-Date -Format 'yyyyMMdd-HHmmss')"
|
|
60
|
+
Copy-Item $dockerConfigPath $backupPath -Force
|
|
61
|
+
Write-Host "SUCCESS: Backup saved to: $backupPath" -ForegroundColor Green
|
|
62
|
+
|
|
63
|
+
# Remove credsStore
|
|
64
|
+
$config.PSObject.Properties.Remove('credsStore')
|
|
65
|
+
|
|
66
|
+
# Save updated config with proper formatting
|
|
67
|
+
# Use -Compress to avoid formatting issues, then format manually for readability
|
|
68
|
+
$updatedConfig = $config | ConvertTo-Json -Depth 10 -Compress
|
|
69
|
+
$formattedConfig = $updatedConfig | ConvertFrom-Json | ConvertTo-Json -Depth 10
|
|
70
|
+
|
|
71
|
+
# Write with UTF8NoBOM to avoid BOM issues that can break JSON parsing
|
|
72
|
+
$utf8NoBom = New-Object System.Text.UTF8Encoding $false
|
|
73
|
+
[System.IO.File]::WriteAllText($dockerConfigPath, $formattedConfig, $utf8NoBom)
|
|
74
|
+
|
|
75
|
+
# Verify the written file is valid JSON
|
|
76
|
+
try {
|
|
77
|
+
$verifyConfig = Get-Content $dockerConfigPath -Raw | ConvertFrom-Json
|
|
78
|
+
Write-Host "SUCCESS: Credential helper removed successfully!" -ForegroundColor Green
|
|
79
|
+
} catch {
|
|
80
|
+
Write-Host "ERROR: Written config is invalid JSON. Restoring backup..." -ForegroundColor Red
|
|
81
|
+
Copy-Item $backupPath $dockerConfigPath -Force
|
|
82
|
+
Write-Host "ERROR: Failed to fix config. Please edit manually." -ForegroundColor Red
|
|
83
|
+
exit 1
|
|
84
|
+
}
|
|
85
|
+
} else {
|
|
86
|
+
Write-Host "SUCCESS: No credential helper found - config looks good!" -ForegroundColor Green
|
|
87
|
+
}
|
|
88
|
+
} catch {
|
|
89
|
+
Write-Host "ERROR: Error processing config: $_" -ForegroundColor Red
|
|
90
|
+
Write-Host "TIP: You can manually edit: $dockerConfigPath" -ForegroundColor Yellow
|
|
91
|
+
Write-Host " Remove the line: `"credsStore`": `"wincred`"" -ForegroundColor Yellow
|
|
92
|
+
exit 1
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
Write-Host "Docker config not found at: $dockerConfigPath" -ForegroundColor Yellow
|
|
96
|
+
Write-Host "Creating new config without credential helper..." -ForegroundColor Cyan
|
|
97
|
+
|
|
98
|
+
$dockerDir = Split-Path $dockerConfigPath
|
|
99
|
+
if (-not (Test-Path $dockerDir)) {
|
|
100
|
+
New-Item -ItemType Directory -Path $dockerDir -Force | Out-Null
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
$newConfig = @{
|
|
104
|
+
auths = @{}
|
|
105
|
+
} | ConvertTo-Json -Depth 10
|
|
106
|
+
|
|
107
|
+
# Write with UTF8NoBOM to avoid BOM issues
|
|
108
|
+
$utf8NoBom = New-Object System.Text.UTF8Encoding $false
|
|
109
|
+
[System.IO.File]::WriteAllText($dockerConfigPath, $newConfig, $utf8NoBom)
|
|
110
|
+
|
|
111
|
+
# Verify the written file is valid JSON
|
|
112
|
+
try {
|
|
113
|
+
$verifyConfig = Get-Content $dockerConfigPath -Raw | ConvertFrom-Json
|
|
114
|
+
Write-Host "SUCCESS: Created new Docker config without credential helper!" -ForegroundColor Green
|
|
115
|
+
} catch {
|
|
116
|
+
Write-Host "ERROR: Created config is invalid JSON." -ForegroundColor Red
|
|
117
|
+
exit 1
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# Verify the fix
|
|
122
|
+
Write-Host "`nVerifying fix..." -ForegroundColor Yellow
|
|
123
|
+
try {
|
|
124
|
+
$testConfig = Get-Content $dockerConfigPath -Raw | ConvertFrom-Json
|
|
125
|
+
if ($testConfig.PSObject.Properties.Name -contains "credsStore") {
|
|
126
|
+
Write-Host "ERROR: Credential helper still present!" -ForegroundColor Red
|
|
127
|
+
exit 1
|
|
128
|
+
} else {
|
|
129
|
+
Write-Host "SUCCESS: Config verified - no credential helper found" -ForegroundColor Green
|
|
130
|
+
Write-Host "SUCCESS: JSON is valid and properly formatted" -ForegroundColor Green
|
|
131
|
+
}
|
|
132
|
+
} catch {
|
|
133
|
+
Write-Host "ERROR: Config file is invalid JSON: $_" -ForegroundColor Red
|
|
134
|
+
Write-Host "Attempting to restore from backup..." -ForegroundColor Yellow
|
|
135
|
+
$backupFiles = Get-ChildItem "$dockerConfigPath.backup.*" | Sort-Object LastWriteTime -Descending
|
|
136
|
+
if ($backupFiles) {
|
|
137
|
+
$latestBackup = $backupFiles[0].FullName
|
|
138
|
+
Copy-Item $latestBackup $dockerConfigPath -Force
|
|
139
|
+
Write-Host "SUCCESS: Restored from backup: $latestBackup" -ForegroundColor Green
|
|
140
|
+
Write-Host "Please restart Rancher Desktop and try again." -ForegroundColor Yellow
|
|
141
|
+
} else {
|
|
142
|
+
Write-Host "ERROR: No backup found. Please manually fix the config file." -ForegroundColor Red
|
|
143
|
+
}
|
|
144
|
+
exit 1
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
Write-Host "`n$separator" -ForegroundColor Cyan
|
|
148
|
+
Write-Host "Next steps:" -ForegroundColor Cyan
|
|
149
|
+
Write-Host " 1. Restart Rancher Desktop (if it was running)" -ForegroundColor White
|
|
150
|
+
Write-Host " 2. Verify: docker info" -ForegroundColor White
|
|
151
|
+
Write-Host " 3. Test: docker compose version" -ForegroundColor White
|
|
152
|
+
Write-Host " 4. Run the daemon: python corposwarm.py --daemon --verbose" -ForegroundColor White
|
|
153
|
+
$message = "`nSUCCESS: Fix complete! You can now use bolt.diy with Rancher Desktop."
|
|
154
|
+
Write-Host $message -ForegroundColor Green
|
|
155
|
+
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Bolt.diy Integration Test
|
|
4
|
+
|
|
5
|
+
This test file specifically tests the integration between CorporateSwarm and bolt.diy.
|
|
6
|
+
It checks bolt.diy health, starts it if needed, and forces a mandate execution.
|
|
7
|
+
|
|
8
|
+
Requirements:
|
|
9
|
+
- bolt.diy should be running at http://localhost:5173 (or set BOLT_DIY_API_URL)
|
|
10
|
+
- CorporateSwarm should be able to submit mandates to bolt.diy
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import sys
|
|
14
|
+
import os
|
|
15
|
+
import time
|
|
16
|
+
import requests
|
|
17
|
+
from typing import Optional
|
|
18
|
+
|
|
19
|
+
# Add current directory to path
|
|
20
|
+
sys.path.insert(0, os.path.dirname(__file__))
|
|
21
|
+
|
|
22
|
+
from corposwarm import (
|
|
23
|
+
create_corporation,
|
|
24
|
+
CorporateSwarm,
|
|
25
|
+
CorporateRole,
|
|
26
|
+
DepartmentType,
|
|
27
|
+
ProposalType
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def check_bolt_diy_health(url: str = "http://localhost:5173", timeout: int = 5) -> bool:
|
|
32
|
+
"""
|
|
33
|
+
Check if bolt.diy is running and reachable.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
url: bolt.diy API URL
|
|
37
|
+
timeout: Request timeout in seconds
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
bool: True if bolt.diy is reachable, False otherwise
|
|
41
|
+
"""
|
|
42
|
+
try:
|
|
43
|
+
health_url = url.rstrip('/') + "/api/health"
|
|
44
|
+
response = requests.get(health_url, timeout=timeout)
|
|
45
|
+
if response.status_code == 200:
|
|
46
|
+
try:
|
|
47
|
+
data = response.json()
|
|
48
|
+
if data.get("status") == "healthy":
|
|
49
|
+
return True
|
|
50
|
+
except (ValueError, KeyError):
|
|
51
|
+
# Response is not JSON or missing status field, but 200 OK - still ready
|
|
52
|
+
pass
|
|
53
|
+
return True # Any 200 response means the server is ready
|
|
54
|
+
return False
|
|
55
|
+
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
|
|
56
|
+
return False
|
|
57
|
+
except Exception as e:
|
|
58
|
+
print(f"[WARN] Error checking bolt.diy health: {e}")
|
|
59
|
+
return False
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def ensure_bolt_diy_ready(url: str = "http://localhost:5173", max_wait: int = 60) -> bool:
|
|
63
|
+
"""
|
|
64
|
+
Ensure bolt.diy is ready, waiting up to max_wait seconds.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
url: bolt.diy API URL
|
|
68
|
+
max_wait: Maximum time to wait in seconds
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
bool: True if bolt.diy is ready, False otherwise
|
|
72
|
+
"""
|
|
73
|
+
start_time = time.time()
|
|
74
|
+
check_interval = 2 # Check every 2 seconds
|
|
75
|
+
|
|
76
|
+
print(f"Waiting for bolt.diy to be ready at {url}...")
|
|
77
|
+
|
|
78
|
+
while time.time() - start_time < max_wait:
|
|
79
|
+
if check_bolt_diy_health(url):
|
|
80
|
+
print(f"[OK] bolt.diy is ready at {url}")
|
|
81
|
+
return True
|
|
82
|
+
elapsed = int(time.time() - start_time)
|
|
83
|
+
print(f"[WAIT] bolt.diy not ready yet... ({elapsed}s/{max_wait}s)")
|
|
84
|
+
time.sleep(check_interval)
|
|
85
|
+
|
|
86
|
+
print(f"[ERROR] bolt.diy not ready after {max_wait} seconds")
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def test_bolt_diy_health():
|
|
91
|
+
"""Test 1: Check bolt.diy health endpoint."""
|
|
92
|
+
print("\n" + "="*80)
|
|
93
|
+
print("TEST 1: Bolt.diy Health Check")
|
|
94
|
+
print("="*80)
|
|
95
|
+
|
|
96
|
+
bolt_diy_url = os.getenv("BOLT_DIY_API_URL", "http://localhost:5173")
|
|
97
|
+
|
|
98
|
+
if check_bolt_diy_health(bolt_diy_url):
|
|
99
|
+
print(f"[PASS] bolt.diy is healthy at {bolt_diy_url}")
|
|
100
|
+
return True
|
|
101
|
+
else:
|
|
102
|
+
print(f"[FAIL] bolt.diy is not reachable at {bolt_diy_url}")
|
|
103
|
+
print(f"[INFO] Make sure bolt.diy is running. You can start it with:")
|
|
104
|
+
print(f" cd CR-CA/tools/bolt.diy && npm run dev")
|
|
105
|
+
return False
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def wait_for_mandate_execution(bolt_diy_url: str, mandate_id: str, max_wait: int = 300) -> dict:
|
|
109
|
+
"""
|
|
110
|
+
Wait for a mandate to complete execution and return execution results.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
bolt_diy_url: bolt.diy API URL
|
|
114
|
+
mandate_id: Mandate ID to wait for
|
|
115
|
+
max_wait: Maximum time to wait in seconds (default: 5 minutes)
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
dict: Execution results with status, events, and generated files
|
|
119
|
+
"""
|
|
120
|
+
start_time = time.time()
|
|
121
|
+
check_interval = 3 # Check every 3 seconds
|
|
122
|
+
|
|
123
|
+
print(f"[INFO] Waiting for mandate {mandate_id} to execute (max {max_wait}s)...")
|
|
124
|
+
|
|
125
|
+
last_status = "accepted"
|
|
126
|
+
events = []
|
|
127
|
+
generated_files = []
|
|
128
|
+
|
|
129
|
+
while time.time() - start_time < max_wait:
|
|
130
|
+
try:
|
|
131
|
+
# Check mandate events
|
|
132
|
+
events_url = f"{bolt_diy_url.rstrip('/')}/api/mandate?mandate_id={mandate_id}"
|
|
133
|
+
response = requests.get(events_url, timeout=5)
|
|
134
|
+
|
|
135
|
+
if response.status_code == 200:
|
|
136
|
+
data = response.json()
|
|
137
|
+
events = data.get("events", [])
|
|
138
|
+
|
|
139
|
+
# Check for completion events
|
|
140
|
+
for event in events:
|
|
141
|
+
event_type = event.get("type", "")
|
|
142
|
+
|
|
143
|
+
if event_type == "iteration_end":
|
|
144
|
+
last_status = "completed"
|
|
145
|
+
# Extract generated files from event data
|
|
146
|
+
event_data = event.get("data", {})
|
|
147
|
+
if "files_created" in event_data:
|
|
148
|
+
generated_files.extend(event_data["files_created"])
|
|
149
|
+
if "files_modified" in event_data:
|
|
150
|
+
generated_files.extend(event_data["files_modified"])
|
|
151
|
+
elif event_type == "error":
|
|
152
|
+
last_status = "failed"
|
|
153
|
+
elif event_type == "iteration_start":
|
|
154
|
+
last_status = "running"
|
|
155
|
+
|
|
156
|
+
# Check if we have a completion event
|
|
157
|
+
if last_status == "completed":
|
|
158
|
+
print(f"[INFO] Mandate execution completed!")
|
|
159
|
+
return {
|
|
160
|
+
"status": "completed",
|
|
161
|
+
"events": events,
|
|
162
|
+
"generated_files": list(set(generated_files)), # Remove duplicates
|
|
163
|
+
"event_count": len(events)
|
|
164
|
+
}
|
|
165
|
+
elif last_status == "failed":
|
|
166
|
+
error_msg = "Unknown error"
|
|
167
|
+
for event in events:
|
|
168
|
+
if event.get("type") == "error":
|
|
169
|
+
error_msg = event.get("data", {}).get("message", error_msg)
|
|
170
|
+
print(f"[INFO] Mandate execution failed: {error_msg}")
|
|
171
|
+
return {
|
|
172
|
+
"status": "failed",
|
|
173
|
+
"events": events,
|
|
174
|
+
"error": error_msg
|
|
175
|
+
}
|
|
176
|
+
except Exception as e:
|
|
177
|
+
print(f"[WARN] Error checking mandate status: {e}")
|
|
178
|
+
|
|
179
|
+
elapsed = int(time.time() - start_time)
|
|
180
|
+
if elapsed % 15 == 0: # Print status every 15 seconds
|
|
181
|
+
print(f"[WAIT] Still executing... ({elapsed}s/{max_wait}s, {len(events)} events)")
|
|
182
|
+
|
|
183
|
+
time.sleep(check_interval)
|
|
184
|
+
|
|
185
|
+
print(f"[WARN] Mandate execution did not complete within {max_wait} seconds")
|
|
186
|
+
return {
|
|
187
|
+
"status": "timeout",
|
|
188
|
+
"events": events,
|
|
189
|
+
"generated_files": list(set(generated_files))
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def test_mandate_submission():
|
|
194
|
+
"""Test 2: Submit a mandate to bolt.diy and wait for code generation."""
|
|
195
|
+
print("\n" + "="*80)
|
|
196
|
+
print("TEST 2: Mandate Submission & Code Generation")
|
|
197
|
+
print("="*80)
|
|
198
|
+
|
|
199
|
+
bolt_diy_url = os.getenv("BOLT_DIY_API_URL", "http://localhost:5173")
|
|
200
|
+
|
|
201
|
+
# Ensure bolt.diy is ready
|
|
202
|
+
if not ensure_bolt_diy_ready(bolt_diy_url, max_wait=30):
|
|
203
|
+
print("[SKIP] Skipping mandate submission test - bolt.diy not available")
|
|
204
|
+
return False
|
|
205
|
+
|
|
206
|
+
# Create a corporation
|
|
207
|
+
print("[INFO] Creating corporation...")
|
|
208
|
+
corp = create_corporation(
|
|
209
|
+
name="BoltIntegrationTestCorp",
|
|
210
|
+
verbose=True,
|
|
211
|
+
budget_limit=200.0,
|
|
212
|
+
auto_deploy_enabled=False,
|
|
213
|
+
auto_test_enabled=True
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
# Create a proposal that will become a mandate
|
|
217
|
+
print("[INFO] Creating code-related proposal...")
|
|
218
|
+
sponsor_id = corp.executive_team[0] if corp.executive_team else corp.board_members[0]
|
|
219
|
+
|
|
220
|
+
proposal_id = corp.create_proposal(
|
|
221
|
+
title="Build Simple Todo App - Bolt Integration Test",
|
|
222
|
+
description=(
|
|
223
|
+
"Create a simple HTML/CSS/JavaScript todo application. "
|
|
224
|
+
"Features: add todos, mark as complete, delete todos. "
|
|
225
|
+
"This is a test mandate to verify bolt.diy integration. "
|
|
226
|
+
"Revenue-generating project for lead generation."
|
|
227
|
+
),
|
|
228
|
+
proposal_type=ProposalType.STRATEGIC_INITIATIVE,
|
|
229
|
+
sponsor_id=sponsor_id,
|
|
230
|
+
department=DepartmentType.TECHNOLOGY,
|
|
231
|
+
budget_impact=15.0,
|
|
232
|
+
timeline="1 day"
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
print(f"[INFO] Created proposal: {proposal_id}")
|
|
236
|
+
|
|
237
|
+
# Execute the mandate directly
|
|
238
|
+
print("[INFO] Creating and executing mandate...")
|
|
239
|
+
|
|
240
|
+
mandate = {
|
|
241
|
+
"mandate_id": f"bolt-test-mandate-{int(time.time())}",
|
|
242
|
+
"objectives": [
|
|
243
|
+
"Create a simple HTML todo application",
|
|
244
|
+
"Add functionality to add, delete, and mark todos as complete",
|
|
245
|
+
"Style with basic CSS",
|
|
246
|
+
"Make it revenue-focused with lead generation features"
|
|
247
|
+
],
|
|
248
|
+
"constraints": {
|
|
249
|
+
"language": "html",
|
|
250
|
+
"maxDependencies": 0,
|
|
251
|
+
"no_frameworks": True
|
|
252
|
+
},
|
|
253
|
+
"budget": {
|
|
254
|
+
"token": 50000,
|
|
255
|
+
"time": 300,
|
|
256
|
+
"cost": 2.0
|
|
257
|
+
},
|
|
258
|
+
"deliverables": [
|
|
259
|
+
"index.html",
|
|
260
|
+
"style.css",
|
|
261
|
+
"script.js"
|
|
262
|
+
],
|
|
263
|
+
"governance": {
|
|
264
|
+
"proposal_id": proposal_id
|
|
265
|
+
},
|
|
266
|
+
"iteration_config": {
|
|
267
|
+
"max_iterations": 2,
|
|
268
|
+
"test_required": False
|
|
269
|
+
},
|
|
270
|
+
"deployment": {
|
|
271
|
+
"enabled": False,
|
|
272
|
+
"provider": "netlify",
|
|
273
|
+
"auto_deploy": False
|
|
274
|
+
},
|
|
275
|
+
"testing": {
|
|
276
|
+
"enabled": False,
|
|
277
|
+
"generate_tests": False,
|
|
278
|
+
"run_tests": False
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
# Execute mandate (this will make real HTTP calls and open browser windows)
|
|
283
|
+
print(f"[INFO] Submitting mandate {mandate['mandate_id']} to bolt.diy...")
|
|
284
|
+
result = corp.execute_code_mandate(mandate, proposal_id=proposal_id)
|
|
285
|
+
|
|
286
|
+
if result is None:
|
|
287
|
+
print("[FAIL] Mandate execution returned None")
|
|
288
|
+
return False
|
|
289
|
+
|
|
290
|
+
print(f"[INFO] Mandate execution result: {result.get('status')}")
|
|
291
|
+
|
|
292
|
+
if result.get("status") == "accepted":
|
|
293
|
+
mandate_id = result.get("mandate_id") or mandate["mandate_id"]
|
|
294
|
+
print(f"[PASS] Mandate accepted by bolt.diy!")
|
|
295
|
+
print(f"[INFO] Mandate ID: {mandate_id}")
|
|
296
|
+
print(f"[INFO] Observability: {bolt_diy_url}/observability/{mandate_id}")
|
|
297
|
+
print(f"[INFO] Execute: {bolt_diy_url}/execute/{mandate_id}")
|
|
298
|
+
print(f"[INFO] Workflow: {bolt_diy_url}/workflow/{proposal_id}")
|
|
299
|
+
print(f"[INFO] Home page: {bolt_diy_url}/")
|
|
300
|
+
print(f"[INFO] Browser windows should have opened automatically")
|
|
301
|
+
print(f"[INFO] Waiting for code generation to complete...")
|
|
302
|
+
|
|
303
|
+
# Wait for execution to complete
|
|
304
|
+
execution_result = wait_for_mandate_execution(bolt_diy_url, mandate_id, max_wait=300)
|
|
305
|
+
|
|
306
|
+
if execution_result["status"] == "completed":
|
|
307
|
+
generated_files = execution_result.get("generated_files", [])
|
|
308
|
+
event_count = execution_result.get("event_count", 0)
|
|
309
|
+
|
|
310
|
+
print(f"[PASS] Code generation completed successfully!")
|
|
311
|
+
print(f"[INFO] Generated {len(generated_files)} file(s):")
|
|
312
|
+
for file in generated_files:
|
|
313
|
+
print(f" - {file}")
|
|
314
|
+
print(f"[INFO] Total events: {event_count}")
|
|
315
|
+
print(f"[INFO] View generated code at: {bolt_diy_url}/observability/{mandate_id}")
|
|
316
|
+
return True
|
|
317
|
+
elif execution_result["status"] == "failed":
|
|
318
|
+
error = execution_result.get("error", "Unknown error")
|
|
319
|
+
print(f"[FAIL] Code generation failed: {error}")
|
|
320
|
+
return False
|
|
321
|
+
elif execution_result["status"] == "timeout":
|
|
322
|
+
generated_files = execution_result.get("generated_files", [])
|
|
323
|
+
print(f"[WARN] Code generation did not complete within timeout")
|
|
324
|
+
if generated_files:
|
|
325
|
+
print(f"[INFO] Partial files generated: {', '.join(generated_files)}")
|
|
326
|
+
print(f"[INFO] Check execution status manually at: {bolt_diy_url}/observability/{mandate_id}")
|
|
327
|
+
return False
|
|
328
|
+
else:
|
|
329
|
+
print(f"[WARN] Unknown execution status: {execution_result.get('status')}")
|
|
330
|
+
return False
|
|
331
|
+
elif result.get("status") == "completed":
|
|
332
|
+
print(f"[PASS] Mandate completed!")
|
|
333
|
+
return True
|
|
334
|
+
elif result.get("status") == "failed":
|
|
335
|
+
error = result.get("error", "Unknown error")
|
|
336
|
+
print(f"[FAIL] Mandate execution failed: {error}")
|
|
337
|
+
return False
|
|
338
|
+
else:
|
|
339
|
+
print(f"[WARN] Unknown mandate status: {result.get('status')}")
|
|
340
|
+
return True # Still consider it a pass if we got a response
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def test_mandate_status_checking():
|
|
344
|
+
"""Test 3: Check mandate status after submission."""
|
|
345
|
+
print("\n" + "="*80)
|
|
346
|
+
print("TEST 3: Mandate Status Checking")
|
|
347
|
+
print("="*80)
|
|
348
|
+
|
|
349
|
+
bolt_diy_url = os.getenv("BOLT_DIY_API_URL", "http://localhost:5173")
|
|
350
|
+
|
|
351
|
+
# Ensure bolt.diy is ready
|
|
352
|
+
if not ensure_bolt_diy_ready(bolt_diy_url, max_wait=10):
|
|
353
|
+
print("[SKIP] Skipping status check test - bolt.diy not available")
|
|
354
|
+
return False
|
|
355
|
+
|
|
356
|
+
# Create corporation and submit a mandate
|
|
357
|
+
corp = create_corporation(
|
|
358
|
+
name="StatusCheckCorp",
|
|
359
|
+
verbose=False,
|
|
360
|
+
budget_limit=100.0
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
mandate = {
|
|
364
|
+
"mandate_id": f"status-test-{int(time.time())}",
|
|
365
|
+
"objectives": ["Test status checking"],
|
|
366
|
+
"constraints": {"language": "html", "maxDependencies": 0},
|
|
367
|
+
"budget": {"token": 10000, "time": 60, "cost": 0.5},
|
|
368
|
+
"deliverables": ["test.html"],
|
|
369
|
+
"governance": {"proposal_id": "test-proposal"},
|
|
370
|
+
"iteration_config": {"max_iterations": 1, "test_required": False},
|
|
371
|
+
"deployment": {"enabled": False},
|
|
372
|
+
"testing": {"enabled": False}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
# Submit mandate
|
|
376
|
+
result = corp.execute_code_mandate(mandate, proposal_id="test-proposal")
|
|
377
|
+
|
|
378
|
+
if result and result.get("status") == "accepted":
|
|
379
|
+
mandate_id = result.get("mandate_id") or mandate["mandate_id"]
|
|
380
|
+
|
|
381
|
+
# Wait a bit for execution to start
|
|
382
|
+
print(f"[INFO] Waiting 3 seconds for execution to start...")
|
|
383
|
+
time.sleep(3)
|
|
384
|
+
|
|
385
|
+
# Check status
|
|
386
|
+
status = corp.check_mandate_status(mandate_id, bolt_diy_url)
|
|
387
|
+
|
|
388
|
+
print(f"[INFO] Mandate status: {status}")
|
|
389
|
+
|
|
390
|
+
if status in ["accepted", "running", "completed"]:
|
|
391
|
+
print(f"[PASS] Status check working (status: {status})")
|
|
392
|
+
return True
|
|
393
|
+
else:
|
|
394
|
+
print(f"[WARN] Unexpected status: {status}")
|
|
395
|
+
return True # Still pass, status checking is working
|
|
396
|
+
else:
|
|
397
|
+
print(f"[SKIP] Could not submit mandate for status check")
|
|
398
|
+
return False
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def run_all_tests():
|
|
402
|
+
"""Run all bolt.diy integration tests."""
|
|
403
|
+
print("\n" + "="*80)
|
|
404
|
+
print("Bolt.diy Integration Test Suite")
|
|
405
|
+
print("="*80)
|
|
406
|
+
|
|
407
|
+
tests = [
|
|
408
|
+
("Bolt.diy Health Check", test_bolt_diy_health),
|
|
409
|
+
("Mandate Submission", test_mandate_submission),
|
|
410
|
+
("Mandate Status Checking", test_mandate_status_checking),
|
|
411
|
+
]
|
|
412
|
+
|
|
413
|
+
results = []
|
|
414
|
+
|
|
415
|
+
for test_name, test_func in tests:
|
|
416
|
+
try:
|
|
417
|
+
result = test_func()
|
|
418
|
+
results.append((test_name, result))
|
|
419
|
+
except Exception as e:
|
|
420
|
+
print(f"[ERROR] {test_name} raised exception: {e}")
|
|
421
|
+
import traceback
|
|
422
|
+
traceback.print_exc()
|
|
423
|
+
results.append((test_name, False))
|
|
424
|
+
|
|
425
|
+
# Print summary
|
|
426
|
+
print("\n" + "="*80)
|
|
427
|
+
print("TEST SUMMARY")
|
|
428
|
+
print("="*80)
|
|
429
|
+
|
|
430
|
+
passed = sum(1 for _, result in results if result)
|
|
431
|
+
total = len(results)
|
|
432
|
+
|
|
433
|
+
for test_name, result in results:
|
|
434
|
+
status = "[PASS]" if result else "[FAIL]"
|
|
435
|
+
print(f"{status} {test_name}")
|
|
436
|
+
|
|
437
|
+
print(f"\nTotal: {passed}/{total} tests passed")
|
|
438
|
+
print("="*80 + "\n")
|
|
439
|
+
|
|
440
|
+
return passed == total
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
if __name__ == "__main__":
|
|
444
|
+
success = run_all_tests()
|
|
445
|
+
sys.exit(0 if success else 1)
|
|
446
|
+
|