void 0.27.0 → 1.0.3

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 (337) hide show
  1. package/README.md +3 -1
  2. package/dist/{account-cmd-l-FM7Ioq.mjs → account-cmd-BTcUzv9L.mjs} +6 -6
  3. package/dist/{agents-B_pX_HmQ.mjs → agents-CuNtT0D_.mjs} +5 -2
  4. package/dist/{application-analysis-DKy02UY0.mjs → application-analysis-AB_YYWgH.mjs} +118 -135
  5. package/dist/{application-routing-DQyUh_5S.mjs → application-routing-L7V-TFhZ.mjs} +1 -2
  6. package/dist/atomic-write-Dq6R0BPN.mjs +18 -0
  7. package/dist/{auth-Dn2vw-SG.mjs → auth-B6iOCjKI.mjs} +23 -56
  8. package/dist/auth-Cbqi1iVX.mjs +1 -0
  9. package/dist/{auth-link-vz9Z2kmG.mjs → auth-link-DUJuvRx5.mjs} +11 -11
  10. package/dist/{auth-migrations-BwHgeEsD.mjs → auth-migrations-Cgs0k6lS.mjs} +28 -5
  11. package/dist/{auth-router-DvsCUVw4.mjs → auth-router-CIxiMG7i.mjs} +5 -5
  12. package/dist/base64-DVrOndmI.mjs +16 -0
  13. package/dist/{better-auth-shared-CPvWD3nG.d.mts → better-auth-shared-B74NJIus.d.mts} +8 -13
  14. package/dist/{better-auth-shared-DPpj8zxc.mjs → better-auth-shared-CMXlZG7W.mjs} +56 -68
  15. package/dist/{build-cmd-D6we0VjO.mjs → build-cmd-BkIv25PA.mjs} +6 -6
  16. package/dist/{cache-CZRdzKx1.mjs → cache-Ctzfig-W.mjs} +6 -6
  17. package/dist/{cancel-deploy-CQ3NnMvf.mjs → cancel-deploy-CD9o-SsC.mjs} +5 -5
  18. package/dist/{cf-access-TWNzXltp.mjs → cf-access-BM9G0lhO.mjs} +4 -3
  19. package/dist/{cf-access-BcIBSKqG.mjs → cf-access-CWP4avfP.mjs} +3 -7
  20. package/dist/cf-build-output-BU3hqdHu.mjs +1 -0
  21. package/dist/{cf-build-output-DjvB_872.mjs → cf-build-output-Bc8i3dzE.mjs} +2 -2
  22. package/dist/cf-user-agent-ChjQp2MU.mjs +33 -0
  23. package/dist/cli/cli.mjs +199 -312
  24. package/dist/cli/cloudflare-operation-process.mjs +41 -15
  25. package/dist/cli/env-schema-probe.d.mts +7 -44
  26. package/dist/cli/env-schema-probe.mjs +14 -80
  27. package/dist/client-B60PwCC4.mjs +1 -0
  28. package/dist/{client-DlDJuY0s.mjs → client-DM9Kcf4e.mjs} +161 -415
  29. package/dist/{cloudflare-auth-CuxfF6OA.mjs → cloudflare-auth-CqFBDo52.mjs} +12 -39
  30. package/dist/{cloudflare-cmd-lHqNlJGW.mjs → cloudflare-cmd-BIAF_BIY.mjs} +7 -6
  31. package/dist/{cloudflare-config-BmhBv3HV.mjs → cloudflare-config-DV60XFFK.mjs} +16 -28
  32. package/dist/{cloudflare-connect-2G3rL2rP.mjs → cloudflare-connect-WjwnVOJA.mjs} +4 -4
  33. package/dist/{cloudflare-operations-CwI1bChl.mjs → cloudflare-operations-B42EZeJy.mjs} +26 -34
  34. package/dist/cloudflare-operations-CrSUFRzJ.mjs +1 -0
  35. package/dist/{cloudflare-process-2-TfIEzB.mjs → cloudflare-process-CeDWJRhj.mjs} +12 -7
  36. package/dist/collect-Cae8A7Zr.mjs +1 -0
  37. package/dist/{collect-DiTn9yr6.mjs → collect-xjffdCdk.mjs} +1 -1
  38. package/dist/{config-CSa15FvD.d.mts → config-7qoq2p9v.d.mts} +2 -2
  39. package/dist/{config-CLYAosnQ.mjs → config-BEm9vRvS.mjs} +11 -5
  40. package/dist/{config-DiowPT80.mjs → config-Bx_1SpnO.mjs} +87 -177
  41. package/dist/{config-DPByhVck.mjs → config-D0GY5ItR.mjs} +1 -1
  42. package/dist/config-QrJWu0IX.mjs +1 -0
  43. package/dist/config-entry.d.mts +1 -1
  44. package/dist/{connect-BfPBHHm-.mjs → connect-CKtk-EZe.mjs} +9 -9
  45. package/dist/create-project-B-ewF_Af.mjs +1 -0
  46. package/dist/{create-project-BdXEFKal.mjs → create-project-yInGo72M.mjs} +8 -8
  47. package/dist/database-provider.mjs +1 -2
  48. package/dist/{db-Xs80hcaA.mjs → db-7I_gfdVq.mjs} +177 -268
  49. package/dist/db-types-Bb4WBWIs.mjs +49 -0
  50. package/dist/{delete-d2vuou3j.mjs → delete-Cy-M1u-r.mjs} +6 -6
  51. package/dist/deploy-9lgfhrXS.mjs +2 -0
  52. package/dist/deploy-BYYlnsiy.mjs +6164 -0
  53. package/dist/deploy-managed-static-Ca4TFdmx.mjs +1595 -0
  54. package/dist/deploy-transport-DWlWBe6M.mjs +180 -0
  55. package/dist/deploy.d.mts +10 -0
  56. package/dist/deploy.mjs +82 -0
  57. package/dist/dev-inbox-Rd6j_8vM.mjs +217 -0
  58. package/dist/discover-ClzFSwns.mjs +1 -0
  59. package/dist/{discover-CkCYv9T_.mjs → discover-D2PGT63u.mjs} +2 -2
  60. package/dist/dispatch-DrTTk8Xg.mjs +431 -0
  61. package/dist/{dist-D3m88sjf.mjs → dist-BVdsO7Py.mjs} +5 -6
  62. package/dist/dist-CfgIkieS.mjs +1 -0
  63. package/dist/{dist-BVqXeR_h.mjs → dist-ipQi0Q8y.mjs} +2 -3
  64. package/dist/{domain-BsDUBAvt.mjs → domain-CZGxPv9u.mjs} +8 -23
  65. package/dist/{dotenv-BfU6eqFt.mjs → dotenv-CNazY3-w.mjs} +4 -16
  66. package/dist/edge.mjs +1 -2
  67. package/dist/{email-d_Aux1vM.mjs → email-BcjSyAL0.mjs} +4 -20
  68. package/dist/{email-_lGAHOhp.mjs → email-DzyNVuoU.mjs} +100 -192
  69. package/dist/email-cloudflare-DfG6UEMm.mjs +1096 -0
  70. package/dist/email-protocol-D9nTvhCp.mjs +82 -0
  71. package/dist/{entry-CMAkqBmU.mjs → entry-ehmBvs5w.mjs} +2 -2
  72. package/dist/{env-DMA3cXZt.mjs → env-0jrMQJI_.mjs} +6 -14
  73. package/dist/{env-BxocywBB.mjs → env-BJjULvL0.mjs} +2 -2
  74. package/dist/{env-C74QepDE.mjs → env-Nx3yf50r.mjs} +9 -9
  75. package/dist/{env-public-DR7ZM6d-.d.mts → env-public-CCdykygU.d.mts} +6 -23
  76. package/dist/{env-raw-jZpP5n47.mjs → env-raw-D74P4ebM.mjs} +15 -21
  77. package/dist/{env-types-CwXgeMgL.mjs → env-types-DS2_y4X8.mjs} +2 -2
  78. package/dist/env-validation-BT7z-qpQ.mjs +1 -0
  79. package/dist/env-validation-DYxjz_Wo.mjs +488 -0
  80. package/dist/{gen-DtkQhvQg.mjs → gen-CufHEf42.mjs} +132 -254
  81. package/dist/gen-sXyp5DFO.mjs +1 -0
  82. package/dist/generate-ClI89brV.mjs +1 -0
  83. package/dist/{generate-GDbL7sUr.mjs → generate-Dat0UTry.mjs} +38 -4
  84. package/dist/generated-wrangler-config-DeWj5F9Y.mjs +18 -0
  85. package/dist/{github-cmd-DaDdBbSS.mjs → github-cmd-FU8EjFyU.mjs} +28 -72
  86. package/dist/{handler-BHAn2fZJ.mjs → handler-BZ1t7-Rv.mjs} +2 -2
  87. package/dist/{handler-CNAwjRcW.d.mts → handler-_PqY82xe.d.mts} +1 -1
  88. package/dist/{headers-DlfR78Nu.mjs → headers-Di1FsD3e.mjs} +26 -81
  89. package/dist/{help-0bTe_lID.mjs → help-BT2hovNI.mjs} +26 -14
  90. package/dist/help-i2YGGnTH.mjs +1 -0
  91. package/dist/{inbound-PfQDLXc5.mjs → inbound-BuTfm11U.mjs} +71 -222
  92. package/dist/{inbound-CH5Mksyy.d.mts → inbound-brj2-TM5.d.mts} +19 -58
  93. package/dist/index.d.mts +2 -18
  94. package/dist/index.mjs +714 -762
  95. package/dist/{info-PYWwkWyt.mjs → info-l249eUdH.mjs} +5 -5
  96. package/dist/{init-DaBGmaXC.mjs → init-D0A6M64Q.mjs} +229 -392
  97. package/dist/isr-config-fZaJJ8t7.mjs +165 -0
  98. package/dist/{link-C6fjafep.mjs → link-WMoJFf4i.mjs} +9 -9
  99. package/dist/{list-BTFBlqKl.mjs → list-CQ2EQEHL.mjs} +7 -18
  100. package/dist/{live-CgQuTpqD.mjs → live-BcHoTDFe.mjs} +19 -17
  101. package/dist/{live-Du8jXwOW.d.mts → live-DJONVlQK.d.mts} +1 -1
  102. package/dist/load-user-env-DD5qveNU.mjs +49 -0
  103. package/dist/{local-d1-ga5O_idV.mjs → local-d1-BxvQYEFi.mjs} +6 -6
  104. package/dist/{login-GKcNUmtI.mjs → login-C2T1oVG-.mjs} +12 -12
  105. package/dist/login-XD844Xs-.mjs +1 -0
  106. package/dist/{logs-BiMSULmc.mjs → logs-DnC1d7xB.mjs} +6 -6
  107. package/dist/{migrate-NLsjBbuM.mjs → migrate-BDIprOYd.mjs} +70 -22
  108. package/dist/migrate-BRwU-blY.mjs +1 -0
  109. package/dist/migration-handler-Cg0Y4EPu.mjs +470 -0
  110. package/dist/{migration-handler-DM4clYj5.d.mts → migration-handler-CwlEQUoo.d.mts} +17 -26
  111. package/dist/{mime-DxCznlJq.mjs → mime-srOklVVv.mjs} +92 -395
  112. package/dist/mysql-migration-sql-BIS5vbNk.mjs +241 -0
  113. package/dist/nitro.d.mts +30 -0
  114. package/dist/nitro.mjs +88 -0
  115. package/dist/{node-DJicPvPj.mjs → node-cPadMgUO.mjs} +9 -25
  116. package/dist/{operator-args-DOBhIaIg.mjs → operator-args-UnE8Y2eK.mjs} +27 -26
  117. package/dist/{operator-auth-BEZ_u0Cz.mjs → operator-auth-Cr2zCc-J.mjs} +2 -2
  118. package/dist/{operator-client-DbDv4vtE.mjs → operator-client-C-ROjk1I.mjs} +4 -4
  119. package/dist/operator-cmd-D6gnZsnK.mjs +1 -0
  120. package/dist/{operator-cmd-BT4hgavL.mjs → operator-cmd-DHieWtFp.mjs} +8 -8
  121. package/dist/{output-C50ag2r3.mjs → output-Ba6ZbrzY.mjs} +37 -6
  122. package/dist/{package-json-DXfiT1jV.mjs → package-json-BjYqR-So.mjs} +1 -1
  123. package/dist/pages/client.d.mts +1 -1
  124. package/dist/pages/client.mjs +91 -5
  125. package/dist/pages/head.mjs +1 -2
  126. package/dist/pages/index.d.mts +1 -2
  127. package/dist/pages/index.mjs +6 -6
  128. package/dist/pages/islands-plugin.mjs +5 -83
  129. package/dist/pages/prefetch.mjs +1 -2
  130. package/dist/pages/protocol.d.mts +2 -2
  131. package/dist/pages/protocol.mjs +1 -1
  132. package/dist/pages/serialize.mjs +1 -2
  133. package/dist/plan-CKX_jWnD.mjs +1 -0
  134. package/dist/platform-args-B0HeTh0C.mjs +1 -0
  135. package/dist/{platform-args-DUeXY9Om.mjs → platform-args-CaCL_1Ch.mjs} +43 -60
  136. package/dist/{platform-auth-config-CkSx3usH.mjs → platform-auth-config-Z16-I8nT.mjs} +11 -12
  137. package/dist/{platform-auth-protection-BJimB_p9.mjs → platform-auth-protection-BXwZiJSF.mjs} +37 -27
  138. package/dist/{platform-auth-recovery-BU6izFAU.mjs → platform-auth-recovery-CXjfqyOv.mjs} +9 -10
  139. package/dist/{platform-cmd-BbY1dWiM.mjs → platform-cmd-DaAOiWTl.mjs} +16 -16
  140. package/dist/platform-cmd-PT4YwMLM.mjs +1 -0
  141. package/dist/{platform-discovery-DIYz8V63.mjs → platform-discovery-CHhNs8Nn.mjs} +1 -1
  142. package/dist/{platform-domain-CHVS6cV0.mjs → platform-domain-CxpvUeo0.mjs} +6 -6
  143. package/dist/{platform-lifecycle-DzCwqhFq.mjs → platform-lifecycle-DBiS0cJd.mjs} +1693 -2120
  144. package/dist/platform-lifecycle-u9pMOvxC.mjs +1 -0
  145. package/dist/{platform-management-CuuVDhyt.mjs → platform-management-DhEFdQAf.mjs} +696 -130
  146. package/dist/platform-management-DvBS83rC.mjs +1 -0
  147. package/dist/{platform-plans-config-CN-heS4q.mjs → platform-plans-config-BWn1S2Rv.mjs} +16 -12
  148. package/dist/{platform-recovery-CskSJgLh.mjs → platform-recovery-BUGOB4RC.mjs} +6 -9
  149. package/dist/{platform-registry-Cjv2Qf0r.mjs → platform-registry-B9mWX9LO.mjs} +13 -18
  150. package/dist/{platform-setup-BBxRxmFC.mjs → platform-setup-YvN9VQXV.mjs} +21 -28
  151. package/dist/{plugin-inference-BlQbOL0P.mjs → plugin-inference-DsARdQKE.mjs} +18 -33
  152. package/dist/prepare-CYT6tAzD.mjs +1 -0
  153. package/dist/{prepare-Do96654b.mjs → prepare-DEB5SeVJ.mjs} +12 -13
  154. package/dist/{prepare-Dq9hTIbo.mjs → prepare-PQCgsny0.mjs} +4 -4
  155. package/dist/{prerender-render-Ct20jftc.mjs → prerender-render-Bfsumdkv.mjs} +8 -2
  156. package/dist/prerender-render.d.mts +2 -0
  157. package/dist/prerender-render.mjs +1 -2
  158. package/dist/{project-cmd-DaoRrn-8.mjs → project-cmd-DVatD8Ev.mjs} +20 -20
  159. package/dist/{project-paths-GgcMozYz.mjs → project-paths-DMvEeSau.mjs} +9 -14
  160. package/dist/{project-BAm2aB6Q.mjs → project-rqDnVsJN.mjs} +8 -4
  161. package/dist/project-slug-6cyz8E7k.mjs +1 -0
  162. package/dist/{project-team-Q_lCA7Io.mjs → project-team-DJrWEAG1.mjs} +7 -7
  163. package/dist/{project-token-BArgK9o1.mjs → project-token-CBgLBuL6.mjs} +6 -6
  164. package/dist/{project-tsconfig-CVJhNMxs.mjs → project-tsconfig-bveqhlYA.mjs} +3 -5
  165. package/dist/project-zdB3fs9G.mjs +1 -0
  166. package/dist/{project-zero-trust-KO9Hu2Pq.mjs → project-zero-trust-92gLtZ25.mjs} +6 -6
  167. package/dist/{protocol-BPZaNqBo.d.mts → protocol-4H7V_3Os.d.mts} +1 -1
  168. package/dist/{protocol-CfaUwNs8.mjs → protocol-RNP0u7UY.mjs} +9 -3
  169. package/dist/{provision-BfaLiWbj.mjs → provision-BnSSkiED.mjs} +119 -866
  170. package/dist/{requests-C7Oeoh5u.mjs → requests-7W1Pygt2.mjs} +5 -5
  171. package/dist/resolve-project-PnhzMtY6.mjs +1 -0
  172. package/dist/resolve-project-WpwkCB_c.mjs +48 -0
  173. package/dist/{rollback-DVAtrLAl.mjs → rollback-BcASVnwP.mjs} +8 -18
  174. package/dist/{route-types-CbtsIeFn.mjs → route-types-BZi26DVS.mjs} +9 -91
  175. package/dist/routing-assets-VkrKIbxE.mjs +139 -0
  176. package/dist/{runner-DMBKSrRk.mjs → runner-CabsQ-iM.mjs} +22 -34
  177. package/dist/runner-So9mYfcm.mjs +1 -0
  178. package/dist/runner-mysql-BhRaONkO.mjs +146 -0
  179. package/dist/runner-mysql-DWwE8jKi.mjs +1 -0
  180. package/dist/{runner-pg-DV8p_zjA.mjs → runner-pg-BRemq_GX.mjs} +3 -3
  181. package/dist/runner-pg-_Xncr3H5.mjs +1 -0
  182. package/dist/runtime/ai.mjs +23 -25
  183. package/dist/runtime/auth-client-react.mjs +1 -2
  184. package/dist/runtime/auth-client-solid.mjs +1 -2
  185. package/dist/runtime/auth-client-svelte.mjs +1 -2
  186. package/dist/runtime/auth-client-vue.mjs +1 -2
  187. package/dist/runtime/auth-client.mjs +1 -2
  188. package/dist/runtime/auth.mjs +1 -2
  189. package/dist/runtime/better-auth-mysql.d.mts +2 -5
  190. package/dist/runtime/better-auth-mysql.mjs +9 -31
  191. package/dist/runtime/better-auth-pg.d.mts +2 -5
  192. package/dist/runtime/better-auth-pg.mjs +6 -32
  193. package/dist/runtime/better-auth.d.mts +2 -4
  194. package/dist/runtime/better-auth.mjs +9 -19
  195. package/dist/runtime/db.mjs +6 -2
  196. package/dist/runtime/durable.d.mts +18 -1
  197. package/dist/runtime/durable.mjs +26 -2
  198. package/dist/runtime/email/testing.d.mts +1 -1
  199. package/dist/runtime/email/testing.mjs +9 -23
  200. package/dist/runtime/email-protocol.d.mts +12 -0
  201. package/dist/runtime/email-protocol.mjs +1 -70
  202. package/dist/runtime/email.d.mts +1 -1
  203. package/dist/runtime/email.mjs +79 -221
  204. package/dist/runtime/env-public.d.mts +1 -1
  205. package/dist/runtime/env-public.mjs +12 -38
  206. package/dist/runtime/env.d.mts +1 -12
  207. package/dist/runtime/env.mjs +1 -2
  208. package/dist/runtime/handler.d.mts +1 -1
  209. package/dist/runtime/handler.mjs +1 -1
  210. package/dist/runtime/isr.mjs +1 -1
  211. package/dist/runtime/kv.mjs +1 -1
  212. package/dist/runtime/limits.mjs +1 -2
  213. package/dist/runtime/live-client.d.mts +3 -2
  214. package/dist/runtime/live-server.d.mts +2 -1
  215. package/dist/runtime/live-server.mjs +1 -16
  216. package/dist/runtime/live.d.mts +1 -1
  217. package/dist/runtime/live.mjs +1 -2
  218. package/dist/runtime/log.d.mts +2 -1
  219. package/dist/runtime/migration-handler-mysql.d.mts +2 -2
  220. package/dist/runtime/migration-handler-mysql.mjs +39 -8
  221. package/dist/runtime/migration-handler-pg.d.mts +2 -2
  222. package/dist/runtime/migration-handler-pg.mjs +1 -1
  223. package/dist/runtime/migration-handler.d.mts +2 -2
  224. package/dist/runtime/migration-handler.mjs +1 -470
  225. package/dist/runtime/queues.mjs +1 -1
  226. package/dist/runtime/remote/binding-handler.mjs +62 -62
  227. package/dist/runtime/remote/index.mjs +16 -77
  228. package/dist/runtime/response.mjs +1 -2
  229. package/dist/runtime/route-url.mjs +1 -2
  230. package/dist/runtime/routing.d.mts +3 -5
  231. package/dist/runtime/routing.mjs +82 -218
  232. package/dist/runtime/sandbox-container.d.mts +2 -2
  233. package/dist/runtime/sandbox-container.mjs +1 -2
  234. package/dist/runtime/sandbox.d.mts +2 -2
  235. package/dist/runtime/sandbox.mjs +13 -6
  236. package/dist/runtime/seed.d.mts +2 -1
  237. package/dist/runtime/sse.mjs +1 -2
  238. package/dist/runtime/storage.mjs +1 -1
  239. package/dist/runtime/validator.d.mts +1 -1
  240. package/dist/runtime/validator.mjs +1 -2
  241. package/dist/runtime/ws-server.d.mts +4 -4
  242. package/dist/runtime/ws-server.mjs +6 -28
  243. package/dist/runtime/ws.d.mts +1 -1
  244. package/dist/{sandbox-container-Bo0eiFKz.d.mts → sandbox-container-ChQRum-j.d.mts} +3 -1
  245. package/dist/{sandbox-container-C6ItmVuN.mjs → sandbox-container-a9LRUtii.mjs} +13 -2
  246. package/dist/{sandbox-C5LFoJMf.d.mts → sandbox-q3waMc2T.d.mts} +1 -1
  247. package/dist/{scan-C3uDzz6J.mjs → scan-C0BMdmEd.mjs} +84 -7
  248. package/dist/{secret-BvtB7IjY.mjs → secret-bg73f1Ge.mjs} +63 -81
  249. package/dist/{serialize-BPvnNQuA.mjs → serialize-BtQyaYoC.mjs} +10 -4
  250. package/dist/{skills-BgVMvQdy.mjs → skills-C_yRTg0g.mjs} +3 -3
  251. package/dist/{subcommand-prompt-BSlnD1fI.mjs → subcommand-prompt-Bm3ZlYgA.mjs} +39 -44
  252. package/dist/sveltekit.d.mts +2 -1
  253. package/dist/sveltekit.mjs +1 -1
  254. package/dist/validate-BQFdf0Pi.mjs +1 -0
  255. package/dist/{validate-C9qJArv7.mjs → validate-CheZGRE7.mjs} +4 -8
  256. package/dist/version-metadata-DIrqEHQo.mjs +73 -0
  257. package/dist/{wrangler-D9KTuqnv.mjs → wrangler-BYs07Rxy.mjs} +119 -378
  258. package/dist/wrapper-CwhpNWtH.mjs +663 -0
  259. package/dist/{ws-CChrrAU-.d.mts → ws-aKVYB-fA.d.mts} +1 -1
  260. package/dist/yarn-pnp-DLbEFMT0.mjs +92 -0
  261. package/docs/guide/ai.md +8 -2
  262. package/docs/guide/auth.md +2 -0
  263. package/docs/guide/database/mysql.md +14 -3
  264. package/docs/guide/database/postgresql.md +2 -0
  265. package/docs/guide/database.md +3 -5
  266. package/docs/guide/durable-state.md +32 -4
  267. package/docs/guide/platform/administration/access.md +4 -0
  268. package/docs/guide/platform/administration/connected-apps.md +55 -0
  269. package/docs/guide/platform/installation/credentials.md +21 -3
  270. package/docs/guide/platform/installation/domains.md +1 -1
  271. package/docs/guide/platform/installation/maintenance.md +38 -1
  272. package/docs/guide/platform/installation/prerequisites.md +6 -2
  273. package/docs/guide/platform/installation/setup.md +23 -1
  274. package/docs/guide/platform/installation/uninstall.md +6 -1
  275. package/docs/guide/quickstart.md +2 -0
  276. package/docs/guide/sandboxes.md +3 -1
  277. package/docs/guide/self-hosted-platform.md +1 -1
  278. package/docs/integrations/cloudflare.md +2 -2
  279. package/docs/integrations/frameworks/analog.md +3 -11
  280. package/docs/integrations/frameworks/nuxt.md +7 -10
  281. package/docs/integrations/nodejs-bun-deno.md +2 -0
  282. package/docs/reference/api/deploy.md +23 -0
  283. package/docs/reference/api/pages.md +2 -0
  284. package/docs/reference/api.md +3 -1
  285. package/docs/reference/cli/database.md +9 -3
  286. package/docs/reference/cli/platform-installation.md +19 -7
  287. package/docs/reference/cli/setup.md +2 -0
  288. package/docs/reference/config.md +2 -0
  289. package/package.json +39 -36
  290. package/sandbox.Dockerfile +1 -1
  291. package/skills/void/SKILL.md +2 -1
  292. package/dist/auth-LMJcNESe.mjs +0 -2
  293. package/dist/cf-build-output-H9a97vME.mjs +0 -2
  294. package/dist/cf-user-agent-lKblH3zU.mjs +0 -17
  295. package/dist/client-tso2OfcG.mjs +0 -2
  296. package/dist/cloudflare-operations-BlYLlowZ.mjs +0 -2
  297. package/dist/collect-DLyFDiKW.mjs +0 -2
  298. package/dist/config-5r-YpMC-.mjs +0 -2
  299. package/dist/config-B_ggY-IO.mjs +0 -89
  300. package/dist/config-BtSFvXZx.mjs +0 -2
  301. package/dist/config-write-AHGesphx.mjs +0 -61
  302. package/dist/create-project-qFDC45zg.mjs +0 -2
  303. package/dist/deploy-Bqe1PYBw.mjs +0 -10458
  304. package/dist/deploy-VsWsVQkw.mjs +0 -2
  305. package/dist/dev-inbox-CK-UuPob.mjs +0 -297
  306. package/dist/discover-EDUf6JJw.mjs +0 -2
  307. package/dist/dist-Bx1z6Eva.mjs +0 -2
  308. package/dist/dist-_UUlL6bg.mjs +0 -2
  309. package/dist/env-validation-CrVNjsPm.mjs +0 -2
  310. package/dist/env-validation-Dxdx_5wo.mjs +0 -951
  311. package/dist/gen-dA9hW7AV.mjs +0 -2
  312. package/dist/head-client-DzmJGN4C.mjs +0 -90
  313. package/dist/help-DfQYVfGY.mjs +0 -2
  314. package/dist/login-mx_ydhmp.mjs +0 -2
  315. package/dist/migrate-BHp07yJE.mjs +0 -2
  316. package/dist/operator-cmd-CwBB-1yb.mjs +0 -2
  317. package/dist/pages/head-client.d.mts +0 -13
  318. package/dist/pages/head-client.mjs +0 -2
  319. package/dist/plan-CH2G51je.mjs +0 -2
  320. package/dist/platform-args-D4E1PjVw.mjs +0 -2
  321. package/dist/platform-cmd-BbmJiq5O.mjs +0 -2
  322. package/dist/platform-lifecycle-ByAlpkhV.mjs +0 -2
  323. package/dist/platform-management-CBOT4BSM.mjs +0 -2
  324. package/dist/prepare-DRUV-g3X.mjs +0 -2
  325. package/dist/project-DedqCp59.mjs +0 -2
  326. package/dist/project-slug-DofjTFd-.mjs +0 -2
  327. package/dist/provision-Wu9ZBk9L.mjs +0 -2
  328. package/dist/resolve-project-BIeYs9Cw.mjs +0 -2
  329. package/dist/resolve-project-CP8rZs_p.mjs +0 -28
  330. package/dist/runner-9wjsSZx-.mjs +0 -2
  331. package/dist/runner-mysql-CEzKtmFb.mjs +0 -54
  332. package/dist/runner-mysql-CkFqZ6CE.mjs +0 -2
  333. package/dist/runner-pg-BGYRFdRp.mjs +0 -2
  334. package/dist/runtime/env-helpers.d.mts +0 -2
  335. package/dist/runtime/env-helpers.mjs +0 -2
  336. package/dist/validate-BJr9LfXy.mjs +0 -2
  337. package/dist/yarn-pnp-CUX_iTPA.mjs +0 -188
@@ -1,10 +1,10 @@
1
- import { i as normalizeEmail, n as MimeError, r as buildMime } from "../mime-DxCznlJq.mjs";
2
- import { a as DEV_INBOX_ENV_VAR, c as DEV_INBOX_TOKEN_ENV_VAR, d as bytesToBase64, f as captureMessage, g as hasActiveSink, i as DEV_INBOX_CAPTURE_URL, m as dispatchToSinks, x as serializeCapturedMessage } from "../dev-inbox-CK-UuPob.mjs";
3
- import { a as getRawRuntimeEnv } from "../env-raw-jZpP5n47.mjs";
4
- import { a as createMessageProxy, c as isForwardableEmailMessage, i as bytesToReadableStream, l as parseEmail, o as defineEmail, r as ParseEmailError, s as enactEmailActions, u as replyEmail } from "../inbound-PfQDLXc5.mjs";
1
+ import { n as bytesToBase64 } from "../base64-DVrOndmI.mjs";
2
+ import { a as newId, n as MimeError, o as normalizeEmail, r as buildMime } from "../mime-srOklVVv.mjs";
3
+ import { a as DEV_INBOX_ENV_VAR, b as serializeCapturedMessage, c as DEV_INBOX_TOKEN_ENV_VAR, d as captureMessage, h as hasActiveSink, i as DEV_INBOX_CAPTURE_URL, p as dispatchToSinks } from "../dev-inbox-Rd6j_8vM.mjs";
4
+ import { o as withTimeout, r as readBoundedJson } from "../email-protocol-D9nTvhCp.mjs";
5
+ import { a as createMessageProxy, c as isForwardableEmailMessage, d as readProjectSlug, f as replyEmail, i as bytesToReadableStream, l as parseEmail, o as defineEmail, p as tryGetRawRuntimeEnv, r as ParseEmailError, s as enactEmailActions, u as readEnvString } from "../inbound-BuTfm11U.mjs";
5
6
  import { isRecord } from "@void/deploy-core";
6
7
  //#region src/runtime/email.ts
7
- const VALID_SLUG = /^[a-z0-9](?:[a-z0-9-]{0,54}[a-z0-9])?$/;
8
8
  function makeError(code, message, cause) {
9
9
  return cause === void 0 ? {
10
10
  code,
@@ -15,26 +15,6 @@ function makeError(code, message, cause) {
15
15
  cause
16
16
  };
17
17
  }
18
- function tryGetRawRuntimeEnv() {
19
- try {
20
- return getRawRuntimeEnv();
21
- } catch {
22
- return;
23
- }
24
- }
25
- function readProjectSlug() {
26
- const raw = tryGetRawRuntimeEnv()?.__VOID_PROJECT_SLUG;
27
- if (typeof raw !== "string" || raw.length === 0) return;
28
- return VALID_SLUG.test(raw) ? raw : void 0;
29
- }
30
- function readEmailDomain() {
31
- const raw = tryGetRawRuntimeEnv()?.__VOID_EMAIL_DOMAIN;
32
- return typeof raw === "string" && raw.length > 0 ? raw : void 0;
33
- }
34
- function readEmailFrom() {
35
- const raw = tryGetRawRuntimeEnv()?.__VOID_EMAIL_FROM;
36
- return typeof raw === "string" && raw.length > 0 ? raw : void 0;
37
- }
38
18
  const SEND_EMAIL_BINDING_NAME = "SEND_EMAIL";
39
19
  const EMAIL_PROVIDER_DEADLINE_MS = 3e4;
40
20
  const PLATFORM_SEND_DEADLINE_MS = 6e4;
@@ -44,40 +24,16 @@ var EmailBindingTimeoutError = class extends Error {
44
24
  this.name = "EmailBindingTimeoutError";
45
25
  }
46
26
  };
47
- function createBindingSendDeadline() {
48
- const deadline = Date.now() + PLATFORM_SEND_DEADLINE_MS;
49
- return {
50
- expired: () => Date.now() >= deadline,
51
- async run(submit) {
52
- const remaining = Math.min(EMAIL_PROVIDER_DEADLINE_MS, deadline - Date.now());
53
- if (remaining <= 0) throw new EmailBindingTimeoutError();
54
- const work = submit();
55
- let timer;
56
- try {
57
- return await Promise.race([work, new Promise((_, reject) => {
58
- timer = setTimeout(() => reject(new EmailBindingTimeoutError()), remaining);
59
- })]);
60
- } finally {
61
- if (timer !== void 0) clearTimeout(timer);
62
- }
63
- }
64
- };
65
- }
66
27
  function resolveSendEmailBinding(env) {
67
28
  const binding = env?.[SEND_EMAIL_BINDING_NAME];
68
29
  if (typeof binding !== "object" || binding === null) return;
69
30
  return typeof binding.send === "function" ? binding : void 0;
70
31
  }
71
32
  /**
72
- * Map an error thrown by the `send_email` binding to a framework code.
73
- *
74
- * Email Service throws `Error`s carrying a `code` (the `E_*` table in
75
- * Cloudflare's Workers API reference); the older Email Routing sender
76
- * throws message-only errors, so the destination-verification phrasing the
77
- * platform proxy already keys on is kept as a fallback. Anything else is
78
- * `OUTCOME_UNKNOWN` with the original error as `cause`: once `send()` has
79
- * started, an undocumented rejection does not prove the provider declined
80
- * the message before accepting it.
33
+ * Map a `send_email` binding error to a framework code: Email Service `E_*`
34
+ * codes, then the older Email Routing message. Anything else is
35
+ * `OUTCOME_UNKNOWN`: once `send()` started, a rejection does not prove the
36
+ * provider declined the message.
81
37
  */
82
38
  function classifyBindingError(e) {
83
39
  const message = e instanceof Error ? e.message : String(e);
@@ -93,11 +49,9 @@ function classifyBindingError(e) {
93
49
  }
94
50
  const UNVERIFIED_DESTINATION_RE = /^[^\n]{0,200}destination address[^\n]{0,200}not (?:yet )?verified/i;
95
51
  /**
96
- * Deliver through the worker's own `SEND_EMAIL` binding. One `EmailMessage`
97
- * per recipient, within one bounded batch, and the same `deliveries` shape
98
- * the proxy returns so a caller can inspect each attempted or cancelled
99
- * outcome in either mode. The stream is rebuilt per send because a
100
- * `ReadableStream` is one-shot.
52
+ * Send one `EmailMessage` per recipient through the worker's own binding,
53
+ * within one bounded batch, reporting `deliveries` as the proxy does. The
54
+ * stream is rebuilt per send: a `ReadableStream` is one-shot.
101
55
  */
102
56
  async function sendViaBinding(binding, from, recipients, raw, fallbackId) {
103
57
  let EmailMessage;
@@ -107,10 +61,11 @@ async function sendViaBinding(binding, from, recipients, raw, fallbackId) {
107
61
  return err("UPSTREAM_ERROR", `email: SEND_EMAIL is bound but cloudflare:email could not be loaded: ${e instanceof Error ? e.message : String(e)}`, e);
108
62
  }
109
63
  const deliveries = [];
110
- const deadline = createBindingSendDeadline();
64
+ const deadline = Date.now() + PLATFORM_SEND_DEADLINE_MS;
65
+ const remaining = () => Math.min(EMAIL_PROVIDER_DEADLINE_MS, deadline - Date.now());
111
66
  for (let index = 0; index < recipients.length; index++) {
112
67
  const recipient = recipients[index];
113
- if (deadline.expired()) {
68
+ if (remaining() <= 0) {
114
69
  for (const unstarted of recipients.slice(index)) deliveries.push({
115
70
  recipient: unstarted,
116
71
  ok: false,
@@ -120,7 +75,7 @@ async function sendViaBinding(binding, from, recipients, raw, fallbackId) {
120
75
  break;
121
76
  }
122
77
  try {
123
- const result = await deadline.run(() => binding.send(new EmailMessage(from, recipient, bytesToReadableStream(raw))));
78
+ const result = await withTimeout(remaining(), () => binding.send(new EmailMessage(from, recipient, bytesToReadableStream(raw))), () => new EmailBindingTimeoutError());
124
79
  const mid = typeof result?.messageId === "string" ? result.messageId : "";
125
80
  deliveries.push({
126
81
  recipient,
@@ -150,10 +105,8 @@ async function sendViaBinding(binding, from, recipients, raw, fallbackId) {
150
105
  };
151
106
  }
152
107
  /**
153
- * Dedup recipients by lowercased email (CF won't collapse duplicate
154
- * envelopes for us, and double-billing the quota for the same recipient
155
- * is worse than the rare case where a user actually wanted Cc + Bcc to
156
- * the same address — which doesn't change delivery semantics anyway).
108
+ * Recipients deduplicated by lowercased address: Cloudflare does not
109
+ * collapse duplicate envelopes, and each one costs quota.
157
110
  */
158
111
  function uniqueRecipients(normalized) {
159
112
  const seen = /* @__PURE__ */ new Set();
@@ -170,23 +123,16 @@ function uniqueRecipients(normalized) {
170
123
  }
171
124
  return recipients;
172
125
  }
173
- function newRequestId() {
174
- const bytes = /* @__PURE__ */ new Uint8Array(8);
175
- crypto.getRandomValues(bytes);
176
- let hex = "";
177
- for (const b of bytes) hex += b.toString(16).padStart(2, "0");
178
- return `req_${Date.now().toString(36)}${hex}`;
179
- }
180
126
  function resolveDefaultFrom(opts) {
181
127
  const supplied = opts.from;
182
128
  if (!(supplied === void 0 || supplied === null || typeof supplied === "string" && supplied.trim() === "" || typeof supplied === "object" && supplied !== null && !("email" in supplied))) return opts;
183
- const configured = readEmailFrom();
129
+ const configured = readEnvString("__VOID_EMAIL_FROM");
184
130
  if (configured) return {
185
131
  ...opts,
186
132
  from: configured
187
133
  };
188
134
  const slug = readProjectSlug();
189
- const domain = readEmailDomain();
135
+ const domain = readEnvString("__VOID_EMAIL_DOMAIN");
190
136
  if (!slug || !domain) {
191
137
  if (supplied === null) {
192
138
  const next = { ...opts };
@@ -220,11 +166,9 @@ function coerceErrorCode(code) {
220
166
  ].find((knownCode) => knownCode === code) ?? "UPSTREAM_ERROR";
221
167
  }
222
168
  /**
223
- * The text of a refusal the proxy's middleware sent instead of a send
224
- * response: `{ error: string, message?: string }`. `message` is the
225
- * sentence written for a person (the capability gate's "This Void platform
226
- * does not enable email."); `error` is the short code every such refusal
227
- * carries. `null` when the body is not that shape.
169
+ * Text of the `{ error, message? }` refusal the proxy's middleware sends
170
+ * ahead of the email handler, preferring the human `message`; `null` for any
171
+ * other shape.
228
172
  */
229
173
  function readProxyRefusal(body) {
230
174
  if (typeof body !== "object" || body === null || Array.isArray(body)) return null;
@@ -258,10 +202,9 @@ function readProxyResponse(value) {
258
202
  return null;
259
203
  }
260
204
  /**
261
- * Require exactly one valid outcome per requested recipient in either list
262
- * shape. A missing, duplicate, or foreign entry makes the whole result unknown;
263
- * trimming it could hide a submission. Order is not part of the contract.
264
- * Diagnostics identify entries by index rather than echoing corrupt addresses.
205
+ * Require exactly one valid outcome per requested recipient, in any order. A
206
+ * missing, duplicate or foreign entry makes the whole result unknown, since
207
+ * trimming it could hide a submission. Diagnostics name entries by index.
265
208
  */
266
209
  function readRecipientList(raw, recipients, shape, readEntry) {
267
210
  if (raw.length !== recipients.length) return {
@@ -300,11 +243,8 @@ function readRecipientList(raw, recipients, shape, readEntry) {
300
243
  };
301
244
  }
302
245
  /**
303
- * The `ids` list of an `ok: true` response. The proxy answers `ok: true` only
304
- * after every requested recipient has an accepted provider outcome. Each entry
305
- * is `{ recipient, messageId }`; the framework's own Message-ID stands in for
306
- * an empty provider reference. A missing delivery would leave no safe retry
307
- * decision, so the whole response is rejected as malformed.
246
+ * The `ids` of an `ok: true` response, one accepted outcome per recipient.
247
+ * The framework's Message-ID stands in for an empty provider reference.
308
248
  */
309
249
  function readDeliveryList(raw, recipients, fallbackId) {
310
250
  return readRecipientList(raw, recipients, "{ recipient: string, messageId: string }", (entry, recipient) => typeof entry.messageId === "string" ? {
@@ -349,112 +289,47 @@ function readDeliveryState(value) {
349
289
  ].find((state) => state === value);
350
290
  }
351
291
  const MAX_PROXY_RESPONSE_BYTES = 65536;
352
- function createPlatformSendDeadline() {
353
- const controller = new AbortController();
354
- const deadline = Date.now() + PLATFORM_SEND_DEADLINE_MS;
355
- return {
356
- signal: controller.signal,
357
- async beforeDeadline(run) {
358
- const remaining = deadline - Date.now();
359
- if (remaining <= 0) {
360
- controller.abort();
361
- throw new Error("email platform send timed out");
362
- }
363
- const promise = run();
364
- let timer;
365
- try {
366
- return await Promise.race([promise, new Promise((_, reject) => {
367
- timer = setTimeout(() => {
368
- controller.abort();
369
- reject(/* @__PURE__ */ new Error("email platform send timed out"));
370
- }, remaining);
371
- })]);
372
- } finally {
373
- if (timer !== void 0) clearTimeout(timer);
374
- }
375
- }
376
- };
377
- }
378
- async function readBoundedProxyJson(response, beforeDeadline) {
379
- const declared = response.headers.get("content-length");
380
- if (declared !== null && (!/^\d+$/.test(declared) || Number(declared) > MAX_PROXY_RESPONSE_BYTES)) {
381
- response.body?.cancel().catch(() => {});
382
- throw new Error("email proxy response too large");
383
- }
384
- const reader = response.body?.getReader();
385
- if (!reader) throw new Error("email proxy response is empty");
386
- const bytes = new Uint8Array(MAX_PROXY_RESPONSE_BYTES);
387
- let size = 0;
388
- try {
389
- for (;;) {
390
- const chunk = await beforeDeadline(() => reader.read());
391
- if (chunk.done) break;
392
- if (size + chunk.value.byteLength > bytes.byteLength) throw new Error("email proxy response too large");
393
- bytes.set(chunk.value, size);
394
- size += chunk.value.byteLength;
395
- }
396
- if (declared !== null && size !== Number(declared)) throw new Error("email proxy response length mismatch");
397
- return JSON.parse(new TextDecoder("utf-8", {
398
- fatal: true,
399
- ignoreBOM: false
400
- }).decode(bytes.subarray(0, size)));
401
- } finally {
402
- reader.cancel().catch(() => {});
403
- try {
404
- reader.releaseLock();
405
- } catch {}
406
- }
407
- }
408
292
  async function readResponseAsResult(res, recipients, fallbackId, beforeDeadline) {
293
+ let body;
409
294
  try {
410
- let body;
411
- try {
412
- body = await readBoundedProxyJson(res, beforeDeadline);
413
- } catch {
414
- return err("OUTCOME_UNKNOWN", `email: could not establish the send outcome (status ${res.status}); check email logs or repeat the same idempotency key`);
415
- }
416
- const response = readProxyResponse(body);
417
- if (response === null) {
418
- const refusal = readProxyRefusal(body);
419
- if (!res.ok && refusal !== null) return err("UPSTREAM_ERROR", `email: proxy returned ${res.status}: ${refusal}`, body);
420
- return err("OUTCOME_UNKNOWN", `email: proxy returned malformed response (status ${res.status})`, body);
421
- }
422
- const malformedList = (reason) => err("OUTCOME_UNKNOWN", `email: proxy returned a malformed delivery list (${reason}); do not retry with a new idempotency key`, body);
423
- const operation = typeof response.operationId === "string" && response.operationId.length <= 128 ? { operationId: response.operationId } : {};
424
- if (response.ok === true) {
425
- const list = readDeliveryList(response.ids, recipients, fallbackId);
426
- return list.ok ? {
427
- ok: true,
428
- ids: list.entries,
429
- ...operation
430
- } : malformedList(list.reason);
431
- }
432
- if ("deliveries" in response) {
433
- const list = readFailureDeliveries(response.deliveries, recipients, fallbackId);
434
- return list.ok ? {
435
- ok: false,
436
- deliveries: list.entries,
437
- ...operation
438
- } : malformedList(list.reason);
439
- }
440
- const e = response.error;
441
- return {
442
- ...err(coerceErrorCode(e.code), typeof e.message === "string" ? e.message : "email: upstream send failed"),
295
+ body = await readBoundedJson(res, MAX_PROXY_RESPONSE_BYTES, beforeDeadline);
296
+ } catch {
297
+ return err("OUTCOME_UNKNOWN", `email: could not establish the send outcome (status ${res.status}); check email logs or repeat the same idempotency key`);
298
+ }
299
+ const response = readProxyResponse(body);
300
+ if (response === null) {
301
+ const refusal = readProxyRefusal(body);
302
+ if (!res.ok && refusal !== null) return err("UPSTREAM_ERROR", `email: proxy returned ${res.status}: ${refusal}`, body);
303
+ return err("OUTCOME_UNKNOWN", `email: proxy returned malformed response (status ${res.status})`, body);
304
+ }
305
+ const malformedList = (reason) => err("OUTCOME_UNKNOWN", `email: proxy returned a malformed delivery list (${reason}); do not retry with a new idempotency key`, body);
306
+ const operation = typeof response.operationId === "string" && response.operationId.length <= 128 ? { operationId: response.operationId } : {};
307
+ if (response.ok === true) {
308
+ const list = readDeliveryList(response.ids, recipients, fallbackId);
309
+ return list.ok ? {
310
+ ok: true,
311
+ ids: list.entries,
443
312
  ...operation
444
- };
445
- } catch (e) {
446
- return err("OUTCOME_UNKNOWN", `email: failed to parse proxy response (status ${res.status}): ${e instanceof Error ? e.message : String(e)}`, e);
313
+ } : malformedList(list.reason);
314
+ }
315
+ if ("deliveries" in response) {
316
+ const list = readFailureDeliveries(response.deliveries, recipients, fallbackId);
317
+ return list.ok ? {
318
+ ok: false,
319
+ deliveries: list.entries,
320
+ ...operation
321
+ } : malformedList(list.reason);
447
322
  }
323
+ const e = response.error;
324
+ return {
325
+ ...err(coerceErrorCode(e.code), typeof e.message === "string" ? e.message : "email: upstream send failed"),
326
+ ...operation
327
+ };
448
328
  }
449
329
  /**
450
- * Resolve the loopback into the `void dev` inbox, or `undefined` outside dev.
451
- *
452
- * `DEV_INBOX_ENV_VAR` is injected only when `viteCommand === 'serve'` and it
453
- * names the worker's assets binding. In dev, `@cloudflare/vite-plugin` binds
454
- * that name to a miniflare service whose implementation is the Vite dev
455
- * server's Node middleware stack, so a fetch through it lands on the inbox
456
- * middleware in the dev-server process — the only place the buffer exists.
457
- * In a production build neither the var nor that wiring is present.
330
+ * The loopback into the `void dev` inbox: `DEV_INBOX_ENV_VAR` names the
331
+ * assets binding, which in dev reaches the Vite dev server. Undefined
332
+ * outside dev.
458
333
  */
459
334
  function resolveDevInbox(env) {
460
335
  const bindingName = env?.[DEV_INBOX_ENV_VAR];
@@ -473,10 +348,8 @@ const DEV_INBOX_TIMEOUT_MS = 5e3;
473
348
  const DEV_INBOX_ERROR_EXCERPT_CHARS = 200;
474
349
  const DEV_INBOX_ERROR_EXCERPT_TIMEOUT_MS = 1e3;
475
350
  /**
476
- * First line of a refusal, so a 401 names the header it wanted. Reads ONE
477
- * chunk under its own deadline: the main 5s race has already settled by the
478
- * time the status is known, and a body that never arrives must not turn a
479
- * clean error into a hung `sendEmail`.
351
+ * First line of a refusal, so a 401 names the header it wanted. One chunk
352
+ * under its own deadline: a stalled body must not hang `sendEmail`.
480
353
  */
481
354
  async function readErrorExcerpt(res) {
482
355
  let timer;
@@ -548,22 +421,11 @@ async function postToDevInbox(inbox, captured) {
548
421
  if (timer !== void 0) clearTimeout(timer);
549
422
  }
550
423
  }
551
- /**
552
- * Shared result shape for both capture paths (in-process sink and dev inbox).
553
- *
554
- * `ids` is built from the same deduplicated, lowercased list the two
555
- * production transports send to, so code written against a captured result
556
- * sees exactly what a deploy returns: one entry per unique address, keyed the
557
- * way `sendViaBinding` and the proxy report it. The captured message itself
558
- * keeps the original fields; the inbox displays what was asked for, the
559
- * result reports what would be sent.
560
- */
424
+ /** A captured send's result: one id per unique recipient, as a deployed send reports. */
561
425
  function capturedResult(normalized, captureId) {
562
- const recipients = uniqueRecipients(normalized);
563
- if (recipients.length === 0) return err("INVALID_TO", "email: 'to' must include at least one recipient.");
564
426
  return {
565
427
  ok: true,
566
- ids: recipients.map((recipient) => ({
428
+ ids: uniqueRecipients(normalized).map((recipient) => ({
567
429
  recipient,
568
430
  messageId: captureId
569
431
  }))
@@ -584,18 +446,11 @@ async function sendEmail(opts) {
584
446
  if (resolvedOpts.from === void 0) return err("INVALID_FROM", "email: 'from' is required. Set it explicitly or deploy via Void so the platform-injected __VOID_PROJECT_SLUG and __VOID_EMAIL_DOMAIN can default it to <slug>+noreply@<domain>.");
585
447
  const optsWithFrom = resolvedOpts;
586
448
  let normalized;
587
- try {
588
- normalized = await normalizeEmail(optsWithFrom);
589
- } catch (e) {
590
- if (e instanceof MimeError) return err(e.code, e.message, e);
591
- return err("MIME_ERROR", e instanceof Error ? e.message : String(e), e);
592
- }
593
449
  let raw;
594
450
  let messageId;
595
451
  try {
596
- const built = buildMime(normalized);
597
- raw = built.raw;
598
- messageId = built.messageId;
452
+ normalized = await normalizeEmail(optsWithFrom);
453
+ ({raw, messageId} = buildMime(normalized));
599
454
  } catch (e) {
600
455
  if (e instanceof MimeError) return err(e.code, e.message, e);
601
456
  return err("MIME_ERROR", e instanceof Error ? e.message : String(e), e);
@@ -616,7 +471,6 @@ async function sendEmail(opts) {
616
471
  return err("UPSTREAM_ERROR", message);
617
472
  }
618
473
  const recipients = uniqueRecipients(normalized);
619
- if (recipients.length === 0) return err("INVALID_TO", "email: 'to' must include at least one recipient.");
620
474
  const sendBinding = resolveSendEmailBinding(rawEnv);
621
475
  if (sendBinding) {
622
476
  if (opts.idempotencyKey !== void 0) return err("MIME_ERROR", "email: idempotencyKey requires a Void platform; the native Cloudflare binding cannot deduplicate sends.");
@@ -627,30 +481,34 @@ async function sendEmail(opts) {
627
481
  const projectId = env?.__PROJECT_ID;
628
482
  const proxyToken = env?.__VOID_PROXY_TOKEN;
629
483
  if (!proxy || !projectId || !proxyToken) return err("BINDING_MISSING", "email: neither SEND_EMAIL nor __VOID_PROXY is available, so nothing was sent. Deploy via Void to bind the platform proxy, or set `email.from` in void.json so `void deploy --platform cloudflare` provisions the SEND_EMAIL binding. Under `void dev` messages are captured by the local inbox at /__void/inbox instead — reaching this error there means that path was bypassed (`sendInDev: true`, which does not deliver: `void dev` binds no send transport at all, so there is nothing to fall through to) or unavailable (the worker has no assets binding to reach the dev server through).");
630
- const requestId = newRequestId();
631
484
  const body = {
632
485
  projectId,
633
486
  aiToken: proxyToken,
634
487
  from: normalized.from.email,
635
488
  recipients,
636
489
  mimeBase64: bytesToBase64(raw),
637
- requestId,
490
+ requestId: newId("req"),
638
491
  ...opts.idempotencyKey === void 0 ? {} : { idempotencyKey: opts.idempotencyKey }
639
492
  };
640
493
  const requestBody = JSON.stringify(body);
641
- const deadline = createPlatformSendDeadline();
494
+ const controller = new AbortController();
495
+ const deadline = Date.now() + PLATFORM_SEND_DEADLINE_MS;
496
+ const beforeDeadline = (run) => withTimeout(deadline - Date.now(), run, () => {
497
+ controller.abort();
498
+ return /* @__PURE__ */ new Error("email platform send timed out");
499
+ });
642
500
  let res;
643
501
  try {
644
- res = await deadline.beforeDeadline(() => proxy.fetch("https://email-proxy/email/send", {
502
+ res = await beforeDeadline(() => proxy.fetch("https://email-proxy/email/send", {
645
503
  method: "POST",
646
504
  headers: { "content-type": "application/json" },
647
505
  body: requestBody,
648
- signal: deadline.signal
506
+ signal: controller.signal
649
507
  }));
650
508
  } catch (e) {
651
509
  return err("OUTCOME_UNKNOWN", `email: send outcome is unknown: ${e instanceof Error ? e.message : String(e)}. Check email logs or repeat the same idempotency key; do not create a new send.`, e);
652
510
  }
653
- return readResponseAsResult(res, recipients, messageId, deadline.beforeDeadline);
511
+ return readResponseAsResult(res, recipients, messageId, beforeDeadline);
654
512
  }
655
513
  /**
656
514
  * Build a normalized email + raw MIME for advanced callers who want to feed
@@ -1,4 +1,4 @@
1
1
  /// <reference types="@cloudflare/workers-types" />
2
2
  import { a as number, c as url, i as json, n as boolean, o as oneOf, r as email, s as string, t as EnvSchema } from "../env-helpers-CyKtOBpj.mjs";
3
- import { a as _getSchemaDefaults, c as defineEnv, i as _getRegisteredSchema, l as env, n as EnvValidationReport, o as _hasRegisteredSchema, r as ValidatedEnv, s as _validateEnvOnce, t as EnvValidationError, u as validateAllEnv } from "../env-public-DR7ZM6d-.mjs";
3
+ import { a as _getSchemaDefaults, c as defineEnv, i as _getRegisteredSchema, l as env, n as EnvValidationReport, o as _hasRegisteredSchema, r as ValidatedEnv, s as _validateEnvOnce, t as EnvValidationError, u as validateAllEnv } from "../env-public-CCdykygU.mjs";
4
4
  export { type EnvSchema, EnvValidationError, EnvValidationReport, ValidatedEnv, _getRegisteredSchema, _getSchemaDefaults, _hasRegisteredSchema, _validateEnvOnce, boolean, defineEnv, email, env, json, number, oneOf, string, url, validateAllEnv };
@@ -1,5 +1,5 @@
1
- import { a as getRawRuntimeEnv } from "../env-raw-jZpP5n47.mjs";
2
- import { i as isInternalBinding, n as getRuntimeEnv } from "../env-DMA3cXZt.mjs";
1
+ import { a as getRawRuntimeEnv } from "../env-raw-D74P4ebM.mjs";
2
+ import { i as isInternalBinding, n as getRuntimeEnv } from "../env-0jrMQJI_.mjs";
3
3
  import { a as oneOf, i as number, n as email, o as string, r as json, s as url, t as boolean } from "../env-helpers--wFmQ_5Q.mjs";
4
4
  //#region src/shared/env-mask.ts
5
5
  /**
@@ -11,8 +11,7 @@ import { a as oneOf, i as number, n as email, o as string, r as json, s as url,
11
11
  * it to locate the offending entry).
12
12
  *
13
13
  * Server env values are production secrets by definition, so validator
14
- * messages redact the raw input unconditionally. The old `.secret()` /
15
- * `.public()` masking axis was removed because it did not control storage.
14
+ * messages redact the raw input unconditionally.
16
15
  *
17
16
  * Users can opt out of the guard for local debugging via
18
17
  * `VOID_ENV_UNMASK=1` in the environment; that path prints a one-shot
@@ -32,7 +31,6 @@ function redactMessage(rawValue, message, options = {}) {
32
31
  return message.split(rawValue).join(REDACTED);
33
32
  }
34
33
  let unmaskResolved = null;
35
- let unmaskNoticeShown = false;
36
34
  /**
37
35
  * Resolve the effective unmask flag, consulting `process.env` exactly once
38
36
  * per process. On the first affirmative read, we print a one-shot notice to
@@ -40,20 +38,13 @@ let unmaskNoticeShown = false;
40
38
  */
41
39
  function isUnmaskActive() {
42
40
  if (unmaskResolved !== null) return unmaskResolved;
43
- let active = false;
44
41
  try {
45
- active = globalThis.process?.env?.[UNMASK_ENV_VAR] === "1";
42
+ unmaskResolved = globalThis.process?.env?.[UNMASK_ENV_VAR] === "1";
46
43
  } catch {
47
- active = false;
44
+ unmaskResolved = false;
48
45
  }
49
- unmaskResolved = active;
50
- if (active && !unmaskNoticeShown) {
51
- unmaskNoticeShown = true;
52
- try {
53
- console.error(`[void/env] ${UNMASK_ENV_VAR}=1 is set — env validation errors will include raw values. Unset it before sharing logs.`);
54
- } catch {}
55
- }
56
- return active;
46
+ if (unmaskResolved) console.error(`[void/env] ${UNMASK_ENV_VAR}=1 is set — env validation errors will include raw values. Unset it before sharing logs.`);
47
+ return unmaskResolved;
57
48
  }
58
49
  //#endregion
59
50
  //#region src/runtime/env-public.ts
@@ -127,21 +118,10 @@ function defineEnv(schema) {
127
118
  return env;
128
119
  }
129
120
  /**
130
- * Internal: validate the entire schema against the worker's actual env on
131
- * the first request per isolate. Catches bad remote-secret values and
132
- * post-deploy drift that the deploy CLI can't see (it only knows secret
133
- * names, not their values).
134
- *
135
- * Spliced into the generated worker entry by `compileWorkerEntry`. Cached
136
- * after the first call so subsequent requests pay no cost.
137
- *
138
- * Async lifecycle: this function awaits any async Standard Schema
139
- * validators (zod `refine`, arktype async narrows, etc.) and seeds the
140
- * per-key cache with the resolved values. Subsequent reads via `env.X`
141
- * hit the sync cache — async work only happens here, at boot. If a user
142
- * accesses `env.X` for a key with an async validator *before* this
143
- * function has run (e.g. during module-top-level code), the proxy will
144
- * throw with guidance pointing back to this boot-time pre-validation.
121
+ * Internal: validate the whole schema against the worker env once per isolate,
122
+ * from the generated worker entry. Catches remote-secret values the deploy CLI
123
+ * cannot see. Async validators are awaited here and their values cached, so
124
+ * later synchronous `env.X` reads can serve them.
145
125
  */
146
126
  async function _validateEnvOnce(envValues) {
147
127
  if (registry.bootValidation) {
@@ -258,13 +238,7 @@ function readKey(key) {
258
238
  /**
259
239
  * Typed env proxy. Reads from the runtime env, validating declared keys
260
240
  * on first access and passing through bindings / unknown keys unchanged.
261
- *
262
- * Sync-only: the `get` trap must be synchronous, so validators that return
263
- * a `Promise` cannot be awaited here. For async Standard Schema validators,
264
- * `_validateEnvOnce()` pre-resolves them at worker boot and seeds the
265
- * per-env cache; property reads then serve the cached value synchronously.
266
- * If an async validator is encountered here without a prior pre-validation,
267
- * the trap throws with guidance on how to resolve it.
241
+ * Async validators must be resolved first by `_validateEnvOnce()`.
268
242
  */
269
243
  const env = new Proxy({}, {
270
244
  get(_target, key) {
@@ -6,18 +6,7 @@ type RuntimeEnv = Record<string, unknown>;
6
6
  /** @internal Reuse a resource only within the current runtime request. */
7
7
  export declare function getRuntimeRequestResource<T>(key: object, initialize: () => T, outsideScope?: () => T): T;
8
8
  export declare function withRuntimeEnv<T>(env: unknown, fn: () => T): T;
9
- /**
10
- * Shared internal-binding predicate. A binding is framework-internal — and must
11
- * never be exposed to user code — when it carries an internal prefix
12
- * (`__VOID_`, `__PROJECT_`; always hidden) or is an exact-name internal (e.g.
13
- * `ISR_CACHE`; hidden ONLY while ISR is active for the isolate). `rawEnv` is the
14
- * unfiltered runtime env, consulted via {@link isIsrActive} to gate the
15
- * exact-name check so a non-ISR app's own `ISR_CACHE` binding stays visible —
16
- * matching the build-time `isr` gate on the generated `c.env` filter.
17
- *
18
- * Single source of truth for the runtime `env` filter here and the public
19
- * `void/env` proxy (`env-public.ts`).
20
- */
9
+ /** Whether `name` is a framework binding hidden from user code; `rawEnv` is the unfiltered env. */
21
10
  export declare function isInternalBinding(name: string, rawEnv: RuntimeEnv): boolean;
22
11
  /** Returns the runtime env with internal platform bindings hidden. */
23
12
  export declare function getRuntimeEnv(): RuntimeEnv;
@@ -1,2 +1 @@
1
- import { a as requireRuntimeBinding, i as isInternalBinding, n as getRuntimeEnv, o as withRuntimeEnv, r as getRuntimeRequestResource, t as getRuntimeBinding } from "../env-DMA3cXZt.mjs";
2
- export { getRuntimeBinding, getRuntimeEnv, getRuntimeRequestResource, isInternalBinding, requireRuntimeBinding, withRuntimeEnv };
1
+ export { t as getRuntimeBinding, n as getRuntimeEnv, r as getRuntimeRequestResource, i as isInternalBinding, a as requireRuntimeBinding, o as withRuntimeEnv } from "../env-0jrMQJI_.mjs";
@@ -1,3 +1,3 @@
1
1
  /// <reference types="@cloudflare/workers-types" />
2
- import { C as defer, E as ValidatorSlots, S as InferProps, T as HandlerInput, _ as defineQueue, a as CloudEnv, b as Deferred, c as QueueRetryOptions, d as TypedQueueHandler, f as VoidAssetRewriteError, g as defineMiddleware, h as defineHead, i as CloudContextVariables, l as RenderAssetTags, m as defineHandler, n as CloudBindings, o as QueueBatch, p as basicAuth, r as CloudContext, s as QueueMessage, t as BasicAuthOptions, u as TypedHandler, v as defineRender, w as ValidationError, y as defineScheduled } from "../handler-CNAwjRcW.mjs";
2
+ import { C as defer, E as ValidatorSlots, S as InferProps, T as HandlerInput, _ as defineQueue, a as CloudEnv, b as Deferred, c as QueueRetryOptions, d as TypedQueueHandler, f as VoidAssetRewriteError, g as defineMiddleware, h as defineHead, i as CloudContextVariables, l as RenderAssetTags, m as defineHandler, n as CloudBindings, o as QueueBatch, p as basicAuth, r as CloudContext, s as QueueMessage, t as BasicAuthOptions, u as TypedHandler, v as defineRender, w as ValidationError, y as defineScheduled } from "../handler-_PqY82xe.mjs";
3
3
  export { BasicAuthOptions, CloudBindings, CloudContext, CloudContextVariables, CloudEnv, type Deferred, type HandlerInput, type InferProps, QueueBatch, QueueMessage, QueueRetryOptions, RenderAssetTags, TypedHandler, TypedQueueHandler, ValidationError, type ValidatorSlots, VoidAssetRewriteError, basicAuth, defer, defineHandler, defineHead, defineMiddleware, defineQueue, defineRender, defineScheduled };
@@ -1,3 +1,3 @@
1
1
  import { r as defer, t as ValidationError } from "../validation-error-Dg9Recn1.mjs";
2
- import { a as defineMiddleware, c as defineScheduled, i as defineHead, n as basicAuth, o as defineQueue, r as defineHandler, s as defineRender, t as VoidAssetRewriteError } from "../handler-BHAn2fZJ.mjs";
2
+ import { a as defineMiddleware, c as defineScheduled, i as defineHead, n as basicAuth, o as defineQueue, r as defineHandler, s as defineRender, t as VoidAssetRewriteError } from "../handler-BZ1t7-Rv.mjs";
3
3
  export { ValidationError, VoidAssetRewriteError, basicAuth, defer, defineHandler, defineHead, defineMiddleware, defineQueue, defineRender, defineScheduled };
@@ -1,4 +1,4 @@
1
- import { a as getRawRuntimeEnv } from "../env-raw-jZpP5n47.mjs";
1
+ import { a as getRawRuntimeEnv } from "../env-raw-D74P4ebM.mjs";
2
2
  import { isrEdgeCacheUrlForToken, splitIsrCacheKey } from "@void/isr";
3
3
  import { denormalizeIsrPath, isrKey, isrPrefix, isrVariantPrefix, listIsrHosts } from "@void/isr/runtime";
4
4
  //#region src/runtime/isr.ts
@@ -1,4 +1,4 @@
1
- import { a as requireRuntimeBinding } from "../env-DMA3cXZt.mjs";
1
+ import { a as requireRuntimeBinding } from "../env-0jrMQJI_.mjs";
2
2
  //#region src/runtime/kv.ts
3
3
  function parseValue(raw) {
4
4
  if (raw === null) return null;
@@ -1,2 +1 @@
1
- import { i as readUsageLimit, n as asUsageLimit, r as limitFromResponse, t as UsageLimit } from "../limits-D0vD1M9A.mjs";
2
- export { UsageLimit, asUsageLimit, limitFromResponse, readUsageLimit };
1
+ export { t as UsageLimit, n as asUsageLimit, r as limitFromResponse, i as readUsageLimit } from "../limits-D0vD1M9A.mjs";
@@ -1,4 +1,4 @@
1
- import { t as LiveClientEvent } from "../live-Du8jXwOW.mjs";
1
+ import { t as LiveClientEvent } from "../live-DJONVlQK.mjs";
2
2
  //#region src/runtime/live-client.d.ts
3
3
  export type LiveSubscribeOptions<Data = unknown> = {
4
4
  id: string;
@@ -29,4 +29,5 @@ type EventSourceConstructor = new (url: string, options?: {
29
29
  withCredentials?: boolean;
30
30
  }) => EventSourceLike;
31
31
  export declare function connectLiveStream(url: string | URL, options?: ConnectLiveStreamOptions): LiveClient;
32
- //#endregion
32
+ //#endregion
33
+ export {};
@@ -9,4 +9,5 @@ export type LiveDurableObjectClass = {
9
9
  new (state: DurableObjectState, env: LiveDurableObjectEnv): LiveDurableObjectInstance;
10
10
  };
11
11
  export declare function createLiveDurableObject(): LiveDurableObjectClass;
12
- //#endregion
12
+ //#endregion
13
+ export {};