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,325 @@
1
+ """Drift detection using ruptures library for change-point detection.
2
+
3
+ Provides advanced change-point detection beyond simple CUSUM,
4
+ supporting multiple change points and per-metric detection.
5
+ """
6
+
7
+ from typing import Any, Dict, List, Optional, Tuple
8
+ import numpy as np
9
+ from loguru import logger
10
+
11
+ # Try to import ruptures
12
+ try:
13
+ import ruptures as rpt
14
+ RUPTURES_AVAILABLE = True
15
+ except ImportError:
16
+ RUPTURES_AVAILABLE = False
17
+ logger.warning("ruptures not available - drift detection will use CUSUM only")
18
+
19
+
20
+ class DriftDetector:
21
+ """Change-point detection using ruptures library.
22
+
23
+ Supports multiple change-point detection algorithms:
24
+ - Pelt: Optimal segmentation (penalized likelihood)
25
+ - Dynp: Dynamic programming (exact solution)
26
+ - Binseg: Binary segmentation (fast approximation)
27
+ """
28
+
29
+ def __init__(
30
+ self,
31
+ algorithm: str = "pelt",
32
+ min_size: int = 2,
33
+ penalty: float = 10.0,
34
+ model: str = "rbf"
35
+ ):
36
+ """
37
+ Initialize drift detector.
38
+
39
+ Args:
40
+ algorithm: Detection algorithm ("pelt", "dynp", "binseg")
41
+ min_size: Minimum segment size
42
+ penalty: Penalty parameter for Pelt
43
+ model: Change-point model ("rbf", "l2", "l1", "normal", "ar")
44
+ """
45
+ self.algorithm = algorithm
46
+ self.min_size = min_size
47
+ self.penalty = penalty
48
+ self.model = model
49
+ self.detectors: Dict[str, Any] = {} # Per-metric detectors
50
+ self.change_points: Dict[str, List[int]] = {} # Per-metric change points
51
+ self.confidence_scores: Dict[str, List[float]] = {} # Per-metric confidence
52
+
53
+ def detect_changepoints(
54
+ self,
55
+ metric_name: str,
56
+ metric_history: List[float],
57
+ min_history: int = 10
58
+ ) -> Tuple[List[int], List[float]]:
59
+ """
60
+ Detect change points in metric history.
61
+
62
+ Args:
63
+ metric_name: Name of the metric
64
+ metric_history: Historical values of the metric
65
+ min_history: Minimum history length required
66
+
67
+ Returns:
68
+ Tuple of (change_point_indices, confidence_scores)
69
+ """
70
+ if not RUPTURES_AVAILABLE:
71
+ return [], []
72
+
73
+ if len(metric_history) < min_history:
74
+ return [], []
75
+
76
+ try:
77
+ # Convert to numpy array
78
+ signal = np.array(metric_history).reshape(-1, 1)
79
+
80
+ # Initialize detector if needed
81
+ if metric_name not in self.detectors:
82
+ if self.algorithm == "pelt":
83
+ self.detectors[metric_name] = rpt.Pelt(model=self.model, min_size=self.min_size).fit(signal)
84
+ elif self.algorithm == "dynp":
85
+ self.detectors[metric_name] = rpt.Dynp(model=self.model, min_size=self.min_size).fit(signal)
86
+ elif self.algorithm == "binseg":
87
+ self.detectors[metric_name] = rpt.Binseg(model=self.model, min_size=self.min_size).fit(signal)
88
+ else:
89
+ logger.warning(f"Unknown algorithm {self.algorithm}, using Pelt")
90
+ self.detectors[metric_name] = rpt.Pelt(model=self.model, min_size=self.min_size).fit(signal)
91
+ else:
92
+ # Update detector with new data
93
+ self.detectors[metric_name].fit(signal)
94
+
95
+ # Detect change points
96
+ detector = self.detectors[metric_name]
97
+
98
+ if self.algorithm == "pelt":
99
+ change_points = detector.predict(pen=self.penalty)
100
+ elif self.algorithm == "dynp":
101
+ # For Dynp, need to specify number of change points
102
+ # Use penalty to estimate number
103
+ n_bkps = max(1, int(len(signal) / (self.penalty * 10)))
104
+ change_points = detector.predict(n_bkps=n_bkps)
105
+ elif self.algorithm == "binseg":
106
+ n_bkps = max(1, int(len(signal) / (self.penalty * 10)))
107
+ change_points = detector.predict(n_bkps=n_bkps)
108
+ else:
109
+ change_points = []
110
+
111
+ # Remove last point (end of signal) if present
112
+ if change_points and change_points[-1] == len(signal):
113
+ change_points = change_points[:-1]
114
+
115
+ # Compute confidence scores (simplified: based on segment variance differences)
116
+ confidence_scores = []
117
+ for cp in change_points:
118
+ if cp > 0 and cp < len(signal):
119
+ # Compare variance before and after change point
120
+ before = signal[:cp]
121
+ after = signal[cp:]
122
+ var_before = np.var(before) if len(before) > 1 else 0.0
123
+ var_after = np.var(after) if len(after) > 1 else 0.0
124
+ # Confidence based on variance difference
125
+ confidence = min(1.0, abs(var_after - var_before) / (np.var(signal) + 1e-6))
126
+ confidence_scores.append(confidence)
127
+ else:
128
+ confidence_scores.append(0.0)
129
+
130
+ # Store results
131
+ self.change_points[metric_name] = change_points
132
+ self.confidence_scores[metric_name] = confidence_scores
133
+
134
+ return change_points, confidence_scores
135
+
136
+ except Exception as e:
137
+ logger.error(f"Change-point detection failed for {metric_name}: {e}")
138
+ return [], []
139
+
140
+ def characterize_segment(
141
+ self,
142
+ metric_name: str,
143
+ metric_history: List[float],
144
+ change_points: List[int]
145
+ ) -> List[Dict[str, Any]]:
146
+ """
147
+ Characterize segments between change points.
148
+
149
+ Args:
150
+ metric_name: Name of the metric
151
+ metric_history: Historical values
152
+ change_points: List of change point indices
153
+
154
+ Returns:
155
+ List of segment characterizations
156
+ """
157
+ if not change_points:
158
+ return []
159
+
160
+ segments = []
161
+ signal = np.array(metric_history)
162
+
163
+ prev_cp = 0
164
+ for cp in change_points + [len(signal)]:
165
+ segment = signal[prev_cp:cp]
166
+ if len(segment) > 0:
167
+ trend_val = float(np.polyfit(range(len(segment)), segment, 1)[0]) if len(segment) > 1 else 0.0
168
+ segments.append({
169
+ "start": prev_cp,
170
+ "end": cp,
171
+ "mean": float(np.mean(segment)),
172
+ "std": float(np.std(segment)),
173
+ "trend": trend_val,
174
+ "length": len(segment)
175
+ })
176
+ prev_cp = cp
177
+
178
+ return segments
179
+
180
+ def detect_drift(
181
+ self,
182
+ metric_name: str,
183
+ metric_history: List[float],
184
+ threshold: float = 0.7
185
+ ) -> Tuple[bool, Optional[Dict[str, Any]]]:
186
+ """
187
+ Detect if drift has occurred in a metric.
188
+
189
+ Args:
190
+ metric_name: Name of the metric
191
+ metric_history: Historical values
192
+ threshold: Confidence threshold for drift detection
193
+
194
+ Returns:
195
+ Tuple of (drift_detected, drift_info)
196
+ """
197
+ change_points, confidence_scores = self.detect_changepoints(metric_name, metric_history)
198
+
199
+ if not change_points:
200
+ return False, None
201
+
202
+ # Check if most recent change point has high confidence
203
+ if confidence_scores:
204
+ max_confidence = max(confidence_scores)
205
+ if max_confidence >= threshold:
206
+ # Get most recent change point
207
+ recent_cp = change_points[-1]
208
+ segments = self.characterize_segment(metric_name, metric_history, change_points)
209
+
210
+ drift_info = {
211
+ "change_point": recent_cp,
212
+ "confidence": max_confidence,
213
+ "segments": segments,
214
+ "type": self._classify_drift_type(segments) if segments else "unknown"
215
+ }
216
+
217
+ return True, drift_info
218
+
219
+ return False, None
220
+
221
+ def _classify_drift_type(self, segments: List[Dict[str, Any]]) -> str:
222
+ """Classify type of drift (mean shift, variance change, trend change)."""
223
+ if len(segments) < 2:
224
+ return "unknown"
225
+
226
+ # Compare last two segments
227
+ last_seg = segments[-1]
228
+ prev_seg = segments[-2]
229
+
230
+ mean_diff = abs(last_seg["mean"] - prev_seg["mean"])
231
+ std_diff = abs(last_seg["std"] - prev_seg["std"])
232
+ trend_diff = abs(last_seg["trend"] - prev_seg["trend"])
233
+
234
+ if mean_diff > std_diff and mean_diff > trend_diff:
235
+ return "mean_shift"
236
+ elif std_diff > mean_diff and std_diff > trend_diff:
237
+ return "variance_change"
238
+ elif trend_diff > mean_diff and trend_diff > std_diff:
239
+ return "trend_change"
240
+ else:
241
+ return "mixed"
242
+
243
+
244
+ class HybridDriftDetector:
245
+ """Hybrid drift detector combining ruptures and CUSUM.
246
+
247
+ Uses ruptures for change-point detection and CUSUM for continuous monitoring.
248
+ """
249
+
250
+ def __init__(
251
+ self,
252
+ use_ruptures: bool = True,
253
+ cusum_k: float = 0.5,
254
+ cusum_h: float = 5.0,
255
+ ruptures_penalty: float = 10.0
256
+ ):
257
+ """
258
+ Initialize hybrid detector.
259
+
260
+ Args:
261
+ use_ruptures: Whether to use ruptures for detection
262
+ cusum_k: CUSUM threshold parameter
263
+ cusum_h: CUSUM alarm threshold
264
+ ruptures_penalty: Penalty for ruptures algorithm
265
+ """
266
+ self.use_ruptures = use_ruptures and RUPTURES_AVAILABLE
267
+ self.cusum_k = cusum_k
268
+ self.cusum_h = cusum_h
269
+ self.cusum_stat = 0.0
270
+
271
+ if self.use_ruptures:
272
+ self.ruptures_detector = DriftDetector(penalty=ruptures_penalty)
273
+ else:
274
+ self.ruptures_detector = None
275
+
276
+ def update(
277
+ self,
278
+ metric_name: str,
279
+ x_t: float,
280
+ x_pred: float,
281
+ metric_history: List[float]
282
+ ) -> Tuple[bool, Optional[Dict[str, Any]]]:
283
+ """
284
+ Update drift detection with new observation.
285
+
286
+ Args:
287
+ metric_name: Name of the metric
288
+ x_t: Actual value
289
+ x_pred: Predicted value
290
+ metric_history: Historical values
291
+
292
+ Returns:
293
+ Tuple of (drift_detected, drift_info)
294
+ """
295
+ # CUSUM update
296
+ residual = abs(x_t - x_pred)
297
+ self.cusum_stat = max(0.0, self.cusum_stat + residual - self.cusum_k)
298
+
299
+ cusum_alarm = self.cusum_stat > self.cusum_h
300
+
301
+ # Ruptures detection (if enabled and enough history)
302
+ ruptures_drift = False
303
+ ruptures_info = None
304
+
305
+ if self.use_ruptures and len(metric_history) >= 10:
306
+ ruptures_drift, ruptures_info = self.ruptures_detector.detect_drift(
307
+ metric_name, metric_history, threshold=0.7
308
+ )
309
+
310
+ # Combine results
311
+ if ruptures_drift or cusum_alarm:
312
+ drift_info = {
313
+ "cusum_stat": self.cusum_stat,
314
+ "cusum_alarm": cusum_alarm,
315
+ "ruptures_drift": ruptures_drift,
316
+ "ruptures_info": ruptures_info
317
+ }
318
+ return True, drift_info
319
+
320
+ return False, None
321
+
322
+ def reset(self) -> None:
323
+ """Reset CUSUM statistic."""
324
+ self.cusum_stat = 0.0
325
+
@@ -0,0 +1,309 @@
1
+ """
2
+ Example: Causal Agent Template
3
+
4
+ This demonstrates how to create a causal reasoning agent using the template framework.
5
+ This is a simplified example showing the pattern - the full CRCA.py can be refactored
6
+ to use this pattern.
7
+ """
8
+
9
+ from typing import Dict, Any, List, Tuple, Optional, Union
10
+ from enum import Enum
11
+ from templates.base_specialized_agent import BaseSpecializedAgent
12
+ from templates.graph_management import GraphManager
13
+ from templates.prediction_framework import PredictionFramework, CounterfactualScenario
14
+ from templates.statistical_methods import StatisticalMethods
15
+ from templates.llm_integration import LLMIntegration, create_default_schema
16
+
17
+
18
+ class CausalRelationType(Enum):
19
+ """Types of causal relationships."""
20
+ DIRECT = "direct"
21
+ INDIRECT = "indirect"
22
+ CONFOUNDING = "confounding"
23
+ MEDIATING = "mediating"
24
+ MODERATING = "moderating"
25
+
26
+
27
+ class CausalAgentTemplate(BaseSpecializedAgent):
28
+ """
29
+ Example causal reasoning agent using the template framework.
30
+
31
+ This demonstrates the pattern for creating specialized agents:
32
+ 1. Inherit from BaseSpecializedAgent
33
+ 2. Use composition with extracted modules
34
+ 3. Implement domain-specific methods
35
+ """
36
+
37
+ def __init__(
38
+ self,
39
+ variables: Optional[List[str]] = None,
40
+ causal_edges: Optional[List[Tuple[str, str]]] = None,
41
+ max_loops: Optional[Union[int, str]] = 3,
42
+ agent_name: str = "causal-agent",
43
+ agent_description: str = "Causal Reasoning Agent",
44
+ model_name: str = "gpt-4o",
45
+ use_nonlinear: bool = True,
46
+ **kwargs,
47
+ ):
48
+ """
49
+ Initialize the causal agent.
50
+
51
+ Args:
52
+ variables: List of variable names
53
+ causal_edges: List of (source, target) edge tuples
54
+ max_loops: Maximum reasoning loops
55
+ agent_name: Agent identifier
56
+ agent_description: Agent description
57
+ model_name: LLM model name
58
+ use_nonlinear: Whether to use nonlinear prediction
59
+ **kwargs: Additional arguments
60
+ """
61
+ # Initialize base class
62
+ super().__init__(
63
+ max_loops=max_loops,
64
+ agent_name=agent_name,
65
+ agent_description=agent_description,
66
+ model_name=model_name,
67
+ **kwargs,
68
+ )
69
+
70
+ # Initialize graph manager
71
+ self.graph_manager = GraphManager(graph_type="causal")
72
+
73
+ # Initialize prediction framework
74
+ self.prediction_framework = PredictionFramework(
75
+ graph_manager=self.graph_manager,
76
+ use_nonlinear=use_nonlinear,
77
+ )
78
+
79
+ # Initialize statistical methods
80
+ self.statistical_methods = StatisticalMethods(
81
+ graph_manager=self.graph_manager,
82
+ prediction_framework=self.prediction_framework,
83
+ standardization_stats=self.prediction_framework.standardization_stats,
84
+ )
85
+
86
+ # Initialize LLM integration
87
+ self.llm_integration = LLMIntegration(
88
+ agent=self,
89
+ max_loops=self.domain_max_loops if isinstance(self.domain_max_loops, int) else 3,
90
+ )
91
+
92
+ # Add variables and edges
93
+ if variables:
94
+ self.graph_manager.add_nodes_from(variables)
95
+
96
+ if causal_edges:
97
+ for source, target in causal_edges:
98
+ self.add_causal_relationship(source, target)
99
+
100
+ def _get_domain_schema(self) -> Optional[Dict[str, Any]]:
101
+ """Return the causal analysis schema."""
102
+ return create_default_schema(
103
+ function_name="generate_causal_analysis",
104
+ description="Generates structured causal reasoning and counterfactual analysis",
105
+ properties={
106
+ "causal_analysis": {
107
+ "type": "string",
108
+ "description": "Analysis of causal relationships and mechanisms"
109
+ },
110
+ "intervention_planning": {
111
+ "type": "string",
112
+ "description": "Planned interventions to test causal hypotheses"
113
+ },
114
+ "counterfactual_scenarios": {
115
+ "type": "array",
116
+ "items": {
117
+ "type": "object",
118
+ "properties": {
119
+ "scenario_name": {"type": "string"},
120
+ "interventions": {"type": "object"},
121
+ "expected_outcomes": {"type": "object"},
122
+ "reasoning": {"type": "string"}
123
+ }
124
+ },
125
+ "description": "Multiple counterfactual scenarios to explore"
126
+ },
127
+ "causal_strength_assessment": {
128
+ "type": "string",
129
+ "description": "Assessment of causal relationship strengths and confounders"
130
+ },
131
+ "optimal_solution": {
132
+ "type": "string",
133
+ "description": "Recommended optimal solution based on causal analysis"
134
+ }
135
+ },
136
+ required=[
137
+ "causal_analysis",
138
+ "intervention_planning",
139
+ "counterfactual_scenarios",
140
+ "causal_strength_assessment",
141
+ "optimal_solution"
142
+ ]
143
+ )
144
+
145
+ def _build_domain_prompt(self, task: str) -> str:
146
+ """Build a causal reasoning prompt."""
147
+ return (
148
+ f"You are a Causal Reasoning with Counterfactual Analysis (CR-CA) agent.\n"
149
+ f"Problem: {task}\n"
150
+ f"Current causal graph has {len(self.graph_manager.get_nodes())} variables and "
151
+ f"{len(self.graph_manager.get_edges())} relationships.\n"
152
+ )
153
+
154
+ def _domain_specific_setup(self) -> None:
155
+ """Set up domain-specific attributes."""
156
+ # Causal-specific setup can go here
157
+ pass
158
+
159
+ def add_causal_relationship(
160
+ self,
161
+ source: str,
162
+ target: str,
163
+ strength: float = 1.0,
164
+ relation_type: CausalRelationType = CausalRelationType.DIRECT,
165
+ confidence: float = 1.0
166
+ ) -> None:
167
+ """Add a causal relationship."""
168
+ self.graph_manager.add_relationship(
169
+ source=source,
170
+ target=target,
171
+ strength=strength,
172
+ relation_type=relation_type,
173
+ confidence=confidence,
174
+ )
175
+
176
+ def predict_outcomes(
177
+ self,
178
+ factual_state: Dict[str, float],
179
+ interventions: Dict[str, float]
180
+ ) -> Dict[str, float]:
181
+ """Predict outcomes given state and interventions."""
182
+ return self.prediction_framework.predict_outcomes(factual_state, interventions)
183
+
184
+ def generate_counterfactual_scenarios(
185
+ self,
186
+ factual_state: Dict[str, float],
187
+ target_variables: List[str],
188
+ max_scenarios: int = 5
189
+ ) -> List[CounterfactualScenario]:
190
+ """Generate counterfactual scenarios."""
191
+ return self.prediction_framework.generate_counterfactual_scenarios(
192
+ factual_state, target_variables, max_scenarios
193
+ )
194
+
195
+ def run(
196
+ self,
197
+ task: Optional[Union[str, Any]] = None,
198
+ initial_state: Optional[Any] = None,
199
+ target_variables: Optional[List[str]] = None,
200
+ max_steps: Union[int, str] = 1,
201
+ **kwargs,
202
+ ) -> Dict[str, Any]:
203
+ """
204
+ Run the agent with either LLM analysis or state evolution.
205
+
206
+ Args:
207
+ task: Task string for LLM analysis, or state dict
208
+ initial_state: Initial state dictionary
209
+ target_variables: Target variables for counterfactuals
210
+ max_steps: Maximum evolution steps
211
+ **kwargs: Additional arguments
212
+
213
+ Returns:
214
+ Dictionary with results
215
+ """
216
+ # LLM-based analysis
217
+ if task is not None and isinstance(task, str) and initial_state is None and not task.strip().startswith('{'):
218
+ return self.llm_integration.run_llm_domain_analysis(
219
+ task,
220
+ build_prompt_fn=self._build_domain_prompt,
221
+ post_process_fn=self._post_process_llm_results,
222
+ )
223
+
224
+ # State evolution
225
+ if task is not None and initial_state is None:
226
+ initial_state = task
227
+
228
+ if not isinstance(initial_state, dict):
229
+ try:
230
+ import json
231
+ parsed = json.loads(initial_state)
232
+ if isinstance(parsed, dict):
233
+ initial_state = parsed
234
+ else:
235
+ return {"error": "initial_state JSON must decode to a dict"}
236
+ except Exception:
237
+ return {"error": "initial_state must be a dict or JSON-encoded dict"}
238
+
239
+ if target_variables is None:
240
+ target_variables = self.graph_manager.get_nodes()
241
+
242
+ def _resolve_max_steps(value: Union[int, str]) -> int:
243
+ if isinstance(value, str) and value == "auto":
244
+ return max(1, len(self.graph_manager.get_nodes()))
245
+ try:
246
+ return int(value)
247
+ except Exception:
248
+ return max(1, len(self.graph_manager.get_nodes()))
249
+
250
+ effective_steps = _resolve_max_steps(max_steps)
251
+ current_state = initial_state.copy()
252
+ for step in range(effective_steps):
253
+ current_state = self.prediction_framework.predict_outcomes(current_state, {})
254
+
255
+ self.prediction_framework.ensure_standardization_stats(current_state)
256
+ counterfactual_scenarios = self.generate_counterfactual_scenarios(
257
+ current_state,
258
+ target_variables,
259
+ max_scenarios=5
260
+ )
261
+
262
+ return {
263
+ "initial_state": initial_state,
264
+ "evolved_state": current_state,
265
+ "counterfactual_scenarios": counterfactual_scenarios,
266
+ "graph_info": {
267
+ "nodes": self.graph_manager.get_nodes(),
268
+ "edges": self.graph_manager.get_edges(),
269
+ "is_dag": self.graph_manager.is_dag()
270
+ },
271
+ "steps": effective_steps
272
+ }
273
+
274
+ def _post_process_llm_results(self, results: Dict[str, Any]) -> Dict[str, Any]:
275
+ """Post-process LLM analysis results."""
276
+ default_state = {var: 0.0 for var in self.graph_manager.get_nodes()}
277
+ self.prediction_framework.ensure_standardization_stats(default_state)
278
+ counterfactual_scenarios = self.generate_counterfactual_scenarios(
279
+ default_state,
280
+ self.graph_manager.get_nodes()[:5],
281
+ max_scenarios=5
282
+ )
283
+ results['counterfactual_scenarios'] = counterfactual_scenarios
284
+ results['graph_info'] = {
285
+ 'nodes': self.graph_manager.get_nodes(),
286
+ 'edges': self.graph_manager.get_edges(),
287
+ 'is_dag': self.graph_manager.is_dag()
288
+ }
289
+ return results
290
+
291
+ # Convenience methods that delegate to modules
292
+ def get_nodes(self) -> List[str]:
293
+ """Get all nodes."""
294
+ return self.graph_manager.get_nodes()
295
+
296
+ def get_edges(self) -> List[Tuple[str, str]]:
297
+ """Get all edges."""
298
+ return self.graph_manager.get_edges()
299
+
300
+ def is_dag(self) -> bool:
301
+ """Check if graph is a DAG."""
302
+ return self.graph_manager.is_dag()
303
+
304
+ def fit_from_dataframe(self, df: Any, variables: List[str], **kwargs) -> None:
305
+ """Fit model from dataframe."""
306
+ self.statistical_methods.fit_from_dataframe(df, variables, **kwargs)
307
+ # Update prediction framework stats
308
+ self.prediction_framework.standardization_stats = self.statistical_methods.standardization_stats
309
+