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,368 @@
1
+ import React, { useEffect, useState, useRef } from 'react';
2
+ import { motion } from 'framer-motion';
3
+ import { toast } from 'react-toastify';
4
+ import { useStore } from '@nanostores/react';
5
+ import { logStore } from '~/lib/stores/logs';
6
+ import { classNames } from '~/utils/classNames';
7
+ import {
8
+ vercelConnection,
9
+ isConnecting,
10
+ isFetchingStats,
11
+ updateVercelConnection,
12
+ fetchVercelStats,
13
+ autoConnectVercel,
14
+ } from '~/lib/stores/vercel';
15
+
16
+ export default function VercelConnection() {
17
+ console.log('VercelConnection component mounted');
18
+
19
+ const connection = useStore(vercelConnection);
20
+ const connecting = useStore(isConnecting);
21
+ const fetchingStats = useStore(isFetchingStats);
22
+ const [isProjectsExpanded, setIsProjectsExpanded] = useState(false);
23
+ const hasInitialized = useRef(false);
24
+
25
+ console.log('VercelConnection initial state:', {
26
+ connection: {
27
+ user: connection.user,
28
+ token: connection.token ? '[TOKEN_EXISTS]' : '[NO_TOKEN]',
29
+ },
30
+ envToken: import.meta.env?.VITE_VERCEL_ACCESS_TOKEN ? '[ENV_TOKEN_EXISTS]' : '[NO_ENV_TOKEN]',
31
+ });
32
+
33
+ useEffect(() => {
34
+ // Prevent multiple initializations
35
+ if (hasInitialized.current) {
36
+ console.log('Vercel: Already initialized, skipping');
37
+ return;
38
+ }
39
+
40
+ const initializeConnection = async () => {
41
+ console.log('Vercel initializeConnection:', {
42
+ user: connection.user,
43
+ token: connection.token ? '[TOKEN_EXISTS]' : '[NO_TOKEN]',
44
+ envToken: import.meta.env?.VITE_VERCEL_ACCESS_TOKEN ? '[ENV_TOKEN_EXISTS]' : '[NO_ENV_TOKEN]',
45
+ });
46
+
47
+ hasInitialized.current = true;
48
+
49
+ // Auto-connect using environment variable if no existing connection but token exists
50
+ if (!connection.user && connection.token && import.meta.env?.VITE_VERCEL_ACCESS_TOKEN) {
51
+ console.log('Vercel: Attempting auto-connection');
52
+
53
+ const result = await autoConnectVercel();
54
+
55
+ if (result.success) {
56
+ toast.success('Connected to Vercel automatically');
57
+ } else {
58
+ console.error('Vercel auto-connection failed:', result.error);
59
+ }
60
+ } else if (connection.user && connection.token) {
61
+ // Fetch stats for existing connection
62
+ console.log('Vercel: Fetching stats for existing connection');
63
+ await fetchVercelStats(connection.token);
64
+ } else {
65
+ console.log('Vercel: No auto-connection conditions met');
66
+ }
67
+ };
68
+
69
+ initializeConnection();
70
+ }, []); // Empty dependency array to run only once
71
+
72
+ const handleConnect = async (event: React.FormEvent) => {
73
+ event.preventDefault();
74
+ isConnecting.set(true);
75
+
76
+ try {
77
+ const response = await fetch('https://api.vercel.com/v2/user', {
78
+ headers: {
79
+ Authorization: `Bearer ${connection.token}`,
80
+ 'Content-Type': 'application/json',
81
+ },
82
+ });
83
+
84
+ if (!response.ok) {
85
+ throw new Error('Invalid token or unauthorized');
86
+ }
87
+
88
+ const userData = (await response.json()) as any;
89
+ updateVercelConnection({
90
+ user: userData.user || userData, // Handle both possible structures
91
+ token: connection.token,
92
+ });
93
+
94
+ await fetchVercelStats(connection.token);
95
+ toast.success('Successfully connected to Vercel');
96
+ } catch (error) {
97
+ console.error('Auth error:', error);
98
+ logStore.logError('Failed to authenticate with Vercel', { error });
99
+ toast.error('Failed to connect to Vercel');
100
+ updateVercelConnection({ user: null, token: '' });
101
+ } finally {
102
+ isConnecting.set(false);
103
+ }
104
+ };
105
+
106
+ const handleDisconnect = () => {
107
+ updateVercelConnection({ user: null, token: '' });
108
+ toast.success('Disconnected from Vercel');
109
+ };
110
+
111
+ console.log('connection', connection);
112
+
113
+ return (
114
+ <motion.div
115
+ className="bg-[#FFFFFF] dark:bg-[#0A0A0A] rounded-lg border border-[#E5E5E5] dark:border-[#1A1A1A]"
116
+ initial={{ opacity: 0, y: 20 }}
117
+ animate={{ opacity: 1, y: 0 }}
118
+ transition={{ delay: 0.3 }}
119
+ >
120
+ <div className="p-6 space-y-6">
121
+ <div className="flex items-center justify-between">
122
+ <div className="flex items-center gap-2">
123
+ <img
124
+ className="w-5 h-5 dark:invert"
125
+ height="24"
126
+ width="24"
127
+ crossOrigin="anonymous"
128
+ src={`https://cdn.simpleicons.org/vercel/black`}
129
+ />
130
+ <h3 className="text-base font-medium text-bolt-elements-textPrimary">Vercel Connection</h3>
131
+ </div>
132
+ </div>
133
+
134
+ {!connection.user ? (
135
+ <div className="space-y-4">
136
+ <div>
137
+ <label className="block text-sm text-bolt-elements-textSecondary mb-2">Personal Access Token</label>
138
+ <input
139
+ type="password"
140
+ value={connection.token}
141
+ onChange={(e) => updateVercelConnection({ ...connection, token: e.target.value })}
142
+ disabled={connecting}
143
+ placeholder="Enter your Vercel personal access token"
144
+ className={classNames(
145
+ 'w-full px-3 py-2 rounded-lg text-sm',
146
+ 'bg-[#F8F8F8] dark:bg-[#1A1A1A]',
147
+ 'border border-[#E5E5E5] dark:border-[#333333]',
148
+ 'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary',
149
+ 'focus:outline-none focus:ring-1 focus:ring-bolt-elements-borderColorActive',
150
+ 'disabled:opacity-50',
151
+ )}
152
+ />
153
+ <div className="mt-2 text-sm text-bolt-elements-textSecondary">
154
+ <a
155
+ href="https://vercel.com/account/tokens"
156
+ target="_blank"
157
+ rel="noopener noreferrer"
158
+ className="text-bolt-elements-borderColorActive hover:underline inline-flex items-center gap-1"
159
+ >
160
+ Get your token
161
+ <div className="i-ph:arrow-square-out w-4 h-4" />
162
+ </a>
163
+ <div className="mt-2 text-xs text-bolt-elements-textSecondary bg-bolt-elements-background-depth-1 p-2 rounded">
164
+ <p className="flex items-center gap-1">
165
+ <span className="i-ph:lightbulb w-3.5 h-3.5 text-bolt-elements-icon-success" />
166
+ <span className="font-medium">Tip:</span> You can also set{' '}
167
+ <code className="px-1 py-0.5 bg-bolt-elements-background-depth-2 rounded text-xs">
168
+ VITE_VERCEL_ACCESS_TOKEN
169
+ </code>{' '}
170
+ in your .env.local for automatic connection.
171
+ </p>
172
+ </div>
173
+ {/* Debug info - remove this later */}
174
+ <div className="mt-2 text-xs text-gray-500">
175
+ <p>Debug: Token present: {connection.token ? '✅' : '❌'}</p>
176
+ <p>Debug: User present: {connection.user ? '✅' : '❌'}</p>
177
+ <p>Debug: Env token: {import.meta.env?.VITE_VERCEL_ACCESS_TOKEN ? '✅' : '❌'}</p>
178
+ </div>
179
+ </div>
180
+ </div>
181
+
182
+ <div className="flex gap-2">
183
+ <button
184
+ onClick={handleConnect}
185
+ disabled={connecting || !connection.token}
186
+ className={classNames(
187
+ 'px-4 py-2 rounded-lg text-sm flex items-center gap-2',
188
+ 'bg-[#303030] text-white',
189
+ 'hover:bg-[#5E41D0] hover:text-white',
190
+ 'disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-200',
191
+ 'transform active:scale-95',
192
+ )}
193
+ >
194
+ {connecting ? (
195
+ <>
196
+ <div className="i-ph:spinner-gap animate-spin" />
197
+ Connecting...
198
+ </>
199
+ ) : (
200
+ <>
201
+ <div className="i-ph:plug-charging w-4 h-4" />
202
+ Connect
203
+ </>
204
+ )}
205
+ </button>
206
+
207
+ {/* Debug button - remove this later */}
208
+ <button
209
+ onClick={async () => {
210
+ console.log('Manual auto-connect test');
211
+
212
+ const result = await autoConnectVercel();
213
+
214
+ if (result.success) {
215
+ toast.success('Manual auto-connect successful');
216
+ } else {
217
+ toast.error(`Manual auto-connect failed: ${result.error}`);
218
+ }
219
+ }}
220
+ className="px-3 py-2 rounded-lg text-xs bg-blue-500 text-white hover:bg-blue-600"
221
+ >
222
+ Test Auto-Connect
223
+ </button>
224
+ </div>
225
+ </div>
226
+ ) : (
227
+ <div className="space-y-6">
228
+ <div className="flex items-center justify-between">
229
+ <div className="flex items-center gap-3">
230
+ <button
231
+ onClick={handleDisconnect}
232
+ className={classNames(
233
+ 'px-4 py-2 rounded-lg text-sm flex items-center gap-2',
234
+ 'bg-red-500 text-white',
235
+ 'hover:bg-red-600',
236
+ )}
237
+ >
238
+ <div className="i-ph:plug w-4 h-4" />
239
+ Disconnect
240
+ </button>
241
+ <span className="text-sm text-bolt-elements-textSecondary flex items-center gap-1">
242
+ <div className="i-ph:check-circle w-4 h-4 text-green-500" />
243
+ Connected to Vercel
244
+ </span>
245
+ </div>
246
+ </div>
247
+
248
+ <div className="flex items-center gap-4 p-4 bg-[#F8F8F8] dark:bg-[#1A1A1A] rounded-lg">
249
+ {/* Debug output */}
250
+ <pre className="hidden">{JSON.stringify(connection.user, null, 2)}</pre>
251
+
252
+ <img
253
+ src={`https://vercel.com/api/www/avatar?u=${connection.user?.username || connection.user?.user?.username}`}
254
+ referrerPolicy="no-referrer"
255
+ crossOrigin="anonymous"
256
+ alt="User Avatar"
257
+ className="w-12 h-12 rounded-full border-2 border-bolt-elements-borderColorActive"
258
+ />
259
+ <div>
260
+ <h4 className="text-sm font-medium text-bolt-elements-textPrimary">
261
+ {connection.user?.username || connection.user?.user?.username || 'Vercel User'}
262
+ </h4>
263
+ <p className="text-sm text-bolt-elements-textSecondary">
264
+ {connection.user?.email || connection.user?.user?.email || 'No email available'}
265
+ </p>
266
+ </div>
267
+ </div>
268
+
269
+ {fetchingStats ? (
270
+ <div className="flex items-center gap-2 text-sm text-bolt-elements-textSecondary">
271
+ <div className="i-ph:spinner-gap w-4 h-4 animate-spin" />
272
+ Fetching Vercel projects...
273
+ </div>
274
+ ) : (
275
+ <div>
276
+ <button
277
+ onClick={() => setIsProjectsExpanded(!isProjectsExpanded)}
278
+ className="w-full bg-transparent text-left text-sm font-medium text-bolt-elements-textPrimary mb-3 flex items-center gap-2"
279
+ >
280
+ <div className="i-ph:buildings w-4 h-4" />
281
+ Your Projects ({connection.stats?.totalProjects || 0})
282
+ <div
283
+ className={classNames(
284
+ 'i-ph:caret-down w-4 h-4 ml-auto transition-transform',
285
+ isProjectsExpanded ? 'rotate-180' : '',
286
+ )}
287
+ />
288
+ </button>
289
+ {isProjectsExpanded && connection.stats?.projects?.length ? (
290
+ <div className="grid gap-3">
291
+ {connection.stats.projects.map((project) => (
292
+ <a
293
+ key={project.id}
294
+ href={`https://vercel.com/dashboard/${project.id}`}
295
+ target="_blank"
296
+ rel="noopener noreferrer"
297
+ className="block p-4 rounded-lg border border-bolt-elements-borderColor hover:border-bolt-elements-borderColorActive transition-colors"
298
+ >
299
+ <div className="flex items-center justify-between">
300
+ <div>
301
+ <h5 className="text-sm font-medium text-bolt-elements-textPrimary flex items-center gap-2">
302
+ <div className="i-ph:globe w-4 h-4 text-bolt-elements-borderColorActive" />
303
+ {project.name}
304
+ </h5>
305
+ <div className="flex items-center gap-2 mt-2 text-xs text-bolt-elements-textSecondary">
306
+ {project.targets?.production?.alias && project.targets.production.alias.length > 0 ? (
307
+ <>
308
+ <a
309
+ href={`https://${project.targets.production.alias.find((a: string) => a.endsWith('.vercel.app') && !a.includes('-projects.vercel.app')) || project.targets.production.alias[0]}`}
310
+ target="_blank"
311
+ rel="noopener noreferrer"
312
+ className="hover:text-bolt-elements-borderColorActive"
313
+ >
314
+ {project.targets.production.alias.find(
315
+ (a: string) => a.endsWith('.vercel.app') && !a.includes('-projects.vercel.app'),
316
+ ) || project.targets.production.alias[0]}
317
+ </a>
318
+ <span>•</span>
319
+ <span className="flex items-center gap-1">
320
+ <div className="i-ph:clock w-3 h-3" />
321
+ {new Date(project.createdAt).toLocaleDateString()}
322
+ </span>
323
+ </>
324
+ ) : project.latestDeployments && project.latestDeployments.length > 0 ? (
325
+ <>
326
+ <a
327
+ href={`https://${project.latestDeployments[0].url}`}
328
+ target="_blank"
329
+ rel="noopener noreferrer"
330
+ className="hover:text-bolt-elements-borderColorActive"
331
+ >
332
+ {project.latestDeployments[0].url}
333
+ </a>
334
+ <span>•</span>
335
+ <span className="flex items-center gap-1">
336
+ <div className="i-ph:clock w-3 h-3" />
337
+ {new Date(project.latestDeployments[0].created).toLocaleDateString()}
338
+ </span>
339
+ </>
340
+ ) : null}
341
+ </div>
342
+ </div>
343
+ {project.framework && (
344
+ <div className="text-xs text-bolt-elements-textSecondary px-2 py-1 rounded-md bg-[#F0F0F0] dark:bg-[#252525]">
345
+ <span className="flex items-center gap-1">
346
+ <div className="i-ph:code w-3 h-3" />
347
+ {project.framework}
348
+ </span>
349
+ </div>
350
+ )}
351
+ </div>
352
+ </a>
353
+ ))}
354
+ </div>
355
+ ) : isProjectsExpanded ? (
356
+ <div className="text-sm text-bolt-elements-textSecondary flex items-center gap-2">
357
+ <div className="i-ph:info w-4 h-4" />
358
+ No projects found in your Vercel account
359
+ </div>
360
+ ) : null}
361
+ </div>
362
+ )}
363
+ </div>
364
+ )}
365
+ </div>
366
+ </motion.div>
367
+ );
368
+ }
@@ -0,0 +1 @@
1
+ export { default as VercelConnection } from './VercelConnection';
@@ -0,0 +1,54 @@
1
+ import type { TabVisibilityConfig } from '~/components/@settings/core/types';
2
+ import { DEFAULT_TAB_CONFIG } from '~/components/@settings/core/constants';
3
+
4
+ export const getVisibleTabs = (
5
+ tabConfiguration: { userTabs: TabVisibilityConfig[] },
6
+ notificationsEnabled: boolean,
7
+ ): TabVisibilityConfig[] => {
8
+ if (!tabConfiguration?.userTabs || !Array.isArray(tabConfiguration.userTabs)) {
9
+ console.warn('Invalid tab configuration, using defaults');
10
+ return DEFAULT_TAB_CONFIG as TabVisibilityConfig[];
11
+ }
12
+
13
+ // In user mode, only show visible user tabs
14
+ return tabConfiguration.userTabs
15
+ .filter((tab) => {
16
+ if (!tab || typeof tab.id !== 'string') {
17
+ console.warn('Invalid tab entry:', tab);
18
+ return false;
19
+ }
20
+
21
+ // Hide notifications tab if notifications are disabled
22
+ if (tab.id === 'notifications' && !notificationsEnabled) {
23
+ return false;
24
+ }
25
+
26
+ // Only show tabs that are explicitly visible and assigned to the user window
27
+ return tab.visible && tab.window === 'user';
28
+ })
29
+ .sort((a, b) => a.order - b.order);
30
+ };
31
+
32
+ export const reorderTabs = (
33
+ tabs: TabVisibilityConfig[],
34
+ startIndex: number,
35
+ endIndex: number,
36
+ ): TabVisibilityConfig[] => {
37
+ const result = Array.from(tabs);
38
+ const [removed] = result.splice(startIndex, 1);
39
+ result.splice(endIndex, 0, removed);
40
+
41
+ // Update order property
42
+ return result.map((tab, index) => ({
43
+ ...tab,
44
+ order: index,
45
+ }));
46
+ };
47
+
48
+ export const resetToDefaultConfig = (isDeveloperMode: boolean): TabVisibilityConfig[] => {
49
+ return DEFAULT_TAB_CONFIG.map((tab) => ({
50
+ ...tab,
51
+ visible: isDeveloperMode ? true : tab.window === 'user',
52
+ window: isDeveloperMode ? 'developer' : tab.window,
53
+ })) as TabVisibilityConfig[];
54
+ };
@@ -0,0 +1,169 @@
1
+ import React, { useState, useEffect, useCallback } from 'react';
2
+ import { IconButton } from '~/components/ui/IconButton';
3
+ import type { ProviderInfo } from '~/types/model';
4
+ import Cookies from 'js-cookie';
5
+
6
+ interface APIKeyManagerProps {
7
+ provider: ProviderInfo;
8
+ apiKey: string;
9
+ setApiKey: (key: string) => void;
10
+ getApiKeyLink?: string;
11
+ labelForGetApiKey?: string;
12
+ }
13
+
14
+ // cache which stores whether the provider's API key is set via environment variable
15
+ const providerEnvKeyStatusCache: Record<string, boolean> = {};
16
+
17
+ const apiKeyMemoizeCache: { [k: string]: Record<string, string> } = {};
18
+
19
+ export function getApiKeysFromCookies() {
20
+ const storedApiKeys = Cookies.get('apiKeys');
21
+ let parsedKeys: Record<string, string> = {};
22
+
23
+ if (storedApiKeys) {
24
+ parsedKeys = apiKeyMemoizeCache[storedApiKeys];
25
+
26
+ if (!parsedKeys) {
27
+ parsedKeys = apiKeyMemoizeCache[storedApiKeys] = JSON.parse(storedApiKeys);
28
+ }
29
+ }
30
+
31
+ return parsedKeys;
32
+ }
33
+
34
+ // eslint-disable-next-line @typescript-eslint/naming-convention
35
+ export const APIKeyManager: React.FC<APIKeyManagerProps> = ({ provider, apiKey, setApiKey }) => {
36
+ const [isEditing, setIsEditing] = useState(false);
37
+ const [tempKey, setTempKey] = useState(apiKey);
38
+ const [isEnvKeySet, setIsEnvKeySet] = useState(false);
39
+
40
+ // Reset states and load saved key when provider changes
41
+ useEffect(() => {
42
+ // Load saved API key from cookies for this provider
43
+ const savedKeys = getApiKeysFromCookies();
44
+ const savedKey = savedKeys[provider.name] || '';
45
+
46
+ setTempKey(savedKey);
47
+ setApiKey(savedKey);
48
+ setIsEditing(false);
49
+ }, [provider.name]);
50
+
51
+ const checkEnvApiKey = useCallback(async () => {
52
+ // Check cache first
53
+ if (providerEnvKeyStatusCache[provider.name] !== undefined) {
54
+ setIsEnvKeySet(providerEnvKeyStatusCache[provider.name]);
55
+ return;
56
+ }
57
+
58
+ try {
59
+ const response = await fetch(`/api/check-env-key?provider=${encodeURIComponent(provider.name)}`);
60
+ const data = await response.json();
61
+ const isSet = (data as { isSet: boolean }).isSet;
62
+
63
+ // Cache the result
64
+ providerEnvKeyStatusCache[provider.name] = isSet;
65
+ setIsEnvKeySet(isSet);
66
+ } catch (error) {
67
+ console.error('Failed to check environment API key:', error);
68
+ setIsEnvKeySet(false);
69
+ }
70
+ }, [provider.name]);
71
+
72
+ useEffect(() => {
73
+ checkEnvApiKey();
74
+ }, [checkEnvApiKey]);
75
+
76
+ const handleSave = () => {
77
+ // Save to parent state
78
+ setApiKey(tempKey);
79
+
80
+ // Save to cookies
81
+ const currentKeys = getApiKeysFromCookies();
82
+ const newKeys = { ...currentKeys, [provider.name]: tempKey };
83
+ Cookies.set('apiKeys', JSON.stringify(newKeys));
84
+
85
+ setIsEditing(false);
86
+ };
87
+
88
+ return (
89
+ <div className="flex items-center justify-between py-3 px-1">
90
+ <div className="flex items-center gap-2 flex-1">
91
+ <div className="flex items-center gap-2">
92
+ <span className="text-sm font-medium text-bolt-elements-textSecondary">{provider?.name} API Key:</span>
93
+ {!isEditing && (
94
+ <div className="flex items-center gap-2">
95
+ {apiKey ? (
96
+ <>
97
+ <div className="i-ph:check-circle-fill text-green-500 w-4 h-4" />
98
+ <span className="text-xs text-green-500">Set via UI</span>
99
+ </>
100
+ ) : isEnvKeySet ? (
101
+ <>
102
+ <div className="i-ph:check-circle-fill text-green-500 w-4 h-4" />
103
+ <span className="text-xs text-green-500">Set via environment variable</span>
104
+ </>
105
+ ) : (
106
+ <>
107
+ <div className="i-ph:x-circle-fill text-red-500 w-4 h-4" />
108
+ <span className="text-xs text-red-500">Not Set (Please set via UI or ENV_VAR)</span>
109
+ </>
110
+ )}
111
+ </div>
112
+ )}
113
+ </div>
114
+ </div>
115
+
116
+ <div className="flex items-center gap-2 shrink-0">
117
+ {isEditing ? (
118
+ <div className="flex items-center gap-2">
119
+ <input
120
+ type="password"
121
+ value={tempKey}
122
+ placeholder="Enter API Key"
123
+ onChange={(e) => setTempKey(e.target.value)}
124
+ className="w-[300px] px-3 py-1.5 text-sm rounded border border-bolt-elements-borderColor
125
+ bg-bolt-elements-prompt-background text-bolt-elements-textPrimary
126
+ focus:outline-none focus:ring-2 focus:ring-bolt-elements-focus"
127
+ />
128
+ <IconButton
129
+ onClick={handleSave}
130
+ title="Save API Key"
131
+ className="bg-green-500/10 hover:bg-green-500/20 text-green-500"
132
+ >
133
+ <div className="i-ph:check w-4 h-4" />
134
+ </IconButton>
135
+ <IconButton
136
+ onClick={() => setIsEditing(false)}
137
+ title="Cancel"
138
+ className="bg-red-500/10 hover:bg-red-500/20 text-red-500"
139
+ >
140
+ <div className="i-ph:x w-4 h-4" />
141
+ </IconButton>
142
+ </div>
143
+ ) : (
144
+ <>
145
+ {
146
+ <IconButton
147
+ onClick={() => setIsEditing(true)}
148
+ title="Edit API Key"
149
+ className="bg-blue-500/10 hover:bg-blue-500/20 text-blue-500"
150
+ >
151
+ <div className="i-ph:pencil-simple w-4 h-4" />
152
+ </IconButton>
153
+ }
154
+ {provider?.getApiKeyLink && !apiKey && (
155
+ <IconButton
156
+ onClick={() => window.open(provider?.getApiKeyLink)}
157
+ title="Get API Key"
158
+ className="bg-purple-500/10 hover:bg-purple-500/20 text-purple-500 flex items-center gap-2"
159
+ >
160
+ <span className="text-xs whitespace-nowrap">{provider?.labelForGetApiKey || 'Get API Key'}</span>
161
+ <div className={`${provider?.icon || 'i-ph:key'} w-4 h-4`} />
162
+ </IconButton>
163
+ )}
164
+ </>
165
+ )}
166
+ </div>
167
+ </div>
168
+ );
169
+ };