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
tools/actuators.py
ADDED
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
"""Actuator interfaces and implementations for policy engine.
|
|
2
|
+
|
|
3
|
+
Provides standardized actuator interfaces for executing interventions
|
|
4
|
+
on system controls, cloud resources, and services.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from typing import Any, Dict, List, Optional
|
|
9
|
+
from loguru import logger
|
|
10
|
+
import subprocess
|
|
11
|
+
import os
|
|
12
|
+
|
|
13
|
+
from schemas.policy import InterventionSpec
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class BaseActuator(ABC):
|
|
17
|
+
"""Abstract base class for actuators.
|
|
18
|
+
|
|
19
|
+
All actuators must implement execute() to apply interventions.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def execute(self, interventions: List[InterventionSpec]) -> Dict[str, Any]:
|
|
24
|
+
"""
|
|
25
|
+
Execute interventions.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
interventions: List of intervention specifications
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
Dict[str, Any]: Execution results with status and metadata
|
|
32
|
+
"""
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
def validate(self, intervention: InterventionSpec) -> bool:
|
|
36
|
+
"""
|
|
37
|
+
Validate intervention before execution.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
intervention: Intervention to validate
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
bool: True if intervention is valid
|
|
44
|
+
"""
|
|
45
|
+
return True
|
|
46
|
+
|
|
47
|
+
def rollback(self, rollback_descriptor: Dict[str, Any]) -> bool:
|
|
48
|
+
"""
|
|
49
|
+
Rollback an intervention.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
rollback_descriptor: Rollback descriptor from intervention
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
bool: True if rollback succeeded
|
|
56
|
+
"""
|
|
57
|
+
logger.warning(f"Rollback not implemented for {self.__class__.__name__}")
|
|
58
|
+
return False
|
|
59
|
+
|
|
60
|
+
def status(self) -> Dict[str, Any]:
|
|
61
|
+
"""
|
|
62
|
+
Get actuator status.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
Dict[str, Any]: Status information
|
|
66
|
+
"""
|
|
67
|
+
return {"status": "unknown"}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class SystemControlActuator(BaseActuator):
|
|
71
|
+
"""OS-level system control actuator.
|
|
72
|
+
|
|
73
|
+
Supports:
|
|
74
|
+
- CPU throttling (nice values, cgroups)
|
|
75
|
+
- Process management (start/stop/kill)
|
|
76
|
+
- I/O prioritization (ionice)
|
|
77
|
+
- Network QoS (tc, iptables) - requires root
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
def __init__(self, require_root: bool = False):
|
|
81
|
+
"""
|
|
82
|
+
Initialize system control actuator.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
require_root: Whether to require root privileges
|
|
86
|
+
"""
|
|
87
|
+
self.require_root = require_root
|
|
88
|
+
if require_root and os.geteuid() != 0:
|
|
89
|
+
logger.warning("Root privileges may be required for some operations")
|
|
90
|
+
|
|
91
|
+
def execute(self, interventions: List[InterventionSpec]) -> Dict[str, Any]:
|
|
92
|
+
"""Execute system control interventions."""
|
|
93
|
+
results = []
|
|
94
|
+
|
|
95
|
+
for intervention in interventions:
|
|
96
|
+
lever_id = intervention.lever_id
|
|
97
|
+
params = intervention.parameters
|
|
98
|
+
|
|
99
|
+
try:
|
|
100
|
+
if lever_id == "cpu_throttle":
|
|
101
|
+
result = self._cpu_throttle(params)
|
|
102
|
+
elif lever_id == "process_control":
|
|
103
|
+
result = self._process_control(params)
|
|
104
|
+
elif lever_id == "io_priority":
|
|
105
|
+
result = self._io_priority(params)
|
|
106
|
+
else:
|
|
107
|
+
result = {"status": "error", "message": f"Unknown lever: {lever_id}"}
|
|
108
|
+
|
|
109
|
+
results.append({
|
|
110
|
+
"intervention": intervention.model_dump(),
|
|
111
|
+
"result": result
|
|
112
|
+
})
|
|
113
|
+
except Exception as e:
|
|
114
|
+
logger.error(f"Actuator execution failed for {lever_id}: {e}")
|
|
115
|
+
results.append({
|
|
116
|
+
"intervention": intervention.model_dump(),
|
|
117
|
+
"result": {"status": "error", "message": str(e)}
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
"executed": len(results),
|
|
122
|
+
"results": results
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
def _cpu_throttle(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
126
|
+
"""Apply CPU throttling via nice values."""
|
|
127
|
+
nice_value = params.get("nice_value", 0)
|
|
128
|
+
pid = params.get("pid")
|
|
129
|
+
|
|
130
|
+
if pid is None:
|
|
131
|
+
return {"status": "error", "message": "pid required for cpu_throttle"}
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
# Set nice value (higher = lower priority)
|
|
135
|
+
os.nice(nice_value - os.nice(0)) # Adjust from current nice value
|
|
136
|
+
return {"status": "success", "nice_value": nice_value, "pid": pid}
|
|
137
|
+
except Exception as e:
|
|
138
|
+
return {"status": "error", "message": str(e)}
|
|
139
|
+
|
|
140
|
+
def _process_control(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
141
|
+
"""Control process (start/stop/kill)."""
|
|
142
|
+
action = params.get("action") # "start", "stop", "kill"
|
|
143
|
+
pid = params.get("pid")
|
|
144
|
+
command = params.get("command")
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
if action == "start" and command:
|
|
148
|
+
# Start process
|
|
149
|
+
process = subprocess.Popen(
|
|
150
|
+
command.split(),
|
|
151
|
+
stdout=subprocess.PIPE,
|
|
152
|
+
stderr=subprocess.PIPE
|
|
153
|
+
)
|
|
154
|
+
return {"status": "success", "action": action, "pid": process.pid}
|
|
155
|
+
|
|
156
|
+
elif action in ["stop", "kill"] and pid:
|
|
157
|
+
# Stop or kill process
|
|
158
|
+
os.kill(pid, 15 if action == "stop" else 9)
|
|
159
|
+
return {"status": "success", "action": action, "pid": pid}
|
|
160
|
+
|
|
161
|
+
else:
|
|
162
|
+
return {"status": "error", "message": "Invalid parameters for process_control"}
|
|
163
|
+
except Exception as e:
|
|
164
|
+
return {"status": "error", "message": str(e)}
|
|
165
|
+
|
|
166
|
+
def _io_priority(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
167
|
+
"""Set I/O priority using ionice (requires ionice command)."""
|
|
168
|
+
priority_class = params.get("priority_class", 2) # 1=realtime, 2=best-effort, 3=idle
|
|
169
|
+
priority_level = params.get("priority_level", 4) # 0-7 for best-effort
|
|
170
|
+
pid = params.get("pid")
|
|
171
|
+
|
|
172
|
+
if pid is None:
|
|
173
|
+
return {"status": "error", "message": "pid required for io_priority"}
|
|
174
|
+
|
|
175
|
+
try:
|
|
176
|
+
# Use ionice command if available
|
|
177
|
+
cmd = ["ionice", "-c", str(priority_class), "-n", str(priority_level), "-p", str(pid)]
|
|
178
|
+
result = subprocess.run(cmd, capture_output=True, text=True, timeout=5)
|
|
179
|
+
|
|
180
|
+
if result.returncode == 0:
|
|
181
|
+
return {"status": "success", "priority_class": priority_class, "priority_level": priority_level, "pid": pid}
|
|
182
|
+
else:
|
|
183
|
+
return {"status": "error", "message": result.stderr}
|
|
184
|
+
except FileNotFoundError:
|
|
185
|
+
return {"status": "error", "message": "ionice command not found"}
|
|
186
|
+
except Exception as e:
|
|
187
|
+
return {"status": "error", "message": str(e)}
|
|
188
|
+
|
|
189
|
+
def rollback(self, rollback_descriptor: Dict[str, Any]) -> bool:
|
|
190
|
+
"""Rollback system control intervention."""
|
|
191
|
+
lever_id = rollback_descriptor.get("lever_id")
|
|
192
|
+
params = rollback_descriptor.get("parameters", {})
|
|
193
|
+
|
|
194
|
+
try:
|
|
195
|
+
if lever_id == "cpu_throttle":
|
|
196
|
+
# Reset to default nice value (0)
|
|
197
|
+
params["nice_value"] = 0
|
|
198
|
+
result = self._cpu_throttle(params)
|
|
199
|
+
return result.get("status") == "success"
|
|
200
|
+
elif lever_id == "process_control":
|
|
201
|
+
# For process control, rollback might mean restarting stopped process
|
|
202
|
+
# This is context-dependent, so we just log
|
|
203
|
+
logger.info(f"Rollback for process_control requires manual intervention")
|
|
204
|
+
return True
|
|
205
|
+
else:
|
|
206
|
+
logger.warning(f"Rollback not implemented for {lever_id}")
|
|
207
|
+
return False
|
|
208
|
+
except Exception as e:
|
|
209
|
+
logger.error(f"Rollback failed: {e}")
|
|
210
|
+
return False
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
class CloudResourceActuator(BaseActuator):
|
|
214
|
+
"""Abstract base for cloud provider resource controls.
|
|
215
|
+
|
|
216
|
+
Subclasses should implement provider-specific control operations.
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
def __init__(self, provider: str, config: Optional[Dict[str, Any]] = None):
|
|
220
|
+
"""
|
|
221
|
+
Initialize cloud resource actuator.
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
provider: Cloud provider name ("aws", "gcp", "azure")
|
|
225
|
+
config: Provider-specific configuration
|
|
226
|
+
"""
|
|
227
|
+
self.provider = provider
|
|
228
|
+
self.config = config or {}
|
|
229
|
+
|
|
230
|
+
@abstractmethod
|
|
231
|
+
def execute(self, interventions: List[InterventionSpec]) -> Dict[str, Any]:
|
|
232
|
+
"""Execute cloud resource controls (implemented by subclasses)."""
|
|
233
|
+
pass
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
class ServiceActuator(BaseActuator):
|
|
237
|
+
"""Service management actuator (systemd, Docker, etc.)."""
|
|
238
|
+
|
|
239
|
+
def __init__(self, service_type: str = "systemd"):
|
|
240
|
+
"""
|
|
241
|
+
Initialize service actuator.
|
|
242
|
+
|
|
243
|
+
Args:
|
|
244
|
+
service_type: Type of service manager ("systemd", "docker", "kubernetes")
|
|
245
|
+
"""
|
|
246
|
+
self.service_type = service_type
|
|
247
|
+
|
|
248
|
+
def execute(self, interventions: List[InterventionSpec]) -> Dict[str, Any]:
|
|
249
|
+
"""Execute service control interventions."""
|
|
250
|
+
results = []
|
|
251
|
+
|
|
252
|
+
for intervention in interventions:
|
|
253
|
+
lever_id = intervention.lever_id
|
|
254
|
+
params = intervention.parameters
|
|
255
|
+
|
|
256
|
+
try:
|
|
257
|
+
if lever_id == "service_control":
|
|
258
|
+
result = self._service_control(params)
|
|
259
|
+
else:
|
|
260
|
+
result = {"status": "error", "message": f"Unknown lever: {lever_id}"}
|
|
261
|
+
|
|
262
|
+
results.append({
|
|
263
|
+
"intervention": intervention.model_dump(),
|
|
264
|
+
"result": result
|
|
265
|
+
})
|
|
266
|
+
except Exception as e:
|
|
267
|
+
logger.error(f"Service actuator execution failed: {e}")
|
|
268
|
+
results.append({
|
|
269
|
+
"intervention": intervention.model_dump(),
|
|
270
|
+
"result": {"status": "error", "message": str(e)}
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
return {
|
|
274
|
+
"executed": len(results),
|
|
275
|
+
"results": results
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
def _service_control(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
279
|
+
"""Control systemd service."""
|
|
280
|
+
action = params.get("action") # "start", "stop", "restart", "reload"
|
|
281
|
+
service_name = params.get("service_name")
|
|
282
|
+
|
|
283
|
+
if not service_name:
|
|
284
|
+
return {"status": "error", "message": "service_name required"}
|
|
285
|
+
|
|
286
|
+
try:
|
|
287
|
+
if self.service_type == "systemd":
|
|
288
|
+
cmd = ["systemctl", action, service_name]
|
|
289
|
+
result = subprocess.run(cmd, capture_output=True, text=True, timeout=10)
|
|
290
|
+
|
|
291
|
+
if result.returncode == 0:
|
|
292
|
+
return {"status": "success", "action": action, "service": service_name}
|
|
293
|
+
else:
|
|
294
|
+
return {"status": "error", "message": result.stderr}
|
|
295
|
+
else:
|
|
296
|
+
return {"status": "error", "message": f"Service type {self.service_type} not implemented"}
|
|
297
|
+
except Exception as e:
|
|
298
|
+
return {"status": "error", "message": str(e)}
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
class ActuatorRegistry:
|
|
302
|
+
"""Registry mapping lever types to actuator instances.
|
|
303
|
+
|
|
304
|
+
Provides bounds validation and transaction support.
|
|
305
|
+
"""
|
|
306
|
+
|
|
307
|
+
def __init__(self):
|
|
308
|
+
"""Initialize actuator registry."""
|
|
309
|
+
self.actuators: Dict[str, BaseActuator] = {}
|
|
310
|
+
self.lever_to_actuator: Dict[str, str] = {} # lever_id -> actuator_key
|
|
311
|
+
|
|
312
|
+
def register(self, actuator_key: str, actuator: BaseActuator, lever_types: Optional[List[str]] = None) -> None:
|
|
313
|
+
"""
|
|
314
|
+
Register an actuator.
|
|
315
|
+
|
|
316
|
+
Args:
|
|
317
|
+
actuator_key: Unique identifier for actuator
|
|
318
|
+
actuator: Actuator instance
|
|
319
|
+
lever_types: Optional list of lever IDs this actuator handles
|
|
320
|
+
"""
|
|
321
|
+
self.actuators[actuator_key] = actuator
|
|
322
|
+
if lever_types:
|
|
323
|
+
for lever_id in lever_types:
|
|
324
|
+
self.lever_to_actuator[lever_id] = actuator_key
|
|
325
|
+
logger.info(f"Registered actuator: {actuator_key}")
|
|
326
|
+
|
|
327
|
+
def get_actuator(self, actuator_key: str) -> Optional[BaseActuator]:
|
|
328
|
+
"""Get actuator by key."""
|
|
329
|
+
return self.actuators.get(actuator_key)
|
|
330
|
+
|
|
331
|
+
def get_actuator_for_lever(self, lever_id: str) -> Optional[BaseActuator]:
|
|
332
|
+
"""Get actuator for a specific lever."""
|
|
333
|
+
actuator_key = self.lever_to_actuator.get(lever_id)
|
|
334
|
+
if actuator_key:
|
|
335
|
+
return self.actuators.get(actuator_key)
|
|
336
|
+
return None
|
|
337
|
+
|
|
338
|
+
def execute(self, interventions: List[InterventionSpec], transaction: bool = False) -> Dict[str, Any]:
|
|
339
|
+
"""
|
|
340
|
+
Execute interventions via appropriate actuators.
|
|
341
|
+
|
|
342
|
+
Args:
|
|
343
|
+
interventions: List of interventions to execute
|
|
344
|
+
transaction: If True, execute all-or-nothing (rollback on failure)
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
Dict[str, Any]: Execution results
|
|
348
|
+
"""
|
|
349
|
+
if transaction:
|
|
350
|
+
# Transaction mode: collect all results, rollback on any failure
|
|
351
|
+
results = []
|
|
352
|
+
executed = []
|
|
353
|
+
|
|
354
|
+
for intervention in interventions:
|
|
355
|
+
actuator = self.get_actuator_for_lever(intervention.lever_id)
|
|
356
|
+
if not actuator:
|
|
357
|
+
# Rollback all previous
|
|
358
|
+
for prev_intervention in executed:
|
|
359
|
+
self._rollback_intervention(prev_intervention)
|
|
360
|
+
return {
|
|
361
|
+
"status": "error",
|
|
362
|
+
"message": f"No actuator for lever {intervention.lever_id}",
|
|
363
|
+
"results": results
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
# Validate before execution
|
|
367
|
+
if not actuator.validate(intervention):
|
|
368
|
+
# Rollback all previous
|
|
369
|
+
for prev_intervention in executed:
|
|
370
|
+
self._rollback_intervention(prev_intervention)
|
|
371
|
+
return {
|
|
372
|
+
"status": "error",
|
|
373
|
+
"message": f"Validation failed for {intervention.lever_id}",
|
|
374
|
+
"results": results
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
# Execute
|
|
378
|
+
result = actuator.execute([intervention])
|
|
379
|
+
results.append(result)
|
|
380
|
+
executed.append(intervention)
|
|
381
|
+
|
|
382
|
+
# Check for errors
|
|
383
|
+
if result.get("results", [{}])[0].get("result", {}).get("status") == "error":
|
|
384
|
+
# Rollback all previous
|
|
385
|
+
for prev_intervention in executed:
|
|
386
|
+
self._rollback_intervention(prev_intervention)
|
|
387
|
+
return {
|
|
388
|
+
"status": "error",
|
|
389
|
+
"message": f"Execution failed for {intervention.lever_id}",
|
|
390
|
+
"results": results
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return {
|
|
394
|
+
"status": "success",
|
|
395
|
+
"executed": len(executed),
|
|
396
|
+
"results": results
|
|
397
|
+
}
|
|
398
|
+
else:
|
|
399
|
+
# Non-transaction mode: execute independently
|
|
400
|
+
all_results = []
|
|
401
|
+
for intervention in interventions:
|
|
402
|
+
actuator = self.get_actuator_for_lever(intervention.lever_id)
|
|
403
|
+
if actuator:
|
|
404
|
+
if actuator.validate(intervention):
|
|
405
|
+
result = actuator.execute([intervention])
|
|
406
|
+
all_results.append(result)
|
|
407
|
+
else:
|
|
408
|
+
all_results.append({
|
|
409
|
+
"status": "error",
|
|
410
|
+
"message": f"Validation failed for {intervention.lever_id}"
|
|
411
|
+
})
|
|
412
|
+
else:
|
|
413
|
+
all_results.append({
|
|
414
|
+
"status": "error",
|
|
415
|
+
"message": f"No actuator for lever {intervention.lever_id}"
|
|
416
|
+
})
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
"status": "partial",
|
|
420
|
+
"executed": len(all_results),
|
|
421
|
+
"results": all_results
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
def _rollback_intervention(self, intervention: InterventionSpec) -> bool:
|
|
425
|
+
"""Rollback a single intervention."""
|
|
426
|
+
if not intervention.rollback_descriptor:
|
|
427
|
+
return False
|
|
428
|
+
|
|
429
|
+
actuator = self.get_actuator_for_lever(intervention.lever_id)
|
|
430
|
+
if actuator:
|
|
431
|
+
return actuator.rollback(intervention.rollback_descriptor)
|
|
432
|
+
return False
|
|
433
|
+
|
|
434
|
+
def status_all(self) -> Dict[str, Dict[str, Any]]:
|
|
435
|
+
"""Get status of all actuators."""
|
|
436
|
+
return {key: actuator.status() for key, actuator in self.actuators.items()}
|
|
437
|
+
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# ---- build stage ----
|
|
2
|
+
FROM node:22-bookworm-slim AS build
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
|
|
5
|
+
# CI-friendly env
|
|
6
|
+
ENV HUSKY=0
|
|
7
|
+
ENV CI=true
|
|
8
|
+
|
|
9
|
+
# Use pnpm
|
|
10
|
+
RUN corepack enable && corepack prepare pnpm@9.15.9 --activate
|
|
11
|
+
|
|
12
|
+
# Ensure git is available for build and runtime scripts
|
|
13
|
+
RUN apt-get update && apt-get install -y --no-install-recommends git \
|
|
14
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
15
|
+
|
|
16
|
+
# Accept (optional) build-time public URL for Remix/Vite (Coolify can pass it)
|
|
17
|
+
ARG VITE_PUBLIC_APP_URL
|
|
18
|
+
ENV VITE_PUBLIC_APP_URL=${VITE_PUBLIC_APP_URL}
|
|
19
|
+
|
|
20
|
+
# Install deps efficiently
|
|
21
|
+
COPY package.json pnpm-lock.yaml* ./
|
|
22
|
+
RUN pnpm fetch
|
|
23
|
+
|
|
24
|
+
# Copy source and build
|
|
25
|
+
COPY . .
|
|
26
|
+
# install with dev deps (needed to build)
|
|
27
|
+
RUN pnpm install --offline --frozen-lockfile
|
|
28
|
+
|
|
29
|
+
# Build the Remix app (SSR + client)
|
|
30
|
+
RUN NODE_OPTIONS=--max-old-space-size=4096 pnpm run build
|
|
31
|
+
|
|
32
|
+
# ---- production dependencies stage ----
|
|
33
|
+
FROM build AS prod-deps
|
|
34
|
+
|
|
35
|
+
# Keep only production deps for runtime
|
|
36
|
+
RUN pnpm prune --prod --ignore-scripts
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# ---- production stage ----
|
|
40
|
+
FROM prod-deps AS bolt-ai-production
|
|
41
|
+
WORKDIR /app
|
|
42
|
+
|
|
43
|
+
ENV NODE_ENV=production
|
|
44
|
+
ENV PORT=5173
|
|
45
|
+
ENV HOST=0.0.0.0
|
|
46
|
+
|
|
47
|
+
# Non-sensitive build arguments
|
|
48
|
+
ARG VITE_LOG_LEVEL=debug
|
|
49
|
+
ARG DEFAULT_NUM_CTX
|
|
50
|
+
|
|
51
|
+
# Set non-sensitive environment variables
|
|
52
|
+
ENV WRANGLER_SEND_METRICS=false \
|
|
53
|
+
VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \
|
|
54
|
+
DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX} \
|
|
55
|
+
RUNNING_IN_DOCKER=true
|
|
56
|
+
|
|
57
|
+
# Note: API keys should be provided at runtime via docker run -e or docker-compose
|
|
58
|
+
# Example: docker run -e OPENAI_API_KEY=your_key_here ...
|
|
59
|
+
|
|
60
|
+
# Install curl for healthchecks and copy bindings script
|
|
61
|
+
RUN apt-get update && apt-get install -y --no-install-recommends curl \
|
|
62
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
63
|
+
|
|
64
|
+
# Copy built files and scripts
|
|
65
|
+
COPY --from=prod-deps /app/build /app/build
|
|
66
|
+
COPY --from=prod-deps /app/node_modules /app/node_modules
|
|
67
|
+
COPY --from=prod-deps /app/package.json /app/package.json
|
|
68
|
+
COPY --from=prod-deps /app/bindings.sh /app/bindings.sh
|
|
69
|
+
|
|
70
|
+
# Pre-configure wrangler to disable metrics
|
|
71
|
+
RUN mkdir -p /root/.config/.wrangler && \
|
|
72
|
+
echo '{"enabled":false}' > /root/.config/.wrangler/metrics.json
|
|
73
|
+
|
|
74
|
+
# Make bindings script executable
|
|
75
|
+
RUN chmod +x /app/bindings.sh
|
|
76
|
+
|
|
77
|
+
EXPOSE 5173
|
|
78
|
+
|
|
79
|
+
# Healthcheck for deployment platforms
|
|
80
|
+
HEALTHCHECK --interval=10s --timeout=3s --start-period=5s --retries=5 \
|
|
81
|
+
CMD curl -fsS http://localhost:5173/ || exit 1
|
|
82
|
+
|
|
83
|
+
# Start using dockerstart script with Wrangler
|
|
84
|
+
CMD ["pnpm", "run", "dockerstart"]
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
# ---- development stage ----
|
|
88
|
+
FROM build AS development
|
|
89
|
+
|
|
90
|
+
# Non-sensitive development arguments
|
|
91
|
+
ARG VITE_LOG_LEVEL=debug
|
|
92
|
+
ARG DEFAULT_NUM_CTX
|
|
93
|
+
|
|
94
|
+
# Set non-sensitive environment variables for development
|
|
95
|
+
ENV VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \
|
|
96
|
+
DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX} \
|
|
97
|
+
RUNNING_IN_DOCKER=true
|
|
98
|
+
|
|
99
|
+
# Note: API keys should be provided at runtime via docker run -e or docker-compose
|
|
100
|
+
# Example: docker run -e OPENAI_API_KEY=your_key_here ...
|
|
101
|
+
|
|
102
|
+
RUN mkdir -p /app/run
|
|
103
|
+
CMD ["pnpm", "run", "dev", "--host"]
|