void 0.10.13 → 0.20.1

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 (432) hide show
  1. package/AGENTS_TEMPLATE.md +6 -0
  2. package/{skills/void/docs/node_modules/void/node_modules/pglite-server/LICENSE.md → LICENSE} +1 -1
  3. package/README.md +34 -8
  4. package/dist/{auth-qgMlYp7Z.d.mts → auth-DkcFflXV.d.mts} +10 -11
  5. package/dist/auth-W9WII-mN.mjs +630 -0
  6. package/dist/{auth-cmd-BqsdZJp5.mjs → auth-cmd-CAH62yDU.mjs} +4 -3
  7. package/dist/{auth-migrations-BTZ-ATvQ.mjs → auth-migrations-9vif1uj8.mjs} +53 -12
  8. package/dist/{better-auth-shared-BQooDxbw.mjs → better-auth-shared-CYw1T3k4.mjs} +7 -10
  9. package/dist/{better-auth-shared-DealXecJ.d.mts → better-auth-shared-DSCeohOK.d.mts} +10 -5
  10. package/dist/{build-cmd-Bujrv5q-.mjs → build-cmd-CJvZvPQO.mjs} +6 -4
  11. package/dist/{cache-C11V8Fxq.mjs → cache-BlNeQjuP.mjs} +9 -5
  12. package/dist/{cancel-deploy-fwFYF04b.mjs → cancel-deploy-CmlAZ9P6.mjs} +3 -2
  13. package/dist/cf-access-AJ1ehiFR.mjs +42 -0
  14. package/dist/cf-access-DsSsZUPr.mjs +67 -0
  15. package/dist/cli/cli.d.mts +1 -1
  16. package/dist/cli/cli.mjs +1735 -165
  17. package/dist/cli/env-schema-probe.d.mts +48 -61
  18. package/dist/cli/env-schema-probe.mjs +10 -58
  19. package/dist/{client-Gb71-XkG.mjs → client-Clirrol3.mjs} +120 -463
  20. package/dist/cloudflare-auth-B1QtTO1b.mjs +217 -0
  21. package/dist/cloudflare-cmd-B6_OZx2V.mjs +62 -0
  22. package/dist/cloudflare-connect-j5D4hhrG.mjs +56 -0
  23. package/dist/cloudflare-operations-CPTpRW6d.mjs +566 -0
  24. package/dist/{config-qHGgPuWT.mjs → config-BQFq7QvD.mjs} +75 -41
  25. package/dist/{config-CutEMNGJ.mjs → config-NOG_U1aK.mjs} +10 -15
  26. package/dist/connect-C04Wdy_h.mjs +79 -0
  27. package/dist/{create-project-DsYvl3TB.mjs → create-project-ChGZ1DFd.mjs} +26 -16
  28. package/dist/database-provider.d.mts +21 -0
  29. package/dist/database-provider.mjs +6 -0
  30. package/dist/{db-C0i0sYMS.mjs → db-D2d_mUsB.mjs} +612 -117
  31. package/dist/{delete-mh6p-zkQ.mjs → delete-D8GigDk8.mjs} +9 -6
  32. package/dist/{deploy-jBJT1fUT.mjs → deploy-iXZ3F0N6.mjs} +3252 -1995
  33. package/dist/dev-inbox-DkgRWLkW.mjs +307 -0
  34. package/dist/{discover-CJHyvYfR.mjs → discover-xvfrgJeo.mjs} +3 -3
  35. package/dist/{magic-string.es-ZQjdJFFn.mjs → dist-BR1quN_w.mjs} +570 -216
  36. package/dist/{dist-DaKKDf8D.mjs → dist-BrsS7cai.mjs} +17 -2
  37. package/dist/{dist-BuiRJkTd.mjs → dist-m40_XgNh.mjs} +48 -33
  38. package/dist/{domain-DiaNQbrl.mjs → domain-B1VmoSr0.mjs} +41 -4
  39. package/dist/dotenv-VQxupEUv.mjs +181 -0
  40. package/dist/edge.d.mts +2 -0
  41. package/dist/edge.mjs +2 -0
  42. package/dist/email-Ce6SQq-i.mjs +182 -0
  43. package/dist/email-uKyQYUVY.mjs +1016 -0
  44. package/dist/{entry-D7yy4xVH.mjs → entry-DU3oDoQ3.mjs} +2 -2
  45. package/dist/env-BcQzYgoG.mjs +73 -0
  46. package/dist/env-D4Emu-M_.mjs +95 -0
  47. package/dist/env-helpers-CyKtOBpj.d.mts +22 -0
  48. package/dist/env-public-D_6u46fX.d.mts +135 -0
  49. package/dist/{env-types-QBj-ndax.mjs → env-types-BNPhro-M.mjs} +2 -2
  50. package/dist/{env-validation-Dea3v3ej.mjs → env-validation-ENpMy6Ez.mjs} +68 -122
  51. package/dist/{gen-BzXf3Jh2.mjs → gen-DI2YwdBM.mjs} +70 -15
  52. package/dist/generate-RTK8_kK1.mjs +47 -0
  53. package/dist/{github-cmd-DKcGUNsj.mjs → github-cmd-xItS5Zwf.mjs} +39 -31
  54. package/dist/{handler-Cjh8uM3Y.d.mts → handler-D1hLsObx.d.mts} +124 -122
  55. package/dist/{head-nmvOgFjd.d.mts → head-Do8P4puT.d.mts} +9 -8
  56. package/dist/{headers-ChAADPQu.mjs → headers-D8QfRX9Y.mjs} +12 -10
  57. package/dist/inbound-2d0zi2yS.mjs +706 -0
  58. package/dist/inbound-afAcWeQ9.d.mts +363 -0
  59. package/dist/index.d.mts +61 -34
  60. package/dist/index.mjs +1012 -293
  61. package/dist/{init-7JCAcKNQ.mjs → init-BD-9THgn.mjs} +329 -271
  62. package/dist/link-RMdgjF1v.mjs +52 -0
  63. package/dist/{list-CPwFDZ_c.mjs → list-3F52R_yO.mjs} +37 -5
  64. package/dist/{runner-kapo9aPs.mjs → local-d1-D2I6Ox5F.mjs} +116 -6
  65. package/dist/{login-BT3H8PN3.mjs → login-pV69H-ZO.mjs} +17 -15
  66. package/dist/{logs-Bt313ax7.mjs → logs-DFHHD6wE.mjs} +16 -2
  67. package/dist/mime-BJD7d_qL.mjs +1216 -0
  68. package/dist/neon-DHwd2zvC.mjs +54 -0
  69. package/dist/{node-pRg81HqV.mjs → node-Dk3H2jmU.mjs} +29 -8
  70. package/dist/operator-cmd-DYWRbWUA.mjs +348 -0
  71. package/dist/{agents-CtgBYqld.mjs → output-tFQLLj26.mjs} +676 -211
  72. package/dist/{package-json-Cx1osYo6.mjs → package-json-CPoWX79C.mjs} +1 -1
  73. package/dist/pages/client.d.mts +43 -41
  74. package/dist/pages/client.mjs +40 -33
  75. package/dist/pages/head-client.d.mts +10 -12
  76. package/dist/pages/head.d.mts +1 -1
  77. package/dist/pages/index.d.mts +37 -14
  78. package/dist/pages/index.mjs +5 -5
  79. package/dist/pages/islands-plugin.d.mts +25 -27
  80. package/dist/pages/islands-plugin.mjs +6 -4
  81. package/dist/pages/prefetch.d.mts +6 -7
  82. package/dist/pages/protocol.d.mts +2 -2
  83. package/dist/pages/protocol.mjs +2 -1
  84. package/dist/pages/serialize.d.mts +7 -8
  85. package/dist/platform-cmd-DxJ2FRwR.mjs +123 -0
  86. package/dist/platform-domain-ChvbJkdy.mjs +228 -0
  87. package/dist/platform-lifecycle-DN4MzJF_.mjs +4450 -0
  88. package/dist/platform-management-Db2PXw0B.mjs +698 -0
  89. package/dist/platform-recovery-C_YO-tIs.mjs +99 -0
  90. package/dist/{plugin-inference-DMeavIJ6.mjs → plugin-inference-BDRfZngg.mjs} +35 -19
  91. package/dist/prepare-BfJvFUtJ.mjs +14 -0
  92. package/dist/{prepare-BvvgAz-3.mjs → prepare-CBetXvsN.mjs} +15 -24
  93. package/dist/{preset-BjyR3lzz.mjs → preset-lAy0B0BQ.mjs} +25 -212
  94. package/dist/{project-cmd-D_w-4w5B.mjs → project-cmd-Mo0V9yKS.mjs} +25 -12
  95. package/dist/{project-paths-BQd7OmIo.mjs → project-paths-SK8nMHPp.mjs} +3 -1
  96. package/dist/{project-tsconfig-B-QtXjLQ.mjs → project-tsconfig-Ql2XsSQp.mjs} +2 -2
  97. package/dist/{protocol-Bnb0LFp3.d.mts → protocol-C-pqYJjE.d.mts} +3 -4
  98. package/dist/{provision-CPx2ZxsH.mjs → provision-Blnstcm2.mjs} +78 -45
  99. package/dist/r2-conditions-D1Wk8i7b.mjs +30 -0
  100. package/dist/{requests-B8sZxaFM.mjs → requests-BcKOVpRg.mjs} +5 -3
  101. package/dist/{resolve-project-BBMtLLV9.mjs → resolve-project--Vxawf7z.mjs} +2 -2
  102. package/dist/rollback-Bx85-0xh.mjs +166 -0
  103. package/dist/{rolldown-runtime-DJK8HYOj.mjs → rolldown-runtime-rQ84J-ij.mjs} +1 -1
  104. package/dist/{route-types-z1jtHEi_.mjs → route-types-Da-DpyUp.mjs} +77 -25
  105. package/dist/routes-stub.d.mts +22 -23
  106. package/dist/runner-mysql-7BPUNGmL.mjs +61 -0
  107. package/dist/{runner-pg-CHM76xuC.mjs → runner-pg-BkEza-dX.mjs} +18 -6
  108. package/dist/runtime/ai.d.mts +21 -14
  109. package/dist/runtime/ai.mjs +5 -4
  110. package/dist/runtime/auth-client-react.d.mts +3 -5
  111. package/dist/runtime/auth-client-solid.d.mts +3 -5
  112. package/dist/runtime/auth-client-svelte.d.mts +3 -5
  113. package/dist/runtime/auth-client-vue.d.mts +3 -5
  114. package/dist/runtime/auth-client.d.mts +3 -5
  115. package/dist/runtime/auth.d.mts +1 -1
  116. package/dist/runtime/better-auth-mysql.d.mts +10 -0
  117. package/dist/runtime/better-auth-mysql.mjs +49 -0
  118. package/dist/runtime/better-auth-pg.d.mts +8 -9
  119. package/dist/runtime/better-auth-pg.mjs +2 -2
  120. package/dist/runtime/better-auth.d.mts +8 -9
  121. package/dist/runtime/better-auth.mjs +2 -2
  122. package/dist/runtime/client-react.d.mts +1 -1
  123. package/dist/runtime/client-solid.d.mts +1 -1
  124. package/dist/runtime/client-svelte.d.mts +1 -1
  125. package/dist/runtime/client-vue.d.mts +1 -1
  126. package/dist/runtime/client.d.mts +1 -1
  127. package/dist/runtime/db-mysql.d.mts +2 -0
  128. package/dist/runtime/db-mysql.mjs +1 -0
  129. package/dist/runtime/db.d.mts +10 -11
  130. package/dist/runtime/durable.d.mts +47 -0
  131. package/dist/runtime/durable.mjs +146 -0
  132. package/dist/runtime/email/testing.d.mts +112 -0
  133. package/dist/runtime/email/testing.mjs +283 -0
  134. package/dist/runtime/email.d.mts +30 -0
  135. package/dist/runtime/email.mjs +573 -0
  136. package/dist/runtime/env-helpers.d.mts +2 -2
  137. package/dist/runtime/env-helpers.mjs +5 -42
  138. package/dist/runtime/env-public-client.d.mts +10 -11
  139. package/dist/runtime/env-public-client.mjs +1 -1
  140. package/dist/runtime/env-public.d.mts +2 -2
  141. package/dist/runtime/env-public.mjs +104 -49
  142. package/dist/runtime/env.d.mts +19 -18
  143. package/dist/runtime/env.mjs +15 -2
  144. package/dist/runtime/fetch-stream.d.mts +20 -21
  145. package/dist/runtime/fetch.d.mts +15 -16
  146. package/dist/runtime/handler.d.mts +1 -1
  147. package/dist/runtime/isr.d.mts +21 -22
  148. package/dist/runtime/isr.mjs +26 -8
  149. package/dist/runtime/kv.d.mts +9 -10
  150. package/dist/runtime/live-client.d.mts +5 -7
  151. package/dist/runtime/live-client.mjs +9 -7
  152. package/dist/runtime/live-server.d.mts +4 -5
  153. package/dist/runtime/live.d.mts +22 -24
  154. package/dist/runtime/live.mjs +1 -1
  155. package/dist/runtime/log.d.mts +16 -17
  156. package/dist/runtime/migration-handler-mysql.d.mts +4 -0
  157. package/dist/runtime/migration-handler-mysql.mjs +81 -0
  158. package/dist/runtime/migration-handler-pg.d.mts +2 -4
  159. package/dist/runtime/migration-handler.d.mts +5 -6
  160. package/dist/runtime/migration-handler.mjs +4 -3
  161. package/dist/runtime/queues.d.mts +3 -4
  162. package/dist/runtime/queues.mjs +2 -1
  163. package/dist/runtime/remote/binding-handler.d.mts +10 -12
  164. package/dist/runtime/remote/binding-handler.mjs +24 -3
  165. package/dist/runtime/remote/index.d.mts +5 -6
  166. package/dist/runtime/remote/index.mjs +21 -18
  167. package/dist/runtime/response.d.mts +10 -11
  168. package/dist/runtime/sandbox.d.mts +56 -55
  169. package/dist/runtime/sandbox.mjs +57 -49
  170. package/dist/runtime/schema-mysql.d.mts +1 -0
  171. package/dist/runtime/schema-mysql.mjs +2 -0
  172. package/dist/runtime/seed.d.mts +14 -9
  173. package/dist/runtime/sse-client.d.mts +6 -7
  174. package/dist/runtime/sse.d.mts +11 -12
  175. package/dist/runtime/storage.d.mts +3 -4
  176. package/dist/runtime/validator.d.mts +1 -1
  177. package/dist/runtime/ws-server.d.mts +12 -12
  178. package/dist/runtime/ws-server.mjs +32 -4
  179. package/dist/runtime/ws.d.mts +19 -21
  180. package/dist/{scan-ChWt4pX1.mjs → scan-BMH4rzlv.mjs} +42 -19
  181. package/dist/{scan-NU4xKGci.mjs → scan-CpK-57ug.mjs} +5 -4
  182. package/dist/{secret-Dt32J6RI.mjs → secret-ByhJ9AMl.mjs} +62 -5
  183. package/dist/{skills-CLjN0uUO.mjs → skills-Q46GZMO-.mjs} +6 -4
  184. package/dist/sqlite-validation-BzKMWnO4.mjs +25 -0
  185. package/dist/{standard-schema-DJ0HW7QP.d.mts → standard-schema-Fo_vCAZh.d.mts} +6 -6
  186. package/dist/{subcommand-prompt-BzV8iQZo.mjs → subcommand-prompt-WfySCQ7S.mjs} +67 -48
  187. package/dist/sveltekit.d.mts +12 -11
  188. package/dist/sveltekit.mjs +1 -1
  189. package/dist/types-BAp5AEBU.d.mts +79 -0
  190. package/dist/types-CKWnYgfy.d.mts +1 -0
  191. package/dist/{validate-Cw_RLeTj.mjs → validate-tBBN_dXH.mjs} +4 -3
  192. package/dist/wrangler--imS8n0d.mjs +1796 -0
  193. package/dist/{yarn-pnp-DJn3SAHF.mjs → yarn-pnp-DxSInkzL.mjs} +1 -1
  194. package/package.json +79 -65
  195. package/schema.json +22 -3
  196. package/skills/void/SKILL.md +59 -2
  197. package/skills/void/docs/guide/ai.md +32 -14
  198. package/skills/void/docs/guide/app-types.md +6 -6
  199. package/skills/void/docs/guide/auth.md +14 -16
  200. package/skills/void/docs/guide/database/d1.md +6 -0
  201. package/skills/void/docs/guide/database/mysql.md +60 -0
  202. package/skills/void/docs/guide/database/postgresql.md +14 -9
  203. package/skills/void/docs/guide/database.md +39 -26
  204. package/skills/void/docs/guide/deployment.md +99 -25
  205. package/skills/void/docs/guide/durable-state.md +140 -0
  206. package/skills/void/docs/guide/edge/headers.md +5 -5
  207. package/skills/void/docs/guide/edge/prerendering.md +2 -0
  208. package/skills/void/docs/guide/edge/revalidation.md +21 -6
  209. package/skills/void/docs/guide/edge/rewrites.md +18 -14
  210. package/skills/void/docs/guide/edge/static-assets.md +12 -10
  211. package/skills/void/docs/guide/email.md +640 -0
  212. package/skills/void/docs/guide/env-migration.md +109 -0
  213. package/skills/void/docs/guide/env-vars.md +70 -248
  214. package/skills/void/docs/guide/index.md +15 -17
  215. package/skills/void/docs/guide/jobs.md +8 -5
  216. package/skills/void/docs/guide/live.md +7 -15
  217. package/skills/void/docs/guide/pages-routing/actions-and-forms.md +8 -4
  218. package/skills/void/docs/guide/pages-routing/islands.md +3 -3
  219. package/skills/void/docs/guide/pages-routing/loaders.md +6 -4
  220. package/skills/void/docs/guide/pages-routing/overview.md +7 -7
  221. package/skills/void/docs/guide/platform-administration.md +212 -0
  222. package/skills/void/docs/guide/platform-development.md +264 -0
  223. package/skills/void/docs/guide/queues.md +10 -10
  224. package/skills/void/docs/guide/quickstart.md +46 -67
  225. package/skills/void/docs/guide/remote-dev.md +8 -6
  226. package/skills/void/docs/guide/sandboxes.md +33 -16
  227. package/skills/void/docs/guide/self-hosted-platform.md +553 -0
  228. package/skills/void/docs/guide/server-routing.md +5 -5
  229. package/skills/void/docs/guide/sse.md +4 -4
  230. package/skills/void/docs/guide/ssg.md +5 -3
  231. package/skills/void/docs/guide/storage.md +2 -2
  232. package/skills/void/docs/guide/websockets.md +15 -7
  233. package/skills/void/docs/index.md +3 -3
  234. package/skills/void/docs/integrations/agents.md +6 -64
  235. package/skills/void/docs/integrations/cloudflare.md +165 -146
  236. package/skills/void/docs/integrations/frameworks/analog.md +4 -4
  237. package/skills/void/docs/integrations/frameworks/astro.md +5 -5
  238. package/skills/void/docs/integrations/frameworks/nuxt.md +5 -5
  239. package/skills/void/docs/integrations/frameworks/overview.md +3 -3
  240. package/skills/void/docs/integrations/frameworks/react-router.md +3 -3
  241. package/skills/void/docs/integrations/frameworks/sveltekit.md +3 -3
  242. package/skills/void/docs/integrations/frameworks/tanstack-start.md +2 -2
  243. package/skills/void/docs/integrations/nodejs-bun-deno.md +11 -4
  244. package/skills/void/docs/reference/api.md +42 -6
  245. package/skills/void/docs/reference/cli.md +665 -160
  246. package/skills/void/docs/reference/config.md +67 -27
  247. package/skills/void/docs/reference/resource-inference.md +13 -9
  248. package/skills/void/docs/reference/structure.md +9 -11
  249. package/AGENT_PROMPT.md +0 -19
  250. package/dist/cf-access-Bqw81xAf.mjs +0 -22
  251. package/dist/env-CZy5MorI.mjs +0 -299
  252. package/dist/env-helpers-z4stu8uc.d.mts +0 -52
  253. package/dist/env-mask-Dd47NbR6.mjs +0 -90
  254. package/dist/env-public-BfiLcMBk.d.mts +0 -140
  255. package/dist/link-CdGHSIy-.mjs +0 -45
  256. package/dist/mcp-DoM3_nhd.mjs +0 -377
  257. package/dist/project-paths-GpziKeQQ.d.mts +0 -25
  258. package/dist/providers-BNKRacMr.d.mts +0 -7
  259. package/dist/proxy-D-3_D-Gl.mjs +0 -5
  260. package/dist/rollback-CkvTFXx5.mjs +0 -90
  261. package/dist/runtime/isr-cache.d.mts +0 -207
  262. package/dist/runtime/isr-cache.mjs +0 -523
  263. package/dist/types-lLjNE9Qp.d.mts +0 -51
  264. package/getting-started-prompt.txt +0 -28
  265. package/skills/void/command/void.md +0 -7
  266. package/skills/void/docs/integrations/auth-providers.md +0 -0
  267. package/skills/void/docs/integrations/payment-processors.md +0 -0
  268. package/skills/void/docs/node_modules/@iconify/vue/README.md +0 -408
  269. package/skills/void/docs/node_modules/@iconify/vue/offline/readme.md +0 -5
  270. package/skills/void/docs/node_modules/@voidzero-dev/vitepress-theme/README.md +0 -103
  271. package/skills/void/docs/node_modules/oxc-minify/README.md +0 -78
  272. package/skills/void/docs/node_modules/reka-ui/README.md +0 -80
  273. package/skills/void/docs/node_modules/vitepress/README.md +0 -28
  274. package/skills/void/docs/node_modules/vitepress/template/api-examples.md +0 -49
  275. package/skills/void/docs/node_modules/vitepress/template/index.md +0 -28
  276. package/skills/void/docs/node_modules/vitepress/template/markdown-examples.md +0 -85
  277. package/skills/void/docs/node_modules/vitepress-plugin-group-icons/README.md +0 -101
  278. package/skills/void/docs/node_modules/void/AGENT_PROMPT.md +0 -19
  279. package/skills/void/docs/node_modules/void/CLAUDE.md +0 -221
  280. package/skills/void/docs/node_modules/void/README.md +0 -90
  281. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/CHANGELOG.md +0 -685
  282. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/README.md +0 -396
  283. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/sandbox/README.md +0 -219
  284. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/vite-plugin/README.md +0 -37
  285. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/workers-types/README.md +0 -135
  286. package/skills/void/docs/node_modules/void/node_modules/@electric-sql/pglite/README.md +0 -189
  287. package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/CHANGELOG.md +0 -143
  288. package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/README.md +0 -1272
  289. package/skills/void/docs/node_modules/void/node_modules/@napi-rs/keyring/README.md +0 -19
  290. package/skills/void/docs/node_modules/void/node_modules/@types/better-sqlite3/README.md +0 -15
  291. package/skills/void/docs/node_modules/void/node_modules/@types/node/README.md +0 -15
  292. package/skills/void/docs/node_modules/void/node_modules/@types/pg/README.md +0 -15
  293. package/skills/void/docs/node_modules/void/node_modules/@types/proper-lockfile/README.md +0 -51
  294. package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/README.md +0 -22
  295. package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/vendor/vscode-jsonrpc/README.md +0 -69
  296. package/skills/void/docs/node_modules/void/node_modules/@void/md/README.md +0 -153
  297. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/engine-javascript/README.md +0 -9
  298. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/transformers/README.md +0 -9
  299. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@types/node/README.md +0 -15
  300. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/CHANGELOG.md +0 -24
  301. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/README.md +0 -565
  302. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-exit/README.md +0 -127
  303. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-anchor/README.md +0 -600
  304. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-attrs/README.md +0 -386
  305. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-container/README.md +0 -95
  306. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-emoji/README.md +0 -101
  307. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-footnote/README.md +0 -135
  308. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/pathslash/README.md +0 -64
  309. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/shiki/README.md +0 -15
  310. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tinyglobby/README.md +0 -25
  311. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/AGENTS.md +0 -16
  312. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/README.md +0 -220
  313. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/build.md +0 -21
  314. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/check.md +0 -35
  315. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/create.md +0 -70
  316. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/fmt.md +0 -20
  317. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/index.md +0 -35
  318. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/lint.md +0 -26
  319. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/pack.md +0 -17
  320. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/run.md +0 -364
  321. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/staged.md +0 -15
  322. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/test.md +0 -18
  323. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +0 -145
  324. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/build.md +0 -40
  325. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/cache.md +0 -107
  326. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/check.md +0 -60
  327. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ci.md +0 -62
  328. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/commit-hooks.md +0 -60
  329. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/create.md +0 -341
  330. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/dev.md +0 -24
  331. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/docker.md +0 -175
  332. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/env.md +0 -167
  333. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/fmt.md +0 -41
  334. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/github-actions-cache.md +0 -165
  335. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ide-integration.md +0 -101
  336. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/implode.md +0 -23
  337. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/index.md +0 -134
  338. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/install.md +0 -199
  339. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/lint.md +0 -50
  340. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate-rules.md +0 -347
  341. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate.md +0 -197
  342. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/monorepo.md +0 -176
  343. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/pack.md +0 -69
  344. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/run.md +0 -356
  345. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/test.md +0 -35
  346. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/troubleshooting.md +0 -108
  347. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/upgrade.md +0 -101
  348. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/vpx.md +0 -66
  349. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/why.md +0 -39
  350. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/index.md +0 -12
  351. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/team.md +0 -35
  352. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/templates/generator/README.md +0 -35
  353. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/templates/monorepo/README.md +0 -29
  354. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vue/README.md +0 -58
  355. package/skills/void/docs/node_modules/void/node_modules/arktype/README.md +0 -165
  356. package/skills/void/docs/node_modules/void/node_modules/better-auth/LICENSE.md +0 -20
  357. package/skills/void/docs/node_modules/void/node_modules/better-auth/README.md +0 -32
  358. package/skills/void/docs/node_modules/void/node_modules/better-sqlite3/README.md +0 -99
  359. package/skills/void/docs/node_modules/void/node_modules/blake3-jit/README.md +0 -108
  360. package/skills/void/docs/node_modules/void/node_modules/drizzle-arktype/README.md +0 -51
  361. package/skills/void/docs/node_modules/void/node_modules/drizzle-kit/README.md +0 -79
  362. package/skills/void/docs/node_modules/void/node_modules/drizzle-orm/README.md +0 -44
  363. package/skills/void/docs/node_modules/void/node_modules/drizzle-valibot/README.md +0 -51
  364. package/skills/void/docs/node_modules/void/node_modules/drizzle-zod/README.md +0 -65
  365. package/skills/void/docs/node_modules/void/node_modules/es-module-lexer/README.md +0 -403
  366. package/skills/void/docs/node_modules/void/node_modules/estree-walker/README.md +0 -48
  367. package/skills/void/docs/node_modules/void/node_modules/hono/README.md +0 -85
  368. package/skills/void/docs/node_modules/void/node_modules/ignore/README.md +0 -452
  369. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/CHANGELOG.md +0 -76
  370. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/LICENSE.md +0 -21
  371. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/README.md +0 -364
  372. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/SECURITY.md +0 -41
  373. package/skills/void/docs/node_modules/void/node_modules/magic-string/README.md +0 -325
  374. package/skills/void/docs/node_modules/void/node_modules/ofetch/README.md +0 -398
  375. package/skills/void/docs/node_modules/void/node_modules/pathslash/README.md +0 -64
  376. package/skills/void/docs/node_modules/void/node_modules/pg/README.md +0 -96
  377. package/skills/void/docs/node_modules/void/node_modules/pglite-server/README.md +0 -135
  378. package/skills/void/docs/node_modules/void/node_modules/picocolors/README.md +0 -21
  379. package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/CHANGELOG.md +0 -108
  380. package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/README.md +0 -183
  381. package/skills/void/docs/node_modules/void/node_modules/tinyglobby/README.md +0 -25
  382. package/skills/void/docs/node_modules/void/node_modules/valibot/LICENSE.md +0 -9
  383. package/skills/void/docs/node_modules/void/node_modules/valibot/README.md +0 -94
  384. package/skills/void/docs/node_modules/void/node_modules/vite-plus/AGENTS.md +0 -16
  385. package/skills/void/docs/node_modules/void/node_modules/vite-plus/README.md +0 -220
  386. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/build.md +0 -21
  387. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/check.md +0 -35
  388. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/create.md +0 -70
  389. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/fmt.md +0 -20
  390. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/index.md +0 -35
  391. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/lint.md +0 -26
  392. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/pack.md +0 -17
  393. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/run.md +0 -364
  394. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/staged.md +0 -15
  395. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/test.md +0 -18
  396. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +0 -145
  397. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/build.md +0 -40
  398. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/cache.md +0 -107
  399. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/check.md +0 -60
  400. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ci.md +0 -62
  401. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/commit-hooks.md +0 -60
  402. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/create.md +0 -341
  403. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/dev.md +0 -24
  404. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/docker.md +0 -175
  405. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/env.md +0 -167
  406. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/fmt.md +0 -41
  407. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/github-actions-cache.md +0 -165
  408. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ide-integration.md +0 -101
  409. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/implode.md +0 -23
  410. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/index.md +0 -134
  411. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/install.md +0 -199
  412. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/lint.md +0 -50
  413. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate-rules.md +0 -347
  414. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate.md +0 -197
  415. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/monorepo.md +0 -176
  416. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/pack.md +0 -69
  417. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/run.md +0 -356
  418. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/test.md +0 -35
  419. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/troubleshooting.md +0 -108
  420. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/upgrade.md +0 -101
  421. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/vpx.md +0 -66
  422. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/why.md +0 -39
  423. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/index.md +0 -12
  424. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/team.md +0 -35
  425. package/skills/void/docs/node_modules/void/node_modules/vite-plus/templates/generator/README.md +0 -35
  426. package/skills/void/docs/node_modules/void/node_modules/vite-plus/templates/monorepo/README.md +0 -29
  427. package/skills/void/docs/node_modules/void/node_modules/wrangler/README.md +0 -63
  428. package/skills/void/docs/node_modules/void/node_modules/zod/README.md +0 -191
  429. package/skills/void/docs/node_modules/void/skills/migrate-vite-cloudflare-to-void/SKILL.md +0 -175
  430. package/skills/void/docs/node_modules/void/skills/void/SKILL.md +0 -76
  431. package/skills/void/docs/node_modules/void/skills/void/command/void.md +0 -7
  432. package/skills/void/docs/node_modules/void/test/e2e/README.md +0 -85
@@ -0,0 +1,698 @@
1
+ import { $ as resolveInstallationManifest, D as log, F as isCancel, O as note, Q as removePlatformConnectionForInstallation, U as listInstallationManifests, Y as readInstallationRecoverySecrets, Z as removeInstallationRecoverySecrets, i as createSpinner, j as select, k as outro, nt as writeInstallationManifest, w as confirm, z as acquirePlatformLifecycleLock } from "./output-tFQLLj26.mjs";
2
+ import { S as resolvePlatformCloudflareCredential, _ as hyperdriveOriginConfigHash, a as installPlatform, assertNoninteractivePlatformMutationAcknowledged, b as verifyPlatformRuntimeTokenPermissions, c as resolveBootstrapGitHubId, d as createPlatformInstallPlan, f as formatPlatformInstallPlan, g as PlatformCloudflareClient, h as revalidatePlatformInstallAction, i as createPlatformInstallationSecrets, m as platformProvisionIntentHash, n as acquirePlatformDatabaseLifecycleLock, o as loadPlatformRuntime, p as platformAdoptionIntentHash, resolvePlatformInstallDatabaseUrl, t as REMOTE_INSTALLATION_MANIFEST_KEY, u as trackedPlatformWorkerTraffic, v as hyperdriveOriginFromConnectionString, x as assertPlatformOperatorCredentialCanApplyPlan, y as hyperdriveOriginMatches } from "./platform-lifecycle-DN4MzJF_.mjs";
3
+ import { createHash } from "node:crypto";
4
+ import { PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE, PLATFORM_R2_OWNERSHIP_MARKER_KEY, createPlatformResourceOwnershipMarker, parsePlatformInstallationManifest, parsePlatformResourceOwnershipMarker, recordInstallationResource, recordInstallationStep, setInstallationDesiredState, transitionInstallation } from "@void/platform";
5
+ //#region src/cli/platform-management.ts
6
+ async function verifyPlatformInstallationOwnership(client, manifest, options = {}) {
7
+ const ready = manifest.resources.filter((resource) => resource.state === "ready" && isOwnershipVerifiableKind(resource.kind) && !options.retainedReplacementKeys?.has(resource.key));
8
+ if (!ready.find((resource) => resource.key === "routing-kv")) {
9
+ const unsafe = ready.filter((resource) => resource.kind !== "zone");
10
+ if (unsafe.length > 0) throw ownershipError(`the remote installation checkpoint is missing for ${unsafe[0].kind} ${unsafe[0].name}`);
11
+ const zone = ready.find((resource) => resource.kind === "zone");
12
+ if (zone) {
13
+ if ((await client.findZone(manifest.account.id, zone.name))?.id !== zone.id) throw ownershipError(`zone ${zone.name} was replaced`);
14
+ }
15
+ return;
16
+ }
17
+ await verifyPlatformMutationOwnership(client, manifest, new Set(ready.map((resource) => resource.key)), options);
18
+ }
19
+ function selectAuthoritativePlatformManifest(local, authoritative) {
20
+ if (!authoritative) return local;
21
+ if (authoritative.id !== local.id || authoritative.ownershipNonce !== local.ownershipNonce || authoritative.account.id !== local.account.id) throw new Error("platform: The authoritative lifecycle state belongs to another installation.");
22
+ return authoritative;
23
+ }
24
+ async function runInstalledPlatformCommand(args) {
25
+ if (args.subcommand !== "upgrade" && args.subcommand !== "rollback" && args.subcommand !== "repair" && args.subcommand !== "disable" && args.subcommand !== "enable" && args.subcommand !== "uninstall") throw new Error(`platform: Unsupported lifecycle command ${args.subcommand}.`);
26
+ assertNoninteractivePlatformMutationAcknowledged(args, process.stdin.isTTY === true);
27
+ const manifest = await resolveInstalledPlatformManifest(args.selector);
28
+ const operatorCredential = await resolvePlatformCloudflareCredential();
29
+ const operatorClient = new PlatformCloudflareClient(operatorCredential.token);
30
+ const runtime = args.subcommand === "uninstall" || args.subcommand === "disable" ? null : loadPlatformRuntime(args.runtime);
31
+ const rollbackSourceRuntime = args.subcommand === "rollback" ? loadPlatformRuntime(args.fromRuntime) : null;
32
+ let progress;
33
+ let reportResult;
34
+ const execute = async (currentManifest, databaseLock, databaseCheckpointExists = false) => {
35
+ const manifest = currentManifest;
36
+ if (args.subcommand === "rollback") assertPlatformRollbackCompatibility(manifest, runtime, rollbackSourceRuntime);
37
+ const recovery = readInstallationRecoverySecrets(manifest);
38
+ const gatewayToken = process.env.VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN || recovery?.cloudflareApiToken;
39
+ const client = operatorCredential.source === "oauth" && gatewayToken ? operatorClient.withAiGatewayToken(gatewayToken) : operatorClient;
40
+ const databaseUrl = resolvePlatformInstallDatabaseUrl(recovery, manifest);
41
+ if (args.subcommand === "disable") {
42
+ await disablePlatform(client, manifest, args.plan, {
43
+ checkpoint: databaseLock?.checkpoint,
44
+ databaseUrl
45
+ });
46
+ return;
47
+ }
48
+ if (args.subcommand === "uninstall") {
49
+ await uninstallPlatform(client, manifest, args, {
50
+ checkpoint: databaseLock?.checkpoint,
51
+ databaseUrl
52
+ });
53
+ return;
54
+ }
55
+ if (args.subcommand === "enable" && manifest.desiredState === "enabled" && manifest.status === "installed") {
56
+ log.info(`${manifest.deployment.displayName} is already enabled.`);
57
+ return;
58
+ }
59
+ const deployment = manifest.deployment;
60
+ const planInput = {
61
+ accountId: manifest.account.id,
62
+ applicationDomain: deployment.application.baseDomain,
63
+ controlPlaneDomain: deployment.controlPlane.apiHostname ?? "",
64
+ dedicatedZone: deployment.application.dedicatedZone,
65
+ displayName: deployment.displayName,
66
+ installationSlug: deployment.installationSlug,
67
+ zoneName: deployment.application.zoneName
68
+ };
69
+ const plan = await createPlatformInstallPlan(client, planInput, manifest, {
70
+ authoritativeProvisionIntents: databaseCheckpointExists,
71
+ repairMissing: args.subcommand === "repair",
72
+ allowUnverifiedAiGateway: args.plan
73
+ });
74
+ note(formatPlatformInstallPlan(plan), args.subcommand === "upgrade" ? "Upgrade plan" : args.subcommand === "rollback" ? "Rollback plan" : args.subcommand === "enable" ? "Enable plan" : "Repair plan");
75
+ note([
76
+ `Version: ${runtime.manifest.platformVersion}`,
77
+ `Source: ${runtime.source}`,
78
+ `Revision: ${runtime.manifest.sourceRevision ?? "not recorded"}`,
79
+ `Manifest SHA-256: ${runtime.manifestSha256}`
80
+ ].join("\n"), "Platform runtime");
81
+ if (args.plan) {
82
+ outro("No Cloudflare or local installation state was changed.");
83
+ return;
84
+ }
85
+ assertPlatformOperatorCredentialCanApplyPlan(operatorCredential, plan);
86
+ progress = createSpinner({ onCancel: () => {
87
+ if (!process.emit("SIGINT")) process.exit(130);
88
+ } });
89
+ progress.start(args.subcommand === "upgrade" ? "Upgrading the platform" : args.subcommand === "rollback" ? "Rolling back the platform" : args.subcommand === "enable" ? "Enabling the platform" : "Repairing the platform");
90
+ const repairingMissingRoutingCheckpoint = args.subcommand === "repair" && plan.actions.some((action) => action.key === "routing-kv" && action.action === "create" && action.id === null);
91
+ await verifyPlatformMutationOwnership(client, manifest, new Set(manifest.resources.filter((resource) => isOwnershipVerifiableKind(resource.kind) && !plan.actions.some((action) => action.key === resource.key && action.action === "create" && action.name !== resource.name)).map((resource) => resource.key)), {
92
+ allowMissingRoutingCheckpoint: repairingMissingRoutingCheckpoint,
93
+ allowUninitializedRoutingCheckpoint: args.subcommand === "repair" && databaseCheckpointExists,
94
+ databaseUrl
95
+ });
96
+ const installation = args.subcommand === "enable" ? setInstallationDesiredState(manifest, "enabled", (/* @__PURE__ */ new Date()).toISOString()) : manifest;
97
+ if (installation !== manifest) writeInstallationManifest(installation);
98
+ const bootstrapGitHubLogin = process.env.VOID_PLATFORM_ADMIN_GITHUB_LOGIN || recovery?.bootstrapGitHubLogin || "";
99
+ const bootstrapGitHubId = process.env.VOID_PLATFORM_ADMIN_GITHUB_ID || recovery?.bootstrapGitHubId || (bootstrapGitHubLogin ? await resolveBootstrapGitHubId(bootstrapGitHubLogin) : "");
100
+ const secrets = createPlatformInstallationSecrets({
101
+ bootstrapGitHubId,
102
+ bootstrapGitHubLogin,
103
+ cloudflareApiToken: process.env.VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN || "",
104
+ checkpoint: recovery,
105
+ databaseUrl,
106
+ existingInstallation: true,
107
+ updateExistingWorkers: true,
108
+ githubClientId: process.env.VOID_PLATFORM_GITHUB_CLIENT_ID || "",
109
+ githubClientSecret: process.env.VOID_PLATFORM_GITHUB_CLIENT_SECRET || "",
110
+ jwtSecret: process.env.VOID_PLATFORM_JWT_SECRET || "",
111
+ projectSecretKey: process.env.VOID_PLATFORM_PROJECT_SECRET_KEY || "",
112
+ projectSecretKeysJson: process.env.VOID_PLATFORM_PROJECT_SECRET_KEYS_JSON || "",
113
+ projectSecretActiveKeyVersion: process.env.VOID_PLATFORM_PROJECT_SECRET_ACTIVE_KEY_VERSION || "",
114
+ r2AccessKeyId: process.env.VOID_PLATFORM_R2_ACCESS_KEY_ID || "",
115
+ r2SecretAccessKey: process.env.VOID_PLATFORM_R2_SECRET_ACCESS_KEY || ""
116
+ });
117
+ const runtimeTokenToPreflight = resolvePlatformRuntimeTokenToPreflight(plan, secrets);
118
+ if (runtimeTokenToPreflight) await verifyPlatformRuntimeTokenPermissions(new PlatformCloudflareClient(runtimeTokenToPreflight), {
119
+ accountId: manifest.account.id,
120
+ applicationDomain: deployment.application.baseDomain,
121
+ customDomains: plan.deployment.capabilities.customDomains,
122
+ zoneId: plan.zone?.id ?? null
123
+ });
124
+ const result = await installPlatform(plan, secrets, installation, {
125
+ acquireDatabaseLifecycleLock: async () => Object.assign(async () => {}, {
126
+ checkpoint: databaseLock?.checkpoint,
127
+ prepareDatabase: databaseLock?.prepareDatabase,
128
+ prepareSandboxDrain: databaseLock?.prepareSandboxDrain,
129
+ requiredSafetyProtocols: databaseLock?.requiredSafetyProtocols,
130
+ verifyDatabase: databaseLock?.verifyDatabase
131
+ }),
132
+ client,
133
+ databaseRollbackSource: rollbackSourceRuntime ?? void 0,
134
+ onProgress: (message) => progress?.message(message),
135
+ runtime,
136
+ replanWorkers: async (recoveryManifest) => (await createPlatformInstallPlan(client, planInput, recoveryManifest, {
137
+ authoritativeProvisionIntents: true,
138
+ repairMissing: true
139
+ })).actions.filter((action) => action.kind === "worker"),
140
+ revalidateBeforeWorkerDeploy: (manifest, action) => revalidatePlatformInstallAction(client, plan, manifest, action, { repairMissing: args.subcommand === "repair" })
141
+ });
142
+ progress.message("Finalizing platform changes");
143
+ reportResult = () => {
144
+ progress?.stop(result.waitingForDns || result.waitingForSandboxDrain ? "Platform operation paused; progress is saved." : `Platform ${args.subcommand} complete.`);
145
+ progress = void 0;
146
+ if (result.waitingForDns) {
147
+ note(`Wait for ${deployment.application.zoneName} to become active, then rerun this command.`, "Waiting for nameservers");
148
+ return;
149
+ }
150
+ if (result.waitingForSandboxDrain) {
151
+ note("The compatible candidate runtime is live in sandbox-drain maintenance mode and application traffic remains disabled. Preview bounded work with `void platform system sandbox-drain --plan`; follow any returned `nextCursor` with `--cursor '<value>'`. Then apply with `void platform system sandbox-drain --yes` and rerun until it reports DB-backed `complete: true`. Rerun this lifecycle command afterward to enable traffic.", "Waiting for managed Sandbox drain");
152
+ return;
153
+ }
154
+ log.success(args.subcommand === "rollback" ? `${deployment.displayName} is running compatible runtime ${runtime.manifest.platformVersion}; PostgreSQL remains at schema ${rollbackSourceRuntime.manifest.database.schemaDigest}.` : `${deployment.displayName} is healthy at ${plan.apiUrl}.`);
155
+ };
156
+ };
157
+ if (args.plan) {
158
+ await execute(manifest);
159
+ return;
160
+ }
161
+ const release = acquirePlatformLifecycleLock(manifest.account.id, manifest.deployment.installationSlug);
162
+ try {
163
+ const current = resolveInstallationManifest(manifest.id);
164
+ const recovery = readInstallationRecoverySecrets(current);
165
+ const databaseUrl = resolvePlatformInstallDatabaseUrl(recovery, current);
166
+ if (!databaseUrl) throw new Error("platform: DATABASE_URL is required to safely serialize lifecycle changes across hosts.");
167
+ const releaseDatabase = await acquirePlatformDatabaseLifecycleLock(databaseUrl, current.id, current.ownershipNonce);
168
+ try {
169
+ const authoritative = releaseDatabase.authoritativeManifest;
170
+ const databaseCheckpointExists = authoritative !== null && authoritative !== void 0;
171
+ const currentManifest = selectAuthoritativePlatformManifest(current, authoritative);
172
+ if (authoritative && JSON.stringify(authoritative) !== JSON.stringify(current)) writeInstallationManifest(authoritative);
173
+ if (!authoritative) await releaseDatabase.checkpoint?.(currentManifest);
174
+ await execute(currentManifest, releaseDatabase, databaseCheckpointExists);
175
+ } finally {
176
+ await releaseDatabase();
177
+ }
178
+ reportResult?.();
179
+ } catch (error) {
180
+ progress?.error(`Platform ${args.subcommand} failed.`);
181
+ progress = void 0;
182
+ throw error;
183
+ } finally {
184
+ try {
185
+ progress?.clear();
186
+ } finally {
187
+ release();
188
+ }
189
+ }
190
+ }
191
+ function assertPlatformRollbackCompatibility(installation, target, source) {
192
+ if (!installation.runtime) throw new Error("platform: The installed runtime has no artifact provenance, so post-success rollback cannot identify its compatibility manifest.");
193
+ if (source.manifest.platformVersion !== installation.platformVersion || source.manifestSha256 !== installation.runtime.manifestSha256) throw new Error("platform: --from-runtime does not exactly match the installed runtime artifact digest. Supply the runtime used by the current successful deployment.");
194
+ if (target.manifestSha256 === source.manifestSha256) throw new Error("platform: The rollback target is already the installed runtime artifact.");
195
+ if (target.manifest.database.lineage !== source.manifest.database.lineage) throw new Error("platform: The rollback target belongs to a different database lineage.");
196
+ const prefix = source.manifest.database.migrations.slice(0, target.manifest.database.migrations.length);
197
+ if (JSON.stringify(prefix) !== JSON.stringify(target.manifest.database.migrations)) throw new Error("platform: The rollback target database migrations are not an exact prefix of the installed runtime.");
198
+ if (!source.manifest.database.rollbackSafeFrom.some((entry) => entry.platformVersion === target.manifest.platformVersion && entry.schemaDigest === target.manifest.database.schemaDigest)) throw new Error(`platform: Installed runtime ${source.manifest.platformVersion} does not declare post-success rollback compatibility with ${target.manifest.platformVersion} at schema ${target.manifest.database.schemaDigest}.`);
199
+ if (installation.databaseSchemaDigest !== source.manifest.database.schemaDigest) throw new Error("platform: The authoritative installation checkpoint does not record the installed runtime database schema. Repair or roll forward before rollback.");
200
+ if ((target.manifest.safetyProtocols?.sandboxDrain ?? 0) < (installation.safetyProtocols?.sandboxDrain ?? 0)) throw new Error("platform: The rollback target predates the installed sandbox-drain safety protocol.");
201
+ }
202
+ function resolvePlatformRuntimeTokenToPreflight(plan, secrets) {
203
+ const explicitUpdate = secrets.workerSecretUpdates?.CF_API_TOKEN;
204
+ if (explicitUpdate) return explicitUpdate;
205
+ return plan.actions.some((action) => action.kind === "worker" && action.action === "create") ? secrets.cloudflareApiToken : "";
206
+ }
207
+ async function resolveInstalledPlatformManifest(selector, dependencies = {}) {
208
+ if (selector) return resolveInstallationManifest(selector);
209
+ const manifests = listInstallationManifests().filter((manifest) => manifest.status !== "uninstalled");
210
+ if (manifests.length <= 1) return resolveInstallationManifest("");
211
+ if (!(dependencies.interactive ?? process.stdin.isTTY)) throw new Error("platform: Multiple local installations exist; specify an installation id.");
212
+ const picked = dependencies.selectInstallation ? await dependencies.selectInstallation(manifests) : await select({
213
+ message: "Select an installed Void platform:",
214
+ options: manifests.map((manifest) => ({
215
+ hint: `${manifest.account.name} · ${manifest.id}`,
216
+ label: manifest.deployment.displayName,
217
+ value: manifest.id
218
+ }))
219
+ });
220
+ if (isCancel(picked)) throw new Error("platform: Cancelled.");
221
+ return resolveInstallationManifest(String(picked));
222
+ }
223
+ async function disablePlatform(client, initialManifest, planOnly, dependencies = {}) {
224
+ const reconciled = await recoverDurablyMarkedProvisionIntents(client, initialManifest);
225
+ const writeLifecycleCheckpoint = (checkpointClient, checkpointManifest) => writeLifecycleCheckpointWithoutDatabase(checkpointClient, checkpointManifest, dependencies.checkpoint);
226
+ const writeRemoteManifestIfPresent = (checkpointClient, checkpointManifest) => writeRemoteManifestIfPresentWithoutDatabase(checkpointClient, checkpointManifest, dependencies.checkpoint);
227
+ note("Block platform traffic through installation-owned routing storage. Retain routes and custom domains for explicit dashboard cleanup because Cloudflare cannot condition their deletion on an immutable generation. Workers and all data remain installed.", "Disable plan");
228
+ if (planOnly) {
229
+ outro("No Cloudflare or local installation state was changed.");
230
+ return;
231
+ }
232
+ const manifest = reconciled;
233
+ if (manifest !== initialManifest) writeInstallationManifest(manifest);
234
+ const alreadyDisabled = manifest.status === "disabled";
235
+ const missing = await verifyPlatformMutationOwnership(client, manifest, /* @__PURE__ */ new Set([
236
+ "routing-kv",
237
+ "zone",
238
+ ...manifest.resources.filter((resource) => resource.kind === "worker").map((resource) => resource.key)
239
+ ]), { databaseUrl: dependencies.databaseUrl });
240
+ let next = setInstallationDesiredState(manifest, "disabled", (/* @__PURE__ */ new Date()).toISOString());
241
+ writeInstallationManifest(next);
242
+ if (!alreadyDisabled) {
243
+ next = transitionInstallation(next, "disabling", (/* @__PURE__ */ new Date()).toISOString());
244
+ writeInstallationManifest(next);
245
+ }
246
+ try {
247
+ await writeRemoteManifestIfPresent(client, next);
248
+ const zone = next.resources.find((resource) => resource.key === "zone");
249
+ const routing = requireResource(next, "routing-kv");
250
+ const trafficGeneration = currentTrafficGeneration(next);
251
+ await client.putKvValue(next.account.id, routing.id, PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE);
252
+ const trackedTraffic = trackedPlatformWorkerTraffic(next);
253
+ await client.removeRoutes(next.account.id, !zone || missing.has(zone.key) ? null : zone.id, trackedTraffic);
254
+ next = markTrafficAttachmentsRetained(next);
255
+ if (!hasLifecycleStep(next, `disable:${trafficGeneration}:routes`)) next = recordLifecycleStep(next, `disable:${trafficGeneration}:routes`);
256
+ await writeLifecycleCheckpoint(client, next);
257
+ next = transitionInstallation(next, "disabled", (/* @__PURE__ */ new Date()).toISOString());
258
+ await writeLifecycleCheckpoint(client, next);
259
+ log.success(`${next.deployment.displayName} is disabled. Its data was not changed.`);
260
+ } catch (error) {
261
+ next = transitionInstallation(next, "failed", (/* @__PURE__ */ new Date()).toISOString());
262
+ writeInstallationManifest(next);
263
+ await writeRemoteManifestIfPresent(client, next).catch(() => {});
264
+ throw error;
265
+ }
266
+ }
267
+ async function uninstallPlatform(client, initialManifest, args, dependencies = {}) {
268
+ const manifest = await recoverDurablyMarkedProvisionIntents(client, initialManifest);
269
+ const writeLifecycleCheckpoint = (checkpointClient, checkpointManifest) => writeLifecycleCheckpointWithoutDatabase(checkpointClient, checkpointManifest, dependencies.checkpoint);
270
+ const writeRemoteManifestIfPresent = (checkpointClient, checkpointManifest) => writeRemoteManifestIfPresentWithoutDatabase(checkpointClient, checkpointManifest, dependencies.checkpoint);
271
+ const retainData = !args.purgeData;
272
+ const hasRoutingCheckpoint = manifest.resources.some((resource) => resource.key === "routing-kv" && resource.state === "ready");
273
+ const createdZone = manifest.resources.find((resource) => resource.key === "zone" && resource.ownership === "created");
274
+ const interactive = dependencies.interactive ?? process.stdin.isTTY;
275
+ const confirmAction = dependencies.confirm ?? promptForConfirmation;
276
+ if (createdZone && args.deleteZone === true) throw new Error(`platform: Refusing to delete Cloudflare zone ${JSON.stringify(createdZone.name)} automatically. A zone can contain unrelated DNS, settings, and products that the installer cannot exhaustively prove ownership of. Uninstall with --keep-zone, inspect the retained zone in Cloudflare, and delete it manually if appropriate.`);
277
+ const dataMessage = retainData ? "Retain installer-owned Workers, storage, dispatch, AI logs, and Hyperdrive by default." : args.purgeData ? "Delete safely identifiable installer-owned data (--purge-data); retain Workers, R2, AI Gateway, and external PostgreSQL for manual cleanup." : "Retain installer-owned data; external PostgreSQL is never deleted.";
278
+ note(`Disable all platform traffic through installation-owned routing storage.\nRetain DNS records, routes, and custom domains for explicit dashboard cleanup.\nDelete installer-owned Queues.\n${dataMessage}\n${createdZone ? `Keep zone ${createdZone.name} for explicit manual cleanup.` : "Never delete the adopted application zone."}`, "Uninstall plan");
279
+ if (args.plan) {
280
+ outro("No Cloudflare or local installation state was changed.");
281
+ return;
282
+ }
283
+ if (manifest !== initialManifest) writeInstallationManifest(manifest);
284
+ if (!interactive && !args.yes) throw new Error("platform: Non-interactive `void platform uninstall` requires --yes to acknowledge Cloudflare changes. Run with --plan first to inspect them.");
285
+ if (interactive && !args.yes) {
286
+ if (!await confirmAction(args.purgeData ? "Permanently purge installer-owned platform data?" : "Uninstall this platform?", false)) {
287
+ outro("No changes made.");
288
+ return;
289
+ }
290
+ }
291
+ const resourcesToDelete = new Set(manifest.resources.filter((resource) => shouldDeleteResource(resource, retainData) && (hasRoutingCheckpoint || resource.kind === "zone") && !(resource.kind === "dns-record" && !manifest.resources.some((entry) => entry.key === "zone"))).map((resource) => resource.key));
292
+ const ownershipTargets = /* @__PURE__ */ new Set([
293
+ ...hasRoutingCheckpoint ? ["routing-kv"] : [],
294
+ "zone",
295
+ ...manifest.resources.filter((resource) => resource.kind === "worker").map((resource) => resource.key),
296
+ ...resourcesToDelete
297
+ ]);
298
+ let missingResources;
299
+ if (hasRoutingCheckpoint) missingResources = await verifyPlatformMutationOwnership(client, manifest, ownershipTargets, {
300
+ allowDeletedRoutingCheckpoint: args.purgeData,
301
+ databaseUrl: dependencies.databaseUrl
302
+ });
303
+ else {
304
+ await verifyPlatformInstallationOwnership(client, manifest, { databaseUrl: dependencies.databaseUrl });
305
+ missingResources = /* @__PURE__ */ new Set();
306
+ }
307
+ let next = transitionInstallation(manifest, "uninstalling", (/* @__PURE__ */ new Date()).toISOString());
308
+ writeInstallationManifest(next);
309
+ try {
310
+ await writeRemoteManifestIfPresent(client, next);
311
+ const routing = next.resources.find((resource) => resource.key === "routing-kv" && resource.state === "ready");
312
+ if (routing) await client.putKvValue(next.account.id, routing.id, PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE);
313
+ for (const key of missingResources) {
314
+ const resource = requireResource(next, key);
315
+ next = updateResourceState(next, key, resource.ownership === "created" ? "deleted" : "retained");
316
+ await writeLifecycleCheckpoint(client, next);
317
+ }
318
+ const workers = new Set(next.resources.filter((resource) => resource.kind === "worker" && resource.state === "ready").map((resource) => resource.name));
319
+ const zone = next.resources.find((resource) => resource.key === "zone");
320
+ if (zone?.state === "ready") {
321
+ for (const worker of next.resources.filter((resource) => resource.kind === "worker" && resource.state === "ready" && workers.has(resource.name))) if (!(await verifyPlatformMutationOwnership(client, next, /* @__PURE__ */ new Set([
322
+ "routing-kv",
323
+ "zone",
324
+ worker.key
325
+ ]), { databaseUrl: dependencies.databaseUrl })).has(worker.key)) {
326
+ const trackedTraffic = trackedPlatformWorkerTraffic(next, /* @__PURE__ */ new Set([worker.name]));
327
+ await client.removeRoutes(next.account.id, zone.id, trackedTraffic);
328
+ next = markTrafficAttachmentsRetained(next);
329
+ next = recordLifecycleStep(next, `uninstall:routes:${worker.key}`);
330
+ await writeLifecycleCheckpoint(client, next);
331
+ }
332
+ }
333
+ const deletionPriority = {
334
+ worker: 0,
335
+ queue: 1,
336
+ "ai-gateway": 2,
337
+ "dns-record": 3,
338
+ "dispatch-namespace": 4,
339
+ hyperdrive: 5,
340
+ "kv-namespace": 6,
341
+ "r2-bucket": 7,
342
+ zone: 8
343
+ };
344
+ const resources = [...next.resources].sort((left, right) => resourceDeletionPriority(left, deletionPriority) - resourceDeletionPriority(right, deletionPriority));
345
+ for (const resource of resources) {
346
+ if (resource.state !== "ready") continue;
347
+ if (!hasRoutingCheckpoint && resource.kind !== "zone") {
348
+ next = updateResourceState(next, resource.key, "retained");
349
+ await writeLifecycleCheckpoint(client, next);
350
+ continue;
351
+ }
352
+ if (!shouldDeleteResource(resource, retainData)) {
353
+ next = updateResourceState(next, resource.key, "retained");
354
+ await writeLifecycleCheckpoint(client, next);
355
+ continue;
356
+ }
357
+ if (resource.kind === "dns-record" && !zone) {
358
+ next = updateResourceState(next, resource.key, "retained");
359
+ await writeLifecycleCheckpoint(client, next);
360
+ continue;
361
+ }
362
+ if ((await verifyPlatformMutationOwnership(client, next, /* @__PURE__ */ new Set(["routing-kv", resource.key]), {
363
+ allowDeletedRoutingCheckpoint: args.purgeData,
364
+ databaseUrl: dependencies.databaseUrl
365
+ })).has(resource.key)) {
366
+ next = updateResourceState(next, resource.key, resource.ownership === "created" ? "deleted" : "retained");
367
+ await writeLifecycleCheckpoint(client, next);
368
+ continue;
369
+ }
370
+ await client.deleteResource(next.account.id, resource.kind, resource.id, zone?.id);
371
+ next = updateResourceState(next, resource.key, "deleted");
372
+ await writeLifecycleCheckpoint(client, next);
373
+ }
374
+ const completed = transitionInstallation(next, "uninstalled", (/* @__PURE__ */ new Date()).toISOString());
375
+ await writeRemoteManifestIfPresent(client, completed);
376
+ next = completed;
377
+ writeInstallationManifest(completed);
378
+ if (!retainData) removeInstallationRecoverySecrets(next);
379
+ removePlatformConnectionForInstallation(next.id);
380
+ log.success(retainData ? `${next.deployment.displayName} was uninstalled; data resources were retained and recorded in ${next.id}.` : `${next.deployment.displayName} was uninstalled.`);
381
+ } catch (error) {
382
+ next = transitionInstallation(next, "failed", (/* @__PURE__ */ new Date()).toISOString());
383
+ writeInstallationManifest(next);
384
+ await writeRemoteManifestIfPresent(client, next).catch(() => {});
385
+ throw error;
386
+ }
387
+ }
388
+ async function recoverDurablyMarkedProvisionIntents(client, manifest) {
389
+ const pending = [
390
+ [
391
+ "api-worker",
392
+ "worker",
393
+ manifest.deployment.resources.apiWorker
394
+ ],
395
+ [
396
+ "proxy-worker",
397
+ "worker",
398
+ manifest.deployment.resources.proxyWorker
399
+ ],
400
+ [
401
+ "tail-worker",
402
+ "worker",
403
+ manifest.deployment.resources.tailWorker
404
+ ],
405
+ [
406
+ "dispatch-worker",
407
+ "worker",
408
+ manifest.deployment.resources.dispatchWorker
409
+ ],
410
+ [
411
+ "assets-bucket",
412
+ "r2-bucket",
413
+ manifest.deployment.resources.assetsBucket
414
+ ]
415
+ ].filter(([key, kind, name]) => !manifest.resources.some((resource) => resource.key === key) && manifest.steps.some((step) => (step.key === `provision-intent:${key}` || step.key.startsWith(`provision-intent:${key}:`)) && step.resultHash === platformProvisionIntentHash(manifest, key, kind, name)));
416
+ if (pending.length === 0) return manifest;
417
+ const [workers, buckets] = await Promise.all([client.listWorkerNames(manifest.account.id), client.listR2Buckets(manifest.account.id)]);
418
+ let recovered = manifest;
419
+ for (const [key, kind, name] of pending) {
420
+ const live = kind === "worker" ? workers.includes(name) ? {
421
+ id: name,
422
+ name
423
+ } : null : buckets.find((bucket) => bucket.name === name) ?? null;
424
+ if (!live) continue;
425
+ const resource = {
426
+ configHash: createHash("sha256").update(JSON.stringify({
427
+ kind,
428
+ name
429
+ })).digest("hex"),
430
+ id: live.id,
431
+ key,
432
+ kind,
433
+ name,
434
+ ownership: "created",
435
+ state: "ready"
436
+ };
437
+ verifyResourceMarker(kind === "worker" ? (await client.getWorkerPlainTextBindings(manifest.account.id, name)).PLATFORM_OWNERSHIP_MARKER : await client.getR2Object(manifest.account.id, name, PLATFORM_R2_OWNERSHIP_MARKER_KEY), manifest, resource);
438
+ recovered = recordInstallationResource(recovered, resource, manifest.updatedAt);
439
+ }
440
+ return recovered;
441
+ }
442
+ const DATA_RESOURCE_KINDS = /* @__PURE__ */ new Set([
443
+ "ai-gateway",
444
+ "dispatch-namespace",
445
+ "hyperdrive",
446
+ "kv-namespace",
447
+ "r2-bucket"
448
+ ]);
449
+ function isOwnershipVerifiableKind(kind) {
450
+ return kind === "ai-gateway" || kind === "dispatch-namespace" || kind === "dns-record" || kind === "hyperdrive" || kind === "kv-namespace" || kind === "queue" || kind === "r2-bucket" || kind === "worker" || kind === "zone";
451
+ }
452
+ function shouldDeleteResource(resource, retainData) {
453
+ if (resource.state !== "ready" || resource.ownership !== "created") return false;
454
+ if (resource.kind === "zone") return false;
455
+ if (resource.kind === "ai-gateway") return false;
456
+ if (resource.kind === "dns-record") return false;
457
+ if (resource.kind === "r2-bucket") return false;
458
+ if (resource.kind === "worker") return false;
459
+ if (resource.kind === "worker-route" || resource.kind === "worker-custom-domain") return false;
460
+ return !(retainData && DATA_RESOURCE_KINDS.has(resource.kind));
461
+ }
462
+ function resourceDeletionPriority(resource, priorities) {
463
+ return resource.key === "routing-kv" ? 100 : priorities[resource.kind] ?? 99;
464
+ }
465
+ async function verifyPlatformMutationOwnership(client, manifest, targetKeys, options = {}) {
466
+ const routing = requireResource(manifest, "routing-kv");
467
+ const targetResources = manifest.resources.filter((resource) => targetKeys.has(resource.key) && resource.state === "ready");
468
+ let rawRemote = null;
469
+ let remote = null;
470
+ let replacingMissingRoutingCheckpoint = false;
471
+ for (let attempt = 0; attempt < 3; attempt++) {
472
+ rawRemote = await client.getKvValue(manifest.account.id, routing.id, REMOTE_INSTALLATION_MANIFEST_KEY);
473
+ if (rawRemote !== null) {
474
+ try {
475
+ remote = parsePlatformInstallationManifest(JSON.parse(rawRemote));
476
+ } catch {
477
+ throw ownershipError("the remote installation checkpoint is invalid");
478
+ }
479
+ if (remote.id !== manifest.id || remote.ownershipNonce !== manifest.ownershipNonce || remote.account.id !== manifest.account.id) throw ownershipError("the remote installation identity does not match this installation");
480
+ if (targetResources.every((resource) => hasMatchingResourceProof(remote, resource))) break;
481
+ }
482
+ if (attempt < 2) await new Promise((resolve) => setTimeout(resolve, 50 * 2 ** attempt));
483
+ }
484
+ if (rawRemote === null) {
485
+ if ((options.allowMissingRoutingCheckpoint || options.allowUninitializedRoutingCheckpoint) && routing.ownership === "created") {
486
+ const namespaces = await client.listKvNamespaces(manifest.account.id);
487
+ const routingMatches = namespaces.some((entry) => entry.id === routing.id && entry.name === routing.name);
488
+ const routingIdentityCollides = namespaces.some((entry) => entry.id === routing.id || entry.name === routing.name);
489
+ if (options.allowMissingRoutingCheckpoint && !routingIdentityCollides || options.allowUninitializedRoutingCheckpoint && routingMatches) {
490
+ remote = manifest;
491
+ replacingMissingRoutingCheckpoint = true;
492
+ }
493
+ }
494
+ if (!replacingMissingRoutingCheckpoint && options.allowDeletedRoutingCheckpoint && canResumeAfterRoutingCheckpointDeletion(manifest, targetKeys)) {
495
+ if (!(await client.listKvNamespaces(manifest.account.id)).some((entry) => entry.id === routing.id)) return /* @__PURE__ */ new Set([routing.key]);
496
+ }
497
+ if (!replacingMissingRoutingCheckpoint) throw ownershipError("the remote installation checkpoint is missing");
498
+ }
499
+ if (!remote) throw ownershipError("the remote installation checkpoint is missing");
500
+ const localAdvancesRemote = isPlatformManifestMonotonicExtension(remote, manifest);
501
+ for (const resource of targetResources) {
502
+ const proof = remote.resources.find((entry) => entry.key === resource.key);
503
+ if (!hasMatchingResourceProof(remote, resource)) {
504
+ if (!proof && localAdvancesRemote && resource.kind !== "ai-gateway" && hasMatchingResourceIntent(remote, resource)) continue;
505
+ throw ownershipError(`the remote checkpoint does not own ${resource.kind} ${resource.name}`);
506
+ }
507
+ }
508
+ const missing = new Set(replacingMissingRoutingCheckpoint ? [routing.key] : []);
509
+ const accountId = manifest.account.id;
510
+ const zone = manifest.resources.find((resource) => resource.key === "zone");
511
+ const [aiGateways, dispatchNamespaces, hyperdrives, kvNamespaces, r2Buckets, workerNames] = await Promise.all([
512
+ client.listAiGateways(accountId),
513
+ client.listDispatchNamespaces(accountId),
514
+ client.listHyperdriveConfigs(accountId),
515
+ client.listKvNamespaces(accountId),
516
+ client.listR2Buckets(accountId),
517
+ client.listWorkerNames(accountId)
518
+ ]);
519
+ for (const resource of targetResources) {
520
+ let exists = true;
521
+ if (resource.kind === "ai-gateway") exists = hasNamedResource(aiGateways, resource);
522
+ else if (resource.kind === "dispatch-namespace") exists = hasNamedResource(dispatchNamespaces, resource);
523
+ else if (resource.kind === "hyperdrive") {
524
+ exists = hasNamedResource(hyperdrives, resource);
525
+ if (exists) {
526
+ const live = await client.getHyperdriveConfig(accountId, resource.id);
527
+ exists = live.id === resource.id && live.name === resource.name;
528
+ if (exists) {
529
+ const legacyHash = createHash("sha256").update(JSON.stringify({
530
+ kind: resource.kind,
531
+ name: resource.name
532
+ })).digest("hex");
533
+ const malformedLegacyHash = !/^[a-f0-9]{64}$/.test(resource.configHash);
534
+ if (options.databaseUrl) {
535
+ const expected = hyperdriveOriginFromConnectionString(options.databaseUrl);
536
+ if (!hyperdriveOriginMatches(live.origin, expected)) throw ownershipError(`hyperdrive ${resource.name} targets a different PostgreSQL origin than this installation's pinned database`);
537
+ const expectedHash = hyperdriveOriginConfigHash(expected);
538
+ if (resource.configHash !== expectedHash && resource.configHash !== legacyHash && !malformedLegacyHash) throw ownershipError(`hyperdrive ${resource.name} does not match the installation's database fingerprint`);
539
+ } else if (resource.configHash !== hyperdriveOriginConfigHash(live.origin) && resource.configHash !== legacyHash && !malformedLegacyHash) throw ownershipError(`hyperdrive ${resource.name} changed configuration`);
540
+ }
541
+ }
542
+ } else if (resource.kind === "kv-namespace") exists = hasNamedResource(kvNamespaces, resource);
543
+ else if (resource.kind === "queue") exists = hasNamedResource(await client.listQueues(accountId, resource.name), resource);
544
+ else if (resource.kind === "zone") exists = (await client.findZone(accountId, resource.name))?.id === resource.id;
545
+ else if (resource.kind === "dns-record") {
546
+ if (!zone) exists = false;
547
+ else {
548
+ const current = (await client.listDnsRecords(zone.id, resource.name)).find((entry) => entry.id === resource.id && entry.name === resource.name);
549
+ exists = current !== void 0;
550
+ if (current && resource.ownership === "created") {
551
+ const liveHash = dnsRecordConfigHash(current.name, current.type, current.content, current.proxied);
552
+ const legacyHash = createHash("sha256").update(JSON.stringify({
553
+ kind: resource.kind,
554
+ name: resource.name
555
+ })).digest("hex");
556
+ const expectedHash = dnsRecordConfigHash(resource.name, "AAAA", "100::", true);
557
+ if (liveHash !== resource.configHash && !(resource.configHash === legacyHash && liveHash === expectedHash)) throw ownershipError(`dns-record ${resource.name} changed configuration after installation`);
558
+ }
559
+ }
560
+ } else if (resource.kind === "worker") {
561
+ exists = workerNames.includes(resource.name);
562
+ if (exists) verifyResourceMarker((await client.getWorkerPlainTextBindings(accountId, resource.name)).PLATFORM_OWNERSHIP_MARKER, manifest, resource);
563
+ } else if (resource.kind === "r2-bucket") {
564
+ const live = r2Buckets.find((entry) => entry.id === resource.id && entry.name === resource.name);
565
+ exists = live !== void 0;
566
+ if (live) {
567
+ const liveHash = live.fingerprint ? r2BucketConfigHash(resource.name, live.fingerprint) : null;
568
+ const legacyHash = createHash("sha256").update(JSON.stringify({
569
+ kind: resource.kind,
570
+ name: resource.name
571
+ })).digest("hex");
572
+ if (liveHash === null || resource.configHash !== liveHash && resource.configHash !== legacyHash) throw ownershipError(`r2-bucket ${resource.name} changed creation fingerprint`);
573
+ verifyResourceMarker(await client.getR2Object(accountId, resource.name, PLATFORM_R2_OWNERSHIP_MARKER_KEY), manifest, resource);
574
+ }
575
+ } else throw ownershipError(`live ownership checks do not support ${resource.kind}`);
576
+ if (!exists) missing.add(resource.key);
577
+ }
578
+ return missing;
579
+ }
580
+ function hasMatchingResourceProof(manifest, resource) {
581
+ const proof = manifest.resources.find((entry) => entry.key === resource.key);
582
+ return proof?.id === resource.id && proof.kind === resource.kind && proof.name === resource.name && proof.ownership === resource.ownership;
583
+ }
584
+ function hasMatchingResourceIntent(manifest, resource) {
585
+ if (resource.ownership === "created") {
586
+ const previousResourceId = manifest.resources.find((entry) => entry.key === resource.key)?.id ?? null;
587
+ return manifest.steps.some((step) => (step.key === `provision-intent:${resource.key}` || step.key.startsWith(`provision-intent:${resource.key}:`)) && step.resultHash === platformProvisionIntentHash(manifest, resource.key, resource.kind, resource.name, previousResourceId));
588
+ }
589
+ if (resource.ownership === "adopted") return manifest.steps.some((step) => step.key === `adoption-intent:${resource.key}` && step.resultHash === platformAdoptionIntentHash(manifest, resource.key, resource.kind, resource.id, resource.name));
590
+ return false;
591
+ }
592
+ function isPlatformManifestMonotonicExtension(earlier, later) {
593
+ if (earlier.id !== later.id || earlier.ownershipNonce !== later.ownershipNonce || earlier.account.id !== later.account.id || earlier.createdAt !== later.createdAt || JSON.stringify(earlier.deployment) !== JSON.stringify(later.deployment) || Date.parse(later.updatedAt) < Date.parse(earlier.updatedAt)) return false;
594
+ const resourcesAdvance = earlier.resources.every((resource) => {
595
+ const next = later.resources.find((entry) => entry.key === resource.key);
596
+ return next?.id === resource.id && next.kind === resource.kind && next.name === resource.name && next.ownership === resource.ownership && (next.state === resource.state || resource.state === "ready" && (next.state === "deleted" || next.state === "retained"));
597
+ });
598
+ const stepsAdvance = earlier.steps.every((step) => later.steps.some((entry) => entry.key === step.key && entry.completedAt === step.completedAt && entry.resultHash === step.resultHash));
599
+ return resourcesAdvance && stepsAdvance;
600
+ }
601
+ function hasNamedResource(entries, resource) {
602
+ return entries.some((entry) => entry.id === resource.id && entry.name === resource.name);
603
+ }
604
+ function dnsRecordConfigHash(name, type, content, proxied) {
605
+ return createHash("sha256").update(JSON.stringify({
606
+ content,
607
+ kind: "dns-record",
608
+ name,
609
+ proxied,
610
+ type
611
+ })).digest("hex");
612
+ }
613
+ function r2BucketConfigHash(name, fingerprint) {
614
+ return createHash("sha256").update(JSON.stringify({
615
+ fingerprint,
616
+ kind: "r2-bucket",
617
+ name
618
+ })).digest("hex");
619
+ }
620
+ function verifyResourceMarker(value, manifest, resource) {
621
+ if (!value) throw ownershipError(`${resource.kind} ${resource.name} has no ownership marker`);
622
+ let actual;
623
+ try {
624
+ actual = parsePlatformResourceOwnershipMarker(JSON.parse(value));
625
+ } catch {
626
+ throw ownershipError(`${resource.kind} ${resource.name} has an invalid ownership marker`);
627
+ }
628
+ const expected = createPlatformResourceOwnershipMarker({
629
+ accountId: manifest.account.id,
630
+ installationId: manifest.id,
631
+ ownershipNonce: manifest.ownershipNonce,
632
+ resourceId: resource.id,
633
+ resourceKey: resource.key,
634
+ resourceKind: resource.kind,
635
+ resourceName: resource.name
636
+ });
637
+ if (JSON.stringify(actual) !== JSON.stringify(expected)) throw ownershipError(`${resource.kind} ${resource.name} belongs to another installation`);
638
+ }
639
+ function canResumeAfterRoutingCheckpointDeletion(manifest, targetKeys) {
640
+ if (manifest.status !== "failed" && manifest.status !== "uninstalling") return false;
641
+ return manifest.resources.every((resource) => resource.key === "routing-kv" || !targetKeys.has(resource.key) || resource.state !== "ready");
642
+ }
643
+ function ownershipError(reason) {
644
+ return /* @__PURE__ */ new Error(`platform: Refusing to change Cloudflare resources because ${reason}. Run \`void platform repair\` to restore ownership proofs before retrying.`);
645
+ }
646
+ function requireResource(manifest, key) {
647
+ const resource = manifest.resources.find((entry) => entry.key === key);
648
+ if (!resource) throw new Error(`platform: Installation manifest is missing ${key}.`);
649
+ return resource;
650
+ }
651
+ function updateResourceState(manifest, key, state) {
652
+ const resource = requireResource(manifest, key);
653
+ return recordInstallationResource(manifest, {
654
+ ...resource,
655
+ state
656
+ }, (/* @__PURE__ */ new Date()).toISOString());
657
+ }
658
+ function markTrafficAttachmentsRetained(manifest) {
659
+ let next = manifest;
660
+ for (const resource of manifest.resources) if (resource.state === "ready" && (resource.kind === "worker-route" || resource.kind === "worker-custom-domain")) next = updateResourceState(next, resource.key, "retained");
661
+ return next;
662
+ }
663
+ function hasLifecycleStep(manifest, key) {
664
+ return manifest.steps.some((step) => step.key === key);
665
+ }
666
+ function currentTrafficGeneration(manifest) {
667
+ return Math.max(0, ...manifest.steps.flatMap((step) => {
668
+ const match = /^traffic-enabled:(\d+)$/.exec(step.key);
669
+ return match ? [Number(match[1])] : [];
670
+ }));
671
+ }
672
+ function recordLifecycleStep(manifest, key) {
673
+ const now = (/* @__PURE__ */ new Date()).toISOString();
674
+ return recordInstallationStep(manifest, {
675
+ completedAt: now,
676
+ key,
677
+ resultHash: "completed"
678
+ }, now);
679
+ }
680
+ async function writeLifecycleCheckpointWithoutDatabase(client, manifest, databaseCheckpoint) {
681
+ writeInstallationManifest(manifest);
682
+ await writeRemoteManifestIfPresentWithoutDatabase(client, manifest, databaseCheckpoint);
683
+ }
684
+ async function writeRemoteManifestIfPresentWithoutDatabase(client, manifest, databaseCheckpoint) {
685
+ await databaseCheckpoint?.(manifest);
686
+ const routing = manifest.resources.find((resource) => resource.key === "routing-kv" && resource.state !== "deleted");
687
+ if (routing) await client.putKvValue(manifest.account.id, routing.id, REMOTE_INSTALLATION_MANIFEST_KEY, JSON.stringify(manifest));
688
+ }
689
+ async function promptForConfirmation(message, initialValue) {
690
+ const answer = await confirm({
691
+ message,
692
+ initialValue
693
+ });
694
+ if (isCancel(answer) || typeof answer === "symbol") throw new Error("platform: Cancelled.");
695
+ return answer;
696
+ }
697
+ //#endregion
698
+ export { isPlatformManifestMonotonicExtension, recoverDurablyMarkedProvisionIntents, resolveInstalledPlatformManifest, runInstalledPlatformCommand, selectAuthoritativePlatformManifest, verifyPlatformInstallationOwnership };