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
@@ -1,6 +1,7 @@
1
1
  import { newWebSocketRpcSession, type RpcStub } from "capnweb";
2
2
  import * as Config from "effect/Config";
3
3
  import * as Context from "effect/Context";
4
+ import * as Data from "effect/Data";
4
5
  import * as Effect from "effect/Effect";
5
6
  import * as HttpBody from "effect/http/HttpBody";
6
7
  import * as HttpClient from "effect/http/HttpClient";
@@ -14,6 +15,20 @@ import type { RpcProxyApi, SessionProviderCounts } from "./RpcServer.ts";
14
15
  import { encodeSessionEnvironment, SESSION_ENV_PARAM } from "./RpcServerEnvironment.ts";
15
16
  import type { RpcSpawnPayload } from "./RpcSpawner.ts";
16
17
 
18
+ export class RpcProviderProxyOperationFailed extends Data.TaggedError(
19
+ "RpcProviderProxyOperationFailed",
20
+ )<{
21
+ readonly message: string;
22
+ readonly cause?: unknown;
23
+ }> {}
24
+
25
+ export class RpcProviderProxyUnexpectedResponse extends Data.TaggedError(
26
+ "RpcProviderProxyUnexpectedResponse",
27
+ )<{
28
+ readonly message: string;
29
+ readonly cause?: unknown;
30
+ }> {}
31
+
17
32
  /** A test file's leases on the sessions it actually uses. */
18
33
  export interface SessionOwner {
19
34
  closed: boolean;
@@ -100,28 +115,20 @@ const make = Effect.fn(function* (spawnerUrl: string) {
100
115
  });
101
116
  const body = yield* response.text;
102
117
  if (response.status !== 200) {
103
- return yield* Effect.fail(
104
- new Error(
105
- `RPC spawner POST ${spawnerUrl} returned ${response.status}: ${body.slice(0, 300)}`,
106
- ),
107
- );
118
+ return yield* new RpcProviderProxyOperationFailed({
119
+ message: `RPC spawner POST ${spawnerUrl} returned ${response.status}: ${body.slice(0, 300)}`,
120
+ });
108
121
  }
109
- let websocketUrl: URL;
110
- try {
111
- websocketUrl = new URL(body);
112
- } catch {
113
- return yield* Effect.fail(
114
- new Error(
115
- `RPC spawner POST ${spawnerUrl} did not return a websocket URL (got ${JSON.stringify(body.slice(0, 200))})`,
116
- ),
117
- );
122
+ if (!URL.canParse(body)) {
123
+ return yield* new RpcProviderProxyUnexpectedResponse({
124
+ message: `RPC spawner POST ${spawnerUrl} did not return a websocket URL (got ${JSON.stringify(body.slice(0, 200))})`,
125
+ });
118
126
  }
127
+ const websocketUrl = new URL(body);
119
128
  if (websocketUrl.protocol !== "ws:" && websocketUrl.protocol !== "wss:") {
120
- return yield* Effect.fail(
121
- new Error(
122
- `RPC spawner POST ${spawnerUrl} returned a non-websocket URL: ${websocketUrl.toString()}`,
123
- ),
124
- );
129
+ return yield* new RpcProviderProxyUnexpectedResponse({
130
+ message: `RPC spawner POST ${spawnerUrl} returned a non-websocket URL: ${websocketUrl.toString()}`,
131
+ });
125
132
  }
126
133
  websocketUrl.searchParams.set(SESSION_ENV_PARAM, sessionEnv);
127
134
  const socket = new WebSocket(websocketUrl.toString());
@@ -185,7 +192,7 @@ const make = Effect.fn(function* (spawnerUrl: string) {
185
192
  (entry) => entry.connection !== undefined,
186
193
  )?.connection;
187
194
  return connection === undefined
188
- ? Effect.succeed(undefined)
195
+ ? Effect.undefined
189
196
  : Effect.tryPromise(async () => (await connection.pending).rpc.getDiagnostics()).pipe(
190
197
  Effect.map(
191
198
  ({ sessions, testSessions, contexts, building, artifactBags, artifacts }) => ({
@@ -239,8 +246,9 @@ const make = Effect.fn(function* (spawnerUrl: string) {
239
246
  let connection = current.connection;
240
247
  if (connection === undefined) {
241
248
  const open = getSession(environment);
249
+ const context = yield* Effect.context();
242
250
  connection = {
243
- pending: Effect.runPromise(
251
+ pending: Effect.runPromiseWith(context)(
244
252
  current.testOwned ? open.pipe(Effect.timeout("30 seconds")) : open,
245
253
  ),
246
254
  };
@@ -12,13 +12,21 @@ import * as Stream from "effect/Stream";
12
12
  import * as Output from "../Output.ts";
13
13
  import { isRedactedMarker, type RedactedMarker } from "../RuntimeContext.ts";
14
14
  import { decodeDuration, DURATION_MARKER, encodeState } from "../State/StateEncoding.ts";
15
+ import {
16
+ currentTraceParent,
17
+ type TraceParent,
18
+ withStreamTraceParent,
19
+ withTraceParent,
20
+ } from "../Util/TraceParent.ts";
15
21
 
16
22
  type RpcEffectHandler<Args extends Array<any>, Success, Error> = (
17
23
  ...args: Args
18
24
  ) => Effect.Effect<Success, Error>;
19
25
 
26
+ // `parent`: the caller's span, so the sidecar's work joins its trace.
20
27
  type RpcWrappedEffectHandler<Args extends Array<any>, Success, Error> = (
21
28
  args: Args,
29
+ parent?: TraceParent,
22
30
  ) => Promise<RpcSerializedExit<Success, Error>>;
23
31
 
24
32
  type RpcStreamHandler<Args extends Array<any>, Success, Error> = (
@@ -27,6 +35,7 @@ type RpcStreamHandler<Args extends Array<any>, Success, Error> = (
27
35
 
28
36
  type RpcWrappedStreamHandler<Args extends Array<any>, Success, Error> = (
29
37
  args: Args,
38
+ parent?: TraceParent,
30
39
  ) => RpcSerializedStream<Success, Error>;
31
40
 
32
41
  type RpcSerializedStream<Success, _Error> = ReadableStream<Success>;
@@ -186,11 +195,12 @@ const wrapRpcEffectHandler = <Args extends Array<any>, Success, Error>(
186
195
  registerCall?: Effect.Effect<void, never, Scope.Scope>,
187
196
  ): RpcWrappedEffectHandler<Args, Success, Error> =>
188
197
  flow(
189
- (args) => deserializeRpcArgs(args) as Args,
190
- (args) =>
191
- registerCall === undefined
192
- ? handler(...args)
193
- : Effect.scoped(registerCall.pipe(Effect.andThen(Effect.suspend(() => handler(...args))))),
198
+ (args, parent) => {
199
+ const call = Effect.suspend(() => handler(...(deserializeRpcArgs(args) as Args)));
200
+ return (
201
+ registerCall === undefined ? call : Effect.scoped(registerCall.pipe(Effect.andThen(call)))
202
+ ).pipe(withTraceParent(parent));
203
+ },
194
204
  Effect.exit,
195
205
  Effect.flatMap((exit): Effect.Effect<RpcSerializedExit<Success, Error>> => {
196
206
  if (exit._tag === "Success") {
@@ -229,11 +239,12 @@ const wrapRpcStreamHandler = <Args extends Array<any>, Success, Error>(
229
239
  registerCall?: Effect.Effect<void, never, Scope.Scope>,
230
240
  ): RpcWrappedStreamHandler<Args, Success, Error> =>
231
241
  flow(
232
- (args) => deserializeRpcArgs(args) as Args,
233
- (args) =>
234
- registerCall === undefined
235
- ? handler(...args)
236
- : Stream.unwrap(registerCall.pipe(Effect.map(() => handler(...args)))),
242
+ (args, parent) => {
243
+ const call = Effect.sync(() => handler(...(deserializeRpcArgs(args) as Args)));
244
+ return Stream.unwrap(
245
+ registerCall === undefined ? call : registerCall.pipe(Effect.andThen(call)),
246
+ ).pipe(withStreamTraceParent(parent));
247
+ },
237
248
  (stream) => Stream.toReadableStream(stream),
238
249
  );
239
250
 
@@ -242,7 +253,8 @@ const unwrapRpcEffectHandler = <Args extends Array<any>, Success, Error>(
242
253
  ): RpcEffectHandler<Args, Success, Error> =>
243
254
  flow(
244
255
  (...args) => serializeRpcArgs(args) as Args,
245
- (args) => Effect.promise(() => handler(args)),
256
+ (args) =>
257
+ Effect.flatMap(currentTraceParent, (parent) => Effect.promise(() => handler(args, parent))),
246
258
  Effect.flatMap((exit): Exit.Exit<Success, Error> => {
247
259
  if (exit._tag === "Success") {
248
260
  // Mirror of the wrap side: rebuild `Redacted` wrappers from their
@@ -272,12 +284,15 @@ const unwrapRpcStreamHandler = <Args extends Array<any>, Success, Error>(
272
284
  ): RpcStreamHandler<Args, Success, Error> =>
273
285
  flow(
274
286
  (...args) => serializeRpcArgs(args) as Args,
275
- (args) => handler(args),
276
- (stream) =>
277
- Stream.fromReadableStream({
278
- evaluate: () => stream,
279
- onError: (error) => error as Error,
280
- }),
287
+ (args) =>
288
+ Stream.unwrap(
289
+ Effect.map(currentTraceParent, (parent) =>
290
+ Stream.fromReadableStream({
291
+ evaluate: () => handler(args, parent),
292
+ onError: (error) => error as Error,
293
+ }),
294
+ ),
295
+ ),
281
296
  );
282
297
 
283
298
  const serializeRpcArgs = (value: unknown): unknown => {
@@ -7,13 +7,14 @@ import * as Fiber from "effect/Fiber";
7
7
  import * as FetchHttpClient from "effect/http/FetchHttpClient";
8
8
  import type { HttpClient } from "effect/http/HttpClient";
9
9
  import * as Layer from "effect/Layer";
10
- import * as Logger from "effect/Logger";
11
10
  import * as Scope from "effect/Scope";
12
11
  import { ArtifactStore, createArtifactStore } from "../Artifacts.ts";
13
12
  import type { ProviderService } from "../Provider.ts";
14
13
  import type { ResourceLike } from "../Resource.ts";
15
- import { makePlainConsoleSink } from "../Util/ConsoleSink.ts";
14
+ import { childJsonLogLayer, LOG_FORMAT_ENV, LogProcess } from "../Util/LogRecord.ts";
16
15
  import { platformLayer, PlatformServices, runMain } from "../Util/PlatformServices.ts";
16
+ import { logShutdown } from "../Util/Shutdown.ts";
17
+ import { processTrace, withTraceParent } from "../Util/TraceParent.ts";
17
18
  import * as RpcSerialization from "./RpcSerialization.ts";
18
19
  import * as RpcServerEnvironment from "./RpcServerEnvironment.ts";
19
20
  import type { SessionEnvironment } from "./RpcServerEnvironment.ts";
@@ -156,7 +157,7 @@ const sessionProviders = (resolve: ProviderGroupLoader) =>
156
157
  };
157
158
  sessions.set(key, session);
158
159
  const current = session;
159
- Effect.runSync(
160
+ Effect.runSyncWith(ambient)(
160
161
  Scope.addFinalizer(
161
162
  current.scope,
162
163
  // Calls drain before provider finalizers and artifact disposal.
@@ -195,7 +196,7 @@ const sessionProviders = (resolve: ProviderGroupLoader) =>
195
196
  );
196
197
  }
197
198
  const groupScope = Scope.forkUnsafe(current.resources);
198
- const pending = Effect.runPromise(
199
+ const pending = Effect.runPromiseWith(ambient)(
199
200
  resolve(group).pipe(
200
201
  Effect.flatMap((providers) =>
201
202
  Layer.buildWithMemoMap(
@@ -265,7 +266,7 @@ const sessionProviders = (resolve: ProviderGroupLoader) =>
265
266
  lease.closing =
266
267
  session === undefined
267
268
  ? Promise.resolve()
268
- : Effect.runPromise(Scope.close(session.scope, Exit.void));
269
+ : Effect.runPromiseWith(ambient)(Scope.close(session.scope, Exit.void));
269
270
  return lease.closing;
270
271
  },
271
272
  get: async (sessionEnv, type, group, lease) => {
@@ -332,14 +333,15 @@ export const launch = (providers: ProviderLayer | ProviderGroupLoader) =>
332
333
  sessionProviders(Layer.isLayer(providers) ? () => Effect.succeed(providers) : providers),
333
334
  ),
334
335
  Layer.provide(Layer.mergeAll(PlatformServices, FetchHttpClient.layer)),
335
- // Sidecar stdio is piped, so effect's default pretty logger disables
336
- // colors (it only checks `isTTY`, never FORCE_COLOR). The spawner sets
337
- // FORCE_COLOR exactly when the destination terminal supports color —
338
- // honor it here so sidecar log lines match the rest of the dev output.
339
- Layer.provide(
340
- process.env.FORCE_COLOR ? Logger.layer([makePlainConsoleSink(true)]) : Layer.empty,
341
- ),
342
336
  Layer.launch,
337
+ logShutdown("sidecar"),
338
+ // Spans outside RPC calls join the `alchemy dev` trace, like its records.
339
+ withTraceParent(processTrace),
340
+ // The spawner asks for JSON records: the process that owns the
341
+ // terminal decodes and renders them, so structure (level, resource,
342
+ // text as written) survives the pipe.
343
+ Effect.provide(process.env[LOG_FORMAT_ENV] === "json" ? childJsonLogLayer : Layer.empty),
344
+ Effect.provideService(LogProcess, "sidecar"),
343
345
  Effect.scoped,
344
346
  runMain,
345
347
  );
@@ -363,15 +365,17 @@ export const layerServer = (
363
365
  /** Called when the parent connection, indicated by the `/parent` path, is established. */
364
366
  parentConnected: () => void;
365
367
  /** Called when the parent disconnects. The server will shut down when this is called. */
366
- parentDisconnected: () => void;
368
+ /** The parent link closed; `detail` says how, when the server knows. */
369
+ parentDisconnected: (detail?: string) => void;
367
370
  }) => Effect.Effect<{ readonly url: string }, never, Scope.Scope>,
368
371
  ) =>
369
372
  Layer.effect(
370
373
  RpcServer,
371
374
  Effect.gen(function* () {
372
375
  const providers = yield* SessionProviders;
376
+ const context = yield* Effect.context();
373
377
  const connected = yield* Deferred.make<void>();
374
- const disconnected = yield* Deferred.make<void>();
378
+ const disconnected = yield* Deferred.make<string | undefined>();
375
379
  const { url } = yield* serve({
376
380
  createRpcSession: (ws, sessionEnv) => {
377
381
  const lease: SessionLease = { closed: false, calls: new Set() };
@@ -395,18 +399,22 @@ export const layerServer = (
395
399
  // deliberately retain their contexts across hot reloads.
396
400
  if (testOwned) {
397
401
  void providers.release(lease).catch((error) => {
398
- Effect.runFork(Effect.logError(error));
402
+ Effect.runForkWith(context)(Effect.logError(error));
399
403
  });
400
404
  }
401
405
  };
402
406
  return session;
403
407
  },
404
408
  parentConnected: () => Deferred.doneUnsafe(connected, Effect.void),
405
- parentDisconnected: () => Deferred.doneUnsafe(disconnected, Effect.void),
409
+ parentDisconnected: (detail) => Deferred.doneUnsafe(disconnected, Effect.succeed(detail)),
406
410
  });
407
411
  yield* Console.log(`<ALCHEMY_RPC_ADDRESS>${url}</ALCHEMY_RPC_ADDRESS>`);
408
412
  yield* Deferred.await(connected).pipe(Effect.timeout("10 seconds")); // TODO(john): should the timeout be shorter?
409
- yield* Deferred.await(disconnected);
413
+ // The sidecar exits with its parent; record why the link closed.
414
+ const detail = yield* Deferred.await(disconnected);
415
+ yield* Effect.logInfo(
416
+ `parent connection closed${detail === undefined ? "" : ` (${detail})`}; shutting down`,
417
+ );
410
418
  return yield* Effect.interrupt;
411
419
  }),
412
420
  );
@@ -12,6 +12,9 @@ export const RpcServerBun = RpcServer.layerServer(
12
12
  | { type: "parent" }
13
13
  >({
14
14
  port: 0,
15
+ // Loopback only, as in RpcServerNode: with no hostname Bun listens on
16
+ // every interface.
17
+ hostname: "127.0.0.1",
15
18
  fetch: (request, server) => {
16
19
  const url = new URL(request.url);
17
20
  if (
@@ -56,17 +59,18 @@ export const RpcServerBun = RpcServer.layerServer(
56
59
  if (ws.data.type === "session") {
57
60
  ws.data.session.dispatch.close(code, reason);
58
61
  } else if (ws.data.type === "parent") {
59
- // The sidecar exits with its parent; record why the link closed.
60
- console.error(
61
- `[alchemy sidecar] parent connection closed (code ${code}${reason ? `, ${reason}` : ""}); shutting down`,
62
- );
63
- parentDisconnected();
62
+ parentDisconnected(`code ${code}${reason ? `, ${reason}` : ""}`);
64
63
  }
65
64
  },
66
65
  },
67
66
  }),
68
67
  );
69
- yield* Effect.addFinalizer(() => Effect.sync(() => server.stop(true)));
68
+ // Fire and forget: awaiting `stop(true)` can outlive the process's own shutdown.
69
+ yield* Effect.addFinalizer(() =>
70
+ Effect.sync(() => {
71
+ void server.stop(true);
72
+ }),
73
+ );
70
74
  return {
71
75
  url: `ws://${server.hostname}:${server.port}`,
72
76
  };
@@ -4,9 +4,9 @@ import * as Effect from "effect/Effect";
4
4
  import * as Layer from "effect/Layer";
5
5
  import * as Option from "effect/Option";
6
6
  import { AlchemyContext } from "../AlchemyContext.ts";
7
- import { AuthProviders } from "../Auth/AuthProvider.ts";
8
7
  import { CredentialsStoreLive } from "../Auth/Credentials.ts";
9
8
  import { ProfileStoreLive } from "../Auth/Profile.ts";
9
+ import { AuthProvidersLive } from "../Auth/Registry.ts";
10
10
  import { withProfileOverride } from "../Auth/Resolve.ts";
11
11
  import { Stack } from "../Stack.ts";
12
12
  import { Stage } from "../Stage.ts";
@@ -58,7 +58,7 @@ export const layer = (
58
58
  Layer.mergeAll(
59
59
  ProfileStoreLive,
60
60
  CredentialsStoreLive,
61
- Layer.succeed(AuthProviders, {}),
61
+ AuthProvidersLive,
62
62
  loadConfigProvider(Option.fromNullishOr(environment.envFile)).pipe(
63
63
  Effect.map((base) => withProfileOverride(base, environment.profile)),
64
64
  ConfigProvider.layer,
@@ -20,7 +20,14 @@ export const RpcServerNode = RpcServer.layerServer(
20
20
  undefined;
21
21
  const session = createRpcSession(ws, sessionEnv);
22
22
  ws.on("message", (data) => {
23
- session.dispatch.message(data.toString());
23
+ session.dispatch.message(
24
+ (Array.isArray(data)
25
+ ? Buffer.concat(data)
26
+ : Buffer.isBuffer(data)
27
+ ? data
28
+ : Buffer.from(data)
29
+ ).toString(),
30
+ );
24
31
  });
25
32
  ws.on("close", (code, reason) => {
26
33
  session.dispatch.close(code, reason.toString());
@@ -4,7 +4,7 @@ import { RpcSession, type RpcCompatible, type RpcTransport } from "capnweb";
4
4
  * A platform-agnostic interface for a server-side WebSocket.
5
5
  */
6
6
  export interface ServerWebSocketLike {
7
- send: (message: string) => any | Promise<any>;
7
+ send: (message: string) => any;
8
8
  close: (code?: number, reason?: string) => void;
9
9
  }
10
10
 
@@ -32,7 +32,7 @@ function makeWebSocketRpcTransport(ws: ServerWebSocketLike) {
32
32
  let receiveQueue: Array<string> = [];
33
33
  let receiveResolver: ((value: string) => void) | undefined;
34
34
  let receiveRejecter: ((reason: unknown) => void) | undefined;
35
- let error: unknown | undefined;
35
+ let error: unknown;
36
36
  return {
37
37
  transport: {
38
38
  send: async (message: string) => await ws.send(message),
@@ -2,11 +2,12 @@ import { fileURLToPath } from "node:url";
2
2
  import * as Cache from "effect/Cache";
3
3
  import type * as Cause from "effect/Cause";
4
4
  import * as Config from "effect/Config";
5
- import * as Console from "effect/Console";
6
5
  import * as Context from "effect/Context";
6
+ import * as Data from "effect/Data";
7
7
  import * as Deferred from "effect/Deferred";
8
8
  import * as Duration from "effect/Duration";
9
9
  import * as Effect from "effect/Effect";
10
+ import * as Fiber from "effect/Fiber";
10
11
  import * as HttpClient from "effect/http/HttpClient";
11
12
  import * as HttpServer from "effect/http/HttpServer";
12
13
  import { HttpServerRequest } from "effect/http/HttpServerRequest";
@@ -21,9 +22,12 @@ import * as Schedule from "effect/Schedule";
21
22
  import * as Schema from "effect/Schema";
22
23
  import * as Scope from "effect/Scope";
23
24
  import * as Stream from "effect/Stream";
25
+ import { LOG_FORMAT_ENV, logChildLine } from "../Util/LogRecord.ts";
24
26
  import { nodeLoaderArgs } from "../Util/Node.ts";
25
27
  import { httpServer } from "../Util/PlatformServices.ts";
28
+ import { timedShutdownStep } from "../Util/Shutdown.ts";
26
29
  import { pipedColorEnv } from "../Util/Terminal.ts";
30
+ import { traceParentEnv } from "../Util/TraceParent.ts";
27
31
  import { SPAWNER_URL_ENV_KEY } from "./RpcProviderProxy.ts";
28
32
  import { RPC_SERVER_ENVIRONMENT_KEY, type RpcServerEnvironment } from "./RpcServerEnvironment.ts";
29
33
 
@@ -34,6 +38,10 @@ export class RpcSpawner extends Context.Service<
34
38
  }
35
39
  >()("alchemy/Local/RpcSpawner") {}
36
40
 
41
+ class InvalidServerEntryUrl extends Data.TaggedError("InvalidServerEntryUrl")<{
42
+ cause: unknown;
43
+ }> {}
44
+
37
45
  /**
38
46
  * The spawner forks one child per distinct `serverEntryUrl`. Stack-specific
39
47
  * context (stack name/stage, AlchemyContext) is NOT part of the spawn key —
@@ -103,10 +111,9 @@ export const make = Effect.fn(function* ({ profile, envFile, omitEnv = [] }: Rpc
103
111
  for (const notify of subscribers) notify(line);
104
112
  return Effect.void;
105
113
  }
106
- // Fallback path (no exec child subscribed): sidecar lines already carry
107
- // the sidecar's logger prefix, so print verbatim rather than stamping
108
- // this process's logger prefix on top.
109
- return line.channel === "stderr" ? Console.error(line.line) : Console.log(line.line);
114
+ // Fallback path (no exec child subscribed): render the sidecar's
115
+ // records through this process's loggers.
116
+ return logChildLine(line.line, { stream: line.channel, process: "sidecar" });
110
117
  });
111
118
 
112
119
  const spawn = Effect.fn(function* (serverEntryUrl: string) {
@@ -157,6 +164,13 @@ export const make = Effect.fn(function* ({ profile, envFile, omitEnv = [] }: Rpc
157
164
  env: {
158
165
  ...(omitEnv.length > 0 ? yield* inheritedEnv(omitEnv) : {}),
159
166
  [RPC_SERVER_ENVIRONMENT_KEY]: JSON.stringify(environment),
167
+ // Its startup joins the trace of the call that spawned it; each
168
+ // provider call then carries its caller's span (RpcSerialization).
169
+ ...(yield* traceParentEnv),
170
+ // Log records, not rendered text: see `forwardSidecarLogs`.
171
+ [LOG_FORMAT_ENV]: "json",
172
+ // Tools further down (vite, workerd) still style their own output;
173
+ // records keep that text as written.
160
174
  ...pipedColorEnv(),
161
175
  },
162
176
  // With variables to withhold, the full environment is built above.
@@ -164,20 +178,36 @@ export const make = Effect.fn(function* ({ profile, envFile, omitEnv = [] }: Rpc
164
178
  },
165
179
  );
166
180
  const handle = yield* spawner.spawn(command);
167
- yield* handle.stderr.pipe(
181
+ const stderrReader = yield* handle.stderr.pipe(
168
182
  Stream.decodeText,
169
183
  Stream.splitLines,
170
184
  Stream.runForEach((line) => publish({ channel: "stderr", line })),
171
185
  Effect.ignore,
172
186
  Effect.forkScoped,
173
187
  );
188
+ const stdout = yield* readRpcOutput(handle.stdout, (line) =>
189
+ publish({ channel: "stdout", line }),
190
+ );
174
191
  // This scope is the child handle's sole owner. Graceful shutdown runs this
175
192
  // finalizer; abrupt parent loss closes the RPC parent connection and the
176
193
  // child self-terminates (both paths are covered by RpcSpawnerCleanup).
177
194
  // Command cleanup allows 1s for TERM and 1s for KILL; reserve 1s for sidecar teardown.
178
195
  const kill = handle.kill({ forceKillAfter: "3 seconds" });
179
- yield* Effect.addFinalizer(() => kill.pipe(Effect.ignore));
180
- const url = yield* getRpcAddress(handle.stdout, (line) => publish({ channel: "stdout", line }));
196
+ // Registered after the readers, so it runs before they are interrupted:
197
+ // the sidecar's own shutdown records drain until its pipes close.
198
+ yield* Effect.addFinalizer(() =>
199
+ kill.pipe(
200
+ Effect.ignore,
201
+ Effect.andThen(
202
+ Fiber.joinAll([stderrReader, stdout.reader]).pipe(
203
+ Effect.timeout("1 second"),
204
+ Effect.ignore,
205
+ ),
206
+ ),
207
+ timedShutdownStep(`stopped sidecar pid ${handle.pid}`),
208
+ ),
209
+ );
210
+ const url = yield* Deferred.await(stdout.address);
181
211
  const ws = yield* Effect.acquireRelease(
182
212
  Effect.sync(() => {
183
213
  const ws = new WebSocket(new URL("/parent", url));
@@ -219,8 +249,8 @@ export const make = Effect.fn(function* ({ profile, envFile, omitEnv = [] }: Rpc
219
249
  new Error(`Failed to spawn RPC server for "${serverEntryUrl}" after ${attempt} attempts.`),
220
250
  );
221
251
  }
222
- yield* Console.error(
223
- `[alchemy] RPC sidecar for ${serverEntryUrl} is no longer running; respawning (attempt ${attempt + 1})`,
252
+ yield* Effect.logWarning(
253
+ `RPC sidecar for ${serverEntryUrl} is no longer running; respawning (attempt ${attempt + 1})`,
224
254
  );
225
255
  // The sidecar is usually already gone, and killing an exited process fails.
226
256
  yield* child.kill.pipe(Effect.ignore);
@@ -282,7 +312,7 @@ export const make = Effect.fn(function* ({ profile, envFile, omitEnv = [] }: Rpc
282
312
  const entry = yield* Effect.result(
283
313
  Effect.try({
284
314
  try: () => new URL(decoded.success.serverEntryUrl),
285
- catch: (cause) => cause,
315
+ catch: (cause) => new InvalidServerEntryUrl({ cause }),
286
316
  }),
287
317
  );
288
318
  if (entry._tag === "Failure" || entry.success.protocol !== "file:") {
@@ -320,28 +350,29 @@ export const layerServer = (environment: RpcSpawnerOptions) =>
320
350
 
321
351
  const RPC_ADDRESS_REGEX = /(<ALCHEMY_RPC_ADDRESS>)(.+)(<\/ALCHEMY_RPC_ADDRESS>)/;
322
352
 
323
- const getRpcAddress = (
353
+ /**
354
+ * Read the sidecar's stdout: its log lines and the RPC address line. The
355
+ * reader runs until the pipe closes, so a caller can drain it on shutdown.
356
+ */
357
+ const readRpcOutput = (
324
358
  stdout: Stream.Stream<Uint8Array, PlatformError>,
325
359
  publish: (line: string) => Effect.Effect<void>,
326
360
  ) =>
327
361
  Effect.gen(function* () {
328
362
  const address = yield* Deferred.make<string>();
329
- // Set once the address line is seen; lines before it are handshake noise.
330
- let addressSeen = false;
331
- yield* stdout.pipe(
363
+ // Every line but the address is published, including what the sidecar
364
+ // logs while starting: a layer that fails to build says why there.
365
+ const reader = yield* stdout.pipe(
332
366
  Stream.decodeText,
333
367
  Stream.splitLines,
334
368
  Stream.runForEach((line) => {
335
369
  const match = line.match(RPC_ADDRESS_REGEX);
336
- if (match) {
337
- addressSeen = true;
338
- return Deferred.succeed(address, match[2]);
339
- }
340
- return addressSeen ? publish(line) : Effect.void;
370
+ return match ? Deferred.succeed(address, match[2]) : publish(line);
341
371
  }),
372
+ Effect.ignore,
342
373
  Effect.forkScoped,
343
374
  );
344
- return yield* Deferred.await(address);
375
+ return { address, reader };
345
376
  });
346
377
 
347
378
  export const parseSidecarLogLine = (raw: string): SidecarLogLine | undefined => {
@@ -355,19 +386,16 @@ export const parseSidecarLogLine = (raw: string): SidecarLogLine | undefined =>
355
386
  };
356
387
 
357
388
  /**
358
- * Pull sidecar output from the spawner (the outer `alchemy dev` process)
359
- * into THIS process's Console. The exec child owns the terminal renderer —
360
- * Sigil patches its `console`, so lines printed here are inserted cleanly
361
- * above the repainting progress region instead of racing it on the shared
362
- * tty. Forks in the ambient scope and never fails: when no spawner is
389
+ * Pull the sidecars' log records from the spawner (the outer `alchemy dev`
390
+ * process) into THIS process's loggers. The exec child owns the terminal
391
+ * renderer, so the records render above the repainting progress region
392
+ * instead of racing it on the shared tty; it forwards them on to the
393
+ * supervisor, which writes the run log. Forks in the ambient scope and never fails: when no spawner is
363
394
  * configured (`ALCHEMY_RPC_SPAWNER_URL` absent — plain deploy/destroy) it is
364
395
  * a no-op, and if the connection drops the spawner's own fallback printing
365
396
  * takes over.
366
397
  */
367
- export const forwardSidecarLogs = (
368
- /** Mirrors every forwarded line (e.g. into a dev log file). */
369
- tee?: (line: SidecarLogLine) => void,
370
- ): Effect.Effect<void, never, HttpClient.HttpClient | Scope.Scope> =>
398
+ export const forwardSidecarLogs: Effect.Effect<void, never, HttpClient.HttpClient | Scope.Scope> =
371
399
  Config.String(SPAWNER_URL_ENV_KEY).pipe(
372
400
  Effect.flatMap((spawnerUrl) => {
373
401
  const streamOnce = Effect.gen(function* () {
@@ -380,13 +408,9 @@ export const forwardSidecarLogs = (
380
408
  Effect.suspend(() => {
381
409
  const parsed = parseSidecarLogLine(raw);
382
410
  if (parsed === undefined) return Effect.void;
383
- tee?.(parsed);
384
- // Sidecar lines already carry the sidecar's own logger prefix
385
- // (timestamp/level/fiber) — print them verbatim; routing through
386
- // this process's logger would stamp a second prefix on top.
387
- return parsed.channel === "stderr"
388
- ? Console.error(parsed.line)
389
- : Console.log(parsed.line);
411
+ // Sidecar lines are log records: replay them through this
412
+ // process's loggers, which render them (or pass them on as JSON).
413
+ return logChildLine(parsed.line, { stream: parsed.channel, process: "sidecar" });
390
414
  }),
391
415
  ),
392
416
  );
@@ -13,10 +13,17 @@
13
13
  * (`RpcSpawner`) forks this entry once per run; `RpcProviderProxy` points
14
14
  * every provider at it.
15
15
  */
16
+
17
+ import * as Data from "effect/Data";
16
18
  import * as Effect from "effect/Effect";
17
19
  import * as Layer from "effect/Layer";
18
20
  import * as RpcServer from "./RpcServer.ts";
19
21
 
22
+ export class SidecarInvalidProps extends Data.TaggedError("SidecarInvalidProps")<{
23
+ readonly message: string;
24
+ readonly cause?: unknown;
25
+ }> {}
26
+
20
27
  RpcServer.launch((group) =>
21
28
  Effect.promise(() => import(group)).pipe(
22
29
  Effect.flatMap((module: { default?: unknown }) =>
@@ -24,7 +31,9 @@ RpcServer.launch((group) =>
24
31
  ? // oxlint-disable-next-line effecttsgo/unsafe-effect-type-assertion -- dynamically imported provider group module
25
32
  Effect.succeed(module.default as RpcServer.ProviderLayer)
26
33
  : Effect.fail(
27
- new Error(`Provider group module ${group} must default-export its provider Layer`),
34
+ new SidecarInvalidProps({
35
+ message: `Provider group module ${group} must default-export its provider Layer`,
36
+ }),
28
37
  ),
29
38
  ),
30
39
  ),