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
tools/sensors.py
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"""Sensor interfaces and implementations for policy engine.
|
|
2
|
+
|
|
3
|
+
Provides standardized sensor interfaces for reading system metrics,
|
|
4
|
+
cloud resources, and custom metrics.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from typing import Any, Dict, List, Optional, Callable
|
|
9
|
+
from loguru import logger
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
import psutil
|
|
13
|
+
PSUTIL_AVAILABLE = True
|
|
14
|
+
except ImportError:
|
|
15
|
+
PSUTIL_AVAILABLE = False
|
|
16
|
+
logger.warning("psutil not available - SystemMetricsSensor will be disabled")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BaseSensor(ABC):
|
|
20
|
+
"""Abstract base class for sensors.
|
|
21
|
+
|
|
22
|
+
All sensors must implement read() to return metric snapshots
|
|
23
|
+
matching the doctrine's metric specifications.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
@abstractmethod
|
|
27
|
+
def read(self) -> Dict[str, float]:
|
|
28
|
+
"""
|
|
29
|
+
Read current metric snapshot.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Dict[str, float]: Metric name -> value mapping
|
|
33
|
+
"""
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
def validate(self, snapshot: Dict[str, float], expected_metrics: List[str]) -> bool:
|
|
37
|
+
"""
|
|
38
|
+
Validate snapshot matches expected metrics.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
snapshot: Metric snapshot to validate
|
|
42
|
+
expected_metrics: List of expected metric names
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
bool: True if snapshot is valid
|
|
46
|
+
"""
|
|
47
|
+
missing = set(expected_metrics) - set(snapshot.keys())
|
|
48
|
+
if missing:
|
|
49
|
+
logger.warning(f"Missing metrics in snapshot: {missing}")
|
|
50
|
+
return False
|
|
51
|
+
return True
|
|
52
|
+
|
|
53
|
+
def health_check(self) -> bool:
|
|
54
|
+
"""
|
|
55
|
+
Check sensor availability.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
bool: True if sensor is healthy
|
|
59
|
+
"""
|
|
60
|
+
try:
|
|
61
|
+
self.read()
|
|
62
|
+
return True
|
|
63
|
+
except Exception as e:
|
|
64
|
+
logger.error(f"Sensor health check failed: {e}")
|
|
65
|
+
return False
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class SystemMetricsSensor(BaseSensor):
|
|
69
|
+
"""OS-level system metrics sensor using psutil.
|
|
70
|
+
|
|
71
|
+
Extracts:
|
|
72
|
+
- CPU metrics: cpu_percent, cpu_count, cpu_freq
|
|
73
|
+
- Memory metrics: memory_percent, memory_available, memory_used
|
|
74
|
+
- Disk metrics: disk_usage_percent, disk_io_read, disk_io_write
|
|
75
|
+
- Network metrics: network_bytes_sent, network_bytes_recv
|
|
76
|
+
- Process metrics: process_count
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
def __init__(self, metric_mapping: Optional[Dict[str, str]] = None):
|
|
80
|
+
"""
|
|
81
|
+
Initialize system metrics sensor.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
metric_mapping: Optional mapping from doctrine metric names to psutil attributes
|
|
85
|
+
"""
|
|
86
|
+
if not PSUTIL_AVAILABLE:
|
|
87
|
+
raise ImportError("psutil is required for SystemMetricsSensor")
|
|
88
|
+
|
|
89
|
+
self.metric_mapping = metric_mapping or {}
|
|
90
|
+
self._last_net_io = None
|
|
91
|
+
self._last_disk_io = None
|
|
92
|
+
|
|
93
|
+
def read(self) -> Dict[str, float]:
|
|
94
|
+
"""Read system metrics."""
|
|
95
|
+
snapshot = {}
|
|
96
|
+
|
|
97
|
+
# CPU metrics
|
|
98
|
+
snapshot['cpu_percent'] = psutil.cpu_percent(interval=0.1)
|
|
99
|
+
snapshot['cpu_count'] = float(psutil.cpu_count())
|
|
100
|
+
try:
|
|
101
|
+
cpu_freq = psutil.cpu_freq()
|
|
102
|
+
snapshot['cpu_freq_mhz'] = cpu_freq.current if cpu_freq else 0.0
|
|
103
|
+
except:
|
|
104
|
+
snapshot['cpu_freq_mhz'] = 0.0
|
|
105
|
+
|
|
106
|
+
# Memory metrics
|
|
107
|
+
mem = psutil.virtual_memory()
|
|
108
|
+
snapshot['memory_percent'] = mem.percent
|
|
109
|
+
snapshot['memory_available_gb'] = mem.available / (1024**3)
|
|
110
|
+
snapshot['memory_used_gb'] = mem.used / (1024**3)
|
|
111
|
+
|
|
112
|
+
# Disk metrics
|
|
113
|
+
try:
|
|
114
|
+
disk = psutil.disk_usage('/')
|
|
115
|
+
snapshot['disk_usage_percent'] = disk.percent
|
|
116
|
+
except:
|
|
117
|
+
snapshot['disk_usage_percent'] = 0.0
|
|
118
|
+
|
|
119
|
+
# Disk I/O (delta from last read)
|
|
120
|
+
try:
|
|
121
|
+
disk_io = psutil.disk_io_counters()
|
|
122
|
+
if disk_io and self._last_disk_io:
|
|
123
|
+
snapshot['disk_io_read_mb'] = (disk_io.read_bytes - self._last_disk_io.read_bytes) / (1024**2)
|
|
124
|
+
snapshot['disk_io_write_mb'] = (disk_io.write_bytes - self._last_disk_io.write_bytes) / (1024**2)
|
|
125
|
+
else:
|
|
126
|
+
snapshot['disk_io_read_mb'] = 0.0
|
|
127
|
+
snapshot['disk_io_write_mb'] = 0.0
|
|
128
|
+
self._last_disk_io = disk_io
|
|
129
|
+
except:
|
|
130
|
+
snapshot['disk_io_read_mb'] = 0.0
|
|
131
|
+
snapshot['disk_io_write_mb'] = 0.0
|
|
132
|
+
|
|
133
|
+
# Network I/O (delta from last read)
|
|
134
|
+
try:
|
|
135
|
+
net_io = psutil.net_io_counters()
|
|
136
|
+
if net_io and self._last_net_io:
|
|
137
|
+
snapshot['network_bytes_sent_mb'] = (net_io.bytes_sent - self._last_net_io.bytes_sent) / (1024**2)
|
|
138
|
+
snapshot['network_bytes_recv_mb'] = (net_io.bytes_recv - self._last_net_io.bytes_recv) / (1024**2)
|
|
139
|
+
else:
|
|
140
|
+
snapshot['network_bytes_sent_mb'] = 0.0
|
|
141
|
+
snapshot['network_bytes_recv_mb'] = 0.0
|
|
142
|
+
self._last_net_io = net_io
|
|
143
|
+
except:
|
|
144
|
+
snapshot['network_bytes_sent_mb'] = 0.0
|
|
145
|
+
snapshot['network_bytes_recv_mb'] = 0.0
|
|
146
|
+
|
|
147
|
+
# Process count
|
|
148
|
+
try:
|
|
149
|
+
snapshot['process_count'] = float(len(psutil.pids()))
|
|
150
|
+
except:
|
|
151
|
+
snapshot['process_count'] = 0.0
|
|
152
|
+
|
|
153
|
+
# Apply metric mapping if provided
|
|
154
|
+
if self.metric_mapping:
|
|
155
|
+
mapped_snapshot = {}
|
|
156
|
+
for doctrine_metric, system_metric in self.metric_mapping.items():
|
|
157
|
+
if system_metric in snapshot:
|
|
158
|
+
mapped_snapshot[doctrine_metric] = snapshot[system_metric]
|
|
159
|
+
else:
|
|
160
|
+
logger.warning(f"Metric mapping failed: {system_metric} not in snapshot")
|
|
161
|
+
return mapped_snapshot
|
|
162
|
+
|
|
163
|
+
return snapshot
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class CloudResourceSensor(BaseSensor):
|
|
167
|
+
"""Abstract base for cloud provider metrics.
|
|
168
|
+
|
|
169
|
+
Subclasses should implement provider-specific metric extraction.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
def __init__(self, provider: str, config: Optional[Dict[str, Any]] = None):
|
|
173
|
+
"""
|
|
174
|
+
Initialize cloud resource sensor.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
provider: Cloud provider name ("aws", "gcp", "azure")
|
|
178
|
+
config: Provider-specific configuration
|
|
179
|
+
"""
|
|
180
|
+
self.provider = provider
|
|
181
|
+
self.config = config or {}
|
|
182
|
+
|
|
183
|
+
@abstractmethod
|
|
184
|
+
def read(self) -> Dict[str, float]:
|
|
185
|
+
"""Read cloud metrics (implemented by subclasses)."""
|
|
186
|
+
pass
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class CustomMetricSensor(BaseSensor):
|
|
190
|
+
"""User-defined metric sensor with custom extraction function.
|
|
191
|
+
|
|
192
|
+
Accepts a custom function that returns metric snapshots.
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
def __init__(self, extractor: Callable[[], Dict[str, float]]):
|
|
196
|
+
"""
|
|
197
|
+
Initialize custom metric sensor.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
extractor: Function that returns Dict[str, float] metric snapshot
|
|
201
|
+
"""
|
|
202
|
+
self.extractor = extractor
|
|
203
|
+
|
|
204
|
+
def read(self) -> Dict[str, float]:
|
|
205
|
+
"""Read metrics using custom extractor."""
|
|
206
|
+
try:
|
|
207
|
+
return self.extractor()
|
|
208
|
+
except Exception as e:
|
|
209
|
+
logger.error(f"Custom sensor extractor failed: {e}")
|
|
210
|
+
return {}
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
class SensorRegistry:
|
|
214
|
+
"""Registry mapping metric extractor keys to sensor instances.
|
|
215
|
+
|
|
216
|
+
Provides auto-discovery and fallback chain for missing metrics.
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
def __init__(self):
|
|
220
|
+
"""Initialize sensor registry."""
|
|
221
|
+
self.sensors: Dict[str, BaseSensor] = {}
|
|
222
|
+
self.metric_to_sensor: Dict[str, str] = {} # metric_name -> sensor_key
|
|
223
|
+
|
|
224
|
+
def register(self, sensor_key: str, sensor: BaseSensor, metrics: Optional[List[str]] = None) -> None:
|
|
225
|
+
"""
|
|
226
|
+
Register a sensor.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
sensor_key: Unique identifier for sensor
|
|
230
|
+
sensor: Sensor instance
|
|
231
|
+
metrics: Optional list of metric names this sensor provides
|
|
232
|
+
"""
|
|
233
|
+
self.sensors[sensor_key] = sensor
|
|
234
|
+
if metrics:
|
|
235
|
+
for metric in metrics:
|
|
236
|
+
self.metric_to_sensor[metric] = sensor_key
|
|
237
|
+
logger.info(f"Registered sensor: {sensor_key}")
|
|
238
|
+
|
|
239
|
+
def get_sensor(self, sensor_key: str) -> Optional[BaseSensor]:
|
|
240
|
+
"""Get sensor by key."""
|
|
241
|
+
return self.sensors.get(sensor_key)
|
|
242
|
+
|
|
243
|
+
def read_all(self, required_metrics: Optional[List[str]] = None) -> Dict[str, float]:
|
|
244
|
+
"""
|
|
245
|
+
Read metrics from all registered sensors.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
required_metrics: Optional list of required metric names
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
Dict[str, float]: Combined metric snapshot
|
|
252
|
+
"""
|
|
253
|
+
snapshot = {}
|
|
254
|
+
|
|
255
|
+
# Read from all sensors
|
|
256
|
+
for sensor_key, sensor in self.sensors.items():
|
|
257
|
+
try:
|
|
258
|
+
sensor_snapshot = sensor.read()
|
|
259
|
+
snapshot.update(sensor_snapshot)
|
|
260
|
+
except Exception as e:
|
|
261
|
+
logger.error(f"Sensor {sensor_key} read failed: {e}")
|
|
262
|
+
|
|
263
|
+
# Validate required metrics
|
|
264
|
+
if required_metrics:
|
|
265
|
+
missing = set(required_metrics) - set(snapshot.keys())
|
|
266
|
+
if missing:
|
|
267
|
+
logger.warning(f"Missing required metrics: {missing}")
|
|
268
|
+
|
|
269
|
+
return snapshot
|
|
270
|
+
|
|
271
|
+
def auto_discover(self) -> None:
|
|
272
|
+
"""Auto-discover and register available sensors."""
|
|
273
|
+
# Try to register SystemMetricsSensor if psutil available
|
|
274
|
+
if PSUTIL_AVAILABLE:
|
|
275
|
+
try:
|
|
276
|
+
system_sensor = SystemMetricsSensor()
|
|
277
|
+
if system_sensor.health_check():
|
|
278
|
+
self.register("system", system_sensor)
|
|
279
|
+
except Exception as e:
|
|
280
|
+
logger.warning(f"Failed to auto-discover system sensor: {e}")
|
|
281
|
+
|
|
282
|
+
def health_check_all(self) -> Dict[str, bool]:
|
|
283
|
+
"""Check health of all sensors."""
|
|
284
|
+
return {key: sensor.health_check() for key, sensor in self.sensors.items()}
|
|
285
|
+
|
utils/Agent_types.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Agent type definitions for CR-CA.
|
|
2
|
+
|
|
3
|
+
This module provides type aliases for agent-related types used throughout
|
|
4
|
+
the CR-CA codebase.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, Callable, Sequence, Union
|
|
8
|
+
|
|
9
|
+
from swarms.structs.agent import Agent
|
|
10
|
+
|
|
11
|
+
# Unified type for agent
|
|
12
|
+
AgentType = Union[Agent, Callable, Any]
|
|
13
|
+
|
|
14
|
+
# List of agents
|
|
15
|
+
AgentListType = Sequence[AgentType]
|
utils/AnyToStr.py
ADDED
|
File without changes
|
utils/HHCS.py
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Hybrid Hierarchical-Cluster Swarm implementation.
|
|
3
|
+
|
|
4
|
+
Provides intelligent task routing to appropriate swarm configurations
|
|
5
|
+
using an agent-based routing system with hierarchical decision-making.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import json
|
|
9
|
+
import os
|
|
10
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
11
|
+
from typing import Callable, List, Union
|
|
12
|
+
|
|
13
|
+
from swarms.structs.agent import Agent
|
|
14
|
+
from swarms.structs.conversation import Conversation
|
|
15
|
+
from swarms.structs.multi_agent_exec import get_swarms_info
|
|
16
|
+
from swarms.structs.swarm_router import SwarmRouter
|
|
17
|
+
from swarms.utils.history_output_formatter import HistoryOutputType, history_output_formatter
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
_ROUTER_TOOLS = [{
|
|
21
|
+
"type": "function",
|
|
22
|
+
"function": {
|
|
23
|
+
"name": "select_swarm",
|
|
24
|
+
"description": "Analyzes the input task and selects the most appropriate swarm configuration.",
|
|
25
|
+
"parameters": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"properties": {
|
|
28
|
+
"reasoning": {"type": "string", "description": "Reasoning behind swarm selection."},
|
|
29
|
+
"swarm_name": {"type": "string", "description": "Name of the selected swarm."},
|
|
30
|
+
"task_description": {"type": "string", "description": "Structured task description."},
|
|
31
|
+
},
|
|
32
|
+
"required": ["reasoning", "swarm_name", "task_description"],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
}]
|
|
36
|
+
|
|
37
|
+
_ROUTER_SYSTEM_PROMPT = """You are an intelligent Router Agent responsible for analyzing tasks and directing them to the most appropriate swarm.
|
|
38
|
+
|
|
39
|
+
Key Responsibilities:
|
|
40
|
+
1. Task Analysis: Analyze requirements, complexity, and domain
|
|
41
|
+
2. Swarm Selection: Match task requirements with swarm capabilities
|
|
42
|
+
3. Decision Making: Evaluate all available swarms systematically
|
|
43
|
+
4. Output Requirements: Provide clear justification and structured task description
|
|
44
|
+
|
|
45
|
+
Your output must follow this format:
|
|
46
|
+
{
|
|
47
|
+
"swarm_name": "Name of the selected swarm",
|
|
48
|
+
"task_description": "Detailed and structured task description"
|
|
49
|
+
}"""
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class HybridHierarchicalClusterSwarm:
|
|
53
|
+
"""Hybrid hierarchical-cluster swarm for intelligent task routing.
|
|
54
|
+
|
|
55
|
+
Routes tasks to appropriate swarm configurations using an agent-based
|
|
56
|
+
routing system. Supports parallel batch processing and maintains
|
|
57
|
+
conversation history for context management.
|
|
58
|
+
|
|
59
|
+
Attributes:
|
|
60
|
+
name: Swarm identifier name.
|
|
61
|
+
description: Description of swarm functionality.
|
|
62
|
+
swarms: List of available swarm routers.
|
|
63
|
+
max_loops: Maximum number of processing loops.
|
|
64
|
+
output_type: Format for output extraction.
|
|
65
|
+
conversation: Conversation history manager.
|
|
66
|
+
router_agent: Agent responsible for task routing decisions.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
def __init__(self, name: str = "Hybrid Hierarchical-Cluster Swarm",
|
|
70
|
+
description: str = "A swarm that uses a hybrid hierarchical-peer model to solve complex tasks.",
|
|
71
|
+
swarms: List[Union[SwarmRouter, Callable]] = None,
|
|
72
|
+
agents: List[Union[Agent, Callable]] = None, # Accept agents for convenience
|
|
73
|
+
max_loops: int = 1, output_type: HistoryOutputType = "list",
|
|
74
|
+
router_agent_model_name: str = "gpt-4o-mini", *args, **kwargs):
|
|
75
|
+
"""Initialize hybrid hierarchical-cluster swarm.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
name: Swarm identifier name.
|
|
79
|
+
description: Description of swarm functionality.
|
|
80
|
+
swarms: List of available swarm routers or callables.
|
|
81
|
+
max_loops: Maximum number of processing loops.
|
|
82
|
+
output_type: Format for output extraction.
|
|
83
|
+
router_agent_model_name: Model name for router agent.
|
|
84
|
+
"""
|
|
85
|
+
self.name = name
|
|
86
|
+
self.description = description
|
|
87
|
+
|
|
88
|
+
# Handle both swarms and agents parameters
|
|
89
|
+
if swarms is not None:
|
|
90
|
+
self.swarms = swarms
|
|
91
|
+
elif agents is not None:
|
|
92
|
+
# Convert agents to swarms by wrapping them in SwarmRouter
|
|
93
|
+
from utils.router import SwarmRouter
|
|
94
|
+
self.swarms = [
|
|
95
|
+
SwarmRouter(
|
|
96
|
+
name=f"swarm-{i}",
|
|
97
|
+
description=f"Swarm wrapper for agent {i}",
|
|
98
|
+
agents=[agent] if not isinstance(agent, list) else agent,
|
|
99
|
+
swarm_type="SequentialWorkflow",
|
|
100
|
+
max_loops=max_loops,
|
|
101
|
+
output_type=output_type,
|
|
102
|
+
**kwargs
|
|
103
|
+
) for i, agent in enumerate(agents)
|
|
104
|
+
]
|
|
105
|
+
else:
|
|
106
|
+
self.swarms = []
|
|
107
|
+
|
|
108
|
+
self.max_loops = max_loops
|
|
109
|
+
self.output_type = output_type
|
|
110
|
+
self.conversation = Conversation()
|
|
111
|
+
|
|
112
|
+
system_prompt = f"{_ROUTER_SYSTEM_PROMPT}\n\n{get_swarms_info(swarms=self.swarms)}"
|
|
113
|
+
|
|
114
|
+
# Extract model_name from kwargs if provided, otherwise use router_agent_model_name
|
|
115
|
+
model = kwargs.pop("model_name", router_agent_model_name)
|
|
116
|
+
|
|
117
|
+
self.router_agent = Agent(agent_name="Router Agent",
|
|
118
|
+
agent_description="Routes tasks to appropriate swarms.",
|
|
119
|
+
system_prompt=system_prompt,
|
|
120
|
+
tools_list_dictionary=_ROUTER_TOOLS,
|
|
121
|
+
model_name=model,
|
|
122
|
+
max_loops=1, output_type="final",
|
|
123
|
+
**kwargs) # Pass remaining kwargs to Agent
|
|
124
|
+
|
|
125
|
+
def _parse_router_response(self, response: Union[str, dict, None]) -> dict:
|
|
126
|
+
"""Parse router agent response into dictionary format.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
response: Response from router agent (string or dict).
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
Parsed response dictionary.
|
|
133
|
+
|
|
134
|
+
Raises:
|
|
135
|
+
ValueError: If response cannot be parsed or is invalid.
|
|
136
|
+
"""
|
|
137
|
+
if response is None:
|
|
138
|
+
raise ValueError("Router agent returned None response. Check agent configuration and model availability.")
|
|
139
|
+
|
|
140
|
+
if isinstance(response, str):
|
|
141
|
+
# Handle empty or "No response generated" messages
|
|
142
|
+
if not response.strip() or "No response generated" in response:
|
|
143
|
+
raise ValueError(f"Router agent returned empty or invalid response: {response}")
|
|
144
|
+
try:
|
|
145
|
+
# Try to extract JSON from the response if it's embedded in text
|
|
146
|
+
import re
|
|
147
|
+
json_match = re.search(r'\{[^{}]*\}', response)
|
|
148
|
+
if json_match:
|
|
149
|
+
return json.loads(json_match.group())
|
|
150
|
+
return json.loads(response)
|
|
151
|
+
except json.JSONDecodeError:
|
|
152
|
+
raise ValueError(f"Invalid JSON response from router agent: {response}")
|
|
153
|
+
|
|
154
|
+
if isinstance(response, dict):
|
|
155
|
+
return response
|
|
156
|
+
|
|
157
|
+
raise ValueError(f"Unexpected response type from router agent: {type(response)}")
|
|
158
|
+
|
|
159
|
+
def _validate_router_response(self, response: dict) -> tuple:
|
|
160
|
+
"""Validate and extract swarm name and task description.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
response: Parsed response dictionary.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
Tuple of (swarm_name, task_description).
|
|
167
|
+
|
|
168
|
+
Raises:
|
|
169
|
+
ValueError: If required fields are missing.
|
|
170
|
+
"""
|
|
171
|
+
swarm_name = response.get("swarm_name")
|
|
172
|
+
task_description = response.get("task_description")
|
|
173
|
+
|
|
174
|
+
if not swarm_name or not task_description:
|
|
175
|
+
raise ValueError(f"Invalid response from router agent: both 'swarm_name' and 'task_description' must be present. "
|
|
176
|
+
f"Received: swarm_name={swarm_name}, task_description={task_description}. "
|
|
177
|
+
f"Model: {self.router_agent.model_name}")
|
|
178
|
+
return swarm_name, task_description
|
|
179
|
+
|
|
180
|
+
def find_swarm_by_name(self, swarm_name: str) -> Union[SwarmRouter, Callable, None]:
|
|
181
|
+
"""Locate swarm by name identifier.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
swarm_name: Name of swarm to locate.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Found swarm router or None if not found.
|
|
188
|
+
"""
|
|
189
|
+
return next((swarm for swarm in self.swarms if swarm.name == swarm_name), None)
|
|
190
|
+
|
|
191
|
+
def route_task(self, swarm_name: str, task_description: str) -> None:
|
|
192
|
+
"""Route task to specified swarm and record output.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
swarm_name: Name of target swarm.
|
|
196
|
+
task_description: Task description to execute.
|
|
197
|
+
|
|
198
|
+
Raises:
|
|
199
|
+
ValueError: If swarm is not found.
|
|
200
|
+
"""
|
|
201
|
+
swarm = self.find_swarm_by_name(swarm_name)
|
|
202
|
+
if not swarm:
|
|
203
|
+
raise ValueError(f"Swarm '{swarm_name}' not found.")
|
|
204
|
+
|
|
205
|
+
output = swarm.run(task_description)
|
|
206
|
+
self.conversation.add(role=swarm.name, content=output)
|
|
207
|
+
|
|
208
|
+
def run(self, task: str, *args, **kwargs) -> str:
|
|
209
|
+
"""Execute routing process for given task.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
task: Task string to process.
|
|
213
|
+
*args: Additional positional arguments.
|
|
214
|
+
**kwargs: Additional keyword arguments.
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
Formatted history output string.
|
|
218
|
+
|
|
219
|
+
Raises:
|
|
220
|
+
ValueError: If task is empty or routing fails.
|
|
221
|
+
"""
|
|
222
|
+
if not task:
|
|
223
|
+
raise ValueError("Task cannot be empty.")
|
|
224
|
+
|
|
225
|
+
self.conversation.add(role="User", content=task)
|
|
226
|
+
response = self.router_agent.run(task=task)
|
|
227
|
+
|
|
228
|
+
# Handle None or empty responses
|
|
229
|
+
if response is None:
|
|
230
|
+
raise ValueError("Router agent returned None. Check agent configuration, API keys, and model availability.")
|
|
231
|
+
|
|
232
|
+
try:
|
|
233
|
+
parsed_response = self._parse_router_response(response)
|
|
234
|
+
except ValueError as e:
|
|
235
|
+
raise ValueError(f"Failed to parse router response: {e}. Response was: {response}")
|
|
236
|
+
|
|
237
|
+
try:
|
|
238
|
+
swarm_name, task_description = self._validate_router_response(parsed_response)
|
|
239
|
+
except ValueError as e:
|
|
240
|
+
raise ValueError(f"Failed to validate router response: {e}. Parsed response was: {parsed_response}")
|
|
241
|
+
|
|
242
|
+
self.route_task(swarm_name, task_description)
|
|
243
|
+
|
|
244
|
+
return history_output_formatter(self.conversation, self.output_type)
|
|
245
|
+
|
|
246
|
+
def batched_run(self, tasks: List[str]) -> List[str]:
|
|
247
|
+
"""Execute routing process for multiple tasks in parallel.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
tasks: List of task strings to process.
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
List of formatted history outputs.
|
|
254
|
+
|
|
255
|
+
Raises:
|
|
256
|
+
ValueError: If task list is empty.
|
|
257
|
+
"""
|
|
258
|
+
if not tasks:
|
|
259
|
+
raise ValueError("Task list cannot be empty.")
|
|
260
|
+
|
|
261
|
+
max_workers = os.cpu_count() * 2
|
|
262
|
+
results = []
|
|
263
|
+
|
|
264
|
+
with ThreadPoolExecutor(max_workers=max_workers) as executor:
|
|
265
|
+
future_to_task = {executor.submit(self.run, task): task for task in tasks}
|
|
266
|
+
|
|
267
|
+
for future in as_completed(future_to_task):
|
|
268
|
+
try:
|
|
269
|
+
results.append(future.result())
|
|
270
|
+
except Exception as e:
|
|
271
|
+
results.append(f"Error processing task: {str(e)}")
|
|
272
|
+
|
|
273
|
+
return results
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
# Alias for convenience
|
|
277
|
+
HHCS = HybridHierarchicalClusterSwarm
|
utils/__init__.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CRCA Utilities Module
|
|
3
|
+
|
|
4
|
+
Provides utility functions and classes for formatting, visualization,
|
|
5
|
+
and common operations within the CRCA framework.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
try:
|
|
9
|
+
from .formatter import Formatter, MarkdownOutputHandler, formatter
|
|
10
|
+
FORMATTER_AVAILABLE = True
|
|
11
|
+
except ImportError:
|
|
12
|
+
Formatter = None
|
|
13
|
+
MarkdownOutputHandler = None
|
|
14
|
+
formatter = None
|
|
15
|
+
FORMATTER_AVAILABLE = False
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
from .tui import CorporateSwarmTUI, create_corporate_tui, ViewMode, TUIState
|
|
19
|
+
TUI_AVAILABLE = True
|
|
20
|
+
except ImportError:
|
|
21
|
+
CorporateSwarmTUI = None
|
|
22
|
+
create_corporate_tui = None
|
|
23
|
+
ViewMode = None
|
|
24
|
+
TUIState = None
|
|
25
|
+
TUI_AVAILABLE = False
|
|
26
|
+
|
|
27
|
+
__all__ = [
|
|
28
|
+
"Formatter", "MarkdownOutputHandler", "formatter", "FORMATTER_AVAILABLE",
|
|
29
|
+
"CorporateSwarmTUI", "create_corporate_tui", "ViewMode", "TUIState", "TUI_AVAILABLE"
|
|
30
|
+
]
|