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,361 @@
1
+ import React from 'react';
2
+ import { classNames } from '~/utils/classNames';
3
+ import { formatSize } from '~/utils/formatSize';
4
+ import type { GitHubRepoInfo } from '~/types/GitHub';
5
+ import {
6
+ Star,
7
+ GitFork,
8
+ Clock,
9
+ Lock,
10
+ Archive,
11
+ GitBranch,
12
+ Users,
13
+ Database,
14
+ Tag,
15
+ Heart,
16
+ ExternalLink,
17
+ Circle,
18
+ GitPullRequest,
19
+ } from 'lucide-react';
20
+
21
+ interface RepositoryCardProps {
22
+ repository: GitHubRepoInfo;
23
+ variant?: 'default' | 'compact' | 'detailed';
24
+ onSelect?: () => void;
25
+ showHealthScore?: boolean;
26
+ showExtendedMetrics?: boolean;
27
+ className?: string;
28
+ }
29
+
30
+ export function RepositoryCard({
31
+ repository,
32
+ variant = 'default',
33
+ onSelect,
34
+ showHealthScore = false,
35
+ showExtendedMetrics = false,
36
+ className = '',
37
+ }: RepositoryCardProps) {
38
+ const daysSinceUpdate = Math.floor((Date.now() - new Date(repository.updated_at).getTime()) / (1000 * 60 * 60 * 24));
39
+
40
+ const formatTimeAgo = () => {
41
+ if (daysSinceUpdate === 0) {
42
+ return 'Today';
43
+ }
44
+
45
+ if (daysSinceUpdate === 1) {
46
+ return '1 day ago';
47
+ }
48
+
49
+ if (daysSinceUpdate < 7) {
50
+ return `${daysSinceUpdate} days ago`;
51
+ }
52
+
53
+ if (daysSinceUpdate < 30) {
54
+ return `${Math.floor(daysSinceUpdate / 7)} weeks ago`;
55
+ }
56
+
57
+ return new Date(repository.updated_at).toLocaleDateString(undefined, {
58
+ year: 'numeric',
59
+ month: 'short',
60
+ day: 'numeric',
61
+ });
62
+ };
63
+
64
+ const calculateHealthScore = () => {
65
+ const hasStars = repository.stargazers_count > 0;
66
+ const hasRecentActivity = daysSinceUpdate < 30;
67
+ const hasContributors = (repository.contributors_count || 0) > 1;
68
+ const hasDescription = !!repository.description;
69
+ const hasTopics = (repository.topics || []).length > 0;
70
+ const hasLicense = !!repository.license;
71
+
72
+ const healthScore = [hasStars, hasRecentActivity, hasContributors, hasDescription, hasTopics, hasLicense].filter(
73
+ Boolean,
74
+ ).length;
75
+
76
+ const maxScore = 6;
77
+ const percentage = Math.round((healthScore / maxScore) * 100);
78
+
79
+ const getScoreColor = (score: number) => {
80
+ if (score >= 5) {
81
+ return 'text-green-500';
82
+ }
83
+
84
+ if (score >= 3) {
85
+ return 'text-yellow-500';
86
+ }
87
+
88
+ return 'text-red-500';
89
+ };
90
+
91
+ return {
92
+ percentage,
93
+ color: getScoreColor(healthScore),
94
+ score: healthScore,
95
+ maxScore,
96
+ };
97
+ };
98
+
99
+ const getHealthIndicatorColor = () => {
100
+ const isActive = daysSinceUpdate < 7;
101
+ const isHealthy = daysSinceUpdate < 30 && !repository.archived && repository.stargazers_count > 0;
102
+
103
+ if (repository.archived) {
104
+ return 'bg-gray-500';
105
+ }
106
+
107
+ if (isActive) {
108
+ return 'bg-green-500';
109
+ }
110
+
111
+ if (isHealthy) {
112
+ return 'bg-blue-500';
113
+ }
114
+
115
+ return 'bg-yellow-500';
116
+ };
117
+
118
+ const getHealthTitle = () => {
119
+ if (repository.archived) {
120
+ return 'Archived';
121
+ }
122
+
123
+ if (daysSinceUpdate < 7) {
124
+ return 'Very Active';
125
+ }
126
+
127
+ if (daysSinceUpdate < 30 && repository.stargazers_count > 0) {
128
+ return 'Healthy';
129
+ }
130
+
131
+ return 'Needs Attention';
132
+ };
133
+
134
+ const health = showHealthScore ? calculateHealthScore() : null;
135
+
136
+ if (variant === 'compact') {
137
+ return (
138
+ <button
139
+ onClick={onSelect}
140
+ className={classNames(
141
+ 'w-full text-left p-3 rounded-lg border border-bolt-elements-borderColor hover:border-bolt-elements-borderColorActive hover:bg-bolt-elements-background-depth-1 transition-all duration-200',
142
+ className,
143
+ )}
144
+ >
145
+ <div className="flex items-start justify-between mb-2">
146
+ <div className="flex items-center gap-2">
147
+ <h4 className="text-sm font-medium text-bolt-elements-textPrimary">{repository.name}</h4>
148
+ {repository.private && <Lock className="w-3 h-3 text-bolt-elements-textTertiary" />}
149
+ {repository.fork && <GitFork className="w-3 h-3 text-bolt-elements-textTertiary" />}
150
+ {repository.archived && <Archive className="w-3 h-3 text-bolt-elements-textTertiary" />}
151
+ </div>
152
+
153
+ <div className="flex items-center gap-3 text-xs text-bolt-elements-textSecondary">
154
+ <span className="flex items-center gap-1">
155
+ <Star className="w-3 h-3" />
156
+ {repository.stargazers_count}
157
+ </span>
158
+ <span className="flex items-center gap-1">
159
+ <GitFork className="w-3 h-3" />
160
+ {repository.forks_count}
161
+ </span>
162
+ </div>
163
+ </div>
164
+
165
+ {repository.description && (
166
+ <p className="text-xs text-bolt-elements-textSecondary mb-2 line-clamp-2">{repository.description}</p>
167
+ )}
168
+
169
+ <div className="flex items-center justify-between">
170
+ <div className="flex items-center gap-3 text-xs text-bolt-elements-textTertiary">
171
+ {repository.language && (
172
+ <span className="flex items-center gap-1">
173
+ <div className="w-2 h-2 rounded-full bg-current opacity-60" />
174
+ {repository.language}
175
+ </span>
176
+ )}
177
+ {repository.size && <span>{formatSize(repository.size * 1024)}</span>}
178
+ </div>
179
+
180
+ <span className="flex items-center gap-1 text-xs text-bolt-elements-textTertiary">
181
+ <Clock className="w-3 h-3" />
182
+ {formatTimeAgo()}
183
+ </span>
184
+ </div>
185
+ </button>
186
+ );
187
+ }
188
+
189
+ const Component = onSelect ? 'button' : 'div';
190
+ const interactiveProps = onSelect
191
+ ? {
192
+ onClick: onSelect,
193
+ className: classNames(
194
+ 'group cursor-pointer hover:border-bolt-elements-borderColorActive dark:hover:border-bolt-elements-borderColorActive transition-all duration-200',
195
+ className,
196
+ ),
197
+ }
198
+ : { className };
199
+
200
+ return (
201
+ <Component
202
+ {...interactiveProps}
203
+ className={classNames(
204
+ 'block p-4 rounded-lg bg-bolt-elements-background-depth-1 dark:bg-bolt-elements-background-depth-1 border border-bolt-elements-borderColor dark:border-bolt-elements-borderColor relative',
205
+ interactiveProps.className,
206
+ )}
207
+ >
208
+ {/* Repository Health Indicator */}
209
+ {variant === 'detailed' && (
210
+ <div
211
+ className={`absolute top-2 right-2 w-2 h-2 rounded-full ${getHealthIndicatorColor()}`}
212
+ title={`Repository Health: ${getHealthTitle()}`}
213
+ />
214
+ )}
215
+
216
+ <div className="space-y-3">
217
+ <div className="flex items-start justify-between">
218
+ <div className="flex items-center gap-2">
219
+ <GitBranch className="w-4 h-4 text-bolt-elements-icon-tertiary" />
220
+ <h5
221
+ className={classNames(
222
+ 'text-sm font-medium text-bolt-elements-textPrimary',
223
+ onSelect && 'group-hover:text-bolt-elements-item-contentAccent transition-colors',
224
+ )}
225
+ >
226
+ {repository.name}
227
+ </h5>
228
+ {repository.fork && (
229
+ <span title="Forked repository">
230
+ <GitFork className="w-3 h-3 text-bolt-elements-textTertiary" />
231
+ </span>
232
+ )}
233
+ {repository.archived && (
234
+ <span title="Archived repository">
235
+ <Archive className="w-3 h-3 text-bolt-elements-textTertiary" />
236
+ </span>
237
+ )}
238
+ </div>
239
+ <div className="flex items-center gap-3 text-xs text-bolt-elements-textSecondary">
240
+ <span className="flex items-center gap-1" title="Stars">
241
+ <Star className="w-3.5 h-3.5 text-bolt-elements-icon-warning" />
242
+ {repository.stargazers_count.toLocaleString()}
243
+ </span>
244
+ <span className="flex items-center gap-1" title="Forks">
245
+ <GitFork className="w-3.5 h-3.5 text-bolt-elements-icon-info" />
246
+ {repository.forks_count.toLocaleString()}
247
+ </span>
248
+ {showExtendedMetrics && repository.issues_count !== undefined && (
249
+ <span className="flex items-center gap-1" title="Open Issues">
250
+ <Circle className="w-3.5 h-3.5 text-bolt-elements-icon-error" />
251
+ {repository.issues_count}
252
+ </span>
253
+ )}
254
+ {showExtendedMetrics && repository.pull_requests_count !== undefined && (
255
+ <span className="flex items-center gap-1" title="Pull Requests">
256
+ <GitPullRequest className="w-3.5 h-3.5 text-bolt-elements-icon-success" />
257
+ {repository.pull_requests_count}
258
+ </span>
259
+ )}
260
+ </div>
261
+ </div>
262
+
263
+ <div className="space-y-2">
264
+ {repository.description && (
265
+ <p className="text-xs text-bolt-elements-textSecondary line-clamp-2">{repository.description}</p>
266
+ )}
267
+
268
+ {/* Repository metrics bar */}
269
+ <div className="flex items-center gap-2 text-xs">
270
+ {repository.license && (
271
+ <span className="px-2 py-0.5 rounded-full bg-bolt-elements-background-depth-2 text-bolt-elements-textTertiary">
272
+ {repository.license.spdx_id || repository.license.name}
273
+ </span>
274
+ )}
275
+ {repository.topics &&
276
+ repository.topics.slice(0, 2).map((topic) => (
277
+ <span
278
+ key={topic}
279
+ className="px-2 py-0.5 rounded-full bg-blue-100 text-blue-800 dark:bg-blue-900/20 dark:text-blue-400"
280
+ >
281
+ {topic}
282
+ </span>
283
+ ))}
284
+ {repository.archived && (
285
+ <span className="px-2 py-0.5 rounded-full bg-gray-100 text-gray-800 dark:bg-gray-900/20 dark:text-gray-400">
286
+ Archived
287
+ </span>
288
+ )}
289
+ {repository.fork && (
290
+ <span className="px-2 py-0.5 rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/20 dark:text-purple-400">
291
+ Fork
292
+ </span>
293
+ )}
294
+ </div>
295
+ </div>
296
+
297
+ <div className="flex items-center justify-between">
298
+ <div className="flex items-center gap-3 text-xs text-bolt-elements-textSecondary">
299
+ <span className="flex items-center gap-1" title="Default Branch">
300
+ <GitBranch className="w-3.5 h-3.5" />
301
+ {repository.default_branch}
302
+ </span>
303
+ {showExtendedMetrics && repository.branches_count && (
304
+ <span className="flex items-center gap-1" title="Total Branches">
305
+ <GitFork className="w-3.5 h-3.5" />
306
+ {repository.branches_count}
307
+ </span>
308
+ )}
309
+ {showExtendedMetrics && repository.contributors_count && (
310
+ <span className="flex items-center gap-1" title="Contributors">
311
+ <Users className="w-3.5 h-3.5" />
312
+ {repository.contributors_count}
313
+ </span>
314
+ )}
315
+ {repository.size && (
316
+ <span className="flex items-center gap-1" title="Size">
317
+ <Database className="w-3.5 h-3.5" />
318
+ {(repository.size / 1024).toFixed(1)}MB
319
+ </span>
320
+ )}
321
+ <span className="flex items-center gap-1" title="Last Updated">
322
+ <Clock className="w-3.5 h-3.5" />
323
+ {formatTimeAgo()}
324
+ </span>
325
+ {repository.topics && repository.topics.length > 0 && (
326
+ <span className="flex items-center gap-1" title={`Topics: ${repository.topics.join(', ')}`}>
327
+ <Tag className="w-3.5 h-3.5" />
328
+ {repository.topics.length}
329
+ </span>
330
+ )}
331
+ </div>
332
+
333
+ <div className="flex items-center gap-2">
334
+ {/* Repository Health Score */}
335
+ {health && (
336
+ <div
337
+ className="flex items-center gap-1"
338
+ title={`Health Score: ${health.percentage}% (${health.score}/${health.maxScore})`}
339
+ >
340
+ <Heart className={`w-3.5 h-3.5 ${health.color}`} />
341
+ <span className={`text-xs font-medium ${health.color}`}>{health.percentage}%</span>
342
+ </div>
343
+ )}
344
+
345
+ {onSelect && (
346
+ <span
347
+ className={classNames(
348
+ 'flex items-center gap-1 ml-2 transition-colors',
349
+ 'group-hover:text-bolt-elements-item-contentAccent',
350
+ )}
351
+ >
352
+ <ExternalLink className="w-3.5 h-3.5" />
353
+ View
354
+ </span>
355
+ )}
356
+ </div>
357
+ </div>
358
+ </div>
359
+ </Component>
360
+ );
361
+ }
@@ -0,0 +1,11 @@
1
+ export { RepositoryCard } from './RepositoryCard';
2
+
3
+ // GitHubDialog components not yet implemented
4
+ export {
5
+ LoadingState,
6
+ ErrorState,
7
+ SuccessState,
8
+ GitHubConnectionRequired,
9
+ InformationState,
10
+ ConnectionTestIndicator,
11
+ } from './GitHubStateIndicators';
@@ -0,0 +1,305 @@
1
+ import React, { useState } from 'react';
2
+ import { motion } from 'framer-motion';
3
+ import { useGitLabConnection } from '~/lib/hooks';
4
+ import GitLabConnection from './components/GitLabConnection';
5
+ import { StatsDisplay } from './components/StatsDisplay';
6
+ import { RepositoryList } from './components/RepositoryList';
7
+
8
+ // GitLab logo SVG component
9
+ const GitLabLogo = () => (
10
+ <svg viewBox="0 0 24 24" className="w-5 h-5">
11
+ <path
12
+ fill="currentColor"
13
+ 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"
14
+ />
15
+ </svg>
16
+ );
17
+
18
+ interface ConnectionTestResult {
19
+ status: 'success' | 'error' | 'testing';
20
+ message: string;
21
+ timestamp?: number;
22
+ }
23
+
24
+ export default function GitLabTab() {
25
+ const { connection, isConnected, isLoading, error, testConnection, refreshStats } = useGitLabConnection();
26
+ const [connectionTest, setConnectionTest] = useState<ConnectionTestResult | null>(null);
27
+ const [isRefreshingStats, setIsRefreshingStats] = useState(false);
28
+
29
+ const handleTestConnection = async () => {
30
+ if (!connection?.user) {
31
+ setConnectionTest({
32
+ status: 'error',
33
+ message: 'No connection established',
34
+ timestamp: Date.now(),
35
+ });
36
+ return;
37
+ }
38
+
39
+ setConnectionTest({
40
+ status: 'testing',
41
+ message: 'Testing connection...',
42
+ });
43
+
44
+ try {
45
+ const isValid = await testConnection();
46
+
47
+ if (isValid) {
48
+ setConnectionTest({
49
+ status: 'success',
50
+ message: `Connected successfully as ${connection.user.username}`,
51
+ timestamp: Date.now(),
52
+ });
53
+ } else {
54
+ setConnectionTest({
55
+ status: 'error',
56
+ message: 'Connection test failed',
57
+ timestamp: Date.now(),
58
+ });
59
+ }
60
+ } catch (error) {
61
+ setConnectionTest({
62
+ status: 'error',
63
+ message: `Connection failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
64
+ timestamp: Date.now(),
65
+ });
66
+ }
67
+ };
68
+
69
+ // Loading state for initial connection check
70
+ if (isLoading) {
71
+ return (
72
+ <div className="space-y-6">
73
+ <div className="flex items-center gap-2">
74
+ <GitLabLogo />
75
+ <h2 className="text-lg font-medium text-bolt-elements-textPrimary">GitLab Integration</h2>
76
+ </div>
77
+ <div className="flex items-center justify-center p-4">
78
+ <div className="flex items-center gap-2">
79
+ <div className="i-ph:spinner-gap-bold animate-spin w-4 h-4" />
80
+ <span className="text-bolt-elements-textSecondary">Loading...</span>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ );
85
+ }
86
+
87
+ // Error state for connection issues
88
+ if (error && !connection) {
89
+ return (
90
+ <div className="space-y-6">
91
+ <div className="flex items-center gap-2">
92
+ <GitLabLogo />
93
+ <h2 className="text-lg font-medium text-bolt-elements-textPrimary">GitLab Integration</h2>
94
+ </div>
95
+ <div className="text-sm text-red-600 dark:text-red-400 p-3 rounded-lg bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800">
96
+ {error}
97
+ </div>
98
+ </div>
99
+ );
100
+ }
101
+
102
+ // Not connected state
103
+ if (!isConnected || !connection) {
104
+ return (
105
+ <div className="space-y-6">
106
+ <div className="flex items-center gap-2">
107
+ <GitLabLogo />
108
+ <h2 className="text-lg font-medium text-bolt-elements-textPrimary">GitLab Integration</h2>
109
+ </div>
110
+ <p className="text-sm text-bolt-elements-textSecondary">
111
+ Connect your GitLab account to enable advanced repository management features, statistics, and seamless
112
+ integration.
113
+ </p>
114
+ <GitLabConnection connectionTest={connectionTest} onTestConnection={handleTestConnection} />
115
+ </div>
116
+ );
117
+ }
118
+
119
+ return (
120
+ <div className="space-y-6">
121
+ {/* Header */}
122
+ <motion.div
123
+ className="flex items-center justify-between gap-2"
124
+ initial={{ opacity: 0, y: 20 }}
125
+ animate={{ opacity: 1, y: 0 }}
126
+ transition={{ delay: 0.1 }}
127
+ >
128
+ <div className="flex items-center gap-2">
129
+ <GitLabLogo />
130
+ <h2 className="text-lg font-medium text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary">
131
+ GitLab Integration
132
+ </h2>
133
+ </div>
134
+ <div className="flex items-center gap-2">
135
+ {connection?.rateLimit && (
136
+ <div className="flex items-center gap-2 px-3 py-1 bg-bolt-elements-background-depth-1 rounded-lg text-xs">
137
+ <div className="i-ph:cloud w-4 h-4 text-bolt-elements-textSecondary" />
138
+ <span className="text-bolt-elements-textSecondary">
139
+ API: {connection.rateLimit.remaining}/{connection.rateLimit.limit}
140
+ </span>
141
+ </div>
142
+ )}
143
+ </div>
144
+ </motion.div>
145
+
146
+ <p className="text-sm text-bolt-elements-textSecondary dark:text-bolt-elements-textSecondary">
147
+ Manage your GitLab integration with advanced repository features and comprehensive statistics
148
+ </p>
149
+
150
+ {/* Connection Test Results */}
151
+ {connectionTest && (
152
+ <div
153
+ className={`p-3 rounded-lg border ${
154
+ connectionTest.status === 'success'
155
+ ? 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800'
156
+ : connectionTest.status === 'error'
157
+ ? 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800'
158
+ : 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800'
159
+ }`}
160
+ >
161
+ <div className="flex items-center gap-2">
162
+ <div
163
+ className={`w-4 h-4 ${
164
+ connectionTest.status === 'success'
165
+ ? 'text-green-600'
166
+ : connectionTest.status === 'error'
167
+ ? 'text-red-600'
168
+ : 'text-blue-600'
169
+ }`}
170
+ >
171
+ {connectionTest.status === 'success' ? (
172
+ <div className="i-ph:check-circle" />
173
+ ) : connectionTest.status === 'error' ? (
174
+ <div className="i-ph:x-circle" />
175
+ ) : (
176
+ <div className="i-ph:spinner animate-spin" />
177
+ )}
178
+ </div>
179
+ <span
180
+ className={`text-sm ${
181
+ connectionTest.status === 'success'
182
+ ? 'text-green-800 dark:text-green-200'
183
+ : connectionTest.status === 'error'
184
+ ? 'text-red-800 dark:text-red-200'
185
+ : 'text-blue-800 dark:text-blue-200'
186
+ }`}
187
+ >
188
+ {connectionTest.message}
189
+ </span>
190
+ </div>
191
+ </div>
192
+ )}
193
+
194
+ {/* GitLab Connection Component */}
195
+ <GitLabConnection connectionTest={connectionTest} onTestConnection={handleTestConnection} />
196
+
197
+ {/* User Profile Section */}
198
+ {connection?.user && (
199
+ <motion.div
200
+ initial={{ opacity: 0, y: 20 }}
201
+ animate={{ opacity: 1, y: 0 }}
202
+ transition={{ delay: 0.3 }}
203
+ className="border-t border-bolt-elements-borderColor pt-6"
204
+ >
205
+ <div className="flex items-center gap-4 p-4 bg-bolt-elements-background-depth-1 rounded-lg">
206
+ <div className="w-12 h-12 rounded-full border-2 border-bolt-elements-item-contentAccent flex items-center justify-center bg-bolt-elements-background-depth-2 overflow-hidden">
207
+ {connection.user.avatar_url &&
208
+ connection.user.avatar_url !== 'null' &&
209
+ connection.user.avatar_url !== '' ? (
210
+ <img
211
+ src={connection.user.avatar_url}
212
+ alt={connection.user.username}
213
+ className="w-full h-full rounded-full object-cover"
214
+ onError={(e) => {
215
+ const target = e.target as HTMLImageElement;
216
+ target.style.display = 'none';
217
+
218
+ const parent = target.parentElement;
219
+
220
+ if (parent) {
221
+ parent.innerHTML = (connection.user?.name || connection.user?.username || 'U')
222
+ .charAt(0)
223
+ .toUpperCase();
224
+ parent.classList.add(
225
+ 'text-white',
226
+ 'font-semibold',
227
+ 'text-sm',
228
+ 'flex',
229
+ 'items-center',
230
+ 'justify-center',
231
+ );
232
+ }
233
+ }}
234
+ />
235
+ ) : (
236
+ <div className="w-full h-full rounded-full bg-bolt-elements-item-contentAccent flex items-center justify-center text-white font-semibold text-sm">
237
+ {(connection.user?.name || connection.user?.username || 'U').charAt(0).toUpperCase()}
238
+ </div>
239
+ )}
240
+ </div>
241
+ <div>
242
+ <h4 className="text-sm font-medium text-bolt-elements-textPrimary">
243
+ {connection.user?.name || connection.user?.username}
244
+ </h4>
245
+ <p className="text-sm text-bolt-elements-textSecondary">{connection.user?.username}</p>
246
+ </div>
247
+ </div>
248
+ </motion.div>
249
+ )}
250
+
251
+ {/* GitLab Stats Section */}
252
+ {connection?.stats && (
253
+ <motion.div
254
+ initial={{ opacity: 0, y: 20 }}
255
+ animate={{ opacity: 1, y: 0 }}
256
+ transition={{ delay: 0.4 }}
257
+ className="border-t border-bolt-elements-borderColor pt-6"
258
+ >
259
+ <h3 className="text-base font-medium text-bolt-elements-textPrimary mb-4">Statistics</h3>
260
+ <StatsDisplay
261
+ stats={connection.stats}
262
+ onRefresh={async () => {
263
+ setIsRefreshingStats(true);
264
+
265
+ try {
266
+ await refreshStats();
267
+ } catch (error) {
268
+ console.error('Failed to refresh stats:', error);
269
+ } finally {
270
+ setIsRefreshingStats(false);
271
+ }
272
+ }}
273
+ isRefreshing={isRefreshingStats}
274
+ />
275
+ </motion.div>
276
+ )}
277
+
278
+ {/* GitLab Repositories Section */}
279
+ {connection?.stats?.projects && (
280
+ <motion.div
281
+ initial={{ opacity: 0, y: 20 }}
282
+ animate={{ opacity: 1, y: 0 }}
283
+ transition={{ delay: 0.5 }}
284
+ className="border-t border-bolt-elements-borderColor pt-6"
285
+ >
286
+ <RepositoryList
287
+ repositories={connection.stats.projects}
288
+ onRefresh={async () => {
289
+ setIsRefreshingStats(true);
290
+
291
+ try {
292
+ await refreshStats();
293
+ } catch (error) {
294
+ console.error('Failed to refresh repositories:', error);
295
+ } finally {
296
+ setIsRefreshingStats(false);
297
+ }
298
+ }}
299
+ isRefreshing={isRefreshingStats}
300
+ />
301
+ </motion.div>
302
+ )}
303
+ </div>
304
+ );
305
+ }