devpush 0.0.0-stage → 1.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/README.md +6 -2
  2. package/agent-release.json +37 -0
  3. package/dist/package/LICENSE.md +21 -0
  4. package/dist/package/migrate.mjs +182 -0
  5. package/dist/package/plugins.mjs +125 -0
  6. package/dist/package/vite.mjs +439 -0
  7. package/package.json +170 -4
  8. package/public/apple-touch-icon.png +0 -0
  9. package/public/favicon.svg +1 -0
  10. package/public/logo-email.png +0 -0
  11. package/public/robots.txt +3 -0
  12. package/public/social.png +0 -0
  13. package/src/cloudflare-runtime.d.ts +78 -0
  14. package/src/components/about-dialog.tsx +70 -0
  15. package/src/components/copy-button.tsx +74 -0
  16. package/src/components/logo-mark.tsx +20 -0
  17. package/src/components/pending-collection.tsx +103 -0
  18. package/src/components/resource-avatar.tsx +65 -0
  19. package/src/components/route-error-state.tsx +95 -0
  20. package/src/components/section-navigation.tsx +39 -0
  21. package/src/components/settings-layout.tsx +111 -0
  22. package/src/components/storage-capabilities.tsx +11 -0
  23. package/src/components/table-pager.tsx +101 -0
  24. package/src/components/ui/alert-dialog.tsx +180 -0
  25. package/src/components/ui/alert.tsx +78 -0
  26. package/src/components/ui/avatar.tsx +58 -0
  27. package/src/components/ui/badge.tsx +49 -0
  28. package/src/components/ui/button-group.tsx +38 -0
  29. package/src/components/ui/button.tsx +67 -0
  30. package/src/components/ui/card.tsx +82 -0
  31. package/src/components/ui/chart.tsx +307 -0
  32. package/src/components/ui/checkbox.tsx +30 -0
  33. package/src/components/ui/combobox.tsx +256 -0
  34. package/src/components/ui/dialog.tsx +163 -0
  35. package/src/components/ui/dropdown-menu.tsx +110 -0
  36. package/src/components/ui/empty.tsx +65 -0
  37. package/src/components/ui/field.tsx +192 -0
  38. package/src/components/ui/input-group.tsx +118 -0
  39. package/src/components/ui/input-otp.tsx +70 -0
  40. package/src/components/ui/input.tsx +19 -0
  41. package/src/components/ui/label.tsx +24 -0
  42. package/src/components/ui/pagination.tsx +34 -0
  43. package/src/components/ui/popover.tsx +86 -0
  44. package/src/components/ui/select.tsx +145 -0
  45. package/src/components/ui/skeleton.tsx +19 -0
  46. package/src/components/ui/sonner.tsx +47 -0
  47. package/src/components/ui/switch.tsx +31 -0
  48. package/src/components/ui/table.tsx +81 -0
  49. package/src/components/ui/textarea.tsx +18 -0
  50. package/src/components/ui/tooltip.tsx +55 -0
  51. package/src/features/admin/admin-settings.tsx +1048 -0
  52. package/src/features/auth/current-user-context-query.ts +11 -0
  53. package/src/features/auth/login-form.tsx +442 -0
  54. package/src/features/auth/sign-out-menu-item.tsx +42 -0
  55. package/src/features/deployments/deployment-actions.tsx +336 -0
  56. package/src/features/deployments/deployment-alias-badge.tsx +35 -0
  57. package/src/features/deployments/deployment-detail.tsx +596 -0
  58. package/src/features/deployments/deployment-filters.ts +66 -0
  59. package/src/features/deployments/deployment-list.tsx +465 -0
  60. package/src/features/deployments/deployment-visit-links.tsx +104 -0
  61. package/src/features/deployments/deployments-page.tsx +376 -0
  62. package/src/features/logs/log-scroll-area.tsx +69 -0
  63. package/src/features/notifications/email-preferences.tsx +232 -0
  64. package/src/features/onboarding/profile-onboarding.tsx +162 -0
  65. package/src/features/plugins/contributions.tsx +118 -0
  66. package/src/features/projects/backup-job-logs.tsx +143 -0
  67. package/src/features/projects/backup-policy-delete-dialog.tsx +82 -0
  68. package/src/features/projects/backup-restore-actions.tsx +573 -0
  69. package/src/features/projects/backup-status-icon.tsx +33 -0
  70. package/src/features/projects/backup-target-list.tsx +222 -0
  71. package/src/features/projects/backup-timestamp.tsx +32 -0
  72. package/src/features/projects/backup-volume-picker.tsx +158 -0
  73. package/src/features/projects/compose-service-input.tsx +64 -0
  74. package/src/features/projects/deploy-readiness.ts +28 -0
  75. package/src/features/projects/environment-dot.tsx +91 -0
  76. package/src/features/projects/log-keyword-filter.tsx +48 -0
  77. package/src/features/projects/manual-deploy-dialog.tsx +563 -0
  78. package/src/features/projects/pending-section.ts +26 -0
  79. package/src/features/projects/project-backup-details-pending.tsx +305 -0
  80. package/src/features/projects/project-backup-details.tsx +936 -0
  81. package/src/features/projects/project-backup-policy.tsx +644 -0
  82. package/src/features/projects/project-backup-utils.ts +190 -0
  83. package/src/features/projects/project-backups-pending.tsx +136 -0
  84. package/src/features/projects/project-backups.tsx +876 -0
  85. package/src/features/projects/project-environment-settings.tsx +1128 -0
  86. package/src/features/projects/project-heading.tsx +68 -0
  87. package/src/features/projects/project-layout.tsx +188 -0
  88. package/src/features/projects/project-logs.tsx +461 -0
  89. package/src/features/projects/project-overview.tsx +280 -0
  90. package/src/features/projects/project-route-pending.tsx +1064 -0
  91. package/src/features/projects/project-routing-settings.tsx +663 -0
  92. package/src/features/projects/project-settings-section.tsx +64 -0
  93. package/src/features/projects/project-settings-utils.ts +101 -0
  94. package/src/features/projects/project-settings.tsx +1472 -0
  95. package/src/features/projects/repository-picker-dialog.tsx +404 -0
  96. package/src/features/repositories/new-project-dialog-launcher.tsx +44 -0
  97. package/src/features/repositories/new-project-dialog.tsx +1204 -0
  98. package/src/features/repositories/new-project-pending.tsx +28 -0
  99. package/src/features/repositories/repository-list-pending.tsx +59 -0
  100. package/src/features/servers/server-availability-alert.tsx +44 -0
  101. package/src/features/servers/server-availability.ts +29 -0
  102. package/src/features/servers/server-avatar.tsx +52 -0
  103. package/src/features/servers/server-detail-pending.tsx +315 -0
  104. package/src/features/servers/server-detail.tsx +855 -0
  105. package/src/features/servers/server-metric-chart-pending.tsx +38 -0
  106. package/src/features/servers/server-metric-chart.tsx +182 -0
  107. package/src/features/servers/server-metric-format.ts +50 -0
  108. package/src/features/servers/server-metrics-pending.tsx +75 -0
  109. package/src/features/servers/server-metrics.tsx +136 -0
  110. package/src/features/servers/team-servers.tsx +432 -0
  111. package/src/features/settings/settings-route-pending.tsx +406 -0
  112. package/src/features/teams/backup-storage-settings.tsx +483 -0
  113. package/src/features/teams/navigation.ts +51 -0
  114. package/src/features/teams/new-team-dialog.tsx +132 -0
  115. package/src/features/teams/pending-section.ts +19 -0
  116. package/src/features/teams/team-header.tsx +1286 -0
  117. package/src/features/teams/team-heading.tsx +57 -0
  118. package/src/features/teams/team-home.tsx +391 -0
  119. package/src/features/teams/team-invite.tsx +155 -0
  120. package/src/features/teams/team-route-pending.tsx +505 -0
  121. package/src/features/teams/team-settings.tsx +1555 -0
  122. package/src/features/teams/use-workspace-updates.ts +126 -0
  123. package/src/features/users/api-keys-settings.tsx +544 -0
  124. package/src/features/users/api-scope-selection.tsx +269 -0
  125. package/src/features/users/connected-apps-settings.tsx +449 -0
  126. package/src/features/users/mcp-consent.tsx +220 -0
  127. package/src/features/users/profile-picture.tsx +171 -0
  128. package/src/features/users/user-settings.tsx +1064 -0
  129. package/src/lib/account-settings-schema.ts +78 -0
  130. package/src/lib/action-feedback.ts +81 -0
  131. package/src/lib/admin-search-schema.ts +8 -0
  132. package/src/lib/agent-release.d.mts +21 -0
  133. package/src/lib/agent-release.mjs +90 -0
  134. package/src/lib/allowlist-schema.ts +79 -0
  135. package/src/lib/api-key-schema.ts +176 -0
  136. package/src/lib/auth/client.ts +20 -0
  137. package/src/lib/avatar-schema.ts +11 -0
  138. package/src/lib/backup-cron.ts +118 -0
  139. package/src/lib/backup-database.ts +41 -0
  140. package/src/lib/backup-feature.ts +2 -0
  141. package/src/lib/backup-paths.ts +7 -0
  142. package/src/lib/backup-policy-schema.ts +85 -0
  143. package/src/lib/backup-resource-schema.ts +12 -0
  144. package/src/lib/backup-restore-schema.ts +15 -0
  145. package/src/lib/backup-storage-schema.ts +55 -0
  146. package/src/lib/deferred-module.ts +38 -0
  147. package/src/lib/deployment-logs-query.ts +63 -0
  148. package/src/lib/display-name.ts +7 -0
  149. package/src/lib/error-message.ts +119 -0
  150. package/src/lib/form-errors.ts +10 -0
  151. package/src/lib/internal-redirect.ts +25 -0
  152. package/src/lib/manual-deploy-options-query.ts +21 -0
  153. package/src/lib/notification-preferences.ts +43 -0
  154. package/src/lib/onboarding.ts +11 -0
  155. package/src/lib/operation-logs-query.ts +51 -0
  156. package/src/lib/page-head.ts +14 -0
  157. package/src/lib/project-context-query.ts +257 -0
  158. package/src/lib/project-creation-schema.ts +64 -0
  159. package/src/lib/project-env-schema.ts +23 -0
  160. package/src/lib/project-environments-schema.ts +56 -0
  161. package/src/lib/project-routing-schema.ts +94 -0
  162. package/src/lib/project-runtime-config.ts +131 -0
  163. package/src/lib/project-settings-schema.ts +75 -0
  164. package/src/lib/public-api-schema.ts +128 -0
  165. package/src/lib/public-error.ts +337 -0
  166. package/src/lib/query.ts +13 -0
  167. package/src/lib/repository-selection-query.ts +11 -0
  168. package/src/lib/resource-cache.ts +30 -0
  169. package/src/lib/runtime-id.ts +19 -0
  170. package/src/lib/search.ts +14 -0
  171. package/src/lib/server-context-query.ts +43 -0
  172. package/src/lib/server-name-schema.ts +11 -0
  173. package/src/lib/settings-conflict.ts +45 -0
  174. package/src/lib/settings-version.ts +7 -0
  175. package/src/lib/team-context-query.ts +126 -0
  176. package/src/lib/team-context-schema.ts +8 -0
  177. package/src/lib/team-forms-schema.ts +45 -0
  178. package/src/lib/team-role.ts +13 -0
  179. package/src/lib/team-settings-schema.ts +48 -0
  180. package/src/lib/urls.ts +3 -0
  181. package/src/lib/use-avatar-input.ts +61 -0
  182. package/src/lib/use-refresh-error.ts +18 -0
  183. package/src/lib/use-settings-version.ts +23 -0
  184. package/src/lib/utils.ts +6 -0
  185. package/src/lib/validation.ts +5 -0
  186. package/src/lib/workspace-updates.ts +53 -0
  187. package/src/package/config.ts +10 -0
  188. package/src/package/env.mjs +54 -0
  189. package/src/package/migrate-api.d.ts +5 -0
  190. package/src/package/migrate.ts +56 -0
  191. package/src/package/plugins.ts +141 -0
  192. package/src/package/sqlite.mjs +2 -0
  193. package/src/package/vite-api.d.ts +5 -0
  194. package/src/package/vite.ts +324 -0
  195. package/src/package/watch-guard.cjs +26 -0
  196. package/src/plugins/client.ts +57 -0
  197. package/src/plugins/contract.ts +188 -0
  198. package/src/plugins/default.server.ts +4 -0
  199. package/src/plugins/default.ui.ts +4 -0
  200. package/src/plugins/operations.ts +45 -0
  201. package/src/plugins/server.ts +197 -0
  202. package/src/plugins/version.ts +1 -0
  203. package/src/routeTree.gen.ts +1275 -0
  204. package/src/router.tsx +46 -0
  205. package/src/routes/$teamSlug.index.tsx +53 -0
  206. package/src/routes/$teamSlug.new-project.tsx +13 -0
  207. package/src/routes/$teamSlug.projects.$projectName.backups.$backupId.tsx +40 -0
  208. package/src/routes/$teamSlug.projects.$projectName.backups.tsx +82 -0
  209. package/src/routes/$teamSlug.projects.$projectName.deployments.$deploymentId.tsx +52 -0
  210. package/src/routes/$teamSlug.projects.$projectName.deployments.tsx +86 -0
  211. package/src/routes/$teamSlug.projects.$projectName.logs.tsx +55 -0
  212. package/src/routes/$teamSlug.projects.$projectName.settings.tsx +51 -0
  213. package/src/routes/$teamSlug.projects.$projectName.tsx +106 -0
  214. package/src/routes/$teamSlug.projects.tsx +40 -0
  215. package/src/routes/$teamSlug.servers.$serverId.tsx +31 -0
  216. package/src/routes/$teamSlug.servers.index.tsx +59 -0
  217. package/src/routes/$teamSlug.servers.tsx +7 -0
  218. package/src/routes/$teamSlug.settings.tsx +56 -0
  219. package/src/routes/$teamSlug.tsx +86 -0
  220. package/src/routes/[.]well-known.oauth-authorization-server.api.auth.ts +13 -0
  221. package/src/routes/[.]well-known.oauth-protected-resource.mcp.ts +6 -0
  222. package/src/routes/__root.tsx +155 -0
  223. package/src/routes/admin.tsx +55 -0
  224. package/src/routes/api/agents/certificates.ts +21 -0
  225. package/src/routes/api/agents/credentials/rotate.ts +22 -0
  226. package/src/routes/api/agents/heartbeat.ts +42 -0
  227. package/src/routes/api/agents/job-logs.ts +22 -0
  228. package/src/routes/api/agents/jobs/complete.ts +22 -0
  229. package/src/routes/api/agents/jobs/next.ts +29 -0
  230. package/src/routes/api/agents/jobs/progress.ts +32 -0
  231. package/src/routes/api/agents/jobs/status.ts +22 -0
  232. package/src/routes/api/agents/register.ts +45 -0
  233. package/src/routes/api/agents/runtime-logs.ts +22 -0
  234. package/src/routes/api/agents/switch.ts +25 -0
  235. package/src/routes/api/auth/$.ts +38 -0
  236. package/src/routes/api/cron/backups.ts +33 -0
  237. package/src/routes/api/cron/maintenance.ts +30 -0
  238. package/src/routes/api/github/install.callback.ts +51 -0
  239. package/src/routes/api/github/install.ts +41 -0
  240. package/src/routes/api/github/webhook.ts +11 -0
  241. package/src/routes/api/health.ts +19 -0
  242. package/src/routes/api/install/agent.$token.ts +50 -0
  243. package/src/routes/api/install/agent.binary.ts +83 -0
  244. package/src/routes/api/install/agent.checksum.ts +45 -0
  245. package/src/routes/api/install/agent.ts +26 -0
  246. package/src/routes/api/plugins/$.ts +11 -0
  247. package/src/routes/api/v1/$.ts +15 -0
  248. package/src/routes/api/workspaces/updates.ts +8 -0
  249. package/src/routes/auth.login.tsx +50 -0
  250. package/src/routes/deployments.$deploymentId.unavailable.tsx +21 -0
  251. package/src/routes/index.tsx +23 -0
  252. package/src/routes/invites.$token.tsx +35 -0
  253. package/src/routes/mcp.ts +13 -0
  254. package/src/routes/oauth.consent.tsx +54 -0
  255. package/src/routes/onboarding.tsx +37 -0
  256. package/src/routes/onboarding.workspace.tsx +44 -0
  257. package/src/routes/settings.tsx +30 -0
  258. package/src/routes/uploads/avatars/$fileName.ts +44 -0
  259. package/src/server/admin/access.ts +67 -0
  260. package/src/server/admin/functions.ts +122 -0
  261. package/src/server/admin/service.ts +260 -0
  262. package/src/server/agents/backup-state.ts +210 -0
  263. package/src/server/agents/certificates.ts +96 -0
  264. package/src/server/agents/claims.ts +116 -0
  265. package/src/server/agents/cleanup.ts +52 -0
  266. package/src/server/agents/compatibility.ts +116 -0
  267. package/src/server/agents/completion.ts +83 -0
  268. package/src/server/agents/container-cleanup-state.ts +51 -0
  269. package/src/server/agents/deployment-state.ts +111 -0
  270. package/src/server/agents/job-payloads.ts +159 -0
  271. package/src/server/agents/jobs.ts +1293 -0
  272. package/src/server/agents/protocol.ts +400 -0
  273. package/src/server/agents/reconciliation.ts +43 -0
  274. package/src/server/agents/runtime-logs.ts +337 -0
  275. package/src/server/agents/runtime-state.ts +125 -0
  276. package/src/server/api/admission.ts +12 -0
  277. package/src/server/api/authorization.ts +115 -0
  278. package/src/server/api/credentials.ts +569 -0
  279. package/src/server/api/cursors.ts +72 -0
  280. package/src/server/api/errors.ts +24 -0
  281. package/src/server/api/functions.ts +60 -0
  282. package/src/server/api/handler.ts +274 -0
  283. package/src/server/api/mutation-operations.ts +913 -0
  284. package/src/server/api/operation-context.ts +139 -0
  285. package/src/server/api/operation-contract.ts +1099 -0
  286. package/src/server/api/operations.ts +64 -0
  287. package/src/server/api/read-operations.ts +891 -0
  288. package/src/server/api/retention.ts +33 -0
  289. package/src/server/auth/access.ts +109 -0
  290. package/src/server/auth/auth-methods.ts +28 -0
  291. package/src/server/auth/better-auth.ts +518 -0
  292. package/src/server/auth/context.ts +28 -0
  293. package/src/server/auth/email-change.ts +47 -0
  294. package/src/server/auth/email-delivery.ts +51 -0
  295. package/src/server/auth/provider-identity.ts +19 -0
  296. package/src/server/auth/provider-tokens.ts +27 -0
  297. package/src/server/auth/session.server.ts +19 -0
  298. package/src/server/backups/database-commands.ts +40 -0
  299. package/src/server/backups/destination.ts +12 -0
  300. package/src/server/backups/feature.ts +6 -0
  301. package/src/server/backups/policy-validation.ts +51 -0
  302. package/src/server/backups/queue-state.ts +137 -0
  303. package/src/server/backups/service.ts +918 -0
  304. package/src/server/backups/storage-functions.ts +42 -0
  305. package/src/server/backups/storage-state.ts +67 -0
  306. package/src/server/backups/storage.ts +237 -0
  307. package/src/server/config.ts +274 -0
  308. package/src/server/db/atomic.ts +16 -0
  309. package/src/server/db/d1-connection.ts +83 -0
  310. package/src/server/db/errors.ts +17 -0
  311. package/src/server/db/index.cloudflare.ts +15 -0
  312. package/src/server/db/index.ts +35 -0
  313. package/src/server/db/libsql-connection.ts +72 -0
  314. package/src/server/db/log-schema.ts +102 -0
  315. package/src/server/db/migrate-libsql.ts +29 -0
  316. package/src/server/db/migrate-sqlite.ts +47 -0
  317. package/src/server/db/migration-history.ts +12 -0
  318. package/src/server/db/migrations-logs/0000_initial.sql +48 -0
  319. package/src/server/db/migrations-logs/0001_runtime_log_order.sql +2 -0
  320. package/src/server/db/migrations-logs/meta/0000_snapshot.json +327 -0
  321. package/src/server/db/migrations-logs/meta/0001_snapshot.json +329 -0
  322. package/src/server/db/migrations-logs/meta/_journal.json +20 -0
  323. package/src/server/db/migrations-sqlite/0000_initial.sql +894 -0
  324. package/src/server/db/migrations-sqlite/0001_agent_indexes.sql +5 -0
  325. package/src/server/db/migrations-sqlite/meta/0000_snapshot.json +5816 -0
  326. package/src/server/db/migrations-sqlite/meta/0001_snapshot.json +5841 -0
  327. package/src/server/db/migrations-sqlite/meta/_journal.json +20 -0
  328. package/src/server/db/oauth-schema.ts +216 -0
  329. package/src/server/db/remote-config.ts +47 -0
  330. package/src/server/db/schema.ts +1218 -0
  331. package/src/server/db/sqlite-connection.ts +94 -0
  332. package/src/server/db/sqlite-files.ts +27 -0
  333. package/src/server/db/sqlite-params.ts +19 -0
  334. package/src/server/db/worker-connection.ts +47 -0
  335. package/src/server/deleted-resources.ts +133 -0
  336. package/src/server/deletion-recovery.ts +272 -0
  337. package/src/server/email/layout.tsx +85 -0
  338. package/src/server/email/notification-template.tsx +62 -0
  339. package/src/server/email/otp-template.tsx +48 -0
  340. package/src/server/email/service.ts +251 -0
  341. package/src/server/email/team-invite-template.tsx +59 -0
  342. package/src/server/email/theme.ts +10 -0
  343. package/src/server/github/http.ts +14 -0
  344. package/src/server/github/install-state.ts +48 -0
  345. package/src/server/github/service.ts +831 -0
  346. package/src/server/github/webhook-handler.ts +198 -0
  347. package/src/server/github/webhooks.ts +205 -0
  348. package/src/server/http/auth.ts +11 -0
  349. package/src/server/http/error-diagnostics.ts +66 -0
  350. package/src/server/http/plugin-request.ts +15 -0
  351. package/src/server/http/proxy-request.ts +53 -0
  352. package/src/server/http/public-errors.ts +48 -0
  353. package/src/server/http/rate-limit.ts +59 -0
  354. package/src/server/http/request-body.ts +54 -0
  355. package/src/server/http/request-ip.ts +54 -0
  356. package/src/server/http/security-headers.ts +36 -0
  357. package/src/server/install/agent-binary.ts +230 -0
  358. package/src/server/install/agent-script.ts +565 -0
  359. package/src/server/install/release-binary.ts +65 -0
  360. package/src/server/logs/budget.ts +72 -0
  361. package/src/server/logs/cleanup.ts +64 -0
  362. package/src/server/logs/deployments.ts +98 -0
  363. package/src/server/logs/operations.ts +145 -0
  364. package/src/server/logs/retention.ts +39 -0
  365. package/src/server/maintenance.ts +61 -0
  366. package/src/server/mcp/connections.ts +358 -0
  367. package/src/server/mcp/functions.ts +63 -0
  368. package/src/server/mcp/handler.ts +295 -0
  369. package/src/server/mcp/oauth-discovery.cloudflare.ts +6 -0
  370. package/src/server/mcp/oauth-discovery.ts +8 -0
  371. package/src/server/mcp/oauth-provider.ts +220 -0
  372. package/src/server/mcp/urls.ts +20 -0
  373. package/src/server/notifications/functions.ts +51 -0
  374. package/src/server/notifications/observe.ts +303 -0
  375. package/src/server/notifications/outbox.ts +335 -0
  376. package/src/server/notifications/preferences.ts +131 -0
  377. package/src/server/notifications/query.ts +16 -0
  378. package/src/server/plugins/scope.ts +17 -0
  379. package/src/server/plugins/server-context.ts +157 -0
  380. package/src/server/plugins/services.server.ts +10 -0
  381. package/src/server/plugins/workspace-access.ts +74 -0
  382. package/src/server/projects/backup-policy-state.ts +68 -0
  383. package/src/server/projects/backups.ts +219 -0
  384. package/src/server/projects/compose-metadata.ts +174 -0
  385. package/src/server/projects/configuration-state.ts +90 -0
  386. package/src/server/projects/context.ts +909 -0
  387. package/src/server/projects/creation-state.ts +46 -0
  388. package/src/server/projects/deletion-state.ts +69 -0
  389. package/src/server/projects/deployment-config.ts +139 -0
  390. package/src/server/projects/deployment-logs.ts +97 -0
  391. package/src/server/projects/deployments.ts +1123 -0
  392. package/src/server/projects/domain-state.ts +71 -0
  393. package/src/server/projects/environment-branches.ts +75 -0
  394. package/src/server/projects/environment-state.ts +158 -0
  395. package/src/server/projects/environments.ts +424 -0
  396. package/src/server/projects/functions.ts +748 -0
  397. package/src/server/projects/generated-hostname.ts +77 -0
  398. package/src/server/projects/hostnames.ts +244 -0
  399. package/src/server/projects/mappers.ts +457 -0
  400. package/src/server/projects/names.ts +41 -0
  401. package/src/server/projects/project-env-vars.ts +28 -0
  402. package/src/server/projects/queue-state.ts +118 -0
  403. package/src/server/projects/repository.ts +368 -0
  404. package/src/server/projects/route-state.ts +37 -0
  405. package/src/server/projects/runtime-logs.ts +97 -0
  406. package/src/server/projects/settings-context.ts +58 -0
  407. package/src/server/projects/settings.ts +738 -0
  408. package/src/server/projects/types.ts +355 -0
  409. package/src/server/realtime/agent-events.ts +32 -0
  410. package/src/server/realtime/node-broadcaster.ts +71 -0
  411. package/src/server/realtime/node-handler.ts +55 -0
  412. package/src/server/realtime/service.ts +125 -0
  413. package/src/server/realtime/workspace-object.cloudflare.ts +62 -0
  414. package/src/server/realtime/workspace-object.ts +3 -0
  415. package/src/server/resources/color.ts +13 -0
  416. package/src/server/runtime/background.ts +21 -0
  417. package/src/server/runtime/node-asset-cache-plugin.ts +12 -0
  418. package/src/server/runtime/node-scheduler-plugin.ts +17 -0
  419. package/src/server/runtime/node-scheduler.ts +51 -0
  420. package/src/server/runtime/platform-env.cloudflare.ts +17 -0
  421. package/src/server/runtime/platform-env.ts +19 -0
  422. package/src/server/runtime/scheduled-task-error.ts +9 -0
  423. package/src/server/scheduled-tasks.ts +28 -0
  424. package/src/server/secrets/crypto.ts +56 -0
  425. package/src/server/servers/functions.ts +233 -0
  426. package/src/server/servers/lifecycle.ts +122 -0
  427. package/src/server/servers/metric-history-schema.ts +24 -0
  428. package/src/server/servers/metric-history.ts +55 -0
  429. package/src/server/servers/monitoring.ts +592 -0
  430. package/src/server/servers/service.ts +1211 -0
  431. package/src/server/servers/status.ts +32 -0
  432. package/src/server/servers/switch.ts +96 -0
  433. package/src/server/settings-version.ts +43 -0
  434. package/src/server/storage/capabilities.ts +6 -0
  435. package/src/server/storage/local-object-store.cloudflare.ts +7 -0
  436. package/src/server/storage/local-object-store.ts +50 -0
  437. package/src/server/storage/object-store.ts +160 -0
  438. package/src/server/teams/creation.ts +51 -0
  439. package/src/server/teams/delete-policy.ts +13 -0
  440. package/src/server/teams/deletion-state.ts +80 -0
  441. package/src/server/teams/functions.ts +324 -0
  442. package/src/server/teams/invitations.ts +38 -0
  443. package/src/server/teams/membership.ts +86 -0
  444. package/src/server/teams/queries.ts +261 -0
  445. package/src/server/teams/service.ts +1127 -0
  446. package/src/server/teams/types.ts +101 -0
  447. package/src/server/uploads/avatar.ts +133 -0
  448. package/src/server/users/deletion-state.ts +93 -0
  449. package/src/server/users/functions.ts +160 -0
  450. package/src/server/users/onboarding.ts +17 -0
  451. package/src/server/users/service.ts +644 -0
  452. package/src/server.ts +55 -0
  453. package/src/styles/shadcn.css +653 -0
  454. package/src/styles/theme.css +76 -0
  455. package/src/styles.css +177 -0
  456. package/wrangler.template.jsonc +37 -0
@@ -0,0 +1,748 @@
1
+ import { settingsVersionSchema } from '#devpush/lib/settings-version'
2
+ import { publicErrorsMiddleware } from '#devpush/server/http/public-errors'
3
+ import { backupConfigSchema } from '#devpush/lib/backup-policy-schema'
4
+ import { backupRestoreArtifactSchema } from '#devpush/lib/backup-restore-schema'
5
+ import { projectEnvironmentsSchema } from '#devpush/lib/project-environments-schema'
6
+ import { projectEnvVarsSchema } from '#devpush/lib/project-env-schema'
7
+ import {
8
+ projectRoutesSchema,
9
+ projectDomainsSchema,
10
+ } from '#devpush/lib/project-routing-schema'
11
+ import type { envVarSchema } from '#devpush/lib/project-creation-schema'
12
+ import { createProjectSchema } from '#devpush/lib/project-creation-schema'
13
+ import {
14
+ projectSettingsSchema,
15
+ projectSettingsErrors,
16
+ projectValidationErrors,
17
+ } from '#devpush/lib/project-settings-schema'
18
+ import { randomUUID } from 'node:crypto'
19
+
20
+ import { createServerFn } from '@tanstack/react-start'
21
+ import { z } from 'zod'
22
+
23
+ import { requireBackupsEnabled } from '#devpush/server/backups/feature'
24
+
25
+ import {
26
+ getAuthSession,
27
+ requireAuthSession,
28
+ } from '#devpush/server/auth/session.server'
29
+ import {
30
+ createManualDeployment,
31
+ createRedeployDeployment,
32
+ createRollbackDeployment,
33
+ getManualDeploymentOptions,
34
+ } from '#devpush/server/projects/deployments'
35
+ import {
36
+ updateProjectEnvironments,
37
+ updateProjectEnvironmentServers,
38
+ updateProjectEnvVars,
39
+ } from '#devpush/server/projects/environments'
40
+ import {
41
+ deleteProject,
42
+ updateProjectDomains,
43
+ updateProjectRoutes,
44
+ updateProjectSettings,
45
+ verifyProjectDomain,
46
+ } from '#devpush/server/projects/settings'
47
+ import {
48
+ createBackupRestoreJob,
49
+ createManualBackupRun,
50
+ saveProjectBackupPolicy,
51
+ deleteProjectBackupPolicy,
52
+ } from '#devpush/server/projects/backups'
53
+ import {
54
+ resolveUnavailableDeployment,
55
+ getDeploymentLogsContext,
56
+ getDeploymentSectionContext,
57
+ getProjectContext,
58
+ getProjectLogsSectionContext,
59
+ getProjectSectionContext,
60
+ } from '#devpush/server/projects/context'
61
+ import {
62
+ createProjectFromGitHub,
63
+ getRepositorySelection,
64
+ listRepositorySelectionRepositories,
65
+ } from '#devpush/server/projects/repository'
66
+
67
+ const teamSlugSchema = z.object({
68
+ teamSlug: z.string().min(1),
69
+ })
70
+
71
+ const projectRouteSchema = z.object({
72
+ teamSlug: z.string().min(1),
73
+ projectName: z.string().min(1),
74
+ })
75
+
76
+ const deleteProjectSchema = projectRouteSchema.extend({
77
+ confirmationName: z.string().trim().min(1),
78
+ removeDeployments: z.boolean().default(true),
79
+ })
80
+
81
+ const deployProjectSchema = projectRouteSchema.extend({
82
+ environmentId: z.string().trim().min(1),
83
+ gitBranch: z.string().trim().min(1),
84
+ gitSha: z.string().trim().min(1).optional(),
85
+ })
86
+
87
+ const deployOptionsSchema = projectRouteSchema.extend({
88
+ branch: z.string().min(1).optional(),
89
+ environmentId: z.string().trim().min(1),
90
+ })
91
+
92
+ const deploymentRouteSchema = projectRouteSchema.extend({
93
+ deploymentId: z.string().min(1),
94
+ })
95
+
96
+ const backupRouteSchema = projectRouteSchema.extend({
97
+ backupConfigId: z.string().min(1),
98
+ })
99
+
100
+ const backupRestoreSchema = projectRouteSchema.extend({
101
+ backupRunId: z.string().min(1),
102
+ artifacts: z.array(backupRestoreArtifactSchema).min(1),
103
+ })
104
+
105
+ const projectLogsSchema = projectRouteSchema.extend({
106
+ branch: z.string().trim().optional().nullable(),
107
+ date: z.string().trim().optional().nullable(),
108
+ deploymentId: z.string().trim().optional().nullable(),
109
+ environmentId: z.string().trim().optional().nullable(),
110
+ keyword: z.string().trim().optional().nullable(),
111
+ })
112
+
113
+ const projectEnvironmentServersSchema = projectRouteSchema.extend({
114
+ projectId: z.string().min(1),
115
+ settingsVersion: settingsVersionSchema,
116
+ defaultServerId: z.string().trim().min(1).nullable(),
117
+ environmentServers: z.array(
118
+ z.object({
119
+ environmentId: z.string().trim().min(1),
120
+ serverId: z.string().trim().min(1).nullable(),
121
+ }),
122
+ ),
123
+ })
124
+
125
+ const repositorySelectionRepositoriesSchema = z.object({
126
+ teamSlug: z.string().min(1),
127
+ installationId: z.number().int().positive(),
128
+ })
129
+
130
+ export const getRepositorySelectionContext = createServerFn({ method: 'GET' })
131
+ .middleware([publicErrorsMiddleware])
132
+ .validator((data: { teamSlug: string }) => teamSlugSchema.parse(data))
133
+ .handler(async ({ data }) => {
134
+ const session = await requireAuthSession(
135
+ 'Sign in before selecting a repository.',
136
+ )
137
+
138
+ return getRepositorySelection({
139
+ userId: session.user.id,
140
+ teamSlug: data.teamSlug,
141
+ })
142
+ })
143
+
144
+ export const getRepositorySelectionRepositories = createServerFn({
145
+ method: 'GET',
146
+ })
147
+ .middleware([publicErrorsMiddleware])
148
+ .validator((data: { installationId: number; teamSlug: string }) =>
149
+ repositorySelectionRepositoriesSchema.parse(data),
150
+ )
151
+ .handler(async ({ data }) => {
152
+ const session = await requireAuthSession(
153
+ 'Sign in before selecting a repository.',
154
+ )
155
+
156
+ return listRepositorySelectionRepositories({
157
+ userId: session.user.id,
158
+ teamSlug: data.teamSlug,
159
+ installationId: data.installationId,
160
+ })
161
+ })
162
+
163
+ export const createProject = createServerFn({ method: 'POST' })
164
+ .middleware([publicErrorsMiddleware])
165
+ .validator(
166
+ (data: {
167
+ composePath?: string
168
+ envVars?: Array<z.infer<typeof envVarSchema>>
169
+ installationId: number
170
+ projectName: string
171
+ readinessPath?: string
172
+ releaseCommand?: string
173
+ releaseService?: string
174
+ repoFullName: string
175
+ serverId?: string | null
176
+ teamSlug: string
177
+ }) => createProjectSchema.parse(data),
178
+ )
179
+ .handler(async ({ data }) => {
180
+ const session = await requireAuthSession(
181
+ 'Sign in before creating a project.',
182
+ )
183
+
184
+ return createProjectFromGitHub({
185
+ userId: session.user.id,
186
+ teamSlug: data.teamSlug,
187
+ projectName: data.projectName,
188
+ repoFullName: data.repoFullName,
189
+ installationId: data.installationId,
190
+ serverId: data.serverId?.trim() || null,
191
+ composePath: data.composePath ?? '',
192
+ readinessPath: data.readinessPath ?? '',
193
+ releaseCommand: data.releaseCommand ?? '',
194
+ releaseService: data.releaseService ?? '',
195
+ envVars: data.envVars ?? [],
196
+ })
197
+ })
198
+
199
+ export const getProject = createServerFn({ method: 'GET' })
200
+ .middleware([publicErrorsMiddleware])
201
+ .validator((data: { projectName: string; teamSlug: string }) =>
202
+ projectRouteSchema.parse(data),
203
+ )
204
+ .handler(async ({ data }) => {
205
+ const session = await getAuthSession()
206
+
207
+ if (!session) {
208
+ return null
209
+ }
210
+
211
+ return getProjectContext({
212
+ userId: session.user.id,
213
+ teamSlug: data.teamSlug,
214
+ projectName: data.projectName,
215
+ scope: 'shell',
216
+ })
217
+ })
218
+
219
+ export const getProjectSection = createServerFn({ method: 'GET' })
220
+ .middleware([publicErrorsMiddleware])
221
+ .validator(
222
+ (data: {
223
+ projectName: string
224
+ scope: 'backups' | 'deployments' | 'overview' | 'settings'
225
+ teamSlug: string
226
+ }) =>
227
+ projectRouteSchema
228
+ .extend({
229
+ scope: z.enum(['backups', 'deployments', 'overview', 'settings']),
230
+ })
231
+ .parse(data),
232
+ )
233
+ .handler(async ({ data }) => {
234
+ const session = await getAuthSession()
235
+
236
+ if (!session) {
237
+ return null
238
+ }
239
+
240
+ return getProjectSectionContext({
241
+ userId: session.user.id,
242
+ teamSlug: data.teamSlug,
243
+ projectName: data.projectName,
244
+ scope: data.scope,
245
+ })
246
+ })
247
+
248
+ export const getDeployment = createServerFn({ method: 'GET' })
249
+ .middleware([publicErrorsMiddleware])
250
+ .validator(
251
+ (data: { deploymentId: string; projectName: string; teamSlug: string }) =>
252
+ deploymentRouteSchema.parse(data),
253
+ )
254
+ .handler(async ({ data }) => {
255
+ const session = await getAuthSession()
256
+
257
+ if (!session) {
258
+ return null
259
+ }
260
+
261
+ return getDeploymentSectionContext({
262
+ userId: session.user.id,
263
+ teamSlug: data.teamSlug,
264
+ projectName: data.projectName,
265
+ deploymentId: data.deploymentId,
266
+ })
267
+ })
268
+
269
+ export const getDeploymentLogs = createServerFn({ method: 'GET' })
270
+ .middleware([publicErrorsMiddleware])
271
+ .validator(
272
+ (data: { deploymentId: string; projectName: string; teamSlug: string }) =>
273
+ deploymentRouteSchema.parse(data),
274
+ )
275
+ .handler(async ({ data }) => {
276
+ const session = await getAuthSession()
277
+
278
+ if (!session) {
279
+ return null
280
+ }
281
+
282
+ return getDeploymentLogsContext({
283
+ userId: session.user.id,
284
+ teamSlug: data.teamSlug,
285
+ projectName: data.projectName,
286
+ deploymentId: data.deploymentId,
287
+ })
288
+ })
289
+
290
+ export const getProjectLogs = createServerFn({ method: 'GET' })
291
+ .middleware([publicErrorsMiddleware])
292
+ .validator(
293
+ (data: {
294
+ branch?: string | null
295
+ date?: string | null
296
+ deploymentId?: string | null
297
+ environmentId?: string | null
298
+ keyword?: string | null
299
+ projectName: string
300
+ teamSlug: string
301
+ }) => projectLogsSchema.parse(data),
302
+ )
303
+ .handler(async ({ data }) => {
304
+ const session = await getAuthSession()
305
+
306
+ if (!session) {
307
+ return null
308
+ }
309
+
310
+ return getProjectLogsSectionContext({
311
+ userId: session.user.id,
312
+ teamSlug: data.teamSlug,
313
+ projectName: data.projectName,
314
+ branch: data.branch,
315
+ date: data.date,
316
+ deploymentId: data.deploymentId,
317
+ environmentId: data.environmentId,
318
+ keyword: data.keyword,
319
+ })
320
+ })
321
+
322
+ export const saveProjectSettings = createServerFn({ method: 'POST' })
323
+ .middleware([publicErrorsMiddleware])
324
+ .validator((data: z.input<typeof projectSettingsSchema>) => data)
325
+ .handler(async ({ data }) => {
326
+ const session = await requireAuthSession(
327
+ 'Sign in before saving project settings.',
328
+ )
329
+ const parsed = projectSettingsSchema.safeParse(data)
330
+ if (!parsed.success)
331
+ return {
332
+ context: null,
333
+ fieldErrors: projectValidationErrors(parsed.error.issues),
334
+ }
335
+ try {
336
+ const context = await updateProjectSettings({
337
+ userId: session.user.id,
338
+ ...parsed.data,
339
+ })
340
+ return { context, fieldErrors: null }
341
+ } catch (error) {
342
+ const fieldErrors = projectSettingsErrors(error)
343
+ if (fieldErrors) return { context: null, fieldErrors }
344
+ throw error
345
+ }
346
+ })
347
+
348
+ export const deleteProjectAction = createServerFn({ method: 'POST' })
349
+ .middleware([publicErrorsMiddleware])
350
+ .validator(
351
+ (data: {
352
+ confirmationName: string
353
+ projectName: string
354
+ removeDeployments?: boolean
355
+ teamSlug: string
356
+ }) => deleteProjectSchema.parse(data),
357
+ )
358
+ .handler(async ({ data }) => {
359
+ const session = await requireAuthSession(
360
+ 'Sign in before deleting a project.',
361
+ )
362
+
363
+ return deleteProject({
364
+ userId: session.user.id,
365
+ teamSlug: data.teamSlug,
366
+ projectName: data.projectName,
367
+ confirmationName: data.confirmationName,
368
+ removeDeployments: data.removeDeployments,
369
+ })
370
+ })
371
+
372
+ export const saveProjectRoutes = createServerFn({ method: 'POST' })
373
+ .middleware([publicErrorsMiddleware])
374
+ .validator(
375
+ (data: {
376
+ settingsVersion: number
377
+ projectId: string
378
+ projectName: string
379
+ routes: Array<{
380
+ path: string
381
+ port: number
382
+ service: string
383
+ environmentId?: string
384
+ stripPrefix?: boolean
385
+ }>
386
+ teamSlug: string
387
+ }) => projectRoutesSchema.parse(data),
388
+ )
389
+ .handler(async ({ data }) => {
390
+ const session = await requireAuthSession('Sign in before saving routes.')
391
+
392
+ return updateProjectRoutes({
393
+ settingsVersion: data.settingsVersion,
394
+ projectId: data.projectId,
395
+ userId: session.user.id,
396
+ teamSlug: data.teamSlug,
397
+ projectName: data.projectName,
398
+ routes: data.routes,
399
+ })
400
+ })
401
+
402
+ export const saveProjectDomains = createServerFn({ method: 'POST' })
403
+ .middleware([publicErrorsMiddleware])
404
+ .validator(
405
+ (data: {
406
+ settingsVersion: number
407
+ projectId: string
408
+ domains: Array<{
409
+ basePath: string
410
+ environmentId: string
411
+ host: string
412
+ https: boolean
413
+ }>
414
+ projectName: string
415
+ teamSlug: string
416
+ }) => projectDomainsSchema.parse(data),
417
+ )
418
+ .handler(async ({ data }) => {
419
+ const session = await requireAuthSession('Sign in before saving domains.')
420
+
421
+ return updateProjectDomains({
422
+ settingsVersion: data.settingsVersion,
423
+ projectId: data.projectId,
424
+ userId: session.user.id,
425
+ teamSlug: data.teamSlug,
426
+ projectName: data.projectName,
427
+ domains: data.domains,
428
+ })
429
+ })
430
+
431
+ export const verifyProjectDomainAction = createServerFn({ method: 'POST' })
432
+ .middleware([publicErrorsMiddleware])
433
+ .validator(
434
+ (data: { domainId: string; projectName: string; teamSlug: string }) =>
435
+ projectRouteSchema
436
+ .extend({ domainId: z.string().trim().min(1) })
437
+ .parse(data),
438
+ )
439
+ .handler(async ({ data }) => {
440
+ const session = await requireAuthSession(
441
+ 'Sign in before verifying domains.',
442
+ )
443
+
444
+ return verifyProjectDomain({
445
+ userId: session.user.id,
446
+ teamSlug: data.teamSlug,
447
+ projectName: data.projectName,
448
+ domainId: data.domainId,
449
+ })
450
+ })
451
+
452
+ export const saveProjectEnvironments = createServerFn({ method: 'POST' })
453
+ .middleware([publicErrorsMiddleware])
454
+ .validator(
455
+ (data: {
456
+ settingsVersion: number
457
+ projectId: string
458
+ environments: Array<{
459
+ branch: string
460
+ color: string
461
+ id: string
462
+ name: string
463
+ position: number
464
+ slug: string
465
+ status: 'active' | 'deleted'
466
+ }>
467
+ projectName: string
468
+ teamSlug: string
469
+ }) => projectEnvironmentsSchema.parse(data),
470
+ )
471
+ .handler(async ({ data }) => {
472
+ const session = await requireAuthSession(
473
+ 'Sign in before saving project environments.',
474
+ )
475
+
476
+ return updateProjectEnvironments({
477
+ settingsVersion: data.settingsVersion,
478
+ projectId: data.projectId,
479
+ userId: session.user.id,
480
+ teamSlug: data.teamSlug,
481
+ projectName: data.projectName,
482
+ projectEnvironments: data.environments,
483
+ })
484
+ })
485
+
486
+ export const saveProjectEnvironmentServers = createServerFn({ method: 'POST' })
487
+ .middleware([publicErrorsMiddleware])
488
+ .validator(
489
+ (data: {
490
+ settingsVersion: number
491
+ projectId: string
492
+ defaultServerId: string | null
493
+ projectName: string
494
+ environmentServers: Array<{
495
+ environmentId: string
496
+ serverId: string | null
497
+ }>
498
+ teamSlug: string
499
+ }) => projectEnvironmentServersSchema.parse(data),
500
+ )
501
+ .handler(async ({ data }) => {
502
+ const session = await requireAuthSession(
503
+ 'Sign in before saving project servers.',
504
+ )
505
+
506
+ return updateProjectEnvironmentServers({
507
+ settingsVersion: data.settingsVersion,
508
+ projectId: data.projectId,
509
+ userId: session.user.id,
510
+ teamSlug: data.teamSlug,
511
+ projectName: data.projectName,
512
+ defaultServerId: data.defaultServerId,
513
+ environmentServers: data.environmentServers,
514
+ })
515
+ })
516
+
517
+ export const saveProjectEnvVars = createServerFn({ method: 'POST' })
518
+ .middleware([publicErrorsMiddleware])
519
+ .validator(
520
+ (data: {
521
+ settingsVersion: number
522
+ projectId: string
523
+ envVars: Array<{ environment?: string; key: string; value: string }>
524
+ projectName: string
525
+ teamSlug: string
526
+ }) => projectEnvVarsSchema.parse(data),
527
+ )
528
+ .handler(async ({ data }) => {
529
+ const session = await requireAuthSession(
530
+ 'Sign in before saving project environment variables.',
531
+ )
532
+
533
+ return updateProjectEnvVars({
534
+ settingsVersion: data.settingsVersion,
535
+ projectId: data.projectId,
536
+ userId: session.user.id,
537
+ teamSlug: data.teamSlug,
538
+ projectName: data.projectName,
539
+ envVars: data.envVars,
540
+ })
541
+ })
542
+
543
+ export const saveProjectBackupPolicyAction = createServerFn({ method: 'POST' })
544
+ .middleware([publicErrorsMiddleware])
545
+ .validator(
546
+ (data: {
547
+ teamSlug: string
548
+ projectId: string
549
+ projectName: string
550
+ settingsVersion: number | null
551
+ policy: z.input<typeof backupConfigSchema>
552
+ }) =>
553
+ projectRouteSchema
554
+ .extend({
555
+ projectId: z.string().min(1),
556
+ settingsVersion: settingsVersionSchema.nullable(),
557
+ policy: backupConfigSchema,
558
+ })
559
+ .parse(data),
560
+ )
561
+ .handler(async ({ data }) => {
562
+ requireBackupsEnabled()
563
+ const session = await requireAuthSession()
564
+ return saveProjectBackupPolicy({
565
+ ...data,
566
+ userId: session.user.id,
567
+ policy: { ...data.policy, id: data.policy.id || randomUUID() },
568
+ })
569
+ })
570
+
571
+ export const deleteProjectBackupPolicyAction = createServerFn({
572
+ method: 'POST',
573
+ })
574
+ .middleware([publicErrorsMiddleware])
575
+ .validator(
576
+ (data: {
577
+ teamSlug: string
578
+ projectId: string
579
+ projectName: string
580
+ settingsVersion: number
581
+ policyId: string
582
+ }) =>
583
+ projectRouteSchema
584
+ .extend({
585
+ projectId: z.string().min(1),
586
+ settingsVersion: settingsVersionSchema,
587
+ policyId: z.string().min(1),
588
+ })
589
+ .parse(data),
590
+ )
591
+ .handler(async ({ data }) => {
592
+ requireBackupsEnabled()
593
+ const session = await requireAuthSession()
594
+ return deleteProjectBackupPolicy({ ...data, userId: session.user.id })
595
+ })
596
+
597
+ export const runProjectBackup = createServerFn({ method: 'POST' })
598
+ .middleware([publicErrorsMiddleware])
599
+ .validator(
600
+ (data: { backupConfigId: string; projectName: string; teamSlug: string }) =>
601
+ backupRouteSchema.parse(data),
602
+ )
603
+ .handler(async ({ data }) => {
604
+ requireBackupsEnabled()
605
+ const session = await requireAuthSession('Sign in before running a backup.')
606
+
607
+ return createManualBackupRun({
608
+ backupConfigId: data.backupConfigId,
609
+ userId: session.user.id,
610
+ teamSlug: data.teamSlug,
611
+ projectName: data.projectName,
612
+ })
613
+ })
614
+
615
+ export const restoreProjectBackup = createServerFn({ method: 'POST' })
616
+ .middleware([publicErrorsMiddleware])
617
+ .validator(
618
+ (data: {
619
+ backupRunId: string
620
+ artifacts: Array<
621
+ | {
622
+ artifactId: string
623
+ type: 'volume'
624
+ targetVolume: string
625
+ }
626
+ | {
627
+ artifactId: string
628
+ type: 'database'
629
+ targetService: string
630
+ }
631
+ >
632
+ projectName: string
633
+ teamSlug: string
634
+ }) => backupRestoreSchema.parse(data),
635
+ )
636
+ .handler(async ({ data }) => {
637
+ requireBackupsEnabled()
638
+ const session = await requireAuthSession(
639
+ 'Sign in before restoring a backup.',
640
+ )
641
+
642
+ return createBackupRestoreJob({
643
+ userId: session.user.id,
644
+ teamSlug: data.teamSlug,
645
+ projectName: data.projectName,
646
+ backupRunId: data.backupRunId,
647
+ artifacts: data.artifacts,
648
+ })
649
+ })
650
+
651
+ export const deployProject = createServerFn({ method: 'POST' })
652
+ .middleware([publicErrorsMiddleware])
653
+ .validator(
654
+ (data: {
655
+ environmentId: string
656
+ gitBranch: string
657
+ gitSha?: string
658
+ projectName: string
659
+ teamSlug: string
660
+ }) => deployProjectSchema.parse(data),
661
+ )
662
+ .handler(async ({ data }) => {
663
+ const session = await requireAuthSession(
664
+ 'Sign in before deploying a project.',
665
+ )
666
+
667
+ return createManualDeployment({
668
+ environmentId: data.environmentId,
669
+ gitBranch: data.gitBranch,
670
+ gitSha: data.gitSha,
671
+ userId: session.user.id,
672
+ teamSlug: data.teamSlug,
673
+ projectName: data.projectName,
674
+ })
675
+ })
676
+
677
+ export const rollbackProjectDeployment = createServerFn({ method: 'POST' })
678
+ .middleware([publicErrorsMiddleware])
679
+ .validator(
680
+ (data: { deploymentId: string; projectName: string; teamSlug: string }) =>
681
+ deploymentRouteSchema.parse(data),
682
+ )
683
+ .handler(async ({ data }) => {
684
+ const session = await requireAuthSession(
685
+ 'Sign in before rolling back a deployment.',
686
+ )
687
+
688
+ return createRollbackDeployment({
689
+ userId: session.user.id,
690
+ teamSlug: data.teamSlug,
691
+ projectName: data.projectName,
692
+ deploymentId: data.deploymentId,
693
+ })
694
+ })
695
+
696
+ export const redeployProjectDeployment = createServerFn({ method: 'POST' })
697
+ .middleware([publicErrorsMiddleware])
698
+ .validator(
699
+ (data: { deploymentId: string; projectName: string; teamSlug: string }) =>
700
+ deploymentRouteSchema.parse(data),
701
+ )
702
+ .handler(async ({ data }) => {
703
+ const session = await requireAuthSession(
704
+ 'Sign in before redeploying a deployment.',
705
+ )
706
+
707
+ return createRedeployDeployment({
708
+ userId: session.user.id,
709
+ teamSlug: data.teamSlug,
710
+ projectName: data.projectName,
711
+ deploymentId: data.deploymentId,
712
+ })
713
+ })
714
+
715
+ export const getProjectDeployOptions = createServerFn({ method: 'GET' })
716
+ .middleware([publicErrorsMiddleware])
717
+ .validator(
718
+ (data: {
719
+ environmentId: string
720
+ projectName: string
721
+ teamSlug: string
722
+ branch?: string
723
+ }) => deployOptionsSchema.parse(data),
724
+ )
725
+ .handler(async ({ data }) => {
726
+ const session = await requireAuthSession(
727
+ 'Sign in before deploying a project.',
728
+ )
729
+
730
+ return getManualDeploymentOptions({
731
+ branch: data.branch,
732
+ environmentId: data.environmentId,
733
+ userId: session.user.id,
734
+ teamSlug: data.teamSlug,
735
+ projectName: data.projectName,
736
+ })
737
+ })
738
+
739
+ export const getUnavailableDeployment = createServerFn({ method: 'GET' })
740
+ .middleware([publicErrorsMiddleware])
741
+ .validator((data: { deploymentId: string }) =>
742
+ z.object({ deploymentId: z.uuid() }).parse(data),
743
+ )
744
+ .handler(async ({ data }) => {
745
+ const session = await getAuthSession()
746
+ if (!session) return null
747
+ return resolveUnavailableDeployment(session.user.id, data.deploymentId)
748
+ })