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,721 @@
1
+ import { useState, useRef, useCallback, useEffect } from 'react';
2
+ import { Button } from '~/components/ui/Button';
3
+ import { ConfirmationDialog, SelectionDialog } from '~/components/ui/Dialog';
4
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '~/components/ui/Card';
5
+ import { motion } from 'framer-motion';
6
+ import { useDataOperations } from '~/lib/hooks/useDataOperations';
7
+ import { openDatabase } from '~/lib/persistence/db';
8
+ import { getAllChats, type Chat } from '~/lib/persistence/chats';
9
+ import { DataVisualization } from './DataVisualization';
10
+ import { classNames } from '~/utils/classNames';
11
+ import { toast } from 'react-toastify';
12
+
13
+ // Create a custom hook to connect to the boltHistory database
14
+ function useBoltHistoryDB() {
15
+ const [db, setDb] = useState<IDBDatabase | null>(null);
16
+ const [isLoading, setIsLoading] = useState(true);
17
+ const [error, setError] = useState<Error | null>(null);
18
+
19
+ useEffect(() => {
20
+ const initDB = async () => {
21
+ try {
22
+ setIsLoading(true);
23
+
24
+ const database = await openDatabase();
25
+ setDb(database || null);
26
+ setIsLoading(false);
27
+ } catch (err) {
28
+ setError(err instanceof Error ? err : new Error('Unknown error initializing database'));
29
+ setIsLoading(false);
30
+ }
31
+ };
32
+
33
+ initDB();
34
+
35
+ return () => {
36
+ if (db) {
37
+ db.close();
38
+ }
39
+ };
40
+ }, []);
41
+
42
+ return { db, isLoading, error };
43
+ }
44
+
45
+ // Extend the Chat interface to include the missing properties
46
+ interface ExtendedChat extends Chat {
47
+ title?: string;
48
+ updatedAt?: number;
49
+ }
50
+
51
+ // Helper function to create a chat label and description
52
+ function createChatItem(chat: Chat): ChatItem {
53
+ return {
54
+ id: chat.id,
55
+
56
+ // Use description as title if available, or format a short ID
57
+ label: (chat as ExtendedChat).title || chat.description || `Chat ${chat.id.slice(0, 8)}`,
58
+
59
+ // Format the description with message count and timestamp
60
+ description: `${chat.messages.length} messages - Last updated: ${new Date((chat as ExtendedChat).updatedAt || Date.parse(chat.timestamp)).toLocaleString()}`,
61
+ };
62
+ }
63
+
64
+ interface SettingsCategory {
65
+ id: string;
66
+ label: string;
67
+ description: string;
68
+ }
69
+
70
+ interface ChatItem {
71
+ id: string;
72
+ label: string;
73
+ description: string;
74
+ }
75
+
76
+ export function DataTab() {
77
+ // Use our custom hook for the boltHistory database
78
+ const { db, isLoading: dbLoading } = useBoltHistoryDB();
79
+ const fileInputRef = useRef<HTMLInputElement>(null);
80
+ const apiKeyFileInputRef = useRef<HTMLInputElement>(null);
81
+ const chatFileInputRef = useRef<HTMLInputElement>(null);
82
+
83
+ // State for confirmation dialogs
84
+ const [showResetInlineConfirm, setShowResetInlineConfirm] = useState(false);
85
+ const [showDeleteInlineConfirm, setShowDeleteInlineConfirm] = useState(false);
86
+ const [showSettingsSelection, setShowSettingsSelection] = useState(false);
87
+ const [showChatsSelection, setShowChatsSelection] = useState(false);
88
+
89
+ // State for settings categories and available chats
90
+ const [settingsCategories] = useState<SettingsCategory[]>([
91
+ { id: 'core', label: 'Core Settings', description: 'User profile and main settings' },
92
+ { id: 'providers', label: 'Providers', description: 'API keys and provider configurations' },
93
+ { id: 'features', label: 'Features', description: 'Feature flags and settings' },
94
+ { id: 'ui', label: 'UI', description: 'UI configuration and preferences' },
95
+ { id: 'connections', label: 'Connections', description: 'External service connections' },
96
+ { id: 'debug', label: 'Debug', description: 'Debug settings and logs' },
97
+ { id: 'updates', label: 'Updates', description: 'Update settings and notifications' },
98
+ ]);
99
+
100
+ const [availableChats, setAvailableChats] = useState<ExtendedChat[]>([]);
101
+ const [chatItems, setChatItems] = useState<ChatItem[]>([]);
102
+
103
+ // Data operations hook with boltHistory database
104
+ const {
105
+ isExporting,
106
+ isImporting,
107
+ isResetting,
108
+ isDownloadingTemplate,
109
+ handleExportSettings,
110
+ handleExportSelectedSettings,
111
+ handleExportAllChats,
112
+ handleExportSelectedChats,
113
+ handleImportSettings,
114
+ handleImportChats,
115
+ handleResetSettings,
116
+ handleResetChats,
117
+ handleDownloadTemplate,
118
+ handleImportAPIKeys,
119
+ } = useDataOperations({
120
+ customDb: db || undefined, // Pass the boltHistory database, converting null to undefined
121
+ onReloadSettings: () => window.location.reload(),
122
+ onReloadChats: () => {
123
+ // Reload chats after reset
124
+ if (db) {
125
+ getAllChats(db).then((chats) => {
126
+ // Cast to ExtendedChat to handle additional properties
127
+ const extendedChats = chats as ExtendedChat[];
128
+ setAvailableChats(extendedChats);
129
+ setChatItems(extendedChats.map((chat) => createChatItem(chat)));
130
+ });
131
+ }
132
+ },
133
+ onResetSettings: () => setShowResetInlineConfirm(false),
134
+ onResetChats: () => setShowDeleteInlineConfirm(false),
135
+ });
136
+
137
+ // Loading states for operations not provided by the hook
138
+ const [isDeleting, setIsDeleting] = useState(false);
139
+ const [isImportingKeys, setIsImportingKeys] = useState(false);
140
+
141
+ // Load available chats
142
+ useEffect(() => {
143
+ if (db) {
144
+ console.log('Loading chats from boltHistory database', {
145
+ name: db.name,
146
+ version: db.version,
147
+ objectStoreNames: Array.from(db.objectStoreNames),
148
+ });
149
+
150
+ getAllChats(db)
151
+ .then((chats) => {
152
+ console.log('Found chats:', chats.length);
153
+
154
+ // Cast to ExtendedChat to handle additional properties
155
+ const extendedChats = chats as ExtendedChat[];
156
+ setAvailableChats(extendedChats);
157
+
158
+ // Create ChatItems for selection dialog
159
+ setChatItems(extendedChats.map((chat) => createChatItem(chat)));
160
+ })
161
+ .catch((error) => {
162
+ console.error('Error loading chats:', error);
163
+ toast.error('Failed to load chats: ' + (error instanceof Error ? error.message : 'Unknown error'));
164
+ });
165
+ }
166
+ }, [db]);
167
+
168
+ // Handle file input changes
169
+ const handleFileInputChange = useCallback(
170
+ (event: React.ChangeEvent<HTMLInputElement>) => {
171
+ const file = event.target.files?.[0];
172
+
173
+ if (file) {
174
+ handleImportSettings(file);
175
+ }
176
+ },
177
+ [handleImportSettings],
178
+ );
179
+
180
+ const handleAPIKeyFileInputChange = useCallback(
181
+ (event: React.ChangeEvent<HTMLInputElement>) => {
182
+ const file = event.target.files?.[0];
183
+
184
+ if (file) {
185
+ setIsImportingKeys(true);
186
+ handleImportAPIKeys(file).finally(() => setIsImportingKeys(false));
187
+ }
188
+ },
189
+ [handleImportAPIKeys],
190
+ );
191
+
192
+ const handleChatFileInputChange = useCallback(
193
+ (event: React.ChangeEvent<HTMLInputElement>) => {
194
+ const file = event.target.files?.[0];
195
+
196
+ if (file) {
197
+ handleImportChats(file);
198
+ }
199
+ },
200
+ [handleImportChats],
201
+ );
202
+
203
+ // Wrapper for reset chats to handle loading state
204
+ const handleResetChatsWithState = useCallback(() => {
205
+ setIsDeleting(true);
206
+ handleResetChats().finally(() => setIsDeleting(false));
207
+ }, [handleResetChats]);
208
+
209
+ return (
210
+ <div className="space-y-12">
211
+ {/* Hidden file inputs */}
212
+ <input ref={fileInputRef} type="file" accept=".json" onChange={handleFileInputChange} className="hidden" />
213
+ <input
214
+ ref={apiKeyFileInputRef}
215
+ type="file"
216
+ accept=".json"
217
+ onChange={handleAPIKeyFileInputChange}
218
+ className="hidden"
219
+ />
220
+ <input
221
+ ref={chatFileInputRef}
222
+ type="file"
223
+ accept=".json"
224
+ onChange={handleChatFileInputChange}
225
+ className="hidden"
226
+ />
227
+
228
+ {/* Reset Settings Confirmation Dialog */}
229
+ <ConfirmationDialog
230
+ isOpen={showResetInlineConfirm}
231
+ onClose={() => setShowResetInlineConfirm(false)}
232
+ title="Reset All Settings?"
233
+ description="This will reset all your settings to their default values. This action cannot be undone."
234
+ confirmLabel="Reset Settings"
235
+ cancelLabel="Cancel"
236
+ variant="destructive"
237
+ isLoading={isResetting}
238
+ onConfirm={handleResetSettings}
239
+ />
240
+
241
+ {/* Delete Chats Confirmation Dialog */}
242
+ <ConfirmationDialog
243
+ isOpen={showDeleteInlineConfirm}
244
+ onClose={() => setShowDeleteInlineConfirm(false)}
245
+ title="Delete All Chats?"
246
+ description="This will permanently delete all your chat history. This action cannot be undone."
247
+ confirmLabel="Delete All"
248
+ cancelLabel="Cancel"
249
+ variant="destructive"
250
+ isLoading={isDeleting}
251
+ onConfirm={handleResetChatsWithState}
252
+ />
253
+
254
+ {/* Settings Selection Dialog */}
255
+ <SelectionDialog
256
+ isOpen={showSettingsSelection}
257
+ onClose={() => setShowSettingsSelection(false)}
258
+ title="Select Settings to Export"
259
+ items={settingsCategories}
260
+ onConfirm={(selectedIds) => {
261
+ handleExportSelectedSettings(selectedIds);
262
+ setShowSettingsSelection(false);
263
+ }}
264
+ confirmLabel="Export Selected"
265
+ />
266
+
267
+ {/* Chats Selection Dialog */}
268
+ <SelectionDialog
269
+ isOpen={showChatsSelection}
270
+ onClose={() => setShowChatsSelection(false)}
271
+ title="Select Chats to Export"
272
+ items={chatItems}
273
+ onConfirm={(selectedIds) => {
274
+ handleExportSelectedChats(selectedIds);
275
+ setShowChatsSelection(false);
276
+ }}
277
+ confirmLabel="Export Selected"
278
+ />
279
+
280
+ {/* Chats Section */}
281
+ <div>
282
+ <h2 className="text-xl font-semibold mb-4 text-bolt-elements-textPrimary">Chats</h2>
283
+ {dbLoading ? (
284
+ <div className="flex items-center justify-center p-4">
285
+ <div className="i-ph-spinner-gap-bold animate-spin w-6 h-6 mr-2" />
286
+ <span>Loading chats database...</span>
287
+ </div>
288
+ ) : (
289
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
290
+ <Card>
291
+ <CardHeader>
292
+ <div className="flex items-center mb-2">
293
+ <motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
294
+ <div className="i-ph-download-duotone w-5 h-5" />
295
+ </motion.div>
296
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
297
+ Export All Chats
298
+ </CardTitle>
299
+ </div>
300
+ <CardDescription>Export all your chats to a JSON file.</CardDescription>
301
+ </CardHeader>
302
+ <CardFooter>
303
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
304
+ <Button
305
+ onClick={async () => {
306
+ try {
307
+ if (!db) {
308
+ toast.error('Database not available');
309
+ return;
310
+ }
311
+
312
+ console.log('Database information:', {
313
+ name: db.name,
314
+ version: db.version,
315
+ objectStoreNames: Array.from(db.objectStoreNames),
316
+ });
317
+
318
+ if (availableChats.length === 0) {
319
+ toast.warning('No chats available to export');
320
+ return;
321
+ }
322
+
323
+ await handleExportAllChats();
324
+ } catch (error) {
325
+ console.error('Error exporting chats:', error);
326
+ toast.error(
327
+ `Failed to export chats: ${error instanceof Error ? error.message : 'Unknown error'}`,
328
+ );
329
+ }
330
+ }}
331
+ disabled={isExporting || availableChats.length === 0}
332
+ variant="outline"
333
+ size="sm"
334
+ className={classNames(
335
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
336
+ isExporting || availableChats.length === 0 ? 'cursor-not-allowed' : '',
337
+ )}
338
+ >
339
+ {isExporting ? (
340
+ <>
341
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
342
+ Exporting...
343
+ </>
344
+ ) : availableChats.length === 0 ? (
345
+ 'No Chats to Export'
346
+ ) : (
347
+ 'Export All'
348
+ )}
349
+ </Button>
350
+ </motion.div>
351
+ </CardFooter>
352
+ </Card>
353
+
354
+ <Card>
355
+ <CardHeader>
356
+ <div className="flex items-center mb-2">
357
+ <motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
358
+ <div className="i-ph:list-checks w-5 h-5" />
359
+ </motion.div>
360
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
361
+ Export Selected Chats
362
+ </CardTitle>
363
+ </div>
364
+ <CardDescription>Choose specific chats to export.</CardDescription>
365
+ </CardHeader>
366
+ <CardFooter>
367
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
368
+ <Button
369
+ onClick={() => setShowChatsSelection(true)}
370
+ disabled={isExporting || chatItems.length === 0}
371
+ variant="outline"
372
+ size="sm"
373
+ className={classNames(
374
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
375
+ isExporting || chatItems.length === 0 ? 'cursor-not-allowed' : '',
376
+ )}
377
+ >
378
+ {isExporting ? (
379
+ <>
380
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
381
+ Exporting...
382
+ </>
383
+ ) : (
384
+ 'Select Chats'
385
+ )}
386
+ </Button>
387
+ </motion.div>
388
+ </CardFooter>
389
+ </Card>
390
+
391
+ <Card>
392
+ <CardHeader>
393
+ <div className="flex items-center mb-2">
394
+ <motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
395
+ <div className="i-ph-upload-duotone w-5 h-5" />
396
+ </motion.div>
397
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
398
+ Import Chats
399
+ </CardTitle>
400
+ </div>
401
+ <CardDescription>Import chats from a JSON file.</CardDescription>
402
+ </CardHeader>
403
+ <CardFooter>
404
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
405
+ <Button
406
+ onClick={() => chatFileInputRef.current?.click()}
407
+ disabled={isImporting}
408
+ variant="outline"
409
+ size="sm"
410
+ className={classNames(
411
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
412
+ isImporting ? 'cursor-not-allowed' : '',
413
+ )}
414
+ >
415
+ {isImporting ? (
416
+ <>
417
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
418
+ Importing...
419
+ </>
420
+ ) : (
421
+ 'Import Chats'
422
+ )}
423
+ </Button>
424
+ </motion.div>
425
+ </CardFooter>
426
+ </Card>
427
+
428
+ <Card>
429
+ <CardHeader>
430
+ <div className="flex items-center mb-2">
431
+ <motion.div
432
+ className="text-red-500 dark:text-red-400 mr-2"
433
+ whileHover={{ scale: 1.1 }}
434
+ whileTap={{ scale: 0.9 }}
435
+ >
436
+ <div className="i-ph-trash-duotone w-5 h-5" />
437
+ </motion.div>
438
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
439
+ Delete All Chats
440
+ </CardTitle>
441
+ </div>
442
+ <CardDescription>Delete all your chat history.</CardDescription>
443
+ </CardHeader>
444
+ <CardFooter>
445
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
446
+ <Button
447
+ onClick={() => setShowDeleteInlineConfirm(true)}
448
+ disabled={isDeleting || chatItems.length === 0}
449
+ variant="outline"
450
+ size="sm"
451
+ className={classNames(
452
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
453
+ isDeleting || chatItems.length === 0 ? 'cursor-not-allowed' : '',
454
+ )}
455
+ >
456
+ {isDeleting ? (
457
+ <>
458
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
459
+ Deleting...
460
+ </>
461
+ ) : (
462
+ 'Delete All'
463
+ )}
464
+ </Button>
465
+ </motion.div>
466
+ </CardFooter>
467
+ </Card>
468
+ </div>
469
+ )}
470
+ </div>
471
+
472
+ {/* Settings Section */}
473
+ <div>
474
+ <h2 className="text-xl font-semibold mb-4 text-bolt-elements-textPrimary">Settings</h2>
475
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
476
+ <Card>
477
+ <CardHeader>
478
+ <div className="flex items-center mb-2">
479
+ <motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
480
+ <div className="i-ph-download-duotone w-5 h-5" />
481
+ </motion.div>
482
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
483
+ Export All Settings
484
+ </CardTitle>
485
+ </div>
486
+ <CardDescription>Export all your settings to a JSON file.</CardDescription>
487
+ </CardHeader>
488
+ <CardFooter>
489
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
490
+ <Button
491
+ onClick={handleExportSettings}
492
+ disabled={isExporting}
493
+ variant="outline"
494
+ size="sm"
495
+ className={classNames(
496
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
497
+ isExporting ? 'cursor-not-allowed' : '',
498
+ )}
499
+ >
500
+ {isExporting ? (
501
+ <>
502
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
503
+ Exporting...
504
+ </>
505
+ ) : (
506
+ 'Export All'
507
+ )}
508
+ </Button>
509
+ </motion.div>
510
+ </CardFooter>
511
+ </Card>
512
+
513
+ <Card>
514
+ <CardHeader>
515
+ <div className="flex items-center mb-2">
516
+ <motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
517
+ <div className="i-ph-filter-duotone w-5 h-5" />
518
+ </motion.div>
519
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
520
+ Export Selected Settings
521
+ </CardTitle>
522
+ </div>
523
+ <CardDescription>Choose specific settings to export.</CardDescription>
524
+ </CardHeader>
525
+ <CardFooter>
526
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
527
+ <Button
528
+ onClick={() => setShowSettingsSelection(true)}
529
+ disabled={isExporting || settingsCategories.length === 0}
530
+ variant="outline"
531
+ size="sm"
532
+ className={classNames(
533
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
534
+ isExporting || settingsCategories.length === 0 ? 'cursor-not-allowed' : '',
535
+ )}
536
+ >
537
+ {isExporting ? (
538
+ <>
539
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
540
+ Exporting...
541
+ </>
542
+ ) : (
543
+ 'Select Settings'
544
+ )}
545
+ </Button>
546
+ </motion.div>
547
+ </CardFooter>
548
+ </Card>
549
+
550
+ <Card>
551
+ <CardHeader>
552
+ <div className="flex items-center mb-2">
553
+ <motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
554
+ <div className="i-ph-upload-duotone w-5 h-5" />
555
+ </motion.div>
556
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
557
+ Import Settings
558
+ </CardTitle>
559
+ </div>
560
+ <CardDescription>Import settings from a JSON file.</CardDescription>
561
+ </CardHeader>
562
+ <CardFooter>
563
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
564
+ <Button
565
+ onClick={() => fileInputRef.current?.click()}
566
+ disabled={isImporting}
567
+ variant="outline"
568
+ size="sm"
569
+ className={classNames(
570
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
571
+ isImporting ? 'cursor-not-allowed' : '',
572
+ )}
573
+ >
574
+ {isImporting ? (
575
+ <>
576
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
577
+ Importing...
578
+ </>
579
+ ) : (
580
+ 'Import Settings'
581
+ )}
582
+ </Button>
583
+ </motion.div>
584
+ </CardFooter>
585
+ </Card>
586
+
587
+ <Card>
588
+ <CardHeader>
589
+ <div className="flex items-center mb-2">
590
+ <motion.div
591
+ className="text-red-500 dark:text-red-400 mr-2"
592
+ whileHover={{ scale: 1.1 }}
593
+ whileTap={{ scale: 0.9 }}
594
+ >
595
+ <div className="i-ph-arrow-counter-clockwise-duotone w-5 h-5" />
596
+ </motion.div>
597
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
598
+ Reset All Settings
599
+ </CardTitle>
600
+ </div>
601
+ <CardDescription>Reset all settings to their default values.</CardDescription>
602
+ </CardHeader>
603
+ <CardFooter>
604
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
605
+ <Button
606
+ onClick={() => setShowResetInlineConfirm(true)}
607
+ disabled={isResetting}
608
+ variant="outline"
609
+ size="sm"
610
+ className={classNames(
611
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
612
+ isResetting ? 'cursor-not-allowed' : '',
613
+ )}
614
+ >
615
+ {isResetting ? (
616
+ <>
617
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
618
+ Resetting...
619
+ </>
620
+ ) : (
621
+ 'Reset All'
622
+ )}
623
+ </Button>
624
+ </motion.div>
625
+ </CardFooter>
626
+ </Card>
627
+ </div>
628
+ </div>
629
+
630
+ {/* API Keys Section */}
631
+ <div>
632
+ <h2 className="text-xl font-semibold mb-4 text-bolt-elements-textPrimary">API Keys</h2>
633
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
634
+ <Card>
635
+ <CardHeader>
636
+ <div className="flex items-center mb-2">
637
+ <motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
638
+ <div className="i-ph-file-text-duotone w-5 h-5" />
639
+ </motion.div>
640
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
641
+ Download Template
642
+ </CardTitle>
643
+ </div>
644
+ <CardDescription>Download a template file for your API keys.</CardDescription>
645
+ </CardHeader>
646
+ <CardFooter>
647
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
648
+ <Button
649
+ onClick={handleDownloadTemplate}
650
+ disabled={isDownloadingTemplate}
651
+ variant="outline"
652
+ size="sm"
653
+ className={classNames(
654
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
655
+ isDownloadingTemplate ? 'cursor-not-allowed' : '',
656
+ )}
657
+ >
658
+ {isDownloadingTemplate ? (
659
+ <>
660
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
661
+ Downloading...
662
+ </>
663
+ ) : (
664
+ 'Download'
665
+ )}
666
+ </Button>
667
+ </motion.div>
668
+ </CardFooter>
669
+ </Card>
670
+
671
+ <Card>
672
+ <CardHeader>
673
+ <div className="flex items-center mb-2">
674
+ <motion.div className="text-accent-500 mr-2" whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.9 }}>
675
+ <div className="i-ph-upload-duotone w-5 h-5" />
676
+ </motion.div>
677
+ <CardTitle className="text-lg group-hover:text-bolt-elements-item-contentAccent transition-colors">
678
+ Import API Keys
679
+ </CardTitle>
680
+ </div>
681
+ <CardDescription>Import API keys from a JSON file.</CardDescription>
682
+ </CardHeader>
683
+ <CardFooter>
684
+ <motion.div whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.97 }} className="w-full">
685
+ <Button
686
+ onClick={() => apiKeyFileInputRef.current?.click()}
687
+ disabled={isImportingKeys}
688
+ variant="outline"
689
+ size="sm"
690
+ className={classNames(
691
+ 'hover:text-bolt-elements-item-contentAccent hover:border-bolt-elements-item-backgroundAccent hover:bg-bolt-elements-item-backgroundAccent transition-colors w-full justify-center',
692
+ isImportingKeys ? 'cursor-not-allowed' : '',
693
+ )}
694
+ >
695
+ {isImportingKeys ? (
696
+ <>
697
+ <div className="i-ph-spinner-gap-bold animate-spin w-4 h-4 mr-2" />
698
+ Importing...
699
+ </>
700
+ ) : (
701
+ 'Import Keys'
702
+ )}
703
+ </Button>
704
+ </motion.div>
705
+ </CardFooter>
706
+ </Card>
707
+ </div>
708
+ </div>
709
+
710
+ {/* Data Visualization */}
711
+ <div>
712
+ <h2 className="text-xl font-semibold mb-4 text-bolt-elements-textPrimary">Data Usage</h2>
713
+ <Card>
714
+ <CardContent className="p-5">
715
+ <DataVisualization chats={availableChats} />
716
+ </CardContent>
717
+ </Card>
718
+ </div>
719
+ </div>
720
+ );
721
+ }