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.
Files changed (501) hide show
  1. .github/ISSUE_TEMPLATE/bug_report.md +65 -0
  2. .github/ISSUE_TEMPLATE/feature_request.md +41 -0
  3. .github/PULL_REQUEST_TEMPLATE.md +20 -0
  4. .github/workflows/publish-manual.yml +61 -0
  5. .github/workflows/publish.yml +64 -0
  6. .gitignore +214 -0
  7. CRCA.py +4156 -0
  8. LICENSE +201 -0
  9. MANIFEST.in +43 -0
  10. PKG-INFO +5035 -0
  11. README.md +4959 -0
  12. __init__.py +17 -0
  13. branches/CRCA-Q.py +2728 -0
  14. branches/crca_cg/corposwarm.py +9065 -0
  15. branches/crca_cg/fix_rancher_docker_creds.ps1 +155 -0
  16. branches/crca_cg/package.json +5 -0
  17. branches/crca_cg/test_bolt_integration.py +446 -0
  18. branches/crca_cg/test_corposwarm_comprehensive.py +773 -0
  19. branches/crca_cg/test_new_features.py +163 -0
  20. branches/crca_sd/__init__.py +149 -0
  21. branches/crca_sd/crca_sd_core.py +770 -0
  22. branches/crca_sd/crca_sd_governance.py +1325 -0
  23. branches/crca_sd/crca_sd_mpc.py +1130 -0
  24. branches/crca_sd/crca_sd_realtime.py +1844 -0
  25. branches/crca_sd/crca_sd_tui.py +1133 -0
  26. crca-1.4.0.dist-info/METADATA +5035 -0
  27. crca-1.4.0.dist-info/RECORD +501 -0
  28. crca-1.4.0.dist-info/WHEEL +4 -0
  29. crca-1.4.0.dist-info/licenses/LICENSE +201 -0
  30. docs/CRCA-Q.md +2333 -0
  31. examples/config.yaml.example +25 -0
  32. examples/crca_sd_example.py +513 -0
  33. examples/data_broker_example.py +294 -0
  34. examples/logistics_corporation.py +861 -0
  35. examples/palantir_example.py +299 -0
  36. examples/policy_bench.py +934 -0
  37. examples/pridnestrovia-sd.py +705 -0
  38. examples/pridnestrovia_realtime.py +1902 -0
  39. prompts/__init__.py +10 -0
  40. prompts/default_crca.py +101 -0
  41. pyproject.toml +151 -0
  42. requirements.txt +76 -0
  43. schemas/__init__.py +43 -0
  44. schemas/mcpSchemas.py +51 -0
  45. schemas/policy.py +458 -0
  46. templates/__init__.py +38 -0
  47. templates/base_specialized_agent.py +195 -0
  48. templates/drift_detection.py +325 -0
  49. templates/examples/causal_agent_template.py +309 -0
  50. templates/examples/drag_drop_example.py +213 -0
  51. templates/examples/logistics_agent_template.py +207 -0
  52. templates/examples/trading_agent_template.py +206 -0
  53. templates/feature_mixins.py +253 -0
  54. templates/graph_management.py +442 -0
  55. templates/llm_integration.py +194 -0
  56. templates/module_registry.py +276 -0
  57. templates/mpc_planner.py +280 -0
  58. templates/policy_loop.py +1168 -0
  59. templates/prediction_framework.py +448 -0
  60. templates/statistical_methods.py +778 -0
  61. tests/sanity.yml +31 -0
  62. tests/sanity_check +406 -0
  63. tests/test_core.py +47 -0
  64. tests/test_crca_excel.py +166 -0
  65. tests/test_crca_sd.py +780 -0
  66. tests/test_data_broker.py +424 -0
  67. tests/test_palantir.py +349 -0
  68. tools/__init__.py +38 -0
  69. tools/actuators.py +437 -0
  70. tools/bolt.diy/Dockerfile +103 -0
  71. tools/bolt.diy/app/components/@settings/core/AvatarDropdown.tsx +175 -0
  72. tools/bolt.diy/app/components/@settings/core/ControlPanel.tsx +345 -0
  73. tools/bolt.diy/app/components/@settings/core/constants.tsx +108 -0
  74. tools/bolt.diy/app/components/@settings/core/types.ts +114 -0
  75. tools/bolt.diy/app/components/@settings/index.ts +12 -0
  76. tools/bolt.diy/app/components/@settings/shared/components/TabTile.tsx +151 -0
  77. tools/bolt.diy/app/components/@settings/shared/service-integration/ConnectionForm.tsx +193 -0
  78. tools/bolt.diy/app/components/@settings/shared/service-integration/ConnectionTestIndicator.tsx +60 -0
  79. tools/bolt.diy/app/components/@settings/shared/service-integration/ErrorState.tsx +102 -0
  80. tools/bolt.diy/app/components/@settings/shared/service-integration/LoadingState.tsx +94 -0
  81. tools/bolt.diy/app/components/@settings/shared/service-integration/ServiceHeader.tsx +72 -0
  82. tools/bolt.diy/app/components/@settings/shared/service-integration/index.ts +6 -0
  83. tools/bolt.diy/app/components/@settings/tabs/data/DataTab.tsx +721 -0
  84. tools/bolt.diy/app/components/@settings/tabs/data/DataVisualization.tsx +384 -0
  85. tools/bolt.diy/app/components/@settings/tabs/event-logs/EventLogsTab.tsx +1013 -0
  86. tools/bolt.diy/app/components/@settings/tabs/features/FeaturesTab.tsx +295 -0
  87. tools/bolt.diy/app/components/@settings/tabs/github/GitHubTab.tsx +281 -0
  88. tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubAuthDialog.tsx +173 -0
  89. tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubCacheManager.tsx +367 -0
  90. tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubConnection.tsx +233 -0
  91. tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubErrorBoundary.tsx +105 -0
  92. tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubProgressiveLoader.tsx +266 -0
  93. tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubRepositoryCard.tsx +121 -0
  94. tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubRepositorySelector.tsx +312 -0
  95. tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubStats.tsx +291 -0
  96. tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubUserProfile.tsx +46 -0
  97. tools/bolt.diy/app/components/@settings/tabs/github/components/shared/GitHubStateIndicators.tsx +264 -0
  98. tools/bolt.diy/app/components/@settings/tabs/github/components/shared/RepositoryCard.tsx +361 -0
  99. tools/bolt.diy/app/components/@settings/tabs/github/components/shared/index.ts +11 -0
  100. tools/bolt.diy/app/components/@settings/tabs/gitlab/GitLabTab.tsx +305 -0
  101. tools/bolt.diy/app/components/@settings/tabs/gitlab/components/GitLabAuthDialog.tsx +186 -0
  102. tools/bolt.diy/app/components/@settings/tabs/gitlab/components/GitLabConnection.tsx +253 -0
  103. tools/bolt.diy/app/components/@settings/tabs/gitlab/components/GitLabRepositorySelector.tsx +358 -0
  104. tools/bolt.diy/app/components/@settings/tabs/gitlab/components/RepositoryCard.tsx +79 -0
  105. tools/bolt.diy/app/components/@settings/tabs/gitlab/components/RepositoryList.tsx +142 -0
  106. tools/bolt.diy/app/components/@settings/tabs/gitlab/components/StatsDisplay.tsx +91 -0
  107. tools/bolt.diy/app/components/@settings/tabs/gitlab/components/index.ts +4 -0
  108. tools/bolt.diy/app/components/@settings/tabs/mcp/McpServerList.tsx +99 -0
  109. tools/bolt.diy/app/components/@settings/tabs/mcp/McpServerListItem.tsx +70 -0
  110. tools/bolt.diy/app/components/@settings/tabs/mcp/McpStatusBadge.tsx +37 -0
  111. tools/bolt.diy/app/components/@settings/tabs/mcp/McpTab.tsx +239 -0
  112. tools/bolt.diy/app/components/@settings/tabs/netlify/NetlifyTab.tsx +1393 -0
  113. tools/bolt.diy/app/components/@settings/tabs/netlify/components/NetlifyConnection.tsx +990 -0
  114. tools/bolt.diy/app/components/@settings/tabs/netlify/components/index.ts +1 -0
  115. tools/bolt.diy/app/components/@settings/tabs/notifications/NotificationsTab.tsx +300 -0
  116. tools/bolt.diy/app/components/@settings/tabs/profile/ProfileTab.tsx +181 -0
  117. tools/bolt.diy/app/components/@settings/tabs/providers/cloud/CloudProvidersTab.tsx +308 -0
  118. tools/bolt.diy/app/components/@settings/tabs/providers/local/ErrorBoundary.tsx +68 -0
  119. tools/bolt.diy/app/components/@settings/tabs/providers/local/HealthStatusBadge.tsx +64 -0
  120. tools/bolt.diy/app/components/@settings/tabs/providers/local/LoadingSkeleton.tsx +107 -0
  121. tools/bolt.diy/app/components/@settings/tabs/providers/local/LocalProvidersTab.tsx +556 -0
  122. tools/bolt.diy/app/components/@settings/tabs/providers/local/ModelCard.tsx +106 -0
  123. tools/bolt.diy/app/components/@settings/tabs/providers/local/ProviderCard.tsx +120 -0
  124. tools/bolt.diy/app/components/@settings/tabs/providers/local/SetupGuide.tsx +671 -0
  125. tools/bolt.diy/app/components/@settings/tabs/providers/local/StatusDashboard.tsx +91 -0
  126. tools/bolt.diy/app/components/@settings/tabs/providers/local/types.ts +44 -0
  127. tools/bolt.diy/app/components/@settings/tabs/settings/SettingsTab.tsx +215 -0
  128. tools/bolt.diy/app/components/@settings/tabs/supabase/SupabaseTab.tsx +1089 -0
  129. tools/bolt.diy/app/components/@settings/tabs/vercel/VercelTab.tsx +909 -0
  130. tools/bolt.diy/app/components/@settings/tabs/vercel/components/VercelConnection.tsx +368 -0
  131. tools/bolt.diy/app/components/@settings/tabs/vercel/components/index.ts +1 -0
  132. tools/bolt.diy/app/components/@settings/utils/tab-helpers.ts +54 -0
  133. tools/bolt.diy/app/components/chat/APIKeyManager.tsx +169 -0
  134. tools/bolt.diy/app/components/chat/Artifact.tsx +296 -0
  135. tools/bolt.diy/app/components/chat/AssistantMessage.tsx +192 -0
  136. tools/bolt.diy/app/components/chat/BaseChat.module.scss +47 -0
  137. tools/bolt.diy/app/components/chat/BaseChat.tsx +522 -0
  138. tools/bolt.diy/app/components/chat/Chat.client.tsx +670 -0
  139. tools/bolt.diy/app/components/chat/ChatAlert.tsx +108 -0
  140. tools/bolt.diy/app/components/chat/ChatBox.tsx +334 -0
  141. tools/bolt.diy/app/components/chat/CodeBlock.module.scss +10 -0
  142. tools/bolt.diy/app/components/chat/CodeBlock.tsx +85 -0
  143. tools/bolt.diy/app/components/chat/DicussMode.tsx +17 -0
  144. tools/bolt.diy/app/components/chat/ExamplePrompts.tsx +37 -0
  145. tools/bolt.diy/app/components/chat/FilePreview.tsx +38 -0
  146. tools/bolt.diy/app/components/chat/GitCloneButton.tsx +327 -0
  147. tools/bolt.diy/app/components/chat/ImportFolderButton.tsx +141 -0
  148. tools/bolt.diy/app/components/chat/LLMApiAlert.tsx +109 -0
  149. tools/bolt.diy/app/components/chat/MCPTools.tsx +129 -0
  150. tools/bolt.diy/app/components/chat/Markdown.module.scss +171 -0
  151. tools/bolt.diy/app/components/chat/Markdown.spec.ts +48 -0
  152. tools/bolt.diy/app/components/chat/Markdown.tsx +252 -0
  153. tools/bolt.diy/app/components/chat/Messages.client.tsx +102 -0
  154. tools/bolt.diy/app/components/chat/ModelSelector.tsx +797 -0
  155. tools/bolt.diy/app/components/chat/NetlifyDeploymentLink.client.tsx +51 -0
  156. tools/bolt.diy/app/components/chat/ProgressCompilation.tsx +110 -0
  157. tools/bolt.diy/app/components/chat/ScreenshotStateManager.tsx +33 -0
  158. tools/bolt.diy/app/components/chat/SendButton.client.tsx +39 -0
  159. tools/bolt.diy/app/components/chat/SpeechRecognition.tsx +28 -0
  160. tools/bolt.diy/app/components/chat/StarterTemplates.tsx +38 -0
  161. tools/bolt.diy/app/components/chat/SupabaseAlert.tsx +199 -0
  162. tools/bolt.diy/app/components/chat/SupabaseConnection.tsx +339 -0
  163. tools/bolt.diy/app/components/chat/ThoughtBox.tsx +43 -0
  164. tools/bolt.diy/app/components/chat/ToolInvocations.tsx +409 -0
  165. tools/bolt.diy/app/components/chat/UserMessage.tsx +101 -0
  166. tools/bolt.diy/app/components/chat/VercelDeploymentLink.client.tsx +158 -0
  167. tools/bolt.diy/app/components/chat/chatExportAndImport/ExportChatButton.tsx +49 -0
  168. tools/bolt.diy/app/components/chat/chatExportAndImport/ImportButtons.tsx +96 -0
  169. tools/bolt.diy/app/components/deploy/DeployAlert.tsx +197 -0
  170. tools/bolt.diy/app/components/deploy/DeployButton.tsx +277 -0
  171. tools/bolt.diy/app/components/deploy/GitHubDeploy.client.tsx +171 -0
  172. tools/bolt.diy/app/components/deploy/GitHubDeploymentDialog.tsx +1041 -0
  173. tools/bolt.diy/app/components/deploy/GitLabDeploy.client.tsx +171 -0
  174. tools/bolt.diy/app/components/deploy/GitLabDeploymentDialog.tsx +764 -0
  175. tools/bolt.diy/app/components/deploy/NetlifyDeploy.client.tsx +246 -0
  176. tools/bolt.diy/app/components/deploy/VercelDeploy.client.tsx +235 -0
  177. tools/bolt.diy/app/components/editor/codemirror/BinaryContent.tsx +7 -0
  178. tools/bolt.diy/app/components/editor/codemirror/CodeMirrorEditor.tsx +555 -0
  179. tools/bolt.diy/app/components/editor/codemirror/EnvMasking.ts +80 -0
  180. tools/bolt.diy/app/components/editor/codemirror/cm-theme.ts +192 -0
  181. tools/bolt.diy/app/components/editor/codemirror/indent.ts +68 -0
  182. tools/bolt.diy/app/components/editor/codemirror/languages.ts +112 -0
  183. tools/bolt.diy/app/components/git/GitUrlImport.client.tsx +147 -0
  184. tools/bolt.diy/app/components/header/Header.tsx +42 -0
  185. tools/bolt.diy/app/components/header/HeaderActionButtons.client.tsx +54 -0
  186. tools/bolt.diy/app/components/mandate/MandateSubmission.tsx +167 -0
  187. tools/bolt.diy/app/components/observability/DeploymentStatus.tsx +168 -0
  188. tools/bolt.diy/app/components/observability/EventTimeline.tsx +119 -0
  189. tools/bolt.diy/app/components/observability/FileDiffViewer.tsx +121 -0
  190. tools/bolt.diy/app/components/observability/GovernanceStatus.tsx +197 -0
  191. tools/bolt.diy/app/components/observability/GovernorMetrics.tsx +246 -0
  192. tools/bolt.diy/app/components/observability/LogStream.tsx +244 -0
  193. tools/bolt.diy/app/components/observability/MandateDetails.tsx +201 -0
  194. tools/bolt.diy/app/components/observability/ObservabilityDashboard.tsx +200 -0
  195. tools/bolt.diy/app/components/sidebar/HistoryItem.tsx +187 -0
  196. tools/bolt.diy/app/components/sidebar/Menu.client.tsx +536 -0
  197. tools/bolt.diy/app/components/sidebar/date-binning.ts +59 -0
  198. tools/bolt.diy/app/components/txt +1 -0
  199. tools/bolt.diy/app/components/ui/BackgroundRays/index.tsx +18 -0
  200. tools/bolt.diy/app/components/ui/BackgroundRays/styles.module.scss +246 -0
  201. tools/bolt.diy/app/components/ui/Badge.tsx +53 -0
  202. tools/bolt.diy/app/components/ui/BranchSelector.tsx +270 -0
  203. tools/bolt.diy/app/components/ui/Breadcrumbs.tsx +101 -0
  204. tools/bolt.diy/app/components/ui/Button.tsx +46 -0
  205. tools/bolt.diy/app/components/ui/Card.tsx +55 -0
  206. tools/bolt.diy/app/components/ui/Checkbox.tsx +32 -0
  207. tools/bolt.diy/app/components/ui/CloseButton.tsx +49 -0
  208. tools/bolt.diy/app/components/ui/CodeBlock.tsx +103 -0
  209. tools/bolt.diy/app/components/ui/Collapsible.tsx +9 -0
  210. tools/bolt.diy/app/components/ui/ColorSchemeDialog.tsx +378 -0
  211. tools/bolt.diy/app/components/ui/Dialog.tsx +449 -0
  212. tools/bolt.diy/app/components/ui/Dropdown.tsx +63 -0
  213. tools/bolt.diy/app/components/ui/EmptyState.tsx +154 -0
  214. tools/bolt.diy/app/components/ui/FileIcon.tsx +346 -0
  215. tools/bolt.diy/app/components/ui/FilterChip.tsx +92 -0
  216. tools/bolt.diy/app/components/ui/GlowingEffect.tsx +192 -0
  217. tools/bolt.diy/app/components/ui/GradientCard.tsx +100 -0
  218. tools/bolt.diy/app/components/ui/IconButton.tsx +84 -0
  219. tools/bolt.diy/app/components/ui/Input.tsx +22 -0
  220. tools/bolt.diy/app/components/ui/Label.tsx +20 -0
  221. tools/bolt.diy/app/components/ui/LoadingDots.tsx +27 -0
  222. tools/bolt.diy/app/components/ui/LoadingOverlay.tsx +32 -0
  223. tools/bolt.diy/app/components/ui/PanelHeader.tsx +20 -0
  224. tools/bolt.diy/app/components/ui/PanelHeaderButton.tsx +36 -0
  225. tools/bolt.diy/app/components/ui/Popover.tsx +29 -0
  226. tools/bolt.diy/app/components/ui/Progress.tsx +22 -0
  227. tools/bolt.diy/app/components/ui/RepositoryStats.tsx +87 -0
  228. tools/bolt.diy/app/components/ui/ScrollArea.tsx +41 -0
  229. tools/bolt.diy/app/components/ui/SearchInput.tsx +80 -0
  230. tools/bolt.diy/app/components/ui/SearchResultItem.tsx +134 -0
  231. tools/bolt.diy/app/components/ui/Separator.tsx +22 -0
  232. tools/bolt.diy/app/components/ui/SettingsButton.tsx +35 -0
  233. tools/bolt.diy/app/components/ui/Slider.tsx +73 -0
  234. tools/bolt.diy/app/components/ui/StatusIndicator.tsx +90 -0
  235. tools/bolt.diy/app/components/ui/Switch.tsx +37 -0
  236. tools/bolt.diy/app/components/ui/Tabs.tsx +52 -0
  237. tools/bolt.diy/app/components/ui/TabsWithSlider.tsx +112 -0
  238. tools/bolt.diy/app/components/ui/ThemeSwitch.tsx +29 -0
  239. tools/bolt.diy/app/components/ui/Tooltip.tsx +122 -0
  240. tools/bolt.diy/app/components/ui/index.ts +38 -0
  241. tools/bolt.diy/app/components/ui/use-toast.ts +66 -0
  242. tools/bolt.diy/app/components/workbench/DiffView.tsx +796 -0
  243. tools/bolt.diy/app/components/workbench/EditorPanel.tsx +174 -0
  244. tools/bolt.diy/app/components/workbench/ExpoQrModal.tsx +55 -0
  245. tools/bolt.diy/app/components/workbench/FileBreadcrumb.tsx +150 -0
  246. tools/bolt.diy/app/components/workbench/FileTree.tsx +565 -0
  247. tools/bolt.diy/app/components/workbench/Inspector.tsx +126 -0
  248. tools/bolt.diy/app/components/workbench/InspectorPanel.tsx +146 -0
  249. tools/bolt.diy/app/components/workbench/LockManager.tsx +262 -0
  250. tools/bolt.diy/app/components/workbench/PortDropdown.tsx +91 -0
  251. tools/bolt.diy/app/components/workbench/Preview.tsx +1049 -0
  252. tools/bolt.diy/app/components/workbench/ScreenshotSelector.tsx +293 -0
  253. tools/bolt.diy/app/components/workbench/Search.tsx +257 -0
  254. tools/bolt.diy/app/components/workbench/Workbench.client.tsx +506 -0
  255. tools/bolt.diy/app/components/workbench/terminal/Terminal.tsx +131 -0
  256. tools/bolt.diy/app/components/workbench/terminal/TerminalManager.tsx +68 -0
  257. tools/bolt.diy/app/components/workbench/terminal/TerminalTabs.tsx +277 -0
  258. tools/bolt.diy/app/components/workbench/terminal/theme.ts +36 -0
  259. tools/bolt.diy/app/components/workflow/WorkflowPhase.tsx +109 -0
  260. tools/bolt.diy/app/components/workflow/WorkflowStatus.tsx +60 -0
  261. tools/bolt.diy/app/components/workflow/WorkflowTimeline.tsx +150 -0
  262. tools/bolt.diy/app/entry.client.tsx +7 -0
  263. tools/bolt.diy/app/entry.server.tsx +80 -0
  264. tools/bolt.diy/app/root.tsx +156 -0
  265. tools/bolt.diy/app/routes/_index.tsx +175 -0
  266. tools/bolt.diy/app/routes/api.bug-report.ts +254 -0
  267. tools/bolt.diy/app/routes/api.chat.ts +463 -0
  268. tools/bolt.diy/app/routes/api.check-env-key.ts +41 -0
  269. tools/bolt.diy/app/routes/api.configured-providers.ts +110 -0
  270. tools/bolt.diy/app/routes/api.corporate-swarm-status.ts +55 -0
  271. tools/bolt.diy/app/routes/api.enhancer.ts +137 -0
  272. tools/bolt.diy/app/routes/api.export-api-keys.ts +44 -0
  273. tools/bolt.diy/app/routes/api.git-info.ts +69 -0
  274. tools/bolt.diy/app/routes/api.git-proxy.$.ts +178 -0
  275. tools/bolt.diy/app/routes/api.github-branches.ts +166 -0
  276. tools/bolt.diy/app/routes/api.github-deploy.ts +67 -0
  277. tools/bolt.diy/app/routes/api.github-stats.ts +198 -0
  278. tools/bolt.diy/app/routes/api.github-template.ts +242 -0
  279. tools/bolt.diy/app/routes/api.github-user.ts +287 -0
  280. tools/bolt.diy/app/routes/api.gitlab-branches.ts +143 -0
  281. tools/bolt.diy/app/routes/api.gitlab-deploy.ts +67 -0
  282. tools/bolt.diy/app/routes/api.gitlab-projects.ts +105 -0
  283. tools/bolt.diy/app/routes/api.health.ts +8 -0
  284. tools/bolt.diy/app/routes/api.llmcall.ts +298 -0
  285. tools/bolt.diy/app/routes/api.mandate.ts +351 -0
  286. tools/bolt.diy/app/routes/api.mcp-check.ts +16 -0
  287. tools/bolt.diy/app/routes/api.mcp-update-config.ts +23 -0
  288. tools/bolt.diy/app/routes/api.models.$provider.ts +2 -0
  289. tools/bolt.diy/app/routes/api.models.ts +90 -0
  290. tools/bolt.diy/app/routes/api.netlify-deploy.ts +240 -0
  291. tools/bolt.diy/app/routes/api.netlify-user.ts +142 -0
  292. tools/bolt.diy/app/routes/api.supabase-user.ts +199 -0
  293. tools/bolt.diy/app/routes/api.supabase.query.ts +92 -0
  294. tools/bolt.diy/app/routes/api.supabase.ts +56 -0
  295. tools/bolt.diy/app/routes/api.supabase.variables.ts +32 -0
  296. tools/bolt.diy/app/routes/api.system.diagnostics.ts +142 -0
  297. tools/bolt.diy/app/routes/api.system.disk-info.ts +311 -0
  298. tools/bolt.diy/app/routes/api.system.git-info.ts +332 -0
  299. tools/bolt.diy/app/routes/api.update.ts +21 -0
  300. tools/bolt.diy/app/routes/api.vercel-deploy.ts +497 -0
  301. tools/bolt.diy/app/routes/api.vercel-user.ts +161 -0
  302. tools/bolt.diy/app/routes/api.workflow-status.$proposalId.ts +309 -0
  303. tools/bolt.diy/app/routes/chat.$id.tsx +8 -0
  304. tools/bolt.diy/app/routes/execute.$mandateId.tsx +432 -0
  305. tools/bolt.diy/app/routes/git.tsx +25 -0
  306. tools/bolt.diy/app/routes/observability.$mandateId.tsx +50 -0
  307. tools/bolt.diy/app/routes/webcontainer.connect.$id.tsx +32 -0
  308. tools/bolt.diy/app/routes/webcontainer.preview.$id.tsx +97 -0
  309. tools/bolt.diy/app/routes/workflow.$proposalId.tsx +170 -0
  310. tools/bolt.diy/app/styles/animations.scss +49 -0
  311. tools/bolt.diy/app/styles/components/code.scss +9 -0
  312. tools/bolt.diy/app/styles/components/editor.scss +135 -0
  313. tools/bolt.diy/app/styles/components/resize-handle.scss +30 -0
  314. tools/bolt.diy/app/styles/components/terminal.scss +3 -0
  315. tools/bolt.diy/app/styles/components/toast.scss +23 -0
  316. tools/bolt.diy/app/styles/diff-view.css +72 -0
  317. tools/bolt.diy/app/styles/index.scss +73 -0
  318. tools/bolt.diy/app/styles/variables.scss +255 -0
  319. tools/bolt.diy/app/styles/z-index.scss +37 -0
  320. tools/bolt.diy/app/types/GitHub.ts +182 -0
  321. tools/bolt.diy/app/types/GitLab.ts +103 -0
  322. tools/bolt.diy/app/types/actions.ts +85 -0
  323. tools/bolt.diy/app/types/artifact.ts +5 -0
  324. tools/bolt.diy/app/types/context.ts +26 -0
  325. tools/bolt.diy/app/types/design-scheme.ts +93 -0
  326. tools/bolt.diy/app/types/global.d.ts +13 -0
  327. tools/bolt.diy/app/types/mandate.ts +333 -0
  328. tools/bolt.diy/app/types/model.ts +25 -0
  329. tools/bolt.diy/app/types/netlify.ts +94 -0
  330. tools/bolt.diy/app/types/supabase.ts +54 -0
  331. tools/bolt.diy/app/types/template.ts +8 -0
  332. tools/bolt.diy/app/types/terminal.ts +9 -0
  333. tools/bolt.diy/app/types/theme.ts +1 -0
  334. tools/bolt.diy/app/types/vercel.ts +67 -0
  335. tools/bolt.diy/app/utils/buffer.ts +29 -0
  336. tools/bolt.diy/app/utils/classNames.ts +65 -0
  337. tools/bolt.diy/app/utils/constants.ts +147 -0
  338. tools/bolt.diy/app/utils/debounce.ts +13 -0
  339. tools/bolt.diy/app/utils/debugLogger.ts +1284 -0
  340. tools/bolt.diy/app/utils/diff.spec.ts +11 -0
  341. tools/bolt.diy/app/utils/diff.ts +117 -0
  342. tools/bolt.diy/app/utils/easings.ts +3 -0
  343. tools/bolt.diy/app/utils/fileLocks.ts +96 -0
  344. tools/bolt.diy/app/utils/fileUtils.ts +121 -0
  345. tools/bolt.diy/app/utils/folderImport.ts +73 -0
  346. tools/bolt.diy/app/utils/formatSize.ts +12 -0
  347. tools/bolt.diy/app/utils/getLanguageFromExtension.ts +24 -0
  348. tools/bolt.diy/app/utils/githubStats.ts +9 -0
  349. tools/bolt.diy/app/utils/gitlabStats.ts +54 -0
  350. tools/bolt.diy/app/utils/logger.ts +162 -0
  351. tools/bolt.diy/app/utils/markdown.ts +155 -0
  352. tools/bolt.diy/app/utils/mobile.ts +4 -0
  353. tools/bolt.diy/app/utils/os.ts +4 -0
  354. tools/bolt.diy/app/utils/path.ts +19 -0
  355. tools/bolt.diy/app/utils/projectCommands.ts +197 -0
  356. tools/bolt.diy/app/utils/promises.ts +19 -0
  357. tools/bolt.diy/app/utils/react.ts +6 -0
  358. tools/bolt.diy/app/utils/sampler.ts +49 -0
  359. tools/bolt.diy/app/utils/selectStarterTemplate.ts +255 -0
  360. tools/bolt.diy/app/utils/shell.ts +384 -0
  361. tools/bolt.diy/app/utils/stacktrace.ts +27 -0
  362. tools/bolt.diy/app/utils/stripIndent.ts +23 -0
  363. tools/bolt.diy/app/utils/terminal.ts +11 -0
  364. tools/bolt.diy/app/utils/unreachable.ts +3 -0
  365. tools/bolt.diy/app/vite-env.d.ts +2 -0
  366. tools/bolt.diy/assets/entitlements.mac.plist +25 -0
  367. tools/bolt.diy/assets/icons/icon.icns +0 -0
  368. tools/bolt.diy/assets/icons/icon.ico +0 -0
  369. tools/bolt.diy/assets/icons/icon.png +0 -0
  370. tools/bolt.diy/bindings.js +78 -0
  371. tools/bolt.diy/bindings.sh +33 -0
  372. tools/bolt.diy/docker-compose.yaml +145 -0
  373. tools/bolt.diy/electron/main/index.ts +201 -0
  374. tools/bolt.diy/electron/main/tsconfig.json +30 -0
  375. tools/bolt.diy/electron/main/ui/menu.ts +29 -0
  376. tools/bolt.diy/electron/main/ui/window.ts +54 -0
  377. tools/bolt.diy/electron/main/utils/auto-update.ts +110 -0
  378. tools/bolt.diy/electron/main/utils/constants.ts +4 -0
  379. tools/bolt.diy/electron/main/utils/cookie.ts +40 -0
  380. tools/bolt.diy/electron/main/utils/reload.ts +35 -0
  381. tools/bolt.diy/electron/main/utils/serve.ts +71 -0
  382. tools/bolt.diy/electron/main/utils/store.ts +3 -0
  383. tools/bolt.diy/electron/main/utils/vite-server.ts +44 -0
  384. tools/bolt.diy/electron/main/vite.config.ts +44 -0
  385. tools/bolt.diy/electron/preload/index.ts +22 -0
  386. tools/bolt.diy/electron/preload/tsconfig.json +7 -0
  387. tools/bolt.diy/electron/preload/vite.config.ts +31 -0
  388. tools/bolt.diy/electron-builder.yml +64 -0
  389. tools/bolt.diy/electron-update.yml +4 -0
  390. tools/bolt.diy/eslint.config.mjs +57 -0
  391. tools/bolt.diy/functions/[[path]].ts +12 -0
  392. tools/bolt.diy/icons/angular.svg +1 -0
  393. tools/bolt.diy/icons/astro.svg +8 -0
  394. tools/bolt.diy/icons/chat.svg +1 -0
  395. tools/bolt.diy/icons/expo-brand.svg +1 -0
  396. tools/bolt.diy/icons/expo.svg +4 -0
  397. tools/bolt.diy/icons/logo-text.svg +1 -0
  398. tools/bolt.diy/icons/logo.svg +4 -0
  399. tools/bolt.diy/icons/mcp.svg +1 -0
  400. tools/bolt.diy/icons/nativescript.svg +1 -0
  401. tools/bolt.diy/icons/netlify.svg +10 -0
  402. tools/bolt.diy/icons/nextjs.svg +1 -0
  403. tools/bolt.diy/icons/nuxt.svg +1 -0
  404. tools/bolt.diy/icons/qwik.svg +1 -0
  405. tools/bolt.diy/icons/react.svg +1 -0
  406. tools/bolt.diy/icons/remix.svg +24 -0
  407. tools/bolt.diy/icons/remotion.svg +1 -0
  408. tools/bolt.diy/icons/shadcn.svg +21 -0
  409. tools/bolt.diy/icons/slidev.svg +60 -0
  410. tools/bolt.diy/icons/solidjs.svg +1 -0
  411. tools/bolt.diy/icons/stars.svg +1 -0
  412. tools/bolt.diy/icons/svelte.svg +1 -0
  413. tools/bolt.diy/icons/typescript.svg +1 -0
  414. tools/bolt.diy/icons/vite.svg +1 -0
  415. tools/bolt.diy/icons/vue.svg +1 -0
  416. tools/bolt.diy/load-context.ts +9 -0
  417. tools/bolt.diy/notarize.cjs +31 -0
  418. tools/bolt.diy/package.json +218 -0
  419. tools/bolt.diy/playwright.config.preview.ts +35 -0
  420. tools/bolt.diy/pre-start.cjs +26 -0
  421. tools/bolt.diy/public/apple-touch-icon-precomposed.png +0 -0
  422. tools/bolt.diy/public/apple-touch-icon.png +0 -0
  423. tools/bolt.diy/public/favicon.ico +0 -0
  424. tools/bolt.diy/public/favicon.svg +4 -0
  425. tools/bolt.diy/public/icons/AmazonBedrock.svg +1 -0
  426. tools/bolt.diy/public/icons/Anthropic.svg +4 -0
  427. tools/bolt.diy/public/icons/Cohere.svg +4 -0
  428. tools/bolt.diy/public/icons/Deepseek.svg +5 -0
  429. tools/bolt.diy/public/icons/Default.svg +4 -0
  430. tools/bolt.diy/public/icons/Google.svg +4 -0
  431. tools/bolt.diy/public/icons/Groq.svg +4 -0
  432. tools/bolt.diy/public/icons/HuggingFace.svg +4 -0
  433. tools/bolt.diy/public/icons/Hyperbolic.svg +3 -0
  434. tools/bolt.diy/public/icons/LMStudio.svg +5 -0
  435. tools/bolt.diy/public/icons/Mistral.svg +4 -0
  436. tools/bolt.diy/public/icons/Ollama.svg +4 -0
  437. tools/bolt.diy/public/icons/OpenAI.svg +4 -0
  438. tools/bolt.diy/public/icons/OpenAILike.svg +4 -0
  439. tools/bolt.diy/public/icons/OpenRouter.svg +4 -0
  440. tools/bolt.diy/public/icons/Perplexity.svg +4 -0
  441. tools/bolt.diy/public/icons/Together.svg +4 -0
  442. tools/bolt.diy/public/icons/xAI.svg +5 -0
  443. tools/bolt.diy/public/inspector-script.js +292 -0
  444. tools/bolt.diy/public/logo-dark-styled.png +0 -0
  445. tools/bolt.diy/public/logo-dark.png +0 -0
  446. tools/bolt.diy/public/logo-light-styled.png +0 -0
  447. tools/bolt.diy/public/logo-light.png +0 -0
  448. tools/bolt.diy/public/logo.svg +15 -0
  449. tools/bolt.diy/public/social_preview_index.jpg +0 -0
  450. tools/bolt.diy/scripts/clean.js +45 -0
  451. tools/bolt.diy/scripts/electron-dev.mjs +181 -0
  452. tools/bolt.diy/scripts/setup-env.sh +41 -0
  453. tools/bolt.diy/scripts/update-imports.sh +7 -0
  454. tools/bolt.diy/scripts/update.sh +52 -0
  455. tools/bolt.diy/services/execution-governor/Dockerfile +41 -0
  456. tools/bolt.diy/services/execution-governor/config.ts +42 -0
  457. tools/bolt.diy/services/execution-governor/index.ts +683 -0
  458. tools/bolt.diy/services/execution-governor/metrics.ts +141 -0
  459. tools/bolt.diy/services/execution-governor/package.json +31 -0
  460. tools/bolt.diy/services/execution-governor/priority-queue.ts +139 -0
  461. tools/bolt.diy/services/execution-governor/tsconfig.json +21 -0
  462. tools/bolt.diy/services/execution-governor/types.ts +145 -0
  463. tools/bolt.diy/services/headless-executor/Dockerfile +43 -0
  464. tools/bolt.diy/services/headless-executor/executor.ts +210 -0
  465. tools/bolt.diy/services/headless-executor/index.ts +323 -0
  466. tools/bolt.diy/services/headless-executor/package.json +27 -0
  467. tools/bolt.diy/services/headless-executor/tsconfig.json +21 -0
  468. tools/bolt.diy/services/headless-executor/types.ts +38 -0
  469. tools/bolt.diy/test-workflows.sh +240 -0
  470. tools/bolt.diy/tests/integration/corporate-swarm.test.ts +208 -0
  471. tools/bolt.diy/tests/mandates/budget-limited.json +34 -0
  472. tools/bolt.diy/tests/mandates/complex.json +53 -0
  473. tools/bolt.diy/tests/mandates/constraint-enforced.json +36 -0
  474. tools/bolt.diy/tests/mandates/simple.json +35 -0
  475. tools/bolt.diy/tsconfig.json +37 -0
  476. tools/bolt.diy/types/istextorbinary.d.ts +15 -0
  477. tools/bolt.diy/uno.config.ts +279 -0
  478. tools/bolt.diy/vite-electron.config.ts +76 -0
  479. tools/bolt.diy/vite.config.ts +112 -0
  480. tools/bolt.diy/worker-configuration.d.ts +22 -0
  481. tools/bolt.diy/wrangler.toml +6 -0
  482. tools/code_generator.py +461 -0
  483. tools/file_operations.py +465 -0
  484. tools/mandate_generator.py +337 -0
  485. tools/mcpClientUtils.py +1216 -0
  486. tools/sensors.py +285 -0
  487. utils/Agent_types.py +15 -0
  488. utils/AnyToStr.py +0 -0
  489. utils/HHCS.py +277 -0
  490. utils/__init__.py +30 -0
  491. utils/agent.py +3627 -0
  492. utils/aop.py +2948 -0
  493. utils/canonical.py +143 -0
  494. utils/conversation.py +1195 -0
  495. utils/doctrine_versioning +230 -0
  496. utils/formatter.py +474 -0
  497. utils/ledger.py +311 -0
  498. utils/out_types.py +16 -0
  499. utils/rollback.py +339 -0
  500. utils/router.py +929 -0
  501. 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"]