void 0.22.0 → 0.24.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 (301) hide show
  1. package/AGENTS_TEMPLATE.md +1 -1
  2. package/README.md +5 -1
  3. package/dist/{account-cmd-CjyxcGkM.mjs → account-cmd-vJhh5lrb.mjs} +5 -5
  4. package/dist/{scan-ClYmX3sa.mjs → application-analysis-BVsVqc11.mjs} +135 -18
  5. package/dist/application-routing-B7QEjqSR.mjs +27 -0
  6. package/dist/{auth-DLNN0D3Z.mjs → auth-CQkSDS50.mjs} +26 -96
  7. package/dist/auth-DX3JURcX.mjs +2 -0
  8. package/dist/{auth-link-BLO4ptzo.mjs → auth-link-D75t9wO2.mjs} +5 -5
  9. package/dist/{auth-router-ZUg9MF_U.mjs → auth-router-ClfhL1J7.mjs} +7 -7
  10. package/dist/{better-auth-shared-rsBGBvWJ.mjs → better-auth-shared-hy6RPh9W.mjs} +13 -2
  11. package/dist/{build-cmd-BxR5FROK.mjs → build-cmd-zMi1iFnS.mjs} +21 -9
  12. package/dist/{cache-D0sWhgKI.mjs → cache-ZtQmyxVV.mjs} +5 -5
  13. package/dist/{cancel-deploy-D4NUqFbi.mjs → cancel-deploy-Box0kkEV.mjs} +5 -5
  14. package/dist/{cf-access-P0iZnu0q.mjs → cf-access-BGe5sWXF.mjs} +4 -48
  15. package/dist/{cf-access-DRsQRe6k.mjs → cf-access-TWNzXltp.mjs} +3 -11
  16. package/dist/{cf-build-output-BJ6yGEIS.mjs → cf-build-output-BPqOT964.mjs} +2 -1
  17. package/dist/cf-build-output-_0HNWysu.mjs +2 -0
  18. package/dist/cli/cli.mjs +89 -461
  19. package/dist/cli/{cf-compat.mjs → cloudflare-operation-process.mjs} +454 -424
  20. package/dist/cli/env-schema-probe.d.mts +2 -1
  21. package/dist/cli/env-schema-probe.mjs +4 -4
  22. package/dist/client-B9UBI03V.mjs +2 -0
  23. package/dist/{client-BTZ3XkrB.mjs → client-DKAsFA4X.mjs} +161 -24
  24. package/dist/{cloudflare-auth-DQkqoMYa.mjs → cloudflare-auth-Qdc7tw8F.mjs} +41 -38
  25. package/dist/{cloudflare-cmd-BKlfGHAy.mjs → cloudflare-cmd-CmY8dGkd.mjs} +6 -6
  26. package/dist/cloudflare-config-Bktvwtpf.mjs +182 -0
  27. package/dist/{cloudflare-connect-Ctmrw579.mjs → cloudflare-connect-IiR3ZieC.mjs} +4 -4
  28. package/dist/{cloudflare-operations-BT6OWFBk.mjs → cloudflare-operations-BCdXSsmo.mjs} +1 -1
  29. package/dist/{cloudflare-operations-B9tzgjmf.mjs → cloudflare-operations-DzH-A966.mjs} +116 -172
  30. package/dist/{preset-UHj9ARyP.mjs → cloudflare-process-B-wekeR6.mjs} +93 -6
  31. package/dist/{config-VavjpDnp.d.mts → config-BMHb8RCj.d.mts} +1 -0
  32. package/dist/config-C_XRIPx2.mjs +89 -0
  33. package/dist/config-entry.d.mts +1 -1
  34. package/dist/{connect-Dg-WkW-C.mjs → connect-B-usTnlF.mjs} +9 -9
  35. package/dist/{create-project-l9J7pbtm.mjs → create-project-CYOOAYcn.mjs} +12 -12
  36. package/dist/{create-project-DdoqwFLF.mjs → create-project-FWbf5Olo.mjs} +1 -1
  37. package/dist/{db-gp2sCXyN.mjs → db-Ck2eZ2iB.mjs} +26 -26
  38. package/dist/{delete-TTedbH6B.mjs → delete-sK56qtzZ.mjs} +5 -5
  39. package/dist/{deploy-CH-o2CaZ.mjs → deploy-gCVaiJbS.mjs} +984 -616
  40. package/dist/{deploy-B19L2Bra.mjs → deploy-irP5q0-x.mjs} +1 -1
  41. package/dist/{domain-JRF59P_r.mjs → domain-DFfQE8jg.mjs} +6 -6
  42. package/dist/{email-Bo6G9LOZ.mjs → email-CdnhUHvJ.mjs} +15 -30
  43. package/dist/{env-BYOrWQnv.mjs → env-DmGdHi5i.mjs} +8 -8
  44. package/dist/{env-public-BxU_0yTL.d.mts → env-public-BX_r8HR6.d.mts} +1 -1
  45. package/dist/{env-types-C2_bIk_b.mjs → env-types-D5kds_OZ.mjs} +1 -1
  46. package/dist/{env-validation-BB4GkLxn.mjs → env-validation-C_8tPdhs.mjs} +20 -73
  47. package/dist/{env-validation-BXge7uyK.mjs → env-validation-zZOCcQVZ.mjs} +1 -1
  48. package/dist/{fetch-CXDChK7B.mjs → fetch-BIZJh7vR.mjs} +2 -2
  49. package/dist/{fetch-stream-AOByI7Ki.mjs → fetch-stream-IvCYKyQL.mjs} +24 -4
  50. package/dist/{gen-sCtlCOdA.mjs → gen-CshAkukR.mjs} +4 -4
  51. package/dist/gen-DvQTWzDU.mjs +2 -0
  52. package/dist/{github-cmd-0-7PexDq.mjs → github-cmd-DftuEvIt.mjs} +13 -13
  53. package/dist/{handler-HEcZsaij.d.mts → handler-CZ4nAylQ.d.mts} +1 -1
  54. package/dist/{headers-DWi2IXWx.mjs → headers-2rKda9Y6.mjs} +1 -1
  55. package/dist/{help-GKtwl07I.mjs → help-Dotbf6iz.mjs} +236 -750
  56. package/dist/help-mabuIV98.mjs +2 -0
  57. package/dist/{inbound-aVHEUhKo.mjs → inbound-fRkqcXaC.mjs} +1 -1
  58. package/dist/index.d.mts +1 -1
  59. package/dist/index.mjs +299 -1517
  60. package/dist/info-B97bTX9N.mjs +113 -0
  61. package/dist/{init-FZx3Elvz.mjs → init-BTQEZZGJ.mjs} +61 -27
  62. package/dist/limits-Bq5LG8Id.d.mts +27 -0
  63. package/dist/limits-Cjuk2VPm.mjs +68 -0
  64. package/dist/{link-BrQfb_CU.mjs → link-B46sYH0K.mjs} +6 -6
  65. package/dist/{list-D44jmIAM.mjs → list-BnPrIsU_.mjs} +6 -6
  66. package/dist/{live-CKJlvlNp.d.mts → live-Chw1eIMv.d.mts} +1 -1
  67. package/dist/{local-d1-Bg9OzEEO.mjs → local-d1-2CMnpuW_.mjs} +2 -2
  68. package/dist/log-vqY3pqwI.mjs +29 -0
  69. package/dist/{login-CAsAsQ-_.mjs → login-BuiMyUrx.mjs} +8 -8
  70. package/dist/login-DIy9Sb-U.mjs +2 -0
  71. package/dist/{logs-BjKvFnVM.mjs → logs-CZG9d-ic.mjs} +10 -11
  72. package/dist/migrate-BCiJ8w0f.mjs +2 -0
  73. package/dist/{migrate-BPITvDJN.mjs → migrate-q4_njtaW.mjs} +4 -3
  74. package/dist/{node-Dt7z256D.mjs → node-BkyRWRx8.mjs} +1 -1
  75. package/dist/operator-args-B3BTmSoi.mjs +697 -0
  76. package/dist/{operator-auth-8KnOVXVd.mjs → operator-auth-7erYc6Lt.mjs} +2 -2
  77. package/dist/{operator-client-DUwumHpQ.mjs → operator-client-CpHjTd0t.mjs} +3 -3
  78. package/dist/{operator-cmd-BK5CCiT9.mjs → operator-cmd-DGqPJUD3.mjs} +70 -24
  79. package/dist/{output-Dm_A4Tbv.mjs → output-CbM85T4k.mjs} +18 -10
  80. package/dist/pages/client.d.mts +34 -2
  81. package/dist/pages/client.mjs +59 -3
  82. package/dist/pages/index.d.mts +1 -1
  83. package/dist/pages/index.mjs +2 -2
  84. package/dist/pages/islands-plugin.mjs +1 -1
  85. package/dist/pages/protocol.d.mts +2 -2
  86. package/dist/pages/protocol.mjs +2 -308
  87. package/dist/{parse-filename-DioPHiR9.mjs → parse-filename-CUbj-1MP.mjs} +35 -1
  88. package/dist/plan-D1Q5rf-r.mjs +2 -0
  89. package/dist/plan-NPpwZ_kc.mjs +58 -0
  90. package/dist/platform-args-3k8X9-H_.mjs +514 -0
  91. package/dist/platform-args-DdnM6WIf.mjs +2 -0
  92. package/dist/{platform-auth-config-BlN8xTdD.mjs → platform-auth-config-DDrxUy4m.mjs} +6 -6
  93. package/dist/{platform-auth-protection-7d5aV2Jg.mjs → platform-auth-protection-BLadnnct.mjs} +8 -8
  94. package/dist/{platform-auth-recovery-Dxij8ZbR.mjs → platform-auth-recovery-CmCzX2Fl.mjs} +6 -6
  95. package/dist/{platform-cmd-B3hwKrFK.mjs → platform-cmd-DMDEc9uS.mjs} +29 -8
  96. package/dist/{platform-cmd-E0FuL212.mjs → platform-cmd-pMTRhvYs.mjs} +1 -1
  97. package/dist/{platform-domain-D6Xcy9ZX.mjs → platform-domain-Di6EYrQl.mjs} +5 -5
  98. package/dist/{platform-lifecycle-k0E0xoxx.mjs → platform-lifecycle-BBoNzojY.mjs} +1541 -572
  99. package/dist/{platform-lifecycle-DMh_qrry.mjs → platform-lifecycle-BFdSi9Qt.mjs} +1 -1
  100. package/dist/{platform-management-Brz_BDiT.mjs → platform-management-CWOQOWXm.mjs} +10 -7
  101. package/dist/{platform-management-DOtss0BN.mjs → platform-management-DG47jys8.mjs} +1 -1
  102. package/dist/platform-plans-config-Vl9BP3H4.mjs +359 -0
  103. package/dist/{platform-recovery-BvtcXON5.mjs → platform-recovery-BJnQJEtQ.mjs} +4 -4
  104. package/dist/{platform-registry-QBa4DK32.mjs → platform-registry-DkPPXfp_.mjs} +2 -2
  105. package/dist/{plugin-inference-BMfKRSqE.mjs → plugin-inference-CXWnn79A.mjs} +174 -64
  106. package/dist/{prepare-C-6YZyyg.mjs → prepare-CBLT3CHH.mjs} +3 -3
  107. package/dist/prepare-CnjcTV2s.mjs +2 -0
  108. package/dist/{prepare-CRhJbVrG.mjs → prepare-DnaKBi--.mjs} +5 -21
  109. package/dist/{project-C0Fqu05O.mjs → project-DKG5Ra8p.mjs} +15 -82
  110. package/dist/project-DsblYifa.mjs +2 -0
  111. package/dist/{project-cmd-BZLCqOqw.mjs → project-cmd-DxnXstAq.mjs} +19 -19
  112. package/dist/{project-team-BvgM0WoX.mjs → project-team-BmHcaALJ.mjs} +5 -5
  113. package/dist/{project-token-l5DqK6Az.mjs → project-token-GionZlBI.mjs} +5 -5
  114. package/dist/{project-zero-trust-v6Mvpp8y.mjs → project-zero-trust-JLCjVQA7.mjs} +5 -5
  115. package/dist/prompts-2TGE6oXx.mjs +2 -0
  116. package/dist/prompts-BNUoTiaf.mjs +2044 -0
  117. package/dist/{protocol-BBa6cstI.d.mts → protocol-CjF_iI9X.d.mts} +2 -2
  118. package/dist/protocol-U7bfjHmA.mjs +331 -0
  119. package/dist/{provision-Fr9pRqce.mjs → provision-CVku1JFU.mjs} +1 -1
  120. package/dist/{provision-C4IGqkBf.mjs → provision-CaoxO_U7.mjs} +90 -199
  121. package/dist/{requests-DN-BbNiM.mjs → requests-BOjIVAeF.mjs} +5 -5
  122. package/dist/resource-name-C7LVpcRm.mjs +11 -0
  123. package/dist/{rollback-D7rzSaZM.mjs → rollback-CwR3pLj3.mjs} +6 -6
  124. package/dist/route-url-CG7U-cRN.mjs +15 -0
  125. package/dist/{runner-B8wXwWlo.mjs → runner-CXA9Fh8h.mjs} +1 -1
  126. package/dist/{runner-p-dMs2UN.mjs → runner-Ol0TNjk6.mjs} +2 -2
  127. package/dist/runtime/ai.d.mts +12 -8
  128. package/dist/runtime/ai.mjs +87 -22
  129. package/dist/runtime/better-auth-mysql.mjs +1 -1
  130. package/dist/runtime/better-auth-pg.mjs +1 -1
  131. package/dist/runtime/better-auth.mjs +1 -1
  132. package/dist/runtime/client-react.mjs +2 -2
  133. package/dist/runtime/client-solid.mjs +2 -2
  134. package/dist/runtime/client-svelte.mjs +2 -2
  135. package/dist/runtime/client-vue.mjs +2 -2
  136. package/dist/runtime/client.mjs +2 -2
  137. package/dist/runtime/durable.d.mts +3 -1
  138. package/dist/runtime/durable.mjs +4 -1
  139. package/dist/runtime/email/testing.mjs +2 -2
  140. package/dist/runtime/email.mjs +1 -1
  141. package/dist/runtime/env-public.d.mts +1 -1
  142. package/dist/runtime/fetch-stream.mjs +1 -1
  143. package/dist/runtime/fetch.mjs +1 -1
  144. package/dist/runtime/handler.d.mts +1 -1
  145. package/dist/runtime/kv.mjs +0 -1
  146. package/dist/runtime/limits.d.mts +2 -0
  147. package/dist/runtime/limits.mjs +2 -0
  148. package/dist/runtime/live-client.d.mts +1 -1
  149. package/dist/runtime/live-server.mjs +25 -16
  150. package/dist/runtime/live.d.mts +1 -1
  151. package/dist/runtime/migration-handler.mjs +62 -42
  152. package/dist/runtime/remote/index.mjs +2 -2
  153. package/dist/runtime/route-url.d.mts +4 -0
  154. package/dist/runtime/route-url.mjs +2 -0
  155. package/dist/runtime/routing.d.mts +180 -0
  156. package/dist/runtime/routing.mjs +1082 -0
  157. package/dist/runtime/sandbox-container.d.mts +1 -1
  158. package/dist/runtime/sandbox-container.mjs +1 -1
  159. package/dist/runtime/sandbox.d.mts +3 -3
  160. package/dist/runtime/sandbox.mjs +75 -45
  161. package/dist/runtime/sse.mjs +1 -1
  162. package/dist/runtime/validator.d.mts +1 -1
  163. package/dist/runtime/ws-server.d.mts +4 -2
  164. package/dist/runtime/ws-server.mjs +27 -2
  165. package/dist/runtime/ws.d.mts +2 -2
  166. package/dist/runtime/ws.mjs +8 -6
  167. package/dist/{sandbox-qpNBT8a3.d.mts → sandbox-XZAqzFlG.d.mts} +11 -8
  168. package/dist/{sandbox-container-DdNEBfCc.d.mts → sandbox-container-Bo0eiFKz.d.mts} +2 -1
  169. package/dist/{sandbox-container-4fdqLnyb.mjs → sandbox-container-C6ItmVuN.mjs} +4 -2
  170. package/dist/{scan-4tfN-PSn.mjs → scan-C7okrLyM.mjs} +4 -35
  171. package/dist/{secret-BOtOl_cb.mjs → secret-ByWJWBUG.mjs} +7 -7
  172. package/dist/{skills-D1II1Juz.mjs → skills-C1PlclPt.mjs} +1 -1
  173. package/dist/{sse-BaC1jXko.mjs → sse-CQNaDFFV.mjs} +6 -3
  174. package/dist/{subcommand-prompt-CY1C4fvl.mjs → subcommand-prompt-klFCfcor.mjs} +40 -32
  175. package/dist/validate-Dq_L3s0S.mjs +2 -0
  176. package/dist/{validate-CIUwFpjB.mjs → validate-ctOrgiS3.mjs} +2 -1
  177. package/dist/{wrangler-DQF1vKyf.mjs → wrangler-7K-bW_DL.mjs} +8 -239
  178. package/dist/{ws-BoY7vQML.d.mts → ws-CL1w7GXU.d.mts} +13 -2
  179. package/package.json +16 -10
  180. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +34 -157
  181. package/skills/void/SKILL.md +55 -135
  182. package/skills/void/docs/guide/ai.md +94 -84
  183. package/skills/void/docs/guide/app-types.md +3 -32
  184. package/skills/void/docs/guide/auth.md +12 -116
  185. package/skills/void/docs/guide/database/d1.md +9 -54
  186. package/skills/void/docs/guide/database/mysql.md +1 -1
  187. package/skills/void/docs/guide/database/postgresql.md +5 -26
  188. package/skills/void/docs/guide/database.md +23 -75
  189. package/skills/void/docs/guide/deployment.md +48 -112
  190. package/skills/void/docs/guide/durable-state.md +43 -18
  191. package/skills/void/docs/guide/edge/headers.md +4 -48
  192. package/skills/void/docs/guide/edge/prerendering.md +5 -20
  193. package/skills/void/docs/guide/edge/redirects.md +11 -64
  194. package/skills/void/docs/guide/edge/revalidation.md +5 -18
  195. package/skills/void/docs/guide/edge/rewrites.md +56 -284
  196. package/skills/void/docs/guide/edge/static-assets.md +22 -72
  197. package/skills/void/docs/guide/email/domains.md +116 -0
  198. package/skills/void/docs/guide/email/receiving.md +139 -0
  199. package/skills/void/docs/guide/email/sending.md +231 -0
  200. package/skills/void/docs/guide/email.md +13 -619
  201. package/skills/void/docs/guide/env-migration.md +11 -11
  202. package/skills/void/docs/guide/env-vars.md +9 -29
  203. package/skills/void/docs/guide/index.md +0 -15
  204. package/skills/void/docs/guide/jobs.md +3 -18
  205. package/skills/void/docs/guide/kv.md +5 -11
  206. package/skills/void/docs/guide/live.md +5 -56
  207. package/skills/void/docs/guide/pages-routing/actions-and-forms.md +78 -125
  208. package/skills/void/docs/guide/pages-routing/head.md +10 -10
  209. package/skills/void/docs/guide/pages-routing/islands.md +6 -36
  210. package/skills/void/docs/guide/pages-routing/layouts.md +6 -128
  211. package/skills/void/docs/guide/pages-routing/loaders.md +3 -19
  212. package/skills/void/docs/guide/pages-routing/markdown.md +13 -171
  213. package/skills/void/docs/guide/pages-routing/overview.md +7 -17
  214. package/skills/void/docs/guide/pages-routing/view-transitions.md +1 -1
  215. package/skills/void/docs/guide/platform/administration/access.md +1 -4
  216. package/skills/void/docs/guide/platform/administration/email.md +35 -8
  217. package/skills/void/docs/guide/platform/administration/operations.md +26 -4
  218. package/skills/void/docs/guide/platform/administration/plans.md +126 -0
  219. package/skills/void/docs/guide/platform/administration/projects.md +5 -2
  220. package/skills/void/docs/guide/platform/administration/zero-trust.md +49 -160
  221. package/skills/void/docs/guide/platform/development/runtime.md +3 -13
  222. package/skills/void/docs/guide/platform/development/schema-ci.md +0 -58
  223. package/skills/void/docs/guide/platform/installation/ci.md +1 -1
  224. package/skills/void/docs/guide/platform/installation/credentials.md +15 -6
  225. package/skills/void/docs/guide/platform/installation/domains.md +35 -2
  226. package/skills/void/docs/guide/platform/installation/first-deployment.md +4 -2
  227. package/skills/void/docs/guide/platform/installation/maintenance.md +15 -1
  228. package/skills/void/docs/guide/platform/installation/prerequisites.md +24 -18
  229. package/skills/void/docs/guide/platform/installation/setup.md +88 -14
  230. package/skills/void/docs/guide/platform-administration.md +1 -0
  231. package/skills/void/docs/guide/queues.md +7 -9
  232. package/skills/void/docs/guide/quickstart.md +38 -37
  233. package/skills/void/docs/guide/remote-dev.md +5 -10
  234. package/skills/void/docs/guide/sandboxes.md +29 -21
  235. package/skills/void/docs/guide/server-routing.md +9 -72
  236. package/skills/void/docs/guide/sse.md +4 -18
  237. package/skills/void/docs/guide/ssg.md +3 -15
  238. package/skills/void/docs/guide/ssr.md +14 -62
  239. package/skills/void/docs/guide/storage.md +9 -4
  240. package/skills/void/docs/guide/type-safety.md +3 -14
  241. package/skills/void/docs/guide/typed-fetch.md +3 -7
  242. package/skills/void/docs/guide/websockets.md +68 -40
  243. package/skills/void/docs/integrations/agents.md +3 -3
  244. package/skills/void/docs/integrations/cloudflare.md +85 -316
  245. package/skills/void/docs/integrations/frameworks/analog.md +5 -64
  246. package/skills/void/docs/integrations/frameworks/astro.md +4 -73
  247. package/skills/void/docs/integrations/frameworks/nuxt.md +5 -62
  248. package/skills/void/docs/integrations/frameworks/overview.md +11 -54
  249. package/skills/void/docs/integrations/frameworks/react-router.md +5 -60
  250. package/skills/void/docs/integrations/frameworks/sveltekit.md +6 -65
  251. package/skills/void/docs/integrations/frameworks/tanstack-start.md +4 -62
  252. package/skills/void/docs/integrations/nodejs-bun-deno.md +5 -69
  253. package/skills/void/docs/reference/api/auth.md +156 -0
  254. package/skills/void/docs/reference/api/client.md +87 -0
  255. package/skills/void/docs/reference/api/database.md +95 -0
  256. package/skills/void/docs/reference/api/durable.md +46 -0
  257. package/skills/void/docs/reference/api/env.md +50 -0
  258. package/skills/void/docs/reference/api/handlers.md +254 -0
  259. package/skills/void/docs/reference/api/pages.md +241 -0
  260. package/skills/void/docs/reference/api/plugin.md +39 -0
  261. package/skills/void/docs/reference/api/resources.md +109 -0
  262. package/skills/void/docs/reference/api/rewrites.md +76 -0
  263. package/skills/void/docs/reference/api/types.md +92 -0
  264. package/skills/void/docs/reference/api.md +56 -1218
  265. package/skills/void/docs/reference/cli/auth.md +89 -0
  266. package/skills/void/docs/reference/cli/database.md +128 -0
  267. package/skills/void/docs/reference/cli/deploy.md +105 -0
  268. package/skills/void/docs/reference/cli/domains.md +41 -0
  269. package/skills/void/docs/reference/cli/email.md +129 -0
  270. package/skills/void/docs/reference/cli/generate.md +116 -0
  271. package/skills/void/docs/reference/cli/github.md +189 -0
  272. package/skills/void/docs/reference/cli/platform-config.md +92 -0
  273. package/skills/void/docs/reference/cli/platform-email.md +81 -0
  274. package/skills/void/docs/reference/cli/platform-installation.md +142 -0
  275. package/skills/void/docs/reference/cli/platform-operations.md +90 -0
  276. package/skills/void/docs/reference/cli/platform-users.md +89 -0
  277. package/skills/void/docs/reference/cli/platform-zero-trust.md +59 -0
  278. package/skills/void/docs/reference/cli/platform.md +70 -0
  279. package/skills/void/docs/reference/cli/project.md +214 -0
  280. package/skills/void/docs/reference/cli/secrets.md +76 -0
  281. package/skills/void/docs/reference/cli/setup.md +70 -0
  282. package/skills/void/docs/reference/cli.md +32 -1682
  283. package/skills/void/docs/reference/config.md +12 -18
  284. package/skills/void/docs/reference/resource-inference.md +3 -58
  285. package/skills/void/docs/reference/structure.md +14 -41
  286. package/dist/auth-CZuiVsFh.mjs +0 -2
  287. package/dist/canonical-json-DuDiiUsQ.mjs +0 -13
  288. package/dist/client-Czz8o5jP.mjs +0 -2
  289. package/dist/dist-BuDuKZJv.mjs +0 -2
  290. package/dist/dist-CTBk70IR.mjs +0 -1310
  291. package/dist/gen-CNJ62MM7.mjs +0 -2
  292. package/dist/help-CmZzxUba.mjs +0 -2
  293. package/dist/log-ChfPKsVd.mjs +0 -26
  294. package/dist/login-CGcRKEoi.mjs +0 -2
  295. package/dist/migrate-CYfbKkXh.mjs +0 -2
  296. package/dist/plan-BEZ8VJW0.mjs +0 -256
  297. package/dist/plan-DpuOr14e.mjs +0 -2
  298. package/dist/prepare-Bm3iq-u4.mjs +0 -2
  299. package/dist/project-BuUwfj6f.mjs +0 -2
  300. package/dist/validate-EKmJWxmy.mjs +0 -2
  301. /package/dist/cli/{cf-compat.d.mts → cloudflare-operation-process.d.mts} +0 -0
@@ -1,2 +1,2 @@
1
- import { r as runPlatformLifecycleCommand } from "./platform-lifecycle-k0E0xoxx.mjs";
1
+ import { r as runPlatformLifecycleCommand } from "./platform-lifecycle-BBoNzojY.mjs";
2
2
  export { runPlatformLifecycleCommand };
@@ -1,7 +1,7 @@
1
- import { a as listInstallationManifests, d as readInstallationRecoverySecrets, h as resolveInstallationManifest, m as removePlatformConnectionForInstallation, p as removeInstallationRecoverySecrets, t as acquirePlatformLifecycleLock, v as writeInstallationManifest } from "./platform-registry-QBa4DK32.mjs";
2
- import { E as confirm, I as select, N as note, P as outro, W as isCancel, j as log } from "./dist-CTBk70IR.mjs";
3
- import { i as createSpinner } from "./output-Dm_A4Tbv.mjs";
4
- import { A as PlatformCloudflareClient, C as revalidatePlatformInstallAction, E as resolvePlatformCloudflareCredential, M as hyperdriveOriginFromConnectionString, N as hyperdriveOriginMatches, P as verifyPlatformRuntimeTokenPermissions, S as platformProvisionIntentHash, T as assertPlatformOperatorCredentialCanApplyPlan, a as REMOTE_INSTALLATION_MANIFEST_KEY, b as formatPlatformInstallPlan, d as loadPlatformRuntime, g as assertProjectZeroTrustAllowsUninstall, h as resolveBootstrapGitHubId, j as hyperdriveOriginConfigHash, l as createPlatformInstallationSecrets, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock, p as readPlatformProjectZeroTrustState, t as assertNoninteractivePlatformMutationAcknowledged, u as installPlatform, v as trackedPlatformWorkerTraffic, w as platformDatabaseNameFromOwnerUrl, x as platformAdoptionIntentHash, y as createPlatformInstallPlan } from "./platform-lifecycle-k0E0xoxx.mjs";
1
+ import { a as listInstallationManifests, f as readInstallationRecoverySecrets, g as resolveInstallationManifest, h as removePlatformConnectionForInstallation, m as removeInstallationRecoverySecrets, t as acquirePlatformLifecycleLock, y as writeInstallationManifest } from "./platform-registry-DkPPXfp_.mjs";
2
+ import { A as confirm, B as note, H as outro, K as select, L as log, tt as isCancel } from "./prompts-BNUoTiaf.mjs";
3
+ import { i as createSpinner } from "./output-CbM85T4k.mjs";
4
+ import { A as PlatformCloudflareClient, C as revalidatePlatformInstallAction, E as resolvePlatformCloudflareCredential, M as hyperdriveOriginFromConnectionString, N as hyperdriveOriginMatches, P as verifyPlatformRuntimeTokenPermissions, S as platformProvisionIntentHash, T as assertPlatformOperatorCredentialCanApplyPlan, a as REMOTE_INSTALLATION_MANIFEST_KEY, b as formatPlatformInstallPlan, d as loadPlatformRuntime, g as assertProjectZeroTrustAllowsUninstall, h as resolveBootstrapGitHubId, j as hyperdriveOriginConfigHash, l as createPlatformInstallationSecrets, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock, p as readPlatformProjectZeroTrustState, t as assertNoninteractivePlatformMutationAcknowledged, u as installPlatform, v as trackedPlatformWorkerTraffic, w as platformDatabaseNameFromOwnerUrl, x as platformAdoptionIntentHash, y as createPlatformInstallPlan } from "./platform-lifecycle-BBoNzojY.mjs";
5
5
  import { createHash } from "node:crypto";
6
6
  import { PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE, PLATFORM_R2_OWNERSHIP_MARKER_KEY, createPlatformResourceOwnershipMarker, parsePlatformInstallationManifest, parsePlatformResourceOwnershipMarker, recordInstallationResource, recordInstallationStep, setInstallationDesiredState, transitionInstallation } from "@void/platform";
7
7
  //#region src/cli/platform-management.ts
@@ -35,7 +35,7 @@ async function runInstalledPlatformCommand(args) {
35
35
  timingPrevious = current;
36
36
  };
37
37
  const manifest = await resolveInstalledPlatformManifest(args.selector);
38
- const operatorCredential = await resolvePlatformCloudflareCredential();
38
+ const operatorCredential = await resolvePlatformCloudflareCredential({ savedManagementToken: readInstallationRecoverySecrets(manifest)?.managementApiToken });
39
39
  const operatorClient = new PlatformCloudflareClient(operatorCredential.token);
40
40
  const runtime = args.subcommand === "uninstall" || args.subcommand === "disable" ? null : loadPlatformRuntime(args.runtime);
41
41
  const rollbackSourceRuntime = args.subcommand === "rollback" ? loadPlatformRuntime(args.fromRuntime) : null;
@@ -77,6 +77,7 @@ async function runInstalledPlatformCommand(args) {
77
77
  ...args.subcommand === "upgrade" && process.env.VOID_EMAIL_SENDER_DOMAIN ? { emailSenderDomain: process.env.VOID_EMAIL_SENDER_DOMAIN } : {},
78
78
  applicationDomain: deployment.application.baseDomain,
79
79
  controlPlaneDomain: deployment.controlPlane.apiHostname ?? "",
80
+ ...args.subcommand !== "rollback" && args.dashboardUrl !== void 0 ? { dashboardUrl: args.dashboardUrl } : {},
80
81
  dedicatedZone: deployment.application.dedicatedZone,
81
82
  displayName: deployment.displayName,
82
83
  installationSlug: deployment.installationSlug,
@@ -87,7 +88,8 @@ async function runInstalledPlatformCommand(args) {
87
88
  repairMissing: args.subcommand === "repair",
88
89
  allowUnverifiedAiGateway: args.plan,
89
90
  includeEmailGateway: runtime.manifest.artifacts.emailGateway !== void 0,
90
- enableSandbox: runtime.manifest.safetyProtocols.sandboxDrain >= 3
91
+ enableSandbox: runtime.manifest.safetyProtocols.sandboxDrain >= 3,
92
+ deploymentExecution: runtime.manifest.deploymentExecution === 1
91
93
  });
92
94
  markPhase("plan");
93
95
  note(formatPlatformInstallPlan(plan), args.subcommand === "upgrade" ? "Upgrade plan" : args.subcommand === "rollback" ? "Rollback plan" : args.subcommand === "enable" ? "Enable plan" : "Repair plan");
@@ -167,7 +169,8 @@ async function runInstalledPlatformCommand(args) {
167
169
  authoritativeProvisionIntents: true,
168
170
  repairMissing: true,
169
171
  includeEmailGateway: runtime.manifest.artifacts.emailGateway !== void 0,
170
- enableSandbox: runtime.manifest.safetyProtocols.sandboxDrain >= 3
172
+ enableSandbox: runtime.manifest.safetyProtocols.sandboxDrain >= 3,
173
+ deploymentExecution: runtime.manifest.deploymentExecution === 1
171
174
  })).actions.filter((action) => action.kind === "worker"),
172
175
  revalidateBeforeWorkerDeploy: (manifest, action) => revalidatePlatformInstallAction(client, plan, manifest, action, {
173
176
  repairMissing: args.subcommand === "repair",
@@ -1,2 +1,2 @@
1
- import { c as selectAuthoritativePlatformManifest, s as runInstalledPlatformCommand, u as verifyPlatformInstallationOwnership } from "./platform-management-Brz_BDiT.mjs";
1
+ import { c as selectAuthoritativePlatformManifest, s as runInstalledPlatformCommand, u as verifyPlatformInstallationOwnership } from "./platform-management-CWOQOWXm.mjs";
2
2
  export { runInstalledPlatformCommand, selectAuthoritativePlatformManifest, verifyPlatformInstallationOwnership };
@@ -0,0 +1,359 @@
1
+ import { A as confirm, K as select, X as text, tt as isCancel } from "./prompts-BNUoTiaf.mjs";
2
+ import { n as OperatorClient, r as OperatorClientError } from "./operator-client-CpHjTd0t.mjs";
3
+ import { a as resolveOperatorOrigin, r as readOperatorToken } from "./operator-auth-7erYc6Lt.mjs";
4
+ import { stripVTControlCharacters } from "node:util";
5
+ import { PLAN_EDITABLE_LIMIT_KEYS, PLAN_LIMITS, parseBuildInstanceType, parsePlanLimitsPatch, parsePlanName, parsePlatformPlanId } from "@void/platform/plans";
6
+ import { readFile } from "node:fs/promises";
7
+ //#region src/cli/platform-plans-config.ts
8
+ const limitLabels = {
9
+ requestsPerMonth: "Requests per billing month",
10
+ cpuMsPerRequest: "Default CPU per request (ms)",
11
+ maxCpuMsPerRequest: "Maximum app CPU per request (ms)",
12
+ subRequestsPerInvocation: "Subrequests per invocation",
13
+ deploysPerDay: "Deployments per day",
14
+ aiNeuronsPerMonth: "AI neurons per billing month",
15
+ retainedDeployments: "Retained Worker deployments",
16
+ sandboxRuntimeSecondsPerMonth: "Sandbox runtime per billing month (seconds)",
17
+ sandboxMaxConcurrentInstances: "Concurrent Sandbox instances",
18
+ concurrentBuilds: "Concurrent builds",
19
+ buildTimeoutMinutes: "Build timeout (minutes)"
20
+ };
21
+ function limitValue(value, key) {
22
+ if (value === 0 && key === "buildTimeoutMinutes") return "platform maximum (60 minutes)";
23
+ return value === 0 ? "unlimited" : value.toLocaleString("en-US");
24
+ }
25
+ function showListing(listing, json) {
26
+ if (json) {
27
+ print(listing);
28
+ return;
29
+ }
30
+ console.log(`Default for new accounts: ${listing.catalog.defaultPlanId}`);
31
+ for (const plan of listing.catalog.plans) {
32
+ const count = listing.accounts.find((entry) => entry.planId === plan.id)?.count ?? 0;
33
+ console.log(`${label(plan)} — ${count} accounts`);
34
+ }
35
+ if (listing.catalog.reconciliation && !listing.catalog.reconciliation.complete) console.log("Account updates are pending. Run void platform config plans sync --yes.");
36
+ }
37
+ function showPreview(preview, before, write = console.error) {
38
+ const after = preview.catalog;
39
+ write(`Change: ${preview.action} ${preview.target}`);
40
+ write(`Accounts affected: ${preview.affectedAccounts}`);
41
+ for (const warning of preview.warnings ?? []) write(stripVTControlCharacters(warning));
42
+ if (typeof preview.usageSampleSize === "number" && preview.usageSampleSize > 0) write(`Usage preview samples ${preview.usageSampleSize} accounts.`);
43
+ if (before.defaultPlanId !== after.defaultPlanId) write(`Default for new accounts: ${before.defaultPlanId} → ${after.defaultPlanId}`);
44
+ for (const plan of after.plans) {
45
+ const previous = before.plans.find((entry) => entry.id === plan.id);
46
+ if (!previous) {
47
+ write(`Add ${label(plan)}; build size ${plan.buildInstanceType}`);
48
+ for (const key of PLAN_EDITABLE_LIMIT_KEYS) write(` ${limitLabels[key]}: ${limitValue(plan.limits[key], key)}`);
49
+ write(` Short project slugs: ${plan.allowShortSlugs ? "allowed" : "not allowed"}`);
50
+ continue;
51
+ }
52
+ if (previous.name !== plan.name) write(`Name: ${previous.name} → ${plan.name}`);
53
+ if (previous.archived !== plan.archived) write(`${plan.id}: ${plan.archived ? "archive for new assignments" : "restore assignments"}`);
54
+ if (previous.buildInstanceType !== plan.buildInstanceType) write(`Build size: ${previous.buildInstanceType} → ${plan.buildInstanceType}`);
55
+ if (previous.allowShortSlugs !== plan.allowShortSlugs) write(`Short project slugs: ${previous.allowShortSlugs ? "allowed" : "not allowed"} → ${plan.allowShortSlugs ? "allowed" : "not allowed"}`);
56
+ for (const key of PLAN_EDITABLE_LIMIT_KEYS) if (previous.limits[key] !== plan.limits[key]) write(`${limitLabels[key]}: ${limitValue(previous.limits[key], key)} → ${limitValue(plan.limits[key], key)}`);
57
+ }
58
+ for (const plan of before.plans) if (!after.plans.some((entry) => entry.id === plan.id)) {
59
+ write(`Remove ${label(plan)}`);
60
+ const replacement = after.plans.find((entry) => entry.id === preview.replacementPlanId);
61
+ if (replacement) {
62
+ write(`Move accounts to ${label(replacement)}`);
63
+ if (plan.buildInstanceType !== replacement.buildInstanceType) write(`Build size: ${plan.buildInstanceType} → ${replacement.buildInstanceType}`);
64
+ if (plan.allowShortSlugs !== replacement.allowShortSlugs) write(`Short project slugs: ${plan.allowShortSlugs ? "allowed" : "not allowed"} → ${replacement.allowShortSlugs ? "allowed" : "not allowed"}`);
65
+ for (const key of PLAN_EDITABLE_LIMIT_KEYS) if (plan.limits[key] !== replacement.limits[key]) write(`${limitLabels[key]}: ${limitValue(plan.limits[key], key)} → ${limitValue(replacement.limits[key], key)}`);
66
+ }
67
+ }
68
+ for (const account of preview.overLimitAccounts ?? []) write(`Already above proposed limits: ${stripVTControlCharacters(account.login)} (${account.id}): ${account.reasons.join(", ")}`);
69
+ }
70
+ function value(input) {
71
+ if (isCancel(input) || typeof input === "symbol") throw new Error("platform: Cancelled.");
72
+ return input;
73
+ }
74
+ function print(result) {
75
+ console.log(JSON.stringify(result, null, 2));
76
+ }
77
+ function label(plan) {
78
+ return `${stripVTControlCharacters(plan.name)} (${plan.id}${plan.archived ? ", archived" : ""})`;
79
+ }
80
+ async function choosePlan(catalog, message, options = {}) {
81
+ const plans = catalog.plans.filter((plan) => plan.id !== options.exclude && (!options.activeOnly || !plan.archived));
82
+ if (!plans.length) throw new Error("platform: No eligible plans are available.");
83
+ return value(await select({
84
+ message,
85
+ options: plans.map((plan) => ({
86
+ value: plan.id,
87
+ label: label(plan)
88
+ }))
89
+ }));
90
+ }
91
+ async function changesInput(args, plan) {
92
+ if (args.file) {
93
+ const input = JSON.parse(await readFile(args.file, "utf8"));
94
+ if (!input || typeof input !== "object" || Array.isArray(input)) throw new Error("platform: A plan file must contain a JSON object.");
95
+ const object = input;
96
+ for (const key of Object.keys(object)) if (![
97
+ "name",
98
+ "limits",
99
+ "buildInstanceType",
100
+ "allowShortSlugs"
101
+ ].includes(key)) throw new Error(`platform: Unknown plan field ${key}. Use name, limits, buildInstanceType, or allowShortSlugs.`);
102
+ if (object.allowShortSlugs !== void 0 && typeof object.allowShortSlugs !== "boolean") throw new Error("platform: allowShortSlugs must be a boolean.");
103
+ return {
104
+ ...object,
105
+ ...object.name !== void 0 ? { name: parsePlanName(object.name) } : {},
106
+ ...object.buildInstanceType !== void 0 ? { buildInstanceType: parseBuildInstanceType(object.buildInstanceType) } : {},
107
+ ...object.limits !== void 0 ? { limits: parsePlanLimitsPatch(object.limits) } : {},
108
+ ...args.name ? { name: parsePlanName(args.name) } : {}
109
+ };
110
+ }
111
+ if (args.name) return { name: parsePlanName(args.name) };
112
+ if (!process.stdin.isTTY || args.json) {
113
+ if (args.action === "add") throw new Error("platform: Supply --name or --file when adding a plan in non-interactive mode.");
114
+ throw new Error("platform: Supply --name or --file with the changes in non-interactive mode.");
115
+ }
116
+ if (args.action === "add") return { name: parsePlanName(value(await text({
117
+ message: "Plan name:",
118
+ initialValue: args.target
119
+ }))) };
120
+ const field = value(await select({
121
+ message: "What would you like to change?",
122
+ options: [
123
+ {
124
+ value: "name",
125
+ label: "Plan name"
126
+ },
127
+ ...PLAN_EDITABLE_LIMIT_KEYS.map((key) => ({
128
+ value: key,
129
+ label: `${limitLabels[key]}: ${limitValue(plan.limits[key], key)}`
130
+ })),
131
+ {
132
+ value: "buildInstanceType",
133
+ label: "Build instance size"
134
+ }
135
+ ]
136
+ }));
137
+ if (field === "name") return { name: parsePlanName(value(await text({
138
+ message: "Plan name:",
139
+ initialValue: plan.name
140
+ }))) };
141
+ if (field === "buildInstanceType") return { buildInstanceType: value(await select({
142
+ message: "Build instance size:",
143
+ initialValue: plan.buildInstanceType,
144
+ options: [{
145
+ value: "standard-3",
146
+ label: "Standard: 2 vCPU, 8 GiB"
147
+ }, {
148
+ value: "standard-4",
149
+ label: "Large: 4 vCPU, 12 GiB"
150
+ }]
151
+ })) };
152
+ const current = plan.limits[field];
153
+ const input = value(await text({
154
+ message: `${limitLabels[field]} (${field === "buildTimeoutMinutes" ? "0 uses the platform maximum of 60 minutes" : "0 means unlimited"}):`,
155
+ initialValue: String(current),
156
+ validate: (value) => /^\d+$/.test(value ?? "") && Number.isSafeInteger(Number(value)) ? void 0 : "Enter a nonnegative whole number."
157
+ }));
158
+ return { limits: parsePlanLimitsPatch({ [field]: Number(input) }) };
159
+ }
160
+ async function apply(client, path, body, args, catalog) {
161
+ if (!args.plan && !args.yes && (!process.stdin.isTTY || args.json)) throw new Error("platform: Configuration changes require --yes or --plan in non-interactive mode.");
162
+ const preview = await client.request(path, {
163
+ method: "POST",
164
+ body: {
165
+ ...body,
166
+ dryRun: true
167
+ }
168
+ });
169
+ if (args.plan) {
170
+ if (args.json) print(preview);
171
+ else showPreview(preview, catalog, console.log);
172
+ return;
173
+ }
174
+ if (!Number.isSafeInteger(preview.expectedRevision)) throw new Error("platform: The platform returned an invalid plan revision.");
175
+ if (!args.yes) {
176
+ showPreview(preview, catalog);
177
+ if (!value(await confirm({
178
+ message: `Apply this change to ${client.origin}?`,
179
+ initialValue: false
180
+ }))) throw new Error("platform: Cancelled.");
181
+ }
182
+ let result = await client.request(path, {
183
+ method: "POST",
184
+ body: {
185
+ ...body,
186
+ expectedRevision: preview.expectedRevision
187
+ }
188
+ });
189
+ const committedCatalog = result.catalog;
190
+ if (!Number.isSafeInteger(committedCatalog?.revision)) throw new Error("platform: The platform returned an invalid saved plan revision. Inspect the catalog before retrying.");
191
+ const committedRevision = committedCatalog.revision;
192
+ const applied = result;
193
+ let previousCursor = catalog.reconciliation?.cursor ?? null;
194
+ while (true) {
195
+ const reconciliation = result.reconciliation;
196
+ if (!reconciliation || reconciliation.complete !== false) break;
197
+ const currentCatalog = result.catalog;
198
+ const cursor = currentCatalog.reconciliation?.cursor ?? null;
199
+ if (reconciliation.error || !Number.isSafeInteger(reconciliation.processed) || reconciliation.processed <= 0 || cursor === previousCursor || currentCatalog.revision !== committedRevision) {
200
+ const pending = {
201
+ ...applied,
202
+ ...result
203
+ };
204
+ print(pending);
205
+ throw new OperatorClientError("Plan configuration was saved, but account updates are pending. Run void platform config plans sync --yes.", "plan_sync_pending", void 0, pending);
206
+ }
207
+ previousCursor = cursor;
208
+ result = await client.request("/config/plans/sync", {
209
+ method: "POST",
210
+ body: { expectedRevision: committedRevision }
211
+ });
212
+ }
213
+ const completed = {
214
+ ...applied,
215
+ ...result
216
+ };
217
+ if (args.json) print(completed);
218
+ else console.log(`Saved ${applied.action ?? "plans.sync"} ${applied.target ?? ""}. Account updates complete.`);
219
+ }
220
+ async function runPlatformPlansConfig(args) {
221
+ const origin = resolveOperatorOrigin(args.connection);
222
+ const client = new OperatorClient(origin, readOperatorToken(origin));
223
+ const listing = await client.request("/config/plans");
224
+ const { catalog } = listing;
225
+ if (!args.action) {
226
+ if (!process.stdin.isTTY || args.json) {
227
+ showListing(listing, args.json);
228
+ return;
229
+ }
230
+ const selected = value(await select({
231
+ message: "Platform plans:",
232
+ options: [
233
+ ...catalog.plans.map((plan) => ({
234
+ value: plan.id,
235
+ label: `${label(plan)}${plan.id === catalog.defaultPlanId ? " — default" : ""}`,
236
+ hint: `${listing.accounts.find((entry) => entry.planId === plan.id)?.count ?? 0} accounts`
237
+ })),
238
+ {
239
+ value: ":add",
240
+ label: "Add a plan by copying an existing plan"
241
+ },
242
+ {
243
+ value: ":default",
244
+ label: "Choose the default for new accounts"
245
+ },
246
+ ...catalog.reconciliation && !catalog.reconciliation.complete ? [{
247
+ value: ":sync",
248
+ label: "Continue pending account updates"
249
+ }] : []
250
+ ]
251
+ }));
252
+ if (selected === ":sync") return runPlatformPlansConfig({
253
+ ...args,
254
+ action: "sync"
255
+ });
256
+ if (selected === ":default") {
257
+ const target = await choosePlan(catalog, "Default plan for new accounts:", { activeOnly: true });
258
+ return runPlatformPlansConfig({
259
+ ...args,
260
+ action: "default",
261
+ target
262
+ });
263
+ }
264
+ if (selected === ":add") {
265
+ const target = parsePlatformPlanId(value(await text({ message: "New plan ID (stable; lowercase letters, digits, and hyphens):" })));
266
+ const copy = await choosePlan(catalog, "Copy limits and build size from:");
267
+ return runPlatformPlansConfig({
268
+ ...args,
269
+ action: "add",
270
+ target,
271
+ copy
272
+ });
273
+ }
274
+ const plan = catalog.plans.find((entry) => entry.id === selected);
275
+ const action = value(await select({
276
+ message: label(plan),
277
+ options: [
278
+ {
279
+ value: "show",
280
+ label: "Show limits and account count"
281
+ },
282
+ {
283
+ value: "set",
284
+ label: "Edit name or limits"
285
+ },
286
+ {
287
+ value: plan.archived ? "restore" : "archive",
288
+ label: plan.archived ? "Restore assignments to this plan" : "Archive for new assignments"
289
+ },
290
+ ...Object.hasOwn(PLAN_LIMITS, plan.id) ? [{
291
+ value: "reset",
292
+ label: "Reset to original limits and build size"
293
+ }] : [],
294
+ {
295
+ value: "remove",
296
+ label: "Remove this plan"
297
+ }
298
+ ]
299
+ }));
300
+ return runPlatformPlansConfig({
301
+ ...args,
302
+ action,
303
+ target: selected
304
+ });
305
+ }
306
+ if (args.action === "show") {
307
+ if (!args.target) showListing(listing, args.json);
308
+ else {
309
+ const result = await client.request(`/config/plans/${encodeURIComponent(args.target)}`);
310
+ if (args.json) print(result);
311
+ else {
312
+ const plan = result.plan;
313
+ console.log(`${label(plan)}${result.default ? " — default for new accounts" : ""}`);
314
+ console.log(`Accounts: ${result.accounts}; build size: ${plan.buildInstanceType}`);
315
+ console.log(`Short project slugs: ${plan.allowShortSlugs ? "allowed" : "not allowed"}`);
316
+ for (const key of PLAN_EDITABLE_LIMIT_KEYS) console.log(`${limitLabels[key]}: ${limitValue(plan.limits[key], key)}`);
317
+ }
318
+ }
319
+ return;
320
+ }
321
+ let body = {};
322
+ let path = `/config/plans/${encodeURIComponent(args.target)}/${args.action}`;
323
+ const plan = catalog.plans.find((entry) => entry.id === args.target);
324
+ if (args.action === "add") {
325
+ let copy = args.copy;
326
+ if (!copy) {
327
+ if (!process.stdin.isTTY || args.json) throw new Error("platform: Adding a plan requires --copy <plan-id> in non-interactive mode.");
328
+ copy = await choosePlan(catalog, "Copy limits and build size from:");
329
+ }
330
+ body = {
331
+ id: args.target,
332
+ copyFrom: copy,
333
+ ...await changesInput(args)
334
+ };
335
+ path = "/config/plans/add";
336
+ } else if (args.action === "default") {
337
+ body = { planId: args.target };
338
+ path = "/config/plans/default";
339
+ } else if (args.action === "sync") path = "/config/plans/sync";
340
+ else {
341
+ if (!plan) throw new Error("platform: Plan not found. Run void platform config plans show.");
342
+ if (args.action === "set") body = await changesInput(args, plan);
343
+ else if (args.action === "archive" || args.action === "restore") {
344
+ path = `/config/plans/${encodeURIComponent(args.target)}/archive`;
345
+ body = { archived: args.action === "archive" };
346
+ } else if (args.action === "remove") {
347
+ let replacement = args.replacement;
348
+ const needsReplacement = args.target === catalog.defaultPlanId || (listing.accounts.find((entry) => entry.planId === args.target)?.count ?? 0) > 0;
349
+ if (!replacement && needsReplacement && process.stdin.isTTY && !args.json) replacement = await choosePlan(catalog, "Move accounts and any default to:", {
350
+ activeOnly: true,
351
+ exclude: args.target
352
+ });
353
+ body = replacement ? { replacementPlanId: replacement } : {};
354
+ }
355
+ }
356
+ await apply(client, path, body, args, catalog);
357
+ }
358
+ //#endregion
359
+ export { runPlatformPlansConfig };
@@ -1,7 +1,7 @@
1
- import { t as cfAccessHeaders } from "./cf-access-DRsQRe6k.mjs";
2
- import { a as listInstallationManifests, g as savePlatformConnection, t as acquirePlatformLifecycleLock, v as writeInstallationManifest } from "./platform-registry-QBa4DK32.mjs";
3
- import { a as REMOTE_INSTALLATION_MANIFEST_KEY, y as createPlatformInstallPlan } from "./platform-lifecycle-k0E0xoxx.mjs";
4
- import { i as recoverDurablyMarkedProvisionIntents, r as isPlatformManifestMonotonicExtension, u as verifyPlatformInstallationOwnership } from "./platform-management-Brz_BDiT.mjs";
1
+ import { t as cfAccessHeaders } from "./cf-access-TWNzXltp.mjs";
2
+ import { _ as savePlatformConnection, a as listInstallationManifests, t as acquirePlatformLifecycleLock, y as writeInstallationManifest } from "./platform-registry-DkPPXfp_.mjs";
3
+ import { a as REMOTE_INSTALLATION_MANIFEST_KEY, y as createPlatformInstallPlan } from "./platform-lifecycle-BBoNzojY.mjs";
4
+ import { i as recoverDurablyMarkedProvisionIntents, r as isPlatformManifestMonotonicExtension, u as verifyPlatformInstallationOwnership } from "./platform-management-CWOQOWXm.mjs";
5
5
  import { parsePlatformInstallationManifest, setInstallationEndpoints } from "@void/platform";
6
6
  //#region src/cli/platform-recovery.ts
7
7
  async function recoverPlatformInstallations(client, accountId, verifyEndpoint = verifyInstallationEndpoint, selector = "") {
@@ -66,7 +66,7 @@ function parseConnection(value) {
66
66
  const lastUsedAt = String(entry.lastUsedAt ?? "");
67
67
  if (!Number.isFinite(Date.parse(lastUsedAt))) throw new Error("platform: Invalid connection timestamp in the local registry.");
68
68
  const optionalString = (input) => typeof input === "string" && input !== "" ? input : null;
69
- const proxyUrl = optionalString(entry.proxyUrl) ?? (apiUrl === "https://api.void.cloud" ? "https://proxy.void.cloud" : apiUrl === "https://api.staging.void.cloud" ? "https://proxy.staging.void.cloud" : null);
69
+ const proxyUrl = optionalString(entry.proxyUrl);
70
70
  return {
71
71
  accountId: optionalString(entry.accountId),
72
72
  apiUrl,
@@ -428,4 +428,4 @@ function removePlatformConnectionForInstallation(installationId, directory = pla
428
428
  });
429
429
  }
430
430
  //#endregion
431
- export { writeKeyringPassword as S, selectPlatformConnection as _, listInstallationManifests as a, deleteKeyringPassword as b, platformCredentialAccount as c, readInstallationRecoverySecrets as d, readPendingInstallationSecrets as f, savePlatformConnection as g, resolveInstallationManifest as h, latestPlatformWorkerCutoverGeneration as i, platformWorkerSecretUpdateIntentState as l, removePlatformConnectionForInstallation as m, assertPlatformInstallationSlugAvailable as n, listPlatformConnections as o, removeInstallationRecoverySecrets as p, getActivePlatformConnection as r, normalizePlatformApiUrl as s, acquirePlatformLifecycleLock as t, promoteInstallationSecrets as u, writeInstallationManifest as v, readKeyringPassword as x, writePendingInstallationSecrets as y };
431
+ export { writeKeyringPassword as C, readKeyringPassword as S, savePlatformConnection as _, listInstallationManifests as a, writePendingInstallationSecrets as b, platformCredentialAccount as c, promoteInstallationSecrets as d, readInstallationRecoverySecrets as f, resolveInstallationManifest as g, removePlatformConnectionForInstallation as h, latestPlatformWorkerCutoverGeneration as i, platformRegistryDirectory as l, removeInstallationRecoverySecrets as m, assertPlatformInstallationSlugAvailable as n, listPlatformConnections as o, readPendingInstallationSecrets as p, getActivePlatformConnection as r, normalizePlatformApiUrl as s, acquirePlatformLifecycleLock as t, platformWorkerSecretUpdateIntentState as u, selectPlatformConnection as v, deleteKeyringPassword as x, writeInstallationManifest as y };