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
utils/formatter.py ADDED
@@ -0,0 +1,474 @@
1
+ """
2
+ Rich text formatting and console output utilities.
3
+
4
+ This module provides classes and functions for formatting and displaying
5
+ rich text content in terminal environments using the Rich library.
6
+ Supports markdown rendering, syntax highlighting, streaming output,
7
+ and interactive dashboards.
8
+ """
9
+
10
+ import random
11
+ import re
12
+ import time
13
+ from typing import Any, Callable, Dict, List, Optional
14
+
15
+ from rich.console import Console, Group
16
+ from rich.live import Live
17
+ from rich.markdown import Markdown
18
+ from rich.panel import Panel
19
+ from rich.progress import Progress, SpinnerColumn, TextColumn
20
+ from rich.syntax import Syntax
21
+ from rich.table import Table
22
+ from rich.text import Text
23
+ from rich.tree import Tree
24
+
25
+
26
+ def _choose_random_color() -> str:
27
+ """Select a random color from available Rich color palette.
28
+
29
+ Returns:
30
+ str: Color name suitable for Rich styling.
31
+ """
32
+ return random.choice(["red", "green", "blue", "yellow", "magenta", "cyan", "white"])
33
+
34
+
35
+ class MarkdownOutputHandler:
36
+ """Handler for rendering markdown content with syntax highlighting.
37
+
38
+ Processes markdown text, extracts code blocks, and renders them
39
+ with appropriate syntax highlighting using Rich components.
40
+ """
41
+
42
+ # Compiled regex patterns for log cleaning
43
+ _LOG_PATTERNS = [
44
+ (re.compile(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \| (INFO|DEBUG|WARNING|ERROR).*?\|.*?\|"), ""),
45
+ (re.compile(r"INFO.*?\|.*?\|.*?\|"), ""),
46
+ (re.compile(r"DEBUG.*?\|.*?\|.*?\|"), ""),
47
+ (re.compile(r"WARNING.*?\|.*?\|.*?\|"), ""),
48
+ (re.compile(r"ERROR.*?\|.*?\|.*?\|"), ""),
49
+ ]
50
+
51
+ _SPINNER_CHARS = "[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]"
52
+ _SPINNER_PATTERNS = [
53
+ (re.compile(_SPINNER_CHARS), ""),
54
+ (re.compile(rf"{_SPINNER_CHARS} Processing\.\.\."), ""),
55
+ (re.compile(rf"{_SPINNER_CHARS} Loop \d+/\d+"), ""),
56
+ ]
57
+
58
+ _ARTIFACT_PATTERNS = [
59
+ (re.compile(r"Generated content:"), ""),
60
+ (re.compile(r"Evaluation result:"), ""),
61
+ (re.compile(r"Refined content:"), ""),
62
+ ]
63
+
64
+ _CODE_BLOCK_PATTERN = re.compile(r"```(?P<lang>\w+)?\n(?P<code>.*?)\n```", re.DOTALL | re.MULTILINE)
65
+
66
+ def __init__(self, console: Console) -> None:
67
+ """Initialize handler with console instance.
68
+
69
+ Args:
70
+ console: Rich console instance for rendering output.
71
+ """
72
+ self.console = console
73
+
74
+ def _clean_output(self, output: str) -> str:
75
+ """Remove log artifacts and normalize whitespace.
76
+
77
+ Args:
78
+ output: Raw output string to clean.
79
+
80
+ Returns:
81
+ Cleaned output string with normalized formatting.
82
+ """
83
+ if not output:
84
+ return ""
85
+
86
+ # Remove log prefixes and timestamps
87
+ for pattern, replacement in self._LOG_PATTERNS:
88
+ output = pattern.sub(replacement, output)
89
+
90
+ # Remove spinner characters and progress indicators
91
+ for pattern, replacement in self._SPINNER_PATTERNS:
92
+ output = pattern.sub(replacement, output)
93
+
94
+ # Remove artifact markers
95
+ for pattern, replacement in self._ARTIFACT_PATTERNS:
96
+ output = pattern.sub(replacement, output)
97
+
98
+ # Normalize whitespace
99
+ output = re.sub(r"\n\s*\n\s*\n", "\n\n", output)
100
+ output = re.sub(r"^\s+", "", output, flags=re.MULTILINE)
101
+ output = re.sub(r"\s+$", "", output, flags=re.MULTILINE)
102
+
103
+ # Ensure proper markdown header formatting
104
+ lines = output.strip().split("\n")
105
+ if lines and not any(line.strip().startswith("#") for line in lines[:3]):
106
+ first_line = lines[0].strip()
107
+ if (first_line and len(first_line) < 100 and
108
+ not first_line.startswith(("**", "#", "-", "*", ">", "```")) and
109
+ (not first_line.endswith((",", ".", ":", ";")) or first_line.endswith(":"))):
110
+ output = f"## {first_line}\n\n" + "\n".join(lines[1:])
111
+ else:
112
+ output = "\n".join(lines)
113
+
114
+ return output.strip()
115
+
116
+ def _parse_content_parts(self, content: str) -> List[tuple]:
117
+ """Parse content into markdown and code block parts.
118
+
119
+ Args:
120
+ content: Content string to parse.
121
+
122
+ Returns:
123
+ List of (type, content) tuples where type is 'markdown' or 'code'.
124
+ """
125
+ parts = []
126
+ current_pos = 0
127
+
128
+ for match in self._CODE_BLOCK_PATTERN.finditer(content):
129
+ if match.start() > current_pos:
130
+ markdown_content = content[current_pos:match.start()].strip()
131
+ if markdown_content:
132
+ parts.append(("markdown", markdown_content))
133
+
134
+ lang = match.group("lang") or "text"
135
+ code = match.group("code")
136
+ parts.append(("code", (lang, code)))
137
+ current_pos = match.end()
138
+
139
+ if current_pos < len(content):
140
+ remaining = content[current_pos:].strip()
141
+ if remaining:
142
+ parts.append(("markdown", remaining))
143
+
144
+ return parts if parts else [("markdown", content)]
145
+
146
+ def _render_content_parts(self, parts: List[tuple]) -> List[Any]:
147
+ """Render parsed content parts as Rich objects.
148
+
149
+ Args:
150
+ parts: List of (type, content) tuples from _parse_content_parts.
151
+
152
+ Returns:
153
+ List of Rich renderable objects.
154
+ """
155
+ rendered = []
156
+
157
+ for part_type, content in parts:
158
+ if part_type == "markdown":
159
+ try:
160
+ rendered.append(Markdown(content, code_theme="monokai"))
161
+ except Exception:
162
+ rendered.append(Text(content, style="white"))
163
+ elif part_type == "code":
164
+ lang, code = content
165
+ try:
166
+ rendered.append(Syntax(code, lang, theme="monokai", line_numbers=True, word_wrap=True))
167
+ except Exception:
168
+ rendered.append(Text(f"```{lang}\n{code}\n```", style="white on grey23"))
169
+
170
+ return rendered
171
+
172
+ def render_markdown_output(self, content: str, title: str = "", border_style: str = "blue") -> None:
173
+ """Render markdown content with syntax highlighting.
174
+
175
+ Args:
176
+ content: Markdown content string to render.
177
+ title: Panel title text.
178
+ border_style: Border style for the panel.
179
+ """
180
+ if not content or not content.strip():
181
+ return
182
+
183
+ cleaned = self._clean_output(content)
184
+
185
+ try:
186
+ parts = self._parse_content_parts(cleaned)
187
+ rendered = self._render_content_parts(parts)
188
+
189
+ if rendered:
190
+ self.console.print(Panel(Group(*rendered), title=title, border_style=border_style, padding=(1, 2), expand=False))
191
+ else:
192
+ self.console.print(Panel(Text("No content to display", style="dim italic"), title=title, border_style="yellow"))
193
+ except Exception as e:
194
+ fallback_title = f"{title} [dim](fallback mode)[/dim]" if title else "Content (fallback mode)"
195
+ self.console.print(Panel(cleaned, title=fallback_title, border_style="yellow", subtitle=f"Markdown rendering error: {str(e)}", subtitle_align="left"))
196
+
197
+
198
+ class Formatter:
199
+ """Rich text formatter for console output.
200
+
201
+ Provides methods for displaying formatted text, tables, progress indicators,
202
+ streaming content, and interactive dashboards in terminal environments.
203
+ """
204
+
205
+ _SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
206
+ _STATUS_STYLES = {
207
+ "completed": ("bold green", "✓"),
208
+ "pending": ("bold red", "○"),
209
+ "error": ("bold red", "✗"),
210
+ }
211
+ _PRIORITY_COLORS = {"critical": "red", "high": "yellow", "medium": "blue", "low": "green"}
212
+ _PRIORITY_ICONS = {"critical": "🔴", "high": "🟠", "medium": "🟡", "low": "🟢"}
213
+
214
+ def __init__(self, md: bool = True) -> None:
215
+ """Initialize formatter with optional markdown support.
216
+
217
+ Args:
218
+ md: Enable markdown output rendering. Defaults to True.
219
+ """
220
+ self.console = Console()
221
+ self._dashboard_live: Optional[Live] = None
222
+ self._spinner_idx = 0
223
+ self.markdown_handler = MarkdownOutputHandler(self.console) if md else None
224
+
225
+ def _get_status_text(self, status: str) -> Text:
226
+ """Generate status text with loading animation for running status.
227
+
228
+ Args:
229
+ status: Status string to format.
230
+
231
+ Returns:
232
+ Formatted Text object with appropriate styling.
233
+ """
234
+ if status.lower() == "running":
235
+ self._spinner_idx = (self._spinner_idx + 1) % len(self._SPINNER_FRAMES)
236
+ spinner_char = self._SPINNER_FRAMES[self._spinner_idx]
237
+ progress_bar = "█" * (self._spinner_idx % 5) + "░" * (4 - (self._spinner_idx % 5))
238
+ return Text(f"{spinner_char} {status} {progress_bar}", style="bold yellow")
239
+
240
+ style, symbol = self._STATUS_STYLES.get(status.lower(), ("white", "•"))
241
+ return Text(f"{symbol} {status}", style=style)
242
+
243
+ def print_panel(self, content: str, title: str = "", style: str = "bold blue") -> None:
244
+ """Display content in a styled panel.
245
+
246
+ Args:
247
+ content: Content string to display.
248
+ title: Panel title text.
249
+ style: Panel border style.
250
+ """
251
+ if content is None:
252
+ content = "No content to display"
253
+ if not isinstance(content, str):
254
+ content = str(content)
255
+
256
+ if self.markdown_handler:
257
+ self.markdown_handler.render_markdown_output(content, title, style)
258
+ else:
259
+ try:
260
+ color = _choose_random_color()
261
+ self.console.print(Panel(content, title=title, style=f"bold {color}"))
262
+ except Exception:
263
+ print(f"\n{title}:\n{content}")
264
+
265
+ def print_markdown(self, content: str, title: str = "", border_style: str = "blue") -> None:
266
+ """Display markdown content with syntax highlighting.
267
+
268
+ Args:
269
+ content: Markdown content string.
270
+ title: Panel title text.
271
+ border_style: Panel border style.
272
+ """
273
+ if self.markdown_handler:
274
+ self.markdown_handler.render_markdown_output(content, title, border_style)
275
+ else:
276
+ self.print_panel(content, title, border_style)
277
+
278
+ def print_table(self, title: str, data: Dict[str, List[str]]) -> None:
279
+ """Display data in a formatted table.
280
+
281
+ Args:
282
+ title: Table title text.
283
+ data: Dictionary mapping categories to lists of items.
284
+ """
285
+ table = Table(show_header=True, header_style="bold magenta")
286
+ table.add_column("Category", style="cyan")
287
+ table.add_column("Capabilities", style="green")
288
+
289
+ for category, items in data.items():
290
+ table.add_row(category, "\n".join(items))
291
+
292
+ self.console.print(f"\n🔥 {title}:", style="bold yellow")
293
+ self.console.print(table)
294
+
295
+ def print_progress(self, description: str, task_fn: Callable, *args: Any, **kwargs: Any) -> Any:
296
+ """Execute task with progress indicator.
297
+
298
+ Args:
299
+ description: Progress description text.
300
+ task_fn: Callable to execute.
301
+ *args: Positional arguments for task_fn.
302
+ **kwargs: Keyword arguments for task_fn.
303
+
304
+ Returns:
305
+ Result from task_fn execution.
306
+ """
307
+ with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
308
+ task = progress.add_task(description, total=None)
309
+ result = task_fn(*args, **kwargs)
310
+ progress.update(task, completed=True)
311
+ return result
312
+
313
+ def print_panel_token_by_token(self, tokens: str, title: str = "Output", style: str = "bold cyan",
314
+ delay: float = 0.01, by_word: bool = False) -> None:
315
+ """Display text incrementally, token by token.
316
+
317
+ Args:
318
+ tokens: Text string to display incrementally.
319
+ title: Panel title text.
320
+ style: Panel border style.
321
+ delay: Delay in seconds between tokens.
322
+ by_word: If True, display by words; otherwise by characters.
323
+ """
324
+ text = Text(style=style)
325
+ token_list = tokens.split() if by_word else tokens
326
+
327
+ with Live(Panel(text, title=title, border_style=style), console=self.console, refresh_per_second=10) as live:
328
+ for token in token_list:
329
+ text.append(token + (" " if by_word else ""))
330
+ live.update(Panel(text, title=title, border_style=style))
331
+ time.sleep(delay)
332
+
333
+ def print_streaming_panel(self, streaming_response: Any, title: str = "Agent Streaming Response",
334
+ style: Optional[str] = None, collect_chunks: bool = False,
335
+ on_chunk_callback: Optional[Callable] = None) -> str:
336
+ """Display real-time streaming response with live updates.
337
+
338
+ Args:
339
+ streaming_response: Streaming response generator.
340
+ title: Panel title text.
341
+ style: Panel border style (random if None).
342
+ collect_chunks: Whether to collect individual chunks.
343
+ on_chunk_callback: Optional callback for each chunk.
344
+
345
+ Returns:
346
+ Complete accumulated response text.
347
+ """
348
+ panel_style = f"bold {_choose_random_color()}" if style is None else style
349
+
350
+ def _create_panel(text_obj: Text, is_complete: bool = False) -> Panel:
351
+ panel_title = f"[white]{title}[/white]"
352
+ if is_complete:
353
+ panel_title += " [bold green]✅[/bold green]"
354
+
355
+ display_text = Text.from_markup("")
356
+ display_text.append_text(text_obj)
357
+ if not is_complete:
358
+ display_text.append("▊", style="bold green blink")
359
+
360
+ return Panel(display_text, title=panel_title, border_style=panel_style, padding=(1, 2), width=self.console.size.width)
361
+
362
+ streaming_text = Text()
363
+ complete_response = ""
364
+
365
+ with Live(_create_panel(streaming_text), console=self.console, refresh_per_second=20) as live:
366
+ try:
367
+ for part in streaming_response:
368
+ if hasattr(part, "choices") and part.choices and part.choices[0].delta.content:
369
+ chunk = part.choices[0].delta.content
370
+ streaming_text.append(chunk, style="white")
371
+ complete_response += chunk
372
+
373
+ if collect_chunks:
374
+ pass # Chunks collected in complete_response
375
+ if on_chunk_callback:
376
+ on_chunk_callback(chunk)
377
+
378
+ live.update(_create_panel(streaming_text, is_complete=False))
379
+
380
+ live.update(_create_panel(streaming_text, is_complete=True))
381
+ except Exception as e:
382
+ streaming_text.append(f"\n[Error: {str(e)}]", style="bold red")
383
+ live.update(_create_panel(streaming_text, is_complete=True))
384
+
385
+ return complete_response
386
+
387
+ def _create_dashboard_table(self, agents_data: List[Dict[str, Any]], title: str) -> Panel:
388
+ """Create dashboard table with agent status information.
389
+
390
+ Args:
391
+ agents_data: List of agent information dictionaries.
392
+ title: Dashboard title text.
393
+
394
+ Returns:
395
+ Panel containing formatted table.
396
+ """
397
+ table = Table(show_header=True, header_style="bold magenta", expand=True, title=title,
398
+ title_style="bold cyan", border_style="bright_blue", show_lines=True)
399
+ table.add_column("Agent Name", style="cyan", width=30, no_wrap=True)
400
+ table.add_column("Status", style="green", width=20, no_wrap=True)
401
+ table.add_column("Output", style="white", width=100, overflow="fold")
402
+
403
+ for agent in agents_data:
404
+ table.add_row(Text(agent["name"], style="bold cyan"), self._get_status_text(agent["status"]), Text(str(agent["output"])))
405
+
406
+ return Panel(table, border_style="bright_blue", padding=(1, 2),
407
+ title=f"[bold cyan]{title}[/bold cyan] - Total Agents: [bold green]{len(agents_data)}[/bold green]", expand=True)
408
+
409
+ def print_agent_dashboard(self, agents_data: List[Dict[str, Any]], title: str = "Concurrent Workflow Dashboard",
410
+ is_final: bool = False) -> None:
411
+ """Display interactive agent dashboard with live updates.
412
+
413
+ Args:
414
+ agents_data: List of agent information dictionaries.
415
+ title: Dashboard title text.
416
+ is_final: Whether this is the final update.
417
+ """
418
+ if self._dashboard_live is None:
419
+ self._dashboard_live = Live(self._create_dashboard_table(agents_data, title), console=self.console,
420
+ refresh_per_second=10, transient=False)
421
+ self._dashboard_live.start()
422
+ else:
423
+ self._dashboard_live.update(self._create_dashboard_table(agents_data, title))
424
+ if is_final:
425
+ self.console.print()
426
+
427
+ def stop_dashboard(self) -> None:
428
+ """Stop and cleanup dashboard display."""
429
+ if self._dashboard_live is not None:
430
+ self._dashboard_live.stop()
431
+ self.console.print()
432
+ self._dashboard_live = None
433
+
434
+ def print_plan_tree(self, task_description: str, steps: List[Dict[str, Any]], print_on: bool = True) -> None:
435
+ """Display task plan as hierarchical tree structure.
436
+
437
+ Args:
438
+ task_description: Main task description text.
439
+ steps: List of step dictionaries with step_id, description, priority, and optional dependencies.
440
+ print_on: Whether to print to console or just log.
441
+ """
442
+ import logging
443
+ logger = logging.getLogger(__name__)
444
+
445
+ tree = Tree(f"[bold cyan]📋 Plan: {task_description}[/bold cyan]")
446
+ step_nodes = {}
447
+
448
+ for step in steps:
449
+ step_id = step.get("step_id", "")
450
+ description = step.get("description", "")
451
+ priority = step.get("priority", "medium").lower()
452
+ dependencies = step.get("dependencies", [])
453
+
454
+ priority_color = self._PRIORITY_COLORS.get(priority, "white")
455
+ priority_icon = self._PRIORITY_ICONS.get(priority, "○")
456
+
457
+ step_label = f"[{priority_color}]{priority_icon} {step_id}[/{priority_color}]: {description}"
458
+ if dependencies:
459
+ step_label += f" [dim](depends on: {', '.join(dependencies)})[/dim]"
460
+
461
+ step_nodes[step_id] = tree.add(step_label)
462
+
463
+ if print_on:
464
+ self.console.print("\n")
465
+ self.console.print(tree)
466
+ self.console.print("")
467
+ else:
468
+ logger.info(f"Plan created: {task_description}")
469
+ for step in steps:
470
+ logger.info(f" - {step.get('step_id')} ({step.get('priority')}): {step.get('description')}")
471
+
472
+
473
+ # Global formatter instance with markdown disabled by default
474
+ formatter = Formatter(md=False)