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,21 +1,38 @@
1
+ import type * as Cause from "effect/Cause";
2
+ import * as Flag from "effect/cli/Flag";
3
+ import * as GlobalFlag from "effect/cli/GlobalFlag";
1
4
  import * as Clock from "effect/Clock";
5
+ import * as Context from "effect/Context";
2
6
  import * as Duration from "effect/Duration";
3
7
  import * as Effect from "effect/Effect";
8
+ import * as Fiber from "effect/Fiber";
4
9
  import * as FileSystem from "effect/FileSystem";
5
10
  import * as Layer from "effect/Layer";
6
11
  import * as Logger from "effect/Logger";
7
12
  import * as LogLevel from "effect/LogLevel";
8
13
  import * as Option from "effect/Option";
9
14
  import { Path } from "effect/Path";
10
- import { MinimumLogLevel } from "effect/References";
15
+ import * as Queue from "effect/Queue";
16
+ import { CurrentLogAnnotations, MinimumLogLevel } from "effect/References";
11
17
  import packageJson from "../../package.json" with { type: "json" };
18
+ import { dotAlchemyDirectory } from "../AlchemyContext.ts";
12
19
  import { rootDir } from "../Auth/Paths.ts";
13
20
  import { makePlainConsoleSink } from "../Util/ConsoleSink.ts";
21
+ import { LogAnnotation } from "../Util/LogAnnotation.ts";
22
+ import {
23
+ formatJsonRecord,
24
+ jsonLogger,
25
+ LOG_FORMAT_ENV,
26
+ LOG_LEVEL_ENV,
27
+ type LogRecord,
28
+ safeStringify,
29
+ } from "../Util/LogRecord.ts";
30
+ import { processTrace } from "../Util/TraceParent.ts";
14
31
 
15
32
  /** Logs older than this are pruned (by mtime) on CLI start. */
16
33
  const MAX_LOG_AGE = Duration.days(7);
17
34
 
18
- /** Same spellings `GlobalFlag.LogLevel` accepts, so the two never disagree. */
35
+ /** The `--log-level` / `ALCHEMY_LOG_LEVEL` spellings. */
19
36
  const logLevelChoices: Record<string, LogLevel.LogLevel> = {
20
37
  all: "All",
21
38
  trace: "Trace",
@@ -29,50 +46,93 @@ const logLevelChoices: Record<string, LogLevel.LogLevel> = {
29
46
  };
30
47
 
31
48
  /**
32
- * The console keeps its usual Info+ noise floor by default; everything below
33
- * it exists only for the run log, so support requests can start with "attach
34
- * the file from ~/.alchemy/logs". An explicit `--log-level` lowers the floor
35
- * for that run so `--log-level debug` actually puts debug records on the
36
- * terminal (#1231) — the run log captures Debug regardless.
37
- *
38
- * Read from argv rather than `GlobalFlag.LogLevel` because the console logger
39
- * is installed while the service layers are built, before the parser has
40
- * produced flag values (same reason `--no-input` is an argv scan). Only the
41
- * segment before a `--` separator is inspected; an unrecognised value falls
42
- * back to Info and is left for the parser to reject.
49
+ * `--log-level`: the lowest level printed on the console. Registered on the
50
+ * CLI root in place of Effect's built-in flag, which also lowers the
51
+ * minimum log level and so would drop records from the run log; the run
52
+ * log records Debug whatever the console shows.
43
53
  */
44
- export const consoleLogFloor = (argv: ReadonlyArray<string>): LogLevel.LogLevel => {
45
- const separator = argv.indexOf("--");
46
- const flagArgs = separator === -1 ? argv : argv.slice(0, separator);
47
- let floor: LogLevel.LogLevel = "Info";
48
- for (let i = 0; i < flagArgs.length; i++) {
49
- const arg = flagArgs[i]!;
50
- const value =
51
- arg === "--log-level"
52
- ? flagArgs[i + 1]
53
- : arg.startsWith("--log-level=")
54
- ? arg.slice("--log-level=".length)
55
- : undefined;
56
- if (value === undefined) continue;
57
- floor = logLevelChoices[value.toLowerCase()] ?? floor;
58
- }
59
- return floor;
60
- };
54
+ export const LogLevelFlag = GlobalFlag.Setting("log-level")({
55
+ flag: Flag.ChoiceWithValue("log-level", Object.entries(logLevelChoices)).pipe(
56
+ Flag.optional,
57
+ Flag.withDescription("Lowest level printed on the console"),
58
+ Flag.withMetavar("<all|trace|debug|info|warn|error|fatal|none>"),
59
+ ),
60
+ });
61
+
62
+ /** How the terminal shows log records. */
63
+ export type LogFormat = "pretty" | "json";
64
+
65
+ /**
66
+ * `--log-format pretty|json`: `json` prints one {@link LogRecord} per line
67
+ * on stderr and leaves rendering to the reader. Registered on the CLI root;
68
+ * the console logger reads the parsed value (see {@link consoleSettings}).
69
+ */
70
+ export const LogFormatFlag = GlobalFlag.Setting("log-format")({
71
+ flag: Flag.Literals("log-format", ["pretty", "json"]).pipe(
72
+ Flag.withDescription("Print log records as text or as JSON lines on stderr"),
73
+ Flag.optional,
74
+ ),
75
+ });
76
+
77
+ /** What the console shows, and how. */
78
+ export interface ConsoleSettings {
79
+ /** Records below this level stay in the run log only. */
80
+ readonly floor: LogLevel.LogLevel;
81
+ readonly format: LogFormat;
82
+ }
83
+
84
+ const flagValue = <A>(context: Context.Context<never>, flag: Context.Key<any, Option.Option<A>>) =>
85
+ Context.getOption(context, flag).pipe(Option.flatten, Option.getOrUndefined);
86
+
87
+ /**
88
+ * The console settings in `context`: the parsed `--log-level` and
89
+ * `--log-format` flags inside a command, and otherwise (before the command
90
+ * line is parsed, or in a child process that never sees it) the `ALCHEMY_LOG_*` environment variables. The console keeps its
91
+ * usual Info+ noise floor by default; the run log captures Debug regardless
92
+ * (#1231).
93
+ */
94
+ export const consoleSettings = (context: Context.Context<never>): ConsoleSettings => ({
95
+ floor:
96
+ flagValue(context, LogLevelFlag) ??
97
+ logLevelChoices[process.env[LOG_LEVEL_ENV]?.toLowerCase() ?? ""] ??
98
+ "Info",
99
+ format:
100
+ (flagValue(context, LogFormatFlag) ?? process.env[LOG_FORMAT_ENV]) === "json"
101
+ ? "json"
102
+ : "pretty",
103
+ });
104
+
105
+ /** The current fiber's {@link consoleSettings}. */
106
+ export const currentConsoleSettings: Effect.Effect<ConsoleSettings> = Effect.map(
107
+ Effect.context<never>(),
108
+ consoleSettings,
109
+ );
110
+
111
+ /** {@link ConsoleSettings} as environment, for a child process that renders the run's logs. */
112
+ export const consoleSettingsEnv = (settings: ConsoleSettings): Record<string, string> => ({
113
+ [LOG_LEVEL_ENV]: settings.floor,
114
+ [LOG_FORMAT_ENV]: settings.format,
115
+ });
116
+
117
+ const jsonSink = jsonLogger((line) => process.stderr.write(`${line}\n`));
118
+ const prettySink = makePlainConsoleSink();
61
119
 
62
- /** Terminal sink: forwards records at or above `floor` to `sink`. */
63
- export const makeConsoleLogger = (
64
- floor: LogLevel.LogLevel,
65
- sink: Logger.Logger<unknown, void> = makePlainConsoleSink(),
66
- ) =>
120
+ /**
121
+ * Terminal sink: forwards records at or above the logging fiber's
122
+ * {@link consoleSettings} floor to `sink`, or to the sink its settings
123
+ * select.
124
+ */
125
+ export const makeConsoleLogger = (sink?: Logger.Logger<unknown, void>) =>
67
126
  Logger.make<unknown, void>((options) => {
68
- if (LogLevel.isGreaterThanOrEqualTo(options.logLevel, floor)) {
69
- sink.log(options);
127
+ const settings = consoleSettings(options.fiber.context);
128
+ if (LogLevel.isGreaterThanOrEqualTo(options.logLevel, settings.floor)) {
129
+ (sink ?? (settings.format === "json" ? jsonSink : prettySink)).log(options);
70
130
  }
71
131
  });
72
132
 
73
133
  /** Shared terminal logger for CLI entrypoints that do not need a run file. */
74
134
  export const ConsoleLogLive = Layer.mergeAll(
75
- Logger.layer([makeConsoleLogger(consoleLogFloor(process.argv.slice(2)))]),
135
+ Logger.layer([makeConsoleLogger()]),
76
136
  Layer.succeed(MinimumLogLevel, "Debug"),
77
137
  );
78
138
 
@@ -80,61 +140,139 @@ export const ConsoleLogLive = Layer.mergeAll(
80
140
  const noopLogger = Logger.make<unknown, void>(() => {});
81
141
 
82
142
  /**
83
- * Debug run log for the whole CLI under `~/.alchemy/logs` (relocated by
84
- * `ALCHEMY_HOME` together with the rest of the auth state). Every run writes
85
- * `{timestamp}-pid{pid}.log` in logfmt at Debug level — profile/auth flows
86
- * and command failures record their full causes there even though the
87
- * terminal only shows the friendly message. Console output stays at Info+
88
- * unless `--log-level` lowers the floor (see {@link consoleLogFloor}).
89
- *
90
- * Commands that install their own loggers with `mergeWithExisting: true`
91
- * compose with this one; a replacing `Logger.layer` scopes it out for that
92
- * subtree only. Best-effort throughout: an unwritable `~/.alchemy` must
93
- * never take the CLI down with it.
143
+ * The run log's file logger alone. The run log is the only log file: the
144
+ * top-level CLI process writes it, and records its children already showed
145
+ * on the terminal (the `alchemy dev` exec child's) go here without being
146
+ * printed again.
94
147
  */
95
- export const GlobalLogLive = Layer.unwrap(
148
+ export const RunLog = Context.Reference<Logger.Logger<unknown, void>>("alchemy/Cli/RunLog", {
149
+ defaultValue: () => noopLogger,
150
+ });
151
+
152
+ /** Delete run logs in `dir` older than {@link MAX_LOG_AGE}. Best-effort. */
153
+ const pruneRunLogs = (dir: string) =>
96
154
  Effect.gen(function* () {
97
155
  const fs = yield* FileSystem.FileSystem;
98
156
  const path = yield* Path;
99
- const dir = path.join(rootDir(), "logs");
100
- yield* fs.makeDirectory(dir, { recursive: true });
101
-
102
- // Prune stale run logs so the directory stays bounded.
103
157
  const now = yield* Clock.currentTimeMillis;
104
158
  const entries = yield* fs.readDirectory(dir).pipe(Effect.orElseSucceed(() => [] as string[]));
159
+ // Only run logs: the directory may hold other tools' logs (the test
160
+ // runner's `test/`).
105
161
  yield* Effect.forEach(
106
- entries,
162
+ entries.filter((entry) => entry.endsWith(".ndjson")),
107
163
  (entry) =>
108
164
  Effect.gen(function* () {
109
165
  const file = path.join(dir, entry);
110
- const info = yield* fs.stat(file);
111
- const mtime = Option.getOrUndefined(info.mtime)?.getTime();
166
+ const mtime = Option.getOrUndefined((yield* fs.stat(file)).mtime)?.getTime();
112
167
  if (mtime !== undefined && now - mtime > Duration.toMillis(MAX_LOG_AGE)) {
113
168
  yield* fs.remove(file);
114
169
  }
115
170
  }).pipe(Effect.ignore),
116
171
  { discard: true },
117
172
  );
173
+ });
174
+
175
+ /**
176
+ * A run log file that is created on its first record, so a run that sends
177
+ * nothing to it leaves nothing behind (and a `profile` command run outside
178
+ * a project never creates a `.alchemy` there). The file starts with a `run`
179
+ * record describing the run, so it reads standalone.
180
+ *
181
+ * A logger is called synchronously but the file is written asynchronously,
182
+ * so the logger only queues each record as a JSON line, and one writer fiber
183
+ * creates the file on the first line and appends the rest. Closing the log
184
+ * ends the queue and waits for the writer, so no queued record is lost.
185
+ *
186
+ * @internal exported for tests.
187
+ */
188
+ export const lazyRunLog = Effect.fn(function* (
189
+ dir: string,
190
+ name: string,
191
+ scope: LogRecord["scope"],
192
+ ) {
193
+ const fs = yield* FileSystem.FileSystem;
194
+ const path = yield* Path;
195
+ const file = path.join(dir, name);
196
+ const lines = yield* Queue.unbounded<string, Cause.Done>();
197
+ const append = (batch: ReadonlyArray<string>) =>
198
+ fs.writeFileString(file, batch.map((line) => `${line}\n`).join(""), { flag: "a" });
199
+ const writer = yield* Effect.gen(function* () {
200
+ const first = yield* Queue.take(lines);
201
+ yield* fs.makeDirectory(dir, { recursive: true });
202
+ yield* pruneRunLogs(dir);
203
+ yield* append([safeStringify(yield* runRecord(scope)), first]);
204
+ return yield* Effect.forever(Effect.flatMap(Queue.takeAll(lines), append));
205
+ }).pipe(
206
+ // The queue ending stops the writer. Any other failure (an unwritable
207
+ // directory) drops the log, never the command: a shut-down queue
208
+ // ignores further records.
209
+ Effect.catchCause(() => Queue.shutdown(lines)),
210
+ Effect.forkDetach,
211
+ );
212
+ yield* Effect.addFinalizer(() => Effect.andThen(Queue.end(lines), Fiber.await(writer)));
213
+ // Formatted now, so a record keeps the annotations it was logged with.
214
+ return Logger.make<unknown, void>((logged) => {
215
+ Queue.offerUnsafe(lines, formatJsonRecord.log(logged));
216
+ });
217
+ });
118
218
 
219
+ /**
220
+ * The two run logs: records scoped `global` (the state store, auth,
221
+ * profiles; see `globalLogs`) go to `~/.alchemy/logs` (relocated by
222
+ * `ALCHEMY_HOME`), everything else to the project's `.alchemy/log`. Every
223
+ * run writes `{timestamp}-pid{pid}.ndjson` (NDJSON log records) at Debug
224
+ * level — failures record their full causes there even though the terminal
225
+ * only shows the friendly message. Console output stays at Info+ unless
226
+ * `--log-level` lowers the floor (see {@link consoleSettings}).
227
+ *
228
+ * Only the top-level CLI process writes them; its children's records reach
229
+ * them through it. Commands that install their own loggers with
230
+ * `mergeWithExisting: true` compose with these; a replacing `Logger.layer`
231
+ * scopes them out for that subtree only.
232
+ */
233
+ export const GlobalLogLive = Layer.unwrap(
234
+ Effect.gen(function* () {
235
+ const path = yield* Path;
119
236
  const stamp = new Date(yield* Clock.currentTimeMillis)
120
237
  .toISOString()
121
238
  .slice(0, 19)
122
239
  .replaceAll(":", "-");
123
- const file = path.join(dir, `${stamp}-pid${process.pid}.log`);
240
+ const name = `${stamp}-pid${process.pid}.ndjson`;
241
+ const global = yield* lazyRunLog(path.join(rootDir(), "logs"), name, "global");
242
+ const project = yield* lazyRunLog(
243
+ path.resolve(yield* dotAlchemyDirectory, "log"),
244
+ name,
245
+ "project",
246
+ );
247
+ const runLog = Logger.make<unknown, void>((options) =>
248
+ (options.fiber.getRef(CurrentLogAnnotations)[LogAnnotation.scope] === "global"
249
+ ? global
250
+ : project
251
+ ).log(options),
252
+ );
124
253
  return Layer.mergeAll(
125
- Logger.layer([
126
- makeConsoleLogger(consoleLogFloor(process.argv.slice(2))),
127
- Logger.formatLogFmt.pipe(
128
- Logger.toFile(file, { flag: "a" }),
129
- Effect.orElseSucceed(() => noopLogger),
130
- ),
131
- ]),
254
+ // Logs stay on this machine: telemetry exports spans and metrics only.
255
+ Logger.layer([makeConsoleLogger(), runLog]),
256
+ Layer.succeed(RunLog, runLog),
132
257
  Layer.succeed(MinimumLogLevel, "Debug"),
133
258
  );
134
259
  }).pipe(Effect.orElseSucceed(() => Layer.empty)),
135
260
  );
136
261
 
137
262
  /** First line of every run log: enough context to read it standalone. */
138
- export const logRunHeader: Effect.Effect<void> = Effect.logDebug(
139
- `alchemy ${packageJson.version} pid=${process.pid} cwd=${process.cwd()} argv=${JSON.stringify(process.argv.slice(2))}`,
140
- );
263
+ const runRecord = (scope: LogRecord["scope"]) =>
264
+ Effect.map(Clock.currentTimeMillis, (time): LogRecord => ({
265
+ time,
266
+ level: "info",
267
+ kind: "run",
268
+ process: "cli",
269
+ scope,
270
+ trace: processTrace,
271
+ attributes: {},
272
+ data: {
273
+ version: packageJson.version,
274
+ pid: process.pid,
275
+ cwd: process.cwd(),
276
+ argv: process.argv.slice(2),
277
+ },
278
+ }));
@@ -3,13 +3,15 @@ import * as Prompt from "effect/cli/Prompt";
3
3
  import * as Clock from "effect/Clock";
4
4
  import * as Effect from "effect/Effect";
5
5
  import * as Layer from "effect/Layer";
6
+ import type * as LogLevel from "effect/LogLevel";
7
+ import type { ApplyEvent, ApplyStatus } from "../Events.ts";
6
8
  import { NonInteractiveTerminal } from "../Interaction.ts";
7
9
  import type { ActionApply, ActionDelete, CRUD, Plan } from "../Plan.ts";
8
10
  import { Cli, type PlanDisplayOptions } from "../Report.ts";
9
- import type { ApplyEvent, ApplyStatus } from "../Report.ts";
10
11
  import { canPromptOnStdin } from "../Util/interactive.ts";
11
12
  import { formatResourceTag } from "../Util/ResourceOutput.ts";
12
- import { ansiFg, colorsEnabled, theme } from "./CliKit/index.ts";
13
+ import { ansiFg, colorsEnabled } from "../Util/Terminal.ts";
14
+ import { theme } from "../Util/Theme.ts";
13
15
  import {
14
16
  actionStyle,
15
17
  applyStatusColor,
@@ -18,6 +20,7 @@ import {
18
20
  import { formatElapsed } from "./Format.ts";
19
21
  import { formatModeNote } from "./ModeTag.ts";
20
22
  import { actionHasPlannedWork, buildPlanSummary } from "./NamespaceTree.ts";
23
+ import { present } from "./Present.ts";
21
24
  import { formatDeclaredPropertyYaml, matchYamlChange, matchYamlKey } from "./PropertyDiff.ts";
22
25
 
23
26
  const ESC = "\x1b[";
@@ -54,6 +57,10 @@ const statusColor = (status: ApplyStatus): ((s: string) => string) => {
54
57
 
55
58
  const tag = formatResourceTag;
56
59
 
60
+ /** A progress line about one resource. */
61
+ const logFor = (fqn: string, message: string, level?: LogLevel.Severity) =>
62
+ present(message, { resource: fqn, level });
63
+
57
64
  /**
58
65
  * In-progress statuses that represent real cloud work. Plain output has no
59
66
  * spinner, so these lines are the liveness signal in CI logs
@@ -190,8 +197,8 @@ export const LoggingCli = Layer.effect(
190
197
  // phase prints as it starts, and the settle line carries the total
191
198
  // planning time (the spinner's implicit "how long did that take").
192
199
  const startedAt = yield* Clock.currentTimeMillis;
193
- if (title !== undefined) yield* Effect.logInfo(bold(title));
194
- yield* Effect.logInfo(dim(label));
200
+ if (title !== undefined) yield* present(bold(title));
201
+ yield* present(dim(label));
195
202
  let closed = false;
196
203
  let lastLabel = label;
197
204
  const write = (nextLabel: string, _nextDetail?: string) =>
@@ -200,7 +207,7 @@ export const LoggingCli = Layer.effect(
200
207
  // carry nothing new for a line-per-change log.
201
208
  if (closed || nextLabel === lastLabel) return Effect.void;
202
209
  lastLabel = nextLabel;
203
- return Effect.logInfo(dim(nextLabel));
210
+ return present(dim(nextLabel));
204
211
  });
205
212
  const finish = (message: string, paint: (s: string) => string) =>
206
213
  Effect.suspend(() => {
@@ -208,7 +215,7 @@ export const LoggingCli = Layer.effect(
208
215
  closed = true;
209
216
  return Clock.currentTimeMillis.pipe(
210
217
  Effect.flatMap((now) =>
211
- Effect.logInfo(`${paint(message)} ${dim(`(${formatElapsed(now - startedAt)})`)}`),
218
+ present(`${paint(message)} ${dim(`(${formatElapsed(now - startedAt)})`)}`),
212
219
  ),
213
220
  );
214
221
  });
@@ -223,7 +230,7 @@ export const LoggingCli = Layer.effect(
223
230
  }),
224
231
  approvePlan: (plan, options) =>
225
232
  Effect.gen(function* () {
226
- for (const line of formatPlanLines(plan, options)) yield* Effect.logInfo(line);
233
+ for (const line of formatPlanLines(plan, options)) yield* present(line);
227
234
  if (canPromptOnStdin()) {
228
235
  return yield* confirm(
229
236
  plan.destroy === true
@@ -239,12 +246,12 @@ export const LoggingCli = Layer.effect(
239
246
  }),
240
247
  displayPlan: (plan, options) =>
241
248
  Effect.gen(function* () {
242
- for (const line of formatPlanLines(plan, options)) yield* Effect.logInfo(line);
249
+ for (const line of formatPlanLines(plan, options)) yield* present(line);
243
250
  }),
244
251
  startApplySession: (plan, options) =>
245
252
  Effect.gen(function* () {
246
- for (const line of formatPlanLines(plan, options)) yield* Effect.logInfo(line);
247
- yield* Effect.logInfo("");
253
+ for (const line of formatPlanLines(plan, options)) yield* present(line);
254
+ yield* present("");
248
255
 
249
256
  const startedAt = yield* Clock.currentTimeMillis;
250
257
  const started = new Map<string, number>();
@@ -252,15 +259,15 @@ export const LoggingCli = Layer.effect(
252
259
  const notes = new Map<string, string>();
253
260
  const statusNotes = new Map<string, string>();
254
261
  return {
255
- setOutput: (value: unknown) => Effect.logInfo(inspect(value, { colors: false })),
256
- // Progress is an Effect log record, just like provider and build
257
- // diagnostics, so the append-only renderer gives every line the
258
- // same timestamp / level / fiber prefix.
262
+ setOutput: (value: unknown) => present(inspect(value, { colors: false })),
263
+ // Presents the apply events (which are already log records) as
264
+ // lines shaped like log lines, so the plain output reads as one
265
+ // stream.
259
266
  emit: (event: ApplyEvent) =>
260
267
  Clock.currentTimeMillis.pipe(
261
268
  Effect.flatMap((now) =>
262
269
  Effect.suspend(() => {
263
- if (event._tag === "apply.resource.note") {
270
+ if (event.type === "apply.resource.note") {
264
271
  // `status` notes only surface as the settle line's suffix;
265
272
  // everything else streams, deduping consecutive repeats.
266
273
  if (event.kind === "status") {
@@ -269,7 +276,7 @@ export const LoggingCli = Layer.effect(
269
276
  }
270
277
  if (notes.get(event.fqn) === event.message) return Effect.void;
271
278
  notes.set(event.fqn, event.message);
272
- return Effect.logInfo(`${tag(event.fqn)} ${blue(event.message)}`);
279
+ return logFor(event.fqn, blue(event.message));
273
280
  }
274
281
  const id = event.fqn;
275
282
  const mode = modeSuffix({
@@ -280,7 +287,7 @@ export const LoggingCli = Layer.effect(
280
287
  if (!isTerminal(event.status)) {
281
288
  if (!isActive(event.status)) return Effect.void;
282
289
  if (!started.has(id)) started.set(id, now);
283
- return Effect.logInfo(`${tag(id)} ${dim(event.status)}${mode}`);
290
+ return logFor(id, `${dim(event.status)}${mode}`);
284
291
  }
285
292
  terminal.set(id, event.status);
286
293
  const status = statusColor(event.status)(event.status);
@@ -294,7 +301,13 @@ export const LoggingCli = Layer.effect(
294
301
  const msg = message
295
302
  ? ` ${dim("—")} ${event.status === "fail" ? red(message) : message}`
296
303
  : "";
297
- return Effect.logInfo(`${tag(id)} ${status}${mode}${msg}${took}`);
304
+ // At the level `emit` gives the event, so `--log-level error`
305
+ // still shows a failed resource.
306
+ return logFor(
307
+ id,
308
+ `${status}${mode}${msg}${took}`,
309
+ event.status === "fail" ? "Error" : undefined,
310
+ );
298
311
  }),
299
312
  ),
300
313
  ),
@@ -308,9 +321,9 @@ export const LoggingCli = Layer.effect(
308
321
  const parts = [green(`${succeeded} succeeded`)];
309
322
  if (failed) parts.push(red(`${failed} failed`));
310
323
  if (skipped) parts.push(dim(`${skipped} skipped`));
311
- return Effect.logInfo("").pipe(
324
+ return present("").pipe(
312
325
  Effect.andThen(
313
- Effect.logInfo(
326
+ present(
314
327
  `${bold(outcome === "success" ? "Done:" : "Failed:")} ${parts.join(dim(", "))} ${dim(`(${formatElapsed(now - startedAt)})`)}`,
315
328
  ),
316
329
  ),
@@ -64,7 +64,10 @@ export const plainCliFormatter = (options: { columns: number }): CliOutput.Forma
64
64
  const columns = Math.max(60, Math.min(options.columns, 120));
65
65
  const fallback = CliOutput.defaultFormatter({ colors: false });
66
66
  return {
67
- ...fallback,
67
+ formatCliError: fallback.formatCliError,
68
+ formatError: fallback.formatError,
69
+ formatErrors: fallback.formatErrors,
70
+ formatVersion: fallback.formatVersion,
68
71
  formatHelpDoc: (doc) => wrapLines(fallback.formatHelpDoc(compactDoc(doc)), columns),
69
72
  };
70
73
  };
@@ -0,0 +1,34 @@
1
+ import * as Clock from "effect/Clock";
2
+ import * as Console from "effect/Console";
3
+ import * as Effect from "effect/Effect";
4
+ import * as LogLevel from "effect/LogLevel";
5
+ import { prettyLine } from "../Util/ConsoleSink.ts";
6
+ import { currentConsoleSettings } from "./GlobalLog.ts";
7
+
8
+ /**
9
+ * Print one line of plain renderer output: what the TUI would draw, for a
10
+ * terminal without it. Renderers present events, they don't log them —
11
+ * the events are already log records — so this writes to the console only,
12
+ * prints nothing under `--log-format json`, where the records are the
13
+ * output, and honors the console's `--log-level` floor like log lines do.
14
+ */
15
+ export const present = (
16
+ text: string,
17
+ options: { readonly resource?: string; readonly level?: LogLevel.Severity } = {},
18
+ ): Effect.Effect<void> =>
19
+ Effect.flatMap(currentConsoleSettings, ({ format, floor }) =>
20
+ format === "json" || !LogLevel.isGreaterThanOrEqualTo(options.level ?? "Info", floor)
21
+ ? Effect.void
22
+ : Clock.currentTimeMillis.pipe(
23
+ Effect.flatMap((now) =>
24
+ Console.log(
25
+ prettyLine({
26
+ date: new Date(now),
27
+ level: options.level ?? "Info",
28
+ text,
29
+ resource: options.resource,
30
+ }),
31
+ ),
32
+ ),
33
+ ),
34
+ );
@@ -0,0 +1,75 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Layer from "effect/Layer";
3
+ import * as Interaction from "../Interaction.ts";
4
+ import type { Plan } from "../Plan.ts";
5
+ import { Cli, type PlanDisplayOptions } from "../Report.ts";
6
+ import { renderApply } from "../Report.ts";
7
+ import { PlatformServices } from "../Util/PlatformServices.ts";
8
+ import { renderPlanning } from "./commands/render.ts";
9
+ import { renderNukeDelete, renderNukeScan, reviewNuke } from "./components/view/Nuke.tsx";
10
+ import { stackOutputsView } from "./components/view/StackOutputs.tsx";
11
+ import { selectCliServices } from "./selectCli.ts";
12
+
13
+ /**
14
+ * The CLI's terminal UI for scripts that drive `alchemy/Alchemist`
15
+ * themselves: the Sigil UI on an interactive terminal, plain log lines
16
+ * otherwise, exactly like the CLI.
17
+ *
18
+ * ```ts
19
+ * const plan = yield* Alchemist.plan({ stack, operation: "deploy", stage }).pipe(
20
+ * SigilRenderer.planning({ operation: "Deploy", stage }),
21
+ * );
22
+ * if (!(yield* SigilRenderer.approve(plan, { stage }))) return;
23
+ * const output = yield* Alchemist.apply(plan).pipe(SigilRenderer.apply(plan, { stage }));
24
+ * yield* SigilRenderer.outputs(output);
25
+ * ```
26
+ */
27
+
28
+ /** A deploy or destroy plan, or a drift scan, from `alchemy/Alchemist`. */
29
+ export interface RenderablePlan {
30
+ readonly native: Plan;
31
+ }
32
+
33
+ /**
34
+ * The CLI's terminal and renderer services, in place of `Alchemist.layer()`'s
35
+ * non-interactive terminal. Provide it after `Alchemist.layer()`:
36
+ * `Effect.provide([Alchemist.layer(), SigilRenderer.layer()])`.
37
+ */
38
+ export const layer = () =>
39
+ Layer.provideMerge(selectCliServices(), Interaction.layer()).pipe(
40
+ Layer.provide(PlatformServices),
41
+ );
42
+
43
+ /** Planning progress (import, services, state, per-resource diffing) around a `plan` call. */
44
+ export const planning = renderPlanning;
45
+
46
+ /**
47
+ * Show the plan and ask to apply it; `true` when approved. Fails with
48
+ * `NonInteractiveTerminal` when there is no terminal to ask on.
49
+ */
50
+ export const approve = (plan: RenderablePlan, options?: PlanDisplayOptions) =>
51
+ Effect.flatMap(Cli, (cli) => cli.approvePlan(plan.native, options));
52
+
53
+ /** Show the plan without asking, as `alchemy plan` does. */
54
+ export const display = (plan: RenderablePlan, options?: PlanDisplayOptions) =>
55
+ Effect.flatMap(Cli, (cli) => cli.displayPlan(plan.native, options));
56
+
57
+ /** Per-resource apply rows around an `apply` call. */
58
+ export const apply = (plan: RenderablePlan, options?: PlanDisplayOptions) =>
59
+ renderApply(plan.native, options);
60
+
61
+ /** Print a deployed stack's outputs. */
62
+ export const outputs = (output: unknown) =>
63
+ Effect.flatMap(Interaction.Interaction, (terminal) =>
64
+ terminal.output.print(stackOutputsView(output)),
65
+ );
66
+
67
+ /** `alchemy unsafe nuke`'s scan progress, review prompt and deletion view. */
68
+ export const Nuke = {
69
+ /** Live scan progress around `Alchemist.Nuke.scan`. */
70
+ scan: renderNukeScan,
71
+ /** Show the inventory and ask to delete it; `true` when approved (or `yes`/`dryRun`). */
72
+ review: reviewNuke,
73
+ /** Per-resource deletion rows around `Alchemist.Nuke.execute`. */
74
+ delete: renderNukeDelete,
75
+ };