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
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Core execution logic for headless browser mandate execution.
3
+ *
4
+ * Uses Playwright to control a browser and execute mandates via WebContainer.
5
+ */
6
+
7
+ import { chromium, Browser, Page, BrowserContext } from 'playwright';
8
+ import type { Mandate, ExecutionEvent, ExecutionResult } from './types.js';
9
+
10
+ export interface ExecutorConfig {
11
+ boltDiyUrl: string;
12
+ governorUrl: string;
13
+ workerId: string;
14
+ headless: boolean;
15
+ timeout: number;
16
+ }
17
+
18
+ export class HeadlessExecutor {
19
+ private browser: Browser | null = null;
20
+ private context: BrowserContext | null = null;
21
+ private config: ExecutorConfig;
22
+ private activePages: Map<string, Page> = new Map();
23
+
24
+ constructor(config: ExecutorConfig) {
25
+ this.config = config;
26
+ }
27
+
28
+ /**
29
+ * Initialize browser and context.
30
+ */
31
+ async initialize(): Promise<void> {
32
+ if (this.browser) {
33
+ return; // Already initialized
34
+ }
35
+
36
+ this.browser = await chromium.launch({
37
+ headless: this.config.headless !== false,
38
+ args: [
39
+ '--no-sandbox',
40
+ '--disable-setuid-sandbox',
41
+ '--disable-dev-shm-usage',
42
+ '--disable-accelerated-2d-canvas',
43
+ '--disable-gpu',
44
+ ],
45
+ });
46
+
47
+ this.context = await this.browser.newContext({
48
+ viewport: { width: 1920, height: 1080 },
49
+ ignoreHTTPSErrors: true,
50
+ });
51
+
52
+ console.log('Headless browser initialized');
53
+ }
54
+
55
+ /**
56
+ * Execute a mandate in headless browser.
57
+ */
58
+ async executeMandate(mandate: Mandate): Promise<ExecutionResult> {
59
+ if (!this.browser || !this.context) {
60
+ await this.initialize();
61
+ }
62
+
63
+ if (!this.context) {
64
+ throw new Error('Browser context not initialized');
65
+ }
66
+
67
+ const page = await this.context.newPage();
68
+ this.activePages.set(mandate.mandate_id, page);
69
+
70
+ try {
71
+ // Navigate to execution page
72
+ const executionUrl = `${this.config.boltDiyUrl}/execute/${mandate.mandate_id}`;
73
+ console.log(`Navigating to ${executionUrl}`);
74
+
75
+ await page.goto(executionUrl, {
76
+ waitUntil: 'networkidle',
77
+ timeout: 30000,
78
+ });
79
+
80
+ // Wait for page to load and start execution
81
+ await page.waitForSelector('#root', { timeout: 10000 });
82
+
83
+ // Inject mandate data into page
84
+ await page.evaluate((mandateData) => {
85
+ (window as any).__MANDATE_DATA__ = mandateData;
86
+ }, mandate);
87
+
88
+ // Wait for execution to complete
89
+ // The page will auto-execute and emit events
90
+ const result = await this.waitForExecutionComplete(page, mandate.mandate_id);
91
+
92
+ return result;
93
+ } catch (error) {
94
+ console.error(`Error executing mandate ${mandate.mandate_id}:`, error);
95
+ throw error;
96
+ } finally {
97
+ await page.close();
98
+ this.activePages.delete(mandate.mandate_id);
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Wait for execution to complete and collect result.
104
+ */
105
+ private async waitForExecutionComplete(
106
+ page: Page,
107
+ mandateId: string
108
+ ): Promise<ExecutionResult> {
109
+ return new Promise((resolve, reject) => {
110
+ const timeout = setTimeout(() => {
111
+ reject(new Error(`Execution timeout for mandate ${mandateId}`));
112
+ }, this.config.timeout);
113
+
114
+ // Listen for execution completion event
115
+ page.on('console', async (msg) => {
116
+ const text = msg.text();
117
+ if (text.includes('EXECUTION_COMPLETE')) {
118
+ clearTimeout(timeout);
119
+ try {
120
+ // Get result from page
121
+ const result = await page.evaluate(() => {
122
+ return (window as any).__EXECUTION_RESULT__;
123
+ });
124
+
125
+ if (result) {
126
+ resolve(result);
127
+ } else {
128
+ reject(new Error('Execution completed but no result found'));
129
+ }
130
+ } catch (error) {
131
+ reject(error);
132
+ }
133
+ } else if (text.includes('EXECUTION_ERROR')) {
134
+ clearTimeout(timeout);
135
+ const error = await page.evaluate(() => {
136
+ return (window as any).__EXECUTION_ERROR__;
137
+ });
138
+ reject(new Error(error || 'Execution failed'));
139
+ }
140
+ });
141
+
142
+ // Also check for completion via DOM
143
+ const checkInterval = setInterval(async () => {
144
+ try {
145
+ const status = await page.evaluate(() => {
146
+ const statusEl = document.querySelector('[data-execution-status]');
147
+ return statusEl?.getAttribute('data-execution-status');
148
+ });
149
+
150
+ if (status === 'completed' || status === 'failed') {
151
+ clearInterval(checkInterval);
152
+ clearTimeout(timeout);
153
+
154
+ const result = await page.evaluate(() => {
155
+ return (window as any).__EXECUTION_RESULT__;
156
+ });
157
+
158
+ if (result) {
159
+ resolve(result);
160
+ } else {
161
+ // Create result from status
162
+ resolve({
163
+ mandate_id: mandateId,
164
+ status: status === 'completed' ? 'success' : 'failed',
165
+ iterations_completed: 0,
166
+ final_state: {},
167
+ governance_summary: {},
168
+ budget_summary: {
169
+ tokens_used: 0,
170
+ time_elapsed: 0,
171
+ cost_incurred: 0,
172
+ budget_remaining: { tokens: 0, time: 0, cost: 0 },
173
+ },
174
+ events: [],
175
+ created_at: Date.now(),
176
+ completed_at: Date.now(),
177
+ });
178
+ }
179
+ }
180
+ } catch (error) {
181
+ // Continue checking
182
+ }
183
+ }, 1000);
184
+ });
185
+ }
186
+
187
+ /**
188
+ * Cleanup browser and context.
189
+ */
190
+ async cleanup(): Promise<void> {
191
+ // Close all active pages
192
+ for (const page of this.activePages.values()) {
193
+ await page.close().catch(() => {});
194
+ }
195
+ this.activePages.clear();
196
+
197
+ if (this.context) {
198
+ await this.context.close();
199
+ this.context = null;
200
+ }
201
+
202
+ if (this.browser) {
203
+ await this.browser.close();
204
+ this.browser = null;
205
+ }
206
+
207
+ console.log('Headless browser cleaned up');
208
+ }
209
+ }
210
+
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Headless Executor Worker Service
3
+ *
4
+ * Connects to Execution Governor and executes mandates using Playwright.
5
+ */
6
+
7
+ import { WebSocket } from 'ws';
8
+ import { HeadlessExecutor, type ExecutorConfig } from './executor.js';
9
+ import type { Mandate, ExecutionEvent } from './types.js';
10
+
11
+ const GOVERNOR_URL = process.env.GOVERNOR_URL || 'http://localhost:3000';
12
+ const BOLT_DIY_URL = process.env.BOLT_DIY_URL || 'http://localhost:5173';
13
+ const WORKER_ID = process.env.WORKER_ID || `worker-${Date.now()}`;
14
+ const MAX_CONCURRENT = parseInt(process.env.MAX_CONCURRENT || '1', 10);
15
+ const POLL_INTERVAL = parseInt(process.env.POLL_INTERVAL || '5000', 10);
16
+
17
+ const config: ExecutorConfig = {
18
+ boltDiyUrl: BOLT_DIY_URL,
19
+ governorUrl: GOVERNOR_URL,
20
+ workerId: WORKER_ID,
21
+ headless: process.env.HEADLESS !== 'false',
22
+ timeout: parseInt(process.env.EXECUTION_TIMEOUT || '3600000', 10), // 1 hour default
23
+ };
24
+
25
+ const executor = new HeadlessExecutor(config);
26
+ let isRunning = false;
27
+ let currentExecutions = 0;
28
+ let ws: WebSocket | null = null;
29
+
30
+ /**
31
+ * Register worker with governor.
32
+ */
33
+ async function registerWorker(): Promise<boolean> {
34
+ try {
35
+ const response = await fetch(`${GOVERNOR_URL}/workers/register`, {
36
+ method: 'POST',
37
+ headers: { 'Content-Type': 'application/json' },
38
+ body: JSON.stringify({
39
+ workerId: WORKER_ID,
40
+ capabilities: {
41
+ maxConcurrent: MAX_CONCURRENT,
42
+ },
43
+ }),
44
+ });
45
+
46
+ if (!response.ok) {
47
+ console.error(`Failed to register worker: ${response.statusText}`);
48
+ return false;
49
+ }
50
+
51
+ const result = await response.json();
52
+ console.log(`Worker registered: ${result.message}`);
53
+ return true;
54
+ } catch (error) {
55
+ console.error('Error registering worker:', error);
56
+ return false;
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Send heartbeat to governor.
62
+ */
63
+ async function sendHeartbeat(): Promise<void> {
64
+ try {
65
+ await fetch(`${GOVERNOR_URL}/workers/${WORKER_ID}/heartbeat`, {
66
+ method: 'POST',
67
+ headers: { 'Content-Type': 'application/json' },
68
+ body: JSON.stringify({
69
+ status: currentExecutions > 0 ? 'busy' : 'idle',
70
+ }),
71
+ });
72
+ } catch (error) {
73
+ console.error('Error sending heartbeat:', error);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Request next mandate from governor.
79
+ */
80
+ async function requestMandate(): Promise<Mandate | null> {
81
+ try {
82
+ const response = await fetch(`${GOVERNOR_URL}/workers/${WORKER_ID}/request-mandate`, {
83
+ method: 'POST',
84
+ headers: { 'Content-Type': 'application/json' },
85
+ });
86
+
87
+ if (!response.ok) {
88
+ return null;
89
+ }
90
+
91
+ const data = await response.json();
92
+ if (!data.mandate_id) {
93
+ return null;
94
+ }
95
+
96
+ // Fetch full mandate details
97
+ const mandateResponse = await fetch(`${GOVERNOR_URL}/mandates/${data.mandate_id}`);
98
+ if (!mandateResponse.ok) {
99
+ return null;
100
+ }
101
+
102
+ const mandateData = await mandateResponse.json();
103
+ return mandateData.mandate;
104
+ } catch (error) {
105
+ console.error('Error requesting mandate:', error);
106
+ return null;
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Report execution progress to governor.
112
+ */
113
+ async function reportProgress(
114
+ mandateId: string,
115
+ event: ExecutionEvent,
116
+ progress?: number
117
+ ): Promise<void> {
118
+ try {
119
+ await fetch(`${GOVERNOR_URL}/workers/${WORKER_ID}/report-progress`, {
120
+ method: 'POST',
121
+ headers: { 'Content-Type': 'application/json' },
122
+ body: JSON.stringify({
123
+ mandateId,
124
+ event,
125
+ progress,
126
+ }),
127
+ });
128
+ } catch (error) {
129
+ console.error('Error reporting progress:', error);
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Report execution completion to governor.
135
+ */
136
+ async function reportCompletion(
137
+ mandateId: string,
138
+ success: boolean,
139
+ result?: any,
140
+ error?: string
141
+ ): Promise<void> {
142
+ try {
143
+ await fetch(`${GOVERNOR_URL}/workers/${WORKER_ID}/complete`, {
144
+ method: 'POST',
145
+ headers: { 'Content-Type': 'application/json' },
146
+ body: JSON.stringify({
147
+ mandateId,
148
+ success,
149
+ result,
150
+ error,
151
+ }),
152
+ });
153
+ } catch (error) {
154
+ console.error('Error reporting completion:', error);
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Execute a mandate.
160
+ */
161
+ async function executeMandate(mandate: Mandate): Promise<void> {
162
+ currentExecutions++;
163
+ const startTime = Date.now();
164
+
165
+ console.log(`Starting execution of mandate ${mandate.mandate_id}`);
166
+
167
+ try {
168
+ // Initialize executor if needed
169
+ await executor.initialize();
170
+
171
+ // Report start
172
+ await reportProgress(mandate.mandate_id, {
173
+ mandate_id: mandate.mandate_id,
174
+ iteration: 0,
175
+ type: 'iteration_start',
176
+ timestamp: Date.now(),
177
+ data: { status: 'running' },
178
+ metadata: {},
179
+ });
180
+
181
+ // Execute mandate
182
+ const result = await executor.executeMandate(mandate);
183
+
184
+ const duration = Date.now() - startTime;
185
+ console.log(
186
+ `Mandate ${mandate.mandate_id} ${result.status} in ${duration}ms`
187
+ );
188
+
189
+ // Report completion
190
+ await reportCompletion(mandate.mandate_id, result.status === 'success', result);
191
+ } catch (error) {
192
+ const duration = Date.now() - startTime;
193
+ const errorMessage = error instanceof Error ? error.message : String(error);
194
+ console.error(`Mandate ${mandate.mandate_id} failed:`, errorMessage);
195
+
196
+ // Report failure
197
+ await reportCompletion(mandate.mandate_id, false, undefined, errorMessage);
198
+ } finally {
199
+ currentExecutions--;
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Main worker loop.
205
+ */
206
+ async function workerLoop(): Promise<void> {
207
+ while (isRunning) {
208
+ try {
209
+ // Check if we can accept more work
210
+ if (currentExecutions >= MAX_CONCURRENT) {
211
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL));
212
+ continue;
213
+ }
214
+
215
+ // Request mandate
216
+ const mandate = await requestMandate();
217
+ if (!mandate) {
218
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL));
219
+ continue;
220
+ }
221
+
222
+ // Execute mandate (don't await - run in parallel)
223
+ executeMandate(mandate).catch((error) => {
224
+ console.error(`Error in mandate execution:`, error);
225
+ });
226
+ } catch (error) {
227
+ console.error('Error in worker loop:', error);
228
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL));
229
+ }
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Connect to governor WebSocket for real-time updates.
235
+ */
236
+ function connectWebSocket(): void {
237
+ const wsUrl = GOVERNOR_URL.replace('http://', 'ws://').replace('https://', 'wss://');
238
+ ws = new WebSocket(wsUrl);
239
+
240
+ ws.on('open', () => {
241
+ console.log('Connected to governor WebSocket');
242
+ });
243
+
244
+ ws.on('message', (data: Buffer) => {
245
+ try {
246
+ const message = JSON.parse(data.toString());
247
+ if (message.type === 'mandate_assigned' && message.mandate) {
248
+ // Governor pushed a mandate - execute it
249
+ if (currentExecutions < MAX_CONCURRENT) {
250
+ executeMandate(message.mandate).catch((error) => {
251
+ console.error(`Error executing pushed mandate:`, error);
252
+ });
253
+ }
254
+ }
255
+ } catch (error) {
256
+ console.error('Error handling WebSocket message:', error);
257
+ }
258
+ });
259
+
260
+ ws.on('error', (error) => {
261
+ console.error('WebSocket error:', error);
262
+ });
263
+
264
+ ws.on('close', () => {
265
+ console.log('WebSocket closed, reconnecting...');
266
+ setTimeout(connectWebSocket, 5000);
267
+ });
268
+ }
269
+
270
+ /**
271
+ * Initialize and start worker.
272
+ */
273
+ async function start(): Promise<void> {
274
+ console.log(`Starting headless executor worker ${WORKER_ID}`);
275
+ console.log(`Governor URL: ${GOVERNOR_URL}`);
276
+ console.log(`Bolt.diy URL: ${BOLT_DIY_URL}`);
277
+ console.log(`Max concurrent: ${MAX_CONCURRENT}`);
278
+
279
+ // Register with governor
280
+ const registered = await registerWorker();
281
+ if (!registered) {
282
+ console.error('Failed to register worker, exiting');
283
+ process.exit(1);
284
+ }
285
+
286
+ // Connect WebSocket
287
+ connectWebSocket();
288
+
289
+ // Start heartbeat
290
+ setInterval(sendHeartbeat, 30000); // Every 30 seconds
291
+
292
+ // Start worker loop
293
+ isRunning = true;
294
+ workerLoop().catch((error) => {
295
+ console.error('Worker loop error:', error);
296
+ process.exit(1);
297
+ });
298
+ }
299
+
300
+ /**
301
+ * Graceful shutdown.
302
+ */
303
+ async function shutdown(): Promise<void> {
304
+ console.log('Shutting down worker...');
305
+ isRunning = false;
306
+
307
+ if (ws) {
308
+ ws.close();
309
+ }
310
+
311
+ await executor.cleanup();
312
+ process.exit(0);
313
+ }
314
+
315
+ process.on('SIGTERM', shutdown);
316
+ process.on('SIGINT', shutdown);
317
+
318
+ // Start worker
319
+ start().catch((error) => {
320
+ console.error('Failed to start worker:', error);
321
+ process.exit(1);
322
+ });
323
+
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "headless-executor",
3
+ "version": "1.0.0",
4
+ "description": "Headless browser worker for executing mandates with WebContainer",
5
+ "type": "module",
6
+ "main": "index.js",
7
+ "scripts": {
8
+ "dev": "tsx watch index.ts",
9
+ "build": "tsc",
10
+ "start": "node dist/index.js",
11
+ "typecheck": "tsc --noEmit"
12
+ },
13
+ "dependencies": {
14
+ "playwright": "^1.41.0",
15
+ "ws": "^8.16.0"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^20.11.0",
19
+ "@types/ws": "^8.5.10",
20
+ "tsx": "^4.7.0",
21
+ "typescript": "^5.3.3"
22
+ },
23
+ "engines": {
24
+ "node": ">=18.18.0"
25
+ }
26
+ }
27
+
@@ -0,0 +1,21 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ES2022",
5
+ "lib": ["ES2022"],
6
+ "moduleResolution": "node",
7
+ "outDir": "./dist",
8
+ "rootDir": "./",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "resolveJsonModule": true,
14
+ "declaration": true,
15
+ "declarationMap": true,
16
+ "sourceMap": true
17
+ },
18
+ "include": ["**/*.ts"],
19
+ "exclude": ["node_modules", "dist"]
20
+ }
21
+
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Type definitions for Headless Executor
3
+ */
4
+
5
+ export interface Mandate {
6
+ mandate_id: string;
7
+ objectives: string[];
8
+ constraints: any;
9
+ budget: any;
10
+ deliverables: string[];
11
+ governance?: any;
12
+ iteration_config: any;
13
+ deployment?: any;
14
+ }
15
+
16
+ export interface ExecutionEvent {
17
+ mandate_id: string;
18
+ iteration: number;
19
+ type: string;
20
+ timestamp: number;
21
+ data: Record<string, any>;
22
+ metadata?: Record<string, any>;
23
+ }
24
+
25
+ export interface ExecutionResult {
26
+ mandate_id: string;
27
+ status: "success" | "failed" | "stopped" | "timeout" | "budget_exceeded";
28
+ iterations_completed: number;
29
+ final_state: any;
30
+ governance_summary: any;
31
+ budget_summary: any;
32
+ deployment_result?: any;
33
+ errors?: any[];
34
+ events: ExecutionEvent[];
35
+ created_at: number;
36
+ completed_at: number;
37
+ }
38
+