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,11 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { extractRelativePath } from './diff';
3
+ import { WORK_DIR } from './constants';
4
+
5
+ describe('Diff', () => {
6
+ it('should strip out Work_dir', () => {
7
+ const filePath = `${WORK_DIR}/index.js`;
8
+ const result = extractRelativePath(filePath);
9
+ expect(result).toBe('index.js');
10
+ });
11
+ });
@@ -0,0 +1,117 @@
1
+ import { createTwoFilesPatch } from 'diff';
2
+ import type { FileMap } from '~/lib/stores/files';
3
+ import { MODIFICATIONS_TAG_NAME, WORK_DIR } from './constants';
4
+
5
+ export const modificationsRegex = new RegExp(
6
+ `^<${MODIFICATIONS_TAG_NAME}>[\\s\\S]*?<\\/${MODIFICATIONS_TAG_NAME}>\\s+`,
7
+ 'g',
8
+ );
9
+
10
+ interface ModifiedFile {
11
+ type: 'diff' | 'file';
12
+ content: string;
13
+ }
14
+
15
+ type FileModifications = Record<string, ModifiedFile>;
16
+
17
+ export function computeFileModifications(files: FileMap, modifiedFiles: Map<string, string>) {
18
+ const modifications: FileModifications = {};
19
+
20
+ let hasModifiedFiles = false;
21
+
22
+ for (const [filePath, originalContent] of modifiedFiles) {
23
+ const file = files[filePath];
24
+
25
+ if (file?.type !== 'file') {
26
+ continue;
27
+ }
28
+
29
+ const unifiedDiff = diffFiles(filePath, originalContent, file.content);
30
+
31
+ if (!unifiedDiff) {
32
+ // files are identical
33
+ continue;
34
+ }
35
+
36
+ hasModifiedFiles = true;
37
+
38
+ if (unifiedDiff.length > file.content.length) {
39
+ // if there are lots of changes we simply grab the current file content since it's smaller than the diff
40
+ modifications[filePath] = { type: 'file', content: file.content };
41
+ } else {
42
+ // otherwise we use the diff since it's smaller
43
+ modifications[filePath] = { type: 'diff', content: unifiedDiff };
44
+ }
45
+ }
46
+
47
+ if (!hasModifiedFiles) {
48
+ return undefined;
49
+ }
50
+
51
+ return modifications;
52
+ }
53
+
54
+ /**
55
+ * Computes a diff in the unified format. The only difference is that the header is omitted
56
+ * because it will always assume that you're comparing two versions of the same file and
57
+ * it allows us to avoid the extra characters we send back to the llm.
58
+ *
59
+ * @see https://www.gnu.org/software/diffutils/manual/html_node/Unified-Format.html
60
+ */
61
+ export function diffFiles(fileName: string, oldFileContent: string, newFileContent: string) {
62
+ let unifiedDiff = createTwoFilesPatch(fileName, fileName, oldFileContent, newFileContent);
63
+
64
+ const patchHeaderEnd = `--- ${fileName}\n+++ ${fileName}\n`;
65
+ const headerEndIndex = unifiedDiff.indexOf(patchHeaderEnd);
66
+
67
+ if (headerEndIndex >= 0) {
68
+ unifiedDiff = unifiedDiff.slice(headerEndIndex + patchHeaderEnd.length);
69
+ }
70
+
71
+ if (unifiedDiff === '') {
72
+ return undefined;
73
+ }
74
+
75
+ return unifiedDiff;
76
+ }
77
+
78
+ const regex = new RegExp(`^${WORK_DIR}\/`);
79
+
80
+ /**
81
+ * Strips out the work directory from the file path.
82
+ */
83
+ export function extractRelativePath(filePath: string) {
84
+ return filePath.replace(regex, '');
85
+ }
86
+
87
+ /**
88
+ * Converts the unified diff to HTML.
89
+ *
90
+ * Example:
91
+ *
92
+ * ```html
93
+ * <bolt_file_modifications>
94
+ * <diff path="/home/project/index.js">
95
+ * - console.log('Hello, World!');
96
+ * + console.log('Hello, Bolt!');
97
+ * </diff>
98
+ * </bolt_file_modifications>
99
+ * ```
100
+ */
101
+ export function fileModificationsToHTML(modifications: FileModifications) {
102
+ const entries = Object.entries(modifications);
103
+
104
+ if (entries.length === 0) {
105
+ return undefined;
106
+ }
107
+
108
+ const result: string[] = [`<${MODIFICATIONS_TAG_NAME}>`];
109
+
110
+ for (const [filePath, { type, content }] of entries) {
111
+ result.push(`<${type} path=${JSON.stringify(filePath)}>`, content, `</${type}>`);
112
+ }
113
+
114
+ result.push(`</${MODIFICATIONS_TAG_NAME}>`);
115
+
116
+ return result.join('\n');
117
+ }
@@ -0,0 +1,3 @@
1
+ import { cubicBezier } from 'framer-motion';
2
+
3
+ export const cubicEasingFn = cubicBezier(0.4, 0, 0.2, 1);
@@ -0,0 +1,96 @@
1
+ import {
2
+ getLockedItems,
3
+ isFileLocked as isFileLockedInternal,
4
+ isFolderLocked as isFolderLockedInternal,
5
+ isPathInLockedFolder,
6
+ } from '~/lib/persistence/lockedFiles';
7
+ import { createScopedLogger } from './logger';
8
+
9
+ const logger = createScopedLogger('FileLocks');
10
+
11
+ /**
12
+ * Get the current chat ID from the URL
13
+ * @returns The current chat ID or a default value if not found
14
+ */
15
+ export function getCurrentChatId(): string {
16
+ try {
17
+ if (typeof window !== 'undefined') {
18
+ // Extract chat ID from URL (format: /chat/123)
19
+ const match = window.location.pathname.match(/\/chat\/([^/]+)/);
20
+
21
+ if (match && match[1]) {
22
+ return match[1];
23
+ }
24
+ }
25
+
26
+ // Return a default chat ID if none is found
27
+ return 'default';
28
+ } catch (error) {
29
+ logger.error('Failed to get current chat ID', error);
30
+ return 'default';
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Check if a file is locked directly from localStorage
36
+ * This avoids circular dependencies between components and stores
37
+ * @param filePath The path of the file to check
38
+ * @param chatId Optional chat ID (will be extracted from URL if not provided)
39
+ */
40
+ export function isFileLocked(filePath: string, chatId?: string): { locked: boolean; lockedBy?: string } {
41
+ try {
42
+ const currentChatId = chatId || getCurrentChatId();
43
+
44
+ // Use the internal function from lockedFiles.ts
45
+ const result = isFileLockedInternal(currentChatId, filePath);
46
+
47
+ // If the file itself is not locked, check if it's in a locked folder
48
+ if (!result.locked) {
49
+ const folderLockResult = isPathInLockedFolder(currentChatId, filePath);
50
+
51
+ if (folderLockResult.locked) {
52
+ return folderLockResult;
53
+ }
54
+ }
55
+
56
+ return result;
57
+ } catch (error) {
58
+ logger.error('Failed to check if file is locked', error);
59
+ return { locked: false };
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Check if a folder is locked directly from localStorage
65
+ * This avoids circular dependencies between components and stores
66
+ * @param folderPath The path of the folder to check
67
+ * @param chatId Optional chat ID (will be extracted from URL if not provided)
68
+ */
69
+ export function isFolderLocked(folderPath: string, chatId?: string): { locked: boolean; lockedBy?: string } {
70
+ try {
71
+ const currentChatId = chatId || getCurrentChatId();
72
+
73
+ // Use the internal function from lockedFiles.ts
74
+ return isFolderLockedInternal(currentChatId, folderPath);
75
+ } catch (error) {
76
+ logger.error('Failed to check if folder is locked', error);
77
+ return { locked: false };
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Check if any files are locked in the current chat
83
+ * @param chatId Optional chat ID (will be extracted from URL if not provided)
84
+ * @returns True if any files or folders are locked
85
+ */
86
+ export function hasLockedItems(chatId?: string): boolean {
87
+ try {
88
+ const currentChatId = chatId || getCurrentChatId();
89
+ const lockedItems = getLockedItems();
90
+
91
+ return lockedItems.some((item) => item.chatId === currentChatId);
92
+ } catch (error) {
93
+ logger.error('Failed to check for locked items', error);
94
+ return false;
95
+ }
96
+ }
@@ -0,0 +1,121 @@
1
+ import ignore from 'ignore';
2
+
3
+ // Common patterns to ignore, similar to .gitignore
4
+ export const IGNORE_PATTERNS = [
5
+ 'node_modules/**',
6
+ '.git/**',
7
+ 'dist/**',
8
+ 'build/**',
9
+ '.next/**',
10
+ 'coverage/**',
11
+ '.cache/**',
12
+ '.vscode/**',
13
+ '.idea/**',
14
+ '**/*.log',
15
+ '**/.DS_Store',
16
+ '**/npm-debug.log*',
17
+ '**/yarn-debug.log*',
18
+ '**/yarn-error.log*',
19
+ ];
20
+
21
+ export const MAX_FILES = 1000;
22
+ export const ig = ignore().add(IGNORE_PATTERNS);
23
+
24
+ export const generateId = () => Math.random().toString(36).substring(2, 15);
25
+
26
+ export const isBinaryFile = async (file: File): Promise<boolean> => {
27
+ const chunkSize = 1024;
28
+ const buffer = new Uint8Array(await file.slice(0, chunkSize).arrayBuffer());
29
+
30
+ for (let i = 0; i < buffer.length; i++) {
31
+ const byte = buffer[i];
32
+
33
+ if (byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)) {
34
+ return true;
35
+ }
36
+ }
37
+
38
+ return false;
39
+ };
40
+
41
+ export const shouldIncludeFile = (path: string): boolean => {
42
+ return !ig.ignores(path);
43
+ };
44
+
45
+ const readPackageJson = async (files: File[]): Promise<{ scripts?: Record<string, string> } | null> => {
46
+ const packageJsonFile = files.find((f) => f.webkitRelativePath.endsWith('package.json'));
47
+
48
+ if (!packageJsonFile) {
49
+ return null;
50
+ }
51
+
52
+ try {
53
+ const content = await new Promise<string>((resolve, reject) => {
54
+ const reader = new FileReader();
55
+ reader.onload = () => resolve(reader.result as string);
56
+ reader.onerror = reject;
57
+ reader.readAsText(packageJsonFile);
58
+ });
59
+
60
+ return JSON.parse(content);
61
+ } catch (error) {
62
+ console.error('Error reading package.json:', error);
63
+ return null;
64
+ }
65
+ };
66
+
67
+ export const detectProjectType = async (
68
+ files: File[],
69
+ ): Promise<{ type: string; setupCommand: string; followupMessage: string }> => {
70
+ const hasFile = (name: string) => files.some((f) => f.webkitRelativePath.endsWith(name));
71
+
72
+ if (hasFile('package.json')) {
73
+ const packageJson = await readPackageJson(files);
74
+ const scripts = packageJson?.scripts || {};
75
+
76
+ // Check for preferred commands in priority order
77
+ const preferredCommands = ['dev', 'start', 'preview'];
78
+ const availableCommand = preferredCommands.find((cmd) => scripts[cmd]);
79
+
80
+ if (availableCommand) {
81
+ return {
82
+ type: 'Node.js',
83
+ setupCommand: `npm install && npm run ${availableCommand}`,
84
+ followupMessage: `Found "${availableCommand}" script in package.json. Running "npm run ${availableCommand}" after installation.`,
85
+ };
86
+ }
87
+
88
+ return {
89
+ type: 'Node.js',
90
+ setupCommand: 'npm install',
91
+ followupMessage:
92
+ 'Would you like me to inspect package.json to determine the available scripts for running this project?',
93
+ };
94
+ }
95
+
96
+ if (hasFile('index.html')) {
97
+ return {
98
+ type: 'Static',
99
+ setupCommand: 'npx --yes serve',
100
+ followupMessage: '',
101
+ };
102
+ }
103
+
104
+ return { type: '', setupCommand: '', followupMessage: '' };
105
+ };
106
+
107
+ export const filesToArtifacts = (files: { [path: string]: { content: string } }, id: string): string => {
108
+ return `
109
+ <boltArtifact id="${id}" title="User Updated Files">
110
+ ${Object.keys(files)
111
+ .map(
112
+ (filePath) => `
113
+ <boltAction type="file" filePath="${filePath}">
114
+ ${files[filePath].content}
115
+ </boltAction>
116
+ `,
117
+ )
118
+ .join('\n')}
119
+ </boltArtifact>
120
+ `;
121
+ };
@@ -0,0 +1,73 @@
1
+ import type { Message } from 'ai';
2
+ import { generateId } from './fileUtils';
3
+ import { detectProjectCommands, createCommandsMessage, escapeBoltTags } from './projectCommands';
4
+
5
+ export const createChatFromFolder = async (
6
+ files: File[],
7
+ binaryFiles: string[],
8
+ folderName: string,
9
+ ): Promise<Message[]> => {
10
+ const fileArtifacts = await Promise.all(
11
+ files.map(async (file) => {
12
+ return new Promise<{ content: string; path: string }>((resolve, reject) => {
13
+ const reader = new FileReader();
14
+
15
+ reader.onload = () => {
16
+ const content = reader.result as string;
17
+ const relativePath = file.webkitRelativePath.split('/').slice(1).join('/');
18
+ resolve({
19
+ content,
20
+ path: relativePath,
21
+ });
22
+ };
23
+ reader.onerror = reject;
24
+ reader.readAsText(file);
25
+ });
26
+ }),
27
+ );
28
+
29
+ const commands = await detectProjectCommands(fileArtifacts);
30
+ const commandsMessage = createCommandsMessage(commands);
31
+
32
+ const binaryFilesMessage =
33
+ binaryFiles.length > 0
34
+ ? `\n\nSkipped ${binaryFiles.length} binary files:\n${binaryFiles.map((f) => `- ${f}`).join('\n')}`
35
+ : '';
36
+
37
+ const filesMessage: Message = {
38
+ role: 'assistant',
39
+ content: `I've imported the contents of the "${folderName}" folder.${binaryFilesMessage}
40
+
41
+ <boltArtifact id="imported-files" title="Imported Files" type="bundled" >
42
+ ${fileArtifacts
43
+ .map(
44
+ (file) => `<boltAction type="file" filePath="${file.path}">
45
+ ${escapeBoltTags(file.content)}
46
+ </boltAction>`,
47
+ )
48
+ .join('\n\n')}
49
+ </boltArtifact>`,
50
+ id: generateId(),
51
+ createdAt: new Date(),
52
+ };
53
+
54
+ const userMessage: Message = {
55
+ role: 'user',
56
+ id: generateId(),
57
+ content: `Import the "${folderName}" folder`,
58
+ createdAt: new Date(),
59
+ };
60
+
61
+ const messages = [userMessage, filesMessage];
62
+
63
+ if (commandsMessage) {
64
+ messages.push({
65
+ role: 'user',
66
+ id: generateId(),
67
+ content: 'Setup the codebase and Start the application',
68
+ });
69
+ messages.push(commandsMessage);
70
+ }
71
+
72
+ return messages;
73
+ };
@@ -0,0 +1,12 @@
1
+ export function formatSize(bytes: number): string {
2
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
3
+ let size = bytes;
4
+ let unitIndex = 0;
5
+
6
+ while (size >= 1024 && unitIndex < units.length - 1) {
7
+ size /= 1024;
8
+ unitIndex++;
9
+ }
10
+
11
+ return `${size.toFixed(1)} ${units[unitIndex]}`;
12
+ }
@@ -0,0 +1,24 @@
1
+ export const getLanguageFromExtension = (ext: string): string => {
2
+ const map: Record<string, string> = {
3
+ js: 'javascript',
4
+ jsx: 'jsx',
5
+ ts: 'typescript',
6
+ tsx: 'tsx',
7
+ json: 'json',
8
+ html: 'html',
9
+ css: 'css',
10
+ py: 'python',
11
+ java: 'java',
12
+ rb: 'ruby',
13
+ cpp: 'cpp',
14
+ c: 'c',
15
+ cs: 'csharp',
16
+ go: 'go',
17
+ rs: 'rust',
18
+ php: 'php',
19
+ swift: 'swift',
20
+ md: 'plaintext',
21
+ sh: 'bash',
22
+ };
23
+ return map[ext] || 'typescript';
24
+ };
@@ -0,0 +1,9 @@
1
+ import type { GitHubStats } from '~/types/GitHub';
2
+
3
+ export function calculateStatsSummary(stats: GitHubStats): GitHubStats {
4
+ return {
5
+ ...stats,
6
+
7
+ // Add any calculated fields that might be missing
8
+ };
9
+ }
@@ -0,0 +1,54 @@
1
+ import type { GitLabProjectInfo, GitLabStats } from '~/types/GitLab';
2
+
3
+ export function calculateProjectStats(projects: any[]): { projects: GitLabProjectInfo[] } {
4
+ const projectStats = {
5
+ projects: projects.map((project: any) => ({
6
+ id: project.id,
7
+ name: project.name,
8
+ path_with_namespace: project.path_with_namespace,
9
+ description: project.description,
10
+ http_url_to_repo: project.http_url_to_repo,
11
+ star_count: project.star_count || 0,
12
+ forks_count: project.forks_count || 0,
13
+ default_branch: project.default_branch,
14
+ updated_at: project.updated_at,
15
+ visibility: project.visibility,
16
+ })),
17
+ };
18
+
19
+ return projectStats;
20
+ }
21
+
22
+ export function calculateStatsSummary(
23
+ projects: GitLabProjectInfo[],
24
+ events: any[],
25
+ groups: any[],
26
+ snippets: any[],
27
+ user: any,
28
+ ): GitLabStats {
29
+ const totalStars = projects.reduce((sum, p) => sum + (p.star_count || 0), 0);
30
+ const totalForks = projects.reduce((sum, p) => sum + (p.forks_count || 0), 0);
31
+ const privateProjects = projects.filter((p) => p.visibility === 'private').length;
32
+
33
+ const recentActivity = events.slice(0, 5).map((event: any) => ({
34
+ id: event.id,
35
+ action_name: event.action_name,
36
+ project_id: event.project_id,
37
+ project: event.project,
38
+ created_at: event.created_at,
39
+ }));
40
+
41
+ return {
42
+ projects,
43
+ recentActivity,
44
+ totalSnippets: snippets.length,
45
+ publicProjects: projects.filter((p) => p.visibility === 'public').length,
46
+ privateProjects,
47
+ stars: totalStars,
48
+ forks: totalForks,
49
+ followers: user.followers || 0,
50
+ snippets: snippets.length,
51
+ groups,
52
+ lastUpdated: new Date().toISOString(),
53
+ };
54
+ }
@@ -0,0 +1,162 @@
1
+ export type DebugLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'none';
2
+ import { Chalk } from 'chalk';
3
+
4
+ const chalk = new Chalk({ level: 3 });
5
+
6
+ type LoggerFunction = (...messages: any[]) => void;
7
+
8
+ interface Logger {
9
+ trace: LoggerFunction;
10
+ debug: LoggerFunction;
11
+ info: LoggerFunction;
12
+ warn: LoggerFunction;
13
+ error: LoggerFunction;
14
+ setLevel: (level: DebugLevel) => void;
15
+ }
16
+
17
+ let currentLevel: DebugLevel = import.meta.env.VITE_LOG_LEVEL || (import.meta.env.DEV ? 'debug' : 'info');
18
+
19
+ export const logger: Logger = {
20
+ trace: (...messages: any[]) => logWithDebugCapture('trace', undefined, messages),
21
+ debug: (...messages: any[]) => logWithDebugCapture('debug', undefined, messages),
22
+ info: (...messages: any[]) => logWithDebugCapture('info', undefined, messages),
23
+ warn: (...messages: any[]) => logWithDebugCapture('warn', undefined, messages),
24
+ error: (...messages: any[]) => logWithDebugCapture('error', undefined, messages),
25
+ setLevel,
26
+ };
27
+
28
+ export function createScopedLogger(scope: string): Logger {
29
+ return {
30
+ trace: (...messages: any[]) => logWithDebugCapture('trace', scope, messages),
31
+ debug: (...messages: any[]) => logWithDebugCapture('debug', scope, messages),
32
+ info: (...messages: any[]) => logWithDebugCapture('info', scope, messages),
33
+ warn: (...messages: any[]) => logWithDebugCapture('warn', scope, messages),
34
+ error: (...messages: any[]) => logWithDebugCapture('error', scope, messages),
35
+ setLevel,
36
+ };
37
+ }
38
+
39
+ function setLevel(level: DebugLevel) {
40
+ if ((level === 'trace' || level === 'debug') && import.meta.env.PROD) {
41
+ return;
42
+ }
43
+
44
+ currentLevel = level;
45
+ }
46
+
47
+ function log(level: DebugLevel, scope: string | undefined, messages: any[]) {
48
+ const levelOrder: DebugLevel[] = ['trace', 'debug', 'info', 'warn', 'error', 'none'];
49
+
50
+ if (levelOrder.indexOf(level) < levelOrder.indexOf(currentLevel)) {
51
+ return;
52
+ }
53
+
54
+ // If current level is 'none', don't log anything
55
+ if (currentLevel === 'none') {
56
+ return;
57
+ }
58
+
59
+ const allMessages = messages.reduce((acc, current) => {
60
+ if (acc.endsWith('\n')) {
61
+ return acc + current;
62
+ }
63
+
64
+ if (!acc) {
65
+ return current;
66
+ }
67
+
68
+ return `${acc} ${current}`;
69
+ }, '');
70
+
71
+ const labelBackgroundColor = getColorForLevel(level);
72
+ const labelTextColor = level === 'warn' ? '#000000' : '#FFFFFF';
73
+
74
+ const labelStyles = getLabelStyles(labelBackgroundColor, labelTextColor);
75
+ const scopeStyles = getLabelStyles('#77828D', 'white');
76
+
77
+ const styles = [labelStyles];
78
+
79
+ if (typeof scope === 'string') {
80
+ styles.push('', scopeStyles);
81
+ }
82
+
83
+ let labelText = formatText(` ${level.toUpperCase()} `, labelTextColor, labelBackgroundColor);
84
+
85
+ if (scope) {
86
+ labelText = `${labelText} ${formatText(` ${scope} `, '#FFFFFF', '77828D')}`;
87
+ }
88
+
89
+ if (typeof window !== 'undefined') {
90
+ console.log(`%c${level.toUpperCase()}${scope ? `%c %c${scope}` : ''}`, ...styles, allMessages);
91
+ } else {
92
+ console.log(`${labelText}`, allMessages);
93
+ }
94
+ }
95
+
96
+ function formatText(text: string, color: string, bg: string) {
97
+ return chalk.bgHex(bg)(chalk.hex(color)(text));
98
+ }
99
+
100
+ function getLabelStyles(color: string, textColor: string) {
101
+ return `background-color: ${color}; color: white; border: 4px solid ${color}; color: ${textColor};`;
102
+ }
103
+
104
+ function getColorForLevel(level: DebugLevel): string {
105
+ switch (level) {
106
+ case 'trace':
107
+ case 'debug': {
108
+ return '#77828D';
109
+ }
110
+ case 'info': {
111
+ return '#1389FD';
112
+ }
113
+ case 'warn': {
114
+ return '#FFDB6C';
115
+ }
116
+ case 'error': {
117
+ return '#EE4744';
118
+ }
119
+ default: {
120
+ return '#000000';
121
+ }
122
+ }
123
+ }
124
+
125
+ export const renderLogger = createScopedLogger('Render');
126
+
127
+ // Debug logging integration
128
+ let debugLogger: any = null;
129
+
130
+ // Lazy load debug logger to avoid circular dependencies
131
+ const getDebugLogger = () => {
132
+ if (!debugLogger && typeof window !== 'undefined') {
133
+ try {
134
+ // Use dynamic import asynchronously but don't block the function
135
+ import('./debugLogger')
136
+ .then(({ debugLogger: loggerInstance }) => {
137
+ debugLogger = loggerInstance;
138
+ })
139
+ .catch(() => {
140
+ // Debug logger not available, skip integration
141
+ });
142
+ } catch {
143
+ // Debug logger not available, skip integration
144
+ }
145
+ }
146
+
147
+ return debugLogger;
148
+ };
149
+
150
+ // Override the log function to also capture to debug logger
151
+
152
+ function logWithDebugCapture(level: DebugLevel, scope: string | undefined, messages: any[]) {
153
+ // Call original log function (the one that does the actual console logging)
154
+ log(level, scope, messages);
155
+
156
+ // Also capture to debug logger if available
157
+ const debug = getDebugLogger();
158
+
159
+ if (debug) {
160
+ debug.captureLog(level, scope, messages);
161
+ }
162
+ }