devpush 0.0.0-stage → 1.0.0-beta.3
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.
- package/README.md +6 -2
- package/agent-release.json +37 -0
- package/dist/package/LICENSE.md +21 -0
- package/dist/package/migrate.mjs +182 -0
- package/dist/package/plugins.mjs +125 -0
- package/dist/package/vite.mjs +439 -0
- package/package.json +170 -4
- package/public/apple-touch-icon.png +0 -0
- package/public/favicon.svg +1 -0
- package/public/logo-email.png +0 -0
- package/public/robots.txt +3 -0
- package/public/social.png +0 -0
- package/src/cloudflare-runtime.d.ts +78 -0
- package/src/components/about-dialog.tsx +70 -0
- package/src/components/copy-button.tsx +74 -0
- package/src/components/logo-mark.tsx +20 -0
- package/src/components/pending-collection.tsx +103 -0
- package/src/components/resource-avatar.tsx +65 -0
- package/src/components/route-error-state.tsx +95 -0
- package/src/components/section-navigation.tsx +39 -0
- package/src/components/settings-layout.tsx +111 -0
- package/src/components/storage-capabilities.tsx +11 -0
- package/src/components/table-pager.tsx +101 -0
- package/src/components/ui/alert-dialog.tsx +180 -0
- package/src/components/ui/alert.tsx +78 -0
- package/src/components/ui/avatar.tsx +58 -0
- package/src/components/ui/badge.tsx +49 -0
- package/src/components/ui/button-group.tsx +38 -0
- package/src/components/ui/button.tsx +67 -0
- package/src/components/ui/card.tsx +82 -0
- package/src/components/ui/chart.tsx +307 -0
- package/src/components/ui/checkbox.tsx +30 -0
- package/src/components/ui/combobox.tsx +256 -0
- package/src/components/ui/dialog.tsx +163 -0
- package/src/components/ui/dropdown-menu.tsx +110 -0
- package/src/components/ui/empty.tsx +65 -0
- package/src/components/ui/field.tsx +192 -0
- package/src/components/ui/input-group.tsx +118 -0
- package/src/components/ui/input-otp.tsx +70 -0
- package/src/components/ui/input.tsx +19 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/pagination.tsx +34 -0
- package/src/components/ui/popover.tsx +86 -0
- package/src/components/ui/select.tsx +145 -0
- package/src/components/ui/skeleton.tsx +19 -0
- package/src/components/ui/sonner.tsx +47 -0
- package/src/components/ui/switch.tsx +31 -0
- package/src/components/ui/table.tsx +81 -0
- package/src/components/ui/textarea.tsx +18 -0
- package/src/components/ui/tooltip.tsx +55 -0
- package/src/features/admin/admin-settings.tsx +1048 -0
- package/src/features/auth/current-user-context-query.ts +11 -0
- package/src/features/auth/login-form.tsx +442 -0
- package/src/features/auth/sign-out-menu-item.tsx +42 -0
- package/src/features/deployments/deployment-actions.tsx +336 -0
- package/src/features/deployments/deployment-alias-badge.tsx +35 -0
- package/src/features/deployments/deployment-detail.tsx +596 -0
- package/src/features/deployments/deployment-filters.ts +66 -0
- package/src/features/deployments/deployment-list.tsx +465 -0
- package/src/features/deployments/deployment-visit-links.tsx +104 -0
- package/src/features/deployments/deployments-page.tsx +376 -0
- package/src/features/logs/log-scroll-area.tsx +69 -0
- package/src/features/notifications/email-preferences.tsx +232 -0
- package/src/features/onboarding/profile-onboarding.tsx +162 -0
- package/src/features/plugins/contributions.tsx +118 -0
- package/src/features/projects/backup-job-logs.tsx +143 -0
- package/src/features/projects/backup-policy-delete-dialog.tsx +82 -0
- package/src/features/projects/backup-restore-actions.tsx +573 -0
- package/src/features/projects/backup-status-icon.tsx +33 -0
- package/src/features/projects/backup-target-list.tsx +222 -0
- package/src/features/projects/backup-timestamp.tsx +32 -0
- package/src/features/projects/backup-volume-picker.tsx +158 -0
- package/src/features/projects/compose-service-input.tsx +64 -0
- package/src/features/projects/deploy-readiness.ts +28 -0
- package/src/features/projects/environment-dot.tsx +91 -0
- package/src/features/projects/log-keyword-filter.tsx +48 -0
- package/src/features/projects/manual-deploy-dialog.tsx +563 -0
- package/src/features/projects/pending-section.ts +26 -0
- package/src/features/projects/project-backup-details-pending.tsx +305 -0
- package/src/features/projects/project-backup-details.tsx +936 -0
- package/src/features/projects/project-backup-policy.tsx +644 -0
- package/src/features/projects/project-backup-utils.ts +190 -0
- package/src/features/projects/project-backups-pending.tsx +136 -0
- package/src/features/projects/project-backups.tsx +876 -0
- package/src/features/projects/project-environment-settings.tsx +1128 -0
- package/src/features/projects/project-heading.tsx +68 -0
- package/src/features/projects/project-layout.tsx +188 -0
- package/src/features/projects/project-logs.tsx +461 -0
- package/src/features/projects/project-overview.tsx +280 -0
- package/src/features/projects/project-route-pending.tsx +1064 -0
- package/src/features/projects/project-routing-settings.tsx +663 -0
- package/src/features/projects/project-settings-section.tsx +64 -0
- package/src/features/projects/project-settings-utils.ts +101 -0
- package/src/features/projects/project-settings.tsx +1472 -0
- package/src/features/projects/repository-picker-dialog.tsx +404 -0
- package/src/features/repositories/new-project-dialog-launcher.tsx +44 -0
- package/src/features/repositories/new-project-dialog.tsx +1204 -0
- package/src/features/repositories/new-project-pending.tsx +28 -0
- package/src/features/repositories/repository-list-pending.tsx +59 -0
- package/src/features/servers/server-availability-alert.tsx +44 -0
- package/src/features/servers/server-availability.ts +29 -0
- package/src/features/servers/server-avatar.tsx +52 -0
- package/src/features/servers/server-detail-pending.tsx +315 -0
- package/src/features/servers/server-detail.tsx +855 -0
- package/src/features/servers/server-metric-chart-pending.tsx +38 -0
- package/src/features/servers/server-metric-chart.tsx +182 -0
- package/src/features/servers/server-metric-format.ts +50 -0
- package/src/features/servers/server-metrics-pending.tsx +75 -0
- package/src/features/servers/server-metrics.tsx +136 -0
- package/src/features/servers/team-servers.tsx +432 -0
- package/src/features/settings/settings-route-pending.tsx +406 -0
- package/src/features/teams/backup-storage-settings.tsx +483 -0
- package/src/features/teams/navigation.ts +51 -0
- package/src/features/teams/new-team-dialog.tsx +132 -0
- package/src/features/teams/pending-section.ts +19 -0
- package/src/features/teams/team-header.tsx +1286 -0
- package/src/features/teams/team-heading.tsx +57 -0
- package/src/features/teams/team-home.tsx +391 -0
- package/src/features/teams/team-invite.tsx +155 -0
- package/src/features/teams/team-route-pending.tsx +505 -0
- package/src/features/teams/team-settings.tsx +1555 -0
- package/src/features/teams/use-workspace-updates.ts +126 -0
- package/src/features/users/api-keys-settings.tsx +544 -0
- package/src/features/users/api-scope-selection.tsx +269 -0
- package/src/features/users/connected-apps-settings.tsx +449 -0
- package/src/features/users/mcp-consent.tsx +220 -0
- package/src/features/users/profile-picture.tsx +171 -0
- package/src/features/users/user-settings.tsx +1064 -0
- package/src/lib/account-settings-schema.ts +78 -0
- package/src/lib/action-feedback.ts +81 -0
- package/src/lib/admin-search-schema.ts +8 -0
- package/src/lib/agent-release.d.mts +21 -0
- package/src/lib/agent-release.mjs +90 -0
- package/src/lib/allowlist-schema.ts +79 -0
- package/src/lib/api-key-schema.ts +176 -0
- package/src/lib/auth/client.ts +20 -0
- package/src/lib/avatar-schema.ts +11 -0
- package/src/lib/backup-cron.ts +118 -0
- package/src/lib/backup-database.ts +41 -0
- package/src/lib/backup-feature.ts +2 -0
- package/src/lib/backup-paths.ts +7 -0
- package/src/lib/backup-policy-schema.ts +85 -0
- package/src/lib/backup-resource-schema.ts +12 -0
- package/src/lib/backup-restore-schema.ts +15 -0
- package/src/lib/backup-storage-schema.ts +55 -0
- package/src/lib/deferred-module.ts +38 -0
- package/src/lib/deployment-logs-query.ts +63 -0
- package/src/lib/display-name.ts +7 -0
- package/src/lib/error-message.ts +119 -0
- package/src/lib/form-errors.ts +10 -0
- package/src/lib/internal-redirect.ts +25 -0
- package/src/lib/manual-deploy-options-query.ts +21 -0
- package/src/lib/notification-preferences.ts +43 -0
- package/src/lib/onboarding.ts +11 -0
- package/src/lib/operation-logs-query.ts +51 -0
- package/src/lib/page-head.ts +14 -0
- package/src/lib/project-context-query.ts +257 -0
- package/src/lib/project-creation-schema.ts +64 -0
- package/src/lib/project-env-schema.ts +23 -0
- package/src/lib/project-environments-schema.ts +56 -0
- package/src/lib/project-routing-schema.ts +94 -0
- package/src/lib/project-runtime-config.ts +131 -0
- package/src/lib/project-settings-schema.ts +75 -0
- package/src/lib/public-api-schema.ts +128 -0
- package/src/lib/public-error.ts +337 -0
- package/src/lib/query.ts +13 -0
- package/src/lib/repository-selection-query.ts +11 -0
- package/src/lib/resource-cache.ts +30 -0
- package/src/lib/runtime-id.ts +19 -0
- package/src/lib/search.ts +14 -0
- package/src/lib/server-context-query.ts +43 -0
- package/src/lib/server-name-schema.ts +11 -0
- package/src/lib/settings-conflict.ts +45 -0
- package/src/lib/settings-version.ts +7 -0
- package/src/lib/team-context-query.ts +126 -0
- package/src/lib/team-context-schema.ts +8 -0
- package/src/lib/team-forms-schema.ts +45 -0
- package/src/lib/team-role.ts +13 -0
- package/src/lib/team-settings-schema.ts +48 -0
- package/src/lib/urls.ts +3 -0
- package/src/lib/use-avatar-input.ts +61 -0
- package/src/lib/use-refresh-error.ts +18 -0
- package/src/lib/use-settings-version.ts +23 -0
- package/src/lib/utils.ts +6 -0
- package/src/lib/validation.ts +5 -0
- package/src/lib/workspace-updates.ts +53 -0
- package/src/package/config.ts +10 -0
- package/src/package/env.mjs +54 -0
- package/src/package/migrate-api.d.ts +5 -0
- package/src/package/migrate.ts +56 -0
- package/src/package/plugins.ts +141 -0
- package/src/package/sqlite.mjs +2 -0
- package/src/package/vite-api.d.ts +5 -0
- package/src/package/vite.ts +324 -0
- package/src/package/watch-guard.cjs +26 -0
- package/src/plugins/client.ts +57 -0
- package/src/plugins/contract.ts +188 -0
- package/src/plugins/default.server.ts +4 -0
- package/src/plugins/default.ui.ts +4 -0
- package/src/plugins/operations.ts +45 -0
- package/src/plugins/server.ts +197 -0
- package/src/plugins/version.ts +1 -0
- package/src/routeTree.gen.ts +1275 -0
- package/src/router.tsx +46 -0
- package/src/routes/$teamSlug.index.tsx +53 -0
- package/src/routes/$teamSlug.new-project.tsx +13 -0
- package/src/routes/$teamSlug.projects.$projectName.backups.$backupId.tsx +40 -0
- package/src/routes/$teamSlug.projects.$projectName.backups.tsx +82 -0
- package/src/routes/$teamSlug.projects.$projectName.deployments.$deploymentId.tsx +52 -0
- package/src/routes/$teamSlug.projects.$projectName.deployments.tsx +86 -0
- package/src/routes/$teamSlug.projects.$projectName.logs.tsx +55 -0
- package/src/routes/$teamSlug.projects.$projectName.settings.tsx +51 -0
- package/src/routes/$teamSlug.projects.$projectName.tsx +106 -0
- package/src/routes/$teamSlug.projects.tsx +40 -0
- package/src/routes/$teamSlug.servers.$serverId.tsx +31 -0
- package/src/routes/$teamSlug.servers.index.tsx +59 -0
- package/src/routes/$teamSlug.servers.tsx +7 -0
- package/src/routes/$teamSlug.settings.tsx +56 -0
- package/src/routes/$teamSlug.tsx +86 -0
- package/src/routes/[.]well-known.oauth-authorization-server.api.auth.ts +13 -0
- package/src/routes/[.]well-known.oauth-protected-resource.mcp.ts +6 -0
- package/src/routes/__root.tsx +155 -0
- package/src/routes/admin.tsx +55 -0
- package/src/routes/api/agents/certificates.ts +21 -0
- package/src/routes/api/agents/credentials/rotate.ts +22 -0
- package/src/routes/api/agents/heartbeat.ts +42 -0
- package/src/routes/api/agents/job-logs.ts +22 -0
- package/src/routes/api/agents/jobs/complete.ts +22 -0
- package/src/routes/api/agents/jobs/next.ts +29 -0
- package/src/routes/api/agents/jobs/progress.ts +32 -0
- package/src/routes/api/agents/jobs/status.ts +22 -0
- package/src/routes/api/agents/register.ts +45 -0
- package/src/routes/api/agents/runtime-logs.ts +22 -0
- package/src/routes/api/agents/switch.ts +25 -0
- package/src/routes/api/auth/$.ts +38 -0
- package/src/routes/api/cron/backups.ts +33 -0
- package/src/routes/api/cron/maintenance.ts +30 -0
- package/src/routes/api/github/install.callback.ts +51 -0
- package/src/routes/api/github/install.ts +41 -0
- package/src/routes/api/github/webhook.ts +11 -0
- package/src/routes/api/health.ts +19 -0
- package/src/routes/api/install/agent.$token.ts +50 -0
- package/src/routes/api/install/agent.binary.ts +83 -0
- package/src/routes/api/install/agent.checksum.ts +45 -0
- package/src/routes/api/install/agent.ts +26 -0
- package/src/routes/api/plugins/$.ts +11 -0
- package/src/routes/api/v1/$.ts +15 -0
- package/src/routes/api/workspaces/updates.ts +8 -0
- package/src/routes/auth.login.tsx +50 -0
- package/src/routes/deployments.$deploymentId.unavailable.tsx +21 -0
- package/src/routes/index.tsx +23 -0
- package/src/routes/invites.$token.tsx +35 -0
- package/src/routes/mcp.ts +13 -0
- package/src/routes/oauth.consent.tsx +54 -0
- package/src/routes/onboarding.tsx +37 -0
- package/src/routes/onboarding.workspace.tsx +44 -0
- package/src/routes/settings.tsx +30 -0
- package/src/routes/uploads/avatars/$fileName.ts +44 -0
- package/src/server/admin/access.ts +67 -0
- package/src/server/admin/functions.ts +122 -0
- package/src/server/admin/service.ts +260 -0
- package/src/server/agents/backup-state.ts +210 -0
- package/src/server/agents/certificates.ts +96 -0
- package/src/server/agents/claims.ts +116 -0
- package/src/server/agents/cleanup.ts +52 -0
- package/src/server/agents/compatibility.ts +116 -0
- package/src/server/agents/completion.ts +83 -0
- package/src/server/agents/container-cleanup-state.ts +51 -0
- package/src/server/agents/deployment-state.ts +111 -0
- package/src/server/agents/job-payloads.ts +159 -0
- package/src/server/agents/jobs.ts +1293 -0
- package/src/server/agents/protocol.ts +400 -0
- package/src/server/agents/reconciliation.ts +43 -0
- package/src/server/agents/runtime-logs.ts +337 -0
- package/src/server/agents/runtime-state.ts +125 -0
- package/src/server/api/admission.ts +12 -0
- package/src/server/api/authorization.ts +115 -0
- package/src/server/api/credentials.ts +569 -0
- package/src/server/api/cursors.ts +72 -0
- package/src/server/api/errors.ts +24 -0
- package/src/server/api/functions.ts +60 -0
- package/src/server/api/handler.ts +274 -0
- package/src/server/api/mutation-operations.ts +913 -0
- package/src/server/api/operation-context.ts +139 -0
- package/src/server/api/operation-contract.ts +1099 -0
- package/src/server/api/operations.ts +64 -0
- package/src/server/api/read-operations.ts +891 -0
- package/src/server/api/retention.ts +33 -0
- package/src/server/auth/access.ts +109 -0
- package/src/server/auth/auth-methods.ts +28 -0
- package/src/server/auth/better-auth.ts +518 -0
- package/src/server/auth/context.ts +28 -0
- package/src/server/auth/email-change.ts +47 -0
- package/src/server/auth/email-delivery.ts +51 -0
- package/src/server/auth/provider-identity.ts +19 -0
- package/src/server/auth/provider-tokens.ts +27 -0
- package/src/server/auth/session.server.ts +19 -0
- package/src/server/backups/database-commands.ts +40 -0
- package/src/server/backups/destination.ts +12 -0
- package/src/server/backups/feature.ts +6 -0
- package/src/server/backups/policy-validation.ts +51 -0
- package/src/server/backups/queue-state.ts +137 -0
- package/src/server/backups/service.ts +918 -0
- package/src/server/backups/storage-functions.ts +42 -0
- package/src/server/backups/storage-state.ts +67 -0
- package/src/server/backups/storage.ts +237 -0
- package/src/server/config.ts +274 -0
- package/src/server/db/atomic.ts +16 -0
- package/src/server/db/d1-connection.ts +83 -0
- package/src/server/db/errors.ts +17 -0
- package/src/server/db/index.cloudflare.ts +15 -0
- package/src/server/db/index.ts +35 -0
- package/src/server/db/libsql-connection.ts +72 -0
- package/src/server/db/log-schema.ts +102 -0
- package/src/server/db/migrate-libsql.ts +29 -0
- package/src/server/db/migrate-sqlite.ts +47 -0
- package/src/server/db/migration-history.ts +12 -0
- package/src/server/db/migrations-logs/0000_initial.sql +48 -0
- package/src/server/db/migrations-logs/0001_runtime_log_order.sql +2 -0
- package/src/server/db/migrations-logs/meta/0000_snapshot.json +327 -0
- package/src/server/db/migrations-logs/meta/0001_snapshot.json +329 -0
- package/src/server/db/migrations-logs/meta/_journal.json +20 -0
- package/src/server/db/migrations-sqlite/0000_initial.sql +894 -0
- package/src/server/db/migrations-sqlite/0001_agent_indexes.sql +5 -0
- package/src/server/db/migrations-sqlite/meta/0000_snapshot.json +5816 -0
- package/src/server/db/migrations-sqlite/meta/0001_snapshot.json +5841 -0
- package/src/server/db/migrations-sqlite/meta/_journal.json +20 -0
- package/src/server/db/oauth-schema.ts +216 -0
- package/src/server/db/remote-config.ts +47 -0
- package/src/server/db/schema.ts +1218 -0
- package/src/server/db/sqlite-connection.ts +94 -0
- package/src/server/db/sqlite-files.ts +27 -0
- package/src/server/db/sqlite-params.ts +19 -0
- package/src/server/db/worker-connection.ts +47 -0
- package/src/server/deleted-resources.ts +133 -0
- package/src/server/deletion-recovery.ts +272 -0
- package/src/server/email/layout.tsx +85 -0
- package/src/server/email/notification-template.tsx +62 -0
- package/src/server/email/otp-template.tsx +48 -0
- package/src/server/email/service.ts +251 -0
- package/src/server/email/team-invite-template.tsx +59 -0
- package/src/server/email/theme.ts +10 -0
- package/src/server/github/http.ts +14 -0
- package/src/server/github/install-state.ts +48 -0
- package/src/server/github/service.ts +831 -0
- package/src/server/github/webhook-handler.ts +198 -0
- package/src/server/github/webhooks.ts +205 -0
- package/src/server/http/auth.ts +11 -0
- package/src/server/http/error-diagnostics.ts +66 -0
- package/src/server/http/plugin-request.ts +15 -0
- package/src/server/http/proxy-request.ts +53 -0
- package/src/server/http/public-errors.ts +48 -0
- package/src/server/http/rate-limit.ts +59 -0
- package/src/server/http/request-body.ts +54 -0
- package/src/server/http/request-ip.ts +54 -0
- package/src/server/http/security-headers.ts +36 -0
- package/src/server/install/agent-binary.ts +230 -0
- package/src/server/install/agent-script.ts +565 -0
- package/src/server/install/release-binary.ts +65 -0
- package/src/server/logs/budget.ts +72 -0
- package/src/server/logs/cleanup.ts +64 -0
- package/src/server/logs/deployments.ts +98 -0
- package/src/server/logs/operations.ts +145 -0
- package/src/server/logs/retention.ts +39 -0
- package/src/server/maintenance.ts +61 -0
- package/src/server/mcp/connections.ts +358 -0
- package/src/server/mcp/functions.ts +63 -0
- package/src/server/mcp/handler.ts +295 -0
- package/src/server/mcp/oauth-discovery.cloudflare.ts +6 -0
- package/src/server/mcp/oauth-discovery.ts +8 -0
- package/src/server/mcp/oauth-provider.ts +220 -0
- package/src/server/mcp/urls.ts +20 -0
- package/src/server/notifications/functions.ts +51 -0
- package/src/server/notifications/observe.ts +303 -0
- package/src/server/notifications/outbox.ts +335 -0
- package/src/server/notifications/preferences.ts +131 -0
- package/src/server/notifications/query.ts +16 -0
- package/src/server/plugins/scope.ts +17 -0
- package/src/server/plugins/server-context.ts +157 -0
- package/src/server/plugins/services.server.ts +10 -0
- package/src/server/plugins/workspace-access.ts +74 -0
- package/src/server/projects/backup-policy-state.ts +68 -0
- package/src/server/projects/backups.ts +219 -0
- package/src/server/projects/compose-metadata.ts +174 -0
- package/src/server/projects/configuration-state.ts +90 -0
- package/src/server/projects/context.ts +909 -0
- package/src/server/projects/creation-state.ts +46 -0
- package/src/server/projects/deletion-state.ts +69 -0
- package/src/server/projects/deployment-config.ts +139 -0
- package/src/server/projects/deployment-logs.ts +97 -0
- package/src/server/projects/deployments.ts +1123 -0
- package/src/server/projects/domain-state.ts +71 -0
- package/src/server/projects/environment-branches.ts +75 -0
- package/src/server/projects/environment-state.ts +158 -0
- package/src/server/projects/environments.ts +424 -0
- package/src/server/projects/functions.ts +748 -0
- package/src/server/projects/generated-hostname.ts +77 -0
- package/src/server/projects/hostnames.ts +244 -0
- package/src/server/projects/mappers.ts +457 -0
- package/src/server/projects/names.ts +41 -0
- package/src/server/projects/project-env-vars.ts +28 -0
- package/src/server/projects/queue-state.ts +118 -0
- package/src/server/projects/repository.ts +368 -0
- package/src/server/projects/route-state.ts +37 -0
- package/src/server/projects/runtime-logs.ts +97 -0
- package/src/server/projects/settings-context.ts +58 -0
- package/src/server/projects/settings.ts +738 -0
- package/src/server/projects/types.ts +355 -0
- package/src/server/realtime/agent-events.ts +32 -0
- package/src/server/realtime/node-broadcaster.ts +71 -0
- package/src/server/realtime/node-handler.ts +55 -0
- package/src/server/realtime/service.ts +125 -0
- package/src/server/realtime/workspace-object.cloudflare.ts +62 -0
- package/src/server/realtime/workspace-object.ts +3 -0
- package/src/server/resources/color.ts +13 -0
- package/src/server/runtime/background.ts +21 -0
- package/src/server/runtime/node-asset-cache-plugin.ts +12 -0
- package/src/server/runtime/node-scheduler-plugin.ts +17 -0
- package/src/server/runtime/node-scheduler.ts +51 -0
- package/src/server/runtime/platform-env.cloudflare.ts +17 -0
- package/src/server/runtime/platform-env.ts +19 -0
- package/src/server/runtime/scheduled-task-error.ts +9 -0
- package/src/server/scheduled-tasks.ts +28 -0
- package/src/server/secrets/crypto.ts +56 -0
- package/src/server/servers/functions.ts +233 -0
- package/src/server/servers/lifecycle.ts +122 -0
- package/src/server/servers/metric-history-schema.ts +24 -0
- package/src/server/servers/metric-history.ts +55 -0
- package/src/server/servers/monitoring.ts +592 -0
- package/src/server/servers/service.ts +1211 -0
- package/src/server/servers/status.ts +32 -0
- package/src/server/servers/switch.ts +96 -0
- package/src/server/settings-version.ts +43 -0
- package/src/server/storage/capabilities.ts +6 -0
- package/src/server/storage/local-object-store.cloudflare.ts +7 -0
- package/src/server/storage/local-object-store.ts +50 -0
- package/src/server/storage/object-store.ts +160 -0
- package/src/server/teams/creation.ts +51 -0
- package/src/server/teams/delete-policy.ts +13 -0
- package/src/server/teams/deletion-state.ts +80 -0
- package/src/server/teams/functions.ts +324 -0
- package/src/server/teams/invitations.ts +38 -0
- package/src/server/teams/membership.ts +86 -0
- package/src/server/teams/queries.ts +261 -0
- package/src/server/teams/service.ts +1127 -0
- package/src/server/teams/types.ts +101 -0
- package/src/server/uploads/avatar.ts +133 -0
- package/src/server/users/deletion-state.ts +93 -0
- package/src/server/users/functions.ts +160 -0
- package/src/server/users/onboarding.ts +17 -0
- package/src/server/users/service.ts +644 -0
- package/src/server.ts +55 -0
- package/src/styles/shadcn.css +653 -0
- package/src/styles/theme.css +76 -0
- package/src/styles.css +177 -0
- package/wrangler.template.jsonc +37 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { D1Database } from '@cloudflare/workers-types'
|
|
2
|
+
import { drizzle } from 'drizzle-orm/d1'
|
|
3
|
+
import type { BatchItem, BatchResponse } from 'drizzle-orm/batch'
|
|
4
|
+
import { sqliteParams } from './sqlite-params'
|
|
5
|
+
|
|
6
|
+
type PreparedBatchQuery = {
|
|
7
|
+
getQuery: () => { sql: string; params: unknown[] }
|
|
8
|
+
mapResult: (result: unknown, isFromBatch: boolean) => unknown
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function openD1<TSchema extends Record<string, unknown>>(
|
|
12
|
+
binding: D1Database,
|
|
13
|
+
schema: TSchema,
|
|
14
|
+
) {
|
|
15
|
+
// Raw SQL interpolations bypass Drizzle's column encoders. Keep their
|
|
16
|
+
// Date/boolean representation consistent with the other SQLite drivers.
|
|
17
|
+
const client = new Proxy(binding, {
|
|
18
|
+
get(target, property) {
|
|
19
|
+
if (property === 'prepare') {
|
|
20
|
+
return (query: string) =>
|
|
21
|
+
new Proxy(target.prepare(query), {
|
|
22
|
+
get(statement, method) {
|
|
23
|
+
if (method === 'bind') {
|
|
24
|
+
return (...params: unknown[]) =>
|
|
25
|
+
statement.bind(...sqliteParams(params))
|
|
26
|
+
}
|
|
27
|
+
const value: unknown = Reflect.get(statement, method, statement)
|
|
28
|
+
return typeof value === 'function' ? value.bind(statement) : value
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
const value: unknown = Reflect.get(target, property, target)
|
|
33
|
+
return typeof value === 'function' ? value.bind(target) : value
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
const database = drizzle(client, { schema })
|
|
37
|
+
return new Proxy(database, {
|
|
38
|
+
get(target, property) {
|
|
39
|
+
if (property === 'batch') {
|
|
40
|
+
// Drizzle's D1 batch implementation accesses preparedQuery.stmt, which
|
|
41
|
+
// raw SQL queries do not have. Prepare through the binding for both
|
|
42
|
+
// raw SQL and builders, then keep Drizzle's result mapping.
|
|
43
|
+
return async <
|
|
44
|
+
TItem extends BatchItem<'sqlite'>,
|
|
45
|
+
T extends Readonly<[TItem, ...TItem[]]>,
|
|
46
|
+
>(
|
|
47
|
+
queries: T,
|
|
48
|
+
): Promise<BatchResponse<T>> => {
|
|
49
|
+
// RunnableQuery omits the internal preparation method that both
|
|
50
|
+
// Drizzle batch implementations require. Keep that boundary here.
|
|
51
|
+
const prepared = queries.map((query) =>
|
|
52
|
+
(
|
|
53
|
+
query as TItem & { _prepare: () => PreparedBatchQuery }
|
|
54
|
+
)._prepare(),
|
|
55
|
+
)
|
|
56
|
+
const statements = prepared.map((query) => {
|
|
57
|
+
const built = query.getQuery()
|
|
58
|
+
return client.prepare(built.sql).bind(...built.params)
|
|
59
|
+
})
|
|
60
|
+
const results = await binding.batch(statements)
|
|
61
|
+
// The library's mapper returns unknown; the query tuple defines the
|
|
62
|
+
// corresponding result types, just as its built-in batch does.
|
|
63
|
+
return results.map((result, index) => {
|
|
64
|
+
const query = prepared[index]
|
|
65
|
+
if (!query) throw new Error('Unexpected D1 batch result count.')
|
|
66
|
+
return query.mapResult(result, true)
|
|
67
|
+
}) as BatchResponse<T>
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// D1 only supports transactions as a prebuilt atomic batch. Never let
|
|
71
|
+
// Drizzle's callback API issue BEGIN or simulate non-atomic statements.
|
|
72
|
+
if (property === 'transaction') {
|
|
73
|
+
return () => {
|
|
74
|
+
throw new Error(
|
|
75
|
+
'D1 requires atomic SQL batches; interactive transaction callbacks are unsupported.',
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const value: unknown = Reflect.get(target, property, target)
|
|
80
|
+
return typeof value === 'function' ? value.bind(target) : value
|
|
81
|
+
},
|
|
82
|
+
})
|
|
83
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function isUniqueConstraintError(error: unknown): boolean {
|
|
2
|
+
if (typeof error !== 'object' || error === null) return false
|
|
3
|
+
if (
|
|
4
|
+
'code' in error &&
|
|
5
|
+
(error.code === 'SQLITE_CONSTRAINT_UNIQUE' ||
|
|
6
|
+
error.code === 'SQLITE_CONSTRAINT_PRIMARYKEY')
|
|
7
|
+
)
|
|
8
|
+
return true
|
|
9
|
+
// D1 includes SQLite's failure in its message rather than a native code.
|
|
10
|
+
if (
|
|
11
|
+
'message' in error &&
|
|
12
|
+
typeof error.message === 'string' &&
|
|
13
|
+
/UNIQUE constraint failed:/i.test(error.message)
|
|
14
|
+
)
|
|
15
|
+
return true
|
|
16
|
+
return 'cause' in error && isUniqueConstraintError(error.cause)
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { env } from 'cloudflare:workers'
|
|
2
|
+
import { createWorkerDatabases } from './worker-connection'
|
|
3
|
+
|
|
4
|
+
export const { db, logsDb } = createWorkerDatabases(env)
|
|
5
|
+
|
|
6
|
+
export async function withDatabaseScope<TResult>(
|
|
7
|
+
callback: () => TResult | Promise<TResult>,
|
|
8
|
+
_defer?: (promise: Promise<unknown>) => void,
|
|
9
|
+
) {
|
|
10
|
+
return callback()
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function closeDb() {
|
|
14
|
+
// D1 has no pool; remote clients close after each operation.
|
|
15
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createClient } from '@libsql/client/web'
|
|
2
|
+
import { openLibsql } from './libsql-connection'
|
|
3
|
+
import { remoteDatabaseConfig } from './remote-config'
|
|
4
|
+
import { config } from '#devpush/server/config'
|
|
5
|
+
import { openSqlite } from './sqlite-connection'
|
|
6
|
+
import * as schema from './schema'
|
|
7
|
+
import * as logSchema from './log-schema'
|
|
8
|
+
import { assertSeparateSqliteFiles } from './sqlite-files'
|
|
9
|
+
|
|
10
|
+
const remote = remoteDatabaseConfig(config)
|
|
11
|
+
if (!remote)
|
|
12
|
+
assertSeparateSqliteFiles(
|
|
13
|
+
config.DEVPUSH_DATABASE_PATH,
|
|
14
|
+
config.DEVPUSH_LOG_DATABASE_PATH,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
const main = remote
|
|
18
|
+
? openLibsql(createClient(remote.main), schema)
|
|
19
|
+
: openSqlite(config.DEVPUSH_DATABASE_PATH, schema)
|
|
20
|
+
export const db = main.db
|
|
21
|
+
const logStore = remote
|
|
22
|
+
? openLibsql(createClient(remote.logs), logSchema)
|
|
23
|
+
: openSqlite(config.DEVPUSH_LOG_DATABASE_PATH, logSchema)
|
|
24
|
+
export const logsDb = logStore.db
|
|
25
|
+
|
|
26
|
+
export async function withDatabaseScope<TResult>(
|
|
27
|
+
callback: () => TResult | Promise<TResult>,
|
|
28
|
+
_defer?: (promise: Promise<unknown>) => void,
|
|
29
|
+
) {
|
|
30
|
+
return callback()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function closeDb() {
|
|
34
|
+
await Promise.all([main.close(), logStore.close()])
|
|
35
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { Client, ResultSet } from '@libsql/client'
|
|
2
|
+
import { drizzle } from 'drizzle-orm/sqlite-proxy'
|
|
3
|
+
import { sqliteParams } from './sqlite-params'
|
|
4
|
+
|
|
5
|
+
// Preserve positional columns, including duplicate names in joined rows.
|
|
6
|
+
function rows(result: ResultSet) {
|
|
7
|
+
return result.rows.map((row) => Array.from(row))
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function openLibsql<TSchema extends Record<string, unknown>>(
|
|
11
|
+
connection: Client | (() => Client),
|
|
12
|
+
schema: TSchema,
|
|
13
|
+
) {
|
|
14
|
+
async function useClient<TResult>(
|
|
15
|
+
operation: (client: Client) => Promise<TResult>,
|
|
16
|
+
) {
|
|
17
|
+
const client = typeof connection === 'function' ? connection() : connection
|
|
18
|
+
try {
|
|
19
|
+
return await operation(client)
|
|
20
|
+
} finally {
|
|
21
|
+
// Workers must not retain I/O resources across requests. A factory also
|
|
22
|
+
// keeps streaming responses and scheduled work independent of fetch scope.
|
|
23
|
+
if (typeof connection === 'function') client.close()
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const database = drizzle<TSchema>(
|
|
27
|
+
async (sql, params, method) => {
|
|
28
|
+
const result = rows(
|
|
29
|
+
await useClient((client) =>
|
|
30
|
+
client.execute({ sql, args: sqliteParams(params) }),
|
|
31
|
+
),
|
|
32
|
+
)
|
|
33
|
+
// Drizzle consumes undefined for a missing get() row, despite requiring
|
|
34
|
+
// an array in AsyncRemoteCallback's return type.
|
|
35
|
+
return {
|
|
36
|
+
rows:
|
|
37
|
+
method === 'get' ? (result[0] as (typeof result)[number]) : result,
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
async (queries) => {
|
|
41
|
+
const results = await useClient((client) =>
|
|
42
|
+
client.batch(
|
|
43
|
+
queries.map((query) => ({
|
|
44
|
+
sql: query.sql,
|
|
45
|
+
args: sqliteParams(query.params),
|
|
46
|
+
})),
|
|
47
|
+
'write',
|
|
48
|
+
),
|
|
49
|
+
)
|
|
50
|
+
return results.map((result) => ({ rows: rows(result) }))
|
|
51
|
+
},
|
|
52
|
+
{ schema },
|
|
53
|
+
)
|
|
54
|
+
const db = new Proxy(database, {
|
|
55
|
+
get(target, property) {
|
|
56
|
+
if (property === 'transaction')
|
|
57
|
+
return () => {
|
|
58
|
+
throw new Error(
|
|
59
|
+
'Use atomic SQL batches; callback transactions are unsupported by the libSQL adapter.',
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
const value: unknown = Reflect.get(target, property, target)
|
|
63
|
+
return typeof value === 'function' ? value.bind(target) : value
|
|
64
|
+
},
|
|
65
|
+
})
|
|
66
|
+
return {
|
|
67
|
+
db,
|
|
68
|
+
close: () => {
|
|
69
|
+
if (typeof connection !== 'function') connection.close()
|
|
70
|
+
},
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm'
|
|
2
|
+
import {
|
|
3
|
+
index,
|
|
4
|
+
integer,
|
|
5
|
+
sqliteTable,
|
|
6
|
+
text,
|
|
7
|
+
uniqueIndex,
|
|
8
|
+
} from 'drizzle-orm/sqlite-core'
|
|
9
|
+
|
|
10
|
+
const createdAt = () =>
|
|
11
|
+
integer('created_at', { mode: 'timestamp_ms' })
|
|
12
|
+
.notNull()
|
|
13
|
+
.default(sql`(cast(unixepoch('subsec') * 1000 as integer))`)
|
|
14
|
+
|
|
15
|
+
export const logCleanupPositions = sqliteTable('log_cleanup_positions', {
|
|
16
|
+
id: text('id').primaryKey(),
|
|
17
|
+
cursor: text('cursor'),
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
// Identity is verified against the main database at ingestion and authorization
|
|
21
|
+
// is checked there on every read. Foreign keys cannot cross database files.
|
|
22
|
+
export const deploymentLogs = sqliteTable(
|
|
23
|
+
'deployment_logs',
|
|
24
|
+
{
|
|
25
|
+
projectId: text('project_id').notNull(),
|
|
26
|
+
environmentId: text('environment_id').notNull(),
|
|
27
|
+
deploymentId: text('deployment_id').notNull(),
|
|
28
|
+
serverId: text('server_id').notNull(),
|
|
29
|
+
branch: text('branch').notNull(),
|
|
30
|
+
stream: text('stream').notNull(),
|
|
31
|
+
seq: integer('seq').notNull(),
|
|
32
|
+
content: text('content').notNull(),
|
|
33
|
+
searchContent: text('search_content').notNull(),
|
|
34
|
+
createdAt: createdAt(),
|
|
35
|
+
},
|
|
36
|
+
(table) => [
|
|
37
|
+
uniqueIndex('deployment_logs_deployment_stream_seq_idx').on(
|
|
38
|
+
table.deploymentId,
|
|
39
|
+
table.stream,
|
|
40
|
+
table.seq,
|
|
41
|
+
),
|
|
42
|
+
index('deployment_logs_project_time_idx').on(
|
|
43
|
+
table.projectId,
|
|
44
|
+
table.createdAt,
|
|
45
|
+
),
|
|
46
|
+
index('deployment_logs_project_environment_time_idx').on(
|
|
47
|
+
table.projectId,
|
|
48
|
+
table.environmentId,
|
|
49
|
+
table.createdAt,
|
|
50
|
+
),
|
|
51
|
+
],
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
export const runtimeLogs = sqliteTable(
|
|
55
|
+
'runtime_logs',
|
|
56
|
+
{
|
|
57
|
+
id: text('id').primaryKey(),
|
|
58
|
+
projectId: text('project_id').notNull(),
|
|
59
|
+
environmentId: text('environment_id').notNull(),
|
|
60
|
+
serverId: text('server_id').notNull(),
|
|
61
|
+
runtimeId: text('runtime_id').notNull(),
|
|
62
|
+
service: text('service').notNull(),
|
|
63
|
+
observedAt: integer('observed_at', { mode: 'timestamp_ms' }).notNull(),
|
|
64
|
+
content: text('content').notNull(),
|
|
65
|
+
searchContent: text('search_content').notNull(),
|
|
66
|
+
contentHash: text('content_hash').notNull(),
|
|
67
|
+
createdAt: createdAt(),
|
|
68
|
+
},
|
|
69
|
+
(table) => [
|
|
70
|
+
uniqueIndex('runtime_logs_hash_idx').on(
|
|
71
|
+
table.serverId,
|
|
72
|
+
table.runtimeId,
|
|
73
|
+
table.contentHash,
|
|
74
|
+
),
|
|
75
|
+
index('runtime_logs_project_time_idx').on(
|
|
76
|
+
table.projectId,
|
|
77
|
+
table.observedAt,
|
|
78
|
+
),
|
|
79
|
+
index('runtime_logs_server_runtime_order_idx').on(
|
|
80
|
+
table.serverId,
|
|
81
|
+
table.runtimeId,
|
|
82
|
+
table.observedAt,
|
|
83
|
+
table.createdAt,
|
|
84
|
+
table.id,
|
|
85
|
+
),
|
|
86
|
+
index('runtime_logs_observed_at_idx').on(table.observedAt),
|
|
87
|
+
],
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
export const operationLogs = sqliteTable(
|
|
91
|
+
'operation_logs',
|
|
92
|
+
{
|
|
93
|
+
jobId: text('job_id').notNull(),
|
|
94
|
+
offset: integer('offset').notNull(),
|
|
95
|
+
content: text('content').notNull(),
|
|
96
|
+
createdAt: createdAt(),
|
|
97
|
+
},
|
|
98
|
+
(table) => [
|
|
99
|
+
uniqueIndex('operation_logs_job_offset_idx').on(table.jobId, table.offset),
|
|
100
|
+
index('operation_logs_time_idx').on(table.createdAt),
|
|
101
|
+
],
|
|
102
|
+
)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Client } from '@libsql/client'
|
|
2
|
+
import { drizzle } from 'drizzle-orm/libsql/web'
|
|
3
|
+
import { migrate } from 'drizzle-orm/libsql/migrator'
|
|
4
|
+
import { readMigrationFiles } from 'drizzle-orm/migrator'
|
|
5
|
+
import { assertKnownMigrationHistory } from './migration-history'
|
|
6
|
+
|
|
7
|
+
export async function migrateLibsql(client: Client, migrationsFolder: string) {
|
|
8
|
+
const tracked = await client.execute(
|
|
9
|
+
"select name from sqlite_master where type='table' and name='__drizzle_migrations'",
|
|
10
|
+
)
|
|
11
|
+
const applied = tracked.rows.length
|
|
12
|
+
? (await client.execute('select hash from __drizzle_migrations')).rows.map(
|
|
13
|
+
(row) => String(row.hash),
|
|
14
|
+
)
|
|
15
|
+
: []
|
|
16
|
+
const untracked =
|
|
17
|
+
applied.length === 0 &&
|
|
18
|
+
(
|
|
19
|
+
await client.execute(
|
|
20
|
+
"select name from sqlite_master where type='table' and name not like 'sqlite_%' and name <> '__drizzle_migrations' limit 1",
|
|
21
|
+
)
|
|
22
|
+
).rows.length > 0
|
|
23
|
+
assertKnownMigrationHistory(
|
|
24
|
+
applied,
|
|
25
|
+
readMigrationFiles({ migrationsFolder }).map((migration) => migration.hash),
|
|
26
|
+
untracked,
|
|
27
|
+
)
|
|
28
|
+
await migrate(drizzle(client), { migrationsFolder })
|
|
29
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs'
|
|
2
|
+
import { dirname } from 'node:path'
|
|
3
|
+
|
|
4
|
+
import Sqlite from 'better-sqlite3'
|
|
5
|
+
import { drizzle } from 'drizzle-orm/better-sqlite3'
|
|
6
|
+
import { migrate } from 'drizzle-orm/better-sqlite3/migrator'
|
|
7
|
+
import { readMigrationFiles } from 'drizzle-orm/migrator'
|
|
8
|
+
import { assertKnownMigrationHistory } from './migration-history'
|
|
9
|
+
|
|
10
|
+
export function migrateSqliteFile(path: string, migrationsFolder: string) {
|
|
11
|
+
if (path !== ':memory:') mkdirSync(dirname(path), { recursive: true })
|
|
12
|
+
const connection = new Sqlite(path)
|
|
13
|
+
try {
|
|
14
|
+
const tracked = connection
|
|
15
|
+
.prepare(
|
|
16
|
+
"select name from sqlite_master where type='table' and name='__drizzle_migrations'",
|
|
17
|
+
)
|
|
18
|
+
.get()
|
|
19
|
+
const applied = tracked
|
|
20
|
+
? (connection.prepare('select hash from __drizzle_migrations').all() as {
|
|
21
|
+
hash: string
|
|
22
|
+
}[])
|
|
23
|
+
: []
|
|
24
|
+
const untracked =
|
|
25
|
+
applied.length === 0 &&
|
|
26
|
+
Boolean(
|
|
27
|
+
connection
|
|
28
|
+
.prepare(
|
|
29
|
+
"select name from sqlite_master where type='table' and name not like 'sqlite_%' and name <> '__drizzle_migrations' limit 1",
|
|
30
|
+
)
|
|
31
|
+
.get(),
|
|
32
|
+
)
|
|
33
|
+
assertKnownMigrationHistory(
|
|
34
|
+
applied.map((row) => row.hash),
|
|
35
|
+
readMigrationFiles({ migrationsFolder }).map(
|
|
36
|
+
(migration) => migration.hash,
|
|
37
|
+
),
|
|
38
|
+
untracked,
|
|
39
|
+
)
|
|
40
|
+
connection.pragma('foreign_keys = ON')
|
|
41
|
+
connection.pragma('journal_mode = WAL')
|
|
42
|
+
connection.pragma('synchronous = FULL')
|
|
43
|
+
migrate(drizzle(connection), { migrationsFolder })
|
|
44
|
+
} finally {
|
|
45
|
+
connection.close()
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function assertKnownMigrationHistory(
|
|
2
|
+
appliedHashes: string[],
|
|
3
|
+
availableHashes: string[],
|
|
4
|
+
hasUntrackedTables: boolean,
|
|
5
|
+
) {
|
|
6
|
+
const known = new Set(availableHashes)
|
|
7
|
+
if (hasUntrackedTables || appliedHashes.some((hash) => !known.has(hash))) {
|
|
8
|
+
throw new Error(
|
|
9
|
+
'Database migration history does not match this release. The flattened baseline requires fresh main and log databases; back up/export existing data before recreating them. No migration was applied.',
|
|
10
|
+
)
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
CREATE TABLE `deployment_logs` (
|
|
2
|
+
`project_id` text NOT NULL,
|
|
3
|
+
`environment_id` text NOT NULL,
|
|
4
|
+
`deployment_id` text NOT NULL,
|
|
5
|
+
`server_id` text NOT NULL,
|
|
6
|
+
`branch` text NOT NULL,
|
|
7
|
+
`stream` text NOT NULL,
|
|
8
|
+
`seq` integer NOT NULL,
|
|
9
|
+
`content` text NOT NULL,
|
|
10
|
+
`search_content` text NOT NULL,
|
|
11
|
+
`created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL
|
|
12
|
+
);
|
|
13
|
+
--> statement-breakpoint
|
|
14
|
+
CREATE UNIQUE INDEX `deployment_logs_deployment_stream_seq_idx` ON `deployment_logs` (`deployment_id`,`stream`,`seq`);--> statement-breakpoint
|
|
15
|
+
CREATE INDEX `deployment_logs_project_time_idx` ON `deployment_logs` (`project_id`,`created_at`);--> statement-breakpoint
|
|
16
|
+
CREATE INDEX `deployment_logs_project_environment_time_idx` ON `deployment_logs` (`project_id`,`environment_id`,`created_at`);--> statement-breakpoint
|
|
17
|
+
CREATE TABLE `log_cleanup_positions` (
|
|
18
|
+
`id` text PRIMARY KEY NOT NULL,
|
|
19
|
+
`cursor` text
|
|
20
|
+
);
|
|
21
|
+
--> statement-breakpoint
|
|
22
|
+
CREATE TABLE `operation_logs` (
|
|
23
|
+
`job_id` text NOT NULL,
|
|
24
|
+
`offset` integer NOT NULL,
|
|
25
|
+
`content` text NOT NULL,
|
|
26
|
+
`created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL
|
|
27
|
+
);
|
|
28
|
+
--> statement-breakpoint
|
|
29
|
+
CREATE UNIQUE INDEX `operation_logs_job_offset_idx` ON `operation_logs` (`job_id`,`offset`);--> statement-breakpoint
|
|
30
|
+
CREATE INDEX `operation_logs_time_idx` ON `operation_logs` (`created_at`);--> statement-breakpoint
|
|
31
|
+
CREATE TABLE `runtime_logs` (
|
|
32
|
+
`id` text PRIMARY KEY NOT NULL,
|
|
33
|
+
`project_id` text NOT NULL,
|
|
34
|
+
`environment_id` text NOT NULL,
|
|
35
|
+
`server_id` text NOT NULL,
|
|
36
|
+
`runtime_id` text NOT NULL,
|
|
37
|
+
`service` text NOT NULL,
|
|
38
|
+
`observed_at` integer NOT NULL,
|
|
39
|
+
`content` text NOT NULL,
|
|
40
|
+
`search_content` text NOT NULL,
|
|
41
|
+
`content_hash` text NOT NULL,
|
|
42
|
+
`created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL
|
|
43
|
+
);
|
|
44
|
+
--> statement-breakpoint
|
|
45
|
+
CREATE UNIQUE INDEX `runtime_logs_hash_idx` ON `runtime_logs` (`server_id`,`runtime_id`,`content_hash`);--> statement-breakpoint
|
|
46
|
+
CREATE INDEX `runtime_logs_project_time_idx` ON `runtime_logs` (`project_id`,`observed_at`);--> statement-breakpoint
|
|
47
|
+
CREATE INDEX `runtime_logs_server_runtime_time_idx` ON `runtime_logs` (`server_id`,`runtime_id`,`observed_at`);--> statement-breakpoint
|
|
48
|
+
CREATE INDEX `runtime_logs_observed_at_idx` ON `runtime_logs` (`observed_at`);
|