@mysten-incubation/devstack 0.0.0
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/LICENSE +189 -0
- package/README.md +94 -0
- package/dist/_virtual/_rolldown/runtime.mjs +13 -0
- package/dist/api/define-capabilities.d.mts +25 -0
- package/dist/api/define-capabilities.mjs +19 -0
- package/dist/api/define-capabilities.mjs.map +1 -0
- package/dist/api/define-devstack-with.d.mts +41 -0
- package/dist/api/define-devstack-with.mjs +24 -0
- package/dist/api/define-devstack-with.mjs.map +1 -0
- package/dist/api/define-devstack.d.mts +62 -0
- package/dist/api/define-devstack.mjs +108 -0
- package/dist/api/define-devstack.mjs.map +1 -0
- package/dist/api/define-plugin.d.mts +1 -0
- package/dist/api/inference-network.mjs +122 -0
- package/dist/api/inference-network.mjs.map +1 -0
- package/dist/api/mode-narrowed-factory.d.mts +26 -0
- package/dist/api/mode-narrowed-factory.mjs +8 -0
- package/dist/api/mode-narrowed-factory.mjs.map +1 -0
- package/dist/api/plugin-errors.mjs +10 -0
- package/dist/api/plugin-errors.mjs.map +1 -0
- package/dist/api/run-stack.d.mts +82 -0
- package/dist/api/run-stack.mjs +127 -0
- package/dist/api/run-stack.mjs.map +1 -0
- package/dist/build-integrations/playwright/config.d.mts +92 -0
- package/dist/build-integrations/playwright/config.mjs +71 -0
- package/dist/build-integrations/playwright/config.mjs.map +1 -0
- package/dist/build-integrations/playwright/errors.d.mts +82 -0
- package/dist/build-integrations/playwright/errors.mjs +43 -0
- package/dist/build-integrations/playwright/errors.mjs.map +1 -0
- package/dist/build-integrations/playwright/global-setup.d.mts +64 -0
- package/dist/build-integrations/playwright/global-setup.mjs +44 -0
- package/dist/build-integrations/playwright/global-setup.mjs.map +1 -0
- package/dist/build-integrations/playwright/index.d.mts +6 -0
- package/dist/build-integrations/playwright/index.mjs +6 -0
- package/dist/build-integrations/playwright/stack-context.d.mts +95 -0
- package/dist/build-integrations/playwright/stack-context.mjs +277 -0
- package/dist/build-integrations/playwright/stack-context.mjs.map +1 -0
- package/dist/build-integrations/playwright/wallet-context.d.mts +87 -0
- package/dist/build-integrations/playwright/wallet-context.mjs +148 -0
- package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -0
- package/dist/build-integrations/runtime/cold-start-url.d.mts +67 -0
- package/dist/build-integrations/runtime/cold-start-url.mjs +56 -0
- package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -0
- package/dist/build-integrations/runtime/dapp-kit-slot.mjs +10 -0
- package/dist/build-integrations/runtime/dapp-kit-slot.mjs.map +1 -0
- package/dist/build-integrations/runtime/discover.d.mts +78 -0
- package/dist/build-integrations/runtime/discover.mjs +124 -0
- package/dist/build-integrations/runtime/discover.mjs.map +1 -0
- package/dist/build-integrations/runtime/endpoint-registry.d.mts +26 -0
- package/dist/build-integrations/runtime/endpoint-registry.mjs +41 -0
- package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -0
- package/dist/build-integrations/runtime/errors.d.mts +64 -0
- package/dist/build-integrations/runtime/errors.mjs +51 -0
- package/dist/build-integrations/runtime/errors.mjs.map +1 -0
- package/dist/build-integrations/runtime/index.d.mts +7 -0
- package/dist/build-integrations/runtime/index.mjs +6 -0
- package/dist/build-integrations/runtime/read-stack-context.d.mts +38 -0
- package/dist/build-integrations/runtime/read-stack-context.mjs +130 -0
- package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -0
- package/dist/build-integrations/runtime/stack-context.d.mts +53 -0
- package/dist/build-integrations/vitest/config.d.mts +62 -0
- package/dist/build-integrations/vitest/config.mjs +80 -0
- package/dist/build-integrations/vitest/config.mjs.map +1 -0
- package/dist/build-integrations/vitest/env.d.mts +48 -0
- package/dist/build-integrations/vitest/env.mjs +50 -0
- package/dist/build-integrations/vitest/env.mjs.map +1 -0
- package/dist/build-integrations/vitest/errors.d.mts +44 -0
- package/dist/build-integrations/vitest/errors.mjs +18 -0
- package/dist/build-integrations/vitest/errors.mjs.map +1 -0
- package/dist/build-integrations/vitest/index.d.mts +6 -0
- package/dist/build-integrations/vitest/index.mjs +6 -0
- package/dist/build-integrations/vitest/setup.d.mts +53 -0
- package/dist/build-integrations/vitest/setup.mjs +56 -0
- package/dist/build-integrations/vitest/setup.mjs.map +1 -0
- package/dist/build-integrations/vitest/stack-context.d.mts +58 -0
- package/dist/build-integrations/vitest/stack-context.mjs +67 -0
- package/dist/build-integrations/vitest/stack-context.mjs.map +1 -0
- package/dist/cli/main.d.mts +5 -0
- package/dist/cli/main.mjs +586 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/prune-direct.mjs +216 -0
- package/dist/cli/prune-direct.mjs.map +1 -0
- package/dist/cli/snapshot-reader.mjs +73 -0
- package/dist/cli/snapshot-reader.mjs.map +1 -0
- package/dist/cli/up-lifecycle.mjs +28 -0
- package/dist/cli/up-lifecycle.mjs.map +1 -0
- package/dist/contracts/capability-decl.d.mts +42 -0
- package/dist/contracts/chain-probe.d.mts +26 -0
- package/dist/contracts/chain-probe.mjs +8 -0
- package/dist/contracts/chain-probe.mjs.map +1 -0
- package/dist/contracts/codegenable.d.mts +43 -0
- package/dist/contracts/container-runtime.d.mts +245 -0
- package/dist/contracts/liveness-classifier.d.mts +19 -0
- package/dist/contracts/network-resolver.d.mts +15 -0
- package/dist/contracts/network-resolver.mjs +7 -0
- package/dist/contracts/network-resolver.mjs.map +1 -0
- package/dist/contracts/projection.d.mts +15 -0
- package/dist/contracts/routable.d.mts +53 -0
- package/dist/contracts/snapshotable.d.mts +39 -0
- package/dist/contracts/strategy-contributor.d.mts +26 -0
- package/dist/index.d.mts +89 -0
- package/dist/index.mjs +37 -0
- package/dist/orchestrators/codegen/bindings.d.mts +2 -0
- package/dist/orchestrators/codegen/bindings.mjs +340 -0
- package/dist/orchestrators/codegen/bindings.mjs.map +1 -0
- package/dist/orchestrators/codegen/emit.mjs +56 -0
- package/dist/orchestrators/codegen/emit.mjs.map +1 -0
- package/dist/orchestrators/codegen/errors.d.mts +1 -0
- package/dist/orchestrators/codegen/errors.mjs +66 -0
- package/dist/orchestrators/codegen/errors.mjs.map +1 -0
- package/dist/orchestrators/codegen/extras.mjs +16 -0
- package/dist/orchestrators/codegen/extras.mjs.map +1 -0
- package/dist/orchestrators/codegen/format.mjs +109 -0
- package/dist/orchestrators/codegen/format.mjs.map +1 -0
- package/dist/orchestrators/codegen/gitignore.mjs +67 -0
- package/dist/orchestrators/codegen/gitignore.mjs.map +1 -0
- package/dist/orchestrators/codegen/paths.d.mts +1 -0
- package/dist/orchestrators/codegen/paths.mjs +33 -0
- package/dist/orchestrators/codegen/paths.mjs.map +1 -0
- package/dist/orchestrators/codegen/permissions.mjs +6 -0
- package/dist/orchestrators/codegen/permissions.mjs.map +1 -0
- package/dist/orchestrators/codegen/service.d.mts +1 -0
- package/dist/orchestrators/codegen/service.mjs +276 -0
- package/dist/orchestrators/codegen/service.mjs.map +1 -0
- package/dist/orchestrators/router/cleanup.mjs +58 -0
- package/dist/orchestrators/router/cleanup.mjs.map +1 -0
- package/dist/orchestrators/router/cors.mjs +31 -0
- package/dist/orchestrators/router/cors.mjs.map +1 -0
- package/dist/orchestrators/router/entrypoints.d.mts +1 -0
- package/dist/orchestrators/router/entrypoints.mjs +80 -0
- package/dist/orchestrators/router/entrypoints.mjs.map +1 -0
- package/dist/orchestrators/router/errors.d.mts +1 -0
- package/dist/orchestrators/router/errors.mjs +103 -0
- package/dist/orchestrators/router/errors.mjs.map +1 -0
- package/dist/orchestrators/router/file-provider.d.mts +1 -0
- package/dist/orchestrators/router/file-provider.mjs +320 -0
- package/dist/orchestrators/router/file-provider.mjs.map +1 -0
- package/dist/orchestrators/router/hostname.d.mts +1 -0
- package/dist/orchestrators/router/hostname.mjs +107 -0
- package/dist/orchestrators/router/hostname.mjs.map +1 -0
- package/dist/orchestrators/router/index.d.mts +1 -0
- package/dist/orchestrators/router/profile.d.mts +1 -0
- package/dist/orchestrators/router/profile.mjs +109 -0
- package/dist/orchestrators/router/profile.mjs.map +1 -0
- package/dist/orchestrators/router/service.d.mts +3 -0
- package/dist/orchestrators/router/service.mjs +421 -0
- package/dist/orchestrators/router/service.mjs.map +1 -0
- package/dist/orchestrators/router/traefik-container.d.mts +1 -0
- package/dist/orchestrators/router/traefik-container.mjs +229 -0
- package/dist/orchestrators/router/traefik-container.mjs.map +1 -0
- package/dist/orchestrators/runtime-composition.d.mts +10 -0
- package/dist/orchestrators/runtime-composition.mjs +168 -0
- package/dist/orchestrators/runtime-composition.mjs.map +1 -0
- package/dist/orchestrators/snapshot/capture.d.mts +1 -0
- package/dist/orchestrators/snapshot/capture.mjs +350 -0
- package/dist/orchestrators/snapshot/capture.mjs.map +1 -0
- package/dist/orchestrators/snapshot/descriptor.d.mts +1 -0
- package/dist/orchestrators/snapshot/descriptor.mjs +109 -0
- package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -0
- package/dist/orchestrators/snapshot/identity-guard.d.mts +1 -0
- package/dist/orchestrators/snapshot/identity-guard.mjs +132 -0
- package/dist/orchestrators/snapshot/identity-guard.mjs.map +1 -0
- package/dist/orchestrators/snapshot/image-bundle-tags.mjs +207 -0
- package/dist/orchestrators/snapshot/image-bundle-tags.mjs.map +1 -0
- package/dist/orchestrators/snapshot/index.d.mts +1 -0
- package/dist/orchestrators/snapshot/integrity.d.mts +1 -0
- package/dist/orchestrators/snapshot/integrity.mjs +74 -0
- package/dist/orchestrators/snapshot/integrity.mjs.map +1 -0
- package/dist/orchestrators/snapshot/prune.d.mts +1 -0
- package/dist/orchestrators/snapshot/prune.mjs +110 -0
- package/dist/orchestrators/snapshot/prune.mjs.map +1 -0
- package/dist/orchestrators/snapshot/restore.d.mts +1 -0
- package/dist/orchestrators/snapshot/restore.mjs +404 -0
- package/dist/orchestrators/snapshot/restore.mjs.map +1 -0
- package/dist/orchestrators/snapshot/service.d.mts +1 -0
- package/dist/orchestrators/snapshot/service.mjs +296 -0
- package/dist/orchestrators/snapshot/service.mjs.map +1 -0
- package/dist/orchestrators/snapshot/state-document.mjs +18 -0
- package/dist/orchestrators/snapshot/state-document.mjs.map +1 -0
- package/dist/orchestrators/snapshot/wipe.d.mts +1 -0
- package/dist/orchestrators/snapshot/wipe.mjs +59 -0
- package/dist/orchestrators/snapshot/wipe.mjs.map +1 -0
- package/dist/plugins/account/codegen.d.mts +12 -0
- package/dist/plugins/account/codegen.mjs +22 -0
- package/dist/plugins/account/codegen.mjs.map +1 -0
- package/dist/plugins/account/errors.d.mts +44 -0
- package/dist/plugins/account/errors.mjs +16 -0
- package/dist/plugins/account/errors.mjs.map +1 -0
- package/dist/plugins/account/funding.d.mts +94 -0
- package/dist/plugins/account/funding.mjs +199 -0
- package/dist/plugins/account/funding.mjs.map +1 -0
- package/dist/plugins/account/index.d.mts +54 -0
- package/dist/plugins/account/index.mjs +151 -0
- package/dist/plugins/account/index.mjs.map +1 -0
- package/dist/plugins/account/keypair.d.mts +32 -0
- package/dist/plugins/account/keypair.mjs +99 -0
- package/dist/plugins/account/keypair.mjs.map +1 -0
- package/dist/plugins/account/lease.mjs +21 -0
- package/dist/plugins/account/lease.mjs.map +1 -0
- package/dist/plugins/account/registry.d.mts +33 -0
- package/dist/plugins/account/registry.mjs +36 -0
- package/dist/plugins/account/registry.mjs.map +1 -0
- package/dist/plugins/account/service.d.mts +104 -0
- package/dist/plugins/account/service.mjs +405 -0
- package/dist/plugins/account/service.mjs.map +1 -0
- package/dist/plugins/account/snapshot.mjs +33 -0
- package/dist/plugins/account/snapshot.mjs.map +1 -0
- package/dist/plugins/account/variants/env.mjs +24 -0
- package/dist/plugins/account/variants/env.mjs.map +1 -0
- package/dist/plugins/account/variants/ephemeral.mjs +72 -0
- package/dist/plugins/account/variants/ephemeral.mjs.map +1 -0
- package/dist/plugins/account/variants/impersonate.d.mts +16 -0
- package/dist/plugins/account/variants/impersonate.mjs +48 -0
- package/dist/plugins/account/variants/impersonate.mjs.map +1 -0
- package/dist/plugins/account/variants/inline.mjs +13 -0
- package/dist/plugins/account/variants/inline.mjs.map +1 -0
- package/dist/plugins/account/variants/keystore.mjs +93 -0
- package/dist/plugins/account/variants/keystore.mjs.map +1 -0
- package/dist/plugins/account/variants/signer.mjs +31 -0
- package/dist/plugins/account/variants/signer.mjs.map +1 -0
- package/dist/plugins/action/build-context.d.mts +41 -0
- package/dist/plugins/action/discriminator.d.mts +20 -0
- package/dist/plugins/action/discriminator.mjs +13 -0
- package/dist/plugins/action/discriminator.mjs.map +1 -0
- package/dist/plugins/action/errors.d.mts +31 -0
- package/dist/plugins/action/errors.mjs +13 -0
- package/dist/plugins/action/errors.mjs.map +1 -0
- package/dist/plugins/action/execute.d.mts +2 -0
- package/dist/plugins/action/execute.mjs +145 -0
- package/dist/plugins/action/execute.mjs.map +1 -0
- package/dist/plugins/action/index.d.mts +56 -0
- package/dist/plugins/action/index.mjs +82 -0
- package/dist/plugins/action/index.mjs.map +1 -0
- package/dist/plugins/action/service.d.mts +26 -0
- package/dist/plugins/action/service.mjs +84 -0
- package/dist/plugins/action/service.mjs.map +1 -0
- package/dist/plugins/coin/address-resolution.d.mts +34 -0
- package/dist/plugins/coin/address-resolution.mjs +80 -0
- package/dist/plugins/coin/address-resolution.mjs.map +1 -0
- package/dist/plugins/coin/codegen.d.mts +16 -0
- package/dist/plugins/coin/codegen.mjs +21 -0
- package/dist/plugins/coin/codegen.mjs.map +1 -0
- package/dist/plugins/coin/discovery.d.mts +26 -0
- package/dist/plugins/coin/discovery.mjs +112 -0
- package/dist/plugins/coin/discovery.mjs.map +1 -0
- package/dist/plugins/coin/errors.d.mts +48 -0
- package/dist/plugins/coin/errors.mjs +13 -0
- package/dist/plugins/coin/errors.mjs.map +1 -0
- package/dist/plugins/coin/index.d.mts +95 -0
- package/dist/plugins/coin/index.mjs +172 -0
- package/dist/plugins/coin/index.mjs.map +1 -0
- package/dist/plugins/coin/metadata.d.mts +15 -0
- package/dist/plugins/coin/metadata.mjs +99 -0
- package/dist/plugins/coin/metadata.mjs.map +1 -0
- package/dist/plugins/coin/mint.d.mts +34 -0
- package/dist/plugins/coin/mint.mjs +164 -0
- package/dist/plugins/coin/mint.mjs.map +1 -0
- package/dist/plugins/coin/registry.d.mts +1 -0
- package/dist/plugins/coin/registry.mjs +37 -0
- package/dist/plugins/coin/registry.mjs.map +1 -0
- package/dist/plugins/coin/service.d.mts +47 -0
- package/dist/plugins/coin/service.mjs +51 -0
- package/dist/plugins/coin/service.mjs.map +1 -0
- package/dist/plugins/coin/snapshot.mjs +19 -0
- package/dist/plugins/coin/snapshot.mjs.map +1 -0
- package/dist/plugins/coin/type-strings.mjs +49 -0
- package/dist/plugins/coin/type-strings.mjs.map +1 -0
- package/dist/plugins/deepbook/codegen.d.mts +39 -0
- package/dist/plugins/deepbook/codegen.mjs +15 -0
- package/dist/plugins/deepbook/codegen.mjs.map +1 -0
- package/dist/plugins/deepbook/deploy.mjs +437 -0
- package/dist/plugins/deepbook/deploy.mjs.map +1 -0
- package/dist/plugins/deepbook/errors.d.mts +29 -0
- package/dist/plugins/deepbook/errors.mjs +26 -0
- package/dist/plugins/deepbook/errors.mjs.map +1 -0
- package/dist/plugins/deepbook/faucet-strategy.d.mts +8 -0
- package/dist/plugins/deepbook/faucet-strategy.mjs +81 -0
- package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -0
- package/dist/plugins/deepbook/index.d.mts +171 -0
- package/dist/plugins/deepbook/index.mjs +359 -0
- package/dist/plugins/deepbook/index.mjs.map +1 -0
- package/dist/plugins/deepbook/plugin-key.mjs +7 -0
- package/dist/plugins/deepbook/plugin-key.mjs.map +1 -0
- package/dist/plugins/deepbook/pyth/index.mjs +226 -0
- package/dist/plugins/deepbook/pyth/index.mjs.map +1 -0
- package/dist/plugins/deepbook/routable.mjs +21 -0
- package/dist/plugins/deepbook/routable.mjs.map +1 -0
- package/dist/plugins/deepbook/snapshot.mjs +49 -0
- package/dist/plugins/deepbook/snapshot.mjs.map +1 -0
- package/dist/plugins/deepbook/types.d.mts +125 -0
- package/dist/plugins/deepbook/types.mjs +12 -0
- package/dist/plugins/deepbook/types.mjs.map +1 -0
- package/dist/plugins/faucet/dispatcher.d.mts +9 -0
- package/dist/plugins/faucet/dispatcher.mjs +13 -0
- package/dist/plugins/faucet/dispatcher.mjs.map +1 -0
- package/dist/plugins/faucet/errors.d.mts +86 -0
- package/dist/plugins/faucet/errors.mjs +19 -0
- package/dist/plugins/faucet/errors.mjs.map +1 -0
- package/dist/plugins/faucet/http.mjs +127 -0
- package/dist/plugins/faucet/http.mjs.map +1 -0
- package/dist/plugins/faucet/index.d.mts +43 -0
- package/dist/plugins/faucet/index.mjs +42 -0
- package/dist/plugins/faucet/index.mjs.map +1 -0
- package/dist/plugins/faucet/service.d.mts +20 -0
- package/dist/plugins/faucet/strategies/sui-local.d.mts +23 -0
- package/dist/plugins/faucet/strategies/sui-local.mjs +29 -0
- package/dist/plugins/faucet/strategies/sui-local.mjs.map +1 -0
- package/dist/plugins/host-service/errors.d.mts +27 -0
- package/dist/plugins/host-service/errors.mjs +14 -0
- package/dist/plugins/host-service/errors.mjs.map +1 -0
- package/dist/plugins/host-service/index.d.mts +10 -0
- package/dist/plugins/host-service/index.mjs +48 -0
- package/dist/plugins/host-service/index.mjs.map +1 -0
- package/dist/plugins/host-service/routable.mjs +24 -0
- package/dist/plugins/host-service/routable.mjs.map +1 -0
- package/dist/plugins/host-service/service.d.mts +49 -0
- package/dist/plugins/host-service/service.mjs +375 -0
- package/dist/plugins/host-service/service.mjs.map +1 -0
- package/dist/plugins/package/build.d.mts +1 -0
- package/dist/plugins/package/build.mjs +24 -0
- package/dist/plugins/package/build.mjs.map +1 -0
- package/dist/plugins/package/codegen.d.mts +19 -0
- package/dist/plugins/package/codegen.mjs +41 -0
- package/dist/plugins/package/codegen.mjs.map +1 -0
- package/dist/plugins/package/dep-resolution.mjs +10 -0
- package/dist/plugins/package/dep-resolution.mjs.map +1 -0
- package/dist/plugins/package/errors.d.mts +34 -0
- package/dist/plugins/package/errors.mjs +13 -0
- package/dist/plugins/package/errors.mjs.map +1 -0
- package/dist/plugins/package/index.d.mts +109 -0
- package/dist/plugins/package/index.mjs +207 -0
- package/dist/plugins/package/index.mjs.map +1 -0
- package/dist/plugins/package/mode-known.mjs +41 -0
- package/dist/plugins/package/mode-known.mjs.map +1 -0
- package/dist/plugins/package/mode-local.d.mts +1 -0
- package/dist/plugins/package/mode-local.mjs +183 -0
- package/dist/plugins/package/mode-local.mjs.map +1 -0
- package/dist/plugins/package/publish-executor.mjs +202 -0
- package/dist/plugins/package/publish-executor.mjs.map +1 -0
- package/dist/plugins/package/publish-output.d.mts +28 -0
- package/dist/plugins/package/publish-output.mjs +45 -0
- package/dist/plugins/package/publish-output.mjs.map +1 -0
- package/dist/plugins/package/registry.d.mts +25 -0
- package/dist/plugins/package/registry.mjs +30 -0
- package/dist/plugins/package/registry.mjs.map +1 -0
- package/dist/plugins/package/service.mjs +20 -0
- package/dist/plugins/package/service.mjs.map +1 -0
- package/dist/plugins/package/snapshot.mjs +25 -0
- package/dist/plugins/package/snapshot.mjs.map +1 -0
- package/dist/plugins/postgres/codegen.mjs +42 -0
- package/dist/plugins/postgres/codegen.mjs.map +1 -0
- package/dist/plugins/postgres/connection.d.mts +33 -0
- package/dist/plugins/postgres/connection.mjs +19 -0
- package/dist/plugins/postgres/connection.mjs.map +1 -0
- package/dist/plugins/postgres/db-ensure.mjs +100 -0
- package/dist/plugins/postgres/db-ensure.mjs.map +1 -0
- package/dist/plugins/postgres/errors.d.mts +55 -0
- package/dist/plugins/postgres/errors.mjs +29 -0
- package/dist/plugins/postgres/errors.mjs.map +1 -0
- package/dist/plugins/postgres/index.d.mts +37 -0
- package/dist/plugins/postgres/index.mjs +75 -0
- package/dist/plugins/postgres/index.mjs.map +1 -0
- package/dist/plugins/postgres/routable.mjs +33 -0
- package/dist/plugins/postgres/routable.mjs.map +1 -0
- package/dist/plugins/postgres/service.d.mts +50 -0
- package/dist/plugins/postgres/service.mjs +145 -0
- package/dist/plugins/postgres/service.mjs.map +1 -0
- package/dist/plugins/postgres/snapshot.d.mts +1 -0
- package/dist/plugins/postgres/snapshot.mjs +32 -0
- package/dist/plugins/postgres/snapshot.mjs.map +1 -0
- package/dist/plugins/router-entrypoints.mjs +21 -0
- package/dist/plugins/router-entrypoints.mjs.map +1 -0
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +59 -0
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -0
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +132 -0
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -0
- package/dist/plugins/seal/codegen.d.mts +19 -0
- package/dist/plugins/seal/codegen.mjs +16 -0
- package/dist/plugins/seal/codegen.mjs.map +1 -0
- package/dist/plugins/seal/config-render.mjs +82 -0
- package/dist/plugins/seal/config-render.mjs.map +1 -0
- package/dist/plugins/seal/deploy.mjs +198 -0
- package/dist/plugins/seal/deploy.mjs.map +1 -0
- package/dist/plugins/seal/errors.d.mts +52 -0
- package/dist/plugins/seal/errors.mjs +19 -0
- package/dist/plugins/seal/errors.mjs.map +1 -0
- package/dist/plugins/seal/index.d.mts +161 -0
- package/dist/plugins/seal/index.mjs +235 -0
- package/dist/plugins/seal/index.mjs.map +1 -0
- package/dist/plugins/seal/key-manager.d.mts +22 -0
- package/dist/plugins/seal/key-manager.mjs +22 -0
- package/dist/plugins/seal/key-manager.mjs.map +1 -0
- package/dist/plugins/seal/key-server.mjs +175 -0
- package/dist/plugins/seal/key-server.mjs.map +1 -0
- package/dist/plugins/seal/keygen.mjs +96 -0
- package/dist/plugins/seal/keygen.mjs.map +1 -0
- package/dist/plugins/seal/mode/fork-known.d.mts +8 -0
- package/dist/plugins/seal/mode/fork-known.mjs +23 -0
- package/dist/plugins/seal/mode/fork-known.mjs.map +1 -0
- package/dist/plugins/seal/mode/live.d.mts +18 -0
- package/dist/plugins/seal/mode/live.mjs +64 -0
- package/dist/plugins/seal/mode/live.mjs.map +1 -0
- package/dist/plugins/seal/mode/local-keygen.mjs +180 -0
- package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -0
- package/dist/plugins/seal/plugin-key.mjs +7 -0
- package/dist/plugins/seal/plugin-key.mjs.map +1 -0
- package/dist/plugins/seal/registry-publish.d.mts +43 -0
- package/dist/plugins/seal/registry-publish.mjs +9 -0
- package/dist/plugins/seal/registry-publish.mjs.map +1 -0
- package/dist/plugins/seal/routable.mjs +57 -0
- package/dist/plugins/seal/routable.mjs.map +1 -0
- package/dist/plugins/seal/service.mjs +17 -0
- package/dist/plugins/seal/service.mjs.map +1 -0
- package/dist/plugins/seal/snapshot.mjs +51 -0
- package/dist/plugins/seal/snapshot.mjs.map +1 -0
- package/dist/plugins/sui/auto-tick.mjs +45 -0
- package/dist/plugins/sui/auto-tick.mjs.map +1 -0
- package/dist/plugins/sui/chain-build-container.d.mts +1 -0
- package/dist/plugins/sui/chain-probe.d.mts +85 -0
- package/dist/plugins/sui/chain-probe.mjs +104 -0
- package/dist/plugins/sui/chain-probe.mjs.map +1 -0
- package/dist/plugins/sui/codegen.d.mts +14 -0
- package/dist/plugins/sui/codegen.mjs +26 -0
- package/dist/plugins/sui/codegen.mjs.map +1 -0
- package/dist/plugins/sui/errors.d.mts +74 -0
- package/dist/plugins/sui/errors.mjs +28 -0
- package/dist/plugins/sui/errors.mjs.map +1 -0
- package/dist/plugins/sui/fork-orchestration.mjs +24 -0
- package/dist/plugins/sui/fork-orchestration.mjs.map +1 -0
- package/dist/plugins/sui/fork-transaction.mjs +96 -0
- package/dist/plugins/sui/fork-transaction.mjs.map +1 -0
- package/dist/plugins/sui/index.d.mts +318 -0
- package/dist/plugins/sui/index.mjs +182 -0
- package/dist/plugins/sui/index.mjs.map +1 -0
- package/dist/plugins/sui/mode/external.mjs +60 -0
- package/dist/plugins/sui/mode/external.mjs.map +1 -0
- package/dist/plugins/sui/mode/fork.mjs +283 -0
- package/dist/plugins/sui/mode/fork.mjs.map +1 -0
- package/dist/plugins/sui/mode/live.mjs +103 -0
- package/dist/plugins/sui/mode/live.mjs.map +1 -0
- package/dist/plugins/sui/mode/local.mjs +293 -0
- package/dist/plugins/sui/mode/local.mjs.map +1 -0
- package/dist/plugins/sui/mode/shared-boot.mjs +254 -0
- package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -0
- package/dist/plugins/sui/mode/shared.d.mts +103 -0
- package/dist/plugins/sui/mode/shared.mjs +12 -0
- package/dist/plugins/sui/mode/shared.mjs.map +1 -0
- package/dist/plugins/sui/mode/spec.d.mts +94 -0
- package/dist/plugins/sui/network-resolver.d.mts +23 -0
- package/dist/plugins/sui/routable.mjs +88 -0
- package/dist/plugins/sui/routable.mjs.map +1 -0
- package/dist/plugins/sui/seed-objects.d.mts +18 -0
- package/dist/plugins/sui/seed-objects.mjs +25 -0
- package/dist/plugins/sui/seed-objects.mjs.map +1 -0
- package/dist/plugins/sui/service.mjs +38 -0
- package/dist/plugins/sui/service.mjs.map +1 -0
- package/dist/plugins/sui/snapshot.mjs +53 -0
- package/dist/plugins/sui/snapshot.mjs.map +1 -0
- package/dist/plugins/wallet/codegen.d.mts +33 -0
- package/dist/plugins/wallet/codegen.mjs +34 -0
- package/dist/plugins/wallet/codegen.mjs.map +1 -0
- package/dist/plugins/wallet/errors.d.mts +66 -0
- package/dist/plugins/wallet/errors.mjs +16 -0
- package/dist/plugins/wallet/errors.mjs.map +1 -0
- package/dist/plugins/wallet/index.d.mts +63 -0
- package/dist/plugins/wallet/index.mjs +126 -0
- package/dist/plugins/wallet/index.mjs.map +1 -0
- package/dist/plugins/wallet/origin-policy.d.mts +1 -0
- package/dist/plugins/wallet/origin-policy.mjs +65 -0
- package/dist/plugins/wallet/origin-policy.mjs.map +1 -0
- package/dist/plugins/wallet/pairing.d.mts +11 -0
- package/dist/plugins/wallet/pairing.mjs +125 -0
- package/dist/plugins/wallet/pairing.mjs.map +1 -0
- package/dist/plugins/wallet/protocol.d.mts +1 -0
- package/dist/plugins/wallet/protocol.mjs +96 -0
- package/dist/plugins/wallet/protocol.mjs.map +1 -0
- package/dist/plugins/wallet/routable.mjs +32 -0
- package/dist/plugins/wallet/routable.mjs.map +1 -0
- package/dist/plugins/wallet/server.d.mts +12 -0
- package/dist/plugins/wallet/server.mjs +317 -0
- package/dist/plugins/wallet/server.mjs.map +1 -0
- package/dist/plugins/wallet/service.d.mts +68 -0
- package/dist/plugins/wallet/service.mjs +97 -0
- package/dist/plugins/wallet/service.mjs.map +1 -0
- package/dist/plugins/wallet/snapshot.d.mts +1 -0
- package/dist/plugins/wallet/snapshot.mjs +14 -0
- package/dist/plugins/wallet/snapshot.mjs.map +1 -0
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +42 -0
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -0
- package/dist/plugins/walrus/codegen.d.mts +38 -0
- package/dist/plugins/walrus/codegen.mjs +34 -0
- package/dist/plugins/walrus/codegen.mjs.map +1 -0
- package/dist/plugins/walrus/deploy-paths.mjs +14 -0
- package/dist/plugins/walrus/deploy-paths.mjs.map +1 -0
- package/dist/plugins/walrus/deploy.d.mts +1 -0
- package/dist/plugins/walrus/deploy.mjs +224 -0
- package/dist/plugins/walrus/deploy.mjs.map +1 -0
- package/dist/plugins/walrus/errors.d.mts +38 -0
- package/dist/plugins/walrus/errors.mjs +26 -0
- package/dist/plugins/walrus/errors.mjs.map +1 -0
- package/dist/plugins/walrus/faucet-strategy.d.mts +12 -0
- package/dist/plugins/walrus/faucet-strategy.mjs +62 -0
- package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -0
- package/dist/plugins/walrus/index.d.mts +177 -0
- package/dist/plugins/walrus/index.mjs +284 -0
- package/dist/plugins/walrus/index.mjs.map +1 -0
- package/dist/plugins/walrus/mode/known-deploy.d.mts +25 -0
- package/dist/plugins/walrus/mode/known-deploy.mjs +71 -0
- package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -0
- package/dist/plugins/walrus/mode/local-cluster.d.mts +34 -0
- package/dist/plugins/walrus/mode/local-cluster.mjs +153 -0
- package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -0
- package/dist/plugins/walrus/plugin-key.mjs +7 -0
- package/dist/plugins/walrus/plugin-key.mjs.map +1 -0
- package/dist/plugins/walrus/registry-publish.d.mts +24 -0
- package/dist/plugins/walrus/registry-publish.mjs +7 -0
- package/dist/plugins/walrus/registry-publish.mjs.map +1 -0
- package/dist/plugins/walrus/routable.mjs +99 -0
- package/dist/plugins/walrus/routable.mjs.map +1 -0
- package/dist/plugins/walrus/service.mjs +20 -0
- package/dist/plugins/walrus/service.mjs.map +1 -0
- package/dist/plugins/walrus/snapshot.mjs +53 -0
- package/dist/plugins/walrus/snapshot.mjs.map +1 -0
- package/dist/plugins/walrus/storage-nodes.d.mts +15 -0
- package/dist/plugins/walrus/storage-nodes.mjs +154 -0
- package/dist/plugins/walrus/storage-nodes.mjs.map +1 -0
- package/dist/plugins/walrus/wal-swap.d.mts +2 -0
- package/dist/plugins/walrus/wal-swap.mjs +58 -0
- package/dist/plugins/walrus/wal-swap.mjs.map +1 -0
- package/dist/primitives/artifact-publisher.d.mts +12 -0
- package/dist/primitives/cache.d.mts +1 -0
- package/dist/runtime/built-in-plugin-layers.mjs +49 -0
- package/dist/runtime/built-in-plugin-layers.mjs.map +1 -0
- package/dist/runtime/docker/client.d.mts +2 -0
- package/dist/runtime/docker/client.mjs +54 -0
- package/dist/runtime/docker/client.mjs.map +1 -0
- package/dist/runtime/docker/container.d.mts +1 -0
- package/dist/runtime/docker/container.mjs +562 -0
- package/dist/runtime/docker/container.mjs.map +1 -0
- package/dist/runtime/docker/errors.d.mts +1 -0
- package/dist/runtime/docker/errors.mjs +187 -0
- package/dist/runtime/docker/errors.mjs.map +1 -0
- package/dist/runtime/docker/exec.d.mts +1 -0
- package/dist/runtime/docker/exec.mjs +63 -0
- package/dist/runtime/docker/exec.mjs.map +1 -0
- package/dist/runtime/docker/image.d.mts +1 -0
- package/dist/runtime/docker/image.mjs +278 -0
- package/dist/runtime/docker/image.mjs.map +1 -0
- package/dist/runtime/docker/index.d.mts +1 -0
- package/dist/runtime/docker/inventory.d.mts +1 -0
- package/dist/runtime/docker/inventory.mjs +167 -0
- package/dist/runtime/docker/inventory.mjs.map +1 -0
- package/dist/runtime/docker/labels.d.mts +1 -0
- package/dist/runtime/docker/labels.mjs +97 -0
- package/dist/runtime/docker/labels.mjs.map +1 -0
- package/dist/runtime/docker/logs.d.mts +1 -0
- package/dist/runtime/docker/logs.mjs +34 -0
- package/dist/runtime/docker/logs.mjs.map +1 -0
- package/dist/runtime/docker/network.d.mts +1 -0
- package/dist/runtime/docker/network.mjs +168 -0
- package/dist/runtime/docker/network.mjs.map +1 -0
- package/dist/runtime/docker/service.d.mts +9 -0
- package/dist/runtime/docker/service.mjs +266 -0
- package/dist/runtime/docker/service.mjs.map +1 -0
- package/dist/runtime/docker/sweep.d.mts +1 -0
- package/dist/runtime/docker/sweep.mjs +220 -0
- package/dist/runtime/docker/sweep.mjs.map +1 -0
- package/dist/runtime/docker/volume.d.mts +1 -0
- package/dist/runtime/docker/volume.mjs +24 -0
- package/dist/runtime/docker/volume.mjs.map +1 -0
- package/dist/runtime/docker/wrap.d.mts +1 -0
- package/dist/runtime/docker/wrap.mjs +131 -0
- package/dist/runtime/docker/wrap.mjs.map +1 -0
- package/dist/substrate/brand.d.mts +24 -0
- package/dist/substrate/brand.mjs +14 -0
- package/dist/substrate/brand.mjs.map +1 -0
- package/dist/substrate/cross-process.d.mts +1 -0
- package/dist/substrate/cross-process.mjs +28 -0
- package/dist/substrate/cross-process.mjs.map +1 -0
- package/dist/substrate/events.d.mts +117 -0
- package/dist/substrate/identity.d.mts +13 -0
- package/dist/substrate/lifecycle.d.mts +12 -0
- package/dist/substrate/manifest.d.mts +39 -0
- package/dist/substrate/manifest.mjs +33 -0
- package/dist/substrate/manifest.mjs.map +1 -0
- package/dist/substrate/network.d.mts +34 -0
- package/dist/substrate/options.d.mts +23 -0
- package/dist/substrate/plugin.d.mts +101 -0
- package/dist/substrate/plugin.mjs +61 -0
- package/dist/substrate/plugin.mjs.map +1 -0
- package/dist/substrate/projection.d.mts +100 -0
- package/dist/substrate/runtime/artifact-publisher/index.mjs +76 -0
- package/dist/substrate/runtime/artifact-publisher/index.mjs.map +1 -0
- package/dist/substrate/runtime/atomic-write.mjs +106 -0
- package/dist/substrate/runtime/atomic-write.mjs.map +1 -0
- package/dist/substrate/runtime/cache/index.d.mts +1 -0
- package/dist/substrate/runtime/cache/schema.d.mts +1 -0
- package/dist/substrate/runtime/cache/schema.mjs +22 -0
- package/dist/substrate/runtime/cache/schema.mjs.map +1 -0
- package/dist/substrate/runtime/cache/service.d.mts +1 -0
- package/dist/substrate/runtime/cache/service.mjs +89 -0
- package/dist/substrate/runtime/cache/service.mjs.map +1 -0
- package/dist/substrate/runtime/capability-sinks/index.d.mts +1 -0
- package/dist/substrate/runtime/capability-sinks/layer.d.mts +1 -0
- package/dist/substrate/runtime/capability-sinks/layer.mjs +31 -0
- package/dist/substrate/runtime/capability-sinks/layer.mjs.map +1 -0
- package/dist/substrate/runtime/capability-sinks/service.d.mts +36 -0
- package/dist/substrate/runtime/capability-sinks/service.mjs +74 -0
- package/dist/substrate/runtime/capability-sinks/service.mjs.map +1 -0
- package/dist/substrate/runtime/config-validation.d.mts +38 -0
- package/dist/substrate/runtime/config-validation.mjs +137 -0
- package/dist/substrate/runtime/config-validation.mjs.map +1 -0
- package/dist/substrate/runtime/context-helpers.mjs +32 -0
- package/dist/substrate/runtime/context-helpers.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +128 -0
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs +136 -0
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs +49 -0
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs +9 -0
- package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/liveness.mjs +119 -0
- package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/roster.mjs +275 -0
- package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.d.mts +1 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +117 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/stack-lock.d.mts +1 -0
- package/dist/substrate/runtime/cross-process/stack-lock.mjs +142 -0
- package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -0
- package/dist/substrate/runtime/current-plugin.mjs +15 -0
- package/dist/substrate/runtime/current-plugin.mjs.map +1 -0
- package/dist/substrate/runtime/errors.d.mts +1 -0
- package/dist/substrate/runtime/errors.mjs +76 -0
- package/dist/substrate/runtime/errors.mjs.map +1 -0
- package/dist/substrate/runtime/host-tree-tar/index.mjs +364 -0
- package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -0
- package/dist/substrate/runtime/http-probe.d.mts +35 -0
- package/dist/substrate/runtime/http-probe.mjs +65 -0
- package/dist/substrate/runtime/http-probe.mjs.map +1 -0
- package/dist/substrate/runtime/lease-broker/index.d.mts +1 -0
- package/dist/substrate/runtime/lease-broker/service.d.mts +64 -0
- package/dist/substrate/runtime/lease-broker/service.mjs +155 -0
- package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/dep-graph.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs +138 -0
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/index.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs +31 -0
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/plugin-registry.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +133 -0
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/ready-gate.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/ready-gate.mjs +34 -0
- package/dist/substrate/runtime/lifecycle/ready-gate.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/selective-restart.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs +43 -0
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/signals.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/signals.mjs +64 -0
- package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/state-machine.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/state-machine.mjs +38 -0
- package/dist/substrate/runtime/lifecycle/state-machine.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/watch-attribution.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/watch-attribution.mjs +27 -0
- package/dist/substrate/runtime/lifecycle/watch-attribution.mjs.map +1 -0
- package/dist/substrate/runtime/managed-container.d.mts +30 -0
- package/dist/substrate/runtime/managed-container.mjs +32 -0
- package/dist/substrate/runtime/managed-container.mjs.map +1 -0
- package/dist/substrate/runtime/manifest/manifest.mjs +73 -0
- package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -0
- package/dist/substrate/runtime/mode-errors.d.mts +36 -0
- package/dist/substrate/runtime/observability/cascade-formatter.d.mts +1 -0
- package/dist/substrate/runtime/observability/cascade-formatter.mjs +135 -0
- package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -0
- package/dist/substrate/runtime/observability/formatter-registry.d.mts +1 -0
- package/dist/substrate/runtime/observability/formatter-registry.mjs +65 -0
- package/dist/substrate/runtime/observability/formatter-registry.mjs.map +1 -0
- package/dist/substrate/runtime/observability/index.d.mts +3 -0
- package/dist/substrate/runtime/observability/logger.d.mts +58 -0
- package/dist/substrate/runtime/observability/logger.mjs +89 -0
- package/dist/substrate/runtime/observability/logger.mjs.map +1 -0
- package/dist/substrate/runtime/observability/pretty-error.d.mts +1 -0
- package/dist/substrate/runtime/observability/pretty-error.mjs +119 -0
- package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -0
- package/dist/substrate/runtime/observability/process-lines.d.mts +31 -0
- package/dist/substrate/runtime/observability/process-lines.mjs +40 -0
- package/dist/substrate/runtime/observability/process-lines.mjs.map +1 -0
- package/dist/substrate/runtime/observability/redaction.d.mts +28 -0
- package/dist/substrate/runtime/observability/redaction.mjs +45 -0
- package/dist/substrate/runtime/observability/redaction.mjs.map +1 -0
- package/dist/substrate/runtime/observability/spans.d.mts +1 -0
- package/dist/substrate/runtime/observability/spans.mjs +87 -0
- package/dist/substrate/runtime/observability/spans.mjs.map +1 -0
- package/dist/substrate/runtime/observability/subprocess-capture.d.mts +2 -0
- package/dist/substrate/runtime/observability/subprocess-capture.mjs +82 -0
- package/dist/substrate/runtime/observability/subprocess-capture.mjs.map +1 -0
- package/dist/substrate/runtime/paths.d.mts +17 -0
- package/dist/substrate/runtime/paths.mjs +61 -0
- package/dist/substrate/runtime/paths.mjs.map +1 -0
- package/dist/substrate/runtime/port-broker/index.d.mts +1 -0
- package/dist/substrate/runtime/port-broker/service.d.mts +1 -0
- package/dist/substrate/runtime/port-broker/service.mjs +319 -0
- package/dist/substrate/runtime/port-broker/service.mjs.map +1 -0
- package/dist/substrate/runtime/post-acquire-tasks.d.mts +1 -0
- package/dist/substrate/runtime/post-acquire-tasks.mjs +34 -0
- package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -0
- package/dist/substrate/runtime/probes.d.mts +51 -0
- package/dist/substrate/runtime/probes.mjs +84 -0
- package/dist/substrate/runtime/probes.mjs.map +1 -0
- package/dist/substrate/runtime/process-supervisor.d.mts +57 -0
- package/dist/substrate/runtime/process-supervisor.mjs +73 -0
- package/dist/substrate/runtime/process-supervisor.mjs.map +1 -0
- package/dist/substrate/runtime/projection/operational-endpoints.mjs +44 -0
- package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -0
- package/dist/substrate/runtime/projection/persisted.mjs +195 -0
- package/dist/substrate/runtime/projection/persisted.mjs.map +1 -0
- package/dist/substrate/runtime/projection/state-ref.mjs +48 -0
- package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -0
- package/dist/substrate/runtime/projection/update.mjs +200 -0
- package/dist/substrate/runtime/projection/update.mjs.map +1 -0
- package/dist/substrate/runtime/retry-policy.d.mts +18 -0
- package/dist/substrate/runtime/retry-policy.mjs +16 -0
- package/dist/substrate/runtime/retry-policy.mjs.map +1 -0
- package/dist/substrate/runtime/run.mjs +86 -0
- package/dist/substrate/runtime/run.mjs.map +1 -0
- package/dist/substrate/runtime/runtime-decode.d.mts +32 -0
- package/dist/substrate/runtime/runtime-decode.mjs +53 -0
- package/dist/substrate/runtime/runtime-decode.mjs.map +1 -0
- package/dist/substrate/runtime/scoped-http-server.mjs +36 -0
- package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -0
- package/dist/substrate/runtime/scoped-ref-map/service.mjs +83 -0
- package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +1 -0
- package/dist/substrate/runtime/stage-and-swap/index.d.mts +1 -0
- package/dist/substrate/runtime/stage-and-swap/index.mjs +131 -0
- package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -0
- package/dist/substrate/runtime/state-store/schema.mjs +36 -0
- package/dist/substrate/runtime/state-store/schema.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs +22 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs +30 -0
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/index.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/service.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/service.mjs +67 -0
- package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -0
- package/dist/substrate/runtime/sui-execute/index.d.mts +11 -0
- package/dist/substrate/runtime/sui-execute/index.mjs +144 -0
- package/dist/substrate/runtime/sui-execute/index.mjs.map +1 -0
- package/dist/substrate/runtime/sui-move-build/index.d.mts +1 -0
- package/dist/substrate/runtime/sui-move-build/index.mjs +283 -0
- package/dist/substrate/runtime/sui-move-build/index.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor.d.mts +1 -0
- package/dist/substrate/runtime/supervisor.mjs +831 -0
- package/dist/substrate/runtime/supervisor.mjs.map +1 -0
- package/dist/surfaces/cli/command-tree.mjs +276 -0
- package/dist/surfaces/cli/command-tree.mjs.map +1 -0
- package/dist/surfaces/cli/commands/config.mjs +31 -0
- package/dist/surfaces/cli/commands/config.mjs.map +1 -0
- package/dist/surfaces/cli/commands/confirm-node.mjs +26 -0
- package/dist/surfaces/cli/commands/confirm-node.mjs.map +1 -0
- package/dist/surfaces/cli/commands/confirm.mjs +26 -0
- package/dist/surfaces/cli/commands/confirm.mjs.map +1 -0
- package/dist/surfaces/cli/commands/doctor-probes.mjs +452 -0
- package/dist/surfaces/cli/commands/doctor-probes.mjs.map +1 -0
- package/dist/surfaces/cli/commands/doctor.mjs +38 -0
- package/dist/surfaces/cli/commands/doctor.mjs.map +1 -0
- package/dist/surfaces/cli/commands/prune-picker.mjs +347 -0
- package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -0
- package/dist/surfaces/cli/commands/prune.mjs +178 -0
- package/dist/surfaces/cli/commands/prune.mjs.map +1 -0
- package/dist/surfaces/cli/commands/snapshot.mjs +141 -0
- package/dist/surfaces/cli/commands/snapshot.mjs.map +1 -0
- package/dist/surfaces/cli/commands/status.mjs +95 -0
- package/dist/surfaces/cli/commands/status.mjs.map +1 -0
- package/dist/surfaces/cli/commands/supervisor-presence.mjs +33 -0
- package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -0
- package/dist/surfaces/cli/commands/wipe.mjs +28 -0
- package/dist/surfaces/cli/commands/wipe.mjs.map +1 -0
- package/dist/surfaces/cli/envelope.mjs +43 -0
- package/dist/surfaces/cli/envelope.mjs.map +1 -0
- package/dist/surfaces/cli/errors.mjs +110 -0
- package/dist/surfaces/cli/errors.mjs.map +1 -0
- package/dist/surfaces/cli/flags.mjs +56 -0
- package/dist/surfaces/cli/flags.mjs.map +1 -0
- package/dist/surfaces/cli/index.mjs +418 -0
- package/dist/surfaces/cli/index.mjs.map +1 -0
- package/dist/surfaces/cli/output.mjs +115 -0
- package/dist/surfaces/cli/output.mjs.map +1 -0
- package/dist/surfaces/cli/sysexits.mjs +139 -0
- package/dist/surfaces/cli/sysexits.mjs.map +1 -0
- package/dist/surfaces/tui/app.mjs +104 -0
- package/dist/surfaces/tui/app.mjs.map +1 -0
- package/dist/surfaces/tui/dashboard.mjs +261 -0
- package/dist/surfaces/tui/dashboard.mjs.map +1 -0
- package/dist/surfaces/tui/display-derivation.mjs +395 -0
- package/dist/surfaces/tui/display-derivation.mjs.map +1 -0
- package/dist/surfaces/tui/errors.mjs +11 -0
- package/dist/surfaces/tui/errors.mjs.map +1 -0
- package/dist/surfaces/tui/event-log.mjs +155 -0
- package/dist/surfaces/tui/event-log.mjs.map +1 -0
- package/dist/surfaces/tui/heartbeat.mjs +33 -0
- package/dist/surfaces/tui/heartbeat.mjs.map +1 -0
- package/dist/surfaces/tui/index.mjs +50 -0
- package/dist/surfaces/tui/index.mjs.map +1 -0
- package/dist/surfaces/tui/input.mjs +104 -0
- package/dist/surfaces/tui/input.mjs.map +1 -0
- package/dist/surfaces/tui/mode-detect.mjs +32 -0
- package/dist/surfaces/tui/mode-detect.mjs.map +1 -0
- package/dist/surfaces/tui/mount-ink.mjs +31 -0
- package/dist/surfaces/tui/mount-ink.mjs.map +1 -0
- package/dist/surfaces/tui/plain-renderer.mjs +170 -0
- package/dist/surfaces/tui/plain-renderer.mjs.map +1 -0
- package/dist/surfaces/tui/resource-table.mjs +507 -0
- package/dist/surfaces/tui/resource-table.mjs.map +1 -0
- package/images/_shared/signal-forward.sh +77 -0
- package/images/postgres/Dockerfile +32 -0
- package/images/seal/Dockerfile +68 -0
- package/images/seal/entrypoint.sh +65 -0
- package/images/sui/Dockerfile +73 -0
- package/images/sui/entrypoint.sh +244 -0
- package/images/sui-fork/Dockerfile +53 -0
- package/images/sui-fork/entrypoint.sh +51 -0
- package/images/walrus/Dockerfile +122 -0
- package/images/walrus/deploy-walrus.sh +305 -0
- package/images/walrus/run-walrus.sh +53 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.mjs","names":["Logger"],"sources":["../../../src/substrate/runtime/supervisor.ts"],"sourcesContent":["// Stack supervisor — the substrate's orchestrator.\n//\n// Architecture § Engine / supervisor split:\n// \"Stack supervisor (L0): the outer driver — boot identity, consult\n// network resolver, run scheduler, fire shutdown finalizers, emit\n// lifecycle events.\"\n//\n// Responsibilities:\n// - Resolve the plugin graph from a `Stack` value.\n// - Start plugins in dep order; each plugin's `start` runs under\n// its own Scope; ready-gate awaits its start effect.\n// - Maintain the per-plugin lifecycle state machine.\n// - Emit typed `EngineEvent`s onto the projection ref + event hub.\n// - Watch invalidation → selective restart through the dep-graph\n// closure planner.\n// - SIGINT/SIGTERM → graceful drain; second signal escalates to abort.\n// - Restart / drain / shutdown commands on the command stream.\n\n// What's explicitly NOT here:\n// - The thick watcher (L0 primitive — separate module).\n// - The cause walker / cascade formatter (shared between supervisor\n// and renderer, lives under `observability/`).\n// - Cache eviction / strategy-registry mutation (separate modules).\n// - Container runtime (L1 adapter; supervisor doesn't know docker).\n\nimport {\n\tCause,\n\tContext,\n\tData,\n\tDeferred,\n\tEffect,\n\tExit,\n\tFiber,\n\tLayer,\n\tQueue,\n\tRef,\n\tScope,\n\tSubscriptionRef,\n} from 'effect';\n\nimport type { CapabilityDecl } from '../../contracts/capability-decl.ts';\nimport type {\n\tStrategyContributorDecl,\n\tStrategyRegistry,\n} from '../../contracts/strategy-contributor.ts';\nimport type { PluginKey } from '../brand.ts';\nimport type { EngineCommand, EngineEvent } from '../events.ts';\nimport type { Identity } from '../identity.ts';\nimport type { LifecycleStatus, PluginRole } from '../lifecycle.ts';\nimport type { DevstackOptions } from '../options.ts';\nimport {\n\tresolvePluginDependencies,\n\ttype AcquireContext,\n\ttype AnyPlugin,\n\ttype PluginErrorContribution,\n} from '../plugin.ts';\nimport type { AccountProjection, SubscribableState } from '../projection.ts';\nimport {\n\tCapabilitySinksService,\n\tlayerCapabilitySinksDefault,\n\ttype AnyContribution,\n\ttype CapabilitySinksShape,\n\ttype HarvestContext,\n\ttype OrchestratorSinks,\n} from './capability-sinks/index.ts';\nimport { CurrentPluginKey, CurrentPluginProgress } from './current-plugin.ts';\nimport {\n\tLogger,\n\ttype LoggerShape,\n\twithPluginSpan,\n\twithStackSpan,\n\tannotatePhase,\n\tannotateOp,\n\tprettyErrorStructured,\n} from './observability/index.ts';\nimport { PostAcquireTaskFailed } from './post-acquire-tasks.ts';\nimport { RuntimeRoot } from './paths.ts';\nimport { getOrDefault, getOrDefaultEffect } from './context-helpers.ts';\nimport { operationalEndpointEventsFromResolvedValue } from './projection/operational-endpoints.ts';\nimport { declareAccount, setIdentity, updateRef } from './projection/update.ts';\nimport {\n\tawaitUpstreams,\n\tbuildDependencyReaderFor,\n\tbuildWatchIndex,\n\texactPrefixMatch,\n\tinstallSignalHandler,\n\tisReadyOrTerminal,\n\tmakeEntry,\n\tmakeRegistry,\n\tplanFullDrain,\n\tplanRestart,\n\tresolveGraph,\n\ttype DepGraphError,\n\ttype PluginAcquireFailed,\n\ttype PluginEntry,\n\ttype PluginRegistry,\n\ttype ResolvedGraph,\n\ttype RestartTargetMissing,\n\ttype UnknownDependency,\n\ttype WatchEntry,\n} from './lifecycle/index.ts';\nimport { StrategyRegistryService } from './strategy-registry/service.ts';\n\n// -----------------------------------------------------------------------------\n// Public Stack shape (mirror — `define-devstack.ts` exports)\n// -----------------------------------------------------------------------------\n\n/** Minimum surface the supervisor reads off a `Stack`. The full\n * `Stack<Members>` shape lives in `api/define-devstack.ts` and carries\n * type-level provenance — at the runtime boundary the supervisor only\n * needs the erased plugin list + options. */\nexport interface SupervisedStack {\n\treadonly _tag: 'Stack';\n\treadonly members: ReadonlyArray<AnyPlugin>;\n\treadonly options: DevstackOptions;\n}\n\n// -----------------------------------------------------------------------------\n// Errors\n// -----------------------------------------------------------------------------\n\nexport class SupervisorBootError extends Data.TaggedError('SupervisorBootError')<{\n\treadonly cause: DepGraphError;\n}> {}\n\nexport class SupervisorPostAcquireFailed extends Data.TaggedError('SupervisorPostAcquireFailed')<{\n\treadonly cause: Cause.Cause<unknown>;\n}> {}\n\nexport class CapabilityFactoryFailed extends Data.TaggedError('CapabilityFactoryFailed')<{\n\treadonly pluginKey: PluginKey;\n\treadonly message: string;\n\treadonly cause: unknown;\n}> {}\n\n/** Fallback used when the supervisor's `pluginContext` doesn't carry a\n * Logger service. Swallows every line — the trade-off is that bare\n * `supervise()` smoke tests stay log-free, while the wired CLI / e2e\n * layer stack picks up the real Logger. */\nconst noopLogger: LoggerShape = {\n\tlog: () => Effect.void,\n\treadTag: () => Effect.succeed({ lines: [], truncated: false }),\n\treadAll: Effect.succeed(new Map()),\n\tclearTag: () => Effect.void,\n};\n\nconst projectionLevel = (\n\tlevel: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal',\n): Extract<EngineEvent, { tag: 'log.appended' }>['level'] | null => {\n\tswitch (level) {\n\t\tcase 'trace':\n\t\tcase 'debug':\n\t\t\treturn null;\n\t\tcase 'info':\n\t\t\treturn 'info';\n\t\tcase 'warn':\n\t\t\treturn 'warn';\n\t\tcase 'error':\n\t\tcase 'fatal':\n\t\t\treturn 'error';\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = level;\n\t\t\tvoid _exhaustive;\n\t\t\treturn 'info';\n\t\t}\n\t}\n};\n\nconst withEventPublishingLogger = (\n\tbase: LoggerShape,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n): LoggerShape => ({\n\t...base,\n\tlog: (tag, pluginKey, payload) =>\n\t\tEffect.gen(function* () {\n\t\t\tyield* base.log(tag, pluginKey, payload);\n\t\t\tif (pluginKey === null) return;\n\t\t\tconst level = projectionLevel(payload.level);\n\t\t\tif (level === null) return;\n\t\t\tyield* publish(ref, hub, {\n\t\t\t\ttag: 'log.appended',\n\t\t\t\tpluginKey,\n\t\t\t\tline: payload.message,\n\t\t\t\tlevel,\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t}),\n});\n\nexport type SupervisorError =\n\t| SupervisorBootError\n\t| SupervisorPostAcquireFailed\n\t| CapabilityFactoryFailed\n\t| PluginAcquireFailed\n\t| RestartTargetMissing\n\t| UnknownDependency;\n\nconst noopStrategyRegistry: StrategyRegistry = {\n\tget: (key) =>\n\t\tEffect.fail({\n\t\t\t_tag: 'StrategyNotFoundError',\n\t\t\tcapabilityKey: key,\n\t\t\tregisteredKeys: [],\n\t\t}),\n\tlist: () => Effect.succeed([]),\n\tregister: () => Effect.void,\n};\n\nexport interface SupervisorCommandHandlerContext {\n\treadonly publish: (event: EngineEvent) => Effect.Effect<void, never, never>;\n}\n\nexport type SupervisorCommandHandler = (\n\tcmd: EngineCommand,\n\tctx: SupervisorCommandHandlerContext,\n) => Effect.Effect<ReadonlyArray<EngineEvent>, unknown, never>;\n\nexport interface SupervisorPostAcquireContext {\n\treadonly graph: ResolvedGraph;\n\treadonly registry: PluginRegistry;\n\treadonly identity: Identity;\n\treadonly runtimeRoot: string;\n}\n\nexport type SupervisorPostAcquireHook = (\n\tctx: SupervisorPostAcquireContext,\n) => Effect.Effect<ReadonlyArray<EngineEvent>, unknown, never>;\n\n// -----------------------------------------------------------------------------\n// Event publishing\n// -----------------------------------------------------------------------------\n\n/** Publishing helper: writes the event to the projection ref AND\n * enqueues it onto the live event hub for renderers that subscribe to\n * the raw stream. */\nconst publish = (\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\tevent: EngineEvent,\n): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tyield* updateRef(ref, event);\n\t\tyield* Queue.offer(hub, event);\n\t});\n\nconst setCyclePhase = (\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\tphase: SubscribableState['cycle']['phase'],\n): Effect.Effect<void> =>\n\tSubscriptionRef.update(ref, (state) => ({\n\t\t...state,\n\t\tcycle: {\n\t\t\t...state.cycle,\n\t\t\tstartedAt: state.cycle.startedAt === 0 ? Date.now() : state.cycle.startedAt,\n\t\t\tphase,\n\t\t},\n\t}));\n\n/** Build the registry's `onTransition` callback — turns status changes\n * into typed events. */\nconst buildTransitionEmitter =\n\t(\n\t\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\t\thub: Queue.Enqueue<EngineEvent>,\n\t): ((key: PluginKey, from: LifecycleStatus, to: LifecycleStatus) => Effect.Effect<void>) =>\n\t(key, from, to) =>\n\t\tpublish(ref, hub, {\n\t\t\ttag: 'lifecycle.statusChanged',\n\t\t\tpluginKey: key,\n\t\t\tfrom,\n\t\t\tto,\n\t\t\tat: Date.now(),\n\t\t});\n\n// -----------------------------------------------------------------------------\n// Boot the registry from a graph\n// -----------------------------------------------------------------------------\n\nconst buildRegistry = (\n\tgraph: ResolvedGraph,\n\tparentScope: Scope.Scope,\n\temit: (key: PluginKey, from: LifecycleStatus, to: LifecycleStatus) => Effect.Effect<void>,\n): Effect.Effect<PluginRegistry, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst entries = new Map<PluginKey, PluginEntry>();\n\t\tfor (const [key, node] of graph.nodes) {\n\t\t\tconst entry = yield* makeEntry(node, parentScope);\n\t\t\tentries.set(key, entry);\n\t\t}\n\t\treturn makeRegistry(entries, emit);\n\t});\n\n// -----------------------------------------------------------------------------\n// Capability sinks — orchestrator registration callbacks\n// -----------------------------------------------------------------------------\n//\n// The substrate-name-blind kind→sink registry lives in\n// `capability-sinks/`. The supervisor accepts an `OrchestratorSinks`\n// bag (the L3 orchestrator's callbacks) and the substrate composes it\n// into the `CapabilitySinksService` Layer that backs the harvest loop.\n// `OrchestratorSinks` is re-exported from this module so existing\n// callers (CLI, e2e tests) keep their import paths.\n\nexport type { OrchestratorSinks } from './capability-sinks/index.ts';\n\n/**\n * Resolve a plugin's `capabilities` field to a concrete decl tuple.\n *\n * Two accepted shapes (see `Plugin.capabilities` for the\n * authoring-side contract):\n *\n * (a) Static — a plain `ReadonlyArray<CapabilityDecl>`. Returned\n * as-is.\n *\n * (b) Dynamic — a `CapabilitiesFactory<…>` function. Invoked with\n * the resolved plugin value + the acquire context built from\n * the supervisor's identity + runtime root. The function is\n * called once per acquire (post-success); the returned tuple\n * flows into `dispatchContributions` like a static one.\n *\n * The dynamic seam exists so plugins' snapshot subtrees, codegen\n * bindings, routable URLs, strategy contributions, etc. can stamp\n * the REAL chain id / package id / network alias produced by their\n * acquire body, instead of the factory-time placeholder strings the\n * static form forces.\n *\n * The substrate stays generic: this resolver doesn't know any\n * service name; the discrimination is purely structural\n * (`typeof === 'function'`).\n */\nconst resolveCapabilities = (\n\tpluginKey: PluginKey,\n\tfield:\n\t\t| ReadonlyArray<CapabilityDecl>\n\t\t| ((resolved: unknown, ctx: AcquireContext) => ReadonlyArray<CapabilityDecl>)\n\t\t| undefined,\n\tresolved: unknown,\n\tacquireContext: AcquireContext,\n): Effect.Effect<ReadonlyArray<CapabilityDecl>, CapabilityFactoryFailed> => {\n\tif (field === undefined) return Effect.succeed([]);\n\tif (typeof field === 'function') {\n\t\treturn Effect.try({\n\t\t\ttry: () => field(resolved, acquireContext),\n\t\t\tcatch: (cause) =>\n\t\t\t\tnew CapabilityFactoryFailed({\n\t\t\t\t\tpluginKey,\n\t\t\t\t\tmessage: `capability factory failed for ${pluginKey}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t});\n\t}\n\treturn Effect.succeed(field);\n};\n\n/**\n * Walk a plugin's `capabilities` tuple + `errorContributions` after a\n * successful acquire, route every contribution through the\n * substrate-owned `CapabilitySinksService`. The plugin's scope is\n * provided so each sink's `addFinalizer` lands on the plugin's scope —\n * registrations reap on selective-restart / shutdown.\n *\n * The supervisor stays kind-blind: it builds the contribution union\n * (`{source: 'capability'|'error', ...}`) and the dispatch happens\n * inside the service. Unknown kinds are downgraded to no-ops here so\n * the substrate-open-by-default contract holds — plugin authors can\n * emit a custom-kind decl that is observed only by the orchestrators\n * that registered the matching sink.\n */\nconst dispatchContributions = (\n\tpluginKey: PluginKey,\n\tcapabilities: ReadonlyArray<CapabilityDecl>,\n\terrorContributions: ReadonlyArray<PluginErrorContribution>,\n\tpluginRole: PluginRole,\n\tidentity: Identity,\n\tpluginContext: Context.Context<never>,\n\tpluginScope: Scope.Scope,\n\tsinks: CapabilitySinksShape,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n): Effect.Effect<void, unknown, never> =>\n\tEffect.gen(function* () {\n\t\tconst strategyRegistry = getOrDefault(\n\t\t\tpluginContext,\n\t\t\tStrategyRegistryService,\n\t\t\tnoopStrategyRegistry,\n\t\t);\n\t\tconst harvestCtx: HarvestContext = {\n\t\t\tpluginKey,\n\t\t\tidentity,\n\t\t\tpublish: (event) => publish(ref, hub, event),\n\t\t\tregisterStrategy: (decl: StrategyContributorDecl<string, unknown>) =>\n\t\t\t\tstrategyRegistry.register(decl.capabilityKey, decl.strategy, {\n\t\t\t\t\tautoMounted: decl.autoMounted,\n\t\t\t\t\t...(decl.priority === undefined ? {} : { priority: decl.priority }),\n\t\t\t\t}),\n\t\t};\n\n\t\tconst items: ReadonlyArray<AnyContribution> = [\n\t\t\t...capabilities.map<AnyContribution>((decl) => ({\n\t\t\t\tsource: 'capability',\n\t\t\t\tdecl,\n\t\t\t})),\n\t\t\t...errorContributions.map<AnyContribution>((contribution) => ({\n\t\t\t\tsource: 'error',\n\t\t\t\tcontribution,\n\t\t\t})),\n\t\t];\n\n\t\tfor (const item of items) {\n\t\t\tconst dispatch = sinks\n\t\t\t\t.dispatch(item, harvestCtx)\n\t\t\t\t.pipe(Effect.catchTag('UnknownContributionKind', () => Effect.void));\n\t\t\tyield* Scope.provide(dispatch, pluginScope);\n\t\t}\n\t}).pipe(\n\t\twithPluginSpan('lifecycle.supervisor.dispatchContributions', {\n\t\t\tapp: identity.app,\n\t\t\tstack: identity.stack,\n\t\t\tnetwork: identity.chain,\n\t\t\tpluginKey,\n\t\t\trole: pluginRole,\n\t\t}),\n\t);\n\n// -----------------------------------------------------------------------------\n// Acquire one node\n// -----------------------------------------------------------------------------\n\n/**\n * Run one node's `start` under its own scope. Steps:\n * 1. Await upstreams (their ready-gates).\n * 2. Transition `pending → acquiring` (publishes the event).\n * 3. Build resolved dependency values from declared resource refs.\n * 4. Run the plugin's `start` Effect inside the entry's Scope,\n * after providing the substrate-context services bundle so the\n * plugin's R-channel yields (`IdentityContext`,\n * `ContainerRuntimeService`, etc.) resolve to live instances.\n * 5. On success: stash the resolved value + `markReady` (publishes\n * the `ready` transition).\n * 6. On failure: `markFailed` (publishes the `failed` transition, fails\n * the deferred so downstream consumers short-circuit).\n *\n * Errors are caught and stashed onto the registry entry — the outer\n * scheduler doesn't propagate per-plugin failures; ready-gate failure\n * propagation handles the downstream blocking. The supervisor's outer\n * fiber surfaces the union via `Fiber.join` when the user asks for\n * \"stack ready or err\".\n */\nconst acquireNode = (\n\tregistry: PluginRegistry,\n\tkey: PluginKey,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\tpluginContext: Context.Context<never>,\n\tsinks: CapabilitySinksShape,\n\tlogger: LoggerShape,\n\tidentity: Identity,\n\truntimeRoot: string,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst entry = registry.entries.get(key);\n\t\tif (entry === undefined) return;\n\t\t// Wait for upstreams. If any failed, mark this one failed too —\n\t\t// the cause walker carries the upstream's `PluginAcquireFailed`.\n\t\tconst upstreamWait = awaitUpstreams(registry, entry.node).pipe(\n\t\t\tEffect.matchEffect({\n\t\t\t\tonFailure: (cause) =>\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* registry.markFailed(key, cause).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t\treturn false as const;\n\t\t\t\t\t}),\n\t\t\t\tonSuccess: () => Effect.succeed(true as const),\n\t\t\t}),\n\t\t);\n\t\tconst ok = yield* upstreamWait;\n\t\tif (ok !== true) {\n\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\tlevel: 'warn',\n\t\t\t\tmessage: 'plugin acquire skipped — upstream failed',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tyield* annotatePhase('acquire');\n\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\tlevel: 'debug',\n\t\t\tmessage: 'plugin acquire start',\n\t\t\tfields: { role: entry.node.member.role },\n\t\t});\n\t\tyield* registry.transition(key, 'acquiring').pipe(Effect.catch(() => Effect.void));\n\t\t// Build resolved dependency values over the registry's resolved\n\t\t// values, then run the plugin's `start` against the entry's\n\t\t// Scope via `Scope.provide` — provides the scope to the acquire\n\t\t// effect's requirements WITHOUT closing it (unlike `Scope.use`,\n\t\t// which closes on exit). Finalizers stay registered on the\n\t\t// entry's scope; the supervisor closes the scope explicitly in\n\t\t// `teardownNode`.\n\t\t//\n\t\t// `Effect.provide(pluginContext)` injects the substrate-context\n\t\t// services the plugin's acquire body yields (Identity,\n\t\t// ContainerRuntime, etc.). The plugin's R channel narrows from\n\t\t// the per-plugin union to `Scope.Scope` once these are provided;\n\t\t// `Scope.provide` then absorbs the scope itself. After both,\n\t\t// R = never — safe to run inside the supervisor's `never` fiber.\n\t\tconst readDependency = buildDependencyReaderFor(registry, entry.node);\n\t\tconst deps = resolvePluginDependencies(entry.node.member, readDependency);\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst start = entry.node.member.start as (\n\t\t\tdeps: unknown,\n\t\t) => Effect.Effect<unknown, unknown, any>;\n\t\tconst currentPluginContext = pluginContext.pipe(\n\t\t\tContext.add(CurrentPluginKey, { key }),\n\t\t\tContext.add(CurrentPluginProgress, {\n\t\t\t\tsetPhase: (phase) =>\n\t\t\t\t\tpublish(ref, hub, {\n\t\t\t\t\t\ttag: 'lifecycle.phaseSet',\n\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t}),\n\t\t\t}),\n\t\t);\n\t\tconst providedAcquire = Effect.provide(start(deps), currentPluginContext) as Effect.Effect<\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tScope.Scope\n\t\t>;\n\t\tconst result = yield* Scope.provide(providedAcquire, entry.scope).pipe(\n\t\t\tEffect.matchEffect({\n\t\t\t\tonFailure: (cause) =>\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* registry.markFailed(key, cause).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t\tyield* publish(ref, hub, {\n\t\t\t\t\t\t\ttag: 'error.reported',\n\t\t\t\t\t\t\terror: prettyErrorStructured(Cause.fail(cause), {\n\t\t\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t\t\t\tseverity: 'error',\n\t\t\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn { ok: false as const };\n\t\t\t\t\t}),\n\t\t\t\tonSuccess: (value: unknown) =>\n\t\t\t\t\tEffect.succeed({ ok: true as const, value: value as unknown }),\n\t\t\t}),\n\t\t);\n\t\tif (result.ok) {\n\t\t\t// Harvest contributions:\n\t\t\t// 1. The plugin's `capabilities` tuple (or post-acquire\n\t\t\t// dynamic factory) — yields `CapabilityDecl`s.\n\t\t\t// 2. The plugin's `errorContributions` field — yields\n\t\t\t// `PluginErrorContribution`s for the FormatterRegistry.\n\t\t\t// Registrations land on the plugin's scope so they reap on\n\t\t\t// plugin teardown (selective restart, shutdown). The\n\t\t\t// supervisor stays kind-blind: routing is the registry's job.\n\t\t\tconst acquireContext: AcquireContext = {\n\t\t\t\tidentity,\n\t\t\t\tchain: identity.chain,\n\t\t\t\truntimeRoot,\n\t\t\t};\n\t\t\tconst capsExit = yield* Effect.exit(\n\t\t\t\tresolveCapabilities(\n\t\t\t\t\tkey,\n\t\t\t\t\tentry.node.member.capabilities as\n\t\t\t\t\t\t| ReadonlyArray<CapabilityDecl>\n\t\t\t\t\t\t| ((r: unknown, c: AcquireContext) => ReadonlyArray<CapabilityDecl>)\n\t\t\t\t\t\t| undefined,\n\t\t\t\t\tresult.value,\n\t\t\t\t\tacquireContext,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (Exit.isFailure(capsExit)) {\n\t\t\t\tyield* registry.markFailed(key, capsExit.cause).pipe(Effect.catch(() => Effect.void));\n\t\t\t\tyield* publish(ref, hub, {\n\t\t\t\t\ttag: 'error.reported',\n\t\t\t\t\terror: prettyErrorStructured(capsExit.cause, {\n\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t\tseverity: 'error',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\t\tlevel: 'error',\n\t\t\t\t\tmessage: 'plugin capability factory failed',\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst caps = capsExit.value;\n\t\t\tconst errorContributions = entry.node.member.errorContributions ?? [];\n\t\t\tif (caps.length > 0 || errorContributions.length > 0) {\n\t\t\t\tconst dispatchExit = yield* Effect.exit(\n\t\t\t\t\tdispatchContributions(\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tcaps,\n\t\t\t\t\t\terrorContributions,\n\t\t\t\t\t\tentry.node.member.role,\n\t\t\t\t\t\tidentity,\n\t\t\t\t\t\tpluginContext,\n\t\t\t\t\t\tentry.scope,\n\t\t\t\t\t\tsinks,\n\t\t\t\t\t\tref,\n\t\t\t\t\t\thub,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tif (Exit.isFailure(dispatchExit)) {\n\t\t\t\t\tyield* registry.markFailed(key, dispatchExit.cause).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\tyield* publish(ref, hub, {\n\t\t\t\t\t\ttag: 'error.reported',\n\t\t\t\t\t\terror: prettyErrorStructured(dispatchExit.cause, {\n\t\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t\t\tseverity: 'error',\n\t\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\t\t\tlevel: 'error',\n\t\t\t\t\t\tmessage: 'plugin capability dispatch failed',\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst routablesPresent = caps.some((capability) => capability.kind === 'routable');\n\t\t\tfor (const event of operationalEndpointEventsFromResolvedValue(\n\t\t\t\tkey,\n\t\t\t\tresult.value,\n\t\t\t\tDate.now(),\n\t\t\t\t{\n\t\t\t\t\troutablesPresent,\n\t\t\t\t},\n\t\t\t)) {\n\t\t\t\tyield* publish(ref, hub, event);\n\t\t\t}\n\t\t\tyield* publish(ref, hub, {\n\t\t\t\ttag: 'lifecycle.phaseSet',\n\t\t\t\tpluginKey: key,\n\t\t\t\tphase: null,\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t\t// `markReady` populates the synchronous resolved-value map AND\n\t\t\t// resolves the deferred; downstream dependency resolution reads\n\t\t\t// from the former.\n\t\t\tyield* registry.markReady(key, result.value).pipe(Effect.catch(() => Effect.void));\n\t\t\tif (entry.node.member.role === 'task') {\n\t\t\t\tyield* registry.transition(key, 'done').pipe(Effect.catch(() => Effect.void));\n\t\t\t}\n\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\tlevel: 'debug',\n\t\t\t\tmessage: entry.node.member.role === 'task' ? 'plugin done' : 'plugin ready',\n\t\t\t\tfields: {\n\t\t\t\t\tcapabilities: caps.length,\n\t\t\t\t\terrorContributions: errorContributions.length,\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\tlevel: 'debug',\n\t\t\t\tmessage: 'plugin acquire failed',\n\t\t\t});\n\t\t}\n\t}).pipe(\n\t\twithPluginSpan('lifecycle.supervisor.acquireNode', {\n\t\t\tapp: identity.app,\n\t\t\tstack: identity.stack,\n\t\t\tnetwork: identity.chain,\n\t\t\tpluginKey: key,\n\t\t\trole: registry.entries.get(key)?.node.member.role ?? 'service',\n\t\t}),\n\t);\n\n// -----------------------------------------------------------------------------\n// Acquire a key set in parallel. Each node waits on its own upstreams,\n// so downstream nodes begin as soon as their dependencies are ready\n// instead of waiting for unrelated nodes in the same topological level.\n// -----------------------------------------------------------------------------\n\nconst acquireKeys = (\n\tregistry: PluginRegistry,\n\tkeys: ReadonlyArray<PluginKey>,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\tpluginContext: Context.Context<never>,\n\tsinks: CapabilitySinksShape,\n\tlogger: LoggerShape,\n\tidentity: Identity,\n\truntimeRoot: string,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tyield* Effect.annotateCurrentSpan({ 'devstack.level.size': keys.length });\n\t\tyield* Effect.all(\n\t\t\tkeys.map((key) =>\n\t\t\t\tacquireNode(registry, key, ref, hub, pluginContext, sinks, logger, identity, runtimeRoot),\n\t\t\t),\n\t\t\t{ concurrency: 'unbounded', discard: true },\n\t\t);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.acquireKeys'));\n\nconst acquireFullGraph = (\n\tgraph: ResolvedGraph,\n\tregistry: PluginRegistry,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\tpluginContext: Context.Context<never>,\n\tsinks: CapabilitySinksShape,\n\tlogger: LoggerShape,\n\tidentity: Identity,\n\truntimeRoot: string,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tyield* annotateOp('acquireFullGraph');\n\t\tyield* acquireKeys(\n\t\t\tregistry,\n\t\t\t[...graph.nodes.keys()],\n\t\t\tref,\n\t\t\thub,\n\t\t\tpluginContext,\n\t\t\tsinks,\n\t\t\tlogger,\n\t\t\tidentity,\n\t\t\truntimeRoot,\n\t\t);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.acquireFullGraph'));\n\n// -----------------------------------------------------------------------------\n// Teardown\n// -----------------------------------------------------------------------------\n\n/**\n * Tear down a slice in reverse-dep order, parallel within each level.\n * Each node's scope close runs its finalizers; status transitions\n * `ready → stopping → stopped` are emitted.\n *\n * Architecture § Stack lifecycle: \"shutdown.requested → parallel\n * teardown (max grace, not sum grace)\".\n */\nconst teardownKeys = (\n\tgraph: ResolvedGraph,\n\tregistry: PluginRegistry,\n\tkeys: ReadonlyArray<PluginKey>,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\t// Bucket by level so the reverse-order array preserves the\n\t\t// \"parallel within level\" invariant.\n\t\tconst byLevel: Array<Array<PluginKey>> = graph.levels.map(() => []);\n\t\tconst keySet = new Set(keys);\n\t\tfor (let i = 0; i < graph.levels.length; i++) {\n\t\t\tfor (const key of graph.levels[i]!) {\n\t\t\t\tif (keySet.has(key)) byLevel[i]!.push(key);\n\t\t\t}\n\t\t}\n\t\tfor (let i = byLevel.length - 1; i >= 0; i--) {\n\t\t\tconst level = byLevel[i]!;\n\t\t\tif (level.length === 0) continue;\n\t\t\tyield* Effect.all(\n\t\t\t\tlevel.map((key) => teardownNode(registry, key)),\n\t\t\t\t{ concurrency: 'unbounded', discard: true },\n\t\t\t);\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.teardownKeys'));\n\nconst teardownNode = (\n\tregistry: PluginRegistry,\n\tkey: PluginKey,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst entry = registry.entries.get(key);\n\t\tif (entry === undefined) return;\n\t\tconst status = yield* registry\n\t\t\t.getStatus(key)\n\t\t\t.pipe(Effect.catch(() => Effect.succeed<LifecycleStatus>('pending')));\n\t\t// Only `ready` plugins need stopping. `acquiring` plugins are\n\t\t// interrupted by the scope close. `failed` / `stopped` / `done`\n\t\t// are no-ops.\n\t\tif (status === 'ready') {\n\t\t\tyield* registry.transition(key, 'stopping').pipe(Effect.catch(() => Effect.void));\n\t\t}\n\t\tyield* Scope.close(entry.scope, Exit.void).pipe(Effect.catch(() => Effect.void));\n\t\tif (status === 'ready') {\n\t\t\tyield* registry.transition(key, 'stopped').pipe(Effect.catch(() => Effect.void));\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.teardownNode'));\n\n// -----------------------------------------------------------------------------\n// Selective restart\n// -----------------------------------------------------------------------------\n\nconst doSelectiveRestart = (\n\tgraph: ResolvedGraph,\n\tregistry: PluginRegistry,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\troots: ReadonlySet<PluginKey>,\n\tpluginContext: Context.Context<never>,\n\tsinks: CapabilitySinksShape,\n\tlogger: LoggerShape,\n\tidentity: Identity,\n\truntimeRoot: string,\n\tparentScope: Scope.Scope,\n): Effect.Effect<void, RestartTargetMissing> =>\n\tEffect.gen(function* () {\n\t\tconst plan = yield* planRestart(graph, roots);\n\t\tconst at = Date.now();\n\t\tfor (const root of roots) {\n\t\t\tyield* publish(ref, hub, {\n\t\t\t\ttag: 'restart.requested',\n\t\t\t\ttarget: { pluginKey: root },\n\t\t\t\tat,\n\t\t\t});\n\t\t}\n\t\tyield* teardownKeys(graph, registry, plan.teardownOrder);\n\t\t// Re-acquire the slice in parallel. Each node waits on its own\n\t\t// upstream ready gate, so a downstream node in the slice can't\n\t\t// acquire until its upstream is back to `ready`; unrelated\n\t\t// siblings do not act as a level barrier. Nodes outside the\n\t\t// slice are already `ready`. We need to mark slice nodes back\n\t\t// to `pending` so the state\n\t\t// machine accepts the `pending → acquiring` transition.\n\t\tfor (const key of plan.acquireOrder) {\n\t\t\tyield* registry.resetForRestart(key, parentScope).pipe(Effect.catch(() => Effect.void));\n\t\t\tyield* registry.transition(key, 'pending').pipe(Effect.catch(() => Effect.void));\n\t\t}\n\t\tyield* acquireKeys(\n\t\t\tregistry,\n\t\t\tplan.acquireOrder,\n\t\t\tref,\n\t\t\thub,\n\t\t\tpluginContext,\n\t\t\tsinks,\n\t\t\tlogger,\n\t\t\tidentity,\n\t\t\truntimeRoot,\n\t\t);\n\t\tfor (const root of roots) {\n\t\t\tyield* publish(ref, hub, {\n\t\t\t\ttag: 'restart.completed',\n\t\t\t\ttarget: { pluginKey: root },\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.selectiveRestart'));\n\n// -----------------------------------------------------------------------------\n// Command loop\n// -----------------------------------------------------------------------------\n\ninterface CommandLoopDeps {\n\treadonly graph: ResolvedGraph;\n\treadonly registry: PluginRegistry;\n\treadonly ref: SubscriptionRef.SubscriptionRef<SubscribableState>;\n\treadonly hub: Queue.Enqueue<EngineEvent>;\n\treadonly queuedCommands: Queue.Dequeue<QueuedCommand>;\n\treadonly stackRestartTask: Ref.Ref<StackRestartTaskState>;\n\treadonly stackRestartSeq: Ref.Ref<number>;\n\treadonly snapshotCaptureTask: Ref.Ref<SnapshotCaptureTaskState>;\n\treadonly snapshotCaptureSeq: Ref.Ref<number>;\n\treadonly shutdownLatch: Ref.Ref<boolean>;\n\treadonly shutdownComplete: Deferred.Deferred<void>;\n\treadonly pluginContext: Context.Context<never>;\n\treadonly sinks: CapabilitySinksShape;\n\treadonly logger: LoggerShape;\n\treadonly identity: Identity;\n\treadonly runtimeRoot: string;\n\treadonly parentScope: Scope.Scope;\n\treadonly commandHandler?: SupervisorCommandHandler;\n\treadonly postAcquireHook?: SupervisorPostAcquireHook;\n}\n\ninterface CommandSubmission {\n\treadonly command: EngineCommand;\n\treadonly completion: Deferred.Deferred<Exit.Exit<void, unknown>>;\n}\n\ntype StackRestartTaskState =\n\t| { readonly tag: 'idle' }\n\t| { readonly tag: 'starting'; readonly token: number }\n\t| { readonly tag: 'running'; readonly token: number; readonly fiber: Fiber.Fiber<void, never> };\n\ntype SnapshotCaptureTaskState =\n\t| { readonly tag: 'idle' }\n\t| { readonly tag: 'starting'; readonly token: number; readonly snapshotId: string | null }\n\t| {\n\t\t\treadonly tag: 'running';\n\t\t\treadonly token: number;\n\t\t\treadonly snapshotId: string | null;\n\t\t\treadonly fiber: Fiber.Fiber<void, never>;\n\t };\n\nconst runInjectedCommandHandler = (\n\tdeps: CommandLoopDeps,\n\tcmd: EngineCommand,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tif (deps.commandHandler === undefined) return;\n\t\tconst publishFromHandler = (event: EngineEvent): Effect.Effect<void, never, never> =>\n\t\t\tpublish(deps.ref, deps.hub, event);\n\t\tconst exit = yield* Effect.exit(\n\t\t\tdeps.commandHandler(cmd, {\n\t\t\t\tpublish: publishFromHandler,\n\t\t\t}),\n\t\t);\n\t\tif (Exit.isSuccess(exit)) {\n\t\t\tfor (const event of exit.value) {\n\t\t\t\tyield* publish(deps.ref, deps.hub, event);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (Cause.hasInterruptsOnly(exit.cause)) return;\n\t\tif (cmd.tag === 'snapshot.capture') {\n\t\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\t\ttag: 'snapshot.captureFailed',\n\t\t\t\t...(cmd.snapshotId === undefined ? {} : { snapshotId: cmd.snapshotId }),\n\t\t\t\t...(cmd.name === undefined ? {} : { name: cmd.name }),\n\t\t\t\tsummary: Cause.pretty(exit.cause).split('\\n')[0] ?? 'snapshot capture failed',\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t}\n\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\ttag: 'error.reported',\n\t\t\terror: prettyErrorStructured(exit.cause, {\n\t\t\t\tpluginKey: null,\n\t\t\t\tseverity: 'error',\n\t\t\t\tat: Date.now(),\n\t\t\t}),\n\t\t});\n\t\tyield* deps.logger.log('supervisor', null, {\n\t\t\tlevel: 'error',\n\t\t\tmessage: `command handler failed for ${cmd.tag}`,\n\t\t});\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.injectedCommandHandler'));\n\nconst startBackgroundSnapshotCapture = (\n\tdeps: CommandLoopDeps,\n\tcmd: Extract<EngineCommand, { readonly tag: 'snapshot.capture' }>,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst token = yield* Ref.updateAndGet(deps.snapshotCaptureSeq, (n) => n + 1);\n\t\tconst started = yield* Ref.modify(deps.snapshotCaptureTask, (state) =>\n\t\t\tstate.tag === 'idle'\n\t\t\t\t? [\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttag: 'starting' as const,\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\tsnapshotId: cmd.snapshotId ?? null,\n\t\t\t\t\t\t} satisfies SnapshotCaptureTaskState,\n\t\t\t\t\t]\n\t\t\t\t: [false, state],\n\t\t);\n\n\t\tif (!started) {\n\t\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\t\ttag: 'snapshot.captureSkipped',\n\t\t\t\treason: 'already-running',\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\ttag: 'snapshot.captureStarted',\n\t\t\t...(cmd.snapshotId === undefined ? {} : { snapshotId: cmd.snapshotId }),\n\t\t\t...(cmd.name === undefined ? {} : { name: cmd.name }),\n\t\t\tat: Date.now(),\n\t\t});\n\n\t\tconst fiber = yield* runInjectedCommandHandler(deps, cmd).pipe(\n\t\t\tEffect.ensuring(\n\t\t\t\tRef.update(deps.snapshotCaptureTask, (state) =>\n\t\t\t\t\tstate.tag !== 'idle' && state.token === token\n\t\t\t\t\t\t? ({ tag: 'idle' } satisfies SnapshotCaptureTaskState)\n\t\t\t\t\t\t: state,\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.forkIn(deps.parentScope),\n\t\t);\n\n\t\tyield* Ref.update(deps.snapshotCaptureTask, (state) =>\n\t\t\tstate.tag === 'starting' && state.token === token\n\t\t\t\t? ({\n\t\t\t\t\t\ttag: 'running',\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\tsnapshotId: cmd.snapshotId ?? null,\n\t\t\t\t\t\tfiber,\n\t\t\t\t\t} satisfies SnapshotCaptureTaskState)\n\t\t\t\t: state,\n\t\t);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.backgroundSnapshotCapture'));\n\nconst requestBackgroundSnapshotInterrupt = (\n\tdeps: Pick<CommandLoopDeps, 'snapshotCaptureTask'>,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst fiber = yield* Ref.modify(deps.snapshotCaptureTask, (state) =>\n\t\t\tstate.tag === 'running'\n\t\t\t\t? [state.fiber, { tag: 'idle' } as SnapshotCaptureTaskState]\n\t\t\t\t: [null, state],\n\t\t);\n\t\tif (fiber !== null) {\n\t\t\tyield* Effect.sync(() => {\n\t\t\t\tfiber.interruptUnsafe();\n\t\t\t});\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.interruptSnapshotCapture'));\n\nconst startBackgroundStackRestart = (\n\tdeps: CommandLoopDeps,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst token = yield* Ref.updateAndGet(deps.stackRestartSeq, (n) => n + 1);\n\t\tconst started = yield* Ref.modify(deps.stackRestartTask, (state) =>\n\t\t\tstate.tag === 'idle'\n\t\t\t\t? [true, { tag: 'starting' as const, token }]\n\t\t\t\t: [false, state],\n\t\t);\n\n\t\tif (!started) {\n\t\t\tyield* deps.logger.log('supervisor', null, {\n\t\t\t\tlevel: 'debug',\n\t\t\t\tmessage: 'stack restart skipped because one is already running',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst fiber = yield* handleCommand(deps, { tag: 'stack.restart' }).pipe(\n\t\t\tEffect.catch(() => Effect.void),\n\t\t\tEffect.ensuring(\n\t\t\t\tRef.update(deps.stackRestartTask, (state) =>\n\t\t\t\t\tstate.tag !== 'idle' && state.token === token\n\t\t\t\t\t\t? ({ tag: 'idle' } satisfies StackRestartTaskState)\n\t\t\t\t\t\t: state,\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.forkIn(deps.parentScope),\n\t\t);\n\n\t\tyield* Ref.update(deps.stackRestartTask, (state) =>\n\t\t\tstate.tag === 'starting' && state.token === token\n\t\t\t\t? ({ tag: 'running', token, fiber } satisfies StackRestartTaskState)\n\t\t\t\t: state,\n\t\t);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.backgroundStackRestart'));\n\nconst requestBackgroundStackRestartInterrupt = (\n\tdeps: Pick<CommandLoopDeps, 'stackRestartTask'>,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst fiber = yield* Ref.modify(deps.stackRestartTask, (state) =>\n\t\t\tstate.tag === 'running'\n\t\t\t\t? [state.fiber, { tag: 'idle' } as StackRestartTaskState]\n\t\t\t\t: [null, state],\n\t\t);\n\t\tif (fiber !== null) {\n\t\t\tyield* Fiber.interrupt(fiber);\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.interruptStackRestart'));\n\nconst publishHookFailure = (\n\tdeps: CommandLoopDeps,\n\tcause: Cause.Cause<unknown>,\n\tmessage: string,\n\tpluginKey: PluginKey | null = null,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\ttag: 'error.reported',\n\t\t\terror: prettyErrorStructured(cause, {\n\t\t\t\tpluginKey,\n\t\t\t\tseverity: 'error',\n\t\t\t\tat: Date.now(),\n\t\t\t}),\n\t\t});\n\t\tyield* deps.logger.log('supervisor', null, {\n\t\t\tlevel: 'error',\n\t\t\tmessage,\n\t\t});\n\t});\n\nconst findPostAcquireTaskFailure = (cause: Cause.Cause<unknown>): PostAcquireTaskFailed | null => {\n\tfor (const reason of cause.reasons) {\n\t\tif (!Cause.isFailReason(reason)) continue;\n\t\tif (reason.error instanceof PostAcquireTaskFailed) return reason.error;\n\t}\n\treturn null;\n};\n\nconst runPostAcquireHook = (\n\tdeps: CommandLoopDeps,\n): Effect.Effect<void, SupervisorPostAcquireFailed, never> =>\n\tEffect.gen(function* () {\n\t\tif (deps.postAcquireHook === undefined) return;\n\t\tconst exit = yield* Effect.exit(\n\t\t\tdeps.postAcquireHook({\n\t\t\t\tgraph: deps.graph,\n\t\t\t\tregistry: deps.registry,\n\t\t\t\tidentity: deps.identity,\n\t\t\t\truntimeRoot: deps.runtimeRoot,\n\t\t\t}),\n\t\t);\n\t\tif (Exit.isSuccess(exit)) {\n\t\t\tfor (const event of exit.value) {\n\t\t\t\tyield* publish(deps.ref, deps.hub, event);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst taskFailure = findPostAcquireTaskFailure(exit.cause);\n\t\tif (taskFailure !== null) {\n\t\t\tyield* deps.registry\n\t\t\t\t.markFailed(taskFailure.pluginKey, taskFailure.cause)\n\t\t\t\t.pipe(Effect.catch(() => Effect.void));\n\t\t}\n\t\tyield* publishHookFailure(\n\t\t\tdeps,\n\t\t\texit.cause,\n\t\t\ttaskFailure === null\n\t\t\t\t? 'post-acquire hook failed'\n\t\t\t\t: `post-acquire task failed: ${taskFailure.label}`,\n\t\t\ttaskFailure?.pluginKey ?? null,\n\t\t);\n\t\treturn yield* Effect.fail(new SupervisorPostAcquireFailed({ cause: exit.cause }));\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.postAcquireHook'));\n\nconst allReadyOrTerminal = (\n\tgraph: ResolvedGraph,\n\tregistry: PluginRegistry,\n): Effect.Effect<boolean, never, never> =>\n\tEffect.gen(function* () {\n\t\tfor (const key of graph.nodes.keys()) {\n\t\t\tconst status = yield* registry\n\t\t\t\t.getStatus(key)\n\t\t\t\t.pipe(Effect.catch(() => Effect.succeed<LifecycleStatus>('failed')));\n\t\t\tif (!isReadyOrTerminal(status)) return false;\n\t\t}\n\t\treturn true;\n\t});\n\nconst handleCommand = (\n\tdeps: CommandLoopDeps,\n\tcmd: EngineCommand,\n\toptions: { readonly failOnPostAcquireHook?: boolean } = {},\n): Effect.Effect<void, SupervisorPostAcquireFailed, never> =>\n\tEffect.gen(function* () {\n\t\tconst {\n\t\t\tgraph,\n\t\t\tregistry,\n\t\t\tref,\n\t\t\thub,\n\t\t\tshutdownLatch,\n\t\t\tpluginContext,\n\t\t\tsinks,\n\t\t\tlogger,\n\t\t\tidentity,\n\t\t\truntimeRoot,\n\t\t\tparentScope,\n\t\t} = deps;\n\t\tswitch (cmd.tag) {\n\t\t\tcase 'shutdown.requested':\n\t\t\tcase 'stack.stop': {\n\t\t\t\tyield* requestBackgroundSnapshotInterrupt(deps);\n\t\t\t\tyield* setCyclePhase(ref, 'shutting-down');\n\t\t\t\tyield* Ref.set(shutdownLatch, true);\n\t\t\t\tyield* logger.log('supervisor', null, {\n\t\t\t\t\tlevel: 'info',\n\t\t\t\t\tmessage: 'shutdown requested',\n\t\t\t\t});\n\t\t\t\tyield* requestBackgroundStackRestartInterrupt(deps);\n\t\t\t\tyield* setCyclePhase(ref, 'shutting-down');\n\t\t\t\tconst plan = planFullDrain(graph);\n\t\t\t\tyield* teardownKeys(graph, registry, plan.teardownOrder);\n\t\t\t\tyield* Effect.yieldNow;\n\t\t\t\tyield* Deferred.succeed(deps.shutdownComplete, void 0).pipe(Effect.ignore);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'shutdown.hardKillRequested': {\n\t\t\t\tyield* requestBackgroundSnapshotInterrupt(deps);\n\t\t\t\tyield* publish(ref, hub, {\n\t\t\t\t\ttag: 'shutdown.escalated',\n\t\t\t\t\tsignal: cmd.signal,\n\t\t\t\t\texitCode: cmd.exitCode,\n\t\t\t\t\tat: cmd.at,\n\t\t\t\t});\n\t\t\t\tyield* setCyclePhase(ref, 'shutting-down');\n\t\t\t\tyield* Ref.set(shutdownLatch, true);\n\t\t\t\tyield* requestBackgroundStackRestartInterrupt(deps);\n\t\t\t\tyield* setCyclePhase(ref, 'shutting-down');\n\t\t\t\tyield* Deferred.succeed(deps.shutdownComplete, void 0).pipe(Effect.ignore);\n\t\t\t\tyield* logger.log('supervisor', null, {\n\t\t\t\t\tlevel: 'fatal',\n\t\t\t\t\tmessage: `shutdown escalated by ${cmd.signal}`,\n\t\t\t\t\tfields: { signal: cmd.signal, exitCode: cmd.exitCode },\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'stack.restart': {\n\t\t\t\tconst plan = planFullDrain(graph);\n\t\t\t\tconst restarted = yield* doSelectiveRestart(\n\t\t\t\t\tgraph,\n\t\t\t\t\tregistry,\n\t\t\t\t\tref,\n\t\t\t\t\thub,\n\t\t\t\t\tnew Set(plan.slice),\n\t\t\t\t\tpluginContext,\n\t\t\t\t\tsinks,\n\t\t\t\t\tlogger,\n\t\t\t\t\tidentity,\n\t\t\t\t\truntimeRoot,\n\t\t\t\t\tparentScope,\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.as(true),\n\t\t\t\t\tEffect.catch(() => Effect.succeed(false)),\n\t\t\t\t);\n\t\t\t\tif (restarted && (yield* allReadyOrTerminal(graph, registry))) {\n\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'selective-restart.requested': {\n\t\t\t\tconst restarted = yield* doSelectiveRestart(\n\t\t\t\t\tgraph,\n\t\t\t\t\tregistry,\n\t\t\t\t\tref,\n\t\t\t\t\thub,\n\t\t\t\t\tnew Set<PluginKey>([cmd.pluginKey]),\n\t\t\t\t\tpluginContext,\n\t\t\t\t\tsinks,\n\t\t\t\t\tlogger,\n\t\t\t\t\tidentity,\n\t\t\t\t\truntimeRoot,\n\t\t\t\t\tparentScope,\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.as(true),\n\t\t\t\t\tEffect.catch(() => Effect.succeed(false)),\n\t\t\t\t);\n\t\t\t\tif (restarted && (yield* allReadyOrTerminal(graph, registry))) {\n\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'apply.requested': {\n\t\t\t\t// Re-acquire after watch invalidation. Caller may target a\n\t\t\t\t// specific plugin; otherwise no-op (the watcher already fed\n\t\t\t\t// `selective-restart.requested` for the affected keys).\n\t\t\t\tif (cmd.pluginKey !== undefined) {\n\t\t\t\t\tconst restarted = yield* doSelectiveRestart(\n\t\t\t\t\t\tgraph,\n\t\t\t\t\t\tregistry,\n\t\t\t\t\t\tref,\n\t\t\t\t\t\thub,\n\t\t\t\t\t\tnew Set<PluginKey>([cmd.pluginKey]),\n\t\t\t\t\t\tpluginContext,\n\t\t\t\t\t\tsinks,\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t\tidentity,\n\t\t\t\t\t\truntimeRoot,\n\t\t\t\t\t\tparentScope,\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.as(true),\n\t\t\t\t\t\tEffect.catch(() => Effect.succeed(false)),\n\t\t\t\t\t);\n\t\t\t\t\tif (restarted && (yield* allReadyOrTerminal(graph, registry))) {\n\t\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (yield* allReadyOrTerminal(graph, registry)) {\n\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'codegen.requested': {\n\t\t\t\tif (yield* allReadyOrTerminal(graph, registry)) {\n\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Snapshot/wipe/prune are owned by injected L3 handlers. The\n\t\t\t// supervisor keeps one consumer of the command queue and only\n\t\t\t// publishes the handler's typed events / errors.\n\t\t\tcase 'snapshot.capture':\n\t\t\t\tyield* startBackgroundSnapshotCapture(deps, cmd);\n\t\t\t\treturn;\n\t\t\tcase 'snapshot.restore':\n\t\t\tcase 'snapshot.list':\n\t\t\tcase 'snapshot.delete':\n\t\t\tcase 'wipe.requested':\n\t\t\tcase 'prune.requested':\n\t\t\t\tyield* runInjectedCommandHandler(deps, cmd);\n\t\t\t\treturn;\n\t\t\tcase 'advance-clock.requested':\n\t\t\tcase 'stack.start':\n\t\t\t\treturn;\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.handleCommand'));\n\ntype QueuedCommand =\n\t| { readonly kind: 'fire-and-forget'; readonly command: EngineCommand }\n\t| { readonly kind: 'submitted'; readonly submission: CommandSubmission };\n\nconst commandLoop = (deps: CommandLoopDeps): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\twhile (true) {\n\t\t\tconst next = yield* Queue.take(deps.queuedCommands);\n\t\t\tif (next.kind === 'submitted') {\n\t\t\t\tconst exit = yield* Effect.exit(\n\t\t\t\t\thandleCommand(deps, next.submission.command, { failOnPostAcquireHook: true }),\n\t\t\t\t);\n\t\t\t\tyield* Deferred.succeed(next.submission.completion, exit).pipe(Effect.ignore);\n\t\t\t} else if (next.command.tag === 'stack.restart') {\n\t\t\t\tyield* startBackgroundStackRestart(deps);\n\t\t\t} else {\n\t\t\t\tyield* handleCommand(deps, next.command).pipe(Effect.catch(() => Effect.void));\n\t\t\t}\n\t\t\tconst drained = yield* Ref.get(deps.shutdownLatch);\n\t\t\tif (drained) return;\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.commandLoop'));\n\n// -----------------------------------------------------------------------------\n// Top-level supervisor entry\n// -----------------------------------------------------------------------------\n\nexport interface SupervisorHandle {\n\treadonly identity: Identity;\n\treadonly graph: ResolvedGraph;\n\treadonly registry: PluginRegistry;\n\treadonly events: Queue.Dequeue<EngineEvent>;\n\treadonly commands: Queue.Enqueue<EngineCommand>;\n\treadonly runCommand: (command: EngineCommand) => Effect.Effect<void, unknown>;\n\treadonly state: SubscriptionRef.SubscriptionRef<SubscribableState>;\n\treadonly watchIndex: ReadonlyArray<WatchEntry>;\n\t/** Fire a watch event for the given path. Substrate-level glue:\n\t * the thick L0 watcher calls this; tests call it directly. */\n\treadonly notifyWatchFire: (path: string) => Effect.Effect<void>;\n\t/** Block until the supervisor's command loop sets the shutdown\n\t * latch. The outer runtime then closes the supervisor scope, which\n\t * tears down every plugin in reverse-dep order. */\n\treadonly awaitShutdown: Effect.Effect<void>;\n}\n\nexport interface SupervisorStartup {\n\treadonly handle: SupervisorHandle;\n\treadonly runInitialAcquire: Effect.Effect<void, SupervisorPostAcquireFailed, never>;\n}\n\nexport interface SupervisorStartupOptions {\n\treadonly commandLoop?: boolean;\n}\n\n/**\n * Prepare a supervisor for `stack` without running the initial acquire.\n * The returned `SupervisorHandle` is Scope-managed; the supervisor's\n * lifecycle is the surrounding Scope's lifecycle. Signal handlers,\n * the command loop, and every plugin's scope are children of the\n * supervisor scope. Callers that mount renderers can subscribe to the\n * returned state before invoking `runInitialAcquire`.\n *\n * `pluginContext` carries the substrate-context services available to\n * each plugin's `acquire` body (`IdentityContext`,\n * `ContainerRuntimeService`, `RuntimeRoot`, `StackPathsService`, etc.).\n * Plugins declare what they need by yielding the corresponding\n * `Context.Service` tag from within `Effect.gen`; the supervisor\n * provides this context before running the acquire effect so the\n * plugin's R-channel narrows to `Scope.Scope` (then to `never` after\n * the per-plugin Scope is provided). The orchestrator layer (L3)\n * builds this context once per stack from its layer stack and hands\n * it to the supervisor; substrate doesn't name the services itself\n * (the context is opaque `Context.Context<never>` at this boundary).\n *\n * `CapabilitySinksService` extension (ARCHITECTURE.md § Plugin-author\n * extension via Layer composition): if the caller layers a\n * `CapabilitySinksService` into `pluginContext`, the supervisor\n * harvests through THAT instance instead of building its own. This is\n * the seam plugin authors use to register custom-kind sinks: compose\n * `layerCapabilitySinksDefault(orchestratorSinks)` with one or more\n * `Layer.effectDiscard` overlays that yield `CapabilitySinksService`\n * and call `registerSink({ kind: 'my-custom', accept: ... })`. The\n * `sinks: OrchestratorSinks` parameter is ignored when context carries\n * a pre-built service (the caller's Layer already supplies whatever\n * sink registrations it wants).\n *\n * Architecture § Stack lifecycle:\n * \"defineStack(config) → Identity validated → NetworkResolver\n * consulted → Plugin dep-graph computed → level-batched parallel\n * acquire → manifest.flushed → ready event → cycle running.\"\n */\nexport const startSupervisor = (\n\tstack: SupervisedStack,\n\tidentity: Identity,\n\tstate: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\tpluginContext: Context.Context<never> = Context.empty(),\n\tsinks: OrchestratorSinks = [],\n\tcommandHandler?: SupervisorCommandHandler,\n\tpostAcquireHook?: SupervisorPostAcquireHook,\n\toptions: SupervisorStartupOptions = {},\n): Effect.Effect<SupervisorStartup, SupervisorBootError | UnknownDependency, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'devstack.stack.memberCount': stack.members.length,\n\t\t});\n\n\t\t// Optional Logger service — pull from the plugin context if the\n\t\t// caller layered it in (CLI / e2e do). Bare smoke tests get the\n\t\t// no-op fallback so they remain log-free.\n\t\tconst baseLogger: LoggerShape = getOrDefault(pluginContext, Logger, noopLogger);\n\n\t\tyield* baseLogger.log('supervisor', null, {\n\t\t\tlevel: 'debug',\n\t\t\tmessage: 'supervisor boot start',\n\t\t\tfields: {\n\t\t\t\tapp: identity.app,\n\t\t\t\tstack: identity.stack,\n\t\t\t\tnetwork: identity.chain,\n\t\t\t\tmemberCount: stack.members.length,\n\t\t\t},\n\t\t});\n\n\t\t// Seed the projection's identity and booting slices before\n\t\t// acquire starts so renderers mounting early have a complete\n\t\t// baseline.\n\t\tyield* SubscriptionRef.update(\n\t\t\tstate,\n\t\t\t(s) =>\n\t\t\t\t({\n\t\t\t\t\t...setIdentity(s, {\n\t\t\t\t\t\tapp: identity.app,\n\t\t\t\t\t\tstack: identity.stack,\n\t\t\t\t\t\tnetwork: identity.chain,\n\t\t\t\t\t}),\n\t\t\t\t\tcycle: {\n\t\t\t\t\t\t...s.cycle,\n\t\t\t\t\t\tstartedAt: s.cycle.startedAt === 0 ? Date.now() : s.cycle.startedAt,\n\t\t\t\t\t\tphase: 'booting',\n\t\t\t\t\t},\n\t\t\t\t}) satisfies SubscribableState,\n\t\t);\n\n\t\t// Resolve the dep graph.\n\t\tconst graph = yield* resolveGraph(stack.members).pipe(\n\t\t\tEffect.mapError((cause) => new SupervisorBootError({ cause })),\n\t\t);\n\n\t\t// Event hub + command channel.\n\t\tconst hub = yield* Queue.unbounded<EngineEvent>();\n\t\tconst commands = yield* Queue.unbounded<EngineCommand>();\n\t\tconst queuedCommands = yield* Queue.unbounded<QueuedCommand>();\n\t\tconst stackRestartTask = yield* Ref.make<StackRestartTaskState>({ tag: 'idle' });\n\t\tconst stackRestartSeq = yield* Ref.make(0);\n\t\tconst snapshotCaptureTask = yield* Ref.make<SnapshotCaptureTaskState>({ tag: 'idle' });\n\t\tconst snapshotCaptureSeq = yield* Ref.make(0);\n\t\tconst shutdownLatch = yield* Ref.make(false);\n\t\tconst shutdownComplete = yield* Deferred.make<void>();\n\t\tconst initialAcquireStarted = yield* Ref.make(false);\n\t\tconst logger = withEventPublishingLogger(baseLogger, state, hub);\n\t\tconst pluginRuntimeContext = pluginContext.pipe(\n\t\t\tContext.add(Logger, Logger.of(logger)),\n\t\t) as Context.Context<never>;\n\n\t\t// Per-plugin scopes parent off the supervisor scope.\n\t\tconst supervisorScope = yield* Effect.scope;\n\n\t\tconst emit = buildTransitionEmitter(state, hub);\n\t\tconst registry = yield* buildRegistry(graph, supervisorScope, emit);\n\n\t\t// Declare a row for every plugin so the projection's\n\t\t// `lifecycle.statusChanged` events have a row to attach to.\n\t\tfor (const [key, node] of graph.nodes) {\n\t\t\tconst declaredAccount = pendingAccountProjection(key, node.member.id, Date.now());\n\t\t\tyield* SubscriptionRef.update(state, (s) => ({\n\t\t\t\t...(declaredAccount === null ? s : declareAccount(s, declaredAccount)),\n\t\t\t\trows: s.rows.some((r) => r.key === key)\n\t\t\t\t\t? s.rows\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t...s.rows,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\trole: node.member.role,\n\t\t\t\t\t\t\t\tstatus: 'pending' as LifecycleStatus,\n\t\t\t\t\t\t\t\tphase: null,\n\t\t\t\t\t\t\t\tlastError: null,\n\t\t\t\t\t\t\t\tlogTail: { lines: [], level: 'info' as const, truncated: false },\n\t\t\t\t\t\t\t\tendpoints: [],\n\t\t\t\t\t\t\t\tselectiveRestartHighlight: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t}));\n\t\t}\n\n\t\t// Extract `RuntimeRoot` from the plugin context — needed to\n\t\t// build the `AcquireContext` handed to dynamic capability\n\t\t// factories (`Plugin.capabilities` as a function). The\n\t\t// runtimeRoot is the on-disk base under which the stack's\n\t\t// state lives; identity carries app/stack/chain. Together\n\t\t// they let plugins stamp REAL paths and chain ids into their\n\t\t// snapshot subtrees, codegen bindings, routable URLs, etc.\n\t\t//\n\t\t// Fallback to '' if the caller didn't add `RuntimeRoot` to\n\t\t// the plugin context — keeps the bare `supervise()` smoke\n\t\t// tests working without a substrate Layer stack.\n\t\tconst runtimeRoot = getOrDefault(pluginContext, RuntimeRoot, { root: '' }).root;\n\n\t\t// Resolve the CapabilitySinks registry for this stack. Two paths:\n\t\t//\n\t\t// (a) Plugin-author / orchestrator pre-built path: the caller\n\t\t// layered a `CapabilitySinksService` into `pluginContext`\n\t\t// (typically by composing `layerCapabilitySinksDefault(...)`\n\t\t// PLUS one or more custom-sink Layers). The supervisor\n\t\t// harvests through THAT instance, so custom sinks\n\t\t// registered by plugin authors actually fire. The\n\t\t// `sinks: OrchestratorSinks` arg is ignored in this path\n\t\t// (the caller already composed its own sink registrations\n\t\t// into the Layer they handed in).\n\t\t//\n\t\t// (b) Bare path: no service in context — the supervisor builds\n\t\t// the substrate default with the orchestrator sinks passed\n\t\t// in. `Layer.build` opens the layer's resources on the\n\t\t// SURROUNDING scope (the supervisor's), so the sinks +\n\t\t// formatter registry live for the supervisor's lifetime\n\t\t// and reap on its scope close.\n\t\t//\n\t\t// Plugin-author symmetry (ARCHITECTURE.md § Plugin-author\n\t\t// surface = user-surface): a custom plugin registers its own\n\t\t// sinks via standard Layer composition, NOT by reaching into\n\t\t// the supervisor. Same surface a built-in (Logger, RuntimeRoot,\n\t\t// ContainerRuntime, etc.) uses.\n\t\tconst sinksService = yield* getOrDefaultEffect(\n\t\t\tpluginRuntimeContext,\n\t\t\tCapabilitySinksService,\n\t\t\tEffect.gen(function* () {\n\t\t\t\treturn Context.get(\n\t\t\t\t\tyield* Layer.build(layerCapabilitySinksDefault(sinks)),\n\t\t\t\t\tCapabilitySinksService,\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\n\t\tconst enableCommandLoop = options.commandLoop !== false;\n\t\tif (enableCommandLoop) {\n\t\t\tyield* Effect.forkScoped(installSignalHandler(commands));\n\t\t\tyield* Effect.forkScoped(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tconst command = yield* Queue.take(commands);\n\t\t\t\t\t\tyield* Queue.offer(queuedCommands, { kind: 'fire-and-forget', command });\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst commandLoopDeps: CommandLoopDeps = {\n\t\t\tgraph,\n\t\t\tregistry,\n\t\t\tref: state,\n\t\t\thub,\n\t\t\tqueuedCommands,\n\t\t\tstackRestartTask,\n\t\t\tstackRestartSeq,\n\t\t\tsnapshotCaptureTask,\n\t\t\tsnapshotCaptureSeq,\n\t\t\tshutdownLatch,\n\t\t\tshutdownComplete,\n\t\t\tpluginContext: pluginRuntimeContext,\n\t\t\tsinks: sinksService,\n\t\t\tlogger,\n\t\t\tidentity,\n\t\t\truntimeRoot,\n\t\t\tparentScope: supervisorScope,\n\t\t\tcommandHandler,\n\t\t\tpostAcquireHook,\n\t\t};\n\n\t\tconst runInitialAcquire = Effect.gen(function* () {\n\t\t\tconst alreadyStarted = yield* Ref.modify(initialAcquireStarted, (started) => [started, true]);\n\t\t\tif (alreadyStarted) return;\n\t\t\tif (yield* Ref.get(shutdownLatch)) return;\n\t\t\t// Fire the initial acquire — level-batched parallel. The plugin\n\t\t\t// context provides the substrate-context services the plugins'\n\t\t\t// acquire bodies yield (Identity, ContainerRuntime, etc.). The\n\t\t\t// substrate's `CapabilitySinksService` routes each harvested\n\t\t\t// contribution to the matching sink; production orchestrator\n\t\t\t// sinks are registered by the higher-level runtime composer.\n\t\t\tyield* acquireFullGraph(\n\t\t\t\tgraph,\n\t\t\t\tregistry,\n\t\t\t\tstate,\n\t\t\t\thub,\n\t\t\t\tpluginRuntimeContext,\n\t\t\t\tsinksService,\n\t\t\t\tlogger,\n\t\t\t\tidentity,\n\t\t\t\truntimeRoot,\n\t\t\t);\n\t\t\tif (yield* Ref.get(shutdownLatch)) return;\n\t\t\tconst initialReady = yield* allReadyOrTerminal(graph, registry);\n\t\t\tif (initialReady) {\n\t\t\t\tyield* runPostAcquireHook(commandLoopDeps);\n\t\t\t\tif (!(yield* Ref.get(shutdownLatch))) {\n\t\t\t\t\tyield* setCyclePhase(state, 'running');\n\t\t\t\t}\n\t\t\t} else if (!(yield* Ref.get(shutdownLatch))) {\n\t\t\t\tyield* setCyclePhase(state, 'running');\n\t\t\t}\n\t\t}).pipe(Effect.withSpan('lifecycle.supervisor.initialAcquire'));\n\n\t\t// Build the watch index up front; the supervisor exposes\n\t\t// `notifyWatchFire` so the L0 thick watcher can call into it.\n\t\tconst watchIndex = buildWatchIndex(graph.nodes);\n\n\t\tconst notifyWatchFire = (path: string): Effect.Effect<void> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst matched = new Set<PluginKey>();\n\t\t\t\tfor (const entry of watchIndex) {\n\t\t\t\t\tfor (const pat of entry.paths) {\n\t\t\t\t\t\tif (exactPrefixMatch(pat, path)) {\n\t\t\t\t\t\t\tmatched.add(entry.pluginKey);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (matched.size === 0) return;\n\t\t\t\tyield* Queue.offer(commands, {\n\t\t\t\t\ttag: 'selective-restart.requested',\n\t\t\t\t\tpluginKey: [...matched][0]!,\n\t\t\t\t} satisfies EngineCommand);\n\t\t\t\t// If multiple keys matched, queue further selective-restarts\n\t\t\t\t// for each so the command loop processes them serially.\n\t\t\t\tconst rest = [...matched].slice(1);\n\t\t\t\tfor (const key of rest) {\n\t\t\t\t\tyield* Queue.offer(commands, {\n\t\t\t\t\t\ttag: 'selective-restart.requested',\n\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t} satisfies EngineCommand);\n\t\t\t\t}\n\t\t\t}).pipe(Effect.withSpan('lifecycle.supervisor.notifyWatchFire'));\n\n\t\t// Fork the command loop.\n\t\tif (enableCommandLoop) {\n\t\t\tyield* Effect.forkScoped(commandLoop(commandLoopDeps));\n\t\t}\n\n\t\t// Tear-down finalizer: closes every plugin scope in reverse-dep\n\t\t// order. The supervisor scope itself closes when the surrounding\n\t\t// caller closes — `Scope.close` cascades to plugin scopes.\n\t\tyield* Effect.addFinalizer(() =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst plan = planFullDrain(graph);\n\t\t\t\tyield* teardownKeys(graph, registry, plan.teardownOrder).pipe(\n\t\t\t\t\tEffect.catch(() => Effect.void),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\n\t\tconst awaitShutdown: Effect.Effect<void> = Deferred.await(shutdownComplete).pipe(\n\t\t\tEffect.withSpan('lifecycle.supervisor.awaitShutdown'),\n\t\t);\n\n\t\tconst runCommand = (command: EngineCommand): Effect.Effect<void, unknown> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst completion = yield* Deferred.make<Exit.Exit<void, unknown>>();\n\t\t\t\tyield* Queue.offer(queuedCommands, {\n\t\t\t\t\tkind: 'submitted',\n\t\t\t\t\tsubmission: { command, completion },\n\t\t\t\t});\n\t\t\t\tconst exit = yield* Deferred.await(completion);\n\t\t\t\tif (Exit.isFailure(exit)) {\n\t\t\t\t\treturn yield* Effect.failCause(exit.cause);\n\t\t\t\t}\n\t\t\t}).pipe(Effect.withSpan('lifecycle.supervisor.runCommand'));\n\n\t\tconst handle = {\n\t\t\tidentity,\n\t\t\tgraph,\n\t\t\tregistry,\n\t\t\tevents: hub,\n\t\t\tcommands,\n\t\t\trunCommand,\n\t\t\tstate,\n\t\t\twatchIndex,\n\t\t\tnotifyWatchFire,\n\t\t\tawaitShutdown,\n\t\t} satisfies SupervisorHandle;\n\t\treturn { handle, runInitialAcquire } satisfies SupervisorStartup;\n\t}).pipe(\n\t\twithStackSpan('lifecycle.supervisor.startSupervisor', {\n\t\t\tapp: identity.app,\n\t\t\tstack: identity.stack,\n\t\t\tnetwork: identity.chain,\n\t\t}),\n\t);\n\n/**\n * Boot a supervisor for `stack` and wait for the initial acquire to\n * finish before returning the handle. Existing callers that only need\n * a ready-or-failed handle keep this simpler entry point; live surfaces\n * that need startup display use `startSupervisor`.\n */\nexport const supervise = (\n\tstack: SupervisedStack,\n\tidentity: Identity,\n\tstate: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\tpluginContext: Context.Context<never> = Context.empty(),\n\tsinks: OrchestratorSinks = [],\n\tcommandHandler?: SupervisorCommandHandler,\n\tpostAcquireHook?: SupervisorPostAcquireHook,\n): Effect.Effect<SupervisorHandle, SupervisorError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst startup = yield* startSupervisor(\n\t\t\tstack,\n\t\t\tidentity,\n\t\t\tstate,\n\t\t\tpluginContext,\n\t\t\tsinks,\n\t\t\tcommandHandler,\n\t\t\tpostAcquireHook,\n\t\t\t{ commandLoop: true },\n\t\t);\n\t\tyield* startup.runInitialAcquire;\n\t\treturn startup.handle;\n\t}).pipe(\n\t\twithStackSpan('lifecycle.supervisor.supervise', {\n\t\t\tapp: identity.app,\n\t\t\tstack: identity.stack,\n\t\t\tnetwork: identity.chain,\n\t\t}),\n\t);\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\nconst pendingAccountProjection = (\n\trowKey: PluginKey,\n\tresourceId: string,\n\tupdatedAt: number,\n): AccountProjection | null => {\n\tif (!resourceId.startsWith('account/')) return null;\n\tconst name = resourceId.slice('account/'.length);\n\tif (name.length === 0) return null;\n\treturn {\n\t\tkey: resourceId as `account/${string}`,\n\t\trowKey,\n\t\tname,\n\t\taddress: null,\n\t\tscheme: null,\n\t\tsource: null,\n\t\tfunding: { status: 'pending', balanceMist: null, requestedMist: null, entries: [] },\n\t\twalletVisible: false,\n\t\tupdatedAt,\n\t};\n};\n\n// -----------------------------------------------------------------------------\n// Run-to-completion helper (test + programmable API entry)\n// -----------------------------------------------------------------------------\n\n/**\n * Block until the supervisor's shutdown latch fires OR the surrounding\n * scope is interrupted (signal-driven exit). Wraps `awaitShutdown` for\n * the common \"boot then wait\" shape.\n *\n * Returns the final supervisor state so callers (CLI, programmable\n * API) can inspect the projection after shutdown.\n */\nexport const runToShutdown = (\n\thandle: SupervisorHandle,\n): Effect.Effect<SubscribableState, never, never> =>\n\tEffect.gen(function* () {\n\t\tyield* handle.awaitShutdown;\n\t\treturn yield* SubscriptionRef.get(handle.state);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.runToShutdown'));\n\n// -----------------------------------------------------------------------------\n// Public re-exports of the lifecycle subsystem types\n// -----------------------------------------------------------------------------\n\nexport type { Fiber };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { exitCodeTable } from "./sysexits.mjs";
|
|
2
|
+
import { ENV_VARS } from "./flags.mjs";
|
|
3
|
+
//#region src/surfaces/cli/command-tree.ts
|
|
4
|
+
const identityOptions = [
|
|
5
|
+
{
|
|
6
|
+
name: "json",
|
|
7
|
+
description: "Emit JSON envelope output."
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
name: "app",
|
|
11
|
+
value: "name",
|
|
12
|
+
description: "Override app name."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "stack",
|
|
16
|
+
value: "name",
|
|
17
|
+
description: "Override stack name."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "state-dir",
|
|
21
|
+
value: "path",
|
|
22
|
+
description: "Override state directory."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "verbose",
|
|
26
|
+
description: "Enable more verbose logging."
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
const configOptions = [
|
|
30
|
+
...identityOptions,
|
|
31
|
+
{
|
|
32
|
+
name: "config",
|
|
33
|
+
value: "path",
|
|
34
|
+
description: "Override devstack.config.ts path."
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "network",
|
|
38
|
+
value: "name",
|
|
39
|
+
description: "Override network before config import."
|
|
40
|
+
}
|
|
41
|
+
];
|
|
42
|
+
const confirmOptions = [
|
|
43
|
+
...identityOptions,
|
|
44
|
+
{
|
|
45
|
+
name: "yes",
|
|
46
|
+
description: "Assume yes on prompts."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "no-input",
|
|
50
|
+
description: "Forbid prompts."
|
|
51
|
+
}
|
|
52
|
+
];
|
|
53
|
+
const globalMaintenanceOptions = [
|
|
54
|
+
{
|
|
55
|
+
name: "json",
|
|
56
|
+
description: "Emit JSON envelope output."
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "state-dir",
|
|
60
|
+
value: "path",
|
|
61
|
+
description: "Override state directory."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "verbose",
|
|
65
|
+
description: "Enable more verbose logging."
|
|
66
|
+
}
|
|
67
|
+
];
|
|
68
|
+
const commands = [
|
|
69
|
+
{
|
|
70
|
+
name: "up",
|
|
71
|
+
summary: "Boot a stack and stay attached until interrupted.",
|
|
72
|
+
usage: "devstack up [options]",
|
|
73
|
+
lifecycle: "attached",
|
|
74
|
+
sideEffects: "write",
|
|
75
|
+
requiresDocker: true,
|
|
76
|
+
description: "Starts the supervisor and renders the attached operator surface.",
|
|
77
|
+
options: [...configOptions, {
|
|
78
|
+
name: "renderer",
|
|
79
|
+
value: "tui|plain|silent",
|
|
80
|
+
description: "Select the attached renderer."
|
|
81
|
+
}]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: "apply",
|
|
85
|
+
summary: "Reconcile through a live supervisor when present; otherwise run one-shot setup.",
|
|
86
|
+
usage: "devstack apply [options]",
|
|
87
|
+
lifecycle: "live-aware",
|
|
88
|
+
sideEffects: "write",
|
|
89
|
+
requiresDocker: true,
|
|
90
|
+
options: configOptions
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "status",
|
|
94
|
+
summary: "Show the persisted stack projection.",
|
|
95
|
+
usage: "devstack status [options]",
|
|
96
|
+
lifecycle: "offline",
|
|
97
|
+
sideEffects: "read",
|
|
98
|
+
requiresDocker: false,
|
|
99
|
+
options: identityOptions
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "doctor",
|
|
103
|
+
summary: "Run host and stack preflight checks.",
|
|
104
|
+
usage: "devstack doctor [options]",
|
|
105
|
+
lifecycle: "offline",
|
|
106
|
+
sideEffects: "read",
|
|
107
|
+
requiresDocker: true,
|
|
108
|
+
options: identityOptions
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: "config",
|
|
112
|
+
summary: "Print resolved config inputs.",
|
|
113
|
+
usage: "devstack config [options]",
|
|
114
|
+
lifecycle: "offline",
|
|
115
|
+
sideEffects: "read",
|
|
116
|
+
requiresDocker: false,
|
|
117
|
+
options: configOptions
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: "schema",
|
|
121
|
+
summary: "Emit the CLI schema.",
|
|
122
|
+
usage: "devstack schema --json",
|
|
123
|
+
lifecycle: "offline",
|
|
124
|
+
sideEffects: "none",
|
|
125
|
+
requiresDocker: false,
|
|
126
|
+
options: [{
|
|
127
|
+
name: "json",
|
|
128
|
+
description: "Emit JSON schema output."
|
|
129
|
+
}]
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: "snapshot",
|
|
133
|
+
summary: "Capture, restore, list, or delete stack snapshots.",
|
|
134
|
+
usage: "devstack snapshot <command> [options]",
|
|
135
|
+
lifecycle: "offline",
|
|
136
|
+
sideEffects: "write",
|
|
137
|
+
requiresDocker: true,
|
|
138
|
+
subcommands: [
|
|
139
|
+
{
|
|
140
|
+
name: "save",
|
|
141
|
+
summary: "Capture a snapshot through a one-shot stack boot.",
|
|
142
|
+
usage: "devstack snapshot save [name] [options]",
|
|
143
|
+
lifecycle: "one-shot",
|
|
144
|
+
sideEffects: "write",
|
|
145
|
+
requiresDocker: true,
|
|
146
|
+
arguments: ["name"],
|
|
147
|
+
options: [...configOptions, {
|
|
148
|
+
name: "name",
|
|
149
|
+
value: "name",
|
|
150
|
+
description: "Human-readable snapshot name."
|
|
151
|
+
}]
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: "restore",
|
|
155
|
+
summary: "Restore a snapshot by name or id.",
|
|
156
|
+
usage: "devstack snapshot restore <name-or-id> [options]",
|
|
157
|
+
lifecycle: "offline",
|
|
158
|
+
sideEffects: "destructive",
|
|
159
|
+
requiresDocker: true,
|
|
160
|
+
arguments: ["name-or-id"],
|
|
161
|
+
options: confirmOptions
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: "list",
|
|
165
|
+
summary: "List snapshots for the selected stack.",
|
|
166
|
+
usage: "devstack snapshot list [options]",
|
|
167
|
+
lifecycle: "offline",
|
|
168
|
+
sideEffects: "read",
|
|
169
|
+
requiresDocker: false,
|
|
170
|
+
options: identityOptions
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "delete",
|
|
174
|
+
summary: "Delete a snapshot by name or id.",
|
|
175
|
+
usage: "devstack snapshot delete <name-or-id> [options]",
|
|
176
|
+
lifecycle: "offline",
|
|
177
|
+
sideEffects: "destructive",
|
|
178
|
+
requiresDocker: false,
|
|
179
|
+
arguments: ["name-or-id"],
|
|
180
|
+
options: confirmOptions
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
name: "prune",
|
|
186
|
+
summary: "Inventory and prune devstack-labelled Docker resources.",
|
|
187
|
+
usage: "devstack prune [--list | --dry-run | --all --yes] [options]",
|
|
188
|
+
lifecycle: "offline",
|
|
189
|
+
sideEffects: "destructive",
|
|
190
|
+
requiresDocker: true,
|
|
191
|
+
options: [
|
|
192
|
+
...globalMaintenanceOptions,
|
|
193
|
+
{
|
|
194
|
+
name: "list",
|
|
195
|
+
description: "List resource groups without pruning."
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: "all",
|
|
199
|
+
description: "Prune every idle non-shared resource group."
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
name: "no-containers",
|
|
203
|
+
description: "Do not remove containers."
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: "no-networks",
|
|
207
|
+
description: "Do not remove networks."
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: "no-volumes",
|
|
211
|
+
description: "Do not remove volumes."
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
name: "include-images",
|
|
215
|
+
description: "Also remove devstack-labelled images."
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: "dry-run",
|
|
219
|
+
description: "Skip mutating effects."
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: "yes",
|
|
223
|
+
description: "Assume yes on prompts."
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
name: "no-input",
|
|
227
|
+
description: "Forbid prompts."
|
|
228
|
+
}
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
name: "wipe",
|
|
233
|
+
summary: "Destroy all state for the selected stack.",
|
|
234
|
+
usage: "devstack wipe [--dry-run] [--yes] [options]",
|
|
235
|
+
lifecycle: "offline",
|
|
236
|
+
sideEffects: "destructive",
|
|
237
|
+
requiresDocker: true,
|
|
238
|
+
options: [
|
|
239
|
+
...identityOptions,
|
|
240
|
+
{
|
|
241
|
+
name: "dry-run",
|
|
242
|
+
description: "Skip mutating effects."
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
name: "yes",
|
|
246
|
+
description: "Assume yes on prompts."
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
name: "no-input",
|
|
250
|
+
description: "Forbid prompts."
|
|
251
|
+
}
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
];
|
|
255
|
+
const COMMAND_TREE = {
|
|
256
|
+
name: "devstack",
|
|
257
|
+
summary: "Sui development stack CLI.",
|
|
258
|
+
usage: "devstack <command> [options]",
|
|
259
|
+
lifecycle: "offline",
|
|
260
|
+
sideEffects: "none",
|
|
261
|
+
requiresDocker: false,
|
|
262
|
+
description: "Boot, inspect, snapshot, and manage local Sui development stacks.",
|
|
263
|
+
subcommands: commands
|
|
264
|
+
};
|
|
265
|
+
const VERBS = commands.map((command) => command.name);
|
|
266
|
+
const commandSchema = () => ({
|
|
267
|
+
schemaVersion: 1,
|
|
268
|
+
verbs: VERBS,
|
|
269
|
+
commands: COMMAND_TREE,
|
|
270
|
+
exitCodes: exitCodeTable,
|
|
271
|
+
envVars: Object.values(ENV_VARS)
|
|
272
|
+
});
|
|
273
|
+
//#endregion
|
|
274
|
+
export { COMMAND_TREE, VERBS, commandSchema };
|
|
275
|
+
|
|
276
|
+
//# sourceMappingURL=command-tree.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-tree.mjs","names":[],"sources":["../../../src/surfaces/cli/command-tree.ts"],"sourcesContent":["import { ENV_VARS } from './flags.ts';\nimport { exitCodeTable } from './sysexits.ts';\n\nexport type CommandLifecycle = 'attached' | 'live-aware' | 'one-shot' | 'offline';\n\nexport interface CommandOption {\n\treadonly name: string;\n\treadonly value?: string;\n\treadonly description: string;\n}\n\nexport interface CommandNode {\n\treadonly name: string;\n\treadonly summary: string;\n\treadonly usage: string;\n\treadonly lifecycle: CommandLifecycle;\n\treadonly sideEffects: 'none' | 'read' | 'write' | 'destructive';\n\treadonly requiresDocker: boolean;\n\treadonly description?: string;\n\treadonly arguments?: ReadonlyArray<string>;\n\treadonly options?: ReadonlyArray<CommandOption>;\n\treadonly subcommands?: ReadonlyArray<CommandNode>;\n}\n\nconst identityOptions = [\n\t{ name: 'json', description: 'Emit JSON envelope output.' },\n\t{ name: 'app', value: 'name', description: 'Override app name.' },\n\t{ name: 'stack', value: 'name', description: 'Override stack name.' },\n\t{ name: 'state-dir', value: 'path', description: 'Override state directory.' },\n\t{ name: 'verbose', description: 'Enable more verbose logging.' },\n] as const satisfies ReadonlyArray<CommandOption>;\n\nconst configOptions = [\n\t...identityOptions,\n\t{ name: 'config', value: 'path', description: 'Override devstack.config.ts path.' },\n\t{ name: 'network', value: 'name', description: 'Override network before config import.' },\n] as const satisfies ReadonlyArray<CommandOption>;\n\nconst confirmOptions = [\n\t...identityOptions,\n\t{ name: 'yes', description: 'Assume yes on prompts.' },\n\t{ name: 'no-input', description: 'Forbid prompts.' },\n] as const satisfies ReadonlyArray<CommandOption>;\n\nconst globalMaintenanceOptions = [\n\t{ name: 'json', description: 'Emit JSON envelope output.' },\n\t{ name: 'state-dir', value: 'path', description: 'Override state directory.' },\n\t{ name: 'verbose', description: 'Enable more verbose logging.' },\n] as const satisfies ReadonlyArray<CommandOption>;\n\nconst commands = [\n\t{\n\t\tname: 'up',\n\t\tsummary: 'Boot a stack and stay attached until interrupted.',\n\t\tusage: 'devstack up [options]',\n\t\tlifecycle: 'attached',\n\t\tsideEffects: 'write',\n\t\trequiresDocker: true,\n\t\tdescription: 'Starts the supervisor and renders the attached operator surface.',\n\t\toptions: [\n\t\t\t...configOptions,\n\t\t\t{\n\t\t\t\tname: 'renderer',\n\t\t\t\tvalue: 'tui|plain|silent',\n\t\t\t\tdescription: 'Select the attached renderer.',\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: 'apply',\n\t\tsummary: 'Reconcile through a live supervisor when present; otherwise run one-shot setup.',\n\t\tusage: 'devstack apply [options]',\n\t\tlifecycle: 'live-aware',\n\t\tsideEffects: 'write',\n\t\trequiresDocker: true,\n\t\toptions: configOptions,\n\t},\n\t{\n\t\tname: 'status',\n\t\tsummary: 'Show the persisted stack projection.',\n\t\tusage: 'devstack status [options]',\n\t\tlifecycle: 'offline',\n\t\tsideEffects: 'read',\n\t\trequiresDocker: false,\n\t\toptions: identityOptions,\n\t},\n\t{\n\t\tname: 'doctor',\n\t\tsummary: 'Run host and stack preflight checks.',\n\t\tusage: 'devstack doctor [options]',\n\t\tlifecycle: 'offline',\n\t\tsideEffects: 'read',\n\t\trequiresDocker: true,\n\t\toptions: identityOptions,\n\t},\n\t{\n\t\tname: 'config',\n\t\tsummary: 'Print resolved config inputs.',\n\t\tusage: 'devstack config [options]',\n\t\tlifecycle: 'offline',\n\t\tsideEffects: 'read',\n\t\trequiresDocker: false,\n\t\toptions: configOptions,\n\t},\n\t{\n\t\tname: 'schema',\n\t\tsummary: 'Emit the CLI schema.',\n\t\tusage: 'devstack schema --json',\n\t\tlifecycle: 'offline',\n\t\tsideEffects: 'none',\n\t\trequiresDocker: false,\n\t\toptions: [{ name: 'json', description: 'Emit JSON schema output.' }],\n\t},\n\t{\n\t\tname: 'snapshot',\n\t\tsummary: 'Capture, restore, list, or delete stack snapshots.',\n\t\tusage: 'devstack snapshot <command> [options]',\n\t\tlifecycle: 'offline',\n\t\tsideEffects: 'write',\n\t\trequiresDocker: true,\n\t\tsubcommands: [\n\t\t\t{\n\t\t\t\tname: 'save',\n\t\t\t\tsummary: 'Capture a snapshot through a one-shot stack boot.',\n\t\t\t\tusage: 'devstack snapshot save [name] [options]',\n\t\t\t\tlifecycle: 'one-shot',\n\t\t\t\tsideEffects: 'write',\n\t\t\t\trequiresDocker: true,\n\t\t\t\targuments: ['name'],\n\t\t\t\toptions: [\n\t\t\t\t\t...configOptions,\n\t\t\t\t\t{ name: 'name', value: 'name', description: 'Human-readable snapshot name.' },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'restore',\n\t\t\t\tsummary: 'Restore a snapshot by name or id.',\n\t\t\t\tusage: 'devstack snapshot restore <name-or-id> [options]',\n\t\t\t\tlifecycle: 'offline',\n\t\t\t\tsideEffects: 'destructive',\n\t\t\t\trequiresDocker: true,\n\t\t\t\targuments: ['name-or-id'],\n\t\t\t\toptions: confirmOptions,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'list',\n\t\t\t\tsummary: 'List snapshots for the selected stack.',\n\t\t\t\tusage: 'devstack snapshot list [options]',\n\t\t\t\tlifecycle: 'offline',\n\t\t\t\tsideEffects: 'read',\n\t\t\t\trequiresDocker: false,\n\t\t\t\toptions: identityOptions,\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'delete',\n\t\t\t\tsummary: 'Delete a snapshot by name or id.',\n\t\t\t\tusage: 'devstack snapshot delete <name-or-id> [options]',\n\t\t\t\tlifecycle: 'offline',\n\t\t\t\tsideEffects: 'destructive',\n\t\t\t\trequiresDocker: false,\n\t\t\t\targuments: ['name-or-id'],\n\t\t\t\toptions: confirmOptions,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: 'prune',\n\t\tsummary: 'Inventory and prune devstack-labelled Docker resources.',\n\t\tusage: 'devstack prune [--list | --dry-run | --all --yes] [options]',\n\t\tlifecycle: 'offline',\n\t\tsideEffects: 'destructive',\n\t\trequiresDocker: true,\n\t\toptions: [\n\t\t\t...globalMaintenanceOptions,\n\t\t\t{ name: 'list', description: 'List resource groups without pruning.' },\n\t\t\t{ name: 'all', description: 'Prune every idle non-shared resource group.' },\n\t\t\t{ name: 'no-containers', description: 'Do not remove containers.' },\n\t\t\t{ name: 'no-networks', description: 'Do not remove networks.' },\n\t\t\t{ name: 'no-volumes', description: 'Do not remove volumes.' },\n\t\t\t{ name: 'include-images', description: 'Also remove devstack-labelled images.' },\n\t\t\t{ name: 'dry-run', description: 'Skip mutating effects.' },\n\t\t\t{ name: 'yes', description: 'Assume yes on prompts.' },\n\t\t\t{ name: 'no-input', description: 'Forbid prompts.' },\n\t\t],\n\t},\n\t{\n\t\tname: 'wipe',\n\t\tsummary: 'Destroy all state for the selected stack.',\n\t\tusage: 'devstack wipe [--dry-run] [--yes] [options]',\n\t\tlifecycle: 'offline',\n\t\tsideEffects: 'destructive',\n\t\trequiresDocker: true,\n\t\toptions: [\n\t\t\t...identityOptions,\n\t\t\t{ name: 'dry-run', description: 'Skip mutating effects.' },\n\t\t\t{ name: 'yes', description: 'Assume yes on prompts.' },\n\t\t\t{ name: 'no-input', description: 'Forbid prompts.' },\n\t\t],\n\t},\n] as const satisfies ReadonlyArray<CommandNode>;\n\nexport const COMMAND_TREE: CommandNode = {\n\tname: 'devstack',\n\tsummary: 'Sui development stack CLI.',\n\tusage: 'devstack <command> [options]',\n\tlifecycle: 'offline',\n\tsideEffects: 'none',\n\trequiresDocker: false,\n\tdescription: 'Boot, inspect, snapshot, and manage local Sui development stacks.',\n\tsubcommands: commands,\n};\n\nexport type Verb = (typeof commands)[number]['name'];\n\nexport const VERBS: ReadonlyArray<Verb> = commands.map((command) => command.name);\n\nexport const isVerb = (value: string): value is Verb =>\n\t(VERBS as ReadonlyArray<string>).includes(value);\n\nconst findSubcommand = (node: CommandNode, name: string): CommandNode | undefined =>\n\tnode.subcommands?.find((candidate) => candidate.name === name);\n\nexport const findCommandNode = (path: ReadonlyArray<string>): CommandNode | null => {\n\tlet current: CommandNode = COMMAND_TREE;\n\tfor (const segment of path) {\n\t\tconst next = findSubcommand(current, segment);\n\t\tif (next === undefined) return null;\n\t\tcurrent = next;\n\t}\n\treturn current;\n};\n\nconst formatOption = (option: CommandOption): string =>\n\t`--${option.name}${option.value ? ` <${option.value}>` : ''}`;\n\nconst pad = (values: ReadonlyArray<string>): number =>\n\tvalues.reduce((max, value) => Math.max(max, value.length), 0);\n\nconst pushCommandRows = (\n\tlines: Array<string>,\n\ttitle: string,\n\tcommandsToRender: ReadonlyArray<CommandNode>,\n) => {\n\tif (commandsToRender.length === 0) return;\n\tconst names = commandsToRender.map((command) => command.name);\n\tconst width = pad(names);\n\tlines.push('', `${title}:`);\n\tfor (const command of commandsToRender) {\n\t\tlines.push(` ${command.name.padEnd(width, ' ')} ${command.summary}`);\n\t}\n};\n\nconst pushOptionRows = (\n\tlines: Array<string>,\n\ttitle: string,\n\toptions: ReadonlyArray<CommandOption>,\n) => {\n\tif (options.length === 0) return;\n\tconst rendered = options.map(formatOption);\n\tconst width = pad(rendered);\n\tlines.push('', `${title}:`);\n\tfor (let i = 0; i < options.length; i += 1) {\n\t\tlines.push(` ${rendered[i]!.padEnd(width, ' ')} ${options[i]!.description}`);\n\t}\n};\n\nexport const formatCommandHelp = (path: ReadonlyArray<string>): string => {\n\tconst node = findCommandNode(path) ?? COMMAND_TREE;\n\tconst lines: Array<string> = [\n\t\tpath.length === 0\n\t\t\t? 'devstack - Sui development stack CLI'\n\t\t\t: `${path.join(' ')} - ${node.summary}`,\n\t\t'',\n\t\t`Usage: ${node.usage}`,\n\t];\n\tif (node.description !== undefined) lines.push('', node.description);\n\tif (node.arguments !== undefined && node.arguments.length > 0) {\n\t\tlines.push('', `Arguments: ${node.arguments.join(', ')}`);\n\t}\n\tpushCommandRows(lines, path.length === 0 ? 'Commands' : 'Subcommands', node.subcommands ?? []);\n\tpushOptionRows(lines, 'Options', node.options ?? []);\n\treturn lines.join('\\n');\n};\n\nexport const commandSchema = () => ({\n\tschemaVersion: 1,\n\tverbs: VERBS,\n\tcommands: COMMAND_TREE,\n\texitCodes: exitCodeTable,\n\tenvVars: Object.values(ENV_VARS),\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { emitSuccess } from "../output.mjs";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
//#region src/surfaces/cli/commands/config.ts
|
|
4
|
+
const runConfig = (deps, ctx) => Effect.gen(function* () {
|
|
5
|
+
const started = Date.now();
|
|
6
|
+
const data = {
|
|
7
|
+
resolvedConfigPath: (yield* deps.loader.load(ctx.flags.configPath)).resolvedConfigPath,
|
|
8
|
+
app: ctx.flags.app ?? null,
|
|
9
|
+
stack: ctx.flags.stack ?? null,
|
|
10
|
+
stateDir: ctx.flags.stateDir ?? null,
|
|
11
|
+
network: ctx.flags.network ?? null
|
|
12
|
+
};
|
|
13
|
+
const humanLines = [
|
|
14
|
+
`config: ${data.resolvedConfigPath}`,
|
|
15
|
+
`app: ${data.app ?? "(default)"}`,
|
|
16
|
+
`stack: ${data.stack ?? "(default)"}`,
|
|
17
|
+
`stateDir: ${data.stateDir ?? "(default)"}`,
|
|
18
|
+
`network: ${data.network ?? "(default)"}`
|
|
19
|
+
];
|
|
20
|
+
yield* emitSuccess(ctx.io, ctx.flags.outputMode, {
|
|
21
|
+
command: "config",
|
|
22
|
+
elapsedMs: Date.now() - started,
|
|
23
|
+
data,
|
|
24
|
+
humanLines
|
|
25
|
+
});
|
|
26
|
+
return { exitCode: 0 };
|
|
27
|
+
}).pipe(Effect.withSpan("cli.config"));
|
|
28
|
+
//#endregion
|
|
29
|
+
export { runConfig };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.mjs","names":[],"sources":["../../../../src/surfaces/cli/commands/config.ts"],"sourcesContent":["// CLI verb: `devstack config` — print resolved config.\n//\n// Observational. Loads the user's `devstack.config.ts`, resolves all\n// active overrides (flag > env > active-stack > default), and emits\n// the projection. Never publishes a command.\n//\n// JSON output is canonical: it is the same shape the programmable\n// API exposes for \"what is my config right now?\", so build\n// integrations can pin against it.\n\nimport { Effect } from 'effect';\n\nimport type { ConfigLoader, LoadedConfig } from './config-loader.ts';\nimport type { CliError } from '../errors.ts';\nimport { emitSuccess } from '../output.ts';\nimport type { CommandContext, CommandResult } from './index.ts';\n\nexport interface ConfigDeps {\n\treadonly loader: ConfigLoader;\n}\n\nexport const runConfig = (\n\tdeps: ConfigDeps,\n\tctx: CommandContext,\n): Effect.Effect<CommandResult, CliError> =>\n\tEffect.gen(function* () {\n\t\tconst started = Date.now();\n\t\tconst loaded: LoadedConfig = yield* deps.loader.load(ctx.flags.configPath);\n\t\tconst data = {\n\t\t\tresolvedConfigPath: loaded.resolvedConfigPath,\n\t\t\tapp: ctx.flags.app ?? null,\n\t\t\tstack: ctx.flags.stack ?? null,\n\t\t\tstateDir: ctx.flags.stateDir ?? null,\n\t\t\tnetwork: ctx.flags.network ?? null,\n\t\t};\n\t\tconst humanLines = [\n\t\t\t`config: ${data.resolvedConfigPath}`,\n\t\t\t`app: ${data.app ?? '(default)'}`,\n\t\t\t`stack: ${data.stack ?? '(default)'}`,\n\t\t\t`stateDir: ${data.stateDir ?? '(default)'}`,\n\t\t\t`network: ${data.network ?? '(default)'}`,\n\t\t];\n\t\tyield* emitSuccess(ctx.io, ctx.flags.outputMode, {\n\t\t\tcommand: 'config',\n\t\t\telapsedMs: Date.now() - started,\n\t\t\tdata,\n\t\t\thumanLines,\n\t\t});\n\t\treturn { exitCode: 0 } as CommandResult;\n\t}).pipe(Effect.withSpan('cli.config'));\n"],"mappings":";;;AAqBA,MAAa,aACZ,MACA,QAEA,OAAO,IAAI,aAAa;CACvB,MAAM,UAAU,KAAK,KAAK;CAE1B,MAAM,OAAO;EACZ,qBAAoB,OAFe,KAAK,OAAO,KAAK,IAAI,MAAM,WAAW,EAE9C;EAC3B,KAAK,IAAI,MAAM,OAAO;EACtB,OAAO,IAAI,MAAM,SAAS;EAC1B,UAAU,IAAI,MAAM,YAAY;EAChC,SAAS,IAAI,MAAM,WAAW;EAC9B;CACD,MAAM,aAAa;EAClB,cAAc,KAAK;EACnB,cAAc,KAAK,OAAO;EAC1B,cAAc,KAAK,SAAS;EAC5B,cAAc,KAAK,YAAY;EAC/B,cAAc,KAAK,WAAW;EAC9B;AACD,QAAO,YAAY,IAAI,IAAI,IAAI,MAAM,YAAY;EAChD,SAAS;EACT,WAAW,KAAK,KAAK,GAAG;EACxB;EACA;EACA,CAAC;AACF,QAAO,EAAE,UAAU,GAAG;EACrB,CAAC,KAAK,OAAO,SAAS,aAAa,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CliInternalError } from "../errors.mjs";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { stderr, stdin } from "node:process";
|
|
4
|
+
import { createInterface } from "node:readline/promises";
|
|
5
|
+
//#region src/surfaces/cli/commands/confirm-node.ts
|
|
6
|
+
const nodeConfirmPrompt = (input) => Effect.tryPromise({
|
|
7
|
+
try: async () => {
|
|
8
|
+
const rl = createInterface({
|
|
9
|
+
input: stdin,
|
|
10
|
+
output: stderr
|
|
11
|
+
});
|
|
12
|
+
try {
|
|
13
|
+
return (await rl.question(`${input.prompt} Type y to continue: `)).trim().toLowerCase() === "y";
|
|
14
|
+
} finally {
|
|
15
|
+
rl.close();
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
catch: (cause) => new CliInternalError({
|
|
19
|
+
message: `${input.verb} confirmation prompt failed`,
|
|
20
|
+
cause
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
export { nodeConfirmPrompt };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=confirm-node.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-node.mjs","names":[],"sources":["../../../../src/surfaces/cli/commands/confirm-node.ts"],"sourcesContent":["import { stderr, stdin } from 'node:process';\nimport { createInterface } from 'node:readline/promises';\n\nimport { Effect } from 'effect';\n\nimport { CliInternalError } from '../errors.ts';\nimport type { ConfirmPrompt } from './confirm.ts';\n\nexport const nodeConfirmPrompt: ConfirmPrompt = (input) =>\n\tEffect.tryPromise({\n\t\ttry: async () => {\n\t\t\tconst rl = createInterface({ input: stdin, output: stderr });\n\t\t\ttry {\n\t\t\t\tconst answer = await rl.question(`${input.prompt} Type y to continue: `);\n\t\t\t\treturn answer.trim().toLowerCase() === 'y';\n\t\t\t} finally {\n\t\t\t\trl.close();\n\t\t\t}\n\t\t},\n\t\tcatch: (cause) =>\n\t\t\tnew CliInternalError({\n\t\t\t\tmessage: `${input.verb} confirmation prompt failed`,\n\t\t\t\tcause,\n\t\t\t}),\n\t});\n"],"mappings":";;;;;AAQA,MAAa,qBAAoC,UAChD,OAAO,WAAW;CACjB,KAAK,YAAY;EAChB,MAAM,KAAK,gBAAgB;GAAE,OAAO;GAAO,QAAQ;GAAQ,CAAC;AAC5D,MAAI;AAEH,WAAO,MADc,GAAG,SAAS,GAAG,MAAM,OAAO,uBAAuB,EAC1D,MAAM,CAAC,aAAa,KAAK;YAC9B;AACT,MAAG,OAAO;;;CAGZ,QAAQ,UACP,IAAI,iBAAiB;EACpB,SAAS,GAAG,MAAM,KAAK;EACvB;EACA,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CliConfirmDeclinedError, CliConfirmRequiredError, CliInternalError, isCliError } from "../errors.mjs";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
//#region src/surfaces/cli/commands/confirm.ts
|
|
4
|
+
const confirmDestructive = (confirm, ctx, input) => Effect.gen(function* () {
|
|
5
|
+
if (input.skipWhenDryRun !== false && ctx.flags.dryRun) return;
|
|
6
|
+
const { assumeYes, forbidPrompt, stdinIsTty } = ctx.flags.confirm;
|
|
7
|
+
if (assumeYes) return;
|
|
8
|
+
if (forbidPrompt || !stdinIsTty) return yield* Effect.fail(new CliConfirmRequiredError({
|
|
9
|
+
verb: input.verb,
|
|
10
|
+
hint: "rerun with --yes or run in a TTY to confirm interactively"
|
|
11
|
+
}));
|
|
12
|
+
if (!(yield* confirm({
|
|
13
|
+
verb: input.verb,
|
|
14
|
+
prompt: input.prompt
|
|
15
|
+
}).pipe(Effect.catch((cause) => isCliError(cause) ? Effect.fail(cause) : Effect.fail(new CliInternalError({
|
|
16
|
+
message: `${input.verb} confirmation prompt failed`,
|
|
17
|
+
cause
|
|
18
|
+
})))))) return yield* Effect.fail(new CliConfirmDeclinedError({
|
|
19
|
+
verb: input.verb,
|
|
20
|
+
hint: "rerun with --yes to skip interactive confirmation"
|
|
21
|
+
}));
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
export { confirmDestructive };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=confirm.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm.mjs","names":[],"sources":["../../../../src/surfaces/cli/commands/confirm.ts"],"sourcesContent":["import { Effect } from 'effect';\n\nimport {\n\ttype CliError,\n\tCliConfirmDeclinedError,\n\tCliConfirmRequiredError,\n\tCliInternalError,\n\tisCliError,\n} from '../errors.ts';\nimport type { CommandContext } from './index.ts';\n\nexport interface ConfirmPromptInput {\n\treadonly verb: string;\n\treadonly prompt: string;\n}\n\nexport type ConfirmPrompt = (input: ConfirmPromptInput) => Effect.Effect<boolean, unknown>;\n\nexport const confirmDestructive = (\n\tconfirm: ConfirmPrompt,\n\tctx: CommandContext,\n\tinput: ConfirmPromptInput & { readonly skipWhenDryRun?: boolean },\n): Effect.Effect<void, CliError> =>\n\tEffect.gen(function* () {\n\t\tif (input.skipWhenDryRun !== false && ctx.flags.dryRun) return;\n\t\tconst { assumeYes, forbidPrompt, stdinIsTty } = ctx.flags.confirm;\n\t\tif (assumeYes) return;\n\t\tif (forbidPrompt || !stdinIsTty) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew CliConfirmRequiredError({\n\t\t\t\t\tverb: input.verb,\n\t\t\t\t\thint: 'rerun with --yes or run in a TTY to confirm interactively',\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst confirmed = yield* confirm({ verb: input.verb, prompt: input.prompt }).pipe(\n\t\t\tEffect.catch((cause: unknown) =>\n\t\t\t\tisCliError(cause)\n\t\t\t\t\t? Effect.fail(cause)\n\t\t\t\t\t: Effect.fail(\n\t\t\t\t\t\t\tnew CliInternalError({\n\t\t\t\t\t\t\t\tmessage: `${input.verb} confirmation prompt failed`,\n\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t),\n\t\t);\n\t\tif (!confirmed) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew CliConfirmDeclinedError({\n\t\t\t\t\tverb: input.verb,\n\t\t\t\t\thint: 'rerun with --yes to skip interactive confirmation',\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t});\n"],"mappings":";;;AAkBA,MAAa,sBACZ,SACA,KACA,UAEA,OAAO,IAAI,aAAa;AACvB,KAAI,MAAM,mBAAmB,SAAS,IAAI,MAAM,OAAQ;CACxD,MAAM,EAAE,WAAW,cAAc,eAAe,IAAI,MAAM;AAC1D,KAAI,UAAW;AACf,KAAI,gBAAgB,CAAC,WACpB,QAAO,OAAO,OAAO,KACpB,IAAI,wBAAwB;EAC3B,MAAM,MAAM;EACZ,MAAM;EACN,CAAC,CACF;AAcF,KAAI,EAAC,OAZoB,QAAQ;EAAE,MAAM,MAAM;EAAM,QAAQ,MAAM;EAAQ,CAAC,CAAC,KAC5E,OAAO,OAAO,UACb,WAAW,MAAM,GACd,OAAO,KAAK,MAAM,GAClB,OAAO,KACP,IAAI,iBAAiB;EACpB,SAAS,GAAG,MAAM,KAAK;EACvB;EACA,CAAC,CACF,CACH,CACD,EAEA,QAAO,OAAO,OAAO,KACpB,IAAI,wBAAwB;EAC3B,MAAM,MAAM;EACZ,MAAM;EACN,CAAC,CACF;EAED"}
|