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.
Files changed (456) hide show
  1. package/README.md +6 -2
  2. package/agent-release.json +37 -0
  3. package/dist/package/LICENSE.md +21 -0
  4. package/dist/package/migrate.mjs +182 -0
  5. package/dist/package/plugins.mjs +125 -0
  6. package/dist/package/vite.mjs +439 -0
  7. package/package.json +170 -4
  8. package/public/apple-touch-icon.png +0 -0
  9. package/public/favicon.svg +1 -0
  10. package/public/logo-email.png +0 -0
  11. package/public/robots.txt +3 -0
  12. package/public/social.png +0 -0
  13. package/src/cloudflare-runtime.d.ts +78 -0
  14. package/src/components/about-dialog.tsx +70 -0
  15. package/src/components/copy-button.tsx +74 -0
  16. package/src/components/logo-mark.tsx +20 -0
  17. package/src/components/pending-collection.tsx +103 -0
  18. package/src/components/resource-avatar.tsx +65 -0
  19. package/src/components/route-error-state.tsx +95 -0
  20. package/src/components/section-navigation.tsx +39 -0
  21. package/src/components/settings-layout.tsx +111 -0
  22. package/src/components/storage-capabilities.tsx +11 -0
  23. package/src/components/table-pager.tsx +101 -0
  24. package/src/components/ui/alert-dialog.tsx +180 -0
  25. package/src/components/ui/alert.tsx +78 -0
  26. package/src/components/ui/avatar.tsx +58 -0
  27. package/src/components/ui/badge.tsx +49 -0
  28. package/src/components/ui/button-group.tsx +38 -0
  29. package/src/components/ui/button.tsx +67 -0
  30. package/src/components/ui/card.tsx +82 -0
  31. package/src/components/ui/chart.tsx +307 -0
  32. package/src/components/ui/checkbox.tsx +30 -0
  33. package/src/components/ui/combobox.tsx +256 -0
  34. package/src/components/ui/dialog.tsx +163 -0
  35. package/src/components/ui/dropdown-menu.tsx +110 -0
  36. package/src/components/ui/empty.tsx +65 -0
  37. package/src/components/ui/field.tsx +192 -0
  38. package/src/components/ui/input-group.tsx +118 -0
  39. package/src/components/ui/input-otp.tsx +70 -0
  40. package/src/components/ui/input.tsx +19 -0
  41. package/src/components/ui/label.tsx +24 -0
  42. package/src/components/ui/pagination.tsx +34 -0
  43. package/src/components/ui/popover.tsx +86 -0
  44. package/src/components/ui/select.tsx +145 -0
  45. package/src/components/ui/skeleton.tsx +19 -0
  46. package/src/components/ui/sonner.tsx +47 -0
  47. package/src/components/ui/switch.tsx +31 -0
  48. package/src/components/ui/table.tsx +81 -0
  49. package/src/components/ui/textarea.tsx +18 -0
  50. package/src/components/ui/tooltip.tsx +55 -0
  51. package/src/features/admin/admin-settings.tsx +1048 -0
  52. package/src/features/auth/current-user-context-query.ts +11 -0
  53. package/src/features/auth/login-form.tsx +442 -0
  54. package/src/features/auth/sign-out-menu-item.tsx +42 -0
  55. package/src/features/deployments/deployment-actions.tsx +336 -0
  56. package/src/features/deployments/deployment-alias-badge.tsx +35 -0
  57. package/src/features/deployments/deployment-detail.tsx +596 -0
  58. package/src/features/deployments/deployment-filters.ts +66 -0
  59. package/src/features/deployments/deployment-list.tsx +465 -0
  60. package/src/features/deployments/deployment-visit-links.tsx +104 -0
  61. package/src/features/deployments/deployments-page.tsx +376 -0
  62. package/src/features/logs/log-scroll-area.tsx +69 -0
  63. package/src/features/notifications/email-preferences.tsx +232 -0
  64. package/src/features/onboarding/profile-onboarding.tsx +162 -0
  65. package/src/features/plugins/contributions.tsx +118 -0
  66. package/src/features/projects/backup-job-logs.tsx +143 -0
  67. package/src/features/projects/backup-policy-delete-dialog.tsx +82 -0
  68. package/src/features/projects/backup-restore-actions.tsx +573 -0
  69. package/src/features/projects/backup-status-icon.tsx +33 -0
  70. package/src/features/projects/backup-target-list.tsx +222 -0
  71. package/src/features/projects/backup-timestamp.tsx +32 -0
  72. package/src/features/projects/backup-volume-picker.tsx +158 -0
  73. package/src/features/projects/compose-service-input.tsx +64 -0
  74. package/src/features/projects/deploy-readiness.ts +28 -0
  75. package/src/features/projects/environment-dot.tsx +91 -0
  76. package/src/features/projects/log-keyword-filter.tsx +48 -0
  77. package/src/features/projects/manual-deploy-dialog.tsx +563 -0
  78. package/src/features/projects/pending-section.ts +26 -0
  79. package/src/features/projects/project-backup-details-pending.tsx +305 -0
  80. package/src/features/projects/project-backup-details.tsx +936 -0
  81. package/src/features/projects/project-backup-policy.tsx +644 -0
  82. package/src/features/projects/project-backup-utils.ts +190 -0
  83. package/src/features/projects/project-backups-pending.tsx +136 -0
  84. package/src/features/projects/project-backups.tsx +876 -0
  85. package/src/features/projects/project-environment-settings.tsx +1128 -0
  86. package/src/features/projects/project-heading.tsx +68 -0
  87. package/src/features/projects/project-layout.tsx +188 -0
  88. package/src/features/projects/project-logs.tsx +461 -0
  89. package/src/features/projects/project-overview.tsx +280 -0
  90. package/src/features/projects/project-route-pending.tsx +1064 -0
  91. package/src/features/projects/project-routing-settings.tsx +663 -0
  92. package/src/features/projects/project-settings-section.tsx +64 -0
  93. package/src/features/projects/project-settings-utils.ts +101 -0
  94. package/src/features/projects/project-settings.tsx +1472 -0
  95. package/src/features/projects/repository-picker-dialog.tsx +404 -0
  96. package/src/features/repositories/new-project-dialog-launcher.tsx +44 -0
  97. package/src/features/repositories/new-project-dialog.tsx +1204 -0
  98. package/src/features/repositories/new-project-pending.tsx +28 -0
  99. package/src/features/repositories/repository-list-pending.tsx +59 -0
  100. package/src/features/servers/server-availability-alert.tsx +44 -0
  101. package/src/features/servers/server-availability.ts +29 -0
  102. package/src/features/servers/server-avatar.tsx +52 -0
  103. package/src/features/servers/server-detail-pending.tsx +315 -0
  104. package/src/features/servers/server-detail.tsx +855 -0
  105. package/src/features/servers/server-metric-chart-pending.tsx +38 -0
  106. package/src/features/servers/server-metric-chart.tsx +182 -0
  107. package/src/features/servers/server-metric-format.ts +50 -0
  108. package/src/features/servers/server-metrics-pending.tsx +75 -0
  109. package/src/features/servers/server-metrics.tsx +136 -0
  110. package/src/features/servers/team-servers.tsx +432 -0
  111. package/src/features/settings/settings-route-pending.tsx +406 -0
  112. package/src/features/teams/backup-storage-settings.tsx +483 -0
  113. package/src/features/teams/navigation.ts +51 -0
  114. package/src/features/teams/new-team-dialog.tsx +132 -0
  115. package/src/features/teams/pending-section.ts +19 -0
  116. package/src/features/teams/team-header.tsx +1286 -0
  117. package/src/features/teams/team-heading.tsx +57 -0
  118. package/src/features/teams/team-home.tsx +391 -0
  119. package/src/features/teams/team-invite.tsx +155 -0
  120. package/src/features/teams/team-route-pending.tsx +505 -0
  121. package/src/features/teams/team-settings.tsx +1555 -0
  122. package/src/features/teams/use-workspace-updates.ts +126 -0
  123. package/src/features/users/api-keys-settings.tsx +544 -0
  124. package/src/features/users/api-scope-selection.tsx +269 -0
  125. package/src/features/users/connected-apps-settings.tsx +449 -0
  126. package/src/features/users/mcp-consent.tsx +220 -0
  127. package/src/features/users/profile-picture.tsx +171 -0
  128. package/src/features/users/user-settings.tsx +1064 -0
  129. package/src/lib/account-settings-schema.ts +78 -0
  130. package/src/lib/action-feedback.ts +81 -0
  131. package/src/lib/admin-search-schema.ts +8 -0
  132. package/src/lib/agent-release.d.mts +21 -0
  133. package/src/lib/agent-release.mjs +90 -0
  134. package/src/lib/allowlist-schema.ts +79 -0
  135. package/src/lib/api-key-schema.ts +176 -0
  136. package/src/lib/auth/client.ts +20 -0
  137. package/src/lib/avatar-schema.ts +11 -0
  138. package/src/lib/backup-cron.ts +118 -0
  139. package/src/lib/backup-database.ts +41 -0
  140. package/src/lib/backup-feature.ts +2 -0
  141. package/src/lib/backup-paths.ts +7 -0
  142. package/src/lib/backup-policy-schema.ts +85 -0
  143. package/src/lib/backup-resource-schema.ts +12 -0
  144. package/src/lib/backup-restore-schema.ts +15 -0
  145. package/src/lib/backup-storage-schema.ts +55 -0
  146. package/src/lib/deferred-module.ts +38 -0
  147. package/src/lib/deployment-logs-query.ts +63 -0
  148. package/src/lib/display-name.ts +7 -0
  149. package/src/lib/error-message.ts +119 -0
  150. package/src/lib/form-errors.ts +10 -0
  151. package/src/lib/internal-redirect.ts +25 -0
  152. package/src/lib/manual-deploy-options-query.ts +21 -0
  153. package/src/lib/notification-preferences.ts +43 -0
  154. package/src/lib/onboarding.ts +11 -0
  155. package/src/lib/operation-logs-query.ts +51 -0
  156. package/src/lib/page-head.ts +14 -0
  157. package/src/lib/project-context-query.ts +257 -0
  158. package/src/lib/project-creation-schema.ts +64 -0
  159. package/src/lib/project-env-schema.ts +23 -0
  160. package/src/lib/project-environments-schema.ts +56 -0
  161. package/src/lib/project-routing-schema.ts +94 -0
  162. package/src/lib/project-runtime-config.ts +131 -0
  163. package/src/lib/project-settings-schema.ts +75 -0
  164. package/src/lib/public-api-schema.ts +128 -0
  165. package/src/lib/public-error.ts +337 -0
  166. package/src/lib/query.ts +13 -0
  167. package/src/lib/repository-selection-query.ts +11 -0
  168. package/src/lib/resource-cache.ts +30 -0
  169. package/src/lib/runtime-id.ts +19 -0
  170. package/src/lib/search.ts +14 -0
  171. package/src/lib/server-context-query.ts +43 -0
  172. package/src/lib/server-name-schema.ts +11 -0
  173. package/src/lib/settings-conflict.ts +45 -0
  174. package/src/lib/settings-version.ts +7 -0
  175. package/src/lib/team-context-query.ts +126 -0
  176. package/src/lib/team-context-schema.ts +8 -0
  177. package/src/lib/team-forms-schema.ts +45 -0
  178. package/src/lib/team-role.ts +13 -0
  179. package/src/lib/team-settings-schema.ts +48 -0
  180. package/src/lib/urls.ts +3 -0
  181. package/src/lib/use-avatar-input.ts +61 -0
  182. package/src/lib/use-refresh-error.ts +18 -0
  183. package/src/lib/use-settings-version.ts +23 -0
  184. package/src/lib/utils.ts +6 -0
  185. package/src/lib/validation.ts +5 -0
  186. package/src/lib/workspace-updates.ts +53 -0
  187. package/src/package/config.ts +10 -0
  188. package/src/package/env.mjs +54 -0
  189. package/src/package/migrate-api.d.ts +5 -0
  190. package/src/package/migrate.ts +56 -0
  191. package/src/package/plugins.ts +141 -0
  192. package/src/package/sqlite.mjs +2 -0
  193. package/src/package/vite-api.d.ts +5 -0
  194. package/src/package/vite.ts +324 -0
  195. package/src/package/watch-guard.cjs +26 -0
  196. package/src/plugins/client.ts +57 -0
  197. package/src/plugins/contract.ts +188 -0
  198. package/src/plugins/default.server.ts +4 -0
  199. package/src/plugins/default.ui.ts +4 -0
  200. package/src/plugins/operations.ts +45 -0
  201. package/src/plugins/server.ts +197 -0
  202. package/src/plugins/version.ts +1 -0
  203. package/src/routeTree.gen.ts +1275 -0
  204. package/src/router.tsx +46 -0
  205. package/src/routes/$teamSlug.index.tsx +53 -0
  206. package/src/routes/$teamSlug.new-project.tsx +13 -0
  207. package/src/routes/$teamSlug.projects.$projectName.backups.$backupId.tsx +40 -0
  208. package/src/routes/$teamSlug.projects.$projectName.backups.tsx +82 -0
  209. package/src/routes/$teamSlug.projects.$projectName.deployments.$deploymentId.tsx +52 -0
  210. package/src/routes/$teamSlug.projects.$projectName.deployments.tsx +86 -0
  211. package/src/routes/$teamSlug.projects.$projectName.logs.tsx +55 -0
  212. package/src/routes/$teamSlug.projects.$projectName.settings.tsx +51 -0
  213. package/src/routes/$teamSlug.projects.$projectName.tsx +106 -0
  214. package/src/routes/$teamSlug.projects.tsx +40 -0
  215. package/src/routes/$teamSlug.servers.$serverId.tsx +31 -0
  216. package/src/routes/$teamSlug.servers.index.tsx +59 -0
  217. package/src/routes/$teamSlug.servers.tsx +7 -0
  218. package/src/routes/$teamSlug.settings.tsx +56 -0
  219. package/src/routes/$teamSlug.tsx +86 -0
  220. package/src/routes/[.]well-known.oauth-authorization-server.api.auth.ts +13 -0
  221. package/src/routes/[.]well-known.oauth-protected-resource.mcp.ts +6 -0
  222. package/src/routes/__root.tsx +155 -0
  223. package/src/routes/admin.tsx +55 -0
  224. package/src/routes/api/agents/certificates.ts +21 -0
  225. package/src/routes/api/agents/credentials/rotate.ts +22 -0
  226. package/src/routes/api/agents/heartbeat.ts +42 -0
  227. package/src/routes/api/agents/job-logs.ts +22 -0
  228. package/src/routes/api/agents/jobs/complete.ts +22 -0
  229. package/src/routes/api/agents/jobs/next.ts +29 -0
  230. package/src/routes/api/agents/jobs/progress.ts +32 -0
  231. package/src/routes/api/agents/jobs/status.ts +22 -0
  232. package/src/routes/api/agents/register.ts +45 -0
  233. package/src/routes/api/agents/runtime-logs.ts +22 -0
  234. package/src/routes/api/agents/switch.ts +25 -0
  235. package/src/routes/api/auth/$.ts +38 -0
  236. package/src/routes/api/cron/backups.ts +33 -0
  237. package/src/routes/api/cron/maintenance.ts +30 -0
  238. package/src/routes/api/github/install.callback.ts +51 -0
  239. package/src/routes/api/github/install.ts +41 -0
  240. package/src/routes/api/github/webhook.ts +11 -0
  241. package/src/routes/api/health.ts +19 -0
  242. package/src/routes/api/install/agent.$token.ts +50 -0
  243. package/src/routes/api/install/agent.binary.ts +83 -0
  244. package/src/routes/api/install/agent.checksum.ts +45 -0
  245. package/src/routes/api/install/agent.ts +26 -0
  246. package/src/routes/api/plugins/$.ts +11 -0
  247. package/src/routes/api/v1/$.ts +15 -0
  248. package/src/routes/api/workspaces/updates.ts +8 -0
  249. package/src/routes/auth.login.tsx +50 -0
  250. package/src/routes/deployments.$deploymentId.unavailable.tsx +21 -0
  251. package/src/routes/index.tsx +23 -0
  252. package/src/routes/invites.$token.tsx +35 -0
  253. package/src/routes/mcp.ts +13 -0
  254. package/src/routes/oauth.consent.tsx +54 -0
  255. package/src/routes/onboarding.tsx +37 -0
  256. package/src/routes/onboarding.workspace.tsx +44 -0
  257. package/src/routes/settings.tsx +30 -0
  258. package/src/routes/uploads/avatars/$fileName.ts +44 -0
  259. package/src/server/admin/access.ts +67 -0
  260. package/src/server/admin/functions.ts +122 -0
  261. package/src/server/admin/service.ts +260 -0
  262. package/src/server/agents/backup-state.ts +210 -0
  263. package/src/server/agents/certificates.ts +96 -0
  264. package/src/server/agents/claims.ts +116 -0
  265. package/src/server/agents/cleanup.ts +52 -0
  266. package/src/server/agents/compatibility.ts +116 -0
  267. package/src/server/agents/completion.ts +83 -0
  268. package/src/server/agents/container-cleanup-state.ts +51 -0
  269. package/src/server/agents/deployment-state.ts +111 -0
  270. package/src/server/agents/job-payloads.ts +159 -0
  271. package/src/server/agents/jobs.ts +1293 -0
  272. package/src/server/agents/protocol.ts +400 -0
  273. package/src/server/agents/reconciliation.ts +43 -0
  274. package/src/server/agents/runtime-logs.ts +337 -0
  275. package/src/server/agents/runtime-state.ts +125 -0
  276. package/src/server/api/admission.ts +12 -0
  277. package/src/server/api/authorization.ts +115 -0
  278. package/src/server/api/credentials.ts +569 -0
  279. package/src/server/api/cursors.ts +72 -0
  280. package/src/server/api/errors.ts +24 -0
  281. package/src/server/api/functions.ts +60 -0
  282. package/src/server/api/handler.ts +274 -0
  283. package/src/server/api/mutation-operations.ts +913 -0
  284. package/src/server/api/operation-context.ts +139 -0
  285. package/src/server/api/operation-contract.ts +1099 -0
  286. package/src/server/api/operations.ts +64 -0
  287. package/src/server/api/read-operations.ts +891 -0
  288. package/src/server/api/retention.ts +33 -0
  289. package/src/server/auth/access.ts +109 -0
  290. package/src/server/auth/auth-methods.ts +28 -0
  291. package/src/server/auth/better-auth.ts +518 -0
  292. package/src/server/auth/context.ts +28 -0
  293. package/src/server/auth/email-change.ts +47 -0
  294. package/src/server/auth/email-delivery.ts +51 -0
  295. package/src/server/auth/provider-identity.ts +19 -0
  296. package/src/server/auth/provider-tokens.ts +27 -0
  297. package/src/server/auth/session.server.ts +19 -0
  298. package/src/server/backups/database-commands.ts +40 -0
  299. package/src/server/backups/destination.ts +12 -0
  300. package/src/server/backups/feature.ts +6 -0
  301. package/src/server/backups/policy-validation.ts +51 -0
  302. package/src/server/backups/queue-state.ts +137 -0
  303. package/src/server/backups/service.ts +918 -0
  304. package/src/server/backups/storage-functions.ts +42 -0
  305. package/src/server/backups/storage-state.ts +67 -0
  306. package/src/server/backups/storage.ts +237 -0
  307. package/src/server/config.ts +274 -0
  308. package/src/server/db/atomic.ts +16 -0
  309. package/src/server/db/d1-connection.ts +83 -0
  310. package/src/server/db/errors.ts +17 -0
  311. package/src/server/db/index.cloudflare.ts +15 -0
  312. package/src/server/db/index.ts +35 -0
  313. package/src/server/db/libsql-connection.ts +72 -0
  314. package/src/server/db/log-schema.ts +102 -0
  315. package/src/server/db/migrate-libsql.ts +29 -0
  316. package/src/server/db/migrate-sqlite.ts +47 -0
  317. package/src/server/db/migration-history.ts +12 -0
  318. package/src/server/db/migrations-logs/0000_initial.sql +48 -0
  319. package/src/server/db/migrations-logs/0001_runtime_log_order.sql +2 -0
  320. package/src/server/db/migrations-logs/meta/0000_snapshot.json +327 -0
  321. package/src/server/db/migrations-logs/meta/0001_snapshot.json +329 -0
  322. package/src/server/db/migrations-logs/meta/_journal.json +20 -0
  323. package/src/server/db/migrations-sqlite/0000_initial.sql +894 -0
  324. package/src/server/db/migrations-sqlite/0001_agent_indexes.sql +5 -0
  325. package/src/server/db/migrations-sqlite/meta/0000_snapshot.json +5816 -0
  326. package/src/server/db/migrations-sqlite/meta/0001_snapshot.json +5841 -0
  327. package/src/server/db/migrations-sqlite/meta/_journal.json +20 -0
  328. package/src/server/db/oauth-schema.ts +216 -0
  329. package/src/server/db/remote-config.ts +47 -0
  330. package/src/server/db/schema.ts +1218 -0
  331. package/src/server/db/sqlite-connection.ts +94 -0
  332. package/src/server/db/sqlite-files.ts +27 -0
  333. package/src/server/db/sqlite-params.ts +19 -0
  334. package/src/server/db/worker-connection.ts +47 -0
  335. package/src/server/deleted-resources.ts +133 -0
  336. package/src/server/deletion-recovery.ts +272 -0
  337. package/src/server/email/layout.tsx +85 -0
  338. package/src/server/email/notification-template.tsx +62 -0
  339. package/src/server/email/otp-template.tsx +48 -0
  340. package/src/server/email/service.ts +251 -0
  341. package/src/server/email/team-invite-template.tsx +59 -0
  342. package/src/server/email/theme.ts +10 -0
  343. package/src/server/github/http.ts +14 -0
  344. package/src/server/github/install-state.ts +48 -0
  345. package/src/server/github/service.ts +831 -0
  346. package/src/server/github/webhook-handler.ts +198 -0
  347. package/src/server/github/webhooks.ts +205 -0
  348. package/src/server/http/auth.ts +11 -0
  349. package/src/server/http/error-diagnostics.ts +66 -0
  350. package/src/server/http/plugin-request.ts +15 -0
  351. package/src/server/http/proxy-request.ts +53 -0
  352. package/src/server/http/public-errors.ts +48 -0
  353. package/src/server/http/rate-limit.ts +59 -0
  354. package/src/server/http/request-body.ts +54 -0
  355. package/src/server/http/request-ip.ts +54 -0
  356. package/src/server/http/security-headers.ts +36 -0
  357. package/src/server/install/agent-binary.ts +230 -0
  358. package/src/server/install/agent-script.ts +565 -0
  359. package/src/server/install/release-binary.ts +65 -0
  360. package/src/server/logs/budget.ts +72 -0
  361. package/src/server/logs/cleanup.ts +64 -0
  362. package/src/server/logs/deployments.ts +98 -0
  363. package/src/server/logs/operations.ts +145 -0
  364. package/src/server/logs/retention.ts +39 -0
  365. package/src/server/maintenance.ts +61 -0
  366. package/src/server/mcp/connections.ts +358 -0
  367. package/src/server/mcp/functions.ts +63 -0
  368. package/src/server/mcp/handler.ts +295 -0
  369. package/src/server/mcp/oauth-discovery.cloudflare.ts +6 -0
  370. package/src/server/mcp/oauth-discovery.ts +8 -0
  371. package/src/server/mcp/oauth-provider.ts +220 -0
  372. package/src/server/mcp/urls.ts +20 -0
  373. package/src/server/notifications/functions.ts +51 -0
  374. package/src/server/notifications/observe.ts +303 -0
  375. package/src/server/notifications/outbox.ts +335 -0
  376. package/src/server/notifications/preferences.ts +131 -0
  377. package/src/server/notifications/query.ts +16 -0
  378. package/src/server/plugins/scope.ts +17 -0
  379. package/src/server/plugins/server-context.ts +157 -0
  380. package/src/server/plugins/services.server.ts +10 -0
  381. package/src/server/plugins/workspace-access.ts +74 -0
  382. package/src/server/projects/backup-policy-state.ts +68 -0
  383. package/src/server/projects/backups.ts +219 -0
  384. package/src/server/projects/compose-metadata.ts +174 -0
  385. package/src/server/projects/configuration-state.ts +90 -0
  386. package/src/server/projects/context.ts +909 -0
  387. package/src/server/projects/creation-state.ts +46 -0
  388. package/src/server/projects/deletion-state.ts +69 -0
  389. package/src/server/projects/deployment-config.ts +139 -0
  390. package/src/server/projects/deployment-logs.ts +97 -0
  391. package/src/server/projects/deployments.ts +1123 -0
  392. package/src/server/projects/domain-state.ts +71 -0
  393. package/src/server/projects/environment-branches.ts +75 -0
  394. package/src/server/projects/environment-state.ts +158 -0
  395. package/src/server/projects/environments.ts +424 -0
  396. package/src/server/projects/functions.ts +748 -0
  397. package/src/server/projects/generated-hostname.ts +77 -0
  398. package/src/server/projects/hostnames.ts +244 -0
  399. package/src/server/projects/mappers.ts +457 -0
  400. package/src/server/projects/names.ts +41 -0
  401. package/src/server/projects/project-env-vars.ts +28 -0
  402. package/src/server/projects/queue-state.ts +118 -0
  403. package/src/server/projects/repository.ts +368 -0
  404. package/src/server/projects/route-state.ts +37 -0
  405. package/src/server/projects/runtime-logs.ts +97 -0
  406. package/src/server/projects/settings-context.ts +58 -0
  407. package/src/server/projects/settings.ts +738 -0
  408. package/src/server/projects/types.ts +355 -0
  409. package/src/server/realtime/agent-events.ts +32 -0
  410. package/src/server/realtime/node-broadcaster.ts +71 -0
  411. package/src/server/realtime/node-handler.ts +55 -0
  412. package/src/server/realtime/service.ts +125 -0
  413. package/src/server/realtime/workspace-object.cloudflare.ts +62 -0
  414. package/src/server/realtime/workspace-object.ts +3 -0
  415. package/src/server/resources/color.ts +13 -0
  416. package/src/server/runtime/background.ts +21 -0
  417. package/src/server/runtime/node-asset-cache-plugin.ts +12 -0
  418. package/src/server/runtime/node-scheduler-plugin.ts +17 -0
  419. package/src/server/runtime/node-scheduler.ts +51 -0
  420. package/src/server/runtime/platform-env.cloudflare.ts +17 -0
  421. package/src/server/runtime/platform-env.ts +19 -0
  422. package/src/server/runtime/scheduled-task-error.ts +9 -0
  423. package/src/server/scheduled-tasks.ts +28 -0
  424. package/src/server/secrets/crypto.ts +56 -0
  425. package/src/server/servers/functions.ts +233 -0
  426. package/src/server/servers/lifecycle.ts +122 -0
  427. package/src/server/servers/metric-history-schema.ts +24 -0
  428. package/src/server/servers/metric-history.ts +55 -0
  429. package/src/server/servers/monitoring.ts +592 -0
  430. package/src/server/servers/service.ts +1211 -0
  431. package/src/server/servers/status.ts +32 -0
  432. package/src/server/servers/switch.ts +96 -0
  433. package/src/server/settings-version.ts +43 -0
  434. package/src/server/storage/capabilities.ts +6 -0
  435. package/src/server/storage/local-object-store.cloudflare.ts +7 -0
  436. package/src/server/storage/local-object-store.ts +50 -0
  437. package/src/server/storage/object-store.ts +160 -0
  438. package/src/server/teams/creation.ts +51 -0
  439. package/src/server/teams/delete-policy.ts +13 -0
  440. package/src/server/teams/deletion-state.ts +80 -0
  441. package/src/server/teams/functions.ts +324 -0
  442. package/src/server/teams/invitations.ts +38 -0
  443. package/src/server/teams/membership.ts +86 -0
  444. package/src/server/teams/queries.ts +261 -0
  445. package/src/server/teams/service.ts +1127 -0
  446. package/src/server/teams/types.ts +101 -0
  447. package/src/server/uploads/avatar.ts +133 -0
  448. package/src/server/users/deletion-state.ts +93 -0
  449. package/src/server/users/functions.ts +160 -0
  450. package/src/server/users/onboarding.ts +17 -0
  451. package/src/server/users/service.ts +644 -0
  452. package/src/server.ts +55 -0
  453. package/src/styles/shadcn.css +653 -0
  454. package/src/styles/theme.css +76 -0
  455. package/src/styles.css +177 -0
  456. package/wrangler.template.jsonc +37 -0
@@ -0,0 +1,894 @@
1
+ CREATE TABLE `account` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `account_id` text NOT NULL,
4
+ `provider_id` text NOT NULL,
5
+ `user_id` text NOT NULL,
6
+ `access_token` text,
7
+ `refresh_token` text,
8
+ `id_token` text,
9
+ `access_token_expires_at` integer,
10
+ `refresh_token_expires_at` integer,
11
+ `scope` text,
12
+ `password` text,
13
+ `provider_account_name` text,
14
+ `provider_account_email` text,
15
+ `provider_account_username` text,
16
+ `provider_account_image` text,
17
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
18
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
19
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
20
+ );
21
+ --> statement-breakpoint
22
+ CREATE INDEX `account_user_id_idx` ON `account` (`user_id`);--> statement-breakpoint
23
+ CREATE TABLE `agent_jobs` (
24
+ `id` text PRIMARY KEY NOT NULL,
25
+ `type` text NOT NULL,
26
+ `status` text DEFAULT 'queued' NOT NULL,
27
+ `server_id` text NOT NULL,
28
+ `team_id` text,
29
+ `project_id` text,
30
+ `payload` text NOT NULL,
31
+ `attempt` integer DEFAULT 0 NOT NULL,
32
+ `max_attempts` integer DEFAULT 5 NOT NULL,
33
+ `error_message` text,
34
+ `claimed_at` integer,
35
+ `available_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
36
+ `finished_at` integer,
37
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
38
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
39
+ FOREIGN KEY (`server_id`) REFERENCES `servers`(`id`) ON UPDATE no action ON DELETE restrict,
40
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE set null,
41
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE set null,
42
+ CONSTRAINT "agent_jobs_type_enum" CHECK("agent_jobs"."type" in ('deploy', 'deprovision', 'purge', 'backup', 'restore', 'backup_cleanup')),
43
+ CONSTRAINT "agent_jobs_status_enum" CHECK("agent_jobs"."status" in ('queued', 'running', 'succeeded', 'failed', 'canceled', 'abandoned'))
44
+ );
45
+ --> statement-breakpoint
46
+ CREATE INDEX `agent_jobs_server_status_idx` ON `agent_jobs` (`server_id`,`status`);--> statement-breakpoint
47
+ CREATE INDEX `agent_jobs_project_idx` ON `agent_jobs` (`project_id`);--> statement-breakpoint
48
+ CREATE INDEX `agent_jobs_team_idx` ON `agent_jobs` (`team_id`);--> statement-breakpoint
49
+ CREATE TABLE `agent_runtime_observations` (
50
+ `id` text PRIMARY KEY NOT NULL,
51
+ `server_id` text NOT NULL,
52
+ `runtime_id` text NOT NULL,
53
+ `services` text,
54
+ `first_seen_at` integer NOT NULL,
55
+ `last_seen_at` integer NOT NULL,
56
+ `cleanup_queued_at` integer,
57
+ `purge_queued_at` integer,
58
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
59
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
60
+ FOREIGN KEY (`server_id`) REFERENCES `servers`(`id`) ON UPDATE no action ON DELETE cascade
61
+ );
62
+ --> statement-breakpoint
63
+ CREATE UNIQUE INDEX `agent_runtime_observations_server_runtime_idx` ON `agent_runtime_observations` (`server_id`,`runtime_id`);--> statement-breakpoint
64
+ CREATE INDEX `agent_runtime_observations_server_idx` ON `agent_runtime_observations` (`server_id`);--> statement-breakpoint
65
+ CREATE INDEX `agent_runtime_observations_cleanup_idx` ON `agent_runtime_observations` (`cleanup_queued_at`);--> statement-breakpoint
66
+ CREATE INDEX `agent_runtime_observations_purge_idx` ON `agent_runtime_observations` (`purge_queued_at`);--> statement-breakpoint
67
+ CREATE TABLE `aliases` (
68
+ `id` text PRIMARY KEY NOT NULL,
69
+ `project_id` text NOT NULL,
70
+ `environment_id` text NOT NULL,
71
+ `deployment_id` text,
72
+ `previous_deployment_id` text,
73
+ `hostname` text NOT NULL,
74
+ `type` text NOT NULL,
75
+ `branch` text,
76
+ `https` integer DEFAULT true NOT NULL,
77
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
78
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
79
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade,
80
+ FOREIGN KEY (`environment_id`) REFERENCES `environments`(`id`) ON UPDATE no action ON DELETE cascade,
81
+ FOREIGN KEY (`deployment_id`) REFERENCES `deployments`(`id`) ON UPDATE no action ON DELETE set null,
82
+ FOREIGN KEY (`previous_deployment_id`) REFERENCES `deployments`(`id`) ON UPDATE no action ON DELETE set null,
83
+ CONSTRAINT "aliases_type_enum" CHECK("aliases"."type" in ('deployment', 'environment', 'branch'))
84
+ );
85
+ --> statement-breakpoint
86
+ CREATE UNIQUE INDEX `aliases_hostname_idx` ON `aliases` (`hostname`);--> statement-breakpoint
87
+ CREATE INDEX `aliases_project_idx` ON `aliases` (`project_id`);--> statement-breakpoint
88
+ CREATE INDEX `aliases_environment_idx` ON `aliases` (`environment_id`);--> statement-breakpoint
89
+ CREATE INDEX `aliases_deployment_idx` ON `aliases` (`deployment_id`);--> statement-breakpoint
90
+ CREATE TABLE `allowlist` (
91
+ `id` text PRIMARY KEY NOT NULL,
92
+ `type` text NOT NULL,
93
+ `value` text NOT NULL,
94
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
95
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
96
+ CONSTRAINT "allowlist_type_enum" CHECK("allowlist"."type" in ('email', 'domain', 'pattern'))
97
+ );
98
+ --> statement-breakpoint
99
+ CREATE INDEX `allowlist_type_idx` ON `allowlist` (`type`);--> statement-breakpoint
100
+ CREATE UNIQUE INDEX `allowlist_type_value_idx` ON `allowlist` (`type`,lower("value"));--> statement-breakpoint
101
+ CREATE TABLE `api_audit` (
102
+ `id` text PRIMARY KEY NOT NULL,
103
+ `team_id` text NOT NULL,
104
+ `user_id` text NOT NULL,
105
+ `credential_id` text NOT NULL,
106
+ `request_id` text NOT NULL,
107
+ `operation` text NOT NULL,
108
+ `resource_id` text NOT NULL,
109
+ `outcome` text NOT NULL,
110
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL
111
+ );
112
+ --> statement-breakpoint
113
+ CREATE INDEX `api_audit_team_created_idx` ON `api_audit` (`team_id`,`created_at`);--> statement-breakpoint
114
+ CREATE INDEX `api_audit_created_idx` ON `api_audit` (`created_at`);--> statement-breakpoint
115
+ CREATE TABLE `api_grants` (
116
+ `id` text PRIMARY KEY NOT NULL,
117
+ `user_id` text NOT NULL,
118
+ `team_id` text NOT NULL,
119
+ `membership_id` text NOT NULL,
120
+ `role_ceiling` text NOT NULL,
121
+ `project_ids` text,
122
+ `scopes` text NOT NULL,
123
+ `provider_grant_id` text,
124
+ `expires_at` integer NOT NULL,
125
+ `revoked_at` integer,
126
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
127
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade,
128
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade,
129
+ FOREIGN KEY (`membership_id`) REFERENCES `team_members`(`id`) ON UPDATE no action ON DELETE cascade,
130
+ CONSTRAINT "api_grants_role_ceiling_enum" CHECK("api_grants"."role_ceiling" in ('owner', 'admin', 'member'))
131
+ );
132
+ --> statement-breakpoint
133
+ CREATE INDEX `api_grants_user_idx` ON `api_grants` (`user_id`);--> statement-breakpoint
134
+ CREATE INDEX `api_grants_membership_idx` ON `api_grants` (`membership_id`);--> statement-breakpoint
135
+ CREATE TABLE `api_idempotency` (
136
+ `id` text PRIMARY KEY NOT NULL,
137
+ `membership_id` text NOT NULL,
138
+ `credential_id` text NOT NULL,
139
+ `operation` text NOT NULL,
140
+ `resource_id` text NOT NULL,
141
+ `key_hash` text NOT NULL,
142
+ `request_hash` text NOT NULL,
143
+ `response` text NOT NULL,
144
+ `status_code` integer NOT NULL,
145
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
146
+ `expires_at` integer NOT NULL,
147
+ FOREIGN KEY (`membership_id`) REFERENCES `team_members`(`id`) ON UPDATE no action ON DELETE cascade
148
+ );
149
+ --> statement-breakpoint
150
+ CREATE UNIQUE INDEX `api_idempotency_actor_operation_key_idx` ON `api_idempotency` (`membership_id`,`operation`,`resource_id`,`key_hash`);--> statement-breakpoint
151
+ CREATE INDEX `api_idempotency_expiry_idx` ON `api_idempotency` (`expires_at`);--> statement-breakpoint
152
+ CREATE TABLE `api_keys` (
153
+ `id` text PRIMARY KEY NOT NULL,
154
+ `user_id` text NOT NULL,
155
+ `team_id` text NOT NULL,
156
+ `membership_id` text NOT NULL,
157
+ `name` text NOT NULL,
158
+ `prefix` text NOT NULL,
159
+ `key_hash` text NOT NULL,
160
+ `role_ceiling` text NOT NULL,
161
+ `preset` text NOT NULL,
162
+ `project_ids` text,
163
+ `scopes` text NOT NULL,
164
+ `expires_at` integer,
165
+ `revoked_at` integer,
166
+ `last_used_at` integer,
167
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
168
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade,
169
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade,
170
+ FOREIGN KEY (`membership_id`) REFERENCES `team_members`(`id`) ON UPDATE no action ON DELETE cascade,
171
+ CONSTRAINT "api_keys_role_ceiling_enum" CHECK("api_keys"."role_ceiling" in ('owner', 'admin', 'member')),
172
+ CONSTRAINT "api_keys_preset_enum" CHECK("api_keys"."preset" in ('read', 'deploy', 'manage'))
173
+ );
174
+ --> statement-breakpoint
175
+ CREATE UNIQUE INDEX `api_keys_hash_idx` ON `api_keys` (`key_hash`);--> statement-breakpoint
176
+ CREATE INDEX `api_keys_user_idx` ON `api_keys` (`user_id`);--> statement-breakpoint
177
+ CREATE INDEX `api_keys_membership_idx` ON `api_keys` (`membership_id`);--> statement-breakpoint
178
+ CREATE TABLE `backup_artifacts` (
179
+ `id` text PRIMARY KEY NOT NULL,
180
+ `backup_run_id` text NOT NULL,
181
+ `type` text NOT NULL,
182
+ `storage` text NOT NULL,
183
+ `object_key` text NOT NULL,
184
+ `checksum_sha256` text NOT NULL,
185
+ `size_bytes` integer NOT NULL,
186
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
187
+ FOREIGN KEY (`backup_run_id`) REFERENCES `backup_runs`(`id`) ON UPDATE no action ON DELETE cascade,
188
+ CONSTRAINT "backup_artifacts_type_enum" CHECK("backup_artifacts"."type" in ('manifest', 'volume', 'database')),
189
+ CONSTRAINT "backup_artifacts_storage_enum" CHECK("backup_artifacts"."storage" in ('local', 'remote'))
190
+ );
191
+ --> statement-breakpoint
192
+ CREATE UNIQUE INDEX `backup_artifacts_run_object_idx` ON `backup_artifacts` (`backup_run_id`,`object_key`);--> statement-breakpoint
193
+ CREATE INDEX `backup_artifacts_run_idx` ON `backup_artifacts` (`backup_run_id`);--> statement-breakpoint
194
+ CREATE TABLE `backup_configs` (
195
+ `id` text PRIMARY KEY NOT NULL,
196
+ `settings_version` integer DEFAULT 1 NOT NULL,
197
+ `name` text NOT NULL,
198
+ `project_id` text NOT NULL,
199
+ `environment_id` text NOT NULL,
200
+ `enabled` integer DEFAULT true NOT NULL,
201
+ `destination_type` text DEFAULT 's3' NOT NULL,
202
+ `schedule` text NOT NULL,
203
+ `destination` text NOT NULL,
204
+ `retention` text NOT NULL,
205
+ `volumes` text DEFAULT '{"mode":"allNamed","names":[]}' NOT NULL,
206
+ `database_dumps` text DEFAULT '[]' NOT NULL,
207
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
208
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
209
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade,
210
+ FOREIGN KEY (`environment_id`) REFERENCES `environments`(`id`) ON UPDATE no action ON DELETE cascade,
211
+ CONSTRAINT "backup_configs_destination_type_enum" CHECK("backup_configs"."destination_type" in ('s3'))
212
+ );
213
+ --> statement-breakpoint
214
+ CREATE INDEX `backup_configs_environment_idx` ON `backup_configs` (`environment_id`);--> statement-breakpoint
215
+ CREATE INDEX `backup_configs_project_idx` ON `backup_configs` (`project_id`);--> statement-breakpoint
216
+ CREATE TABLE `backup_runs` (
217
+ `id` text PRIMARY KEY NOT NULL,
218
+ `project_id` text NOT NULL,
219
+ `environment_id` text NOT NULL,
220
+ `deployment_id` text,
221
+ `server_id` text,
222
+ `runtime_id` text NOT NULL,
223
+ `config_id` text,
224
+ `schedule_key` text,
225
+ `status` text DEFAULT 'queued' NOT NULL,
226
+ `manifest` text,
227
+ `destination` text,
228
+ `error_message` text,
229
+ `started_at` integer,
230
+ `finished_at` integer,
231
+ `cleanup_queued_at` integer,
232
+ `cleanup_finished_at` integer,
233
+ `cleanup_error_message` text,
234
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
235
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
236
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade,
237
+ FOREIGN KEY (`environment_id`) REFERENCES `environments`(`id`) ON UPDATE no action ON DELETE cascade,
238
+ FOREIGN KEY (`deployment_id`) REFERENCES `deployments`(`id`) ON UPDATE no action ON DELETE set null,
239
+ FOREIGN KEY (`server_id`) REFERENCES `servers`(`id`) ON UPDATE no action ON DELETE restrict,
240
+ CONSTRAINT "backup_runs_status_enum" CHECK("backup_runs"."status" in ('queued', 'running', 'succeeded', 'failed', 'canceled'))
241
+ );
242
+ --> statement-breakpoint
243
+ CREATE INDEX `backup_runs_environment_status_idx` ON `backup_runs` (`environment_id`,`status`);--> statement-breakpoint
244
+ CREATE INDEX `backup_runs_project_idx` ON `backup_runs` (`project_id`);--> statement-breakpoint
245
+ CREATE INDEX `backup_runs_deployment_idx` ON `backup_runs` (`deployment_id`);--> statement-breakpoint
246
+ CREATE INDEX `backup_runs_cleanup_idx` ON `backup_runs` (`cleanup_queued_at`);--> statement-breakpoint
247
+ CREATE UNIQUE INDEX `backup_runs_environment_schedule_idx` ON `backup_runs` (`environment_id`,`schedule_key`) WHERE "backup_runs"."schedule_key" is not null;--> statement-breakpoint
248
+ CREATE UNIQUE INDEX `backup_runs_active_environment_idx` ON `backup_runs` (`environment_id`) WHERE "backup_runs"."status" in ('queued', 'running');--> statement-breakpoint
249
+ CREATE TABLE `backup_storage` (
250
+ `id` text PRIMARY KEY NOT NULL,
251
+ `settings_version` integer DEFAULT 1 NOT NULL,
252
+ `team_id` text NOT NULL,
253
+ `name` text NOT NULL,
254
+ `bucket` text NOT NULL,
255
+ `region` text NOT NULL,
256
+ `endpoint` text,
257
+ `access_key_id` text NOT NULL,
258
+ `secret_access_key_ciphertext` text NOT NULL,
259
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
260
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
261
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade
262
+ );
263
+ --> statement-breakpoint
264
+ CREATE INDEX `backup_storage_team_idx` ON `backup_storage` (`team_id`);--> statement-breakpoint
265
+ CREATE TABLE `deployment_events` (
266
+ `deployment_id` text NOT NULL,
267
+ `stream` text NOT NULL,
268
+ `seq` integer NOT NULL,
269
+ `content` text NOT NULL,
270
+ `search_content` text NOT NULL,
271
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
272
+ FOREIGN KEY (`deployment_id`) REFERENCES `deployments`(`id`) ON UPDATE no action ON DELETE cascade
273
+ );
274
+ --> statement-breakpoint
275
+ CREATE UNIQUE INDEX `deployment_events_seq_idx` ON `deployment_events` (`deployment_id`,`stream`,`seq`);--> statement-breakpoint
276
+ CREATE TABLE `deployments` (
277
+ `id` text PRIMARY KEY NOT NULL,
278
+ `environment_id` text NOT NULL,
279
+ `server_id` text NOT NULL,
280
+ `status` text DEFAULT 'queued' NOT NULL,
281
+ `phase` text,
282
+ `trigger` text DEFAULT 'user' NOT NULL,
283
+ `github_delivery_id` text,
284
+ `repo_id` integer NOT NULL,
285
+ `repo_full_name` text NOT NULL,
286
+ `git_sha` text NOT NULL,
287
+ `git_branch` text NOT NULL,
288
+ `commit_meta` text DEFAULT '{}' NOT NULL,
289
+ `config` text NOT NULL,
290
+ `env_vars` text NOT NULL,
291
+ `runtime_id` text NOT NULL,
292
+ `error_message` text,
293
+ `started_at` integer,
294
+ `finished_at` integer,
295
+ `created_by_user_id` text,
296
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
297
+ FOREIGN KEY (`environment_id`) REFERENCES `environments`(`id`) ON UPDATE no action ON DELETE cascade,
298
+ FOREIGN KEY (`server_id`) REFERENCES `servers`(`id`) ON UPDATE no action ON DELETE restrict,
299
+ FOREIGN KEY (`created_by_user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE set null,
300
+ CONSTRAINT "deployments_status_enum" CHECK("deployments"."status" in ('queued', 'running', 'succeeded', 'failed', 'canceled')),
301
+ CONSTRAINT "deployments_trigger_enum" CHECK("deployments"."trigger" in ('user', 'webhook', 'api', 'rollback'))
302
+ );
303
+ --> statement-breakpoint
304
+ CREATE INDEX `deployments_environment_idx` ON `deployments` (`environment_id`);--> statement-breakpoint
305
+ CREATE INDEX `deployments_server_idx` ON `deployments` (`server_id`);--> statement-breakpoint
306
+ CREATE INDEX `deployments_status_idx` ON `deployments` (`status`);--> statement-breakpoint
307
+ CREATE UNIQUE INDEX `deployments_running_runtime_idx` ON `deployments` (`runtime_id`) WHERE "deployments"."status" = 'running';--> statement-breakpoint
308
+ CREATE UNIQUE INDEX `deployments_github_delivery_environment_idx` ON `deployments` (`github_delivery_id`,`environment_id`) WHERE "deployments"."github_delivery_id" is not null;--> statement-breakpoint
309
+ CREATE TABLE `domains` (
310
+ `id` text PRIMARY KEY NOT NULL,
311
+ `project_id` text NOT NULL,
312
+ `environment_id` text NOT NULL,
313
+ `hostname` text NOT NULL,
314
+ `base_path` text,
315
+ `https` integer DEFAULT true NOT NULL,
316
+ `status` text DEFAULT 'pending' NOT NULL,
317
+ `message` text,
318
+ `verified_at` integer,
319
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
320
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
321
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade,
322
+ FOREIGN KEY (`environment_id`) REFERENCES `environments`(`id`) ON UPDATE no action ON DELETE cascade,
323
+ CONSTRAINT "domains_status_enum" CHECK("domains"."status" in ('pending', 'active', 'disabled', 'failed'))
324
+ );
325
+ --> statement-breakpoint
326
+ CREATE UNIQUE INDEX `domains_hostname_idx` ON `domains` (`hostname`);--> statement-breakpoint
327
+ CREATE INDEX `domains_project_idx` ON `domains` (`project_id`);--> statement-breakpoint
328
+ CREATE INDEX `domains_environment_idx` ON `domains` (`environment_id`);--> statement-breakpoint
329
+ CREATE TABLE `environments` (
330
+ `id` text PRIMARY KEY NOT NULL,
331
+ `project_id` text NOT NULL,
332
+ `server_id` text,
333
+ `name` text NOT NULL,
334
+ `slug` text NOT NULL,
335
+ `branch` text NOT NULL,
336
+ `is_production` integer DEFAULT false NOT NULL,
337
+ `position` integer DEFAULT 0 NOT NULL,
338
+ `color` text DEFAULT 'blue' NOT NULL,
339
+ `status` text DEFAULT 'active' NOT NULL,
340
+ `runtime_id` text NOT NULL,
341
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
342
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
343
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade,
344
+ FOREIGN KEY (`server_id`) REFERENCES `servers`(`id`) ON UPDATE no action ON DELETE restrict,
345
+ CONSTRAINT "environments_status_enum" CHECK("environments"."status" in ('active', 'deleted'))
346
+ );
347
+ --> statement-breakpoint
348
+ CREATE UNIQUE INDEX `environments_project_slug_idx` ON `environments` (`project_id`,`slug`);--> statement-breakpoint
349
+ CREATE INDEX `environments_server_idx` ON `environments` (`server_id`);--> statement-breakpoint
350
+ CREATE TABLE `github_installations` (
351
+ `installation_id` integer PRIMARY KEY NOT NULL,
352
+ `account_id` integer,
353
+ `account_login` text NOT NULL,
354
+ `account_type` text NOT NULL,
355
+ `repository_selection` text NOT NULL,
356
+ `status` text DEFAULT 'active' NOT NULL,
357
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
358
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
359
+ CONSTRAINT "github_installations_status_enum" CHECK("github_installations"."status" in ('active', 'deleted', 'suspended'))
360
+ );
361
+ --> statement-breakpoint
362
+ CREATE INDEX `github_installations_account_id_idx` ON `github_installations` (`account_id`);--> statement-breakpoint
363
+ CREATE INDEX `github_installations_account_idx` ON `github_installations` (`account_login`);--> statement-breakpoint
364
+ CREATE INDEX `github_installations_status_idx` ON `github_installations` (`status`);--> statement-breakpoint
365
+ CREATE TABLE `projects` (
366
+ `id` text PRIMARY KEY NOT NULL,
367
+ `settings_version` integer DEFAULT 1 NOT NULL,
368
+ `team_id` text NOT NULL,
369
+ `slug` text NOT NULL,
370
+ `name` text NOT NULL,
371
+ `status` text DEFAULT 'active' NOT NULL,
372
+ `github_repo_id` integer,
373
+ `github_repo` text NOT NULL,
374
+ `github_installation_id` integer,
375
+ `default_server_id` text,
376
+ `avatar_path` text,
377
+ `routes` text,
378
+ `env_vars_encrypted` text,
379
+ `runtime_config` text DEFAULT '{"type":"compose","path":null,"releaseCommand":null,"releaseService":null,"readinessPath":null,"deployCommand":null,"rollbackCommand":null,"timeoutSeconds":1800}' NOT NULL,
380
+ `compose_metadata` text,
381
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
382
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
383
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade,
384
+ FOREIGN KEY (`github_installation_id`) REFERENCES `github_installations`(`installation_id`) ON UPDATE no action ON DELETE restrict,
385
+ FOREIGN KEY (`default_server_id`) REFERENCES `servers`(`id`) ON UPDATE no action ON DELETE restrict,
386
+ CONSTRAINT "projects_status_enum" CHECK("projects"."status" in ('active', 'deleted', 'banned'))
387
+ );
388
+ --> statement-breakpoint
389
+ CREATE UNIQUE INDEX `projects_team_slug_idx` ON `projects` (`team_id`,lower("slug")) WHERE "projects"."status" <> 'deleted';--> statement-breakpoint
390
+ CREATE INDEX `projects_team_idx` ON `projects` (`team_id`);--> statement-breakpoint
391
+ CREATE INDEX `projects_github_installation_idx` ON `projects` (`github_installation_id`);--> statement-breakpoint
392
+ CREATE INDEX `projects_default_server_idx` ON `projects` (`default_server_id`);--> statement-breakpoint
393
+ CREATE TABLE `rate_limits` (
394
+ `key` text PRIMARY KEY NOT NULL,
395
+ `count` integer NOT NULL,
396
+ `reset_at` integer NOT NULL
397
+ );
398
+ --> statement-breakpoint
399
+ CREATE TABLE `server_availability_windows` (
400
+ `id` text PRIMARY KEY NOT NULL,
401
+ `server_id` text NOT NULL,
402
+ `started_at` integer NOT NULL,
403
+ `ended_at` integer,
404
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
405
+ FOREIGN KEY (`server_id`) REFERENCES `servers`(`id`) ON UPDATE no action ON DELETE cascade
406
+ );
407
+ --> statement-breakpoint
408
+ CREATE INDEX `server_availability_windows_server_started_idx` ON `server_availability_windows` (`server_id`,`started_at`);--> statement-breakpoint
409
+ CREATE TABLE `server_heartbeats` (
410
+ `id` text PRIMARY KEY NOT NULL,
411
+ `server_id` text NOT NULL,
412
+ `observed_at` integer NOT NULL,
413
+ `agent_version` text,
414
+ `public_address` text,
415
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
416
+ FOREIGN KEY (`server_id`) REFERENCES `servers`(`id`) ON UPDATE no action ON DELETE cascade
417
+ );
418
+ --> statement-breakpoint
419
+ CREATE INDEX `server_heartbeats_server_observed_idx` ON `server_heartbeats` (`server_id`,`observed_at`);--> statement-breakpoint
420
+ CREATE INDEX `server_heartbeats_observed_idx` ON `server_heartbeats` (`observed_at`);--> statement-breakpoint
421
+ CREATE TABLE `server_metrics` (
422
+ `id` text PRIMARY KEY NOT NULL,
423
+ `server_id` text NOT NULL,
424
+ `observed_at` integer NOT NULL,
425
+ `cpu_percent` real,
426
+ `load_1` real,
427
+ `memory_used_bytes` integer,
428
+ `memory_total_bytes` integer,
429
+ `disk_used_bytes` integer,
430
+ `disk_total_bytes` integer,
431
+ `network_receive_bytes_per_second` real,
432
+ `network_transmit_bytes_per_second` real,
433
+ `disk_read_bytes_per_second` real,
434
+ `disk_write_bytes_per_second` real,
435
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
436
+ FOREIGN KEY (`server_id`) REFERENCES `servers`(`id`) ON UPDATE no action ON DELETE cascade
437
+ );
438
+ --> statement-breakpoint
439
+ CREATE INDEX `server_metrics_server_observed_idx` ON `server_metrics` (`server_id`,`observed_at`);--> statement-breakpoint
440
+ CREATE INDEX `server_metrics_observed_idx` ON `server_metrics` (`observed_at`);--> statement-breakpoint
441
+ CREATE TABLE `servers` (
442
+ `id` text PRIMARY KEY NOT NULL,
443
+ `settings_version` integer DEFAULT 1 NOT NULL,
444
+ `team_id` text NOT NULL,
445
+ `name` text NOT NULL,
446
+ `handle` text NOT NULL,
447
+ `status` text DEFAULT 'pending' NOT NULL,
448
+ `agent_version` text,
449
+ `agent_protocol_version` integer,
450
+ `agent_capabilities` text,
451
+ `public_address` text,
452
+ `public_ipv4` text,
453
+ `public_ipv6` text,
454
+ `hostname` text,
455
+ `operating_system` text,
456
+ `kernel_version` text,
457
+ `architecture` text,
458
+ `cpu_core_count` integer,
459
+ `host_uptime_seconds` integer,
460
+ `enrollment_token_hash` text,
461
+ `enrollment_token_expires_at` integer,
462
+ `agent_credential_hash` text,
463
+ `pending_agent_credential_hash` text,
464
+ `agent_credential_rotated_at` integer,
465
+ `last_seen_at` integer,
466
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
467
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
468
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade,
469
+ CONSTRAINT "servers_status_enum" CHECK("servers"."status" in ('pending', 'connected', 'disconnected', 'disabled', 'deleted'))
470
+ );
471
+ --> statement-breakpoint
472
+ CREATE UNIQUE INDEX `servers_team_handle_idx` ON `servers` (`team_id`,`handle`) WHERE "servers"."status" <> 'deleted';--> statement-breakpoint
473
+ CREATE UNIQUE INDEX `servers_team_name_idx` ON `servers` (`team_id`,lower("name")) WHERE "servers"."status" <> 'deleted';--> statement-breakpoint
474
+ CREATE INDEX `servers_team_idx` ON `servers` (`team_id`);--> statement-breakpoint
475
+ CREATE TABLE `session` (
476
+ `id` text PRIMARY KEY NOT NULL,
477
+ `expires_at` integer NOT NULL,
478
+ `token` text NOT NULL,
479
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
480
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
481
+ `ip_address` text,
482
+ `user_agent` text,
483
+ `user_id` text NOT NULL,
484
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
485
+ );
486
+ --> statement-breakpoint
487
+ CREATE UNIQUE INDEX `session_token_unique` ON `session` (`token`);--> statement-breakpoint
488
+ CREATE INDEX `session_user_id_idx` ON `session` (`user_id`);--> statement-breakpoint
489
+ CREATE TABLE `team_invites` (
490
+ `id` text PRIMARY KEY NOT NULL,
491
+ `team_id` text NOT NULL,
492
+ `email` text NOT NULL,
493
+ `role` text DEFAULT 'member' NOT NULL,
494
+ `inviter_id` text,
495
+ `token_hash` text NOT NULL,
496
+ `status` text DEFAULT 'pending' NOT NULL,
497
+ `expires_at` integer NOT NULL,
498
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
499
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
500
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade,
501
+ FOREIGN KEY (`inviter_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE set null,
502
+ CONSTRAINT "team_invites_role_enum" CHECK("team_invites"."role" in ('owner', 'admin', 'member')),
503
+ CONSTRAINT "team_invites_status_enum" CHECK("team_invites"."status" in ('pending', 'accepted', 'revoked', 'expired'))
504
+ );
505
+ --> statement-breakpoint
506
+ CREATE UNIQUE INDEX `team_invites_token_hash_idx` ON `team_invites` (`token_hash`);--> statement-breakpoint
507
+ CREATE UNIQUE INDEX `team_invites_pending_email_idx` ON `team_invites` (`team_id`,lower("email")) WHERE "team_invites"."status" = 'pending';--> statement-breakpoint
508
+ CREATE INDEX `team_invites_team_idx` ON `team_invites` (`team_id`);--> statement-breakpoint
509
+ CREATE INDEX `team_invites_email_idx` ON `team_invites` (lower("email"));--> statement-breakpoint
510
+ CREATE TABLE `team_members` (
511
+ `id` text PRIMARY KEY NOT NULL,
512
+ `team_id` text NOT NULL,
513
+ `user_id` text NOT NULL,
514
+ `role` text DEFAULT 'member' NOT NULL,
515
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
516
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade,
517
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade,
518
+ CONSTRAINT "team_members_role_enum" CHECK("team_members"."role" in ('owner', 'admin', 'member'))
519
+ );
520
+ --> statement-breakpoint
521
+ CREATE UNIQUE INDEX `team_members_team_user_idx` ON `team_members` (`team_id`,`user_id`);--> statement-breakpoint
522
+ CREATE INDEX `team_members_user_idx` ON `team_members` (`user_id`);--> statement-breakpoint
523
+ CREATE INDEX `team_members_team_idx` ON `team_members` (`team_id`);--> statement-breakpoint
524
+ CREATE TABLE `teams` (
525
+ `id` text PRIMARY KEY NOT NULL,
526
+ `settings_version` integer DEFAULT 1 NOT NULL,
527
+ `slug` text NOT NULL,
528
+ `name` text NOT NULL,
529
+ `status` text DEFAULT 'active' NOT NULL,
530
+ `avatar_path` text,
531
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
532
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
533
+ CONSTRAINT "teams_status_enum" CHECK("teams"."status" in ('active', 'deleted', 'banned'))
534
+ );
535
+ --> statement-breakpoint
536
+ CREATE UNIQUE INDEX `teams_slug_idx` ON `teams` (`slug`);--> statement-breakpoint
537
+ CREATE TABLE `user` (
538
+ `id` text PRIMARY KEY NOT NULL,
539
+ `settings_version` integer DEFAULT 1 NOT NULL,
540
+ `profile_confirmed_at` integer,
541
+ `name` text NOT NULL,
542
+ `username` text NOT NULL,
543
+ `email` text NOT NULL,
544
+ `email_verified` integer DEFAULT false NOT NULL,
545
+ `status` text DEFAULT 'active' NOT NULL,
546
+ `image` text,
547
+ `default_team_id` text,
548
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
549
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
550
+ FOREIGN KEY (`default_team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE set null,
551
+ CONSTRAINT "user_status_enum" CHECK("user"."status" in ('active', 'deleted', 'banned'))
552
+ );
553
+ --> statement-breakpoint
554
+ CREATE UNIQUE INDEX `user_email_unique` ON `user` (`email`);--> statement-breakpoint
555
+ CREATE UNIQUE INDEX `user_username_idx` ON `user` (lower("username")) WHERE status = 'active';--> statement-breakpoint
556
+ CREATE TABLE `user_cleanup_jobs` (
557
+ `id` text PRIMARY KEY NOT NULL,
558
+ `user_id` text NOT NULL,
559
+ `status` text DEFAULT 'queued' NOT NULL,
560
+ `payload` text NOT NULL,
561
+ `attempt` integer DEFAULT 0 NOT NULL,
562
+ `max_attempts` integer DEFAULT 5 NOT NULL,
563
+ `error_message` text,
564
+ `claimed_at` integer,
565
+ `available_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
566
+ `finished_at` integer,
567
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
568
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
569
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade,
570
+ CONSTRAINT "user_cleanup_jobs_status_enum" CHECK("user_cleanup_jobs"."status" in ('queued', 'running', 'succeeded', 'failed'))
571
+ );
572
+ --> statement-breakpoint
573
+ CREATE INDEX `user_cleanup_jobs_status_available_idx` ON `user_cleanup_jobs` (`status`,`available_at`);--> statement-breakpoint
574
+ CREATE INDEX `user_cleanup_jobs_user_idx` ON `user_cleanup_jobs` (`user_id`);--> statement-breakpoint
575
+ CREATE TABLE `verification` (
576
+ `id` text PRIMARY KEY NOT NULL,
577
+ `identifier` text NOT NULL,
578
+ `value` text NOT NULL,
579
+ `expires_at` integer NOT NULL,
580
+ `created_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL,
581
+ `updated_at` integer DEFAULT (cast(unixepoch('subsec') * 1000 as integer)) NOT NULL
582
+ );
583
+ --> statement-breakpoint
584
+ CREATE INDEX `verification_identifier_idx` ON `verification` (`identifier`);--> statement-breakpoint
585
+ CREATE TABLE `jwks` (
586
+ `id` text PRIMARY KEY NOT NULL,
587
+ `public_key` text NOT NULL,
588
+ `private_key` text NOT NULL,
589
+ `created_at` integer NOT NULL,
590
+ `expires_at` integer,
591
+ `alg` text,
592
+ `crv` text
593
+ );
594
+ --> statement-breakpoint
595
+ CREATE TABLE `oauth_access_token` (
596
+ `id` text PRIMARY KEY NOT NULL,
597
+ `token` text NOT NULL,
598
+ `client_id` text NOT NULL,
599
+ `session_id` text,
600
+ `user_id` text,
601
+ `reference_id` text,
602
+ `authorization_code_id` text,
603
+ `resources` text,
604
+ `requested_user_info_claims` text,
605
+ `refresh_id` text,
606
+ `expires_at` integer NOT NULL,
607
+ `created_at` integer NOT NULL,
608
+ `revoked` integer,
609
+ `confirmation` text,
610
+ `scopes` text NOT NULL,
611
+ FOREIGN KEY (`client_id`) REFERENCES `oauth_client`(`client_id`) ON UPDATE no action ON DELETE cascade,
612
+ FOREIGN KEY (`session_id`) REFERENCES `session`(`id`) ON UPDATE no action ON DELETE set null,
613
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade,
614
+ FOREIGN KEY (`refresh_id`) REFERENCES `oauth_refresh_token`(`id`) ON UPDATE no action ON DELETE cascade
615
+ );
616
+ --> statement-breakpoint
617
+ CREATE UNIQUE INDEX `oauth_access_token_token_unique` ON `oauth_access_token` (`token`);--> statement-breakpoint
618
+ CREATE INDEX `oauth_access_token_expiry_idx` ON `oauth_access_token` (`expires_at`);--> statement-breakpoint
619
+ CREATE INDEX `oauth_access_token_client_id_idx` ON `oauth_access_token` (`client_id`);--> statement-breakpoint
620
+ CREATE INDEX `oauth_access_token_session_id_idx` ON `oauth_access_token` (`session_id`);--> statement-breakpoint
621
+ CREATE INDEX `oauth_access_token_user_id_idx` ON `oauth_access_token` (`user_id`);--> statement-breakpoint
622
+ CREATE INDEX `oauth_access_token_authorization_code_id_idx` ON `oauth_access_token` (`authorization_code_id`);--> statement-breakpoint
623
+ CREATE INDEX `oauth_access_token_refresh_id_idx` ON `oauth_access_token` (`refresh_id`);--> statement-breakpoint
624
+ CREATE TABLE `oauth_client` (
625
+ `id` text PRIMARY KEY NOT NULL,
626
+ `client_id` text NOT NULL,
627
+ `client_secret` text,
628
+ `client_discovery_id` text,
629
+ `disabled` integer DEFAULT false,
630
+ `skip_consent` integer,
631
+ `enable_end_session` integer,
632
+ `subject_type` text,
633
+ `scopes` text,
634
+ `client_credentials_scopes` text,
635
+ `user_id` text,
636
+ `created_at` integer,
637
+ `updated_at` integer,
638
+ `name` text,
639
+ `uri` text,
640
+ `icon` text,
641
+ `contacts` text,
642
+ `tos` text,
643
+ `policy` text,
644
+ `software_id` text,
645
+ `software_version` text,
646
+ `software_statement` text,
647
+ `redirect_uris` text NOT NULL,
648
+ `post_logout_redirect_uris` text,
649
+ `backchannel_logout_uri` text,
650
+ `backchannel_logout_session_required` integer,
651
+ `token_endpoint_auth_method` text,
652
+ `application_type` text,
653
+ `jwks` text,
654
+ `jwks_uri` text,
655
+ `grant_types` text,
656
+ `response_types` text,
657
+ `require_p_k_c_e` integer,
658
+ `dpop_bound_access_tokens` integer DEFAULT false,
659
+ `reference_id` text,
660
+ `metadata` text,
661
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
662
+ );
663
+ --> statement-breakpoint
664
+ CREATE UNIQUE INDEX `oauth_client_client_id_unique` ON `oauth_client` (`client_id`);--> statement-breakpoint
665
+ CREATE INDEX `oauth_client_user_id_idx` ON `oauth_client` (`user_id`);--> statement-breakpoint
666
+ CREATE TABLE `oauth_client_assertion` (
667
+ `id` text PRIMARY KEY NOT NULL,
668
+ `expires_at` integer NOT NULL
669
+ );
670
+ --> statement-breakpoint
671
+ CREATE TABLE `oauth_client_resource` (
672
+ `id` text PRIMARY KEY NOT NULL,
673
+ `client_id` text NOT NULL,
674
+ `resource_id` text NOT NULL,
675
+ `metadata` text,
676
+ `created_at` integer,
677
+ FOREIGN KEY (`client_id`) REFERENCES `oauth_client`(`client_id`) ON UPDATE no action ON DELETE cascade,
678
+ FOREIGN KEY (`resource_id`) REFERENCES `oauth_resource`(`identifier`) ON UPDATE no action ON DELETE cascade
679
+ );
680
+ --> statement-breakpoint
681
+ CREATE INDEX `oauth_client_resource_client_id_idx` ON `oauth_client_resource` (`client_id`);--> statement-breakpoint
682
+ CREATE INDEX `oauth_client_resource_resource_id_idx` ON `oauth_client_resource` (`resource_id`);--> statement-breakpoint
683
+ CREATE UNIQUE INDEX `oauth_client_resource_client_id_resource_id_idx` ON `oauth_client_resource` (`client_id`,`resource_id`);--> statement-breakpoint
684
+ CREATE TABLE `oauth_consent` (
685
+ `id` text PRIMARY KEY NOT NULL,
686
+ `client_id` text NOT NULL,
687
+ `user_id` text,
688
+ `reference_id` text,
689
+ `resources` text,
690
+ `requested_user_info_claims` text,
691
+ `scopes` text NOT NULL,
692
+ `created_at` integer NOT NULL,
693
+ `updated_at` integer NOT NULL,
694
+ FOREIGN KEY (`client_id`) REFERENCES `oauth_client`(`client_id`) ON UPDATE no action ON DELETE cascade,
695
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
696
+ );
697
+ --> statement-breakpoint
698
+ CREATE INDEX `oauth_consent_client_id_idx` ON `oauth_consent` (`client_id`);--> statement-breakpoint
699
+ CREATE INDEX `oauth_consent_user_id_idx` ON `oauth_consent` (`user_id`);--> statement-breakpoint
700
+ CREATE TABLE `oauth_refresh_token` (
701
+ `id` text PRIMARY KEY NOT NULL,
702
+ `token` text NOT NULL,
703
+ `client_id` text NOT NULL,
704
+ `session_id` text,
705
+ `user_id` text NOT NULL,
706
+ `reference_id` text,
707
+ `authorization_code_id` text,
708
+ `resources` text,
709
+ `requested_user_info_claims` text,
710
+ `expires_at` integer NOT NULL,
711
+ `created_at` integer NOT NULL,
712
+ `revoked` integer,
713
+ `rotated_at` integer,
714
+ `rotation_replay_response` text,
715
+ `rotation_replay_expires_at` integer,
716
+ `auth_time` integer,
717
+ `confirmation` text,
718
+ `scopes` text NOT NULL,
719
+ FOREIGN KEY (`client_id`) REFERENCES `oauth_client`(`client_id`) ON UPDATE no action ON DELETE cascade,
720
+ FOREIGN KEY (`session_id`) REFERENCES `session`(`id`) ON UPDATE no action ON DELETE set null,
721
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
722
+ );
723
+ --> statement-breakpoint
724
+ CREATE UNIQUE INDEX `oauth_refresh_token_token_unique` ON `oauth_refresh_token` (`token`);--> statement-breakpoint
725
+ CREATE INDEX `oauth_refresh_token_expiry_idx` ON `oauth_refresh_token` (`expires_at`);--> statement-breakpoint
726
+ CREATE INDEX `oauth_refresh_token_client_id_idx` ON `oauth_refresh_token` (`client_id`);--> statement-breakpoint
727
+ CREATE INDEX `oauth_refresh_token_session_id_idx` ON `oauth_refresh_token` (`session_id`);--> statement-breakpoint
728
+ CREATE INDEX `oauth_refresh_token_user_id_idx` ON `oauth_refresh_token` (`user_id`);--> statement-breakpoint
729
+ CREATE INDEX `oauth_refresh_token_authorization_code_id_idx` ON `oauth_refresh_token` (`authorization_code_id`);--> statement-breakpoint
730
+ CREATE TABLE `oauth_resource` (
731
+ `id` text PRIMARY KEY NOT NULL,
732
+ `identifier` text NOT NULL,
733
+ `name` text NOT NULL,
734
+ `access_token_ttl` integer,
735
+ `refresh_token_ttl` integer,
736
+ `signing_algorithm` text,
737
+ `signing_key_id` text,
738
+ `allowed_scopes` text,
739
+ `custom_claims` text,
740
+ `dpop_bound_access_tokens_required` integer DEFAULT false,
741
+ `disabled` integer DEFAULT false,
742
+ `created_at` integer,
743
+ `updated_at` integer,
744
+ `policy_version` integer DEFAULT 1,
745
+ `metadata` text
746
+ );
747
+ --> statement-breakpoint
748
+ CREATE UNIQUE INDEX `oauth_resource_identifier_unique` ON `oauth_resource` (`identifier`);
749
+ --> statement-breakpoint
750
+ CREATE TRIGGER api_credentials_revoke_inactive_team AFTER UPDATE OF status ON teams
751
+ WHEN NEW.status <> 'active'
752
+ BEGIN
753
+ UPDATE api_keys SET revoked_at = COALESCE(revoked_at, cast(unixepoch('subsec') * 1000 as integer)) WHERE team_id = NEW.id;
754
+ UPDATE api_grants SET revoked_at = COALESCE(revoked_at, cast(unixepoch('subsec') * 1000 as integer)) WHERE team_id = NEW.id;
755
+ END;
756
+ --> statement-breakpoint
757
+ CREATE TRIGGER api_credentials_revoke_inactive_user AFTER UPDATE OF status ON user
758
+ WHEN NEW.status <> 'active'
759
+ BEGIN
760
+ UPDATE api_keys SET revoked_at = COALESCE(revoked_at, cast(unixepoch('subsec') * 1000 as integer)) WHERE user_id = NEW.id;
761
+ UPDATE api_grants SET revoked_at = COALESCE(revoked_at, cast(unixepoch('subsec') * 1000 as integer)) WHERE user_id = NEW.id;
762
+ END;
763
+ --> statement-breakpoint
764
+ CREATE TRIGGER backup_configs_settings_version AFTER UPDATE ON "backup_configs"
765
+ WHEN NEW.settings_version = OLD.settings_version AND (NEW.name IS NOT OLD.name OR NEW.environment_id IS NOT OLD.environment_id OR NEW.enabled IS NOT OLD.enabled OR NEW.schedule IS NOT OLD.schedule OR NEW.destination IS NOT OLD.destination OR NEW.retention IS NOT OLD.retention OR NEW.volumes IS NOT OLD.volumes OR NEW.database_dumps IS NOT OLD.database_dumps)
766
+ BEGIN
767
+ UPDATE "backup_configs" SET settings_version = OLD.settings_version + 1 WHERE id = NEW.id;
768
+ END;
769
+ --> statement-breakpoint
770
+ CREATE TRIGGER backup_configs_storage_insert BEFORE INSERT ON backup_configs
771
+ WHEN json_extract(NEW.destination, '$.storageId') IS NOT NULL
772
+ AND NOT EXISTS (SELECT 1 FROM backup_storage s JOIN projects p ON p.team_id = s.team_id
773
+ WHERE s.id = json_extract(NEW.destination, '$.storageId') AND p.id = NEW.project_id)
774
+ BEGIN SELECT RAISE(ABORT, 'Backup storage destination is unavailable in this workspace.'); END;
775
+ --> statement-breakpoint
776
+ CREATE TRIGGER backup_configs_storage_update BEFORE UPDATE OF destination, project_id ON backup_configs
777
+ WHEN json_extract(NEW.destination, '$.storageId') IS NOT NULL
778
+ AND NOT EXISTS (SELECT 1 FROM backup_storage s JOIN projects p ON p.team_id = s.team_id
779
+ WHERE s.id = json_extract(NEW.destination, '$.storageId') AND p.id = NEW.project_id)
780
+ BEGIN SELECT RAISE(ABORT, 'Backup storage destination is unavailable in this workspace.'); END;
781
+ --> statement-breakpoint
782
+ CREATE TRIGGER backup_runs_storage_insert BEFORE INSERT ON backup_runs
783
+ WHEN json_extract(NEW.destination, '$.storageId') IS NOT NULL
784
+ AND NOT EXISTS (SELECT 1 FROM backup_storage s JOIN projects p ON p.team_id = s.team_id
785
+ WHERE s.id = json_extract(NEW.destination, '$.storageId') AND p.id = NEW.project_id)
786
+ BEGIN SELECT RAISE(ABORT, 'Backup storage destination is unavailable in this workspace.'); END;
787
+ --> statement-breakpoint
788
+ CREATE TRIGGER backup_runs_storage_update BEFORE UPDATE OF destination, project_id ON backup_runs
789
+ WHEN json_extract(NEW.destination, '$.storageId') IS NOT NULL
790
+ AND NOT EXISTS (SELECT 1 FROM backup_storage s JOIN projects p ON p.team_id = s.team_id
791
+ WHERE s.id = json_extract(NEW.destination, '$.storageId') AND p.id = NEW.project_id)
792
+ BEGIN SELECT RAISE(ABORT, 'Backup storage destination is unavailable in this workspace.'); END;
793
+ --> statement-breakpoint
794
+ CREATE TRIGGER backup_storage_referenced_delete BEFORE DELETE ON backup_storage
795
+ WHEN EXISTS (SELECT 1 FROM teams WHERE id = OLD.team_id) AND (
796
+ EXISTS (SELECT 1 FROM backup_configs WHERE json_extract(destination, '$.storageId') = OLD.id)
797
+ OR EXISTS (SELECT 1 FROM backup_runs r WHERE json_extract(r.destination, '$.storageId') = OLD.id
798
+ AND (r.status IN ('queued', 'running') OR EXISTS (SELECT 1 FROM backup_artifacts a WHERE a.backup_run_id = r.id AND a.storage = 'remote'))))
799
+ BEGIN SELECT RAISE(ABORT, 'Backup storage is still referenced by policies or retained backups.'); END;
800
+ --> statement-breakpoint
801
+ CREATE TRIGGER backup_storage_settings_version AFTER UPDATE ON "backup_storage"
802
+ WHEN NEW.settings_version = OLD.settings_version AND (NEW.name IS NOT OLD.name OR NEW.bucket IS NOT OLD.bucket OR NEW.region IS NOT OLD.region OR NEW.endpoint IS NOT OLD.endpoint OR NEW.access_key_id IS NOT OLD.access_key_id OR NEW.secret_access_key_ciphertext IS NOT OLD.secret_access_key_ciphertext)
803
+ BEGIN
804
+ UPDATE "backup_storage" SET settings_version = OLD.settings_version + 1 WHERE id = NEW.id;
805
+ END;
806
+ --> statement-breakpoint
807
+ CREATE TRIGGER projects_settings_version AFTER UPDATE ON "projects"
808
+ WHEN NEW.settings_version = OLD.settings_version AND (NEW.name IS NOT OLD.name OR NEW.slug IS NOT OLD.slug OR NEW.github_repo_id IS NOT OLD.github_repo_id OR NEW.github_repo IS NOT OLD.github_repo OR NEW.github_installation_id IS NOT OLD.github_installation_id OR NEW.default_server_id IS NOT OLD.default_server_id OR NEW.avatar_path IS NOT OLD.avatar_path OR NEW.runtime_config IS NOT OLD.runtime_config OR NEW.routes IS NOT OLD.routes OR NEW.env_vars_encrypted IS NOT OLD.env_vars_encrypted)
809
+ BEGIN
810
+ UPDATE "projects" SET settings_version = OLD.settings_version + 1 WHERE id = NEW.id;
811
+ END;
812
+ --> statement-breakpoint
813
+ CREATE TRIGGER servers_settings_version AFTER UPDATE ON "servers"
814
+ WHEN NEW.settings_version = OLD.settings_version AND (NEW.name IS NOT OLD.name OR NEW.handle IS NOT OLD.handle)
815
+ BEGIN
816
+ UPDATE "servers" SET settings_version = OLD.settings_version + 1 WHERE id = NEW.id;
817
+ END;
818
+ --> statement-breakpoint
819
+ CREATE TRIGGER teams_settings_version AFTER UPDATE ON "teams"
820
+ WHEN NEW.settings_version = OLD.settings_version AND (NEW.name IS NOT OLD.name OR NEW.slug IS NOT OLD.slug OR NEW.avatar_path IS NOT OLD.avatar_path)
821
+ BEGIN
822
+ UPDATE "teams" SET settings_version = OLD.settings_version + 1 WHERE id = NEW.id;
823
+ END;
824
+ --> statement-breakpoint
825
+ CREATE TRIGGER user_settings_version AFTER UPDATE ON "user"
826
+ WHEN NEW.settings_version = OLD.settings_version AND (NEW.name IS NOT OLD.name OR NEW.username IS NOT OLD.username OR NEW.image IS NOT OLD.image OR NEW.email IS NOT OLD.email OR NEW.default_team_id IS NOT OLD.default_team_id)
827
+ BEGIN
828
+ UPDATE "user" SET settings_version = OLD.settings_version + 1 WHERE id = NEW.id;
829
+ END;
830
+ --> statement-breakpoint
831
+ CREATE TABLE `notification_incidents` (
832
+ `id` text PRIMARY KEY NOT NULL,
833
+ `team_id` text NOT NULL,
834
+ `project_id` text,
835
+ `category` text NOT NULL,
836
+ `source_id` text NOT NULL,
837
+ `revision` text NOT NULL,
838
+ `active` integer NOT NULL,
839
+ `actor_id` text,
840
+ `title` text NOT NULL,
841
+ `message` text NOT NULL,
842
+ `path` text NOT NULL,
843
+ `updated_at` integer NOT NULL,
844
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade,
845
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade
846
+ );
847
+ --> statement-breakpoint
848
+ CREATE TABLE `notification_mutes` (
849
+ `id` text PRIMARY KEY NOT NULL,
850
+ `user_id` text NOT NULL,
851
+ `team_id` text NOT NULL,
852
+ `project_id` text,
853
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade,
854
+ FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade,
855
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade
856
+ );
857
+ --> statement-breakpoint
858
+ CREATE INDEX `notification_mutes_user_scope_idx` ON `notification_mutes` (`user_id`,`team_id`,`project_id`);--> statement-breakpoint
859
+ CREATE TABLE `notification_outbox` (
860
+ `id` text PRIMARY KEY NOT NULL,
861
+ `incident_id` text NOT NULL,
862
+ `payload` text NOT NULL,
863
+ `revision` text NOT NULL,
864
+ `user_id` text NOT NULL,
865
+ `actor` integer DEFAULT false NOT NULL,
866
+ `recovery` integer NOT NULL,
867
+ `created_at` integer NOT NULL,
868
+ `first_attempt_at` integer,
869
+ `delivered_at` integer,
870
+ `discarded_at` integer,
871
+ `failed_at` integer,
872
+ `attempts` integer DEFAULT 0 NOT NULL,
873
+ `next_attempt_at` integer DEFAULT 0 NOT NULL,
874
+ `lease_owner` text,
875
+ `lease_until` integer DEFAULT 0 NOT NULL,
876
+ FOREIGN KEY (`incident_id`) REFERENCES `notification_incidents`(`id`) ON UPDATE no action ON DELETE cascade,
877
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
878
+ );
879
+ --> statement-breakpoint
880
+ CREATE UNIQUE INDEX `notification_outbox_event_recipient_idx` ON `notification_outbox` (`incident_id`,`revision`,`user_id`,`recovery`);--> statement-breakpoint
881
+ CREATE INDEX `notification_outbox_due_idx` ON `notification_outbox` (`delivered_at`,`discarded_at`,`failed_at`,`next_attempt_at`);--> statement-breakpoint
882
+ CREATE TABLE `notification_preferences` (
883
+ `user_id` text PRIMARY KEY NOT NULL,
884
+ `preferences` text NOT NULL,
885
+ `version` integer DEFAULT 1 NOT NULL,
886
+ FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
887
+ );
888
+ --> statement-breakpoint
889
+ CREATE TABLE `notification_scan_cursors` (
890
+ `source` text PRIMARY KEY NOT NULL,
891
+ `after_id` text NOT NULL
892
+ );
893
+ --> statement-breakpoint
894
+ CREATE INDEX `account_provider_identity_idx` ON `account` (`provider_id`,`account_id`);