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.
- package/THIRD_PARTY_LICENSES.md +2 -2
- package/bin/cli.js +14 -6
- package/bin/register-oxc.js +16 -12
- package/lib/AdoptPolicy.d.ts +73 -0
- package/lib/AdoptPolicy.d.ts.map +1 -1
- package/lib/AdoptPolicy.js +54 -0
- package/lib/AdoptPolicy.js.map +1 -1
- package/lib/Alchemist/AuthRegistry.d.ts +31 -0
- package/lib/Alchemist/AuthRegistry.d.ts.map +1 -0
- package/lib/Alchemist/AuthRegistry.js +95 -0
- package/lib/Alchemist/AuthRegistry.js.map +1 -0
- package/lib/Alchemist/Drift.d.ts +70 -0
- package/lib/Alchemist/Drift.d.ts.map +1 -0
- package/lib/Alchemist/Drift.js +54 -0
- package/lib/Alchemist/Drift.js.map +1 -0
- package/lib/Alchemist/Entrypoint.d.ts +27 -3
- package/lib/Alchemist/Entrypoint.d.ts.map +1 -1
- package/lib/Alchemist/Entrypoint.js +34 -3
- package/lib/Alchemist/Entrypoint.js.map +1 -1
- package/lib/Alchemist/Errors.d.ts +1 -1
- package/lib/Alchemist/Errors.d.ts.map +1 -1
- package/lib/Alchemist/Errors.js +1 -1
- package/lib/Alchemist/Errors.js.map +1 -1
- package/lib/Alchemist/Logs.d.ts +46 -0
- package/lib/Alchemist/Logs.d.ts.map +1 -0
- package/lib/Alchemist/{routes/logs.js → Logs.js} +21 -26
- package/lib/Alchemist/Logs.js.map +1 -0
- package/lib/Alchemist/Nuke.d.ts +69 -0
- package/lib/Alchemist/Nuke.d.ts.map +1 -0
- package/lib/Alchemist/Nuke.js +35 -0
- package/lib/Alchemist/Nuke.js.map +1 -0
- package/lib/Alchemist/Operations.d.ts +168 -0
- package/lib/Alchemist/Operations.d.ts.map +1 -0
- package/lib/Alchemist/Operations.js +165 -0
- package/lib/Alchemist/Operations.js.map +1 -0
- package/lib/Alchemist/Profile.d.ts +132 -0
- package/lib/Alchemist/Profile.d.ts.map +1 -0
- package/lib/Alchemist/{routes/profile.js → Profile.js} +20 -21
- package/lib/Alchemist/Profile.js.map +1 -0
- package/lib/Alchemist/{routes/provider.d.ts → Provider.d.ts} +4 -4
- package/lib/Alchemist/Provider.d.ts.map +1 -0
- package/lib/Alchemist/{routes/provider.js → Provider.js} +7 -6
- package/lib/Alchemist/Provider.js.map +1 -0
- package/lib/Alchemist/Runtime.d.ts +10 -6
- package/lib/Alchemist/Runtime.d.ts.map +1 -1
- package/lib/Alchemist/Runtime.js +38 -2
- package/lib/Alchemist/Runtime.js.map +1 -1
- package/lib/Alchemist/{routes/state.d.ts → State.d.ts} +36 -16
- package/lib/Alchemist/State.d.ts.map +1 -0
- package/lib/Alchemist/{routes/state.js → State.js} +50 -15
- package/lib/Alchemist/State.js.map +1 -0
- package/lib/Alchemist/index.d.ts +11 -10
- package/lib/Alchemist/index.d.ts.map +1 -1
- package/lib/Alchemist/index.js +10 -9
- package/lib/Alchemist/index.js.map +1 -1
- package/lib/Apply.d.ts +2 -8
- package/lib/Apply.d.ts.map +1 -1
- package/lib/Apply.js +364 -184
- package/lib/Apply.js.map +1 -1
- package/lib/Auth/AuthProvider.d.ts +24 -11
- package/lib/Auth/AuthProvider.d.ts.map +1 -1
- package/lib/Auth/AuthProvider.js +28 -12
- package/lib/Auth/AuthProvider.js.map +1 -1
- package/lib/Auth/BrowserOAuth.d.ts +6 -8
- package/lib/Auth/BrowserOAuth.d.ts.map +1 -1
- package/lib/Auth/BrowserOAuth.js +25 -41
- package/lib/Auth/BrowserOAuth.js.map +1 -1
- package/lib/Auth/Credentials.d.ts.map +1 -1
- package/lib/Auth/Credentials.js +2 -2
- package/lib/Auth/Credentials.js.map +1 -1
- package/lib/Auth/Demand.d.ts +4 -4
- package/lib/Auth/Demand.d.ts.map +1 -1
- package/lib/Auth/Demand.js +16 -10
- package/lib/Auth/Demand.js.map +1 -1
- package/lib/Auth/Env.d.ts +2 -1
- package/lib/Auth/Env.d.ts.map +1 -1
- package/lib/Auth/Env.js +4 -2
- package/lib/Auth/Env.js.map +1 -1
- package/lib/Auth/Inspect.d.ts +2 -2
- package/lib/Auth/Inspect.d.ts.map +1 -1
- package/lib/Auth/Inspect.js +3 -1
- package/lib/Auth/Inspect.js.map +1 -1
- package/lib/Auth/Lock.d.ts.map +1 -1
- package/lib/Auth/Lock.js +4 -8
- package/lib/Auth/Lock.js.map +1 -1
- package/lib/Auth/OAuthFlow.d.ts +3 -12
- package/lib/Auth/OAuthFlow.d.ts.map +1 -1
- package/lib/Auth/OAuthFlow.js +7 -17
- package/lib/Auth/OAuthFlow.js.map +1 -1
- package/lib/Auth/Paths.d.ts +2 -1
- package/lib/Auth/Paths.d.ts.map +1 -1
- package/lib/Auth/Paths.js +3 -2
- package/lib/Auth/Paths.js.map +1 -1
- package/lib/Auth/Profile.d.ts +10 -0
- package/lib/Auth/Profile.d.ts.map +1 -1
- package/lib/Auth/Profile.js +19 -2
- package/lib/Auth/Profile.js.map +1 -1
- package/lib/Auth/Registry.d.ts +20 -0
- package/lib/Auth/Registry.d.ts.map +1 -0
- package/lib/Auth/Registry.js +17 -0
- package/lib/Auth/Registry.js.map +1 -0
- package/lib/Auth/Resolve.d.ts +34 -2
- package/lib/Auth/Resolve.d.ts.map +1 -1
- package/lib/Auth/Resolve.js +51 -3
- package/lib/Auth/Resolve.js.map +1 -1
- package/lib/Auth/StoredAuthProvider.d.ts +1 -1
- package/lib/Auth/StoredAuthProvider.d.ts.map +1 -1
- package/lib/Auth/StoredAuthProvider.js +1 -2
- package/lib/Auth/StoredAuthProvider.js.map +1 -1
- package/lib/Binding.d.ts.map +1 -1
- package/lib/Binding.js +3 -1
- package/lib/Binding.js.map +1 -1
- package/lib/Bundle/Bundle.d.ts +5 -0
- package/lib/Bundle/Bundle.d.ts.map +1 -1
- package/lib/Bundle/Bundle.js +36 -6
- package/lib/Bundle/Bundle.js.map +1 -1
- package/lib/Bundle/NamespaceImportPlugin.d.ts +55 -0
- package/lib/Bundle/NamespaceImportPlugin.d.ts.map +1 -0
- package/lib/Bundle/NamespaceImportPlugin.js +226 -0
- package/lib/Bundle/NamespaceImportPlugin.js.map +1 -0
- package/lib/Bundle/index.d.ts +1 -0
- package/lib/Bundle/index.d.ts.map +1 -1
- package/lib/Bundle/index.js +1 -0
- package/lib/Bundle/index.js.map +1 -1
- package/lib/Cli/Format.d.ts.map +1 -1
- package/lib/Cli/Format.js +2 -1
- package/lib/Cli/Format.js.map +1 -1
- package/lib/Cli/GlobalLog.d.ts +72 -26
- package/lib/Cli/GlobalLog.d.ts.map +1 -1
- package/lib/Cli/GlobalLog.js +151 -59
- package/lib/Cli/GlobalLog.js.map +1 -1
- package/lib/Cli/LoggingCli.d.ts.map +1 -1
- package/lib/Cli/LoggingCli.js +24 -18
- package/lib/Cli/LoggingCli.js.map +1 -1
- package/lib/Cli/PlainCliFormatter.d.ts.map +1 -1
- package/lib/Cli/PlainCliFormatter.js +4 -1
- package/lib/Cli/PlainCliFormatter.js.map +1 -1
- package/lib/Cli/Present.d.ts +14 -0
- package/lib/Cli/Present.d.ts.map +1 -0
- package/lib/Cli/Present.js +22 -0
- package/lib/Cli/Present.js.map +1 -0
- package/lib/Cli/SigilRenderer.d.ts +58 -0
- package/lib/Cli/SigilRenderer.d.ts.map +1 -0
- package/lib/Cli/SigilRenderer.js +39 -0
- package/lib/Cli/SigilRenderer.js.map +1 -0
- package/lib/Cli/checkVersion.d.ts +11 -14
- package/lib/Cli/checkVersion.d.ts.map +1 -1
- package/lib/Cli/checkVersion.js +19 -77
- package/lib/Cli/checkVersion.js.map +1 -1
- package/lib/Cli/commands/confirm.d.ts +2 -2
- package/lib/Cli/commands/confirm.d.ts.map +1 -1
- package/lib/Cli/commands/confirm.js +3 -3
- package/lib/Cli/commands/confirm.js.map +1 -1
- package/lib/Cli/commands/deploy.d.ts +4 -4
- package/lib/Cli/commands/deploy.d.ts.map +1 -1
- package/lib/Cli/commands/deploy.js +40 -39
- package/lib/Cli/commands/deploy.js.map +1 -1
- package/lib/Cli/commands/dev.d.ts.map +1 -1
- package/lib/Cli/commands/dev.js +41 -3
- package/lib/Cli/commands/dev.js.map +1 -1
- package/lib/Cli/commands/drift.d.ts +2 -2
- package/lib/Cli/commands/drift.d.ts.map +1 -1
- package/lib/Cli/commands/drift.js +14 -13
- package/lib/Cli/commands/drift.js.map +1 -1
- package/lib/Cli/commands/errors.d.ts.map +1 -1
- package/lib/Cli/commands/errors.js +2 -1
- package/lib/Cli/commands/errors.js.map +1 -1
- package/lib/Cli/commands/instrument.d.ts +15 -5
- package/lib/Cli/commands/instrument.d.ts.map +1 -1
- package/lib/Cli/commands/instrument.js +33 -8
- package/lib/Cli/commands/instrument.js.map +1 -1
- package/lib/Cli/commands/logs.d.ts +1 -1
- package/lib/Cli/commands/logs.d.ts.map +1 -1
- package/lib/Cli/commands/logs.js +22 -22
- package/lib/Cli/commands/logs.js.map +1 -1
- package/lib/Cli/commands/nuke.d.ts +3 -2
- package/lib/Cli/commands/nuke.d.ts.map +1 -1
- package/lib/Cli/commands/nuke.js +19 -17
- package/lib/Cli/commands/nuke.js.map +1 -1
- package/lib/Cli/commands/profile/commands.d.ts +3 -2
- package/lib/Cli/commands/profile/commands.d.ts.map +1 -1
- package/lib/Cli/commands/profile/commands.js +26 -27
- package/lib/Cli/commands/profile/commands.js.map +1 -1
- package/lib/Cli/commands/profile/flows.d.ts +6 -5
- package/lib/Cli/commands/profile/flows.d.ts.map +1 -1
- package/lib/Cli/commands/profile/flows.js +19 -17
- package/lib/Cli/commands/profile/flows.js.map +1 -1
- package/lib/Cli/commands/profile/hub.d.ts +1 -2
- package/lib/Cli/commands/profile/hub.d.ts.map +1 -1
- package/lib/Cli/commands/profile/hub.js +15 -17
- package/lib/Cli/commands/profile/hub.js.map +1 -1
- package/lib/Cli/commands/provider.d.ts +3 -1
- package/lib/Cli/commands/provider.d.ts.map +1 -1
- package/lib/Cli/commands/provider.js +4 -4
- package/lib/Cli/commands/provider.js.map +1 -1
- package/lib/Cli/commands/render.d.ts +2 -4
- package/lib/Cli/commands/render.d.ts.map +1 -1
- package/lib/Cli/commands/render.js +33 -56
- package/lib/Cli/commands/render.js.map +1 -1
- package/lib/Cli/commands/state.d.ts +1 -2
- package/lib/Cli/commands/state.d.ts.map +1 -1
- package/lib/Cli/commands/state.js +74 -27
- package/lib/Cli/commands/state.js.map +1 -1
- package/lib/Cli/components/capabilities.d.ts +4 -0
- package/lib/Cli/components/capabilities.d.ts.map +1 -0
- package/lib/Cli/components/capabilities.js +18 -0
- package/lib/Cli/components/capabilities.js.map +1 -0
- package/lib/Cli/components/types.d.ts +2 -81
- package/lib/Cli/components/types.d.ts.map +1 -1
- package/lib/Cli/components/types.js +1 -3
- package/lib/Cli/components/types.js.map +1 -1
- package/lib/Cli/components/ui/Environment.d.ts +3 -3
- package/lib/Cli/components/ui/Environment.d.ts.map +1 -1
- package/lib/Cli/components/ui/Environment.js.map +1 -1
- package/lib/Cli/components/ui/Interactive.d.ts +17 -4
- package/lib/Cli/components/ui/Interactive.d.ts.map +1 -1
- package/lib/Cli/components/ui/Interactive.js +7 -11
- package/lib/Cli/components/ui/Interactive.js.map +1 -1
- package/lib/Cli/components/ui/Layout.d.ts +1 -1
- package/lib/Cli/components/ui/Layout.d.ts.map +1 -1
- package/lib/Cli/components/ui/Layout.js +1 -1
- package/lib/Cli/components/ui/Layout.js.map +1 -1
- package/lib/Cli/components/ui/Typography.d.ts +1 -1
- package/lib/Cli/components/ui/Typography.d.ts.map +1 -1
- package/lib/Cli/components/ui/Typography.js +1 -1
- package/lib/Cli/components/ui/Typography.js.map +1 -1
- package/lib/Cli/components/ui/index.d.ts +2 -2
- package/lib/Cli/components/ui/index.js +2 -2
- package/lib/Cli/components/view/ApprovePlan.d.ts +1 -1
- package/lib/Cli/components/view/ApprovePlan.d.ts.map +1 -1
- package/lib/Cli/components/view/ApprovePlan.js +2 -1
- package/lib/Cli/components/view/ApprovePlan.js.map +1 -1
- package/lib/Cli/components/view/Format.d.ts +5 -0
- package/lib/Cli/components/view/Format.d.ts.map +1 -0
- package/lib/Cli/components/view/Format.js +39 -0
- package/lib/Cli/components/view/Format.js.map +1 -0
- package/lib/Cli/components/view/Help.d.ts +2 -2
- package/lib/Cli/components/view/Help.d.ts.map +1 -1
- package/lib/Cli/components/view/Help.js +7 -5
- package/lib/Cli/components/view/Help.js.map +1 -1
- package/lib/Cli/components/view/Logo.js +1 -1
- package/lib/Cli/components/view/Logo.js.map +1 -1
- package/lib/Cli/components/view/Nuke.d.ts +8 -9
- package/lib/Cli/components/view/Nuke.d.ts.map +1 -1
- package/lib/Cli/components/view/Nuke.js +49 -52
- package/lib/Cli/components/view/Nuke.js.map +1 -1
- package/lib/Cli/components/view/PlanDecision.d.ts +1 -1
- package/lib/Cli/components/view/PlanDecision.d.ts.map +1 -1
- package/lib/Cli/components/view/PlanDecision.js +1 -1
- package/lib/Cli/components/view/PlanDecision.js.map +1 -1
- package/lib/Cli/components/view/PlanRow.js +1 -1
- package/lib/Cli/components/view/PlanRow.js.map +1 -1
- package/lib/Cli/components/view/PlanTree.d.ts +1 -1
- package/lib/Cli/components/view/PlanTree.d.ts.map +1 -1
- package/lib/Cli/components/view/PlanTree.js +1 -1
- package/lib/Cli/components/view/PlanView.js +1 -1
- package/lib/Cli/components/view/PlanView.js.map +1 -1
- package/lib/Cli/components/view/Profile.d.ts +1 -1
- package/lib/Cli/components/view/Profile.js +2 -2
- package/lib/Cli/components/view/Profile.js.map +1 -1
- package/lib/Cli/components/view/ProfileDashboard.d.ts +4 -4
- package/lib/Cli/components/view/ProfileDashboard.d.ts.map +1 -1
- package/lib/Cli/components/view/ProfileDashboard.js +9 -8
- package/lib/Cli/components/view/ProfileDashboard.js.map +1 -1
- package/lib/Cli/components/view/Prompts.d.ts +3 -3
- package/lib/Cli/components/view/Prompts.d.ts.map +1 -1
- package/lib/Cli/components/view/Prompts.js +11 -18
- package/lib/Cli/components/view/Prompts.js.map +1 -1
- package/lib/Cli/components/view/Runtime.d.ts +5 -5
- package/lib/Cli/components/view/Runtime.d.ts.map +1 -1
- package/lib/Cli/components/view/Runtime.js +136 -219
- package/lib/Cli/components/view/Runtime.js.map +1 -1
- package/lib/Cli/components/view/SigilCli.d.ts +2 -2
- package/lib/Cli/components/view/SigilCli.d.ts.map +1 -1
- package/lib/Cli/components/view/SigilCli.js +7 -7
- package/lib/Cli/components/view/SigilCli.js.map +1 -1
- package/lib/Cli/components/view/StateExplorer.d.ts +1 -1
- package/lib/Cli/components/view/StateExplorer.d.ts.map +1 -1
- package/lib/Cli/components/view/StateExplorer.js +2 -1
- package/lib/Cli/components/view/StateExplorer.js.map +1 -1
- package/lib/Cli/components/view/statusStyle.d.ts +2 -2
- package/lib/Cli/components/view/statusStyle.d.ts.map +1 -1
- package/lib/Cli/components/view/statusStyle.js +1 -1
- package/lib/Cli/components/view/statusStyle.js.map +1 -1
- package/lib/Cli/exec.d.ts +6 -1
- package/lib/Cli/exec.d.ts.map +1 -1
- package/lib/Cli/exec.js +29 -34
- package/lib/Cli/exec.js.map +1 -1
- package/lib/Cli/main.d.ts.map +1 -1
- package/lib/Cli/main.js +35 -26
- package/lib/Cli/main.js.map +1 -1
- package/lib/Cli/selectCli.d.ts +2 -2
- package/lib/Cli/selectCli.d.ts.map +1 -1
- package/lib/Cli/selectCli.js +2 -2
- package/lib/Cli/selectCli.js.map +1 -1
- package/lib/Command/Command.js +1 -1
- package/lib/Command/Command.js.map +1 -1
- package/lib/Command/Dev.d.ts +58 -4
- package/lib/Command/Dev.d.ts.map +1 -1
- package/lib/Command/Dev.js +87 -30
- package/lib/Command/Dev.js.map +1 -1
- package/lib/Command/Local.d.ts +1 -1
- package/lib/Command/Memo.js +1 -1
- package/lib/Command/Memo.js.map +1 -1
- package/lib/Command/Providers.d.ts +1 -1
- package/lib/Command/Providers.d.ts.map +1 -1
- package/lib/Contributions.d.ts +2 -3
- package/lib/Contributions.d.ts.map +1 -1
- package/lib/Contributions.js +38 -6
- package/lib/Contributions.js.map +1 -1
- package/lib/DNS/Adapter.d.ts +204 -0
- package/lib/DNS/Adapter.d.ts.map +1 -0
- package/lib/DNS/Adapter.js +112 -0
- package/lib/DNS/Adapter.js.map +1 -0
- package/lib/DNS/index.d.ts +2 -0
- package/lib/DNS/index.d.ts.map +1 -0
- package/lib/DNS/index.js +2 -0
- package/lib/DNS/index.js.map +1 -0
- package/lib/Deploy.d.ts +7 -2
- package/lib/Deploy.d.ts.map +1 -1
- package/lib/Deploy.js +8 -3
- package/lib/Deploy.js.map +1 -1
- package/lib/Destroy.d.ts +5 -8
- package/lib/Destroy.d.ts.map +1 -1
- package/lib/Destroy.js +10 -7
- package/lib/Destroy.js.map +1 -1
- package/lib/Diff.d.ts.map +1 -1
- package/lib/Diff.js +14 -4
- package/lib/Diff.js.map +1 -1
- package/lib/Drift.d.ts +7 -7
- package/lib/Drift.d.ts.map +1 -1
- package/lib/Drift.js +184 -101
- package/lib/Drift.js.map +1 -1
- package/lib/EvalStack.d.ts +23 -0
- package/lib/EvalStack.d.ts.map +1 -0
- package/lib/EvalStack.js +47 -0
- package/lib/EvalStack.js.map +1 -0
- package/lib/Events.d.ts +210 -0
- package/lib/Events.d.ts.map +1 -0
- package/lib/Events.js +244 -0
- package/lib/Events.js.map +1 -0
- package/lib/Interaction.d.ts +159 -48
- package/lib/Interaction.d.ts.map +1 -1
- package/lib/Interaction.js +139 -58
- package/lib/Interaction.js.map +1 -1
- package/lib/Local/LocalProvider.d.ts.map +1 -1
- package/lib/Local/LocalProvider.js +31 -9
- package/lib/Local/LocalProvider.js.map +1 -1
- package/lib/Local/RpcProvider.d.ts.map +1 -1
- package/lib/Local/RpcProvider.js +10 -1
- package/lib/Local/RpcProvider.js.map +1 -1
- package/lib/Local/RpcProviderProxy.d.ts +16 -0
- package/lib/Local/RpcProviderProxy.d.ts.map +1 -1
- package/lib/Local/RpcProviderProxy.js +19 -10
- package/lib/Local/RpcProviderProxy.js.map +1 -1
- package/lib/Local/RpcSerialization.d.ts +3 -2
- package/lib/Local/RpcSerialization.d.ts.map +1 -1
- package/lib/Local/RpcSerialization.js +13 -10
- package/lib/Local/RpcSerialization.js.map +1 -1
- package/lib/Local/RpcServer.d.ts +2 -1
- package/lib/Local/RpcServer.d.ts.map +1 -1
- package/lib/Local/RpcServer.js +19 -14
- package/lib/Local/RpcServer.js.map +1 -1
- package/lib/Local/RpcServerBun.d.ts.map +1 -1
- package/lib/Local/RpcServerBun.js +8 -4
- package/lib/Local/RpcServerBun.js.map +1 -1
- package/lib/Local/RpcServerEnvironment.d.ts +2 -3
- package/lib/Local/RpcServerEnvironment.d.ts.map +1 -1
- package/lib/Local/RpcServerEnvironment.js +2 -2
- package/lib/Local/RpcServerEnvironment.js.map +1 -1
- package/lib/Local/RpcServerNode.d.ts.map +1 -1
- package/lib/Local/RpcServerNode.js +5 -1
- package/lib/Local/RpcServerNode.js.map +1 -1
- package/lib/Local/RpcServerSession.d.ts +1 -1
- package/lib/Local/RpcServerSession.d.ts.map +1 -1
- package/lib/Local/RpcServerSession.js.map +1 -1
- package/lib/Local/RpcSpawner.d.ts +6 -8
- package/lib/Local/RpcSpawner.d.ts.map +1 -1
- package/lib/Local/RpcSpawner.js +45 -36
- package/lib/Local/RpcSpawner.js.map +1 -1
- package/lib/Local/Sidecar.d.ts +23 -0
- package/lib/Local/Sidecar.d.ts.map +1 -1
- package/lib/Local/Sidecar.js +14 -9
- package/lib/Local/Sidecar.js.map +1 -1
- package/lib/Nuke.d.ts +5 -23
- package/lib/Nuke.d.ts.map +1 -1
- package/lib/Nuke.js +48 -13
- package/lib/Nuke.js.map +1 -1
- package/lib/Output.d.ts +19 -1
- package/lib/Output.d.ts.map +1 -1
- package/lib/Output.js +96 -3
- package/lib/Output.js.map +1 -1
- package/lib/Plan.d.ts +5 -1
- package/lib/Plan.d.ts.map +1 -1
- package/lib/Plan.js +111 -33
- package/lib/Plan.js.map +1 -1
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js +31 -7
- package/lib/Platform.js.map +1 -1
- package/lib/Provider.d.ts +45 -0
- package/lib/Provider.d.ts.map +1 -1
- package/lib/Provider.js +2 -2
- package/lib/Provider.js.map +1 -1
- package/lib/Report.d.ts +17 -195
- package/lib/Report.d.ts.map +1 -1
- package/lib/Report.js +39 -12
- package/lib/Report.js.map +1 -1
- package/lib/Runtime/ManagedHttpShutdown.d.ts +17 -0
- package/lib/Runtime/ManagedHttpShutdown.d.ts.map +1 -1
- package/lib/Runtime/ManagedHttpShutdown.js +11 -2
- package/lib/Runtime/ManagedHttpShutdown.js.map +1 -1
- package/lib/RuntimeContext.js +1 -1
- package/lib/RuntimeContext.js.map +1 -1
- package/lib/Stack.d.ts +49 -29
- package/lib/Stack.d.ts.map +1 -1
- package/lib/Stack.js +25 -31
- package/lib/Stack.js.map +1 -1
- package/lib/State/BucketState.d.ts.map +1 -1
- package/lib/State/BucketState.js +43 -14
- package/lib/State/BucketState.js.map +1 -1
- package/lib/State/LocalState.d.ts.map +1 -1
- package/lib/State/LocalState.js +3 -3
- package/lib/State/LocalState.js.map +1 -1
- package/lib/State/Provisioning.d.ts +5 -0
- package/lib/State/Provisioning.d.ts.map +1 -1
- package/lib/State/Provisioning.js +3 -1
- package/lib/State/Provisioning.js.map +1 -1
- package/lib/State/ResourceState.d.ts +2 -0
- package/lib/State/ResourceState.d.ts.map +1 -1
- package/lib/State/State.d.ts +26 -0
- package/lib/State/State.d.ts.map +1 -1
- package/lib/State/StateEncoding.d.ts +7 -0
- package/lib/State/StateEncoding.d.ts.map +1 -1
- package/lib/State/StateEncoding.js +19 -0
- package/lib/State/StateEncoding.js.map +1 -1
- package/lib/State/index.js +2 -2
- package/lib/State/index.js.map +1 -1
- package/lib/Telemetry/Layer.d.ts +2 -5
- package/lib/Telemetry/Layer.d.ts.map +1 -1
- package/lib/Telemetry/Layer.js +3 -23
- package/lib/Telemetry/Layer.js.map +1 -1
- package/lib/Telemetry/Metrics.d.ts +1 -1
- package/lib/Telemetry/Metrics.d.ts.map +1 -1
- package/lib/TelemetryRelay.js +1 -1
- package/lib/TelemetryRelay.js.map +1 -1
- package/lib/TelemetryRuntime.d.ts +1 -1
- package/lib/TelemetryRuntime.d.ts.map +1 -1
- package/lib/TelemetryRuntime.js +4 -3
- package/lib/TelemetryRuntime.js.map +1 -1
- package/lib/Util/ConsoleSink.d.ts +23 -2
- package/lib/Util/ConsoleSink.d.ts.map +1 -1
- package/lib/Util/ConsoleSink.js +54 -14
- package/lib/Util/ConsoleSink.js.map +1 -1
- package/lib/Util/LogAnnotation.d.ts +19 -0
- package/lib/Util/LogAnnotation.d.ts.map +1 -0
- package/lib/Util/LogAnnotation.js +19 -0
- package/lib/Util/LogAnnotation.js.map +1 -0
- package/lib/Util/LogRecord.d.ts +281 -0
- package/lib/Util/LogRecord.d.ts.map +1 -0
- package/lib/Util/LogRecord.js +267 -0
- package/lib/Util/LogRecord.js.map +1 -0
- package/lib/Util/Node.d.ts +9 -0
- package/lib/Util/Node.d.ts.map +1 -1
- package/lib/Util/Node.js +10 -6
- package/lib/Util/Node.js.map +1 -1
- package/lib/Util/PlatformServices.d.ts +3 -2
- package/lib/Util/PlatformServices.d.ts.map +1 -1
- package/lib/Util/PlatformServices.js +6 -2
- package/lib/Util/PlatformServices.js.map +1 -1
- package/lib/Util/ResourceOutput.d.ts +18 -10
- package/lib/Util/ResourceOutput.d.ts.map +1 -1
- package/lib/Util/ResourceOutput.js +22 -23
- package/lib/Util/ResourceOutput.js.map +1 -1
- package/lib/Util/Shutdown.d.ts +10 -0
- package/lib/Util/Shutdown.d.ts.map +1 -0
- package/lib/Util/Shutdown.js +32 -0
- package/lib/Util/Shutdown.js.map +1 -0
- package/lib/Util/Terminal.d.ts +2 -4
- package/lib/Util/Terminal.d.ts.map +1 -1
- package/lib/Util/Terminal.js +3 -11
- package/lib/Util/Terminal.js.map +1 -1
- package/lib/Util/TraceParent.d.ts +32 -0
- package/lib/Util/TraceParent.d.ts.map +1 -0
- package/lib/Util/TraceParent.js +42 -0
- package/lib/Util/TraceParent.js.map +1 -0
- package/lib/Util/base64.d.ts +7 -0
- package/lib/Util/base64.d.ts.map +1 -0
- package/lib/Util/base64.js +24 -0
- package/lib/Util/base64.js.map +1 -0
- package/lib/Util/cached-function.d.ts +5 -0
- package/lib/Util/cached-function.d.ts.map +1 -1
- package/lib/Util/cached-function.js +13 -8
- package/lib/Util/cached-function.js.map +1 -1
- package/lib/Util/data.d.ts +1 -1
- package/lib/Util/data.d.ts.map +1 -1
- package/lib/Util/data.js +1 -1
- package/lib/Util/data.js.map +1 -1
- package/lib/Util/equal.d.ts.map +1 -1
- package/lib/Util/equal.js +3 -2
- package/lib/Util/equal.js.map +1 -1
- package/lib/Util/extraFiles.d.ts.map +1 -1
- package/lib/Util/extraFiles.js +5 -5
- package/lib/Util/extraFiles.js.map +1 -1
- package/lib/Util/interactive.js +1 -1
- package/lib/Website/AstroOutput.d.ts +42 -0
- package/lib/Website/AstroOutput.d.ts.map +1 -0
- package/lib/Website/AstroOutput.js +34 -0
- package/lib/Website/AstroOutput.js.map +1 -0
- package/lib/Website/FrontendCore.d.ts +1 -1
- package/lib/Workflows.d.ts +9 -0
- package/lib/Workflows.d.ts.map +1 -1
- package/lib/Workflows.js +8 -0
- package/lib/Workflows.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +21 -28
- package/src/AdoptPolicy.ts +76 -0
- package/src/Alchemist/AuthRegistry.ts +164 -0
- package/src/Alchemist/Drift.ts +103 -0
- package/src/Alchemist/Entrypoint.ts +51 -3
- package/src/Alchemist/Errors.ts +1 -1
- package/src/Alchemist/{routes/logs.ts → Logs.ts} +28 -30
- package/src/Alchemist/Nuke.ts +90 -0
- package/src/Alchemist/Operations.ts +309 -0
- package/src/Alchemist/{routes/profile.ts → Profile.ts} +22 -22
- package/src/Alchemist/{routes/provider.ts → Provider.ts} +7 -6
- package/src/Alchemist/Runtime.ts +46 -12
- package/src/Alchemist/{routes/state.ts → State.ts} +78 -21
- package/src/Alchemist/index.ts +32 -15
- package/src/Apply.ts +513 -274
- package/src/Auth/AuthProvider.ts +76 -23
- package/src/Auth/BrowserOAuth.ts +37 -60
- package/src/Auth/Credentials.ts +2 -4
- package/src/Auth/Demand.ts +27 -18
- package/src/Auth/Env.ts +13 -8
- package/src/Auth/Inspect.ts +5 -2
- package/src/Auth/Lock.ts +4 -8
- package/src/Auth/OAuthFlow.ts +12 -26
- package/src/Auth/Paths.ts +3 -2
- package/src/Auth/Profile.ts +30 -2
- package/src/Auth/Registry.ts +27 -0
- package/src/Auth/Resolve.ts +75 -3
- package/src/Auth/StoredAuthProvider.ts +1 -2
- package/src/Binding.ts +3 -4
- package/src/Bundle/Bundle.ts +58 -7
- package/src/Bundle/NamespaceImportPlugin.ts +259 -0
- package/src/Bundle/index.ts +1 -0
- package/src/Cli/Format.ts +2 -1
- package/src/Cli/GlobalLog.ts +206 -68
- package/src/Cli/LoggingCli.ts +33 -20
- package/src/Cli/PlainCliFormatter.ts +4 -1
- package/src/Cli/Present.ts +34 -0
- package/src/Cli/SigilRenderer.ts +75 -0
- package/src/Cli/checkVersion.ts +25 -78
- package/src/Cli/commands/confirm.ts +3 -3
- package/src/Cli/commands/deploy.ts +53 -44
- package/src/Cli/commands/dev.ts +65 -7
- package/src/Cli/commands/drift.ts +20 -16
- package/src/Cli/commands/errors.ts +2 -3
- package/src/Cli/commands/instrument.ts +39 -8
- package/src/Cli/commands/logs.ts +22 -30
- package/src/Cli/commands/nuke.ts +25 -26
- package/src/Cli/commands/profile/commands.ts +34 -34
- package/src/Cli/commands/profile/flows.ts +26 -20
- package/src/Cli/commands/profile/hub.ts +16 -18
- package/src/Cli/commands/provider.ts +4 -4
- package/src/Cli/commands/render.ts +43 -71
- package/src/Cli/commands/state.ts +113 -33
- package/src/Cli/components/capabilities.ts +20 -0
- package/src/Cli/components/types.ts +13 -99
- package/src/Cli/components/ui/Environment.tsx +5 -5
- package/src/Cli/components/ui/Interactive.tsx +24 -15
- package/src/Cli/components/ui/Layout.tsx +1 -1
- package/src/Cli/components/ui/Typography.tsx +1 -1
- package/src/Cli/components/ui/index.ts +2 -2
- package/src/Cli/components/view/ApprovePlan.tsx +2 -1
- package/src/Cli/components/view/Format.tsx +58 -0
- package/src/Cli/components/view/Help.tsx +14 -17
- package/src/Cli/components/view/Logo.tsx +1 -1
- package/src/Cli/components/view/Nuke.tsx +74 -49
- package/src/Cli/components/view/PlanDecision.tsx +1 -1
- package/src/Cli/components/view/PlanRow.tsx +1 -1
- package/src/Cli/components/view/PlanTree.ts +2 -2
- package/src/Cli/components/view/PlanView.tsx +2 -2
- package/src/Cli/components/view/Profile.tsx +2 -2
- package/src/Cli/components/view/ProfileDashboard.tsx +12 -11
- package/src/Cli/components/view/Prompts.tsx +37 -75
- package/src/Cli/components/view/Runtime.tsx +132 -238
- package/src/Cli/components/view/SigilCli.tsx +12 -12
- package/src/Cli/components/view/StateExplorer.tsx +2 -1
- package/src/Cli/components/view/statusStyle.ts +2 -2
- package/src/Cli/exec.ts +48 -41
- package/src/Cli/main.ts +52 -33
- package/src/Cli/selectCli.ts +3 -3
- package/src/Command/Command.ts +1 -1
- package/src/Command/Dev.ts +129 -36
- package/src/Command/Memo.ts +1 -1
- package/src/Contributions.ts +42 -8
- package/src/DNS/Adapter.ts +289 -0
- package/src/DNS/index.ts +1 -0
- package/src/Deploy.ts +11 -3
- package/src/Destroy.ts +19 -13
- package/src/Diff.ts +17 -4
- package/src/Drift.ts +256 -127
- package/src/EvalStack.ts +97 -0
- package/src/Events.ts +296 -0
- package/src/Interaction.ts +332 -97
- package/src/Local/LocalProvider.ts +40 -9
- package/src/Local/RpcProvider.ts +11 -1
- package/src/Local/RpcProviderProxy.ts +29 -21
- package/src/Local/RpcSerialization.ts +32 -17
- package/src/Local/RpcServer.ts +25 -17
- package/src/Local/RpcServerBun.ts +10 -6
- package/src/Local/RpcServerEnvironment.ts +2 -2
- package/src/Local/RpcServerNode.ts +8 -1
- package/src/Local/RpcServerSession.ts +2 -2
- package/src/Local/RpcSpawner.ts +61 -37
- package/src/Local/Sidecar.ts +10 -1
- package/src/Nuke.ts +66 -43
- package/src/Output.ts +120 -7
- package/src/Plan.ts +140 -52
- package/src/Platform.ts +47 -18
- package/src/Provider.ts +48 -3
- package/src/Report.ts +77 -275
- package/src/Runtime/ManagedHttpShutdown.ts +21 -4
- package/src/RuntimeContext.ts +1 -1
- package/src/Stack.ts +113 -135
- package/src/State/BucketState.ts +53 -21
- package/src/State/LocalState.ts +7 -9
- package/src/State/Provisioning.ts +8 -1
- package/src/State/ResourceState.ts +2 -0
- package/src/State/State.ts +30 -0
- package/src/State/StateEncoding.ts +22 -0
- package/src/State/index.ts +2 -2
- package/src/Telemetry/Layer.ts +3 -24
- package/src/Telemetry/Metrics.ts +1 -1
- package/src/TelemetryRelay.ts +1 -1
- package/src/TelemetryRuntime.ts +8 -8
- package/src/Util/ConsoleSink.ts +76 -13
- package/src/Util/LogAnnotation.ts +18 -0
- package/src/Util/LogRecord.ts +386 -0
- package/src/Util/Node.ts +20 -6
- package/src/Util/PlatformServices.ts +17 -4
- package/src/Util/ResourceOutput.ts +26 -25
- package/src/Util/Shutdown.ts +52 -0
- package/src/Util/Terminal.ts +3 -20
- package/src/Util/TraceParent.ts +70 -0
- package/src/Util/base64.ts +22 -0
- package/src/Util/cached-function.ts +30 -19
- package/src/Util/data.ts +2 -2
- package/src/Util/equal.ts +3 -2
- package/src/Util/extraFiles.ts +9 -8
- package/src/Util/interactive.ts +1 -1
- package/src/Website/AstroOutput.ts +83 -0
- package/src/Workflows.ts +11 -0
- package/src/index.ts +1 -0
- package/lib/Alchemist/Progress.d.ts +0 -16
- package/lib/Alchemist/Progress.d.ts.map +0 -1
- package/lib/Alchemist/Progress.js +0 -123
- package/lib/Alchemist/Progress.js.map +0 -1
- package/lib/Alchemist/Session.d.ts +0 -116
- package/lib/Alchemist/Session.d.ts.map +0 -1
- package/lib/Alchemist/Session.js +0 -212
- package/lib/Alchemist/Session.js.map +0 -1
- package/lib/Alchemist/routes/drift.d.ts +0 -55
- package/lib/Alchemist/routes/drift.d.ts.map +0 -1
- package/lib/Alchemist/routes/drift.js +0 -52
- package/lib/Alchemist/routes/drift.js.map +0 -1
- package/lib/Alchemist/routes/logs.d.ts +0 -41
- package/lib/Alchemist/routes/logs.d.ts.map +0 -1
- package/lib/Alchemist/routes/logs.js.map +0 -1
- package/lib/Alchemist/routes/nuke.d.ts +0 -46
- package/lib/Alchemist/routes/nuke.d.ts.map +0 -1
- package/lib/Alchemist/routes/nuke.js +0 -80
- package/lib/Alchemist/routes/nuke.js.map +0 -1
- package/lib/Alchemist/routes/profile.d.ts +0 -133
- package/lib/Alchemist/routes/profile.d.ts.map +0 -1
- package/lib/Alchemist/routes/profile.js.map +0 -1
- package/lib/Alchemist/routes/provider.d.ts.map +0 -1
- package/lib/Alchemist/routes/provider.js.map +0 -1
- package/lib/Alchemist/routes/stack.d.ts +0 -95
- package/lib/Alchemist/routes/stack.d.ts.map +0 -1
- package/lib/Alchemist/routes/stack.js +0 -73
- package/lib/Alchemist/routes/stack.js.map +0 -1
- package/lib/Alchemist/routes/state.d.ts.map +0 -1
- package/lib/Alchemist/routes/state.js.map +0 -1
- package/lib/Cli/CliKit/CliKit.d.ts +0 -92
- package/lib/Cli/CliKit/CliKit.d.ts.map +0 -1
- package/lib/Cli/CliKit/CliKit.js +0 -27
- package/lib/Cli/CliKit/CliKit.js.map +0 -1
- package/lib/Cli/CliKit/index.d.ts +0 -9
- package/lib/Cli/CliKit/index.d.ts.map +0 -1
- package/lib/Cli/CliKit/index.js +0 -9
- package/lib/Cli/CliKit/index.js.map +0 -1
- package/lib/Cli/CliKit/interaction.d.ts +0 -13
- package/lib/Cli/CliKit/interaction.d.ts.map +0 -1
- package/lib/Cli/CliKit/interaction.js +0 -17
- package/lib/Cli/CliKit/interaction.js.map +0 -1
- package/lib/Cli/CliKit/layer.d.ts +0 -7
- package/lib/Cli/CliKit/layer.d.ts.map +0 -1
- package/lib/Cli/CliKit/layer.js +0 -33
- package/lib/Cli/CliKit/layer.js.map +0 -1
- package/lib/Local/DevLog.d.ts +0 -32
- package/lib/Local/DevLog.d.ts.map +0 -1
- package/lib/Local/DevLog.js +0 -112
- package/lib/Local/DevLog.js.map +0 -1
- package/lib/Test/Alchemy.d.ts +0 -79
- package/lib/Test/Alchemy.d.ts.map +0 -1
- package/lib/Test/Alchemy.js +0 -193
- package/lib/Test/Alchemy.js.map +0 -1
- package/lib/Test/Bun.d.ts +0 -69
- package/lib/Test/Bun.d.ts.map +0 -1
- package/lib/Test/Bun.js +0 -126
- package/lib/Test/Bun.js.map +0 -1
- package/lib/Test/Core.d.ts +0 -277
- package/lib/Test/Core.d.ts.map +0 -1
- package/lib/Test/Core.js +0 -362
- package/lib/Test/Core.js.map +0 -1
- package/lib/Test/Http.d.ts +0 -109
- package/lib/Test/Http.d.ts.map +0 -1
- package/lib/Test/Http.js +0 -123
- package/lib/Test/Http.js.map +0 -1
- package/lib/Test/TestState.d.ts +0 -12
- package/lib/Test/TestState.d.ts.map +0 -1
- package/lib/Test/TestState.js +0 -15
- package/lib/Test/TestState.js.map +0 -1
- package/lib/Test/Vitest.d.ts +0 -60
- package/lib/Test/Vitest.d.ts.map +0 -1
- package/lib/Test/Vitest.js +0 -132
- package/lib/Test/Vitest.js.map +0 -1
- package/lib/Test/index.d.ts +0 -3
- package/lib/Test/index.d.ts.map +0 -1
- package/lib/Test/index.js +0 -3
- package/lib/Test/index.js.map +0 -1
- package/lib/Util/FileLogger.d.ts +0 -7
- package/lib/Util/FileLogger.d.ts.map +0 -1
- package/lib/Util/FileLogger.js +0 -16
- package/lib/Util/FileLogger.js.map +0 -1
- package/src/Alchemist/Progress.ts +0 -167
- package/src/Alchemist/Session.ts +0 -415
- package/src/Alchemist/routes/drift.ts +0 -87
- package/src/Alchemist/routes/nuke.ts +0 -131
- package/src/Alchemist/routes/stack.ts +0 -173
- package/src/Cli/CliKit/CliKit.ts +0 -159
- package/src/Cli/CliKit/index.ts +0 -41
- package/src/Cli/CliKit/interaction.ts +0 -19
- package/src/Cli/CliKit/layer.ts +0 -44
- package/src/Local/DevLog.ts +0 -122
- package/src/Test/Alchemy.ts +0 -334
- package/src/Test/Bun.ts +0 -230
- package/src/Test/Core.ts +0 -785
- package/src/Test/Http.ts +0 -201
- package/src/Test/TestState.ts +0 -35
- package/src/Test/Vitest.ts +0 -239
- package/src/Test/index.ts +0 -2
- package/src/Util/FileLogger.ts +0 -20
package/src/Cli/GlobalLog.ts
CHANGED
|
@@ -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
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
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
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
/**
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
69
|
-
|
|
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(
|
|
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
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* `
|
|
86
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
139
|
-
|
|
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
|
+
}));
|
package/src/Cli/LoggingCli.ts
CHANGED
|
@@ -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
|
|
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*
|
|
194
|
-
yield*
|
|
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
|
|
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
|
-
|
|
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*
|
|
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*
|
|
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*
|
|
247
|
-
yield*
|
|
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) =>
|
|
256
|
-
//
|
|
257
|
-
//
|
|
258
|
-
//
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
324
|
+
return present("").pipe(
|
|
312
325
|
Effect.andThen(
|
|
313
|
-
|
|
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
|
-
|
|
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
|
+
};
|