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,432 @@
1
+ /**
2
+ * Auto-execution page for headless workers.
3
+ *
4
+ * This page automatically executes a mandate when loaded, designed for
5
+ * use by headless browser workers controlled by Playwright.
6
+ */
7
+
8
+ import { json, type LoaderFunctionArgs, type MetaFunction } from '@remix-run/cloudflare';
9
+ import { useLoaderData, useParams } from '@remix-run/react';
10
+ import { useEffect, useRef, useState } from 'react';
11
+ import type { Mandate, ExecutionResult } from '~/types/mandate';
12
+ import { MandateExecutor } from '~/lib/runtime/mandate-executor';
13
+ import { webcontainer } from '~/lib/webcontainer';
14
+ import { newBoltShellProcess } from '~/utils/shell';
15
+ import { createScopedLogger } from '~/utils/logger';
16
+ import type { IProviderSetting } from '~/types/model';
17
+ import { eventRegistry } from '~/lib/runtime/execution-events';
18
+
19
+ const logger = createScopedLogger('execute-page');
20
+
21
+ export const meta: MetaFunction<typeof loader> = () => {
22
+ return [
23
+ { title: 'Mandate Execution' },
24
+ { name: 'robots', content: 'noindex, nofollow' },
25
+ ];
26
+ };
27
+
28
+ const GOVERNOR_URL = typeof window !== 'undefined'
29
+ ? (window as any).__GOVERNOR_URL__ || process.env.EXECUTION_GOVERNOR_URL || 'http://localhost:3000'
30
+ : 'http://localhost:3000';
31
+
32
+ /**
33
+ * Load mandate from governor or window injection.
34
+ */
35
+ export async function loader({ params, request }: LoaderFunctionArgs) {
36
+ const mandateId = params.mandateId;
37
+
38
+ if (!mandateId) {
39
+ throw new Response('Mandate ID is required', { status: 400 });
40
+ }
41
+
42
+ // Try to load mandate from governor
43
+ try {
44
+ const governorUrl = process.env.EXECUTION_GOVERNOR_URL || 'http://localhost:3000';
45
+ const response = await fetch(`${governorUrl}/mandates/${mandateId}`, {
46
+ headers: {
47
+ 'Content-Type': 'application/json',
48
+ },
49
+ });
50
+
51
+ if (response.ok) {
52
+ const data = await response.json() as { mandate?: Mandate };
53
+ return json({ mandateId, mandate: data.mandate || null });
54
+ }
55
+ } catch (error) {
56
+ logger.warn('Could not load mandate from governor, will use window injection:', error);
57
+ }
58
+
59
+ return json({ mandateId, mandate: null });
60
+ }
61
+
62
+ /**
63
+ * Auto-execution component.
64
+ */
65
+ function AutoExecutor({ mandateId, mandate: initialMandate }: { mandateId: string; mandate: Mandate | null }) {
66
+ const executedRef = useRef(false);
67
+ const resultRef = useRef<ExecutionResult | null>(null);
68
+ const errorRef = useRef<Error | null>(null);
69
+ const [currentPhase, setCurrentPhase] = useState<string>('initializing');
70
+ const [recentLogs, setRecentLogs] = useState<Array<{ level: string; message: string; timestamp: number }>>([]);
71
+
72
+ useEffect(() => {
73
+ if (executedRef.current) {
74
+ return; // Already executed
75
+ }
76
+
77
+ executedRef.current = true;
78
+
79
+ const execute = async () => {
80
+ const initStartTime = Date.now();
81
+ const eventEmitter = eventRegistry.getEmitter(mandateId);
82
+
83
+ try {
84
+ setCurrentPhase('loading_mandate');
85
+ eventEmitter.emitInitializationStart({ phase: 'loading_mandate', timestamp: initStartTime });
86
+ eventEmitter.emitLog('info', 'Starting mandate execution initialization', 'execute-page');
87
+
88
+ // Get mandate from window injection (Playwright) or use loaded mandate
89
+ let mandate: Mandate | null = initialMandate || null;
90
+ const mandateLoadStart = Date.now();
91
+
92
+ if (!mandate && typeof window !== 'undefined') {
93
+ eventEmitter.emitLog('debug', 'Checking window injection for mandate data', 'execute-page');
94
+ mandate = (window as any).__MANDATE_DATA__ || null;
95
+ }
96
+
97
+ if (!mandate) {
98
+ // Try to fetch from API endpoint first (where mandates are stored)
99
+ eventEmitter.emitLog('debug', `Fetching mandate from API endpoint`, 'execute-page');
100
+ try {
101
+ const apiResponse = await fetch(`/api/mandate?mandate_id=${mandateId}&get=true`);
102
+ if (apiResponse.ok) {
103
+ const apiData = await apiResponse.json() as { mandate?: Mandate };
104
+ mandate = apiData.mandate || null;
105
+ if (mandate) {
106
+ eventEmitter.emitLog('info', 'Mandate loaded from API endpoint', 'execute-page');
107
+ }
108
+ }
109
+ } catch (error) {
110
+ logger.error('Failed to fetch mandate from API:', error);
111
+ eventEmitter.emitLog('warn', `Failed to fetch from API: ${error instanceof Error ? error.message : String(error)}`, 'execute-page');
112
+ }
113
+ }
114
+
115
+ if (!mandate) {
116
+ // Try to fetch from governor as fallback
117
+ eventEmitter.emitLog('debug', `Fetching mandate from governor at ${GOVERNOR_URL}`, 'execute-page');
118
+ try {
119
+ const response = await fetch(`${GOVERNOR_URL}/mandates/${mandateId}`);
120
+ if (response.ok) {
121
+ const data = await response.json() as { mandate?: Mandate };
122
+ mandate = data.mandate || null;
123
+ if (mandate) {
124
+ eventEmitter.emitLog('info', 'Mandate loaded from governor', 'execute-page');
125
+ }
126
+ }
127
+ } catch (error) {
128
+ logger.error('Failed to fetch mandate from governor:', error);
129
+ eventEmitter.emitLog('warn', `Failed to fetch from governor: ${error instanceof Error ? error.message : String(error)}`, 'execute-page');
130
+ }
131
+ }
132
+
133
+ if (!mandate) {
134
+ const errorMsg = `Mandate ${mandateId} not found`;
135
+ eventEmitter.emitError(errorMsg, 'execute-page');
136
+ throw new Error(errorMsg);
137
+ }
138
+
139
+ const mandateLoadTime = Date.now() - mandateLoadStart;
140
+ eventEmitter.emitLog('info', `Mandate loaded in ${mandateLoadTime}ms`, 'execute-page');
141
+ logger.info(`Starting auto-execution of mandate ${mandateId}`);
142
+
143
+ // Set execution status in DOM for Playwright to detect
144
+ const statusEl = document.createElement('div');
145
+ statusEl.id = 'execution-status';
146
+ statusEl.setAttribute('data-execution-status', 'initializing');
147
+ statusEl.style.display = 'none';
148
+ document.body.appendChild(statusEl);
149
+
150
+ // Fetch API keys and provider settings
151
+ setCurrentPhase('loading_config');
152
+ eventEmitter.emitLog('info', 'Fetching API keys and provider settings', 'execute-page');
153
+ const configStartTime = Date.now();
154
+
155
+ const apiKeysResponse = await fetch('/api/export-api-keys');
156
+ const apiKeys: Record<string, string> = apiKeysResponse.ok
157
+ ? await apiKeysResponse.json()
158
+ : {};
159
+
160
+ const apiKeysCount = Object.keys(apiKeys).length;
161
+ const apiKeysAvailable = Object.keys(apiKeys);
162
+ eventEmitter.emitApiKeysLoaded(apiKeysCount, apiKeysAvailable, {
163
+ load_time: Date.now() - configStartTime,
164
+ });
165
+ eventEmitter.emitLog('info', `Loaded ${apiKeysCount} API key(s): ${apiKeysAvailable.join(', ') || 'none'}`, 'execute-page');
166
+
167
+ // Fetch provider settings
168
+ const providersResponse = await fetch('/api/configured-providers');
169
+ const providersData = providersResponse.ok
170
+ ? await providersResponse.json() as { providers?: Array<{ name: string; [key: string]: any }> }
171
+ : { providers: [] };
172
+
173
+ const providerSettings: Record<string, IProviderSetting> = {};
174
+ if (providersData.providers) {
175
+ for (const provider of providersData.providers) {
176
+ providerSettings[provider.name] = provider as IProviderSetting;
177
+ const model = provider.model || provider.defaultModel || 'unknown';
178
+ eventEmitter.emitProviderConfigured(provider.name, model, {
179
+ provider_config: provider,
180
+ });
181
+ eventEmitter.emitLog('info', `Provider configured: ${provider.name} (model: ${model})`, 'execute-page');
182
+ }
183
+ } else {
184
+ eventEmitter.emitLog('warn', 'No provider settings found, using defaults', 'execute-page');
185
+ }
186
+
187
+ // Initialize WebContainer
188
+ setCurrentPhase('initializing_webcontainer');
189
+ eventEmitter.emitWebContainerInit('Starting WebContainer boot...', 0);
190
+ eventEmitter.emitLog('info', 'Initializing WebContainer...', 'execute-page');
191
+ const wcStartTime = Date.now();
192
+
193
+ eventEmitter.emitWebContainerInit('Loading WebContainer kernel...', 25);
194
+ const wc = await webcontainer;
195
+
196
+ const wcInitTime = Date.now() - wcStartTime;
197
+ eventEmitter.emitWebContainerInit('WebContainer ready', 100, {
198
+ init_time: wcInitTime,
199
+ });
200
+ eventEmitter.emitLog('info', `WebContainer initialized in ${wcInitTime}ms`, 'execute-page');
201
+ logger.info('WebContainer initialized');
202
+
203
+ // Create shell terminal
204
+ setCurrentPhase('initializing_shell');
205
+ eventEmitter.emitLog('info', 'Creating shell terminal...', 'execute-page');
206
+ const shellStartTime = Date.now();
207
+ const shellTerminal = () => newBoltShellProcess();
208
+ const shellInitTime = Date.now() - shellStartTime;
209
+ eventEmitter.emitShellReady({ init_time: shellInitTime });
210
+ eventEmitter.emitLog('info', `Shell terminal ready in ${shellInitTime}ms`, 'execute-page');
211
+
212
+ // Create MandateExecutor
213
+ setCurrentPhase('initializing_executor');
214
+ eventEmitter.emitLog('info', 'Initializing MandateExecutor...', 'execute-page');
215
+ const executorStartTime = Date.now();
216
+ const executor = new MandateExecutor(
217
+ mandate,
218
+ Promise.resolve(wc),
219
+ shellTerminal,
220
+ apiKeys,
221
+ providerSettings
222
+ );
223
+ const executorInitTime = Date.now() - executorStartTime;
224
+ eventEmitter.emitExecutorReady({ init_time: executorInitTime });
225
+ eventEmitter.emitLog('info', `MandateExecutor ready in ${executorInitTime}ms`, 'execute-page');
226
+
227
+ const totalInitTime = Date.now() - initStartTime;
228
+ eventEmitter.emitLog('info', `Initialization complete in ${totalInitTime}ms`, 'execute-page');
229
+
230
+ // Set up event forwarding to governor and UI updates
231
+ const executorEventEmitter = (executor as any).eventEmitter;
232
+ if (executorEventEmitter) {
233
+ executorEventEmitter.on('*', (event: any) => {
234
+ // Update UI with recent logs
235
+ if (event.type === 'log' || event.type === 'error') {
236
+ setRecentLogs((prev) => {
237
+ const newLogs = [...prev, {
238
+ level: event.data.level || (event.type === 'error' ? 'error' : 'info'),
239
+ message: event.data.message || '',
240
+ timestamp: event.timestamp,
241
+ }];
242
+ // Keep only last 10 logs
243
+ return newLogs.slice(-10);
244
+ });
245
+ }
246
+
247
+ // Update phase based on event type
248
+ if (event.type === 'iteration_start') {
249
+ setCurrentPhase(`executing_iteration_${event.iteration}`);
250
+ } else if (event.type === 'iteration_end') {
251
+ setCurrentPhase(`iteration_${event.iteration}_${event.data.status}`);
252
+ }
253
+
254
+ // Forward event to governor
255
+ fetch(`${GOVERNOR_URL}/workers/${process.env.WORKER_ID || 'headless'}/report-progress`, {
256
+ method: 'POST',
257
+ headers: { 'Content-Type': 'application/json' },
258
+ body: JSON.stringify({
259
+ mandateId: mandate.mandate_id,
260
+ event: {
261
+ mandate_id: event.mandate_id,
262
+ iteration: event.iteration,
263
+ type: event.type,
264
+ timestamp: event.timestamp,
265
+ data: event.data,
266
+ metadata: event.metadata,
267
+ },
268
+ }),
269
+ }).catch((error) => {
270
+ logger.error('Failed to forward event to governor:', error);
271
+ });
272
+ });
273
+ }
274
+
275
+ // Update status
276
+ setCurrentPhase('executing');
277
+ statusEl.setAttribute('data-execution-status', 'executing');
278
+
279
+ // Execute mandate
280
+ eventEmitter.emitLog('info', 'Starting mandate execution...', 'execute-page');
281
+ const result = await executor.execute();
282
+
283
+ // Store result
284
+ resultRef.current = result;
285
+ if (typeof window !== 'undefined') {
286
+ (window as any).__EXECUTION_RESULT__ = result;
287
+ }
288
+
289
+ // Update status
290
+ setCurrentPhase('completed');
291
+ statusEl.setAttribute('data-execution-status', 'completed');
292
+
293
+ // Log completion
294
+ eventEmitter.emitLog('info', `Mandate execution completed with status: ${result.status}`, 'execute-page');
295
+ logger.info(`Mandate ${mandateId} execution completed: ${result.status}`);
296
+ console.log('EXECUTION_COMPLETE', result);
297
+
298
+ // Report to governor
299
+ await fetch(`${GOVERNOR_URL}/workers/${process.env.WORKER_ID || 'headless'}/complete`, {
300
+ method: 'POST',
301
+ headers: { 'Content-Type': 'application/json' },
302
+ body: JSON.stringify({
303
+ mandateId: mandate.mandate_id,
304
+ success: result.status === 'success',
305
+ result,
306
+ }),
307
+ }).catch((error) => {
308
+ logger.error('Failed to report completion to governor:', error);
309
+ });
310
+ } catch (error) {
311
+ logger.error(`Error executing mandate ${mandateId}:`, error);
312
+ errorRef.current = error instanceof Error ? error : new Error(String(error));
313
+
314
+ // Store error
315
+ if (typeof window !== 'undefined') {
316
+ (window as any).__EXECUTION_ERROR__ = error instanceof Error ? error.message : String(error);
317
+ }
318
+
319
+ // Update status
320
+ const statusEl = document.getElementById('execution-status');
321
+ if (statusEl) {
322
+ statusEl.setAttribute('data-execution-status', 'failed');
323
+ }
324
+
325
+ // Log error
326
+ console.error('EXECUTION_ERROR', error);
327
+
328
+ // Report failure to governor
329
+ await fetch(`${GOVERNOR_URL}/workers/${process.env.WORKER_ID || 'headless'}/complete`, {
330
+ method: 'POST',
331
+ headers: { 'Content-Type': 'application/json' },
332
+ body: JSON.stringify({
333
+ mandateId,
334
+ success: false,
335
+ error: error instanceof Error ? error.message : String(error),
336
+ }),
337
+ }).catch((err) => {
338
+ logger.error('Failed to report failure to governor:', err);
339
+ });
340
+ }
341
+ };
342
+
343
+ execute();
344
+ }, [mandateId, initialMandate]);
345
+
346
+ return (
347
+ <div className="flex flex-col h-screen w-full bg-bolt-elements-background-depth-1">
348
+ <div className="flex-1 flex flex-col p-8">
349
+ <div className="max-w-4xl mx-auto w-full">
350
+ <h1 className="text-2xl font-bold text-bolt-elements-textPrimary mb-4">
351
+ Executing Mandate
352
+ </h1>
353
+ <p className="text-bolt-elements-textSecondary mb-6">
354
+ Mandate ID: <span className="font-mono">{mandateId}</span>
355
+ </p>
356
+
357
+ {/* Current Phase */}
358
+ <div className="mb-6 p-4 bg-bolt-elements-background-depth-2 border border-bolt-elements-borderColor rounded-lg">
359
+ <div className="flex items-center gap-3 mb-2">
360
+ <div className="inline-block animate-spin rounded-full h-4 w-4 border-b-2 border-accent-500"></div>
361
+ <span className="text-sm font-medium text-bolt-elements-textSecondary">Current Phase:</span>
362
+ <span className="text-sm font-semibold text-bolt-elements-textPrimary">{currentPhase}</span>
363
+ </div>
364
+ <p className="text-xs text-bolt-elements-textTertiary">
365
+ Execution status is being reported to the governor and observability dashboard.
366
+ </p>
367
+ </div>
368
+
369
+ {/* Recent Logs */}
370
+ {recentLogs.length > 0 && (
371
+ <div className="mb-6">
372
+ <h2 className="text-sm font-semibold text-bolt-elements-textPrimary mb-2">Recent Logs</h2>
373
+ <div className="bg-bolt-elements-background-depth-2 border border-bolt-elements-borderColor rounded-lg p-4 max-h-64 overflow-auto">
374
+ <div className="space-y-1 font-mono text-xs">
375
+ {recentLogs.map((log, idx) => (
376
+ <div key={idx} className="flex gap-2">
377
+ <span className={`${
378
+ log.level === 'error' ? 'text-red-500' :
379
+ log.level === 'warn' ? 'text-yellow-500' :
380
+ log.level === 'debug' ? 'text-gray-500' :
381
+ 'text-blue-500'
382
+ }`}>
383
+ [{log.level.toUpperCase()}]
384
+ </span>
385
+ <span className="text-bolt-elements-textSecondary">{log.message}</span>
386
+ </div>
387
+ ))}
388
+ </div>
389
+ </div>
390
+ </div>
391
+ )}
392
+
393
+ {/* Status Info */}
394
+ <div className="text-center">
395
+ <p className="text-sm text-bolt-elements-textTertiary">
396
+ This page is executing the mandate automatically.
397
+ <br />
398
+ View detailed logs at: <a href={`/observability/${mandateId}`} className="text-accent-500 hover:underline">/observability/{mandateId}</a>
399
+ </p>
400
+ </div>
401
+ </div>
402
+ </div>
403
+
404
+ {/* Hidden status element for Playwright detection */}
405
+ <div
406
+ id="execution-status"
407
+ data-execution-status="initializing"
408
+ style={{ display: 'none' }}
409
+ />
410
+ </div>
411
+ );
412
+ }
413
+
414
+ export default function ExecuteRoute() {
415
+ const { mandateId, mandate } = useLoaderData<typeof loader>();
416
+ const params = useParams();
417
+ const finalMandateId = mandateId || params.mandateId;
418
+
419
+ if (!finalMandateId) {
420
+ return (
421
+ <div className="flex flex-col h-screen w-full bg-bolt-elements-background-depth-1 p-8">
422
+ <div className="max-w-4xl mx-auto">
423
+ <h1 className="text-2xl font-bold text-bolt-elements-textPrimary mb-4">Error</h1>
424
+ <p className="text-bolt-elements-textSecondary">Mandate ID is required</p>
425
+ </div>
426
+ </div>
427
+ );
428
+ }
429
+
430
+ return <AutoExecutor mandateId={finalMandateId} mandate={mandate} />;
431
+ }
432
+
@@ -0,0 +1,25 @@
1
+ import type { LoaderFunctionArgs } from '@remix-run/cloudflare';
2
+ import { json, type MetaFunction } from '@remix-run/cloudflare';
3
+ import { ClientOnly } from 'remix-utils/client-only';
4
+ import { BaseChat } from '~/components/chat/BaseChat';
5
+ import { GitUrlImport } from '~/components/git/GitUrlImport.client';
6
+ import { Header } from '~/components/header/Header';
7
+ import BackgroundRays from '~/components/ui/BackgroundRays';
8
+
9
+ export const meta: MetaFunction = () => {
10
+ return [{ title: 'Bolt' }, { name: 'description', content: 'Talk with Bolt, an AI assistant from StackBlitz' }];
11
+ };
12
+
13
+ export async function loader(args: LoaderFunctionArgs) {
14
+ return json({ url: args.params.url });
15
+ }
16
+
17
+ export default function Index() {
18
+ return (
19
+ <div className="flex flex-col h-full w-full bg-bolt-elements-background-depth-1">
20
+ <BackgroundRays />
21
+ <Header />
22
+ <ClientOnly fallback={<BaseChat />}>{() => <GitUrlImport />}</ClientOnly>
23
+ </div>
24
+ );
25
+ }
@@ -0,0 +1,50 @@
1
+ import { json, type LoaderFunctionArgs, type MetaFunction } from '@remix-run/cloudflare';
2
+ import { useLoaderData, useParams } from '@remix-run/react';
3
+ import { ObservabilityDashboard } from '~/components/observability/ObservabilityDashboard';
4
+ import { Header } from '~/components/header/Header';
5
+ import BackgroundRays from '~/components/ui/BackgroundRays';
6
+
7
+ export const meta: MetaFunction<typeof loader> = ({ data }) => {
8
+ return [
9
+ { title: `Observability - ${data?.mandateId || 'Unknown'}` },
10
+ { name: 'description', content: 'Real-time execution observability for mandate execution' },
11
+ ];
12
+ };
13
+
14
+ export async function loader({ params }: LoaderFunctionArgs) {
15
+ const mandateId = params.mandateId;
16
+
17
+ if (!mandateId) {
18
+ throw new Response('Mandate ID is required', { status: 400 });
19
+ }
20
+
21
+ return json({ mandateId });
22
+ }
23
+
24
+ export default function ObservabilityRoute() {
25
+ const { mandateId } = useLoaderData<typeof loader>();
26
+ const params = useParams();
27
+
28
+ // Use params as fallback if loader data is not available
29
+ const finalMandateId = mandateId || params.mandateId;
30
+
31
+ if (!finalMandateId) {
32
+ return (
33
+ <div className="flex flex-col h-full w-full bg-bolt-elements-background-depth-1 p-8">
34
+ <div className="max-w-4xl mx-auto">
35
+ <h1 className="text-2xl font-bold text-bolt-elements-textPrimary mb-4">Error</h1>
36
+ <p className="text-bolt-elements-textSecondary">Mandate ID is required</p>
37
+ </div>
38
+ </div>
39
+ );
40
+ }
41
+
42
+ return (
43
+ <div className="flex flex-col h-full w-full bg-bolt-elements-background-depth-1">
44
+ <BackgroundRays />
45
+ <Header />
46
+ <ObservabilityDashboard mandateId={finalMandateId} />
47
+ </div>
48
+ );
49
+ }
50
+
@@ -0,0 +1,32 @@
1
+ import { type LoaderFunction } from '@remix-run/cloudflare';
2
+
3
+ export const loader: LoaderFunction = async ({ request }) => {
4
+ const url = new URL(request.url);
5
+ const editorOrigin = url.searchParams.get('editorOrigin') || 'https://stackblitz.com';
6
+ console.log('editorOrigin', editorOrigin);
7
+
8
+ const htmlContent = `
9
+ <!DOCTYPE html>
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="UTF-8" />
13
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
14
+ <title>Connect to WebContainer</title>
15
+ </head>
16
+ <body>
17
+ <script type="module">
18
+ (async () => {
19
+ const { setupConnect } = await import('https://cdn.jsdelivr.net/npm/@webcontainer/api@latest/dist/connect.js');
20
+ setupConnect({
21
+ editorOrigin: '${editorOrigin}'
22
+ });
23
+ })();
24
+ </script>
25
+ </body>
26
+ </html>
27
+ `;
28
+
29
+ return new Response(htmlContent, {
30
+ headers: { 'Content-Type': 'text/html' },
31
+ });
32
+ };
@@ -0,0 +1,97 @@
1
+ import { json, type LoaderFunctionArgs } from '@remix-run/cloudflare';
2
+ import { useLoaderData } from '@remix-run/react';
3
+ import { useCallback, useEffect, useRef, useState } from 'react';
4
+
5
+ const PREVIEW_CHANNEL = 'preview-updates';
6
+
7
+ export async function loader({ params }: LoaderFunctionArgs) {
8
+ const previewId = params.id;
9
+
10
+ if (!previewId) {
11
+ throw new Response('Preview ID is required', { status: 400 });
12
+ }
13
+
14
+ return json({ previewId });
15
+ }
16
+
17
+ export default function WebContainerPreview() {
18
+ const { previewId } = useLoaderData<typeof loader>();
19
+ const iframeRef = useRef<HTMLIFrameElement>(null);
20
+ const broadcastChannelRef = useRef<BroadcastChannel>();
21
+ const [previewUrl, setPreviewUrl] = useState('');
22
+
23
+ // Handle preview refresh
24
+ const handleRefresh = useCallback(() => {
25
+ if (iframeRef.current && previewUrl) {
26
+ // Force a clean reload
27
+ iframeRef.current.src = '';
28
+ requestAnimationFrame(() => {
29
+ if (iframeRef.current) {
30
+ iframeRef.current.src = previewUrl;
31
+ }
32
+ });
33
+ }
34
+ }, [previewUrl]);
35
+
36
+ // Notify other tabs that this preview is ready
37
+ const notifyPreviewReady = useCallback(() => {
38
+ if (broadcastChannelRef.current && previewUrl) {
39
+ broadcastChannelRef.current.postMessage({
40
+ type: 'preview-ready',
41
+ previewId,
42
+ url: previewUrl,
43
+ timestamp: Date.now(),
44
+ });
45
+ }
46
+ }, [previewId, previewUrl]);
47
+
48
+ useEffect(() => {
49
+ const supportsBroadcastChannel = typeof window !== 'undefined' && typeof window.BroadcastChannel === 'function';
50
+
51
+ if (supportsBroadcastChannel) {
52
+ broadcastChannelRef.current = new window.BroadcastChannel(PREVIEW_CHANNEL);
53
+
54
+ // Listen for preview updates
55
+ broadcastChannelRef.current.onmessage = (event) => {
56
+ if (event.data.previewId === previewId) {
57
+ if (event.data.type === 'refresh-preview' || event.data.type === 'file-change') {
58
+ handleRefresh();
59
+ }
60
+ }
61
+ };
62
+ } else {
63
+ broadcastChannelRef.current = undefined;
64
+ }
65
+
66
+ // Construct the WebContainer preview URL
67
+ const url = `https://${previewId}.local-credentialless.webcontainer-api.io`;
68
+ setPreviewUrl(url);
69
+
70
+ // Set the iframe src
71
+ if (iframeRef.current) {
72
+ iframeRef.current.src = url;
73
+ }
74
+
75
+ // Notify other tabs that this preview is ready
76
+ notifyPreviewReady();
77
+
78
+ // Cleanup
79
+ return () => {
80
+ broadcastChannelRef.current?.close();
81
+ };
82
+ }, [previewId, handleRefresh, notifyPreviewReady]);
83
+
84
+ return (
85
+ <div className="w-full h-full">
86
+ <iframe
87
+ ref={iframeRef}
88
+ title="WebContainer Preview"
89
+ className="w-full h-full border-none"
90
+ sandbox="allow-scripts allow-forms allow-popups allow-modals allow-storage-access-by-user-activation allow-same-origin"
91
+ allow="cross-origin-isolated"
92
+ loading="eager"
93
+ onLoad={notifyPreviewReady}
94
+ />
95
+ </div>
96
+ );
97
+ }