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
schemas/policy.py
ADDED
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
"""Policy schema definitions for the temporal policy engine.
|
|
2
|
+
|
|
3
|
+
This module defines Pydantic v2 models for:
|
|
4
|
+
- DoctrineV1: Policy specification (epochs, metrics, objectives, invariants, levers, risk budget)
|
|
5
|
+
- CompiledPolicy: Normalized, compiled version with resolved IDs and deterministic selectors
|
|
6
|
+
- LedgerEvent: Event types for the event-sourced ledger
|
|
7
|
+
- InterventionSpec + Intervention: Typed intervention parameters
|
|
8
|
+
- ModelState: Learned parameters θ with covariance and versioning
|
|
9
|
+
|
|
10
|
+
This is the "system of record" for doctrine + ledger + interventions (R1 requirement).
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from typing import Any, Dict, List, Literal, Optional, Union
|
|
14
|
+
from pydantic import BaseModel, Field
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class EpochConfig(BaseModel):
|
|
19
|
+
"""Epoch configuration for temporal policy execution.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
unit: Time unit ("seconds", "minutes", "hours", "days")
|
|
23
|
+
length: Length of one epoch in the specified unit
|
|
24
|
+
timezone: Timezone policy (e.g., "UTC", "America/New_York")
|
|
25
|
+
"""
|
|
26
|
+
unit: Literal["seconds", "minutes", "hours", "days"] = "hours"
|
|
27
|
+
length: float = Field(default=1.0, gt=0.0)
|
|
28
|
+
timezone: str = "UTC"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class MetricSpec(BaseModel):
|
|
32
|
+
"""Specification for a metric to track.
|
|
33
|
+
|
|
34
|
+
Attributes:
|
|
35
|
+
extractor_key: Key to extract metric from state snapshot
|
|
36
|
+
unit: Unit of measurement (optional)
|
|
37
|
+
description: Human-readable description
|
|
38
|
+
"""
|
|
39
|
+
extractor_key: str
|
|
40
|
+
unit: Optional[str] = None
|
|
41
|
+
description: Optional[str] = None
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class Objective(BaseModel):
|
|
45
|
+
"""Multi-objective target with deadline.
|
|
46
|
+
|
|
47
|
+
Attributes:
|
|
48
|
+
metric_name: Name of the metric to optimize
|
|
49
|
+
target_value: Target value (None means minimize/maximize)
|
|
50
|
+
direction: "minimize" or "maximize"
|
|
51
|
+
deadline_epoch: Epoch by which objective should be met (None = no deadline)
|
|
52
|
+
weight: Weight in multi-objective optimization (default: 1.0)
|
|
53
|
+
"""
|
|
54
|
+
metric_name: str
|
|
55
|
+
target_value: Optional[float] = None
|
|
56
|
+
direction: Literal["minimize", "maximize"] = "minimize"
|
|
57
|
+
deadline_epoch: Optional[int] = None
|
|
58
|
+
weight: float = Field(default=1.0, gt=0.0)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class Invariant(BaseModel):
|
|
62
|
+
"""Hard constraint that must never be violated.
|
|
63
|
+
|
|
64
|
+
Attributes:
|
|
65
|
+
name: Name of the invariant
|
|
66
|
+
condition: Condition expression (e.g., "metric_name > threshold")
|
|
67
|
+
description: Human-readable description
|
|
68
|
+
"""
|
|
69
|
+
name: str
|
|
70
|
+
condition: str # Expression to evaluate
|
|
71
|
+
description: Optional[str] = None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class LeverSpec(BaseModel):
|
|
75
|
+
"""Specification for an allowed intervention lever.
|
|
76
|
+
|
|
77
|
+
Attributes:
|
|
78
|
+
lever_type: Type identifier (e.g., "ThrottleCPU", "StopService")
|
|
79
|
+
bounds: Parameter bounds as dict (e.g., {"min": 0.0, "max": 1.0})
|
|
80
|
+
cost_function: Cost function expression (optional)
|
|
81
|
+
risk_function: Risk function expression (optional)
|
|
82
|
+
rollback_required: Whether rollback is required for this lever
|
|
83
|
+
description: Human-readable description
|
|
84
|
+
"""
|
|
85
|
+
lever_type: str
|
|
86
|
+
bounds: Dict[str, Any] = Field(default_factory=dict)
|
|
87
|
+
cost_function: Optional[str] = None
|
|
88
|
+
risk_function: Optional[str] = None
|
|
89
|
+
rollback_required: bool = False
|
|
90
|
+
description: Optional[str] = None
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class RiskBudget(BaseModel):
|
|
94
|
+
"""Risk budget constraints.
|
|
95
|
+
|
|
96
|
+
Attributes:
|
|
97
|
+
max_actions_per_epoch: Maximum number of actions allowed per epoch
|
|
98
|
+
max_risk_per_epoch: Maximum risk score allowed per epoch
|
|
99
|
+
rollback_required: Whether rollback is required when budget exceeded
|
|
100
|
+
"""
|
|
101
|
+
max_actions_per_epoch: int = Field(default=10, ge=0)
|
|
102
|
+
max_risk_per_epoch: float = Field(default=1.0, ge=0.0)
|
|
103
|
+
rollback_required: bool = False
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class DoctrineV1(BaseModel):
|
|
107
|
+
"""Policy doctrine specification (version 1).
|
|
108
|
+
|
|
109
|
+
This is the formal policy plan ("five-year plan") that defines:
|
|
110
|
+
- Epoch configuration
|
|
111
|
+
- Metrics to track
|
|
112
|
+
- Objectives to optimize
|
|
113
|
+
- Invariants (hard constraints)
|
|
114
|
+
- Levers (allowed interventions)
|
|
115
|
+
- Risk budget
|
|
116
|
+
|
|
117
|
+
Attributes:
|
|
118
|
+
epoch: Epoch configuration
|
|
119
|
+
metrics: Dictionary mapping metric names to MetricSpec
|
|
120
|
+
objectives: List of objectives to optimize
|
|
121
|
+
invariants: List of hard constraints
|
|
122
|
+
levers: Dictionary mapping lever IDs to LeverSpec
|
|
123
|
+
risk_budget: Risk budget constraints
|
|
124
|
+
version: Doctrine version (default: "1.0")
|
|
125
|
+
created_at: Creation timestamp
|
|
126
|
+
"""
|
|
127
|
+
epoch: EpochConfig
|
|
128
|
+
metrics: Dict[str, MetricSpec]
|
|
129
|
+
objectives: List[Objective]
|
|
130
|
+
invariants: List[Invariant]
|
|
131
|
+
levers: Dict[str, LeverSpec]
|
|
132
|
+
risk_budget: RiskBudget
|
|
133
|
+
version: str = "1.0"
|
|
134
|
+
created_at: Optional[str] = None
|
|
135
|
+
|
|
136
|
+
@classmethod
|
|
137
|
+
def from_json(cls, json_path: str) -> "DoctrineV1":
|
|
138
|
+
"""Load doctrine from JSON file.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
json_path: Path to JSON file
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
DoctrineV1: Loaded doctrine
|
|
145
|
+
"""
|
|
146
|
+
import json
|
|
147
|
+
with open(json_path, "r") as f:
|
|
148
|
+
data = json.load(f)
|
|
149
|
+
return cls(**data)
|
|
150
|
+
|
|
151
|
+
def to_json(self, json_path: str) -> None:
|
|
152
|
+
"""Save doctrine to JSON file.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
json_path: Path to save JSON file
|
|
156
|
+
"""
|
|
157
|
+
import json
|
|
158
|
+
with open(json_path, "w") as f:
|
|
159
|
+
json.dump(self.model_dump(), f, indent=2)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class CompiledPolicy(BaseModel):
|
|
163
|
+
"""Compiled policy with normalized weights and resolved IDs.
|
|
164
|
+
|
|
165
|
+
This is the compiled version of a DoctrineV1 that has been:
|
|
166
|
+
- Normalized (weights sum to 1.0)
|
|
167
|
+
- Resolved (metric IDs resolved, deadline epochs computed)
|
|
168
|
+
- Compiled (deterministic selector rules)
|
|
169
|
+
|
|
170
|
+
Attributes:
|
|
171
|
+
normalized_weights: Dictionary mapping objective names to normalized weights
|
|
172
|
+
resolved_metric_ids: List of resolved metric IDs
|
|
173
|
+
deadline_epochs: Dictionary mapping objective names to deadline epochs
|
|
174
|
+
compiled_selectors: Dictionary of compiled deterministic selector rules
|
|
175
|
+
policy_hash: Stable hash of the original doctrine
|
|
176
|
+
compiled_at: Compilation timestamp
|
|
177
|
+
"""
|
|
178
|
+
normalized_weights: Dict[str, float]
|
|
179
|
+
resolved_metric_ids: List[str]
|
|
180
|
+
deadline_epochs: Dict[str, int]
|
|
181
|
+
compiled_selectors: Dict[str, Any]
|
|
182
|
+
policy_hash: str
|
|
183
|
+
compiled_at: str
|
|
184
|
+
|
|
185
|
+
@classmethod
|
|
186
|
+
def compile(cls, doctrine: DoctrineV1) -> "CompiledPolicy":
|
|
187
|
+
"""Compile a DoctrineV1 into a CompiledPolicy.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
doctrine: The doctrine to compile
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
CompiledPolicy: Compiled policy
|
|
194
|
+
"""
|
|
195
|
+
from utils.canonical import stable_hash
|
|
196
|
+
from datetime import timezone
|
|
197
|
+
|
|
198
|
+
# Compute policy hash
|
|
199
|
+
policy_hash = stable_hash(doctrine.model_dump())
|
|
200
|
+
|
|
201
|
+
# Normalize objective weights
|
|
202
|
+
total_weight = sum(obj.weight for obj in doctrine.objectives)
|
|
203
|
+
normalized_weights = {
|
|
204
|
+
obj.metric_name: obj.weight / total_weight if total_weight > 0 else 1.0 / len(doctrine.objectives)
|
|
205
|
+
for obj in doctrine.objectives
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
# Resolve metric IDs
|
|
209
|
+
resolved_metric_ids = list(doctrine.metrics.keys())
|
|
210
|
+
|
|
211
|
+
# Compute deadline epochs
|
|
212
|
+
deadline_epochs = {
|
|
213
|
+
obj.metric_name: obj.deadline_epoch
|
|
214
|
+
for obj in doctrine.objectives
|
|
215
|
+
if obj.deadline_epoch is not None
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
# Compiled selectors (deterministic rules)
|
|
219
|
+
# For now, this is a placeholder - can be extended with rule compilation
|
|
220
|
+
compiled_selectors = {
|
|
221
|
+
"invariant_checker": {
|
|
222
|
+
"invariants": [inv.model_dump() for inv in doctrine.invariants]
|
|
223
|
+
},
|
|
224
|
+
"lever_validator": {
|
|
225
|
+
"levers": {k: v.model_dump() for k, v in doctrine.levers.items()}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return cls(
|
|
230
|
+
normalized_weights=normalized_weights,
|
|
231
|
+
resolved_metric_ids=resolved_metric_ids,
|
|
232
|
+
deadline_epochs=deadline_epochs,
|
|
233
|
+
compiled_selectors=compiled_selectors,
|
|
234
|
+
policy_hash=policy_hash,
|
|
235
|
+
compiled_at=datetime.now(timezone.utc).isoformat()
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
class ObservationEvent(BaseModel):
|
|
240
|
+
"""Observation event - state snapshot at epoch t.
|
|
241
|
+
|
|
242
|
+
Attributes:
|
|
243
|
+
epoch: Epoch number
|
|
244
|
+
metrics: Dictionary of metric values
|
|
245
|
+
timestamp: Observation timestamp
|
|
246
|
+
"""
|
|
247
|
+
epoch: int
|
|
248
|
+
metrics: Dict[str, float]
|
|
249
|
+
timestamp: str
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class DecisionEvent(BaseModel):
|
|
253
|
+
"""Decision event - chosen interventions at epoch t.
|
|
254
|
+
|
|
255
|
+
Attributes:
|
|
256
|
+
epoch: Epoch number
|
|
257
|
+
interventions: List of intervention specifications
|
|
258
|
+
rationale: Human-readable rationale
|
|
259
|
+
decision_hash: Stable hash of the decision
|
|
260
|
+
score: Optimization score
|
|
261
|
+
"""
|
|
262
|
+
epoch: int
|
|
263
|
+
interventions: List[Dict[str, Any]]
|
|
264
|
+
rationale: str
|
|
265
|
+
decision_hash: str
|
|
266
|
+
score: float
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class OutcomeEvent(BaseModel):
|
|
270
|
+
"""Outcome event - observed results after interventions.
|
|
271
|
+
|
|
272
|
+
Attributes:
|
|
273
|
+
epoch: Epoch number
|
|
274
|
+
metrics: Dictionary of metric values after interventions
|
|
275
|
+
timestamp: Outcome timestamp
|
|
276
|
+
"""
|
|
277
|
+
epoch: int
|
|
278
|
+
metrics: Dict[str, float]
|
|
279
|
+
timestamp: str
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
class PolicyEvent(BaseModel):
|
|
283
|
+
"""Policy event - policy changes or updates.
|
|
284
|
+
|
|
285
|
+
Attributes:
|
|
286
|
+
epoch: Epoch number
|
|
287
|
+
event_type: Type of policy event ("update", "rollback", etc.)
|
|
288
|
+
payload: Event payload
|
|
289
|
+
"""
|
|
290
|
+
epoch: int
|
|
291
|
+
event_type: str
|
|
292
|
+
payload: Dict[str, Any]
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
class LedgerEvent(BaseModel):
|
|
296
|
+
"""Union type for all ledger events.
|
|
297
|
+
|
|
298
|
+
Attributes:
|
|
299
|
+
type: Event type ("observation", "decision", "outcome", "policy")
|
|
300
|
+
epoch: Epoch number
|
|
301
|
+
hash: Stable hash of event payload
|
|
302
|
+
payload: Event payload (ObservationEvent, DecisionEvent, OutcomeEvent, or PolicyEvent)
|
|
303
|
+
"""
|
|
304
|
+
type: Literal["observation", "decision", "outcome", "policy"]
|
|
305
|
+
epoch: int
|
|
306
|
+
hash: str
|
|
307
|
+
payload: Dict[str, Any]
|
|
308
|
+
|
|
309
|
+
@classmethod
|
|
310
|
+
def from_observation(cls, event: ObservationEvent) -> "LedgerEvent":
|
|
311
|
+
"""Create LedgerEvent from ObservationEvent.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
event: ObservationEvent instance
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
LedgerEvent: Ledger event
|
|
318
|
+
"""
|
|
319
|
+
from utils.canonical import stable_hash
|
|
320
|
+
payload_dict = event.model_dump()
|
|
321
|
+
return cls(
|
|
322
|
+
type="observation",
|
|
323
|
+
epoch=event.epoch,
|
|
324
|
+
hash=stable_hash(payload_dict),
|
|
325
|
+
payload=payload_dict
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
@classmethod
|
|
329
|
+
def from_decision(cls, event: DecisionEvent) -> "LedgerEvent":
|
|
330
|
+
"""Create LedgerEvent from DecisionEvent.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
event: DecisionEvent instance
|
|
334
|
+
|
|
335
|
+
Returns:
|
|
336
|
+
LedgerEvent: Ledger event
|
|
337
|
+
"""
|
|
338
|
+
from utils.canonical import stable_hash
|
|
339
|
+
payload_dict = event.model_dump()
|
|
340
|
+
return cls(
|
|
341
|
+
type="decision",
|
|
342
|
+
epoch=event.epoch,
|
|
343
|
+
hash=stable_hash(payload_dict),
|
|
344
|
+
payload=payload_dict
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
@classmethod
|
|
348
|
+
def from_outcome(cls, event: OutcomeEvent) -> "LedgerEvent":
|
|
349
|
+
"""Create LedgerEvent from OutcomeEvent.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
event: OutcomeEvent instance
|
|
353
|
+
|
|
354
|
+
Returns:
|
|
355
|
+
LedgerEvent: Ledger event
|
|
356
|
+
"""
|
|
357
|
+
from utils.canonical import stable_hash
|
|
358
|
+
payload_dict = event.model_dump()
|
|
359
|
+
return cls(
|
|
360
|
+
type="outcome",
|
|
361
|
+
epoch=event.epoch,
|
|
362
|
+
hash=stable_hash(payload_dict),
|
|
363
|
+
payload=payload_dict
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
@classmethod
|
|
367
|
+
def from_policy(cls, event: PolicyEvent) -> "LedgerEvent":
|
|
368
|
+
"""Create LedgerEvent from PolicyEvent.
|
|
369
|
+
|
|
370
|
+
Args:
|
|
371
|
+
event: PolicyEvent instance
|
|
372
|
+
|
|
373
|
+
Returns:
|
|
374
|
+
LedgerEvent: Ledger event
|
|
375
|
+
"""
|
|
376
|
+
from utils.canonical import stable_hash
|
|
377
|
+
payload_dict = event.model_dump()
|
|
378
|
+
return cls(
|
|
379
|
+
type="policy",
|
|
380
|
+
epoch=event.epoch,
|
|
381
|
+
hash=stable_hash(payload_dict),
|
|
382
|
+
payload=payload_dict
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
class InterventionSpec(BaseModel):
|
|
387
|
+
"""Specification for an intervention.
|
|
388
|
+
|
|
389
|
+
Attributes:
|
|
390
|
+
lever_id: ID of the lever to use
|
|
391
|
+
parameters: Dictionary of intervention parameters
|
|
392
|
+
cost: Estimated cost (optional)
|
|
393
|
+
risk: Estimated risk (optional)
|
|
394
|
+
rollback_descriptor: Descriptor for rollback (optional)
|
|
395
|
+
"""
|
|
396
|
+
lever_id: str
|
|
397
|
+
parameters: Dict[str, Any]
|
|
398
|
+
cost: Optional[float] = None
|
|
399
|
+
risk: Optional[float] = None
|
|
400
|
+
rollback_descriptor: Optional[Dict[str, Any]] = None
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
class Intervention(BaseModel):
|
|
404
|
+
"""Executable intervention with typed parameters.
|
|
405
|
+
|
|
406
|
+
Attributes:
|
|
407
|
+
spec: Intervention specification
|
|
408
|
+
created_at: Creation timestamp
|
|
409
|
+
executed_at: Execution timestamp (None if not executed)
|
|
410
|
+
"""
|
|
411
|
+
spec: InterventionSpec
|
|
412
|
+
created_at: str
|
|
413
|
+
executed_at: Optional[str] = None
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
class ModelState(BaseModel):
|
|
417
|
+
"""Learned parameters θ with covariance and versioning.
|
|
418
|
+
|
|
419
|
+
Attributes:
|
|
420
|
+
parameters: Dictionary of learned parameters (e.g., A, B matrices for RLS)
|
|
421
|
+
covariance: Parameter covariance matrix (for uncertainty quantification)
|
|
422
|
+
version: Model version identifier
|
|
423
|
+
model_hash: Stable hash of the model state
|
|
424
|
+
updated_at: Last update timestamp
|
|
425
|
+
"""
|
|
426
|
+
parameters: Dict[str, Any]
|
|
427
|
+
covariance: Optional[Dict[str, Any]] = None
|
|
428
|
+
version: str = "1.0"
|
|
429
|
+
model_hash: str
|
|
430
|
+
updated_at: str
|
|
431
|
+
|
|
432
|
+
@classmethod
|
|
433
|
+
def create(cls, parameters: Dict[str, Any], covariance: Optional[Dict[str, Any]] = None) -> "ModelState":
|
|
434
|
+
"""Create a new ModelState.
|
|
435
|
+
|
|
436
|
+
Args:
|
|
437
|
+
parameters: Learned parameters
|
|
438
|
+
covariance: Parameter covariance (optional)
|
|
439
|
+
|
|
440
|
+
Returns:
|
|
441
|
+
ModelState: New model state
|
|
442
|
+
"""
|
|
443
|
+
from utils.canonical import stable_hash
|
|
444
|
+
from datetime import timezone
|
|
445
|
+
|
|
446
|
+
state_dict = {
|
|
447
|
+
"parameters": parameters,
|
|
448
|
+
"covariance": covariance or {}
|
|
449
|
+
}
|
|
450
|
+
model_hash = stable_hash(state_dict)
|
|
451
|
+
|
|
452
|
+
return cls(
|
|
453
|
+
parameters=parameters,
|
|
454
|
+
covariance=covariance,
|
|
455
|
+
model_hash=model_hash,
|
|
456
|
+
updated_at=datetime.now(timezone.utc).isoformat()
|
|
457
|
+
)
|
|
458
|
+
|
templates/__init__.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Template framework for creating specialized agents.
|
|
3
|
+
|
|
4
|
+
This package provides a base template class and modular components for building
|
|
5
|
+
domain-specific agents with LLM integration, graph management, prediction frameworks,
|
|
6
|
+
and statistical methods.
|
|
7
|
+
|
|
8
|
+
Features can be used as "drag-and-drop" components via mixins or the module registry.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from typing import Optional
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
from .base_specialized_agent import BaseSpecializedAgent
|
|
15
|
+
from .feature_mixins import (
|
|
16
|
+
GraphFeatureMixin,
|
|
17
|
+
PredictionFeatureMixin,
|
|
18
|
+
StatisticsFeatureMixin,
|
|
19
|
+
LLMFeatureMixin,
|
|
20
|
+
FullFeatureMixin
|
|
21
|
+
)
|
|
22
|
+
from .module_registry import ModuleRegistry, compose_agent, FeatureComposer
|
|
23
|
+
__all__ = [
|
|
24
|
+
"BaseSpecializedAgent",
|
|
25
|
+
"GraphFeatureMixin",
|
|
26
|
+
"PredictionFeatureMixin",
|
|
27
|
+
"StatisticsFeatureMixin",
|
|
28
|
+
"LLMFeatureMixin",
|
|
29
|
+
"FullFeatureMixin",
|
|
30
|
+
"ModuleRegistry",
|
|
31
|
+
"compose_agent",
|
|
32
|
+
"FeatureComposer",
|
|
33
|
+
]
|
|
34
|
+
except ImportError:
|
|
35
|
+
__all__ = []
|
|
36
|
+
|
|
37
|
+
__version__ = "0.2.0"
|
|
38
|
+
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base template class for specialized agents.
|
|
3
|
+
|
|
4
|
+
Provides common patterns for initialization, schema handling, memory management,
|
|
5
|
+
and LLM integration that can be extended by domain-specific agents.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
|
+
from typing import Dict, Any, List, Optional, Union
|
|
10
|
+
import threading
|
|
11
|
+
import logging
|
|
12
|
+
from swarms.structs.agent import Agent
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BaseSpecializedAgent(Agent, ABC):
|
|
18
|
+
"""
|
|
19
|
+
Base template class for creating specialized agents.
|
|
20
|
+
|
|
21
|
+
This class provides common patterns for:
|
|
22
|
+
- Schema-based tool definition
|
|
23
|
+
- Agent initialization with domain-specific setup
|
|
24
|
+
- Memory management for multi-loop reasoning
|
|
25
|
+
- Caching infrastructure
|
|
26
|
+
- Async wrapper utilities
|
|
27
|
+
|
|
28
|
+
Subclasses should implement:
|
|
29
|
+
- _get_domain_schema(): Return the tool schema for this domain
|
|
30
|
+
- _build_domain_prompt(task: str): Build domain-specific prompt
|
|
31
|
+
- _domain_specific_setup(): Initialize domain-specific attributes
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
max_loops: Optional[Union[int, str]] = 3,
|
|
37
|
+
agent_name: str = "specialized-agent",
|
|
38
|
+
agent_description: str = "Specialized Agent",
|
|
39
|
+
description: Optional[str] = None,
|
|
40
|
+
model_name: str = "gpt-4o",
|
|
41
|
+
system_prompt: Optional[str] = None,
|
|
42
|
+
global_system_prompt: Optional[str] = None,
|
|
43
|
+
secondary_system_prompt: Optional[str] = None,
|
|
44
|
+
seed: Optional[int] = None,
|
|
45
|
+
**kwargs,
|
|
46
|
+
):
|
|
47
|
+
"""
|
|
48
|
+
Initialize the specialized agent.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
max_loops: Maximum number of reasoning loops
|
|
52
|
+
agent_name: Unique identifier for the agent
|
|
53
|
+
agent_description: Human-readable description
|
|
54
|
+
description: Backwards-compatible alias for agent_description
|
|
55
|
+
model_name: LLM model to use
|
|
56
|
+
system_prompt: System-level instructions
|
|
57
|
+
global_system_prompt: Global system prompt
|
|
58
|
+
secondary_system_prompt: Secondary system prompt
|
|
59
|
+
seed: Random seed for reproducibility
|
|
60
|
+
**kwargs: Additional arguments passed to base Agent
|
|
61
|
+
"""
|
|
62
|
+
# Get domain-specific schema
|
|
63
|
+
domain_schema = self._get_domain_schema()
|
|
64
|
+
|
|
65
|
+
# Backwards-compatible alias for description
|
|
66
|
+
agent_description = description or agent_description
|
|
67
|
+
|
|
68
|
+
# Prepare agent kwargs
|
|
69
|
+
agent_kwargs = {
|
|
70
|
+
"agent_name": agent_name,
|
|
71
|
+
"agent_description": agent_description,
|
|
72
|
+
"model_name": model_name,
|
|
73
|
+
"max_loops": 1, # Individual LLM calls use 1 loop, we handle multi-loop reasoning
|
|
74
|
+
"tools_list_dictionary": [domain_schema] if domain_schema else [],
|
|
75
|
+
"output_type": "final",
|
|
76
|
+
**kwargs,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
# Add optional prompts
|
|
80
|
+
if system_prompt is not None:
|
|
81
|
+
agent_kwargs["system_prompt"] = system_prompt
|
|
82
|
+
if global_system_prompt is not None:
|
|
83
|
+
agent_kwargs["global_system_prompt"] = global_system_prompt
|
|
84
|
+
if secondary_system_prompt is not None:
|
|
85
|
+
agent_kwargs["secondary_system_prompt"] = secondary_system_prompt
|
|
86
|
+
|
|
87
|
+
# Initialize base Agent
|
|
88
|
+
super().__init__(**agent_kwargs)
|
|
89
|
+
|
|
90
|
+
# Store max loops for multi-loop reasoning
|
|
91
|
+
self.domain_max_loops = max_loops
|
|
92
|
+
self.seed = seed if seed is not None else 42
|
|
93
|
+
|
|
94
|
+
# Initialize memory for multi-loop reasoning
|
|
95
|
+
self.domain_memory: List[Dict[str, Any]] = []
|
|
96
|
+
|
|
97
|
+
# Initialize caching infrastructure
|
|
98
|
+
self._prediction_cache: Dict[Any, Any] = {}
|
|
99
|
+
self._prediction_cache_order: List[Any] = []
|
|
100
|
+
self._prediction_cache_max: int = 1000
|
|
101
|
+
self._cache_enabled: bool = True
|
|
102
|
+
self._prediction_cache_lock = threading.Lock()
|
|
103
|
+
|
|
104
|
+
# Call domain-specific setup
|
|
105
|
+
self._domain_specific_setup()
|
|
106
|
+
|
|
107
|
+
@abstractmethod
|
|
108
|
+
def _get_domain_schema(self) -> Optional[Dict[str, Any]]:
|
|
109
|
+
"""
|
|
110
|
+
Return the tool schema for this domain.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Dict containing the function schema, or None if no schema needed
|
|
114
|
+
"""
|
|
115
|
+
pass
|
|
116
|
+
|
|
117
|
+
@abstractmethod
|
|
118
|
+
def _build_domain_prompt(self, task: str) -> str:
|
|
119
|
+
"""
|
|
120
|
+
Build a domain-specific prompt for the given task.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
task: The task description
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Formatted prompt string
|
|
127
|
+
"""
|
|
128
|
+
pass
|
|
129
|
+
|
|
130
|
+
def _domain_specific_setup(self) -> None:
|
|
131
|
+
"""
|
|
132
|
+
Initialize domain-specific attributes.
|
|
133
|
+
|
|
134
|
+
Override this method in subclasses to set up domain-specific
|
|
135
|
+
data structures, graphs, models, etc.
|
|
136
|
+
"""
|
|
137
|
+
pass
|
|
138
|
+
|
|
139
|
+
def step(self, task: str) -> str:
|
|
140
|
+
"""
|
|
141
|
+
Execute a single step of reasoning.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
task: The task to execute
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
Response string from the agent
|
|
148
|
+
"""
|
|
149
|
+
response = super().run(task)
|
|
150
|
+
return response
|
|
151
|
+
|
|
152
|
+
def _build_memory_context(self, last_n: int = 2) -> str:
|
|
153
|
+
"""
|
|
154
|
+
Build context from recent memory steps.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
last_n: Number of recent steps to include
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
Formatted memory context string
|
|
161
|
+
"""
|
|
162
|
+
context_parts = []
|
|
163
|
+
for step in self.domain_memory[-last_n:]:
|
|
164
|
+
context_parts.append(f"Step {step.get('step', '?')}: {step.get('analysis', '')}")
|
|
165
|
+
return "\n".join(context_parts)
|
|
166
|
+
|
|
167
|
+
def _synthesize_analysis(self, task: str) -> str:
|
|
168
|
+
"""
|
|
169
|
+
Synthesize a final analysis from the reasoning steps.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
task: The original task
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
Synthesized analysis string
|
|
176
|
+
"""
|
|
177
|
+
synthesis_prompt = f"Based on the analysis steps performed, synthesize a concise report for: {task}"
|
|
178
|
+
return self.step(synthesis_prompt)
|
|
179
|
+
|
|
180
|
+
def clear_cache(self) -> None:
|
|
181
|
+
"""Clear the prediction cache."""
|
|
182
|
+
with self._prediction_cache_lock:
|
|
183
|
+
self._prediction_cache.clear()
|
|
184
|
+
self._prediction_cache_order.clear()
|
|
185
|
+
|
|
186
|
+
def enable_cache(self, flag: bool) -> None:
|
|
187
|
+
"""
|
|
188
|
+
Enable or disable caching.
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
flag: True to enable, False to disable
|
|
192
|
+
"""
|
|
193
|
+
with self._prediction_cache_lock:
|
|
194
|
+
self._cache_enabled = bool(flag)
|
|
195
|
+
|