@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,296 @@
|
|
|
1
|
+
import { IdentityContext, StackPathsService } from "../../substrate/runtime/paths.mjs";
|
|
2
|
+
import { ownHolder } from "../../substrate/runtime/cross-process/liveness.mjs";
|
|
3
|
+
import { acquireStackLock } from "../../substrate/runtime/cross-process/stack-lock.mjs";
|
|
4
|
+
import { ContainerRuntimeService } from "../../runtime/docker/service.mjs";
|
|
5
|
+
import { acquireReservation } from "../../substrate/runtime/cross-process/snapshot-reservation.mjs";
|
|
6
|
+
import { SNAPSHOT_ID_RULE, SnapshotLayout, SnapshotMetadataSchema, parseSnapshotId } from "./descriptor.mjs";
|
|
7
|
+
import { runCapture } from "./capture.mjs";
|
|
8
|
+
import { runWipe } from "./wipe.mjs";
|
|
9
|
+
import { runPrune } from "./prune.mjs";
|
|
10
|
+
import { stageAndSwap } from "../../substrate/runtime/stage-and-swap/index.mjs";
|
|
11
|
+
import { runRestore } from "./restore.mjs";
|
|
12
|
+
import { Context, Effect, FileSystem, Layer, Ref, Schema } from "effect";
|
|
13
|
+
import { randomUUID } from "node:crypto";
|
|
14
|
+
Schema.TaggedErrorClass()("SnapshotBootError", { detail: Schema.String });
|
|
15
|
+
var SnapshotIdError = class extends Schema.TaggedErrorClass()("SnapshotIdError", {
|
|
16
|
+
operation: Schema.Literals([
|
|
17
|
+
"capture",
|
|
18
|
+
"restore",
|
|
19
|
+
"delete"
|
|
20
|
+
]),
|
|
21
|
+
field: Schema.Literals(["id", "name"]),
|
|
22
|
+
value: Schema.String,
|
|
23
|
+
detail: Schema.String
|
|
24
|
+
}) {};
|
|
25
|
+
var SnapshotOrchestratorService = class extends Context.Service()("@devstack-rewrite/orchestrators/Snapshot") {};
|
|
26
|
+
/** Mint a snapshot id when the caller didn't pass one. Carries an
|
|
27
|
+
* 8-hex random suffix from `crypto.randomUUID()` (STYLE_GUIDE §17) so
|
|
28
|
+
* concurrent saves don't silently overwrite. */
|
|
29
|
+
const mintId = (prefix = "snap") => `${prefix}-${Date.now()}-${randomUUID().replace(/-/g, "").slice(0, 8)}`;
|
|
30
|
+
const mintSnapshotId = () => {
|
|
31
|
+
const id = parseSnapshotId(mintId());
|
|
32
|
+
if (id === null) throw new Error("internal snapshot id minting produced an invalid id");
|
|
33
|
+
return id;
|
|
34
|
+
};
|
|
35
|
+
const mintSnapshotName = () => {
|
|
36
|
+
return `manual-${(/* @__PURE__ */ new Date()).toISOString().replaceAll("-", "").replaceAll(":", "").slice(0, 15)}-${randomUUID().replace(/-/g, "").slice(0, 4)}`;
|
|
37
|
+
};
|
|
38
|
+
const validateSnapshotId = (operation, value) => {
|
|
39
|
+
const id = parseSnapshotId(value);
|
|
40
|
+
return id === null ? Effect.fail(new SnapshotIdError({
|
|
41
|
+
operation,
|
|
42
|
+
field: "id",
|
|
43
|
+
value,
|
|
44
|
+
detail: SNAPSHOT_ID_RULE
|
|
45
|
+
})) : Effect.succeed(id);
|
|
46
|
+
};
|
|
47
|
+
const normalizeSnapshotName = (operation, name) => {
|
|
48
|
+
if (name === void 0) return Effect.succeed(mintSnapshotName());
|
|
49
|
+
const normalized = name.trim();
|
|
50
|
+
if (normalized.length === 0 || normalized.includes("\0") || normalized.length > 128) return Effect.fail(new SnapshotIdError({
|
|
51
|
+
operation,
|
|
52
|
+
field: "name",
|
|
53
|
+
value: name,
|
|
54
|
+
detail: "snapshot names must be 1-128 characters after trimming and cannot contain NUL bytes"
|
|
55
|
+
}));
|
|
56
|
+
return Effect.succeed(normalized);
|
|
57
|
+
};
|
|
58
|
+
/** Read this process's canonical startTime stamp for the snapshot
|
|
59
|
+
* reservation liveness check. */
|
|
60
|
+
const ownStartTime = () => ownHolder("snapshot").startTime;
|
|
61
|
+
const normalizeIdentityValue = (value) => {
|
|
62
|
+
if (Array.isArray(value)) return value.map(normalizeIdentityValue);
|
|
63
|
+
if (value !== null && typeof value === "object") return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, nested]) => [key, normalizeIdentityValue(nested)]));
|
|
64
|
+
return value;
|
|
65
|
+
};
|
|
66
|
+
const stableIdentityString = (value) => {
|
|
67
|
+
return JSON.stringify(normalizeIdentityValue(value)) ?? String(value);
|
|
68
|
+
};
|
|
69
|
+
const identityHookFromDecl = (pluginKey, decl) => decl.preRestore === void 0 ? Effect.succeed({}) : decl.preRestore.pipe(Effect.map((value) => ({ [pluginKey]: stableIdentityString(value) })));
|
|
70
|
+
const layerSnapshotOrchestrator = Layer.effect(SnapshotOrchestratorService, Effect.gen(function* () {
|
|
71
|
+
const paths = yield* StackPathsService;
|
|
72
|
+
const identity = yield* IdentityContext;
|
|
73
|
+
const runtime = yield* ContainerRuntimeService;
|
|
74
|
+
const participantsRef = yield* Ref.make([]);
|
|
75
|
+
const classifiersRef = yield* Ref.make([]);
|
|
76
|
+
const seqRef = yield* Ref.make(0);
|
|
77
|
+
const registerParticipant = (pluginKey, decl, hooks) => Effect.gen(function* () {
|
|
78
|
+
const seq = yield* Ref.updateAndGet(seqRef, (n) => n + 1);
|
|
79
|
+
const declIdentity = identityHookFromDecl(pluginKey, decl);
|
|
80
|
+
const entry = {
|
|
81
|
+
pluginKey,
|
|
82
|
+
capture: {
|
|
83
|
+
plugin: pluginKey,
|
|
84
|
+
decl,
|
|
85
|
+
captureIdentity: hooks?.captureIdentity ?? declIdentity,
|
|
86
|
+
captureContribution: hooks?.captureContribution ?? Effect.succeed(void 0)
|
|
87
|
+
},
|
|
88
|
+
restore: {
|
|
89
|
+
plugin: pluginKey,
|
|
90
|
+
liveIdentity: hooks?.liveIdentity ?? declIdentity,
|
|
91
|
+
postRestore: decl.postRestore
|
|
92
|
+
},
|
|
93
|
+
seq
|
|
94
|
+
};
|
|
95
|
+
yield* Ref.update(participantsRef, (xs) => [...xs, entry]);
|
|
96
|
+
yield* Effect.addFinalizer(() => Ref.update(participantsRef, (xs) => xs.filter((e) => e.seq !== seq)));
|
|
97
|
+
yield* Effect.annotateCurrentSpan({
|
|
98
|
+
"snapshot.participant.plugin": pluginKey,
|
|
99
|
+
"snapshot.participant.subtrees": decl.subtrees.length
|
|
100
|
+
});
|
|
101
|
+
}).pipe(Effect.withSpan("orchestrator.snapshot.registerParticipant"));
|
|
102
|
+
const registerClassifier = (pluginKey, decl) => Effect.gen(function* () {
|
|
103
|
+
const seq = yield* Ref.updateAndGet(seqRef, (n) => n + 1);
|
|
104
|
+
const entry = {
|
|
105
|
+
dispatch: {
|
|
106
|
+
plugin: pluginKey,
|
|
107
|
+
decl
|
|
108
|
+
},
|
|
109
|
+
seq
|
|
110
|
+
};
|
|
111
|
+
yield* Ref.update(classifiersRef, (xs) => [...xs, entry]);
|
|
112
|
+
yield* Effect.addFinalizer(() => Ref.update(classifiersRef, (xs) => xs.filter((e) => e.seq !== seq)));
|
|
113
|
+
yield* Effect.annotateCurrentSpan({ "snapshot.classifier.plugin": pluginKey });
|
|
114
|
+
}).pipe(Effect.withSpan("orchestrator.snapshot.registerClassifier"));
|
|
115
|
+
const capture = ({ id, label, participants, onProgress }) => Effect.gen(function* () {
|
|
116
|
+
const snapshotId = id === void 0 ? mintSnapshotId() : yield* validateSnapshotId("capture", id);
|
|
117
|
+
const snapshotName = yield* normalizeSnapshotName("capture", label);
|
|
118
|
+
const effectiveParticipants = participants ?? (yield* Ref.get(participantsRef)).map((e) => e.capture);
|
|
119
|
+
const artifactDir = `${paths.snapshotDir}/${snapshotId}`;
|
|
120
|
+
const stagingDir = `${paths.snapshotDir}/.staging.${snapshotId}`;
|
|
121
|
+
const backupDir = `${paths.snapshotDir}/.bak.${snapshotId}`;
|
|
122
|
+
return yield* Effect.scoped(Effect.gen(function* () {
|
|
123
|
+
yield* acquireReservation(paths.snapshotReservationFile, ownStartTime());
|
|
124
|
+
if (yield* (yield* FileSystem.FileSystem).exists(artifactDir).pipe(Effect.catch(() => Effect.succeed(false)))) return yield* Effect.fail(new SnapshotIdError({
|
|
125
|
+
operation: "capture",
|
|
126
|
+
field: "id",
|
|
127
|
+
value: snapshotId,
|
|
128
|
+
detail: "snapshot id already exists"
|
|
129
|
+
}));
|
|
130
|
+
if ((yield* list).some((entry) => entry.metadata?.label === snapshotName)) return yield* Effect.fail(new SnapshotIdError({
|
|
131
|
+
operation: "capture",
|
|
132
|
+
field: "name",
|
|
133
|
+
value: snapshotName,
|
|
134
|
+
detail: "snapshot name already exists"
|
|
135
|
+
}));
|
|
136
|
+
return yield* stageAndSwap({
|
|
137
|
+
targetPath: artifactDir,
|
|
138
|
+
stagingPath: stagingDir,
|
|
139
|
+
backupPath: backupDir,
|
|
140
|
+
build: runCapture({
|
|
141
|
+
stagingDir,
|
|
142
|
+
snapshotId,
|
|
143
|
+
label: snapshotName,
|
|
144
|
+
app: identity.app,
|
|
145
|
+
stack: identity.stack,
|
|
146
|
+
network: identity.chain,
|
|
147
|
+
runtimeStackRoot: paths.stackRoot,
|
|
148
|
+
stateFilePath: paths.stateFile,
|
|
149
|
+
participants: effectiveParticipants,
|
|
150
|
+
runtime,
|
|
151
|
+
onProgress
|
|
152
|
+
})
|
|
153
|
+
});
|
|
154
|
+
}));
|
|
155
|
+
}).pipe(Effect.withSpan("orchestrator.snapshot.capture.entry"));
|
|
156
|
+
const restore = ({ id, participants }) => Effect.gen(function* () {
|
|
157
|
+
const snapshotId = yield* validateSnapshotId("restore", id);
|
|
158
|
+
const artifactDir = `${paths.snapshotDir}/${snapshotId}`;
|
|
159
|
+
const effectiveParticipants = participants ?? (yield* Ref.get(participantsRef)).map((e) => e.restore);
|
|
160
|
+
return yield* Effect.scoped(Effect.gen(function* () {
|
|
161
|
+
yield* acquireReservation(paths.snapshotReservationFile, ownStartTime());
|
|
162
|
+
return yield* runRestore({
|
|
163
|
+
snapshotId,
|
|
164
|
+
artifactDir,
|
|
165
|
+
runtimeStackRoot: paths.stackRoot,
|
|
166
|
+
runtimeStagingPath: `${paths.stackRoot}.staging.${snapshotId}`,
|
|
167
|
+
runtimeBackupPath: `${paths.stackRoot}.bak.${snapshotId}`,
|
|
168
|
+
participants: effectiveParticipants,
|
|
169
|
+
runtime,
|
|
170
|
+
runtimeIdentity: {
|
|
171
|
+
app: identity.app,
|
|
172
|
+
stack: identity.stack,
|
|
173
|
+
network: identity.chain
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}));
|
|
177
|
+
}).pipe(Effect.withSpan("orchestrator.snapshot.restore.entry"));
|
|
178
|
+
const list = Effect.gen(function* () {
|
|
179
|
+
const fs = yield* FileSystem.FileSystem;
|
|
180
|
+
if (!(yield* fs.exists(paths.snapshotDir).pipe(Effect.catch(() => Effect.succeed(false))))) return [];
|
|
181
|
+
const ids = yield* fs.readDirectory(paths.snapshotDir).pipe(Effect.catch(() => Effect.succeed([])));
|
|
182
|
+
const entries = [];
|
|
183
|
+
for (const id of ids) {
|
|
184
|
+
if (id.startsWith(".staging.") || id.startsWith(".bak.")) continue;
|
|
185
|
+
const parsedId = parseSnapshotId(id);
|
|
186
|
+
if (parsedId === null) {
|
|
187
|
+
yield* Effect.logWarning(`ignoring unsafe snapshot catalog entry: ${id}`);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const dir = `${paths.snapshotDir}/${id}`;
|
|
191
|
+
const metaPath = `${dir}/${SnapshotLayout.metaFile}`;
|
|
192
|
+
if (!(yield* fs.exists(metaPath).pipe(Effect.catch(() => Effect.succeed(false))))) {
|
|
193
|
+
entries.push({
|
|
194
|
+
id,
|
|
195
|
+
directory: dir,
|
|
196
|
+
metadata: null
|
|
197
|
+
});
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const text = yield* fs.readFileString(metaPath).pipe(Effect.catch(() => Effect.succeed("")));
|
|
201
|
+
if (text === "") {
|
|
202
|
+
entries.push({
|
|
203
|
+
id,
|
|
204
|
+
directory: dir,
|
|
205
|
+
metadata: null
|
|
206
|
+
});
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const raw = yield* Effect.try({
|
|
210
|
+
try: () => JSON.parse(text),
|
|
211
|
+
catch: () => null
|
|
212
|
+
}).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
213
|
+
if (raw === null) {
|
|
214
|
+
entries.push({
|
|
215
|
+
id,
|
|
216
|
+
directory: dir,
|
|
217
|
+
metadata: null
|
|
218
|
+
});
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const decoded = yield* Schema.decodeUnknownEffect(SnapshotMetadataSchema)(raw).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
222
|
+
if (decoded !== null && parseSnapshotId(decoded.id) === null) {
|
|
223
|
+
yield* Effect.logWarning(`ignoring snapshot metadata with unsafe id: ${decoded.id}`);
|
|
224
|
+
entries.push({
|
|
225
|
+
id,
|
|
226
|
+
directory: dir,
|
|
227
|
+
metadata: null
|
|
228
|
+
});
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
entries.push({
|
|
232
|
+
id: parsedId,
|
|
233
|
+
directory: dir,
|
|
234
|
+
metadata: decoded
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
return entries;
|
|
238
|
+
}).pipe(Effect.withSpan("orchestrator.snapshot.list"));
|
|
239
|
+
const del = (id) => Effect.gen(function* () {
|
|
240
|
+
const snapshotId = yield* validateSnapshotId("delete", id);
|
|
241
|
+
const fs = yield* FileSystem.FileSystem;
|
|
242
|
+
const dir = `${paths.snapshotDir}/${snapshotId}`;
|
|
243
|
+
yield* Effect.scoped(Effect.gen(function* () {
|
|
244
|
+
yield* acquireStackLock(paths.stackLockFile);
|
|
245
|
+
yield* fs.remove(dir, {
|
|
246
|
+
recursive: true,
|
|
247
|
+
force: true
|
|
248
|
+
}).pipe(Effect.ignore);
|
|
249
|
+
}));
|
|
250
|
+
}).pipe(Effect.withSpan("orchestrator.snapshot.delete"));
|
|
251
|
+
const wipe = (args) => Effect.gen(function* () {
|
|
252
|
+
yield* Effect.scoped(Effect.gen(function* () {
|
|
253
|
+
yield* acquireStackLock(paths.stackLockFile);
|
|
254
|
+
yield* runWipe({
|
|
255
|
+
labelMatch: {
|
|
256
|
+
app: identity.app,
|
|
257
|
+
stack: identity.stack
|
|
258
|
+
},
|
|
259
|
+
stackRoot: paths.stackRoot,
|
|
260
|
+
stateFilePath: paths.stateFile,
|
|
261
|
+
runtime,
|
|
262
|
+
keepSnapshots: args.keepSnapshots,
|
|
263
|
+
keepCache: args.keepCache
|
|
264
|
+
});
|
|
265
|
+
}));
|
|
266
|
+
}).pipe(Effect.withSpan("orchestrator.snapshot.wipe.entry"));
|
|
267
|
+
const prune = ({ classifiers }) => Effect.gen(function* () {
|
|
268
|
+
const effectiveClassifiers = classifiers ?? (yield* Ref.get(classifiersRef)).map((e) => e.dispatch);
|
|
269
|
+
return yield* Effect.scoped(Effect.gen(function* () {
|
|
270
|
+
yield* acquireReservation(paths.snapshotReservationFile, ownStartTime());
|
|
271
|
+
return yield* runPrune({
|
|
272
|
+
stackRoot: paths.stackRoot,
|
|
273
|
+
imageLabelFilter: {
|
|
274
|
+
app: identity.app,
|
|
275
|
+
stack: identity.stack
|
|
276
|
+
},
|
|
277
|
+
classifiers: effectiveClassifiers,
|
|
278
|
+
runtime
|
|
279
|
+
});
|
|
280
|
+
}));
|
|
281
|
+
}).pipe(Effect.withSpan("orchestrator.snapshot.prune.entry"));
|
|
282
|
+
return SnapshotOrchestratorService.of({
|
|
283
|
+
registerParticipant,
|
|
284
|
+
registerClassifier,
|
|
285
|
+
capture,
|
|
286
|
+
restore,
|
|
287
|
+
list,
|
|
288
|
+
delete: del,
|
|
289
|
+
wipe,
|
|
290
|
+
prune
|
|
291
|
+
});
|
|
292
|
+
}));
|
|
293
|
+
//#endregion
|
|
294
|
+
export { SnapshotOrchestratorService, layerSnapshotOrchestrator };
|
|
295
|
+
|
|
296
|
+
//# sourceMappingURL=service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.mjs","names":[],"sources":["../../../src/orchestrators/snapshot/service.ts"],"sourcesContent":["// Snapshot orchestrator service.\n//\n// Architecture § L3 § Snapshot orchestrator:\n// \"Collects all `Snapshotable` decls, applies one capture-wide\n// pause window for managed containers, tars host subtrees with mode\n// round-trip, commits container writable layers, threads a typed metadata record\n// (identity guard + per-participant slice), atomic stage-and-swap\n// for restore, identity-guard fires before any destructive mutation.\"\n//\n// This file is the orchestrator's typed entry point — `capture`,\n// `restore`, `list`, `delete`, `wipe`, `prune` — wired to the\n// cross-process safety primitives (`snapshot.reservation`,\n// `stack.lock`) and the substrate path resolver.\n//\n// The service surface is name-blind. The two participant lists\n// (capture and restore) are populated by the substrate at boot from\n// the `Snapshotable` decls of registered plugins; service-specific\n// behavior never reaches this file. Registration is scope-bound: the\n// supervisor calls `registerParticipant(pluginKey, decl)` from inside\n// each plugin's scope so the registry entry is reaped on plugin\n// teardown.\n\nimport { randomUUID } from 'node:crypto';\n\nimport { Context, Effect, FileSystem, Layer, Ref, Schema, Scope } from 'effect';\n\nimport type { LivenessClassifierDecl } from '../../contracts/liveness-classifier.ts';\nimport type { SnapshotableDecl } from '../../contracts/snapshotable.ts';\nimport type { ContainerRuntime } from '../../contracts/container-runtime.ts';\nimport { ContainerRuntimeService } from '../../runtime/docker/index.ts';\nimport { ownHolder } from '../../substrate/runtime/cross-process/liveness.ts';\nimport {\n\tacquireReservation,\n\ttype SnapshotReservationError,\n} from '../../substrate/runtime/cross-process/snapshot-reservation.ts';\nimport {\n\tacquireStackLock,\n\ttype StackLockError,\n} from '../../substrate/runtime/cross-process/stack-lock.ts';\nimport { IdentityContext, StackPathsService } from '../../substrate/runtime/paths.ts';\nimport {\n\trunCapture,\n\ttype CapturePhaseError,\n\ttype SnapshotParticipant,\n\ttype SnapshotProgressReporter,\n} from './capture.ts';\nimport {\n\tSnapshotLayout,\n\tSnapshotMetadataSchema,\n\tSNAPSHOT_ID_RULE,\n\tparseSnapshotId,\n\ttype SnapshotId,\n\ttype SnapshotCatalogEntry,\n\ttype SnapshotMetadata,\n} from './descriptor.ts';\nimport {\n\ttype IdentityContributionConflictError,\n\ttype IdentityGuardError,\n} from './identity-guard.ts';\nimport {\n\trunPrune,\n\ttype ClassifierDispatch,\n\ttype PruneResult,\n\ttype PrunePhaseError,\n} from './prune.ts';\nimport { runRestore, type RestoreParticipant, type RestorePhaseError } from './restore.ts';\nimport {\n\tstageAndSwap,\n\ttype StageAndSwapError,\n} from '../../substrate/runtime/stage-and-swap/index.ts';\nimport { runWipe, type WipePhaseError } from './wipe.ts';\n\n// -----------------------------------------------------------------------------\n// The service shape\n// -----------------------------------------------------------------------------\n\n/** Tagged union of every error the orchestrator surface can surface.\n * Callers `catchTags` on the precise tags they care about. */\nexport type SnapshotOrchestratorError =\n\t| CapturePhaseError\n\t| RestorePhaseError\n\t| WipePhaseError\n\t| PrunePhaseError\n\t| IdentityGuardError\n\t| IdentityContributionConflictError\n\t| StageAndSwapError\n\t| SnapshotReservationError\n\t| StackLockError\n\t| SnapshotIdError;\n\n/** Tagged failure when the substrate's startTime probe could not be\n * reduced to a number. */\nexport class SnapshotBootError extends Schema.TaggedErrorClass<SnapshotBootError>()(\n\t'SnapshotBootError',\n\t{\n\t\tdetail: Schema.String,\n\t},\n) {}\n\nexport class SnapshotIdError extends Schema.TaggedErrorClass<SnapshotIdError>()('SnapshotIdError', {\n\toperation: Schema.Literals(['capture', 'restore', 'delete']),\n\tfield: Schema.Literals(['id', 'name']),\n\tvalue: Schema.String,\n\tdetail: Schema.String,\n}) {}\n\nexport interface SnapshotOrchestrator {\n\t/** Register a `SnapshotableDecl` from a plugin. Scope-bound — when\n\t * the caller's scope (the plugin's acquire scope) closes, the\n\t * registration is reaped. The supervisor calls this once per\n\t * `SnapshotableDecl` on each plugin's `capabilities` tuple.\n\t *\n\t * `captureIdentity` / `captureContribution` are separately wired\n\t * hooks (not on `SnapshotableDecl` itself) — they plumb through\n\t * the plugin's resolved value. Identity is validated by the\n\t * orchestrator; contribution payloads are persisted as opaque JSON\n\t * that plugins must validate at their own boundary if they read it. */\n\treadonly registerParticipant: (\n\t\tpluginKey: string,\n\t\tdecl: SnapshotableDecl,\n\t\thooks?: {\n\t\t\treadonly captureIdentity?: Effect.Effect<Readonly<Record<string, string>>>;\n\t\t\treadonly captureContribution?: Effect.Effect<unknown>;\n\t\t\treadonly liveIdentity?: Effect.Effect<Readonly<Record<string, string>>>;\n\t\t},\n\t) => Effect.Effect<void, never, Scope.Scope>;\n\n\t/** Register a plugin-emitted `LivenessClassifier`. The decl is\n\t * consumed by `prune()`. Scope-bound. */\n\treadonly registerClassifier: (\n\t\tpluginKey: string,\n\t\tdecl: LivenessClassifierDecl,\n\t) => Effect.Effect<void, never, Scope.Scope>;\n\n\t/** Capture a new snapshot. The id MAY be caller-supplied; if\n\t * omitted, the substrate mints a random suffix to sidestep the\n\t * concurrent-saves-against-same-id silent overwrite.\n\t *\n\t * `participants` overrides the registered set — primarily for\n\t * tests. Production callers omit it; the orchestrator reads the\n\t * registered list. */\n\treadonly capture: (args: {\n\t\treadonly id?: string;\n\t\treadonly label?: string;\n\t\treadonly participants?: ReadonlyArray<SnapshotParticipant>;\n\t\treadonly onProgress?: SnapshotProgressReporter;\n\t}) => Effect.Effect<SnapshotMetadata, SnapshotOrchestratorError, FileSystem.FileSystem>;\n\n\t/** Restore from a previously-captured artifact id. Refuses on\n\t * identity mismatch BEFORE any destructive mutation. */\n\treadonly restore: (args: {\n\t\treadonly id: string;\n\t\treadonly participants?: ReadonlyArray<RestoreParticipant>;\n\t}) => Effect.Effect<SnapshotMetadata, SnapshotOrchestratorError, FileSystem.FileSystem>;\n\n\t/** Catalog list — tolerates partial / corrupt entries (they appear\n\t * with `metadata: null`). */\n\treadonly list: Effect.Effect<\n\t\tReadonlyArray<SnapshotCatalogEntry>,\n\t\tSnapshotOrchestratorError,\n\t\tFileSystem.FileSystem\n\t>;\n\n\t/** Delete one artifact by id. Idempotent — missing id is a no-op. */\n\treadonly delete: (\n\t\tid: string,\n\t) => Effect.Effect<void, SnapshotOrchestratorError, FileSystem.FileSystem>;\n\n\t/** Wipe the live (`app`, `stack`) footprint; preserves the\n\t * snapshot catalog by default. Stack-local artifact cache is\n\t * removed unless `keepCache` is explicitly true. */\n\treadonly wipe: (args: {\n\t\treadonly keepSnapshots?: boolean;\n\t\treadonly keepCache?: boolean;\n\t}) => Effect.Effect<void, SnapshotOrchestratorError, FileSystem.FileSystem>;\n\n\t/** Prune the snapshot catalog + byproduct images via plugin-\n\t * contributed classifiers. `classifiers` overrides the registered\n\t * set; omit to consume registered classifiers. */\n\treadonly prune: (args: {\n\t\treadonly classifiers?: ReadonlyArray<ClassifierDispatch>;\n\t}) => Effect.Effect<PruneResult, SnapshotOrchestratorError, FileSystem.FileSystem>;\n}\n\nexport class SnapshotOrchestratorService extends Context.Service<\n\tSnapshotOrchestratorService,\n\tSnapshotOrchestrator\n>()('@devstack-rewrite/orchestrators/Snapshot') {}\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\n/** Mint a snapshot id when the caller didn't pass one. Carries an\n * 8-hex random suffix from `crypto.randomUUID()` (STYLE_GUIDE §17) so\n * concurrent saves don't silently overwrite. */\nconst mintId = (prefix = 'snap'): string =>\n\t`${prefix}-${Date.now()}-${randomUUID().replace(/-/g, '').slice(0, 8)}`;\n\nconst mintSnapshotId = (): SnapshotId => {\n\tconst id = parseSnapshotId(mintId());\n\tif (id === null) {\n\t\tthrow new Error('internal snapshot id minting produced an invalid id');\n\t}\n\treturn id;\n};\n\nconst mintSnapshotName = (): string => {\n\tconst stamp = new Date().toISOString().replaceAll('-', '').replaceAll(':', '').slice(0, 15);\n\treturn `manual-${stamp}-${randomUUID().replace(/-/g, '').slice(0, 4)}`;\n};\n\nconst validateSnapshotId = (\n\toperation: SnapshotIdError['operation'],\n\tvalue: string,\n): Effect.Effect<SnapshotId, SnapshotIdError> => {\n\tconst id = parseSnapshotId(value);\n\treturn id === null\n\t\t? Effect.fail(\n\t\t\t\tnew SnapshotIdError({\n\t\t\t\t\toperation,\n\t\t\t\t\tfield: 'id',\n\t\t\t\t\tvalue,\n\t\t\t\t\tdetail: SNAPSHOT_ID_RULE,\n\t\t\t\t}),\n\t\t\t)\n\t\t: Effect.succeed(id);\n};\n\nconst normalizeSnapshotName = (\n\toperation: SnapshotIdError['operation'],\n\tname: string | undefined,\n): Effect.Effect<string, SnapshotIdError> => {\n\tif (name === undefined) return Effect.succeed(mintSnapshotName());\n\tconst normalized = name.trim();\n\tif (normalized.length === 0 || normalized.includes('\\0') || normalized.length > 128) {\n\t\treturn Effect.fail(\n\t\t\tnew SnapshotIdError({\n\t\t\t\toperation,\n\t\t\t\tfield: 'name',\n\t\t\t\tvalue: name,\n\t\t\t\tdetail:\n\t\t\t\t\t'snapshot names must be 1-128 characters after trimming and cannot contain NUL bytes',\n\t\t\t}),\n\t\t);\n\t}\n\treturn Effect.succeed(normalized);\n};\n\n/** Read this process's canonical startTime stamp for the snapshot\n * reservation liveness check. */\nconst ownStartTime = (): number => ownHolder('snapshot').startTime;\n\nconst normalizeIdentityValue = (value: unknown): unknown => {\n\tif (Array.isArray(value)) return value.map(normalizeIdentityValue);\n\tif (value !== null && typeof value === 'object') {\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value)\n\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t.map(([key, nested]) => [key, normalizeIdentityValue(nested)]),\n\t\t);\n\t}\n\treturn value;\n};\n\nconst stableIdentityString = (value: unknown): string => {\n\tconst encoded = JSON.stringify(normalizeIdentityValue(value));\n\treturn encoded ?? String(value);\n};\n\nconst identityHookFromDecl = (\n\tpluginKey: string,\n\tdecl: SnapshotableDecl,\n): Effect.Effect<Readonly<Record<string, string>>> =>\n\tdecl.preRestore === undefined\n\t\t? Effect.succeed({})\n\t\t: decl.preRestore.pipe(Effect.map((value) => ({ [pluginKey]: stableIdentityString(value) })));\n\n// -----------------------------------------------------------------------------\n// Layer\n// -----------------------------------------------------------------------------\n\n/**\n * Wire the orchestrator from the substrate's path resolver + the\n * runtime container adapter.\n *\n * Discipline:\n * - Capture/restore acquire `snapshot.reservation` (O_EXCL,\n * no retry) — concurrent capture is structurally refused.\n * - List/delete/wipe acquire `stack.lock` briefly (no reservation\n * needed; they don't pause containers).\n * - Prune acquires both — it walks the catalog AND sweeps images.\n */\n/** Per-plugin participant registration entry kept on the orchestrator's\n * inner ref. Sequence number lets parallel registrations under the\n * same key be reaped independently when their owning scopes close. */\ninterface RegisteredParticipantEntry {\n\treadonly pluginKey: string;\n\treadonly capture: SnapshotParticipant;\n\treadonly restore: RestoreParticipant;\n\treadonly seq: number;\n}\n\ninterface RegisteredClassifierEntry {\n\treadonly dispatch: ClassifierDispatch;\n\treadonly seq: number;\n}\n\nexport const layerSnapshotOrchestrator: Layer.Layer<\n\tSnapshotOrchestratorService,\n\tnever,\n\tStackPathsService | IdentityContext | ContainerRuntimeService\n> = Layer.effect(\n\tSnapshotOrchestratorService,\n\tEffect.gen(function* () {\n\t\tconst paths = yield* StackPathsService;\n\t\tconst identity = yield* IdentityContext;\n\t\tconst runtime: ContainerRuntime = yield* ContainerRuntimeService;\n\n\t\t// Scope-local participant + classifier registries. The supervisor\n\t\t// adds entries from each plugin's acquire scope; finalizers\n\t\t// remove them on scope close. Sequence number protects against\n\t\t// the parallel-registration-same-key race when two stack\n\t\t// instances register concurrently.\n\t\tconst participantsRef = yield* Ref.make<ReadonlyArray<RegisteredParticipantEntry>>([]);\n\t\tconst classifiersRef = yield* Ref.make<ReadonlyArray<RegisteredClassifierEntry>>([]);\n\t\tconst seqRef = yield* Ref.make(0);\n\n\t\tconst registerParticipant: SnapshotOrchestrator['registerParticipant'] = (\n\t\t\tpluginKey,\n\t\t\tdecl,\n\t\t\thooks,\n\t\t) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst seq = yield* Ref.updateAndGet(seqRef, (n) => n + 1);\n\t\t\t\tconst declIdentity = identityHookFromDecl(pluginKey, decl);\n\t\t\t\tconst capture: SnapshotParticipant = {\n\t\t\t\t\tplugin: pluginKey,\n\t\t\t\t\tdecl,\n\t\t\t\t\tcaptureIdentity: hooks?.captureIdentity ?? declIdentity,\n\t\t\t\t\tcaptureContribution: hooks?.captureContribution ?? Effect.succeed<unknown>(undefined),\n\t\t\t\t};\n\t\t\t\tconst restore: RestoreParticipant = {\n\t\t\t\t\tplugin: pluginKey,\n\t\t\t\t\tliveIdentity: hooks?.liveIdentity ?? declIdentity,\n\t\t\t\t\tpostRestore: decl.postRestore as Effect.Effect<void> | undefined,\n\t\t\t\t};\n\t\t\t\tconst entry: RegisteredParticipantEntry = { pluginKey, capture, restore, seq };\n\t\t\t\tyield* Ref.update(participantsRef, (xs) => [...xs, entry]);\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tRef.update(participantsRef, (xs) => xs.filter((e) => e.seq !== seq)),\n\t\t\t\t);\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t'snapshot.participant.plugin': pluginKey,\n\t\t\t\t\t'snapshot.participant.subtrees': decl.subtrees.length,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('orchestrator.snapshot.registerParticipant')) as Effect.Effect<\n\t\t\t\tvoid,\n\t\t\t\tnever,\n\t\t\t\tScope.Scope\n\t\t\t>;\n\n\t\tconst registerClassifier: SnapshotOrchestrator['registerClassifier'] = (pluginKey, decl) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst seq = yield* Ref.updateAndGet(seqRef, (n) => n + 1);\n\t\t\t\tconst dispatch: ClassifierDispatch = { plugin: pluginKey, decl };\n\t\t\t\tconst entry: RegisteredClassifierEntry = { dispatch, seq };\n\t\t\t\tyield* Ref.update(classifiersRef, (xs) => [...xs, entry]);\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tRef.update(classifiersRef, (xs) => xs.filter((e) => e.seq !== seq)),\n\t\t\t\t);\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t'snapshot.classifier.plugin': pluginKey,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('orchestrator.snapshot.registerClassifier')) as Effect.Effect<\n\t\t\t\tvoid,\n\t\t\t\tnever,\n\t\t\t\tScope.Scope\n\t\t\t>;\n\n\t\tconst capture: SnapshotOrchestrator['capture'] = ({ id, label, participants, onProgress }) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst snapshotId =\n\t\t\t\t\tid === undefined ? mintSnapshotId() : yield* validateSnapshotId('capture', id);\n\t\t\t\tconst snapshotName = yield* normalizeSnapshotName('capture', label);\n\t\t\t\tconst effectiveParticipants =\n\t\t\t\t\tparticipants ?? (yield* Ref.get(participantsRef)).map((e) => e.capture);\n\t\t\t\tconst artifactDir = `${paths.snapshotDir}/${snapshotId}`;\n\t\t\t\tconst stagingDir = `${paths.snapshotDir}/.staging.${snapshotId}`;\n\t\t\t\tconst backupDir = `${paths.snapshotDir}/.bak.${snapshotId}`;\n\n\t\t\t\t// Acquire `snapshot.reservation` (O_EXCL, no retry) for the\n\t\t\t\t// duration of the capture. The stack.lock is acquired\n\t\t\t\t// briefly inside `stageAndSwap` for the rename publish.\n\t\t\t\treturn yield* Effect.scoped(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* acquireReservation(paths.snapshotReservationFile, ownStartTime());\n\t\t\t\t\t\tconst fs = yield* FileSystem.FileSystem;\n\t\t\t\t\t\tconst targetExists = yield* fs\n\t\t\t\t\t\t\t.exists(artifactDir)\n\t\t\t\t\t\t\t.pipe(Effect.catch(() => Effect.succeed(false)));\n\t\t\t\t\t\tif (targetExists) {\n\t\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\t\tnew SnapshotIdError({\n\t\t\t\t\t\t\t\t\toperation: 'capture',\n\t\t\t\t\t\t\t\t\tfield: 'id',\n\t\t\t\t\t\t\t\t\tvalue: snapshotId,\n\t\t\t\t\t\t\t\t\tdetail: 'snapshot id already exists',\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst existing = yield* list;\n\t\t\t\t\t\tif (existing.some((entry) => entry.metadata?.label === snapshotName)) {\n\t\t\t\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\t\t\t\tnew SnapshotIdError({\n\t\t\t\t\t\t\t\t\toperation: 'capture',\n\t\t\t\t\t\t\t\t\tfield: 'name',\n\t\t\t\t\t\t\t\t\tvalue: snapshotName,\n\t\t\t\t\t\t\t\t\tdetail: 'snapshot name already exists',\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Stage-and-swap publishes the artifact directory\n\t\t\t\t\t\t// atomically — external watchers (and `list`)\n\t\t\t\t\t\t// never observe a half-written tree.\n\t\t\t\t\t\tconst meta = yield* stageAndSwap({\n\t\t\t\t\t\t\ttargetPath: artifactDir,\n\t\t\t\t\t\t\tstagingPath: stagingDir,\n\t\t\t\t\t\t\tbackupPath: backupDir,\n\t\t\t\t\t\t\tbuild: runCapture({\n\t\t\t\t\t\t\t\tstagingDir,\n\t\t\t\t\t\t\t\tsnapshotId,\n\t\t\t\t\t\t\t\tlabel: snapshotName,\n\t\t\t\t\t\t\t\tapp: identity.app,\n\t\t\t\t\t\t\t\tstack: identity.stack,\n\t\t\t\t\t\t\t\tnetwork: identity.chain,\n\t\t\t\t\t\t\t\truntimeStackRoot: paths.stackRoot,\n\t\t\t\t\t\t\t\tstateFilePath: paths.stateFile,\n\t\t\t\t\t\t\t\tparticipants: effectiveParticipants,\n\t\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\t\tonProgress,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn meta;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}).pipe(Effect.withSpan('orchestrator.snapshot.capture.entry'));\n\n\t\tconst restore: SnapshotOrchestrator['restore'] = ({ id, participants }) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst snapshotId = yield* validateSnapshotId('restore', id);\n\t\t\t\tconst artifactDir = `${paths.snapshotDir}/${snapshotId}`;\n\t\t\t\tconst effectiveParticipants =\n\t\t\t\t\tparticipants ?? (yield* Ref.get(participantsRef)).map((e) => e.restore);\n\t\t\t\treturn yield* Effect.scoped(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* acquireReservation(paths.snapshotReservationFile, ownStartTime());\n\t\t\t\t\t\treturn yield* runRestore({\n\t\t\t\t\t\t\tsnapshotId,\n\t\t\t\t\t\t\tartifactDir,\n\t\t\t\t\t\t\truntimeStackRoot: paths.stackRoot,\n\t\t\t\t\t\t\truntimeStagingPath: `${paths.stackRoot}.staging.${snapshotId}`,\n\t\t\t\t\t\t\truntimeBackupPath: `${paths.stackRoot}.bak.${snapshotId}`,\n\t\t\t\t\t\t\tparticipants: effectiveParticipants,\n\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\truntimeIdentity: {\n\t\t\t\t\t\t\t\tapp: identity.app,\n\t\t\t\t\t\t\t\tstack: identity.stack,\n\t\t\t\t\t\t\t\tnetwork: identity.chain,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}).pipe(Effect.withSpan('orchestrator.snapshot.restore.entry'));\n\n\t\tconst list: SnapshotOrchestrator['list'] = Effect.gen(function* () {\n\t\t\tconst fs = yield* FileSystem.FileSystem;\n\t\t\tconst exists = yield* fs\n\t\t\t\t.exists(paths.snapshotDir)\n\t\t\t\t.pipe(Effect.catch(() => Effect.succeed(false)));\n\t\t\tif (!exists) return [];\n\t\t\tconst ids = yield* fs\n\t\t\t\t.readDirectory(paths.snapshotDir)\n\t\t\t\t.pipe(Effect.catch(() => Effect.succeed([] as ReadonlyArray<string>)));\n\t\t\tconst entries: SnapshotCatalogEntry[] = [];\n\t\t\tfor (const id of ids) {\n\t\t\t\t// Skip transient staging/backup directories — they're\n\t\t\t\t// invisible to the catalog by construction (the\n\t\t\t\t// `.staging.<id>` / `.bak.<id>` naming).\n\t\t\t\tif (id.startsWith('.staging.') || id.startsWith('.bak.')) continue;\n\t\t\t\tconst parsedId = parseSnapshotId(id);\n\t\t\t\tif (parsedId === null) {\n\t\t\t\t\tyield* Effect.logWarning(`ignoring unsafe snapshot catalog entry: ${id}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst dir = `${paths.snapshotDir}/${id}`;\n\t\t\t\tconst metaPath = `${dir}/${SnapshotLayout.metaFile}`;\n\t\t\t\tconst metaExists = yield* fs\n\t\t\t\t\t.exists(metaPath)\n\t\t\t\t\t.pipe(Effect.catch(() => Effect.succeed(false)));\n\t\t\t\tif (!metaExists) {\n\t\t\t\t\tentries.push({ id, directory: dir, metadata: null });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst text = yield* fs\n\t\t\t\t\t.readFileString(metaPath)\n\t\t\t\t\t.pipe(Effect.catch(() => Effect.succeed('')));\n\t\t\t\tif (text === '') {\n\t\t\t\t\tentries.push({ id, directory: dir, metadata: null });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst raw = yield* Effect.try({\n\t\t\t\t\ttry: () => JSON.parse(text) as unknown,\n\t\t\t\t\tcatch: () => null,\n\t\t\t\t}).pipe(Effect.catch(() => Effect.succeed(null)));\n\t\t\t\tif (raw === null) {\n\t\t\t\t\tentries.push({ id, directory: dir, metadata: null });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst decoded = yield* Schema.decodeUnknownEffect(SnapshotMetadataSchema)(raw).pipe(\n\t\t\t\t\tEffect.catch(() => Effect.succeed(null)),\n\t\t\t\t);\n\t\t\t\tif (decoded !== null && parseSnapshotId(decoded.id) === null) {\n\t\t\t\t\tyield* Effect.logWarning(`ignoring snapshot metadata with unsafe id: ${decoded.id}`);\n\t\t\t\t\tentries.push({ id, directory: dir, metadata: null });\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tentries.push({ id: parsedId, directory: dir, metadata: decoded });\n\t\t\t}\n\t\t\treturn entries;\n\t\t}).pipe(Effect.withSpan('orchestrator.snapshot.list'));\n\n\t\tconst del: SnapshotOrchestrator['delete'] = (id) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst snapshotId = yield* validateSnapshotId('delete', id);\n\t\t\t\tconst fs = yield* FileSystem.FileSystem;\n\t\t\t\tconst dir = `${paths.snapshotDir}/${snapshotId}`;\n\t\t\t\tyield* Effect.scoped(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* acquireStackLock(paths.stackLockFile);\n\t\t\t\t\t\tyield* fs.remove(dir, { recursive: true, force: true }).pipe(Effect.ignore);\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}).pipe(Effect.withSpan('orchestrator.snapshot.delete'));\n\n\t\tconst wipe: SnapshotOrchestrator['wipe'] = (args) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tyield* Effect.scoped(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* acquireStackLock(paths.stackLockFile);\n\t\t\t\t\t\tyield* runWipe({\n\t\t\t\t\t\t\tlabelMatch: { app: identity.app, stack: identity.stack },\n\t\t\t\t\t\t\tstackRoot: paths.stackRoot,\n\t\t\t\t\t\t\tstateFilePath: paths.stateFile,\n\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t\tkeepSnapshots: args.keepSnapshots,\n\t\t\t\t\t\t\tkeepCache: args.keepCache,\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}).pipe(Effect.withSpan('orchestrator.snapshot.wipe.entry'));\n\n\t\tconst prune: SnapshotOrchestrator['prune'] = ({ classifiers }) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst effectiveClassifiers =\n\t\t\t\t\tclassifiers ?? (yield* Ref.get(classifiersRef)).map((e) => e.dispatch);\n\t\t\t\treturn yield* Effect.scoped(\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* acquireReservation(paths.snapshotReservationFile, ownStartTime());\n\t\t\t\t\t\treturn yield* runPrune({\n\t\t\t\t\t\t\tstackRoot: paths.stackRoot,\n\t\t\t\t\t\t\timageLabelFilter: { app: identity.app, stack: identity.stack },\n\t\t\t\t\t\t\tclassifiers: effectiveClassifiers,\n\t\t\t\t\t\t\truntime,\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}).pipe(Effect.withSpan('orchestrator.snapshot.prune.entry'));\n\n\t\treturn SnapshotOrchestratorService.of({\n\t\t\tregisterParticipant,\n\t\t\tregisterClassifier,\n\t\t\tcapture,\n\t\t\trestore,\n\t\t\tlist,\n\t\t\tdelete: del,\n\t\t\twipe,\n\t\t\tprune,\n\t\t});\n\t}),\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { StateDocument } from "../../substrate/runtime/state-store/schema.mjs";
|
|
2
|
+
import { Effect, FileSystem, Schema } from "effect";
|
|
3
|
+
//#region src/orchestrators/snapshot/state-document.ts
|
|
4
|
+
const readSnapshotStateDocument = (path) => Effect.gen(function* () {
|
|
5
|
+
const text = yield* (yield* FileSystem.FileSystem).readFileString(path).pipe(Effect.catch((cause) => Effect.fail(new Error(`read ${path} failed`, { cause }))));
|
|
6
|
+
const raw = yield* Effect.try({
|
|
7
|
+
try: () => JSON.parse(text),
|
|
8
|
+
catch: (cause) => new Error(`${path} is not valid JSON`, { cause })
|
|
9
|
+
});
|
|
10
|
+
return yield* Schema.decodeUnknownEffect(StateDocument)(raw).pipe(Effect.catch((cause) => Effect.fail(new Error(`${path} failed StateDocument schema decode`, { cause }))));
|
|
11
|
+
});
|
|
12
|
+
const writeSnapshotStateDocument = (path, doc) => Effect.gen(function* () {
|
|
13
|
+
yield* (yield* FileSystem.FileSystem).writeFileString(path, `${JSON.stringify(doc, null, 2)}\n`).pipe(Effect.catch((cause) => Effect.fail(new Error(`write ${path} failed`, { cause }))));
|
|
14
|
+
});
|
|
15
|
+
//#endregion
|
|
16
|
+
export { readSnapshotStateDocument, writeSnapshotStateDocument };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=state-document.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-document.mjs","names":["StateDocumentSchema"],"sources":["../../../src/orchestrators/snapshot/state-document.ts"],"sourcesContent":["import { Effect, FileSystem, Schema } from 'effect';\n\nimport {\n\tStateDocument as StateDocumentSchema,\n\ttype StateDocument,\n} from '../../substrate/runtime/state-store/index.ts';\n\nexport const readSnapshotStateDocument = (\n\tpath: string,\n): Effect.Effect<StateDocument, Error, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tconst text = yield* fs\n\t\t\t.readFileString(path)\n\t\t\t.pipe(Effect.catch((cause) => Effect.fail(new Error(`read ${path} failed`, { cause }))));\n\t\tconst raw = yield* Effect.try({\n\t\t\ttry: () => JSON.parse(text) as unknown,\n\t\t\tcatch: (cause) => new Error(`${path} is not valid JSON`, { cause }),\n\t\t});\n\t\treturn yield* Schema.decodeUnknownEffect(StateDocumentSchema)(raw).pipe(\n\t\t\tEffect.catch((cause) =>\n\t\t\t\tEffect.fail(new Error(`${path} failed StateDocument schema decode`, { cause })),\n\t\t\t),\n\t\t);\n\t});\n\nexport const writeSnapshotStateDocument = (\n\tpath: string,\n\tdoc: StateDocument,\n): Effect.Effect<void, Error, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tyield* fs\n\t\t\t.writeFileString(path, `${JSON.stringify(doc, null, 2)}\\n`)\n\t\t\t.pipe(Effect.catch((cause) => Effect.fail(new Error(`write ${path} failed`, { cause }))));\n\t});\n"],"mappings":";;;AAOA,MAAa,6BACZ,SAEA,OAAO,IAAI,aAAa;CAEvB,MAAM,OAAO,QAAO,OADF,WAAW,YAE3B,eAAe,KAAK,CACpB,KAAK,OAAO,OAAO,UAAU,OAAO,KAAK,IAAI,MAAM,QAAQ,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACzF,MAAM,MAAM,OAAO,OAAO,IAAI;EAC7B,WAAW,KAAK,MAAM,KAAK;EAC3B,QAAQ,UAAU,IAAI,MAAM,GAAG,KAAK,qBAAqB,EAAE,OAAO,CAAC;EACnE,CAAC;AACF,QAAO,OAAO,OAAO,oBAAoBA,cAAoB,CAAC,IAAI,CAAC,KAClE,OAAO,OAAO,UACb,OAAO,KAAK,IAAI,MAAM,GAAG,KAAK,sCAAsC,EAAE,OAAO,CAAC,CAAC,CAC/E,CACD;EACA;AAEH,MAAa,8BACZ,MACA,QAEA,OAAO,IAAI,aAAa;AAEvB,SAAO,OADW,WAAW,YAE3B,gBAAgB,MAAM,GAAG,KAAK,UAAU,KAAK,MAAM,EAAE,CAAC,IAAI,CAC1D,KAAK,OAAO,OAAO,UAAU,OAAO,KAAK,IAAI,MAAM,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;EACzF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { Effect, FileSystem, Schema } from "effect";
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Effect, FileSystem, Schema } from "effect";
|
|
2
|
+
//#region src/orchestrators/snapshot/wipe.ts
|
|
3
|
+
var WipePhaseError = class extends Schema.TaggedErrorClass()("SnapshotWipePhaseError", {
|
|
4
|
+
phase: Schema.Literals([
|
|
5
|
+
"sweep-containers",
|
|
6
|
+
"sweep-networks-volumes",
|
|
7
|
+
"remove-state",
|
|
8
|
+
"remove-runtime-tree"
|
|
9
|
+
]),
|
|
10
|
+
detail: Schema.String,
|
|
11
|
+
cause: Schema.optional(Schema.Defect)
|
|
12
|
+
}) {};
|
|
13
|
+
const failPhase = (phase, detail) => (cause) => Effect.fail(new WipePhaseError({
|
|
14
|
+
phase,
|
|
15
|
+
detail,
|
|
16
|
+
cause
|
|
17
|
+
}));
|
|
18
|
+
/**
|
|
19
|
+
* Tear down a stack's live footprint. Snapshots survive by default
|
|
20
|
+
* (architecture § wipe).
|
|
21
|
+
*
|
|
22
|
+
* Order:
|
|
23
|
+
* 1. Force-remove managed containers by `{ app, stack }` labels.
|
|
24
|
+
* 2. Remove managed networks and volumes by the same label filter.
|
|
25
|
+
* 3. Remove state.json.
|
|
26
|
+
* 4. Remove the runtime tree EXCEPT the snapshot catalog by default.
|
|
27
|
+
*/
|
|
28
|
+
const runWipe = (inputs) => Effect.gen(function* () {
|
|
29
|
+
const fs = yield* FileSystem.FileSystem;
|
|
30
|
+
yield* Effect.annotateCurrentSpan({
|
|
31
|
+
"devstack.snapshot.phase": "wipe",
|
|
32
|
+
"devstack.app": inputs.labelMatch.app,
|
|
33
|
+
"devstack.stack": inputs.labelMatch.stack
|
|
34
|
+
});
|
|
35
|
+
yield* inputs.runtime.removeManagedContainers(inputs.labelMatch).pipe(Effect.catch(failPhase("sweep-containers", `container sweep failed`)));
|
|
36
|
+
yield* inputs.runtime.removeManagedNetworks(inputs.labelMatch).pipe(Effect.catch(failPhase("sweep-networks-volumes", `network sweep failed`)));
|
|
37
|
+
yield* inputs.runtime.removeManagedVolumes(inputs.labelMatch).pipe(Effect.catch(failPhase("sweep-networks-volumes", `volume sweep failed`)));
|
|
38
|
+
yield* fs.remove(inputs.stateFilePath, { force: true }).pipe(Effect.catch(failPhase("remove-state", `remove state.json failed`)));
|
|
39
|
+
const children = yield* fs.readDirectory(inputs.stackRoot).pipe(Effect.catch(() => Effect.succeed([])));
|
|
40
|
+
const keepSnapshots = inputs.keepSnapshots ?? true;
|
|
41
|
+
const keepCache = inputs.keepCache ?? false;
|
|
42
|
+
for (const name of children) {
|
|
43
|
+
if (keepSnapshots && name === "snapshots") continue;
|
|
44
|
+
if (keepCache && name === "cache") continue;
|
|
45
|
+
yield* fs.remove(`${inputs.stackRoot}/${name}`, {
|
|
46
|
+
recursive: true,
|
|
47
|
+
force: true
|
|
48
|
+
}).pipe(Effect.catch(failPhase("remove-runtime-tree", `remove ${name} failed`)));
|
|
49
|
+
}
|
|
50
|
+
}).pipe(Effect.withSpan("orchestrator.snapshot.wipe"));
|
|
51
|
+
/** Centralized constant — the canonical snapshot-catalog directory
|
|
52
|
+
* name. Used by both `runWipe` (to preserve) and the substrate's
|
|
53
|
+
* path resolver (to compose `snapshotDir`). Distilled §17 calls out
|
|
54
|
+
* the "centralize the snapshots-dir-name constant" opportunity. */
|
|
55
|
+
const SNAPSHOTS_DIR_NAME = "snapshots";
|
|
56
|
+
//#endregion
|
|
57
|
+
export { SNAPSHOTS_DIR_NAME, runWipe };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=wipe.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wipe.mjs","names":[],"sources":["../../../src/orchestrators/snapshot/wipe.ts"],"sourcesContent":["// Wipe — label-scoped teardown.\n//\n// Architecture § Snapshot responsibilities:\n// \"Provide a wipe operation scoped to one `(app, stack)` that tears\n// down containers, networks, volumes, and per-stack on-disk state,\n// with snapshots surviving by default.\"\n//\n// Label-scoped: enumeration uses partial `ContainerLabelTuple` filters\n// (just `{ app, stack }`); the orchestrator does NOT reach for plugin\n// names. The runtime adapter sweeps containers/networks/volumes\n// matching the label set.\n\nimport { Effect, FileSystem, Schema } from 'effect';\n\nimport type { ContainerLabelTuple } from '../../contracts/snapshotable.ts';\nimport type { ContainerRuntime } from '../../contracts/container-runtime.ts';\n\n// -----------------------------------------------------------------------------\n// Errors\n// -----------------------------------------------------------------------------\n\nexport class WipePhaseError extends Schema.TaggedErrorClass<WipePhaseError>()(\n\t'SnapshotWipePhaseError',\n\t{\n\t\tphase: Schema.Literals([\n\t\t\t'sweep-containers',\n\t\t\t'sweep-networks-volumes',\n\t\t\t'remove-state',\n\t\t\t'remove-runtime-tree',\n\t\t]),\n\t\tdetail: Schema.String,\n\t\tcause: Schema.optional(Schema.Defect),\n\t},\n) {}\n\nconst failPhase =\n\t(\n\t\tphase: WipePhaseError['phase'],\n\t\tdetail: string,\n\t): ((cause: unknown) => Effect.Effect<never, WipePhaseError>) =>\n\t(cause) =>\n\t\tEffect.fail(new WipePhaseError({ phase, detail, cause }));\n\n// -----------------------------------------------------------------------------\n// Inputs\n// -----------------------------------------------------------------------------\n\nexport interface WipeInputs {\n\treadonly labelMatch: Pick<ContainerLabelTuple, 'app' | 'stack'>;\n\treadonly stackRoot: string;\n\treadonly stateFilePath: string;\n\treadonly runtime: ContainerRuntime;\n\t/** Preserve the snapshot catalog (default behavior). When false,\n\t * the catalog is removed alongside the runtime tree. */\n\treadonly keepSnapshots?: boolean;\n\t/** Preserve stack-local artifact caches. Defaults to false; wipe\n\t * should force on-chain artifacts to re-prove against the next\n\t * chain instead of carrying local ids across a reset. */\n\treadonly keepCache?: boolean;\n}\n\n// -----------------------------------------------------------------------------\n// Wipe\n// -----------------------------------------------------------------------------\n\n/**\n * Tear down a stack's live footprint. Snapshots survive by default\n * (architecture § wipe).\n *\n * Order:\n * 1. Force-remove managed containers by `{ app, stack }` labels.\n * 2. Remove managed networks and volumes by the same label filter.\n * 3. Remove state.json.\n * 4. Remove the runtime tree EXCEPT the snapshot catalog by default.\n */\nexport const runWipe = (\n\tinputs: WipeInputs,\n): Effect.Effect<void, WipePhaseError, FileSystem.FileSystem> =>\n\tEffect.gen(function* () {\n\t\tconst fs = yield* FileSystem.FileSystem;\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'devstack.snapshot.phase': 'wipe',\n\t\t\t'devstack.app': inputs.labelMatch.app,\n\t\t\t'devstack.stack': inputs.labelMatch.stack,\n\t\t});\n\n\t\t// 1. Containers.\n\t\tyield* inputs.runtime\n\t\t\t.removeManagedContainers(inputs.labelMatch)\n\t\t\t.pipe(Effect.catch(failPhase('sweep-containers', `container sweep failed`)));\n\n\t\t// 2. Networks + volumes.\n\t\tyield* inputs.runtime\n\t\t\t.removeManagedNetworks(inputs.labelMatch)\n\t\t\t.pipe(Effect.catch(failPhase('sweep-networks-volumes', `network sweep failed`)));\n\t\tyield* inputs.runtime\n\t\t\t.removeManagedVolumes(inputs.labelMatch)\n\t\t\t.pipe(Effect.catch(failPhase('sweep-networks-volumes', `volume sweep failed`)));\n\n\t\t// 3. Remove state.json.\n\t\tyield* fs\n\t\t\t.remove(inputs.stateFilePath, { force: true })\n\t\t\t.pipe(Effect.catch(failPhase('remove-state', `remove state.json failed`)));\n\n\t\t// 4. Remove the runtime tree — but PRESERVE snapshots by default.\n\t\t// Strategy: enumerate the stack root and remove each child\n\t\t// whose name is not `snapshots/` (when preserved). Stack-local\n\t\t// artifact caches are state and are removed unless explicitly\n\t\t// requested otherwise.\n\t\tconst children = yield* fs\n\t\t\t.readDirectory(inputs.stackRoot)\n\t\t\t.pipe(Effect.catch(() => Effect.succeed([] as ReadonlyArray<string>)));\n\t\tconst keepSnapshots = inputs.keepSnapshots ?? true;\n\t\tconst keepCache = inputs.keepCache ?? false;\n\t\tfor (const name of children) {\n\t\t\tif (keepSnapshots && name === 'snapshots') continue;\n\t\t\tif (keepCache && name === 'cache') continue;\n\t\t\tyield* fs\n\t\t\t\t.remove(`${inputs.stackRoot}/${name}`, { recursive: true, force: true })\n\t\t\t\t.pipe(Effect.catch(failPhase('remove-runtime-tree', `remove ${name} failed`)));\n\t\t}\n\t}).pipe(Effect.withSpan('orchestrator.snapshot.wipe'));\n\n/** Centralized constant — the canonical snapshot-catalog directory\n * name. Used by both `runWipe` (to preserve) and the substrate's\n * path resolver (to compose `snapshotDir`). Distilled §17 calls out\n * the \"centralize the snapshots-dir-name constant\" opportunity. */\nexport const SNAPSHOTS_DIR_NAME = 'snapshots';\n"],"mappings":";;AAqBA,IAAa,iBAAb,cAAoC,OAAO,kBAAkC,CAC5E,0BACA;CACC,OAAO,OAAO,SAAS;EACtB;EACA;EACA;EACA;EACA,CAAC;CACF,QAAQ,OAAO;CACf,OAAO,OAAO,SAAS,OAAO,OAAO;CACrC,CACD,CAAC;AAEF,MAAM,aAEJ,OACA,YAEA,UACA,OAAO,KAAK,IAAI,eAAe;CAAE;CAAO;CAAQ;CAAO,CAAC,CAAC;;;;;;;;;;;AAkC3D,MAAa,WACZ,WAEA,OAAO,IAAI,aAAa;CACvB,MAAM,KAAK,OAAO,WAAW;AAC7B,QAAO,OAAO,oBAAoB;EACjC,2BAA2B;EAC3B,gBAAgB,OAAO,WAAW;EAClC,kBAAkB,OAAO,WAAW;EACpC,CAAC;AAGF,QAAO,OAAO,QACZ,wBAAwB,OAAO,WAAW,CAC1C,KAAK,OAAO,MAAM,UAAU,oBAAoB,yBAAyB,CAAC,CAAC;AAG7E,QAAO,OAAO,QACZ,sBAAsB,OAAO,WAAW,CACxC,KAAK,OAAO,MAAM,UAAU,0BAA0B,uBAAuB,CAAC,CAAC;AACjF,QAAO,OAAO,QACZ,qBAAqB,OAAO,WAAW,CACvC,KAAK,OAAO,MAAM,UAAU,0BAA0B,sBAAsB,CAAC,CAAC;AAGhF,QAAO,GACL,OAAO,OAAO,eAAe,EAAE,OAAO,MAAM,CAAC,CAC7C,KAAK,OAAO,MAAM,UAAU,gBAAgB,2BAA2B,CAAC,CAAC;CAO3E,MAAM,WAAW,OAAO,GACtB,cAAc,OAAO,UAAU,CAC/B,KAAK,OAAO,YAAY,OAAO,QAAQ,EAAE,CAA0B,CAAC,CAAC;CACvE,MAAM,gBAAgB,OAAO,iBAAiB;CAC9C,MAAM,YAAY,OAAO,aAAa;AACtC,MAAK,MAAM,QAAQ,UAAU;AAC5B,MAAI,iBAAiB,SAAS,YAAa;AAC3C,MAAI,aAAa,SAAS,QAAS;AACnC,SAAO,GACL,OAAO,GAAG,OAAO,UAAU,GAAG,QAAQ;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC,CACvE,KAAK,OAAO,MAAM,UAAU,uBAAuB,UAAU,KAAK,SAAS,CAAC,CAAC;;EAE/E,CAAC,KAAK,OAAO,SAAS,6BAA6B,CAAC;;;;;AAMvD,MAAa,qBAAqB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/plugins/account/codegen.d.ts
|
|
2
|
+
/** The typed shape the emitted file exports. Per-account record keyed
|
|
3
|
+
* by name. */
|
|
4
|
+
interface AccountBindings {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly address: string;
|
|
7
|
+
readonly scheme: 'ed25519' | 'secp256k1' | 'secp256r1';
|
|
8
|
+
readonly source: 'real' | 'impersonate';
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { AccountBindings };
|
|
12
|
+
//# sourceMappingURL=codegen.d.mts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
//#region src/plugins/account/codegen.ts
|
|
3
|
+
/** Construct the Codegenable contribution. One emit per account.
|
|
4
|
+
*
|
|
5
|
+
* The emitter name is `account/${name}` (literal) so multiple
|
|
6
|
+
* accounts in a single stack get co-located but typed-distinct
|
|
7
|
+
* emissions; the codegen orchestrator can fold them into a single
|
|
8
|
+
* `accounts` namespace at staging time. */
|
|
9
|
+
const makeAccountCodegen = (parts) => ({
|
|
10
|
+
kind: "codegenable",
|
|
11
|
+
emitterName: `account/${parts.name}`,
|
|
12
|
+
outputPath: `accounts/${parts.name}.ts`,
|
|
13
|
+
sensitive: false,
|
|
14
|
+
emit: (ctx) => Effect.sync(() => {
|
|
15
|
+
ctx.exportConst(parts.name, parts.resolved);
|
|
16
|
+
return ctx.done();
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
//#endregion
|
|
20
|
+
export { makeAccountCodegen };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=codegen.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegen.mjs","names":[],"sources":["../../../src/plugins/account/codegen.ts"],"sourcesContent":["// Account plugin — Codegenable contribution.\n//\n// Architecture §6 + 12-account.md \"Cross-component references\":\n// Codegen emits a constant address map keyed by account name so\n// downstream code can `import { accounts } from '<staged>/accounts'`\n// and read `accounts.alice.address` at the type level.\n//\n// Distilled-doc tension (12-account.md \"publicKey caveat\"):\n// impersonation accounts have a zero-buffer publicKey — emitting it\n// into the codegen bindings would be a type-level lie. The emitted\n// shape below carries the `source` discriminator INSTEAD of\n// publicKey; consumers branch on `source: 'impersonate'` rather than\n// publicKey-truthiness.\n//\n// SAFETY: the codegen output never emits secret material. Only the\n// `name`, `address`, `scheme`, and `source` fields land on disk.\n// `sensitive: false` is correct because none of these are secret.\n\nimport { Effect } from 'effect';\n\nimport type { CodegenableDecl } from '../../contracts/codegenable.ts';\n\n/** The typed shape the emitted file exports. Per-account record keyed\n * by name. */\nexport interface AccountBindings {\n\treadonly name: string;\n\treadonly address: string;\n\treadonly scheme: 'ed25519' | 'secp256k1' | 'secp256r1';\n\treadonly source: 'real' | 'impersonate';\n}\n\n/** Construct the Codegenable contribution. One emit per account.\n *\n * The emitter name is `account/${name}` (literal) so multiple\n * accounts in a single stack get co-located but typed-distinct\n * emissions; the codegen orchestrator can fold them into a single\n * `accounts` namespace at staging time. */\nexport const makeAccountCodegen = <Name extends string>(parts: {\n\treadonly name: Name;\n\treadonly resolved: AccountBindings;\n}): CodegenableDecl<`account/${Name}`> => ({\n\tkind: 'codegenable',\n\temitterName: `account/${parts.name}` as `account/${Name}`,\n\toutputPath: `accounts/${parts.name}.ts`,\n\tsensitive: false,\n\temit: (ctx) =>\n\t\tEffect.sync(() => {\n\t\t\tctx.exportConst(parts.name, parts.resolved);\n\t\t\treturn ctx.done();\n\t\t}),\n});\n"],"mappings":";;;;;;;;AAqCA,MAAa,sBAA2C,WAGb;CAC1C,MAAM;CACN,aAAa,WAAW,MAAM;CAC9B,YAAY,YAAY,MAAM,KAAK;CACnC,WAAW;CACX,OAAO,QACN,OAAO,WAAW;AACjB,MAAI,YAAY,MAAM,MAAM,MAAM,SAAS;AAC3C,SAAO,IAAI,MAAM;GAChB;CACH"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//#region src/plugins/account/errors.d.ts
|
|
2
|
+
/** Phases for `AccountAcquireError`. Closed sum — adding a phase
|
|
3
|
+
* requires editing this list AND the cause-walker's display table. */
|
|
4
|
+
type AccountAcquirePhase = 'validate-name' | 'load-keystore' | 'read-env' | 'decode-inline' | 'bind-signer' | 'bind-impersonation-slot' | 'generate-keypair' | 'persist-keypair' | 'read-persisted-keypair' | 'restrict-permissions' | 'derive-address' | 'unsupported-scheme' | 'await-chain-ready' | 'fund-default' | 'fund-cross-cutting' | 'register';
|
|
5
|
+
/** Account acquisition error — raised by the variant resolvers and
|
|
6
|
+
* the funding pass. Carries the per-variant + per-phase column. */
|
|
7
|
+
interface AccountAcquireError {
|
|
8
|
+
readonly _tag: 'AccountAcquireError';
|
|
9
|
+
readonly phase: AccountAcquirePhase;
|
|
10
|
+
readonly accountName: string;
|
|
11
|
+
readonly variant: AccountVariantKind;
|
|
12
|
+
readonly message: string;
|
|
13
|
+
readonly hint?: string;
|
|
14
|
+
readonly cause?: unknown;
|
|
15
|
+
}
|
|
16
|
+
/** Phases for `AccountSignError`. The "sign-and-execute" surface is
|
|
17
|
+
* the canonical entry point; the impersonation refusal lives here
|
|
18
|
+
* so a synchronous throw maps cleanly onto an async catch boundary
|
|
19
|
+
* when callers wrap the resolved-account signer in `Effect.try`. */
|
|
20
|
+
type AccountSignPhase = 'build-tx' | 'sign' | 'submit' | 'await-finality' | 'dependent-package-not-found' | 'lease-acquire' | 'impersonation-bypass-attempt';
|
|
21
|
+
/** Account sign/execute error — raised by the per-account signer's
|
|
22
|
+
* `signAndExecute` / `signTransaction` / `signPersonalMessage`
|
|
23
|
+
* surfaces.
|
|
24
|
+
*
|
|
25
|
+
* Distilled-doc opportunity: today's implementation projects this to
|
|
26
|
+
* JSON specially. Promoting to the uniform-shape interface here lets
|
|
27
|
+
* the cause walker treat it like every other plugin's tagged error;
|
|
28
|
+
* the special JSON-projection case can go away. */
|
|
29
|
+
interface AccountSignError {
|
|
30
|
+
readonly _tag: 'AccountSignError';
|
|
31
|
+
readonly phase: AccountSignPhase;
|
|
32
|
+
readonly accountName: string;
|
|
33
|
+
readonly address: string;
|
|
34
|
+
readonly message: string;
|
|
35
|
+
readonly cause?: unknown;
|
|
36
|
+
}
|
|
37
|
+
/** Account variant discriminator. Mirrors the user-facing
|
|
38
|
+
* `AccountOptions` shape's `kind:` field. */
|
|
39
|
+
type AccountVariantKind = 'ephemeral' | 'keystore' | 'env' | 'inline' | 'signer' | 'impersonate';
|
|
40
|
+
/** Union of every error an Account-plugin caller may encounter. */
|
|
41
|
+
type AccountError = AccountAcquireError | AccountSignError;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { AccountAcquireError, AccountAcquirePhase, AccountError, AccountSignError, AccountSignPhase, AccountVariantKind };
|
|
44
|
+
//# sourceMappingURL=errors.d.mts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/plugins/account/errors.ts
|
|
2
|
+
const accountAcquireError = (parts) => ({
|
|
3
|
+
_tag: "AccountAcquireError",
|
|
4
|
+
...parts
|
|
5
|
+
});
|
|
6
|
+
const accountSignError = (parts) => ({
|
|
7
|
+
_tag: "AccountSignError",
|
|
8
|
+
...parts
|
|
9
|
+
});
|
|
10
|
+
/** Error tags this plugin contributes — surfaced to the cause walker
|
|
11
|
+
* via `PluginErrorContribution`. */
|
|
12
|
+
const ACCOUNT_ERROR_TAGS = ["AccountAcquireError", "AccountSignError"];
|
|
13
|
+
//#endregion
|
|
14
|
+
export { ACCOUNT_ERROR_TAGS, accountAcquireError, accountSignError };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=errors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.mjs","names":[],"sources":["../../../src/plugins/account/errors.ts"],"sourcesContent":["// Account plugin — typed errors.\n//\n// Distilled-doc finding (12-account.md \"Acquisition vs signing error\n// split\" invariant): two error families must not be mixed. Acquisition\n// errors (keystore unreadable, faucet exhausted, scheme unsupported)\n// surface as `AccountAcquireError`; signing errors (gRPC failure,\n// finality wait, locked-shared-object) surface as `AccountSignError`.\n// Mixing them breaks downstream `catchTag` boundaries — the engine's\n// pretty-cause walker also dispatches on `_tag`, so any merger here\n// would force a renderer-side branch on `phase` instead.\n//\n// Effect v4: plain interface + `_tag` literal discriminator (no\n// subclassing). The architecture's per-plugin tagged-error convention\n// (12-account.md \"Promote the sign/execute error to the same\n// tagged-error class shape\") is honored here — both errors are\n// uniform-shape, the cause walker handles them by `_tag`.\n\n/** Phases for `AccountAcquireError`. Closed sum — adding a phase\n * requires editing this list AND the cause-walker's display table. */\nexport type AccountAcquirePhase =\n\t| 'validate-name'\n\t| 'load-keystore'\n\t| 'read-env'\n\t| 'decode-inline'\n\t| 'bind-signer'\n\t| 'bind-impersonation-slot'\n\t| 'generate-keypair'\n\t| 'persist-keypair'\n\t| 'read-persisted-keypair'\n\t| 'restrict-permissions'\n\t| 'derive-address'\n\t| 'unsupported-scheme'\n\t| 'await-chain-ready'\n\t| 'fund-default'\n\t| 'fund-cross-cutting'\n\t| 'register';\n\n/** Account acquisition error — raised by the variant resolvers and\n * the funding pass. Carries the per-variant + per-phase column. */\nexport interface AccountAcquireError {\n\treadonly _tag: 'AccountAcquireError';\n\treadonly phase: AccountAcquirePhase;\n\treadonly accountName: string;\n\treadonly variant: AccountVariantKind;\n\treadonly message: string;\n\treadonly hint?: string;\n\treadonly cause?: unknown;\n}\n\nexport const accountAcquireError = (\n\tparts: Omit<AccountAcquireError, '_tag'>,\n): AccountAcquireError => ({ _tag: 'AccountAcquireError', ...parts });\n\n/** Phases for `AccountSignError`. The \"sign-and-execute\" surface is\n * the canonical entry point; the impersonation refusal lives here\n * so a synchronous throw maps cleanly onto an async catch boundary\n * when callers wrap the resolved-account signer in `Effect.try`. */\nexport type AccountSignPhase =\n\t| 'build-tx'\n\t| 'sign'\n\t| 'submit'\n\t| 'await-finality'\n\t| 'dependent-package-not-found'\n\t| 'lease-acquire'\n\t| 'impersonation-bypass-attempt';\n\n/** Account sign/execute error — raised by the per-account signer's\n * `signAndExecute` / `signTransaction` / `signPersonalMessage`\n * surfaces.\n *\n * Distilled-doc opportunity: today's implementation projects this to\n * JSON specially. Promoting to the uniform-shape interface here lets\n * the cause walker treat it like every other plugin's tagged error;\n * the special JSON-projection case can go away. */\nexport interface AccountSignError {\n\treadonly _tag: 'AccountSignError';\n\treadonly phase: AccountSignPhase;\n\treadonly accountName: string;\n\treadonly address: string;\n\treadonly message: string;\n\treadonly cause?: unknown;\n}\n\nexport const accountSignError = (parts: Omit<AccountSignError, '_tag'>): AccountSignError => ({\n\t_tag: 'AccountSignError',\n\t...parts,\n});\n\n/** Account variant discriminator. Mirrors the user-facing\n * `AccountOptions` shape's `kind:` field. */\nexport type AccountVariantKind =\n\t| 'ephemeral'\n\t| 'keystore'\n\t| 'env'\n\t| 'inline'\n\t| 'signer'\n\t| 'impersonate';\n\n/** Union of every error an Account-plugin caller may encounter. */\nexport type AccountError = AccountAcquireError | AccountSignError;\n\n/** Error tags this plugin contributes — surfaced to the cause walker\n * via `PluginErrorContribution`. */\nexport const ACCOUNT_ERROR_TAGS: ReadonlyArray<AccountError['_tag']> = [\n\t'AccountAcquireError',\n\t'AccountSignError',\n] as const;\n"],"mappings":";AAiDA,MAAa,uBACZ,WAC0B;CAAE,MAAM;CAAuB,GAAG;CAAO;AAgCpE,MAAa,oBAAoB,WAA6D;CAC7F,MAAM;CACN,GAAG;CACH;;;AAiBD,MAAa,qBAA0D,CACtE,uBACA,mBACA"}
|