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,11 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { extractRelativePath } from './diff';
|
|
3
|
+
import { WORK_DIR } from './constants';
|
|
4
|
+
|
|
5
|
+
describe('Diff', () => {
|
|
6
|
+
it('should strip out Work_dir', () => {
|
|
7
|
+
const filePath = `${WORK_DIR}/index.js`;
|
|
8
|
+
const result = extractRelativePath(filePath);
|
|
9
|
+
expect(result).toBe('index.js');
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { createTwoFilesPatch } from 'diff';
|
|
2
|
+
import type { FileMap } from '~/lib/stores/files';
|
|
3
|
+
import { MODIFICATIONS_TAG_NAME, WORK_DIR } from './constants';
|
|
4
|
+
|
|
5
|
+
export const modificationsRegex = new RegExp(
|
|
6
|
+
`^<${MODIFICATIONS_TAG_NAME}>[\\s\\S]*?<\\/${MODIFICATIONS_TAG_NAME}>\\s+`,
|
|
7
|
+
'g',
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
interface ModifiedFile {
|
|
11
|
+
type: 'diff' | 'file';
|
|
12
|
+
content: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type FileModifications = Record<string, ModifiedFile>;
|
|
16
|
+
|
|
17
|
+
export function computeFileModifications(files: FileMap, modifiedFiles: Map<string, string>) {
|
|
18
|
+
const modifications: FileModifications = {};
|
|
19
|
+
|
|
20
|
+
let hasModifiedFiles = false;
|
|
21
|
+
|
|
22
|
+
for (const [filePath, originalContent] of modifiedFiles) {
|
|
23
|
+
const file = files[filePath];
|
|
24
|
+
|
|
25
|
+
if (file?.type !== 'file') {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const unifiedDiff = diffFiles(filePath, originalContent, file.content);
|
|
30
|
+
|
|
31
|
+
if (!unifiedDiff) {
|
|
32
|
+
// files are identical
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
hasModifiedFiles = true;
|
|
37
|
+
|
|
38
|
+
if (unifiedDiff.length > file.content.length) {
|
|
39
|
+
// if there are lots of changes we simply grab the current file content since it's smaller than the diff
|
|
40
|
+
modifications[filePath] = { type: 'file', content: file.content };
|
|
41
|
+
} else {
|
|
42
|
+
// otherwise we use the diff since it's smaller
|
|
43
|
+
modifications[filePath] = { type: 'diff', content: unifiedDiff };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!hasModifiedFiles) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return modifications;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Computes a diff in the unified format. The only difference is that the header is omitted
|
|
56
|
+
* because it will always assume that you're comparing two versions of the same file and
|
|
57
|
+
* it allows us to avoid the extra characters we send back to the llm.
|
|
58
|
+
*
|
|
59
|
+
* @see https://www.gnu.org/software/diffutils/manual/html_node/Unified-Format.html
|
|
60
|
+
*/
|
|
61
|
+
export function diffFiles(fileName: string, oldFileContent: string, newFileContent: string) {
|
|
62
|
+
let unifiedDiff = createTwoFilesPatch(fileName, fileName, oldFileContent, newFileContent);
|
|
63
|
+
|
|
64
|
+
const patchHeaderEnd = `--- ${fileName}\n+++ ${fileName}\n`;
|
|
65
|
+
const headerEndIndex = unifiedDiff.indexOf(patchHeaderEnd);
|
|
66
|
+
|
|
67
|
+
if (headerEndIndex >= 0) {
|
|
68
|
+
unifiedDiff = unifiedDiff.slice(headerEndIndex + patchHeaderEnd.length);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (unifiedDiff === '') {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return unifiedDiff;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const regex = new RegExp(`^${WORK_DIR}\/`);
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Strips out the work directory from the file path.
|
|
82
|
+
*/
|
|
83
|
+
export function extractRelativePath(filePath: string) {
|
|
84
|
+
return filePath.replace(regex, '');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Converts the unified diff to HTML.
|
|
89
|
+
*
|
|
90
|
+
* Example:
|
|
91
|
+
*
|
|
92
|
+
* ```html
|
|
93
|
+
* <bolt_file_modifications>
|
|
94
|
+
* <diff path="/home/project/index.js">
|
|
95
|
+
* - console.log('Hello, World!');
|
|
96
|
+
* + console.log('Hello, Bolt!');
|
|
97
|
+
* </diff>
|
|
98
|
+
* </bolt_file_modifications>
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export function fileModificationsToHTML(modifications: FileModifications) {
|
|
102
|
+
const entries = Object.entries(modifications);
|
|
103
|
+
|
|
104
|
+
if (entries.length === 0) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const result: string[] = [`<${MODIFICATIONS_TAG_NAME}>`];
|
|
109
|
+
|
|
110
|
+
for (const [filePath, { type, content }] of entries) {
|
|
111
|
+
result.push(`<${type} path=${JSON.stringify(filePath)}>`, content, `</${type}>`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
result.push(`</${MODIFICATIONS_TAG_NAME}>`);
|
|
115
|
+
|
|
116
|
+
return result.join('\n');
|
|
117
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getLockedItems,
|
|
3
|
+
isFileLocked as isFileLockedInternal,
|
|
4
|
+
isFolderLocked as isFolderLockedInternal,
|
|
5
|
+
isPathInLockedFolder,
|
|
6
|
+
} from '~/lib/persistence/lockedFiles';
|
|
7
|
+
import { createScopedLogger } from './logger';
|
|
8
|
+
|
|
9
|
+
const logger = createScopedLogger('FileLocks');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Get the current chat ID from the URL
|
|
13
|
+
* @returns The current chat ID or a default value if not found
|
|
14
|
+
*/
|
|
15
|
+
export function getCurrentChatId(): string {
|
|
16
|
+
try {
|
|
17
|
+
if (typeof window !== 'undefined') {
|
|
18
|
+
// Extract chat ID from URL (format: /chat/123)
|
|
19
|
+
const match = window.location.pathname.match(/\/chat\/([^/]+)/);
|
|
20
|
+
|
|
21
|
+
if (match && match[1]) {
|
|
22
|
+
return match[1];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Return a default chat ID if none is found
|
|
27
|
+
return 'default';
|
|
28
|
+
} catch (error) {
|
|
29
|
+
logger.error('Failed to get current chat ID', error);
|
|
30
|
+
return 'default';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Check if a file is locked directly from localStorage
|
|
36
|
+
* This avoids circular dependencies between components and stores
|
|
37
|
+
* @param filePath The path of the file to check
|
|
38
|
+
* @param chatId Optional chat ID (will be extracted from URL if not provided)
|
|
39
|
+
*/
|
|
40
|
+
export function isFileLocked(filePath: string, chatId?: string): { locked: boolean; lockedBy?: string } {
|
|
41
|
+
try {
|
|
42
|
+
const currentChatId = chatId || getCurrentChatId();
|
|
43
|
+
|
|
44
|
+
// Use the internal function from lockedFiles.ts
|
|
45
|
+
const result = isFileLockedInternal(currentChatId, filePath);
|
|
46
|
+
|
|
47
|
+
// If the file itself is not locked, check if it's in a locked folder
|
|
48
|
+
if (!result.locked) {
|
|
49
|
+
const folderLockResult = isPathInLockedFolder(currentChatId, filePath);
|
|
50
|
+
|
|
51
|
+
if (folderLockResult.locked) {
|
|
52
|
+
return folderLockResult;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return result;
|
|
57
|
+
} catch (error) {
|
|
58
|
+
logger.error('Failed to check if file is locked', error);
|
|
59
|
+
return { locked: false };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Check if a folder is locked directly from localStorage
|
|
65
|
+
* This avoids circular dependencies between components and stores
|
|
66
|
+
* @param folderPath The path of the folder to check
|
|
67
|
+
* @param chatId Optional chat ID (will be extracted from URL if not provided)
|
|
68
|
+
*/
|
|
69
|
+
export function isFolderLocked(folderPath: string, chatId?: string): { locked: boolean; lockedBy?: string } {
|
|
70
|
+
try {
|
|
71
|
+
const currentChatId = chatId || getCurrentChatId();
|
|
72
|
+
|
|
73
|
+
// Use the internal function from lockedFiles.ts
|
|
74
|
+
return isFolderLockedInternal(currentChatId, folderPath);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
logger.error('Failed to check if folder is locked', error);
|
|
77
|
+
return { locked: false };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Check if any files are locked in the current chat
|
|
83
|
+
* @param chatId Optional chat ID (will be extracted from URL if not provided)
|
|
84
|
+
* @returns True if any files or folders are locked
|
|
85
|
+
*/
|
|
86
|
+
export function hasLockedItems(chatId?: string): boolean {
|
|
87
|
+
try {
|
|
88
|
+
const currentChatId = chatId || getCurrentChatId();
|
|
89
|
+
const lockedItems = getLockedItems();
|
|
90
|
+
|
|
91
|
+
return lockedItems.some((item) => item.chatId === currentChatId);
|
|
92
|
+
} catch (error) {
|
|
93
|
+
logger.error('Failed to check for locked items', error);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import ignore from 'ignore';
|
|
2
|
+
|
|
3
|
+
// Common patterns to ignore, similar to .gitignore
|
|
4
|
+
export const IGNORE_PATTERNS = [
|
|
5
|
+
'node_modules/**',
|
|
6
|
+
'.git/**',
|
|
7
|
+
'dist/**',
|
|
8
|
+
'build/**',
|
|
9
|
+
'.next/**',
|
|
10
|
+
'coverage/**',
|
|
11
|
+
'.cache/**',
|
|
12
|
+
'.vscode/**',
|
|
13
|
+
'.idea/**',
|
|
14
|
+
'**/*.log',
|
|
15
|
+
'**/.DS_Store',
|
|
16
|
+
'**/npm-debug.log*',
|
|
17
|
+
'**/yarn-debug.log*',
|
|
18
|
+
'**/yarn-error.log*',
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
export const MAX_FILES = 1000;
|
|
22
|
+
export const ig = ignore().add(IGNORE_PATTERNS);
|
|
23
|
+
|
|
24
|
+
export const generateId = () => Math.random().toString(36).substring(2, 15);
|
|
25
|
+
|
|
26
|
+
export const isBinaryFile = async (file: File): Promise<boolean> => {
|
|
27
|
+
const chunkSize = 1024;
|
|
28
|
+
const buffer = new Uint8Array(await file.slice(0, chunkSize).arrayBuffer());
|
|
29
|
+
|
|
30
|
+
for (let i = 0; i < buffer.length; i++) {
|
|
31
|
+
const byte = buffer[i];
|
|
32
|
+
|
|
33
|
+
if (byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return false;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const shouldIncludeFile = (path: string): boolean => {
|
|
42
|
+
return !ig.ignores(path);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const readPackageJson = async (files: File[]): Promise<{ scripts?: Record<string, string> } | null> => {
|
|
46
|
+
const packageJsonFile = files.find((f) => f.webkitRelativePath.endsWith('package.json'));
|
|
47
|
+
|
|
48
|
+
if (!packageJsonFile) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
const content = await new Promise<string>((resolve, reject) => {
|
|
54
|
+
const reader = new FileReader();
|
|
55
|
+
reader.onload = () => resolve(reader.result as string);
|
|
56
|
+
reader.onerror = reject;
|
|
57
|
+
reader.readAsText(packageJsonFile);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return JSON.parse(content);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.error('Error reading package.json:', error);
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const detectProjectType = async (
|
|
68
|
+
files: File[],
|
|
69
|
+
): Promise<{ type: string; setupCommand: string; followupMessage: string }> => {
|
|
70
|
+
const hasFile = (name: string) => files.some((f) => f.webkitRelativePath.endsWith(name));
|
|
71
|
+
|
|
72
|
+
if (hasFile('package.json')) {
|
|
73
|
+
const packageJson = await readPackageJson(files);
|
|
74
|
+
const scripts = packageJson?.scripts || {};
|
|
75
|
+
|
|
76
|
+
// Check for preferred commands in priority order
|
|
77
|
+
const preferredCommands = ['dev', 'start', 'preview'];
|
|
78
|
+
const availableCommand = preferredCommands.find((cmd) => scripts[cmd]);
|
|
79
|
+
|
|
80
|
+
if (availableCommand) {
|
|
81
|
+
return {
|
|
82
|
+
type: 'Node.js',
|
|
83
|
+
setupCommand: `npm install && npm run ${availableCommand}`,
|
|
84
|
+
followupMessage: `Found "${availableCommand}" script in package.json. Running "npm run ${availableCommand}" after installation.`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
type: 'Node.js',
|
|
90
|
+
setupCommand: 'npm install',
|
|
91
|
+
followupMessage:
|
|
92
|
+
'Would you like me to inspect package.json to determine the available scripts for running this project?',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (hasFile('index.html')) {
|
|
97
|
+
return {
|
|
98
|
+
type: 'Static',
|
|
99
|
+
setupCommand: 'npx --yes serve',
|
|
100
|
+
followupMessage: '',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return { type: '', setupCommand: '', followupMessage: '' };
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export const filesToArtifacts = (files: { [path: string]: { content: string } }, id: string): string => {
|
|
108
|
+
return `
|
|
109
|
+
<boltArtifact id="${id}" title="User Updated Files">
|
|
110
|
+
${Object.keys(files)
|
|
111
|
+
.map(
|
|
112
|
+
(filePath) => `
|
|
113
|
+
<boltAction type="file" filePath="${filePath}">
|
|
114
|
+
${files[filePath].content}
|
|
115
|
+
</boltAction>
|
|
116
|
+
`,
|
|
117
|
+
)
|
|
118
|
+
.join('\n')}
|
|
119
|
+
</boltArtifact>
|
|
120
|
+
`;
|
|
121
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { Message } from 'ai';
|
|
2
|
+
import { generateId } from './fileUtils';
|
|
3
|
+
import { detectProjectCommands, createCommandsMessage, escapeBoltTags } from './projectCommands';
|
|
4
|
+
|
|
5
|
+
export const createChatFromFolder = async (
|
|
6
|
+
files: File[],
|
|
7
|
+
binaryFiles: string[],
|
|
8
|
+
folderName: string,
|
|
9
|
+
): Promise<Message[]> => {
|
|
10
|
+
const fileArtifacts = await Promise.all(
|
|
11
|
+
files.map(async (file) => {
|
|
12
|
+
return new Promise<{ content: string; path: string }>((resolve, reject) => {
|
|
13
|
+
const reader = new FileReader();
|
|
14
|
+
|
|
15
|
+
reader.onload = () => {
|
|
16
|
+
const content = reader.result as string;
|
|
17
|
+
const relativePath = file.webkitRelativePath.split('/').slice(1).join('/');
|
|
18
|
+
resolve({
|
|
19
|
+
content,
|
|
20
|
+
path: relativePath,
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
reader.onerror = reject;
|
|
24
|
+
reader.readAsText(file);
|
|
25
|
+
});
|
|
26
|
+
}),
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
const commands = await detectProjectCommands(fileArtifacts);
|
|
30
|
+
const commandsMessage = createCommandsMessage(commands);
|
|
31
|
+
|
|
32
|
+
const binaryFilesMessage =
|
|
33
|
+
binaryFiles.length > 0
|
|
34
|
+
? `\n\nSkipped ${binaryFiles.length} binary files:\n${binaryFiles.map((f) => `- ${f}`).join('\n')}`
|
|
35
|
+
: '';
|
|
36
|
+
|
|
37
|
+
const filesMessage: Message = {
|
|
38
|
+
role: 'assistant',
|
|
39
|
+
content: `I've imported the contents of the "${folderName}" folder.${binaryFilesMessage}
|
|
40
|
+
|
|
41
|
+
<boltArtifact id="imported-files" title="Imported Files" type="bundled" >
|
|
42
|
+
${fileArtifacts
|
|
43
|
+
.map(
|
|
44
|
+
(file) => `<boltAction type="file" filePath="${file.path}">
|
|
45
|
+
${escapeBoltTags(file.content)}
|
|
46
|
+
</boltAction>`,
|
|
47
|
+
)
|
|
48
|
+
.join('\n\n')}
|
|
49
|
+
</boltArtifact>`,
|
|
50
|
+
id: generateId(),
|
|
51
|
+
createdAt: new Date(),
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const userMessage: Message = {
|
|
55
|
+
role: 'user',
|
|
56
|
+
id: generateId(),
|
|
57
|
+
content: `Import the "${folderName}" folder`,
|
|
58
|
+
createdAt: new Date(),
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const messages = [userMessage, filesMessage];
|
|
62
|
+
|
|
63
|
+
if (commandsMessage) {
|
|
64
|
+
messages.push({
|
|
65
|
+
role: 'user',
|
|
66
|
+
id: generateId(),
|
|
67
|
+
content: 'Setup the codebase and Start the application',
|
|
68
|
+
});
|
|
69
|
+
messages.push(commandsMessage);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return messages;
|
|
73
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function formatSize(bytes: number): string {
|
|
2
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
3
|
+
let size = bytes;
|
|
4
|
+
let unitIndex = 0;
|
|
5
|
+
|
|
6
|
+
while (size >= 1024 && unitIndex < units.length - 1) {
|
|
7
|
+
size /= 1024;
|
|
8
|
+
unitIndex++;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return `${size.toFixed(1)} ${units[unitIndex]}`;
|
|
12
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const getLanguageFromExtension = (ext: string): string => {
|
|
2
|
+
const map: Record<string, string> = {
|
|
3
|
+
js: 'javascript',
|
|
4
|
+
jsx: 'jsx',
|
|
5
|
+
ts: 'typescript',
|
|
6
|
+
tsx: 'tsx',
|
|
7
|
+
json: 'json',
|
|
8
|
+
html: 'html',
|
|
9
|
+
css: 'css',
|
|
10
|
+
py: 'python',
|
|
11
|
+
java: 'java',
|
|
12
|
+
rb: 'ruby',
|
|
13
|
+
cpp: 'cpp',
|
|
14
|
+
c: 'c',
|
|
15
|
+
cs: 'csharp',
|
|
16
|
+
go: 'go',
|
|
17
|
+
rs: 'rust',
|
|
18
|
+
php: 'php',
|
|
19
|
+
swift: 'swift',
|
|
20
|
+
md: 'plaintext',
|
|
21
|
+
sh: 'bash',
|
|
22
|
+
};
|
|
23
|
+
return map[ext] || 'typescript';
|
|
24
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { GitLabProjectInfo, GitLabStats } from '~/types/GitLab';
|
|
2
|
+
|
|
3
|
+
export function calculateProjectStats(projects: any[]): { projects: GitLabProjectInfo[] } {
|
|
4
|
+
const projectStats = {
|
|
5
|
+
projects: projects.map((project: any) => ({
|
|
6
|
+
id: project.id,
|
|
7
|
+
name: project.name,
|
|
8
|
+
path_with_namespace: project.path_with_namespace,
|
|
9
|
+
description: project.description,
|
|
10
|
+
http_url_to_repo: project.http_url_to_repo,
|
|
11
|
+
star_count: project.star_count || 0,
|
|
12
|
+
forks_count: project.forks_count || 0,
|
|
13
|
+
default_branch: project.default_branch,
|
|
14
|
+
updated_at: project.updated_at,
|
|
15
|
+
visibility: project.visibility,
|
|
16
|
+
})),
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
return projectStats;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function calculateStatsSummary(
|
|
23
|
+
projects: GitLabProjectInfo[],
|
|
24
|
+
events: any[],
|
|
25
|
+
groups: any[],
|
|
26
|
+
snippets: any[],
|
|
27
|
+
user: any,
|
|
28
|
+
): GitLabStats {
|
|
29
|
+
const totalStars = projects.reduce((sum, p) => sum + (p.star_count || 0), 0);
|
|
30
|
+
const totalForks = projects.reduce((sum, p) => sum + (p.forks_count || 0), 0);
|
|
31
|
+
const privateProjects = projects.filter((p) => p.visibility === 'private').length;
|
|
32
|
+
|
|
33
|
+
const recentActivity = events.slice(0, 5).map((event: any) => ({
|
|
34
|
+
id: event.id,
|
|
35
|
+
action_name: event.action_name,
|
|
36
|
+
project_id: event.project_id,
|
|
37
|
+
project: event.project,
|
|
38
|
+
created_at: event.created_at,
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
projects,
|
|
43
|
+
recentActivity,
|
|
44
|
+
totalSnippets: snippets.length,
|
|
45
|
+
publicProjects: projects.filter((p) => p.visibility === 'public').length,
|
|
46
|
+
privateProjects,
|
|
47
|
+
stars: totalStars,
|
|
48
|
+
forks: totalForks,
|
|
49
|
+
followers: user.followers || 0,
|
|
50
|
+
snippets: snippets.length,
|
|
51
|
+
groups,
|
|
52
|
+
lastUpdated: new Date().toISOString(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
export type DebugLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'none';
|
|
2
|
+
import { Chalk } from 'chalk';
|
|
3
|
+
|
|
4
|
+
const chalk = new Chalk({ level: 3 });
|
|
5
|
+
|
|
6
|
+
type LoggerFunction = (...messages: any[]) => void;
|
|
7
|
+
|
|
8
|
+
interface Logger {
|
|
9
|
+
trace: LoggerFunction;
|
|
10
|
+
debug: LoggerFunction;
|
|
11
|
+
info: LoggerFunction;
|
|
12
|
+
warn: LoggerFunction;
|
|
13
|
+
error: LoggerFunction;
|
|
14
|
+
setLevel: (level: DebugLevel) => void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let currentLevel: DebugLevel = import.meta.env.VITE_LOG_LEVEL || (import.meta.env.DEV ? 'debug' : 'info');
|
|
18
|
+
|
|
19
|
+
export const logger: Logger = {
|
|
20
|
+
trace: (...messages: any[]) => logWithDebugCapture('trace', undefined, messages),
|
|
21
|
+
debug: (...messages: any[]) => logWithDebugCapture('debug', undefined, messages),
|
|
22
|
+
info: (...messages: any[]) => logWithDebugCapture('info', undefined, messages),
|
|
23
|
+
warn: (...messages: any[]) => logWithDebugCapture('warn', undefined, messages),
|
|
24
|
+
error: (...messages: any[]) => logWithDebugCapture('error', undefined, messages),
|
|
25
|
+
setLevel,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export function createScopedLogger(scope: string): Logger {
|
|
29
|
+
return {
|
|
30
|
+
trace: (...messages: any[]) => logWithDebugCapture('trace', scope, messages),
|
|
31
|
+
debug: (...messages: any[]) => logWithDebugCapture('debug', scope, messages),
|
|
32
|
+
info: (...messages: any[]) => logWithDebugCapture('info', scope, messages),
|
|
33
|
+
warn: (...messages: any[]) => logWithDebugCapture('warn', scope, messages),
|
|
34
|
+
error: (...messages: any[]) => logWithDebugCapture('error', scope, messages),
|
|
35
|
+
setLevel,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function setLevel(level: DebugLevel) {
|
|
40
|
+
if ((level === 'trace' || level === 'debug') && import.meta.env.PROD) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
currentLevel = level;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function log(level: DebugLevel, scope: string | undefined, messages: any[]) {
|
|
48
|
+
const levelOrder: DebugLevel[] = ['trace', 'debug', 'info', 'warn', 'error', 'none'];
|
|
49
|
+
|
|
50
|
+
if (levelOrder.indexOf(level) < levelOrder.indexOf(currentLevel)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// If current level is 'none', don't log anything
|
|
55
|
+
if (currentLevel === 'none') {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const allMessages = messages.reduce((acc, current) => {
|
|
60
|
+
if (acc.endsWith('\n')) {
|
|
61
|
+
return acc + current;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!acc) {
|
|
65
|
+
return current;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return `${acc} ${current}`;
|
|
69
|
+
}, '');
|
|
70
|
+
|
|
71
|
+
const labelBackgroundColor = getColorForLevel(level);
|
|
72
|
+
const labelTextColor = level === 'warn' ? '#000000' : '#FFFFFF';
|
|
73
|
+
|
|
74
|
+
const labelStyles = getLabelStyles(labelBackgroundColor, labelTextColor);
|
|
75
|
+
const scopeStyles = getLabelStyles('#77828D', 'white');
|
|
76
|
+
|
|
77
|
+
const styles = [labelStyles];
|
|
78
|
+
|
|
79
|
+
if (typeof scope === 'string') {
|
|
80
|
+
styles.push('', scopeStyles);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
let labelText = formatText(` ${level.toUpperCase()} `, labelTextColor, labelBackgroundColor);
|
|
84
|
+
|
|
85
|
+
if (scope) {
|
|
86
|
+
labelText = `${labelText} ${formatText(` ${scope} `, '#FFFFFF', '77828D')}`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (typeof window !== 'undefined') {
|
|
90
|
+
console.log(`%c${level.toUpperCase()}${scope ? `%c %c${scope}` : ''}`, ...styles, allMessages);
|
|
91
|
+
} else {
|
|
92
|
+
console.log(`${labelText}`, allMessages);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function formatText(text: string, color: string, bg: string) {
|
|
97
|
+
return chalk.bgHex(bg)(chalk.hex(color)(text));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function getLabelStyles(color: string, textColor: string) {
|
|
101
|
+
return `background-color: ${color}; color: white; border: 4px solid ${color}; color: ${textColor};`;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function getColorForLevel(level: DebugLevel): string {
|
|
105
|
+
switch (level) {
|
|
106
|
+
case 'trace':
|
|
107
|
+
case 'debug': {
|
|
108
|
+
return '#77828D';
|
|
109
|
+
}
|
|
110
|
+
case 'info': {
|
|
111
|
+
return '#1389FD';
|
|
112
|
+
}
|
|
113
|
+
case 'warn': {
|
|
114
|
+
return '#FFDB6C';
|
|
115
|
+
}
|
|
116
|
+
case 'error': {
|
|
117
|
+
return '#EE4744';
|
|
118
|
+
}
|
|
119
|
+
default: {
|
|
120
|
+
return '#000000';
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export const renderLogger = createScopedLogger('Render');
|
|
126
|
+
|
|
127
|
+
// Debug logging integration
|
|
128
|
+
let debugLogger: any = null;
|
|
129
|
+
|
|
130
|
+
// Lazy load debug logger to avoid circular dependencies
|
|
131
|
+
const getDebugLogger = () => {
|
|
132
|
+
if (!debugLogger && typeof window !== 'undefined') {
|
|
133
|
+
try {
|
|
134
|
+
// Use dynamic import asynchronously but don't block the function
|
|
135
|
+
import('./debugLogger')
|
|
136
|
+
.then(({ debugLogger: loggerInstance }) => {
|
|
137
|
+
debugLogger = loggerInstance;
|
|
138
|
+
})
|
|
139
|
+
.catch(() => {
|
|
140
|
+
// Debug logger not available, skip integration
|
|
141
|
+
});
|
|
142
|
+
} catch {
|
|
143
|
+
// Debug logger not available, skip integration
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return debugLogger;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// Override the log function to also capture to debug logger
|
|
151
|
+
|
|
152
|
+
function logWithDebugCapture(level: DebugLevel, scope: string | undefined, messages: any[]) {
|
|
153
|
+
// Call original log function (the one that does the actual console logging)
|
|
154
|
+
log(level, scope, messages);
|
|
155
|
+
|
|
156
|
+
// Also capture to debug logger if available
|
|
157
|
+
const debug = getDebugLogger();
|
|
158
|
+
|
|
159
|
+
if (debug) {
|
|
160
|
+
debug.captureLog(level, scope, messages);
|
|
161
|
+
}
|
|
162
|
+
}
|