void 0.10.12 → 0.20.0

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 (431) 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-CYVhSNFy.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-CkVD1uOh.mjs} +6 -4
  11. package/dist/{cache-C11V8Fxq.mjs → cache-QcUfR-ff.mjs} +9 -5
  12. package/dist/{cancel-deploy-fwFYF04b.mjs → cancel-deploy-DsvWKFTe.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 +1592 -153
  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-CyCHWSO_.mjs} +61 -463
  20. package/dist/cloudflare-auth-DRkGe7-s.mjs +170 -0
  21. package/dist/cloudflare-cmd-D3ME2GAe.mjs +62 -0
  22. package/dist/cloudflare-connect-BivMefMA.mjs +56 -0
  23. package/dist/cloudflare-operations-CPTpRW6d.mjs +566 -0
  24. package/dist/{config-BkTvs43g.mjs → config-BQFq7QvD.mjs} +85 -41
  25. package/dist/{config-CutEMNGJ.mjs → config-NOG_U1aK.mjs} +10 -15
  26. package/dist/connect-D9Yr-T5f.mjs +79 -0
  27. package/dist/{create-project-DsYvl3TB.mjs → create-project-DMV-csEm.mjs} +26 -16
  28. package/dist/database-provider.d.mts +21 -0
  29. package/dist/database-provider.mjs +6 -0
  30. package/dist/{db-DOiJMRt2.mjs → db-BxoUWL0F.mjs} +600 -115
  31. package/dist/{delete-mh6p-zkQ.mjs → delete-iJOqxBz1.mjs} +9 -6
  32. package/dist/{deploy-u7Rv9q_q.mjs → deploy-CcDoeBIf.mjs} +3451 -1986
  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-gu_iaHmn.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-r6DHJyAB.mjs +262 -0
  44. package/dist/{entry-D7yy4xVH.mjs → entry-DU3oDoQ3.mjs} +2 -2
  45. package/dist/env-D4Emu-M_.mjs +95 -0
  46. package/dist/env-DmU2To0C.mjs +73 -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-o_w-8yI8.mjs → gen-BKw6qHIg.mjs} +70 -15
  52. package/dist/{github-cmd-DKcGUNsj.mjs → github-cmd-DJS5Ab-H.mjs} +39 -31
  53. package/dist/{handler-Cjh8uM3Y.d.mts → handler-D1hLsObx.d.mts} +124 -122
  54. package/dist/{head-nmvOgFjd.d.mts → head-Do8P4puT.d.mts} +9 -8
  55. package/dist/{headers-nsHIFixA.mjs → headers-D8QfRX9Y.mjs} +12 -10
  56. package/dist/inbound-BJ70in1n.d.mts +354 -0
  57. package/dist/inbound-CNKxb3FY.mjs +694 -0
  58. package/dist/index.d.mts +61 -34
  59. package/dist/index.mjs +1048 -321
  60. package/dist/{init-3rgHKBVi.mjs → init-Dx5cgKqK.mjs} +329 -271
  61. package/dist/link-D_rm5sRH.mjs +52 -0
  62. package/dist/{list-CPwFDZ_c.mjs → list-M8XShti7.mjs} +37 -5
  63. package/dist/{runner-kapo9aPs.mjs → local-d1-BE8KBbMy.mjs} +116 -6
  64. package/dist/{login-BT3H8PN3.mjs → login-C8-UuLnp.mjs} +17 -15
  65. package/dist/{logs-Bt313ax7.mjs → logs-DwFU7dMW.mjs} +16 -2
  66. package/dist/mime-BJD7d_qL.mjs +1216 -0
  67. package/dist/neon-DHwd2zvC.mjs +54 -0
  68. package/dist/{node-Da0UcsGA.mjs → node-BkaXcpAc.mjs} +29 -8
  69. package/dist/operator-cmd-DYWRbWUA.mjs +348 -0
  70. package/dist/{agents-CtgBYqld.mjs → output-tFQLLj26.mjs} +676 -211
  71. package/dist/{package-json-Cx1osYo6.mjs → package-json-CPoWX79C.mjs} +1 -1
  72. package/dist/pages/client.d.mts +43 -41
  73. package/dist/pages/client.mjs +40 -33
  74. package/dist/pages/head-client.d.mts +10 -12
  75. package/dist/pages/head.d.mts +1 -1
  76. package/dist/pages/index.d.mts +37 -14
  77. package/dist/pages/index.mjs +5 -5
  78. package/dist/pages/islands-plugin.d.mts +25 -27
  79. package/dist/pages/islands-plugin.mjs +6 -4
  80. package/dist/pages/prefetch.d.mts +6 -7
  81. package/dist/pages/protocol.d.mts +2 -2
  82. package/dist/pages/protocol.mjs +2 -1
  83. package/dist/pages/serialize.d.mts +7 -8
  84. package/dist/platform-cmd-BEOVv1PN.mjs +123 -0
  85. package/dist/platform-domain-BszUfiS8.mjs +228 -0
  86. package/dist/platform-lifecycle-CjSr6xf0.mjs +4450 -0
  87. package/dist/platform-management-W30iCaTL.mjs +698 -0
  88. package/dist/platform-recovery-pHHv4ZSg.mjs +99 -0
  89. package/dist/{plugin-inference-DMeavIJ6.mjs → plugin-inference-BDRfZngg.mjs} +35 -19
  90. package/dist/prepare-BfJvFUtJ.mjs +14 -0
  91. package/dist/{prepare-BoKHgMNx.mjs → prepare-CBetXvsN.mjs} +15 -24
  92. package/dist/{preset-BjyR3lzz.mjs → preset-lAy0B0BQ.mjs} +25 -212
  93. package/dist/{project-cmd-D_w-4w5B.mjs → project-cmd-DCpk1cDt.mjs} +25 -12
  94. package/dist/{project-paths-BQd7OmIo.mjs → project-paths-SK8nMHPp.mjs} +3 -1
  95. package/dist/{project-tsconfig-B-QtXjLQ.mjs → project-tsconfig-Ql2XsSQp.mjs} +2 -2
  96. package/dist/{protocol-Bnb0LFp3.d.mts → protocol-C-pqYJjE.d.mts} +3 -4
  97. package/dist/{provision-rShh6MKY.mjs → provision-Blnstcm2.mjs} +78 -45
  98. package/dist/r2-conditions-D1Wk8i7b.mjs +30 -0
  99. package/dist/{requests-B8sZxaFM.mjs → requests-Dn8Vheh1.mjs} +5 -3
  100. package/dist/{resolve-project-BBMtLLV9.mjs → resolve-project--Vxawf7z.mjs} +2 -2
  101. package/dist/rollback-CtlPXEBi.mjs +166 -0
  102. package/dist/{rolldown-runtime-DJK8HYOj.mjs → rolldown-runtime-rQ84J-ij.mjs} +1 -1
  103. package/dist/{route-types-COI2DsZv.mjs → route-types-Da-DpyUp.mjs} +85 -26
  104. package/dist/routes-stub.d.mts +22 -23
  105. package/dist/runner-mysql-CgRFl3s6.mjs +61 -0
  106. package/dist/{runner-pg-CHM76xuC.mjs → runner-pg-DCkWPsWS.mjs} +18 -6
  107. package/dist/runtime/ai.d.mts +21 -14
  108. package/dist/runtime/ai.mjs +5 -4
  109. package/dist/runtime/auth-client-react.d.mts +3 -5
  110. package/dist/runtime/auth-client-solid.d.mts +3 -5
  111. package/dist/runtime/auth-client-svelte.d.mts +3 -5
  112. package/dist/runtime/auth-client-vue.d.mts +3 -5
  113. package/dist/runtime/auth-client.d.mts +3 -5
  114. package/dist/runtime/auth.d.mts +1 -1
  115. package/dist/runtime/better-auth-mysql.d.mts +10 -0
  116. package/dist/runtime/better-auth-mysql.mjs +49 -0
  117. package/dist/runtime/better-auth-pg.d.mts +8 -9
  118. package/dist/runtime/better-auth-pg.mjs +2 -2
  119. package/dist/runtime/better-auth.d.mts +8 -9
  120. package/dist/runtime/better-auth.mjs +2 -2
  121. package/dist/runtime/client-react.d.mts +1 -1
  122. package/dist/runtime/client-solid.d.mts +1 -1
  123. package/dist/runtime/client-svelte.d.mts +1 -1
  124. package/dist/runtime/client-vue.d.mts +1 -1
  125. package/dist/runtime/client.d.mts +1 -1
  126. package/dist/runtime/db-mysql.d.mts +2 -0
  127. package/dist/runtime/db-mysql.mjs +1 -0
  128. package/dist/runtime/db.d.mts +10 -11
  129. package/dist/runtime/durable.d.mts +47 -0
  130. package/dist/runtime/durable.mjs +146 -0
  131. package/dist/runtime/email/testing.d.mts +112 -0
  132. package/dist/runtime/email/testing.mjs +283 -0
  133. package/dist/runtime/email.d.mts +30 -0
  134. package/dist/runtime/email.mjs +573 -0
  135. package/dist/runtime/env-helpers.d.mts +2 -2
  136. package/dist/runtime/env-helpers.mjs +5 -42
  137. package/dist/runtime/env-public-client.d.mts +10 -11
  138. package/dist/runtime/env-public-client.mjs +1 -1
  139. package/dist/runtime/env-public.d.mts +2 -2
  140. package/dist/runtime/env-public.mjs +104 -49
  141. package/dist/runtime/env.d.mts +19 -18
  142. package/dist/runtime/env.mjs +15 -2
  143. package/dist/runtime/fetch-stream.d.mts +20 -21
  144. package/dist/runtime/fetch.d.mts +15 -16
  145. package/dist/runtime/handler.d.mts +1 -1
  146. package/dist/runtime/isr.d.mts +21 -22
  147. package/dist/runtime/isr.mjs +26 -8
  148. package/dist/runtime/kv.d.mts +9 -10
  149. package/dist/runtime/live-client.d.mts +5 -7
  150. package/dist/runtime/live-client.mjs +9 -7
  151. package/dist/runtime/live-server.d.mts +4 -5
  152. package/dist/runtime/live.d.mts +22 -24
  153. package/dist/runtime/live.mjs +1 -1
  154. package/dist/runtime/log.d.mts +16 -17
  155. package/dist/runtime/migration-handler-mysql.d.mts +4 -0
  156. package/dist/runtime/migration-handler-mysql.mjs +81 -0
  157. package/dist/runtime/migration-handler-pg.d.mts +2 -4
  158. package/dist/runtime/migration-handler.d.mts +5 -6
  159. package/dist/runtime/migration-handler.mjs +4 -3
  160. package/dist/runtime/queues.d.mts +3 -4
  161. package/dist/runtime/queues.mjs +2 -1
  162. package/dist/runtime/remote/binding-handler.d.mts +10 -12
  163. package/dist/runtime/remote/binding-handler.mjs +24 -3
  164. package/dist/runtime/remote/index.d.mts +5 -6
  165. package/dist/runtime/remote/index.mjs +21 -18
  166. package/dist/runtime/response.d.mts +10 -11
  167. package/dist/runtime/sandbox.d.mts +56 -55
  168. package/dist/runtime/sandbox.mjs +57 -49
  169. package/dist/runtime/schema-mysql.d.mts +1 -0
  170. package/dist/runtime/schema-mysql.mjs +2 -0
  171. package/dist/runtime/seed.d.mts +14 -9
  172. package/dist/runtime/sse-client.d.mts +6 -7
  173. package/dist/runtime/sse.d.mts +11 -12
  174. package/dist/runtime/storage.d.mts +3 -4
  175. package/dist/runtime/validator.d.mts +1 -1
  176. package/dist/runtime/ws-server.d.mts +12 -12
  177. package/dist/runtime/ws-server.mjs +32 -4
  178. package/dist/runtime/ws.d.mts +19 -21
  179. package/dist/{scan-DYXkrasO.mjs → scan-BMH4rzlv.mjs} +53 -31
  180. package/dist/{scan-DEwlM_Xy.mjs → scan-CpK-57ug.mjs} +9 -5
  181. package/dist/{secret-Dt32J6RI.mjs → secret-BqTxGqki.mjs} +62 -5
  182. package/dist/{skills-CLjN0uUO.mjs → skills-Q46GZMO-.mjs} +6 -4
  183. package/dist/{standard-schema-DJ0HW7QP.d.mts → standard-schema-Fo_vCAZh.d.mts} +6 -6
  184. package/dist/{subcommand-prompt-BzV8iQZo.mjs → subcommand-prompt-WfySCQ7S.mjs} +67 -48
  185. package/dist/sveltekit.d.mts +12 -11
  186. package/dist/sveltekit.mjs +1 -1
  187. package/dist/types-BAp5AEBU.d.mts +79 -0
  188. package/dist/types-CKWnYgfy.d.mts +1 -0
  189. package/dist/{validate-Cw_RLeTj.mjs → validate-Bihr8WBi.mjs} +3 -3
  190. package/dist/wrangler--imS8n0d.mjs +1796 -0
  191. package/dist/{yarn-pnp-DJn3SAHF.mjs → yarn-pnp-DxSInkzL.mjs} +1 -1
  192. package/package.json +79 -65
  193. package/schema.json +35 -3
  194. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +1 -1
  195. package/skills/void/SKILL.md +59 -2
  196. package/skills/void/docs/guide/ai.md +32 -14
  197. package/skills/void/docs/guide/app-types.md +6 -6
  198. package/skills/void/docs/guide/auth.md +14 -16
  199. package/skills/void/docs/guide/database/d1.md +6 -0
  200. package/skills/void/docs/guide/database/mysql.md +60 -0
  201. package/skills/void/docs/guide/database/postgresql.md +14 -9
  202. package/skills/void/docs/guide/database.md +39 -26
  203. package/skills/void/docs/guide/deployment.md +163 -22
  204. package/skills/void/docs/guide/durable-state.md +140 -0
  205. package/skills/void/docs/guide/edge/headers.md +5 -5
  206. package/skills/void/docs/guide/edge/prerendering.md +2 -0
  207. package/skills/void/docs/guide/edge/revalidation.md +21 -6
  208. package/skills/void/docs/guide/edge/rewrites.md +18 -14
  209. package/skills/void/docs/guide/edge/static-assets.md +23 -8
  210. package/skills/void/docs/guide/email.md +609 -0
  211. package/skills/void/docs/guide/env-migration.md +109 -0
  212. package/skills/void/docs/guide/env-vars.md +70 -248
  213. package/skills/void/docs/guide/index.md +15 -17
  214. package/skills/void/docs/guide/jobs.md +8 -5
  215. package/skills/void/docs/guide/live.md +7 -15
  216. package/skills/void/docs/guide/pages-routing/actions-and-forms.md +8 -4
  217. package/skills/void/docs/guide/pages-routing/islands.md +3 -3
  218. package/skills/void/docs/guide/pages-routing/loaders.md +6 -4
  219. package/skills/void/docs/guide/pages-routing/overview.md +7 -7
  220. package/skills/void/docs/guide/platform-administration.md +212 -0
  221. package/skills/void/docs/guide/platform-development.md +235 -0
  222. package/skills/void/docs/guide/queues.md +10 -10
  223. package/skills/void/docs/guide/quickstart.md +46 -67
  224. package/skills/void/docs/guide/remote-dev.md +8 -6
  225. package/skills/void/docs/guide/sandboxes.md +33 -16
  226. package/skills/void/docs/guide/self-hosted-platform.md +553 -0
  227. package/skills/void/docs/guide/server-routing.md +25 -5
  228. package/skills/void/docs/guide/sse.md +4 -4
  229. package/skills/void/docs/guide/ssg.md +5 -3
  230. package/skills/void/docs/guide/storage.md +2 -2
  231. package/skills/void/docs/guide/websockets.md +18 -7
  232. package/skills/void/docs/index.md +3 -3
  233. package/skills/void/docs/integrations/agents.md +6 -64
  234. package/skills/void/docs/integrations/cloudflare.md +165 -146
  235. package/skills/void/docs/integrations/frameworks/analog.md +4 -4
  236. package/skills/void/docs/integrations/frameworks/astro.md +5 -5
  237. package/skills/void/docs/integrations/frameworks/nuxt.md +5 -5
  238. package/skills/void/docs/integrations/frameworks/overview.md +3 -3
  239. package/skills/void/docs/integrations/frameworks/react-router.md +3 -3
  240. package/skills/void/docs/integrations/frameworks/sveltekit.md +3 -3
  241. package/skills/void/docs/integrations/frameworks/tanstack-start.md +2 -2
  242. package/skills/void/docs/integrations/nodejs-bun-deno.md +11 -4
  243. package/skills/void/docs/reference/api.md +42 -6
  244. package/skills/void/docs/reference/cli.md +637 -159
  245. package/skills/void/docs/reference/config.md +80 -25
  246. package/skills/void/docs/reference/resource-inference.md +13 -9
  247. package/skills/void/docs/reference/structure.md +10 -11
  248. package/AGENT_PROMPT.md +0 -19
  249. package/dist/cf-access-Bqw81xAf.mjs +0 -22
  250. package/dist/env-CZy5MorI.mjs +0 -299
  251. package/dist/env-helpers-z4stu8uc.d.mts +0 -52
  252. package/dist/env-mask-Dd47NbR6.mjs +0 -90
  253. package/dist/env-public-BfiLcMBk.d.mts +0 -140
  254. package/dist/link-CdGHSIy-.mjs +0 -45
  255. package/dist/mcp-DoM3_nhd.mjs +0 -377
  256. package/dist/project-paths-GpziKeQQ.d.mts +0 -25
  257. package/dist/providers-BNKRacMr.d.mts +0 -7
  258. package/dist/proxy-D-3_D-Gl.mjs +0 -5
  259. package/dist/rollback-CkvTFXx5.mjs +0 -90
  260. package/dist/runtime/isr-cache.d.mts +0 -207
  261. package/dist/runtime/isr-cache.mjs +0 -523
  262. package/dist/types-lLjNE9Qp.d.mts +0 -51
  263. package/getting-started-prompt.txt +0 -28
  264. package/skills/void/command/void.md +0 -7
  265. package/skills/void/docs/integrations/auth-providers.md +0 -0
  266. package/skills/void/docs/integrations/payment-processors.md +0 -0
  267. package/skills/void/docs/node_modules/@iconify/vue/README.md +0 -408
  268. package/skills/void/docs/node_modules/@iconify/vue/offline/readme.md +0 -5
  269. package/skills/void/docs/node_modules/@voidzero-dev/vitepress-theme/README.md +0 -103
  270. package/skills/void/docs/node_modules/oxc-minify/README.md +0 -78
  271. package/skills/void/docs/node_modules/reka-ui/README.md +0 -80
  272. package/skills/void/docs/node_modules/vitepress/README.md +0 -28
  273. package/skills/void/docs/node_modules/vitepress/template/api-examples.md +0 -49
  274. package/skills/void/docs/node_modules/vitepress/template/index.md +0 -28
  275. package/skills/void/docs/node_modules/vitepress/template/markdown-examples.md +0 -85
  276. package/skills/void/docs/node_modules/vitepress-plugin-group-icons/README.md +0 -101
  277. package/skills/void/docs/node_modules/void/AGENT_PROMPT.md +0 -19
  278. package/skills/void/docs/node_modules/void/CLAUDE.md +0 -219
  279. package/skills/void/docs/node_modules/void/README.md +0 -90
  280. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/CHANGELOG.md +0 -685
  281. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/README.md +0 -396
  282. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/sandbox/README.md +0 -219
  283. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/vite-plugin/README.md +0 -37
  284. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/workers-types/README.md +0 -135
  285. package/skills/void/docs/node_modules/void/node_modules/@electric-sql/pglite/README.md +0 -189
  286. package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/CHANGELOG.md +0 -143
  287. package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/README.md +0 -1272
  288. package/skills/void/docs/node_modules/void/node_modules/@napi-rs/keyring/README.md +0 -19
  289. package/skills/void/docs/node_modules/void/node_modules/@types/better-sqlite3/README.md +0 -15
  290. package/skills/void/docs/node_modules/void/node_modules/@types/node/README.md +0 -15
  291. package/skills/void/docs/node_modules/void/node_modules/@types/pg/README.md +0 -15
  292. package/skills/void/docs/node_modules/void/node_modules/@types/proper-lockfile/README.md +0 -51
  293. package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/README.md +0 -22
  294. package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/vendor/vscode-jsonrpc/README.md +0 -69
  295. package/skills/void/docs/node_modules/void/node_modules/@void/md/README.md +0 -153
  296. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/engine-javascript/README.md +0 -9
  297. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/transformers/README.md +0 -9
  298. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@types/node/README.md +0 -15
  299. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/CHANGELOG.md +0 -24
  300. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/README.md +0 -565
  301. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-exit/README.md +0 -127
  302. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-anchor/README.md +0 -600
  303. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-attrs/README.md +0 -386
  304. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-container/README.md +0 -95
  305. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-emoji/README.md +0 -101
  306. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-footnote/README.md +0 -135
  307. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/pathslash/README.md +0 -64
  308. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/shiki/README.md +0 -15
  309. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tinyglobby/README.md +0 -25
  310. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/AGENTS.md +0 -16
  311. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/README.md +0 -220
  312. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/build.md +0 -21
  313. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/check.md +0 -35
  314. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/create.md +0 -70
  315. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/fmt.md +0 -20
  316. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/index.md +0 -35
  317. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/lint.md +0 -26
  318. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/pack.md +0 -17
  319. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/run.md +0 -364
  320. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/staged.md +0 -15
  321. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/test.md +0 -18
  322. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +0 -145
  323. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/build.md +0 -40
  324. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/cache.md +0 -107
  325. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/check.md +0 -60
  326. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ci.md +0 -62
  327. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/commit-hooks.md +0 -60
  328. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/create.md +0 -341
  329. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/dev.md +0 -24
  330. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/docker.md +0 -175
  331. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/env.md +0 -167
  332. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/fmt.md +0 -41
  333. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/github-actions-cache.md +0 -165
  334. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ide-integration.md +0 -101
  335. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/implode.md +0 -23
  336. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/index.md +0 -134
  337. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/install.md +0 -199
  338. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/lint.md +0 -50
  339. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate-rules.md +0 -347
  340. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate.md +0 -197
  341. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/monorepo.md +0 -176
  342. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/pack.md +0 -69
  343. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/run.md +0 -356
  344. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/test.md +0 -35
  345. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/troubleshooting.md +0 -108
  346. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/upgrade.md +0 -101
  347. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/vpx.md +0 -66
  348. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/why.md +0 -39
  349. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/index.md +0 -12
  350. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/team.md +0 -35
  351. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/templates/generator/README.md +0 -35
  352. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/templates/monorepo/README.md +0 -29
  353. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vue/README.md +0 -58
  354. package/skills/void/docs/node_modules/void/node_modules/arktype/README.md +0 -165
  355. package/skills/void/docs/node_modules/void/node_modules/better-auth/LICENSE.md +0 -20
  356. package/skills/void/docs/node_modules/void/node_modules/better-auth/README.md +0 -32
  357. package/skills/void/docs/node_modules/void/node_modules/better-sqlite3/README.md +0 -99
  358. package/skills/void/docs/node_modules/void/node_modules/blake3-jit/README.md +0 -108
  359. package/skills/void/docs/node_modules/void/node_modules/drizzle-arktype/README.md +0 -51
  360. package/skills/void/docs/node_modules/void/node_modules/drizzle-kit/README.md +0 -79
  361. package/skills/void/docs/node_modules/void/node_modules/drizzle-orm/README.md +0 -44
  362. package/skills/void/docs/node_modules/void/node_modules/drizzle-valibot/README.md +0 -51
  363. package/skills/void/docs/node_modules/void/node_modules/drizzle-zod/README.md +0 -65
  364. package/skills/void/docs/node_modules/void/node_modules/es-module-lexer/README.md +0 -403
  365. package/skills/void/docs/node_modules/void/node_modules/estree-walker/README.md +0 -48
  366. package/skills/void/docs/node_modules/void/node_modules/hono/README.md +0 -85
  367. package/skills/void/docs/node_modules/void/node_modules/ignore/README.md +0 -452
  368. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/CHANGELOG.md +0 -76
  369. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/LICENSE.md +0 -21
  370. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/README.md +0 -364
  371. package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/SECURITY.md +0 -41
  372. package/skills/void/docs/node_modules/void/node_modules/magic-string/README.md +0 -325
  373. package/skills/void/docs/node_modules/void/node_modules/ofetch/README.md +0 -398
  374. package/skills/void/docs/node_modules/void/node_modules/pathslash/README.md +0 -64
  375. package/skills/void/docs/node_modules/void/node_modules/pg/README.md +0 -96
  376. package/skills/void/docs/node_modules/void/node_modules/pglite-server/README.md +0 -135
  377. package/skills/void/docs/node_modules/void/node_modules/picocolors/README.md +0 -21
  378. package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/CHANGELOG.md +0 -108
  379. package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/README.md +0 -183
  380. package/skills/void/docs/node_modules/void/node_modules/tinyglobby/README.md +0 -25
  381. package/skills/void/docs/node_modules/void/node_modules/valibot/LICENSE.md +0 -9
  382. package/skills/void/docs/node_modules/void/node_modules/valibot/README.md +0 -94
  383. package/skills/void/docs/node_modules/void/node_modules/vite-plus/AGENTS.md +0 -16
  384. package/skills/void/docs/node_modules/void/node_modules/vite-plus/README.md +0 -220
  385. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/build.md +0 -21
  386. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/check.md +0 -35
  387. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/create.md +0 -70
  388. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/fmt.md +0 -20
  389. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/index.md +0 -35
  390. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/lint.md +0 -26
  391. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/pack.md +0 -17
  392. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/run.md +0 -364
  393. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/staged.md +0 -15
  394. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/test.md +0 -18
  395. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +0 -145
  396. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/build.md +0 -40
  397. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/cache.md +0 -107
  398. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/check.md +0 -60
  399. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ci.md +0 -62
  400. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/commit-hooks.md +0 -60
  401. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/create.md +0 -341
  402. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/dev.md +0 -24
  403. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/docker.md +0 -175
  404. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/env.md +0 -167
  405. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/fmt.md +0 -41
  406. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/github-actions-cache.md +0 -165
  407. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ide-integration.md +0 -101
  408. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/implode.md +0 -23
  409. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/index.md +0 -134
  410. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/install.md +0 -199
  411. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/lint.md +0 -50
  412. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate-rules.md +0 -347
  413. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate.md +0 -197
  414. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/monorepo.md +0 -176
  415. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/pack.md +0 -69
  416. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/run.md +0 -356
  417. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/test.md +0 -35
  418. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/troubleshooting.md +0 -108
  419. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/upgrade.md +0 -101
  420. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/vpx.md +0 -66
  421. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/why.md +0 -39
  422. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/index.md +0 -12
  423. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/team.md +0 -35
  424. package/skills/void/docs/node_modules/void/node_modules/vite-plus/templates/generator/README.md +0 -35
  425. package/skills/void/docs/node_modules/void/node_modules/vite-plus/templates/monorepo/README.md +0 -29
  426. package/skills/void/docs/node_modules/void/node_modules/wrangler/README.md +0 -63
  427. package/skills/void/docs/node_modules/void/node_modules/zod/README.md +0 -191
  428. package/skills/void/docs/node_modules/void/skills/migrate-vite-cloudflare-to-void/SKILL.md +0 -175
  429. package/skills/void/docs/node_modules/void/skills/void/SKILL.md +0 -76
  430. package/skills/void/docs/node_modules/void/skills/void/command/void.md +0 -7
  431. 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-CjSr6xf0.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 };