openship 0.1.1 → 0.1.7

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 +5786 -0
  3. package/dist/server/index.js +324319 -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
@@ -1,237 +0,0 @@
1
- import { Hono } from "hono";
2
- import { auth } from "../../lib/auth";
3
- import { env } from "../../config/env";
4
- import { setSignedCookie } from "hono/cookie";
5
- import { internalAuth } from "../../middleware/internal-auth";
6
-
7
- export const authRoutes = new Hono();
8
-
9
- /** HTML page shown in the system browser after cloud auth for desktop. */
10
- function desktopResultPage(title: string, message: string, success = false): string {
11
- return `<!DOCTYPE html><html><head><meta charset="utf-8"><title>Openship</title></head>
12
- <body style="display:flex;align-items:center;justify-content:center;height:100vh;margin:0;font-family:system-ui,-apple-system,sans-serif;background:#0a0a0a;color:#fafafa">
13
- <div style="text-align:center;max-width:420px">
14
- <div style="font-size:48px;margin-bottom:16px">${success ? "\u2713" : "\u26A0"}</div>
15
- <h2 style="margin:0 0 8px">${title}</h2>
16
- <p style="color:#888;margin:0 0 24px">${message}</p>
17
- ${success ? '<p style="color:#555;font-size:14px">This tab can be safely closed.</p>' : ''}
18
- </div>
19
- </body></html>`;
20
- }
21
-
22
- /**
23
- * Desktop-mode auth endpoints.
24
- *
25
- * Two authentication flows are supported:
26
- *
27
- * 1. Zero-auth (/desktop-login)
28
- * User chose self-hosted during onboarding → auto-provision a local
29
- * admin user and create a real Better Auth session with a cookie.
30
- * No password, the session cookie is the only credential.
31
- *
32
- * 2. Cloud auth (/cloud-callback)
33
- * User chose "Continue with Cloud" during onboarding → authenticate
34
- * on app.openship.io, exchange a one-time code for a local session.
35
- *
36
- * Both flows end with a `better-auth.session_token` cookie and a
37
- * redirect to the dashboard. The rest of the app works the same way
38
- * regardless of which path was taken.
39
- */
40
- if (env.DEPLOY_MODE === "desktop") {
41
- /**
42
- * GET /get-session — try real Better Auth session first, fall back
43
- * to auto-provisioned zero-auth session for backwards compat.
44
- */
45
- authRoutes.get("/get-session", async (c) => {
46
- // Try real session first (cloud-authenticated or previously created)
47
- try {
48
- const realSession = await auth.api.getSession({
49
- headers: c.req.raw.headers,
50
- });
51
- if (realSession) {
52
- return c.json(realSession);
53
- }
54
- } catch {
55
- // session lookup failed — fall through to zero-auth fallback
56
- }
57
-
58
- // Zero-auth fallback — only when authMode is "none" (self-hosted desktop).
59
- // Cloud-auth users must re-authenticate via Openship Cloud.
60
- const { getAuthMode } = await import("../../lib/auth-mode");
61
- const authMode = await getAuthMode();
62
- if (authMode !== "none") {
63
- return c.json({ error: "Unauthorized" }, 401);
64
- }
65
-
66
- const { ensureLocalUser } = await import("../../lib/local-user");
67
- const user = await ensureLocalUser();
68
- const now = new Date().toISOString();
69
- return c.json({
70
- session: {
71
- id: "desktop-session",
72
- userId: user.id,
73
- token: "desktop",
74
- expiresAt: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),
75
- createdAt: now,
76
- updatedAt: now,
77
- },
78
- user: {
79
- ...user,
80
- image: null,
81
- createdAt: now,
82
- updatedAt: now,
83
- },
84
- });
85
- });
86
-
87
- /**
88
- * GET /desktop-login — create a real Better Auth session for the
89
- * zero-auth local user and redirect to the dashboard.
90
- *
91
- * Called ONCE after onboarding completes (self-hosted path).
92
- * The BrowserWindow navigates here → gets a cookie → reaches the dashboard.
93
- */
94
- authRoutes.get("/desktop-login", async (c) => {
95
- // Only zero-auth mode can mint sessions without credentials
96
- const { getAuthMode } = await import("../../lib/auth-mode");
97
- const authMode = await getAuthMode();
98
- if (authMode !== "none") {
99
- return c.redirect(`${env.DASHBOARD_URL}/login`);
100
- }
101
-
102
- const { ensureLocalUser } = await import("../../lib/local-user");
103
- const { createLocalSession } = await import("../../lib/cloud-auth-proxy");
104
-
105
- const user = await ensureLocalUser();
106
- const session = await createLocalSession(user.id, "127.0.0.1", "desktop");
107
-
108
- await setSignedCookie(c, "better-auth.session_token", session.token, env.BETTER_AUTH_SECRET, {
109
- httpOnly: true,
110
- secure: false,
111
- sameSite: "Lax",
112
- path: "/",
113
- expires: session.expiresAt,
114
- });
115
-
116
- return c.redirect(env.DASHBOARD_URL);
117
- });
118
-
119
- /**
120
- * GET /cloud-callback — exchange cloud auth code for a local session.
121
- *
122
- * Flow:
123
- * 1. User authenticates on app.openship.io (in system browser)
124
- * 2. Cloud generates a one-time code and redirects here with ?code=xxx&state=yyy
125
- * 3. We validate state (CSRF protection) and retrieve stored code_verifier (PKCE)
126
- * 4. We exchange the code + code_verifier for user data + cloud session token
127
- * 5. Mirror the cloud user locally, store cloud token, create session
128
- * 6. Store session token for Electron to pick up via polling
129
- * 7. Show a "success — close this tab" page
130
- */
131
- authRoutes.get("/cloud-callback", async (c) => {
132
- const code = c.req.query("code");
133
- if (!code) {
134
- return c.html(desktopResultPage("Missing authentication code", "Please return to Openship and try again."));
135
- }
136
-
137
- // Validate state parameter (CSRF) and retrieve PKCE code_verifier
138
- const state = c.req.query("state");
139
- if (!state) {
140
- return c.html(desktopResultPage("Missing state parameter", "Please return to Openship and try again."));
141
- }
142
-
143
- try {
144
- const { exchangeCodeWithCloud, mirrorCloudUser, storeCloudSession, createLocalSession, resolveDesktopAuth, validateDesktopState } =
145
- await import("../../lib/cloud-auth-proxy");
146
-
147
- const validated = validateDesktopState(state);
148
- if (!validated) {
149
- return c.html(desktopResultPage("Invalid or expired session", "The authorization request has expired. Please return to Openship and try again."));
150
- }
151
-
152
- const data = await exchangeCodeWithCloud(code, validated.codeVerifier);
153
- if (!data) {
154
- return c.html(desktopResultPage("Authentication failed", "Could not verify with Openship Cloud. Please return to Openship and try again."));
155
- }
156
-
157
- const localUserId = await mirrorCloudUser(data.user);
158
- await storeCloudSession(localUserId, data.sessionToken);
159
-
160
- const session = await createLocalSession(localUserId, "127.0.0.1", "desktop");
161
-
162
- // Resolve the pending nonce so Electron can pick up the session via polling
163
- resolveDesktopAuth(validated.nonce, session.token, session.expiresAt);
164
-
165
- return c.html(desktopResultPage("Signed in to Openship", "You can return to the Openship app now.", true));
166
- } catch {
167
- return c.html(desktopResultPage("Authentication failed", "Something went wrong. Please return to Openship and try again."));
168
- }
169
- });
170
-
171
- /**
172
- * POST /desktop-auth-start — register a nonce + PKCE + state for desktop auth.
173
- * Called by the Electron main process before opening the system browser.
174
- *
175
- * Protected by internal token — prevents unauthorized registration.
176
- */
177
- authRoutes.post("/desktop-auth-start", internalAuth, async (c) => {
178
- const body = await c.req.json();
179
- const nonce = body?.nonce;
180
- const state = body?.state;
181
- const codeVerifier = body?.code_verifier;
182
- if (!nonce || typeof nonce !== "string" || !state || typeof state !== "string" || !codeVerifier || typeof codeVerifier !== "string") {
183
- return c.json({ error: "missing nonce, state, or code_verifier" }, 400);
184
- }
185
- const { registerDesktopNonce } = await import("../../lib/cloud-auth-proxy");
186
- registerDesktopNonce(nonce, state, codeVerifier);
187
- return c.json({ ok: true });
188
- });
189
-
190
- /**
191
- * GET /desktop-auth-poll — Electron polls this to check if cloud auth completed.
192
- * Returns { status: "pending" | "resolved" | "expired", claimCode? }
193
- */
194
- authRoutes.get("/desktop-auth-poll", async (c) => {
195
- const nonce = c.req.query("nonce");
196
- if (!nonce) {
197
- return c.json({ error: "missing nonce" }, 400);
198
- }
199
- const { pollDesktopAuth } = await import("../../lib/cloud-auth-proxy");
200
- return c.json(pollDesktopAuth(nonce));
201
- });
202
-
203
- /**
204
- * GET /desktop-claim?code=xxx — exchange a one-time claim code for a
205
- * session cookie. Electron navigates here after polling resolves.
206
- *
207
- * This sets the cookie via HTTP Set-Cookie (reliable across all
208
- * Electron versions) and then redirects to the dashboard.
209
- */
210
- authRoutes.get("/desktop-claim", async (c) => {
211
- const code = c.req.query("code");
212
- if (!code) {
213
- return c.text("Missing code", 400);
214
- }
215
-
216
- const { exchangeDesktopClaim } = await import("../../lib/cloud-auth-proxy");
217
- const result = exchangeDesktopClaim(code);
218
- if (!result) {
219
- return c.text("Claim expired", 400);
220
- }
221
-
222
- await setSignedCookie(c, "better-auth.session_token", result.token, env.BETTER_AUTH_SECRET, {
223
- httpOnly: true,
224
- secure: false,
225
- sameSite: "Lax",
226
- path: "/",
227
- expires: result.expiresAt,
228
- });
229
-
230
- return c.redirect(env.DASHBOARD_URL);
231
- });
232
- }
233
-
234
- /** Better Auth catch-all — handles all standard auth endpoints. */
235
- authRoutes.on(["GET", "POST"], "/*", (c) => {
236
- return auth.handler(c.req.raw);
237
- });
@@ -1,60 +0,0 @@
1
- import type { Context } from "hono";
2
-
3
- /* ---------- Plans ---------- */
4
- export async function listPlans(c: Context) {
5
- // TODO: Return available pricing plans (free, pro, team, enterprise)
6
- return c.json({
7
- data: [
8
- { id: "free", name: "Free", price: 0, features: ["Self-hosted", "Community support"] },
9
- { id: "pro", name: "Pro", price: 20, features: ["Cloud hosting", "Custom domains", "Priority support"] },
10
- { id: "team", name: "Team", price: 50, features: ["All Pro features", "Team management", "SSO"] },
11
- ],
12
- });
13
- }
14
-
15
- /* ---------- Subscriptions ---------- */
16
- export async function getSubscription(c: Context) {
17
- return c.json({ data: null });
18
- }
19
-
20
- export async function createSubscription(c: Context) {
21
- // TODO: Create Stripe checkout session
22
- return c.json({ message: "subscription created" }, 201);
23
- }
24
-
25
- export async function updateSubscription(c: Context) {
26
- // TODO: Upgrade/downgrade plan
27
- return c.json({ message: "subscription updated" });
28
- }
29
-
30
- export async function cancelSubscription(c: Context) {
31
- // TODO: Cancel at period end
32
- return c.json({ message: "subscription cancelled" });
33
- }
34
-
35
- /* ---------- Usage ---------- */
36
- export async function getUsage(c: Context) {
37
- // TODO: Return current billing period usage (build minutes, bandwidth, etc.)
38
- return c.json({ data: { buildMinutes: 0, bandwidth: 0 } });
39
- }
40
-
41
- /* ---------- Payment Methods ---------- */
42
- export async function listPaymentMethods(c: Context) {
43
- return c.json({ data: [] });
44
- }
45
-
46
- export async function addPaymentMethod(c: Context) {
47
- // TODO: Create Stripe setup intent
48
- return c.json({ message: "payment method added" }, 201);
49
- }
50
-
51
- /* ---------- Invoices ---------- */
52
- export async function listInvoices(c: Context) {
53
- return c.json({ data: [] });
54
- }
55
-
56
- /* ---------- Stripe Webhook ---------- */
57
- export async function stripeWebhook(c: Context) {
58
- // TODO: Verify Stripe signature, handle events
59
- return c.json({ received: true });
60
- }
@@ -1,34 +0,0 @@
1
- import { Hono } from "hono";
2
- import { authMiddleware } from "../../middleware";
3
- import * as billingController from "./billing.controller";
4
-
5
- export const billingRoutes = new Hono();
6
-
7
- // Auth required for all billing routes except webhook
8
- billingRoutes.use("*", async (c, next) => {
9
- // Stripe webhook uses signature verification, not session auth
10
- if (c.req.path.endsWith("/webhook/stripe")) return next();
11
- return authMiddleware(c, next);
12
- });
13
-
14
- /* ---------- Plans & Pricing ---------- */
15
- billingRoutes.get("/plans", billingController.listPlans);
16
-
17
- /* ---------- Subscriptions ---------- */
18
- billingRoutes.get("/subscription", billingController.getSubscription);
19
- billingRoutes.post("/subscription", billingController.createSubscription);
20
- billingRoutes.patch("/subscription", billingController.updateSubscription);
21
- billingRoutes.delete("/subscription", billingController.cancelSubscription);
22
-
23
- /* ---------- Usage ---------- */
24
- billingRoutes.get("/usage", billingController.getUsage);
25
-
26
- /* ---------- Payment Methods ---------- */
27
- billingRoutes.get("/payment-methods", billingController.listPaymentMethods);
28
- billingRoutes.post("/payment-methods", billingController.addPaymentMethod);
29
-
30
- /* ---------- Invoices ---------- */
31
- billingRoutes.get("/invoices", billingController.listInvoices);
32
-
33
- /* ---------- Stripe Webhook (no auth) ---------- */
34
- billingRoutes.post("/webhook/stripe", billingController.stripeWebhook);
@@ -1,9 +0,0 @@
1
- import { z } from "zod";
2
-
3
- export const createSubscriptionSchema = z.object({
4
- planId: z.enum(["free", "pro", "team"]),
5
- });
6
-
7
- export const updateSubscriptionSchema = z.object({
8
- planId: z.enum(["free", "pro", "team"]),
9
- });
@@ -1,33 +0,0 @@
1
- /**
2
- * Billing service — Stripe integration for cloud pricing.
3
- *
4
- * Self-hosted instances skip billing entirely (gated by CLOUD_MODE env var).
5
- */
6
-
7
- export async function createCheckoutSession(userId: string, planId: string) {
8
- // TODO: Create Stripe Checkout session
9
- }
10
-
11
- export async function createCustomer(userId: string, email: string) {
12
- // TODO: Create Stripe customer
13
- }
14
-
15
- export async function getSubscription(userId: string) {
16
- // TODO: Fetch active subscription from DB
17
- }
18
-
19
- export async function cancelSubscription(subscriptionId: string) {
20
- // TODO: Cancel Stripe subscription at period end
21
- }
22
-
23
- export async function recordUsage(userId: string, metric: string, quantity: number) {
24
- // TODO: Record metered usage for billing
25
- }
26
-
27
- export async function getUsageSummary(userId: string) {
28
- // TODO: Aggregate usage for current billing period
29
- }
30
-
31
- export async function handleStripeEvent(event: unknown) {
32
- // TODO: Handle subscription.created, invoice.paid, etc.
33
- }
@@ -1,225 +0,0 @@
1
- /**
2
- * Cloud controller — two sides of the same coin:
3
- *
4
- * SaaS (CLOUD_MODE):
5
- * POST /api/cloud/token — mint namespace-scoped Oblien tokens
6
- * GET /api/cloud/desktop-handoff — OAuth → one-time code → redirect to desktop
7
- * POST /api/cloud/exchange-code — exchange code for user + session (no auth)
8
- *
9
- * Local (!CLOUD_MODE):
10
- * POST /api/cloud/disconnect — clear stored session
11
- * GET /api/cloud/status — check connection state
12
- * GET /api/cloud/connect-callback — exchange code from external auth
13
- */
14
-
15
- import type { Context } from "hono";
16
- import { getUserId } from "../../lib/controller-helpers";
17
-
18
- // ─── SaaS: namespace token minting ───────────────────────────────────────────
19
-
20
- export async function getToken(c: Context) {
21
- const { issueNamespaceToken } = await import("../../lib/openship-cloud");
22
- const userId = getUserId(c);
23
- const result = await issueNamespaceToken(userId);
24
- return c.json({ data: result });
25
- }
26
-
27
- // ─── SaaS: desktop OAuth handoff ─────────────────────────────────────────────
28
-
29
- /**
30
- * GET /api/cloud/desktop-handoff?redirect=<url>&state=<state>&code_challenge=<challenge>
31
- *
32
- * Called from the authorize page after the user clicks "Authorize".
33
- * Reads the authenticated session, generates a one-time code, and
34
- * redirects to the desktop's local callback with that code + state.
35
- *
36
- * Security:
37
- * - redirect MUST be localhost (desktop callback) — no open redirect
38
- * - state is passed through unchanged for CSRF protection
39
- * - code_challenge (PKCE S256) is bound to the one-time code
40
- */
41
- export async function desktopHandoff(c: Context) {
42
- const { auth } = await import("../../lib/auth");
43
- const session = await auth.api.getSession({ headers: c.req.raw.headers });
44
- if (!session) {
45
- return c.json({ error: "No active session" }, 401);
46
- }
47
-
48
- const redirect = c.req.query("redirect");
49
- if (!redirect) {
50
- return c.json({ error: "Missing redirect parameter" }, 400);
51
- }
52
-
53
- // Security: only allow localhost — desktop is the only consumer
54
- let url: URL;
55
- try {
56
- url = new URL(redirect);
57
- } catch {
58
- return c.json({ error: "Invalid redirect URL" }, 400);
59
- }
60
- if (url.hostname !== "localhost" && url.hostname !== "127.0.0.1") {
61
- return c.json({ error: "Redirect must target localhost" }, 400);
62
- }
63
- // Restrict to safe port range — prevent redirect to unrelated local services
64
- const port = parseInt(url.port || "80", 10);
65
- if (port < 1024 || port > 65535) {
66
- return c.json({ error: "Redirect port must be ≥ 1024" }, 400);
67
- }
68
-
69
- const state = c.req.query("state");
70
- const codeChallenge = c.req.query("code_challenge");
71
-
72
- const { generateHandoffCode } = await import("../../lib/cloud-auth-proxy");
73
- const code = await generateHandoffCode(
74
- {
75
- id: session.user.id,
76
- name: session.user.name,
77
- email: session.user.email,
78
- emailVerified: session.user.emailVerified,
79
- image: session.user.image,
80
- },
81
- session.session.token,
82
- codeChallenge || undefined,
83
- );
84
-
85
- url.searchParams.set("code", code);
86
- if (state) url.searchParams.set("state", state);
87
- return c.redirect(url.toString());
88
- }
89
-
90
- /**
91
- * GET /api/cloud/connect-handoff?redirect=<url>
92
- *
93
- * Used by self-hosted "Connect to Cloud" flow. After the user logs in
94
- * on the SaaS, the login page redirects here. This generates a one-time
95
- * code and redirects back to the self-hosted callback.
96
- *
97
- * Security:
98
- * - redirect MUST be HTTPS (no downgrade to HTTP)
99
- * - No PKCE (self-hosted server handles its own security)
100
- * - Codes are single-use with 60s TTL
101
- */
102
- export async function connectHandoff(c: Context) {
103
- const { auth } = await import("../../lib/auth");
104
- const session = await auth.api.getSession({ headers: c.req.raw.headers });
105
- if (!session) {
106
- return c.json({ error: "No active session" }, 401);
107
- }
108
-
109
- const redirect = c.req.query("redirect");
110
- if (!redirect) {
111
- return c.json({ error: "Missing redirect parameter" }, 400);
112
- }
113
-
114
- let url: URL;
115
- try {
116
- url = new URL(redirect);
117
- } catch {
118
- return c.json({ error: "Invalid redirect URL" }, 400);
119
- }
120
-
121
- // Allow localhost HTTP (desktop connects via http://localhost:PORT)
122
- // and require HTTPS for all other hosts (self-hosted production)
123
- const isLocalhost = url.hostname === "localhost" || url.hostname === "127.0.0.1";
124
- if (!isLocalhost && url.protocol !== "https:") {
125
- return c.json({ error: "Redirect must use HTTPS" }, 400);
126
- }
127
- if (isLocalhost) {
128
- const port = parseInt(url.port || "80", 10);
129
- if (port < 1024 || port > 65535) {
130
- return c.json({ error: "Redirect port must be ≥ 1024" }, 400);
131
- }
132
- }
133
-
134
- const { generateHandoffCode } = await import("../../lib/cloud-auth-proxy");
135
- const code = await generateHandoffCode(
136
- {
137
- id: session.user.id,
138
- name: session.user.name,
139
- email: session.user.email,
140
- emailVerified: session.user.emailVerified,
141
- image: session.user.image,
142
- },
143
- session.session.token,
144
- );
145
-
146
- url.searchParams.set("code", code);
147
- return c.redirect(url.toString());
148
- }
149
-
150
- /**
151
- * POST /api/cloud/exchange-code { code: string, code_verifier?: string }
152
- *
153
- * Called by the desktop instance to exchange a one-time code for the OAuth
154
- * user data + cloud session token. No auth required — the code is the credential.
155
- *
156
- * If the code was generated with a PKCE code_challenge, the matching
157
- * code_verifier must be provided or the exchange is rejected.
158
- */
159
- export async function exchangeCode(c: Context) {
160
- const body = await c.req.json<{ code: string; code_verifier?: string }>();
161
- if (!body.code) {
162
- return c.json({ error: "Code required" }, 400);
163
- }
164
-
165
- const { exchangeHandoffCode } = await import("../../lib/cloud-auth-proxy");
166
- const result = exchangeHandoffCode(body.code, body.code_verifier);
167
- if (!result) {
168
- return c.json({ error: "Invalid or expired code" }, 401);
169
- }
170
-
171
- return c.json({ data: result });
172
- }
173
-
174
- // ─── Local: cloud account management ─────────────────────────────────────────
175
-
176
- export async function disconnect(c: Context) {
177
- const userId = getUserId(c);
178
- const { disconnectCloud } = await import("../../lib/cloud-client");
179
- await disconnectCloud(userId);
180
- return c.json({ connected: false });
181
- }
182
-
183
- export async function status(c: Context) {
184
- const userId = getUserId(c);
185
- const { isCloudConnected } = await import("../../lib/cloud-client");
186
- const connected = await isCloudConnected(userId);
187
- if (!connected) return c.json({ connected: false });
188
-
189
- // Return cloud user info alongside status
190
- const user = c.get("user");
191
- return c.json({
192
- connected: true,
193
- user: user ? { name: user.name, email: user.email, image: user.image } : undefined,
194
- });
195
- }
196
-
197
- /**
198
- * GET /api/cloud/connect-callback?code=<one-time-code>
199
- *
200
- * Used by self-hosted settings page. After the user authenticates on
201
- * Openship Cloud, they're redirected here with a code.
202
- * We exchange it for the cloud session token and store it for deploys.
203
- */
204
- export async function connectCallback(c: Context) {
205
- const userId = getUserId(c);
206
- const code = c.req.query("code");
207
- if (!code) {
208
- return c.redirect("/settings?error=missing_code");
209
- }
210
-
211
- try {
212
- const { exchangeCodeWithCloud, storeCloudSession } = await import("../../lib/cloud-auth-proxy");
213
-
214
- const data = await exchangeCodeWithCloud(code);
215
- if (!data) {
216
- return c.redirect("/settings?error=exchange_failed");
217
- }
218
-
219
- await storeCloudSession(userId, data.sessionToken);
220
-
221
- return c.redirect("/settings?cloud=connected");
222
- } catch {
223
- return c.redirect("/settings?error=connect_failed");
224
- }
225
- }
@@ -1,40 +0,0 @@
1
- /**
2
- * Cloud routes — mounted at /api/cloud in app.ts.
3
- *
4
- * Two route sets from the same module:
5
- * cloudSaasRoutes (CLOUD_MODE) — POST /token
6
- * cloudLocalRoutes (!CLOUD_MODE) — POST /connect, POST /disconnect, GET /status
7
- */
8
-
9
- import { Hono } from "hono";
10
- import { authMiddleware } from "../../middleware";
11
- import { rateLimiter } from "../../middleware/rate-limiter";
12
- import * as ctrl from "./cloud.controller";
13
-
14
- /** SaaS routes — mints namespace tokens for local instances + desktop OAuth handoff */
15
- export const cloudSaasRoutes = new Hono();
16
-
17
- // Desktop OAuth handoff — localhost only, PKCE + state
18
- cloudSaasRoutes.get("/desktop-handoff", ctrl.desktopHandoff);
19
- // Self-hosted connect handoff — HTTPS only
20
- cloudSaasRoutes.get("/connect-handoff", ctrl.connectHandoff);
21
- // Code exchange — no auth (code is the credential), rate-limited
22
- cloudSaasRoutes.use("/exchange-code", rateLimiter);
23
- cloudSaasRoutes.post("/exchange-code", ctrl.exchangeCode);
24
-
25
- // Token minting requires auth
26
- cloudSaasRoutes.use("/token", authMiddleware);
27
- cloudSaasRoutes.post("/token", ctrl.getToken);
28
-
29
- /** Local routes — manage connection to Openship Cloud */
30
- export const cloudLocalRoutes = new Hono();
31
- cloudLocalRoutes.use("*", authMiddleware);
32
- cloudLocalRoutes.post("/disconnect", ctrl.disconnect);
33
- cloudLocalRoutes.get("/status", ctrl.status);
34
-
35
- /**
36
- * Cloud connect callback — used by self-hosted settings page.
37
- * After the user authenticates on Openship Cloud, they're redirected
38
- * here with a one-time code. We exchange it and store the cloud token.
39
- */
40
- cloudLocalRoutes.get("/connect-callback", ctrl.connectCallback);