alchemy 2.0.0-beta.62 → 2.0.0-beta.63

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 (489) hide show
  1. package/README.md +12 -12
  2. package/bin/exec.js +1959 -70
  3. package/bin/exec.js.map +1 -1
  4. package/lib/AWS/AuthProvider.js +1 -1
  5. package/lib/AWS/AuthProvider.js.map +1 -1
  6. package/lib/AWS/EC2/hosted.d.ts.map +1 -1
  7. package/lib/AWS/EC2/hosted.js +2 -1
  8. package/lib/AWS/EC2/hosted.js.map +1 -1
  9. package/lib/AWS/ECS/Task.d.ts.map +1 -1
  10. package/lib/AWS/ECS/Task.js +2 -1
  11. package/lib/AWS/ECS/Task.js.map +1 -1
  12. package/lib/AWS/Lambda/Function.d.ts.map +1 -1
  13. package/lib/AWS/Lambda/Function.js +13 -40
  14. package/lib/AWS/Lambda/Function.js.map +1 -1
  15. package/lib/AWS/Lambda/MicrovmRuntimeContext.d.ts.map +1 -1
  16. package/lib/AWS/Lambda/MicrovmRuntimeContext.js +9 -21
  17. package/lib/AWS/Lambda/MicrovmRuntimeContext.js.map +1 -1
  18. package/lib/Action.d.ts +8 -0
  19. package/lib/Action.d.ts.map +1 -1
  20. package/lib/Action.js +16 -5
  21. package/lib/Action.js.map +1 -1
  22. package/lib/ActionRuntimeContext.d.ts +14 -0
  23. package/lib/ActionRuntimeContext.d.ts.map +1 -0
  24. package/lib/ActionRuntimeContext.js +56 -0
  25. package/lib/ActionRuntimeContext.js.map +1 -0
  26. package/lib/Apply.d.ts.map +1 -1
  27. package/lib/Apply.js +40 -6
  28. package/lib/Apply.js.map +1 -1
  29. package/lib/Auth/AuthProvider.d.ts +3 -3
  30. package/lib/Auth/AuthProvider.d.ts.map +1 -1
  31. package/lib/Auth/AuthProvider.js +1 -1
  32. package/lib/Auth/AuthProvider.js.map +1 -1
  33. package/lib/Auth/Lock.d.ts.map +1 -1
  34. package/lib/Auth/Lock.js +5 -2
  35. package/lib/Auth/Lock.js.map +1 -1
  36. package/lib/Bundle/PurePlugin.d.ts.map +1 -1
  37. package/lib/Bundle/PurePlugin.js +26 -1
  38. package/lib/Bundle/PurePlugin.js.map +1 -1
  39. package/lib/Bundle/Vite.d.ts +2 -0
  40. package/lib/Bundle/Vite.d.ts.map +1 -1
  41. package/lib/Bundle/Vite.js +24 -1
  42. package/lib/Bundle/Vite.js.map +1 -1
  43. package/lib/Cli/LoggingCli.d.ts.map +1 -1
  44. package/lib/Cli/LoggingCli.js +7 -4
  45. package/lib/Cli/LoggingCli.js.map +1 -1
  46. package/lib/Cli/commands/_shared.d.ts +19 -0
  47. package/lib/Cli/commands/_shared.d.ts.map +1 -1
  48. package/lib/Cli/commands/_shared.js +22 -0
  49. package/lib/Cli/commands/_shared.js.map +1 -1
  50. package/lib/Cli/commands/login.d.ts +7 -3
  51. package/lib/Cli/commands/login.d.ts.map +1 -1
  52. package/lib/Cli/commands/login.js +70 -12
  53. package/lib/Cli/commands/login.js.map +1 -1
  54. package/lib/Cli/commands/profile.d.ts.map +1 -1
  55. package/lib/Cli/commands/profile.js +7 -20
  56. package/lib/Cli/commands/profile.js.map +1 -1
  57. package/lib/Cloudflare/AI/LanguageModel.js +21 -4
  58. package/lib/Cloudflare/AI/LanguageModel.js.map +1 -1
  59. package/lib/Cloudflare/AI/QuerySearchLocal.d.ts +37 -0
  60. package/lib/Cloudflare/AI/QuerySearchLocal.d.ts.map +1 -0
  61. package/lib/Cloudflare/AI/QuerySearchLocal.js +53 -0
  62. package/lib/Cloudflare/AI/QuerySearchLocal.js.map +1 -0
  63. package/lib/Cloudflare/AI/QuerySearchNamespaceLocal.d.ts +35 -0
  64. package/lib/Cloudflare/AI/QuerySearchNamespaceLocal.d.ts.map +1 -0
  65. package/lib/Cloudflare/AI/QuerySearchNamespaceLocal.js +47 -0
  66. package/lib/Cloudflare/AI/QuerySearchNamespaceLocal.js.map +1 -0
  67. package/lib/Cloudflare/AI/SearchHttpClient.d.ts +34 -0
  68. package/lib/Cloudflare/AI/SearchHttpClient.d.ts.map +1 -0
  69. package/lib/Cloudflare/AI/SearchHttpClient.js +262 -0
  70. package/lib/Cloudflare/AI/SearchHttpClient.js.map +1 -0
  71. package/lib/Cloudflare/AI/index.d.ts +2 -0
  72. package/lib/Cloudflare/AI/index.d.ts.map +1 -1
  73. package/lib/Cloudflare/AI/index.js +2 -0
  74. package/lib/Cloudflare/AI/index.js.map +1 -1
  75. package/lib/Cloudflare/Auth/AuthProvider.js +1 -1
  76. package/lib/Cloudflare/Auth/AuthProvider.js.map +1 -1
  77. package/lib/Cloudflare/Containers/ContainerBundle.d.ts.map +1 -1
  78. package/lib/Cloudflare/Containers/ContainerBundle.js +11 -1
  79. package/lib/Cloudflare/Containers/ContainerBundle.js.map +1 -1
  80. package/lib/Cloudflare/Containers/ContainerPlatform.d.ts.map +1 -1
  81. package/lib/Cloudflare/Containers/ContainerPlatform.js +12 -33
  82. package/lib/Cloudflare/Containers/ContainerPlatform.js.map +1 -1
  83. package/lib/Cloudflare/D1/QueryDatabaseHttpClient.d.ts +24 -0
  84. package/lib/Cloudflare/D1/QueryDatabaseHttpClient.d.ts.map +1 -0
  85. package/lib/Cloudflare/D1/QueryDatabaseHttpClient.js +106 -0
  86. package/lib/Cloudflare/D1/QueryDatabaseHttpClient.js.map +1 -0
  87. package/lib/Cloudflare/D1/QueryDatabaseLocal.d.ts +38 -0
  88. package/lib/Cloudflare/D1/QueryDatabaseLocal.d.ts.map +1 -0
  89. package/lib/Cloudflare/D1/QueryDatabaseLocal.js +54 -0
  90. package/lib/Cloudflare/D1/QueryDatabaseLocal.js.map +1 -0
  91. package/lib/Cloudflare/D1/index.d.ts +1 -0
  92. package/lib/Cloudflare/D1/index.d.ts.map +1 -1
  93. package/lib/Cloudflare/D1/index.js +1 -0
  94. package/lib/Cloudflare/D1/index.js.map +1 -1
  95. package/lib/Cloudflare/DNS/DnsHttp.d.ts +16 -1
  96. package/lib/Cloudflare/DNS/DnsHttp.d.ts.map +1 -1
  97. package/lib/Cloudflare/DNS/DnsHttp.js +6 -1
  98. package/lib/Cloudflare/DNS/DnsHttp.js.map +1 -1
  99. package/lib/Cloudflare/DNS/DnsLocal.d.ts +22 -0
  100. package/lib/Cloudflare/DNS/DnsLocal.d.ts.map +1 -0
  101. package/lib/Cloudflare/DNS/DnsLocal.js +31 -0
  102. package/lib/Cloudflare/DNS/DnsLocal.js.map +1 -0
  103. package/lib/Cloudflare/DNS/ReadDnsHttp.d.ts +3 -3
  104. package/lib/Cloudflare/DNS/ReadDnsHttp.d.ts.map +1 -1
  105. package/lib/Cloudflare/DNS/ReadDnsHttp.js +3 -4
  106. package/lib/Cloudflare/DNS/ReadDnsHttp.js.map +1 -1
  107. package/lib/Cloudflare/DNS/ReadDnsLocal.d.ts +32 -0
  108. package/lib/Cloudflare/DNS/ReadDnsLocal.d.ts.map +1 -0
  109. package/lib/Cloudflare/DNS/ReadDnsLocal.js +35 -0
  110. package/lib/Cloudflare/DNS/ReadDnsLocal.js.map +1 -0
  111. package/lib/Cloudflare/DNS/ReadWriteDnsHttp.d.ts +3 -3
  112. package/lib/Cloudflare/DNS/ReadWriteDnsHttp.d.ts.map +1 -1
  113. package/lib/Cloudflare/DNS/ReadWriteDnsHttp.js +4 -4
  114. package/lib/Cloudflare/DNS/ReadWriteDnsHttp.js.map +1 -1
  115. package/lib/Cloudflare/DNS/ReadWriteDnsLocal.d.ts +40 -0
  116. package/lib/Cloudflare/DNS/ReadWriteDnsLocal.d.ts.map +1 -0
  117. package/lib/Cloudflare/DNS/ReadWriteDnsLocal.js +43 -0
  118. package/lib/Cloudflare/DNS/ReadWriteDnsLocal.js.map +1 -0
  119. package/lib/Cloudflare/DNS/WriteDnsHttp.d.ts +3 -3
  120. package/lib/Cloudflare/DNS/WriteDnsHttp.d.ts.map +1 -1
  121. package/lib/Cloudflare/DNS/WriteDnsHttp.js +3 -4
  122. package/lib/Cloudflare/DNS/WriteDnsHttp.js.map +1 -1
  123. package/lib/Cloudflare/DNS/WriteDnsLocal.d.ts +38 -0
  124. package/lib/Cloudflare/DNS/WriteDnsLocal.d.ts.map +1 -0
  125. package/lib/Cloudflare/DNS/WriteDnsLocal.js +41 -0
  126. package/lib/Cloudflare/DNS/WriteDnsLocal.js.map +1 -0
  127. package/lib/Cloudflare/DNS/index.d.ts +3 -0
  128. package/lib/Cloudflare/DNS/index.d.ts.map +1 -1
  129. package/lib/Cloudflare/DNS/index.js +3 -0
  130. package/lib/Cloudflare/DNS/index.js.map +1 -1
  131. package/lib/Cloudflare/Flagship/ReadFlagsHttpClient.d.ts +27 -0
  132. package/lib/Cloudflare/Flagship/ReadFlagsHttpClient.d.ts.map +1 -0
  133. package/lib/Cloudflare/Flagship/ReadFlagsHttpClient.js +86 -0
  134. package/lib/Cloudflare/Flagship/ReadFlagsHttpClient.js.map +1 -0
  135. package/lib/Cloudflare/Flagship/ReadFlagsLocal.d.ts +41 -0
  136. package/lib/Cloudflare/Flagship/ReadFlagsLocal.d.ts.map +1 -0
  137. package/lib/Cloudflare/Flagship/ReadFlagsLocal.js +57 -0
  138. package/lib/Cloudflare/Flagship/ReadFlagsLocal.js.map +1 -0
  139. package/lib/Cloudflare/Flagship/index.d.ts +1 -0
  140. package/lib/Cloudflare/Flagship/index.d.ts.map +1 -1
  141. package/lib/Cloudflare/Flagship/index.js +1 -0
  142. package/lib/Cloudflare/Flagship/index.js.map +1 -1
  143. package/lib/Cloudflare/KV/NamespaceHttp.d.ts +16 -1
  144. package/lib/Cloudflare/KV/NamespaceHttp.d.ts.map +1 -1
  145. package/lib/Cloudflare/KV/NamespaceHttp.js +8 -2
  146. package/lib/Cloudflare/KV/NamespaceHttp.js.map +1 -1
  147. package/lib/Cloudflare/KV/NamespaceLocal.d.ts +22 -0
  148. package/lib/Cloudflare/KV/NamespaceLocal.d.ts.map +1 -0
  149. package/lib/Cloudflare/KV/NamespaceLocal.js +32 -0
  150. package/lib/Cloudflare/KV/NamespaceLocal.js.map +1 -0
  151. package/lib/Cloudflare/KV/ReadNamespaceHttp.d.ts +2 -2
  152. package/lib/Cloudflare/KV/ReadNamespaceHttp.d.ts.map +1 -1
  153. package/lib/Cloudflare/KV/ReadNamespaceHttp.js +5 -6
  154. package/lib/Cloudflare/KV/ReadNamespaceHttp.js.map +1 -1
  155. package/lib/Cloudflare/KV/ReadNamespaceLocal.d.ts +27 -0
  156. package/lib/Cloudflare/KV/ReadNamespaceLocal.d.ts.map +1 -0
  157. package/lib/Cloudflare/KV/ReadNamespaceLocal.js +30 -0
  158. package/lib/Cloudflare/KV/ReadNamespaceLocal.js.map +1 -0
  159. package/lib/Cloudflare/KV/ReadWriteNamespaceHttp.d.ts +3 -3
  160. package/lib/Cloudflare/KV/ReadWriteNamespaceHttp.d.ts.map +1 -1
  161. package/lib/Cloudflare/KV/ReadWriteNamespaceHttp.js +6 -6
  162. package/lib/Cloudflare/KV/ReadWriteNamespaceHttp.js.map +1 -1
  163. package/lib/Cloudflare/KV/ReadWriteNamespaceLocal.d.ts +34 -0
  164. package/lib/Cloudflare/KV/ReadWriteNamespaceLocal.d.ts.map +1 -0
  165. package/lib/Cloudflare/KV/ReadWriteNamespaceLocal.js +37 -0
  166. package/lib/Cloudflare/KV/ReadWriteNamespaceLocal.js.map +1 -0
  167. package/lib/Cloudflare/KV/WriteNamespaceHttp.d.ts +2 -2
  168. package/lib/Cloudflare/KV/WriteNamespaceHttp.d.ts.map +1 -1
  169. package/lib/Cloudflare/KV/WriteNamespaceHttp.js +5 -6
  170. package/lib/Cloudflare/KV/WriteNamespaceHttp.js.map +1 -1
  171. package/lib/Cloudflare/KV/WriteNamespaceLocal.d.ts +27 -0
  172. package/lib/Cloudflare/KV/WriteNamespaceLocal.d.ts.map +1 -0
  173. package/lib/Cloudflare/KV/WriteNamespaceLocal.js +30 -0
  174. package/lib/Cloudflare/KV/WriteNamespaceLocal.js.map +1 -0
  175. package/lib/Cloudflare/KV/index.d.ts +3 -0
  176. package/lib/Cloudflare/KV/index.d.ts.map +1 -1
  177. package/lib/Cloudflare/KV/index.js +3 -0
  178. package/lib/Cloudflare/KV/index.js.map +1 -1
  179. package/lib/Cloudflare/Queues/QueueHttp.d.ts +20 -1
  180. package/lib/Cloudflare/Queues/QueueHttp.d.ts.map +1 -1
  181. package/lib/Cloudflare/Queues/QueueHttp.js +2 -2
  182. package/lib/Cloudflare/Queues/QueueHttp.js.map +1 -1
  183. package/lib/Cloudflare/Queues/WriteQueueHttp.d.ts +9 -3
  184. package/lib/Cloudflare/Queues/WriteQueueHttp.d.ts.map +1 -1
  185. package/lib/Cloudflare/Queues/WriteQueueHttp.js +11 -6
  186. package/lib/Cloudflare/Queues/WriteQueueHttp.js.map +1 -1
  187. package/lib/Cloudflare/Queues/WriteQueueLocal.d.ts +36 -0
  188. package/lib/Cloudflare/Queues/WriteQueueLocal.d.ts.map +1 -0
  189. package/lib/Cloudflare/Queues/WriteQueueLocal.js +51 -0
  190. package/lib/Cloudflare/Queues/WriteQueueLocal.js.map +1 -0
  191. package/lib/Cloudflare/Queues/index.d.ts +1 -0
  192. package/lib/Cloudflare/Queues/index.d.ts.map +1 -1
  193. package/lib/Cloudflare/Queues/index.js +1 -0
  194. package/lib/Cloudflare/Queues/index.js.map +1 -1
  195. package/lib/Cloudflare/R2/BucketHttp.d.ts +15 -1
  196. package/lib/Cloudflare/R2/BucketHttp.d.ts.map +1 -1
  197. package/lib/Cloudflare/R2/BucketHttp.js +3 -3
  198. package/lib/Cloudflare/R2/BucketHttp.js.map +1 -1
  199. package/lib/Cloudflare/R2/BucketLocal.d.ts +21 -0
  200. package/lib/Cloudflare/R2/BucketLocal.d.ts.map +1 -0
  201. package/lib/Cloudflare/R2/BucketLocal.js +32 -0
  202. package/lib/Cloudflare/R2/BucketLocal.js.map +1 -0
  203. package/lib/Cloudflare/R2/ReadBucketHttp.d.ts +2 -2
  204. package/lib/Cloudflare/R2/ReadBucketHttp.d.ts.map +1 -1
  205. package/lib/Cloudflare/R2/ReadBucketHttp.js +4 -4
  206. package/lib/Cloudflare/R2/ReadBucketHttp.js.map +1 -1
  207. package/lib/Cloudflare/R2/ReadBucketLocal.d.ts +27 -0
  208. package/lib/Cloudflare/R2/ReadBucketLocal.d.ts.map +1 -0
  209. package/lib/Cloudflare/R2/ReadBucketLocal.js +30 -0
  210. package/lib/Cloudflare/R2/ReadBucketLocal.js.map +1 -0
  211. package/lib/Cloudflare/R2/ReadWriteBucketHttp.d.ts +2 -2
  212. package/lib/Cloudflare/R2/ReadWriteBucketHttp.d.ts.map +1 -1
  213. package/lib/Cloudflare/R2/ReadWriteBucketHttp.js +5 -4
  214. package/lib/Cloudflare/R2/ReadWriteBucketHttp.js.map +1 -1
  215. package/lib/Cloudflare/R2/ReadWriteBucketLocal.d.ts +30 -0
  216. package/lib/Cloudflare/R2/ReadWriteBucketLocal.d.ts.map +1 -0
  217. package/lib/Cloudflare/R2/ReadWriteBucketLocal.js +33 -0
  218. package/lib/Cloudflare/R2/ReadWriteBucketLocal.js.map +1 -0
  219. package/lib/Cloudflare/R2/WriteBucketHttp.d.ts +2 -2
  220. package/lib/Cloudflare/R2/WriteBucketHttp.d.ts.map +1 -1
  221. package/lib/Cloudflare/R2/WriteBucketHttp.js +4 -4
  222. package/lib/Cloudflare/R2/WriteBucketHttp.js.map +1 -1
  223. package/lib/Cloudflare/R2/WriteBucketLocal.d.ts +27 -0
  224. package/lib/Cloudflare/R2/WriteBucketLocal.d.ts.map +1 -0
  225. package/lib/Cloudflare/R2/WriteBucketLocal.js +30 -0
  226. package/lib/Cloudflare/R2/WriteBucketLocal.js.map +1 -0
  227. package/lib/Cloudflare/R2/index.d.ts +3 -0
  228. package/lib/Cloudflare/R2/index.d.ts.map +1 -1
  229. package/lib/Cloudflare/R2/index.js +3 -0
  230. package/lib/Cloudflare/R2/index.js.map +1 -1
  231. package/lib/Cloudflare/StateStore/Api.d.ts +2 -0
  232. package/lib/Cloudflare/Tunnel/ReadTunnel.d.ts +3 -3
  233. package/lib/Cloudflare/Tunnel/ReadTunnel.d.ts.map +1 -1
  234. package/lib/Cloudflare/Tunnel/ReadTunnel.js +7 -8
  235. package/lib/Cloudflare/Tunnel/ReadTunnel.js.map +1 -1
  236. package/lib/Cloudflare/Tunnel/ReadTunnelLocal.d.ts +29 -0
  237. package/lib/Cloudflare/Tunnel/ReadTunnelLocal.d.ts.map +1 -0
  238. package/lib/Cloudflare/Tunnel/ReadTunnelLocal.js +30 -0
  239. package/lib/Cloudflare/Tunnel/ReadTunnelLocal.js.map +1 -0
  240. package/lib/Cloudflare/Tunnel/ReadWriteTunnel.d.ts +3 -3
  241. package/lib/Cloudflare/Tunnel/ReadWriteTunnel.d.ts.map +1 -1
  242. package/lib/Cloudflare/Tunnel/ReadWriteTunnel.js +4 -4
  243. package/lib/Cloudflare/Tunnel/ReadWriteTunnel.js.map +1 -1
  244. package/lib/Cloudflare/Tunnel/ReadWriteTunnelLocal.d.ts +35 -0
  245. package/lib/Cloudflare/Tunnel/ReadWriteTunnelLocal.d.ts.map +1 -0
  246. package/lib/Cloudflare/Tunnel/ReadWriteTunnelLocal.js +36 -0
  247. package/lib/Cloudflare/Tunnel/ReadWriteTunnelLocal.js.map +1 -0
  248. package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts +17 -1
  249. package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts.map +1 -1
  250. package/lib/Cloudflare/Tunnel/TunnelBinding.js +7 -1
  251. package/lib/Cloudflare/Tunnel/TunnelBinding.js.map +1 -1
  252. package/lib/Cloudflare/Tunnel/TunnelLocalBinding.d.ts +19 -0
  253. package/lib/Cloudflare/Tunnel/TunnelLocalBinding.d.ts.map +1 -0
  254. package/lib/Cloudflare/Tunnel/TunnelLocalBinding.js +29 -0
  255. package/lib/Cloudflare/Tunnel/TunnelLocalBinding.js.map +1 -0
  256. package/lib/Cloudflare/Tunnel/WarpConnector.d.ts +3 -3
  257. package/lib/Cloudflare/Tunnel/WarpConnector.d.ts.map +1 -1
  258. package/lib/Cloudflare/Tunnel/WarpConnector.js +7 -4
  259. package/lib/Cloudflare/Tunnel/WarpConnector.js.map +1 -1
  260. package/lib/Cloudflare/Tunnel/WriteTunnel.d.ts +3 -3
  261. package/lib/Cloudflare/Tunnel/WriteTunnel.d.ts.map +1 -1
  262. package/lib/Cloudflare/Tunnel/WriteTunnel.js +7 -8
  263. package/lib/Cloudflare/Tunnel/WriteTunnel.js.map +1 -1
  264. package/lib/Cloudflare/Tunnel/WriteTunnelLocal.d.ts +29 -0
  265. package/lib/Cloudflare/Tunnel/WriteTunnelLocal.d.ts.map +1 -0
  266. package/lib/Cloudflare/Tunnel/WriteTunnelLocal.js +30 -0
  267. package/lib/Cloudflare/Tunnel/WriteTunnelLocal.js.map +1 -0
  268. package/lib/Cloudflare/Tunnel/index.d.ts +3 -0
  269. package/lib/Cloudflare/Tunnel/index.d.ts.map +1 -1
  270. package/lib/Cloudflare/Tunnel/index.js +3 -0
  271. package/lib/Cloudflare/Tunnel/index.js.map +1 -1
  272. package/lib/Cloudflare/Vectorize/SearchIndexHttpClient.d.ts +30 -0
  273. package/lib/Cloudflare/Vectorize/SearchIndexHttpClient.d.ts.map +1 -0
  274. package/lib/Cloudflare/Vectorize/SearchIndexHttpClient.js +100 -0
  275. package/lib/Cloudflare/Vectorize/SearchIndexHttpClient.js.map +1 -0
  276. package/lib/Cloudflare/Vectorize/SearchIndexLocal.d.ts +42 -0
  277. package/lib/Cloudflare/Vectorize/SearchIndexLocal.d.ts.map +1 -0
  278. package/lib/Cloudflare/Vectorize/SearchIndexLocal.js +58 -0
  279. package/lib/Cloudflare/Vectorize/SearchIndexLocal.js.map +1 -0
  280. package/lib/Cloudflare/Vectorize/index.d.ts +1 -0
  281. package/lib/Cloudflare/Vectorize/index.d.ts.map +1 -1
  282. package/lib/Cloudflare/Vectorize/index.js +1 -0
  283. package/lib/Cloudflare/Vectorize/index.js.map +1 -1
  284. package/lib/Cloudflare/Workers/BrowserHttpClient.d.ts +32 -0
  285. package/lib/Cloudflare/Workers/BrowserHttpClient.d.ts.map +1 -0
  286. package/lib/Cloudflare/Workers/BrowserHttpClient.js +100 -0
  287. package/lib/Cloudflare/Workers/BrowserHttpClient.js.map +1 -0
  288. package/lib/Cloudflare/Workers/BrowserLocal.d.ts +37 -0
  289. package/lib/Cloudflare/Workers/BrowserLocal.d.ts.map +1 -0
  290. package/lib/Cloudflare/Workers/BrowserLocal.js +53 -0
  291. package/lib/Cloudflare/Workers/BrowserLocal.js.map +1 -0
  292. package/lib/Cloudflare/Workers/ConfigProvider.d.ts +8 -0
  293. package/lib/Cloudflare/Workers/ConfigProvider.d.ts.map +1 -1
  294. package/lib/Cloudflare/Workers/ConfigProvider.js +10 -1
  295. package/lib/Cloudflare/Workers/ConfigProvider.js.map +1 -1
  296. package/lib/Cloudflare/Workers/DurableObject.d.ts +137 -3
  297. package/lib/Cloudflare/Workers/DurableObject.d.ts.map +1 -1
  298. package/lib/Cloudflare/Workers/DurableObject.js +141 -6
  299. package/lib/Cloudflare/Workers/DurableObject.js.map +1 -1
  300. package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts +2 -185
  301. package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
  302. package/lib/Cloudflare/Workers/Vite.d.ts.map +1 -1
  303. package/lib/Cloudflare/Workers/Vite.js +81 -2
  304. package/lib/Cloudflare/Workers/Vite.js.map +1 -1
  305. package/lib/Cloudflare/Workers/Worker.d.ts +15 -1
  306. package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
  307. package/lib/Cloudflare/Workers/Worker.js.map +1 -1
  308. package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
  309. package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +2 -1
  310. package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
  311. package/lib/Cloudflare/Workers/WorkerBinding.d.ts +22 -1
  312. package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
  313. package/lib/Cloudflare/Workers/WorkerBinding.js.map +1 -1
  314. package/lib/Cloudflare/Workers/WorkerBridge.d.ts.map +1 -1
  315. package/lib/Cloudflare/Workers/WorkerBridge.js +7 -2
  316. package/lib/Cloudflare/Workers/WorkerBridge.js.map +1 -1
  317. package/lib/Cloudflare/Workers/WorkerProvider.d.ts +81 -0
  318. package/lib/Cloudflare/Workers/WorkerProvider.d.ts.map +1 -1
  319. package/lib/Cloudflare/Workers/WorkerProvider.js +450 -61
  320. package/lib/Cloudflare/Workers/WorkerProvider.js.map +1 -1
  321. package/lib/Cloudflare/Workers/WorkerRuntimeContext.d.ts.map +1 -1
  322. package/lib/Cloudflare/Workers/WorkerRuntimeContext.js +11 -37
  323. package/lib/Cloudflare/Workers/WorkerRuntimeContext.js.map +1 -1
  324. package/lib/Cloudflare/Workers/index.d.ts +1 -0
  325. package/lib/Cloudflare/Workers/index.d.ts.map +1 -1
  326. package/lib/Cloudflare/Workers/index.js +1 -0
  327. package/lib/Cloudflare/Workers/index.js.map +1 -1
  328. package/lib/Diff.d.ts +16 -0
  329. package/lib/Diff.d.ts.map +1 -1
  330. package/lib/Diff.js +33 -0
  331. package/lib/Diff.js.map +1 -1
  332. package/lib/GitHub/Secrets.d.ts +1 -1
  333. package/lib/GitHub/Secrets.js +1 -1
  334. package/lib/GitHub/Variables.d.ts +1 -1
  335. package/lib/GitHub/Variables.js +1 -1
  336. package/lib/Local/RpcSerialization.d.ts.map +1 -1
  337. package/lib/Local/RpcSerialization.js +6 -2
  338. package/lib/Local/RpcSerialization.js.map +1 -1
  339. package/lib/Local/RpcSpawner.d.ts.map +1 -1
  340. package/lib/Local/RpcSpawner.js +14 -8
  341. package/lib/Local/RpcSpawner.js.map +1 -1
  342. package/lib/Neon/AuthProvider.js +1 -1
  343. package/lib/Neon/AuthProvider.js.map +1 -1
  344. package/lib/Plan.d.ts.map +1 -1
  345. package/lib/Plan.js +11 -4
  346. package/lib/Plan.js.map +1 -1
  347. package/lib/Planetscale/Database.d.ts +2 -1
  348. package/lib/Planetscale/Database.d.ts.map +1 -1
  349. package/lib/Planetscale/MySQL/MySQLClusterSize.d.ts +41 -3
  350. package/lib/Planetscale/MySQL/MySQLClusterSize.d.ts.map +1 -1
  351. package/lib/Planetscale/MySQL/MySQLClusterSize.js +88 -11
  352. package/lib/Planetscale/MySQL/MySQLClusterSize.js.map +1 -1
  353. package/lib/Planetscale/MySQL/MySQLDatabase.d.ts +14 -0
  354. package/lib/Planetscale/MySQL/MySQLDatabase.d.ts.map +1 -1
  355. package/lib/Planetscale/MySQL/MySQLDatabase.js +24 -11
  356. package/lib/Planetscale/MySQL/MySQLDatabase.js.map +1 -1
  357. package/lib/Platform.d.ts.map +1 -1
  358. package/lib/Platform.js +11 -1
  359. package/lib/Platform.js.map +1 -1
  360. package/lib/Runtime.d.ts +23 -0
  361. package/lib/Runtime.d.ts.map +1 -1
  362. package/lib/Runtime.js +83 -0
  363. package/lib/Runtime.js.map +1 -1
  364. package/lib/RuntimeContext.d.ts +46 -0
  365. package/lib/RuntimeContext.d.ts.map +1 -1
  366. package/lib/RuntimeContext.js +60 -0
  367. package/lib/RuntimeContext.js.map +1 -1
  368. package/lib/Server/Process.d.ts +1 -1
  369. package/lib/Server/Process.d.ts.map +1 -1
  370. package/lib/Server/Process.js +8 -8
  371. package/lib/Server/Process.js.map +1 -1
  372. package/lib/Stack.js +1 -1
  373. package/lib/Stack.js.map +1 -1
  374. package/lib/State/HttpStateApi.d.ts +10 -10
  375. package/lib/Test/Alchemy.d.ts +74 -0
  376. package/lib/Test/Alchemy.d.ts.map +1 -0
  377. package/lib/Test/Alchemy.js +143 -0
  378. package/lib/Test/Alchemy.js.map +1 -0
  379. package/lib/Util/cached-function.d.ts +1 -1
  380. package/lib/Util/cached-function.d.ts.map +1 -1
  381. package/lib/Util/cached-function.js +2 -2
  382. package/lib/Util/cached-function.js.map +1 -1
  383. package/lib/Util/proxy-chain.js +3 -0
  384. package/lib/Util/proxy-chain.js.map +1 -1
  385. package/package.json +10 -10
  386. package/src/AWS/AuthProvider.ts +1 -1
  387. package/src/AWS/EC2/hosted.ts +2 -1
  388. package/src/AWS/ECS/Task.ts +2 -1
  389. package/src/AWS/Lambda/Function.ts +13 -47
  390. package/src/AWS/Lambda/MicrovmRuntimeContext.ts +11 -38
  391. package/src/Action.ts +39 -6
  392. package/src/ActionRuntimeContext.ts +68 -0
  393. package/src/Apply.ts +46 -8
  394. package/src/Auth/AuthProvider.ts +1 -1
  395. package/src/Auth/Lock.ts +5 -2
  396. package/src/Bundle/PurePlugin.ts +34 -1
  397. package/src/Bundle/Vite.ts +51 -1
  398. package/src/Cli/LoggingCli.ts +7 -4
  399. package/src/Cli/commands/_shared.ts +52 -0
  400. package/src/Cli/commands/login.ts +90 -14
  401. package/src/Cli/commands/profile.ts +7 -41
  402. package/src/Cloudflare/AI/LanguageModel.ts +25 -5
  403. package/src/Cloudflare/AI/QuerySearchLocal.ts +66 -0
  404. package/src/Cloudflare/AI/QuerySearchNamespaceLocal.ts +60 -0
  405. package/src/Cloudflare/AI/SearchHttpClient.ts +423 -0
  406. package/src/Cloudflare/AI/index.ts +2 -0
  407. package/src/Cloudflare/Auth/AuthProvider.ts +1 -1
  408. package/src/Cloudflare/Containers/ContainerBundle.ts +11 -1
  409. package/src/Cloudflare/Containers/ContainerPlatform.ts +14 -52
  410. package/src/Cloudflare/D1/QueryDatabaseHttpClient.ts +176 -0
  411. package/src/Cloudflare/D1/QueryDatabaseLocal.ts +66 -0
  412. package/src/Cloudflare/D1/index.ts +1 -0
  413. package/src/Cloudflare/DNS/DnsHttp.ts +24 -2
  414. package/src/Cloudflare/DNS/DnsLocal.ts +41 -0
  415. package/src/Cloudflare/DNS/ReadDnsHttp.ts +4 -5
  416. package/src/Cloudflare/DNS/ReadDnsLocal.ts +38 -0
  417. package/src/Cloudflare/DNS/ReadWriteDnsHttp.ts +5 -5
  418. package/src/Cloudflare/DNS/ReadWriteDnsLocal.ts +46 -0
  419. package/src/Cloudflare/DNS/WriteDnsHttp.ts +4 -5
  420. package/src/Cloudflare/DNS/WriteDnsLocal.ts +44 -0
  421. package/src/Cloudflare/DNS/index.ts +3 -0
  422. package/src/Cloudflare/Flagship/ReadFlagsHttpClient.ts +183 -0
  423. package/src/Cloudflare/Flagship/ReadFlagsLocal.ts +69 -0
  424. package/src/Cloudflare/Flagship/index.ts +1 -0
  425. package/src/Cloudflare/KV/NamespaceHttp.ts +25 -2
  426. package/src/Cloudflare/KV/NamespaceLocal.ts +42 -0
  427. package/src/Cloudflare/KV/ReadNamespaceHttp.ts +7 -6
  428. package/src/Cloudflare/KV/ReadNamespaceLocal.ts +35 -0
  429. package/src/Cloudflare/KV/ReadWriteNamespaceHttp.ts +11 -6
  430. package/src/Cloudflare/KV/ReadWriteNamespaceLocal.ts +42 -0
  431. package/src/Cloudflare/KV/WriteNamespaceHttp.ts +7 -6
  432. package/src/Cloudflare/KV/WriteNamespaceLocal.ts +35 -0
  433. package/src/Cloudflare/KV/index.ts +3 -0
  434. package/src/Cloudflare/Queues/QueueHttp.ts +24 -2
  435. package/src/Cloudflare/Queues/WriteQueueHttp.ts +16 -7
  436. package/src/Cloudflare/Queues/WriteQueueLocal.ts +64 -0
  437. package/src/Cloudflare/Queues/index.ts +1 -0
  438. package/src/Cloudflare/R2/BucketHttp.ts +20 -3
  439. package/src/Cloudflare/R2/BucketLocal.ts +47 -0
  440. package/src/Cloudflare/R2/ReadBucketHttp.ts +10 -5
  441. package/src/Cloudflare/R2/ReadBucketLocal.ts +33 -0
  442. package/src/Cloudflare/R2/ReadWriteBucketHttp.ts +11 -5
  443. package/src/Cloudflare/R2/ReadWriteBucketLocal.ts +36 -0
  444. package/src/Cloudflare/R2/WriteBucketHttp.ts +10 -5
  445. package/src/Cloudflare/R2/WriteBucketLocal.ts +33 -0
  446. package/src/Cloudflare/R2/index.ts +3 -0
  447. package/src/Cloudflare/Tunnel/ReadTunnel.ts +8 -9
  448. package/src/Cloudflare/Tunnel/ReadTunnelLocal.ts +33 -0
  449. package/src/Cloudflare/Tunnel/ReadWriteTunnel.ts +5 -5
  450. package/src/Cloudflare/Tunnel/ReadWriteTunnelLocal.ts +39 -0
  451. package/src/Cloudflare/Tunnel/TunnelBinding.ts +26 -2
  452. package/src/Cloudflare/Tunnel/TunnelLocalBinding.ts +38 -0
  453. package/src/Cloudflare/Tunnel/WarpConnector.ts +8 -5
  454. package/src/Cloudflare/Tunnel/WriteTunnel.ts +8 -9
  455. package/src/Cloudflare/Tunnel/WriteTunnelLocal.ts +33 -0
  456. package/src/Cloudflare/Tunnel/index.ts +3 -0
  457. package/src/Cloudflare/Vectorize/SearchIndexHttpClient.ts +183 -0
  458. package/src/Cloudflare/Vectorize/SearchIndexLocal.ts +70 -0
  459. package/src/Cloudflare/Vectorize/index.ts +1 -0
  460. package/src/Cloudflare/Workers/BrowserHttpClient.ts +201 -0
  461. package/src/Cloudflare/Workers/BrowserLocal.ts +65 -0
  462. package/src/Cloudflare/Workers/ConfigProvider.ts +15 -1
  463. package/src/Cloudflare/Workers/DurableObject.ts +227 -6
  464. package/src/Cloudflare/Workers/Vite.ts +93 -11
  465. package/src/Cloudflare/Workers/Worker.ts +19 -1
  466. package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +6 -5
  467. package/src/Cloudflare/Workers/WorkerBinding.ts +20 -1
  468. package/src/Cloudflare/Workers/WorkerBridge.ts +12 -2
  469. package/src/Cloudflare/Workers/WorkerProvider.ts +664 -117
  470. package/src/Cloudflare/Workers/WorkerRuntimeContext.ts +14 -45
  471. package/src/Cloudflare/Workers/index.ts +1 -0
  472. package/src/Diff.ts +33 -0
  473. package/src/GitHub/Secrets.ts +1 -1
  474. package/src/GitHub/Variables.ts +1 -1
  475. package/src/Local/RpcSerialization.ts +6 -2
  476. package/src/Local/RpcSpawner.ts +21 -8
  477. package/src/Neon/AuthProvider.ts +1 -1
  478. package/src/Plan.ts +17 -4
  479. package/src/Planetscale/Database.ts +2 -1
  480. package/src/Planetscale/MySQL/MySQLClusterSize.ts +120 -21
  481. package/src/Planetscale/MySQL/MySQLDatabase.ts +84 -44
  482. package/src/Platform.ts +12 -3
  483. package/src/Runtime.ts +92 -0
  484. package/src/RuntimeContext.ts +79 -0
  485. package/src/Server/Process.ts +11 -18
  486. package/src/Stack.ts +1 -1
  487. package/src/Test/Alchemy.ts +282 -0
  488. package/src/Util/cached-function.ts +5 -5
  489. package/src/Util/proxy-chain.ts +3 -0
@@ -18,6 +18,7 @@ import {
18
18
  } from "../Util.ts";
19
19
  import {
20
20
  ensureMySQLProductionBranchClusterSize,
21
+ observeDefaultKeyspaceReplicas,
21
22
  type MySQLClusterSize,
22
23
  } from "./MySQLClusterSize.ts";
23
24
  import { runMySQLImports, runMySQLMigrations } from "./MySQLMigrations.ts";
@@ -32,6 +33,16 @@ export interface MySQLDatabaseProps extends BaseDatabaseProps {
32
33
  */
33
34
  clusterSize: MySQLClusterSize;
34
35
 
36
+ /**
37
+ * Desired total number of replicas for the database's default keyspace.
38
+ * Each cluster size includes a fixed number of replicas (2 for
39
+ * production `PS_*` sizes); higher values add extra replicas. Changes
40
+ * are reconciled in place via PlanetScale's keyspace resize lifecycle —
41
+ * never by replacing the database.
42
+ * @see https://planetscale.com/docs/vitess/sharding/keyspaces
43
+ */
44
+ replicas?: number;
45
+
35
46
  /**
36
47
  * Whether to copy migration data to new branches and in deploy requests.
37
48
  */
@@ -67,6 +78,12 @@ export interface MySQLDatabaseProps extends BaseDatabaseProps {
67
78
  * Output attributes of a deployed MySQL PlanetScale database.
68
79
  */
69
80
  export interface MySQLDatabaseAttributes extends BaseDatabaseAttributes {
81
+ /**
82
+ * Observed total replica count of the default keyspace on the default
83
+ * branch, or `undefined` while the keyspace is still provisioning.
84
+ */
85
+ replicas: number | undefined;
86
+
70
87
  /**
71
88
  * Whether to copy migration data to new branches and in deploy requests.
72
89
  */
@@ -168,8 +185,14 @@ export const MySQLDatabaseProvider = () =>
168
185
  ) {
169
186
  return { action: "replace" } as const;
170
187
  }
171
- if (news.replicas !== olds.replicas) {
172
- return { action: "replace" } as const;
188
+ // Replicas reconcile in place via a keyspace resize — never a
189
+ // replacement. Diff against the observed keyspace replica count so
190
+ // an adopted database whose live state already matches plans no-op.
191
+ if (
192
+ news.replicas !== undefined &&
193
+ news.replicas !== (output?.replicas ?? olds.replicas)
194
+ ) {
195
+ return { action: "update" } as const;
173
196
  }
174
197
  if (news.migrationsDir) {
175
198
  const newHashes = yield* hashMigrations(news.migrationsDir);
@@ -203,46 +226,57 @@ export const MySQLDatabaseProvider = () =>
203
226
  database: databaseName,
204
227
  })
205
228
  .pipe(
206
- Effect.flatMap((data) => {
207
- if (data.kind !== "mysql") {
208
- return Effect.fail(
209
- new PlanetscaleConflict({
210
- message:
211
- `Planetscale database "${data.name}" has kind "${data.kind}" but this resource ` +
212
- `is a MySQLDatabase. Use Planetscale.${data.kind === "postgresql" ? "PostgresDatabase" : data.kind}() instead, ` +
213
- `or delete the existing database and retry.`,
214
- }),
229
+ Effect.flatMap(
230
+ Effect.fn(function* (data) {
231
+ if (data.kind !== "mysql") {
232
+ return yield* Effect.fail(
233
+ new PlanetscaleConflict({
234
+ message:
235
+ `Planetscale database "${data.name}" has kind "${data.kind}" but this resource ` +
236
+ `is a MySQLDatabase. Use Planetscale.${data.kind === "postgresql" ? "PostgresDatabase" : data.kind}() instead, ` +
237
+ `or delete the existing database and retry.`,
238
+ }),
239
+ );
240
+ }
241
+ // Observe the default keyspace's live replica configuration
242
+ // so adopted databases diff against reality.
243
+ const replicas = yield* observeDefaultKeyspaceReplicas(
244
+ organization,
245
+ data.name,
246
+ data.default_branch ?? "main",
215
247
  );
216
- }
217
- return Effect.succeed({
218
- id: data.id,
219
- name: data.name,
220
- organization,
221
- state: data.state,
222
- defaultBranch: data.default_branch ?? "main",
223
- plan: data.plan ?? "hobby",
224
- createdAt: data.created_at,
225
- updatedAt: data.updated_at,
226
- htmlUrl: data.html_url,
227
- region: { slug: data.region.slug },
228
- migrationsDir: output?.migrationsDir ?? olds?.migrationsDir,
229
- migrationsTable: output?.migrationsTable ?? olds?.migrationsTable,
230
- migrationsHashes: output?.migrationsHashes ?? {},
231
- importHashes: output?.importHashes ?? {},
232
- clusterSize: output?.clusterSize ?? "",
233
- requireApprovalForDeploy:
234
- data.require_approval_for_deploy ?? false,
235
- restrictBranchRegion: data.restrict_branch_region ?? false,
236
- insightsRawQueries: data.insights_raw_queries ?? false,
237
- productionBranchWebConsole:
238
- data.production_branch_web_console ?? false,
239
- automaticMigrations: data.automatic_migrations ?? false,
240
- migrationFramework: data.migration_framework ?? undefined,
241
- migrationTableName: data.migration_table_name ?? undefined,
242
- allowDataBranching: data.allow_data_branching ?? false,
243
- allowForeignKeyConstraints: data.foreign_keys_enabled ?? false,
244
- });
245
- }),
248
+ return {
249
+ id: data.id,
250
+ name: data.name,
251
+ organization,
252
+ state: data.state,
253
+ defaultBranch: data.default_branch ?? "main",
254
+ replicas,
255
+ plan: data.plan ?? "hobby",
256
+ createdAt: data.created_at,
257
+ updatedAt: data.updated_at,
258
+ htmlUrl: data.html_url,
259
+ region: { slug: data.region.slug },
260
+ migrationsDir: output?.migrationsDir ?? olds?.migrationsDir,
261
+ migrationsTable:
262
+ output?.migrationsTable ?? olds?.migrationsTable,
263
+ migrationsHashes: output?.migrationsHashes ?? {},
264
+ importHashes: output?.importHashes ?? {},
265
+ clusterSize: output?.clusterSize ?? "",
266
+ requireApprovalForDeploy:
267
+ data.require_approval_for_deploy ?? false,
268
+ restrictBranchRegion: data.restrict_branch_region ?? false,
269
+ insightsRawQueries: data.insights_raw_queries ?? false,
270
+ productionBranchWebConsole:
271
+ data.production_branch_web_console ?? false,
272
+ automaticMigrations: data.automatic_migrations ?? false,
273
+ migrationFramework: data.migration_framework ?? undefined,
274
+ migrationTableName: data.migration_table_name ?? undefined,
275
+ allowDataBranching: data.allow_data_branching ?? false,
276
+ allowForeignKeyConstraints: data.foreign_keys_enabled ?? false,
277
+ };
278
+ }),
279
+ ),
246
280
  Effect.catchTag("NotFound", () => Effect.succeed(undefined)),
247
281
  );
248
282
  }),
@@ -272,13 +306,14 @@ export const MySQLDatabaseProvider = () =>
272
306
  // Ensure — if missing, create.
273
307
  if (!observed) {
274
308
  yield* session.note("Creating database...");
309
+ // Note: the API rejects the `replicas` param for mysql databases;
310
+ // replicas are converged below via the keyspace resize lifecycle.
275
311
  observed = yield* planetscale.createDatabase({
276
312
  organization,
277
313
  name: newName,
278
314
  region: news.region?.slug,
279
315
  kind: "mysql",
280
316
  cluster_size: clusterSize,
281
- replicas: news.replicas,
282
317
  });
283
318
  }
284
319
 
@@ -345,13 +380,16 @@ export const MySQLDatabaseProvider = () =>
345
380
  default_branch: news.defaultBranch,
346
381
  });
347
382
 
348
- // Sync cluster size on the active default branch.
383
+ // Sync cluster size and replicas on the active default branch —
384
+ // both converge in place via PlanetScale's keyspace resize
385
+ // lifecycle, diffed against the observed default keyspace.
349
386
  const branch = news.defaultBranch ?? updated.default_branch ?? "main";
350
- yield* ensureMySQLProductionBranchClusterSize(
387
+ const keyspace = yield* ensureMySQLProductionBranchClusterSize(
351
388
  organization,
352
389
  updated.name,
353
390
  branch,
354
391
  news.clusterSize,
392
+ news.replicas,
355
393
  );
356
394
 
357
395
  const migrationTarget = {
@@ -394,6 +432,7 @@ export const MySQLDatabaseProvider = () =>
394
432
  htmlUrl: updated.html_url,
395
433
  region: { slug: updated.region.slug },
396
434
  clusterSize,
435
+ replicas: keyspace.replicas,
397
436
  migrationsDir: news.migrationsDir,
398
437
  migrationsTable: news.migrationsDir ? migrationsTable : undefined,
399
438
  migrationsHashes,
@@ -445,6 +484,7 @@ export const MySQLDatabaseProvider = () =>
445
484
  migrationsHashes: {},
446
485
  importHashes: {},
447
486
  clusterSize: "",
487
+ replicas: undefined,
448
488
  requireApprovalForDeploy:
449
489
  data.require_approval_for_deploy ?? false,
450
490
  restrictBranchRegion: data.restrict_branch_region ?? false,
package/src/Platform.ts CHANGED
@@ -385,15 +385,24 @@ export const Platform = <
385
385
  // e.g.
386
386
  // export default Cloudflare.Worker("id", { main: "./src/worker.ts" }, Effect.gen(function* () { .. })
387
387
  const cls = makeClass(id);
388
- return cls.Self.pipe(
389
- provideClassLayer(cls.make(props, impl)),
390
- effectClass,
388
+ return Object.assign(
389
+ cls.Self.pipe(provideClassLayer(cls.make(props, impl)), effectClass),
390
+ // Expose the logical id statically (mirrors `makeClass`) so a class
391
+ // reference identifies its resource without being yielded.
392
+ { LogicalId: id },
391
393
  );
392
394
  }
393
395
  };
394
396
 
395
397
  const makeClass = (id: string) => {
396
398
  class Platform {
399
+ /**
400
+ * Logical id of the resource this class declares. Statically readable
401
+ * — e.g. `DurableObjectProps.transferredFrom` accepts a Worker class
402
+ * and takes its identity from here without yielding it (yielding
403
+ * would add a dependency edge on the referenced resource).
404
+ */
405
+ static readonly LogicalId = id;
397
406
  static readonly Self = Self(`${type}<${id}>`);
398
407
  static readonly Platform = Context.Service<Platform, Platform>(
399
408
  `Platform<${type}<${id}>>`,
package/src/Runtime.ts CHANGED
@@ -6,7 +6,10 @@
6
6
  * surface tiny and dependency-light.
7
7
  */
8
8
 
9
+ import * as ConfigProvider from "effect/ConfigProvider";
10
+ import * as Effect from "effect/Effect";
9
11
  import * as Layer from "effect/Layer";
12
+ import { isRedactedMarker, sanitizeKey } from "./RuntimeContext.ts";
10
13
  import { asEffect } from "./Util/types.ts";
11
14
 
12
15
  /**
@@ -32,3 +35,92 @@ export const makeEntrypointLayer = (
32
35
  }
33
36
  return Layer.effect(tag, asEffect(entrypoint));
34
37
  };
38
+
39
+ /**
40
+ * Unwrap the `{"_tag":"Redacted","value":...}` marker that the deploy-time
41
+ * `Config` interceptor (see `Platform.ts`) and `RuntimeContext.set` use to
42
+ * preserve `Redacted`-ness across the env-var boundary. Returns the inner
43
+ * source value as a string, or `undefined` when `raw` is not a marker.
44
+ */
45
+ const parseRedactedMarker = (raw: string): string | undefined => {
46
+ if (!raw.startsWith("{")) {
47
+ return undefined;
48
+ }
49
+ try {
50
+ const parsed: unknown = JSON.parse(raw);
51
+ if (isRedactedMarker(parsed)) {
52
+ return typeof parsed.value === "string"
53
+ ? parsed.value
54
+ : JSON.stringify(parsed.value);
55
+ }
56
+ } catch {
57
+ // not JSON — plain env value, fall through
58
+ }
59
+ return undefined;
60
+ };
61
+
62
+ /**
63
+ * Reify an env-var string the way `RuntimeContext.get` does: unwrap the
64
+ * `Redacted` marker, unquote a JSON-stringified string, and pass anything
65
+ * else through verbatim.
66
+ */
67
+ const reifyEnvString = (raw: string): string => {
68
+ const marker = parseRedactedMarker(raw);
69
+ if (marker !== undefined) {
70
+ return marker;
71
+ }
72
+ if (raw.startsWith('"')) {
73
+ try {
74
+ const parsed: unknown = JSON.parse(raw);
75
+ if (typeof parsed === "string") {
76
+ return parsed;
77
+ }
78
+ } catch {
79
+ // not JSON — plain env value, fall through
80
+ }
81
+ }
82
+ return raw;
83
+ };
84
+
85
+ /**
86
+ * Wrap a runtime's env-backed `ConfigProvider` so values that were
87
+ * auto-bound by the deploy-time `Config` interceptor decode transparently.
88
+ *
89
+ * The engine can't know which config values are sensitive, so the
90
+ * interceptor binds every `Config` read during Init onto the deploy target
91
+ * as a secret, serialized as a `{"_tag":"Redacted","value":<source>}`
92
+ * marker. The interceptor's runtime branch reifies those markers for reads
93
+ * during Init, but effects that run later (request handlers, nested
94
+ * layers) resolve `Config` against the raw env-backed provider — without
95
+ * this wrapper, `Config.number("PORT")` inside a handler sees the marker
96
+ * JSON instead of the source value and fails with a schema error.
97
+ *
98
+ * Two behaviors:
99
+ * - Leaf values that carry the marker are unwrapped to the raw source
100
+ * string before `Config` schemas decode them; everything else passes
101
+ * through untouched.
102
+ * - On a miss, falls back to the flat `sanitizeKey`-canonicalized key
103
+ * (`my.key` → `my_key`) that the interceptor bound the value under, so
104
+ * config names with non-alphanumeric characters resolve at runtime too.
105
+ */
106
+ export const reifyBoundConfigProvider = (
107
+ base: ConfigProvider.ConfigProvider,
108
+ env: Record<string, unknown>,
109
+ ): ConfigProvider.ConfigProvider =>
110
+ ConfigProvider.make((path) =>
111
+ base.load(path).pipe(
112
+ Effect.map((node) => {
113
+ if (node?._tag === "Value") {
114
+ const value = parseRedactedMarker(node.value);
115
+ return value === undefined ? node : ConfigProvider.makeValue(value);
116
+ }
117
+ if (node === undefined) {
118
+ const raw = env[sanitizeKey(path.map((p) => p.toString()).join("_"))];
119
+ if (typeof raw === "string") {
120
+ return ConfigProvider.makeValue(reifyEnvString(raw));
121
+ }
122
+ }
123
+ return node;
124
+ }),
125
+ ),
126
+ );
@@ -2,6 +2,7 @@ import * as Context from "effect/Context";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Layer from "effect/Layer";
4
4
  import * as Option from "effect/Option";
5
+ import * as Redacted from "effect/Redacted";
5
6
  import type { HttpEffect } from "./Http.ts";
6
7
  import type { Output } from "./Output.ts";
7
8
 
@@ -43,6 +44,84 @@ export interface BaseRuntimeContext {
43
44
  export const sanitizeKey = (key: string): string =>
44
45
  key.replaceAll(/[^a-zA-Z0-9]/g, "_");
45
46
 
47
+ /**
48
+ * The wire format `RuntimeContext.set`/`get` use to carry a `Redacted` value
49
+ * through an environment variable. `JSON.stringify(Redacted)` emits the
50
+ * literal string `"<redacted>"` and loses the value, so secrets are
51
+ * serialized as this marker and the runtime `get` path rebuilds the wrapper.
52
+ */
53
+ export interface RedactedMarker {
54
+ readonly _tag: "Redacted";
55
+ readonly value: unknown;
56
+ }
57
+
58
+ /**
59
+ * Detect the (already JSON-parsed) {@link RedactedMarker} shape. After
60
+ * `JSON.parse` the marker is a plain object — `Redacted.isRedacted` is
61
+ * always `false` on it — so detection is structural.
62
+ */
63
+ export const isRedactedMarker = (value: unknown): value is RedactedMarker =>
64
+ typeof value === "object" &&
65
+ value !== null &&
66
+ (value as { _tag?: unknown })._tag === "Redacted" &&
67
+ "value" in value;
68
+
69
+ /**
70
+ * Serialize a binding value for an env var: `Redacted` values are packed as
71
+ * a {@link RedactedMarker}, everything else is plain `JSON.stringify`.
72
+ */
73
+ export const packEnvValue = (value: unknown): string =>
74
+ Redacted.isRedacted(value)
75
+ ? JSON.stringify({
76
+ _tag: "Redacted",
77
+ value: Redacted.value(value),
78
+ } satisfies RedactedMarker)
79
+ : JSON.stringify(value);
80
+
81
+ /**
82
+ * Like {@link packEnvValue}, but a `Redacted` input keeps its `Redacted`
83
+ * wrapper on the *outside* of the packed string, so deploy-time code can
84
+ * route secrets through a dedicated channel (Cloudflare `secret_text`,
85
+ * Secrets Store) instead of leaking them as plain env vars. The inner
86
+ * payload still carries the marker for the runtime `get` accessor.
87
+ */
88
+ export const packEnvValueKeepRedacted = (
89
+ value: unknown,
90
+ ): string | Redacted.Redacted<string> =>
91
+ Redacted.isRedacted(value)
92
+ ? Redacted.make(packEnvValue(value))
93
+ : packEnvValue(value);
94
+
95
+ /**
96
+ * Parse an env-var string produced by {@link packEnvValue} back into its
97
+ * value: rebuild `Redacted` from the marker, return other JSON values
98
+ * as-is, and fall back to the raw string for non-JSON input (e.g. an env
99
+ * var the user set directly). `undefined` passes through.
100
+ *
101
+ * Runtime `get` accessors MUST feed this from the raw environment
102
+ * (`process.env[key]` / the platform env object) — never through
103
+ * `Config.string`: the ambient runtime `ConfigProvider` reifies bound
104
+ * values (unwrapping the marker before it could be detected here), and
105
+ * during init the ambient provider is the interceptor installed in
106
+ * `Platform.ts`, whose runtime branch calls back into `ctx.get(key)` —
107
+ * resolving through `Config` would re-enter it for the same key and
108
+ * recurse forever.
109
+ */
110
+ export const unpackEnvValue = <T>(raw: string | undefined): T | undefined => {
111
+ if (raw === undefined) {
112
+ return undefined;
113
+ }
114
+ try {
115
+ const parsed: unknown = JSON.parse(raw);
116
+ if (isRedactedMarker(parsed)) {
117
+ return Redacted.make(parsed.value) as unknown as T;
118
+ }
119
+ return parsed as T;
120
+ } catch {
121
+ return raw as unknown as T; // assume it's just a string
122
+ }
123
+ };
124
+
46
125
  /**
47
126
  * Context of the runtime environment.
48
127
  *
@@ -1,4 +1,3 @@
1
- import * as Config from "effect/Config";
2
1
  import * as Context from "effect/Context";
3
2
  import * as Effect from "effect/Effect";
4
3
  import { FileSystem } from "effect/FileSystem";
@@ -9,7 +8,11 @@ import type { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSp
9
8
  import type { HttpEffect } from "../Http.ts";
10
9
  import * as Http from "../Http.ts";
11
10
  import * as Output from "../Output.ts";
12
- import type { BaseRuntimeContext } from "../RuntimeContext.ts";
11
+ import {
12
+ packEnvValue,
13
+ unpackEnvValue,
14
+ type BaseRuntimeContext,
15
+ } from "../RuntimeContext.ts";
13
16
 
14
17
  export type ProcessServices =
15
18
  | ChildProcessSpawner
@@ -74,25 +77,15 @@ export const createHostRuntimeContext =
74
77
  set: (bindingId: string, output: Output.Output) =>
75
78
  Effect.sync(() => {
76
79
  const key = bindingId.replaceAll(/[^a-zA-Z0-9]/g, "_");
77
- env[key] = output.pipe(Output.map((value) => JSON.stringify(value)));
80
+ // `packEnvValue` marker-packs Redacted values so they survive the
81
+ // Output → env round-trip.
82
+ env[key] = output.pipe(Output.map(packEnvValue));
78
83
  return key;
79
84
  }),
80
85
  get: <T>(key: string) =>
81
- Config.string(key).pipe(
82
- Effect.flatMap((value) =>
83
- Effect.try({
84
- try: () => JSON.parse(value) as T,
85
- catch: (error) => error as Error,
86
- }),
87
- ),
88
- Effect.catch((cause) =>
89
- Effect.die(
90
- new Error(`Failed to get environment variable: ${key}`, {
91
- cause,
92
- }),
93
- ),
94
- ),
95
- ),
86
+ // Read straight from `process.env` — see `unpackEnvValue` for why
87
+ // this must never resolve through `Config.string`.
88
+ Effect.sync(() => unpackEnvValue<T>(process.env[key]) as T),
96
89
  run: (effect: Effect.Effect<void, never, any>) =>
97
90
  Effect.sync(() => {
98
91
  runners.push(effect);
package/src/Stack.ts CHANGED
@@ -238,7 +238,7 @@ export const make =
238
238
  ` providers: Cloudflare.providers(),\n` +
239
239
  ` state: Cloudflare.state(), // <-- required\n` +
240
240
  ` }, ...)\n` +
241
- `See https://v2.alchemy.run/state-store for available state stores.`,
241
+ `See https://alchemy.run/state-store for available state stores.`,
242
242
  ),
243
243
  );
244
244
  }