openship 0.1.1 → 0.1.8

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 (607) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +5988 -0
  3. package/dist/server/index.js +324841 -0
  4. package/dist/server/migrations/0000_init.sql +666 -0
  5. package/dist/server/migrations/0001_brief_tomorrow_man.sql +47 -0
  6. package/dist/server/migrations/0002_funny_dazzler.sql +2 -0
  7. package/dist/server/migrations/0003_third_killer_shrike.sql +1 -0
  8. package/dist/server/migrations/0004_session_active_org_not_null.sql +10 -0
  9. package/dist/server/migrations/0005_warm_amazoness.sql +3 -0
  10. package/dist/server/migrations/0006_lumpy_joystick.sql +1 -0
  11. package/dist/server/migrations/0007_outgoing_maginty.sql +2 -0
  12. package/dist/server/migrations/0008_frozen_cutover.sql +3 -0
  13. package/dist/server/migrations/0009_credits_billing.sql +142 -0
  14. package/dist/server/migrations/0010_credit_grant_dedupe.sql +14 -0
  15. package/dist/server/migrations/0011_remove_credit_ledger.sql +23 -0
  16. package/dist/server/migrations/0012_smart_deploys_and_git_rollback.sql +81 -0
  17. package/dist/server/migrations/0013_fix_check_run_rollup_unique.sql +38 -0
  18. package/dist/server/migrations/0014_default_rollback_git.sql +9 -0
  19. package/dist/server/migrations/0015_billing_idempotency_grants.sql +41 -0
  20. package/dist/server/migrations/0016_github_auth_high_findings.sql +30 -0
  21. package/dist/server/migrations/0017_spooky_rumiko_fujikawa.sql +6 -0
  22. package/dist/server/migrations/0018_calm_shatterstar.sql +1 -0
  23. package/dist/server/migrations/0019_rename_workspace_install_to_prepare.sql +1 -0
  24. package/dist/server/migrations/0020_uneven_the_renegades.sql +13 -0
  25. package/dist/server/migrations/0021_shiny_firestar.sql +2 -0
  26. package/dist/server/migrations/0022_version_on_success_backfill.sql +6 -0
  27. package/dist/server/migrations/0023_productive_gorilla_man.sql +17 -0
  28. package/dist/server/migrations/0024_sleepy_peter_quill.sql +2 -0
  29. package/dist/server/migrations/0025_smooth_blue_shield.sql +1 -0
  30. package/dist/server/migrations/0026_mail_backup_source.sql +11 -0
  31. package/dist/server/migrations/0027_opposite_anthem.sql +6 -0
  32. package/dist/server/migrations/0028_stale_rogue.sql +18 -0
  33. package/dist/server/migrations/0029_bouncy_loners.sql +16 -0
  34. package/dist/server/migrations/0030_bright_darkstar.sql +6 -0
  35. package/dist/server/migrations/0031_conscious_catseye.sql +13 -0
  36. package/dist/server/migrations/0032_wet_mimic.sql +51 -0
  37. package/dist/server/migrations/0033_eminent_molly_hayes.sql +2 -0
  38. package/dist/server/migrations/meta/0000_snapshot.json +5110 -0
  39. package/dist/server/migrations/meta/0001_snapshot.json +5257 -0
  40. package/dist/server/migrations/meta/0002_snapshot.json +5279 -0
  41. package/dist/server/migrations/meta/0003_snapshot.json +5286 -0
  42. package/dist/server/migrations/meta/0004_snapshot.json +5286 -0
  43. package/dist/server/migrations/meta/0005_snapshot.json +5305 -0
  44. package/dist/server/migrations/meta/0006_snapshot.json +5311 -0
  45. package/dist/server/migrations/meta/0007_snapshot.json +5323 -0
  46. package/dist/server/migrations/meta/0016_snapshot.json +6345 -0
  47. package/dist/server/migrations/meta/0017_snapshot.json +6383 -0
  48. package/dist/server/migrations/meta/0018_snapshot.json +6390 -0
  49. package/dist/server/migrations/meta/0019_snapshot.json +6390 -0
  50. package/dist/server/migrations/meta/0020_snapshot.json +6497 -0
  51. package/dist/server/migrations/meta/0021_snapshot.json +6509 -0
  52. package/dist/server/migrations/meta/0022_snapshot.json +6509 -0
  53. package/dist/server/migrations/meta/0023_snapshot.json +6629 -0
  54. package/dist/server/migrations/meta/0024_snapshot.json +6641 -0
  55. package/dist/server/migrations/meta/0025_snapshot.json +6648 -0
  56. package/dist/server/migrations/meta/0026_snapshot.json +6750 -0
  57. package/dist/server/migrations/meta/0027_snapshot.json +6757 -0
  58. package/dist/server/migrations/meta/0028_snapshot.json +6895 -0
  59. package/dist/server/migrations/meta/0029_snapshot.json +7028 -0
  60. package/dist/server/migrations/meta/0030_snapshot.json +7066 -0
  61. package/dist/server/migrations/meta/0031_snapshot.json +7181 -0
  62. package/dist/server/migrations/meta/0032_snapshot.json +7570 -0
  63. package/dist/server/migrations/meta/0033_snapshot.json +7597 -0
  64. package/dist/server/migrations/meta/_journal.json +244 -0
  65. package/dist/server/pglite/pglite.data +0 -0
  66. package/dist/server/pglite/pglite.wasm +0 -0
  67. package/package.json +31 -33
  68. package/.env.example +0 -38
  69. package/.nvmrc +0 -1
  70. package/.prettierrc +0 -7
  71. package/CONTRIBUTING.md +0 -90
  72. package/LICENSE +0 -661
  73. package/README.md +0 -360
  74. package/apps/api/.env.example +0 -30
  75. package/apps/api/Dockerfile +0 -22
  76. package/apps/api/package.json +0 -41
  77. package/apps/api/src/app.ts +0 -69
  78. package/apps/api/src/config/env.ts +0 -113
  79. package/apps/api/src/config/index.ts +0 -1
  80. package/apps/api/src/index.ts +0 -8
  81. package/apps/api/src/lib/auth-mode.ts +0 -42
  82. package/apps/api/src/lib/auth.ts +0 -105
  83. package/apps/api/src/lib/cache.ts +0 -128
  84. package/apps/api/src/lib/cloud-auth-proxy.ts +0 -310
  85. package/apps/api/src/lib/cloud-client.ts +0 -103
  86. package/apps/api/src/lib/compose-parser.ts +0 -138
  87. package/apps/api/src/lib/controller-helpers.ts +0 -90
  88. package/apps/api/src/lib/email-templates.ts +0 -94
  89. package/apps/api/src/lib/encryption.ts +0 -102
  90. package/apps/api/src/lib/local-user.ts +0 -65
  91. package/apps/api/src/lib/mail.ts +0 -48
  92. package/apps/api/src/lib/notifications.ts +0 -195
  93. package/apps/api/src/lib/openship-cloud.ts +0 -101
  94. package/apps/api/src/lib/resources.ts +0 -96
  95. package/apps/api/src/lib/screenshots.ts +0 -189
  96. package/apps/api/src/lib/ssh-manager.ts +0 -369
  97. package/apps/api/src/lib/ssl-scheduler.ts +0 -109
  98. package/apps/api/src/lib/stack-detector.ts +0 -708
  99. package/apps/api/src/lib/system-debug.ts +0 -10
  100. package/apps/api/src/middleware/auth.ts +0 -60
  101. package/apps/api/src/middleware/error-handler.ts +0 -41
  102. package/apps/api/src/middleware/index.ts +0 -5
  103. package/apps/api/src/middleware/internal-auth.ts +0 -40
  104. package/apps/api/src/middleware/local-only.ts +0 -20
  105. package/apps/api/src/middleware/rate-limiter.ts +0 -35
  106. package/apps/api/src/modules/analytics/analytics.controller.ts +0 -111
  107. package/apps/api/src/modules/analytics/analytics.routes.ts +0 -29
  108. package/apps/api/src/modules/analytics/analytics.schema.ts +0 -37
  109. package/apps/api/src/modules/analytics/analytics.service.ts +0 -264
  110. package/apps/api/src/modules/auth/auth.routes.ts +0 -237
  111. package/apps/api/src/modules/billing/billing.controller.ts +0 -60
  112. package/apps/api/src/modules/billing/billing.routes.ts +0 -34
  113. package/apps/api/src/modules/billing/billing.schema.ts +0 -9
  114. package/apps/api/src/modules/billing/billing.service.ts +0 -33
  115. package/apps/api/src/modules/cloud/cloud.controller.ts +0 -225
  116. package/apps/api/src/modules/cloud/cloud.routes.ts +0 -40
  117. package/apps/api/src/modules/deployments/build.service.ts +0 -791
  118. package/apps/api/src/modules/deployments/deployment-lifecycle.ts +0 -138
  119. package/apps/api/src/modules/deployments/deployment.controller.ts +0 -343
  120. package/apps/api/src/modules/deployments/deployment.routes.ts +0 -37
  121. package/apps/api/src/modules/deployments/deployment.schema.ts +0 -39
  122. package/apps/api/src/modules/deployments/deployment.service.ts +0 -190
  123. package/apps/api/src/modules/deployments/preflight.ts +0 -280
  124. package/apps/api/src/modules/deployments/prepare.service.ts +0 -252
  125. package/apps/api/src/modules/deployments/session-manager.ts +0 -283
  126. package/apps/api/src/modules/deployments/ssl.service.ts +0 -73
  127. package/apps/api/src/modules/domains/domain.controller.ts +0 -73
  128. package/apps/api/src/modules/domains/domain.routes.ts +0 -24
  129. package/apps/api/src/modules/domains/domain.schema.ts +0 -35
  130. package/apps/api/src/modules/domains/domain.service.ts +0 -385
  131. package/apps/api/src/modules/github/github.auth.ts +0 -397
  132. package/apps/api/src/modules/github/github.controller.ts +0 -387
  133. package/apps/api/src/modules/github/github.local-auth.ts +0 -251
  134. package/apps/api/src/modules/github/github.routes.ts +0 -50
  135. package/apps/api/src/modules/github/github.schema.ts +0 -52
  136. package/apps/api/src/modules/github/github.service.ts +0 -592
  137. package/apps/api/src/modules/github/github.types.ts +0 -158
  138. package/apps/api/src/modules/github/github.webhook.ts +0 -186
  139. package/apps/api/src/modules/github/index.ts +0 -16
  140. package/apps/api/src/modules/health/health.routes.ts +0 -45
  141. package/apps/api/src/modules/projects/project.controller.ts +0 -498
  142. package/apps/api/src/modules/projects/project.routes.ts +0 -67
  143. package/apps/api/src/modules/projects/project.schema.ts +0 -107
  144. package/apps/api/src/modules/projects/project.service.ts +0 -514
  145. package/apps/api/src/modules/settings/settings.controller.ts +0 -55
  146. package/apps/api/src/modules/settings/settings.routes.ts +0 -25
  147. package/apps/api/src/modules/settings/settings.service.ts +0 -49
  148. package/apps/api/src/modules/system/filesystem.controller.ts +0 -66
  149. package/apps/api/src/modules/system/index.ts +0 -1
  150. package/apps/api/src/modules/system/server-check.controller.ts +0 -475
  151. package/apps/api/src/modules/system/setup-session.ts +0 -255
  152. package/apps/api/src/modules/system/setup.controller.ts +0 -128
  153. package/apps/api/src/modules/system/system.routes.ts +0 -42
  154. package/apps/api/src/modules/webhooks/webhook.controller.ts +0 -64
  155. package/apps/api/src/modules/webhooks/webhook.routes.ts +0 -15
  156. package/apps/api/src/modules/webhooks/webhook.service.ts +0 -52
  157. package/apps/api/src/modules/webhooks/webhook.types.ts +0 -35
  158. package/apps/api/tsconfig.json +0 -14
  159. package/apps/cli/package.json +0 -26
  160. package/apps/cli/src/commands/deploy.ts +0 -11
  161. package/apps/cli/src/commands/init.ts +0 -8
  162. package/apps/cli/src/commands/login.ts +0 -8
  163. package/apps/cli/src/commands/logs.ts +0 -9
  164. package/apps/cli/src/index.ts +0 -21
  165. package/apps/cli/src/lib/api-client.ts +0 -35
  166. package/apps/cli/tsconfig.json +0 -13
  167. package/apps/dashboard/Dockerfile +0 -22
  168. package/apps/dashboard/components.json +0 -20
  169. package/apps/dashboard/next-env.d.ts +0 -6
  170. package/apps/dashboard/next.config.mjs +0 -16
  171. package/apps/dashboard/package.json +0 -40
  172. package/apps/dashboard/postcss.config.mjs +0 -5
  173. package/apps/dashboard/public/android-chrome-192x192.png +0 -0
  174. package/apps/dashboard/public/android-chrome-512x512.png +0 -0
  175. package/apps/dashboard/public/apple-touch-icon.png +0 -0
  176. package/apps/dashboard/public/favicon-16x16.png +0 -0
  177. package/apps/dashboard/public/favicon-32x32.png +0 -0
  178. package/apps/dashboard/public/favicon.ico +0 -0
  179. package/apps/dashboard/public/site.webmanifest +0 -19
  180. package/apps/dashboard/src/app/(auth)/forgot-password/page.tsx +0 -114
  181. package/apps/dashboard/src/app/(auth)/layout.tsx +0 -21
  182. package/apps/dashboard/src/app/(auth)/login/page.tsx +0 -220
  183. package/apps/dashboard/src/app/(auth)/providers.tsx +0 -34
  184. package/apps/dashboard/src/app/(auth)/register/page.tsx +0 -176
  185. package/apps/dashboard/src/app/(auth)/reset-password/page.tsx +0 -172
  186. package/apps/dashboard/src/app/(auth)/verify-email/page.tsx +0 -190
  187. package/apps/dashboard/src/app/(dashboard)/(deployment)/build/[id]/page.tsx +0 -162
  188. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/BuildSummary.tsx +0 -166
  189. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/DnsConfiguration.tsx +0 -119
  190. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/DomainSettings.tsx +0 -291
  191. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/Header.tsx +0 -71
  192. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/Sidebar.tsx +0 -270
  193. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/SkeletonLoader.tsx +0 -87
  194. package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/page.tsx +0 -169
  195. package/apps/dashboard/src/app/(dashboard)/(deployment)/layout.tsx +0 -7
  196. package/apps/dashboard/src/app/(dashboard)/billing/page.tsx +0 -3
  197. package/apps/dashboard/src/app/(dashboard)/deployments/components/CommitDetailsModal.tsx +0 -240
  198. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentCard.tsx +0 -121
  199. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentHeader.tsx +0 -89
  200. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentMenu.tsx +0 -182
  201. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsContent.tsx +0 -324
  202. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsFilters.tsx +0 -99
  203. package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsList.tsx +0 -31
  204. package/apps/dashboard/src/app/(dashboard)/deployments/components/EmptyState.tsx +0 -101
  205. package/apps/dashboard/src/app/(dashboard)/deployments/components/LoadingSkeleton.tsx +0 -57
  206. package/apps/dashboard/src/app/(dashboard)/deployments/components/ProjectFilter.tsx +0 -109
  207. package/apps/dashboard/src/app/(dashboard)/deployments/components/index.ts +0 -9
  208. package/apps/dashboard/src/app/(dashboard)/deployments/page.tsx +0 -14
  209. package/apps/dashboard/src/app/(dashboard)/deployments/types.ts +0 -44
  210. package/apps/dashboard/src/app/(dashboard)/deployments/utils.ts +0 -176
  211. package/apps/dashboard/src/app/(dashboard)/domains/page.tsx +0 -3
  212. package/apps/dashboard/src/app/(dashboard)/integrations/page.tsx +0 -321
  213. package/apps/dashboard/src/app/(dashboard)/layout.tsx +0 -27
  214. package/apps/dashboard/src/app/(dashboard)/library/components/ConnectPrompt.tsx +0 -187
  215. package/apps/dashboard/src/app/(dashboard)/library/components/LibrarySidebar.tsx +0 -147
  216. package/apps/dashboard/src/app/(dashboard)/library/components/LoadingSkeleton.tsx +0 -39
  217. package/apps/dashboard/src/app/(dashboard)/library/components/LocalProjects.tsx +0 -548
  218. package/apps/dashboard/src/app/(dashboard)/library/components/RepositoryList.tsx +0 -292
  219. package/apps/dashboard/src/app/(dashboard)/library/components/TemplateGrid.tsx +0 -36
  220. package/apps/dashboard/src/app/(dashboard)/library/components/UrlImport.tsx +0 -74
  221. package/apps/dashboard/src/app/(dashboard)/library/page.tsx +0 -121
  222. package/apps/dashboard/src/app/(dashboard)/library/types.ts +0 -26
  223. package/apps/dashboard/src/app/(dashboard)/monitoring/page.tsx +0 -3
  224. package/apps/dashboard/src/app/(dashboard)/page.tsx +0 -485
  225. package/apps/dashboard/src/app/(dashboard)/projects/[id]/[[...slug]]/layout.tsx +0 -22
  226. package/apps/dashboard/src/app/(dashboard)/projects/[id]/[[...slug]]/page.tsx +0 -286
  227. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/AdvancedSettings.tsx +0 -235
  228. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/BuildSettings.tsx +0 -174
  229. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DeleteConfirmationDialog.tsx +0 -45
  230. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DeletionModal.tsx +0 -95
  231. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/Deployments.tsx +0 -11
  232. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DomainSettings.tsx +0 -523
  233. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/EnvironmentSettings.tsx +0 -246
  234. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GeneralSettings.tsx +0 -93
  235. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GitInfo.tsx +0 -261
  236. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GitSettings.tsx +0 -391
  237. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/LogsSettings.tsx +0 -133
  238. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ProjectNotFound.tsx +0 -95
  239. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ProjectsBottomNavigation.tsx +0 -62
  240. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ResourceSettings.tsx +0 -333
  241. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SettingSection.tsx +0 -66
  242. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SettingsNavigation.tsx +0 -27
  243. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SleepModeSettings.tsx +0 -134
  244. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProductionUrl.tsx +0 -25
  245. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProjectIdentity.tsx +0 -159
  246. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProjectInfo.tsx +0 -58
  247. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/SkeletonLoader.tsx +0 -170
  248. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/StatsCards.tsx +0 -33
  249. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/TopPaths.tsx +0 -56
  250. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/TrafficChart.tsx +0 -157
  251. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/index.ts +0 -14
  252. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/LogsActions.tsx +0 -52
  253. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/ServerLogs.tsx +0 -249
  254. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/TerminalLogs.tsx +0 -682
  255. package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/logs.css +0 -127
  256. package/apps/dashboard/src/app/(dashboard)/projects/components/DeploymentCard.tsx +0 -73
  257. package/apps/dashboard/src/app/(dashboard)/projects/components/ProjectCard.tsx +0 -330
  258. package/apps/dashboard/src/app/(dashboard)/projects/page.tsx +0 -330
  259. package/apps/dashboard/src/app/(dashboard)/providers.tsx +0 -23
  260. package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/components-tab.tsx +0 -329
  261. package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/overview-tab.tsx +0 -229
  262. package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/terminal-tab.tsx +0 -38
  263. package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/page.tsx +0 -437
  264. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/checking-state.tsx +0 -15
  265. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/choose-mode.tsx +0 -54
  266. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/component-row.tsx +0 -65
  267. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/error-banner.tsx +0 -13
  268. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/installing-panel.tsx +0 -227
  269. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/results-panel.tsx +0 -90
  270. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/setup-header.tsx +0 -56
  271. package/apps/dashboard/src/app/(dashboard)/servers/new/_components/types.ts +0 -13
  272. package/apps/dashboard/src/app/(dashboard)/servers/new/page.tsx +0 -666
  273. package/apps/dashboard/src/app/(dashboard)/servers/page.tsx +0 -283
  274. package/apps/dashboard/src/app/(dashboard)/settings/_components/BuildPreferences.tsx +0 -110
  275. package/apps/dashboard/src/app/(dashboard)/settings/_components/CloudConnection.tsx +0 -147
  276. package/apps/dashboard/src/app/(dashboard)/settings/_components/InstanceInfo.tsx +0 -54
  277. package/apps/dashboard/src/app/(dashboard)/settings/_components/ServerConnection.tsx +0 -407
  278. package/apps/dashboard/src/app/(dashboard)/settings/_components/SettingsSection.tsx +0 -32
  279. package/apps/dashboard/src/app/(dashboard)/settings/page.tsx +0 -67
  280. package/apps/dashboard/src/app/auth/callback/close/page.tsx +0 -23
  281. package/apps/dashboard/src/app/auth/callback/install/page.tsx +0 -40
  282. package/apps/dashboard/src/app/authorize/page.tsx +0 -137
  283. package/apps/dashboard/src/app/globals.css +0 -57
  284. package/apps/dashboard/src/app/layout.tsx +0 -55
  285. package/apps/dashboard/src/components/auth-shell.tsx +0 -66
  286. package/apps/dashboard/src/components/deployments/types.ts +0 -44
  287. package/apps/dashboard/src/components/global-deployments/index.ts +0 -17
  288. package/apps/dashboard/src/components/i18n-provider.tsx +0 -100
  289. package/apps/dashboard/src/components/import-project/BuildSettings.tsx +0 -376
  290. package/apps/dashboard/src/components/import-project/BuildSkeleton.tsx +0 -161
  291. package/apps/dashboard/src/components/import-project/BuildTerminal.tsx +0 -358
  292. package/apps/dashboard/src/components/import-project/ComposeServices.tsx +0 -455
  293. package/apps/dashboard/src/components/import-project/DeploymentProcessing.tsx +0 -510
  294. package/apps/dashboard/src/components/import-project/DockerSettings.tsx +0 -64
  295. package/apps/dashboard/src/components/import-project/EnvironmentVariables.tsx +0 -481
  296. package/apps/dashboard/src/components/import-project/Frameworks.tsx +0 -90
  297. package/apps/dashboard/src/components/import-project/ProjectSettings.tsx +0 -160
  298. package/apps/dashboard/src/components/import-project/types.ts +0 -82
  299. package/apps/dashboard/src/components/integrations/GithubPermissionModal.tsx +0 -173
  300. package/apps/dashboard/src/components/language-switcher.tsx +0 -36
  301. package/apps/dashboard/src/components/logo.tsx +0 -13
  302. package/apps/dashboard/src/components/network-error-handler.tsx +0 -27
  303. package/apps/dashboard/src/components/oauth-buttons.tsx +0 -81
  304. package/apps/dashboard/src/components/overview/ActivityChart.tsx +0 -247
  305. package/apps/dashboard/src/components/overview/ApiRequestsCard.tsx +0 -111
  306. package/apps/dashboard/src/components/overview/CreditsCard.tsx +0 -137
  307. package/apps/dashboard/src/components/overview/DeploymentsChart.tsx +0 -195
  308. package/apps/dashboard/src/components/overview/EmptyState.tsx +0 -126
  309. package/apps/dashboard/src/components/overview/LoadingSkeleton.tsx +0 -92
  310. package/apps/dashboard/src/components/overview/OverviewHeader.tsx +0 -74
  311. package/apps/dashboard/src/components/overview/OverviewHeroChart.tsx +0 -344
  312. package/apps/dashboard/src/components/overview/ProjectsCard.tsx +0 -134
  313. package/apps/dashboard/src/components/overview/QuickLinks.tsx +0 -119
  314. package/apps/dashboard/src/components/overview/SandboxesCard.tsx +0 -150
  315. package/apps/dashboard/src/components/overview/StatsGrid.tsx +0 -166
  316. package/apps/dashboard/src/components/overview/TokenUsageChart.tsx +0 -206
  317. package/apps/dashboard/src/components/overview/UsageStats.tsx +0 -79
  318. package/apps/dashboard/src/components/overview/index.ts +0 -30
  319. package/apps/dashboard/src/components/overview/types.ts +0 -116
  320. package/apps/dashboard/src/components/page-header.tsx +0 -25
  321. package/apps/dashboard/src/components/project-settings/ServerSideSwitch.jsx +0 -60
  322. package/apps/dashboard/src/components/shared/AlertBox.tsx +0 -39
  323. package/apps/dashboard/src/components/shared/CTASection.tsx +0 -45
  324. package/apps/dashboard/src/components/shared/ErrorState.tsx +0 -176
  325. package/apps/dashboard/src/components/shared/FeatureCard.tsx +0 -20
  326. package/apps/dashboard/src/components/shared/MDXComponents.tsx +0 -24
  327. package/apps/dashboard/src/components/shared/MachineSettingsModal.tsx +0 -286
  328. package/apps/dashboard/src/components/shared/Modal.tsx +0 -39
  329. package/apps/dashboard/src/components/shared/OTPInput.tsx +0 -122
  330. package/apps/dashboard/src/components/shared/PageHero.tsx +0 -21
  331. package/apps/dashboard/src/components/shared/PlatformFeatureCard.tsx +0 -27
  332. package/apps/dashboard/src/components/shared/StatCard.tsx +0 -14
  333. package/apps/dashboard/src/components/shared/ValueCard.tsx +0 -20
  334. package/apps/dashboard/src/components/shared/index.ts +0 -8
  335. package/apps/dashboard/src/components/sidebar.tsx +0 -282
  336. package/apps/dashboard/src/components/theme-provider.tsx +0 -96
  337. package/apps/dashboard/src/components/toast.tsx +0 -106
  338. package/apps/dashboard/src/components/ui/CustomCursor.tsx +0 -107
  339. package/apps/dashboard/src/components/ui/CustomSelect.tsx +0 -126
  340. package/apps/dashboard/src/components/ui/DropdownMenu.tsx +0 -174
  341. package/apps/dashboard/src/components/ui/FileIcon.jsx +0 -59
  342. package/apps/dashboard/src/components/ui/IconPickerModal.tsx +0 -273
  343. package/apps/dashboard/src/components/ui/InfoBanner.jsx +0 -39
  344. package/apps/dashboard/src/components/ui/Logo.tsx +0 -14
  345. package/apps/dashboard/src/components/ui/Modal.tsx +0 -117
  346. package/apps/dashboard/src/components/ui/PageContainer.tsx +0 -12
  347. package/apps/dashboard/src/components/ui/SectionContainer.jsx +0 -7
  348. package/apps/dashboard/src/components/ui/SlidingToggle.tsx +0 -128
  349. package/apps/dashboard/src/components/ui/Toast.tsx +0 -29
  350. package/apps/dashboard/src/components/ui/button.tsx +0 -58
  351. package/apps/dashboard/src/components/ui/card.tsx +0 -60
  352. package/apps/dashboard/src/components/ui/input.tsx +0 -20
  353. package/apps/dashboard/src/components/ui/label.tsx +0 -19
  354. package/apps/dashboard/src/components/ui/select.tsx +0 -10
  355. package/apps/dashboard/src/components/ui/textarea.tsx +0 -9
  356. package/apps/dashboard/src/constants/lang-colors.ts +0 -25
  357. package/apps/dashboard/src/constants/mock.ts +0 -38
  358. package/apps/dashboard/src/context/AuthContext.tsx +0 -91
  359. package/apps/dashboard/src/context/CloudContext.tsx +0 -275
  360. package/apps/dashboard/src/context/DeploymentContext.tsx +0 -71
  361. package/apps/dashboard/src/context/GitHubContext.tsx +0 -288
  362. package/apps/dashboard/src/context/ModalContext.tsx +0 -300
  363. package/apps/dashboard/src/context/NetworkContext.tsx +0 -32
  364. package/apps/dashboard/src/context/ProjectSettingsContext.tsx +0 -727
  365. package/apps/dashboard/src/context/ToastContext.tsx +0 -129
  366. package/apps/dashboard/src/context/deployment/index.ts +0 -3
  367. package/apps/dashboard/src/context/deployment/types.ts +0 -183
  368. package/apps/dashboard/src/context/deployment/useDeploymentBuild.ts +0 -547
  369. package/apps/dashboard/src/context/deployment/useDeploymentConfig.ts +0 -176
  370. package/apps/dashboard/src/hooks/useBuildConnection.ts +0 -334
  371. package/apps/dashboard/src/hooks/useMonitorStream.ts +0 -146
  372. package/apps/dashboard/src/hooks/useProjectData.ts +0 -110
  373. package/apps/dashboard/src/hooks/useSSEConnection.ts +0 -465
  374. package/apps/dashboard/src/hooks/useSSEStream.ts +0 -309
  375. package/apps/dashboard/src/hooks/useSessions.ts +0 -104
  376. package/apps/dashboard/src/hooks/useSetupStream.ts +0 -223
  377. package/apps/dashboard/src/i18n/dictionaries/ar.json +0 -218
  378. package/apps/dashboard/src/i18n/dictionaries/en.json +0 -218
  379. package/apps/dashboard/src/i18n/index.ts +0 -16
  380. package/apps/dashboard/src/lib/api/ai.ts +0 -22
  381. package/apps/dashboard/src/lib/api/auth.ts +0 -13
  382. package/apps/dashboard/src/lib/api/client.ts +0 -199
  383. package/apps/dashboard/src/lib/api/cloud.ts +0 -15
  384. package/apps/dashboard/src/lib/api/deploy.ts +0 -58
  385. package/apps/dashboard/src/lib/api/domains.ts +0 -13
  386. package/apps/dashboard/src/lib/api/endpoints.ts +0 -129
  387. package/apps/dashboard/src/lib/api/github.ts +0 -31
  388. package/apps/dashboard/src/lib/api/icons.ts +0 -12
  389. package/apps/dashboard/src/lib/api/index.ts +0 -41
  390. package/apps/dashboard/src/lib/api/projects.ts +0 -153
  391. package/apps/dashboard/src/lib/api/sandbox.ts +0 -14
  392. package/apps/dashboard/src/lib/api/settings.ts +0 -21
  393. package/apps/dashboard/src/lib/api/system.ts +0 -159
  394. package/apps/dashboard/src/lib/auth-client.ts +0 -54
  395. package/apps/dashboard/src/lib/country.ts +0 -25
  396. package/apps/dashboard/src/lib/server/api.ts +0 -140
  397. package/apps/dashboard/src/lib/server/session.ts +0 -103
  398. package/apps/dashboard/src/lib/sseClient.ts +0 -241
  399. package/apps/dashboard/src/lib/sseMessageProcessors.ts +0 -323
  400. package/apps/dashboard/src/lib/utils.ts +0 -6
  401. package/apps/dashboard/src/proxy.ts +0 -46
  402. package/apps/dashboard/src/styles/Toast.module.css +0 -92
  403. package/apps/dashboard/src/styles/fonts.css +0 -93
  404. package/apps/dashboard/src/styles/theme.css +0 -336
  405. package/apps/dashboard/src/types/research.ts +0 -42
  406. package/apps/dashboard/src/utils/SSEParser.js +0 -150
  407. package/apps/dashboard/src/utils/authWindow.ts +0 -143
  408. package/apps/dashboard/src/utils/codeTheme.ts +0 -127
  409. package/apps/dashboard/src/utils/colors.json +0 -2810
  410. package/apps/dashboard/src/utils/date.ts +0 -121
  411. package/apps/dashboard/src/utils/deployment.ts +0 -128
  412. package/apps/dashboard/src/utils/deploymentPhaseDetector.ts +0 -232
  413. package/apps/dashboard/src/utils/extToLang.js +0 -103
  414. package/apps/dashboard/src/utils/github.ts +0 -62
  415. package/apps/dashboard/src/utils/icons.js +0 -46
  416. package/apps/dashboard/src/utils/repoSlug.ts +0 -110
  417. package/apps/dashboard/src/utils/research-api.ts +0 -163
  418. package/apps/dashboard/src/utils/suggestions.ts +0 -84
  419. package/apps/dashboard/src/utils/theme.js +0 -1
  420. package/apps/dashboard/src/utils/ui-helpers.tsx +0 -30
  421. package/apps/dashboard/src/utils/upload.js +0 -12
  422. package/apps/dashboard/tsconfig.json +0 -33
  423. package/apps/desktop/forge.config.json +0 -36
  424. package/apps/desktop/package.json +0 -26
  425. package/apps/desktop/scripts/dev.mjs +0 -58
  426. package/apps/desktop/src/main/index.ts +0 -675
  427. package/apps/desktop/src/main/types/desktop.d.ts +0 -33
  428. package/apps/desktop/src/preload/index.ts +0 -88
  429. package/apps/desktop/src/renderer/index.html +0 -462
  430. package/apps/desktop/src/renderer/onboarding.js +0 -511
  431. package/apps/desktop/src/renderer/styles.css +0 -1139
  432. package/apps/desktop/tsconfig.json +0 -17
  433. package/apps/web/.source/browser.ts +0 -13
  434. package/apps/web/.source/dynamic.ts +0 -8
  435. package/apps/web/.source/server.ts +0 -22
  436. package/apps/web/.source/source.config.mjs +0 -20
  437. package/apps/web/Dockerfile +0 -22
  438. package/apps/web/content/blog/how-ai-builds-work.mdx +0 -55
  439. package/apps/web/content/blog/introducing-openship.mdx +0 -46
  440. package/apps/web/content/blog/self-hosting-cost-breakdown.mdx +0 -59
  441. package/apps/web/content/docs/_meta.json +0 -14
  442. package/apps/web/content/docs/api.mdx +0 -98
  443. package/apps/web/content/docs/cli.mdx +0 -80
  444. package/apps/web/content/docs/first-deployment.mdx +0 -56
  445. package/apps/web/content/docs/index.mdx +0 -27
  446. package/apps/web/content/docs/installation.mdx +0 -65
  447. package/apps/web/content/docs/quickstart.mdx +0 -45
  448. package/apps/web/next-env.d.ts +0 -6
  449. package/apps/web/next.config.mjs +0 -20
  450. package/apps/web/package.json +0 -33
  451. package/apps/web/postcss.config.mjs +0 -5
  452. package/apps/web/public/android-chrome-192x192.png +0 -0
  453. package/apps/web/public/android-chrome-512x512.png +0 -0
  454. package/apps/web/public/apple-touch-icon.png +0 -0
  455. package/apps/web/public/favicon-16x16.png +0 -0
  456. package/apps/web/public/favicon-32x32.png +0 -0
  457. package/apps/web/public/favicon.ico +0 -0
  458. package/apps/web/public/site.webmanifest +0 -1
  459. package/apps/web/source.config.ts +0 -17
  460. package/apps/web/src/app/(marketing)/layout.tsx +0 -9
  461. package/apps/web/src/app/(marketing)/page.tsx +0 -2
  462. package/apps/web/src/app/(marketing)/pricing/page.tsx +0 -10
  463. package/apps/web/src/app/blog/[...slug]/page.tsx +0 -247
  464. package/apps/web/src/app/blog/blog.css +0 -575
  465. package/apps/web/src/app/blog/layout.tsx +0 -50
  466. package/apps/web/src/app/blog/page.tsx +0 -235
  467. package/apps/web/src/app/docs/[[...slug]]/page.tsx +0 -67
  468. package/apps/web/src/app/docs/layout.tsx +0 -62
  469. package/apps/web/src/app/docs/toc-theme.css +0 -71
  470. package/apps/web/src/app/download/page.tsx +0 -396
  471. package/apps/web/src/app/globals.css +0 -20
  472. package/apps/web/src/app/layout.tsx +0 -70
  473. package/apps/web/src/app/page.tsx +0 -51
  474. package/apps/web/src/app/robots.ts +0 -15
  475. package/apps/web/src/app/sitemap.ts +0 -35
  476. package/apps/web/src/components/blog/share-sidebar.tsx +0 -81
  477. package/apps/web/src/components/blog/writer-sidebar.tsx +0 -81
  478. package/apps/web/src/components/landing/ai-native.tsx +0 -169
  479. package/apps/web/src/components/landing/backups.tsx +0 -139
  480. package/apps/web/src/components/landing/cdn.tsx +0 -109
  481. package/apps/web/src/components/landing/coming-soon.tsx +0 -180
  482. package/apps/web/src/components/landing/dark-section.tsx +0 -166
  483. package/apps/web/src/components/landing/dashboard.tsx +0 -407
  484. package/apps/web/src/components/landing/developer-experience.tsx +0 -224
  485. package/apps/web/src/components/landing/dns-domains.tsx +0 -146
  486. package/apps/web/src/components/landing/download-button.tsx +0 -151
  487. package/apps/web/src/components/landing/features/ai-visual.tsx +0 -48
  488. package/apps/web/src/components/landing/features/cloud-visual.tsx +0 -44
  489. package/apps/web/src/components/landing/features/git-visual.tsx +0 -61
  490. package/apps/web/src/components/landing/features/index.tsx +0 -642
  491. package/apps/web/src/components/landing/features/infra-visual.tsx +0 -69
  492. package/apps/web/src/components/landing/features/rollback-visual.tsx +0 -42
  493. package/apps/web/src/components/landing/features/ssl-visual.tsx +0 -41
  494. package/apps/web/src/components/landing/features/stacks-visual.tsx +0 -54
  495. package/apps/web/src/components/landing/final-cta.tsx +0 -116
  496. package/apps/web/src/components/landing/footer.tsx +0 -145
  497. package/apps/web/src/components/landing/hero.tsx +0 -110
  498. package/apps/web/src/components/landing/how-it-works.tsx +0 -210
  499. package/apps/web/src/components/landing/index.ts +0 -21
  500. package/apps/web/src/components/landing/mail-server.tsx +0 -122
  501. package/apps/web/src/components/landing/navbar.tsx +0 -199
  502. package/apps/web/src/components/landing/no-lockin.tsx +0 -185
  503. package/apps/web/src/components/landing/open-source-cta.tsx +0 -151
  504. package/apps/web/src/components/landing/portability.tsx +0 -190
  505. package/apps/web/src/components/landing/pricing.tsx +0 -263
  506. package/apps/web/src/components/landing/scaling.tsx +0 -209
  507. package/apps/web/src/components/landing/why-openship.tsx +0 -291
  508. package/apps/web/src/hooks/use-gsap-scroll.ts +0 -158
  509. package/apps/web/src/hooks/use-platform.ts +0 -86
  510. package/apps/web/src/lib/source.ts +0 -12
  511. package/apps/web/src/styles/fonts.css +0 -84
  512. package/apps/web/src/styles/landing.css +0 -951
  513. package/apps/web/src/styles/theme.css +0 -227
  514. package/apps/web/tsconfig.json +0 -16
  515. package/bun.lock +0 -3260
  516. package/docker-compose.yml +0 -90
  517. package/docs/screenshots/.gitkeep +0 -0
  518. package/docs/screenshots/screen.png +0 -0
  519. package/openship.code-workspace +0 -7
  520. package/packages/adapters/docs/ARCHITECTURE.md +0 -160
  521. package/packages/adapters/docs/BUILD-PIPELINE.md +0 -171
  522. package/packages/adapters/docs/CLOUD.md +0 -239
  523. package/packages/adapters/docs/EXECUTOR.md +0 -174
  524. package/packages/adapters/docs/LOG-STREAMING.md +0 -175
  525. package/packages/adapters/docs/SYSTEM.md +0 -191
  526. package/packages/adapters/package.json +0 -32
  527. package/packages/adapters/src/index.ts +0 -144
  528. package/packages/adapters/src/infra/cloud.ts +0 -42
  529. package/packages/adapters/src/infra/index.ts +0 -9
  530. package/packages/adapters/src/infra/noop.ts +0 -27
  531. package/packages/adapters/src/infra/traefik.ts +0 -297
  532. package/packages/adapters/src/infra/types.ts +0 -36
  533. package/packages/adapters/src/platform.ts +0 -255
  534. package/packages/adapters/src/runtime/bare.ts +0 -567
  535. package/packages/adapters/src/runtime/build-pipeline.ts +0 -237
  536. package/packages/adapters/src/runtime/cloud.ts +0 -791
  537. package/packages/adapters/src/runtime/deploy-pipeline.ts +0 -146
  538. package/packages/adapters/src/runtime/docker.ts +0 -443
  539. package/packages/adapters/src/runtime/index.ts +0 -69
  540. package/packages/adapters/src/runtime/local-build.ts +0 -112
  541. package/packages/adapters/src/runtime/transfer.ts +0 -82
  542. package/packages/adapters/src/runtime/types.ts +0 -138
  543. package/packages/adapters/src/system/catalog.ts +0 -188
  544. package/packages/adapters/src/system/checks.ts +0 -228
  545. package/packages/adapters/src/system/components.ts +0 -45
  546. package/packages/adapters/src/system/debug.ts +0 -18
  547. package/packages/adapters/src/system/environment.ts +0 -168
  548. package/packages/adapters/src/system/errors.ts +0 -34
  549. package/packages/adapters/src/system/executor.ts +0 -600
  550. package/packages/adapters/src/system/index.ts +0 -58
  551. package/packages/adapters/src/system/installer.ts +0 -310
  552. package/packages/adapters/src/system/setup.ts +0 -442
  553. package/packages/adapters/src/system/state.ts +0 -96
  554. package/packages/adapters/src/system/types.ts +0 -116
  555. package/packages/adapters/src/toolchain/catalog.ts +0 -439
  556. package/packages/adapters/src/toolchain/checks.ts +0 -181
  557. package/packages/adapters/src/toolchain/index.ts +0 -38
  558. package/packages/adapters/src/toolchain/installer.ts +0 -189
  559. package/packages/adapters/src/toolchain/types.ts +0 -84
  560. package/packages/adapters/src/types.ts +0 -277
  561. package/packages/adapters/tsconfig.json +0 -11
  562. package/packages/core/package.json +0 -27
  563. package/packages/core/src/constants.ts +0 -71
  564. package/packages/core/src/errors.ts +0 -49
  565. package/packages/core/src/index.ts +0 -6
  566. package/packages/core/src/stacks.ts +0 -778
  567. package/packages/core/src/system.ts +0 -111
  568. package/packages/core/src/types.ts +0 -68
  569. package/packages/core/src/utils.ts +0 -43
  570. package/packages/core/tsconfig.json +0 -11
  571. package/packages/db/drizzle/0000_init.sql +0 -231
  572. package/packages/db/drizzle/0001_add_server_name.sql +0 -1
  573. package/packages/db/drizzle/meta/_journal.json +0 -20
  574. package/packages/db/drizzle.config.ts +0 -10
  575. package/packages/db/package.json +0 -44
  576. package/packages/db/src/client.ts +0 -119
  577. package/packages/db/src/index.ts +0 -60
  578. package/packages/db/src/repos/account.repo.ts +0 -92
  579. package/packages/db/src/repos/deployment.repo.ts +0 -168
  580. package/packages/db/src/repos/domain.repo.ts +0 -102
  581. package/packages/db/src/repos/git-installation.repo.ts +0 -95
  582. package/packages/db/src/repos/index.ts +0 -43
  583. package/packages/db/src/repos/instance-settings.repo.ts +0 -43
  584. package/packages/db/src/repos/project.repo.ts +0 -159
  585. package/packages/db/src/repos/session.repo.ts +0 -82
  586. package/packages/db/src/repos/settings.repo.ts +0 -51
  587. package/packages/db/src/repos/user.repo.ts +0 -94
  588. package/packages/db/src/schema/auth.ts +0 -56
  589. package/packages/db/src/schema/deployment.ts +0 -87
  590. package/packages/db/src/schema/domain.ts +0 -46
  591. package/packages/db/src/schema/github.ts +0 -24
  592. package/packages/db/src/schema/index.ts +0 -6
  593. package/packages/db/src/schema/project.ts +0 -117
  594. package/packages/db/src/schema/settings.ts +0 -103
  595. package/packages/db/tsconfig.json +0 -11
  596. package/packages/ui/package.json +0 -38
  597. package/packages/ui/src/components/badge.tsx +0 -29
  598. package/packages/ui/src/components/button.tsx +0 -44
  599. package/packages/ui/src/components/card.tsx +0 -26
  600. package/packages/ui/src/components/status-dot.tsx +0 -25
  601. package/packages/ui/src/globals.css +0 -18
  602. package/packages/ui/src/index.tsx +0 -8
  603. package/packages/ui/src/lib/cn.ts +0 -7
  604. package/packages/ui/tsconfig.json +0 -14
  605. package/pnpm-workspace.yaml +0 -3
  606. package/tsconfig.base.json +0 -18
  607. package/turbo.json +0 -36
@@ -0,0 +1,47 @@
1
+ -- Schema hardening: drop legacy organization_meta (folded into organization.is_team),
2
+ -- add missing FKs + indexes flagged by the enterprise audit, and the partial
3
+ -- unique index that race-guards concurrent deployment creation.
4
+ --
5
+ -- All statements are idempotent so re-running on DBs already partway through
6
+ -- the consolidation succeeds. Greenfield installs apply the same SQL with the
7
+ -- IF (NOT) EXISTS guards as no-op when conditions are met.
8
+
9
+ DROP TABLE IF EXISTS "organization_meta" CASCADE;--> statement-breakpoint
10
+ ALTER TABLE "organization" ADD COLUMN IF NOT EXISTS "is_team" boolean DEFAULT false NOT NULL;--> statement-breakpoint
11
+
12
+ -- FK: domain.service_id → service.id (CASCADE delete to prevent stale routing)
13
+ DO $$ BEGIN
14
+ ALTER TABLE "domain" ADD CONSTRAINT "domain_service_id_service_id_fk"
15
+ FOREIGN KEY ("service_id") REFERENCES "public"."service"("id") ON DELETE cascade ON UPDATE no action;
16
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
17
+
18
+ -- FK: env_var.service_id → service.id (CASCADE delete to prevent orphan env vars)
19
+ DO $$ BEGIN
20
+ ALTER TABLE "env_var" ADD CONSTRAINT "env_var_service_id_service_id_fk"
21
+ FOREIGN KEY ("service_id") REFERENCES "public"."service"("id") ON DELETE cascade ON UPDATE no action;
22
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
23
+
24
+ -- Race guard: only one in-flight deployment per project. The race-prone
25
+ -- (SELECT-then-INSERT) in build.service.ts now relies on this constraint.
26
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_deployment_one_active_per_project"
27
+ ON "deployment" USING btree ("project_id")
28
+ WHERE status IN ('queued', 'building', 'deploying');--> statement-breakpoint
29
+
30
+ -- Routing hot path — every hostname lookup hits the (project_id) and
31
+ -- (project_id, hostname) indexes.
32
+ CREATE INDEX IF NOT EXISTS "idx_domain_project" ON "domain" USING btree ("project_id");--> statement-breakpoint
33
+ CREATE INDEX IF NOT EXISTS "idx_domain_project_hostname" ON "domain" USING btree ("project_id","hostname");--> statement-breakpoint
34
+
35
+ -- Env var resolution runs on every build.
36
+ CREATE INDEX IF NOT EXISTS "idx_env_var_project_env_service" ON "env_var" USING btree ("project_id","environment","service_id");--> statement-breakpoint
37
+ CREATE INDEX IF NOT EXISTS "idx_env_var_project" ON "env_var" USING btree ("project_id");--> statement-breakpoint
38
+
39
+ -- GitHub App installation lookup: unique (provider, owner, user_id) backs
40
+ -- atomic onConflictDoUpdate; (organization_id, provider, owner) backs the
41
+ -- org-scoped resolution path used by every authed request that mints an
42
+ -- installation token.
43
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_git_installation_provider_owner_user" ON "git_installation" USING btree ("provider","owner","user_id");--> statement-breakpoint
44
+ CREATE INDEX IF NOT EXISTS "idx_git_installation_org" ON "git_installation" USING btree ("organization_id","provider","owner");--> statement-breakpoint
45
+
46
+ -- Build pipeline + deployment setup iterate services per project.
47
+ CREATE INDEX IF NOT EXISTS "idx_service_project_id" ON "service" USING btree ("project_id");
@@ -0,0 +1,2 @@
1
+ ALTER TABLE "project" ADD COLUMN IF NOT EXISTS "cloud_workspace_id" text;--> statement-breakpoint
2
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_project_cloud_workspace_id" ON "project" USING btree ("cloud_workspace_id") WHERE "project"."cloud_workspace_id" IS NOT NULL AND "project"."deleted_at" IS NULL;
@@ -0,0 +1 @@
1
+ ALTER TABLE "instance_settings" ADD COLUMN "invitation_mail_source" text DEFAULT 'platform' NOT NULL;
@@ -0,0 +1,10 @@
1
+ -- Backfill any remaining nulls (from sessions created before the
2
+ -- create-time hook landed) to the user's personal org. The
3
+ -- provisionUser convention is org_<userId>, and provisionUser
4
+ -- guarantees that org + owner-member row exist for every user.
5
+ UPDATE "session" SET "active_organization_id" = 'org_' || "user_id"
6
+ WHERE "active_organization_id" IS NULL;
7
+ --> statement-breakpoint
8
+ -- Promote to NOT NULL — the schema itself now enforces the
9
+ -- invariant. No code path can violate it.
10
+ ALTER TABLE "session" ALTER COLUMN "active_organization_id" SET NOT NULL;
@@ -0,0 +1,3 @@
1
+ ALTER TABLE "instance_settings" ADD COLUMN "team_mode" text DEFAULT 'single_user' NOT NULL;--> statement-breakpoint
2
+ ALTER TABLE "instance_settings" ADD COLUMN "migration_target_url" text;--> statement-breakpoint
3
+ ALTER TABLE "instance_settings" ADD COLUMN "migrated_at" timestamp;
@@ -0,0 +1 @@
1
+ ALTER TABLE "instance_settings" ADD COLUMN "migration_server_id" text;
@@ -0,0 +1,2 @@
1
+ ALTER TABLE "instance_settings" ADD COLUMN "tunnel_slug" text;--> statement-breakpoint
2
+ ALTER TABLE "instance_settings" ADD COLUMN "tunnel_id" text;
@@ -0,0 +1,3 @@
1
+ ALTER TABLE "instance_settings" ADD COLUMN "migration_in_progress" boolean NOT NULL DEFAULT false;
2
+ --> statement-breakpoint
3
+ ALTER TABLE "instance_settings" ADD COLUMN "migration_started_at" timestamp;
@@ -0,0 +1,142 @@
1
+ -- Billing & credits: add per-org plan/subscription columns and the credit
2
+ -- ledger tables. Idempotent (IF NOT EXISTS guards) so applying twice on a
3
+ -- partway-through DB is a no-op.
4
+
5
+ -- ── organization: billing columns ───────────────────────────────────────────
6
+ ALTER TABLE "organization" ADD COLUMN IF NOT EXISTS "plan_tier_id" text DEFAULT 'free' NOT NULL;--> statement-breakpoint
7
+ ALTER TABLE "organization" ADD COLUMN IF NOT EXISTS "stripe_customer_id" text;--> statement-breakpoint
8
+ ALTER TABLE "organization" ADD COLUMN IF NOT EXISTS "subscription_status" text DEFAULT 'active' NOT NULL;--> statement-breakpoint
9
+ ALTER TABLE "organization" ADD COLUMN IF NOT EXISTS "current_period_start" timestamp;--> statement-breakpoint
10
+ ALTER TABLE "organization" ADD COLUMN IF NOT EXISTS "current_period_end" timestamp;--> statement-breakpoint
11
+ ALTER TABLE "organization" ADD COLUMN IF NOT EXISTS "oblien_namespace" text;--> statement-breakpoint
12
+
13
+ -- ── billing_customer ────────────────────────────────────────────────────────
14
+ CREATE TABLE IF NOT EXISTS "billing_customer" (
15
+ "id" text PRIMARY KEY NOT NULL,
16
+ "organization_id" text NOT NULL,
17
+ "stripe_customer_id" text NOT NULL,
18
+ "email" text NOT NULL,
19
+ "created_at" timestamp DEFAULT now() NOT NULL,
20
+ "updated_at" timestamp DEFAULT now() NOT NULL
21
+ );--> statement-breakpoint
22
+
23
+ DO $$ BEGIN
24
+ ALTER TABLE "billing_customer" ADD CONSTRAINT "billing_customer_organization_id_organization_id_fk"
25
+ FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
26
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
27
+
28
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_billing_customer_org" ON "billing_customer" USING btree ("organization_id");--> statement-breakpoint
29
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_billing_customer_stripe" ON "billing_customer" USING btree ("stripe_customer_id");--> statement-breakpoint
30
+
31
+ -- ── billing_subscription ────────────────────────────────────────────────────
32
+ CREATE TABLE IF NOT EXISTS "billing_subscription" (
33
+ "id" text PRIMARY KEY NOT NULL,
34
+ "organization_id" text NOT NULL,
35
+ "stripe_subscription_id" text NOT NULL,
36
+ "stripe_price_id" text NOT NULL,
37
+ "plan_tier_id" text NOT NULL,
38
+ "interval" text NOT NULL,
39
+ "status" text NOT NULL,
40
+ "current_period_start" timestamp NOT NULL,
41
+ "current_period_end" timestamp NOT NULL,
42
+ "cancel_at_period_end" boolean DEFAULT false NOT NULL,
43
+ "created_at" timestamp DEFAULT now() NOT NULL,
44
+ "updated_at" timestamp DEFAULT now() NOT NULL
45
+ );--> statement-breakpoint
46
+
47
+ DO $$ BEGIN
48
+ ALTER TABLE "billing_subscription" ADD CONSTRAINT "billing_subscription_organization_id_organization_id_fk"
49
+ FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
50
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
51
+
52
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_billing_subscription_stripe" ON "billing_subscription" USING btree ("stripe_subscription_id");--> statement-breakpoint
53
+ CREATE INDEX IF NOT EXISTS "idx_billing_subscription_org" ON "billing_subscription" USING btree ("organization_id");--> statement-breakpoint
54
+
55
+ -- ── credit_balance ──────────────────────────────────────────────────────────
56
+ CREATE TABLE IF NOT EXISTS "credit_balance" (
57
+ "organization_id" text PRIMARY KEY NOT NULL,
58
+ "monthly_free_milli" bigint DEFAULT 0 NOT NULL,
59
+ "topup_milli" bigint DEFAULT 0 NOT NULL,
60
+ "updated_at" timestamp DEFAULT now() NOT NULL
61
+ );--> statement-breakpoint
62
+
63
+ DO $$ BEGIN
64
+ ALTER TABLE "credit_balance" ADD CONSTRAINT "credit_balance_organization_id_organization_id_fk"
65
+ FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
66
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
67
+
68
+ -- ── credit_grant ────────────────────────────────────────────────────────────
69
+ CREATE TABLE IF NOT EXISTS "credit_grant" (
70
+ "id" text PRIMARY KEY NOT NULL,
71
+ "organization_id" text NOT NULL,
72
+ "amount_milli" bigint NOT NULL,
73
+ "bucket" text NOT NULL,
74
+ "source" text NOT NULL,
75
+ "source_ref" text,
76
+ "expires_at" timestamp,
77
+ "created_at" timestamp DEFAULT now() NOT NULL
78
+ );--> statement-breakpoint
79
+
80
+ DO $$ BEGIN
81
+ ALTER TABLE "credit_grant" ADD CONSTRAINT "credit_grant_organization_id_organization_id_fk"
82
+ FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
83
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
84
+
85
+ CREATE INDEX IF NOT EXISTS "idx_credit_grant_org_created" ON "credit_grant" USING btree ("organization_id","created_at");--> statement-breakpoint
86
+
87
+ -- ── credit_consumption ──────────────────────────────────────────────────────
88
+ CREATE TABLE IF NOT EXISTS "credit_consumption" (
89
+ "id" text PRIMARY KEY NOT NULL,
90
+ "organization_id" text NOT NULL,
91
+ "oblien_event_id" text NOT NULL,
92
+ "resource_type" text NOT NULL,
93
+ "quantity_milli" bigint NOT NULL,
94
+ "credits_milli" bigint NOT NULL,
95
+ "bucket_consumed" text NOT NULL,
96
+ "occurred_at" timestamp NOT NULL,
97
+ "recorded_at" timestamp DEFAULT now() NOT NULL
98
+ );--> statement-breakpoint
99
+
100
+ DO $$ BEGIN
101
+ ALTER TABLE "credit_consumption" ADD CONSTRAINT "credit_consumption_organization_id_organization_id_fk"
102
+ FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
103
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
104
+
105
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_credit_consumption_org_event" ON "credit_consumption" USING btree ("organization_id","oblien_event_id");--> statement-breakpoint
106
+ CREATE INDEX IF NOT EXISTS "idx_credit_consumption_org_occurred" ON "credit_consumption" USING btree ("organization_id","occurred_at");--> statement-breakpoint
107
+
108
+ -- ── credit_pack ─────────────────────────────────────────────────────────────
109
+ CREATE TABLE IF NOT EXISTS "credit_pack" (
110
+ "id" text PRIMARY KEY NOT NULL,
111
+ "name" text NOT NULL,
112
+ "credits_milli" bigint NOT NULL,
113
+ "price_cents" integer NOT NULL,
114
+ "stripe_product_id" text NOT NULL,
115
+ "stripe_price_id" text NOT NULL,
116
+ "active" boolean DEFAULT true NOT NULL,
117
+ "sort_order" integer DEFAULT 0 NOT NULL
118
+ );--> statement-breakpoint
119
+
120
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_credit_pack_stripe_price" ON "credit_pack" USING btree ("stripe_price_id");--> statement-breakpoint
121
+
122
+ -- ── oblien_usage_cursor ─────────────────────────────────────────────────────
123
+ CREATE TABLE IF NOT EXISTS "oblien_usage_cursor" (
124
+ "organization_id" text PRIMARY KEY NOT NULL,
125
+ "oblien_namespace" text NOT NULL,
126
+ "last_synced_at" timestamp NOT NULL,
127
+ "last_sync_run_at" timestamp NOT NULL,
128
+ "consecutive_failures" integer DEFAULT 0 NOT NULL
129
+ );--> statement-breakpoint
130
+
131
+ DO $$ BEGIN
132
+ ALTER TABLE "oblien_usage_cursor" ADD CONSTRAINT "oblien_usage_cursor_organization_id_organization_id_fk"
133
+ FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
134
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
135
+
136
+ -- ── stripe_webhook_event ────────────────────────────────────────────────────
137
+ CREATE TABLE IF NOT EXISTS "stripe_webhook_event" (
138
+ "stripe_event_id" text PRIMARY KEY NOT NULL,
139
+ "event_type" text NOT NULL,
140
+ "received_at" timestamp DEFAULT now() NOT NULL,
141
+ "processed_at" timestamp
142
+ );
@@ -0,0 +1,14 @@
1
+ -- Partial unique index on credit_grant (organization_id, source, source_ref)
2
+ -- where source_ref IS NOT NULL. Closes the race between the Stripe webhook
3
+ -- and the monthly-reset cron: both used to mint a tier_grant for the same
4
+ -- period boundary, producing two ledger rows + a doubled allowance in the
5
+ -- cache. The unique index makes the second insert a conflict; the writers
6
+ -- use ON CONFLICT DO NOTHING and skip the cache delta when no row landed.
7
+ --
8
+ -- Partial (source_ref IS NOT NULL) so admin/refund grants minted with a
9
+ -- null source_ref are not coerced into uniqueness — those are intentionally
10
+ -- distinct ledger rows.
11
+
12
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_credit_grant_org_source_ref"
13
+ ON "credit_grant" USING btree ("organization_id", "source", "source_ref")
14
+ WHERE "source_ref" IS NOT NULL;
@@ -0,0 +1,23 @@
1
+ -- Demolish the local credit ledger.
2
+ --
3
+ -- Quota is now owned by Oblien (the runtime meters consumption directly and
4
+ -- enforces `setQuota` limits). The local grant/consume/balance triplet and
5
+ -- the Oblien pull-sync cursor are obsolete. The Stripe-side state lives on
6
+ -- in billing_customer / billing_subscription / credit_pack / stripe_webhook_event.
7
+ --
8
+ -- Order matters: drop indexes first (defensive — DROP TABLE drops them too,
9
+ -- but being explicit keeps the diff easy to audit), then the tables in
10
+ -- dependency order. There are no FKs between the four dropped tables, but
11
+ -- credit_consumption + credit_grant + credit_balance + oblien_usage_cursor
12
+ -- all reference organization.id with ON DELETE CASCADE, which postgres
13
+ -- handles cleanly regardless of drop order.
14
+
15
+ DROP INDEX IF EXISTS "uq_credit_grant_org_source_ref";--> statement-breakpoint
16
+ DROP INDEX IF EXISTS "idx_credit_grant_org_created";--> statement-breakpoint
17
+ DROP INDEX IF EXISTS "uq_credit_consumption_org_event";--> statement-breakpoint
18
+ DROP INDEX IF EXISTS "idx_credit_consumption_org_occurred";--> statement-breakpoint
19
+
20
+ DROP TABLE IF EXISTS "credit_consumption";--> statement-breakpoint
21
+ DROP TABLE IF EXISTS "credit_balance";--> statement-breakpoint
22
+ DROP TABLE IF EXISTS "credit_grant";--> statement-breakpoint
23
+ DROP TABLE IF EXISTS "oblien_usage_cursor";
@@ -0,0 +1,81 @@
1
+ -- Smart per-service deploys + git-strategy rollback
2
+ --
3
+ -- Adds the schema surface for two related features:
4
+ --
5
+ -- 1. Smart per-service deploys — record which paths changed between
6
+ -- the previous successful deploy and this one (`changed_paths`),
7
+ -- let the build pipeline skip services whose root_directory was
8
+ -- untouched, and surface the result per-service in the existing
9
+ -- service_deployment table.
10
+ --
11
+ -- 2. Git-strategy rollback — instead of always archiving each
12
+ -- deploy's image + workspace snapshot, projects can opt to roll
13
+ -- back by checking out the prior commit and rebuilding
14
+ -- (`rollback_strategy = "git"`). Cheaper on disk, slower to
15
+ -- restore. Snapshotted per-deployment via `commit_sha_before`.
16
+ --
17
+ -- Idempotent (IF NOT EXISTS guards) so a partial re-apply is safe.
18
+
19
+ -- ── deployment ───────────────────────────────────────────────────────────────
20
+ ALTER TABLE "deployment" ADD COLUMN IF NOT EXISTS "commit_sha_before" text;--> statement-breakpoint
21
+ ALTER TABLE "deployment" ADD COLUMN IF NOT EXISTS "changed_paths" jsonb;--> statement-breakpoint
22
+ ALTER TABLE "deployment" ADD COLUMN IF NOT EXISTS "changed_paths_truncated" boolean DEFAULT false NOT NULL;--> statement-breakpoint
23
+ ALTER TABLE "deployment" ADD COLUMN IF NOT EXISTS "force_all" boolean DEFAULT false NOT NULL;--> statement-breakpoint
24
+ ALTER TABLE "deployment" ADD COLUMN IF NOT EXISTS "rollback_strategy" text DEFAULT 'snapshot' NOT NULL;--> statement-breakpoint
25
+
26
+ -- ── project ──────────────────────────────────────────────────────────────────
27
+ ALTER TABLE "project" ADD COLUMN IF NOT EXISTS "default_rollback_strategy" text DEFAULT 'snapshot' NOT NULL;--> statement-breakpoint
28
+ ALTER TABLE "project" ADD COLUMN IF NOT EXISTS "force_deploy_next" boolean DEFAULT false NOT NULL;--> statement-breakpoint
29
+ ALTER TABLE "project" ADD COLUMN IF NOT EXISTS "monorepo_shared_paths" jsonb;--> statement-breakpoint
30
+ ALTER TABLE "project" ADD COLUMN IF NOT EXISTS "always_rebuild_paths" jsonb;--> statement-breakpoint
31
+
32
+ -- ── service ──────────────────────────────────────────────────────────────────
33
+ ALTER TABLE "service" ADD COLUMN IF NOT EXISTS "always_rebuild_globs" jsonb;--> statement-breakpoint
34
+
35
+ -- ── service_deployment: smart-deploy tracking columns ───────────────────────
36
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "service_name" text;--> statement-breakpoint
37
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "reason" text;--> statement-breakpoint
38
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "reason_skipped" text;--> statement-breakpoint
39
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "url" text;--> statement-breakpoint
40
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "started_at" timestamp;--> statement-breakpoint
41
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "finished_at" timestamp;--> statement-breakpoint
42
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "duration_ms" integer;--> statement-breakpoint
43
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "error_message" text;--> statement-breakpoint
44
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "error" text;--> statement-breakpoint
45
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "check_run_id" bigint;--> statement-breakpoint
46
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "check_run_url" text;--> statement-breakpoint
47
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "artifact_retained_at" timestamp;--> statement-breakpoint
48
+ ALTER TABLE "service_deployment" ADD COLUMN IF NOT EXISTS "logs_ref" text;--> statement-breakpoint
49
+
50
+ -- service_deployment indexes
51
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_service_deployment_dep_svc" ON "service_deployment" USING btree ("deployment_id","service_id");--> statement-breakpoint
52
+ CREATE INDEX IF NOT EXISTS "ix_service_deployment_deployment" ON "service_deployment" USING btree ("deployment_id");--> statement-breakpoint
53
+ CREATE INDEX IF NOT EXISTS "ix_service_deployment_service_status" ON "service_deployment" USING btree ("service_id","status");--> statement-breakpoint
54
+ CREATE INDEX IF NOT EXISTS "ix_service_deployment_service_created" ON "service_deployment" USING btree ("service_id","created_at");--> statement-breakpoint
55
+
56
+ -- ── deployment_check_run ─────────────────────────────────────────────────────
57
+ CREATE TABLE IF NOT EXISTS "deployment_check_run" (
58
+ "id" text PRIMARY KEY NOT NULL,
59
+ "deployment_id" text NOT NULL,
60
+ "check_run_id" bigint NOT NULL,
61
+ "name" text NOT NULL,
62
+ "kind" text NOT NULL,
63
+ "service_deployment_id" text,
64
+ "status" text NOT NULL,
65
+ "conclusion" text,
66
+ "created_at" timestamp DEFAULT now() NOT NULL,
67
+ "updated_at" timestamp DEFAULT now() NOT NULL
68
+ );--> statement-breakpoint
69
+
70
+ DO $$ BEGIN
71
+ ALTER TABLE "deployment_check_run" ADD CONSTRAINT "deployment_check_run_deployment_id_deployment_id_fk"
72
+ FOREIGN KEY ("deployment_id") REFERENCES "public"."deployment"("id") ON DELETE cascade ON UPDATE no action;
73
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
74
+
75
+ DO $$ BEGIN
76
+ ALTER TABLE "deployment_check_run" ADD CONSTRAINT "deployment_check_run_service_deployment_id_service_deployment_id_fk"
77
+ FOREIGN KEY ("service_deployment_id") REFERENCES "public"."service_deployment"("id") ON DELETE cascade ON UPDATE no action;
78
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
79
+
80
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_deployment_check_run_per_kind" ON "deployment_check_run" USING btree ("deployment_id","kind","service_deployment_id");--> statement-breakpoint
81
+ CREATE INDEX IF NOT EXISTS "ix_deployment_check_run_deployment" ON "deployment_check_run" USING btree ("deployment_id");
@@ -0,0 +1,38 @@
1
+ -- ── Fix deployment_check_run uniqueness for rollup rows ─────────────────────
2
+ --
3
+ -- The previous `uq_deployment_check_run_per_kind` index covers
4
+ -- (deployment_id, kind, service_deployment_id). PostgreSQL treats NULLs
5
+ -- as distinct in unique indexes by default, so multiple rows with
6
+ -- (deployment_id, 'rollup', NULL) could coexist — the rollup invariant
7
+ -- of "one rollup row per deployment" was never actually enforced.
8
+ --
9
+ -- This migration replaces that single non-effective index with two
10
+ -- partial unique indexes that match the actual data shapes:
11
+ --
12
+ -- - rollup rows (kind = 'rollup', service_deployment_id IS NULL):
13
+ -- unique on (deployment_id)
14
+ --
15
+ -- - service rows (service_deployment_id IS NOT NULL):
16
+ -- unique on (deployment_id, service_deployment_id)
17
+ --
18
+ -- Also drops a couple of redundant secondary indexes whose lookups are
19
+ -- already covered by the leading column of an existing unique index.
20
+
21
+ DROP INDEX IF EXISTS "uq_deployment_check_run_per_kind";--> statement-breakpoint
22
+
23
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_deployment_check_run_rollup"
24
+ ON "deployment_check_run" ("deployment_id")
25
+ WHERE "kind" = 'rollup';--> statement-breakpoint
26
+
27
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_deployment_check_run_service"
28
+ ON "deployment_check_run" ("deployment_id", "service_deployment_id")
29
+ WHERE "service_deployment_id" IS NOT NULL;--> statement-breakpoint
30
+
31
+ -- Redundant: covered by `uq_deployment_check_run_rollup` /
32
+ -- `uq_deployment_check_run_service` (both have deployment_id as the
33
+ -- leading column), so a separate ix on deployment_id buys nothing.
34
+ DROP INDEX IF EXISTS "ix_deployment_check_run_deployment";--> statement-breakpoint
35
+
36
+ -- Redundant: covered by `uq_service_deployment_dep_svc` whose leading
37
+ -- column is deployment_id.
38
+ DROP INDEX IF EXISTS "ix_service_deployment_deployment";
@@ -0,0 +1,9 @@
1
+ -- Flip the default rollback strategy for NEW projects from "snapshot" to
2
+ -- "git". Existing rows are not touched — they keep whatever they were
3
+ -- created with (a previously-deployed project relying on snapshot
4
+ -- rollback should not silently lose its snapshots).
5
+ --
6
+ -- Users can change the per-project setting via the dashboard's git
7
+ -- settings page.
8
+
9
+ ALTER TABLE "project" ALTER COLUMN "default_rollback_strategy" SET DEFAULT 'git';
@@ -0,0 +1,41 @@
1
+ -- Billing idempotency: per-checkout-session topup grants + per-period
2
+ -- anniversary cron grants. Both protect read-modify-write Oblien quota
3
+ -- mutations from being re-applied when their upstream driver retries:
4
+ -- - stripe_topup_grant Stripe webhook redelivery of checkout.session.completed
5
+ -- would otherwise call addQuota twice → double-credit.
6
+ -- - billing_anniversary_grant Cron crash between Oblien resetQuota and the
7
+ -- local period UPDATE would let the next tick
8
+ -- re-zero quota_used on the new period.
9
+ -- Idempotent (IF NOT EXISTS guards) so applying twice on a partway-through
10
+ -- DB is a no-op.
11
+
12
+ CREATE TABLE IF NOT EXISTS "stripe_topup_grant" (
13
+ "id" text PRIMARY KEY NOT NULL,
14
+ "checkout_session_id" text NOT NULL,
15
+ "organization_id" text NOT NULL,
16
+ "pack_id" text NOT NULL,
17
+ "credits_milli" bigint NOT NULL,
18
+ "granted_at" timestamp DEFAULT now() NOT NULL
19
+ );--> statement-breakpoint
20
+
21
+ DO $$ BEGIN
22
+ ALTER TABLE "stripe_topup_grant" ADD CONSTRAINT "stripe_topup_grant_organization_id_organization_id_fk"
23
+ FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
24
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
25
+
26
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_stripe_topup_grant_session" ON "stripe_topup_grant" USING btree ("checkout_session_id");--> statement-breakpoint
27
+ CREATE INDEX IF NOT EXISTS "idx_stripe_topup_grant_org" ON "stripe_topup_grant" USING btree ("organization_id");--> statement-breakpoint
28
+
29
+ CREATE TABLE IF NOT EXISTS "billing_anniversary_grant" (
30
+ "id" text PRIMARY KEY NOT NULL,
31
+ "organization_id" text NOT NULL,
32
+ "period_start" timestamp NOT NULL,
33
+ "granted_at" timestamp DEFAULT now() NOT NULL
34
+ );--> statement-breakpoint
35
+
36
+ DO $$ BEGIN
37
+ ALTER TABLE "billing_anniversary_grant" ADD CONSTRAINT "billing_anniversary_grant_organization_id_organization_id_fk"
38
+ FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;
39
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;--> statement-breakpoint
40
+
41
+ CREATE UNIQUE INDEX IF NOT EXISTS "uq_billing_anniversary_grant_org_period" ON "billing_anniversary_grant" USING btree ("organization_id","period_start");
@@ -0,0 +1,30 @@
1
+ -- HIGH-finding fixes for GitHub auth surface (audit, June 2026).
2
+ --
3
+ -- HIGH #6 — github_install_state: short-TTL nonces that bind the install
4
+ -- URL the SaaS hands back to a specific local user/org. Resolves the
5
+ -- "echo-back state with no local binding" hole in the install flow.
6
+ CREATE TABLE "github_install_state" (
7
+ "id" text PRIMARY KEY NOT NULL,
8
+ "state" text NOT NULL,
9
+ "user_id" text NOT NULL,
10
+ "organization_id" text,
11
+ "expires_at" timestamp NOT NULL,
12
+ "created_at" timestamp DEFAULT now() NOT NULL,
13
+ CONSTRAINT "github_install_state_state_unique" UNIQUE("state")
14
+ );
15
+ --> statement-breakpoint
16
+ CREATE INDEX "github_install_state_expires_idx" ON "github_install_state" USING btree ("expires_at");--> statement-breakpoint
17
+ CREATE INDEX "github_install_state_user_idx" ON "github_install_state" USING btree ("user_id");--> statement-breakpoint
18
+
19
+ -- HIGH #9 — per-project webhook signing secret (encrypted via lib/encryption).
20
+ -- Null on legacy rows; verifier falls back to env.GITHUB_WEBHOOK_SECRET there.
21
+ ALTER TABLE "project" ADD COLUMN "webhook_secret" text;--> statement-breakpoint
22
+
23
+ -- HIGH #7 — explicit operator opt-in for the gh CLI escape hatch.
24
+ -- Without this, "owner of any org" gated transitive access to the
25
+ -- operator's broad-scope PAT.
26
+ ALTER TABLE "user_settings" ADD COLUMN "gh_cli_operator_opted_in" boolean DEFAULT false NOT NULL;--> statement-breakpoint
27
+
28
+ -- HIGH #10 — PAT scope cached from inspectPatScope so we can re-validate
29
+ -- at use time without re-issuing `GET /user`.
30
+ ALTER TABLE "user_settings" ADD COLUMN "pat_scope" jsonb;
@@ -0,0 +1,6 @@
1
+ CREATE TABLE "oblien_webhook_event" (
2
+ "oblien_event_id" text PRIMARY KEY NOT NULL,
3
+ "event_type" text NOT NULL,
4
+ "received_at" timestamp DEFAULT now() NOT NULL,
5
+ "processed_at" timestamp
6
+ );
@@ -0,0 +1 @@
1
+ ALTER TABLE "project" ADD COLUMN "deletion_in_progress" boolean DEFAULT false NOT NULL;
@@ -0,0 +1 @@
1
+ ALTER TABLE "project" RENAME COLUMN "workspace_install_command" TO "workspace_prepare_command";
@@ -0,0 +1,13 @@
1
+ CREATE TABLE "server_tunnels" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "server_id" text NOT NULL,
4
+ "remote_port" integer NOT NULL,
5
+ "remote_host" text DEFAULT '127.0.0.1' NOT NULL,
6
+ "local_port" integer,
7
+ "auto_start" boolean DEFAULT false NOT NULL,
8
+ "created_at" timestamp DEFAULT now() NOT NULL,
9
+ "updated_at" timestamp DEFAULT now() NOT NULL
10
+ );
11
+ --> statement-breakpoint
12
+ ALTER TABLE "server_tunnels" ADD CONSTRAINT "server_tunnels_server_id_servers_id_fk" FOREIGN KEY ("server_id") REFERENCES "public"."servers"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
13
+ CREATE UNIQUE INDEX "uq_server_tunnel_target" ON "server_tunnels" USING btree ("server_id","remote_port","remote_host");
@@ -0,0 +1,2 @@
1
+ ALTER TABLE "deployment" ADD COLUMN "version" integer;--> statement-breakpoint
2
+ ALTER TABLE "project" ADD COLUMN "runtime_mode" text;
@@ -0,0 +1,6 @@
1
+ -- Versions now represent shipped releases: a deployment gets its version number
2
+ -- in onSuccess (per-commit), not at create. Clear the per-attempt numbers that
3
+ -- the old MAX(version)+1-at-create logic assigned to non-successful deploys so
4
+ -- failed/in-flight rows stop showing a stale vN badge. Successful (ready) rows
5
+ -- keep their existing numbers.
6
+ UPDATE "deployment" SET "version" = NULL WHERE "status" <> 'ready';
@@ -0,0 +1,17 @@
1
+ CREATE TABLE "personal_access_token" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "user_id" text NOT NULL,
4
+ "organization_id" text,
5
+ "name" text NOT NULL,
6
+ "token_prefix" text NOT NULL,
7
+ "token_hash" text NOT NULL,
8
+ "read_only" boolean DEFAULT false NOT NULL,
9
+ "expires_at" timestamp,
10
+ "last_used_at" timestamp,
11
+ "revoked_at" timestamp,
12
+ "created_at" timestamp DEFAULT now() NOT NULL,
13
+ CONSTRAINT "personal_access_token_token_hash_unique" UNIQUE("token_hash")
14
+ );
15
+ --> statement-breakpoint
16
+ CREATE INDEX "personal_access_token_user_idx" ON "personal_access_token" USING btree ("user_id");--> statement-breakpoint
17
+ CREATE INDEX "personal_access_token_prefix_idx" ON "personal_access_token" USING btree ("token_prefix");
@@ -0,0 +1,2 @@
1
+ ALTER TABLE "service" ADD COLUMN "imported_spec" jsonb;--> statement-breakpoint
2
+ ALTER TABLE "service" ADD COLUMN "drift_spec" jsonb;
@@ -0,0 +1 @@
1
+ ALTER TABLE "service" ADD COLUMN "advanced" jsonb DEFAULT '{}'::jsonb;
@@ -0,0 +1,11 @@
1
+ ALTER TABLE "backup_policy" ALTER COLUMN "project_id" DROP NOT NULL;--> statement-breakpoint
2
+ ALTER TABLE "backup_policy" ADD COLUMN "source_kind" text DEFAULT 'service' NOT NULL;--> statement-breakpoint
3
+ ALTER TABLE "backup_policy" ADD COLUMN "mail_server_id" text;--> statement-breakpoint
4
+ ALTER TABLE "backup_restore" ADD COLUMN "fork_mail_server_id" text;--> statement-breakpoint
5
+ ALTER TABLE "backup_run" ADD COLUMN "source_kind" text DEFAULT 'service' NOT NULL;--> statement-breakpoint
6
+ ALTER TABLE "backup_run" ADD COLUMN "mail_server_id" text;--> statement-breakpoint
7
+ ALTER TABLE "backup_policy" ADD CONSTRAINT "backup_policy_mail_server_id_mail_servers_server_id_fk" FOREIGN KEY ("mail_server_id") REFERENCES "public"."mail_servers"("server_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
8
+ ALTER TABLE "backup_restore" ADD CONSTRAINT "backup_restore_fork_mail_server_id_mail_servers_server_id_fk" FOREIGN KEY ("fork_mail_server_id") REFERENCES "public"."mail_servers"("server_id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
9
+ ALTER TABLE "backup_run" ADD CONSTRAINT "backup_run_mail_server_id_mail_servers_server_id_fk" FOREIGN KEY ("mail_server_id") REFERENCES "public"."mail_servers"("server_id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
10
+ CREATE UNIQUE INDEX "uq_backup_policy_mail_server" ON "backup_policy" USING btree ("mail_server_id") WHERE "backup_policy"."mail_server_id" IS NOT NULL AND "backup_policy"."deleted_at" IS NULL;--> statement-breakpoint
11
+ CREATE INDEX "idx_backup_policy_mail_server" ON "backup_policy" USING btree ("mail_server_id");
@@ -0,0 +1,6 @@
1
+ ALTER TABLE "service" ADD COLUMN "namespace_volumes" boolean DEFAULT true NOT NULL;--> statement-breakpoint
2
+ -- Grandfather every EXISTING service to bare (un-scoped) volume names so their
3
+ -- on-disk data is not orphaned. Rows created AFTER this migration take the
4
+ -- column default (true) and get project-scoped volumes. Load-bearing: without
5
+ -- it, ADD COLUMN DEFAULT true would scope existing services and lose their data.
6
+ UPDATE "service" SET "namespace_volumes" = false;
@@ -0,0 +1,18 @@
1
+ CREATE TABLE "orphaned_resource" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "organization_id" text NOT NULL,
4
+ "server_id" text,
5
+ "resource_type" text NOT NULL,
6
+ "ref" text NOT NULL,
7
+ "project_id" text,
8
+ "label" text,
9
+ "runtime_mode" text,
10
+ "payload" jsonb,
11
+ "attempts" integer DEFAULT 0 NOT NULL,
12
+ "last_attempt_at" timestamp,
13
+ "created_at" timestamp DEFAULT now() NOT NULL
14
+ );
15
+ --> statement-breakpoint
16
+ ALTER TABLE "orphaned_resource" ADD CONSTRAINT "orphaned_resource_organization_id_organization_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
17
+ CREATE INDEX "orphaned_resource_server_idx" ON "orphaned_resource" USING btree ("server_id");--> statement-breakpoint
18
+ CREATE INDEX "orphaned_resource_org_created_idx" ON "orphaned_resource" USING btree ("organization_id","created_at");
@@ -0,0 +1,16 @@
1
+ CREATE TABLE "cloud_webhook_binding" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "organization_id" text NOT NULL,
4
+ "cloud_project_id" text NOT NULL,
5
+ "git_owner" text NOT NULL,
6
+ "git_repo" text NOT NULL,
7
+ "git_branch" text DEFAULT '' NOT NULL,
8
+ "webhook_id" integer,
9
+ "webhook_secret" text,
10
+ "created_at" timestamp DEFAULT now() NOT NULL,
11
+ "updated_at" timestamp DEFAULT now() NOT NULL
12
+ );
13
+ --> statement-breakpoint
14
+ ALTER TABLE "cloud_webhook_binding" ADD CONSTRAINT "cloud_webhook_binding_organization_id_organization_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organization"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
15
+ CREATE UNIQUE INDEX "uq_cloud_webhook_binding_repo_branch" ON "cloud_webhook_binding" USING btree ("git_owner","git_repo","git_branch");--> statement-breakpoint
16
+ CREATE INDEX "idx_cloud_webhook_binding_cloud_project" ON "cloud_webhook_binding" USING btree ("cloud_project_id");
@@ -0,0 +1,6 @@
1
+ CREATE TABLE "github_webhook_event" (
2
+ "delivery_id" text PRIMARY KEY NOT NULL,
3
+ "event_type" text NOT NULL,
4
+ "received_at" timestamp DEFAULT now() NOT NULL,
5
+ "processed_at" timestamp
6
+ );