void 0.26.0 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/AGENTS_TEMPLATE.md +1 -3
  2. package/README.md +19 -9
  3. package/dist/{account-cmd-CDry3B5V.mjs → account-cmd-CfUXh_nU.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-B5_tZLxT.mjs} +7 -7
  7. package/dist/{auth-B60QDbjg.mjs → auth-BgX2qYSY.mjs} +1 -1
  8. package/dist/{auth-link-DjeOptYi.mjs → auth-link-D5RmKnzh.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-Bap-pvbn.mjs} +4 -17
  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-B58c8iS8.mjs} +7 -6
  14. package/dist/{cache-CS8Yxr5a.mjs → cache-Bo52trKF.mjs} +7 -7
  15. package/dist/{cancel-deploy-mZsD88Xa.mjs → cancel-deploy-BZNz3Q26.mjs} +5 -4
  16. package/dist/{cf-access-YTlqvAsk.mjs → cf-access-ngGqZpHZ.mjs} +10 -11
  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/cli/cli.mjs +48 -83
  20. package/dist/cli/cloudflare-operation-process.mjs +71 -77
  21. package/dist/cli/env-schema-probe.mjs +5 -6
  22. package/dist/client-By4JjMw_.mjs +2 -0
  23. package/dist/{client-mC-dFGDD.mjs → client-C2Prx_Bi.mjs} +28 -6
  24. package/dist/{cloudflare-auth-Qdc7tw8F.mjs → cloudflare-auth-CuxfF6OA.mjs} +9 -17
  25. package/dist/{cloudflare-cmd-bhwCxAN6.mjs → cloudflare-cmd-lHqNlJGW.mjs} +6 -5
  26. package/dist/{cloudflare-config-Bktvwtpf.mjs → cloudflare-config-BmhBv3HV.mjs} +1 -1
  27. package/dist/{cloudflare-connect-CuhRgk3k.mjs → cloudflare-connect-2G3rL2rP.mjs} +4 -4
  28. package/dist/{cloudflare-operations-DoQrVHAt.mjs → cloudflare-operations-BlYLlowZ.mjs} +1 -1
  29. package/dist/{cloudflare-operations-DYa3coIk.mjs → cloudflare-operations-CwI1bChl.mjs} +41 -70
  30. package/dist/{cloudflare-process-B-wekeR6.mjs → cloudflare-process-2-TfIEzB.mjs} +20 -22
  31. package/dist/{config-CyQ-wVd7.mjs → config-5r-YpMC-.mjs} +1 -1
  32. package/dist/{config-C_XRIPx2.mjs → config-B_ggY-IO.mjs} +3 -3
  33. package/dist/config-BtSFvXZx.mjs +2 -0
  34. package/dist/config-CLYAosnQ.mjs +78 -0
  35. package/dist/{config-BMHb8RCj.d.mts → config-CSa15FvD.d.mts} +1 -1
  36. package/dist/{config-Br_JZD6u.mjs → config-DiowPT80.mjs} +24 -30
  37. package/dist/config-entry.d.mts +1 -1
  38. package/dist/{config-write-B1f88wJA.mjs → config-write-AHGesphx.mjs} +8 -7
  39. package/dist/{connect-H6EvP62X.mjs → connect-X0MUA1gk.mjs} +10 -9
  40. package/dist/{create-project-B2kk9Q0o.mjs → create-project-DxiyW6iX.mjs} +6 -6
  41. package/dist/{create-project-Dbb4uiN-.mjs → create-project-iwkbqiBU.mjs} +1 -1
  42. package/dist/{db-DpCKZto0.mjs → db-XnVMHzoV.mjs} +100 -132
  43. package/dist/{delete-CxlSvsvW.mjs → delete-esYlMiSJ.mjs} +6 -6
  44. package/dist/{deploy-CeEbnv4b.mjs → deploy-BsEvnlJl.mjs} +2346 -2495
  45. package/dist/deploy-C1d-YTfp.mjs +2 -0
  46. package/dist/{dev-inbox-D64ZKUod.mjs → dev-inbox-CK-UuPob.mjs} +7 -16
  47. package/dist/{discover-BcPPiF1o.mjs → discover-CkCYv9T_.mjs} +1 -2
  48. package/dist/discover-EDUf6JJw.mjs +2 -0
  49. package/dist/{prompts-ZAuJlyCj.mjs → dist-Bx1z6Eva.mjs} +1 -1
  50. package/dist/{dist-AoCzRTJE.mjs → dist-Cegxq8gs.mjs} +8 -8
  51. package/dist/{prompts-6OSVA7DJ.mjs → dist-D3m88sjf.mjs} +10 -53
  52. package/dist/{domain-B_9VgOm6.mjs → domain-CbbBWhWE.mjs} +28 -29
  53. package/dist/{dotenv-VQxupEUv.mjs → dotenv-BfU6eqFt.mjs} +20 -32
  54. package/dist/{drizzle-Beb2Am5S.mjs → drizzle-CF84FOVM.mjs} +16 -13
  55. package/dist/{email-BokHgjKj.mjs → email-CpuT42g7.mjs} +23 -18
  56. package/dist/{email--tEtMoj_.mjs → email-d_Aux1vM.mjs} +1 -1
  57. package/dist/{entry-CF5wvH4w.mjs → entry-CMAkqBmU.mjs} +6 -6
  58. package/dist/{env-_v349JBd.mjs → env-BxocywBB.mjs} +25 -6
  59. package/dist/{env-D5liuQYR.mjs → env-DMA3cXZt.mjs} +1 -1
  60. package/dist/{env-raw-Cx8ElDdj.mjs → env-raw-jZpP5n47.mjs} +1 -2
  61. package/dist/{env-types-D5kds_OZ.mjs → env-types-CwXgeMgL.mjs} +1 -1
  62. package/dist/{env-validation-cZBvGWaP.mjs → env-validation-CrVNjsPm.mjs} +1 -1
  63. package/dist/{env-validation-vBSQ8gw5.mjs → env-validation-Dxdx_5wo.mjs} +17 -21
  64. package/dist/{env-BdTc-K2L.mjs → env-w9jOyGZn.mjs} +9 -9
  65. package/dist/{fetch-_SeGZao9.d.mts → fetch-BPCYVi3H.d.mts} +20 -1
  66. package/dist/{fetch-BIZJh7vR.mjs → fetch-sAcwjzLO.mjs} +1 -1
  67. package/dist/{fetch-stream-Nm3hkZbT.mjs → fetch-stream-PGgz4uGz.mjs} +18 -23
  68. package/dist/{fetch-stream-Bjf0hoZb.d.mts → fetch-stream-obvZ7fvO.d.mts} +1 -16
  69. package/dist/{gen-BhDlTpwW.mjs → gen-DtkQhvQg.mjs} +40 -57
  70. package/dist/gen-dA9hW7AV.mjs +2 -0
  71. package/dist/{github-cmd-hhkTzlGS.mjs → github-cmd-D_FsOFxq.mjs} +64 -163
  72. package/dist/{handler-DghKr6dU.mjs → handler-BHAn2fZJ.mjs} +1 -0
  73. package/dist/{handler-BeK3weD4.d.mts → handler-CNAwjRcW.d.mts} +4 -11
  74. package/dist/{head-Do8P4puT.d.mts → head-C8K_iGe6.d.mts} +1 -1
  75. package/dist/{head-D_QRR5Yd.mjs → head-D2VF4ApL.mjs} +29 -51
  76. package/dist/{headers-2rKda9Y6.mjs → headers-DlfR78Nu.mjs} +3 -3
  77. package/dist/{help-Bv44e2tm.mjs → help-CVFBTmBx.mjs} +13 -32
  78. package/dist/help-DzKUrQvk.mjs +2 -0
  79. package/dist/{inbound-fRkqcXaC.mjs → inbound-PfQDLXc5.mjs} +23 -24
  80. package/dist/index.d.mts +19 -2
  81. package/dist/index.mjs +617 -530
  82. package/dist/{info-DhtTKh65.mjs → info-PYWwkWyt.mjs} +4 -4
  83. package/dist/{init-BMf4T03q.mjs → init-Bw-fRKGp.mjs} +160 -197
  84. package/dist/{link-BqYsSS_I.mjs → link-DlPG8iX3.mjs} +9 -9
  85. package/dist/{list-_kBToO-l.mjs → list-2GN7_ueV.mjs} +8 -7
  86. package/dist/{live-CB1y5IuC.mjs → live-CgQuTpqD.mjs} +15 -16
  87. package/dist/{live-iAuEH1hd.d.mts → live-Du8jXwOW.d.mts} +4 -2
  88. package/dist/{local-d1-fGxYrVD6.mjs → local-d1-ga5O_idV.mjs} +2 -2
  89. package/dist/{login-DFuo-RWO.mjs → login-D-Q4xw3Q.mjs} +7 -7
  90. package/dist/login-Dc-wuTDq.mjs +2 -0
  91. package/dist/{logs-DYgnh6dH.mjs → logs-rd8J-OFh.mjs} +27 -10
  92. package/dist/migrate-BHp07yJE.mjs +2 -0
  93. package/dist/{migrate-CV1on-yJ.mjs → migrate-NLsjBbuM.mjs} +34 -20
  94. package/dist/{mime-D5Nmdzf7.mjs → mime-DxCznlJq.mjs} +45 -95
  95. package/dist/{node-C6Q6e1Es.mjs → node-DJicPvPj.mjs} +5 -5
  96. package/dist/{operator-args-DdY54Bgb.mjs → operator-args-BNsW5gfp.mjs} +10 -1
  97. package/dist/{operator-auth-2dsGlTT5.mjs → operator-auth-AzVLbrr3.mjs} +1 -1
  98. package/dist/{operator-client-BFqpp6z0.mjs → operator-client-BQtzyG-g.mjs} +1 -1
  99. package/dist/{operator-cmd-CUGHXrQf.mjs → operator-cmd-B6f6Cg9Z.mjs} +24 -11
  100. package/dist/operator-cmd-Cwn50lOV.mjs +2 -0
  101. package/dist/{output-BvdaehtE.mjs → output-C50ag2r3.mjs} +20 -2
  102. package/dist/pages/client.d.mts +19 -51
  103. package/dist/pages/client.mjs +204 -225
  104. package/dist/pages/head-client.d.mts +1 -1
  105. package/dist/pages/head.d.mts +1 -1
  106. package/dist/pages/head.mjs +1 -1
  107. package/dist/pages/index.d.mts +2 -2
  108. package/dist/pages/index.mjs +6 -12
  109. package/dist/pages/islands-plugin.d.mts +1 -1
  110. package/dist/pages/islands-plugin.mjs +21 -25
  111. package/dist/pages/protocol.d.mts +2 -2
  112. package/dist/pages/protocol.mjs +2 -2
  113. package/dist/{plan-CJGEeTEI.mjs → plan-BhLO2p4w.mjs} +2 -1
  114. package/dist/plan-CH2G51je.mjs +2 -0
  115. package/dist/{platform-args-DSV2p4nY.mjs → platform-args-BoZkWQnJ.mjs} +1 -1
  116. package/dist/platform-args-DYgITk0D.mjs +2 -0
  117. package/dist/{platform-auth-config-Bosx7U1h.mjs → platform-auth-config-n603OANg.mjs} +40 -36
  118. package/dist/{platform-auth-protection-DcbL_LW_.mjs → platform-auth-protection-zxDr0hWW.mjs} +8 -7
  119. package/dist/{platform-auth-recovery-WfTZ8K6o.mjs → platform-auth-recovery-tw9lgtgE.mjs} +7 -6
  120. package/dist/{platform-cmd-DbKtQb_4.mjs → platform-cmd-B8-bCb7t.mjs} +10 -10
  121. package/dist/{platform-cmd-dyFUof0t.mjs → platform-cmd-C00YM14r.mjs} +1 -1
  122. package/dist/{platform-domain-Bsq43AJp.mjs → platform-domain-p0kobLV8.mjs} +5 -5
  123. package/dist/{platform-lifecycle-Cfi0o6xM.mjs → platform-lifecycle-D_QEY32D.mjs} +75 -386
  124. package/dist/{platform-lifecycle--5gWmDoI.mjs → platform-lifecycle-vFqtNPPa.mjs} +1 -1
  125. package/dist/{platform-management-BrF9STZp.mjs → platform-management-BdYblvvE.mjs} +6 -6
  126. package/dist/{platform-management-Bbwf6-Dq.mjs → platform-management-oi-SvI3f.mjs} +1 -1
  127. package/dist/{platform-plans-config-DU-8nC2Y.mjs → platform-plans-config-CjiFv5J4.mjs} +5 -4
  128. package/dist/{platform-recovery-DQAqAQYu.mjs → platform-recovery-PvNS9Nl2.mjs} +2 -2
  129. package/dist/platform-setup-DVe42Ws7.mjs +299 -0
  130. package/dist/{plugin-inference-CXWnn79A.mjs → plugin-inference-BlQbOL0P.mjs} +43 -42
  131. package/dist/prepare-DRUV-g3X.mjs +2 -0
  132. package/dist/{prepare-WoUubFKL.mjs → prepare-Do96654b.mjs} +8 -8
  133. package/dist/{prepare-BMrRWLwP.mjs → prepare-Dq9hTIbo.mjs} +4 -4
  134. package/dist/{prerender-render-D9qbLs2f.mjs → prerender-render-Ct20jftc.mjs} +17 -3
  135. package/dist/prerender-render.mjs +1 -1
  136. package/dist/{project-cmd-BbH2LptN.mjs → project-cmd-ti8_yTcA.mjs} +18 -18
  137. package/dist/{project-team-Yiww3-go.mjs → project-team-CDPE1Tsg.mjs} +14 -17
  138. package/dist/{project-token-BrtT2NkY.mjs → project-token-CkZ1cN0Z.mjs} +13 -16
  139. package/dist/{project-tsconfig-B8GeM0RM.mjs → project-tsconfig-CVJhNMxs.mjs} +2 -1
  140. package/dist/{project-zero-trust-nYJ2V2nc.mjs → project-zero-trust-DdjLR61k.mjs} +11 -8
  141. package/dist/{protocol-BX8t2jiw.d.mts → protocol-BPZaNqBo.d.mts} +4 -2
  142. package/dist/{protocol-U7bfjHmA.mjs → protocol-CfaUwNs8.mjs} +46 -49
  143. package/dist/{providers-CJlNS3kT.mjs → providers-BXuhmuub.mjs} +1 -12
  144. package/dist/{provision-VeqAC77A.mjs → provision-BfaLiWbj.mjs} +38 -41
  145. package/dist/{provision-DMTPG8Rh.mjs → provision-Wu9ZBk9L.mjs} +2 -3
  146. package/dist/{requests-TIz_jtSu.mjs → requests-DFAqyYy8.mjs} +4 -4
  147. package/dist/resolve-project-BIeYs9Cw.mjs +2 -0
  148. package/dist/{resolve-project-BG5ORGID.mjs → resolve-project-CP8rZs_p.mjs} +6 -1
  149. package/dist/{rollback-dBqICPzj.mjs → rollback-BKYXBduI.mjs} +29 -36
  150. package/dist/{route-types-Clm4WD0B.mjs → route-types-CbtsIeFn.mjs} +1 -1
  151. package/dist/route-url-BgPja1GS.d.mts +5 -0
  152. package/dist/route-url-BjGv_KKY.mjs +28 -0
  153. package/dist/runner-9wjsSZx-.mjs +2 -0
  154. package/dist/{runner--2KF6Kua.mjs → runner-DMBKSrRk.mjs} +2 -2
  155. package/dist/{runner-mysql-DmWchSWJ.mjs → runner-mysql-CEzKtmFb.mjs} +8 -8
  156. package/dist/{runner-mysql-CEG5JozK.mjs → runner-mysql-CkFqZ6CE.mjs} +1 -1
  157. package/dist/{runner-pg-Bh4AgZdj.mjs → runner-pg-BGYRFdRp.mjs} +1 -1
  158. package/dist/runtime/ai.d.mts +1 -1
  159. package/dist/runtime/ai.mjs +34 -95
  160. package/dist/runtime/better-auth-mysql.d.mts +1 -1
  161. package/dist/runtime/better-auth-mysql.mjs +4 -9
  162. package/dist/runtime/better-auth-pg.d.mts +1 -1
  163. package/dist/runtime/better-auth-pg.mjs +5 -10
  164. package/dist/runtime/better-auth.d.mts +1 -1
  165. package/dist/runtime/better-auth.mjs +3 -3
  166. package/dist/runtime/client-react.d.mts +2 -3
  167. package/dist/runtime/client-react.mjs +2 -2
  168. package/dist/runtime/client-solid.d.mts +2 -3
  169. package/dist/runtime/client-solid.mjs +2 -2
  170. package/dist/runtime/client-svelte.d.mts +2 -3
  171. package/dist/runtime/client-svelte.mjs +2 -2
  172. package/dist/runtime/client-vue.d.mts +2 -3
  173. package/dist/runtime/client-vue.mjs +2 -2
  174. package/dist/runtime/client.d.mts +2 -3
  175. package/dist/runtime/client.mjs +2 -2
  176. package/dist/runtime/db.mjs +1 -1
  177. package/dist/runtime/durable.mjs +3 -10
  178. package/dist/runtime/email/testing.mjs +5 -5
  179. package/dist/runtime/email.d.mts +2 -1
  180. package/dist/runtime/email.mjs +11 -27
  181. package/dist/runtime/env-public.mjs +15 -20
  182. package/dist/runtime/env.mjs +1 -1
  183. package/dist/runtime/fetch-stream.d.mts +2 -2
  184. package/dist/runtime/fetch-stream.mjs +1 -1
  185. package/dist/runtime/fetch.d.mts +2 -3
  186. package/dist/runtime/fetch.mjs +1 -1
  187. package/dist/runtime/handler.d.mts +1 -1
  188. package/dist/runtime/handler.mjs +2 -2
  189. package/dist/runtime/isr.mjs +1 -1
  190. package/dist/runtime/kv.mjs +10 -11
  191. package/dist/runtime/live-client.d.mts +1 -1
  192. package/dist/runtime/live-client.mjs +12 -22
  193. package/dist/runtime/live-server.mjs +27 -35
  194. package/dist/runtime/live.d.mts +2 -2
  195. package/dist/runtime/live.mjs +2 -2
  196. package/dist/runtime/migration-handler.mjs +4 -81
  197. package/dist/runtime/queues.mjs +1 -1
  198. package/dist/runtime/remote/binding-handler.d.mts +2 -2
  199. package/dist/runtime/remote/binding-handler.mjs +8 -9
  200. package/dist/runtime/remote/index.mjs +27 -77
  201. package/dist/runtime/route-url.d.mts +2 -4
  202. package/dist/runtime/route-url.mjs +1 -1
  203. package/dist/runtime/routing.d.mts +1 -1
  204. package/dist/runtime/routing.mjs +15 -26
  205. package/dist/runtime/sandbox.mjs +2 -2
  206. package/dist/runtime/sse.mjs +1 -1
  207. package/dist/runtime/storage.mjs +1 -1
  208. package/dist/runtime/validator.d.mts +1 -1
  209. package/dist/runtime/ws-server.d.mts +2 -2
  210. package/dist/runtime/ws-server.mjs +30 -61
  211. package/dist/runtime/ws.d.mts +1 -1
  212. package/dist/runtime/ws.mjs +1 -1
  213. package/dist/{scan-C8dA7iM4.mjs → scan-C3uDzz6J.mjs} +12 -13
  214. package/dist/{secret-AKnNXNP5.mjs → secret-BAt2KMmO.mjs} +14 -14
  215. package/dist/{skills-BPQUGClu.mjs → skills-BgVMvQdy.mjs} +2 -2
  216. package/dist/{sse-CQNaDFFV.mjs → sse-CMvCgjNk.mjs} +1 -1
  217. package/dist/{subcommand-prompt-B6WS9Aoz.mjs → subcommand-prompt-BSlnD1fI.mjs} +2 -2
  218. package/dist/sveltekit.d.mts +0 -2
  219. package/dist/terminal-log-text-D9ACPOuG.mjs +32 -0
  220. package/dist/validate-BJr9LfXy.mjs +2 -0
  221. package/dist/{validate-ymhap6M_.mjs → validate-C9qJArv7.mjs} +9 -28
  222. package/dist/{defer-YsYDUoii.mjs → validation-error-Dg9Recn1.mjs} +11 -11
  223. package/dist/{wrangler-DhUerFkW.mjs → wrangler-D9KTuqnv.mjs} +89 -194
  224. package/dist/{ws-C79j4aED.d.mts → ws-CChrrAU-.d.mts} +1 -1
  225. package/dist/{yarn-pnp-BV4AzNul.mjs → yarn-pnp-CUX_iTPA.mjs} +19 -27
  226. package/{skills/void/docs → docs}/guide/ai.md +5 -3
  227. package/{skills/void/docs → docs}/guide/auth.md +37 -1
  228. package/{skills/void/docs → docs}/guide/database/postgresql.md +2 -2
  229. package/{skills/void/docs → docs}/guide/edge/revalidation.md +1 -1
  230. package/{skills/void/docs → docs}/guide/edge/rewrites.md +2 -4
  231. package/{skills/void/docs → docs}/guide/email/receiving.md +2 -2
  232. package/{skills/void/docs → docs}/guide/email/sending.md +0 -2
  233. package/{skills/void/docs → docs}/guide/env-vars.md +4 -0
  234. package/{skills/void/docs → docs}/guide/jobs.md +2 -2
  235. package/{skills/void/docs → docs}/guide/live.md +10 -5
  236. package/{skills/void/docs → docs}/guide/pages-routing/actions-and-forms.md +20 -8
  237. package/{skills/void/docs → docs}/guide/pages-routing/loaders.md +7 -3
  238. package/{skills/void/docs → docs}/guide/pages-routing/markdown.md +15 -23
  239. package/{skills/void/docs → docs}/guide/pages-routing/overview.md +6 -4
  240. package/{skills/void/docs → docs}/guide/platform/administration/access.md +2 -10
  241. package/{skills/void/docs → docs}/guide/platform/administration/operations.md +3 -12
  242. package/{skills/void/docs → docs}/guide/platform/administration/projects.md +1 -1
  243. package/{skills/void/docs → docs}/guide/platform/development/local.md +4 -2
  244. package/{skills/void/docs → docs}/guide/platform/development/runtime.md +1 -1
  245. package/{skills/void/docs → docs}/guide/platform/development/schema-ci.md +1 -1
  246. package/{skills/void/docs → docs}/guide/platform/installation/domains.md +3 -1
  247. package/{skills/void/docs → docs}/guide/platform/installation/first-deployment.md +3 -1
  248. package/{skills/void/docs → docs}/guide/platform/installation/maintenance.md +4 -0
  249. package/{skills/void/docs → docs}/guide/project-collaboration.md +6 -2
  250. package/{skills/void/docs → docs}/guide/queues.md +0 -2
  251. package/{skills/void/docs → docs}/guide/remote-dev.md +5 -5
  252. package/{skills/void/docs → docs}/guide/sandboxes.md +2 -2
  253. package/{skills/void/docs → docs}/guide/sse.md +0 -2
  254. package/{skills/void/docs → docs}/guide/storage.md +7 -2
  255. package/{skills/void/docs → docs}/guide/websockets.md +4 -0
  256. package/docs/integrations/agents.md +37 -0
  257. package/{skills/void/docs → docs}/integrations/frameworks/astro.md +3 -3
  258. package/{skills/void/docs → docs}/integrations/frameworks/nuxt.md +6 -2
  259. package/{skills/void/docs → docs}/integrations/hono.md +15 -7
  260. package/{skills/void/docs → docs}/integrations/nodejs-bun-deno.md +1 -0
  261. package/{skills/void/docs → docs}/reference/api/auth.md +1 -1
  262. package/{skills/void/docs → docs}/reference/api/handlers.md +4 -2
  263. package/{skills/void/docs → docs}/reference/api/pages.md +4 -0
  264. package/{skills/void/docs → docs}/reference/cli/auth.md +0 -5
  265. package/{skills/void/docs → docs}/reference/cli/database.md +3 -4
  266. package/{skills/void/docs → docs}/reference/cli/generate.md +1 -1
  267. package/{skills/void/docs → docs}/reference/cli/github.md +3 -12
  268. package/{skills/void/docs → docs}/reference/cli/platform-config.md +1 -1
  269. package/{skills/void/docs → docs}/reference/cli/platform-email.md +2 -3
  270. package/{skills/void/docs → docs}/reference/cli/platform-installation.md +1 -1
  271. package/{skills/void/docs → docs}/reference/cli/platform-operations.md +3 -0
  272. package/{skills/void/docs → docs}/reference/cli/platform-users.md +2 -2
  273. package/{skills/void/docs → docs}/reference/cli/project.md +5 -4
  274. package/{skills/void/docs → docs}/reference/cli/secrets.md +3 -3
  275. package/{skills/void/docs → docs}/reference/cli/setup.md +9 -11
  276. package/{skills/void/docs → docs}/reference/cli.md +1 -1
  277. package/{skills/void/docs → docs}/reference/config.md +13 -13
  278. package/{skills/void/docs → docs}/reference/resource-inference.md +1 -16
  279. package/package.json +34 -30
  280. package/schema.json +1 -1
  281. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +4 -1
  282. package/skills/void/SKILL.md +6 -3
  283. package/dist/cf-build-output-ChY6-XWP.mjs +0 -2
  284. package/dist/client-BxVixJBI.mjs +0 -2
  285. package/dist/config-0acf1oys.mjs +0 -2
  286. package/dist/config-D8MOgiQV.mjs +0 -32
  287. package/dist/deploy-qmiLE1G1.mjs +0 -2
  288. package/dist/discover-AMCBXivQ.mjs +0 -2
  289. package/dist/fetch-error-Sp1R4mZv.d.mts +0 -20
  290. package/dist/gen-qCBwH3fZ.mjs +0 -2
  291. package/dist/help-Dw5f9Xrg.mjs +0 -2
  292. package/dist/login-D7meQg_3.mjs +0 -2
  293. package/dist/migrate-CEu2X5DB.mjs +0 -2
  294. package/dist/operator-cmd-DRPvhpjM.mjs +0 -2
  295. package/dist/plan-COtUvdMA.mjs +0 -2
  296. package/dist/platform-args-Dcy_5b_Y.mjs +0 -2
  297. package/dist/prepare-BBknoZI1.mjs +0 -2
  298. package/dist/resolve-project-DtbidV4y.mjs +0 -2
  299. package/dist/route-url-CG7U-cRN.mjs +0 -15
  300. package/dist/runner-voIltZrY.mjs +0 -2
  301. package/dist/validate-pna7R3Pv.mjs +0 -2
  302. package/skills/void/docs/integrations/agents.md +0 -26
  303. package/dist/{runner-pg-D4OPlil-.mjs → runner-pg-DV8p_zjA.mjs} +4 -4
  304. package/{skills/void/docs → docs}/guide/app-types.md +0 -0
  305. package/{skills/void/docs → docs}/guide/database/d1.md +2 -2
  306. package/{skills/void/docs → docs}/guide/database/mysql.md +0 -0
  307. package/{skills/void/docs → docs}/guide/database.md +8 -8
  308. package/{skills/void/docs → docs}/guide/deployment.md +0 -0
  309. package/{skills/void/docs → docs}/guide/durable-state.md +0 -0
  310. package/{skills/void/docs → docs}/guide/edge/headers.md +0 -0
  311. package/{skills/void/docs → docs}/guide/edge/prerendering.md +0 -0
  312. package/{skills/void/docs → docs}/guide/edge/redirects.md +0 -0
  313. package/{skills/void/docs → docs}/guide/edge/static-assets.md +0 -0
  314. package/{skills/void/docs → docs}/guide/email/domains.md +0 -0
  315. package/{skills/void/docs → docs}/guide/email.md +0 -0
  316. package/{skills/void/docs → docs}/guide/index.md +0 -0
  317. package/{skills/void/docs → docs}/guide/kv.md +0 -0
  318. package/{skills/void/docs → docs}/guide/pages-routing/head.md +0 -0
  319. package/{skills/void/docs → docs}/guide/pages-routing/islands.md +2 -2
  320. package/{skills/void/docs → docs}/guide/pages-routing/layouts.md +0 -0
  321. package/{skills/void/docs → docs}/guide/pages-routing/view-transitions.md +0 -0
  322. package/{skills/void/docs → docs}/guide/platform/administration/email.md +0 -0
  323. package/{skills/void/docs → docs}/guide/platform/administration/plans.md +0 -0
  324. package/{skills/void/docs → docs}/guide/platform/administration/zero-trust.md +0 -0
  325. package/{skills/void/docs → docs}/guide/platform/installation/ci.md +0 -0
  326. package/{skills/void/docs → docs}/guide/platform/installation/credentials.md +0 -0
  327. package/{skills/void/docs → docs}/guide/platform/installation/prerequisites.md +0 -0
  328. package/{skills/void/docs → docs}/guide/platform/installation/setup.md +0 -0
  329. package/{skills/void/docs → docs}/guide/platform/installation/uninstall.md +0 -0
  330. package/{skills/void/docs → docs}/guide/platform-administration.md +0 -0
  331. package/{skills/void/docs → docs}/guide/platform-development.md +0 -0
  332. package/{skills/void/docs → docs}/guide/quickstart.md +0 -0
  333. package/{skills/void/docs → docs}/guide/self-hosted-platform.md +0 -0
  334. package/{skills/void/docs → docs}/guide/server-routing.md +3 -3
  335. package/{skills/void/docs → docs}/guide/ssg.md +0 -0
  336. package/{skills/void/docs → docs}/guide/ssr.md +0 -0
  337. package/{skills/void/docs → docs}/guide/type-safety.md +0 -0
  338. package/{skills/void/docs → docs}/guide/typed-fetch.md +0 -0
  339. package/{skills/void/docs → docs}/index.md +0 -0
  340. package/{skills/void/docs → docs}/integrations/cloudflare.md +0 -0
  341. package/{skills/void/docs → docs}/integrations/frameworks/analog.md +3 -3
  342. package/{skills/void/docs → docs}/integrations/frameworks/overview.md +0 -0
  343. package/{skills/void/docs → docs}/integrations/frameworks/react-router.md +3 -3
  344. package/{skills/void/docs → docs}/integrations/frameworks/sveltekit.md +1 -1
  345. package/{skills/void/docs → docs}/integrations/frameworks/tanstack-start.md +2 -2
  346. package/{skills/void/docs → docs}/reference/api/client.md +0 -0
  347. package/{skills/void/docs → docs}/reference/api/database.md +2 -2
  348. /package/{skills/void/docs → docs}/reference/api/durable.md +0 -0
  349. /package/{skills/void/docs → docs}/reference/api/env.md +0 -0
  350. /package/{skills/void/docs → docs}/reference/api/plugin.md +0 -0
  351. /package/{skills/void/docs → docs}/reference/api/resources.md +0 -0
  352. /package/{skills/void/docs → docs}/reference/api/rewrites.md +0 -0
  353. /package/{skills/void/docs → docs}/reference/api/types.md +0 -0
  354. /package/{skills/void/docs → docs}/reference/api.md +0 -0
  355. /package/{skills/void/docs → docs}/reference/cli/deploy.md +0 -0
  356. /package/{skills/void/docs → docs}/reference/cli/domains.md +0 -0
  357. /package/{skills/void/docs → docs}/reference/cli/email.md +0 -0
  358. /package/{skills/void/docs → docs}/reference/cli/platform-zero-trust.md +0 -0
  359. /package/{skills/void/docs → docs}/reference/cli/platform.md +0 -0
  360. /package/{skills/void/docs → docs}/reference/structure.md +0 -0
@@ -1,6 +1,4 @@
1
1
  ## Void
2
2
 
3
3
  - This project uses [Void](https://void.cloud), a full-stack Vite framework for Cloudflare Workers with file-based API routing, server-rendered pages, and typed backend services.
4
- - Deploy to your Cloudflare account with `void deploy --platform cloudflare`, or explicitly connect to your team’s Void platform with `void connect <url>` before deploying with `void deploy --platform void`. `void deploy` uses the saved destination.
5
- - Use Void's CLI and typed APIs for development and infrastructure. Void infers Cloudflare bindings from your imports; use Void commands to manage them.
6
- - Before working with Void, read the relevant Markdown docs in `node_modules/void/skills/void/docs/`. Start with `guide/quickstart.md` for setup and `reference/cli.md` for commands; consult the other guides and references for any Void feature.
4
+ - Use Void's CLI and typed APIs. Before working with Void, read the relevant Markdown docs in `node_modules/void/docs/`; start with `guide/quickstart.md` for setup and `reference/cli.md` for commands.
package/README.md CHANGED
@@ -1,6 +1,14 @@
1
- # void
1
+ # Void
2
2
 
3
- Build and deploy full-stack Vite apps on Cloudflare Workers. Void provides server routes, server-rendered pages, and typed access to databases, storage, and AI.
3
+ Build and deploy full-stack apps with [Vite](https://vite.dev), running on Cloudflare Workers.
4
+
5
+ Void brings together three open-source tools for you and your coding agents:
6
+
7
+ - **Void SDK:** Build your server and client together with file-based API routes, server-rendered pages, and typed APIs for databases, storage, and AI. Carry types from database queries to the UI.
8
+ - **Void CLI:** Build your app, provision the Cloudflare resources it uses, apply migrations, and deploy with one command. Manage resources, inspect logs, and roll back through the same CLI.
9
+ - **Void Platform:** Install a shared deployment environment in your Cloudflare account for your team or customers, with access controls, resource limits, and usage reporting.
10
+
11
+ The SDK's features are optional and composable. Use React, Vue, Svelte, or Solid for Void pages, or keep a [supported application framework](https://void.cloud/integrations/frameworks/overview) for routing and rendering while Void handles resource APIs, migrations, and deployment.
4
12
 
5
13
  ## Getting Started
6
14
 
@@ -12,26 +20,28 @@ npx void init
12
20
  npm run dev
13
21
  ```
14
22
 
15
- Choose a UI framework, starter, and deployment target. Then deploy:
23
+ Choose your UI framework and starter, then select Cloudflare to deploy to your account:
16
24
 
17
25
  ```sh
18
26
  npx void deploy
19
27
  ```
20
28
 
21
- Void builds your app, provisions its resources, applies migrations, and prints the deployed URL.
29
+ Void builds the app, provisions resources, applies database migrations, and prints your deployed URL. Follow the [Quickstart](https://void.cloud/guide/quickstart) for your first app or to add Void to an existing Vite project.
22
30
 
23
- Follow the [Quickstart](https://void.cloud/guide/quickstart) for your first app or to add Void to an existing project.
31
+ To deploy to a team platform, run `npx void connect <url>` first, then use the same deploy command. See [Install a Void Platform](https://void.cloud/guide/self-hosted-platform) to host one in your Cloudflare account or customize its open-source runtime.
24
32
 
25
33
  ## Documentation
26
34
 
27
- - [Introduction](https://void.cloud/guide/)
28
- - [Server routing](https://void.cloud/guide/server-routing) and [Pages routing](https://void.cloud/guide/pages-routing/overview)
35
+ Read the [Void documentation](https://void.cloud) online or use the Markdown guides and references in `node_modules/void/docs/`, included with the `void` package.
36
+
37
+ `void init` adds a minimal `AGENTS.md` in new projects and asks before changing instructions in existing projects. It also links bundled skills for detected coding agents.
38
+
39
+ - [Server routes](https://void.cloud/guide/server-routing) and [pages](https://void.cloud/guide/pages-routing/overview)
29
40
  - [Database](https://void.cloud/guide/database) and [type safety](https://void.cloud/guide/type-safety)
30
41
  - [Deployment](https://void.cloud/guide/deployment)
31
42
  - [Framework integrations](https://void.cloud/integrations/frameworks/overview)
32
43
  - [API](https://void.cloud/reference/api) and [CLI](https://void.cloud/reference/cli) reference
33
-
34
- To share a deployment platform with your team, see [Install a Void Platform](https://void.cloud/guide/self-hosted-platform).
44
+ - [Coding agents](https://void.cloud/integrations/agents)
35
45
 
36
46
  ## License
37
47
 
@@ -1,15 +1,16 @@
1
- import { c as getToken, f as removeToken } from "./auth-D52yG7hl.mjs";
2
- import { L as log } from "./prompts-6OSVA7DJ.mjs";
3
- import { r as PlatformClient } from "./client-mC-dFGDD.mjs";
4
- import { n as runLoginCommand } from "./login-DFuo-RWO.mjs";
1
+ import { c as getToken, f as removeToken } from "./auth-B5_tZLxT.mjs";
2
+ import { L as log } from "./dist-D3m88sjf.mjs";
3
+ import { d as printSuccess } from "./output-C50ag2r3.mjs";
4
+ import { r as PlatformClient } from "./client-C2Prx_Bi.mjs";
5
+ import { n as runLoginCommand } from "./login-D-Q4xw3Q.mjs";
5
6
  import { execSync } from "node:child_process";
6
7
  //#region src/cli/account-cmd.ts
7
8
  async function runAccountCommand(root, args) {
8
9
  switch (args.subcommand) {
9
10
  case "login": return runLoginCommand(root);
10
- case "link": return import("./auth-link-DjeOptYi.mjs").then(({ runAuthLink }) => runAuthLink(root, args.connectionId));
11
+ case "link": return import("./auth-link-D5RmKnzh.mjs").then(({ runAuthLink }) => runAuthLink(root, args.connectionId));
11
12
  case "logout":
12
- if (removeToken(root)) log.success("Logged out.");
13
+ if (removeToken(root)) printSuccess("Logged out.");
13
14
  else log.info("Not logged in.");
14
15
  return;
15
16
  case "whoami": {
@@ -33,7 +34,7 @@ async function runAccountCommand(root, args) {
33
34
  const cmd = platform === "darwin" ? "pbcopy" : platform === "win32" ? "clip" : "xclip -selection clipboard";
34
35
  try {
35
36
  execSync(cmd, { input: token });
36
- log.success("Token copied to clipboard.");
37
+ printSuccess("Token copied to clipboard.");
37
38
  } catch {
38
39
  log.warn("Could not copy to clipboard. Run `void account token` again.");
39
40
  }
@@ -1,25 +1,20 @@
1
1
  import { a as join, i as isAbsolute, t as basename } from "./dist-BVqXeR_h.mjs";
2
- import { c as scanWebSocketRoutes, f as readResourceDefinition, i as inferProjectBindings, l as scanWebSocketRoutesSync, m as needsApplicationDatabase, n as FRAMEWORK_SCAN_DIRS, r as detectFramework, s as isWebSocketPatternFile } from "./plugin-inference-CXWnn79A.mjs";
2
+ import { c as scanWebSocketRoutes, h as needsApplicationDatabase, i as inferProjectBindings, l as scanWebSocketRoutesSync, n as FRAMEWORK_SCAN_DIRS, p as readResourceDefinition, r as detectFramework, s as isWebSocketPatternFile } from "./plugin-inference-BlQbOL0P.mjs";
3
3
  import { i as resolveProjectPaths, n as readProjectPaths } from "./project-paths-GgcMozYz.mjs";
4
4
  import { t as findVoidAuthConfig } from "./config-DPByhVck.mjs";
5
- import { h as resolveBindingNames, u as getDatabaseDialect } from "./config-Br_JZD6u.mjs";
5
+ import { h as resolveBindingNames, u as getDatabaseDialect } from "./config-DiowPT80.mjs";
6
6
  import { n as globSync, t as glob } from "./dist-Bn8Kodjp.mjs";
7
7
  import { n as isIdentifier } from "./ast-CPGPjb0V.mjs";
8
8
  import { a as staticLiteral, i as staticExportInitializers, n as parseRouteFilename, o as unwrapStaticExpression, t as isRouteEnabledForEnvironment } from "./parse-filename-CUbj-1MP.mjs";
9
9
  import { n as resourceNameWords } from "./resource-name-C7LVpcRm.mjs";
10
10
  import { t as collectMigrations } from "./collect-DiTn9yr6.mjs";
11
- import { a as scanEmailHandlersSync, i as scanEmailHandlers, r as hasEmailHandlers } from "./email--tEtMoj_.mjs";
12
- import { t as scanPages } from "./scan-C8dA7iM4.mjs";
13
- import { o as isSandboxEnabled } from "./config-C_XRIPx2.mjs";
11
+ import { a as scanEmailHandlersSync, i as scanEmailHandlers, r as hasEmailHandlers } from "./email-d_Aux1vM.mjs";
12
+ import { t as scanPages } from "./scan-C3uDzz6J.mjs";
13
+ import { o as isSandboxEnabled } from "./config-B_ggY-IO.mjs";
14
14
  import { existsSync, readFileSync, readdirSync } from "node:fs";
15
15
  import { parseSync } from "vite";
16
16
  //#region src/crons/scan.ts
17
- const JOB_EXTENSIONS = [
18
- "ts",
19
- "mts",
20
- "js",
21
- "mjs"
22
- ];
17
+ const JOB_PATTERN = "**/*.{ts,mts,js,mjs}";
23
18
  function extractJobName(filePath) {
24
19
  return filePath.replace(/\.[^.]+$/, "");
25
20
  }
@@ -50,17 +45,15 @@ function parseJobFiles(root, jobsDir, files) {
50
45
  });
51
46
  }
52
47
  async function scanJobs(root, jobsDir = "crons") {
53
- const pattern = `**/*.{${JOB_EXTENSIONS.join(",")}}`;
54
- return parseJobFiles(root, jobsDir, await glob(pattern, {
48
+ return parseJobFiles(root, jobsDir, await glob(JOB_PATTERN, {
55
49
  cwd: resolveDir(root, jobsDir),
56
50
  absolute: false
57
51
  }).catch(() => []));
58
52
  }
59
53
  function scanJobsSync(root, jobsDir = "crons") {
60
- const pattern = `**/*.{${JOB_EXTENSIONS.join(",")}}`;
61
54
  let files;
62
55
  try {
63
- files = globSync(pattern, {
56
+ files = globSync(JOB_PATTERN, {
64
57
  cwd: resolveDir(root, jobsDir),
65
58
  absolute: false
66
59
  });
@@ -91,10 +84,11 @@ function scanDurableObjectModules(root) {
91
84
  const modules = readdirSync(directory, { withFileTypes: true }).filter((entry) => entry.isFile() && MODULE_PATTERN.test(entry.name) && !entry.name.endsWith(".d.ts")).sort((a, b) => a.name.localeCompare(b.name)).map((entry) => {
92
85
  const filePath = join(directory, entry.name);
93
86
  const name = readResourceDefinition(filePath, readFileSync(filePath, "utf-8"), DURABLE_HELPERS)?.name;
94
- if (resourceNameWords(name ?? inferDurableResourceName(entry.name)).length === 0) throw new Error(`durable: cannot derive a name from durable-objects/${entry.name}.`);
87
+ const resourceName = name ?? inferDurableResourceName(entry.name);
88
+ if (resourceNameWords(resourceName).length === 0) throw new Error(`durable: cannot derive a name from durable-objects/${entry.name}.`);
95
89
  return {
96
90
  filePath,
97
- ...deriveDurableResourceIdentity(name ?? inferDurableResourceName(entry.name)),
91
+ ...deriveDurableResourceIdentity(resourceName),
98
92
  ...name === void 0 ? {} : { name }
99
93
  };
100
94
  });
@@ -109,12 +103,7 @@ function scanDurableObjectModules(root) {
109
103
  }
110
104
  //#endregion
111
105
  //#region src/queues/scan.ts
112
- const QUEUE_EXTENSIONS = [
113
- "ts",
114
- "mts",
115
- "js",
116
- "mjs"
117
- ];
106
+ const QUEUE_PATTERN = "**/*.{ts,mts,js,mjs}";
118
107
  function extractName(filePath) {
119
108
  return filePath.replace(/\.[^.]+$/, "").replaceAll("/", "-");
120
109
  }
@@ -127,8 +116,10 @@ const OPTION_NAMES = [
127
116
  "maxRetries",
128
117
  "retryDelay"
129
118
  ];
130
- function parseQueueFiles(root, queuesDir, files) {
131
- const queuesDirPath = isAbsolute(queuesDir) ? queuesDir : join(root, queuesDir);
119
+ function resolveQueuesDir(root, queuesDir) {
120
+ return isAbsolute(queuesDir) ? queuesDir : join(root, queuesDir);
121
+ }
122
+ function parseQueueFiles(queuesDirPath, files) {
132
123
  const definitions = files.filter((filePath) => !filePath.split("/").some((segment) => segment.startsWith("_"))).sort().map((filePath) => {
133
124
  const absPath = join(queuesDirPath, filePath);
134
125
  const source = readFileSync(absPath, "utf-8");
@@ -166,26 +157,24 @@ function parseQueueFiles(root, queuesDir, files) {
166
157
  return definitions;
167
158
  }
168
159
  async function scanQueues(root, queuesDir = "queues") {
169
- const pattern = `**/*.{${QUEUE_EXTENSIONS.join(",")}}`;
170
- const queuesDirPath = isAbsolute(queuesDir) ? queuesDir : join(root, queuesDir);
171
- return parseQueueFiles(root, queuesDir, await glob(pattern, {
160
+ const queuesDirPath = resolveQueuesDir(root, queuesDir);
161
+ return parseQueueFiles(queuesDirPath, await glob(QUEUE_PATTERN, {
172
162
  cwd: queuesDirPath,
173
163
  absolute: false
174
164
  }).catch(() => []));
175
165
  }
176
166
  function scanQueuesSync(root, queuesDir = "queues") {
177
- const pattern = `**/*.{${QUEUE_EXTENSIONS.join(",")}}`;
167
+ const queuesDirPath = resolveQueuesDir(root, queuesDir);
178
168
  let files;
179
169
  try {
180
- const queuesDirPath = isAbsolute(queuesDir) ? queuesDir : join(root, queuesDir);
181
- files = globSync(pattern, {
170
+ files = globSync(QUEUE_PATTERN, {
182
171
  cwd: queuesDirPath,
183
172
  absolute: false
184
173
  });
185
174
  } catch {
186
175
  files = [];
187
176
  }
188
- return parseQueueFiles(root, queuesDir, files);
177
+ return parseQueueFiles(queuesDirPath, files);
189
178
  }
190
179
  //#endregion
191
180
  //#region src/router/detect-exports.ts
@@ -1,4 +1,4 @@
1
- import { n as scanRoutes, t as analyzeApplicationSync } from "./application-analysis-DC2yPvzY.mjs";
1
+ import { n as scanRoutes, t as analyzeApplicationSync } from "./application-analysis-DKy02UY0.mjs";
2
2
  //#region src/application-routing.ts
3
3
  /** Complete route/page analysis using the same resource and handler inventories. */
4
4
  async function completeApplicationAnalysis(analysis) {
@@ -2,10 +2,11 @@ import { a as join } from "./dist-BVqXeR_h.mjs";
2
2
  import { C as deleteKeyringPassword, T as writeKeyringPassword, c as normalizePlatformApiUrl, i as getActivePlatformConnection, s as listPlatformConnections, u as platformCredentialAccount, w as readKeyringPassword } from "./platform-registry-P387v42A.mjs";
3
3
  import { i as readProjectPlatformUrl, r as readProjectConfig } from "./project-DQstYTxO.mjs";
4
4
  import { t as cfAccessHeaders } from "./cf-access-TWNzXltp.mjs";
5
- import { t as ensureCloudflaredToken } from "./cf-access-YTlqvAsk.mjs";
5
+ import { t as ensureCloudflaredToken } from "./cf-access-ngGqZpHZ.mjs";
6
6
  import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
7
  import { createHash, randomBytes } from "node:crypto";
8
8
  import { homedir } from "node:os";
9
+ import { browserPageLead, browserPageStatus, renderBrowserPage } from "@void/platform/browser-page";
9
10
  //#region src/cli/auth.ts
10
11
  const CONFIG_DIR = join(homedir(), ".void");
11
12
  const CONFIG_PATH = join(CONFIG_DIR, "config.json");
@@ -175,11 +176,10 @@ function getProxyUrl(root = process.cwd()) {
175
176
  return proxyUrl;
176
177
  }
177
178
  function page(title, message) {
178
- return `<!DOCTYPE html>
179
- <html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
180
- <title>${title} - Void</title>
181
- <style>:root{color-scheme:light dark}*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,-apple-system,sans-serif;min-height:100vh;display:flex;align-items:center;justify-content:center;background:#fafafa;color:#111}.card{text-align:center;padding:3rem}h1{font-size:1.5rem;font-weight:600;margin-bottom:.75rem}p{color:#666;font-size:1rem}@media (prefers-color-scheme:dark){body{background:#0a0a0a;color:#fafafa}p{color:#a3a3a3}}</style>
182
- </head><body><div class="card"><h1>${title}</h1><p>${message}</p></div></body></html>`;
179
+ return renderBrowserPage({
180
+ title,
181
+ content: browserPageStatus(title === "Login failed" ? "error" : "success") + browserPageLead(title, message)
182
+ });
183
183
  }
184
184
  function openBrowser(url, execFile) {
185
185
  const ignore = () => {};
@@ -274,7 +274,7 @@ async function awaitBrowserCallback(options) {
274
274
  }
275
275
  if (settled) return;
276
276
  res.writeHead(200, { "Content-Type": "text/html" });
277
- res.end(page("Login successful!", "You can close this tab and return to the terminal."));
277
+ res.end(page(options.successTitle ?? "Signed in to Void", "You can close this tab and return to the terminal."));
278
278
  succeed(result);
279
279
  });
280
280
  server.on("connection", (socket) => socket.unref());
@@ -1,2 +1,2 @@
1
- import { a as getApiUrl, m as runPlatformLogin, s as getSiteDomain } from "./auth-D52yG7hl.mjs";
1
+ import { a as getApiUrl, m as runPlatformLogin, s as getSiteDomain } from "./auth-B5_tZLxT.mjs";
2
2
  export { getApiUrl, getSiteDomain, runPlatformLogin };
@@ -1,8 +1,8 @@
1
- import { a as getApiUrl, c as getToken, h as savePlatformToken, m as runPlatformLogin, u as openBrowser } from "./auth-D52yG7hl.mjs";
2
- import { L as log } from "./prompts-6OSVA7DJ.mjs";
3
- import { r as PlatformClient } from "./client-mC-dFGDD.mjs";
4
- import { r as selectPlatformLoginMethod } from "./login-DFuo-RWO.mjs";
5
- import { t as discoverPlatform } from "./platform-cmd-DbKtQb_4.mjs";
1
+ import { a as getApiUrl, c as getToken, h as savePlatformToken, m as runPlatformLogin, u as openBrowser } from "./auth-B5_tZLxT.mjs";
2
+ import { L as log } from "./dist-D3m88sjf.mjs";
3
+ import { r as PlatformClient } from "./client-C2Prx_Bi.mjs";
4
+ import { r as selectPlatformLoginMethod } from "./login-D-Q4xw3Q.mjs";
5
+ import { t as discoverPlatform } from "./platform-cmd-B8-bCb7t.mjs";
6
6
  import { execFile } from "node:child_process";
7
7
  //#region src/cli/auth-link.ts
8
8
  async function runAuthLink(root, connectionId) {
@@ -36,7 +36,6 @@ function resolveColumnType(dialect, idStrategy, fieldName, field) {
36
36
  }
37
37
  if (useIdType) return idStrategy === "serial" ? "INTEGER" : "TEXT";
38
38
  if (field.type === "boolean" || field.type === "date" || field.type === "number") return "INTEGER";
39
- if (field.type === "json" || field.type === "string[]" || field.type === "number[]") return "TEXT";
40
39
  return "TEXT";
41
40
  }
42
41
  function buildColumnDefinition(dialect, schema, fieldName, field, options = {}) {
@@ -67,25 +66,21 @@ function buildModifyMySqlColumnSql(schema, tableName, fieldName, field) {
67
66
  function buildCreateIndexSql(dialect, tableName, fieldName, unique) {
68
67
  return `CREATE ${unique ? "UNIQUE " : ""}INDEX${dialect === "mysql" ? "" : " IF NOT EXISTS"} ${quoteIdentifier(createIndexName(tableName, fieldName, unique), dialect)} ON ${quoteIdentifier(tableName, dialect)} (${quoteIdentifier(fieldName, dialect)})`;
69
68
  }
70
- async function ensureSqliteIndexes(runner, table) {
71
- const indexRows = await runner.all(`PRAGMA index_list(${quotePragmaArg(table.name)})`);
72
- const existingIndexes = new Set(indexRows.map((row) => String(row.name)));
69
+ async function createMissingIndexes(runner, dialect, table, existingIndexes) {
73
70
  for (const [fieldName, field] of Object.entries(table.fields)) {
74
71
  if (!field.index && !field.unique) continue;
75
72
  const indexName = createIndexName(table.name, fieldName, field.unique);
76
73
  if (existingIndexes.has(indexName)) continue;
77
- await runner.run(buildCreateIndexSql("sqlite", table.name, fieldName, field.unique));
74
+ await runner.run(buildCreateIndexSql(dialect, table.name, fieldName, field.unique));
78
75
  }
79
76
  }
77
+ async function ensureSqliteIndexes(runner, table) {
78
+ const indexRows = await runner.all(`PRAGMA index_list(${quotePragmaArg(table.name)})`);
79
+ await createMissingIndexes(runner, "sqlite", table, new Set(indexRows.map((row) => String(row.name))));
80
+ }
80
81
  async function ensurePgIndexes(runner, schemaName, table) {
81
82
  const indexRows = await runner.all("SELECT indexname FROM pg_indexes WHERE schemaname = $1 AND tablename = $2", [schemaName, table.name]);
82
- const existingIndexes = new Set(indexRows.map((row) => String(row.indexname)));
83
- for (const [fieldName, field] of Object.entries(table.fields)) {
84
- if (!field.index && !field.unique) continue;
85
- const indexName = createIndexName(table.name, fieldName, field.unique);
86
- if (existingIndexes.has(indexName)) continue;
87
- await runner.run(buildCreateIndexSql("postgresql", table.name, fieldName, field.unique));
88
- }
83
+ await createMissingIndexes(runner, "postgresql", table, new Set(indexRows.map((row) => String(row.indexname))));
89
84
  }
90
85
  async function applySqliteAuthMigrations(runner, schema) {
91
86
  const tableRows = await runner.all("SELECT name FROM sqlite_master WHERE type = 'table'");
@@ -146,12 +141,7 @@ async function applyMySqlAuthMigrations(runner, schema) {
146
141
  }
147
142
  }
148
143
  const indexRows = await runner.all("SELECT index_name FROM information_schema.statistics WHERE table_schema = ? AND table_name = ?", [databaseName, table.name]);
149
- const existingIndexes = new Set(indexRows.map((row) => String(row.index_name)));
150
- for (const [fieldName, field] of Object.entries(table.fields)) {
151
- if (!field.index && !field.unique) continue;
152
- const indexName = createIndexName(table.name, fieldName, field.unique);
153
- if (!existingIndexes.has(indexName)) await runner.run(buildCreateIndexSql("mysql", table.name, fieldName, field.unique));
154
- }
144
+ await createMissingIndexes(runner, "mysql", table, new Set(indexRows.map((row) => String(row.index_name))));
155
145
  }
156
146
  }
157
147
  //#endregion
@@ -1,6 +1,6 @@
1
1
  import { s as listPlatformConnections } from "./platform-registry-P387v42A.mjs";
2
2
  import { n as readDeploymentPlatform } from "./project-DQstYTxO.mjs";
3
- import { K as select, tt as isCancel } from "./prompts-6OSVA7DJ.mjs";
3
+ import { K as select, tt as isCancel } from "./dist-D3m88sjf.mjs";
4
4
  //#region src/cli/auth-router.ts
5
5
  async function chooseDestination(root, args, interactive) {
6
6
  const saved = readDeploymentPlatform(root);
@@ -36,26 +36,13 @@ async function chooseDestination(root, args, interactive) {
36
36
  };
37
37
  }
38
38
  async function runAuthRouter(root, args, interactive = Boolean(process.stdin.isTTY)) {
39
- if (args.subcommand === "link") {
40
- const { runAccountCommand } = await import("./account-cmd-CDry3B5V.mjs");
41
- await runAccountCommand(root, {
42
- subcommand: "link",
43
- ...args.connectionId ? { connectionId: args.connectionId } : {}
44
- });
45
- return;
46
- }
47
- if (args.subcommand === "token") {
48
- const { runAccountCommand } = await import("./account-cmd-CDry3B5V.mjs");
49
- await runAccountCommand(root, { subcommand: "token" });
50
- return;
51
- }
52
39
  const destination = await chooseDestination(root, args, interactive);
53
40
  if (destination.platform === "cloudflare") {
54
- const { runCloudflareCommand } = await import("./cloudflare-cmd-bhwCxAN6.mjs");
55
- await runCloudflareCommand(root, { subcommand: args.subcommand === "whoami" || args.subcommand === "status" ? "status" : args.subcommand });
41
+ const { runCloudflareCommand } = await import("./cloudflare-cmd-lHqNlJGW.mjs");
42
+ await runCloudflareCommand(root, { subcommand: args.subcommand });
56
43
  return;
57
44
  }
58
- const { runAccountCommand } = await import("./account-cmd-CDry3B5V.mjs");
45
+ const { runAccountCommand } = await import("./account-cmd-CfUXh_nU.mjs");
59
46
  const subcommand = args.subcommand === "status" ? "whoami" : args.subcommand;
60
47
  if (!destination.apiUrl) {
61
48
  await runAccountCommand(root, { subcommand });
@@ -44,10 +44,6 @@ type VoidAuthEnv = Record<string, unknown> & {
44
44
  connectionString?: string;
45
45
  };
46
46
  BETTER_AUTH_SECRET?: string;
47
- GITHUB_OAUTH_ID?: string;
48
- GITHUB_OAUTH_SECRET?: string;
49
- GOOGLE_OAUTH_ID?: string;
50
- GOOGLE_OAUTH_SECRET?: string;
51
47
  };
52
48
  type VoidAuthRuntimeApi = {
53
49
  resolveVoidAuthOptions(request: Request, env: VoidAuthEnv, runtime: VoidAuthRuntimeOptions, databaseOverride?: NonNullable<BetterAuthOptions["database"]>, disposeOverride?: () => Promise<void>): Promise<{
@@ -1,4 +1,4 @@
1
- import { a as isVoidSocialAuthProvider, r as getVoidAuthProviderEnvNames } from "./providers-CJlNS3kT.mjs";
1
+ import { a as isVoidSocialAuthProvider, r as getVoidAuthProviderEnvNames } from "./providers-BXuhmuub.mjs";
2
2
  import { t as authContext } from "./auth-3sGB0zJ1.mjs";
3
3
  import { randomBytes, scrypt, timingSafeEqual } from "node:crypto";
4
4
  import { betterAuth } from "better-auth";
@@ -9,11 +9,16 @@ function resolveSecret(env, dev) {
9
9
  if (dev) return "void-dev-better-auth-secret-1234567890";
10
10
  throw new Error("auth: Missing Better Auth secret. Set BETTER_AUTH_SECRET.");
11
11
  }
12
- function readEnvString(env, ...keys) {
13
- for (const key of keys) {
14
- const value = env[key];
15
- if (typeof value === "string" && value.length > 0) return value;
16
- }
12
+ function readEnvString(env, key) {
13
+ const value = env[key];
14
+ return typeof value === "string" && value.length > 0 ? value : void 0;
15
+ }
16
+ /** Local development uses `DATABASE_URL`; production uses the Hyperdrive binding. */
17
+ function resolveConnectionString(env, database) {
18
+ const hyperdrive = env.HYPERDRIVE?.connectionString;
19
+ const connectionString = readEnvString(env, "DATABASE_URL") ?? (typeof hyperdrive === "string" && hyperdrive.length > 0 ? hyperdrive : void 0);
20
+ if (!connectionString) throw new Error(`auth: Better Auth requires DATABASE_URL for local ${database} dev or HYPERDRIVE in production.`);
21
+ return connectionString;
17
22
  }
18
23
  const PASSWORD_SALT_LENGTH = 16;
19
24
  const SCRYPT_KEY_LENGTH = 64;
@@ -56,12 +61,8 @@ function resolveEmailAndPassword(configuredProviders) {
56
61
  }
57
62
  function resolveSocialProviderCredentials(env, provider) {
58
63
  const envNames = getVoidAuthProviderEnvNames(provider);
59
- const clientIdKeys = [envNames.clientId];
60
- const clientSecretKeys = [envNames.clientSecret];
61
- if (envNames.legacyClientId) clientIdKeys.push(envNames.legacyClientId);
62
- if (envNames.legacyClientSecret) clientSecretKeys.push(envNames.legacyClientSecret);
63
- const clientId = readEnvString(env, ...clientIdKeys);
64
- const clientSecret = readEnvString(env, ...clientSecretKeys);
64
+ const clientId = readEnvString(env, envNames.clientId);
65
+ const clientSecret = readEnvString(env, envNames.clientSecret);
65
66
  if (!clientId || !clientSecret) throw new Error(`auth: Missing credentials for provider '${provider}'. Set ${envNames.clientId} and ${envNames.clientSecret}, or remove '${provider}' from auth.providers.`);
66
67
  return {
67
68
  clientId,
@@ -112,6 +113,82 @@ function resolveUserConfig(userConfig, defaults, request, env, dialect) {
112
113
  ...userConfig
113
114
  });
114
115
  }
116
+ const SESSION_SAFE_METHODS = /* @__PURE__ */ new Set([
117
+ "GET",
118
+ "HEAD",
119
+ "OPTIONS"
120
+ ]);
121
+ function isRequestOrigin(origin, requestUrl) {
122
+ try {
123
+ const from = new URL(origin);
124
+ const to = new URL(requestUrl);
125
+ return from.host === to.host && (from.protocol === to.protocol || from.protocol === "https:");
126
+ } catch {
127
+ return false;
128
+ }
129
+ }
130
+ /**
131
+ * Headers used to look up the signed-in session for app routes and WebSockets.
132
+ *
133
+ * The session cookie is SameSite=Lax, so a page on another origin of the same
134
+ * site (for example a sibling subdomain) can still send it with a WebSocket
135
+ * handshake or a POST that needs no CORS preflight. For those requests the
136
+ * cookie only counts when the Origin is the request origin or one Better Auth
137
+ * trusts, following Better Auth's own origin check for its endpoints. The
138
+ * request is not rejected; it is resolved without a user.
139
+ */
140
+ async function sessionHeaders(request, auth) {
141
+ const headers = request.headers;
142
+ if (!headers.has("cookie")) return headers;
143
+ if (SESSION_SAFE_METHODS.has(request.method) && headers.get("upgrade")?.toLowerCase() !== "websocket") return headers;
144
+ const origin = headers.get("origin");
145
+ if (!origin || isRequestOrigin(origin, request.url)) return headers;
146
+ if (origin === "null" && headers.get("sec-fetch-site") === "same-origin") return headers;
147
+ const advanced = auth.options.advanced;
148
+ if (advanced?.disableCSRFCheck === true || advanced?.disableOriginCheck === true && advanced.disableCSRFCheck === void 0) return headers;
149
+ const context = await auth.$context;
150
+ if (context.isTrustedOrigin(origin, { allowRelativePaths: false })) return headers;
151
+ const trustedOrigins = auth.options.trustedOrigins;
152
+ if (typeof trustedOrigins === "function") {
153
+ const requestOrigins = (await trustedOrigins(request)).filter((value) => Boolean(value));
154
+ if (context.isTrustedOrigin.call({ trustedOrigins: requestOrigins }, origin, { allowRelativePaths: false })) return headers;
155
+ }
156
+ const withoutCookie = new Headers(headers);
157
+ withoutCookie.delete("cookie");
158
+ console.warn(`auth: Ignored the session cookie on a ${request.method} request from ${origin}. Add this origin to auth trustedOrigins if it should use the signed-in session.`);
159
+ return withoutCookie;
160
+ }
161
+ const LOOPBACK_IP = /^(127\.|::1$|::ffff:127\.)/;
162
+ /**
163
+ * The client IP set by Cloudflare's edge, or null outside a deployed Worker.
164
+ * `request.cf` keeps a client-supplied header from being trusted on Node, Bun
165
+ * or Deno, and local previews report a loopback address.
166
+ */
167
+ function cloudflareClientIp(request) {
168
+ const cf = request.cf;
169
+ if (typeof cf !== "object" || cf === null) return null;
170
+ const ip = request.headers.get("cf-connecting-ip");
171
+ if (!ip || LOOPBACK_IP.test(ip)) return null;
172
+ return ip;
173
+ }
174
+ /**
175
+ * Better Auth enables rate limiting only when NODE_ENV is "production", which
176
+ * Workers never set. Turn it on for deployed Cloudflare requests and key it by
177
+ * Cloudflare's client IP header. Explicit user settings still win.
178
+ */
179
+ function applyCloudflareRateLimitDefaults(options) {
180
+ return {
181
+ ...options,
182
+ rateLimit: {
183
+ ...options.rateLimit,
184
+ enabled: options.rateLimit?.enabled ?? true
185
+ },
186
+ advanced: {
187
+ ...options.advanced,
188
+ ipAddress: options.advanced?.ipAddress ?? { ipAddressHeaders: ["cf-connecting-ip"] }
189
+ }
190
+ };
191
+ }
115
192
  function assertRuntimeDialect(runtime, dialect) {
116
193
  if (runtime.dialect !== dialect) throw new Error(`auth: Runtime mismatch. Expected ${dialect}, received '${runtime.dialect}'.`);
117
194
  }
@@ -134,8 +211,9 @@ function createVoidAuthRuntime(dialect, resolveDatabase, runVoidAuthMigrations)
134
211
  ...socialProviders ? { socialProviders } : {},
135
212
  trustedOrigins: [origin]
136
213
  };
214
+ const resolved = resolveUserConfig(runtime.userConfig, defaults, request, env, dialect);
137
215
  return {
138
- options: resolveUserConfig(runtime.userConfig, defaults, request, env, dialect),
216
+ options: runtime.dev !== true && cloudflareClientIp(request) ? applyCloudflareRateLimitDefaults(resolved) : resolved,
139
217
  dispose
140
218
  };
141
219
  }
@@ -150,7 +228,7 @@ function createVoidAuthRuntime(dialect, resolveDatabase, runVoidAuthMigrations)
150
228
  const { auth, dispose } = await createVoidAuth(request, env, runtime, databaseOverride, disposeOverride);
151
229
  try {
152
230
  return (await auth.api.getSession({
153
- headers: request.headers,
231
+ headers: await sessionHeaders(request, auth),
154
232
  asResponse: false,
155
233
  returnHeaders: true
156
234
  })).response ?? null;
@@ -168,7 +246,7 @@ function createVoidAuthRuntime(dialect, resolveDatabase, runVoidAuthMigrations)
168
246
  c.set("__voidAuth", auth);
169
247
  try {
170
248
  const result = await auth.api.getSession({
171
- headers: c.req.raw.headers,
249
+ headers: await sessionHeaders(c.req.raw, auth),
172
250
  asResponse: false,
173
251
  returnHeaders: true
174
252
  });
@@ -211,4 +289,4 @@ function createVoidAuthRuntime(dialect, resolveDatabase, runVoidAuthMigrations)
211
289
  };
212
290
  }
213
291
  //#endregion
214
- export { createVoidAuthRuntime as t };
292
+ export { createVoidAuthRuntime as n, resolveConnectionString as r, assertRuntimeDialect as t };
@@ -1,9 +1,9 @@
1
1
  import { r as readProjectConfig } from "./project-DQstYTxO.mjs";
2
- import { c as getToken } from "./auth-D52yG7hl.mjs";
3
- import { H as outro, L as log } from "./prompts-6OSVA7DJ.mjs";
4
- import { n as PlatformApiError, r as PlatformClient } from "./client-mC-dFGDD.mjs";
5
- import { c as import_picocolors, i as dim } from "./output-BvdaehtE.mjs";
6
- import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-BG5ORGID.mjs";
2
+ import { c as getToken } from "./auth-B5_tZLxT.mjs";
3
+ import { H as outro, L as log } from "./dist-D3m88sjf.mjs";
4
+ import { d as printSuccess, i as dim, l as import_picocolors } from "./output-C50ag2r3.mjs";
5
+ import { n as PlatformApiError, r as PlatformClient } from "./client-C2Prx_Bi.mjs";
6
+ import { i as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-CP8rZs_p.mjs";
7
7
  import { appendFileSync, writeFileSync } from "node:fs";
8
8
  //#region src/cli/build-cmd.ts
9
9
  const POLL_MS = 1e3;
@@ -147,7 +147,8 @@ async function runBuildLogsCommand(root, args) {
147
147
  outro(dim("Build still running — pass -f to follow."));
148
148
  return;
149
149
  }
150
- outro(dim(`Build ${status}.`));
150
+ if (status === "complete") printSuccess("Build succeeded.");
151
+ else outro(dim(`Build ${status}.`));
151
152
  }
152
153
  //#endregion
153
154
  export { runBuildCommand };
@@ -1,9 +1,9 @@
1
1
  import { r as readProjectConfig } from "./project-DQstYTxO.mjs";
2
- import { c as getToken } from "./auth-D52yG7hl.mjs";
3
- import { H as outro, L as log } from "./prompts-6OSVA7DJ.mjs";
4
- import { r as PlatformClient } from "./client-mC-dFGDD.mjs";
5
- import { i as dim, o as formatCount, r as createSpinner } from "./output-BvdaehtE.mjs";
6
- import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-BG5ORGID.mjs";
2
+ import { c as getToken } from "./auth-B5_tZLxT.mjs";
3
+ import { L as log } from "./dist-D3m88sjf.mjs";
4
+ import { d as printSuccess, r as createSpinner, s as formatCount } from "./output-C50ag2r3.mjs";
5
+ import { r as PlatformClient } from "./client-C2Prx_Bi.mjs";
6
+ import { i as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-CP8rZs_p.mjs";
7
7
  //#region src/cli/cache.ts
8
8
  async function runPurgeCacheCommand(root, projectSlug) {
9
9
  console.log();
@@ -38,13 +38,13 @@ async function runPurgeCacheCommand(root, projectSlug) {
38
38
  try {
39
39
  const result = await client.purgeCache(projectId);
40
40
  s.stop("Cache purged.");
41
- log.success(`Purged ${formatCount(result.purged, "cached page")}.`);
41
+ log.info("Edge cache will clear within seconds.");
42
+ printSuccess(`Purged ${formatCount(result.purged, "cached page")}.`);
42
43
  } catch (err) {
43
44
  s.stop("Cache purge failed.");
44
45
  log.error(err instanceof Error ? err.message : String(err));
45
46
  process.exit(1);
46
47
  }
47
- outro(dim("Edge cache will clear within seconds."));
48
48
  }
49
49
  //#endregion
50
50
  export { runPurgeCacheCommand };
@@ -1,7 +1,8 @@
1
1
  import { r as readProjectConfig } from "./project-DQstYTxO.mjs";
2
- import { c as getToken } from "./auth-D52yG7hl.mjs";
3
- import { A as confirm, H as outro, L as log, tt as isCancel } from "./prompts-6OSVA7DJ.mjs";
4
- import { r as PlatformClient } from "./client-mC-dFGDD.mjs";
2
+ import { c as getToken } from "./auth-B5_tZLxT.mjs";
3
+ import { A as confirm, H as outro, L as log, tt as isCancel } from "./dist-D3m88sjf.mjs";
4
+ import { d as printSuccess } from "./output-C50ag2r3.mjs";
5
+ import { r as PlatformClient } from "./client-C2Prx_Bi.mjs";
5
6
  //#region src/cli/cancel-deploy.ts
6
7
  const ACTIVE_STATUSES = /* @__PURE__ */ new Set([
7
8
  "pending",
@@ -48,7 +49,7 @@ async function runCancelDeployCommand(root, deployId) {
48
49
  return;
49
50
  }
50
51
  await client.cancelDeployment(linked.projectId, target.id);
51
- outro(`Cancellation requested for deployment ${target.id}.`);
52
+ printSuccess(`Cancellation requested for deployment ${target.id}.`);
52
53
  }
53
54
  function formatDeployment(deployment) {
54
55
  const suffix = deployment.commit ? ` (${deployment.commit.slice(0, 7)})` : "";