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,536 @@
1
+ import { motion, type Variants } from 'framer-motion';
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { toast } from 'react-toastify';
4
+ import { Dialog, DialogButton, DialogDescription, DialogRoot, DialogTitle } from '~/components/ui/Dialog';
5
+ import { ThemeSwitch } from '~/components/ui/ThemeSwitch';
6
+ // Settings UI removed: Configuration is environment-only for LLM-native execution
7
+ // import { ControlPanel } from '~/components/@settings/core/ControlPanel';
8
+ // import { SettingsButton, HelpButton } from '~/components/ui/SettingsButton';
9
+ import { Button } from '~/components/ui/Button';
10
+ import { db, deleteById, getAll, chatId, type ChatHistoryItem, useChatHistory } from '~/lib/persistence';
11
+ import { cubicEasingFn } from '~/utils/easings';
12
+ import { HistoryItem } from './HistoryItem';
13
+ import { binDates } from './date-binning';
14
+ import { useSearchFilter } from '~/lib/hooks/useSearchFilter';
15
+ import { classNames } from '~/utils/classNames';
16
+ import { useStore } from '@nanostores/react';
17
+ import { profileStore } from '~/lib/stores/profile';
18
+
19
+ const menuVariants = {
20
+ closed: {
21
+ opacity: 0,
22
+ visibility: 'hidden',
23
+ left: '-340px',
24
+ transition: {
25
+ duration: 0.2,
26
+ ease: cubicEasingFn,
27
+ },
28
+ },
29
+ open: {
30
+ opacity: 1,
31
+ visibility: 'initial',
32
+ left: 0,
33
+ transition: {
34
+ duration: 0.2,
35
+ ease: cubicEasingFn,
36
+ },
37
+ },
38
+ } satisfies Variants;
39
+
40
+ type DialogContent =
41
+ | { type: 'delete'; item: ChatHistoryItem }
42
+ | { type: 'bulkDelete'; items: ChatHistoryItem[] }
43
+ | null;
44
+
45
+ function CurrentDateTime() {
46
+ const [dateTime, setDateTime] = useState(new Date());
47
+
48
+ useEffect(() => {
49
+ const timer = setInterval(() => {
50
+ setDateTime(new Date());
51
+ }, 60000);
52
+
53
+ return () => clearInterval(timer);
54
+ }, []);
55
+
56
+ return (
57
+ <div className="flex items-center gap-2 px-4 py-2 text-sm text-gray-600 dark:text-gray-400 border-b border-gray-100 dark:border-gray-800/50">
58
+ <div className="h-4 w-4 i-ph:clock opacity-80" />
59
+ <div className="flex gap-2">
60
+ <span>{dateTime.toLocaleDateString()}</span>
61
+ <span>{dateTime.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span>
62
+ </div>
63
+ </div>
64
+ );
65
+ }
66
+
67
+ export const Menu = () => {
68
+ const { duplicateCurrentChat, exportChat } = useChatHistory();
69
+ const menuRef = useRef<HTMLDivElement>(null);
70
+ const [list, setList] = useState<ChatHistoryItem[]>([]);
71
+ const [open, setOpen] = useState(false);
72
+ const [dialogContent, setDialogContent] = useState<DialogContent>(null);
73
+ // Settings UI removed: Configuration is environment-only
74
+ // const [isSettingsOpen, setIsSettingsOpen] = useState(false);
75
+ const profile = useStore(profileStore);
76
+ const [selectionMode, setSelectionMode] = useState(false);
77
+ const [selectedItems, setSelectedItems] = useState<string[]>([]);
78
+
79
+ const { filteredItems: filteredList, handleSearchChange } = useSearchFilter({
80
+ items: list,
81
+ searchFields: ['description'],
82
+ });
83
+
84
+ const loadEntries = useCallback(() => {
85
+ if (db) {
86
+ getAll(db)
87
+ .then((list) => list.filter((item) => item.urlId && item.description))
88
+ .then(setList)
89
+ .catch((error) => toast.error(error.message));
90
+ }
91
+ }, []);
92
+
93
+ const deleteChat = useCallback(
94
+ async (id: string): Promise<void> => {
95
+ if (!db) {
96
+ throw new Error('Database not available');
97
+ }
98
+
99
+ // Delete chat snapshot from localStorage
100
+ try {
101
+ const snapshotKey = `snapshot:${id}`;
102
+ localStorage.removeItem(snapshotKey);
103
+ console.log('Removed snapshot for chat:', id);
104
+ } catch (snapshotError) {
105
+ console.error(`Error deleting snapshot for chat ${id}:`, snapshotError);
106
+ }
107
+
108
+ // Delete the chat from the database
109
+ await deleteById(db, id);
110
+ console.log('Successfully deleted chat:', id);
111
+ },
112
+ [db],
113
+ );
114
+
115
+ const deleteItem = useCallback(
116
+ (event: React.UIEvent, item: ChatHistoryItem) => {
117
+ event.preventDefault();
118
+ event.stopPropagation();
119
+
120
+ // Log the delete operation to help debugging
121
+ console.log('Attempting to delete chat:', { id: item.id, description: item.description });
122
+
123
+ deleteChat(item.id)
124
+ .then(() => {
125
+ toast.success('Chat deleted successfully', {
126
+ position: 'bottom-right',
127
+ autoClose: 3000,
128
+ });
129
+
130
+ // Always refresh the list
131
+ loadEntries();
132
+
133
+ if (chatId.get() === item.id) {
134
+ // hard page navigation to clear the stores
135
+ console.log('Navigating away from deleted chat');
136
+ window.location.pathname = '/';
137
+ }
138
+ })
139
+ .catch((error) => {
140
+ console.error('Failed to delete chat:', error);
141
+ toast.error('Failed to delete conversation', {
142
+ position: 'bottom-right',
143
+ autoClose: 3000,
144
+ });
145
+
146
+ // Still try to reload entries in case data has changed
147
+ loadEntries();
148
+ });
149
+ },
150
+ [loadEntries, deleteChat],
151
+ );
152
+
153
+ const deleteSelectedItems = useCallback(
154
+ async (itemsToDeleteIds: string[]) => {
155
+ if (!db || itemsToDeleteIds.length === 0) {
156
+ console.log('Bulk delete skipped: No DB or no items to delete.');
157
+ return;
158
+ }
159
+
160
+ console.log(`Starting bulk delete for ${itemsToDeleteIds.length} chats`, itemsToDeleteIds);
161
+
162
+ let deletedCount = 0;
163
+ const errors: string[] = [];
164
+ const currentChatId = chatId.get();
165
+ let shouldNavigate = false;
166
+
167
+ // Process deletions sequentially using the shared deleteChat logic
168
+ for (const id of itemsToDeleteIds) {
169
+ try {
170
+ await deleteChat(id);
171
+ deletedCount++;
172
+
173
+ if (id === currentChatId) {
174
+ shouldNavigate = true;
175
+ }
176
+ } catch (error) {
177
+ console.error(`Error deleting chat ${id}:`, error);
178
+ errors.push(id);
179
+ }
180
+ }
181
+
182
+ // Show appropriate toast message
183
+ if (errors.length === 0) {
184
+ toast.success(`${deletedCount} chat${deletedCount === 1 ? '' : 's'} deleted successfully`);
185
+ } else {
186
+ toast.warning(`Deleted ${deletedCount} of ${itemsToDeleteIds.length} chats. ${errors.length} failed.`, {
187
+ autoClose: 5000,
188
+ });
189
+ }
190
+
191
+ // Reload the list after all deletions
192
+ await loadEntries();
193
+
194
+ // Clear selection state
195
+ setSelectedItems([]);
196
+ setSelectionMode(false);
197
+
198
+ // Navigate if needed
199
+ if (shouldNavigate) {
200
+ console.log('Navigating away from deleted chat');
201
+ window.location.pathname = '/';
202
+ }
203
+ },
204
+ [deleteChat, loadEntries, db],
205
+ );
206
+
207
+ const closeDialog = () => {
208
+ setDialogContent(null);
209
+ };
210
+
211
+ const toggleSelectionMode = () => {
212
+ setSelectionMode(!selectionMode);
213
+
214
+ if (selectionMode) {
215
+ // If turning selection mode OFF, clear selection
216
+ setSelectedItems([]);
217
+ }
218
+ };
219
+
220
+ const toggleItemSelection = useCallback((id: string) => {
221
+ setSelectedItems((prev) => {
222
+ const newSelectedItems = prev.includes(id) ? prev.filter((itemId) => itemId !== id) : [...prev, id];
223
+ console.log('Selected items updated:', newSelectedItems);
224
+
225
+ return newSelectedItems; // Return the new array
226
+ });
227
+ }, []); // No dependencies needed
228
+
229
+ const handleBulkDeleteClick = useCallback(() => {
230
+ if (selectedItems.length === 0) {
231
+ toast.info('Select at least one chat to delete');
232
+ return;
233
+ }
234
+
235
+ const selectedChats = list.filter((item) => selectedItems.includes(item.id));
236
+
237
+ if (selectedChats.length === 0) {
238
+ toast.error('Could not find selected chats');
239
+ return;
240
+ }
241
+
242
+ setDialogContent({ type: 'bulkDelete', items: selectedChats });
243
+ }, [selectedItems, list]); // Keep list dependency
244
+
245
+ const selectAll = useCallback(() => {
246
+ const allFilteredIds = filteredList.map((item) => item.id);
247
+ setSelectedItems((prev) => {
248
+ const allFilteredAreSelected = allFilteredIds.length > 0 && allFilteredIds.every((id) => prev.includes(id));
249
+
250
+ if (allFilteredAreSelected) {
251
+ // Deselect only the filtered items
252
+ const newSelectedItems = prev.filter((id) => !allFilteredIds.includes(id));
253
+ console.log('Deselecting all filtered items. New selection:', newSelectedItems);
254
+
255
+ return newSelectedItems;
256
+ } else {
257
+ // Select all filtered items, adding them to any existing selections
258
+ const newSelectedItems = [...new Set([...prev, ...allFilteredIds])];
259
+ console.log('Selecting all filtered items. New selection:', newSelectedItems);
260
+
261
+ return newSelectedItems;
262
+ }
263
+ });
264
+ }, [filteredList]); // Depends only on filteredList
265
+
266
+ useEffect(() => {
267
+ if (open) {
268
+ loadEntries();
269
+ }
270
+ }, [open, loadEntries]);
271
+
272
+ // Exit selection mode when sidebar is closed
273
+ useEffect(() => {
274
+ if (!open && selectionMode) {
275
+ /*
276
+ * Don't clear selection state anymore when sidebar closes
277
+ * This allows the selection to persist when reopening the sidebar
278
+ */
279
+ console.log('Sidebar closed, preserving selection state');
280
+ }
281
+ }, [open, selectionMode]);
282
+
283
+ useEffect(() => {
284
+ const enterThreshold = 20;
285
+ const exitThreshold = 20;
286
+
287
+ function onMouseMove(event: MouseEvent) {
288
+ if (event.pageX < enterThreshold) {
289
+ setOpen(true);
290
+ }
291
+
292
+ if (menuRef.current && event.clientX > menuRef.current.getBoundingClientRect().right + exitThreshold) {
293
+ setOpen(false);
294
+ }
295
+ }
296
+
297
+ window.addEventListener('mousemove', onMouseMove);
298
+
299
+ return () => {
300
+ window.removeEventListener('mousemove', onMouseMove);
301
+ };
302
+ }, []);
303
+
304
+ const handleDuplicate = async (id: string) => {
305
+ await duplicateCurrentChat(id);
306
+ loadEntries(); // Reload the list after duplication
307
+ };
308
+
309
+ // Settings UI removed: Configuration is environment-only
310
+
311
+ const setDialogContentWithLogging = useCallback((content: DialogContent) => {
312
+ console.log('Setting dialog content:', content);
313
+ setDialogContent(content);
314
+ }, []);
315
+
316
+ return (
317
+ <>
318
+ <motion.div
319
+ ref={menuRef}
320
+ initial="closed"
321
+ animate={open ? 'open' : 'closed'}
322
+ variants={menuVariants}
323
+ style={{ width: '340px' }}
324
+ className={classNames(
325
+ 'flex selection-accent flex-col side-menu fixed top-0 h-full rounded-r-2xl',
326
+ 'bg-white dark:bg-gray-950 border-r border-bolt-elements-borderColor',
327
+ 'shadow-sm text-sm',
328
+ 'z-sidebar',
329
+ )}
330
+ >
331
+ <div className="h-12 flex items-center justify-between px-4 border-b border-gray-100 dark:border-gray-800/50 bg-gray-50/50 dark:bg-gray-900/50 rounded-tr-2xl">
332
+ <div className="text-gray-900 dark:text-white font-medium"></div>
333
+ <div className="flex items-center gap-3">
334
+ <button
335
+ onClick={() => window.open('https://stackblitz-labs.github.io/bolt.diy/', '_blank')}
336
+ className="p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
337
+ aria-label="Help"
338
+ >
339
+ <span className="i-ph:question-mark h-4 w-4" />
340
+ </button>
341
+ <span className="font-medium text-sm text-gray-900 dark:text-white truncate">
342
+ {profile?.username || 'Guest User'}
343
+ </span>
344
+ <div className="flex items-center justify-center w-[32px] h-[32px] overflow-hidden bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-500 rounded-full shrink-0">
345
+ {profile?.avatar ? (
346
+ <img
347
+ src={profile.avatar}
348
+ alt={profile?.username || 'User'}
349
+ className="w-full h-full object-cover"
350
+ loading="eager"
351
+ decoding="sync"
352
+ />
353
+ ) : (
354
+ <div className="i-ph:user-fill text-lg" />
355
+ )}
356
+ </div>
357
+ </div>
358
+ </div>
359
+ <CurrentDateTime />
360
+ <div className="flex-1 flex flex-col h-full w-full overflow-hidden">
361
+ <div className="p-4 space-y-3">
362
+ <div className="flex gap-2">
363
+ <a
364
+ href="/"
365
+ className="flex-1 flex gap-2 items-center bg-purple-50 dark:bg-purple-500/10 text-purple-700 dark:text-purple-300 hover:bg-purple-100 dark:hover:bg-purple-500/20 rounded-lg px-4 py-2 transition-colors"
366
+ >
367
+ <span className="inline-block i-ph:plus-circle h-4 w-4" />
368
+ <span className="text-sm font-medium">Start new chat</span>
369
+ </a>
370
+ <button
371
+ onClick={toggleSelectionMode}
372
+ className={classNames(
373
+ 'flex gap-1 items-center rounded-lg px-3 py-2 transition-colors',
374
+ selectionMode
375
+ ? 'bg-purple-600 dark:bg-purple-500 text-white border border-purple-700 dark:border-purple-600'
376
+ : 'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-200 dark:border-gray-700',
377
+ )}
378
+ aria-label={selectionMode ? 'Exit selection mode' : 'Enter selection mode'}
379
+ >
380
+ <span className={selectionMode ? 'i-ph:x h-4 w-4' : 'i-ph:check-square h-4 w-4'} />
381
+ </button>
382
+ </div>
383
+ <div className="relative w-full">
384
+ <div className="absolute left-3 top-1/2 -translate-y-1/2">
385
+ <span className="i-ph:magnifying-glass h-4 w-4 text-gray-400 dark:text-gray-500" />
386
+ </div>
387
+ <input
388
+ className="w-full bg-gray-50 dark:bg-gray-900 relative pl-9 pr-3 py-2 rounded-lg focus:outline-none focus:ring-1 focus:ring-purple-500/50 text-sm text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-500 border border-gray-200 dark:border-gray-800"
389
+ type="search"
390
+ placeholder="Search chats..."
391
+ onChange={handleSearchChange}
392
+ aria-label="Search chats"
393
+ />
394
+ </div>
395
+ </div>
396
+ <div className="flex items-center justify-between text-sm px-4 py-2">
397
+ <div className="font-medium text-gray-600 dark:text-gray-400">Your Chats</div>
398
+ {selectionMode && (
399
+ <div className="flex items-center gap-2">
400
+ <Button variant="ghost" size="sm" onClick={selectAll}>
401
+ {selectedItems.length === filteredList.length ? 'Deselect all' : 'Select all'}
402
+ </Button>
403
+ <Button
404
+ variant="destructive"
405
+ size="sm"
406
+ onClick={handleBulkDeleteClick}
407
+ disabled={selectedItems.length === 0}
408
+ >
409
+ Delete selected
410
+ </Button>
411
+ </div>
412
+ )}
413
+ </div>
414
+ <div className="flex-1 overflow-auto px-3 pb-3">
415
+ {filteredList.length === 0 && (
416
+ <div className="px-4 text-gray-500 dark:text-gray-400 text-sm">
417
+ {list.length === 0 ? 'No previous conversations' : 'No matches found'}
418
+ </div>
419
+ )}
420
+ <DialogRoot open={dialogContent !== null}>
421
+ {binDates(filteredList).map(({ category, items }) => (
422
+ <div key={category} className="mt-2 first:mt-0 space-y-1">
423
+ <div className="text-xs font-medium text-gray-500 dark:text-gray-400 sticky top-0 z-1 bg-white dark:bg-gray-950 px-4 py-1">
424
+ {category}
425
+ </div>
426
+ <div className="space-y-0.5 pr-1">
427
+ {items.map((item) => (
428
+ <HistoryItem
429
+ key={item.id}
430
+ item={item}
431
+ exportChat={exportChat}
432
+ onDelete={(event) => {
433
+ event.preventDefault();
434
+ event.stopPropagation();
435
+ console.log('Delete triggered for item:', item);
436
+ setDialogContentWithLogging({ type: 'delete', item });
437
+ }}
438
+ onDuplicate={() => handleDuplicate(item.id)}
439
+ selectionMode={selectionMode}
440
+ isSelected={selectedItems.includes(item.id)}
441
+ onToggleSelection={toggleItemSelection}
442
+ />
443
+ ))}
444
+ </div>
445
+ </div>
446
+ ))}
447
+ <Dialog onBackdrop={closeDialog} onClose={closeDialog}>
448
+ {dialogContent?.type === 'delete' && (
449
+ <>
450
+ <div className="p-6 bg-white dark:bg-gray-950">
451
+ <DialogTitle className="text-gray-900 dark:text-white">Delete Chat?</DialogTitle>
452
+ <DialogDescription className="mt-2 text-gray-600 dark:text-gray-400">
453
+ <p>
454
+ You are about to delete{' '}
455
+ <span className="font-medium text-gray-900 dark:text-white">
456
+ {dialogContent.item.description}
457
+ </span>
458
+ </p>
459
+ <p className="mt-2">Are you sure you want to delete this chat?</p>
460
+ </DialogDescription>
461
+ </div>
462
+ <div className="flex justify-end gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-900 border-t border-gray-100 dark:border-gray-800">
463
+ <DialogButton type="secondary" onClick={closeDialog}>
464
+ Cancel
465
+ </DialogButton>
466
+ <DialogButton
467
+ type="danger"
468
+ onClick={(event) => {
469
+ console.log('Dialog delete button clicked for item:', dialogContent.item);
470
+ deleteItem(event, dialogContent.item);
471
+ closeDialog();
472
+ }}
473
+ >
474
+ Delete
475
+ </DialogButton>
476
+ </div>
477
+ </>
478
+ )}
479
+ {dialogContent?.type === 'bulkDelete' && (
480
+ <>
481
+ <div className="p-6 bg-white dark:bg-gray-950">
482
+ <DialogTitle className="text-gray-900 dark:text-white">Delete Selected Chats?</DialogTitle>
483
+ <DialogDescription className="mt-2 text-gray-600 dark:text-gray-400">
484
+ <p>
485
+ You are about to delete {dialogContent.items.length}{' '}
486
+ {dialogContent.items.length === 1 ? 'chat' : 'chats'}:
487
+ </p>
488
+ <div className="mt-2 max-h-32 overflow-auto border border-gray-100 dark:border-gray-800 rounded-md bg-gray-50 dark:bg-gray-900 p-2">
489
+ <ul className="list-disc pl-5 space-y-1">
490
+ {dialogContent.items.map((item) => (
491
+ <li key={item.id} className="text-sm">
492
+ <span className="font-medium text-gray-900 dark:text-white">{item.description}</span>
493
+ </li>
494
+ ))}
495
+ </ul>
496
+ </div>
497
+ <p className="mt-3">Are you sure you want to delete these chats?</p>
498
+ </DialogDescription>
499
+ </div>
500
+ <div className="flex justify-end gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-900 border-t border-gray-100 dark:border-gray-800">
501
+ <DialogButton type="secondary" onClick={closeDialog}>
502
+ Cancel
503
+ </DialogButton>
504
+ <DialogButton
505
+ type="danger"
506
+ onClick={() => {
507
+ /*
508
+ * Pass the current selectedItems to the delete function.
509
+ * This captures the state at the moment the user confirms.
510
+ */
511
+ const itemsToDeleteNow = [...selectedItems];
512
+ console.log('Bulk delete confirmed for', itemsToDeleteNow.length, 'items', itemsToDeleteNow);
513
+ deleteSelectedItems(itemsToDeleteNow);
514
+ closeDialog();
515
+ }}
516
+ >
517
+ Delete
518
+ </DialogButton>
519
+ </div>
520
+ </>
521
+ )}
522
+ </Dialog>
523
+ </DialogRoot>
524
+ </div>
525
+ <div className="flex items-center justify-between border-t border-gray-200 dark:border-gray-800 px-4 py-3">
526
+ <div className="flex items-center gap-3">
527
+ {/* Settings button removed: Configuration is environment-only */}
528
+ </div>
529
+ <ThemeSwitch />
530
+ </div>
531
+ </div>
532
+ </motion.div>
533
+ {/* ControlPanel removed: Settings UI disabled for LLM-native execution */}
534
+ </>
535
+ );
536
+ };
@@ -0,0 +1,59 @@
1
+ import { format, isAfter, isThisWeek, isThisYear, isToday, isYesterday, subDays } from 'date-fns';
2
+ import type { ChatHistoryItem } from '~/lib/persistence';
3
+
4
+ type Bin = { category: string; items: ChatHistoryItem[] };
5
+
6
+ export function binDates(_list: ChatHistoryItem[]) {
7
+ const list = _list.toSorted((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp));
8
+
9
+ const binLookup: Record<string, Bin> = {};
10
+ const bins: Array<Bin> = [];
11
+
12
+ list.forEach((item) => {
13
+ const category = dateCategory(new Date(item.timestamp));
14
+
15
+ if (!(category in binLookup)) {
16
+ const bin = {
17
+ category,
18
+ items: [item],
19
+ };
20
+
21
+ binLookup[category] = bin;
22
+
23
+ bins.push(bin);
24
+ } else {
25
+ binLookup[category].items.push(item);
26
+ }
27
+ });
28
+
29
+ return bins;
30
+ }
31
+
32
+ function dateCategory(date: Date) {
33
+ if (isToday(date)) {
34
+ return 'Today';
35
+ }
36
+
37
+ if (isYesterday(date)) {
38
+ return 'Yesterday';
39
+ }
40
+
41
+ if (isThisWeek(date)) {
42
+ // e.g., "Mon" instead of "Monday"
43
+ return format(date, 'EEE');
44
+ }
45
+
46
+ const thirtyDaysAgo = subDays(new Date(), 30);
47
+
48
+ if (isAfter(date, thirtyDaysAgo)) {
49
+ return 'Past 30 Days';
50
+ }
51
+
52
+ if (isThisYear(date)) {
53
+ // e.g., "Jan" instead of "January"
54
+ return format(date, 'LLL');
55
+ }
56
+
57
+ // e.g., "Jan 2023" instead of "January 2023"
58
+ return format(date, 'LLL yyyy');
59
+ }
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,18 @@
1
+ import styles from './styles.module.scss';
2
+
3
+ const BackgroundRays = () => {
4
+ return (
5
+ <div className={`${styles.rayContainer} `}>
6
+ <div className={`${styles.lightRay} ${styles.ray1}`}></div>
7
+ <div className={`${styles.lightRay} ${styles.ray2}`}></div>
8
+ <div className={`${styles.lightRay} ${styles.ray3}`}></div>
9
+ <div className={`${styles.lightRay} ${styles.ray4}`}></div>
10
+ <div className={`${styles.lightRay} ${styles.ray5}`}></div>
11
+ <div className={`${styles.lightRay} ${styles.ray6}`}></div>
12
+ <div className={`${styles.lightRay} ${styles.ray7}`}></div>
13
+ <div className={`${styles.lightRay} ${styles.ray8}`}></div>
14
+ </div>
15
+ );
16
+ };
17
+
18
+ export default BackgroundRays;