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
package/README.md CHANGED
@@ -1,3 +1,7 @@
1
- # Temporary Holding Version
1
+ # devpush
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Deploy Docker Compose applications to your own servers with a git push. Run the dashboard on Node or Cloudflare Workers.
4
+
5
+ - [Installation](https://devpu.sh/docs/self-hosting/)
6
+ - [Package integration](https://devpu.sh/docs/package-installation/)
7
+ - [Source and contributing](https://github.com/hunvreus/devpush)
@@ -0,0 +1,37 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "repository": "hunvreus/devpush",
4
+ "version": "1.0.0-beta.3",
5
+ "goVersion": "go1.27.3",
6
+ "protocolVersion": 1,
7
+ "capabilities": [
8
+ "jobs.compose.deploy.v1",
9
+ "jobs.compose.cleanup.v2",
10
+ "jobs.backup.v1",
11
+ "jobs.backup.archive.v1",
12
+ "jobs.backup.cleanup.v1",
13
+ "jobs.restore.v1",
14
+ "runtime.logs.v1",
15
+ "metrics.history.v1",
16
+ "ingress.certificates.v1",
17
+ "ingress.inactive-redirects.v1"
18
+ ],
19
+ "assets": [
20
+ {
21
+ "os": "linux",
22
+ "arch": "amd64",
23
+ "filename": "devpush-agent-linux-amd64",
24
+ "url": "https://github.com/hunvreus/devpush/releases/download/v1.0.0-beta.3/devpush-agent-linux-amd64",
25
+ "sha256": "0f7f68305fa23525dbb5701460df6dc37d533a183af01ee615638948d746ffac",
26
+ "size": 8212604
27
+ },
28
+ {
29
+ "os": "linux",
30
+ "arch": "arm64",
31
+ "filename": "devpush-agent-linux-arm64",
32
+ "url": "https://github.com/hunvreus/devpush/releases/download/v1.0.0-beta.3/devpush-agent-linux-arm64",
33
+ "sha256": "03893adc1cb03e4e453fe687912b4b2b687d94b47bab3f4a99b841ec2c57f36f",
34
+ "size": 7536764
35
+ }
36
+ ]
37
+ }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Ronan Berder
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,182 @@
1
+ // src/package/migrate.ts
2
+ import { createClient } from "@libsql/client/web";
3
+
4
+ // src/server/db/migrate-libsql.ts
5
+ import { drizzle } from "drizzle-orm/libsql/web";
6
+ import { migrate } from "drizzle-orm/libsql/migrator";
7
+ import { readMigrationFiles } from "drizzle-orm/migrator";
8
+
9
+ // src/server/db/migration-history.ts
10
+ function assertKnownMigrationHistory(appliedHashes, availableHashes, hasUntrackedTables) {
11
+ const known = new Set(availableHashes);
12
+ if (hasUntrackedTables || appliedHashes.some((hash) => !known.has(hash))) {
13
+ throw new Error(
14
+ "Database migration history does not match this release. The flattened baseline requires fresh main and log databases; back up/export existing data before recreating them. No migration was applied."
15
+ );
16
+ }
17
+ }
18
+
19
+ // src/server/db/migrate-libsql.ts
20
+ async function migrateLibsql(client, migrationsFolder) {
21
+ const tracked = await client.execute(
22
+ "select name from sqlite_master where type='table' and name='__drizzle_migrations'"
23
+ );
24
+ const applied = tracked.rows.length ? (await client.execute("select hash from __drizzle_migrations")).rows.map(
25
+ (row) => String(row.hash)
26
+ ) : [];
27
+ const untracked = applied.length === 0 && (await client.execute(
28
+ "select name from sqlite_master where type='table' and name not like 'sqlite_%' and name <> '__drizzle_migrations' limit 1"
29
+ )).rows.length > 0;
30
+ assertKnownMigrationHistory(
31
+ applied,
32
+ readMigrationFiles({ migrationsFolder }).map((migration) => migration.hash),
33
+ untracked
34
+ );
35
+ await migrate(drizzle(client), { migrationsFolder });
36
+ }
37
+
38
+ // src/server/db/remote-config.ts
39
+ function remoteDatabaseConfig(env) {
40
+ const main = env.DEVPUSH_DATABASE_URL?.trim();
41
+ const logs = env.DEVPUSH_LOG_DATABASE_URL?.trim();
42
+ if (!main && !logs) {
43
+ if (env.DEVPUSH_DATABASE_AUTH_TOKEN || env.DEVPUSH_LOG_DATABASE_AUTH_TOKEN)
44
+ throw new Error(
45
+ "Database authentication tokens require remote database URLs."
46
+ );
47
+ return void 0;
48
+ }
49
+ if (!main || !logs)
50
+ throw new Error(
51
+ "Configure both DEVPUSH_DATABASE_URL and DEVPUSH_LOG_DATABASE_URL."
52
+ );
53
+ function identity(value) {
54
+ let url;
55
+ try {
56
+ url = new URL(value);
57
+ } catch {
58
+ throw new Error("Invalid remote database URL.");
59
+ }
60
+ if (!["libsql:", "https:", "http:"].includes(url.protocol) || !url.hostname || url.username || url.password || url.hash)
61
+ throw new Error(
62
+ "Remote databases require libsql://, https:// or http:// URLs without embedded credentials or fragments."
63
+ );
64
+ return `${url.hostname}:${url.port || (url.protocol === "http:" ? "80" : "443")}${url.pathname.replace(/\/$/, "")}`;
65
+ }
66
+ if (identity(main) === identity(logs))
67
+ throw new Error("Main data and logs must use different remote databases.");
68
+ return {
69
+ main: { url: main, authToken: env.DEVPUSH_DATABASE_AUTH_TOKEN },
70
+ logs: { url: logs, authToken: env.DEVPUSH_LOG_DATABASE_AUTH_TOKEN }
71
+ };
72
+ }
73
+
74
+ // src/package/migrate.ts
75
+ import { fileURLToPath } from "node:url";
76
+ import { join } from "node:path";
77
+
78
+ // src/server/db/migrate-sqlite.ts
79
+ import { mkdirSync } from "node:fs";
80
+ import { dirname } from "node:path";
81
+ import Sqlite from "better-sqlite3";
82
+ import { drizzle as drizzle2 } from "drizzle-orm/better-sqlite3";
83
+ import { migrate as migrate2 } from "drizzle-orm/better-sqlite3/migrator";
84
+ import { readMigrationFiles as readMigrationFiles2 } from "drizzle-orm/migrator";
85
+ function migrateSqliteFile(path, migrationsFolder) {
86
+ if (path !== ":memory:") mkdirSync(dirname(path), { recursive: true });
87
+ const connection = new Sqlite(path);
88
+ try {
89
+ const tracked = connection.prepare(
90
+ "select name from sqlite_master where type='table' and name='__drizzle_migrations'"
91
+ ).get();
92
+ const applied = tracked ? connection.prepare("select hash from __drizzle_migrations").all() : [];
93
+ const untracked = applied.length === 0 && Boolean(
94
+ connection.prepare(
95
+ "select name from sqlite_master where type='table' and name not like 'sqlite_%' and name <> '__drizzle_migrations' limit 1"
96
+ ).get()
97
+ );
98
+ assertKnownMigrationHistory(
99
+ applied.map((row) => row.hash),
100
+ readMigrationFiles2({ migrationsFolder }).map(
101
+ (migration) => migration.hash
102
+ ),
103
+ untracked
104
+ );
105
+ connection.pragma("foreign_keys = ON");
106
+ connection.pragma("journal_mode = WAL");
107
+ connection.pragma("synchronous = FULL");
108
+ migrate2(drizzle2(connection), { migrationsFolder });
109
+ } finally {
110
+ connection.close();
111
+ }
112
+ }
113
+
114
+ // src/server/db/sqlite-files.ts
115
+ import { existsSync, realpathSync, statSync } from "node:fs";
116
+ import { basename, dirname as dirname2, resolve } from "node:path";
117
+ function assertSeparateSqliteFiles(mainPath, logPath) {
118
+ if (mainPath === ":memory:" || logPath === ":memory:") return;
119
+ let same = canonicalPath(mainPath) === canonicalPath(logPath);
120
+ if (!same && existsSync(mainPath) && existsSync(logPath)) {
121
+ const main = statSync(mainPath);
122
+ const logs = statSync(logPath);
123
+ same = main.dev === logs.dev && main.ino === logs.ino;
124
+ }
125
+ if (same) {
126
+ throw new Error(
127
+ "DEVPUSH_DATABASE_PATH and DEVPUSH_LOG_DATABASE_PATH must identify separate SQLite files."
128
+ );
129
+ }
130
+ }
131
+ function canonicalPath(path) {
132
+ const absolute = resolve(path);
133
+ if (existsSync(absolute)) return realpathSync(absolute);
134
+ const parent = dirname2(absolute);
135
+ if (parent === absolute) return absolute;
136
+ return resolve(canonicalPath(parent), basename(absolute));
137
+ }
138
+
139
+ // src/package/migrate.ts
140
+ async function migrateNode(environment = process.env, options = {}) {
141
+ const migrationsDirectory = options.migrationsDirectory ?? fileURLToPath(new URL("../../src/server/db", import.meta.url));
142
+ const remote = remoteDatabaseConfig(environment);
143
+ if (remote) {
144
+ for (const [database, directory] of [
145
+ [remote.main, "migrations-sqlite"],
146
+ [remote.logs, "migrations-logs"]
147
+ ]) {
148
+ const client = createClient(database);
149
+ try {
150
+ await migrateLibsql(client, join(migrationsDirectory, directory));
151
+ } finally {
152
+ client.close();
153
+ }
154
+ }
155
+ console.log("Remote libSQL database migrations applied.");
156
+ } else {
157
+ const path = environment.DEVPUSH_DATABASE_PATH;
158
+ const logPath = environment.DEVPUSH_LOG_DATABASE_PATH;
159
+ if (!path && environment.NODE_ENV === "production") {
160
+ throw new Error("DEVPUSH_DATABASE_PATH is required in production.");
161
+ }
162
+ if (!logPath && environment.NODE_ENV === "production") {
163
+ throw new Error("DEVPUSH_LOG_DATABASE_PATH is required in production.");
164
+ }
165
+ assertSeparateSqliteFiles(
166
+ path ?? ".data/devpush.sqlite",
167
+ logPath ?? ".data/logs.sqlite"
168
+ );
169
+ migrateSqliteFile(
170
+ path ?? ".data/devpush.sqlite",
171
+ join(migrationsDirectory, "migrations-sqlite")
172
+ );
173
+ migrateSqliteFile(
174
+ logPath ?? ".data/logs.sqlite",
175
+ join(migrationsDirectory, "migrations-logs")
176
+ );
177
+ console.log("SQLite database migrations applied.");
178
+ }
179
+ }
180
+ export {
181
+ migrateNode
182
+ };
@@ -0,0 +1,125 @@
1
+ // src/package/plugins.ts
2
+ import {
3
+ existsSync,
4
+ mkdirSync,
5
+ readFileSync,
6
+ statSync,
7
+ writeFileSync
8
+ } from "node:fs";
9
+ import { dirname, isAbsolute, resolve } from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+
12
+ // src/plugins/version.ts
13
+ var pluginApiVersion = 3;
14
+
15
+ // src/package/plugins.ts
16
+ function definePlugin(value) {
17
+ if (!value || typeof value !== "object" || Array.isArray(value))
18
+ throw new Error("Plugin declaration must be an object.");
19
+ const plugin = value;
20
+ if (typeof plugin.id !== "string" || !/^[a-z][a-z0-9-]*$/.test(plugin.id))
21
+ throw new Error(
22
+ "Plugin IDs must use lowercase letters, numbers and hyphens."
23
+ );
24
+ if (plugin.apiVersion !== pluginApiVersion)
25
+ throw new Error(`Incompatible plugin API: ${plugin.id}`);
26
+ if (!Array.isArray(plugin.runtimes) || !plugin.runtimes.length || plugin.runtimes.some(
27
+ (runtime) => runtime !== "node" && runtime !== "cloudflare"
28
+ ))
29
+ throw new Error(`Invalid plugin runtimes: ${plugin.id}`);
30
+ for (const side of ["server", "client"]) {
31
+ const entry = plugin[side];
32
+ if (entry !== void 0 && typeof entry !== "string" && !(entry instanceof URL))
33
+ throw new Error(`Invalid ${side} entry for plugin ${plugin.id}.`);
34
+ if (entry instanceof URL && entry.protocol !== "file:")
35
+ throw new Error(`Plugin ${plugin.id} entries must use file URLs.`);
36
+ }
37
+ if (!plugin.server && !plugin.client)
38
+ throw new Error(`Plugin has no entry modules: ${plugin.id}`);
39
+ return Object.freeze({
40
+ ...plugin,
41
+ runtimes: Object.freeze([...plugin.runtimes])
42
+ });
43
+ }
44
+ function generatePlugins(plugins, target, root) {
45
+ const seen = /* @__PURE__ */ new Set();
46
+ const entries = plugins.map((value) => {
47
+ const plugin = definePlugin(value);
48
+ if (seen.has(plugin.id)) throw new Error(`Duplicate plugin: ${plugin.id}`);
49
+ seen.add(plugin.id);
50
+ if (!plugin.runtimes.includes(target))
51
+ throw new Error(`Plugin ${plugin.id} does not support ${target}.`);
52
+ function entry(module) {
53
+ if (module === void 0) return void 0;
54
+ const path = module instanceof URL ? fileURLToPath(module) : module;
55
+ if (!isAbsolute(path) || !existsSync(path) || !statSync(path).isFile())
56
+ throw new Error(
57
+ `Plugin ${plugin.id} entry must be an existing absolute file: ${path}`
58
+ );
59
+ return path.replaceAll("\\", "/");
60
+ }
61
+ return {
62
+ id: plugin.id,
63
+ server: entry(plugin.server),
64
+ client: entry(plugin.client)
65
+ };
66
+ });
67
+ const directory = resolve(root, ".devpush");
68
+ mkdirSync(directory, { recursive: true });
69
+ const paths = {
70
+ server: resolve(directory, "plugins.server.ts"),
71
+ client: resolve(directory, "plugins.ui.ts")
72
+ };
73
+ for (const side of ["server", "client"]) {
74
+ const selected = entries.filter((entry) => entry[side]);
75
+ const imports = selected.map(
76
+ (entry, index) => `import plugin${index} from ${JSON.stringify(entry[side])}`
77
+ );
78
+ const declarations = selected.map(
79
+ (entry, index) => `{ id: ${JSON.stringify(entry.id)}, implementation: plugin${index} }`
80
+ );
81
+ writeFileSync(
82
+ paths[side],
83
+ `${imports.join("\n")}
84
+ export default [${declarations.join(",\n")}]
85
+ `
86
+ );
87
+ }
88
+ return {
89
+ ...paths,
90
+ clientDirectories: [
91
+ ...new Set(
92
+ entries.flatMap(
93
+ (entry) => entry.client ? [dirname(entry.client)] : []
94
+ )
95
+ )
96
+ ],
97
+ serverEntries: entries.flatMap(
98
+ (entry) => entry.server ? [entry.server] : []
99
+ ),
100
+ packageNames: [
101
+ ...new Set(
102
+ entries.flatMap((entry) => {
103
+ const file = entry.server ?? entry.client;
104
+ if (!file) return [];
105
+ let packageDirectory = dirname(file);
106
+ for (; ; ) {
107
+ const manifest = resolve(packageDirectory, "package.json");
108
+ if (existsSync(manifest)) {
109
+ const metadata = JSON.parse(readFileSync(manifest, "utf8"));
110
+ return typeof metadata.name === "string" ? [metadata.name] : [];
111
+ }
112
+ const parent = dirname(packageDirectory);
113
+ if (parent === packageDirectory) return [];
114
+ packageDirectory = parent;
115
+ }
116
+ })
117
+ )
118
+ ]
119
+ };
120
+ }
121
+ export {
122
+ definePlugin,
123
+ generatePlugins,
124
+ pluginApiVersion
125
+ };