void 0.26.0 → 0.27.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 (365) hide show
  1. package/AGENTS_TEMPLATE.md +1 -3
  2. package/README.md +19 -9
  3. package/dist/{account-cmd-CDry3B5V.mjs → account-cmd-l-FM7Ioq.mjs} +8 -7
  4. package/dist/{application-analysis-DC2yPvzY.mjs → application-analysis-DKy02UY0.mjs} +21 -32
  5. package/dist/{application-routing-C9khgLiS.mjs → application-routing-DQyUh_5S.mjs} +1 -1
  6. package/dist/{auth-D52yG7hl.mjs → auth-Dn2vw-SG.mjs} +9 -9
  7. package/dist/{auth-B60QDbjg.mjs → auth-LMJcNESe.mjs} +1 -1
  8. package/dist/{auth-link-DjeOptYi.mjs → auth-link-vz9Z2kmG.mjs} +5 -5
  9. package/dist/{auth-migrations-9vif1uj8.mjs → auth-migrations-BwHgeEsD.mjs} +8 -18
  10. package/dist/{auth-router-BRxIuqDi.mjs → auth-router-DvsCUVw4.mjs} +6 -19
  11. package/dist/{better-auth-shared-BVkjZ3vM.d.mts → better-auth-shared-CPvWD3nG.d.mts} +0 -4
  12. package/dist/{better-auth-shared-hy6RPh9W.mjs → better-auth-shared-DPpj8zxc.mjs} +94 -16
  13. package/dist/{build-cmd-Ce3C8huo.mjs → build-cmd-D6we0VjO.mjs} +8 -7
  14. package/dist/{cache-CS8Yxr5a.mjs → cache-CZRdzKx1.mjs} +8 -8
  15. package/dist/{cancel-deploy-mZsD88Xa.mjs → cancel-deploy-CQ3NnMvf.mjs} +6 -5
  16. package/dist/{cf-access-YTlqvAsk.mjs → cf-access-BcIBSKqG.mjs} +11 -12
  17. package/dist/{cf-build-output-U8o1Gl6X.mjs → cf-build-output-DjvB_872.mjs} +62 -85
  18. package/dist/cf-build-output-H9a97vME.mjs +2 -0
  19. package/dist/cf-user-agent-lKblH3zU.mjs +17 -0
  20. package/dist/cli/cli.mjs +48 -83
  21. package/dist/cli/cloudflare-operation-process.mjs +78 -78
  22. package/dist/cli/env-schema-probe.mjs +5 -6
  23. package/dist/{client-mC-dFGDD.mjs → client-DlDJuY0s.mjs} +30 -8
  24. package/dist/client-tso2OfcG.mjs +2 -0
  25. package/dist/{cloudflare-auth-Qdc7tw8F.mjs → cloudflare-auth-CuxfF6OA.mjs} +9 -17
  26. package/dist/{cloudflare-cmd-bhwCxAN6.mjs → cloudflare-cmd-lHqNlJGW.mjs} +6 -5
  27. package/dist/{cloudflare-config-Bktvwtpf.mjs → cloudflare-config-BmhBv3HV.mjs} +1 -1
  28. package/dist/{cloudflare-connect-CuhRgk3k.mjs → cloudflare-connect-2G3rL2rP.mjs} +4 -4
  29. package/dist/{cloudflare-operations-DoQrVHAt.mjs → cloudflare-operations-BlYLlowZ.mjs} +1 -1
  30. package/dist/{cloudflare-operations-DYa3coIk.mjs → cloudflare-operations-CwI1bChl.mjs} +41 -70
  31. package/dist/{cloudflare-process-B-wekeR6.mjs → cloudflare-process-2-TfIEzB.mjs} +20 -22
  32. package/dist/{config-CyQ-wVd7.mjs → config-5r-YpMC-.mjs} +1 -1
  33. package/dist/{config-C_XRIPx2.mjs → config-B_ggY-IO.mjs} +3 -3
  34. package/dist/config-BtSFvXZx.mjs +2 -0
  35. package/dist/config-CLYAosnQ.mjs +78 -0
  36. package/dist/{config-BMHb8RCj.d.mts → config-CSa15FvD.d.mts} +1 -1
  37. package/dist/{config-Br_JZD6u.mjs → config-DiowPT80.mjs} +24 -30
  38. package/dist/config-entry.d.mts +1 -1
  39. package/dist/{config-write-B1f88wJA.mjs → config-write-AHGesphx.mjs} +8 -7
  40. package/dist/{connect-H6EvP62X.mjs → connect-BfPBHHm-.mjs} +12 -11
  41. package/dist/{create-project-B2kk9Q0o.mjs → create-project-BdXEFKal.mjs} +7 -7
  42. package/dist/{create-project-Dbb4uiN-.mjs → create-project-qFDC45zg.mjs} +1 -1
  43. package/dist/{db-DpCKZto0.mjs → db-Xs80hcaA.mjs} +101 -133
  44. package/dist/{delete-CxlSvsvW.mjs → delete-d2vuou3j.mjs} +7 -7
  45. package/dist/{deploy-CeEbnv4b.mjs → deploy-Bqe1PYBw.mjs} +2351 -2497
  46. package/dist/deploy-VsWsVQkw.mjs +2 -0
  47. package/dist/{dev-inbox-D64ZKUod.mjs → dev-inbox-CK-UuPob.mjs} +7 -16
  48. package/dist/{discover-BcPPiF1o.mjs → discover-CkCYv9T_.mjs} +1 -2
  49. package/dist/discover-EDUf6JJw.mjs +2 -0
  50. package/dist/{prompts-ZAuJlyCj.mjs → dist-Bx1z6Eva.mjs} +1 -1
  51. package/dist/{dist-AoCzRTJE.mjs → dist-Cegxq8gs.mjs} +8 -8
  52. package/dist/{prompts-6OSVA7DJ.mjs → dist-D3m88sjf.mjs} +10 -53
  53. package/dist/{domain-B_9VgOm6.mjs → domain-BsDUBAvt.mjs} +29 -30
  54. package/dist/{dotenv-VQxupEUv.mjs → dotenv-BfU6eqFt.mjs} +20 -32
  55. package/dist/{drizzle-Beb2Am5S.mjs → drizzle-CF84FOVM.mjs} +16 -13
  56. package/dist/{email-BokHgjKj.mjs → email-_lGAHOhp.mjs} +24 -19
  57. package/dist/{email--tEtMoj_.mjs → email-d_Aux1vM.mjs} +1 -1
  58. package/dist/{entry-CF5wvH4w.mjs → entry-CMAkqBmU.mjs} +6 -6
  59. package/dist/{env-_v349JBd.mjs → env-BxocywBB.mjs} +25 -6
  60. package/dist/{env-BdTc-K2L.mjs → env-C74QepDE.mjs} +10 -10
  61. package/dist/{env-D5liuQYR.mjs → env-DMA3cXZt.mjs} +1 -1
  62. package/dist/{env-raw-Cx8ElDdj.mjs → env-raw-jZpP5n47.mjs} +1 -2
  63. package/dist/{env-types-D5kds_OZ.mjs → env-types-CwXgeMgL.mjs} +1 -1
  64. package/dist/{env-validation-cZBvGWaP.mjs → env-validation-CrVNjsPm.mjs} +1 -1
  65. package/dist/{env-validation-vBSQ8gw5.mjs → env-validation-Dxdx_5wo.mjs} +17 -21
  66. package/dist/{fetch-_SeGZao9.d.mts → fetch-BPCYVi3H.d.mts} +20 -1
  67. package/dist/{fetch-BIZJh7vR.mjs → fetch-sAcwjzLO.mjs} +1 -1
  68. package/dist/{fetch-stream-Nm3hkZbT.mjs → fetch-stream-PGgz4uGz.mjs} +18 -23
  69. package/dist/{fetch-stream-Bjf0hoZb.d.mts → fetch-stream-obvZ7fvO.d.mts} +1 -16
  70. package/dist/{gen-BhDlTpwW.mjs → gen-DtkQhvQg.mjs} +40 -57
  71. package/dist/gen-dA9hW7AV.mjs +2 -0
  72. package/dist/{github-cmd-hhkTzlGS.mjs → github-cmd-DaDdBbSS.mjs} +65 -164
  73. package/dist/{handler-DghKr6dU.mjs → handler-BHAn2fZJ.mjs} +1 -0
  74. package/dist/{handler-BeK3weD4.d.mts → handler-CNAwjRcW.d.mts} +4 -11
  75. package/dist/{head-Do8P4puT.d.mts → head-C8K_iGe6.d.mts} +1 -1
  76. package/dist/{head-D_QRR5Yd.mjs → head-D2VF4ApL.mjs} +29 -51
  77. package/dist/{headers-2rKda9Y6.mjs → headers-DlfR78Nu.mjs} +3 -3
  78. package/dist/{help-Bv44e2tm.mjs → help-0bTe_lID.mjs} +13 -32
  79. package/dist/help-DfQYVfGY.mjs +2 -0
  80. package/dist/{inbound-fRkqcXaC.mjs → inbound-PfQDLXc5.mjs} +23 -24
  81. package/dist/index.d.mts +19 -2
  82. package/dist/index.mjs +619 -532
  83. package/dist/{info-DhtTKh65.mjs → info-PYWwkWyt.mjs} +4 -4
  84. package/dist/{init-BMf4T03q.mjs → init-DaBGmaXC.mjs} +161 -198
  85. package/dist/{link-BqYsSS_I.mjs → link-C6fjafep.mjs} +10 -10
  86. package/dist/{list-_kBToO-l.mjs → list-BTFBlqKl.mjs} +9 -8
  87. package/dist/{live-CB1y5IuC.mjs → live-CgQuTpqD.mjs} +15 -16
  88. package/dist/{live-iAuEH1hd.d.mts → live-Du8jXwOW.d.mts} +4 -2
  89. package/dist/{local-d1-fGxYrVD6.mjs → local-d1-ga5O_idV.mjs} +2 -2
  90. package/dist/{login-DFuo-RWO.mjs → login-GKcNUmtI.mjs} +7 -7
  91. package/dist/login-mx_ydhmp.mjs +2 -0
  92. package/dist/{logs-DYgnh6dH.mjs → logs-BiMSULmc.mjs} +28 -11
  93. package/dist/migrate-BHp07yJE.mjs +2 -0
  94. package/dist/{migrate-CV1on-yJ.mjs → migrate-NLsjBbuM.mjs} +34 -20
  95. package/dist/{mime-D5Nmdzf7.mjs → mime-DxCznlJq.mjs} +45 -95
  96. package/dist/{node-C6Q6e1Es.mjs → node-DJicPvPj.mjs} +5 -5
  97. package/dist/{operator-args-DdY54Bgb.mjs → operator-args-DOBhIaIg.mjs} +10 -1
  98. package/dist/{operator-auth-2dsGlTT5.mjs → operator-auth-BEZ_u0Cz.mjs} +2 -2
  99. package/dist/{operator-client-BFqpp6z0.mjs → operator-client-DbDv4vtE.mjs} +2 -2
  100. package/dist/{operator-cmd-CUGHXrQf.mjs → operator-cmd-BT4hgavL.mjs} +24 -11
  101. package/dist/operator-cmd-CwBB-1yb.mjs +2 -0
  102. package/dist/{output-BvdaehtE.mjs → output-C50ag2r3.mjs} +20 -2
  103. package/dist/pages/client.d.mts +19 -51
  104. package/dist/pages/client.mjs +204 -225
  105. package/dist/pages/head-client.d.mts +1 -1
  106. package/dist/pages/head.d.mts +1 -1
  107. package/dist/pages/head.mjs +1 -1
  108. package/dist/pages/index.d.mts +2 -2
  109. package/dist/pages/index.mjs +6 -12
  110. package/dist/pages/islands-plugin.d.mts +1 -1
  111. package/dist/pages/islands-plugin.mjs +21 -25
  112. package/dist/pages/protocol.d.mts +2 -2
  113. package/dist/pages/protocol.mjs +2 -2
  114. package/dist/{plan-CJGEeTEI.mjs → plan-BhLO2p4w.mjs} +2 -1
  115. package/dist/plan-CH2G51je.mjs +2 -0
  116. package/dist/platform-args-D4E1PjVw.mjs +2 -0
  117. package/dist/{platform-args-DSV2p4nY.mjs → platform-args-DUeXY9Om.mjs} +1 -1
  118. package/dist/{platform-auth-config-Bosx7U1h.mjs → platform-auth-config-CkSx3usH.mjs} +40 -36
  119. package/dist/{platform-auth-protection-DcbL_LW_.mjs → platform-auth-protection-BJimB_p9.mjs} +9 -8
  120. package/dist/{platform-auth-recovery-WfTZ8K6o.mjs → platform-auth-recovery-BU6izFAU.mjs} +8 -7
  121. package/dist/{platform-cmd-DbKtQb_4.mjs → platform-cmd-BbY1dWiM.mjs} +14 -13
  122. package/dist/{platform-cmd-dyFUof0t.mjs → platform-cmd-BbmJiq5O.mjs} +1 -1
  123. package/dist/{platform-discovery-BC0HCKYt.mjs → platform-discovery-DIYz8V63.mjs} +1 -1
  124. package/dist/{platform-domain-Bsq43AJp.mjs → platform-domain-CHVS6cV0.mjs} +6 -6
  125. package/dist/{platform-lifecycle--5gWmDoI.mjs → platform-lifecycle-ByAlpkhV.mjs} +1 -1
  126. package/dist/{platform-lifecycle-Cfi0o6xM.mjs → platform-lifecycle-DzCwqhFq.mjs} +76 -387
  127. package/dist/{platform-management-Bbwf6-Dq.mjs → platform-management-CBOT4BSM.mjs} +1 -1
  128. package/dist/{platform-management-BrF9STZp.mjs → platform-management-CuuVDhyt.mjs} +7 -7
  129. package/dist/{platform-plans-config-DU-8nC2Y.mjs → platform-plans-config-CN-heS4q.mjs} +5 -4
  130. package/dist/{platform-recovery-DQAqAQYu.mjs → platform-recovery-CskSJgLh.mjs} +3 -3
  131. package/dist/{platform-registry-P387v42A.mjs → platform-registry-Cjv2Qf0r.mjs} +5 -1
  132. package/dist/platform-setup-BBxRxmFC.mjs +299 -0
  133. package/dist/{plugin-inference-CXWnn79A.mjs → plugin-inference-BlQbOL0P.mjs} +43 -42
  134. package/dist/prepare-DRUV-g3X.mjs +2 -0
  135. package/dist/{prepare-WoUubFKL.mjs → prepare-Do96654b.mjs} +8 -8
  136. package/dist/{prepare-BMrRWLwP.mjs → prepare-Dq9hTIbo.mjs} +4 -4
  137. package/dist/{prerender-render-D9qbLs2f.mjs → prerender-render-Ct20jftc.mjs} +17 -3
  138. package/dist/prerender-render.mjs +1 -1
  139. package/dist/{project-DQstYTxO.mjs → project-BAm2aB6Q.mjs} +1 -1
  140. package/dist/{project-BiaPQ7ur.mjs → project-DedqCp59.mjs} +1 -1
  141. package/dist/{project-cmd-BbH2LptN.mjs → project-cmd-DaoRrn-8.mjs} +19 -19
  142. package/dist/{project-team-Yiww3-go.mjs → project-team-Q_lCA7Io.mjs} +15 -18
  143. package/dist/{project-token-BrtT2NkY.mjs → project-token-BArgK9o1.mjs} +14 -17
  144. package/dist/{project-tsconfig-B8GeM0RM.mjs → project-tsconfig-CVJhNMxs.mjs} +2 -1
  145. package/dist/{project-zero-trust-nYJ2V2nc.mjs → project-zero-trust-KO9Hu2Pq.mjs} +12 -9
  146. package/dist/{protocol-BX8t2jiw.d.mts → protocol-BPZaNqBo.d.mts} +4 -2
  147. package/dist/{protocol-U7bfjHmA.mjs → protocol-CfaUwNs8.mjs} +46 -49
  148. package/dist/{providers-CJlNS3kT.mjs → providers-BXuhmuub.mjs} +1 -12
  149. package/dist/{provision-VeqAC77A.mjs → provision-BfaLiWbj.mjs} +38 -41
  150. package/dist/{provision-DMTPG8Rh.mjs → provision-Wu9ZBk9L.mjs} +2 -3
  151. package/dist/{requests-TIz_jtSu.mjs → requests-C7Oeoh5u.mjs} +5 -5
  152. package/dist/resolve-project-BIeYs9Cw.mjs +2 -0
  153. package/dist/{resolve-project-BG5ORGID.mjs → resolve-project-CP8rZs_p.mjs} +6 -1
  154. package/dist/{rollback-dBqICPzj.mjs → rollback-DVAtrLAl.mjs} +30 -37
  155. package/dist/{route-types-Clm4WD0B.mjs → route-types-CbtsIeFn.mjs} +1 -1
  156. package/dist/route-url-BgPja1GS.d.mts +5 -0
  157. package/dist/route-url-BjGv_KKY.mjs +28 -0
  158. package/dist/runner-9wjsSZx-.mjs +2 -0
  159. package/dist/{runner--2KF6Kua.mjs → runner-DMBKSrRk.mjs} +2 -2
  160. package/dist/{runner-mysql-DmWchSWJ.mjs → runner-mysql-CEzKtmFb.mjs} +8 -8
  161. package/dist/{runner-mysql-CEG5JozK.mjs → runner-mysql-CkFqZ6CE.mjs} +1 -1
  162. package/dist/{runner-pg-Bh4AgZdj.mjs → runner-pg-BGYRFdRp.mjs} +1 -1
  163. package/dist/runtime/ai.d.mts +1 -1
  164. package/dist/runtime/ai.mjs +34 -95
  165. package/dist/runtime/better-auth-mysql.d.mts +1 -1
  166. package/dist/runtime/better-auth-mysql.mjs +4 -9
  167. package/dist/runtime/better-auth-pg.d.mts +1 -1
  168. package/dist/runtime/better-auth-pg.mjs +5 -10
  169. package/dist/runtime/better-auth.d.mts +1 -1
  170. package/dist/runtime/better-auth.mjs +3 -3
  171. package/dist/runtime/client-react.d.mts +2 -3
  172. package/dist/runtime/client-react.mjs +2 -2
  173. package/dist/runtime/client-solid.d.mts +2 -3
  174. package/dist/runtime/client-solid.mjs +2 -2
  175. package/dist/runtime/client-svelte.d.mts +2 -3
  176. package/dist/runtime/client-svelte.mjs +2 -2
  177. package/dist/runtime/client-vue.d.mts +2 -3
  178. package/dist/runtime/client-vue.mjs +2 -2
  179. package/dist/runtime/client.d.mts +2 -3
  180. package/dist/runtime/client.mjs +2 -2
  181. package/dist/runtime/db.mjs +1 -1
  182. package/dist/runtime/durable.mjs +3 -10
  183. package/dist/runtime/email/testing.mjs +5 -5
  184. package/dist/runtime/email.d.mts +2 -1
  185. package/dist/runtime/email.mjs +11 -27
  186. package/dist/runtime/env-public.mjs +15 -20
  187. package/dist/runtime/env.mjs +1 -1
  188. package/dist/runtime/fetch-stream.d.mts +2 -2
  189. package/dist/runtime/fetch-stream.mjs +1 -1
  190. package/dist/runtime/fetch.d.mts +2 -3
  191. package/dist/runtime/fetch.mjs +1 -1
  192. package/dist/runtime/handler.d.mts +1 -1
  193. package/dist/runtime/handler.mjs +2 -2
  194. package/dist/runtime/isr.mjs +1 -1
  195. package/dist/runtime/kv.mjs +10 -11
  196. package/dist/runtime/live-client.d.mts +1 -1
  197. package/dist/runtime/live-client.mjs +12 -22
  198. package/dist/runtime/live-server.mjs +27 -35
  199. package/dist/runtime/live.d.mts +2 -2
  200. package/dist/runtime/live.mjs +2 -2
  201. package/dist/runtime/migration-handler.mjs +4 -81
  202. package/dist/runtime/queues.mjs +1 -1
  203. package/dist/runtime/remote/binding-handler.d.mts +2 -2
  204. package/dist/runtime/remote/binding-handler.mjs +8 -9
  205. package/dist/runtime/remote/index.mjs +27 -77
  206. package/dist/runtime/route-url.d.mts +2 -4
  207. package/dist/runtime/route-url.mjs +1 -1
  208. package/dist/runtime/routing.d.mts +1 -1
  209. package/dist/runtime/routing.mjs +15 -26
  210. package/dist/runtime/sandbox.mjs +2 -2
  211. package/dist/runtime/sse.mjs +1 -1
  212. package/dist/runtime/storage.mjs +1 -1
  213. package/dist/runtime/validator.d.mts +1 -1
  214. package/dist/runtime/ws-server.d.mts +2 -2
  215. package/dist/runtime/ws-server.mjs +30 -61
  216. package/dist/runtime/ws.d.mts +1 -1
  217. package/dist/runtime/ws.mjs +1 -1
  218. package/dist/{scan-C8dA7iM4.mjs → scan-C3uDzz6J.mjs} +12 -13
  219. package/dist/{secret-AKnNXNP5.mjs → secret-BvtB7IjY.mjs} +15 -15
  220. package/dist/{skills-BPQUGClu.mjs → skills-BgVMvQdy.mjs} +2 -2
  221. package/dist/{sse-CQNaDFFV.mjs → sse-CMvCgjNk.mjs} +1 -1
  222. package/dist/{subcommand-prompt-B6WS9Aoz.mjs → subcommand-prompt-BSlnD1fI.mjs} +2 -2
  223. package/dist/sveltekit.d.mts +0 -2
  224. package/dist/terminal-log-text-D9ACPOuG.mjs +32 -0
  225. package/dist/validate-BJr9LfXy.mjs +2 -0
  226. package/dist/{validate-ymhap6M_.mjs → validate-C9qJArv7.mjs} +9 -28
  227. package/dist/{defer-YsYDUoii.mjs → validation-error-Dg9Recn1.mjs} +11 -11
  228. package/dist/{wrangler-DhUerFkW.mjs → wrangler-D9KTuqnv.mjs} +89 -194
  229. package/dist/{ws-C79j4aED.d.mts → ws-CChrrAU-.d.mts} +1 -1
  230. package/dist/{yarn-pnp-BV4AzNul.mjs → yarn-pnp-CUX_iTPA.mjs} +19 -27
  231. package/{skills/void/docs → docs}/guide/ai.md +5 -3
  232. package/{skills/void/docs → docs}/guide/auth.md +37 -1
  233. package/{skills/void/docs → docs}/guide/database/postgresql.md +2 -2
  234. package/{skills/void/docs → docs}/guide/deployment.md +2 -2
  235. package/{skills/void/docs → docs}/guide/edge/revalidation.md +1 -1
  236. package/{skills/void/docs → docs}/guide/edge/rewrites.md +2 -4
  237. package/{skills/void/docs → docs}/guide/email/receiving.md +2 -2
  238. package/{skills/void/docs → docs}/guide/email/sending.md +0 -2
  239. package/{skills/void/docs → docs}/guide/env-vars.md +4 -0
  240. package/{skills/void/docs → docs}/guide/jobs.md +2 -2
  241. package/{skills/void/docs → docs}/guide/live.md +10 -5
  242. package/{skills/void/docs → docs}/guide/pages-routing/actions-and-forms.md +20 -8
  243. package/{skills/void/docs → docs}/guide/pages-routing/loaders.md +7 -3
  244. package/{skills/void/docs → docs}/guide/pages-routing/markdown.md +15 -23
  245. package/{skills/void/docs → docs}/guide/pages-routing/overview.md +6 -4
  246. package/{skills/void/docs → docs}/guide/platform/administration/access.md +3 -11
  247. package/{skills/void/docs → docs}/guide/platform/administration/operations.md +3 -12
  248. package/{skills/void/docs → docs}/guide/platform/administration/projects.md +1 -1
  249. package/{skills/void/docs → docs}/guide/platform/development/local.md +4 -2
  250. package/{skills/void/docs → docs}/guide/platform/development/runtime.md +1 -1
  251. package/{skills/void/docs → docs}/guide/platform/development/schema-ci.md +1 -1
  252. package/{skills/void/docs → docs}/guide/platform/installation/domains.md +3 -1
  253. package/{skills/void/docs → docs}/guide/platform/installation/first-deployment.md +4 -2
  254. package/{skills/void/docs → docs}/guide/platform/installation/maintenance.md +4 -0
  255. package/{skills/void/docs → docs}/guide/project-collaboration.md +7 -3
  256. package/{skills/void/docs → docs}/guide/queues.md +0 -2
  257. package/{skills/void/docs → docs}/guide/remote-dev.md +5 -5
  258. package/{skills/void/docs → docs}/guide/sandboxes.md +2 -2
  259. package/{skills/void/docs → docs}/guide/sse.md +0 -2
  260. package/{skills/void/docs → docs}/guide/storage.md +7 -2
  261. package/{skills/void/docs → docs}/guide/websockets.md +4 -0
  262. package/docs/integrations/agents.md +37 -0
  263. package/{skills/void/docs → docs}/integrations/frameworks/astro.md +3 -3
  264. package/{skills/void/docs → docs}/integrations/frameworks/nuxt.md +6 -2
  265. package/{skills/void/docs → docs}/integrations/hono.md +15 -7
  266. package/{skills/void/docs → docs}/integrations/nodejs-bun-deno.md +1 -0
  267. package/{skills/void/docs → docs}/reference/api/auth.md +1 -1
  268. package/{skills/void/docs → docs}/reference/api/handlers.md +4 -2
  269. package/{skills/void/docs → docs}/reference/api/pages.md +4 -0
  270. package/{skills/void/docs → docs}/reference/cli/auth.md +1 -6
  271. package/{skills/void/docs → docs}/reference/cli/database.md +3 -4
  272. package/{skills/void/docs → docs}/reference/cli/deploy.md +1 -1
  273. package/{skills/void/docs → docs}/reference/cli/generate.md +1 -1
  274. package/{skills/void/docs → docs}/reference/cli/github.md +3 -12
  275. package/{skills/void/docs → docs}/reference/cli/platform-config.md +1 -1
  276. package/{skills/void/docs → docs}/reference/cli/platform-email.md +2 -3
  277. package/{skills/void/docs → docs}/reference/cli/platform-installation.md +1 -1
  278. package/{skills/void/docs → docs}/reference/cli/platform-operations.md +3 -0
  279. package/{skills/void/docs → docs}/reference/cli/platform-users.md +2 -2
  280. package/{skills/void/docs → docs}/reference/cli/project.md +5 -4
  281. package/{skills/void/docs → docs}/reference/cli/secrets.md +3 -3
  282. package/{skills/void/docs → docs}/reference/cli/setup.md +9 -11
  283. package/{skills/void/docs → docs}/reference/cli.md +1 -1
  284. package/{skills/void/docs → docs}/reference/config.md +13 -13
  285. package/{skills/void/docs → docs}/reference/resource-inference.md +1 -16
  286. package/package.json +34 -30
  287. package/schema.json +1 -1
  288. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +4 -1
  289. package/skills/void/SKILL.md +9 -5
  290. package/dist/cf-build-output-ChY6-XWP.mjs +0 -2
  291. package/dist/client-BxVixJBI.mjs +0 -2
  292. package/dist/config-0acf1oys.mjs +0 -2
  293. package/dist/config-D8MOgiQV.mjs +0 -32
  294. package/dist/deploy-qmiLE1G1.mjs +0 -2
  295. package/dist/discover-AMCBXivQ.mjs +0 -2
  296. package/dist/fetch-error-Sp1R4mZv.d.mts +0 -20
  297. package/dist/gen-qCBwH3fZ.mjs +0 -2
  298. package/dist/help-Dw5f9Xrg.mjs +0 -2
  299. package/dist/login-D7meQg_3.mjs +0 -2
  300. package/dist/migrate-CEu2X5DB.mjs +0 -2
  301. package/dist/operator-cmd-DRPvhpjM.mjs +0 -2
  302. package/dist/plan-COtUvdMA.mjs +0 -2
  303. package/dist/platform-args-Dcy_5b_Y.mjs +0 -2
  304. package/dist/prepare-BBknoZI1.mjs +0 -2
  305. package/dist/resolve-project-DtbidV4y.mjs +0 -2
  306. package/dist/route-url-CG7U-cRN.mjs +0 -15
  307. package/dist/runner-voIltZrY.mjs +0 -2
  308. package/dist/validate-pna7R3Pv.mjs +0 -2
  309. package/skills/void/docs/integrations/agents.md +0 -26
  310. package/dist/{runner-pg-D4OPlil-.mjs → runner-pg-DV8p_zjA.mjs} +4 -4
  311. package/{skills/void/docs → docs}/guide/app-types.md +0 -0
  312. package/{skills/void/docs → docs}/guide/database/d1.md +2 -2
  313. package/{skills/void/docs → docs}/guide/database/mysql.md +0 -0
  314. package/{skills/void/docs → docs}/guide/database.md +8 -8
  315. package/{skills/void/docs → docs}/guide/durable-state.md +0 -0
  316. package/{skills/void/docs → docs}/guide/edge/headers.md +0 -0
  317. package/{skills/void/docs → docs}/guide/edge/prerendering.md +0 -0
  318. package/{skills/void/docs → docs}/guide/edge/redirects.md +0 -0
  319. package/{skills/void/docs → docs}/guide/edge/static-assets.md +0 -0
  320. package/{skills/void/docs → docs}/guide/email/domains.md +0 -0
  321. package/{skills/void/docs → docs}/guide/email.md +0 -0
  322. package/{skills/void/docs → docs}/guide/index.md +0 -0
  323. package/{skills/void/docs → docs}/guide/kv.md +0 -0
  324. package/{skills/void/docs → docs}/guide/pages-routing/head.md +0 -0
  325. package/{skills/void/docs → docs}/guide/pages-routing/islands.md +2 -2
  326. package/{skills/void/docs → docs}/guide/pages-routing/layouts.md +0 -0
  327. package/{skills/void/docs → docs}/guide/pages-routing/view-transitions.md +0 -0
  328. package/{skills/void/docs → docs}/guide/platform/administration/email.md +0 -0
  329. package/{skills/void/docs → docs}/guide/platform/administration/plans.md +0 -0
  330. package/{skills/void/docs → docs}/guide/platform/administration/zero-trust.md +0 -0
  331. package/{skills/void/docs → docs}/guide/platform/installation/ci.md +0 -0
  332. package/{skills/void/docs → docs}/guide/platform/installation/credentials.md +0 -0
  333. package/{skills/void/docs → docs}/guide/platform/installation/prerequisites.md +0 -0
  334. package/{skills/void/docs → docs}/guide/platform/installation/setup.md +0 -0
  335. package/{skills/void/docs → docs}/guide/platform/installation/uninstall.md +0 -0
  336. package/{skills/void/docs → docs}/guide/platform-administration.md +0 -0
  337. package/{skills/void/docs → docs}/guide/platform-development.md +0 -0
  338. package/{skills/void/docs → docs}/guide/quickstart.md +0 -0
  339. package/{skills/void/docs → docs}/guide/self-hosted-platform.md +0 -0
  340. package/{skills/void/docs → docs}/guide/server-routing.md +3 -3
  341. package/{skills/void/docs → docs}/guide/ssg.md +0 -0
  342. package/{skills/void/docs → docs}/guide/ssr.md +0 -0
  343. package/{skills/void/docs → docs}/guide/type-safety.md +0 -0
  344. package/{skills/void/docs → docs}/guide/typed-fetch.md +0 -0
  345. package/{skills/void/docs → docs}/index.md +0 -0
  346. package/{skills/void/docs → docs}/integrations/cloudflare.md +0 -0
  347. package/{skills/void/docs → docs}/integrations/frameworks/analog.md +3 -3
  348. package/{skills/void/docs → docs}/integrations/frameworks/overview.md +0 -0
  349. package/{skills/void/docs → docs}/integrations/frameworks/react-router.md +3 -3
  350. package/{skills/void/docs → docs}/integrations/frameworks/sveltekit.md +1 -1
  351. package/{skills/void/docs → docs}/integrations/frameworks/tanstack-start.md +2 -2
  352. package/{skills/void/docs → docs}/reference/api/client.md +0 -0
  353. package/{skills/void/docs → docs}/reference/api/database.md +2 -2
  354. /package/{skills/void/docs → docs}/reference/api/durable.md +0 -0
  355. /package/{skills/void/docs → docs}/reference/api/env.md +0 -0
  356. /package/{skills/void/docs → docs}/reference/api/plugin.md +0 -0
  357. /package/{skills/void/docs → docs}/reference/api/resources.md +0 -0
  358. /package/{skills/void/docs → docs}/reference/api/rewrites.md +0 -0
  359. /package/{skills/void/docs → docs}/reference/api/types.md +0 -0
  360. /package/{skills/void/docs → docs}/reference/api.md +0 -0
  361. /package/{skills/void/docs → docs}/reference/cli/domains.md +0 -0
  362. /package/{skills/void/docs → docs}/reference/cli/email.md +0 -0
  363. /package/{skills/void/docs → docs}/reference/cli/platform-zero-trust.md +0 -0
  364. /package/{skills/void/docs → docs}/reference/cli/platform.md +0 -0
  365. /package/{skills/void/docs → docs}/reference/structure.md +0 -0
@@ -52,10 +52,8 @@ function rejectCRLF(field, value) {
52
52
  * `rejectCRLF` is enough for a value `encodeWord` renders (the subject, a
53
53
  * custom header value, a display name): anything outside printable ASCII
54
54
  * sends the whole value into base64, so a control never reaches the wire.
55
- * These three go through `quoteParam` or straight into the line, so
56
- * `invoice\x01.pdf` was written raw into `name="…"` and `filename="…"`,
57
- * captured as a success under `void dev` and by the test harness, and left
58
- * for the receiving MTA to refuse.
55
+ * These three go through `quoteParam` or straight into the line, so a
56
+ * control would reach the wire for the receiving MTA to refuse.
59
57
  *
60
58
  * RFC 5322 §3.2.4 `qtext` is printable US-ASCII less `"` and `\`; a
61
59
  * control inside a quoted-string is `obs-qtext`, which §4 says MUST NOT be
@@ -88,12 +86,9 @@ function isTokenChar(c) {
88
86
  * `type "/" subtype *(";" parameter)`.
89
87
  *
90
88
  * `rejectControls` answers only for CTLs, and `buildAttachmentPart` writes
91
- * the value verbatim ahead of its own `; name="…"`, so `text/plain; x="`
92
- * rendered `Content-Type: text/plain; x="; name="a.txt"` — captured as a
93
- * success under `void dev` and by the harness, while Python's `email`
94
- * reports `end of header inside quoted string` on that line and reads the
95
- * builder's `name` parameter as the VALUE of `x`. `text` (no subtype),
96
- * `text/plain; charset` (no value) and `text/plain;;` went the same way.
89
+ * the value verbatim ahead of its own `; name="…"`, so an unterminated
90
+ * quote such as `text/plain; x="` would swallow the builder's `name`
91
+ * parameter as the value of `x`.
97
92
  *
98
93
  * The grammar is the RFC's, read as a generator: a `token` is printable
99
94
  * US-ASCII less SPACE and `tspecials`; a `value` is a `token` or a
@@ -170,10 +165,8 @@ function isAtext(c) {
170
165
  *
171
166
  * `rejectControls` answers only for CTLs, and `buildAttachmentPart` writes
172
167
  * the value verbatim — adding `<` and `>` unless the value already starts
173
- * with `<` — so `logo other` rendered `Content-ID: <logo other>`, `<logo`
174
- * rendered `Content-ID: <logo` and `logo>` rendered `Content-ID: <logo>>`:
175
- * captured as a success under `void dev` and by the harness, and left for
176
- * the receiver to refuse or to fail the `cid:` reference against.
168
+ * with `<` — so a malformed id would reach the receiver and break the
169
+ * `cid:` reference.
177
170
  *
178
171
  * The grammar is the RFC's, read as a generator, with two deliberate
179
172
  * differences. An `msg-id` is `"<" id-left "@" id-right ">"`, each side a
@@ -191,9 +184,7 @@ function isAtext(c) {
191
184
  *
192
185
  * Refused, then: whitespace of any kind, a second `@`, `<` or `>` anywhere
193
186
  * but as that one pair, `"`, `(`, `)`, `,`, `;`, `:`, `\`, `[`, `]`,
194
- * anything non-ASCII, and the empty string (which used to be validated
195
- * and then silently NOT rendered). Everything accepted renders exactly as
196
- * it did.
187
+ * anything non-ASCII, and the empty string.
197
188
  *
198
189
  * One pass, no allocation, which is why this runs AFTER the value's length
199
190
  * bound. The message names the rule and never echoes the value.
@@ -274,12 +265,7 @@ function fieldErrorCode(field) {
274
265
  * `email-router.ts`), so there is exactly ONE address syntax in the tree:
275
266
  * an action the framework records is never dropped by the router for its
276
267
  * shape, and a test harness never captures as a success what the managed
277
- * deployment would lose. The hand-written predecessor grew one character
278
- * per review round — the exactly-one-`@` rule, then every C0 control and
279
- * DEL, then `:`, then a parity test against the router's own regex, which
280
- * had drifted on the dot in the domain — and still admitted `a..b@x.com`,
281
- * `.a@x.com` and `a@x..com`, which no dot-atom allows and every MTA
282
- * refuses. One maintained rule on both sides ends that series.
268
+ * deployment would lose.
283
269
  *
284
270
  * What it enforces: at most 254 characters in total; an ASCII dot-atom
285
271
  * local part of at most 64 characters (RFC 5322 §3.2.3 `atext`, dots only
@@ -315,9 +301,7 @@ function validateAddressParts(field, email, name) {
315
301
  * `x` for any `x` (RFC 5322 §3.2.4 — `qtext` excludes `"` and `\`, so a
316
302
  * quoted-string carries either only as a quoted-pair). The parsed name is
317
303
  * the RAW text `formatAddress` will quote and escape again, so leaving the
318
- * pairs in place rendered `"Smith \"Bob\"" <a@x.dev>` as
319
- * `"Smith \\\"Bob\\\""` and the recipient saw `Smith \"Bob\"`, while the
320
- * object form of the same name rendered correctly. Only the quoted branch
304
+ * pairs in place would escape them twice. Only the quoted branch
321
305
  * of `parseAddress` calls this; a backslash in an unquoted name is a
322
306
  * character like any other, as it is in the object form.
323
307
  *
@@ -328,7 +312,7 @@ function validateAddressParts(field, email, name) {
328
312
  * never bounded at all. Measured, 10 MiB of `\"` pairs peaked at 307 MB of
329
313
  * heap that way and terminated a 128 MB isolate; this shape peaks at 49 MB.
330
314
  * Same discipline as `to7bitBody`: one counting pass, a buffer of exactly
331
- * the output size, one fill, and the 32K-chunk conversion `base64` uses.
315
+ * the output size, one fill, and one chunked `codeUnitsToString`.
332
316
  * The common case — no backslash at all — is one scan and no allocation.
333
317
  * The regex that admits the text guarantees every backslash is followed by
334
318
  * a character, so the fill never reads past the end.
@@ -348,16 +332,13 @@ function unquotePairs(text) {
348
332
  if (c === 92) c = text.charCodeAt(++i);
349
333
  out[n++] = c;
350
334
  }
351
- let s = "";
352
- const chunk = 32768;
353
- for (let i = 0; i < n; i += chunk) s += String.fromCharCode(...out.subarray(i, i + chunk));
354
- return s;
335
+ return codeUnitsToString(out);
355
336
  }
356
337
  /**
357
338
  * Parse one address — a bare `email@domain` or `Display Name <email@domain>`
358
339
  * — into its parts, throwing a `MimeError` for `field` on anything else.
359
- * Exported so `void.json` `email.from` is validated by the same rules the
360
- * runtime applies to `from` at send time.
340
+ * Exported so `void.config.ts` `email.from` is validated by the same rules
341
+ * the runtime applies to `from` at send time.
361
342
  */
362
343
  function parseAddress(value, field) {
363
344
  if (typeof value === "string") {
@@ -525,10 +506,9 @@ const ENCODED_WORD_PAYLOAD_BYTES = 45;
525
506
  * Text longer than one word's payload becomes several encoded-words
526
507
  * separated by a space, which `foldHeader` turns into CRLF + SPACE
527
508
  * wherever a line would otherwise overrun (RFC 2047 §6.2: whitespace
528
- * between adjacent encoded-words is dropped on decode either way). A
529
- * single unbounded word breached both §2's 75-character ceiling and —
530
- * for a long subject or display name — RFC 5322 §2.1.1's 998-octet hard
531
- * line limit, which nothing downstream repairs.
509
+ * between adjacent encoded-words is dropped on decode either way). This
510
+ * keeps each word under §2's 75-character ceiling and a long subject or
511
+ * display name under RFC 5322 §2.1.1's 998-octet line limit.
532
512
  */
533
513
  function encodeWord(text) {
534
514
  if (ASCII_PRINTABLE.test(text)) return text;
@@ -561,20 +541,14 @@ function encodeWord(text) {
561
541
  * quoted-string`, and `atext` is everything printable EXCEPT these, so an
562
542
  * ASCII name containing any of them must be rendered as one quoted-string.
563
543
  * The class below lists the thirteen in the RFC's order so it can be checked
564
- * against the production by eye. This check has been wrong twice: it once
565
- * sat inside a branch that had already excluded every special, so it was
566
- * unreachable and a comma in a name split the address list; then the list
567
- * itself lacked `.`, so `Dr. Smith <a@x.dev>` went out unquoted. That is
568
- * `obs-phrase` (§4.1, `word *(word / "." / CFWS)`), which §4 says MUST NOT
569
- * be generated, and a strict receiver flags it as obsolete syntax (Python's
570
- * `email` parser: "period in 'phrase'"). Every conforming generator —
571
- * Python's `email.headerregistry.Address`, for one — emits `"Dr. Smith"`.
544
+ * against the production by eye. `.` matters: an unquoted `Dr. Smith` is
545
+ * `obs-phrase` (§4.1), which §4 says MUST NOT be generated.
572
546
  */
573
547
  const RFC5322_SPECIALS = /[()<>[\]:;@\\,."]/;
574
548
  function formatAddress(addr) {
575
549
  if (!addr.name) return addr.email;
576
550
  if (!ASCII_PRINTABLE.test(addr.name)) return `${encodeWord(addr.name)} <${addr.email}>`;
577
- if (RFC5322_SPECIALS.test(addr.name)) return `"${addr.name.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}" <${addr.email}>`;
551
+ if (RFC5322_SPECIALS.test(addr.name)) return `"${quoteParam(addr.name)}" <${addr.email}>`;
578
552
  return `${addr.name} <${addr.email}>`;
579
553
  }
580
554
  function formatAddressList(addrs) {
@@ -596,13 +570,10 @@ function formatAddressList(addrs) {
596
570
  * best a WSP-only fold rule allows (§3.2.2 permits folding only at WSP).
597
571
  *
598
572
  * One pass, and the only thing kept per input character is the folded
599
- * output itself: each finished line is one flat string in `lines`. The
600
- * earlier shape — tokenize the whole value into an array of slices, wrap
601
- * each in a `{ text, comma }` object, then grow the result with `out +=`
602
- * per token — held about 130 bytes of heap per token for the length of the
603
- * fold (a slice, an object and a cons-string node each), so a legal 3 MB
604
- * subject of one-letter words terminated a 128 MB isolate. That was a
605
- * per-TOKEN cost, invisible to any size projection: the message fit.
573
+ * output itself: each finished line is one flat string in `lines`. Any
574
+ * per-token allocation (a slice array, token objects, `out +=`) costs about
575
+ * 130 bytes of heap per token, so a legal 3 MB subject of one-letter words
576
+ * would terminate a 128 MB isolate even though the message fits.
606
577
  */
607
578
  function foldHeader(name, value) {
608
579
  const line = `${name}: ${value}`;
@@ -713,10 +684,9 @@ const HEADER_NAME_LINE_OVERHEAD = 1;
713
684
  * fixed width — so a hit is always a header.
714
685
  *
715
686
  * One pass over the string, counting UTF-8 octets per CRLF-delimited line,
716
- * with NO allocation. The earlier `text.split(CRLF)` held one array slot and
717
- * one substring per line for the whole scan, and a legal body of millions of
718
- * short lines — pasted logs, say — is millions of lines. Only a CRLF pair
719
- * ends a line, exactly as the split did; a bare CR or LF is content.
687
+ * with NO allocation: a `split(CRLF)` would hold one substring per line, and
688
+ * a legal body of pasted logs is millions of lines. Only a CRLF pair ends a
689
+ * line; a bare CR or LF is content.
720
690
  */
721
691
  function findOverlongLine(text) {
722
692
  let index = 0;
@@ -751,28 +721,16 @@ function findOverlongLine(text) {
751
721
  * quoted-string comes from RFC 5322 §3.2.4).
752
722
  *
753
723
  * `qtext` excludes both `\\` and `"`, so each may appear only as a
754
- * quoted-pair. Deleting the quotes and leaving backslashes raw — what this
755
- * did before — is wrong in two ways: a TRAILING backslash escapes the
756
- * closing quote and leaves the parameter unterminated, and every embedded
757
- * backslash is silently eaten by a conformant parser, so a Windows path
758
- * `C:\\Users\\bob\\report.pdf` arrived as `C:Usersbobreport.pdf`. Measured,
759
- * Python's `email.policy.default` and postal-mime both report
760
- * `InvalidHeaderDefect: end of header inside quoted string` on the first
761
- * case and disagree with a naive parser on the second.
724
+ * quoted-pair: a raw trailing backslash would escape the closing quote, and
725
+ * a conformant parser drops every other raw backslash.
762
726
  *
763
727
  * Backslash first, then quote — the other order would double-escape.
764
- *
765
- * Note this file's own `foldHeader` already tracks quoted-pairs when
766
- * folding, so the emitter was contradicting the folder.
767
728
  */
768
729
  function quoteParam(value) {
769
730
  return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
770
731
  }
771
732
  function base64(bytes) {
772
- let binary = "";
773
- const chunk = 32768;
774
- for (let i = 0; i < bytes.length; i += chunk) binary += String.fromCharCode(...bytes.subarray(i, i + chunk));
775
- return btoa(binary);
733
+ return btoa(codeUnitsToString(bytes));
776
734
  }
777
735
  function base64Wrapped(bytes) {
778
736
  const encoded = base64(bytes);
@@ -829,13 +787,13 @@ function quotedPrintable(text) {
829
787
  }
830
788
  flush(b);
831
789
  }
832
- return bytesToAsciiString(out.subarray(0, n));
790
+ return codeUnitsToString(out.subarray(0, n));
833
791
  }
834
- /** Pure-ASCII bytes to a string, in the same 32K chunks `base64` uses. */
835
- function bytesToAsciiString(bytes) {
792
+ /** One character per code unit, in 32K chunks to stay under the call-argument limit. */
793
+ function codeUnitsToString(units) {
836
794
  let s = "";
837
795
  const chunk = 32768;
838
- for (let i = 0; i < bytes.length; i += chunk) s += String.fromCharCode(...bytes.subarray(i, i + chunk));
796
+ for (let i = 0; i < units.length; i += chunk) s += String.fromCharCode(...units.subarray(i, i + chunk));
839
797
  return s;
840
798
  }
841
799
  /**
@@ -844,13 +802,9 @@ function bytesToAsciiString(bytes) {
844
802
  * makes 998 octets the hard limit). Only LF and CRLF end a line; a bare CR
845
803
  * is a control character like any other and forces the encoding.
846
804
  *
847
- * One pass over the string with NO allocation. The earlier shape — strip
848
- * every line break with a global `replace`, test the copy, then `split` the
849
- * text into an array of lines — was linear in the message but held a copy
850
- * of the body plus one array slot and one substring per line, and a legal
851
- * 6 MB body of millions of two-character lines needed 64 MB for the strip
852
- * and another 24-40 MB for the split. Those are per-LINE costs, invisible
853
- * to any size projection: the message fit.
805
+ * One pass over the string with NO allocation: a `replace`/`split` shape
806
+ * holds a copy of the body plus one substring per line, and a legal 6 MB
807
+ * body of millions of two-character lines needed about 100 MB that way.
854
808
  */
855
809
  function needsQuotedPrintable(text) {
856
810
  let lineLen = 0;
@@ -895,7 +849,7 @@ function to7bitBody(text) {
895
849
  if (c === 10 && (i === 0 || text.charCodeAt(i - 1) !== 13)) out[n++] = 13;
896
850
  out[n++] = c;
897
851
  }
898
- return bytesToAsciiString(out);
852
+ return codeUnitsToString(out);
899
853
  }
900
854
  /**
901
855
  * Lower bound on the octets `text` will occupy in the rendered message, in
@@ -961,16 +915,14 @@ function makeBoundary(prefix) {
961
915
  crypto.getRandomValues(bytes);
962
916
  return `=_void_${prefix}_${base64(bytes).replace(/[+/=]/g, "")}`;
963
917
  }
964
- function wrapMultipart(type, parts, extra = {}) {
918
+ function wrapMultipart(type, parts) {
965
919
  const boundary = makeBoundary(type);
966
- const headerEntries = [["Content-Type", `multipart/${type}; boundary="${boundary}"`]];
967
- for (const [k, v] of Object.entries(extra)) headerEntries.push([k, v]);
968
920
  return {
969
- headers: headerEntries,
921
+ headers: [["Content-Type", `multipart/${type}; boundary="${boundary}"`]],
970
922
  body: parts.map((p) => `--${boundary}${CRLF}${renderPart(p)}`).join(CRLF) + `${CRLF}--${boundary}--${CRLF}`
971
923
  };
972
924
  }
973
- const RESERVED_HEADERS = new Set([
925
+ const RESERVED_HEADERS = /* @__PURE__ */ new Set([
974
926
  "from",
975
927
  "to",
976
928
  "cc",
@@ -985,7 +937,7 @@ const RESERVED_HEADERS = new Set([
985
937
  "content-type",
986
938
  "content-transfer-encoding",
987
939
  "content-disposition"
988
- ].map((h) => h.toLowerCase()));
940
+ ]);
989
941
  /**
990
942
  * Lower bound on the octets one header VALUE occupies once `encodeWord` (or
991
943
  * `formatAddress`, for a display name) and `foldHeader` have rendered it, in
@@ -1132,10 +1084,8 @@ const CUSTOM_HEADER_FRAMING_OCTETS = 4;
1132
1084
  * empty values the names and the `: ` CRLF around each are the entire
1133
1085
  * size, and the framing is exact once the name is counted (see
1134
1086
  * `CUSTOM_HEADER_FRAMING_OCTETS`), so charging both cannot reject a
1135
- * message that fits. Measured before the name was charged, 60k empty
1136
- * headers with 500-character names — a 30 MB message — projected to
1137
- * zero, rendered in full and peaked at 121 MB of a 128 MB isolate; 100k
1138
- * of them (50 MB) went to 169 MB.
1087
+ * message that fits. Uncharged, 60k empty headers with 500-character
1088
+ * names (a 30 MB message) would project to zero.
1139
1089
  * - An attachment part: `normalizeAttachment` bounds ONE filename at under
1140
1090
  * a kilobyte, not the sum, and a message is free to carry any number of
1141
1091
  * parts, so the filename and the framing every part is wrapped in are
@@ -1145,7 +1095,7 @@ const CUSTOM_HEADER_FRAMING_OCTETS = 4;
1145
1095
  * `rawText` and `raw` — and terminated a 128 MB isolate before the final
1146
1096
  * size check could return `MIME_ERROR`.
1147
1097
  *
1148
- * The header COUNT is deliberately not bounded here. Each header now costs
1098
+ * The header COUNT is deliberately not bounded here. Each header costs
1149
1099
  * at least five octets (a one-character name, `: `, CRLF), so the count
1150
1100
  * the projection can admit is finite, and past a few hundred thousand keys
1151
1101
  * the caller's own object — measured at about 74 bytes per key, before
@@ -1,10 +1,10 @@
1
1
  import { a as join } from "./dist-BVqXeR_h.mjs";
2
2
  import { n as loadVoidAuthConfig, t as findVoidAuthConfig } from "./config-DPByhVck.mjs";
3
- import { m as readConfig } from "./config-Br_JZD6u.mjs";
4
- import { r as getMiniflareDatabasePath } from "./runner--2KF6Kua.mjs";
5
- import { a as loadLocalEnv } from "./env-_v349JBd.mjs";
6
- import { r as resolveVoidAuthMigrationSchema } from "./drizzle-Beb2Am5S.mjs";
7
- import { n as applyPgAuthMigrations, r as applySqliteAuthMigrations, t as applyMySqlAuthMigrations } from "./auth-migrations-9vif1uj8.mjs";
3
+ import { m as readConfig } from "./config-DiowPT80.mjs";
4
+ import { r as getMiniflareDatabasePath } from "./runner-DMBKSrRk.mjs";
5
+ import { o as loadLocalEnv } from "./env-BxocywBB.mjs";
6
+ import { r as resolveVoidAuthMigrationSchema } from "./drizzle-CF84FOVM.mjs";
7
+ import { n as applyPgAuthMigrations, r as applySqliteAuthMigrations, t as applyMySqlAuthMigrations } from "./auth-migrations-BwHgeEsD.mjs";
8
8
  //#region src/auth/node.ts
9
9
  async function runLocalVoidAuthMigrations(root, dialect, persistRoot = join(root, ".void"), databaseId = "local", configPath = findVoidAuthConfig(root)) {
10
10
  const authConfig = await loadVoidAuthConfig(configPath);
@@ -1,4 +1,4 @@
1
- import { t as OPERATOR_MAX_TIMEOUT_MS } from "./operator-client-BFqpp6z0.mjs";
1
+ import { t as OPERATOR_MAX_TIMEOUT_MS } from "./operator-client-DbDv4vtE.mjs";
2
2
  //#region src/cli/operator-args.ts
3
3
  const operatorCommands = [
4
4
  {
@@ -366,6 +366,15 @@ const operatorCommands = [
366
366
  values: { cursor: "Opaque cursor returned by --plan" },
367
367
  method: "POST"
368
368
  },
369
+ {
370
+ group: "system",
371
+ action: "rotate-proxy-tokens",
372
+ description: "Rotate project proxy tokens on tenant Workers",
373
+ path: "/system/rotate-proxy-tokens",
374
+ values: { project: "Project ID" },
375
+ booleans: ["all"],
376
+ method: "POST"
377
+ },
369
378
  {
370
379
  group: "email",
371
380
  action: "policy",
@@ -1,5 +1,5 @@
1
- import { C as deleteKeyringPassword, T as writeKeyringPassword, c as normalizePlatformApiUrl, i as getActivePlatformConnection, r as findPlatformConnections, u as platformCredentialAccount, w as readKeyringPassword } from "./platform-registry-P387v42A.mjs";
2
- import { n as OperatorClient, r as OperatorClientError } from "./operator-client-BFqpp6z0.mjs";
1
+ import { C as deleteKeyringPassword, T as writeKeyringPassword, c as normalizePlatformApiUrl, i as getActivePlatformConnection, r as findPlatformConnections, u as platformCredentialAccount, w as readKeyringPassword } from "./platform-registry-Cjv2Qf0r.mjs";
2
+ import { n as OperatorClient, r as OperatorClientError } from "./operator-client-DbDv4vtE.mjs";
3
3
  /** Operator authority never comes from repository-controlled metadata. */
4
4
  function resolveOperatorOrigin(connection = "") {
5
5
  if (connection) {
@@ -1,6 +1,6 @@
1
- import { c as normalizePlatformApiUrl } from "./platform-registry-P387v42A.mjs";
1
+ import { c as normalizePlatformApiUrl } from "./platform-registry-Cjv2Qf0r.mjs";
2
2
  import { t as cfAccessHeaders } from "./cf-access-TWNzXltp.mjs";
3
- import { t as ensureCloudflaredToken } from "./cf-access-YTlqvAsk.mjs";
3
+ import { t as ensureCloudflaredToken } from "./cf-access-BcIBSKqG.mjs";
4
4
  const OPERATOR_MAX_TIMEOUT_MS = 36e5;
5
5
  var OperatorClientError = class extends Error {
6
6
  code;
@@ -1,5 +1,6 @@
1
- import { n as OperatorClient, r as OperatorClientError } from "./operator-client-BFqpp6z0.mjs";
2
- import { a as resolveOperatorOrigin, i as removeOperatorToken, n as readOperatorApiTokenStdin, o as saveOperatorToken, r as readOperatorToken, t as exchangeOperatorSession } from "./operator-auth-2dsGlTT5.mjs";
1
+ import { d as printSuccess, f as sanitizeTerminalText } from "./output-C50ag2r3.mjs";
2
+ import { n as OperatorClient, r as OperatorClientError } from "./operator-client-DbDv4vtE.mjs";
3
+ import { a as resolveOperatorOrigin, i as removeOperatorToken, n as readOperatorApiTokenStdin, o as saveOperatorToken, r as readOperatorToken, t as exchangeOperatorSession } from "./operator-auth-BEZ_u0Cz.mjs";
3
4
  import { createHash } from "node:crypto";
4
5
  import { setTimeout } from "node:timers/promises";
5
6
  import { createInterface } from "node:readline/promises";
@@ -8,8 +9,8 @@ const MAX_RUNTIME_FOLLOW_ROWS = 1e4;
8
9
  const BUILD_LOG_DRAIN_TIMEOUT_MS = 12e4;
9
10
  function printable(value) {
10
11
  if (value === null || value === void 0) return "—";
11
- if (typeof value === "string") return value.replace(/[\u0000-\u001f\u007f]/g, " ");
12
- if (typeof value === "object") return JSON.stringify(value);
12
+ if (typeof value === "string") return sanitizeTerminalText(value);
13
+ if (typeof value === "object") return sanitizeTerminalText(JSON.stringify(value));
13
14
  return String(value);
14
15
  }
15
16
  function table(rows, indent) {
@@ -73,6 +74,13 @@ function humanLines(value, indent = "") {
73
74
  function output(value, json) {
74
75
  console.log(json ? JSON.stringify(value) : humanLines(value).join("\n"));
75
76
  }
77
+ function outputMutation(result, args) {
78
+ output(result, args.json);
79
+ const configuration = result.configuration;
80
+ const project = result.project;
81
+ if (args.json || result.ok === false || result.partial === true || result.complete === false || result.error || result.operationStatus && result.operationStatus !== "completed" || configuration?.status && configuration.status !== "ready" && configuration.status !== "disabled" || project?.state === "reconciling" || project?.state === "error" || project?.last_error) return;
82
+ printSuccess(`Platform ${args.group} ${args.action} completed.`);
83
+ }
76
84
  function outputLogs(result, json) {
77
85
  if (json) {
78
86
  output(result, true);
@@ -155,9 +163,9 @@ async function runAuth(origin, args) {
155
163
  if (args.action === "login" || args.action === "token" && args.tokenStdin) {
156
164
  if (!args.tokenStdin && !process.stdin.isTTY) throw new OperatorClientError("Browser login requires an interactive terminal. Use --token-stdin to exchange an API session.", "interactive_login_required");
157
165
  const apiToken = args.tokenStdin ? await readOperatorApiTokenStdin() : await (async () => {
158
- const { discoverPlatform } = await import("./platform-cmd-dyFUof0t.mjs");
159
- const { selectPlatformLoginMethod } = await import("./login-D7meQg_3.mjs");
160
- const { runPlatformLogin } = await import("./auth-B60QDbjg.mjs");
166
+ const { discoverPlatform } = await import("./platform-cmd-BbmJiq5O.mjs");
167
+ const { selectPlatformLoginMethod } = await import("./login-mx_ydhmp.mjs");
168
+ const { runPlatformLogin } = await import("./auth-LMJcNESe.mjs");
161
169
  return runPlatformLogin(origin, (await selectPlatformLoginMethod(await discoverPlatform(origin), args.providerExplicit ? args.provider : void 0)).id, (url) => process.stderr.write(`Sign in at ${url}\n`));
162
170
  })();
163
171
  const session = await exchangeOperatorSession(origin, apiToken);
@@ -174,6 +182,7 @@ async function runAuth(origin, args) {
174
182
  origin,
175
183
  ...identity
176
184
  }, args.json);
185
+ if (!args.json) printSuccess("Signed in to platform administration.");
177
186
  }
178
187
  return;
179
188
  }
@@ -194,6 +203,7 @@ async function runAuth(origin, args) {
194
203
  ok: true,
195
204
  ...process.env.VOID_OPERATOR_TOKEN ? { message: "Operator session revoked. Unset VOID_OPERATOR_TOKEN in your shell." } : {}
196
205
  }, args.json);
206
+ if (!args.json) printSuccess("Signed out of platform administration.");
197
207
  } else {
198
208
  const session = await client.request("/session");
199
209
  if (args.action === "token") {
@@ -320,7 +330,10 @@ async function migrateDeploymentAssets(client, origin, args) {
320
330
  result
321
331
  });
322
332
  output(result, args.json);
323
- if (result.complete) return;
333
+ if (result.complete) {
334
+ if (!args.json) printSuccess("Deployment assets migrated.");
335
+ return;
336
+ }
324
337
  const cursor = nextCursor;
325
338
  seenCursors.add(cursor);
326
339
  body = {
@@ -331,7 +344,7 @@ async function migrateDeploymentAssets(client, origin, args) {
331
344
  }
332
345
  async function runOperatorCommand(args) {
333
346
  if (!args.action) {
334
- const { printHelpPage } = await import("./help-Dw5f9Xrg.mjs");
347
+ const { printHelpPage } = await import("./help-DfQYVfGY.mjs");
335
348
  printHelpPage(["platform", args.group]);
336
349
  return;
337
350
  }
@@ -370,11 +383,11 @@ async function runOperatorCommand(args) {
370
383
  ...args.group === "project" && args.action === "normalize" ? { expected: preview.changes } : {},
371
384
  ...recoveryFence
372
385
  };
373
- output(await client.request(args.path, {
386
+ outputMutation(await client.request(args.path, {
374
387
  method: "POST",
375
388
  body,
376
389
  timeoutMs: args.timeoutMs
377
- }), args.json);
390
+ }), args);
378
391
  } else if (args.follow) await followOperatorLogs(client, args);
379
392
  else {
380
393
  const result = await client.request(args.path, { query: args.query });
@@ -0,0 +1,2 @@
1
+ import { a as runOperatorCommand } from "./operator-cmd-BT4hgavL.mjs";
2
+ export { runOperatorCommand };
@@ -1,8 +1,13 @@
1
1
  import { n as __toESM } from "./rolldown-runtime-DXIUcv95.mjs";
2
2
  import { t as require_picocolors } from "./picocolors-BTps1_gs.mjs";
3
- import { B as note$1, L as log, P as isCI, nt as settings, q as spinner } from "./prompts-6OSVA7DJ.mjs";
3
+ import { B as note$1, H as outro, L as log, P as isCI, nt as settings, q as spinner } from "./dist-D3m88sjf.mjs";
4
+ import { stripVTControlCharacters } from "node:util";
4
5
  //#region src/cli/output.ts
5
6
  var import_picocolors = /* @__PURE__ */ __toESM(require_picocolors(), 1);
7
+ /** Complete an action with the same spacing, checkmark, and color on every target. */
8
+ function printSuccess(message) {
9
+ outro(`\n${import_picocolors.default.green(`✓ ${stripVTControlCharacters(message)}`)}`, { withGuide: false });
10
+ }
6
11
  function formatCount(count, singular, plural = `${singular}s`) {
7
12
  return `${count} ${count === 1 ? singular : plural}`;
8
13
  }
@@ -109,5 +114,18 @@ function ensureUtc(s) {
109
114
  if (s.lastIndexOf("-") > 9) return s;
110
115
  return s + "Z";
111
116
  }
117
+ /**
118
+ * Stack frames of an error a Worker reported, one line per frame. The log or
119
+ * exception line already shows `Name: message`, so a leading copy of that
120
+ * header is dropped; Workers send stacks both with and without it.
121
+ */
122
+ function errorStackFrames(error) {
123
+ if (!error || typeof error !== "object") return [];
124
+ const { name, message, stack } = error;
125
+ if (typeof stack !== "string") return [];
126
+ const header = message ? `${String(name)}: ${String(message)}` : String(name);
127
+ const frames = stack === header ? "" : stack.startsWith(`${header}\n`) ? stack.slice(header.length + 1) : stack;
128
+ return frames.trimEnd() ? frames.trimEnd().split("\n") : [];
129
+ }
112
130
  //#endregion
113
- export { ensureUtc as a, import_picocolors as c, sectionTitle as d, tablePrefix as f, dim as i, note as l, cliCommandName as n, formatCount as o, createSpinner as r, helpLine as s, categoryTitle as t, sanitizeTerminalText as u };
131
+ export { ensureUtc as a, helpLine as c, printSuccess as d, sanitizeTerminalText as f, dim as i, import_picocolors as l, tablePrefix as m, cliCommandName as n, errorStackFrames as o, sectionTitle as p, createSpinner as r, formatCount as s, categoryTitle as t, note as u };
@@ -1,4 +1,5 @@
1
- import { t as PageObject } from "../protocol-BX8t2jiw.mjs";
1
+ import { t as interpolateRouteParams } from "../route-url-BgPja1GS.mjs";
2
+ import { t as PageObject } from "../protocol-BPZaNqBo.mjs";
2
3
  import { n as CacheForInput, r as CacheForResult } from "../prefetch-Ce6la4EI.mjs";
3
4
  import { UsageLimitData } from "@void/edge";
4
5
  import { ActionUrl, ResolveActionBody, ResolveActionParams } from "void/routes";
@@ -33,7 +34,7 @@ type PageComponentModule = {
33
34
  default: unknown;
34
35
  };
35
36
  type PageData = PageObject;
36
- type VisitOptions$1 = {
37
+ type VisitOptions = {
37
38
  method?: string;
38
39
  data?: unknown;
39
40
  preserveScroll?: boolean;
@@ -50,7 +51,7 @@ type VisitOptions$1 = {
50
51
  /** @internal Used by popstate handler to avoid writing history while traversing */
51
52
  _popstate?: boolean;
52
53
  };
53
- type PrefetchOptions$1 = {
54
+ type PrefetchOptions = {
54
55
  method?: string;
55
56
  cacheFor?: CacheForInput;
56
57
  };
@@ -88,7 +89,7 @@ type PageNavigationResource = {
88
89
  fetchUrl: string;
89
90
  hash: string;
90
91
  method: string;
91
- options: VisitOptions$1;
92
+ options: VisitOptions;
92
93
  immediate: boolean;
93
94
  shell: Promise<PageNavigationResult | undefined>;
94
95
  abort(): void;
@@ -100,17 +101,25 @@ type PageNavigationEngine = {
100
101
  initialPageData: PageData;
101
102
  initialComponent: unknown;
102
103
  initialLayouts: Array<unknown>;
103
- prepareVisit(url: string, options?: VisitOptions$1): PageNavigationResource;
104
- prefetch(url: string, options?: PrefetchOptions$1): Promise<unknown>;
104
+ prepareVisit(url: string, options?: VisitOptions): PageNavigationResource;
105
+ prefetch(url: string, options?: PrefetchOptions): Promise<unknown>;
105
106
  flush(url: string, method?: string): void;
106
107
  flushAll(): void;
107
- setPopStateHandler(handler: (url: string, options: VisitOptions$1) => void): void;
108
+ setPopStateHandler(handler: (url: string, options: VisitOptions) => void): void;
108
109
  start(): void;
109
110
  /** Called after the adapter commits the initial page DOM. */
110
111
  commitInitialRender(): void;
111
112
  };
113
+ export declare function isFile(value: unknown): boolean;
114
+ export declare function hasFiles(data: unknown): boolean;
115
+ export declare function objectToFormData(source: Record<string, unknown>, form?: FormData, parentKey?: string): FormData;
112
116
  export declare function createPageNavigationEngine(config: PageNavigationEngineConfig): Promise<PageNavigationEngine>;
113
117
  //#endregion
118
+ //#region src/pages/adapter-helpers.d.ts
119
+ export declare function getValidationErrors(body: unknown): Record<string, string> | null;
120
+ export declare function mergeDataIntoHref(href: string, data?: Record<string, unknown>): string;
121
+ export declare function isModifiedEvent(e: Pick<MouseEvent, "currentTarget" | "ctrlKey" | "metaKey" | "shiftKey" | "altKey" | "button">): boolean;
122
+ //#endregion
114
123
  //#region src/pages/form-value-equality.d.ts
115
124
  export declare function isEqualFormValue(a: unknown, b: unknown): boolean;
116
125
  //#endregion
@@ -128,27 +137,6 @@ export declare function formSubmissionBlocked(form: Pick<FormModel, "pending" |
128
137
  export declare function scheduleFormRetry(error: VoidActionError | null, ready: () => void): () => void;
129
138
  //#endregion
130
139
  //#region src/pages/client.d.ts
131
- export type VisitOptions = {
132
- method?: string;
133
- data?: unknown;
134
- preserveScroll?: boolean;
135
- preserveState?: boolean;
136
- replace?: boolean;
137
- viewTransition?: boolean;
138
- /** @internal Used by React Actions to avoid waiting for a commit blocked by the action itself. */
139
- _resolveOnShell?: boolean;
140
- /** @internal Used by popstate handler to pass saved scroll position */
141
- _scrollPosition?: {
142
- x: number;
143
- y: number;
144
- } | null;
145
- /** @internal Used by popstate handler to avoid writing history while traversing */
146
- _popstate?: boolean;
147
- };
148
- export type PrefetchOptions = {
149
- method?: string;
150
- cacheFor?: CacheForInput;
151
- };
152
140
  export type NavigationStateType = "idle" | "loading" | "submitting";
153
141
  export type NavigationMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
154
142
  export type NavigationState = {
@@ -168,39 +156,19 @@ export type VoidRouter = {
168
156
  flush(url: string | URL, method?: string): void;
169
157
  flushAll(): void;
170
158
  };
171
- export type VoidRouterAdapter = {
172
- createDeferred(): unknown;
173
- resolveDeferred(ref: unknown, value: unknown): unknown;
174
- rejectDeferred(ref: unknown, error: string): unknown;
175
- isLoading(ref: unknown): boolean;
159
+ export type VoidRouterAdapter = VoidRouterAdapter$1 & {
176
160
  applyUpdate(pageData: PageData, component: unknown, layouts: Array<unknown>, options: {
177
161
  preserveState: boolean;
178
162
  }): void | Promise<void>;
179
- onDeferredUpdate?(props: Record<string, unknown>): void;
180
163
  };
181
- export type VoidRouterConfig = {
164
+ export type VoidRouterConfig = Omit<PageNavigationEngineConfig, "adapter"> & {
182
165
  adapter: VoidRouterAdapter;
183
- components: Record<string, () => Promise<PageComponentModule>>;
184
- layoutTree: Record<string, Array<string>>;
185
- routeMeta: Record<string, {
186
- island?: boolean;
187
- }>;
188
- matchRoute(url: string): string | null;
189
- staticPageData?: boolean;
190
- staticPageDataFastPath?: boolean;
191
- viewTransitions: boolean;
192
- prefetchHoverDelay: number;
193
- prefetchDefaultCacheFor: CacheForResult;
194
- cacheVisitedPageData?: boolean;
195
166
  onRouteChange?(url: string): void;
196
167
  onNavigationChange?(navigation: NavigationState): void;
197
168
  };
198
169
  export declare function idleNavigationState(): NavigationState;
199
170
  export declare function createRouterFacade(router: VoidRouter, getCurrentUrl: () => string, getCurrentParams?: () => Record<string, string>): VoidRouter;
200
171
  export declare function createSsrRouter(url?: string, params?: Record<string, string>): VoidRouter;
201
- export declare function isFile(value: unknown): boolean;
202
- export declare function hasFiles(data: unknown): boolean;
203
- export declare function objectToFormData(source: Record<string, unknown>, form?: FormData, parentKey?: string): FormData;
204
172
  export declare const ssrProxy: VoidRouter;
205
173
  export declare function submitAction(router: VoidRouter, url: string, options: VisitOptions): Promise<ActionResult>;
206
174
  type ActionMethod = "POST" | "PUT" | "PATCH" | "DELETE";
@@ -230,4 +198,4 @@ export declare function createVoidRouter(config: VoidRouterConfig): Promise<{
230
198
  export declare function scheduleHydration(el: Element, loader: () => Promise<unknown>, props: Record<string, unknown>, strategy: string, hydrateFn: (el: Element, mod: unknown, props: Record<string, unknown>) => void | Promise<void>): void;
231
199
  export declare function initIslands(islands: Record<string, () => Promise<unknown>>, hydrateFn: (el: Element, mod: unknown, props: Record<string, unknown>) => void | Promise<void>): void;
232
200
  //#endregion
233
- export type { ActionErrorHandlingScope, ActionResult, FormMethod, FormModel, PageNavigationEngine, PageNavigationResource, PageNavigationResult };
201
+ export { type ActionErrorHandlingScope, type ActionResult, type FormMethod, type FormModel, type PageNavigationEngine, type PageNavigationResource, type PageNavigationResult, type PrefetchOptions, type VisitOptions, interpolateRouteParams };