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,175 @@
1
+ import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
2
+ import { motion } from 'framer-motion';
3
+ import { useStore } from '@nanostores/react';
4
+ import { classNames } from '~/utils/classNames';
5
+ import { profileStore } from '~/lib/stores/profile';
6
+ import type { TabType, Profile } from './types';
7
+
8
+ interface AvatarDropdownProps {
9
+ onSelectTab: (tab: TabType) => void;
10
+ }
11
+
12
+ export const AvatarDropdown = ({ onSelectTab }: AvatarDropdownProps) => {
13
+ const profile = useStore(profileStore) as Profile;
14
+
15
+ return (
16
+ <DropdownMenu.Root>
17
+ <DropdownMenu.Trigger asChild>
18
+ <motion.button
19
+ className="w-10 h-10 rounded-full bg-transparent flex items-center justify-center focus:outline-none"
20
+ whileHover={{ scale: 1.02 }}
21
+ whileTap={{ scale: 0.98 }}
22
+ >
23
+ {profile?.avatar ? (
24
+ <img
25
+ src={profile.avatar}
26
+ alt={profile?.username || 'Profile'}
27
+ className="w-full h-full rounded-full object-cover"
28
+ loading="eager"
29
+ decoding="sync"
30
+ />
31
+ ) : (
32
+ <div className="w-full h-full rounded-full flex items-center justify-center bg-white dark:bg-gray-800 text-gray-400 dark:text-gray-500">
33
+ <div className="i-ph:user w-6 h-6" />
34
+ </div>
35
+ )}
36
+ </motion.button>
37
+ </DropdownMenu.Trigger>
38
+
39
+ <DropdownMenu.Portal>
40
+ <DropdownMenu.Content
41
+ className={classNames(
42
+ 'min-w-[240px] z-[250]',
43
+ 'bg-white dark:bg-[#141414]',
44
+ 'rounded-lg shadow-lg',
45
+ 'border border-gray-200/50 dark:border-gray-800/50',
46
+ 'animate-in fade-in-0 zoom-in-95',
47
+ 'py-1',
48
+ )}
49
+ sideOffset={5}
50
+ align="end"
51
+ >
52
+ <div
53
+ className={classNames(
54
+ 'px-4 py-3 flex items-center gap-3',
55
+ 'border-b border-gray-200/50 dark:border-gray-800/50',
56
+ )}
57
+ >
58
+ <div className="w-10 h-10 rounded-full overflow-hidden flex-shrink-0 bg-white dark:bg-gray-800 shadow-sm">
59
+ {profile?.avatar ? (
60
+ <img
61
+ src={profile.avatar}
62
+ alt={profile?.username || 'Profile'}
63
+ className={classNames('w-full h-full', 'object-cover', 'transform-gpu', 'image-rendering-crisp')}
64
+ loading="eager"
65
+ decoding="sync"
66
+ />
67
+ ) : (
68
+ <div className="w-full h-full flex items-center justify-center text-gray-400 dark:text-gray-500 font-medium text-lg">
69
+ <div className="i-ph:user w-6 h-6" />
70
+ </div>
71
+ )}
72
+ </div>
73
+ <div className="flex-1 min-w-0">
74
+ <div className="font-medium text-sm text-gray-900 dark:text-white truncate">
75
+ {profile?.username || 'Guest User'}
76
+ </div>
77
+ {profile?.bio && <div className="text-xs text-gray-500 dark:text-gray-400 truncate">{profile.bio}</div>}
78
+ </div>
79
+ </div>
80
+
81
+ <DropdownMenu.Item
82
+ className={classNames(
83
+ 'flex items-center gap-2 px-4 py-2.5',
84
+ 'text-sm text-gray-700 dark:text-gray-200',
85
+ 'hover:bg-purple-50 dark:hover:bg-purple-500/10',
86
+ 'hover:text-purple-500 dark:hover:text-purple-400',
87
+ 'cursor-pointer transition-all duration-200',
88
+ 'outline-none',
89
+ 'group',
90
+ )}
91
+ onClick={() => onSelectTab('profile')}
92
+ >
93
+ <div className="i-ph:user-circle w-4 h-4 text-gray-400 group-hover:text-purple-500 dark:group-hover:text-purple-400 transition-colors" />
94
+ Edit Profile
95
+ </DropdownMenu.Item>
96
+
97
+ <DropdownMenu.Item
98
+ className={classNames(
99
+ 'flex items-center gap-2 px-4 py-2.5',
100
+ 'text-sm text-gray-700 dark:text-gray-200',
101
+ 'hover:bg-purple-50 dark:hover:bg-purple-500/10',
102
+ 'hover:text-purple-500 dark:hover:text-purple-400',
103
+ 'cursor-pointer transition-all duration-200',
104
+ 'outline-none',
105
+ 'group',
106
+ )}
107
+ onClick={() => onSelectTab('settings')}
108
+ >
109
+ <div className="i-ph:gear-six w-4 h-4 text-gray-400 group-hover:text-purple-500 dark:group-hover:text-purple-400 transition-colors" />
110
+ Settings
111
+ </DropdownMenu.Item>
112
+
113
+ <div className="my-1 border-t border-gray-200/50 dark:border-gray-800/50" />
114
+
115
+ <DropdownMenu.Item
116
+ className={classNames(
117
+ 'flex items-center gap-2 px-4 py-2.5',
118
+ 'text-sm text-gray-700 dark:text-gray-200',
119
+ 'hover:bg-purple-50 dark:hover:bg-purple-500/10',
120
+ 'hover:text-purple-500 dark:hover:text-purple-400',
121
+ 'cursor-pointer transition-all duration-200',
122
+ 'outline-none',
123
+ 'group',
124
+ )}
125
+ onClick={() =>
126
+ window.open('https://github.com/stackblitz-labs/bolt.diy/issues/new?template=bug_report.yml', '_blank')
127
+ }
128
+ >
129
+ <div className="i-ph:bug w-4 h-4 text-gray-400 group-hover:text-purple-500 dark:group-hover:text-purple-400 transition-colors" />
130
+ Report Bug
131
+ </DropdownMenu.Item>
132
+
133
+ <DropdownMenu.Item
134
+ className={classNames(
135
+ 'flex items-center gap-2 px-4 py-2.5',
136
+ 'text-sm text-gray-700 dark:text-gray-200',
137
+ 'hover:bg-purple-50 dark:hover:bg-purple-500/10',
138
+ 'hover:text-purple-500 dark:hover:text-purple-400',
139
+ 'cursor-pointer transition-all duration-200',
140
+ 'outline-none',
141
+ 'group',
142
+ )}
143
+ onClick={async () => {
144
+ try {
145
+ const { downloadDebugLog } = await import('~/utils/debugLogger');
146
+ await downloadDebugLog();
147
+ } catch (error) {
148
+ console.error('Failed to download debug log:', error);
149
+ }
150
+ }}
151
+ >
152
+ <div className="i-ph:download w-4 h-4 text-gray-400 group-hover:text-purple-500 dark:group-hover:text-purple-400 transition-colors" />
153
+ Download Debug Log
154
+ </DropdownMenu.Item>
155
+
156
+ <DropdownMenu.Item
157
+ className={classNames(
158
+ 'flex items-center gap-2 px-4 py-2.5',
159
+ 'text-sm text-gray-700 dark:text-gray-200',
160
+ 'hover:bg-purple-50 dark:hover:bg-purple-500/10',
161
+ 'hover:text-purple-500 dark:hover:text-purple-400',
162
+ 'cursor-pointer transition-all duration-200',
163
+ 'outline-none',
164
+ 'group',
165
+ )}
166
+ onClick={() => window.open('https://stackblitz-labs.github.io/bolt.diy/', '_blank')}
167
+ >
168
+ <div className="i-ph:question w-4 h-4 text-gray-400 group-hover:text-purple-500 dark:group-hover:text-purple-400 transition-colors" />
169
+ Help & Documentation
170
+ </DropdownMenu.Item>
171
+ </DropdownMenu.Content>
172
+ </DropdownMenu.Portal>
173
+ </DropdownMenu.Root>
174
+ );
175
+ };
@@ -0,0 +1,345 @@
1
+ import { useState, useEffect, useMemo } from 'react';
2
+ import { useStore } from '@nanostores/react';
3
+ import * as RadixDialog from '@radix-ui/react-dialog';
4
+ import { classNames } from '~/utils/classNames';
5
+ import { TabTile } from '~/components/@settings/shared/components/TabTile';
6
+ import { useFeatures } from '~/lib/hooks/useFeatures';
7
+ import { useNotifications } from '~/lib/hooks/useNotifications';
8
+ import { useConnectionStatus } from '~/lib/hooks/useConnectionStatus';
9
+ import { tabConfigurationStore, resetTabConfiguration } from '~/lib/stores/settings';
10
+ import { profileStore } from '~/lib/stores/profile';
11
+ import type { TabType, Profile } from './types';
12
+ import { TAB_LABELS, DEFAULT_TAB_CONFIG, TAB_DESCRIPTIONS } from './constants';
13
+ import { DialogTitle } from '~/components/ui/Dialog';
14
+ import { AvatarDropdown } from './AvatarDropdown';
15
+ import BackgroundRays from '~/components/ui/BackgroundRays';
16
+
17
+ // Import all tab components
18
+ import ProfileTab from '~/components/@settings/tabs/profile/ProfileTab';
19
+ import SettingsTab from '~/components/@settings/tabs/settings/SettingsTab';
20
+ import NotificationsTab from '~/components/@settings/tabs/notifications/NotificationsTab';
21
+ import FeaturesTab from '~/components/@settings/tabs/features/FeaturesTab';
22
+ import { DataTab } from '~/components/@settings/tabs/data/DataTab';
23
+ import { EventLogsTab } from '~/components/@settings/tabs/event-logs/EventLogsTab';
24
+ import GitHubTab from '~/components/@settings/tabs/github/GitHubTab';
25
+ import GitLabTab from '~/components/@settings/tabs/gitlab/GitLabTab';
26
+ import SupabaseTab from '~/components/@settings/tabs/supabase/SupabaseTab';
27
+ import VercelTab from '~/components/@settings/tabs/vercel/VercelTab';
28
+ import NetlifyTab from '~/components/@settings/tabs/netlify/NetlifyTab';
29
+ import CloudProvidersTab from '~/components/@settings/tabs/providers/cloud/CloudProvidersTab';
30
+ import LocalProvidersTab from '~/components/@settings/tabs/providers/local/LocalProvidersTab';
31
+ import McpTab from '~/components/@settings/tabs/mcp/McpTab';
32
+
33
+ interface ControlPanelProps {
34
+ open: boolean;
35
+ onClose: () => void;
36
+ }
37
+
38
+ // Beta status for experimental features
39
+ const BETA_TABS = new Set<TabType>(['local-providers', 'mcp']);
40
+
41
+ const BetaLabel = () => (
42
+ <div className="absolute top-2 right-2 px-1.5 py-0.5 rounded-full bg-purple-500/10 dark:bg-purple-500/20">
43
+ <span className="text-[10px] font-medium text-purple-600 dark:text-purple-400">BETA</span>
44
+ </div>
45
+ );
46
+
47
+ export const ControlPanel = ({ open, onClose }: ControlPanelProps) => {
48
+ // State
49
+ const [activeTab, setActiveTab] = useState<TabType | null>(null);
50
+ const [loadingTab, setLoadingTab] = useState<TabType | null>(null);
51
+ const [showTabManagement, setShowTabManagement] = useState(false);
52
+
53
+ // Store values
54
+ const tabConfiguration = useStore(tabConfigurationStore);
55
+ const profile = useStore(profileStore) as Profile;
56
+
57
+ // Status hooks
58
+ const { hasNewFeatures, unviewedFeatures, acknowledgeAllFeatures } = useFeatures();
59
+ const { hasUnreadNotifications, unreadNotifications, markAllAsRead } = useNotifications();
60
+ const { hasConnectionIssues, currentIssue, acknowledgeIssue } = useConnectionStatus();
61
+
62
+ // Memoize the base tab configurations to avoid recalculation
63
+ const baseTabConfig = useMemo(() => {
64
+ return new Map(DEFAULT_TAB_CONFIG.map((tab) => [tab.id, tab]));
65
+ }, []);
66
+
67
+ // Add visibleTabs logic using useMemo with optimized calculations
68
+ const visibleTabs = useMemo(() => {
69
+ if (!tabConfiguration?.userTabs || !Array.isArray(tabConfiguration.userTabs)) {
70
+ console.warn('Invalid tab configuration, resetting to defaults');
71
+ resetTabConfiguration();
72
+
73
+ return [];
74
+ }
75
+
76
+ const notificationsDisabled = profile?.preferences?.notifications === false;
77
+
78
+ // Optimize user mode tab filtering
79
+ return tabConfiguration.userTabs
80
+ .filter((tab) => {
81
+ if (!tab?.id) {
82
+ return false;
83
+ }
84
+
85
+ if (tab.id === 'notifications' && notificationsDisabled) {
86
+ return false;
87
+ }
88
+
89
+ return tab.visible && tab.window === 'user';
90
+ })
91
+ .sort((a, b) => a.order - b.order);
92
+ }, [tabConfiguration, profile?.preferences?.notifications, baseTabConfig]);
93
+
94
+ // Reset to default view when modal opens/closes
95
+ useEffect(() => {
96
+ if (!open) {
97
+ // Reset when closing
98
+ setActiveTab(null);
99
+ setLoadingTab(null);
100
+ setShowTabManagement(false);
101
+ } else {
102
+ // When opening, set to null to show the main view
103
+ setActiveTab(null);
104
+ }
105
+ }, [open]);
106
+
107
+ // Handle closing
108
+ const handleClose = () => {
109
+ setActiveTab(null);
110
+ setLoadingTab(null);
111
+ setShowTabManagement(false);
112
+ onClose();
113
+ };
114
+
115
+ // Handlers
116
+ const handleBack = () => {
117
+ if (showTabManagement) {
118
+ setShowTabManagement(false);
119
+ } else if (activeTab) {
120
+ setActiveTab(null);
121
+ }
122
+ };
123
+
124
+ const getTabComponent = (tabId: TabType) => {
125
+ switch (tabId) {
126
+ case 'profile':
127
+ return <ProfileTab />;
128
+ case 'settings':
129
+ return <SettingsTab />;
130
+ case 'notifications':
131
+ return <NotificationsTab />;
132
+ case 'features':
133
+ return <FeaturesTab />;
134
+ case 'data':
135
+ return <DataTab />;
136
+ case 'cloud-providers':
137
+ return <CloudProvidersTab />;
138
+ case 'local-providers':
139
+ return <LocalProvidersTab />;
140
+ case 'github':
141
+ return <GitHubTab />;
142
+ case 'gitlab':
143
+ return <GitLabTab />;
144
+ case 'supabase':
145
+ return <SupabaseTab />;
146
+ case 'vercel':
147
+ return <VercelTab />;
148
+ case 'netlify':
149
+ return <NetlifyTab />;
150
+ case 'event-logs':
151
+ return <EventLogsTab />;
152
+ case 'mcp':
153
+ return <McpTab />;
154
+
155
+ default:
156
+ return null;
157
+ }
158
+ };
159
+
160
+ const getTabUpdateStatus = (tabId: TabType): boolean => {
161
+ switch (tabId) {
162
+ case 'features':
163
+ return hasNewFeatures;
164
+ case 'notifications':
165
+ return hasUnreadNotifications;
166
+ case 'github':
167
+ case 'gitlab':
168
+ case 'supabase':
169
+ case 'vercel':
170
+ case 'netlify':
171
+ return hasConnectionIssues;
172
+ default:
173
+ return false;
174
+ }
175
+ };
176
+
177
+ const getStatusMessage = (tabId: TabType): string => {
178
+ switch (tabId) {
179
+ case 'features':
180
+ return `${unviewedFeatures.length} new feature${unviewedFeatures.length === 1 ? '' : 's'} to explore`;
181
+ case 'notifications':
182
+ return `${unreadNotifications.length} unread notification${unreadNotifications.length === 1 ? '' : 's'}`;
183
+ case 'github':
184
+ case 'gitlab':
185
+ case 'supabase':
186
+ case 'vercel':
187
+ case 'netlify':
188
+ return currentIssue === 'disconnected'
189
+ ? 'Connection lost'
190
+ : currentIssue === 'high-latency'
191
+ ? 'High latency detected'
192
+ : 'Connection issues detected';
193
+ default:
194
+ return '';
195
+ }
196
+ };
197
+
198
+ const handleTabClick = (tabId: TabType) => {
199
+ setLoadingTab(tabId);
200
+ setActiveTab(tabId);
201
+ setShowTabManagement(false);
202
+
203
+ // Acknowledge notifications based on tab
204
+ switch (tabId) {
205
+ case 'features':
206
+ acknowledgeAllFeatures();
207
+ break;
208
+ case 'notifications':
209
+ markAllAsRead();
210
+ break;
211
+ case 'github':
212
+ case 'gitlab':
213
+ case 'supabase':
214
+ case 'vercel':
215
+ case 'netlify':
216
+ acknowledgeIssue();
217
+ break;
218
+ }
219
+
220
+ // Clear loading state after a delay
221
+ setTimeout(() => setLoadingTab(null), 500);
222
+ };
223
+
224
+ return (
225
+ <RadixDialog.Root open={open}>
226
+ <RadixDialog.Portal>
227
+ <div className="fixed inset-0 flex items-center justify-center z-[100] modern-scrollbar">
228
+ <RadixDialog.Overlay className="absolute inset-0 bg-black/70 dark:bg-black/80 backdrop-blur-sm transition-opacity duration-200" />
229
+
230
+ <RadixDialog.Content
231
+ aria-describedby={undefined}
232
+ onEscapeKeyDown={handleClose}
233
+ onPointerDownOutside={handleClose}
234
+ className="relative z-[101]"
235
+ >
236
+ <div
237
+ className={classNames(
238
+ 'w-[1200px] h-[90vh]',
239
+ 'bg-bolt-elements-background-depth-1',
240
+ 'rounded-2xl shadow-2xl',
241
+ 'border border-bolt-elements-borderColor',
242
+ 'flex flex-col overflow-hidden',
243
+ 'relative',
244
+ 'transform transition-all duration-200 ease-out',
245
+ open ? 'opacity-100 scale-100 translate-y-0' : 'opacity-0 scale-95 translate-y-4',
246
+ )}
247
+ >
248
+ <div className="absolute inset-0 overflow-hidden rounded-2xl">
249
+ <BackgroundRays />
250
+ </div>
251
+ <div className="relative z-10 flex flex-col h-full">
252
+ {/* Header */}
253
+ <div className="flex items-center justify-between px-6 py-4 border-b border-gray-200 dark:border-gray-700">
254
+ <div className="flex items-center space-x-4">
255
+ {(activeTab || showTabManagement) && (
256
+ <button
257
+ onClick={handleBack}
258
+ className="flex items-center justify-center w-8 h-8 rounded-full bg-transparent hover:bg-purple-500/10 dark:hover:bg-purple-500/20 group transition-colors duration-150"
259
+ >
260
+ <div className="i-ph:arrow-left w-4 h-4 text-gray-500 dark:text-gray-400 group-hover:text-purple-500 transition-colors" />
261
+ </button>
262
+ )}
263
+ <DialogTitle className="text-xl font-semibold text-gray-900 dark:text-white">
264
+ {showTabManagement ? 'Tab Management' : activeTab ? TAB_LABELS[activeTab] : 'Control Panel'}
265
+ </DialogTitle>
266
+ </div>
267
+
268
+ <div className="flex items-center gap-6">
269
+ {/* Avatar and Dropdown */}
270
+ <div className="pl-6">
271
+ <AvatarDropdown onSelectTab={handleTabClick} />
272
+ </div>
273
+
274
+ {/* Close Button */}
275
+ <button
276
+ onClick={handleClose}
277
+ className="flex items-center justify-center w-8 h-8 rounded-full bg-transparent hover:bg-purple-500/10 dark:hover:bg-purple-500/20 group transition-all duration-200"
278
+ >
279
+ <div className="i-ph:x w-4 h-4 text-gray-500 dark:text-gray-400 group-hover:text-purple-500 transition-colors" />
280
+ </button>
281
+ </div>
282
+ </div>
283
+
284
+ {/* Content */}
285
+ <div
286
+ className={classNames(
287
+ 'flex-1',
288
+ 'overflow-y-auto',
289
+ 'hover:overflow-y-auto',
290
+ 'scrollbar scrollbar-w-2',
291
+ 'scrollbar-track-transparent',
292
+ 'scrollbar-thumb-[#E5E5E5] hover:scrollbar-thumb-[#CCCCCC]',
293
+ 'dark:scrollbar-thumb-[#333333] dark:hover:scrollbar-thumb-[#444444]',
294
+ 'will-change-scroll',
295
+ 'touch-auto',
296
+ )}
297
+ >
298
+ <div
299
+ className={classNames(
300
+ 'p-6 transition-opacity duration-150',
301
+ activeTab || showTabManagement ? 'opacity-100' : 'opacity-100',
302
+ )}
303
+ >
304
+ {activeTab ? (
305
+ getTabComponent(activeTab)
306
+ ) : (
307
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 relative">
308
+ {visibleTabs.map((tab, index) => (
309
+ <div
310
+ key={tab.id}
311
+ className={classNames(
312
+ 'aspect-[1.5/1] transition-transform duration-100 ease-out',
313
+ 'hover:scale-[1.01]',
314
+ )}
315
+ style={{
316
+ animationDelay: `${index * 30}ms`,
317
+ animation: open ? 'fadeInUp 200ms ease-out forwards' : 'none',
318
+ }}
319
+ >
320
+ <TabTile
321
+ tab={tab}
322
+ onClick={() => handleTabClick(tab.id as TabType)}
323
+ isActive={activeTab === tab.id}
324
+ hasUpdate={getTabUpdateStatus(tab.id)}
325
+ statusMessage={getStatusMessage(tab.id)}
326
+ description={TAB_DESCRIPTIONS[tab.id]}
327
+ isLoading={loadingTab === tab.id}
328
+ className="h-full relative"
329
+ >
330
+ {BETA_TABS.has(tab.id) && <BetaLabel />}
331
+ </TabTile>
332
+ </div>
333
+ ))}
334
+ </div>
335
+ )}
336
+ </div>
337
+ </div>
338
+ </div>
339
+ </div>
340
+ </RadixDialog.Content>
341
+ </div>
342
+ </RadixDialog.Portal>
343
+ </RadixDialog.Root>
344
+ );
345
+ };
@@ -0,0 +1,108 @@
1
+ import type { TabType } from './types';
2
+ import { User, Settings, Bell, Star, Database, Cloud, Laptop, Github, Wrench, List } from 'lucide-react';
3
+
4
+ // GitLab icon component
5
+ const GitLabIcon = () => (
6
+ <svg viewBox="0 0 24 24" className="w-4 h-4">
7
+ <path
8
+ fill="currentColor"
9
+ d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z"
10
+ />
11
+ </svg>
12
+ );
13
+
14
+ // Vercel icon component
15
+ const VercelIcon = () => (
16
+ <svg viewBox="0 0 24 24" className="w-4 h-4">
17
+ <path fill="currentColor" d="M12 2L2 19.777h20L12 2z" />
18
+ </svg>
19
+ );
20
+
21
+ // Netlify icon component
22
+ const NetlifyIcon = () => (
23
+ <svg viewBox="0 0 24 24" className="w-4 h-4">
24
+ <path
25
+ fill="currentColor"
26
+ d="M16.934 8.519a1.044 1.044 0 0 1 .303-.23l2.349-1.045a.983.983 0 0 1 .905 0c.264.12.49.328.651.599l.518 1.065c.17.35.17.761 0 1.11l-.518 1.065a1.119 1.119 0 0 1-.651.599l-2.35 1.045a1.013 1.013 0 0 1-.904 0l-2.35-1.045a1.119 1.119 0 0 1-.651-.599L13.718 9.02a1.2 1.2 0 0 1 0-1.11l.518-1.065a1.119 1.119 0 0 1 .651-.599l2.35-1.045a.983.983 0 0 1 .697-.061zm-6.051 5.751a1.044 1.044 0 0 1 .303-.23l2.349-1.045a.983.983 0 0 1 .905 0c.264.12.49.328.651.599l.518 1.065c.17.35.17.761 0 1.11l-.518 1.065a1.119 1.119 0 0 1-.651.599l-2.35 1.045a1.013 1.013 0 0 1-.904 0l-2.35-1.045a1.119 1.119 0 0 1-.651-.599l-.518-1.065a1.2 1.2 0 0 1 0-1.11l.518-1.065a1.119 1.119 0 0 1 .651-.599l2.35-1.045a.983.983 0 0 1 .697-.061z"
27
+ />
28
+ </svg>
29
+ );
30
+
31
+ // Supabase icon component
32
+ const SupabaseIcon = () => (
33
+ <svg viewBox="0 0 24 24" className="w-4 h-4">
34
+ <path
35
+ fill="currentColor"
36
+ d="M21.362 9.354H12V.396a.396.396 0 0 0-.716-.233L2.203 12.424l-.401.562a1.04 1.04 0 0 0 .836 1.659H12V21.6a.396.396 0 0 0 .716.233l9.081-12.261.401-.562a1.04 1.04 0 0 0-.836-1.656z"
37
+ />
38
+ </svg>
39
+ );
40
+
41
+ export const TAB_ICONS: Record<TabType, React.ComponentType<{ className?: string }>> = {
42
+ profile: User,
43
+ settings: Settings,
44
+ notifications: Bell,
45
+ features: Star,
46
+ data: Database,
47
+ 'cloud-providers': Cloud,
48
+ 'local-providers': Laptop,
49
+ github: Github,
50
+ gitlab: () => <GitLabIcon />,
51
+ netlify: () => <NetlifyIcon />,
52
+ vercel: () => <VercelIcon />,
53
+ supabase: () => <SupabaseIcon />,
54
+ 'event-logs': List,
55
+ mcp: Wrench,
56
+ };
57
+
58
+ export const TAB_LABELS: Record<TabType, string> = {
59
+ profile: 'Profile',
60
+ settings: 'Settings',
61
+ notifications: 'Notifications',
62
+ features: 'Features',
63
+ data: 'Data Management',
64
+ 'cloud-providers': 'Cloud Providers',
65
+ 'local-providers': 'Local Providers',
66
+ github: 'GitHub',
67
+ gitlab: 'GitLab',
68
+ netlify: 'Netlify',
69
+ vercel: 'Vercel',
70
+ supabase: 'Supabase',
71
+ 'event-logs': 'Event Logs',
72
+ mcp: 'MCP Servers',
73
+ };
74
+
75
+ export const TAB_DESCRIPTIONS: Record<TabType, string> = {
76
+ profile: 'Manage your profile and account settings',
77
+ settings: 'Configure application preferences',
78
+ notifications: 'View and manage your notifications',
79
+ features: 'Explore new and upcoming features',
80
+ data: 'Manage your data and storage',
81
+ 'cloud-providers': 'Configure cloud AI providers and models',
82
+ 'local-providers': 'Configure local AI providers and models',
83
+ github: 'Connect and manage GitHub integration',
84
+ gitlab: 'Connect and manage GitLab integration',
85
+ netlify: 'Configure Netlify deployment settings',
86
+ vercel: 'Manage Vercel projects and deployments',
87
+ supabase: 'Setup Supabase database connection',
88
+ 'event-logs': 'View system events and logs',
89
+ mcp: 'Configure MCP (Model Context Protocol) servers',
90
+ };
91
+
92
+ export const DEFAULT_TAB_CONFIG = [
93
+ // User Window Tabs (Always visible by default)
94
+ { id: 'features', visible: true, window: 'user' as const, order: 0 },
95
+ { id: 'data', visible: true, window: 'user' as const, order: 1 },
96
+ { id: 'cloud-providers', visible: true, window: 'user' as const, order: 2 },
97
+ { id: 'local-providers', visible: true, window: 'user' as const, order: 3 },
98
+ { id: 'github', visible: true, window: 'user' as const, order: 4 },
99
+ { id: 'gitlab', visible: true, window: 'user' as const, order: 5 },
100
+ { id: 'netlify', visible: true, window: 'user' as const, order: 6 },
101
+ { id: 'vercel', visible: true, window: 'user' as const, order: 7 },
102
+ { id: 'supabase', visible: true, window: 'user' as const, order: 8 },
103
+ { id: 'notifications', visible: true, window: 'user' as const, order: 9 },
104
+ { id: 'event-logs', visible: true, window: 'user' as const, order: 10 },
105
+ { id: 'mcp', visible: true, window: 'user' as const, order: 11 },
106
+
107
+ // User Window Tabs (In dropdown, initially hidden)
108
+ ];