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
tests/sanity.yml ADDED
@@ -0,0 +1,31 @@
1
+ name: Sanity checks (v1.2.0 — advanced analysis suite)
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ jobs:
7
+ sanity:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v4
11
+ - name: Set up Python
12
+ uses: actions/setup-python@v4
13
+ with:
14
+ python-version: '3.10'
15
+ - name: Install dependencies
16
+ run: |
17
+ python -m pip install --upgrade pip
18
+ pip install -r requirements.txt
19
+ pip install rustworkx pandas scipy cvxpy
20
+ - name: Run sanity script
21
+ run: |
22
+ python3 CR-CA/sanity_check.py
23
+ env:
24
+ GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
25
+ - name: Upload sanity log (always)
26
+ if: always()
27
+ uses: actions/upload-artifact@v4
28
+ with:
29
+ name: sanity-check-log
30
+ path: CR-CA/sanity_check.py
31
+
tests/sanity_check ADDED
@@ -0,0 +1,406 @@
1
+ #!/usr/bin/env python3
2
+ """Expanded sanity/stress checks for CRCAAgent (v1.2.0).
3
+
4
+ - Offline path exercises graph ops, batch predict, caching, fitting, uncertainty,
5
+ sensitivity, Shapley, VAR/Granger, multi-layer, alternate realities, Bellman,
6
+ async wrappers, optimization, Bayesian inference, root cause analysis, and vector autoregression.
7
+ - Optional LLM path runs only if OPENAI_API_KEY is set; still lightweight.
8
+ - Exit code: 0 on success; non-zero on failure.
9
+ """
10
+ from importlib.util import spec_from_file_location, module_from_spec
11
+ from pathlib import Path
12
+ import os
13
+ import sys
14
+ import math
15
+ import asyncio
16
+ import warnings
17
+
18
+ # Suppress litellm cleanup RuntimeWarning noise for this test script
19
+ warnings.filterwarnings(
20
+ "ignore",
21
+ message="coroutine 'close_litellm_async_clients' was never awaited",
22
+ category=RuntimeWarning,
23
+ )
24
+
25
+
26
+ def load_crca_agent():
27
+ repo_root = Path(__file__).resolve().parents[1]
28
+ module_path = repo_root / "CR-CA" / "CRCA.py"
29
+ spec = spec_from_file_location("crca_module", str(module_path))
30
+ mod = module_from_spec(spec)
31
+ spec.loader.exec_module(mod) # type: ignore
32
+ return mod.CRCAAgent
33
+
34
+
35
+ def mask_key(k: str) -> str:
36
+ if not k:
37
+ return "<missing>"
38
+ if len(k) <= 8:
39
+ return k[:2] + "*" * (len(k) - 2)
40
+ return k[:4] + "*" * (len(k) - 8) + k[-4:]
41
+
42
+
43
+ def main():
44
+ CRCAAgent = load_crca_agent()
45
+ failures = []
46
+ rng_seed = 42
47
+ try:
48
+ import pandas as pd # type: ignore
49
+ PANDAS_AVAILABLE = True
50
+ except Exception:
51
+ PANDAS_AVAILABLE = False
52
+ try:
53
+ import numpy as np # type: ignore
54
+ NUMPY_AVAILABLE = True
55
+ except Exception:
56
+ NUMPY_AVAILABLE = False
57
+ np = None
58
+
59
+ # Test 1: add edge and read strength
60
+ try:
61
+ a = CRCAAgent(variables=["A", "B"], seed=rng_seed)
62
+ a.add_causal_relationship("A", "B", strength=0.72, confidence=0.9)
63
+ s = a._edge_strength("A", "B")
64
+ assert abs(s - 0.72) < 1e-6, f"edge strength {s} != 0.72"
65
+ print("PASS: add_causal_relationship -> _edge_strength")
66
+ except Exception as e:
67
+ failures.append(("edge_strength", str(e)))
68
+
69
+ # Test 2: topological sort and is_dag
70
+ try:
71
+ a2 = CRCAAgent(variables=["n1", "n2", "n3"], seed=rng_seed)
72
+ a2.add_causal_relationship("n1", "n2", strength=1.0)
73
+ a2.add_causal_relationship("n2", "n3", strength=1.0)
74
+ order = a2._topological_sort()
75
+ assert order.index("n1") < order.index("n2") < order.index("n3")
76
+ assert a2.is_dag() is True
77
+ print("PASS: _topological_sort and is_dag")
78
+ except Exception as e:
79
+ failures.append(("topo_is_dag", str(e)))
80
+
81
+ # Test 3: rustworkx duplicate-edge protection and metadata update
82
+ try:
83
+ a3 = CRCAAgent(variables=["X", "Y"], seed=rng_seed)
84
+ # initial edges count
85
+ try:
86
+ before_edges = a3._graph.num_edges()
87
+ except Exception:
88
+ before_edges = None
89
+ a3.add_causal_relationship("X", "Y", strength=0.5)
90
+ # add again with different strength to trigger update path
91
+ a3.add_causal_relationship("X", "Y", strength=0.77)
92
+ s_updated = a3._edge_strength("X", "Y")
93
+ assert abs(s_updated - 0.77) < 1e-6, f"edge strength not updated: {s_updated}"
94
+ # ensure rustworkx didn't add duplicate edge (num_edges unchanged or increased by at most 1 if nodes added)
95
+ try:
96
+ after_edges = a3._graph.num_edges()
97
+ if before_edges is not None:
98
+ assert after_edges - before_edges <= 1
99
+ except Exception:
100
+ # If rustworkx didn't support num_edges, ignore this check
101
+ pass
102
+ print("PASS: rustworkx duplicate-edge protection and metadata update")
103
+ except Exception as e:
104
+ failures.append(("rustworkx_edge_update", str(e)))
105
+
106
+ # Test 4: prediction cache behavior (cached wrapper)
107
+ try:
108
+ a4 = CRCAAgent(variables=["Z"], seed=rng_seed, enable_batch_predict=True, max_batch_size=8)
109
+ a4.set_standardization_stats("Z", mean=0.0, std=1.0)
110
+ a4._prediction_cache_max = 5
111
+ a4.enable_cache(True)
112
+ a4.clear_cache()
113
+ factual = {"Z": 0.0}
114
+ # call cached predictor twice
115
+ r1 = a4._predict_outcomes_cached(factual, {})
116
+ r2 = a4._predict_outcomes_cached(factual, {})
117
+ # check cache populated
118
+ cache_len = len(getattr(a4, "_prediction_cache", {}))
119
+ assert cache_len >= 1, "prediction cache not populated"
120
+ assert r1 == r2, "cached results differ between calls"
121
+ # batch predict
122
+ batch = a4._predict_outcomes_batch([{"Z": 1.0}, {"Z": -1.0}], interventions={"Z": 0.5})
123
+ assert len(batch) == 2 and all("Z" in x for x in batch), "batch predict failed"
124
+ print("PASS: _predict_outcomes_cached populates cache and returns consistent results")
125
+ except Exception as e:
126
+ failures.append(("predict_cache", str(e)))
127
+
128
+ # Test 5: basic AAP smoke (deterministic)
129
+ try:
130
+ a5 = CRCAAgent(variables=["price", "volume", "momentum", "trading_volume", "market_sentiment"], seed=rng_seed)
131
+ a5.set_standardization_stats("price", mean=1.0, std=1.0)
132
+ a5.set_standardization_stats("volume", mean=100000.0, std=20000.0)
133
+ a5.set_standardization_stats("momentum", mean=0.0, std=0.05)
134
+ a5.set_standardization_stats("trading_volume", mean=100000.0, std=20000.0)
135
+ a5.add_causal_relationship("volume", "price", strength=0.3)
136
+ a5.add_causal_relationship("momentum", "price", strength=0.4)
137
+ factual = {"price": 1.0, "volume": 100000.0, "momentum": 0.02, "trading_volume": 120000.0}
138
+ res = a5.aap(factual, {"momentum": 0.05})
139
+ assert "price" in res and isinstance(res["price"], (int, float))
140
+ print("PASS: AAP smoke (price present and numeric)")
141
+ except Exception as e:
142
+ failures.append(("aap_smoke", str(e)))
143
+
144
+ # Test 6: data fitting, uncertainty, optimization, async, and advanced analyses (requires pandas/numpy/scipy)
145
+ if PANDAS_AVAILABLE and NUMPY_AVAILABLE:
146
+ import pandas as pd # type: ignore
147
+ import numpy as np # type: ignore
148
+ try:
149
+ a6 = CRCAAgent(
150
+ variables=["price", "volume", "momentum"],
151
+ enable_batch_predict=True,
152
+ max_batch_size=16,
153
+ bootstrap_workers=2,
154
+ use_async=True,
155
+ seed=rng_seed,
156
+ )
157
+ a6.add_causal_relationship("volume", "price", strength=0.0)
158
+ a6.add_causal_relationship("momentum", "price", strength=0.0)
159
+ # synthetic data
160
+ n = 60
161
+ ts = pd.DataFrame({
162
+ "price": 100 + np.linspace(0, 5, n) + np.random.normal(0, 1, n),
163
+ "volume": 1e5 + np.random.normal(0, 2e4, n),
164
+ "momentum": np.random.normal(0, 0.05, n),
165
+ })
166
+ a6.fit_from_dataframe(ts, variables=["price", "volume", "momentum"], window=30, decay_alpha=0.9)
167
+ s_vol = a6._edge_strength("volume", "price")
168
+ assert not math.isnan(s_vol), "fit_from_dataframe produced NaN"
169
+ print("PASS: fit_from_dataframe")
170
+
171
+ unc = a6.quantify_uncertainty(ts, variables=["price", "volume", "momentum"], windows=10, alpha=0.9)
172
+ assert "edge_cis" in unc
173
+ print("PASS: quantify_uncertainty")
174
+
175
+ # Async wrappers (v1.2.0+)
176
+ loop = asyncio.new_event_loop()
177
+ asyncio.set_event_loop(loop)
178
+ try:
179
+ unc_async = loop.run_until_complete(
180
+ a6.quantify_uncertainty_async(ts, variables=["price", "volume", "momentum"], windows=6, alpha=0.8)
181
+ )
182
+ assert "edge_cis" in unc_async
183
+ gr_async = loop.run_until_complete(
184
+ a6.granger_causality_test_async(ts, var1="volume", var2="price", max_lag=2)
185
+ )
186
+ assert "granger_causes" in gr_async or "error" in gr_async
187
+ var_async = loop.run_until_complete(
188
+ a6.vector_autoregression_estimation_async(
189
+ ts, variables=["price", "volume", "momentum"], max_lag=2
190
+ )
191
+ )
192
+ assert "coefficient_matrices" in var_async
193
+ run_async_result = loop.run_until_complete(
194
+ a6.run_async(
195
+ initial_state={"price": 100.0, "volume": 100000.0, "momentum": 0.01},
196
+ max_steps=1
197
+ )
198
+ )
199
+ assert "evolved_state" in run_async_result
200
+ print("PASS: async wrappers (v1.2.0: quantify_uncertainty_async, granger_causality_test_async, vector_autoregression_estimation_async, run_async)")
201
+ finally:
202
+ try:
203
+ if not loop.is_closed():
204
+ loop.run_until_complete(loop.shutdown_asyncgens())
205
+ loop.close()
206
+ except Exception:
207
+ pass
208
+
209
+ try:
210
+ opt = a6.gradient_based_intervention_optimization(
211
+ initial_state={"price": 101.0, "volume": 120000.0, "momentum": 0.01},
212
+ target="price",
213
+ intervention_vars=["volume", "momentum"],
214
+ constraints={"volume": (80000.0, 150000.0), "momentum": (-0.2, 0.2)},
215
+ )
216
+ assert "optimal_intervention" in opt
217
+ print("PASS: gradient_based_intervention_optimization")
218
+ except Exception as e:
219
+ failures.append(("gradient_opt", str(e)))
220
+
221
+ try:
222
+ gr = a6.granger_causality_test(ts, var1="volume", var2="price", max_lag=2)
223
+ assert "granger_causes" in gr
224
+ print("PASS: granger_causality_test")
225
+ except Exception as e:
226
+ failures.append(("granger", str(e)))
227
+
228
+ try:
229
+ info = a6.compute_information_theoretic_measures(ts, variables=["price", "volume", "momentum"])
230
+ assert "entropies" in info
231
+ print("PASS: compute_information_theoretic_measures")
232
+ except Exception as e:
233
+ failures.append(("info_theory", str(e)))
234
+
235
+ try:
236
+ sens = a6.sensitivity_analysis(
237
+ intervention={"volume": 120000.0, "momentum": 0.02},
238
+ target="price",
239
+ perturbation_size=0.01,
240
+ )
241
+ assert sens.get("most_influential_variable") is not None
242
+ print("PASS: sensitivity_analysis")
243
+ except Exception as e:
244
+ failures.append(("sensitivity", str(e)))
245
+
246
+ try:
247
+ shap = a6.shapley_value_attribution(
248
+ baseline_state={"price": 100.0, "volume": 100000.0, "momentum": 0.0},
249
+ target_state={"price": 102.0, "volume": 130000.0, "momentum": 0.03},
250
+ target="price",
251
+ samples=20,
252
+ )
253
+ assert "shapley_values" in shap
254
+ print("PASS: shapley_value_attribution")
255
+ except Exception as e:
256
+ failures.append(("shapley", str(e)))
257
+
258
+ try:
259
+ multi = a6.multi_layer_whatif_analysis(
260
+ scenarios=[{"volume": 110000.0}, {"momentum": 0.05}],
261
+ depth=2,
262
+ )
263
+ assert "multi_layer_analysis" in multi
264
+ print("PASS: multi_layer_whatif_analysis")
265
+ except Exception as e:
266
+ failures.append(("multi_layer", str(e)))
267
+
268
+ try:
269
+ alt = a6.explore_alternate_realities(
270
+ factual_state={"price": 101.0, "volume": 120000.0, "momentum": 0.02},
271
+ target_outcome="price",
272
+ target_value=None,
273
+ max_realities=10,
274
+ max_interventions=2,
275
+ )
276
+ assert "best_reality" in alt
277
+ print("PASS: explore_alternate_realities")
278
+ except Exception as e:
279
+ failures.append(("alternate_realities", str(e)))
280
+
281
+ try:
282
+ bell = a6.bellman_optimal_intervention(
283
+ initial_state={"price": 100.0, "volume": 100000.0, "momentum": 0.01},
284
+ target="price",
285
+ intervention_vars=["volume", "momentum"],
286
+ horizon=3,
287
+ discount=0.9,
288
+ )
289
+ assert "optimal_sequence" in bell
290
+ print("PASS: bellman_optimal_intervention")
291
+ except Exception as e:
292
+ failures.append(("bellman", str(e)))
293
+
294
+ try:
295
+ var_result = a6.vector_autoregression_estimation(
296
+ ts, variables=["price", "volume", "momentum"], max_lag=2
297
+ )
298
+ assert "coefficient_matrices" in var_result
299
+ print("PASS: vector_autoregression_estimation")
300
+ except Exception as e:
301
+ failures.append(("var_estimation", str(e)))
302
+
303
+ try:
304
+ bayesian_result = a6.bayesian_edge_inference(
305
+ ts, parent="volume", child="price", prior_mu=0.0, prior_sigma=1.0
306
+ )
307
+ assert "posterior_mean" in bayesian_result
308
+ print("PASS: bayesian_edge_inference")
309
+ except Exception as e:
310
+ failures.append(("bayesian", str(e)))
311
+
312
+ try:
313
+ rca_result = a6.deep_root_cause_analysis(
314
+ problem_variable="price",
315
+ max_depth=10,
316
+ min_path_strength=0.01
317
+ )
318
+ assert "all_root_causes" in rca_result
319
+ print("PASS: deep_root_cause_analysis")
320
+ except Exception as e:
321
+ failures.append(("root_cause", str(e)))
322
+
323
+ except Exception as e:
324
+ failures.append(("pandas_block", str(e)))
325
+ else:
326
+ print("SKIP: pandas/numpy not available; skipped data-fitting/uncertainty/optimization tests")
327
+
328
+ # Check OPENAI_API_KEY presence (do not call network)
329
+ key = os.environ.get("OPENAI_API_KEY", "")
330
+ if key:
331
+ print("OPENAI_API_KEY found:", mask_key(key))
332
+ else:
333
+ print("OPENAI_API_KEY not set (ok — LLM network tests skipped)")
334
+
335
+ # Optional LLM integration smoke test (runs only if OPENAI_API_KEY is present)
336
+ if key:
337
+ try:
338
+ # Initialize agent with a GROQ model for LLM smoke test
339
+ agent_llm = CRCAAgent(
340
+ variables=["price", "demand"],
341
+ model_name="gpt-4o-mini",
342
+ max_loops=1,
343
+ enable_batch_predict=True,
344
+ seed=rng_seed,
345
+ )
346
+ # Short LLM task to exercise the LLM integration path
347
+ task = "Provide a one-sentence causal analysis: describe why increasing price might change demand."
348
+ # Run the LLM causal analysis workflow
349
+ res = agent_llm._run_llm_causal_analysis(task)
350
+ ca = res.get("causal_analysis", "")
351
+ # Basic checks and sample output (be permissive about returned shape)
352
+ ok = False
353
+ if isinstance(ca, str) and ca.strip():
354
+ ok = True
355
+ elif isinstance(res.get("analysis_steps"), list) and len(res.get("analysis_steps", [])) > 0:
356
+ ok = True
357
+
358
+ if ok:
359
+ print("PASS: LLM integration smoke (causal_analysis present)")
360
+ if isinstance(ca, str) and ca.strip():
361
+ sample = " ".join(ca.strip().splitlines())[:240]
362
+ else:
363
+ sample = str(res)[:240]
364
+ print("LLM sample:", sample)
365
+ else:
366
+ failures.append(("llm_smoke", f"unexpected LLM result shape: {list(res.keys())}"))
367
+
368
+ # LLM-aware run with structured initial state (small)
369
+ cf_res = agent_llm.run(
370
+ task={"price": 10.0, "demand": 5.0},
371
+ initial_state={"price": 10.0, "demand": 5.0},
372
+ target_variables=["price", "demand"],
373
+ max_steps=1,
374
+ )
375
+ if not isinstance(cf_res, dict) or "evolved_state" not in cf_res:
376
+ failures.append(("llm_run_structured", "run() did not return expected shape"))
377
+ else:
378
+ print("PASS: LLM run() structured state path")
379
+ except Exception as e:
380
+ failures.append(("llm_smoke", str(e)))
381
+
382
+ # Best-effort cleanup for litellm async clients to avoid warnings
383
+ try:
384
+ from litellm.llms.custom_httpx.async_client_cleanup import close_litellm_async_clients # type: ignore
385
+ cleanup_loop = asyncio.new_event_loop()
386
+ asyncio.set_event_loop(cleanup_loop)
387
+ cleanup_loop.run_until_complete(close_litellm_async_clients())
388
+ cleanup_loop.close()
389
+ except Exception:
390
+ pass
391
+ # Report
392
+ if failures:
393
+ print("\nSANITY CHECK FAILED:")
394
+ for name, msg in failures:
395
+ print(f"- {name}: {msg}")
396
+ print("\nFix the above issues before considering prod deployment.")
397
+ sys.exit(2)
398
+ else:
399
+ print("\nAll sanity checks passed.")
400
+ sys.exit(0)
401
+
402
+
403
+ if __name__ == "__main__":
404
+ main()
405
+
406
+
tests/test_core.py ADDED
@@ -0,0 +1,47 @@
1
+ import os
2
+ import importlib.util
3
+
4
+
5
+ def load_crca_module():
6
+ repo_root = os.path.dirname(os.path.dirname(__file__))
7
+ # CRCA.py lives inside the ceca_lite package directory
8
+ # In this repository layout the implementation file is `CRCA.py` under CR-CA
9
+ target = os.path.join(repo_root, "CR-CA", "CRCA.py")
10
+ spec = importlib.util.spec_from_file_location("crca_module", target)
11
+ mod = importlib.util.module_from_spec(spec)
12
+ spec.loader.exec_module(mod)
13
+ return mod
14
+
15
+
16
+ def test_crca_agent_basic_flow():
17
+ mod = load_crca_module()
18
+ CRCAAgent = getattr(mod, "CRCAAgent")
19
+
20
+ agent = CRCAAgent(variables=["x", "y"], causal_edges=[("x", "y")])
21
+
22
+ # Set sensible standardization stats to avoid std=0 edge cases
23
+ agent.set_standardization_stats("x", mean=1.0, std=2.0)
24
+ agent.set_standardization_stats("y", mean=10.0, std=5.0)
25
+
26
+ factual = {"x": 2.0, "y": 12.0}
27
+ interventions = {}
28
+
29
+ # Basic prediction (no cache)
30
+ agent.enable_cache(False)
31
+ out = agent._predict_outcomes_cached(factual, interventions)
32
+ assert isinstance(out, dict)
33
+ assert "x" in out and "y" in out
34
+
35
+ # Enable cache and check caching pathway
36
+ agent.enable_cache(True)
37
+ agent.clear_cache()
38
+ out1 = agent._predict_outcomes_cached(factual, interventions)
39
+ out2 = agent._predict_outcomes_cached(factual, interventions)
40
+ assert out1 == out2
41
+
42
+ # Graph utilities
43
+ edges = agent.get_edges()
44
+ assert ("x", "y") in edges
45
+ assert agent.is_dag()
46
+
47
+
@@ -0,0 +1,166 @@
1
+ """
2
+ Integration tests for CRCA Excel TUI System.
3
+
4
+ Tests full planning workflow, SCM bridge, and TUI interactions.
5
+ """
6
+
7
+ import pytest
8
+ from crca_excel.core.tables import TableManager
9
+ from crca_excel.core.deps import DependencyGraph
10
+ from crca_excel.core.eval import EvaluationEngine
11
+ from crca_excel.core.scm import SCMBridge
12
+ from crca_excel.core.objective import ObjectiveFunction, ConstraintChecker
13
+ from crca_excel.core.planner import Planner
14
+ from crca_excel.core.events import EventDispatcher
15
+ from crca_excel.core.standard_tables import initialize_standard_tables
16
+ from crca_excel.core.formulas import (
17
+ formula_agent_load,
18
+ formula_task_progress,
19
+ formula_objective
20
+ )
21
+
22
+
23
+ def test_table_creation():
24
+ """Test table creation and basic operations."""
25
+ tables = TableManager()
26
+ initialize_standard_tables(tables)
27
+
28
+ assert tables.has_table("CONFIG")
29
+ assert tables.has_table("AGENTS")
30
+ assert tables.has_table("TASKS")
31
+
32
+ # Add an agent
33
+ agents_table = tables.get_table("AGENTS")
34
+ agents_table.add_row("agent1", {"agent_id": "agent1", "max_tasks": 5})
35
+
36
+ assert agents_table.has_row("agent1")
37
+ assert agents_table.get_cell("agent1", "max_tasks") == 5
38
+
39
+
40
+ def test_dependency_graph():
41
+ """Test dependency graph operations."""
42
+ graph = DependencyGraph()
43
+
44
+ cell1 = ("TASKS", "task1", "difficulty")
45
+ cell2 = ("AGENTS", "agent1", "load")
46
+
47
+ graph.add_dependency(cell1, cell2)
48
+
49
+ deps = graph.get_dependencies(cell2)
50
+ assert cell1 in deps
51
+
52
+ dependents = graph.get_dependents(cell1)
53
+ assert cell2 in dependents
54
+
55
+
56
+ def test_scm_bridge():
57
+ """Test SCM bridge do-operator."""
58
+ tables = TableManager()
59
+ initialize_standard_tables(tables)
60
+
61
+ graph = DependencyGraph()
62
+ eval_engine = EvaluationEngine(tables, graph)
63
+ scm_bridge = SCMBridge(tables, eval_engine)
64
+
65
+ # Add agent and task
66
+ agents_table = tables.get_table("AGENTS")
67
+ agents_table.add_row("agent1", {"agent_id": "agent1", "max_tasks": 5})
68
+
69
+ tasks_table = tables.get_table("TASKS")
70
+ tasks_table.add_row("task1", {"task_id": "task1", "difficulty": 2.0})
71
+
72
+ # Apply intervention
73
+ intervention = {
74
+ ("TASKS", "task1", "assigned_agent_id"): "agent1"
75
+ }
76
+
77
+ snapshot = scm_bridge.do_intervention(intervention)
78
+ assert "TASKS" in snapshot
79
+
80
+
81
+ def test_planner():
82
+ """Test planner candidate generation and evaluation."""
83
+ tables = TableManager()
84
+ initialize_standard_tables(tables)
85
+
86
+ graph = DependencyGraph()
87
+ eval_engine = EvaluationEngine(tables, graph)
88
+ scm_bridge = SCMBridge(tables, eval_engine)
89
+
90
+ objective = ObjectiveFunction("value")
91
+ constraint_checker = ConstraintChecker()
92
+
93
+ planner = Planner(tables, scm_bridge, objective, constraint_checker)
94
+
95
+ # Add test data
96
+ agents_table = tables.get_table("AGENTS")
97
+ agents_table.add_row("agent1", {"agent_id": "agent1", "max_tasks": 5})
98
+
99
+ tasks_table = tables.get_table("TASKS")
100
+ tasks_table.add_row("task1", {"task_id": "task1", "difficulty": 2.0, "value": 10.0})
101
+
102
+ # Generate candidates
103
+ intervention_vars = [("TASKS", "task1", "assigned_agent_id")]
104
+ candidates = planner.generate_candidates(intervention_vars, n_candidates=5)
105
+
106
+ assert len(candidates) > 0
107
+ assert all(isinstance(c, dict) for c in candidates)
108
+
109
+
110
+ def test_event_dispatcher():
111
+ """Test event dispatcher."""
112
+ tables = TableManager()
113
+ initialize_standard_tables(tables)
114
+
115
+ graph = DependencyGraph()
116
+ eval_engine = EvaluationEngine(tables, graph)
117
+ dispatcher = EventDispatcher(tables, eval_engine, graph)
118
+
119
+ # Add agent
120
+ agents_table = tables.get_table("AGENTS")
121
+ agents_table.add_row("agent1", {"agent_id": "agent1"})
122
+
123
+ # Dispatch edit event
124
+ from crca_excel.core.events import EditCellEvent
125
+ event = EditCellEvent(
126
+ table_name="AGENTS",
127
+ row_key="agent1",
128
+ column_name="max_tasks",
129
+ value=10
130
+ )
131
+
132
+ dispatcher.dispatch(event)
133
+
134
+ assert agents_table.get_cell("agent1", "max_tasks") == 10
135
+
136
+
137
+ def test_formulas():
138
+ """Test formula evaluation."""
139
+ tables = TableManager()
140
+ initialize_standard_tables(tables)
141
+
142
+ # Setup data
143
+ agents_table = tables.get_table("AGENTS")
144
+ agents_table.add_row("agent1", {"agent_id": "agent1", "max_tasks": 5})
145
+
146
+ tasks_table = tables.get_table("TASKS")
147
+ tasks_table.add_row("task1", {
148
+ "task_id": "task1",
149
+ "difficulty": 2.0,
150
+ "assigned_agent_id": "agent1"
151
+ })
152
+
153
+ # Test agent load formula
154
+ agent_row = agents_table.get_row_data("agent1")
155
+ all_tables = {
156
+ "AGENTS": {"agent1": agent_row},
157
+ "TASKS": {"task1": tasks_table.get_row_data("task1")}
158
+ }
159
+
160
+ load = formula_agent_load(agent_row, all_tables, {})
161
+ assert load == 2.0 # Sum of assigned task difficulties
162
+
163
+
164
+ if __name__ == "__main__":
165
+ pytest.main([__file__, "-v"])
166
+