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,90 @@
1
+ import { json } from '@remix-run/cloudflare';
2
+ import { LLMManager } from '~/lib/modules/llm/manager';
3
+ import type { ModelInfo } from '~/lib/modules/llm/types';
4
+ import type { ProviderInfo } from '~/types/model';
5
+ import { getApiKeysFromCookie, getProviderSettingsFromCookie } from '~/lib/api/cookies';
6
+
7
+ interface ModelsResponse {
8
+ modelList: ModelInfo[];
9
+ providers: ProviderInfo[];
10
+ defaultProvider: ProviderInfo;
11
+ }
12
+
13
+ let cachedProviders: ProviderInfo[] | null = null;
14
+ let cachedDefaultProvider: ProviderInfo | null = null;
15
+
16
+ function getProviderInfo(llmManager: LLMManager) {
17
+ if (!cachedProviders) {
18
+ cachedProviders = llmManager.getAllProviders().map((provider) => ({
19
+ name: provider.name,
20
+ staticModels: provider.staticModels,
21
+ getApiKeyLink: provider.getApiKeyLink,
22
+ labelForGetApiKey: provider.labelForGetApiKey,
23
+ icon: provider.icon,
24
+ }));
25
+ }
26
+
27
+ if (!cachedDefaultProvider) {
28
+ const defaultProvider = llmManager.getDefaultProvider();
29
+ cachedDefaultProvider = {
30
+ name: defaultProvider.name,
31
+ staticModels: defaultProvider.staticModels,
32
+ getApiKeyLink: defaultProvider.getApiKeyLink,
33
+ labelForGetApiKey: defaultProvider.labelForGetApiKey,
34
+ icon: defaultProvider.icon,
35
+ };
36
+ }
37
+
38
+ return { providers: cachedProviders, defaultProvider: cachedDefaultProvider };
39
+ }
40
+
41
+ export async function loader({
42
+ request,
43
+ params,
44
+ context,
45
+ }: {
46
+ request: Request;
47
+ params: { provider?: string };
48
+ context: {
49
+ cloudflare?: {
50
+ env: Record<string, string>;
51
+ };
52
+ };
53
+ }): Promise<Response> {
54
+ const llmManager = LLMManager.getInstance(context.cloudflare?.env);
55
+
56
+ // Get client side maintained API keys and provider settings from cookies
57
+ const cookieHeader = request.headers.get('Cookie');
58
+ const apiKeys = getApiKeysFromCookie(cookieHeader);
59
+ const providerSettings = getProviderSettingsFromCookie(cookieHeader);
60
+
61
+ const { providers, defaultProvider } = getProviderInfo(llmManager);
62
+
63
+ let modelList: ModelInfo[] = [];
64
+
65
+ if (params.provider) {
66
+ // Only update models for the specific provider
67
+ const provider = llmManager.getProvider(params.provider);
68
+
69
+ if (provider) {
70
+ modelList = await llmManager.getModelListFromProvider(provider, {
71
+ apiKeys,
72
+ providerSettings,
73
+ serverEnv: context.cloudflare?.env,
74
+ });
75
+ }
76
+ } else {
77
+ // Update all models
78
+ modelList = await llmManager.updateModelList({
79
+ apiKeys,
80
+ providerSettings,
81
+ serverEnv: context.cloudflare?.env,
82
+ });
83
+ }
84
+
85
+ return json<ModelsResponse>({
86
+ modelList,
87
+ providers,
88
+ defaultProvider,
89
+ });
90
+ }
@@ -0,0 +1,240 @@
1
+ import { type ActionFunctionArgs, json } from '@remix-run/cloudflare';
2
+ import crypto from 'crypto';
3
+ import type { NetlifySiteInfo } from '~/types/netlify';
4
+
5
+ interface DeployRequestBody {
6
+ siteId?: string;
7
+ files: Record<string, string>;
8
+ chatId?: string; // Optional for backward compatibility
9
+ mandate_id?: string; // New: mandate ID for governance tracking
10
+ proposal_id?: string; // New: proposal ID for governance tracking
11
+ }
12
+
13
+ export async function action({ request }: ActionFunctionArgs) {
14
+ try {
15
+ const { siteId, files, token, chatId, mandate_id, proposal_id } = (await request.json()) as DeployRequestBody & { token: string };
16
+
17
+ // Use mandate_id for site naming if available, otherwise fall back to chatId
18
+ const identifier = mandate_id || chatId || `mandate-${Date.now()}`;
19
+
20
+ if (!token) {
21
+ return json({ error: 'Not connected to Netlify' }, { status: 401 });
22
+ }
23
+
24
+ let targetSiteId = siteId;
25
+ let siteInfo: NetlifySiteInfo | undefined;
26
+
27
+ // If no siteId provided, create a new site
28
+ if (!targetSiteId) {
29
+ const siteName = `bolt-diy-${identifier}-${Date.now()}`;
30
+ const createSiteResponse = await fetch('https://api.netlify.com/api/v1/sites', {
31
+ method: 'POST',
32
+ headers: {
33
+ Authorization: `Bearer ${token}`,
34
+ 'Content-Type': 'application/json',
35
+ },
36
+ body: JSON.stringify({
37
+ name: siteName,
38
+ custom_domain: null,
39
+ }),
40
+ });
41
+
42
+ if (!createSiteResponse.ok) {
43
+ return json({ error: 'Failed to create site' }, { status: 400 });
44
+ }
45
+
46
+ const newSite = (await createSiteResponse.json()) as any;
47
+ targetSiteId = newSite.id;
48
+ siteInfo = {
49
+ id: newSite.id,
50
+ name: newSite.name,
51
+ url: newSite.url,
52
+ chatId: identifier,
53
+ mandate_id,
54
+ proposal_id,
55
+ };
56
+ } else {
57
+ // Get existing site info
58
+ if (targetSiteId) {
59
+ const siteResponse = await fetch(`https://api.netlify.com/api/v1/sites/${targetSiteId}`, {
60
+ headers: {
61
+ Authorization: `Bearer ${token}`,
62
+ },
63
+ });
64
+
65
+ if (siteResponse.ok) {
66
+ const existingSite = (await siteResponse.json()) as any;
67
+ siteInfo = {
68
+ id: existingSite.id,
69
+ name: existingSite.name,
70
+ url: existingSite.url,
71
+ chatId: identifier,
72
+ mandate_id,
73
+ proposal_id,
74
+ };
75
+ } else {
76
+ targetSiteId = undefined;
77
+ }
78
+ }
79
+
80
+ // If no siteId provided or site doesn't exist, create a new site
81
+ if (!targetSiteId) {
82
+ const siteName = `bolt-diy-${identifier}-${Date.now()}`;
83
+ const createSiteResponse = await fetch('https://api.netlify.com/api/v1/sites', {
84
+ method: 'POST',
85
+ headers: {
86
+ Authorization: `Bearer ${token}`,
87
+ 'Content-Type': 'application/json',
88
+ },
89
+ body: JSON.stringify({
90
+ name: siteName,
91
+ custom_domain: null,
92
+ }),
93
+ });
94
+
95
+ if (!createSiteResponse.ok) {
96
+ return json({ error: 'Failed to create site' }, { status: 400 });
97
+ }
98
+
99
+ const newSite = (await createSiteResponse.json()) as any;
100
+ targetSiteId = newSite.id;
101
+ siteInfo = {
102
+ id: newSite.id,
103
+ name: newSite.name,
104
+ url: newSite.url,
105
+ chatId: identifier,
106
+ mandate_id,
107
+ proposal_id,
108
+ };
109
+ }
110
+ }
111
+
112
+ // Create file digests
113
+ const fileDigests: Record<string, string> = {};
114
+
115
+ for (const [filePath, content] of Object.entries(files)) {
116
+ // Ensure file path starts with a forward slash
117
+ const normalizedPath = filePath.startsWith('/') ? filePath : '/' + filePath;
118
+ const hash = crypto.createHash('sha1').update(content).digest('hex');
119
+ fileDigests[normalizedPath] = hash;
120
+ }
121
+
122
+ // Create a new deploy with digests
123
+ const deployResponse = await fetch(`https://api.netlify.com/api/v1/sites/${targetSiteId}/deploys`, {
124
+ method: 'POST',
125
+ headers: {
126
+ Authorization: `Bearer ${token}`,
127
+ 'Content-Type': 'application/json',
128
+ },
129
+ body: JSON.stringify({
130
+ files: fileDigests,
131
+ async: true,
132
+ skip_processing: false,
133
+ draft: false, // Change this to false for production deployments
134
+ function_schedules: [],
135
+ required: Object.keys(fileDigests), // Add this line
136
+ framework: null,
137
+ }),
138
+ });
139
+
140
+ if (!deployResponse.ok) {
141
+ return json({ error: 'Failed to create deployment' }, { status: 400 });
142
+ }
143
+
144
+ const deploy = (await deployResponse.json()) as any;
145
+ let retryCount = 0;
146
+ const maxRetries = 60;
147
+
148
+ // Poll until deploy is ready for file uploads
149
+ while (retryCount < maxRetries) {
150
+ const statusResponse = await fetch(`https://api.netlify.com/api/v1/sites/${targetSiteId}/deploys/${deploy.id}`, {
151
+ headers: {
152
+ Authorization: `Bearer ${token}`,
153
+ },
154
+ });
155
+
156
+ const status = (await statusResponse.json()) as any;
157
+
158
+ if (status.state === 'prepared' || status.state === 'uploaded') {
159
+ // Upload all files regardless of required array
160
+ for (const [filePath, content] of Object.entries(files)) {
161
+ const normalizedPath = filePath.startsWith('/') ? filePath : '/' + filePath;
162
+
163
+ let uploadSuccess = false;
164
+ let uploadRetries = 0;
165
+
166
+ while (!uploadSuccess && uploadRetries < 3) {
167
+ try {
168
+ const uploadResponse = await fetch(
169
+ `https://api.netlify.com/api/v1/deploys/${deploy.id}/files${normalizedPath}`,
170
+ {
171
+ method: 'PUT',
172
+ headers: {
173
+ Authorization: `Bearer ${token}`,
174
+ 'Content-Type': 'application/octet-stream',
175
+ },
176
+ body: content,
177
+ },
178
+ );
179
+
180
+ uploadSuccess = uploadResponse.ok;
181
+
182
+ if (!uploadSuccess) {
183
+ console.error('Upload failed:', await uploadResponse.text());
184
+ uploadRetries++;
185
+ await new Promise((resolve) => setTimeout(resolve, 2000));
186
+ }
187
+ } catch (error) {
188
+ console.error('Upload error:', error);
189
+ uploadRetries++;
190
+ await new Promise((resolve) => setTimeout(resolve, 2000));
191
+ }
192
+ }
193
+
194
+ if (!uploadSuccess) {
195
+ return json({ error: `Failed to upload file ${filePath}` }, { status: 500 });
196
+ }
197
+ }
198
+ }
199
+
200
+ if (status.state === 'ready') {
201
+ // Only return after files are uploaded
202
+ if (Object.keys(files).length === 0 || status.summary?.status === 'ready') {
203
+ return json({
204
+ success: true,
205
+ deploy: {
206
+ id: status.id,
207
+ state: status.state,
208
+ url: status.ssl_url || status.url,
209
+ },
210
+ site: siteInfo,
211
+ });
212
+ }
213
+ }
214
+
215
+ if (status.state === 'error') {
216
+ return json({ error: status.error_message || 'Deploy preparation failed' }, { status: 500 });
217
+ }
218
+
219
+ retryCount++;
220
+ await new Promise((resolve) => setTimeout(resolve, 1000));
221
+ }
222
+
223
+ if (retryCount >= maxRetries) {
224
+ return json({ error: 'Deploy preparation timed out' }, { status: 500 });
225
+ }
226
+
227
+ // Make sure we're returning the deploy ID and site info
228
+ return json({
229
+ success: true,
230
+ deploy: {
231
+ id: deploy.id,
232
+ state: deploy.state,
233
+ },
234
+ site: siteInfo,
235
+ });
236
+ } catch (error) {
237
+ console.error('Deploy error:', error);
238
+ return json({ error: 'Deployment failed' }, { status: 500 });
239
+ }
240
+ }
@@ -0,0 +1,142 @@
1
+ import { json } from '@remix-run/cloudflare';
2
+ import { getApiKeysFromCookie } from '~/lib/api/cookies';
3
+ import { withSecurity } from '~/lib/security';
4
+
5
+ async function netlifyUserLoader({ request, context }: { request: Request; context: any }) {
6
+ try {
7
+ // Get API keys from cookies (server-side only)
8
+ const cookieHeader = request.headers.get('Cookie');
9
+ const apiKeys = getApiKeysFromCookie(cookieHeader);
10
+
11
+ // Try to get Netlify token from various sources
12
+ const netlifyToken =
13
+ apiKeys.VITE_NETLIFY_ACCESS_TOKEN ||
14
+ context?.cloudflare?.env?.VITE_NETLIFY_ACCESS_TOKEN ||
15
+ process.env.VITE_NETLIFY_ACCESS_TOKEN;
16
+
17
+ if (!netlifyToken) {
18
+ return json({ error: 'Netlify token not found' }, { status: 401 });
19
+ }
20
+
21
+ // Make server-side request to Netlify API
22
+ const response = await fetch('https://api.netlify.com/api/v1/user', {
23
+ headers: {
24
+ Authorization: `Bearer ${netlifyToken}`,
25
+ 'User-Agent': 'bolt.diy-app',
26
+ },
27
+ });
28
+
29
+ if (!response.ok) {
30
+ if (response.status === 401) {
31
+ return json({ error: 'Invalid Netlify token' }, { status: 401 });
32
+ }
33
+
34
+ throw new Error(`Netlify API error: ${response.status}`);
35
+ }
36
+
37
+ const userData = (await response.json()) as {
38
+ id: string;
39
+ name: string | null;
40
+ email: string;
41
+ avatar_url: string | null;
42
+ full_name: string | null;
43
+ };
44
+
45
+ return json({
46
+ id: userData.id,
47
+ name: userData.name,
48
+ email: userData.email,
49
+ avatar_url: userData.avatar_url,
50
+ full_name: userData.full_name,
51
+ });
52
+ } catch (error) {
53
+ console.error('Error fetching Netlify user:', error);
54
+ return json(
55
+ {
56
+ error: 'Failed to fetch Netlify user information',
57
+ details: error instanceof Error ? error.message : String(error),
58
+ },
59
+ { status: 500 },
60
+ );
61
+ }
62
+ }
63
+
64
+ export const loader = withSecurity(netlifyUserLoader, {
65
+ rateLimit: true,
66
+ allowedMethods: ['GET'],
67
+ });
68
+
69
+ async function netlifyUserAction({ request, context }: { request: Request; context: any }) {
70
+ try {
71
+ const formData = await request.formData();
72
+ const action = formData.get('action');
73
+
74
+ // Get API keys from cookies (server-side only)
75
+ const cookieHeader = request.headers.get('Cookie');
76
+ const apiKeys = getApiKeysFromCookie(cookieHeader);
77
+
78
+ // Try to get Netlify token from various sources
79
+ const netlifyToken =
80
+ apiKeys.VITE_NETLIFY_ACCESS_TOKEN ||
81
+ context?.cloudflare?.env?.VITE_NETLIFY_ACCESS_TOKEN ||
82
+ process.env.VITE_NETLIFY_ACCESS_TOKEN;
83
+
84
+ if (!netlifyToken) {
85
+ return json({ error: 'Netlify token not found' }, { status: 401 });
86
+ }
87
+
88
+ if (action === 'get_sites') {
89
+ // Fetch user sites
90
+ const response = await fetch('https://api.netlify.com/api/v1/sites', {
91
+ headers: {
92
+ Authorization: `Bearer ${netlifyToken}`,
93
+ 'Content-Type': 'application/json',
94
+ 'User-Agent': 'bolt.diy-app',
95
+ },
96
+ });
97
+
98
+ if (!response.ok) {
99
+ throw new Error(`Netlify API error: ${response.status}`);
100
+ }
101
+
102
+ const sites = (await response.json()) as Array<{
103
+ id: string;
104
+ name: string;
105
+ url: string;
106
+ admin_url: string;
107
+ build_settings: any;
108
+ created_at: string;
109
+ updated_at: string;
110
+ }>;
111
+
112
+ return json({
113
+ sites: sites.map((site) => ({
114
+ id: site.id,
115
+ name: site.name,
116
+ url: site.url,
117
+ admin_url: site.admin_url,
118
+ build_settings: site.build_settings,
119
+ created_at: site.created_at,
120
+ updated_at: site.updated_at,
121
+ })),
122
+ totalSites: sites.length,
123
+ });
124
+ }
125
+
126
+ return json({ error: 'Invalid action' }, { status: 400 });
127
+ } catch (error) {
128
+ console.error('Error in Netlify user action:', error);
129
+ return json(
130
+ {
131
+ error: 'Failed to process Netlify request',
132
+ details: error instanceof Error ? error.message : String(error),
133
+ },
134
+ { status: 500 },
135
+ );
136
+ }
137
+ }
138
+
139
+ export const action = withSecurity(netlifyUserAction, {
140
+ rateLimit: true,
141
+ allowedMethods: ['POST'],
142
+ });
@@ -0,0 +1,199 @@
1
+ import { json } from '@remix-run/cloudflare';
2
+ import { getApiKeysFromCookie } from '~/lib/api/cookies';
3
+ import { withSecurity } from '~/lib/security';
4
+
5
+ async function supabaseUserLoader({ request, context }: { request: Request; context: any }) {
6
+ try {
7
+ // Get API keys from cookies (server-side only)
8
+ const cookieHeader = request.headers.get('Cookie');
9
+ const apiKeys = getApiKeysFromCookie(cookieHeader);
10
+
11
+ // Try to get Supabase token from various sources
12
+ const supabaseToken =
13
+ apiKeys.VITE_SUPABASE_ACCESS_TOKEN ||
14
+ context?.cloudflare?.env?.VITE_SUPABASE_ACCESS_TOKEN ||
15
+ process.env.VITE_SUPABASE_ACCESS_TOKEN;
16
+
17
+ if (!supabaseToken) {
18
+ return json({ error: 'Supabase token not found' }, { status: 401 });
19
+ }
20
+
21
+ // Make server-side request to Supabase API
22
+ const response = await fetch('https://api.supabase.com/v1/projects', {
23
+ headers: {
24
+ Authorization: `Bearer ${supabaseToken}`,
25
+ 'User-Agent': 'bolt.diy-app',
26
+ },
27
+ });
28
+
29
+ if (!response.ok) {
30
+ if (response.status === 401) {
31
+ return json({ error: 'Invalid Supabase token' }, { status: 401 });
32
+ }
33
+
34
+ throw new Error(`Supabase API error: ${response.status}`);
35
+ }
36
+
37
+ const projects = (await response.json()) as Array<{
38
+ id: string;
39
+ name: string;
40
+ region: string;
41
+ status: string;
42
+ organization_id: string;
43
+ created_at: string;
44
+ }>;
45
+
46
+ // Get user info from the first project (all projects belong to the same user)
47
+ const user =
48
+ projects.length > 0
49
+ ? {
50
+ id: projects[0].organization_id,
51
+ name: 'Supabase User', // Supabase doesn't provide user name in this endpoint
52
+ email: 'user@supabase.co', // Placeholder
53
+ }
54
+ : null;
55
+
56
+ return json({
57
+ user,
58
+ projects: projects.map((project) => ({
59
+ id: project.id,
60
+ name: project.name,
61
+ region: project.region,
62
+ status: project.status,
63
+ organization_id: project.organization_id,
64
+ created_at: project.created_at,
65
+ })),
66
+ });
67
+ } catch (error) {
68
+ console.error('Error fetching Supabase user:', error);
69
+ return json(
70
+ {
71
+ error: 'Failed to fetch Supabase user information',
72
+ details: error instanceof Error ? error.message : String(error),
73
+ },
74
+ { status: 500 },
75
+ );
76
+ }
77
+ }
78
+
79
+ export const loader = withSecurity(supabaseUserLoader, {
80
+ rateLimit: true,
81
+ allowedMethods: ['GET'],
82
+ });
83
+
84
+ async function supabaseUserAction({ request, context }: { request: Request; context: any }) {
85
+ try {
86
+ const formData = await request.formData();
87
+ const action = formData.get('action');
88
+
89
+ // Get API keys from cookies (server-side only)
90
+ const cookieHeader = request.headers.get('Cookie');
91
+ const apiKeys = getApiKeysFromCookie(cookieHeader);
92
+
93
+ // Try to get Supabase token from various sources
94
+ const supabaseToken =
95
+ apiKeys.VITE_SUPABASE_ACCESS_TOKEN ||
96
+ context?.cloudflare?.env?.VITE_SUPABASE_ACCESS_TOKEN ||
97
+ process.env.VITE_SUPABASE_ACCESS_TOKEN;
98
+
99
+ if (!supabaseToken) {
100
+ return json({ error: 'Supabase token not found' }, { status: 401 });
101
+ }
102
+
103
+ if (action === 'get_projects') {
104
+ // Fetch user projects
105
+ const response = await fetch('https://api.supabase.com/v1/projects', {
106
+ headers: {
107
+ Authorization: `Bearer ${supabaseToken}`,
108
+ 'User-Agent': 'bolt.diy-app',
109
+ },
110
+ });
111
+
112
+ if (!response.ok) {
113
+ throw new Error(`Supabase API error: ${response.status}`);
114
+ }
115
+
116
+ const projects = (await response.json()) as Array<{
117
+ id: string;
118
+ name: string;
119
+ region: string;
120
+ status: string;
121
+ organization_id: string;
122
+ created_at: string;
123
+ }>;
124
+
125
+ // Get user info from the first project
126
+ const user =
127
+ projects.length > 0
128
+ ? {
129
+ id: projects[0].organization_id,
130
+ name: 'Supabase User',
131
+ email: 'user@supabase.co',
132
+ }
133
+ : null;
134
+
135
+ return json({
136
+ user,
137
+ stats: {
138
+ projects: projects.map((project) => ({
139
+ id: project.id,
140
+ name: project.name,
141
+ region: project.region,
142
+ status: project.status,
143
+ organization_id: project.organization_id,
144
+ created_at: project.created_at,
145
+ })),
146
+ totalProjects: projects.length,
147
+ },
148
+ });
149
+ }
150
+
151
+ if (action === 'get_api_keys') {
152
+ const projectId = formData.get('projectId');
153
+
154
+ if (!projectId) {
155
+ return json({ error: 'Project ID is required' }, { status: 400 });
156
+ }
157
+
158
+ // Fetch project API keys
159
+ const response = await fetch(`https://api.supabase.com/v1/projects/${projectId}/api-keys`, {
160
+ headers: {
161
+ Authorization: `Bearer ${supabaseToken}`,
162
+ 'User-Agent': 'bolt.diy-app',
163
+ },
164
+ });
165
+
166
+ if (!response.ok) {
167
+ throw new Error(`Supabase API error: ${response.status}`);
168
+ }
169
+
170
+ const apiKeys = (await response.json()) as Array<{
171
+ name: string;
172
+ api_key: string;
173
+ }>;
174
+
175
+ return json({
176
+ apiKeys: apiKeys.map((key) => ({
177
+ name: key.name,
178
+ api_key: key.api_key,
179
+ })),
180
+ });
181
+ }
182
+
183
+ return json({ error: 'Invalid action' }, { status: 400 });
184
+ } catch (error) {
185
+ console.error('Error in Supabase user action:', error);
186
+ return json(
187
+ {
188
+ error: 'Failed to process Supabase request',
189
+ details: error instanceof Error ? error.message : String(error),
190
+ },
191
+ { status: 500 },
192
+ );
193
+ }
194
+ }
195
+
196
+ export const action = withSecurity(supabaseUserAction, {
197
+ rateLimit: true,
198
+ allowedMethods: ['POST'],
199
+ });