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.
- .github/ISSUE_TEMPLATE/bug_report.md +65 -0
- .github/ISSUE_TEMPLATE/feature_request.md +41 -0
- .github/PULL_REQUEST_TEMPLATE.md +20 -0
- .github/workflows/publish-manual.yml +61 -0
- .github/workflows/publish.yml +64 -0
- .gitignore +214 -0
- CRCA.py +4156 -0
- LICENSE +201 -0
- MANIFEST.in +43 -0
- PKG-INFO +5035 -0
- README.md +4959 -0
- __init__.py +17 -0
- branches/CRCA-Q.py +2728 -0
- branches/crca_cg/corposwarm.py +9065 -0
- branches/crca_cg/fix_rancher_docker_creds.ps1 +155 -0
- branches/crca_cg/package.json +5 -0
- branches/crca_cg/test_bolt_integration.py +446 -0
- branches/crca_cg/test_corposwarm_comprehensive.py +773 -0
- branches/crca_cg/test_new_features.py +163 -0
- branches/crca_sd/__init__.py +149 -0
- branches/crca_sd/crca_sd_core.py +770 -0
- branches/crca_sd/crca_sd_governance.py +1325 -0
- branches/crca_sd/crca_sd_mpc.py +1130 -0
- branches/crca_sd/crca_sd_realtime.py +1844 -0
- branches/crca_sd/crca_sd_tui.py +1133 -0
- crca-1.4.0.dist-info/METADATA +5035 -0
- crca-1.4.0.dist-info/RECORD +501 -0
- crca-1.4.0.dist-info/WHEEL +4 -0
- crca-1.4.0.dist-info/licenses/LICENSE +201 -0
- docs/CRCA-Q.md +2333 -0
- examples/config.yaml.example +25 -0
- examples/crca_sd_example.py +513 -0
- examples/data_broker_example.py +294 -0
- examples/logistics_corporation.py +861 -0
- examples/palantir_example.py +299 -0
- examples/policy_bench.py +934 -0
- examples/pridnestrovia-sd.py +705 -0
- examples/pridnestrovia_realtime.py +1902 -0
- prompts/__init__.py +10 -0
- prompts/default_crca.py +101 -0
- pyproject.toml +151 -0
- requirements.txt +76 -0
- schemas/__init__.py +43 -0
- schemas/mcpSchemas.py +51 -0
- schemas/policy.py +458 -0
- templates/__init__.py +38 -0
- templates/base_specialized_agent.py +195 -0
- templates/drift_detection.py +325 -0
- templates/examples/causal_agent_template.py +309 -0
- templates/examples/drag_drop_example.py +213 -0
- templates/examples/logistics_agent_template.py +207 -0
- templates/examples/trading_agent_template.py +206 -0
- templates/feature_mixins.py +253 -0
- templates/graph_management.py +442 -0
- templates/llm_integration.py +194 -0
- templates/module_registry.py +276 -0
- templates/mpc_planner.py +280 -0
- templates/policy_loop.py +1168 -0
- templates/prediction_framework.py +448 -0
- templates/statistical_methods.py +778 -0
- tests/sanity.yml +31 -0
- tests/sanity_check +406 -0
- tests/test_core.py +47 -0
- tests/test_crca_excel.py +166 -0
- tests/test_crca_sd.py +780 -0
- tests/test_data_broker.py +424 -0
- tests/test_palantir.py +349 -0
- tools/__init__.py +38 -0
- tools/actuators.py +437 -0
- tools/bolt.diy/Dockerfile +103 -0
- tools/bolt.diy/app/components/@settings/core/AvatarDropdown.tsx +175 -0
- tools/bolt.diy/app/components/@settings/core/ControlPanel.tsx +345 -0
- tools/bolt.diy/app/components/@settings/core/constants.tsx +108 -0
- tools/bolt.diy/app/components/@settings/core/types.ts +114 -0
- tools/bolt.diy/app/components/@settings/index.ts +12 -0
- tools/bolt.diy/app/components/@settings/shared/components/TabTile.tsx +151 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/ConnectionForm.tsx +193 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/ConnectionTestIndicator.tsx +60 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/ErrorState.tsx +102 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/LoadingState.tsx +94 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/ServiceHeader.tsx +72 -0
- tools/bolt.diy/app/components/@settings/shared/service-integration/index.ts +6 -0
- tools/bolt.diy/app/components/@settings/tabs/data/DataTab.tsx +721 -0
- tools/bolt.diy/app/components/@settings/tabs/data/DataVisualization.tsx +384 -0
- tools/bolt.diy/app/components/@settings/tabs/event-logs/EventLogsTab.tsx +1013 -0
- tools/bolt.diy/app/components/@settings/tabs/features/FeaturesTab.tsx +295 -0
- tools/bolt.diy/app/components/@settings/tabs/github/GitHubTab.tsx +281 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubAuthDialog.tsx +173 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubCacheManager.tsx +367 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubConnection.tsx +233 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubErrorBoundary.tsx +105 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubProgressiveLoader.tsx +266 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubRepositoryCard.tsx +121 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubRepositorySelector.tsx +312 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubStats.tsx +291 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/GitHubUserProfile.tsx +46 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/shared/GitHubStateIndicators.tsx +264 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/shared/RepositoryCard.tsx +361 -0
- tools/bolt.diy/app/components/@settings/tabs/github/components/shared/index.ts +11 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/GitLabTab.tsx +305 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/GitLabAuthDialog.tsx +186 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/GitLabConnection.tsx +253 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/GitLabRepositorySelector.tsx +358 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/RepositoryCard.tsx +79 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/RepositoryList.tsx +142 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/StatsDisplay.tsx +91 -0
- tools/bolt.diy/app/components/@settings/tabs/gitlab/components/index.ts +4 -0
- tools/bolt.diy/app/components/@settings/tabs/mcp/McpServerList.tsx +99 -0
- tools/bolt.diy/app/components/@settings/tabs/mcp/McpServerListItem.tsx +70 -0
- tools/bolt.diy/app/components/@settings/tabs/mcp/McpStatusBadge.tsx +37 -0
- tools/bolt.diy/app/components/@settings/tabs/mcp/McpTab.tsx +239 -0
- tools/bolt.diy/app/components/@settings/tabs/netlify/NetlifyTab.tsx +1393 -0
- tools/bolt.diy/app/components/@settings/tabs/netlify/components/NetlifyConnection.tsx +990 -0
- tools/bolt.diy/app/components/@settings/tabs/netlify/components/index.ts +1 -0
- tools/bolt.diy/app/components/@settings/tabs/notifications/NotificationsTab.tsx +300 -0
- tools/bolt.diy/app/components/@settings/tabs/profile/ProfileTab.tsx +181 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/cloud/CloudProvidersTab.tsx +308 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/ErrorBoundary.tsx +68 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/HealthStatusBadge.tsx +64 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/LoadingSkeleton.tsx +107 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/LocalProvidersTab.tsx +556 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/ModelCard.tsx +106 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/ProviderCard.tsx +120 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/SetupGuide.tsx +671 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/StatusDashboard.tsx +91 -0
- tools/bolt.diy/app/components/@settings/tabs/providers/local/types.ts +44 -0
- tools/bolt.diy/app/components/@settings/tabs/settings/SettingsTab.tsx +215 -0
- tools/bolt.diy/app/components/@settings/tabs/supabase/SupabaseTab.tsx +1089 -0
- tools/bolt.diy/app/components/@settings/tabs/vercel/VercelTab.tsx +909 -0
- tools/bolt.diy/app/components/@settings/tabs/vercel/components/VercelConnection.tsx +368 -0
- tools/bolt.diy/app/components/@settings/tabs/vercel/components/index.ts +1 -0
- tools/bolt.diy/app/components/@settings/utils/tab-helpers.ts +54 -0
- tools/bolt.diy/app/components/chat/APIKeyManager.tsx +169 -0
- tools/bolt.diy/app/components/chat/Artifact.tsx +296 -0
- tools/bolt.diy/app/components/chat/AssistantMessage.tsx +192 -0
- tools/bolt.diy/app/components/chat/BaseChat.module.scss +47 -0
- tools/bolt.diy/app/components/chat/BaseChat.tsx +522 -0
- tools/bolt.diy/app/components/chat/Chat.client.tsx +670 -0
- tools/bolt.diy/app/components/chat/ChatAlert.tsx +108 -0
- tools/bolt.diy/app/components/chat/ChatBox.tsx +334 -0
- tools/bolt.diy/app/components/chat/CodeBlock.module.scss +10 -0
- tools/bolt.diy/app/components/chat/CodeBlock.tsx +85 -0
- tools/bolt.diy/app/components/chat/DicussMode.tsx +17 -0
- tools/bolt.diy/app/components/chat/ExamplePrompts.tsx +37 -0
- tools/bolt.diy/app/components/chat/FilePreview.tsx +38 -0
- tools/bolt.diy/app/components/chat/GitCloneButton.tsx +327 -0
- tools/bolt.diy/app/components/chat/ImportFolderButton.tsx +141 -0
- tools/bolt.diy/app/components/chat/LLMApiAlert.tsx +109 -0
- tools/bolt.diy/app/components/chat/MCPTools.tsx +129 -0
- tools/bolt.diy/app/components/chat/Markdown.module.scss +171 -0
- tools/bolt.diy/app/components/chat/Markdown.spec.ts +48 -0
- tools/bolt.diy/app/components/chat/Markdown.tsx +252 -0
- tools/bolt.diy/app/components/chat/Messages.client.tsx +102 -0
- tools/bolt.diy/app/components/chat/ModelSelector.tsx +797 -0
- tools/bolt.diy/app/components/chat/NetlifyDeploymentLink.client.tsx +51 -0
- tools/bolt.diy/app/components/chat/ProgressCompilation.tsx +110 -0
- tools/bolt.diy/app/components/chat/ScreenshotStateManager.tsx +33 -0
- tools/bolt.diy/app/components/chat/SendButton.client.tsx +39 -0
- tools/bolt.diy/app/components/chat/SpeechRecognition.tsx +28 -0
- tools/bolt.diy/app/components/chat/StarterTemplates.tsx +38 -0
- tools/bolt.diy/app/components/chat/SupabaseAlert.tsx +199 -0
- tools/bolt.diy/app/components/chat/SupabaseConnection.tsx +339 -0
- tools/bolt.diy/app/components/chat/ThoughtBox.tsx +43 -0
- tools/bolt.diy/app/components/chat/ToolInvocations.tsx +409 -0
- tools/bolt.diy/app/components/chat/UserMessage.tsx +101 -0
- tools/bolt.diy/app/components/chat/VercelDeploymentLink.client.tsx +158 -0
- tools/bolt.diy/app/components/chat/chatExportAndImport/ExportChatButton.tsx +49 -0
- tools/bolt.diy/app/components/chat/chatExportAndImport/ImportButtons.tsx +96 -0
- tools/bolt.diy/app/components/deploy/DeployAlert.tsx +197 -0
- tools/bolt.diy/app/components/deploy/DeployButton.tsx +277 -0
- tools/bolt.diy/app/components/deploy/GitHubDeploy.client.tsx +171 -0
- tools/bolt.diy/app/components/deploy/GitHubDeploymentDialog.tsx +1041 -0
- tools/bolt.diy/app/components/deploy/GitLabDeploy.client.tsx +171 -0
- tools/bolt.diy/app/components/deploy/GitLabDeploymentDialog.tsx +764 -0
- tools/bolt.diy/app/components/deploy/NetlifyDeploy.client.tsx +246 -0
- tools/bolt.diy/app/components/deploy/VercelDeploy.client.tsx +235 -0
- tools/bolt.diy/app/components/editor/codemirror/BinaryContent.tsx +7 -0
- tools/bolt.diy/app/components/editor/codemirror/CodeMirrorEditor.tsx +555 -0
- tools/bolt.diy/app/components/editor/codemirror/EnvMasking.ts +80 -0
- tools/bolt.diy/app/components/editor/codemirror/cm-theme.ts +192 -0
- tools/bolt.diy/app/components/editor/codemirror/indent.ts +68 -0
- tools/bolt.diy/app/components/editor/codemirror/languages.ts +112 -0
- tools/bolt.diy/app/components/git/GitUrlImport.client.tsx +147 -0
- tools/bolt.diy/app/components/header/Header.tsx +42 -0
- tools/bolt.diy/app/components/header/HeaderActionButtons.client.tsx +54 -0
- tools/bolt.diy/app/components/mandate/MandateSubmission.tsx +167 -0
- tools/bolt.diy/app/components/observability/DeploymentStatus.tsx +168 -0
- tools/bolt.diy/app/components/observability/EventTimeline.tsx +119 -0
- tools/bolt.diy/app/components/observability/FileDiffViewer.tsx +121 -0
- tools/bolt.diy/app/components/observability/GovernanceStatus.tsx +197 -0
- tools/bolt.diy/app/components/observability/GovernorMetrics.tsx +246 -0
- tools/bolt.diy/app/components/observability/LogStream.tsx +244 -0
- tools/bolt.diy/app/components/observability/MandateDetails.tsx +201 -0
- tools/bolt.diy/app/components/observability/ObservabilityDashboard.tsx +200 -0
- tools/bolt.diy/app/components/sidebar/HistoryItem.tsx +187 -0
- tools/bolt.diy/app/components/sidebar/Menu.client.tsx +536 -0
- tools/bolt.diy/app/components/sidebar/date-binning.ts +59 -0
- tools/bolt.diy/app/components/txt +1 -0
- tools/bolt.diy/app/components/ui/BackgroundRays/index.tsx +18 -0
- tools/bolt.diy/app/components/ui/BackgroundRays/styles.module.scss +246 -0
- tools/bolt.diy/app/components/ui/Badge.tsx +53 -0
- tools/bolt.diy/app/components/ui/BranchSelector.tsx +270 -0
- tools/bolt.diy/app/components/ui/Breadcrumbs.tsx +101 -0
- tools/bolt.diy/app/components/ui/Button.tsx +46 -0
- tools/bolt.diy/app/components/ui/Card.tsx +55 -0
- tools/bolt.diy/app/components/ui/Checkbox.tsx +32 -0
- tools/bolt.diy/app/components/ui/CloseButton.tsx +49 -0
- tools/bolt.diy/app/components/ui/CodeBlock.tsx +103 -0
- tools/bolt.diy/app/components/ui/Collapsible.tsx +9 -0
- tools/bolt.diy/app/components/ui/ColorSchemeDialog.tsx +378 -0
- tools/bolt.diy/app/components/ui/Dialog.tsx +449 -0
- tools/bolt.diy/app/components/ui/Dropdown.tsx +63 -0
- tools/bolt.diy/app/components/ui/EmptyState.tsx +154 -0
- tools/bolt.diy/app/components/ui/FileIcon.tsx +346 -0
- tools/bolt.diy/app/components/ui/FilterChip.tsx +92 -0
- tools/bolt.diy/app/components/ui/GlowingEffect.tsx +192 -0
- tools/bolt.diy/app/components/ui/GradientCard.tsx +100 -0
- tools/bolt.diy/app/components/ui/IconButton.tsx +84 -0
- tools/bolt.diy/app/components/ui/Input.tsx +22 -0
- tools/bolt.diy/app/components/ui/Label.tsx +20 -0
- tools/bolt.diy/app/components/ui/LoadingDots.tsx +27 -0
- tools/bolt.diy/app/components/ui/LoadingOverlay.tsx +32 -0
- tools/bolt.diy/app/components/ui/PanelHeader.tsx +20 -0
- tools/bolt.diy/app/components/ui/PanelHeaderButton.tsx +36 -0
- tools/bolt.diy/app/components/ui/Popover.tsx +29 -0
- tools/bolt.diy/app/components/ui/Progress.tsx +22 -0
- tools/bolt.diy/app/components/ui/RepositoryStats.tsx +87 -0
- tools/bolt.diy/app/components/ui/ScrollArea.tsx +41 -0
- tools/bolt.diy/app/components/ui/SearchInput.tsx +80 -0
- tools/bolt.diy/app/components/ui/SearchResultItem.tsx +134 -0
- tools/bolt.diy/app/components/ui/Separator.tsx +22 -0
- tools/bolt.diy/app/components/ui/SettingsButton.tsx +35 -0
- tools/bolt.diy/app/components/ui/Slider.tsx +73 -0
- tools/bolt.diy/app/components/ui/StatusIndicator.tsx +90 -0
- tools/bolt.diy/app/components/ui/Switch.tsx +37 -0
- tools/bolt.diy/app/components/ui/Tabs.tsx +52 -0
- tools/bolt.diy/app/components/ui/TabsWithSlider.tsx +112 -0
- tools/bolt.diy/app/components/ui/ThemeSwitch.tsx +29 -0
- tools/bolt.diy/app/components/ui/Tooltip.tsx +122 -0
- tools/bolt.diy/app/components/ui/index.ts +38 -0
- tools/bolt.diy/app/components/ui/use-toast.ts +66 -0
- tools/bolt.diy/app/components/workbench/DiffView.tsx +796 -0
- tools/bolt.diy/app/components/workbench/EditorPanel.tsx +174 -0
- tools/bolt.diy/app/components/workbench/ExpoQrModal.tsx +55 -0
- tools/bolt.diy/app/components/workbench/FileBreadcrumb.tsx +150 -0
- tools/bolt.diy/app/components/workbench/FileTree.tsx +565 -0
- tools/bolt.diy/app/components/workbench/Inspector.tsx +126 -0
- tools/bolt.diy/app/components/workbench/InspectorPanel.tsx +146 -0
- tools/bolt.diy/app/components/workbench/LockManager.tsx +262 -0
- tools/bolt.diy/app/components/workbench/PortDropdown.tsx +91 -0
- tools/bolt.diy/app/components/workbench/Preview.tsx +1049 -0
- tools/bolt.diy/app/components/workbench/ScreenshotSelector.tsx +293 -0
- tools/bolt.diy/app/components/workbench/Search.tsx +257 -0
- tools/bolt.diy/app/components/workbench/Workbench.client.tsx +506 -0
- tools/bolt.diy/app/components/workbench/terminal/Terminal.tsx +131 -0
- tools/bolt.diy/app/components/workbench/terminal/TerminalManager.tsx +68 -0
- tools/bolt.diy/app/components/workbench/terminal/TerminalTabs.tsx +277 -0
- tools/bolt.diy/app/components/workbench/terminal/theme.ts +36 -0
- tools/bolt.diy/app/components/workflow/WorkflowPhase.tsx +109 -0
- tools/bolt.diy/app/components/workflow/WorkflowStatus.tsx +60 -0
- tools/bolt.diy/app/components/workflow/WorkflowTimeline.tsx +150 -0
- tools/bolt.diy/app/entry.client.tsx +7 -0
- tools/bolt.diy/app/entry.server.tsx +80 -0
- tools/bolt.diy/app/root.tsx +156 -0
- tools/bolt.diy/app/routes/_index.tsx +175 -0
- tools/bolt.diy/app/routes/api.bug-report.ts +254 -0
- tools/bolt.diy/app/routes/api.chat.ts +463 -0
- tools/bolt.diy/app/routes/api.check-env-key.ts +41 -0
- tools/bolt.diy/app/routes/api.configured-providers.ts +110 -0
- tools/bolt.diy/app/routes/api.corporate-swarm-status.ts +55 -0
- tools/bolt.diy/app/routes/api.enhancer.ts +137 -0
- tools/bolt.diy/app/routes/api.export-api-keys.ts +44 -0
- tools/bolt.diy/app/routes/api.git-info.ts +69 -0
- tools/bolt.diy/app/routes/api.git-proxy.$.ts +178 -0
- tools/bolt.diy/app/routes/api.github-branches.ts +166 -0
- tools/bolt.diy/app/routes/api.github-deploy.ts +67 -0
- tools/bolt.diy/app/routes/api.github-stats.ts +198 -0
- tools/bolt.diy/app/routes/api.github-template.ts +242 -0
- tools/bolt.diy/app/routes/api.github-user.ts +287 -0
- tools/bolt.diy/app/routes/api.gitlab-branches.ts +143 -0
- tools/bolt.diy/app/routes/api.gitlab-deploy.ts +67 -0
- tools/bolt.diy/app/routes/api.gitlab-projects.ts +105 -0
- tools/bolt.diy/app/routes/api.health.ts +8 -0
- tools/bolt.diy/app/routes/api.llmcall.ts +298 -0
- tools/bolt.diy/app/routes/api.mandate.ts +351 -0
- tools/bolt.diy/app/routes/api.mcp-check.ts +16 -0
- tools/bolt.diy/app/routes/api.mcp-update-config.ts +23 -0
- tools/bolt.diy/app/routes/api.models.$provider.ts +2 -0
- tools/bolt.diy/app/routes/api.models.ts +90 -0
- tools/bolt.diy/app/routes/api.netlify-deploy.ts +240 -0
- tools/bolt.diy/app/routes/api.netlify-user.ts +142 -0
- tools/bolt.diy/app/routes/api.supabase-user.ts +199 -0
- tools/bolt.diy/app/routes/api.supabase.query.ts +92 -0
- tools/bolt.diy/app/routes/api.supabase.ts +56 -0
- tools/bolt.diy/app/routes/api.supabase.variables.ts +32 -0
- tools/bolt.diy/app/routes/api.system.diagnostics.ts +142 -0
- tools/bolt.diy/app/routes/api.system.disk-info.ts +311 -0
- tools/bolt.diy/app/routes/api.system.git-info.ts +332 -0
- tools/bolt.diy/app/routes/api.update.ts +21 -0
- tools/bolt.diy/app/routes/api.vercel-deploy.ts +497 -0
- tools/bolt.diy/app/routes/api.vercel-user.ts +161 -0
- tools/bolt.diy/app/routes/api.workflow-status.$proposalId.ts +309 -0
- tools/bolt.diy/app/routes/chat.$id.tsx +8 -0
- tools/bolt.diy/app/routes/execute.$mandateId.tsx +432 -0
- tools/bolt.diy/app/routes/git.tsx +25 -0
- tools/bolt.diy/app/routes/observability.$mandateId.tsx +50 -0
- tools/bolt.diy/app/routes/webcontainer.connect.$id.tsx +32 -0
- tools/bolt.diy/app/routes/webcontainer.preview.$id.tsx +97 -0
- tools/bolt.diy/app/routes/workflow.$proposalId.tsx +170 -0
- tools/bolt.diy/app/styles/animations.scss +49 -0
- tools/bolt.diy/app/styles/components/code.scss +9 -0
- tools/bolt.diy/app/styles/components/editor.scss +135 -0
- tools/bolt.diy/app/styles/components/resize-handle.scss +30 -0
- tools/bolt.diy/app/styles/components/terminal.scss +3 -0
- tools/bolt.diy/app/styles/components/toast.scss +23 -0
- tools/bolt.diy/app/styles/diff-view.css +72 -0
- tools/bolt.diy/app/styles/index.scss +73 -0
- tools/bolt.diy/app/styles/variables.scss +255 -0
- tools/bolt.diy/app/styles/z-index.scss +37 -0
- tools/bolt.diy/app/types/GitHub.ts +182 -0
- tools/bolt.diy/app/types/GitLab.ts +103 -0
- tools/bolt.diy/app/types/actions.ts +85 -0
- tools/bolt.diy/app/types/artifact.ts +5 -0
- tools/bolt.diy/app/types/context.ts +26 -0
- tools/bolt.diy/app/types/design-scheme.ts +93 -0
- tools/bolt.diy/app/types/global.d.ts +13 -0
- tools/bolt.diy/app/types/mandate.ts +333 -0
- tools/bolt.diy/app/types/model.ts +25 -0
- tools/bolt.diy/app/types/netlify.ts +94 -0
- tools/bolt.diy/app/types/supabase.ts +54 -0
- tools/bolt.diy/app/types/template.ts +8 -0
- tools/bolt.diy/app/types/terminal.ts +9 -0
- tools/bolt.diy/app/types/theme.ts +1 -0
- tools/bolt.diy/app/types/vercel.ts +67 -0
- tools/bolt.diy/app/utils/buffer.ts +29 -0
- tools/bolt.diy/app/utils/classNames.ts +65 -0
- tools/bolt.diy/app/utils/constants.ts +147 -0
- tools/bolt.diy/app/utils/debounce.ts +13 -0
- tools/bolt.diy/app/utils/debugLogger.ts +1284 -0
- tools/bolt.diy/app/utils/diff.spec.ts +11 -0
- tools/bolt.diy/app/utils/diff.ts +117 -0
- tools/bolt.diy/app/utils/easings.ts +3 -0
- tools/bolt.diy/app/utils/fileLocks.ts +96 -0
- tools/bolt.diy/app/utils/fileUtils.ts +121 -0
- tools/bolt.diy/app/utils/folderImport.ts +73 -0
- tools/bolt.diy/app/utils/formatSize.ts +12 -0
- tools/bolt.diy/app/utils/getLanguageFromExtension.ts +24 -0
- tools/bolt.diy/app/utils/githubStats.ts +9 -0
- tools/bolt.diy/app/utils/gitlabStats.ts +54 -0
- tools/bolt.diy/app/utils/logger.ts +162 -0
- tools/bolt.diy/app/utils/markdown.ts +155 -0
- tools/bolt.diy/app/utils/mobile.ts +4 -0
- tools/bolt.diy/app/utils/os.ts +4 -0
- tools/bolt.diy/app/utils/path.ts +19 -0
- tools/bolt.diy/app/utils/projectCommands.ts +197 -0
- tools/bolt.diy/app/utils/promises.ts +19 -0
- tools/bolt.diy/app/utils/react.ts +6 -0
- tools/bolt.diy/app/utils/sampler.ts +49 -0
- tools/bolt.diy/app/utils/selectStarterTemplate.ts +255 -0
- tools/bolt.diy/app/utils/shell.ts +384 -0
- tools/bolt.diy/app/utils/stacktrace.ts +27 -0
- tools/bolt.diy/app/utils/stripIndent.ts +23 -0
- tools/bolt.diy/app/utils/terminal.ts +11 -0
- tools/bolt.diy/app/utils/unreachable.ts +3 -0
- tools/bolt.diy/app/vite-env.d.ts +2 -0
- tools/bolt.diy/assets/entitlements.mac.plist +25 -0
- tools/bolt.diy/assets/icons/icon.icns +0 -0
- tools/bolt.diy/assets/icons/icon.ico +0 -0
- tools/bolt.diy/assets/icons/icon.png +0 -0
- tools/bolt.diy/bindings.js +78 -0
- tools/bolt.diy/bindings.sh +33 -0
- tools/bolt.diy/docker-compose.yaml +145 -0
- tools/bolt.diy/electron/main/index.ts +201 -0
- tools/bolt.diy/electron/main/tsconfig.json +30 -0
- tools/bolt.diy/electron/main/ui/menu.ts +29 -0
- tools/bolt.diy/electron/main/ui/window.ts +54 -0
- tools/bolt.diy/electron/main/utils/auto-update.ts +110 -0
- tools/bolt.diy/electron/main/utils/constants.ts +4 -0
- tools/bolt.diy/electron/main/utils/cookie.ts +40 -0
- tools/bolt.diy/electron/main/utils/reload.ts +35 -0
- tools/bolt.diy/electron/main/utils/serve.ts +71 -0
- tools/bolt.diy/electron/main/utils/store.ts +3 -0
- tools/bolt.diy/electron/main/utils/vite-server.ts +44 -0
- tools/bolt.diy/electron/main/vite.config.ts +44 -0
- tools/bolt.diy/electron/preload/index.ts +22 -0
- tools/bolt.diy/electron/preload/tsconfig.json +7 -0
- tools/bolt.diy/electron/preload/vite.config.ts +31 -0
- tools/bolt.diy/electron-builder.yml +64 -0
- tools/bolt.diy/electron-update.yml +4 -0
- tools/bolt.diy/eslint.config.mjs +57 -0
- tools/bolt.diy/functions/[[path]].ts +12 -0
- tools/bolt.diy/icons/angular.svg +1 -0
- tools/bolt.diy/icons/astro.svg +8 -0
- tools/bolt.diy/icons/chat.svg +1 -0
- tools/bolt.diy/icons/expo-brand.svg +1 -0
- tools/bolt.diy/icons/expo.svg +4 -0
- tools/bolt.diy/icons/logo-text.svg +1 -0
- tools/bolt.diy/icons/logo.svg +4 -0
- tools/bolt.diy/icons/mcp.svg +1 -0
- tools/bolt.diy/icons/nativescript.svg +1 -0
- tools/bolt.diy/icons/netlify.svg +10 -0
- tools/bolt.diy/icons/nextjs.svg +1 -0
- tools/bolt.diy/icons/nuxt.svg +1 -0
- tools/bolt.diy/icons/qwik.svg +1 -0
- tools/bolt.diy/icons/react.svg +1 -0
- tools/bolt.diy/icons/remix.svg +24 -0
- tools/bolt.diy/icons/remotion.svg +1 -0
- tools/bolt.diy/icons/shadcn.svg +21 -0
- tools/bolt.diy/icons/slidev.svg +60 -0
- tools/bolt.diy/icons/solidjs.svg +1 -0
- tools/bolt.diy/icons/stars.svg +1 -0
- tools/bolt.diy/icons/svelte.svg +1 -0
- tools/bolt.diy/icons/typescript.svg +1 -0
- tools/bolt.diy/icons/vite.svg +1 -0
- tools/bolt.diy/icons/vue.svg +1 -0
- tools/bolt.diy/load-context.ts +9 -0
- tools/bolt.diy/notarize.cjs +31 -0
- tools/bolt.diy/package.json +218 -0
- tools/bolt.diy/playwright.config.preview.ts +35 -0
- tools/bolt.diy/pre-start.cjs +26 -0
- tools/bolt.diy/public/apple-touch-icon-precomposed.png +0 -0
- tools/bolt.diy/public/apple-touch-icon.png +0 -0
- tools/bolt.diy/public/favicon.ico +0 -0
- tools/bolt.diy/public/favicon.svg +4 -0
- tools/bolt.diy/public/icons/AmazonBedrock.svg +1 -0
- tools/bolt.diy/public/icons/Anthropic.svg +4 -0
- tools/bolt.diy/public/icons/Cohere.svg +4 -0
- tools/bolt.diy/public/icons/Deepseek.svg +5 -0
- tools/bolt.diy/public/icons/Default.svg +4 -0
- tools/bolt.diy/public/icons/Google.svg +4 -0
- tools/bolt.diy/public/icons/Groq.svg +4 -0
- tools/bolt.diy/public/icons/HuggingFace.svg +4 -0
- tools/bolt.diy/public/icons/Hyperbolic.svg +3 -0
- tools/bolt.diy/public/icons/LMStudio.svg +5 -0
- tools/bolt.diy/public/icons/Mistral.svg +4 -0
- tools/bolt.diy/public/icons/Ollama.svg +4 -0
- tools/bolt.diy/public/icons/OpenAI.svg +4 -0
- tools/bolt.diy/public/icons/OpenAILike.svg +4 -0
- tools/bolt.diy/public/icons/OpenRouter.svg +4 -0
- tools/bolt.diy/public/icons/Perplexity.svg +4 -0
- tools/bolt.diy/public/icons/Together.svg +4 -0
- tools/bolt.diy/public/icons/xAI.svg +5 -0
- tools/bolt.diy/public/inspector-script.js +292 -0
- tools/bolt.diy/public/logo-dark-styled.png +0 -0
- tools/bolt.diy/public/logo-dark.png +0 -0
- tools/bolt.diy/public/logo-light-styled.png +0 -0
- tools/bolt.diy/public/logo-light.png +0 -0
- tools/bolt.diy/public/logo.svg +15 -0
- tools/bolt.diy/public/social_preview_index.jpg +0 -0
- tools/bolt.diy/scripts/clean.js +45 -0
- tools/bolt.diy/scripts/electron-dev.mjs +181 -0
- tools/bolt.diy/scripts/setup-env.sh +41 -0
- tools/bolt.diy/scripts/update-imports.sh +7 -0
- tools/bolt.diy/scripts/update.sh +52 -0
- tools/bolt.diy/services/execution-governor/Dockerfile +41 -0
- tools/bolt.diy/services/execution-governor/config.ts +42 -0
- tools/bolt.diy/services/execution-governor/index.ts +683 -0
- tools/bolt.diy/services/execution-governor/metrics.ts +141 -0
- tools/bolt.diy/services/execution-governor/package.json +31 -0
- tools/bolt.diy/services/execution-governor/priority-queue.ts +139 -0
- tools/bolt.diy/services/execution-governor/tsconfig.json +21 -0
- tools/bolt.diy/services/execution-governor/types.ts +145 -0
- tools/bolt.diy/services/headless-executor/Dockerfile +43 -0
- tools/bolt.diy/services/headless-executor/executor.ts +210 -0
- tools/bolt.diy/services/headless-executor/index.ts +323 -0
- tools/bolt.diy/services/headless-executor/package.json +27 -0
- tools/bolt.diy/services/headless-executor/tsconfig.json +21 -0
- tools/bolt.diy/services/headless-executor/types.ts +38 -0
- tools/bolt.diy/test-workflows.sh +240 -0
- tools/bolt.diy/tests/integration/corporate-swarm.test.ts +208 -0
- tools/bolt.diy/tests/mandates/budget-limited.json +34 -0
- tools/bolt.diy/tests/mandates/complex.json +53 -0
- tools/bolt.diy/tests/mandates/constraint-enforced.json +36 -0
- tools/bolt.diy/tests/mandates/simple.json +35 -0
- tools/bolt.diy/tsconfig.json +37 -0
- tools/bolt.diy/types/istextorbinary.d.ts +15 -0
- tools/bolt.diy/uno.config.ts +279 -0
- tools/bolt.diy/vite-electron.config.ts +76 -0
- tools/bolt.diy/vite.config.ts +112 -0
- tools/bolt.diy/worker-configuration.d.ts +22 -0
- tools/bolt.diy/wrangler.toml +6 -0
- tools/code_generator.py +461 -0
- tools/file_operations.py +465 -0
- tools/mandate_generator.py +337 -0
- tools/mcpClientUtils.py +1216 -0
- tools/sensors.py +285 -0
- utils/Agent_types.py +15 -0
- utils/AnyToStr.py +0 -0
- utils/HHCS.py +277 -0
- utils/__init__.py +30 -0
- utils/agent.py +3627 -0
- utils/aop.py +2948 -0
- utils/canonical.py +143 -0
- utils/conversation.py +1195 -0
- utils/doctrine_versioning +230 -0
- utils/formatter.py +474 -0
- utils/ledger.py +311 -0
- utils/out_types.py +16 -0
- utils/rollback.py +339 -0
- utils/router.py +929 -0
- 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)
|