alchemy 2.0.0-beta.84 → 2.0.0-beta.85

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 (758) hide show
  1. package/THIRD_PARTY_LICENSES.md +2 -2
  2. package/bin/cli.js +14 -6
  3. package/bin/register-oxc.js +16 -12
  4. package/lib/AdoptPolicy.d.ts +73 -0
  5. package/lib/AdoptPolicy.d.ts.map +1 -1
  6. package/lib/AdoptPolicy.js +54 -0
  7. package/lib/AdoptPolicy.js.map +1 -1
  8. package/lib/Alchemist/AuthRegistry.d.ts +31 -0
  9. package/lib/Alchemist/AuthRegistry.d.ts.map +1 -0
  10. package/lib/Alchemist/AuthRegistry.js +95 -0
  11. package/lib/Alchemist/AuthRegistry.js.map +1 -0
  12. package/lib/Alchemist/Drift.d.ts +70 -0
  13. package/lib/Alchemist/Drift.d.ts.map +1 -0
  14. package/lib/Alchemist/Drift.js +54 -0
  15. package/lib/Alchemist/Drift.js.map +1 -0
  16. package/lib/Alchemist/Entrypoint.d.ts +27 -3
  17. package/lib/Alchemist/Entrypoint.d.ts.map +1 -1
  18. package/lib/Alchemist/Entrypoint.js +34 -3
  19. package/lib/Alchemist/Entrypoint.js.map +1 -1
  20. package/lib/Alchemist/Errors.d.ts +1 -1
  21. package/lib/Alchemist/Errors.d.ts.map +1 -1
  22. package/lib/Alchemist/Errors.js +1 -1
  23. package/lib/Alchemist/Errors.js.map +1 -1
  24. package/lib/Alchemist/Logs.d.ts +46 -0
  25. package/lib/Alchemist/Logs.d.ts.map +1 -0
  26. package/lib/Alchemist/{routes/logs.js → Logs.js} +21 -26
  27. package/lib/Alchemist/Logs.js.map +1 -0
  28. package/lib/Alchemist/Nuke.d.ts +69 -0
  29. package/lib/Alchemist/Nuke.d.ts.map +1 -0
  30. package/lib/Alchemist/Nuke.js +35 -0
  31. package/lib/Alchemist/Nuke.js.map +1 -0
  32. package/lib/Alchemist/Operations.d.ts +168 -0
  33. package/lib/Alchemist/Operations.d.ts.map +1 -0
  34. package/lib/Alchemist/Operations.js +165 -0
  35. package/lib/Alchemist/Operations.js.map +1 -0
  36. package/lib/Alchemist/Profile.d.ts +132 -0
  37. package/lib/Alchemist/Profile.d.ts.map +1 -0
  38. package/lib/Alchemist/{routes/profile.js → Profile.js} +20 -21
  39. package/lib/Alchemist/Profile.js.map +1 -0
  40. package/lib/Alchemist/{routes/provider.d.ts → Provider.d.ts} +4 -4
  41. package/lib/Alchemist/Provider.d.ts.map +1 -0
  42. package/lib/Alchemist/{routes/provider.js → Provider.js} +7 -6
  43. package/lib/Alchemist/Provider.js.map +1 -0
  44. package/lib/Alchemist/Runtime.d.ts +10 -6
  45. package/lib/Alchemist/Runtime.d.ts.map +1 -1
  46. package/lib/Alchemist/Runtime.js +38 -2
  47. package/lib/Alchemist/Runtime.js.map +1 -1
  48. package/lib/Alchemist/{routes/state.d.ts → State.d.ts} +36 -16
  49. package/lib/Alchemist/State.d.ts.map +1 -0
  50. package/lib/Alchemist/{routes/state.js → State.js} +50 -15
  51. package/lib/Alchemist/State.js.map +1 -0
  52. package/lib/Alchemist/index.d.ts +11 -10
  53. package/lib/Alchemist/index.d.ts.map +1 -1
  54. package/lib/Alchemist/index.js +10 -9
  55. package/lib/Alchemist/index.js.map +1 -1
  56. package/lib/Apply.d.ts +2 -8
  57. package/lib/Apply.d.ts.map +1 -1
  58. package/lib/Apply.js +364 -184
  59. package/lib/Apply.js.map +1 -1
  60. package/lib/Auth/AuthProvider.d.ts +24 -11
  61. package/lib/Auth/AuthProvider.d.ts.map +1 -1
  62. package/lib/Auth/AuthProvider.js +28 -12
  63. package/lib/Auth/AuthProvider.js.map +1 -1
  64. package/lib/Auth/BrowserOAuth.d.ts +6 -8
  65. package/lib/Auth/BrowserOAuth.d.ts.map +1 -1
  66. package/lib/Auth/BrowserOAuth.js +25 -41
  67. package/lib/Auth/BrowserOAuth.js.map +1 -1
  68. package/lib/Auth/Credentials.d.ts.map +1 -1
  69. package/lib/Auth/Credentials.js +2 -2
  70. package/lib/Auth/Credentials.js.map +1 -1
  71. package/lib/Auth/Demand.d.ts +4 -4
  72. package/lib/Auth/Demand.d.ts.map +1 -1
  73. package/lib/Auth/Demand.js +16 -10
  74. package/lib/Auth/Demand.js.map +1 -1
  75. package/lib/Auth/Env.d.ts +2 -1
  76. package/lib/Auth/Env.d.ts.map +1 -1
  77. package/lib/Auth/Env.js +4 -2
  78. package/lib/Auth/Env.js.map +1 -1
  79. package/lib/Auth/Inspect.d.ts +2 -2
  80. package/lib/Auth/Inspect.d.ts.map +1 -1
  81. package/lib/Auth/Inspect.js +3 -1
  82. package/lib/Auth/Inspect.js.map +1 -1
  83. package/lib/Auth/Lock.d.ts.map +1 -1
  84. package/lib/Auth/Lock.js +4 -8
  85. package/lib/Auth/Lock.js.map +1 -1
  86. package/lib/Auth/OAuthFlow.d.ts +3 -12
  87. package/lib/Auth/OAuthFlow.d.ts.map +1 -1
  88. package/lib/Auth/OAuthFlow.js +7 -17
  89. package/lib/Auth/OAuthFlow.js.map +1 -1
  90. package/lib/Auth/Paths.d.ts +2 -1
  91. package/lib/Auth/Paths.d.ts.map +1 -1
  92. package/lib/Auth/Paths.js +3 -2
  93. package/lib/Auth/Paths.js.map +1 -1
  94. package/lib/Auth/Profile.d.ts +10 -0
  95. package/lib/Auth/Profile.d.ts.map +1 -1
  96. package/lib/Auth/Profile.js +19 -2
  97. package/lib/Auth/Profile.js.map +1 -1
  98. package/lib/Auth/Registry.d.ts +20 -0
  99. package/lib/Auth/Registry.d.ts.map +1 -0
  100. package/lib/Auth/Registry.js +17 -0
  101. package/lib/Auth/Registry.js.map +1 -0
  102. package/lib/Auth/Resolve.d.ts +34 -2
  103. package/lib/Auth/Resolve.d.ts.map +1 -1
  104. package/lib/Auth/Resolve.js +51 -3
  105. package/lib/Auth/Resolve.js.map +1 -1
  106. package/lib/Auth/StoredAuthProvider.d.ts +1 -1
  107. package/lib/Auth/StoredAuthProvider.d.ts.map +1 -1
  108. package/lib/Auth/StoredAuthProvider.js +1 -2
  109. package/lib/Auth/StoredAuthProvider.js.map +1 -1
  110. package/lib/Binding.d.ts.map +1 -1
  111. package/lib/Binding.js +3 -1
  112. package/lib/Binding.js.map +1 -1
  113. package/lib/Bundle/Bundle.d.ts +5 -0
  114. package/lib/Bundle/Bundle.d.ts.map +1 -1
  115. package/lib/Bundle/Bundle.js +36 -6
  116. package/lib/Bundle/Bundle.js.map +1 -1
  117. package/lib/Bundle/NamespaceImportPlugin.d.ts +55 -0
  118. package/lib/Bundle/NamespaceImportPlugin.d.ts.map +1 -0
  119. package/lib/Bundle/NamespaceImportPlugin.js +226 -0
  120. package/lib/Bundle/NamespaceImportPlugin.js.map +1 -0
  121. package/lib/Bundle/index.d.ts +1 -0
  122. package/lib/Bundle/index.d.ts.map +1 -1
  123. package/lib/Bundle/index.js +1 -0
  124. package/lib/Bundle/index.js.map +1 -1
  125. package/lib/Cli/Format.d.ts.map +1 -1
  126. package/lib/Cli/Format.js +2 -1
  127. package/lib/Cli/Format.js.map +1 -1
  128. package/lib/Cli/GlobalLog.d.ts +72 -26
  129. package/lib/Cli/GlobalLog.d.ts.map +1 -1
  130. package/lib/Cli/GlobalLog.js +151 -59
  131. package/lib/Cli/GlobalLog.js.map +1 -1
  132. package/lib/Cli/LoggingCli.d.ts.map +1 -1
  133. package/lib/Cli/LoggingCli.js +24 -18
  134. package/lib/Cli/LoggingCli.js.map +1 -1
  135. package/lib/Cli/PlainCliFormatter.d.ts.map +1 -1
  136. package/lib/Cli/PlainCliFormatter.js +4 -1
  137. package/lib/Cli/PlainCliFormatter.js.map +1 -1
  138. package/lib/Cli/Present.d.ts +14 -0
  139. package/lib/Cli/Present.d.ts.map +1 -0
  140. package/lib/Cli/Present.js +22 -0
  141. package/lib/Cli/Present.js.map +1 -0
  142. package/lib/Cli/SigilRenderer.d.ts +58 -0
  143. package/lib/Cli/SigilRenderer.d.ts.map +1 -0
  144. package/lib/Cli/SigilRenderer.js +39 -0
  145. package/lib/Cli/SigilRenderer.js.map +1 -0
  146. package/lib/Cli/checkVersion.d.ts +11 -14
  147. package/lib/Cli/checkVersion.d.ts.map +1 -1
  148. package/lib/Cli/checkVersion.js +19 -77
  149. package/lib/Cli/checkVersion.js.map +1 -1
  150. package/lib/Cli/commands/confirm.d.ts +2 -2
  151. package/lib/Cli/commands/confirm.d.ts.map +1 -1
  152. package/lib/Cli/commands/confirm.js +3 -3
  153. package/lib/Cli/commands/confirm.js.map +1 -1
  154. package/lib/Cli/commands/deploy.d.ts +4 -4
  155. package/lib/Cli/commands/deploy.d.ts.map +1 -1
  156. package/lib/Cli/commands/deploy.js +40 -39
  157. package/lib/Cli/commands/deploy.js.map +1 -1
  158. package/lib/Cli/commands/dev.d.ts.map +1 -1
  159. package/lib/Cli/commands/dev.js +41 -3
  160. package/lib/Cli/commands/dev.js.map +1 -1
  161. package/lib/Cli/commands/drift.d.ts +2 -2
  162. package/lib/Cli/commands/drift.d.ts.map +1 -1
  163. package/lib/Cli/commands/drift.js +14 -13
  164. package/lib/Cli/commands/drift.js.map +1 -1
  165. package/lib/Cli/commands/errors.d.ts.map +1 -1
  166. package/lib/Cli/commands/errors.js +2 -1
  167. package/lib/Cli/commands/errors.js.map +1 -1
  168. package/lib/Cli/commands/instrument.d.ts +15 -5
  169. package/lib/Cli/commands/instrument.d.ts.map +1 -1
  170. package/lib/Cli/commands/instrument.js +33 -8
  171. package/lib/Cli/commands/instrument.js.map +1 -1
  172. package/lib/Cli/commands/logs.d.ts +1 -1
  173. package/lib/Cli/commands/logs.d.ts.map +1 -1
  174. package/lib/Cli/commands/logs.js +22 -22
  175. package/lib/Cli/commands/logs.js.map +1 -1
  176. package/lib/Cli/commands/nuke.d.ts +3 -2
  177. package/lib/Cli/commands/nuke.d.ts.map +1 -1
  178. package/lib/Cli/commands/nuke.js +19 -17
  179. package/lib/Cli/commands/nuke.js.map +1 -1
  180. package/lib/Cli/commands/profile/commands.d.ts +3 -2
  181. package/lib/Cli/commands/profile/commands.d.ts.map +1 -1
  182. package/lib/Cli/commands/profile/commands.js +26 -27
  183. package/lib/Cli/commands/profile/commands.js.map +1 -1
  184. package/lib/Cli/commands/profile/flows.d.ts +6 -5
  185. package/lib/Cli/commands/profile/flows.d.ts.map +1 -1
  186. package/lib/Cli/commands/profile/flows.js +19 -17
  187. package/lib/Cli/commands/profile/flows.js.map +1 -1
  188. package/lib/Cli/commands/profile/hub.d.ts +1 -2
  189. package/lib/Cli/commands/profile/hub.d.ts.map +1 -1
  190. package/lib/Cli/commands/profile/hub.js +15 -17
  191. package/lib/Cli/commands/profile/hub.js.map +1 -1
  192. package/lib/Cli/commands/provider.d.ts +3 -1
  193. package/lib/Cli/commands/provider.d.ts.map +1 -1
  194. package/lib/Cli/commands/provider.js +4 -4
  195. package/lib/Cli/commands/provider.js.map +1 -1
  196. package/lib/Cli/commands/render.d.ts +2 -4
  197. package/lib/Cli/commands/render.d.ts.map +1 -1
  198. package/lib/Cli/commands/render.js +33 -56
  199. package/lib/Cli/commands/render.js.map +1 -1
  200. package/lib/Cli/commands/state.d.ts +1 -2
  201. package/lib/Cli/commands/state.d.ts.map +1 -1
  202. package/lib/Cli/commands/state.js +74 -27
  203. package/lib/Cli/commands/state.js.map +1 -1
  204. package/lib/Cli/components/capabilities.d.ts +4 -0
  205. package/lib/Cli/components/capabilities.d.ts.map +1 -0
  206. package/lib/Cli/components/capabilities.js +18 -0
  207. package/lib/Cli/components/capabilities.js.map +1 -0
  208. package/lib/Cli/components/types.d.ts +2 -81
  209. package/lib/Cli/components/types.d.ts.map +1 -1
  210. package/lib/Cli/components/types.js +1 -3
  211. package/lib/Cli/components/types.js.map +1 -1
  212. package/lib/Cli/components/ui/Environment.d.ts +3 -3
  213. package/lib/Cli/components/ui/Environment.d.ts.map +1 -1
  214. package/lib/Cli/components/ui/Environment.js.map +1 -1
  215. package/lib/Cli/components/ui/Interactive.d.ts +17 -4
  216. package/lib/Cli/components/ui/Interactive.d.ts.map +1 -1
  217. package/lib/Cli/components/ui/Interactive.js +7 -11
  218. package/lib/Cli/components/ui/Interactive.js.map +1 -1
  219. package/lib/Cli/components/ui/Layout.d.ts +1 -1
  220. package/lib/Cli/components/ui/Layout.d.ts.map +1 -1
  221. package/lib/Cli/components/ui/Layout.js +1 -1
  222. package/lib/Cli/components/ui/Layout.js.map +1 -1
  223. package/lib/Cli/components/ui/Typography.d.ts +1 -1
  224. package/lib/Cli/components/ui/Typography.d.ts.map +1 -1
  225. package/lib/Cli/components/ui/Typography.js +1 -1
  226. package/lib/Cli/components/ui/Typography.js.map +1 -1
  227. package/lib/Cli/components/ui/index.d.ts +2 -2
  228. package/lib/Cli/components/ui/index.js +2 -2
  229. package/lib/Cli/components/view/ApprovePlan.d.ts +1 -1
  230. package/lib/Cli/components/view/ApprovePlan.d.ts.map +1 -1
  231. package/lib/Cli/components/view/ApprovePlan.js +2 -1
  232. package/lib/Cli/components/view/ApprovePlan.js.map +1 -1
  233. package/lib/Cli/components/view/Format.d.ts +5 -0
  234. package/lib/Cli/components/view/Format.d.ts.map +1 -0
  235. package/lib/Cli/components/view/Format.js +39 -0
  236. package/lib/Cli/components/view/Format.js.map +1 -0
  237. package/lib/Cli/components/view/Help.d.ts +2 -2
  238. package/lib/Cli/components/view/Help.d.ts.map +1 -1
  239. package/lib/Cli/components/view/Help.js +7 -5
  240. package/lib/Cli/components/view/Help.js.map +1 -1
  241. package/lib/Cli/components/view/Logo.js +1 -1
  242. package/lib/Cli/components/view/Logo.js.map +1 -1
  243. package/lib/Cli/components/view/Nuke.d.ts +8 -9
  244. package/lib/Cli/components/view/Nuke.d.ts.map +1 -1
  245. package/lib/Cli/components/view/Nuke.js +49 -52
  246. package/lib/Cli/components/view/Nuke.js.map +1 -1
  247. package/lib/Cli/components/view/PlanDecision.d.ts +1 -1
  248. package/lib/Cli/components/view/PlanDecision.d.ts.map +1 -1
  249. package/lib/Cli/components/view/PlanDecision.js +1 -1
  250. package/lib/Cli/components/view/PlanDecision.js.map +1 -1
  251. package/lib/Cli/components/view/PlanRow.js +1 -1
  252. package/lib/Cli/components/view/PlanRow.js.map +1 -1
  253. package/lib/Cli/components/view/PlanTree.d.ts +1 -1
  254. package/lib/Cli/components/view/PlanTree.d.ts.map +1 -1
  255. package/lib/Cli/components/view/PlanTree.js +1 -1
  256. package/lib/Cli/components/view/PlanView.js +1 -1
  257. package/lib/Cli/components/view/PlanView.js.map +1 -1
  258. package/lib/Cli/components/view/Profile.d.ts +1 -1
  259. package/lib/Cli/components/view/Profile.js +2 -2
  260. package/lib/Cli/components/view/Profile.js.map +1 -1
  261. package/lib/Cli/components/view/ProfileDashboard.d.ts +4 -4
  262. package/lib/Cli/components/view/ProfileDashboard.d.ts.map +1 -1
  263. package/lib/Cli/components/view/ProfileDashboard.js +9 -8
  264. package/lib/Cli/components/view/ProfileDashboard.js.map +1 -1
  265. package/lib/Cli/components/view/Prompts.d.ts +3 -3
  266. package/lib/Cli/components/view/Prompts.d.ts.map +1 -1
  267. package/lib/Cli/components/view/Prompts.js +11 -18
  268. package/lib/Cli/components/view/Prompts.js.map +1 -1
  269. package/lib/Cli/components/view/Runtime.d.ts +5 -5
  270. package/lib/Cli/components/view/Runtime.d.ts.map +1 -1
  271. package/lib/Cli/components/view/Runtime.js +136 -219
  272. package/lib/Cli/components/view/Runtime.js.map +1 -1
  273. package/lib/Cli/components/view/SigilCli.d.ts +2 -2
  274. package/lib/Cli/components/view/SigilCli.d.ts.map +1 -1
  275. package/lib/Cli/components/view/SigilCli.js +7 -7
  276. package/lib/Cli/components/view/SigilCli.js.map +1 -1
  277. package/lib/Cli/components/view/StateExplorer.d.ts +1 -1
  278. package/lib/Cli/components/view/StateExplorer.d.ts.map +1 -1
  279. package/lib/Cli/components/view/StateExplorer.js +2 -1
  280. package/lib/Cli/components/view/StateExplorer.js.map +1 -1
  281. package/lib/Cli/components/view/statusStyle.d.ts +2 -2
  282. package/lib/Cli/components/view/statusStyle.d.ts.map +1 -1
  283. package/lib/Cli/components/view/statusStyle.js +1 -1
  284. package/lib/Cli/components/view/statusStyle.js.map +1 -1
  285. package/lib/Cli/exec.d.ts +6 -1
  286. package/lib/Cli/exec.d.ts.map +1 -1
  287. package/lib/Cli/exec.js +29 -34
  288. package/lib/Cli/exec.js.map +1 -1
  289. package/lib/Cli/main.d.ts.map +1 -1
  290. package/lib/Cli/main.js +35 -26
  291. package/lib/Cli/main.js.map +1 -1
  292. package/lib/Cli/selectCli.d.ts +2 -2
  293. package/lib/Cli/selectCli.d.ts.map +1 -1
  294. package/lib/Cli/selectCli.js +2 -2
  295. package/lib/Cli/selectCli.js.map +1 -1
  296. package/lib/Command/Command.js +1 -1
  297. package/lib/Command/Command.js.map +1 -1
  298. package/lib/Command/Dev.d.ts +58 -4
  299. package/lib/Command/Dev.d.ts.map +1 -1
  300. package/lib/Command/Dev.js +87 -30
  301. package/lib/Command/Dev.js.map +1 -1
  302. package/lib/Command/Local.d.ts +1 -1
  303. package/lib/Command/Memo.js +1 -1
  304. package/lib/Command/Memo.js.map +1 -1
  305. package/lib/Command/Providers.d.ts +1 -1
  306. package/lib/Command/Providers.d.ts.map +1 -1
  307. package/lib/Contributions.d.ts +2 -3
  308. package/lib/Contributions.d.ts.map +1 -1
  309. package/lib/Contributions.js +38 -6
  310. package/lib/Contributions.js.map +1 -1
  311. package/lib/DNS/Adapter.d.ts +204 -0
  312. package/lib/DNS/Adapter.d.ts.map +1 -0
  313. package/lib/DNS/Adapter.js +112 -0
  314. package/lib/DNS/Adapter.js.map +1 -0
  315. package/lib/DNS/index.d.ts +2 -0
  316. package/lib/DNS/index.d.ts.map +1 -0
  317. package/lib/DNS/index.js +2 -0
  318. package/lib/DNS/index.js.map +1 -0
  319. package/lib/Deploy.d.ts +7 -2
  320. package/lib/Deploy.d.ts.map +1 -1
  321. package/lib/Deploy.js +8 -3
  322. package/lib/Deploy.js.map +1 -1
  323. package/lib/Destroy.d.ts +5 -8
  324. package/lib/Destroy.d.ts.map +1 -1
  325. package/lib/Destroy.js +10 -7
  326. package/lib/Destroy.js.map +1 -1
  327. package/lib/Diff.d.ts.map +1 -1
  328. package/lib/Diff.js +14 -4
  329. package/lib/Diff.js.map +1 -1
  330. package/lib/Drift.d.ts +7 -7
  331. package/lib/Drift.d.ts.map +1 -1
  332. package/lib/Drift.js +184 -101
  333. package/lib/Drift.js.map +1 -1
  334. package/lib/EvalStack.d.ts +23 -0
  335. package/lib/EvalStack.d.ts.map +1 -0
  336. package/lib/EvalStack.js +47 -0
  337. package/lib/EvalStack.js.map +1 -0
  338. package/lib/Events.d.ts +210 -0
  339. package/lib/Events.d.ts.map +1 -0
  340. package/lib/Events.js +244 -0
  341. package/lib/Events.js.map +1 -0
  342. package/lib/Interaction.d.ts +159 -48
  343. package/lib/Interaction.d.ts.map +1 -1
  344. package/lib/Interaction.js +139 -58
  345. package/lib/Interaction.js.map +1 -1
  346. package/lib/Local/LocalProvider.d.ts.map +1 -1
  347. package/lib/Local/LocalProvider.js +31 -9
  348. package/lib/Local/LocalProvider.js.map +1 -1
  349. package/lib/Local/RpcProvider.d.ts.map +1 -1
  350. package/lib/Local/RpcProvider.js +10 -1
  351. package/lib/Local/RpcProvider.js.map +1 -1
  352. package/lib/Local/RpcProviderProxy.d.ts +16 -0
  353. package/lib/Local/RpcProviderProxy.d.ts.map +1 -1
  354. package/lib/Local/RpcProviderProxy.js +19 -10
  355. package/lib/Local/RpcProviderProxy.js.map +1 -1
  356. package/lib/Local/RpcSerialization.d.ts +3 -2
  357. package/lib/Local/RpcSerialization.d.ts.map +1 -1
  358. package/lib/Local/RpcSerialization.js +13 -10
  359. package/lib/Local/RpcSerialization.js.map +1 -1
  360. package/lib/Local/RpcServer.d.ts +2 -1
  361. package/lib/Local/RpcServer.d.ts.map +1 -1
  362. package/lib/Local/RpcServer.js +19 -14
  363. package/lib/Local/RpcServer.js.map +1 -1
  364. package/lib/Local/RpcServerBun.d.ts.map +1 -1
  365. package/lib/Local/RpcServerBun.js +8 -4
  366. package/lib/Local/RpcServerBun.js.map +1 -1
  367. package/lib/Local/RpcServerEnvironment.d.ts +2 -3
  368. package/lib/Local/RpcServerEnvironment.d.ts.map +1 -1
  369. package/lib/Local/RpcServerEnvironment.js +2 -2
  370. package/lib/Local/RpcServerEnvironment.js.map +1 -1
  371. package/lib/Local/RpcServerNode.d.ts.map +1 -1
  372. package/lib/Local/RpcServerNode.js +5 -1
  373. package/lib/Local/RpcServerNode.js.map +1 -1
  374. package/lib/Local/RpcServerSession.d.ts +1 -1
  375. package/lib/Local/RpcServerSession.d.ts.map +1 -1
  376. package/lib/Local/RpcServerSession.js.map +1 -1
  377. package/lib/Local/RpcSpawner.d.ts +6 -8
  378. package/lib/Local/RpcSpawner.d.ts.map +1 -1
  379. package/lib/Local/RpcSpawner.js +45 -36
  380. package/lib/Local/RpcSpawner.js.map +1 -1
  381. package/lib/Local/Sidecar.d.ts +23 -0
  382. package/lib/Local/Sidecar.d.ts.map +1 -1
  383. package/lib/Local/Sidecar.js +14 -9
  384. package/lib/Local/Sidecar.js.map +1 -1
  385. package/lib/Nuke.d.ts +5 -23
  386. package/lib/Nuke.d.ts.map +1 -1
  387. package/lib/Nuke.js +48 -13
  388. package/lib/Nuke.js.map +1 -1
  389. package/lib/Output.d.ts +19 -1
  390. package/lib/Output.d.ts.map +1 -1
  391. package/lib/Output.js +96 -3
  392. package/lib/Output.js.map +1 -1
  393. package/lib/Plan.d.ts +5 -1
  394. package/lib/Plan.d.ts.map +1 -1
  395. package/lib/Plan.js +111 -33
  396. package/lib/Plan.js.map +1 -1
  397. package/lib/Platform.d.ts.map +1 -1
  398. package/lib/Platform.js +31 -7
  399. package/lib/Platform.js.map +1 -1
  400. package/lib/Provider.d.ts +45 -0
  401. package/lib/Provider.d.ts.map +1 -1
  402. package/lib/Provider.js +2 -2
  403. package/lib/Provider.js.map +1 -1
  404. package/lib/Report.d.ts +17 -195
  405. package/lib/Report.d.ts.map +1 -1
  406. package/lib/Report.js +39 -12
  407. package/lib/Report.js.map +1 -1
  408. package/lib/Runtime/ManagedHttpShutdown.d.ts +17 -0
  409. package/lib/Runtime/ManagedHttpShutdown.d.ts.map +1 -1
  410. package/lib/Runtime/ManagedHttpShutdown.js +11 -2
  411. package/lib/Runtime/ManagedHttpShutdown.js.map +1 -1
  412. package/lib/RuntimeContext.js +1 -1
  413. package/lib/RuntimeContext.js.map +1 -1
  414. package/lib/Stack.d.ts +49 -29
  415. package/lib/Stack.d.ts.map +1 -1
  416. package/lib/Stack.js +25 -31
  417. package/lib/Stack.js.map +1 -1
  418. package/lib/State/BucketState.d.ts.map +1 -1
  419. package/lib/State/BucketState.js +43 -14
  420. package/lib/State/BucketState.js.map +1 -1
  421. package/lib/State/LocalState.d.ts.map +1 -1
  422. package/lib/State/LocalState.js +3 -3
  423. package/lib/State/LocalState.js.map +1 -1
  424. package/lib/State/Provisioning.d.ts +5 -0
  425. package/lib/State/Provisioning.d.ts.map +1 -1
  426. package/lib/State/Provisioning.js +3 -1
  427. package/lib/State/Provisioning.js.map +1 -1
  428. package/lib/State/ResourceState.d.ts +2 -0
  429. package/lib/State/ResourceState.d.ts.map +1 -1
  430. package/lib/State/State.d.ts +26 -0
  431. package/lib/State/State.d.ts.map +1 -1
  432. package/lib/State/StateEncoding.d.ts +7 -0
  433. package/lib/State/StateEncoding.d.ts.map +1 -1
  434. package/lib/State/StateEncoding.js +19 -0
  435. package/lib/State/StateEncoding.js.map +1 -1
  436. package/lib/State/index.js +2 -2
  437. package/lib/State/index.js.map +1 -1
  438. package/lib/Telemetry/Layer.d.ts +2 -5
  439. package/lib/Telemetry/Layer.d.ts.map +1 -1
  440. package/lib/Telemetry/Layer.js +3 -23
  441. package/lib/Telemetry/Layer.js.map +1 -1
  442. package/lib/Telemetry/Metrics.d.ts +1 -1
  443. package/lib/Telemetry/Metrics.d.ts.map +1 -1
  444. package/lib/TelemetryRelay.js +1 -1
  445. package/lib/TelemetryRelay.js.map +1 -1
  446. package/lib/TelemetryRuntime.d.ts +1 -1
  447. package/lib/TelemetryRuntime.d.ts.map +1 -1
  448. package/lib/TelemetryRuntime.js +4 -3
  449. package/lib/TelemetryRuntime.js.map +1 -1
  450. package/lib/Util/ConsoleSink.d.ts +23 -2
  451. package/lib/Util/ConsoleSink.d.ts.map +1 -1
  452. package/lib/Util/ConsoleSink.js +54 -14
  453. package/lib/Util/ConsoleSink.js.map +1 -1
  454. package/lib/Util/LogAnnotation.d.ts +19 -0
  455. package/lib/Util/LogAnnotation.d.ts.map +1 -0
  456. package/lib/Util/LogAnnotation.js +19 -0
  457. package/lib/Util/LogAnnotation.js.map +1 -0
  458. package/lib/Util/LogRecord.d.ts +281 -0
  459. package/lib/Util/LogRecord.d.ts.map +1 -0
  460. package/lib/Util/LogRecord.js +267 -0
  461. package/lib/Util/LogRecord.js.map +1 -0
  462. package/lib/Util/Node.d.ts +9 -0
  463. package/lib/Util/Node.d.ts.map +1 -1
  464. package/lib/Util/Node.js +10 -6
  465. package/lib/Util/Node.js.map +1 -1
  466. package/lib/Util/PlatformServices.d.ts +3 -2
  467. package/lib/Util/PlatformServices.d.ts.map +1 -1
  468. package/lib/Util/PlatformServices.js +6 -2
  469. package/lib/Util/PlatformServices.js.map +1 -1
  470. package/lib/Util/ResourceOutput.d.ts +18 -10
  471. package/lib/Util/ResourceOutput.d.ts.map +1 -1
  472. package/lib/Util/ResourceOutput.js +22 -23
  473. package/lib/Util/ResourceOutput.js.map +1 -1
  474. package/lib/Util/Shutdown.d.ts +10 -0
  475. package/lib/Util/Shutdown.d.ts.map +1 -0
  476. package/lib/Util/Shutdown.js +32 -0
  477. package/lib/Util/Shutdown.js.map +1 -0
  478. package/lib/Util/Terminal.d.ts +2 -4
  479. package/lib/Util/Terminal.d.ts.map +1 -1
  480. package/lib/Util/Terminal.js +3 -11
  481. package/lib/Util/Terminal.js.map +1 -1
  482. package/lib/Util/TraceParent.d.ts +32 -0
  483. package/lib/Util/TraceParent.d.ts.map +1 -0
  484. package/lib/Util/TraceParent.js +42 -0
  485. package/lib/Util/TraceParent.js.map +1 -0
  486. package/lib/Util/base64.d.ts +7 -0
  487. package/lib/Util/base64.d.ts.map +1 -0
  488. package/lib/Util/base64.js +24 -0
  489. package/lib/Util/base64.js.map +1 -0
  490. package/lib/Util/cached-function.d.ts +5 -0
  491. package/lib/Util/cached-function.d.ts.map +1 -1
  492. package/lib/Util/cached-function.js +13 -8
  493. package/lib/Util/cached-function.js.map +1 -1
  494. package/lib/Util/data.d.ts +1 -1
  495. package/lib/Util/data.d.ts.map +1 -1
  496. package/lib/Util/data.js +1 -1
  497. package/lib/Util/data.js.map +1 -1
  498. package/lib/Util/equal.d.ts.map +1 -1
  499. package/lib/Util/equal.js +3 -2
  500. package/lib/Util/equal.js.map +1 -1
  501. package/lib/Util/extraFiles.d.ts.map +1 -1
  502. package/lib/Util/extraFiles.js +5 -5
  503. package/lib/Util/extraFiles.js.map +1 -1
  504. package/lib/Util/interactive.js +1 -1
  505. package/lib/Website/AstroOutput.d.ts +42 -0
  506. package/lib/Website/AstroOutput.d.ts.map +1 -0
  507. package/lib/Website/AstroOutput.js +34 -0
  508. package/lib/Website/AstroOutput.js.map +1 -0
  509. package/lib/Website/FrontendCore.d.ts +1 -1
  510. package/lib/Workflows.d.ts +9 -0
  511. package/lib/Workflows.d.ts.map +1 -1
  512. package/lib/Workflows.js +8 -0
  513. package/lib/Workflows.js.map +1 -1
  514. package/lib/index.d.ts +1 -0
  515. package/lib/index.d.ts.map +1 -1
  516. package/lib/index.js +1 -0
  517. package/lib/index.js.map +1 -1
  518. package/package.json +21 -28
  519. package/src/AdoptPolicy.ts +76 -0
  520. package/src/Alchemist/AuthRegistry.ts +164 -0
  521. package/src/Alchemist/Drift.ts +103 -0
  522. package/src/Alchemist/Entrypoint.ts +51 -3
  523. package/src/Alchemist/Errors.ts +1 -1
  524. package/src/Alchemist/{routes/logs.ts → Logs.ts} +28 -30
  525. package/src/Alchemist/Nuke.ts +90 -0
  526. package/src/Alchemist/Operations.ts +309 -0
  527. package/src/Alchemist/{routes/profile.ts → Profile.ts} +22 -22
  528. package/src/Alchemist/{routes/provider.ts → Provider.ts} +7 -6
  529. package/src/Alchemist/Runtime.ts +46 -12
  530. package/src/Alchemist/{routes/state.ts → State.ts} +78 -21
  531. package/src/Alchemist/index.ts +32 -15
  532. package/src/Apply.ts +513 -274
  533. package/src/Auth/AuthProvider.ts +76 -23
  534. package/src/Auth/BrowserOAuth.ts +37 -60
  535. package/src/Auth/Credentials.ts +2 -4
  536. package/src/Auth/Demand.ts +27 -18
  537. package/src/Auth/Env.ts +13 -8
  538. package/src/Auth/Inspect.ts +5 -2
  539. package/src/Auth/Lock.ts +4 -8
  540. package/src/Auth/OAuthFlow.ts +12 -26
  541. package/src/Auth/Paths.ts +3 -2
  542. package/src/Auth/Profile.ts +30 -2
  543. package/src/Auth/Registry.ts +27 -0
  544. package/src/Auth/Resolve.ts +75 -3
  545. package/src/Auth/StoredAuthProvider.ts +1 -2
  546. package/src/Binding.ts +3 -4
  547. package/src/Bundle/Bundle.ts +58 -7
  548. package/src/Bundle/NamespaceImportPlugin.ts +259 -0
  549. package/src/Bundle/index.ts +1 -0
  550. package/src/Cli/Format.ts +2 -1
  551. package/src/Cli/GlobalLog.ts +206 -68
  552. package/src/Cli/LoggingCli.ts +33 -20
  553. package/src/Cli/PlainCliFormatter.ts +4 -1
  554. package/src/Cli/Present.ts +34 -0
  555. package/src/Cli/SigilRenderer.ts +75 -0
  556. package/src/Cli/checkVersion.ts +25 -78
  557. package/src/Cli/commands/confirm.ts +3 -3
  558. package/src/Cli/commands/deploy.ts +53 -44
  559. package/src/Cli/commands/dev.ts +65 -7
  560. package/src/Cli/commands/drift.ts +20 -16
  561. package/src/Cli/commands/errors.ts +2 -3
  562. package/src/Cli/commands/instrument.ts +39 -8
  563. package/src/Cli/commands/logs.ts +22 -30
  564. package/src/Cli/commands/nuke.ts +25 -26
  565. package/src/Cli/commands/profile/commands.ts +34 -34
  566. package/src/Cli/commands/profile/flows.ts +26 -20
  567. package/src/Cli/commands/profile/hub.ts +16 -18
  568. package/src/Cli/commands/provider.ts +4 -4
  569. package/src/Cli/commands/render.ts +43 -71
  570. package/src/Cli/commands/state.ts +113 -33
  571. package/src/Cli/components/capabilities.ts +20 -0
  572. package/src/Cli/components/types.ts +13 -99
  573. package/src/Cli/components/ui/Environment.tsx +5 -5
  574. package/src/Cli/components/ui/Interactive.tsx +24 -15
  575. package/src/Cli/components/ui/Layout.tsx +1 -1
  576. package/src/Cli/components/ui/Typography.tsx +1 -1
  577. package/src/Cli/components/ui/index.ts +2 -2
  578. package/src/Cli/components/view/ApprovePlan.tsx +2 -1
  579. package/src/Cli/components/view/Format.tsx +58 -0
  580. package/src/Cli/components/view/Help.tsx +14 -17
  581. package/src/Cli/components/view/Logo.tsx +1 -1
  582. package/src/Cli/components/view/Nuke.tsx +74 -49
  583. package/src/Cli/components/view/PlanDecision.tsx +1 -1
  584. package/src/Cli/components/view/PlanRow.tsx +1 -1
  585. package/src/Cli/components/view/PlanTree.ts +2 -2
  586. package/src/Cli/components/view/PlanView.tsx +2 -2
  587. package/src/Cli/components/view/Profile.tsx +2 -2
  588. package/src/Cli/components/view/ProfileDashboard.tsx +12 -11
  589. package/src/Cli/components/view/Prompts.tsx +37 -75
  590. package/src/Cli/components/view/Runtime.tsx +132 -238
  591. package/src/Cli/components/view/SigilCli.tsx +12 -12
  592. package/src/Cli/components/view/StateExplorer.tsx +2 -1
  593. package/src/Cli/components/view/statusStyle.ts +2 -2
  594. package/src/Cli/exec.ts +48 -41
  595. package/src/Cli/main.ts +52 -33
  596. package/src/Cli/selectCli.ts +3 -3
  597. package/src/Command/Command.ts +1 -1
  598. package/src/Command/Dev.ts +129 -36
  599. package/src/Command/Memo.ts +1 -1
  600. package/src/Contributions.ts +42 -8
  601. package/src/DNS/Adapter.ts +289 -0
  602. package/src/DNS/index.ts +1 -0
  603. package/src/Deploy.ts +11 -3
  604. package/src/Destroy.ts +19 -13
  605. package/src/Diff.ts +17 -4
  606. package/src/Drift.ts +256 -127
  607. package/src/EvalStack.ts +97 -0
  608. package/src/Events.ts +296 -0
  609. package/src/Interaction.ts +332 -97
  610. package/src/Local/LocalProvider.ts +40 -9
  611. package/src/Local/RpcProvider.ts +11 -1
  612. package/src/Local/RpcProviderProxy.ts +29 -21
  613. package/src/Local/RpcSerialization.ts +32 -17
  614. package/src/Local/RpcServer.ts +25 -17
  615. package/src/Local/RpcServerBun.ts +10 -6
  616. package/src/Local/RpcServerEnvironment.ts +2 -2
  617. package/src/Local/RpcServerNode.ts +8 -1
  618. package/src/Local/RpcServerSession.ts +2 -2
  619. package/src/Local/RpcSpawner.ts +61 -37
  620. package/src/Local/Sidecar.ts +10 -1
  621. package/src/Nuke.ts +66 -43
  622. package/src/Output.ts +120 -7
  623. package/src/Plan.ts +140 -52
  624. package/src/Platform.ts +47 -18
  625. package/src/Provider.ts +48 -3
  626. package/src/Report.ts +77 -275
  627. package/src/Runtime/ManagedHttpShutdown.ts +21 -4
  628. package/src/RuntimeContext.ts +1 -1
  629. package/src/Stack.ts +113 -135
  630. package/src/State/BucketState.ts +53 -21
  631. package/src/State/LocalState.ts +7 -9
  632. package/src/State/Provisioning.ts +8 -1
  633. package/src/State/ResourceState.ts +2 -0
  634. package/src/State/State.ts +30 -0
  635. package/src/State/StateEncoding.ts +22 -0
  636. package/src/State/index.ts +2 -2
  637. package/src/Telemetry/Layer.ts +3 -24
  638. package/src/Telemetry/Metrics.ts +1 -1
  639. package/src/TelemetryRelay.ts +1 -1
  640. package/src/TelemetryRuntime.ts +8 -8
  641. package/src/Util/ConsoleSink.ts +76 -13
  642. package/src/Util/LogAnnotation.ts +18 -0
  643. package/src/Util/LogRecord.ts +386 -0
  644. package/src/Util/Node.ts +20 -6
  645. package/src/Util/PlatformServices.ts +17 -4
  646. package/src/Util/ResourceOutput.ts +26 -25
  647. package/src/Util/Shutdown.ts +52 -0
  648. package/src/Util/Terminal.ts +3 -20
  649. package/src/Util/TraceParent.ts +70 -0
  650. package/src/Util/base64.ts +22 -0
  651. package/src/Util/cached-function.ts +30 -19
  652. package/src/Util/data.ts +2 -2
  653. package/src/Util/equal.ts +3 -2
  654. package/src/Util/extraFiles.ts +9 -8
  655. package/src/Util/interactive.ts +1 -1
  656. package/src/Website/AstroOutput.ts +83 -0
  657. package/src/Workflows.ts +11 -0
  658. package/src/index.ts +1 -0
  659. package/lib/Alchemist/Progress.d.ts +0 -16
  660. package/lib/Alchemist/Progress.d.ts.map +0 -1
  661. package/lib/Alchemist/Progress.js +0 -123
  662. package/lib/Alchemist/Progress.js.map +0 -1
  663. package/lib/Alchemist/Session.d.ts +0 -116
  664. package/lib/Alchemist/Session.d.ts.map +0 -1
  665. package/lib/Alchemist/Session.js +0 -212
  666. package/lib/Alchemist/Session.js.map +0 -1
  667. package/lib/Alchemist/routes/drift.d.ts +0 -55
  668. package/lib/Alchemist/routes/drift.d.ts.map +0 -1
  669. package/lib/Alchemist/routes/drift.js +0 -52
  670. package/lib/Alchemist/routes/drift.js.map +0 -1
  671. package/lib/Alchemist/routes/logs.d.ts +0 -41
  672. package/lib/Alchemist/routes/logs.d.ts.map +0 -1
  673. package/lib/Alchemist/routes/logs.js.map +0 -1
  674. package/lib/Alchemist/routes/nuke.d.ts +0 -46
  675. package/lib/Alchemist/routes/nuke.d.ts.map +0 -1
  676. package/lib/Alchemist/routes/nuke.js +0 -80
  677. package/lib/Alchemist/routes/nuke.js.map +0 -1
  678. package/lib/Alchemist/routes/profile.d.ts +0 -133
  679. package/lib/Alchemist/routes/profile.d.ts.map +0 -1
  680. package/lib/Alchemist/routes/profile.js.map +0 -1
  681. package/lib/Alchemist/routes/provider.d.ts.map +0 -1
  682. package/lib/Alchemist/routes/provider.js.map +0 -1
  683. package/lib/Alchemist/routes/stack.d.ts +0 -95
  684. package/lib/Alchemist/routes/stack.d.ts.map +0 -1
  685. package/lib/Alchemist/routes/stack.js +0 -73
  686. package/lib/Alchemist/routes/stack.js.map +0 -1
  687. package/lib/Alchemist/routes/state.d.ts.map +0 -1
  688. package/lib/Alchemist/routes/state.js.map +0 -1
  689. package/lib/Cli/CliKit/CliKit.d.ts +0 -92
  690. package/lib/Cli/CliKit/CliKit.d.ts.map +0 -1
  691. package/lib/Cli/CliKit/CliKit.js +0 -27
  692. package/lib/Cli/CliKit/CliKit.js.map +0 -1
  693. package/lib/Cli/CliKit/index.d.ts +0 -9
  694. package/lib/Cli/CliKit/index.d.ts.map +0 -1
  695. package/lib/Cli/CliKit/index.js +0 -9
  696. package/lib/Cli/CliKit/index.js.map +0 -1
  697. package/lib/Cli/CliKit/interaction.d.ts +0 -13
  698. package/lib/Cli/CliKit/interaction.d.ts.map +0 -1
  699. package/lib/Cli/CliKit/interaction.js +0 -17
  700. package/lib/Cli/CliKit/interaction.js.map +0 -1
  701. package/lib/Cli/CliKit/layer.d.ts +0 -7
  702. package/lib/Cli/CliKit/layer.d.ts.map +0 -1
  703. package/lib/Cli/CliKit/layer.js +0 -33
  704. package/lib/Cli/CliKit/layer.js.map +0 -1
  705. package/lib/Local/DevLog.d.ts +0 -32
  706. package/lib/Local/DevLog.d.ts.map +0 -1
  707. package/lib/Local/DevLog.js +0 -112
  708. package/lib/Local/DevLog.js.map +0 -1
  709. package/lib/Test/Alchemy.d.ts +0 -79
  710. package/lib/Test/Alchemy.d.ts.map +0 -1
  711. package/lib/Test/Alchemy.js +0 -193
  712. package/lib/Test/Alchemy.js.map +0 -1
  713. package/lib/Test/Bun.d.ts +0 -69
  714. package/lib/Test/Bun.d.ts.map +0 -1
  715. package/lib/Test/Bun.js +0 -126
  716. package/lib/Test/Bun.js.map +0 -1
  717. package/lib/Test/Core.d.ts +0 -277
  718. package/lib/Test/Core.d.ts.map +0 -1
  719. package/lib/Test/Core.js +0 -362
  720. package/lib/Test/Core.js.map +0 -1
  721. package/lib/Test/Http.d.ts +0 -109
  722. package/lib/Test/Http.d.ts.map +0 -1
  723. package/lib/Test/Http.js +0 -123
  724. package/lib/Test/Http.js.map +0 -1
  725. package/lib/Test/TestState.d.ts +0 -12
  726. package/lib/Test/TestState.d.ts.map +0 -1
  727. package/lib/Test/TestState.js +0 -15
  728. package/lib/Test/TestState.js.map +0 -1
  729. package/lib/Test/Vitest.d.ts +0 -60
  730. package/lib/Test/Vitest.d.ts.map +0 -1
  731. package/lib/Test/Vitest.js +0 -132
  732. package/lib/Test/Vitest.js.map +0 -1
  733. package/lib/Test/index.d.ts +0 -3
  734. package/lib/Test/index.d.ts.map +0 -1
  735. package/lib/Test/index.js +0 -3
  736. package/lib/Test/index.js.map +0 -1
  737. package/lib/Util/FileLogger.d.ts +0 -7
  738. package/lib/Util/FileLogger.d.ts.map +0 -1
  739. package/lib/Util/FileLogger.js +0 -16
  740. package/lib/Util/FileLogger.js.map +0 -1
  741. package/src/Alchemist/Progress.ts +0 -167
  742. package/src/Alchemist/Session.ts +0 -415
  743. package/src/Alchemist/routes/drift.ts +0 -87
  744. package/src/Alchemist/routes/nuke.ts +0 -131
  745. package/src/Alchemist/routes/stack.ts +0 -173
  746. package/src/Cli/CliKit/CliKit.ts +0 -159
  747. package/src/Cli/CliKit/index.ts +0 -41
  748. package/src/Cli/CliKit/interaction.ts +0 -19
  749. package/src/Cli/CliKit/layer.ts +0 -44
  750. package/src/Local/DevLog.ts +0 -122
  751. package/src/Test/Alchemy.ts +0 -334
  752. package/src/Test/Bun.ts +0 -230
  753. package/src/Test/Core.ts +0 -785
  754. package/src/Test/Http.ts +0 -201
  755. package/src/Test/TestState.ts +0 -35
  756. package/src/Test/Vitest.ts +0 -239
  757. package/src/Test/index.ts +0 -2
  758. package/src/Util/FileLogger.ts +0 -20
package/src/Stack.ts CHANGED
@@ -1,23 +1,21 @@
1
1
  import type { ConfigError } from "effect/Config";
2
- import { ConfigProvider } from "effect/ConfigProvider";
3
2
  import * as Context from "effect/Context";
4
- import type { Crypto } from "effect/Crypto";
3
+ import type { Digest } from "effect/crypto/Digest";
4
+ import type { SecureRandom } from "effect/crypto/SecureRandom";
5
5
  import * as Effect from "effect/Effect";
6
6
  import { FileSystem } from "effect/FileSystem";
7
- import * as FetchHttpClient from "effect/http/FetchHttpClient";
8
7
  import type { HttpClient } from "effect/http/HttpClient";
9
8
  import * as Layer from "effect/Layer";
10
- import * as Logger from "effect/Logger";
11
9
  import * as Option from "effect/Option";
12
10
  import { Path } from "effect/Path";
13
11
  import type { ChildProcessSpawner } from "effect/process/ChildProcessSpawner";
14
- import * as Scope from "effect/Scope";
12
+ import type * as Scope from "effect/Scope";
15
13
  import type { ActionLike } from "./Action.ts";
16
- import { AlchemyContext, AlchemyContextLive } from "./AlchemyContext.ts";
17
- import { type ArtifactStore, provideFreshArtifactStore } from "./Artifacts.ts";
18
- import { AuthProviders } from "./Auth/AuthProvider.ts";
19
- import { CredentialsStore, CredentialsStoreLive } from "./Auth/Credentials.ts";
20
- import { ProfileStore, ProfileStoreLive } from "./Auth/Profile.ts";
14
+ import type { AlchemyContext } from "./AlchemyContext.ts";
15
+ import type { ArtifactStore } from "./Artifacts.ts";
16
+ import type { CredentialsStore } from "./Auth/Credentials.ts";
17
+ import type { ProfileStore } from "./Auth/Profile.ts";
18
+ import { AuthProvidersLive, type AuthProviders } from "./Auth/Registry.ts";
21
19
  import type { Input, InputProps } from "./Input.ts";
22
20
  // Type-only: with verbatimModuleSyntax a value import would survive emit and
23
21
  // drag the terminal helpers (node:tty, Sigil's ansi helpers) into every unbundled
@@ -30,17 +28,17 @@ import type { SecretsEntry, SecretsOption } from "./Secrets/Provider.ts";
30
28
  import { StackContext } from "./StackContext.ts";
31
29
  import { Stage } from "./Stage.ts";
32
30
  import type { State } from "./State/State.ts";
33
- import { loadConfigProvider, stackConfigLayer } from "./Util/ConfigProvider.ts";
31
+ import { stackConfigLayer } from "./Util/ConfigProvider.ts";
34
32
  import { effectClass, taggedFunction } from "./Util/effect.ts";
35
- import { fileLogger } from "./Util/FileLogger.ts";
36
- import { PlatformServices } from "./Util/PlatformServices.ts";
33
+ import type { PlatformServices } from "./Util/PlatformServices.ts";
37
34
 
38
35
  export type StackServices =
39
36
  | Stack
40
37
  | Stage
41
38
  | Scope.Scope
42
39
  | FileSystem
43
- | Crypto
40
+ | Digest
41
+ | SecureRandom
44
42
  | Path
45
43
  | AlchemyContext
46
44
  | HttpClient
@@ -138,6 +136,14 @@ export type ConfiguredStackMeta<Req = never> = {
138
136
  readonly stackName: string;
139
137
  } & StackProps<Req>;
140
138
 
139
+ /**
140
+ * What `Alchemy.Stack(...)` returns, and what an `alchemy.run.ts`
141
+ * default-exports: the stack program, not yet run, with its providers,
142
+ * state store, and secrets attached.
143
+ */
144
+ export type ConfiguredStack<Output, Req> = Effect.Effect<CompiledStack<Output>, ConfigError> &
145
+ ConfiguredStackMeta<Req>;
146
+
141
147
  export const Stack: Context.ServiceClass<Stack, "Stack", Omit<StackSpec, "output">> & {
142
148
  make<A, Req>(
143
149
  stack: {
@@ -158,16 +164,16 @@ export const Stack: Context.ServiceClass<Stack, "Stack", Omit<StackSpec, "output
158
164
  };
159
165
  };
160
166
  };
161
- <Self, Shape>(): {
167
+ <Self, Shape, Stages extends string = string>(): {
162
168
  (stackName: string): Effect.Effect<Self> & {
163
169
  new (_: never): Output.ToOutput<Shape>;
164
170
  readonly stackName: string;
165
171
  make: <A, Req>(
166
172
  options: StackProps<NoInfer<Req>>,
167
173
  effect: Effect.Effect<A, ConfigError, Req>,
168
- ) => Effect.Effect<CompiledStack<A>, ConfigError> & ConfiguredStackMeta<NoInfer<Req>>;
174
+ ) => ConfiguredStack<A, NoInfer<Req>>;
169
175
  stage: {
170
- [stage: string]: Effect.Effect<Self>;
176
+ readonly [S in Stages]: Effect.Effect<Self>;
171
177
  };
172
178
  };
173
179
  };
@@ -175,7 +181,7 @@ export const Stack: Context.ServiceClass<Stack, "Stack", Omit<StackSpec, "output
175
181
  stackName: string,
176
182
  options: StackProps<NoInfer<Req>>,
177
183
  eff: Effect.Effect<A, ConfigError, Req>,
178
- ): Effect.Effect<CompiledStack<A>, ConfigError> & ConfiguredStackMeta<NoInfer<Req>>;
184
+ ): ConfiguredStack<A, NoInfer<Req>>;
179
185
  } = Object.assign(
180
186
  taggedFunction(
181
187
  StackContext,
@@ -256,67 +262,96 @@ export const StackName = Stack.use((stack) => Effect.succeed(stack.name));
256
262
 
257
263
  export interface MakeStackProps<ROut = never> {
258
264
  name: string;
259
- providers: Layer.Layer<ROut, never, StackServices>;
260
- state: Layer.Layer<State, never, StackServices>;
265
+ /** Required; {@link make} dies with setup guidance when it is missing. */
266
+ providers?: Layer.Layer<ROut, never, StackServices>;
267
+ /** Required; {@link make} dies with setup guidance when it is missing. */
268
+ state?: Layer.Layer<State, never, StackServices>;
261
269
  /** Opt in to secret providers. When omitted, existing configuration is preserved. */
262
270
  secrets?: StackSecrets;
263
271
  /** @internal */
264
272
  stack?: StackSpec;
265
273
  }
266
274
 
267
- export const make =
268
- <ROut = never>(options: MakeStackProps<ROut>) =>
269
- <A, Err = never, Req extends ROut | StackServices = never>(effect: Effect.Effect<A, Err, Req>) =>
270
- Effect.scope.pipe(
271
- Effect.flatMap((scope) => {
272
- if (options.state == null) {
273
- return Effect.die(
274
- new Error(
275
- `Stack "${options.name}" is missing a state store. ` +
276
- `Add a \`state\` layer to the stack options, e.g.:\n` +
277
- ` Alchemy.Stack("${options.name}", {\n` +
278
- ` providers: Cloudflare.providers(),\n` +
279
- ` state: Cloudflare.state(), // <-- required\n` +
280
- ` }, ...)\n` +
281
- `See https://alchemy.run/state-store for available state stores.`,
282
- ),
283
- );
284
- }
285
- if (options.providers == null) {
286
- return Effect.die(
287
- new Error(
288
- `Stack "${options.name}" is missing a providers layer. ` +
289
- `Add a \`providers\` layer to the stack options, e.g.:\n` +
290
- ` Alchemy.Stack("${options.name}", {\n` +
291
- ` providers: Cloudflare.providers(), // <-- required\n` +
292
- ` state: Cloudflare.state(),\n` +
293
- ` }, ...)`,
294
- ),
295
- );
296
- }
297
- return options.providers.pipe(
298
- Layer.provideMerge(options.state),
299
- Layer.provideMerge(stackConfigLayer(options.secrets)),
300
- Layer.provideMerge(
301
- Layer.effect(
302
- Stack,
303
- Stage.pipe(
304
- Effect.map(
305
- (stage) =>
306
- options.stack ?? {
307
- name: options.name,
308
- stage,
309
- resources: {},
310
- bindings: {},
311
- actions: {},
312
- },
313
- ),
275
+ /**
276
+ * The scope a stack's state store is built into when it must close sooner
277
+ * than the rest of the stack. A store holds its stack's lease until its scope
278
+ * closes, so `evalStack` (`EvalStack.ts`) gives it one per call even when the caller
279
+ * keeps providers alive in a longer scope.
280
+ */
281
+ export class StateScope extends Context.Service<StateScope, Scope.Scope>()(
282
+ "alchemy/Stack/StateScope",
283
+ ) {}
284
+
285
+ /**
286
+ * Build a stack's providers, state store, secrets config and `Stack` spec,
287
+ * without running its program. Destroy needs nothing more: it plans from state
288
+ * alone, and every row records the provider mode that deletes it.
289
+ */
290
+ export const build = <ROut = never>(options: MakeStackProps<ROut>) =>
291
+ Effect.all([Effect.scope, Effect.serviceOption(StateScope)]).pipe(
292
+ Effect.flatMap(([scope, stateScope]) => {
293
+ if (options.state == null) {
294
+ return Effect.die(
295
+ new Error(
296
+ `Stack "${options.name}" is missing a state store. ` +
297
+ `Add a \`state\` layer to the stack options, e.g.:\n` +
298
+ ` Alchemy.Stack("${options.name}", {\n` +
299
+ ` providers: Cloudflare.providers(),\n` +
300
+ ` state: Cloudflare.state(), // <-- required\n` +
301
+ ` }, ...)\n` +
302
+ `See https://alchemy.run/state-store for available state stores.`,
303
+ ),
304
+ );
305
+ }
306
+ if (options.providers == null) {
307
+ return Effect.die(
308
+ new Error(
309
+ `Stack "${options.name}" is missing a providers layer. ` +
310
+ `Add a \`providers\` layer to the stack options, e.g.:\n` +
311
+ ` Alchemy.Stack("${options.name}", {\n` +
312
+ ` providers: Cloudflare.providers(), // <-- required\n` +
313
+ ` state: Cloudflare.state(),\n` +
314
+ ` }, ...)`,
315
+ ),
316
+ );
317
+ }
318
+ const state = options.state;
319
+ return options.providers.pipe(
320
+ Layer.provideMerge(
321
+ Option.match(stateScope, {
322
+ onNone: () => state,
323
+ onSome: (stateScope) => Layer.effectContext(Layer.buildWithScope(state, stateScope)),
324
+ }),
325
+ ),
326
+ Layer.provideMerge(stackConfigLayer(options.secrets)),
327
+ Layer.provideMerge(
328
+ Layer.effect(
329
+ Stack,
330
+ Stage.pipe(
331
+ Effect.map(
332
+ (stage) =>
333
+ options.stack ?? {
334
+ name: options.name,
335
+ stage,
336
+ resources: {},
337
+ bindings: {},
338
+ actions: {},
339
+ },
314
340
  ),
315
341
  ),
316
342
  ),
317
- Layer.buildWithScope(scope),
318
- );
319
- }),
343
+ ),
344
+ Layer.provideMerge(AuthProvidersLive),
345
+ Layer.buildWithScope(scope),
346
+ );
347
+ }),
348
+ );
349
+
350
+ /** Build a stack's services with {@link build}, then run its program under them. */
351
+ export const make =
352
+ <ROut = never>(options: MakeStackProps<ROut>) =>
353
+ <A, Err = never, Req extends ROut | StackServices = never>(effect: Effect.Effect<A, Err, Req>) =>
354
+ build(options).pipe(
320
355
  Effect.flatMap((context) =>
321
356
  Effect.all([effect, Stack, Effect.context<ROut | StackServices>()]).pipe(
322
357
  Effect.map(([output, stack, services]): CompiledStack<A, ROut | StackServices> => ({
@@ -329,71 +364,14 @@ export const make =
329
364
  ),
330
365
  );
331
366
 
367
+ /** What `Alchemy.Stack(...)` attaches to the stack it returns: everything but its program. */
368
+ export interface StackDefinition<ROut = never> {
369
+ readonly stackName: string;
370
+ readonly providers?: Layer.Layer<ROut, never, StackServices>;
371
+ readonly state?: Layer.Layer<State, never, StackServices>;
372
+ readonly secrets?: StackSecrets;
373
+ }
374
+
332
375
  export const CurrentStack = Effect.serviceOption(Stack)
333
376
 
334
377
  .pipe(Effect.map(Option.getOrUndefined));
335
-
336
- const platform = Layer.mergeAll(
337
- PlatformServices,
338
- FetchHttpClient.layer,
339
- Logger.layer([fileLogger("out")], { mergeWithExisting: true }),
340
- Layer.provide(ProfileStoreLive, PlatformServices),
341
- Layer.provide(CredentialsStoreLive, PlatformServices),
342
- );
343
- // override alchemy state store, CLI/reporting, state, and Config
344
- const alchemy = (overrides?: { dev?: boolean }) =>
345
- Layer.mergeAll(
346
- // optional
347
- overrides?.dev
348
- ? Layer.provide(
349
- Layer.effect(
350
- AlchemyContext,
351
- AlchemyContext.useSync((ctx) => ({ ...ctx, dev: overrides.dev! })),
352
- ),
353
- AlchemyContextLive,
354
- )
355
- : AlchemyContextLive,
356
- );
357
-
358
- export const evalStack = <A, B, StackErr, Err, Req>(
359
- effect: StackEffect<CompiledStack<A>, StackErr, Stage | AlchemyContext>,
360
- fn: (stack: CompiledStack<A>) => Effect.Effect<B, Err, Req>,
361
- options: {
362
- stage: string;
363
- dev?: boolean;
364
- /**
365
- * Optional caller-supplied scope. When provided, scoped resources
366
- * (e.g. the dev sidecar process) live until the caller closes this
367
- * scope instead of being torn down when `evalStack` resolves. Used
368
- * by the test harness so the sidecar survives across `beforeAll`,
369
- * tests, and `afterAll`. When omitted, behaves as before with a
370
- * private scope closed on completion.
371
- */
372
- scope?: Scope.Scope;
373
- },
374
- ) => {
375
- const body = Effect.gen(function* () {
376
- const stack = yield* effect;
377
- const configProvider = yield* loadConfigProvider(Option.none());
378
- return yield* fn(stack).pipe(
379
- provideFreshArtifactStore,
380
- Effect.provide(
381
- Layer.succeedContext(stack.services).pipe(
382
- Layer.provideMerge(Layer.succeed(ConfigProvider, configProvider)),
383
- ),
384
- ),
385
- );
386
- }).pipe(
387
- Effect.provide(
388
- Layer.effect(
389
- AuthProviders,
390
- Effect.serviceOption(AuthProviders).pipe(Effect.map(Option.getOrElse(() => ({})))),
391
- ).pipe(
392
- Layer.provideMerge(Layer.succeed(Stage, options.stage)),
393
- Layer.provideMerge(Layer.provideMerge(alchemy({ dev: options.dev }), platform)),
394
- ),
395
- ),
396
- );
397
-
398
- return options.scope === undefined ? Effect.scoped(body) : Scope.provide(body, options.scope);
399
- };
@@ -40,6 +40,9 @@ const OUTPUT_FILE = "__stack_output__.json";
40
40
  * the lock outlives the objects it was guarding; the store deletes it on
41
41
  * close.
42
42
  */
43
+ /** The lease token `alchemy state migrate` leaves on a stage it moved to DynamoDB. */
44
+ const MIGRATED_TOKEN = "migrated:dynamodb";
45
+
43
46
  const LEASE_FILE = "__lease__.json";
44
47
 
45
48
  /** How long a lease stays valid without a refresh. */
@@ -106,6 +109,12 @@ export interface BucketStateOptions {
106
109
  readonly objects: Effect.Effect<BucketObjects, StateStoreError>;
107
110
  }
108
111
 
112
+ /**
113
+ * Tokens of the leases this process holds, so a conflict with one of them
114
+ * can say the holder is an earlier, still-open build in the same process.
115
+ */
116
+ const heldInProcess = new Set<string>();
117
+
109
118
  interface LeaseRecord {
110
119
  readonly token: string;
111
120
  readonly expiresAt: number;
@@ -182,7 +191,7 @@ export const makeBucketState = (options: BucketStateOptions) =>
182
191
  use((o) => o.read(key)).pipe(
183
192
  Effect.flatMap((object) =>
184
193
  object === undefined
185
- ? Effect.succeed(undefined)
194
+ ? Effect.undefined
186
195
  : Effect.try({
187
196
  try: () => JSON.parse(object.text, reviveState) as T,
188
197
  catch: (cause) =>
@@ -208,9 +217,14 @@ export const makeBucketState = (options: BucketStateOptions) =>
208
217
  ),
209
218
  );
210
219
 
211
- const heldError = (stack: string, stage: string) =>
220
+ const heldError = (stack: string, stage: string, holder: string | undefined) =>
221
+ // The message always starts "another deploy holds": callers match on it
222
+ // (the AWS migration tells a held stage from a failed one by it).
212
223
  new StateStoreError({
213
- message: `another deploy holds the ${options.label} state lock '${stack}/${stage}'`,
224
+ message:
225
+ holder !== undefined && heldInProcess.has(holder)
226
+ ? `another deploy holds the ${options.label} state lock '${stack}/${stage}': this process holds it, from an earlier operation on this stage that is still open. Run each operation in its own Effect.scoped so its build closes first.`
227
+ : `another deploy holds the ${options.label} state lock '${stack}/${stage}'`,
214
228
  });
215
229
 
216
230
  const lostError = (stack: string, stage: string) =>
@@ -240,16 +254,22 @@ export const makeBucketState = (options: BucketStateOptions) =>
240
254
  if (version === undefined) {
241
255
  const existing = yield* readLease(key);
242
256
  const stillHeld = existing === undefined || existing.record.expiresAt > now;
257
+ if (existing?.record.token === MIGRATED_TOKEN) {
258
+ return yield* new StateStoreError({
259
+ message: `${heldError(stack, stage, undefined).message}: the stage moved to a DynamoDB state store. Deploy it with a version of alchemy that has AWS.state() on DynamoDB, or run 'alchemy state migrate --rollback' with that version to move it back.`,
260
+ });
261
+ }
243
262
  if (stillHeld) {
244
- return yield* Effect.fail(heldError(stack, stage));
263
+ return yield* heldError(stack, stage, existing?.record.token);
245
264
  }
246
265
  const replaced = yield* putLease(key, fresh, { ifVersion: existing.version });
247
266
  if (replaced === undefined) {
248
- return yield* Effect.fail(heldError(stack, stage));
267
+ return yield* heldError(stack, stage, undefined);
249
268
  }
250
269
  version = replaced;
251
270
  }
252
271
 
272
+ heldInProcess.add(token);
253
273
  const cursor = { version, lost: false };
254
274
  const gate = Semaphore.makeUnsafe(1);
255
275
 
@@ -286,16 +306,29 @@ export const makeBucketState = (options: BucketStateOptions) =>
286
306
  1,
287
307
  )(
288
308
  Effect.gen(function* () {
289
- if (cursor.lost) return yield* Effect.fail(lostError(stack, stage));
309
+ if (cursor.lost) return yield* lostError(stack, stage);
290
310
  const existing = yield* readLease(key);
291
- const observedAt = yield* Clock.currentTimeMillis;
292
- const leaseLost =
293
- existing === undefined ||
294
- existing.record.token !== token ||
295
- existing.record.expiresAt <= observedAt;
296
- if (leaseLost) {
311
+ if (existing === undefined || existing.record.token !== token) {
297
312
  cursor.lost = true;
298
- return yield* Effect.fail(lostError(stack, stage));
313
+ return yield* lostError(stack, stage);
314
+ }
315
+ const observedAt = yield* Clock.currentTimeMillis;
316
+ if (existing.record.expiresAt <= observedAt) {
317
+ // The lease lapsed without anyone taking it: a refresh queued
318
+ // behind a large deploy's writes missed its window. Take it
319
+ // back at the version we read, so a deploy that took it in
320
+ // the meantime wins and this one stops.
321
+ const reclaimed = yield* putLease(
322
+ key,
323
+ { token, expiresAt: observedAt + LEASE_TTL_MS },
324
+ { ifVersion: existing.version },
325
+ );
326
+ if (reclaimed === undefined) {
327
+ cursor.lost = true;
328
+ return yield* lostError(stack, stage);
329
+ }
330
+ cursor.version = reclaimed;
331
+ return;
299
332
  }
300
333
  cursor.version = existing.version;
301
334
  }),
@@ -311,6 +344,7 @@ export const makeBucketState = (options: BucketStateOptions) =>
311
344
  )(
312
345
  Effect.gen(function* () {
313
346
  cursor.lost = true;
347
+ heldInProcess.delete(token);
314
348
  // Read the version we actually hold. A refresh that landed
315
349
  // after the cursor was last stored would make a release
316
350
  // against the old version a no-op, and the lease would stay.
@@ -393,14 +427,12 @@ export const makeBucketState = (options: BucketStateOptions) =>
393
427
  verifyHeldLeases.pipe(Effect.andThen(listChildren(`${prefix}${stack}/`))),
394
428
  get: (request) => guarded(request, readJson<PersistedState>(resourceKey(request))),
395
429
  getReplacedResources: Effect.fn(function* (request) {
396
- return (yield* Effect.all(
397
- (yield* state.list(request)).map((fqn) =>
398
- state.get({
399
- stack: request.stack,
400
- stage: request.stage,
401
- fqn,
402
- }),
403
- ),
430
+ return (yield* Effect.forEach(yield* state.list(request), (fqn) =>
431
+ state.get({
432
+ stack: request.stack,
433
+ stage: request.stage,
434
+ fqn,
435
+ }),
404
436
  )).filter((r) => r?.status === "replaced");
405
437
  }),
406
438
  set: (request) =>
@@ -110,7 +110,7 @@ export const makeLocalState = () =>
110
110
 
111
111
  const ensure = (dir: string) =>
112
112
  created.has(dir)
113
- ? Effect.succeed(void 0)
113
+ ? Effect.void
114
114
  : fs
115
115
  .makeDirectory(dir, { recursive: true })
116
116
  .pipe(Effect.tap(() => Effect.sync(() => created.add(dir))));
@@ -134,14 +134,12 @@ export const makeLocalState = () =>
134
134
  recover,
135
135
  ),
136
136
  getReplacedResources: Effect.fn(function* (request) {
137
- return (yield* Effect.all(
138
- (yield* state.list(request)).map((fqn) =>
139
- state.get({
140
- stack: request.stack,
141
- stage: request.stage,
142
- fqn,
143
- }),
144
- ),
137
+ return (yield* Effect.forEach(yield* state.list(request), (fqn) =>
138
+ state.get({
139
+ stack: request.stack,
140
+ stage: request.stage,
141
+ fqn,
142
+ }),
145
143
  )).filter((r) => r?.status === "replaced");
146
144
  }),
147
145
  set: (request) =>
@@ -28,10 +28,17 @@ export interface StoreRef {
28
28
  readonly name?: string;
29
29
  /** e.g. `Cloudflare State Store 'alchemy-state-store'`. */
30
30
  readonly label: string;
31
+ /**
32
+ * Only the stack's config describes this store, e.g. a custom Worker or
33
+ * bucket name or a pinned account, so `--backend` can't address it.
34
+ */
35
+ readonly configured?: boolean;
31
36
  }
32
37
 
33
38
  const required = (store: StoreRef, action: "bootstrap" | "upgrade", problem: string) => {
34
- const command = `alchemy state bootstrap --backend ${store.backend}${store.name ? ` --name ${store.name}` : ""}`;
39
+ const command = store.configured
40
+ ? "alchemy state bootstrap"
41
+ : `alchemy state bootstrap --backend ${store.backend}${store.name ? ` --name ${store.name}` : ""}`;
35
42
  return new StateStoreError({
36
43
  message: `${store.label} ${problem}. Run '${command} --profile <your-ci-profile>' first, or pass --yes.`,
37
44
  requires: { action, command },
@@ -57,6 +57,8 @@ interface BaseResourceState {
57
57
  removalPolicy?: RemovalPolicy["Service"];
58
58
  /** Attr-less lookup could recover the predecessor migrated away from this FQN. */
59
59
  adoptionBlocked?: "migrated-fqn";
60
+ /** Unresolved props were stripped from this attr-less checkpoint; they cannot identify it. */
61
+ propsIncomplete?: true;
60
62
  /**
61
63
  * The {@link ProviderMode} this resource was last reconciled with.
62
64
  *
@@ -131,4 +131,34 @@ export interface StateService {
131
131
  stage: string;
132
132
  value: unknown;
133
133
  }): Effect.Effect<unknown, StateStoreError, never>;
134
+ /**
135
+ * Move stages into this store from the one it replaces, or back with
136
+ * `rollback`, for stores that replace another. Idempotent: run it again
137
+ * to finish what a failure or a blocked stage left.
138
+ */
139
+ migrate?(
140
+ request: StateMigrationRequest,
141
+ ): Effect.Effect<ReadonlyArray<StateMigration>, StateStoreError, never>;
142
+ }
143
+
144
+ /** Which stages {@link StateService.migrate} moves. */
145
+ export interface StateMigrationRequest {
146
+ /** Only this stack's stages. */
147
+ readonly stack?: string;
148
+ /** Only stages of this name. */
149
+ readonly stage?: string;
150
+ /** Move stages back to the store this one replaces. */
151
+ readonly rollback?: boolean;
152
+ }
153
+
154
+ /** What {@link StateService.migrate} did with one stage. */
155
+ export interface StateMigration {
156
+ readonly stack: string;
157
+ readonly stage: string;
158
+ /** e.g. `migrated`, `already-migrated`, `rolled-back`, `blocked` or `failed`. */
159
+ readonly status: string;
160
+ /** Records moved. */
161
+ readonly records?: number;
162
+ /** Why a stage was not moved. */
163
+ readonly reason?: string;
134
164
  }
@@ -1,6 +1,7 @@
1
1
  import * as Duration from "effect/Duration";
2
2
  import * as Redacted from "effect/Redacted";
3
3
  import { isResource } from "../Resource.ts";
4
+ import { base64ToBytes, bytesToBase64 } from "../Util/base64.ts";
4
5
 
5
6
  /**
6
7
  * JSON marker used to tag a `Redacted<T>` value when writing state.
@@ -27,6 +28,14 @@ export const DURATION_MARKER = "__duration__";
27
28
  */
28
29
  export const DATE_MARKER = "__date__";
29
30
 
31
+ /**
32
+ * JSON marker used to tag a byte array (`Uint8Array`) when writing state.
33
+ * The reviver rebuilds a real `Uint8Array`, so a byte-valued prop (a WAF
34
+ * byte-match string, a zip) read back out of persisted state is the same
35
+ * value the program declares — instead of an index-keyed object.
36
+ */
37
+ export const BYTES_MARKER = "__bytes__";
38
+
30
39
  const decodeDate = (encoded: unknown): Date | undefined => {
31
40
  if (typeof encoded !== "string") return undefined;
32
41
  const date = new Date(encoded);
@@ -103,6 +112,9 @@ export const encodeState = (value: unknown): unknown => {
103
112
  if (value instanceof Date) {
104
113
  return { [DATE_MARKER]: value.toJSON() };
105
114
  }
115
+ if (value instanceof Uint8Array) {
116
+ return { [BYTES_MARKER]: bytesToBase64(value) };
117
+ }
106
118
  if (isResource(value)) {
107
119
  return {
108
120
  id: value.LogicalId,
@@ -144,6 +156,13 @@ export const reviveState = (_key: string, value: unknown): unknown => {
144
156
  const decoded = decodeDate(obj[DATE_MARKER]);
145
157
  if (decoded !== undefined) return decoded;
146
158
  }
159
+ if (
160
+ BYTES_MARKER in obj &&
161
+ Object.keys(obj).length === 1 &&
162
+ typeof obj[BYTES_MARKER] === "string"
163
+ ) {
164
+ return base64ToBytes(obj[BYTES_MARKER]);
165
+ }
147
166
  }
148
167
  return value;
149
168
  };
@@ -171,6 +190,9 @@ export const reviveStateRecursive = (value: unknown): unknown => {
171
190
  const decoded = decodeDate(obj[DATE_MARKER]);
172
191
  if (decoded !== undefined) return decoded;
173
192
  }
193
+ if (keys.length === 1 && keys[0] === BYTES_MARKER && typeof obj[BYTES_MARKER] === "string") {
194
+ return base64ToBytes(obj[BYTES_MARKER]);
195
+ }
174
196
  const result: Record<string, unknown> = {};
175
197
  for (const [k, v] of Object.entries(obj)) {
176
198
  result[k] = reviveStateRecursive(v);
@@ -1,7 +1,7 @@
1
1
  // PostgresState is intentionally NOT re-exported here: this barrel is pulled
2
2
  // into worker bundles via the core engine, and PostgresState loads
3
- // "@effect/sql-pg" (and through it "pg", which is Node-only). Deep-import it
4
- // instead: `@alchemy.run/sql/PostgresState`.
3
+ // "@effect/sql-pg", which opens sockets through Node's `net`/`tls`.
4
+ // Deep-import it instead: `@alchemy.run/sql/PostgresState`.
5
5
  export * from "./Export.ts";
6
6
  export * from "./HttpStateApi.ts";
7
7
  export * from "./HttpStateStore.ts";