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
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-execution page for headless workers.
|
|
3
|
+
*
|
|
4
|
+
* This page automatically executes a mandate when loaded, designed for
|
|
5
|
+
* use by headless browser workers controlled by Playwright.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { json, type LoaderFunctionArgs, type MetaFunction } from '@remix-run/cloudflare';
|
|
9
|
+
import { useLoaderData, useParams } from '@remix-run/react';
|
|
10
|
+
import { useEffect, useRef, useState } from 'react';
|
|
11
|
+
import type { Mandate, ExecutionResult } from '~/types/mandate';
|
|
12
|
+
import { MandateExecutor } from '~/lib/runtime/mandate-executor';
|
|
13
|
+
import { webcontainer } from '~/lib/webcontainer';
|
|
14
|
+
import { newBoltShellProcess } from '~/utils/shell';
|
|
15
|
+
import { createScopedLogger } from '~/utils/logger';
|
|
16
|
+
import type { IProviderSetting } from '~/types/model';
|
|
17
|
+
import { eventRegistry } from '~/lib/runtime/execution-events';
|
|
18
|
+
|
|
19
|
+
const logger = createScopedLogger('execute-page');
|
|
20
|
+
|
|
21
|
+
export const meta: MetaFunction<typeof loader> = () => {
|
|
22
|
+
return [
|
|
23
|
+
{ title: 'Mandate Execution' },
|
|
24
|
+
{ name: 'robots', content: 'noindex, nofollow' },
|
|
25
|
+
];
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const GOVERNOR_URL = typeof window !== 'undefined'
|
|
29
|
+
? (window as any).__GOVERNOR_URL__ || process.env.EXECUTION_GOVERNOR_URL || 'http://localhost:3000'
|
|
30
|
+
: 'http://localhost:3000';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Load mandate from governor or window injection.
|
|
34
|
+
*/
|
|
35
|
+
export async function loader({ params, request }: LoaderFunctionArgs) {
|
|
36
|
+
const mandateId = params.mandateId;
|
|
37
|
+
|
|
38
|
+
if (!mandateId) {
|
|
39
|
+
throw new Response('Mandate ID is required', { status: 400 });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Try to load mandate from governor
|
|
43
|
+
try {
|
|
44
|
+
const governorUrl = process.env.EXECUTION_GOVERNOR_URL || 'http://localhost:3000';
|
|
45
|
+
const response = await fetch(`${governorUrl}/mandates/${mandateId}`, {
|
|
46
|
+
headers: {
|
|
47
|
+
'Content-Type': 'application/json',
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
if (response.ok) {
|
|
52
|
+
const data = await response.json() as { mandate?: Mandate };
|
|
53
|
+
return json({ mandateId, mandate: data.mandate || null });
|
|
54
|
+
}
|
|
55
|
+
} catch (error) {
|
|
56
|
+
logger.warn('Could not load mandate from governor, will use window injection:', error);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return json({ mandateId, mandate: null });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Auto-execution component.
|
|
64
|
+
*/
|
|
65
|
+
function AutoExecutor({ mandateId, mandate: initialMandate }: { mandateId: string; mandate: Mandate | null }) {
|
|
66
|
+
const executedRef = useRef(false);
|
|
67
|
+
const resultRef = useRef<ExecutionResult | null>(null);
|
|
68
|
+
const errorRef = useRef<Error | null>(null);
|
|
69
|
+
const [currentPhase, setCurrentPhase] = useState<string>('initializing');
|
|
70
|
+
const [recentLogs, setRecentLogs] = useState<Array<{ level: string; message: string; timestamp: number }>>([]);
|
|
71
|
+
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (executedRef.current) {
|
|
74
|
+
return; // Already executed
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
executedRef.current = true;
|
|
78
|
+
|
|
79
|
+
const execute = async () => {
|
|
80
|
+
const initStartTime = Date.now();
|
|
81
|
+
const eventEmitter = eventRegistry.getEmitter(mandateId);
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
setCurrentPhase('loading_mandate');
|
|
85
|
+
eventEmitter.emitInitializationStart({ phase: 'loading_mandate', timestamp: initStartTime });
|
|
86
|
+
eventEmitter.emitLog('info', 'Starting mandate execution initialization', 'execute-page');
|
|
87
|
+
|
|
88
|
+
// Get mandate from window injection (Playwright) or use loaded mandate
|
|
89
|
+
let mandate: Mandate | null = initialMandate || null;
|
|
90
|
+
const mandateLoadStart = Date.now();
|
|
91
|
+
|
|
92
|
+
if (!mandate && typeof window !== 'undefined') {
|
|
93
|
+
eventEmitter.emitLog('debug', 'Checking window injection for mandate data', 'execute-page');
|
|
94
|
+
mandate = (window as any).__MANDATE_DATA__ || null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!mandate) {
|
|
98
|
+
// Try to fetch from API endpoint first (where mandates are stored)
|
|
99
|
+
eventEmitter.emitLog('debug', `Fetching mandate from API endpoint`, 'execute-page');
|
|
100
|
+
try {
|
|
101
|
+
const apiResponse = await fetch(`/api/mandate?mandate_id=${mandateId}&get=true`);
|
|
102
|
+
if (apiResponse.ok) {
|
|
103
|
+
const apiData = await apiResponse.json() as { mandate?: Mandate };
|
|
104
|
+
mandate = apiData.mandate || null;
|
|
105
|
+
if (mandate) {
|
|
106
|
+
eventEmitter.emitLog('info', 'Mandate loaded from API endpoint', 'execute-page');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
} catch (error) {
|
|
110
|
+
logger.error('Failed to fetch mandate from API:', error);
|
|
111
|
+
eventEmitter.emitLog('warn', `Failed to fetch from API: ${error instanceof Error ? error.message : String(error)}`, 'execute-page');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (!mandate) {
|
|
116
|
+
// Try to fetch from governor as fallback
|
|
117
|
+
eventEmitter.emitLog('debug', `Fetching mandate from governor at ${GOVERNOR_URL}`, 'execute-page');
|
|
118
|
+
try {
|
|
119
|
+
const response = await fetch(`${GOVERNOR_URL}/mandates/${mandateId}`);
|
|
120
|
+
if (response.ok) {
|
|
121
|
+
const data = await response.json() as { mandate?: Mandate };
|
|
122
|
+
mandate = data.mandate || null;
|
|
123
|
+
if (mandate) {
|
|
124
|
+
eventEmitter.emitLog('info', 'Mandate loaded from governor', 'execute-page');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
} catch (error) {
|
|
128
|
+
logger.error('Failed to fetch mandate from governor:', error);
|
|
129
|
+
eventEmitter.emitLog('warn', `Failed to fetch from governor: ${error instanceof Error ? error.message : String(error)}`, 'execute-page');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (!mandate) {
|
|
134
|
+
const errorMsg = `Mandate ${mandateId} not found`;
|
|
135
|
+
eventEmitter.emitError(errorMsg, 'execute-page');
|
|
136
|
+
throw new Error(errorMsg);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const mandateLoadTime = Date.now() - mandateLoadStart;
|
|
140
|
+
eventEmitter.emitLog('info', `Mandate loaded in ${mandateLoadTime}ms`, 'execute-page');
|
|
141
|
+
logger.info(`Starting auto-execution of mandate ${mandateId}`);
|
|
142
|
+
|
|
143
|
+
// Set execution status in DOM for Playwright to detect
|
|
144
|
+
const statusEl = document.createElement('div');
|
|
145
|
+
statusEl.id = 'execution-status';
|
|
146
|
+
statusEl.setAttribute('data-execution-status', 'initializing');
|
|
147
|
+
statusEl.style.display = 'none';
|
|
148
|
+
document.body.appendChild(statusEl);
|
|
149
|
+
|
|
150
|
+
// Fetch API keys and provider settings
|
|
151
|
+
setCurrentPhase('loading_config');
|
|
152
|
+
eventEmitter.emitLog('info', 'Fetching API keys and provider settings', 'execute-page');
|
|
153
|
+
const configStartTime = Date.now();
|
|
154
|
+
|
|
155
|
+
const apiKeysResponse = await fetch('/api/export-api-keys');
|
|
156
|
+
const apiKeys: Record<string, string> = apiKeysResponse.ok
|
|
157
|
+
? await apiKeysResponse.json()
|
|
158
|
+
: {};
|
|
159
|
+
|
|
160
|
+
const apiKeysCount = Object.keys(apiKeys).length;
|
|
161
|
+
const apiKeysAvailable = Object.keys(apiKeys);
|
|
162
|
+
eventEmitter.emitApiKeysLoaded(apiKeysCount, apiKeysAvailable, {
|
|
163
|
+
load_time: Date.now() - configStartTime,
|
|
164
|
+
});
|
|
165
|
+
eventEmitter.emitLog('info', `Loaded ${apiKeysCount} API key(s): ${apiKeysAvailable.join(', ') || 'none'}`, 'execute-page');
|
|
166
|
+
|
|
167
|
+
// Fetch provider settings
|
|
168
|
+
const providersResponse = await fetch('/api/configured-providers');
|
|
169
|
+
const providersData = providersResponse.ok
|
|
170
|
+
? await providersResponse.json() as { providers?: Array<{ name: string; [key: string]: any }> }
|
|
171
|
+
: { providers: [] };
|
|
172
|
+
|
|
173
|
+
const providerSettings: Record<string, IProviderSetting> = {};
|
|
174
|
+
if (providersData.providers) {
|
|
175
|
+
for (const provider of providersData.providers) {
|
|
176
|
+
providerSettings[provider.name] = provider as IProviderSetting;
|
|
177
|
+
const model = provider.model || provider.defaultModel || 'unknown';
|
|
178
|
+
eventEmitter.emitProviderConfigured(provider.name, model, {
|
|
179
|
+
provider_config: provider,
|
|
180
|
+
});
|
|
181
|
+
eventEmitter.emitLog('info', `Provider configured: ${provider.name} (model: ${model})`, 'execute-page');
|
|
182
|
+
}
|
|
183
|
+
} else {
|
|
184
|
+
eventEmitter.emitLog('warn', 'No provider settings found, using defaults', 'execute-page');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Initialize WebContainer
|
|
188
|
+
setCurrentPhase('initializing_webcontainer');
|
|
189
|
+
eventEmitter.emitWebContainerInit('Starting WebContainer boot...', 0);
|
|
190
|
+
eventEmitter.emitLog('info', 'Initializing WebContainer...', 'execute-page');
|
|
191
|
+
const wcStartTime = Date.now();
|
|
192
|
+
|
|
193
|
+
eventEmitter.emitWebContainerInit('Loading WebContainer kernel...', 25);
|
|
194
|
+
const wc = await webcontainer;
|
|
195
|
+
|
|
196
|
+
const wcInitTime = Date.now() - wcStartTime;
|
|
197
|
+
eventEmitter.emitWebContainerInit('WebContainer ready', 100, {
|
|
198
|
+
init_time: wcInitTime,
|
|
199
|
+
});
|
|
200
|
+
eventEmitter.emitLog('info', `WebContainer initialized in ${wcInitTime}ms`, 'execute-page');
|
|
201
|
+
logger.info('WebContainer initialized');
|
|
202
|
+
|
|
203
|
+
// Create shell terminal
|
|
204
|
+
setCurrentPhase('initializing_shell');
|
|
205
|
+
eventEmitter.emitLog('info', 'Creating shell terminal...', 'execute-page');
|
|
206
|
+
const shellStartTime = Date.now();
|
|
207
|
+
const shellTerminal = () => newBoltShellProcess();
|
|
208
|
+
const shellInitTime = Date.now() - shellStartTime;
|
|
209
|
+
eventEmitter.emitShellReady({ init_time: shellInitTime });
|
|
210
|
+
eventEmitter.emitLog('info', `Shell terminal ready in ${shellInitTime}ms`, 'execute-page');
|
|
211
|
+
|
|
212
|
+
// Create MandateExecutor
|
|
213
|
+
setCurrentPhase('initializing_executor');
|
|
214
|
+
eventEmitter.emitLog('info', 'Initializing MandateExecutor...', 'execute-page');
|
|
215
|
+
const executorStartTime = Date.now();
|
|
216
|
+
const executor = new MandateExecutor(
|
|
217
|
+
mandate,
|
|
218
|
+
Promise.resolve(wc),
|
|
219
|
+
shellTerminal,
|
|
220
|
+
apiKeys,
|
|
221
|
+
providerSettings
|
|
222
|
+
);
|
|
223
|
+
const executorInitTime = Date.now() - executorStartTime;
|
|
224
|
+
eventEmitter.emitExecutorReady({ init_time: executorInitTime });
|
|
225
|
+
eventEmitter.emitLog('info', `MandateExecutor ready in ${executorInitTime}ms`, 'execute-page');
|
|
226
|
+
|
|
227
|
+
const totalInitTime = Date.now() - initStartTime;
|
|
228
|
+
eventEmitter.emitLog('info', `Initialization complete in ${totalInitTime}ms`, 'execute-page');
|
|
229
|
+
|
|
230
|
+
// Set up event forwarding to governor and UI updates
|
|
231
|
+
const executorEventEmitter = (executor as any).eventEmitter;
|
|
232
|
+
if (executorEventEmitter) {
|
|
233
|
+
executorEventEmitter.on('*', (event: any) => {
|
|
234
|
+
// Update UI with recent logs
|
|
235
|
+
if (event.type === 'log' || event.type === 'error') {
|
|
236
|
+
setRecentLogs((prev) => {
|
|
237
|
+
const newLogs = [...prev, {
|
|
238
|
+
level: event.data.level || (event.type === 'error' ? 'error' : 'info'),
|
|
239
|
+
message: event.data.message || '',
|
|
240
|
+
timestamp: event.timestamp,
|
|
241
|
+
}];
|
|
242
|
+
// Keep only last 10 logs
|
|
243
|
+
return newLogs.slice(-10);
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Update phase based on event type
|
|
248
|
+
if (event.type === 'iteration_start') {
|
|
249
|
+
setCurrentPhase(`executing_iteration_${event.iteration}`);
|
|
250
|
+
} else if (event.type === 'iteration_end') {
|
|
251
|
+
setCurrentPhase(`iteration_${event.iteration}_${event.data.status}`);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Forward event to governor
|
|
255
|
+
fetch(`${GOVERNOR_URL}/workers/${process.env.WORKER_ID || 'headless'}/report-progress`, {
|
|
256
|
+
method: 'POST',
|
|
257
|
+
headers: { 'Content-Type': 'application/json' },
|
|
258
|
+
body: JSON.stringify({
|
|
259
|
+
mandateId: mandate.mandate_id,
|
|
260
|
+
event: {
|
|
261
|
+
mandate_id: event.mandate_id,
|
|
262
|
+
iteration: event.iteration,
|
|
263
|
+
type: event.type,
|
|
264
|
+
timestamp: event.timestamp,
|
|
265
|
+
data: event.data,
|
|
266
|
+
metadata: event.metadata,
|
|
267
|
+
},
|
|
268
|
+
}),
|
|
269
|
+
}).catch((error) => {
|
|
270
|
+
logger.error('Failed to forward event to governor:', error);
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Update status
|
|
276
|
+
setCurrentPhase('executing');
|
|
277
|
+
statusEl.setAttribute('data-execution-status', 'executing');
|
|
278
|
+
|
|
279
|
+
// Execute mandate
|
|
280
|
+
eventEmitter.emitLog('info', 'Starting mandate execution...', 'execute-page');
|
|
281
|
+
const result = await executor.execute();
|
|
282
|
+
|
|
283
|
+
// Store result
|
|
284
|
+
resultRef.current = result;
|
|
285
|
+
if (typeof window !== 'undefined') {
|
|
286
|
+
(window as any).__EXECUTION_RESULT__ = result;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Update status
|
|
290
|
+
setCurrentPhase('completed');
|
|
291
|
+
statusEl.setAttribute('data-execution-status', 'completed');
|
|
292
|
+
|
|
293
|
+
// Log completion
|
|
294
|
+
eventEmitter.emitLog('info', `Mandate execution completed with status: ${result.status}`, 'execute-page');
|
|
295
|
+
logger.info(`Mandate ${mandateId} execution completed: ${result.status}`);
|
|
296
|
+
console.log('EXECUTION_COMPLETE', result);
|
|
297
|
+
|
|
298
|
+
// Report to governor
|
|
299
|
+
await fetch(`${GOVERNOR_URL}/workers/${process.env.WORKER_ID || 'headless'}/complete`, {
|
|
300
|
+
method: 'POST',
|
|
301
|
+
headers: { 'Content-Type': 'application/json' },
|
|
302
|
+
body: JSON.stringify({
|
|
303
|
+
mandateId: mandate.mandate_id,
|
|
304
|
+
success: result.status === 'success',
|
|
305
|
+
result,
|
|
306
|
+
}),
|
|
307
|
+
}).catch((error) => {
|
|
308
|
+
logger.error('Failed to report completion to governor:', error);
|
|
309
|
+
});
|
|
310
|
+
} catch (error) {
|
|
311
|
+
logger.error(`Error executing mandate ${mandateId}:`, error);
|
|
312
|
+
errorRef.current = error instanceof Error ? error : new Error(String(error));
|
|
313
|
+
|
|
314
|
+
// Store error
|
|
315
|
+
if (typeof window !== 'undefined') {
|
|
316
|
+
(window as any).__EXECUTION_ERROR__ = error instanceof Error ? error.message : String(error);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Update status
|
|
320
|
+
const statusEl = document.getElementById('execution-status');
|
|
321
|
+
if (statusEl) {
|
|
322
|
+
statusEl.setAttribute('data-execution-status', 'failed');
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Log error
|
|
326
|
+
console.error('EXECUTION_ERROR', error);
|
|
327
|
+
|
|
328
|
+
// Report failure to governor
|
|
329
|
+
await fetch(`${GOVERNOR_URL}/workers/${process.env.WORKER_ID || 'headless'}/complete`, {
|
|
330
|
+
method: 'POST',
|
|
331
|
+
headers: { 'Content-Type': 'application/json' },
|
|
332
|
+
body: JSON.stringify({
|
|
333
|
+
mandateId,
|
|
334
|
+
success: false,
|
|
335
|
+
error: error instanceof Error ? error.message : String(error),
|
|
336
|
+
}),
|
|
337
|
+
}).catch((err) => {
|
|
338
|
+
logger.error('Failed to report failure to governor:', err);
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
execute();
|
|
344
|
+
}, [mandateId, initialMandate]);
|
|
345
|
+
|
|
346
|
+
return (
|
|
347
|
+
<div className="flex flex-col h-screen w-full bg-bolt-elements-background-depth-1">
|
|
348
|
+
<div className="flex-1 flex flex-col p-8">
|
|
349
|
+
<div className="max-w-4xl mx-auto w-full">
|
|
350
|
+
<h1 className="text-2xl font-bold text-bolt-elements-textPrimary mb-4">
|
|
351
|
+
Executing Mandate
|
|
352
|
+
</h1>
|
|
353
|
+
<p className="text-bolt-elements-textSecondary mb-6">
|
|
354
|
+
Mandate ID: <span className="font-mono">{mandateId}</span>
|
|
355
|
+
</p>
|
|
356
|
+
|
|
357
|
+
{/* Current Phase */}
|
|
358
|
+
<div className="mb-6 p-4 bg-bolt-elements-background-depth-2 border border-bolt-elements-borderColor rounded-lg">
|
|
359
|
+
<div className="flex items-center gap-3 mb-2">
|
|
360
|
+
<div className="inline-block animate-spin rounded-full h-4 w-4 border-b-2 border-accent-500"></div>
|
|
361
|
+
<span className="text-sm font-medium text-bolt-elements-textSecondary">Current Phase:</span>
|
|
362
|
+
<span className="text-sm font-semibold text-bolt-elements-textPrimary">{currentPhase}</span>
|
|
363
|
+
</div>
|
|
364
|
+
<p className="text-xs text-bolt-elements-textTertiary">
|
|
365
|
+
Execution status is being reported to the governor and observability dashboard.
|
|
366
|
+
</p>
|
|
367
|
+
</div>
|
|
368
|
+
|
|
369
|
+
{/* Recent Logs */}
|
|
370
|
+
{recentLogs.length > 0 && (
|
|
371
|
+
<div className="mb-6">
|
|
372
|
+
<h2 className="text-sm font-semibold text-bolt-elements-textPrimary mb-2">Recent Logs</h2>
|
|
373
|
+
<div className="bg-bolt-elements-background-depth-2 border border-bolt-elements-borderColor rounded-lg p-4 max-h-64 overflow-auto">
|
|
374
|
+
<div className="space-y-1 font-mono text-xs">
|
|
375
|
+
{recentLogs.map((log, idx) => (
|
|
376
|
+
<div key={idx} className="flex gap-2">
|
|
377
|
+
<span className={`${
|
|
378
|
+
log.level === 'error' ? 'text-red-500' :
|
|
379
|
+
log.level === 'warn' ? 'text-yellow-500' :
|
|
380
|
+
log.level === 'debug' ? 'text-gray-500' :
|
|
381
|
+
'text-blue-500'
|
|
382
|
+
}`}>
|
|
383
|
+
[{log.level.toUpperCase()}]
|
|
384
|
+
</span>
|
|
385
|
+
<span className="text-bolt-elements-textSecondary">{log.message}</span>
|
|
386
|
+
</div>
|
|
387
|
+
))}
|
|
388
|
+
</div>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
)}
|
|
392
|
+
|
|
393
|
+
{/* Status Info */}
|
|
394
|
+
<div className="text-center">
|
|
395
|
+
<p className="text-sm text-bolt-elements-textTertiary">
|
|
396
|
+
This page is executing the mandate automatically.
|
|
397
|
+
<br />
|
|
398
|
+
View detailed logs at: <a href={`/observability/${mandateId}`} className="text-accent-500 hover:underline">/observability/{mandateId}</a>
|
|
399
|
+
</p>
|
|
400
|
+
</div>
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
|
|
404
|
+
{/* Hidden status element for Playwright detection */}
|
|
405
|
+
<div
|
|
406
|
+
id="execution-status"
|
|
407
|
+
data-execution-status="initializing"
|
|
408
|
+
style={{ display: 'none' }}
|
|
409
|
+
/>
|
|
410
|
+
</div>
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
export default function ExecuteRoute() {
|
|
415
|
+
const { mandateId, mandate } = useLoaderData<typeof loader>();
|
|
416
|
+
const params = useParams();
|
|
417
|
+
const finalMandateId = mandateId || params.mandateId;
|
|
418
|
+
|
|
419
|
+
if (!finalMandateId) {
|
|
420
|
+
return (
|
|
421
|
+
<div className="flex flex-col h-screen w-full bg-bolt-elements-background-depth-1 p-8">
|
|
422
|
+
<div className="max-w-4xl mx-auto">
|
|
423
|
+
<h1 className="text-2xl font-bold text-bolt-elements-textPrimary mb-4">Error</h1>
|
|
424
|
+
<p className="text-bolt-elements-textSecondary">Mandate ID is required</p>
|
|
425
|
+
</div>
|
|
426
|
+
</div>
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
return <AutoExecutor mandateId={finalMandateId} mandate={mandate} />;
|
|
431
|
+
}
|
|
432
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { LoaderFunctionArgs } from '@remix-run/cloudflare';
|
|
2
|
+
import { json, type MetaFunction } from '@remix-run/cloudflare';
|
|
3
|
+
import { ClientOnly } from 'remix-utils/client-only';
|
|
4
|
+
import { BaseChat } from '~/components/chat/BaseChat';
|
|
5
|
+
import { GitUrlImport } from '~/components/git/GitUrlImport.client';
|
|
6
|
+
import { Header } from '~/components/header/Header';
|
|
7
|
+
import BackgroundRays from '~/components/ui/BackgroundRays';
|
|
8
|
+
|
|
9
|
+
export const meta: MetaFunction = () => {
|
|
10
|
+
return [{ title: 'Bolt' }, { name: 'description', content: 'Talk with Bolt, an AI assistant from StackBlitz' }];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export async function loader(args: LoaderFunctionArgs) {
|
|
14
|
+
return json({ url: args.params.url });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default function Index() {
|
|
18
|
+
return (
|
|
19
|
+
<div className="flex flex-col h-full w-full bg-bolt-elements-background-depth-1">
|
|
20
|
+
<BackgroundRays />
|
|
21
|
+
<Header />
|
|
22
|
+
<ClientOnly fallback={<BaseChat />}>{() => <GitUrlImport />}</ClientOnly>
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { json, type LoaderFunctionArgs, type MetaFunction } from '@remix-run/cloudflare';
|
|
2
|
+
import { useLoaderData, useParams } from '@remix-run/react';
|
|
3
|
+
import { ObservabilityDashboard } from '~/components/observability/ObservabilityDashboard';
|
|
4
|
+
import { Header } from '~/components/header/Header';
|
|
5
|
+
import BackgroundRays from '~/components/ui/BackgroundRays';
|
|
6
|
+
|
|
7
|
+
export const meta: MetaFunction<typeof loader> = ({ data }) => {
|
|
8
|
+
return [
|
|
9
|
+
{ title: `Observability - ${data?.mandateId || 'Unknown'}` },
|
|
10
|
+
{ name: 'description', content: 'Real-time execution observability for mandate execution' },
|
|
11
|
+
];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export async function loader({ params }: LoaderFunctionArgs) {
|
|
15
|
+
const mandateId = params.mandateId;
|
|
16
|
+
|
|
17
|
+
if (!mandateId) {
|
|
18
|
+
throw new Response('Mandate ID is required', { status: 400 });
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return json({ mandateId });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default function ObservabilityRoute() {
|
|
25
|
+
const { mandateId } = useLoaderData<typeof loader>();
|
|
26
|
+
const params = useParams();
|
|
27
|
+
|
|
28
|
+
// Use params as fallback if loader data is not available
|
|
29
|
+
const finalMandateId = mandateId || params.mandateId;
|
|
30
|
+
|
|
31
|
+
if (!finalMandateId) {
|
|
32
|
+
return (
|
|
33
|
+
<div className="flex flex-col h-full w-full bg-bolt-elements-background-depth-1 p-8">
|
|
34
|
+
<div className="max-w-4xl mx-auto">
|
|
35
|
+
<h1 className="text-2xl font-bold text-bolt-elements-textPrimary mb-4">Error</h1>
|
|
36
|
+
<p className="text-bolt-elements-textSecondary">Mandate ID is required</p>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<div className="flex flex-col h-full w-full bg-bolt-elements-background-depth-1">
|
|
44
|
+
<BackgroundRays />
|
|
45
|
+
<Header />
|
|
46
|
+
<ObservabilityDashboard mandateId={finalMandateId} />
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type LoaderFunction } from '@remix-run/cloudflare';
|
|
2
|
+
|
|
3
|
+
export const loader: LoaderFunction = async ({ request }) => {
|
|
4
|
+
const url = new URL(request.url);
|
|
5
|
+
const editorOrigin = url.searchParams.get('editorOrigin') || 'https://stackblitz.com';
|
|
6
|
+
console.log('editorOrigin', editorOrigin);
|
|
7
|
+
|
|
8
|
+
const htmlContent = `
|
|
9
|
+
<!DOCTYPE html>
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<head>
|
|
12
|
+
<meta charset="UTF-8" />
|
|
13
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
14
|
+
<title>Connect to WebContainer</title>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<script type="module">
|
|
18
|
+
(async () => {
|
|
19
|
+
const { setupConnect } = await import('https://cdn.jsdelivr.net/npm/@webcontainer/api@latest/dist/connect.js');
|
|
20
|
+
setupConnect({
|
|
21
|
+
editorOrigin: '${editorOrigin}'
|
|
22
|
+
});
|
|
23
|
+
})();
|
|
24
|
+
</script>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
27
|
+
`;
|
|
28
|
+
|
|
29
|
+
return new Response(htmlContent, {
|
|
30
|
+
headers: { 'Content-Type': 'text/html' },
|
|
31
|
+
});
|
|
32
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { json, type LoaderFunctionArgs } from '@remix-run/cloudflare';
|
|
2
|
+
import { useLoaderData } from '@remix-run/react';
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
const PREVIEW_CHANNEL = 'preview-updates';
|
|
6
|
+
|
|
7
|
+
export async function loader({ params }: LoaderFunctionArgs) {
|
|
8
|
+
const previewId = params.id;
|
|
9
|
+
|
|
10
|
+
if (!previewId) {
|
|
11
|
+
throw new Response('Preview ID is required', { status: 400 });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return json({ previewId });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default function WebContainerPreview() {
|
|
18
|
+
const { previewId } = useLoaderData<typeof loader>();
|
|
19
|
+
const iframeRef = useRef<HTMLIFrameElement>(null);
|
|
20
|
+
const broadcastChannelRef = useRef<BroadcastChannel>();
|
|
21
|
+
const [previewUrl, setPreviewUrl] = useState('');
|
|
22
|
+
|
|
23
|
+
// Handle preview refresh
|
|
24
|
+
const handleRefresh = useCallback(() => {
|
|
25
|
+
if (iframeRef.current && previewUrl) {
|
|
26
|
+
// Force a clean reload
|
|
27
|
+
iframeRef.current.src = '';
|
|
28
|
+
requestAnimationFrame(() => {
|
|
29
|
+
if (iframeRef.current) {
|
|
30
|
+
iframeRef.current.src = previewUrl;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}, [previewUrl]);
|
|
35
|
+
|
|
36
|
+
// Notify other tabs that this preview is ready
|
|
37
|
+
const notifyPreviewReady = useCallback(() => {
|
|
38
|
+
if (broadcastChannelRef.current && previewUrl) {
|
|
39
|
+
broadcastChannelRef.current.postMessage({
|
|
40
|
+
type: 'preview-ready',
|
|
41
|
+
previewId,
|
|
42
|
+
url: previewUrl,
|
|
43
|
+
timestamp: Date.now(),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}, [previewId, previewUrl]);
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const supportsBroadcastChannel = typeof window !== 'undefined' && typeof window.BroadcastChannel === 'function';
|
|
50
|
+
|
|
51
|
+
if (supportsBroadcastChannel) {
|
|
52
|
+
broadcastChannelRef.current = new window.BroadcastChannel(PREVIEW_CHANNEL);
|
|
53
|
+
|
|
54
|
+
// Listen for preview updates
|
|
55
|
+
broadcastChannelRef.current.onmessage = (event) => {
|
|
56
|
+
if (event.data.previewId === previewId) {
|
|
57
|
+
if (event.data.type === 'refresh-preview' || event.data.type === 'file-change') {
|
|
58
|
+
handleRefresh();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
} else {
|
|
63
|
+
broadcastChannelRef.current = undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Construct the WebContainer preview URL
|
|
67
|
+
const url = `https://${previewId}.local-credentialless.webcontainer-api.io`;
|
|
68
|
+
setPreviewUrl(url);
|
|
69
|
+
|
|
70
|
+
// Set the iframe src
|
|
71
|
+
if (iframeRef.current) {
|
|
72
|
+
iframeRef.current.src = url;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Notify other tabs that this preview is ready
|
|
76
|
+
notifyPreviewReady();
|
|
77
|
+
|
|
78
|
+
// Cleanup
|
|
79
|
+
return () => {
|
|
80
|
+
broadcastChannelRef.current?.close();
|
|
81
|
+
};
|
|
82
|
+
}, [previewId, handleRefresh, notifyPreviewReady]);
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div className="w-full h-full">
|
|
86
|
+
<iframe
|
|
87
|
+
ref={iframeRef}
|
|
88
|
+
title="WebContainer Preview"
|
|
89
|
+
className="w-full h-full border-none"
|
|
90
|
+
sandbox="allow-scripts allow-forms allow-popups allow-modals allow-storage-access-by-user-activation allow-same-origin"
|
|
91
|
+
allow="cross-origin-isolated"
|
|
92
|
+
loading="eager"
|
|
93
|
+
onLoad={notifyPreviewReady}
|
|
94
|
+
/>
|
|
95
|
+
</div>
|
|
96
|
+
);
|
|
97
|
+
}
|