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,670 @@
1
+ import { useStore } from '@nanostores/react';
2
+ import type { Message } from 'ai';
3
+ import { useChat } from '@ai-sdk/react';
4
+ import { useAnimate } from 'framer-motion';
5
+ import { memo, useCallback, useEffect, useRef, useState } from 'react';
6
+ import { toast } from 'react-toastify';
7
+ import { useMessageParser, usePromptEnhancer, useShortcuts } from '~/lib/hooks';
8
+ import { description, useChatHistory } from '~/lib/persistence';
9
+ import { chatStore } from '~/lib/stores/chat';
10
+ import { workbenchStore } from '~/lib/stores/workbench';
11
+ import { DEFAULT_MODEL, DEFAULT_PROVIDER, PROMPT_COOKIE_KEY, PROVIDER_LIST } from '~/utils/constants';
12
+ import { cubicEasingFn } from '~/utils/easings';
13
+ import { createScopedLogger, renderLogger } from '~/utils/logger';
14
+ import { BaseChat } from './BaseChat';
15
+ import Cookies from 'js-cookie';
16
+ import { debounce } from '~/utils/debounce';
17
+ import { useSettings } from '~/lib/hooks/useSettings';
18
+ import type { ProviderInfo } from '~/types/model';
19
+ import { useSearchParams } from '@remix-run/react';
20
+ import { createSampler } from '~/utils/sampler';
21
+ import { getTemplates, selectStarterTemplate } from '~/utils/selectStarterTemplate';
22
+ import { logStore } from '~/lib/stores/logs';
23
+ import { streamingState } from '~/lib/stores/streaming';
24
+ import { filesToArtifacts } from '~/utils/fileUtils';
25
+ import { supabaseConnection } from '~/lib/stores/supabase';
26
+ import { defaultDesignScheme, type DesignScheme } from '~/types/design-scheme';
27
+ import type { ElementInfo } from '~/components/workbench/Inspector';
28
+ import type { TextUIPart, FileUIPart, Attachment } from '@ai-sdk/ui-utils';
29
+ import { useMCPStore } from '~/lib/stores/mcp';
30
+ import type { LlmErrorAlertType } from '~/types/actions';
31
+
32
+ const logger = createScopedLogger('Chat');
33
+
34
+ export function Chat() {
35
+ renderLogger.trace('Chat');
36
+
37
+ const { ready, initialMessages, storeMessageHistory, importChat, exportChat } = useChatHistory();
38
+ const title = useStore(description);
39
+ useEffect(() => {
40
+ workbenchStore.setReloadedMessages(initialMessages.map((m) => m.id));
41
+ }, [initialMessages]);
42
+
43
+ return (
44
+ <>
45
+ {ready && (
46
+ <ChatImpl
47
+ description={title}
48
+ initialMessages={initialMessages}
49
+ exportChat={exportChat}
50
+ storeMessageHistory={storeMessageHistory}
51
+ importChat={importChat}
52
+ />
53
+ )}
54
+ </>
55
+ );
56
+ }
57
+
58
+ const processSampledMessages = createSampler(
59
+ (options: {
60
+ messages: Message[];
61
+ initialMessages: Message[];
62
+ isLoading: boolean;
63
+ parseMessages: (messages: Message[], isLoading: boolean) => void;
64
+ storeMessageHistory: (messages: Message[]) => Promise<void>;
65
+ }) => {
66
+ const { messages, initialMessages, isLoading, parseMessages, storeMessageHistory } = options;
67
+ parseMessages(messages, isLoading);
68
+
69
+ if (messages.length > initialMessages.length) {
70
+ storeMessageHistory(messages).catch((error) => toast.error(error.message));
71
+ }
72
+ },
73
+ 50,
74
+ );
75
+
76
+ interface ChatProps {
77
+ initialMessages: Message[];
78
+ storeMessageHistory: (messages: Message[]) => Promise<void>;
79
+ importChat: (description: string, messages: Message[]) => Promise<void>;
80
+ exportChat: () => void;
81
+ description?: string;
82
+ }
83
+
84
+ export const ChatImpl = memo(
85
+ ({ description, initialMessages, storeMessageHistory, importChat, exportChat }: ChatProps) => {
86
+ useShortcuts();
87
+
88
+ const textareaRef = useRef<HTMLTextAreaElement>(null);
89
+ const [chatStarted, setChatStarted] = useState(initialMessages.length > 0);
90
+ const [uploadedFiles, setUploadedFiles] = useState<File[]>([]);
91
+ const [imageDataList, setImageDataList] = useState<string[]>([]);
92
+ const [searchParams, setSearchParams] = useSearchParams();
93
+ const [fakeLoading, setFakeLoading] = useState(false);
94
+ const files = useStore(workbenchStore.files);
95
+ const [designScheme, setDesignScheme] = useState<DesignScheme>(defaultDesignScheme);
96
+ const actionAlert = useStore(workbenchStore.alert);
97
+ const deployAlert = useStore(workbenchStore.deployAlert);
98
+ const supabaseConn = useStore(supabaseConnection);
99
+ const selectedProject = supabaseConn.stats?.projects?.find(
100
+ (project) => project.id === supabaseConn.selectedProjectId,
101
+ );
102
+ const supabaseAlert = useStore(workbenchStore.supabaseAlert);
103
+ const { activeProviders, promptId, autoSelectTemplate, contextOptimizationEnabled } = useSettings();
104
+ const [llmErrorAlert, setLlmErrorAlert] = useState<LlmErrorAlertType | undefined>(undefined);
105
+ const [model, setModel] = useState(() => {
106
+ const savedModel = Cookies.get('selectedModel');
107
+ return savedModel || DEFAULT_MODEL;
108
+ });
109
+ const [provider, setProvider] = useState(() => {
110
+ const savedProvider = Cookies.get('selectedProvider');
111
+ return (PROVIDER_LIST.find((p) => p.name === savedProvider) || DEFAULT_PROVIDER) as ProviderInfo;
112
+ });
113
+ const { showChat } = useStore(chatStore);
114
+ const [animationScope, animate] = useAnimate();
115
+ const [apiKeys, setApiKeys] = useState<Record<string, string>>({});
116
+ const [chatMode, setChatMode] = useState<'discuss' | 'build'>('build');
117
+ const [selectedElement, setSelectedElement] = useState<ElementInfo | null>(null);
118
+ const mcpSettings = useMCPStore((state) => state.settings);
119
+
120
+ const {
121
+ messages,
122
+ isLoading,
123
+ input,
124
+ handleInputChange,
125
+ setInput,
126
+ stop,
127
+ append,
128
+ setMessages,
129
+ reload,
130
+ error,
131
+ data: chatData,
132
+ setData,
133
+ addToolResult,
134
+ } = useChat({
135
+ api: '/api/chat',
136
+ body: {
137
+ apiKeys,
138
+ files,
139
+ promptId,
140
+ contextOptimization: contextOptimizationEnabled,
141
+ chatMode,
142
+ designScheme,
143
+ supabase: {
144
+ isConnected: supabaseConn.isConnected,
145
+ hasSelectedProject: !!selectedProject,
146
+ credentials: {
147
+ supabaseUrl: supabaseConn?.credentials?.supabaseUrl,
148
+ anonKey: supabaseConn?.credentials?.anonKey,
149
+ },
150
+ },
151
+ maxLLMSteps: mcpSettings.maxLLMSteps,
152
+ },
153
+ sendExtraMessageFields: true,
154
+ onError: (e) => {
155
+ setFakeLoading(false);
156
+ handleError(e, 'chat');
157
+ },
158
+ onFinish: (message, response) => {
159
+ const usage = response.usage;
160
+ setData(undefined);
161
+
162
+ if (usage) {
163
+ console.log('Token usage:', usage);
164
+ logStore.logProvider('Chat response completed', {
165
+ component: 'Chat',
166
+ action: 'response',
167
+ model,
168
+ provider: provider.name,
169
+ usage,
170
+ messageLength: message.content.length,
171
+ });
172
+ }
173
+
174
+ logger.debug('Finished streaming');
175
+ },
176
+ initialMessages,
177
+ initialInput: Cookies.get(PROMPT_COOKIE_KEY) || '',
178
+ });
179
+ useEffect(() => {
180
+ const prompt = searchParams.get('prompt');
181
+
182
+ // console.log(prompt, searchParams, model, provider);
183
+
184
+ if (prompt) {
185
+ setSearchParams({});
186
+ runAnimation();
187
+ append({
188
+ role: 'user',
189
+ content: `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${prompt}`,
190
+ });
191
+ }
192
+ }, [model, provider, searchParams]);
193
+
194
+ const { enhancingPrompt, promptEnhanced, enhancePrompt, resetEnhancer } = usePromptEnhancer();
195
+ const { parsedMessages, parseMessages } = useMessageParser();
196
+
197
+ const TEXTAREA_MAX_HEIGHT = chatStarted ? 400 : 200;
198
+
199
+ useEffect(() => {
200
+ chatStore.setKey('started', initialMessages.length > 0);
201
+ }, []);
202
+
203
+ useEffect(() => {
204
+ processSampledMessages({
205
+ messages,
206
+ initialMessages,
207
+ isLoading,
208
+ parseMessages,
209
+ storeMessageHistory,
210
+ });
211
+ }, [messages, isLoading, parseMessages]);
212
+
213
+ const scrollTextArea = () => {
214
+ const textarea = textareaRef.current;
215
+
216
+ if (textarea) {
217
+ textarea.scrollTop = textarea.scrollHeight;
218
+ }
219
+ };
220
+
221
+ const abort = () => {
222
+ stop();
223
+ chatStore.setKey('aborted', true);
224
+ workbenchStore.abortAllActions();
225
+
226
+ logStore.logProvider('Chat response aborted', {
227
+ component: 'Chat',
228
+ action: 'abort',
229
+ model,
230
+ provider: provider.name,
231
+ });
232
+ };
233
+
234
+ const handleError = useCallback(
235
+ (error: any, context: 'chat' | 'template' | 'llmcall' = 'chat') => {
236
+ logger.error(`${context} request failed`, error);
237
+
238
+ stop();
239
+ setFakeLoading(false);
240
+
241
+ let errorInfo = {
242
+ message: 'An unexpected error occurred',
243
+ isRetryable: true,
244
+ statusCode: 500,
245
+ provider: provider.name,
246
+ type: 'unknown' as const,
247
+ retryDelay: 0,
248
+ };
249
+
250
+ if (error.message) {
251
+ try {
252
+ const parsed = JSON.parse(error.message);
253
+
254
+ if (parsed.error || parsed.message) {
255
+ errorInfo = { ...errorInfo, ...parsed };
256
+ } else {
257
+ errorInfo.message = error.message;
258
+ }
259
+ } catch {
260
+ errorInfo.message = error.message;
261
+ }
262
+ }
263
+
264
+ let errorType: LlmErrorAlertType['errorType'] = 'unknown';
265
+ let title = 'Request Failed';
266
+
267
+ if (errorInfo.statusCode === 401 || errorInfo.message.toLowerCase().includes('api key')) {
268
+ errorType = 'authentication';
269
+ title = 'Authentication Error';
270
+ } else if (errorInfo.statusCode === 429 || errorInfo.message.toLowerCase().includes('rate limit')) {
271
+ errorType = 'rate_limit';
272
+ title = 'Rate Limit Exceeded';
273
+ } else if (errorInfo.message.toLowerCase().includes('quota')) {
274
+ errorType = 'quota';
275
+ title = 'Quota Exceeded';
276
+ } else if (errorInfo.statusCode >= 500) {
277
+ errorType = 'network';
278
+ title = 'Server Error';
279
+ }
280
+
281
+ logStore.logError(`${context} request failed`, error, {
282
+ component: 'Chat',
283
+ action: 'request',
284
+ error: errorInfo.message,
285
+ context,
286
+ retryable: errorInfo.isRetryable,
287
+ errorType,
288
+ provider: provider.name,
289
+ });
290
+
291
+ // Create API error alert
292
+ setLlmErrorAlert({
293
+ type: 'error',
294
+ title,
295
+ description: errorInfo.message,
296
+ provider: provider.name,
297
+ errorType,
298
+ });
299
+ setData([]);
300
+ },
301
+ [provider.name, stop],
302
+ );
303
+
304
+ const clearApiErrorAlert = useCallback(() => {
305
+ setLlmErrorAlert(undefined);
306
+ }, []);
307
+
308
+ useEffect(() => {
309
+ const textarea = textareaRef.current;
310
+
311
+ if (textarea) {
312
+ textarea.style.height = 'auto';
313
+
314
+ const scrollHeight = textarea.scrollHeight;
315
+
316
+ textarea.style.height = `${Math.min(scrollHeight, TEXTAREA_MAX_HEIGHT)}px`;
317
+ textarea.style.overflowY = scrollHeight > TEXTAREA_MAX_HEIGHT ? 'auto' : 'hidden';
318
+ }
319
+ }, [input, textareaRef]);
320
+
321
+ const runAnimation = async () => {
322
+ if (chatStarted) {
323
+ return;
324
+ }
325
+
326
+ await Promise.all([
327
+ animate('#examples', { opacity: 0, display: 'none' }, { duration: 0.1 }),
328
+ animate('#intro', { opacity: 0, flex: 1 }, { duration: 0.2, ease: cubicEasingFn }),
329
+ ]);
330
+
331
+ chatStore.setKey('started', true);
332
+
333
+ setChatStarted(true);
334
+ };
335
+
336
+ // Helper function to create message parts array from text and images
337
+ const createMessageParts = (text: string, images: string[] = []): Array<TextUIPart | FileUIPart> => {
338
+ // Create an array of properly typed message parts
339
+ const parts: Array<TextUIPart | FileUIPart> = [
340
+ {
341
+ type: 'text',
342
+ text,
343
+ },
344
+ ];
345
+
346
+ // Add image parts if any
347
+ images.forEach((imageData) => {
348
+ // Extract correct MIME type from the data URL
349
+ const mimeType = imageData.split(';')[0].split(':')[1] || 'image/jpeg';
350
+
351
+ // Create file part according to AI SDK format
352
+ parts.push({
353
+ type: 'file',
354
+ mimeType,
355
+ data: imageData.replace(/^data:image\/[^;]+;base64,/, ''),
356
+ });
357
+ });
358
+
359
+ return parts;
360
+ };
361
+
362
+ // Helper function to convert File[] to Attachment[] for AI SDK
363
+ const filesToAttachments = async (files: File[]): Promise<Attachment[] | undefined> => {
364
+ if (files.length === 0) {
365
+ return undefined;
366
+ }
367
+
368
+ const attachments = await Promise.all(
369
+ files.map(
370
+ (file) =>
371
+ new Promise<Attachment>((resolve) => {
372
+ const reader = new FileReader();
373
+
374
+ reader.onloadend = () => {
375
+ resolve({
376
+ name: file.name,
377
+ contentType: file.type,
378
+ url: reader.result as string,
379
+ });
380
+ };
381
+ reader.readAsDataURL(file);
382
+ }),
383
+ ),
384
+ );
385
+
386
+ return attachments;
387
+ };
388
+
389
+ const sendMessage = async (_event: React.UIEvent, messageInput?: string) => {
390
+ const messageContent = messageInput || input;
391
+
392
+ if (!messageContent?.trim()) {
393
+ return;
394
+ }
395
+
396
+ if (isLoading) {
397
+ abort();
398
+ return;
399
+ }
400
+
401
+ let finalMessageContent = messageContent;
402
+
403
+ if (selectedElement) {
404
+ console.log('Selected Element:', selectedElement);
405
+
406
+ const elementInfo = `<div class=\"__boltSelectedElement__\" data-element='${JSON.stringify(selectedElement)}'>${JSON.stringify(`${selectedElement.displayText}`)}</div>`;
407
+ finalMessageContent = messageContent + elementInfo;
408
+ }
409
+
410
+ runAnimation();
411
+
412
+ if (!chatStarted) {
413
+ setFakeLoading(true);
414
+
415
+ if (autoSelectTemplate) {
416
+ const { template, title } = await selectStarterTemplate({
417
+ message: finalMessageContent,
418
+ model,
419
+ provider,
420
+ });
421
+
422
+ if (template !== 'blank') {
423
+ const temResp = await getTemplates(template, title).catch((e) => {
424
+ if (e.message.includes('rate limit')) {
425
+ toast.warning('Rate limit exceeded. Skipping starter template\n Continuing with blank template');
426
+ } else {
427
+ toast.warning('Failed to import starter template\n Continuing with blank template');
428
+ }
429
+
430
+ return null;
431
+ });
432
+
433
+ if (temResp) {
434
+ const { assistantMessage, userMessage } = temResp;
435
+ const userMessageText = `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${finalMessageContent}`;
436
+
437
+ setMessages([
438
+ {
439
+ id: `1-${new Date().getTime()}`,
440
+ role: 'user',
441
+ content: userMessageText,
442
+ parts: createMessageParts(userMessageText, imageDataList),
443
+ },
444
+ {
445
+ id: `2-${new Date().getTime()}`,
446
+ role: 'assistant',
447
+ content: assistantMessage,
448
+ },
449
+ {
450
+ id: `3-${new Date().getTime()}`,
451
+ role: 'user',
452
+ content: `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${userMessage}`,
453
+ annotations: ['hidden'],
454
+ },
455
+ ]);
456
+
457
+ const reloadOptions =
458
+ uploadedFiles.length > 0
459
+ ? { experimental_attachments: await filesToAttachments(uploadedFiles) }
460
+ : undefined;
461
+
462
+ reload(reloadOptions);
463
+ setInput('');
464
+ Cookies.remove(PROMPT_COOKIE_KEY);
465
+
466
+ setUploadedFiles([]);
467
+ setImageDataList([]);
468
+
469
+ resetEnhancer();
470
+
471
+ textareaRef.current?.blur();
472
+ setFakeLoading(false);
473
+
474
+ return;
475
+ }
476
+ }
477
+ }
478
+
479
+ // If autoSelectTemplate is disabled or template selection failed, proceed with normal message
480
+ const userMessageText = `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${finalMessageContent}`;
481
+ const attachments = uploadedFiles.length > 0 ? await filesToAttachments(uploadedFiles) : undefined;
482
+
483
+ setMessages([
484
+ {
485
+ id: `${new Date().getTime()}`,
486
+ role: 'user',
487
+ content: userMessageText,
488
+ parts: createMessageParts(userMessageText, imageDataList),
489
+ experimental_attachments: attachments,
490
+ },
491
+ ]);
492
+ reload(attachments ? { experimental_attachments: attachments } : undefined);
493
+ setFakeLoading(false);
494
+ setInput('');
495
+ Cookies.remove(PROMPT_COOKIE_KEY);
496
+
497
+ setUploadedFiles([]);
498
+ setImageDataList([]);
499
+
500
+ resetEnhancer();
501
+
502
+ textareaRef.current?.blur();
503
+
504
+ return;
505
+ }
506
+
507
+ if (error != null) {
508
+ setMessages(messages.slice(0, -1));
509
+ }
510
+
511
+ const modifiedFiles = workbenchStore.getModifiedFiles();
512
+
513
+ chatStore.setKey('aborted', false);
514
+
515
+ if (modifiedFiles !== undefined) {
516
+ const userUpdateArtifact = filesToArtifacts(modifiedFiles, `${Date.now()}`);
517
+ const messageText = `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${userUpdateArtifact}${finalMessageContent}`;
518
+
519
+ const attachmentOptions =
520
+ uploadedFiles.length > 0 ? { experimental_attachments: await filesToAttachments(uploadedFiles) } : undefined;
521
+
522
+ append(
523
+ {
524
+ role: 'user',
525
+ content: messageText,
526
+ parts: createMessageParts(messageText, imageDataList),
527
+ },
528
+ attachmentOptions,
529
+ );
530
+
531
+ workbenchStore.resetAllFileModifications();
532
+ } else {
533
+ const messageText = `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${finalMessageContent}`;
534
+
535
+ const attachmentOptions =
536
+ uploadedFiles.length > 0 ? { experimental_attachments: await filesToAttachments(uploadedFiles) } : undefined;
537
+
538
+ append(
539
+ {
540
+ role: 'user',
541
+ content: messageText,
542
+ parts: createMessageParts(messageText, imageDataList),
543
+ },
544
+ attachmentOptions,
545
+ );
546
+ }
547
+
548
+ setInput('');
549
+ Cookies.remove(PROMPT_COOKIE_KEY);
550
+
551
+ setUploadedFiles([]);
552
+ setImageDataList([]);
553
+
554
+ resetEnhancer();
555
+
556
+ textareaRef.current?.blur();
557
+ };
558
+
559
+ /**
560
+ * Handles the change event for the textarea and updates the input state.
561
+ * @param event - The change event from the textarea.
562
+ */
563
+ const onTextareaChange = (event: React.ChangeEvent<HTMLTextAreaElement>) => {
564
+ handleInputChange(event);
565
+ };
566
+
567
+ /**
568
+ * Debounced function to cache the prompt in cookies.
569
+ * Caches the trimmed value of the textarea input after a delay to optimize performance.
570
+ */
571
+ const debouncedCachePrompt = useCallback(
572
+ debounce((event: React.ChangeEvent<HTMLTextAreaElement>) => {
573
+ const trimmedValue = event.target.value.trim();
574
+ Cookies.set(PROMPT_COOKIE_KEY, trimmedValue, { expires: 30 });
575
+ }, 1000),
576
+ [],
577
+ );
578
+
579
+ useEffect(() => {
580
+ const storedApiKeys = Cookies.get('apiKeys');
581
+
582
+ if (storedApiKeys) {
583
+ setApiKeys(JSON.parse(storedApiKeys));
584
+ }
585
+ }, []);
586
+
587
+ const handleModelChange = (newModel: string) => {
588
+ setModel(newModel);
589
+ Cookies.set('selectedModel', newModel, { expires: 30 });
590
+ };
591
+
592
+ const handleProviderChange = (newProvider: ProviderInfo) => {
593
+ setProvider(newProvider);
594
+ Cookies.set('selectedProvider', newProvider.name, { expires: 30 });
595
+ };
596
+
597
+ return (
598
+ <BaseChat
599
+ ref={animationScope}
600
+ textareaRef={textareaRef}
601
+ input={input}
602
+ showChat={showChat}
603
+ chatStarted={chatStarted}
604
+ isStreaming={isLoading || fakeLoading}
605
+ onStreamingChange={(streaming) => {
606
+ streamingState.set(streaming);
607
+ }}
608
+ enhancingPrompt={enhancingPrompt}
609
+ promptEnhanced={promptEnhanced}
610
+ sendMessage={sendMessage}
611
+ model={model}
612
+ setModel={handleModelChange}
613
+ provider={provider}
614
+ setProvider={handleProviderChange}
615
+ providerList={activeProviders}
616
+ handleInputChange={(e) => {
617
+ onTextareaChange(e);
618
+ debouncedCachePrompt(e);
619
+ }}
620
+ handleStop={abort}
621
+ description={description}
622
+ importChat={importChat}
623
+ exportChat={exportChat}
624
+ messages={messages.map((message, i) => {
625
+ if (message.role === 'user') {
626
+ return message;
627
+ }
628
+
629
+ return {
630
+ ...message,
631
+ content: parsedMessages[i] || '',
632
+ };
633
+ })}
634
+ enhancePrompt={() => {
635
+ enhancePrompt(
636
+ input,
637
+ (input) => {
638
+ setInput(input);
639
+ scrollTextArea();
640
+ },
641
+ model,
642
+ provider,
643
+ apiKeys,
644
+ );
645
+ }}
646
+ uploadedFiles={uploadedFiles}
647
+ setUploadedFiles={setUploadedFiles}
648
+ imageDataList={imageDataList}
649
+ setImageDataList={setImageDataList}
650
+ actionAlert={actionAlert}
651
+ clearAlert={() => workbenchStore.clearAlert()}
652
+ supabaseAlert={supabaseAlert}
653
+ clearSupabaseAlert={() => workbenchStore.clearSupabaseAlert()}
654
+ deployAlert={deployAlert}
655
+ clearDeployAlert={() => workbenchStore.clearDeployAlert()}
656
+ llmErrorAlert={llmErrorAlert}
657
+ clearLlmErrorAlert={clearApiErrorAlert}
658
+ data={chatData}
659
+ chatMode={chatMode}
660
+ setChatMode={setChatMode}
661
+ append={append}
662
+ designScheme={designScheme}
663
+ setDesignScheme={setDesignScheme}
664
+ selectedElement={selectedElement}
665
+ setSelectedElement={setSelectedElement}
666
+ addToolResult={addToolResult}
667
+ />
668
+ );
669
+ },
670
+ );