@mysten-incubation/devstack 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +189 -0
- package/README.md +94 -0
- package/dist/_virtual/_rolldown/runtime.mjs +13 -0
- package/dist/api/define-capabilities.d.mts +25 -0
- package/dist/api/define-capabilities.mjs +19 -0
- package/dist/api/define-capabilities.mjs.map +1 -0
- package/dist/api/define-devstack-with.d.mts +41 -0
- package/dist/api/define-devstack-with.mjs +24 -0
- package/dist/api/define-devstack-with.mjs.map +1 -0
- package/dist/api/define-devstack.d.mts +62 -0
- package/dist/api/define-devstack.mjs +108 -0
- package/dist/api/define-devstack.mjs.map +1 -0
- package/dist/api/define-plugin.d.mts +1 -0
- package/dist/api/inference-network.mjs +122 -0
- package/dist/api/inference-network.mjs.map +1 -0
- package/dist/api/mode-narrowed-factory.d.mts +26 -0
- package/dist/api/mode-narrowed-factory.mjs +8 -0
- package/dist/api/mode-narrowed-factory.mjs.map +1 -0
- package/dist/api/plugin-errors.mjs +10 -0
- package/dist/api/plugin-errors.mjs.map +1 -0
- package/dist/api/run-stack.d.mts +82 -0
- package/dist/api/run-stack.mjs +127 -0
- package/dist/api/run-stack.mjs.map +1 -0
- package/dist/build-integrations/playwright/config.d.mts +92 -0
- package/dist/build-integrations/playwright/config.mjs +71 -0
- package/dist/build-integrations/playwright/config.mjs.map +1 -0
- package/dist/build-integrations/playwright/errors.d.mts +82 -0
- package/dist/build-integrations/playwright/errors.mjs +43 -0
- package/dist/build-integrations/playwright/errors.mjs.map +1 -0
- package/dist/build-integrations/playwright/global-setup.d.mts +64 -0
- package/dist/build-integrations/playwright/global-setup.mjs +44 -0
- package/dist/build-integrations/playwright/global-setup.mjs.map +1 -0
- package/dist/build-integrations/playwright/index.d.mts +6 -0
- package/dist/build-integrations/playwright/index.mjs +6 -0
- package/dist/build-integrations/playwright/stack-context.d.mts +95 -0
- package/dist/build-integrations/playwright/stack-context.mjs +277 -0
- package/dist/build-integrations/playwright/stack-context.mjs.map +1 -0
- package/dist/build-integrations/playwright/wallet-context.d.mts +87 -0
- package/dist/build-integrations/playwright/wallet-context.mjs +148 -0
- package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -0
- package/dist/build-integrations/runtime/cold-start-url.d.mts +67 -0
- package/dist/build-integrations/runtime/cold-start-url.mjs +56 -0
- package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -0
- package/dist/build-integrations/runtime/dapp-kit-slot.mjs +10 -0
- package/dist/build-integrations/runtime/dapp-kit-slot.mjs.map +1 -0
- package/dist/build-integrations/runtime/discover.d.mts +78 -0
- package/dist/build-integrations/runtime/discover.mjs +124 -0
- package/dist/build-integrations/runtime/discover.mjs.map +1 -0
- package/dist/build-integrations/runtime/endpoint-registry.d.mts +26 -0
- package/dist/build-integrations/runtime/endpoint-registry.mjs +41 -0
- package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -0
- package/dist/build-integrations/runtime/errors.d.mts +64 -0
- package/dist/build-integrations/runtime/errors.mjs +51 -0
- package/dist/build-integrations/runtime/errors.mjs.map +1 -0
- package/dist/build-integrations/runtime/index.d.mts +7 -0
- package/dist/build-integrations/runtime/index.mjs +6 -0
- package/dist/build-integrations/runtime/read-stack-context.d.mts +38 -0
- package/dist/build-integrations/runtime/read-stack-context.mjs +130 -0
- package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -0
- package/dist/build-integrations/runtime/stack-context.d.mts +53 -0
- package/dist/build-integrations/vitest/config.d.mts +62 -0
- package/dist/build-integrations/vitest/config.mjs +80 -0
- package/dist/build-integrations/vitest/config.mjs.map +1 -0
- package/dist/build-integrations/vitest/env.d.mts +48 -0
- package/dist/build-integrations/vitest/env.mjs +50 -0
- package/dist/build-integrations/vitest/env.mjs.map +1 -0
- package/dist/build-integrations/vitest/errors.d.mts +44 -0
- package/dist/build-integrations/vitest/errors.mjs +18 -0
- package/dist/build-integrations/vitest/errors.mjs.map +1 -0
- package/dist/build-integrations/vitest/index.d.mts +6 -0
- package/dist/build-integrations/vitest/index.mjs +6 -0
- package/dist/build-integrations/vitest/setup.d.mts +53 -0
- package/dist/build-integrations/vitest/setup.mjs +56 -0
- package/dist/build-integrations/vitest/setup.mjs.map +1 -0
- package/dist/build-integrations/vitest/stack-context.d.mts +58 -0
- package/dist/build-integrations/vitest/stack-context.mjs +67 -0
- package/dist/build-integrations/vitest/stack-context.mjs.map +1 -0
- package/dist/cli/main.d.mts +5 -0
- package/dist/cli/main.mjs +586 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/prune-direct.mjs +216 -0
- package/dist/cli/prune-direct.mjs.map +1 -0
- package/dist/cli/snapshot-reader.mjs +73 -0
- package/dist/cli/snapshot-reader.mjs.map +1 -0
- package/dist/cli/up-lifecycle.mjs +28 -0
- package/dist/cli/up-lifecycle.mjs.map +1 -0
- package/dist/contracts/capability-decl.d.mts +42 -0
- package/dist/contracts/chain-probe.d.mts +26 -0
- package/dist/contracts/chain-probe.mjs +8 -0
- package/dist/contracts/chain-probe.mjs.map +1 -0
- package/dist/contracts/codegenable.d.mts +43 -0
- package/dist/contracts/container-runtime.d.mts +245 -0
- package/dist/contracts/liveness-classifier.d.mts +19 -0
- package/dist/contracts/network-resolver.d.mts +15 -0
- package/dist/contracts/network-resolver.mjs +7 -0
- package/dist/contracts/network-resolver.mjs.map +1 -0
- package/dist/contracts/projection.d.mts +15 -0
- package/dist/contracts/routable.d.mts +53 -0
- package/dist/contracts/snapshotable.d.mts +39 -0
- package/dist/contracts/strategy-contributor.d.mts +26 -0
- package/dist/index.d.mts +89 -0
- package/dist/index.mjs +37 -0
- package/dist/orchestrators/codegen/bindings.d.mts +2 -0
- package/dist/orchestrators/codegen/bindings.mjs +340 -0
- package/dist/orchestrators/codegen/bindings.mjs.map +1 -0
- package/dist/orchestrators/codegen/emit.mjs +56 -0
- package/dist/orchestrators/codegen/emit.mjs.map +1 -0
- package/dist/orchestrators/codegen/errors.d.mts +1 -0
- package/dist/orchestrators/codegen/errors.mjs +66 -0
- package/dist/orchestrators/codegen/errors.mjs.map +1 -0
- package/dist/orchestrators/codegen/extras.mjs +16 -0
- package/dist/orchestrators/codegen/extras.mjs.map +1 -0
- package/dist/orchestrators/codegen/format.mjs +109 -0
- package/dist/orchestrators/codegen/format.mjs.map +1 -0
- package/dist/orchestrators/codegen/gitignore.mjs +67 -0
- package/dist/orchestrators/codegen/gitignore.mjs.map +1 -0
- package/dist/orchestrators/codegen/paths.d.mts +1 -0
- package/dist/orchestrators/codegen/paths.mjs +33 -0
- package/dist/orchestrators/codegen/paths.mjs.map +1 -0
- package/dist/orchestrators/codegen/permissions.mjs +6 -0
- package/dist/orchestrators/codegen/permissions.mjs.map +1 -0
- package/dist/orchestrators/codegen/service.d.mts +1 -0
- package/dist/orchestrators/codegen/service.mjs +276 -0
- package/dist/orchestrators/codegen/service.mjs.map +1 -0
- package/dist/orchestrators/router/cleanup.mjs +58 -0
- package/dist/orchestrators/router/cleanup.mjs.map +1 -0
- package/dist/orchestrators/router/cors.mjs +31 -0
- package/dist/orchestrators/router/cors.mjs.map +1 -0
- package/dist/orchestrators/router/entrypoints.d.mts +1 -0
- package/dist/orchestrators/router/entrypoints.mjs +80 -0
- package/dist/orchestrators/router/entrypoints.mjs.map +1 -0
- package/dist/orchestrators/router/errors.d.mts +1 -0
- package/dist/orchestrators/router/errors.mjs +103 -0
- package/dist/orchestrators/router/errors.mjs.map +1 -0
- package/dist/orchestrators/router/file-provider.d.mts +1 -0
- package/dist/orchestrators/router/file-provider.mjs +320 -0
- package/dist/orchestrators/router/file-provider.mjs.map +1 -0
- package/dist/orchestrators/router/hostname.d.mts +1 -0
- package/dist/orchestrators/router/hostname.mjs +107 -0
- package/dist/orchestrators/router/hostname.mjs.map +1 -0
- package/dist/orchestrators/router/index.d.mts +1 -0
- package/dist/orchestrators/router/profile.d.mts +1 -0
- package/dist/orchestrators/router/profile.mjs +109 -0
- package/dist/orchestrators/router/profile.mjs.map +1 -0
- package/dist/orchestrators/router/service.d.mts +3 -0
- package/dist/orchestrators/router/service.mjs +421 -0
- package/dist/orchestrators/router/service.mjs.map +1 -0
- package/dist/orchestrators/router/traefik-container.d.mts +1 -0
- package/dist/orchestrators/router/traefik-container.mjs +229 -0
- package/dist/orchestrators/router/traefik-container.mjs.map +1 -0
- package/dist/orchestrators/runtime-composition.d.mts +10 -0
- package/dist/orchestrators/runtime-composition.mjs +168 -0
- package/dist/orchestrators/runtime-composition.mjs.map +1 -0
- package/dist/orchestrators/snapshot/capture.d.mts +1 -0
- package/dist/orchestrators/snapshot/capture.mjs +350 -0
- package/dist/orchestrators/snapshot/capture.mjs.map +1 -0
- package/dist/orchestrators/snapshot/descriptor.d.mts +1 -0
- package/dist/orchestrators/snapshot/descriptor.mjs +109 -0
- package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -0
- package/dist/orchestrators/snapshot/identity-guard.d.mts +1 -0
- package/dist/orchestrators/snapshot/identity-guard.mjs +132 -0
- package/dist/orchestrators/snapshot/identity-guard.mjs.map +1 -0
- package/dist/orchestrators/snapshot/image-bundle-tags.mjs +207 -0
- package/dist/orchestrators/snapshot/image-bundle-tags.mjs.map +1 -0
- package/dist/orchestrators/snapshot/index.d.mts +1 -0
- package/dist/orchestrators/snapshot/integrity.d.mts +1 -0
- package/dist/orchestrators/snapshot/integrity.mjs +74 -0
- package/dist/orchestrators/snapshot/integrity.mjs.map +1 -0
- package/dist/orchestrators/snapshot/prune.d.mts +1 -0
- package/dist/orchestrators/snapshot/prune.mjs +110 -0
- package/dist/orchestrators/snapshot/prune.mjs.map +1 -0
- package/dist/orchestrators/snapshot/restore.d.mts +1 -0
- package/dist/orchestrators/snapshot/restore.mjs +404 -0
- package/dist/orchestrators/snapshot/restore.mjs.map +1 -0
- package/dist/orchestrators/snapshot/service.d.mts +1 -0
- package/dist/orchestrators/snapshot/service.mjs +296 -0
- package/dist/orchestrators/snapshot/service.mjs.map +1 -0
- package/dist/orchestrators/snapshot/state-document.mjs +18 -0
- package/dist/orchestrators/snapshot/state-document.mjs.map +1 -0
- package/dist/orchestrators/snapshot/wipe.d.mts +1 -0
- package/dist/orchestrators/snapshot/wipe.mjs +59 -0
- package/dist/orchestrators/snapshot/wipe.mjs.map +1 -0
- package/dist/plugins/account/codegen.d.mts +12 -0
- package/dist/plugins/account/codegen.mjs +22 -0
- package/dist/plugins/account/codegen.mjs.map +1 -0
- package/dist/plugins/account/errors.d.mts +44 -0
- package/dist/plugins/account/errors.mjs +16 -0
- package/dist/plugins/account/errors.mjs.map +1 -0
- package/dist/plugins/account/funding.d.mts +94 -0
- package/dist/plugins/account/funding.mjs +199 -0
- package/dist/plugins/account/funding.mjs.map +1 -0
- package/dist/plugins/account/index.d.mts +54 -0
- package/dist/plugins/account/index.mjs +151 -0
- package/dist/plugins/account/index.mjs.map +1 -0
- package/dist/plugins/account/keypair.d.mts +32 -0
- package/dist/plugins/account/keypair.mjs +99 -0
- package/dist/plugins/account/keypair.mjs.map +1 -0
- package/dist/plugins/account/lease.mjs +21 -0
- package/dist/plugins/account/lease.mjs.map +1 -0
- package/dist/plugins/account/registry.d.mts +33 -0
- package/dist/plugins/account/registry.mjs +36 -0
- package/dist/plugins/account/registry.mjs.map +1 -0
- package/dist/plugins/account/service.d.mts +104 -0
- package/dist/plugins/account/service.mjs +405 -0
- package/dist/plugins/account/service.mjs.map +1 -0
- package/dist/plugins/account/snapshot.mjs +33 -0
- package/dist/plugins/account/snapshot.mjs.map +1 -0
- package/dist/plugins/account/variants/env.mjs +24 -0
- package/dist/plugins/account/variants/env.mjs.map +1 -0
- package/dist/plugins/account/variants/ephemeral.mjs +72 -0
- package/dist/plugins/account/variants/ephemeral.mjs.map +1 -0
- package/dist/plugins/account/variants/impersonate.d.mts +16 -0
- package/dist/plugins/account/variants/impersonate.mjs +48 -0
- package/dist/plugins/account/variants/impersonate.mjs.map +1 -0
- package/dist/plugins/account/variants/inline.mjs +13 -0
- package/dist/plugins/account/variants/inline.mjs.map +1 -0
- package/dist/plugins/account/variants/keystore.mjs +93 -0
- package/dist/plugins/account/variants/keystore.mjs.map +1 -0
- package/dist/plugins/account/variants/signer.mjs +31 -0
- package/dist/plugins/account/variants/signer.mjs.map +1 -0
- package/dist/plugins/action/build-context.d.mts +41 -0
- package/dist/plugins/action/discriminator.d.mts +20 -0
- package/dist/plugins/action/discriminator.mjs +13 -0
- package/dist/plugins/action/discriminator.mjs.map +1 -0
- package/dist/plugins/action/errors.d.mts +31 -0
- package/dist/plugins/action/errors.mjs +13 -0
- package/dist/plugins/action/errors.mjs.map +1 -0
- package/dist/plugins/action/execute.d.mts +2 -0
- package/dist/plugins/action/execute.mjs +145 -0
- package/dist/plugins/action/execute.mjs.map +1 -0
- package/dist/plugins/action/index.d.mts +56 -0
- package/dist/plugins/action/index.mjs +82 -0
- package/dist/plugins/action/index.mjs.map +1 -0
- package/dist/plugins/action/service.d.mts +26 -0
- package/dist/plugins/action/service.mjs +84 -0
- package/dist/plugins/action/service.mjs.map +1 -0
- package/dist/plugins/coin/address-resolution.d.mts +34 -0
- package/dist/plugins/coin/address-resolution.mjs +80 -0
- package/dist/plugins/coin/address-resolution.mjs.map +1 -0
- package/dist/plugins/coin/codegen.d.mts +16 -0
- package/dist/plugins/coin/codegen.mjs +21 -0
- package/dist/plugins/coin/codegen.mjs.map +1 -0
- package/dist/plugins/coin/discovery.d.mts +26 -0
- package/dist/plugins/coin/discovery.mjs +112 -0
- package/dist/plugins/coin/discovery.mjs.map +1 -0
- package/dist/plugins/coin/errors.d.mts +48 -0
- package/dist/plugins/coin/errors.mjs +13 -0
- package/dist/plugins/coin/errors.mjs.map +1 -0
- package/dist/plugins/coin/index.d.mts +95 -0
- package/dist/plugins/coin/index.mjs +172 -0
- package/dist/plugins/coin/index.mjs.map +1 -0
- package/dist/plugins/coin/metadata.d.mts +15 -0
- package/dist/plugins/coin/metadata.mjs +99 -0
- package/dist/plugins/coin/metadata.mjs.map +1 -0
- package/dist/plugins/coin/mint.d.mts +34 -0
- package/dist/plugins/coin/mint.mjs +164 -0
- package/dist/plugins/coin/mint.mjs.map +1 -0
- package/dist/plugins/coin/registry.d.mts +1 -0
- package/dist/plugins/coin/registry.mjs +37 -0
- package/dist/plugins/coin/registry.mjs.map +1 -0
- package/dist/plugins/coin/service.d.mts +47 -0
- package/dist/plugins/coin/service.mjs +51 -0
- package/dist/plugins/coin/service.mjs.map +1 -0
- package/dist/plugins/coin/snapshot.mjs +19 -0
- package/dist/plugins/coin/snapshot.mjs.map +1 -0
- package/dist/plugins/coin/type-strings.mjs +49 -0
- package/dist/plugins/coin/type-strings.mjs.map +1 -0
- package/dist/plugins/deepbook/codegen.d.mts +39 -0
- package/dist/plugins/deepbook/codegen.mjs +15 -0
- package/dist/plugins/deepbook/codegen.mjs.map +1 -0
- package/dist/plugins/deepbook/deploy.mjs +437 -0
- package/dist/plugins/deepbook/deploy.mjs.map +1 -0
- package/dist/plugins/deepbook/errors.d.mts +29 -0
- package/dist/plugins/deepbook/errors.mjs +26 -0
- package/dist/plugins/deepbook/errors.mjs.map +1 -0
- package/dist/plugins/deepbook/faucet-strategy.d.mts +8 -0
- package/dist/plugins/deepbook/faucet-strategy.mjs +81 -0
- package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -0
- package/dist/plugins/deepbook/index.d.mts +171 -0
- package/dist/plugins/deepbook/index.mjs +359 -0
- package/dist/plugins/deepbook/index.mjs.map +1 -0
- package/dist/plugins/deepbook/plugin-key.mjs +7 -0
- package/dist/plugins/deepbook/plugin-key.mjs.map +1 -0
- package/dist/plugins/deepbook/pyth/index.mjs +226 -0
- package/dist/plugins/deepbook/pyth/index.mjs.map +1 -0
- package/dist/plugins/deepbook/routable.mjs +21 -0
- package/dist/plugins/deepbook/routable.mjs.map +1 -0
- package/dist/plugins/deepbook/snapshot.mjs +49 -0
- package/dist/plugins/deepbook/snapshot.mjs.map +1 -0
- package/dist/plugins/deepbook/types.d.mts +125 -0
- package/dist/plugins/deepbook/types.mjs +12 -0
- package/dist/plugins/deepbook/types.mjs.map +1 -0
- package/dist/plugins/faucet/dispatcher.d.mts +9 -0
- package/dist/plugins/faucet/dispatcher.mjs +13 -0
- package/dist/plugins/faucet/dispatcher.mjs.map +1 -0
- package/dist/plugins/faucet/errors.d.mts +86 -0
- package/dist/plugins/faucet/errors.mjs +19 -0
- package/dist/plugins/faucet/errors.mjs.map +1 -0
- package/dist/plugins/faucet/http.mjs +127 -0
- package/dist/plugins/faucet/http.mjs.map +1 -0
- package/dist/plugins/faucet/index.d.mts +43 -0
- package/dist/plugins/faucet/index.mjs +42 -0
- package/dist/plugins/faucet/index.mjs.map +1 -0
- package/dist/plugins/faucet/service.d.mts +20 -0
- package/dist/plugins/faucet/strategies/sui-local.d.mts +23 -0
- package/dist/plugins/faucet/strategies/sui-local.mjs +29 -0
- package/dist/plugins/faucet/strategies/sui-local.mjs.map +1 -0
- package/dist/plugins/host-service/errors.d.mts +27 -0
- package/dist/plugins/host-service/errors.mjs +14 -0
- package/dist/plugins/host-service/errors.mjs.map +1 -0
- package/dist/plugins/host-service/index.d.mts +10 -0
- package/dist/plugins/host-service/index.mjs +48 -0
- package/dist/plugins/host-service/index.mjs.map +1 -0
- package/dist/plugins/host-service/routable.mjs +24 -0
- package/dist/plugins/host-service/routable.mjs.map +1 -0
- package/dist/plugins/host-service/service.d.mts +49 -0
- package/dist/plugins/host-service/service.mjs +375 -0
- package/dist/plugins/host-service/service.mjs.map +1 -0
- package/dist/plugins/package/build.d.mts +1 -0
- package/dist/plugins/package/build.mjs +24 -0
- package/dist/plugins/package/build.mjs.map +1 -0
- package/dist/plugins/package/codegen.d.mts +19 -0
- package/dist/plugins/package/codegen.mjs +41 -0
- package/dist/plugins/package/codegen.mjs.map +1 -0
- package/dist/plugins/package/dep-resolution.mjs +10 -0
- package/dist/plugins/package/dep-resolution.mjs.map +1 -0
- package/dist/plugins/package/errors.d.mts +34 -0
- package/dist/plugins/package/errors.mjs +13 -0
- package/dist/plugins/package/errors.mjs.map +1 -0
- package/dist/plugins/package/index.d.mts +109 -0
- package/dist/plugins/package/index.mjs +207 -0
- package/dist/plugins/package/index.mjs.map +1 -0
- package/dist/plugins/package/mode-known.mjs +41 -0
- package/dist/plugins/package/mode-known.mjs.map +1 -0
- package/dist/plugins/package/mode-local.d.mts +1 -0
- package/dist/plugins/package/mode-local.mjs +183 -0
- package/dist/plugins/package/mode-local.mjs.map +1 -0
- package/dist/plugins/package/publish-executor.mjs +202 -0
- package/dist/plugins/package/publish-executor.mjs.map +1 -0
- package/dist/plugins/package/publish-output.d.mts +28 -0
- package/dist/plugins/package/publish-output.mjs +45 -0
- package/dist/plugins/package/publish-output.mjs.map +1 -0
- package/dist/plugins/package/registry.d.mts +25 -0
- package/dist/plugins/package/registry.mjs +30 -0
- package/dist/plugins/package/registry.mjs.map +1 -0
- package/dist/plugins/package/service.mjs +20 -0
- package/dist/plugins/package/service.mjs.map +1 -0
- package/dist/plugins/package/snapshot.mjs +25 -0
- package/dist/plugins/package/snapshot.mjs.map +1 -0
- package/dist/plugins/postgres/codegen.mjs +42 -0
- package/dist/plugins/postgres/codegen.mjs.map +1 -0
- package/dist/plugins/postgres/connection.d.mts +33 -0
- package/dist/plugins/postgres/connection.mjs +19 -0
- package/dist/plugins/postgres/connection.mjs.map +1 -0
- package/dist/plugins/postgres/db-ensure.mjs +100 -0
- package/dist/plugins/postgres/db-ensure.mjs.map +1 -0
- package/dist/plugins/postgres/errors.d.mts +55 -0
- package/dist/plugins/postgres/errors.mjs +29 -0
- package/dist/plugins/postgres/errors.mjs.map +1 -0
- package/dist/plugins/postgres/index.d.mts +37 -0
- package/dist/plugins/postgres/index.mjs +75 -0
- package/dist/plugins/postgres/index.mjs.map +1 -0
- package/dist/plugins/postgres/routable.mjs +33 -0
- package/dist/plugins/postgres/routable.mjs.map +1 -0
- package/dist/plugins/postgres/service.d.mts +50 -0
- package/dist/plugins/postgres/service.mjs +145 -0
- package/dist/plugins/postgres/service.mjs.map +1 -0
- package/dist/plugins/postgres/snapshot.d.mts +1 -0
- package/dist/plugins/postgres/snapshot.mjs +32 -0
- package/dist/plugins/postgres/snapshot.mjs.map +1 -0
- package/dist/plugins/router-entrypoints.mjs +21 -0
- package/dist/plugins/router-entrypoints.mjs.map +1 -0
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +59 -0
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -0
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +132 -0
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -0
- package/dist/plugins/seal/codegen.d.mts +19 -0
- package/dist/plugins/seal/codegen.mjs +16 -0
- package/dist/plugins/seal/codegen.mjs.map +1 -0
- package/dist/plugins/seal/config-render.mjs +82 -0
- package/dist/plugins/seal/config-render.mjs.map +1 -0
- package/dist/plugins/seal/deploy.mjs +198 -0
- package/dist/plugins/seal/deploy.mjs.map +1 -0
- package/dist/plugins/seal/errors.d.mts +52 -0
- package/dist/plugins/seal/errors.mjs +19 -0
- package/dist/plugins/seal/errors.mjs.map +1 -0
- package/dist/plugins/seal/index.d.mts +161 -0
- package/dist/plugins/seal/index.mjs +235 -0
- package/dist/plugins/seal/index.mjs.map +1 -0
- package/dist/plugins/seal/key-manager.d.mts +22 -0
- package/dist/plugins/seal/key-manager.mjs +22 -0
- package/dist/plugins/seal/key-manager.mjs.map +1 -0
- package/dist/plugins/seal/key-server.mjs +175 -0
- package/dist/plugins/seal/key-server.mjs.map +1 -0
- package/dist/plugins/seal/keygen.mjs +96 -0
- package/dist/plugins/seal/keygen.mjs.map +1 -0
- package/dist/plugins/seal/mode/fork-known.d.mts +8 -0
- package/dist/plugins/seal/mode/fork-known.mjs +23 -0
- package/dist/plugins/seal/mode/fork-known.mjs.map +1 -0
- package/dist/plugins/seal/mode/live.d.mts +18 -0
- package/dist/plugins/seal/mode/live.mjs +64 -0
- package/dist/plugins/seal/mode/live.mjs.map +1 -0
- package/dist/plugins/seal/mode/local-keygen.mjs +180 -0
- package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -0
- package/dist/plugins/seal/plugin-key.mjs +7 -0
- package/dist/plugins/seal/plugin-key.mjs.map +1 -0
- package/dist/plugins/seal/registry-publish.d.mts +43 -0
- package/dist/plugins/seal/registry-publish.mjs +9 -0
- package/dist/plugins/seal/registry-publish.mjs.map +1 -0
- package/dist/plugins/seal/routable.mjs +57 -0
- package/dist/plugins/seal/routable.mjs.map +1 -0
- package/dist/plugins/seal/service.mjs +17 -0
- package/dist/plugins/seal/service.mjs.map +1 -0
- package/dist/plugins/seal/snapshot.mjs +51 -0
- package/dist/plugins/seal/snapshot.mjs.map +1 -0
- package/dist/plugins/sui/auto-tick.mjs +45 -0
- package/dist/plugins/sui/auto-tick.mjs.map +1 -0
- package/dist/plugins/sui/chain-build-container.d.mts +1 -0
- package/dist/plugins/sui/chain-probe.d.mts +85 -0
- package/dist/plugins/sui/chain-probe.mjs +104 -0
- package/dist/plugins/sui/chain-probe.mjs.map +1 -0
- package/dist/plugins/sui/codegen.d.mts +14 -0
- package/dist/plugins/sui/codegen.mjs +26 -0
- package/dist/plugins/sui/codegen.mjs.map +1 -0
- package/dist/plugins/sui/errors.d.mts +74 -0
- package/dist/plugins/sui/errors.mjs +28 -0
- package/dist/plugins/sui/errors.mjs.map +1 -0
- package/dist/plugins/sui/fork-orchestration.mjs +24 -0
- package/dist/plugins/sui/fork-orchestration.mjs.map +1 -0
- package/dist/plugins/sui/fork-transaction.mjs +96 -0
- package/dist/plugins/sui/fork-transaction.mjs.map +1 -0
- package/dist/plugins/sui/index.d.mts +318 -0
- package/dist/plugins/sui/index.mjs +182 -0
- package/dist/plugins/sui/index.mjs.map +1 -0
- package/dist/plugins/sui/mode/external.mjs +60 -0
- package/dist/plugins/sui/mode/external.mjs.map +1 -0
- package/dist/plugins/sui/mode/fork.mjs +283 -0
- package/dist/plugins/sui/mode/fork.mjs.map +1 -0
- package/dist/plugins/sui/mode/live.mjs +103 -0
- package/dist/plugins/sui/mode/live.mjs.map +1 -0
- package/dist/plugins/sui/mode/local.mjs +293 -0
- package/dist/plugins/sui/mode/local.mjs.map +1 -0
- package/dist/plugins/sui/mode/shared-boot.mjs +254 -0
- package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -0
- package/dist/plugins/sui/mode/shared.d.mts +103 -0
- package/dist/plugins/sui/mode/shared.mjs +12 -0
- package/dist/plugins/sui/mode/shared.mjs.map +1 -0
- package/dist/plugins/sui/mode/spec.d.mts +94 -0
- package/dist/plugins/sui/network-resolver.d.mts +23 -0
- package/dist/plugins/sui/routable.mjs +88 -0
- package/dist/plugins/sui/routable.mjs.map +1 -0
- package/dist/plugins/sui/seed-objects.d.mts +18 -0
- package/dist/plugins/sui/seed-objects.mjs +25 -0
- package/dist/plugins/sui/seed-objects.mjs.map +1 -0
- package/dist/plugins/sui/service.mjs +38 -0
- package/dist/plugins/sui/service.mjs.map +1 -0
- package/dist/plugins/sui/snapshot.mjs +53 -0
- package/dist/plugins/sui/snapshot.mjs.map +1 -0
- package/dist/plugins/wallet/codegen.d.mts +33 -0
- package/dist/plugins/wallet/codegen.mjs +34 -0
- package/dist/plugins/wallet/codegen.mjs.map +1 -0
- package/dist/plugins/wallet/errors.d.mts +66 -0
- package/dist/plugins/wallet/errors.mjs +16 -0
- package/dist/plugins/wallet/errors.mjs.map +1 -0
- package/dist/plugins/wallet/index.d.mts +63 -0
- package/dist/plugins/wallet/index.mjs +126 -0
- package/dist/plugins/wallet/index.mjs.map +1 -0
- package/dist/plugins/wallet/origin-policy.d.mts +1 -0
- package/dist/plugins/wallet/origin-policy.mjs +65 -0
- package/dist/plugins/wallet/origin-policy.mjs.map +1 -0
- package/dist/plugins/wallet/pairing.d.mts +11 -0
- package/dist/plugins/wallet/pairing.mjs +125 -0
- package/dist/plugins/wallet/pairing.mjs.map +1 -0
- package/dist/plugins/wallet/protocol.d.mts +1 -0
- package/dist/plugins/wallet/protocol.mjs +96 -0
- package/dist/plugins/wallet/protocol.mjs.map +1 -0
- package/dist/plugins/wallet/routable.mjs +32 -0
- package/dist/plugins/wallet/routable.mjs.map +1 -0
- package/dist/plugins/wallet/server.d.mts +12 -0
- package/dist/plugins/wallet/server.mjs +317 -0
- package/dist/plugins/wallet/server.mjs.map +1 -0
- package/dist/plugins/wallet/service.d.mts +68 -0
- package/dist/plugins/wallet/service.mjs +97 -0
- package/dist/plugins/wallet/service.mjs.map +1 -0
- package/dist/plugins/wallet/snapshot.d.mts +1 -0
- package/dist/plugins/wallet/snapshot.mjs +14 -0
- package/dist/plugins/wallet/snapshot.mjs.map +1 -0
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +42 -0
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -0
- package/dist/plugins/walrus/codegen.d.mts +38 -0
- package/dist/plugins/walrus/codegen.mjs +34 -0
- package/dist/plugins/walrus/codegen.mjs.map +1 -0
- package/dist/plugins/walrus/deploy-paths.mjs +14 -0
- package/dist/plugins/walrus/deploy-paths.mjs.map +1 -0
- package/dist/plugins/walrus/deploy.d.mts +1 -0
- package/dist/plugins/walrus/deploy.mjs +224 -0
- package/dist/plugins/walrus/deploy.mjs.map +1 -0
- package/dist/plugins/walrus/errors.d.mts +38 -0
- package/dist/plugins/walrus/errors.mjs +26 -0
- package/dist/plugins/walrus/errors.mjs.map +1 -0
- package/dist/plugins/walrus/faucet-strategy.d.mts +12 -0
- package/dist/plugins/walrus/faucet-strategy.mjs +62 -0
- package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -0
- package/dist/plugins/walrus/index.d.mts +177 -0
- package/dist/plugins/walrus/index.mjs +284 -0
- package/dist/plugins/walrus/index.mjs.map +1 -0
- package/dist/plugins/walrus/mode/known-deploy.d.mts +25 -0
- package/dist/plugins/walrus/mode/known-deploy.mjs +71 -0
- package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -0
- package/dist/plugins/walrus/mode/local-cluster.d.mts +34 -0
- package/dist/plugins/walrus/mode/local-cluster.mjs +153 -0
- package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -0
- package/dist/plugins/walrus/plugin-key.mjs +7 -0
- package/dist/plugins/walrus/plugin-key.mjs.map +1 -0
- package/dist/plugins/walrus/registry-publish.d.mts +24 -0
- package/dist/plugins/walrus/registry-publish.mjs +7 -0
- package/dist/plugins/walrus/registry-publish.mjs.map +1 -0
- package/dist/plugins/walrus/routable.mjs +99 -0
- package/dist/plugins/walrus/routable.mjs.map +1 -0
- package/dist/plugins/walrus/service.mjs +20 -0
- package/dist/plugins/walrus/service.mjs.map +1 -0
- package/dist/plugins/walrus/snapshot.mjs +53 -0
- package/dist/plugins/walrus/snapshot.mjs.map +1 -0
- package/dist/plugins/walrus/storage-nodes.d.mts +15 -0
- package/dist/plugins/walrus/storage-nodes.mjs +154 -0
- package/dist/plugins/walrus/storage-nodes.mjs.map +1 -0
- package/dist/plugins/walrus/wal-swap.d.mts +2 -0
- package/dist/plugins/walrus/wal-swap.mjs +58 -0
- package/dist/plugins/walrus/wal-swap.mjs.map +1 -0
- package/dist/primitives/artifact-publisher.d.mts +12 -0
- package/dist/primitives/cache.d.mts +1 -0
- package/dist/runtime/built-in-plugin-layers.mjs +49 -0
- package/dist/runtime/built-in-plugin-layers.mjs.map +1 -0
- package/dist/runtime/docker/client.d.mts +2 -0
- package/dist/runtime/docker/client.mjs +54 -0
- package/dist/runtime/docker/client.mjs.map +1 -0
- package/dist/runtime/docker/container.d.mts +1 -0
- package/dist/runtime/docker/container.mjs +562 -0
- package/dist/runtime/docker/container.mjs.map +1 -0
- package/dist/runtime/docker/errors.d.mts +1 -0
- package/dist/runtime/docker/errors.mjs +187 -0
- package/dist/runtime/docker/errors.mjs.map +1 -0
- package/dist/runtime/docker/exec.d.mts +1 -0
- package/dist/runtime/docker/exec.mjs +63 -0
- package/dist/runtime/docker/exec.mjs.map +1 -0
- package/dist/runtime/docker/image.d.mts +1 -0
- package/dist/runtime/docker/image.mjs +278 -0
- package/dist/runtime/docker/image.mjs.map +1 -0
- package/dist/runtime/docker/index.d.mts +1 -0
- package/dist/runtime/docker/inventory.d.mts +1 -0
- package/dist/runtime/docker/inventory.mjs +167 -0
- package/dist/runtime/docker/inventory.mjs.map +1 -0
- package/dist/runtime/docker/labels.d.mts +1 -0
- package/dist/runtime/docker/labels.mjs +97 -0
- package/dist/runtime/docker/labels.mjs.map +1 -0
- package/dist/runtime/docker/logs.d.mts +1 -0
- package/dist/runtime/docker/logs.mjs +34 -0
- package/dist/runtime/docker/logs.mjs.map +1 -0
- package/dist/runtime/docker/network.d.mts +1 -0
- package/dist/runtime/docker/network.mjs +168 -0
- package/dist/runtime/docker/network.mjs.map +1 -0
- package/dist/runtime/docker/service.d.mts +9 -0
- package/dist/runtime/docker/service.mjs +266 -0
- package/dist/runtime/docker/service.mjs.map +1 -0
- package/dist/runtime/docker/sweep.d.mts +1 -0
- package/dist/runtime/docker/sweep.mjs +220 -0
- package/dist/runtime/docker/sweep.mjs.map +1 -0
- package/dist/runtime/docker/volume.d.mts +1 -0
- package/dist/runtime/docker/volume.mjs +24 -0
- package/dist/runtime/docker/volume.mjs.map +1 -0
- package/dist/runtime/docker/wrap.d.mts +1 -0
- package/dist/runtime/docker/wrap.mjs +131 -0
- package/dist/runtime/docker/wrap.mjs.map +1 -0
- package/dist/substrate/brand.d.mts +24 -0
- package/dist/substrate/brand.mjs +14 -0
- package/dist/substrate/brand.mjs.map +1 -0
- package/dist/substrate/cross-process.d.mts +1 -0
- package/dist/substrate/cross-process.mjs +28 -0
- package/dist/substrate/cross-process.mjs.map +1 -0
- package/dist/substrate/events.d.mts +117 -0
- package/dist/substrate/identity.d.mts +13 -0
- package/dist/substrate/lifecycle.d.mts +12 -0
- package/dist/substrate/manifest.d.mts +39 -0
- package/dist/substrate/manifest.mjs +33 -0
- package/dist/substrate/manifest.mjs.map +1 -0
- package/dist/substrate/network.d.mts +34 -0
- package/dist/substrate/options.d.mts +23 -0
- package/dist/substrate/plugin.d.mts +101 -0
- package/dist/substrate/plugin.mjs +61 -0
- package/dist/substrate/plugin.mjs.map +1 -0
- package/dist/substrate/projection.d.mts +100 -0
- package/dist/substrate/runtime/artifact-publisher/index.mjs +76 -0
- package/dist/substrate/runtime/artifact-publisher/index.mjs.map +1 -0
- package/dist/substrate/runtime/atomic-write.mjs +106 -0
- package/dist/substrate/runtime/atomic-write.mjs.map +1 -0
- package/dist/substrate/runtime/cache/index.d.mts +1 -0
- package/dist/substrate/runtime/cache/schema.d.mts +1 -0
- package/dist/substrate/runtime/cache/schema.mjs +22 -0
- package/dist/substrate/runtime/cache/schema.mjs.map +1 -0
- package/dist/substrate/runtime/cache/service.d.mts +1 -0
- package/dist/substrate/runtime/cache/service.mjs +89 -0
- package/dist/substrate/runtime/cache/service.mjs.map +1 -0
- package/dist/substrate/runtime/capability-sinks/index.d.mts +1 -0
- package/dist/substrate/runtime/capability-sinks/layer.d.mts +1 -0
- package/dist/substrate/runtime/capability-sinks/layer.mjs +31 -0
- package/dist/substrate/runtime/capability-sinks/layer.mjs.map +1 -0
- package/dist/substrate/runtime/capability-sinks/service.d.mts +36 -0
- package/dist/substrate/runtime/capability-sinks/service.mjs +74 -0
- package/dist/substrate/runtime/capability-sinks/service.mjs.map +1 -0
- package/dist/substrate/runtime/config-validation.d.mts +38 -0
- package/dist/substrate/runtime/config-validation.mjs +137 -0
- package/dist/substrate/runtime/config-validation.mjs.map +1 -0
- package/dist/substrate/runtime/context-helpers.mjs +32 -0
- package/dist/substrate/runtime/context-helpers.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +128 -0
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs +136 -0
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs +49 -0
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs +9 -0
- package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/liveness.mjs +119 -0
- package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/roster.mjs +275 -0
- package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.d.mts +1 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +117 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/stack-lock.d.mts +1 -0
- package/dist/substrate/runtime/cross-process/stack-lock.mjs +142 -0
- package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -0
- package/dist/substrate/runtime/current-plugin.mjs +15 -0
- package/dist/substrate/runtime/current-plugin.mjs.map +1 -0
- package/dist/substrate/runtime/errors.d.mts +1 -0
- package/dist/substrate/runtime/errors.mjs +76 -0
- package/dist/substrate/runtime/errors.mjs.map +1 -0
- package/dist/substrate/runtime/host-tree-tar/index.mjs +364 -0
- package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -0
- package/dist/substrate/runtime/http-probe.d.mts +35 -0
- package/dist/substrate/runtime/http-probe.mjs +65 -0
- package/dist/substrate/runtime/http-probe.mjs.map +1 -0
- package/dist/substrate/runtime/lease-broker/index.d.mts +1 -0
- package/dist/substrate/runtime/lease-broker/service.d.mts +64 -0
- package/dist/substrate/runtime/lease-broker/service.mjs +155 -0
- package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/dep-graph.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs +138 -0
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/index.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs +31 -0
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/plugin-registry.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +133 -0
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/ready-gate.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/ready-gate.mjs +34 -0
- package/dist/substrate/runtime/lifecycle/ready-gate.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/selective-restart.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs +43 -0
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/signals.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/signals.mjs +64 -0
- package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/state-machine.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/state-machine.mjs +38 -0
- package/dist/substrate/runtime/lifecycle/state-machine.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/watch-attribution.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/watch-attribution.mjs +27 -0
- package/dist/substrate/runtime/lifecycle/watch-attribution.mjs.map +1 -0
- package/dist/substrate/runtime/managed-container.d.mts +30 -0
- package/dist/substrate/runtime/managed-container.mjs +32 -0
- package/dist/substrate/runtime/managed-container.mjs.map +1 -0
- package/dist/substrate/runtime/manifest/manifest.mjs +73 -0
- package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -0
- package/dist/substrate/runtime/mode-errors.d.mts +36 -0
- package/dist/substrate/runtime/observability/cascade-formatter.d.mts +1 -0
- package/dist/substrate/runtime/observability/cascade-formatter.mjs +135 -0
- package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -0
- package/dist/substrate/runtime/observability/formatter-registry.d.mts +1 -0
- package/dist/substrate/runtime/observability/formatter-registry.mjs +65 -0
- package/dist/substrate/runtime/observability/formatter-registry.mjs.map +1 -0
- package/dist/substrate/runtime/observability/index.d.mts +3 -0
- package/dist/substrate/runtime/observability/logger.d.mts +58 -0
- package/dist/substrate/runtime/observability/logger.mjs +89 -0
- package/dist/substrate/runtime/observability/logger.mjs.map +1 -0
- package/dist/substrate/runtime/observability/pretty-error.d.mts +1 -0
- package/dist/substrate/runtime/observability/pretty-error.mjs +119 -0
- package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -0
- package/dist/substrate/runtime/observability/process-lines.d.mts +31 -0
- package/dist/substrate/runtime/observability/process-lines.mjs +40 -0
- package/dist/substrate/runtime/observability/process-lines.mjs.map +1 -0
- package/dist/substrate/runtime/observability/redaction.d.mts +28 -0
- package/dist/substrate/runtime/observability/redaction.mjs +45 -0
- package/dist/substrate/runtime/observability/redaction.mjs.map +1 -0
- package/dist/substrate/runtime/observability/spans.d.mts +1 -0
- package/dist/substrate/runtime/observability/spans.mjs +87 -0
- package/dist/substrate/runtime/observability/spans.mjs.map +1 -0
- package/dist/substrate/runtime/observability/subprocess-capture.d.mts +2 -0
- package/dist/substrate/runtime/observability/subprocess-capture.mjs +82 -0
- package/dist/substrate/runtime/observability/subprocess-capture.mjs.map +1 -0
- package/dist/substrate/runtime/paths.d.mts +17 -0
- package/dist/substrate/runtime/paths.mjs +61 -0
- package/dist/substrate/runtime/paths.mjs.map +1 -0
- package/dist/substrate/runtime/port-broker/index.d.mts +1 -0
- package/dist/substrate/runtime/port-broker/service.d.mts +1 -0
- package/dist/substrate/runtime/port-broker/service.mjs +319 -0
- package/dist/substrate/runtime/port-broker/service.mjs.map +1 -0
- package/dist/substrate/runtime/post-acquire-tasks.d.mts +1 -0
- package/dist/substrate/runtime/post-acquire-tasks.mjs +34 -0
- package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -0
- package/dist/substrate/runtime/probes.d.mts +51 -0
- package/dist/substrate/runtime/probes.mjs +84 -0
- package/dist/substrate/runtime/probes.mjs.map +1 -0
- package/dist/substrate/runtime/process-supervisor.d.mts +57 -0
- package/dist/substrate/runtime/process-supervisor.mjs +73 -0
- package/dist/substrate/runtime/process-supervisor.mjs.map +1 -0
- package/dist/substrate/runtime/projection/operational-endpoints.mjs +44 -0
- package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -0
- package/dist/substrate/runtime/projection/persisted.mjs +195 -0
- package/dist/substrate/runtime/projection/persisted.mjs.map +1 -0
- package/dist/substrate/runtime/projection/state-ref.mjs +48 -0
- package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -0
- package/dist/substrate/runtime/projection/update.mjs +200 -0
- package/dist/substrate/runtime/projection/update.mjs.map +1 -0
- package/dist/substrate/runtime/retry-policy.d.mts +18 -0
- package/dist/substrate/runtime/retry-policy.mjs +16 -0
- package/dist/substrate/runtime/retry-policy.mjs.map +1 -0
- package/dist/substrate/runtime/run.mjs +86 -0
- package/dist/substrate/runtime/run.mjs.map +1 -0
- package/dist/substrate/runtime/runtime-decode.d.mts +32 -0
- package/dist/substrate/runtime/runtime-decode.mjs +53 -0
- package/dist/substrate/runtime/runtime-decode.mjs.map +1 -0
- package/dist/substrate/runtime/scoped-http-server.mjs +36 -0
- package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -0
- package/dist/substrate/runtime/scoped-ref-map/service.mjs +83 -0
- package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +1 -0
- package/dist/substrate/runtime/stage-and-swap/index.d.mts +1 -0
- package/dist/substrate/runtime/stage-and-swap/index.mjs +131 -0
- package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -0
- package/dist/substrate/runtime/state-store/schema.mjs +36 -0
- package/dist/substrate/runtime/state-store/schema.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs +22 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs +30 -0
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/index.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/service.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/service.mjs +67 -0
- package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -0
- package/dist/substrate/runtime/sui-execute/index.d.mts +11 -0
- package/dist/substrate/runtime/sui-execute/index.mjs +144 -0
- package/dist/substrate/runtime/sui-execute/index.mjs.map +1 -0
- package/dist/substrate/runtime/sui-move-build/index.d.mts +1 -0
- package/dist/substrate/runtime/sui-move-build/index.mjs +283 -0
- package/dist/substrate/runtime/sui-move-build/index.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor.d.mts +1 -0
- package/dist/substrate/runtime/supervisor.mjs +831 -0
- package/dist/substrate/runtime/supervisor.mjs.map +1 -0
- package/dist/surfaces/cli/command-tree.mjs +276 -0
- package/dist/surfaces/cli/command-tree.mjs.map +1 -0
- package/dist/surfaces/cli/commands/config.mjs +31 -0
- package/dist/surfaces/cli/commands/config.mjs.map +1 -0
- package/dist/surfaces/cli/commands/confirm-node.mjs +26 -0
- package/dist/surfaces/cli/commands/confirm-node.mjs.map +1 -0
- package/dist/surfaces/cli/commands/confirm.mjs +26 -0
- package/dist/surfaces/cli/commands/confirm.mjs.map +1 -0
- package/dist/surfaces/cli/commands/doctor-probes.mjs +452 -0
- package/dist/surfaces/cli/commands/doctor-probes.mjs.map +1 -0
- package/dist/surfaces/cli/commands/doctor.mjs +38 -0
- package/dist/surfaces/cli/commands/doctor.mjs.map +1 -0
- package/dist/surfaces/cli/commands/prune-picker.mjs +347 -0
- package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -0
- package/dist/surfaces/cli/commands/prune.mjs +178 -0
- package/dist/surfaces/cli/commands/prune.mjs.map +1 -0
- package/dist/surfaces/cli/commands/snapshot.mjs +141 -0
- package/dist/surfaces/cli/commands/snapshot.mjs.map +1 -0
- package/dist/surfaces/cli/commands/status.mjs +95 -0
- package/dist/surfaces/cli/commands/status.mjs.map +1 -0
- package/dist/surfaces/cli/commands/supervisor-presence.mjs +33 -0
- package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -0
- package/dist/surfaces/cli/commands/wipe.mjs +28 -0
- package/dist/surfaces/cli/commands/wipe.mjs.map +1 -0
- package/dist/surfaces/cli/envelope.mjs +43 -0
- package/dist/surfaces/cli/envelope.mjs.map +1 -0
- package/dist/surfaces/cli/errors.mjs +110 -0
- package/dist/surfaces/cli/errors.mjs.map +1 -0
- package/dist/surfaces/cli/flags.mjs +56 -0
- package/dist/surfaces/cli/flags.mjs.map +1 -0
- package/dist/surfaces/cli/index.mjs +418 -0
- package/dist/surfaces/cli/index.mjs.map +1 -0
- package/dist/surfaces/cli/output.mjs +115 -0
- package/dist/surfaces/cli/output.mjs.map +1 -0
- package/dist/surfaces/cli/sysexits.mjs +139 -0
- package/dist/surfaces/cli/sysexits.mjs.map +1 -0
- package/dist/surfaces/tui/app.mjs +104 -0
- package/dist/surfaces/tui/app.mjs.map +1 -0
- package/dist/surfaces/tui/dashboard.mjs +261 -0
- package/dist/surfaces/tui/dashboard.mjs.map +1 -0
- package/dist/surfaces/tui/display-derivation.mjs +395 -0
- package/dist/surfaces/tui/display-derivation.mjs.map +1 -0
- package/dist/surfaces/tui/errors.mjs +11 -0
- package/dist/surfaces/tui/errors.mjs.map +1 -0
- package/dist/surfaces/tui/event-log.mjs +155 -0
- package/dist/surfaces/tui/event-log.mjs.map +1 -0
- package/dist/surfaces/tui/heartbeat.mjs +33 -0
- package/dist/surfaces/tui/heartbeat.mjs.map +1 -0
- package/dist/surfaces/tui/index.mjs +50 -0
- package/dist/surfaces/tui/index.mjs.map +1 -0
- package/dist/surfaces/tui/input.mjs +104 -0
- package/dist/surfaces/tui/input.mjs.map +1 -0
- package/dist/surfaces/tui/mode-detect.mjs +32 -0
- package/dist/surfaces/tui/mode-detect.mjs.map +1 -0
- package/dist/surfaces/tui/mount-ink.mjs +31 -0
- package/dist/surfaces/tui/mount-ink.mjs.map +1 -0
- package/dist/surfaces/tui/plain-renderer.mjs +170 -0
- package/dist/surfaces/tui/plain-renderer.mjs.map +1 -0
- package/dist/surfaces/tui/resource-table.mjs +507 -0
- package/dist/surfaces/tui/resource-table.mjs.map +1 -0
- package/images/_shared/signal-forward.sh +77 -0
- package/images/postgres/Dockerfile +32 -0
- package/images/seal/Dockerfile +68 -0
- package/images/seal/entrypoint.sh +65 -0
- package/images/sui/Dockerfile +73 -0
- package/images/sui/entrypoint.sh +244 -0
- package/images/sui-fork/Dockerfile +53 -0
- package/images/sui-fork/entrypoint.sh +51 -0
- package/images/walrus/Dockerfile +122 -0
- package/images/walrus/deploy-walrus.sh +305 -0
- package/images/walrus/run-walrus.sh +53 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.mjs","names":[],"sources":["../../../src/runtime/docker/container.ts"],"sourcesContent":["// Container lifecycle state machine.\n//\n// Architecture § Lifecycle states. The (missing | running-match |\n// running-mismatch | stopped-clean | stopped-unclean | stopped-\n// mismatch) input states map to (adopt | resume | recreate | fresh)\n// actions. The output handle is the running container.\n//\n// Architecture invariants encoded here:\n//\n// §1 Name-atomic create — `docker create --name <stable>` collision\n// triggers `docker start <name>` adopt-fallback (single shot;\n// second collision = typed failure, no infinite loop).\n// §2 Label-driven inventory — we use `docker container inspect <name>`\n// for the single-container probe path (cheaper than label-filtered\n// `ps`, and type-specific when container/network names collide), but\n// the labels are still STAMPED on create so sweep can find us by\n// labels later.\n// §5 Async network-connect — `network.ts::waitForIp` is called\n// after attach and before we declare ready.\n// §9 RecreatePolicy enum routed in — `never` refuses to recreate;\n// `on-failure` recreates on unclean shutdown + image mismatch;\n// `on-config-change` recreates on image mismatch, port mismatch,\n// or caller-supplied config hash mismatch.\n\nimport { Deferred, Effect, Ref, Scope, Schema } from 'effect';\n\nimport type {\n\tContainerHandle,\n\tContainerPortPublish,\n\tEnsureContainerSpec,\n\tPortBindingReconciliation,\n\tRecreatePolicy,\n} from '../../contracts/container-runtime.ts';\nimport { addClaim, removeClaim } from '../../substrate/runtime/cross-process/roster.ts';\nimport { StackPathsService } from '../../substrate/runtime/paths.ts';\nimport { decodeJsonArrayElementSync } from '../../substrate/runtime/runtime-decode.ts';\nimport { DockerHost, DockerSpawner, dockerRun, dockerRunOk } from './client.ts';\nimport {\n\tContainerCreateFailed,\n\tContainerNameCollisionUnrecoverable,\n\tDaemonUnreachable,\n\tDockerInspectDecodeFailed,\n\tDockerInspectFailed,\n\ttype DockerRuntimeError,\n\tForeignDockerResource,\n\tRecreateRefused,\n} from './errors.ts';\nimport {\n\texpectedContainerOwnershipLabels,\n\tLabelKey,\n\townershipMismatchDetail,\n\trenderContainerLabels,\n} from './labels.ts';\nimport { connect, readIps, waitForIp } from './network.ts';\nimport {\n\tclassifyExit,\n\tisDaemonUnreachableStderr,\n\tisNameCollisionStderr,\n\tisNoSuchContainerStderr,\n\twrapCreateError,\n\twrapGeneric,\n} from './wrap.ts';\n\n// -----------------------------------------------------------------------------\n// State machine — pure decision (testable independently)\n// -----------------------------------------------------------------------------\n\nexport type InspectLifecycleState =\n\t| { readonly kind: 'running'; readonly exitCode: number }\n\t| { readonly kind: 'paused'; readonly exitCode: number }\n\t| { readonly kind: 'stopped'; readonly exitCode: number }\n\t| { readonly kind: 'unknown' };\n\n/** What `docker container inspect <name>` told us. Lifecycle facts are explicit:\n * Docker may omit `State`, and absence means we cannot prove running,\n * paused, or stopped state. */\nexport interface InspectFacts {\n\treadonly id: string;\n\treadonly lifecycle: InspectLifecycleState;\n\treadonly running: boolean;\n\treadonly paused: boolean;\n\treadonly exitCode: number | null;\n\t/** Create-time image ref recorded by Docker. For tagged builds this is\n\t * usually the tag passed to `docker run`. */\n\treadonly image: string;\n\t/** Resolved image id from Docker inspect's top-level `Image` field. */\n\treadonly imageDigest?: string;\n\treadonly mounts?: ReadonlyArray<InspectMount>;\n\treadonly portBindings?: ReadonlyArray<string>;\n\treadonly ports?: ReadonlyArray<ContainerPortPublish>;\n\treadonly effectivePortBindings?: ReadonlyArray<string>;\n\treadonly effectivePorts?: ReadonlyArray<ContainerPortPublish>;\n\treadonly command?: ReadonlyArray<string>;\n\treadonly labels?: Readonly<Record<string, string>>;\n\treadonly networks?: ReadonlyArray<string>;\n}\n\nexport interface InspectMount {\n\treadonly source: string;\n\treadonly target: string;\n\treadonly readOnly?: boolean;\n}\n\n/** The closed set of actions the state machine can decide. */\nexport type RunAction =\n\t| { readonly kind: 'adopt'; readonly id: string }\n\t| { readonly kind: 'unpause-adopt'; readonly id: string }\n\t| { readonly kind: 'resume'; readonly id: string }\n\t| { readonly kind: 'recreate'; readonly id: string; readonly reason: RecreateReason }\n\t| { readonly kind: 'fresh' }\n\t| { readonly kind: 'refuse'; readonly reason: RecreateReason };\n\nexport type RecreateReason =\n\t| 'image-mismatch'\n\t| 'config-mismatch'\n\t| 'unclean-shutdown'\n\t| 'resume-failed'\n\t| 'unknown-state';\n\n/** Pure decision: given the inspect facts (or null = missing), the\n * desired image + host port bindings, and the policy, what action\n * do we take?\n *\n * Tested directly without the subprocess seam. */\nexport const decideRunAction = (\n\tfacts: InspectFacts | null,\n\tdesiredImage: string,\n\tpolicy: RecreatePolicy,\n\tdesiredPortBindings: ReadonlyArray<string> = [],\n\tportBindingReconciliation: PortBindingReconciliation = 'exact',\n\tdesiredConfigHash?: string,\n\tdesiredImageDigest?: string,\n): RunAction => {\n\tif (facts === null) return { kind: 'fresh' };\n\tconst imageMatches =\n\t\tfacts.image === desiredImage ||\n\t\t(desiredImageDigest !== undefined &&\n\t\t\t(facts.image === desiredImageDigest || facts.imageDigest === desiredImageDigest));\n\tconst portsMatch = sameBindings(facts.portBindings ?? [], desiredPortBindings);\n\tconst portsCompatible =\n\t\tportsMatch ||\n\t\t(portBindingReconciliation === 'adopt-existing' &&\n\t\t\tsameBindingContainerPorts(facts.portBindings ?? [], desiredPortBindings));\n\tconst configMatches =\n\t\tdesiredConfigHash === undefined || facts.labels?.[LabelKey.configHash] === desiredConfigHash;\n\tif (facts.lifecycle.kind === 'unknown') {\n\t\treturn routeRecreate({ kind: 'recreate', id: facts.id, reason: 'unknown-state' }, policy);\n\t}\n\tif (facts.lifecycle.kind === 'paused') {\n\t\treturn imageMatches && portsCompatible && configMatches\n\t\t\t? { kind: 'unpause-adopt', id: facts.id }\n\t\t\t: routeRecreate(\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: 'recreate',\n\t\t\t\t\t\tid: facts.id,\n\t\t\t\t\t\treason: imageMatches ? 'config-mismatch' : 'image-mismatch',\n\t\t\t\t\t},\n\t\t\t\t\tpolicy,\n\t\t\t\t);\n\t}\n\tif (facts.lifecycle.kind === 'running') {\n\t\treturn imageMatches && portsCompatible && configMatches\n\t\t\t? { kind: 'adopt', id: facts.id }\n\t\t\t: routeRecreate(\n\t\t\t\t\t{\n\t\t\t\t\t\tkind: 'recreate',\n\t\t\t\t\t\tid: facts.id,\n\t\t\t\t\t\treason: imageMatches ? 'config-mismatch' : 'image-mismatch',\n\t\t\t\t\t},\n\t\t\t\t\tpolicy,\n\t\t\t\t);\n\t}\n\tif (!imageMatches) {\n\t\t// Image mismatch ALWAYS wins (architecture §11).\n\t\treturn routeRecreate({ kind: 'recreate', id: facts.id, reason: 'image-mismatch' }, policy);\n\t}\n\tif (!portsCompatible) {\n\t\treturn routeRecreate({ kind: 'recreate', id: facts.id, reason: 'config-mismatch' }, policy);\n\t}\n\tif (!configMatches) {\n\t\treturn routeRecreate({ kind: 'recreate', id: facts.id, reason: 'config-mismatch' }, policy);\n\t}\n\tif (facts.lifecycle.exitCode === 137) {\n\t\t// Unclean shutdown — see architecture §G1 / §13.\n\t\t// `on-failure`: recreate. `never`: refuse. `on-config-change`:\n\t\t// resume — caller wants stopped container kept until config\n\t\t// changes, even if the prior exit was unclean.\n\t\tif (policy === 'on-failure') {\n\t\t\treturn { kind: 'recreate', id: facts.id, reason: 'unclean-shutdown' };\n\t\t}\n\t\tif (policy === 'never') {\n\t\t\treturn { kind: 'refuse', reason: 'unclean-shutdown' };\n\t\t}\n\t\treturn { kind: 'resume', id: facts.id };\n\t}\n\treturn { kind: 'resume', id: facts.id };\n};\n\n/** Route a recreate-class decision through the policy. */\nconst routeRecreate = (\n\taction: RunAction & { kind: 'recreate' },\n\tpolicy: RecreatePolicy,\n): RunAction => {\n\tif (policy === 'never') return { kind: 'refuse', reason: action.reason };\n\treturn action;\n};\n\nconst canonicalPortBindings = (\n\tports: ReadonlyArray<ContainerPortPublish> | undefined,\n): ReadonlyArray<string> =>\n\t[...(ports ?? [])]\n\t\t.map((p) => `${p.containerPort}/tcp=${normalizeHostIp(p.hostIp)}:${p.hostPort}`)\n\t\t.sort();\n\nconst sameBindings = (left: ReadonlyArray<string>, right: ReadonlyArray<string>): boolean =>\n\tleft.length === right.length && left.every((value, index) => value === right[index]);\n\nconst sameBindingContainerPorts = (\n\tleft: ReadonlyArray<string>,\n\tright: ReadonlyArray<string>,\n): boolean => {\n\tconst leftContainers = left.map(bindingContainerKey).sort();\n\tconst rightContainers = right.map(bindingContainerKey).sort();\n\treturn sameBindings(leftContainers, rightContainers);\n};\n\nconst bindingContainerKey = (binding: string): string => binding.split('=')[0] ?? binding;\n\nconst normalizeHostIp = (hostIp: string | undefined): string =>\n\thostIp === undefined || hostIp === '' ? '0.0.0.0' : hostIp;\n\nconst readPublishedPorts = (raw: unknown): ReadonlyArray<ContainerPortPublish> => {\n\tif (raw === null || typeof raw !== 'object') return [];\n\tconst out: ContainerPortPublish[] = [];\n\tfor (const [container, bindings] of Object.entries(raw)) {\n\t\tconst containerPort = Number(container.split('/')[0]);\n\t\tif (!Number.isInteger(containerPort) || containerPort <= 0) continue;\n\t\tif (!Array.isArray(bindings)) continue;\n\t\tfor (const binding of bindings) {\n\t\t\tif (binding === null || typeof binding !== 'object') continue;\n\t\t\tconst hostPort = (binding as { HostPort?: unknown }).HostPort;\n\t\t\tif (typeof hostPort !== 'string') continue;\n\t\t\tconst hostPortNumber = Number(hostPort);\n\t\t\tif (!Number.isInteger(hostPortNumber) || hostPortNumber <= 0) continue;\n\t\t\tconst hostIp = (binding as { HostIp?: unknown }).HostIp;\n\t\t\tout.push({\n\t\t\t\tcontainerPort,\n\t\t\t\thostPort: hostPortNumber,\n\t\t\t\t...(typeof hostIp === 'string' ? { hostIp: normalizeHostIp(hostIp) } : {}),\n\t\t\t});\n\t\t}\n\t}\n\treturn out.sort((a, b) => {\n\t\tif (a.containerPort !== b.containerPort) return a.containerPort - b.containerPort;\n\t\tconst hostIp = normalizeHostIp(a.hostIp).localeCompare(normalizeHostIp(b.hostIp));\n\t\treturn hostIp !== 0 ? hostIp : a.hostPort - b.hostPort;\n\t});\n};\n\nconst readMounts = (raw: unknown): ReadonlyArray<InspectMount> => {\n\tif (!Array.isArray(raw)) return [];\n\tconst out: InspectMount[] = [];\n\tfor (const mount of raw) {\n\t\tif (mount === null || typeof mount !== 'object') continue;\n\t\tconst source = (mount as { Source?: unknown }).Source;\n\t\tconst target = (mount as { Destination?: unknown }).Destination;\n\t\tif (typeof source !== 'string' || typeof target !== 'string') continue;\n\t\tconst rw = (mount as { RW?: unknown }).RW;\n\t\tout.push({\n\t\t\tsource,\n\t\t\ttarget,\n\t\t\t...(typeof rw === 'boolean' ? { readOnly: !rw } : {}),\n\t\t});\n\t}\n\treturn out;\n};\n\nconst readStringArray = (raw: unknown): ReadonlyArray<string> => {\n\tif (!Array.isArray(raw)) return [];\n\treturn raw.filter((value): value is string => typeof value === 'string');\n};\n\nconst readLabels = (raw: unknown): Readonly<Record<string, string>> => {\n\tif (raw === null || typeof raw !== 'object') return {};\n\tconst out: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(raw)) {\n\t\tif (typeof value === 'string') out[key] = value;\n\t}\n\treturn out;\n};\n\nconst readNetworks = (raw: unknown): ReadonlyArray<string> => {\n\tif (raw === null || typeof raw !== 'object') return [];\n\treturn Object.keys(raw).sort();\n};\n\nconst readLifecycleState = (\n\tstate:\n\t\t| {\n\t\t\t\treadonly Running: boolean;\n\t\t\t\treadonly Paused: boolean;\n\t\t\t\treadonly ExitCode: number;\n\t\t }\n\t\t| undefined,\n): InspectLifecycleState => {\n\tif (state === undefined) return { kind: 'unknown' };\n\tif (state.Paused) return { kind: 'paused', exitCode: state.ExitCode };\n\tif (state.Running) return { kind: 'running', exitCode: state.ExitCode };\n\treturn { kind: 'stopped', exitCode: state.ExitCode };\n};\n\n// -----------------------------------------------------------------------------\n// Inspect — `docker container inspect <name>`\n// -----------------------------------------------------------------------------\n\nconst InspectSchema = Schema.Struct({\n\tId: Schema.String,\n\tImage: Schema.optional(Schema.String),\n\tMounts: Schema.optional(Schema.Unknown),\n\tHostConfig: Schema.optional(\n\t\tSchema.Struct({\n\t\t\tPortBindings: Schema.Unknown,\n\t\t}),\n\t),\n\tState: Schema.optional(\n\t\tSchema.Struct({\n\t\t\tRunning: Schema.Boolean,\n\t\t\tPaused: Schema.Boolean,\n\t\t\tExitCode: Schema.Number,\n\t\t}),\n\t),\n\tConfig: Schema.Struct({\n\t\tImage: Schema.String,\n\t\tCmd: Schema.optional(Schema.Unknown),\n\t\tLabels: Schema.optional(Schema.Unknown),\n\t}),\n\tNetworkSettings: Schema.Struct({\n\t\tNetworks: Schema.Unknown,\n\t\tPorts: Schema.optional(Schema.Unknown),\n\t}),\n});\n\nexport const inspectContainer = (\n\tname: string,\n): Effect.Effect<InspectFacts | null, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tconst res = yield* dockerRunOk('container', ['inspect', name]).pipe(\n\t\t\tEffect.mapError(wrapGeneric('docker.container.inspect')),\n\t\t);\n\t\tif (res.exitCode !== 0) {\n\t\t\tif (isNoSuchContainerStderr(res.stderr)) return null;\n\t\t\tif (isDaemonUnreachableStderr(res.stderr)) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew DaemonUnreachable({\n\t\t\t\t\t\top: 'docker.container.inspect',\n\t\t\t\t\t\tdetail: 'docker daemon unreachable',\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew DockerInspectFailed({\n\t\t\t\t\tresource: 'container',\n\t\t\t\t\tname,\n\t\t\t\t\tstderr: res.stderr,\n\t\t\t\t\texitCode: res.exitCode,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\ttry {\n\t\t\tconst decoded = decodeJsonArrayElementSync(InspectSchema, res.stdout, {\n\t\t\t\tsource: `docker container inspect ${name}`,\n\t\t\t\tmissingMessage: 'inspect returned an empty result',\n\t\t\t\tmkError: (issue) =>\n\t\t\t\t\tnew DockerInspectDecodeFailed({\n\t\t\t\t\t\tresource: 'container',\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tdetail:\n\t\t\t\t\t\t\tissue.message === 'inspect returned an empty result'\n\t\t\t\t\t\t\t\t? issue.message\n\t\t\t\t\t\t\t\t: 'inspect returned malformed container JSON',\n\t\t\t\t\t\tcause: issue.cause,\n\t\t\t\t\t}),\n\t\t\t});\n\t\t\tconst lifecycle = readLifecycleState(decoded.State);\n\t\t\tconst effectivePorts = readPublishedPorts(decoded.NetworkSettings.Ports);\n\t\t\tconst ports =\n\t\t\t\tdecoded.HostConfig === undefined\n\t\t\t\t\t? effectivePorts\n\t\t\t\t\t: readPublishedPorts(decoded.HostConfig.PortBindings);\n\t\t\tconst mounts = readMounts(decoded.Mounts);\n\t\t\tconst command = readStringArray(decoded.Config.Cmd);\n\t\t\tconst labels = readLabels(decoded.Config.Labels);\n\t\t\tconst networks = readNetworks(decoded.NetworkSettings.Networks);\n\t\t\treturn {\n\t\t\t\tid: decoded.Id,\n\t\t\t\tlifecycle,\n\t\t\t\trunning: lifecycle.kind === 'running' || lifecycle.kind === 'paused',\n\t\t\t\tpaused: lifecycle.kind === 'paused',\n\t\t\t\texitCode: lifecycle.kind === 'unknown' ? null : lifecycle.exitCode,\n\t\t\t\t// The container's recorded image. Docker may omit the\n\t\t\t\t// top-level digest field, but lifecycle decisions need the\n\t\t\t\t// create-time ref from Config.Image.\n\t\t\t\timage: decoded.Config.Image,\n\t\t\t\t...(decoded.Image !== undefined ? { imageDigest: decoded.Image } : {}),\n\t\t\t\tmounts,\n\t\t\t\tportBindings: canonicalPortBindings(ports),\n\t\t\t\tports,\n\t\t\t\teffectivePortBindings: canonicalPortBindings(effectivePorts),\n\t\t\t\teffectivePorts,\n\t\t\t\tcommand,\n\t\t\t\tlabels,\n\t\t\t\tnetworks,\n\t\t\t};\n\t\t} catch (cause) {\n\t\t\treturn yield* Effect.fail(cause as DockerRuntimeError);\n\t\t}\n\t}).pipe(Effect.withSpan('runtime.docker.container.inspect'));\n\n// -----------------------------------------------------------------------------\n// Argv construction\n// -----------------------------------------------------------------------------\n\nconst createArgv = (\n\tspec: EnsureContainerSpec,\n\tcycle: number,\n\timageRef: string,\n): ReadonlyArray<string> => {\n\tconst args: Array<string> = ['-d', '--name', spec.name];\n\tconst configLabels: Readonly<Record<string, string>> | undefined =\n\t\tspec.configHash === undefined ? undefined : { [LabelKey.configHash]: spec.configHash };\n\tfor (const label of renderContainerLabels(spec.labels, cycle, configLabels)) {\n\t\targs.push('--label', label);\n\t}\n\tif (spec.env) {\n\t\tfor (const [k, v] of Object.entries(spec.env)) {\n\t\t\targs.push('--env', `${k}=${v}`);\n\t\t}\n\t}\n\tif (spec.ports) {\n\t\tfor (const p of spec.ports) {\n\t\t\tconst hostPrefix = p.hostIp === undefined ? '' : `${p.hostIp}:`;\n\t\t\targs.push('-p', `${hostPrefix}${p.hostPort}:${p.containerPort}`);\n\t\t}\n\t}\n\tif (spec.mounts) {\n\t\tfor (const m of spec.mounts) {\n\t\t\tconst ro = m.readonly ? ',readonly' : '';\n\t\t\targs.push('--mount', `type=bind,source=${m.source},target=${m.target}${ro}`);\n\t\t}\n\t}\n\tif (spec.networkAttach && spec.networkAttach.length > 0) {\n\t\t// First attach goes via --network; subsequent attaches via\n\t\t// post-start `network connect` so we can wait for IP readback.\n\t\targs.push('--network', spec.networkAttach[0]!);\n\t}\n\tif (spec.extraHosts) {\n\t\tfor (const [host, ip] of Object.entries(spec.extraHosts)) {\n\t\t\targs.push('--add-host', `${host}:${ip}`);\n\t\t}\n\t}\n\tif (spec.entrypoint) {\n\t\targs.push('--entrypoint', spec.entrypoint);\n\t}\n\targs.push(imageRef);\n\tif (spec.command) {\n\t\targs.push(...spec.command);\n\t}\n\treturn args;\n};\n\n// -----------------------------------------------------------------------------\n// Apply the state machine\n// -----------------------------------------------------------------------------\n\nconst handleOf = (\n\tid: string,\n\tname: string,\n\timageName: string,\n\tstatus: ContainerHandle['status'],\n\tips: ReadonlyArray<string>,\n\tports?: ReadonlyArray<ContainerPortPublish>,\n\tlabels?: EnsureContainerSpec['labels'],\n): ContainerHandle => ({\n\tid,\n\tname,\n\t...(labels !== undefined ? { labels } : {}),\n\timageName,\n\tstatus,\n\tips,\n\t...(ports !== undefined ? { ports } : {}),\n});\n\n/** Force-remove by name. Used by recreate. Idempotent on\n * \"no such container\". */\nconst forceRemove = (\n\tname: string,\n): Effect.Effect<void, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tconst res = yield* dockerRunOk('rm', ['-f', name]).pipe(\n\t\t\tEffect.mapError(wrapGeneric('docker.rm')),\n\t\t);\n\t\tif (res.exitCode !== 0 && !isNoSuchContainerStderr(res.stderr)) {\n\t\t\t// best-effort; we surface as a span event but do not fail\n\t\t\t// the rm step (the next create will collision-recover).\n\t\t\tyield* Effect.annotateCurrentSpan({ 'docker.rm.warning': res.stderr });\n\t\t}\n\t}).pipe(Effect.withSpan('runtime.docker.container.forceRemove'));\n\nconst ownershipFailure = (\n\tname: string,\n\texpected: Readonly<Record<string, string>>,\n\tactual: Readonly<Record<string, string>>,\n\tdetail: string,\n): ForeignDockerResource =>\n\tnew ForeignDockerResource({\n\t\tresource: 'container',\n\t\tname,\n\t\texpected,\n\t\tactual,\n\t\tdetail,\n\t});\n\nconst assertOwnedFacts = (\n\tname: string,\n\tfacts: InspectFacts,\n\tlabels: EnsureContainerSpec['labels'],\n): Effect.Effect<void, DockerRuntimeError> =>\n\tEffect.gen(function* () {\n\t\tconst expected = expectedContainerOwnershipLabels(labels);\n\t\tconst actual = facts.labels ?? {};\n\t\tconst mismatch = ownershipMismatchDetail(expected, actual);\n\t\tif (mismatch !== null) {\n\t\t\treturn yield* Effect.fail(ownershipFailure(name, expected, actual, mismatch));\n\t\t}\n\t});\n\nconst failUnknownCollisionLifecycle = (\n\tname: string,\n\tstage: 'before-start' | 'after-start',\n): Effect.Effect<never, DockerRuntimeError> =>\n\tEffect.fail(\n\t\tnew ContainerNameCollisionUnrecoverable({\n\t\t\tname,\n\t\t\tdetail: `name collision recovery refused unknown lifecycle state ${stage}`,\n\t\t}),\n\t);\n\nexport const assertContainerHandleOwned = (\n\thandle: ContainerHandle,\n): Effect.Effect<void, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tif (handle.labels === undefined) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\townershipFailure(handle.name, {}, {}, 'container handle has no ownership labels'),\n\t\t\t);\n\t\t}\n\t\tconst facts = yield* inspectContainer(handle.name);\n\t\tconst expected = expectedContainerOwnershipLabels(handle.labels);\n\t\tif (facts === null) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\townershipFailure(handle.name, expected, {}, 'container is missing'),\n\t\t\t);\n\t\t}\n\t\tif (facts.id !== handle.id) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\townershipFailure(handle.name, expected, facts.labels ?? {}, `id changed to ${facts.id}`),\n\t\t\t);\n\t\t}\n\t\tyield* assertOwnedFacts(handle.name, facts, handle.labels);\n\t}).pipe(Effect.withSpan('runtime.docker.container.assertOwned'));\n\nconst forceRemoveOwned = (\n\tname: string,\n\tid: string,\n\tlabels: EnsureContainerSpec['labels'],\n): Effect.Effect<void, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tconst current = yield* inspectContainer(name);\n\t\tif (current === null) return;\n\t\tif (current.id !== id) {\n\t\t\tconst expected = expectedContainerOwnershipLabels(labels);\n\t\t\treturn yield* Effect.fail(\n\t\t\t\townershipFailure(name, expected, current.labels ?? {}, `id changed to ${current.id}`),\n\t\t\t);\n\t\t}\n\t\tyield* assertOwnedFacts(name, current, labels);\n\t\tyield* forceRemove(name);\n\t});\n\n/** Single-shot start-and-adopt fallback after `docker create` exit-125\n * with name-collision. Architecture §1 / G10 — one attempt; second\n * collision is a typed failure. */\nconst startAndAdopt = (\n\tname: string,\n\tlabels: EnsureContainerSpec['labels'],\n): Effect.Effect<string, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tconst beforeStart = yield* inspectContainer(name);\n\t\tif (beforeStart === null) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew ContainerNameCollisionUnrecoverable({\n\t\t\t\t\tname,\n\t\t\t\t\tdetail: 'name collision but inspect found no container',\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tyield* assertOwnedFacts(name, beforeStart, labels);\n\t\tif (beforeStart.lifecycle.kind === 'unknown') {\n\t\t\treturn yield* failUnknownCollisionLifecycle(name, 'before-start');\n\t\t}\n\t\tconst res = yield* dockerRunOk('start', [name]).pipe(\n\t\t\tEffect.mapError(wrapGeneric('docker.start')),\n\t\t);\n\t\tconst cls = classifyExit(res);\n\t\tif (cls.ok) {\n\t\t\tconst facts = yield* inspectContainer(name);\n\t\t\tif (facts === null) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew ContainerNameCollisionUnrecoverable({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tdetail: 'peer collision + start succeeded + inspect missed',\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\tyield* assertOwnedFacts(name, facts, labels);\n\t\t\tif (facts.lifecycle.kind === 'unknown') {\n\t\t\t\treturn yield* failUnknownCollisionLifecycle(name, 'after-start');\n\t\t\t}\n\t\t\treturn facts.id;\n\t\t}\n\t\tif (isNoSuchContainerStderr(cls.stderr)) {\n\t\t\t// Peer rm'd between our collision and the start. The caller's\n\t\t\t// outer loop will see this as \"missing\" and promote to fresh.\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew ContainerNameCollisionUnrecoverable({\n\t\t\t\t\tname,\n\t\t\t\t\tdetail: 'TOCTOU: start after collision found no container',\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn yield* Effect.fail(\n\t\t\tnew ContainerNameCollisionUnrecoverable({\n\t\t\t\tname,\n\t\t\t\tdetail: `start-and-adopt failed: ${cls.stderr}`,\n\t\t\t}),\n\t\t);\n\t});\n\nconst freshCreate = (\n\tspec: EnsureContainerSpec,\n\tcycle: number,\n): Effect.Effect<string, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tconst args = createArgv(spec, cycle, spec.image.tag ?? spec.image.digest);\n\t\tconst created = yield* dockerRun('run', args).pipe(Effect.mapError(wrapCreateError(spec.name)));\n\t\treturn created.stdout.trim();\n\t});\n\nconst resumeStart = (\n\tname: string,\n): Effect.Effect<\n\t{ readonly ok: true } | { readonly ok: false; readonly stderr: string },\n\tDockerRuntimeError,\n\tDockerHost | DockerSpawner\n> =>\n\tEffect.gen(function* () {\n\t\tconst res = yield* dockerRunOk('start', [name]).pipe(\n\t\t\tEffect.mapError(wrapGeneric('docker.start')),\n\t\t);\n\t\tif (res.exitCode === 0) return { ok: true as const };\n\t\tif (isDaemonUnreachableStderr(res.stderr)) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew DaemonUnreachable({\n\t\t\t\t\top: 'docker.start',\n\t\t\t\t\tdetail: 'docker daemon unreachable',\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn { ok: false as const, stderr: res.stderr };\n\t});\n\nconst recreateAfterResumeFailure = (\n\tid: string,\n\tspec: EnsureContainerSpec,\n\tdeps: EnsureContainerDeps,\n): Effect.Effect<string, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tconst routed = routeRecreate({ kind: 'recreate', id, reason: 'resume-failed' }, spec.recreate);\n\t\tif (routed.kind === 'refuse') {\n\t\t\treturn yield* Effect.fail(new RecreateRefused({ name: spec.name, reason: routed.reason }));\n\t\t}\n\t\tyield* forceRemoveOwned(spec.name, id, spec.labels);\n\t\treturn yield* createWithCollisionRecovery(spec, deps);\n\t});\n\nconst effectivePortsCompatible = (facts: InspectFacts, spec: EnsureContainerSpec): boolean => {\n\tconst desired = canonicalPortBindings(spec.ports);\n\tif (desired.length === 0) return true;\n\tconst actual = facts.effectivePortBindings ?? [];\n\tif (sameBindings(actual, desired)) return true;\n\treturn (\n\t\t(spec.portBindingReconciliation ?? 'exact') === 'adopt-existing' &&\n\t\tsameBindingContainerPorts(actual, desired)\n\t);\n};\n\nconst ensureEffectivePublishedPorts = (\n\tid: string,\n\tspec: EnsureContainerSpec,\n\tdeps: EnsureContainerDeps,\n): Effect.Effect<string, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tif ((spec.ports ?? []).length === 0) return id;\n\t\tconst facts = yield* inspectContainer(spec.name);\n\t\tif (facts === null || facts.id !== id || facts.lifecycle.kind !== 'running') return id;\n\t\tyield* assertOwnedFacts(spec.name, facts, spec.labels);\n\t\tif (effectivePortsCompatible(facts, spec)) return id;\n\t\tconst repairedId = yield* recreateAfterResumeFailure(id, spec, deps);\n\t\tconst repairedFacts = yield* inspectContainer(spec.name);\n\t\tif (\n\t\t\trepairedFacts !== null &&\n\t\t\trepairedFacts.id === repairedId &&\n\t\t\trepairedFacts.lifecycle.kind === 'running' &&\n\t\t\teffectivePortsCompatible(repairedFacts, spec)\n\t\t) {\n\t\t\treturn repairedId;\n\t\t}\n\t\treturn yield* Effect.fail(\n\t\t\tnew ContainerCreateFailed({\n\t\t\t\tname: spec.name,\n\t\t\t\tstderr: `container is running but Docker did not publish requested ports: desired=${JSON.stringify(\n\t\t\t\t\tcanonicalPortBindings(spec.ports),\n\t\t\t\t)} actual=${JSON.stringify(repairedFacts?.effectivePortBindings ?? [])}`,\n\t\t\t\texitCode: 0,\n\t\t\t}),\n\t\t);\n\t});\n\nconst stopWithGrace = (\n\tname: string,\n\tgraceSeconds: number,\n\tsignal?: string,\n): Effect.Effect<void, never, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tconst args: Array<string> = [];\n\t\tif (signal !== undefined) args.push('--signal', signal);\n\t\targs.push('--time', String(Math.max(0, Math.floor(graceSeconds))));\n\t\targs.push(name);\n\t\tyield* dockerRunOk('stop', args).pipe(\n\t\t\tEffect.catch(() => Effect.void),\n\t\t\tEffect.asVoid,\n\t\t);\n\t});\n\n// -----------------------------------------------------------------------------\n// Public surface\n// -----------------------------------------------------------------------------\n\n/** Per-name lock state. Map entry present = name is held; the value is\n * the FIFO queue of waiter deferreds. Empty queue = held with no\n * waiters. Map entry absent = free. */\nexport type PerNameLockState = ReadonlyMap<string, ReadonlyArray<Deferred.Deferred<void>>>;\n\nexport interface EnsureContainerDeps {\n\t/** Current engine cycle id; stamped as the `devstack.cycle` label. */\n\treadonly cycle: number;\n\t/** Process-local lock holder to serialize per-name actions within\n\t * one Node process. Cross-process safety is the docker daemon's\n\t * `--name` atomicity. */\n\treadonly perNameLock: Ref.Ref<PerNameLockState>;\n}\n\n/** Per-name lock acquire/release. The in-process serialization is the\n * inspect→action window's invariant: two concurrent ensureContainer\n * calls for the same name must not race between the read (inspect)\n * and the write (create / start / recreate). Cross-process safety is\n * separately the docker daemon's `--name` atomicity.\n *\n * Implementation: a `Ref<Map<name, Deferred[]>>`. Acquire atomically\n * claims the slot (free → enter with empty queue) or enqueues a fresh\n * Deferred at the tail and awaits it. Release pops the head of the\n * queue and completes that waiter — transferring ownership without a\n * free intermediate window. Empty-queue release deletes the entry.\n * No wall-clock polling: contention parks fibers on Deferred.await\n * rather than spinning, so tests can use `it.effect` (TestClock) and\n * contended-acquire ordering is FIFO by construction.\n *\n * Exported for direct testing. */\nexport const acquirePerNameLock = (\n\tlock: Ref.Ref<PerNameLockState>,\n\tname: string,\n): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tconst waiter = yield* Deferred.make<void>();\n\t\tconst claimed = yield* Ref.modify(lock, (m) => {\n\t\t\tconst queue = m.get(name);\n\t\t\tconst next = new Map(m);\n\t\t\tif (queue === undefined) {\n\t\t\t\t// Free → claim with empty waiter queue.\n\t\t\t\tnext.set(name, []);\n\t\t\t\treturn [true, next as PerNameLockState] as const;\n\t\t\t}\n\t\t\t// Held → enqueue and await.\n\t\t\tnext.set(name, [...queue, waiter]);\n\t\t\treturn [false, next as PerNameLockState] as const;\n\t\t});\n\t\tif (claimed) return;\n\t\t// Park until the current holder releases and completes our\n\t\t// deferred. Interrupt-cleanup: if we're interrupted while\n\t\t// queued, drop our deferred from the queue so a future\n\t\t// release doesn't transfer ownership to a dead waiter.\n\t\tyield* Deferred.await(waiter).pipe(\n\t\t\tEffect.onInterrupt(() =>\n\t\t\t\tRef.update(lock, (m) => {\n\t\t\t\t\tconst queue = m.get(name);\n\t\t\t\t\tif (queue === undefined) return m;\n\t\t\t\t\tconst filtered = queue.filter((d) => d !== waiter);\n\t\t\t\t\tif (filtered.length === queue.length) return m;\n\t\t\t\t\tconst next = new Map(m);\n\t\t\t\t\tnext.set(name, filtered);\n\t\t\t\t\treturn next as PerNameLockState;\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t});\n\nexport const releasePerNameLock = (\n\tlock: Ref.Ref<PerNameLockState>,\n\tname: string,\n): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tconst head = yield* Ref.modify(lock, (m) => {\n\t\t\tconst queue = m.get(name);\n\t\t\tif (queue === undefined) return [undefined, m] as const;\n\t\t\tconst next = new Map(m);\n\t\t\tif (queue.length === 0) {\n\t\t\t\tnext.delete(name);\n\t\t\t\treturn [undefined, next as PerNameLockState] as const;\n\t\t\t}\n\t\t\tconst [first, ...rest] = queue;\n\t\t\tnext.set(name, rest);\n\t\t\treturn [first, next as PerNameLockState] as const;\n\t\t});\n\t\tif (head !== undefined) {\n\t\t\tyield* Deferred.succeed(head, undefined);\n\t\t}\n\t});\n\n/** Idempotent ensure: apply the state machine, register a scope\n * finalizer that stops the container + releases the cross-process\n * claim.\n *\n * Returns the running container handle (id + name + status + ips). */\nexport const ensureContainer = (\n\tspec: EnsureContainerSpec,\n\tdeps: EnsureContainerDeps,\n): Effect.Effect<\n\tContainerHandle,\n\tDockerRuntimeError,\n\tDockerHost | DockerSpawner | StackPathsService | Scope.Scope\n> =>\n\tEffect.gen(function* () {\n\t\t// Per-name lock holds the inspect → applyAction window. We release\n\t\t// immediately after applyAction returns (success or typed failure)\n\t\t// so concurrent callers for the SAME name serialize at the\n\t\t// \"decide what to do\" step, but the lock does not outlive the\n\t\t// state-machine resolution. `acquireUseRelease` ensures the\n\t\t// release fires on interrupt/defect too.\n\t\tconst desiredImageRef = spec.image.tag ?? spec.image.digest;\n\t\tconst id = yield* Effect.acquireUseRelease(\n\t\t\tacquirePerNameLock(deps.perNameLock, spec.name),\n\t\t\t() =>\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst facts = yield* inspectContainer(spec.name);\n\t\t\t\t\tif (facts !== null) {\n\t\t\t\t\t\tyield* assertOwnedFacts(spec.name, facts, spec.labels);\n\t\t\t\t\t}\n\t\t\t\t\tconst action = decideRunAction(\n\t\t\t\t\t\tfacts,\n\t\t\t\t\t\tdesiredImageRef,\n\t\t\t\t\t\tspec.recreate,\n\t\t\t\t\t\tcanonicalPortBindings(spec.ports),\n\t\t\t\t\t\tspec.portBindingReconciliation ?? 'exact',\n\t\t\t\t\t\tspec.configHash,\n\t\t\t\t\t\tspec.image.digest,\n\t\t\t\t\t);\n\t\t\t\t\tconst id = yield* applyAction(action, spec, deps);\n\t\t\t\t\treturn yield* ensureEffectivePublishedPorts(id, spec, deps);\n\t\t\t\t}),\n\t\t\t() => releasePerNameLock(deps.perNameLock, spec.name),\n\t\t);\n\t\tyield* assertContainerHandleOwned({\n\t\t\tid,\n\t\t\tname: spec.name,\n\t\t\tlabels: spec.labels,\n\t\t\timageName: spec.image.tag ?? spec.image.digest,\n\t\t\tstatus: 'running',\n\t\t\tips: [],\n\t\t});\n\n\t\t// Architecture §5 — secondary network attaches (any beyond the\n\t\t// first, which is wired in via `--network` on create) must wait\n\t\t// for IP allocation before we declare ready.\n\t\tconst secondaries = (spec.networkAttach ?? []).slice(1);\n\t\tfor (const net of secondaries) {\n\t\t\tyield* connect(spec.name, net);\n\t\t\tyield* waitForIp(spec.name, net);\n\t\t}\n\n\t\tconst ips = yield* readIps(spec.name);\n\t\tconst refreshedFacts = yield* inspectContainer(spec.name);\n\t\tconst ports = refreshedFacts?.effectivePorts ?? refreshedFacts?.ports ?? spec.ports;\n\n\t\t// Register cross-process claim and scope-bound release. The\n\t\t// stop finalizer fires on scope close if the same container id\n\t\t// still owns the stable name. Restore may deliberately remove a\n\t\t// claimed container and a later acquire may reuse the name before\n\t\t// this scope closes; the old finalizer must not stop that newer\n\t\t// container. Architecture §13: stop is uninterruptible.\n\t\tconst paths = yield* StackPathsService;\n\t\tconst mapSubstrateError = (cause: unknown): DockerRuntimeError =>\n\t\t\tnew DaemonUnreachable({\n\t\t\t\top: 'cross-process.claim',\n\t\t\t\tdetail: `cross-process claim mutation failed: ${String(cause)}`,\n\t\t\t\tcause,\n\t\t\t});\n\t\tyield* addClaim(\n\t\t\t{ stackLockFile: paths.stackLockFile, rosterFile: paths.rosterFile },\n\t\t\tspec.name,\n\t\t).pipe(Effect.mapError(mapSubstrateError));\n\n\t\tyield* Effect.addFinalizer(() =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst current = yield* inspectContainer(spec.name).pipe(\n\t\t\t\t\tEffect.catch(() => Effect.succeed(null)),\n\t\t\t\t);\n\t\t\t\tif (current?.id === id) {\n\t\t\t\t\tyield* stopWithGrace(spec.name, spec.stopGraceSeconds ?? 10);\n\t\t\t\t}\n\t\t\t\tyield* removeClaim(\n\t\t\t\t\t{ stackLockFile: paths.stackLockFile, rosterFile: paths.rosterFile },\n\t\t\t\t\tspec.name,\n\t\t\t\t).pipe(Effect.catch(() => Effect.succeed({ lastClaimReleased: false })));\n\t\t\t}).pipe(Effect.uninterruptible),\n\t\t);\n\n\t\treturn handleOf(\n\t\t\tid,\n\t\t\tspec.name,\n\t\t\tspec.image.tag ?? spec.image.digest,\n\t\t\t'running',\n\t\t\tips,\n\t\t\tports,\n\t\t\tspec.labels,\n\t\t);\n\t}).pipe(Effect.withSpan('runtime.docker.container.ensure'));\n\n/** Apply the decided action. Recovers from name-collision via\n * one-shot start-and-adopt; second collision surfaces typed. */\nconst applyAction = (\n\taction: RunAction,\n\tspec: EnsureContainerSpec,\n\tdeps: EnsureContainerDeps,\n): Effect.Effect<string, DockerRuntimeError, DockerHost | DockerSpawner | Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tswitch (action.kind) {\n\t\t\tcase 'adopt':\n\t\t\t\treturn action.id;\n\t\t\tcase 'unpause-adopt':\n\t\t\t\tyield* assertContainerHandleOwned({\n\t\t\t\t\tid: action.id,\n\t\t\t\t\tname: spec.name,\n\t\t\t\t\tlabels: spec.labels,\n\t\t\t\t\timageName: spec.image.tag ?? spec.image.digest,\n\t\t\t\t\tstatus: 'paused',\n\t\t\t\t\tips: [],\n\t\t\t\t});\n\t\t\t\tyield* unpause(spec.name);\n\t\t\t\treturn action.id;\n\t\t\tcase 'resume': {\n\t\t\t\tyield* assertContainerHandleOwned({\n\t\t\t\t\tid: action.id,\n\t\t\t\t\tname: spec.name,\n\t\t\t\t\tlabels: spec.labels,\n\t\t\t\t\timageName: spec.image.tag ?? spec.image.digest,\n\t\t\t\t\tstatus: 'exited',\n\t\t\t\t\tips: [],\n\t\t\t\t});\n\t\t\t\tconst started = yield* resumeStart(spec.name);\n\t\t\t\tif (!started.ok) {\n\t\t\t\t\treturn yield* recreateAfterResumeFailure(action.id, spec, deps);\n\t\t\t\t}\n\t\t\t\treturn action.id;\n\t\t\t}\n\t\t\tcase 'recreate': {\n\t\t\t\tyield* forceRemoveOwned(spec.name, action.id, spec.labels);\n\t\t\t\treturn yield* createWithCollisionRecovery(spec, deps);\n\t\t\t}\n\t\t\tcase 'fresh':\n\t\t\t\treturn yield* createWithCollisionRecovery(spec, deps);\n\t\t\tcase 'refuse':\n\t\t\t\treturn yield* Effect.fail(new RecreateRefused({ name: spec.name, reason: action.reason }));\n\t\t}\n\t});\n\n/** `docker run -d` with single-shot start-and-adopt fallback on\n * name-collision. */\nconst createWithCollisionRecovery = (\n\tspec: EnsureContainerSpec,\n\tdeps: EnsureContainerDeps,\n): Effect.Effect<string, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tfreshCreate(spec, deps.cycle).pipe(\n\t\tEffect.catchTag('ContainerNameCollisionUnrecoverable', () =>\n\t\t\tstartAndAdopt(spec.name, spec.labels),\n\t\t),\n\t\t// If the original create surfaced a typed `ContainerCreateFailed`\n\t\t// where stderr was name-collision (sometimes the create variant\n\t\t// surfaces with that), attempt the same start-and-adopt.\n\t\tEffect.catchTag('ContainerCreateFailed', (err) =>\n\t\t\tisNameCollisionStderr(err.stderr) ? startAndAdopt(spec.name, spec.labels) : Effect.fail(err),\n\t\t),\n\t);\n\n// -----------------------------------------------------------------------------\n// Stop / commit / pause — used by the snapshot orchestrator\n// -----------------------------------------------------------------------------\n\nexport const stop = (\n\tname: string,\n\tgraceSeconds: number,\n\tsignal?: string,\n): Effect.Effect<void, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tstopWithGrace(name, graceSeconds, signal).pipe(Effect.asVoid);\n\nexport const pause = (\n\tname: string,\n): Effect.Effect<void, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tyield* dockerRun('pause', [name]).pipe(Effect.mapError(wrapGeneric('docker.pause')));\n\t}).pipe(Effect.withSpan('runtime.docker.container.pause'));\n\nexport const unpause = (\n\tname: string,\n): Effect.Effect<void, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tyield* dockerRun('unpause', [name]).pipe(Effect.mapError(wrapGeneric('docker.unpause')));\n\t}).pipe(Effect.withSpan('runtime.docker.container.unpause'));\n\n/** `docker commit <name> <tag>` — writable layer → image. Used by\n * snapshot capture. */\nexport const commit = (\n\tname: string,\n\ttag: string,\n): Effect.Effect<string, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tconst res = yield* dockerRun('commit', [name, tag]).pipe(\n\t\t\tEffect.mapError(wrapGeneric('docker.commit')),\n\t\t);\n\t\tconst digest = res.stdout.trim();\n\t\tif (digest.length === 0) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew ContainerCreateFailed({\n\t\t\t\t\tname,\n\t\t\t\t\tstderr: 'commit returned empty digest',\n\t\t\t\t\texitCode: 0,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn digest;\n\t}).pipe(Effect.withSpan('runtime.docker.container.commit'));\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { Data } from "effect";
|
|
2
|
+
//#region src/runtime/docker/errors.ts
|
|
3
|
+
/** Daemon connection failure. The CLI returned the "Cannot connect to
|
|
4
|
+
* the Docker daemon" pattern, or the binary is missing. */
|
|
5
|
+
var DaemonUnreachable = class extends Data.TaggedError("DaemonUnreachable") {};
|
|
6
|
+
/** Image pull / inspect could not locate the requested image. */
|
|
7
|
+
var ImageNotFound = class extends Data.TaggedError("ImageNotFound") {};
|
|
8
|
+
/** `docker pull` non-zero exit (network / auth / unknown ref). */
|
|
9
|
+
var ImagePullFailed = class extends Data.TaggedError("ImagePullFailed") {};
|
|
10
|
+
/** `docker build` non-zero exit. `parsedStep` is best-effort —
|
|
11
|
+
* populated by `wrap.ts` when the build log surfaces a clear failing
|
|
12
|
+
* step line. */
|
|
13
|
+
var BuildFailed = class extends Data.TaggedError("BuildFailed") {};
|
|
14
|
+
/** `docker create` / `docker run -d` rejected; not a name collision. */
|
|
15
|
+
var ContainerCreateFailed = class extends Data.TaggedError("ContainerCreateFailed") {};
|
|
16
|
+
/** `docker run -d -p ...` lost the probe-to-publish race. */
|
|
17
|
+
var ContainerPortPublishConflict = class extends Data.TaggedError("ContainerPortPublishConflict") {};
|
|
18
|
+
/** Name-collision recovery exhausted: peer beat us and the
|
|
19
|
+
* start-and-adopt fallback ALSO failed. Architecture forbids the
|
|
20
|
+
* infinite-loop retry; one shot at adopt then surface this. */
|
|
21
|
+
var ContainerNameCollisionUnrecoverable = class extends Data.TaggedError("ContainerNameCollisionUnrecoverable") {};
|
|
22
|
+
Data.TaggedError("ContainerExited");
|
|
23
|
+
/** `docker rm -f` failed while deliberately replacing a managed
|
|
24
|
+
* container set. Unlike orphan sweep, restore cannot silently leave
|
|
25
|
+
* the old writable layer in place. */
|
|
26
|
+
var ContainerRemoveFailed = class extends Data.TaggedError("ContainerRemoveFailed") {};
|
|
27
|
+
/** Docker inspect failed for a reason other than "not found". */
|
|
28
|
+
var DockerInspectFailed = class extends Data.TaggedError("DockerInspectFailed") {};
|
|
29
|
+
/** Docker inspect returned malformed JSON or a shape outside the
|
|
30
|
+
* runtime's expected schema. */
|
|
31
|
+
var DockerInspectDecodeFailed = class extends Data.TaggedError("DockerInspectDecodeFailed") {};
|
|
32
|
+
/** A same-name Docker resource exists but is not owned by the expected
|
|
33
|
+
* devstack label tuple, so mutating it would cross stack/plugin
|
|
34
|
+
* boundaries. */
|
|
35
|
+
var ForeignDockerResource = class extends Data.TaggedError("ForeignDockerResource") {};
|
|
36
|
+
/** `docker network connect` / `network create` failure that isn't the
|
|
37
|
+
* idempotent "already exists in network" case. */
|
|
38
|
+
var NetworkOperationFailed = class extends Data.TaggedError("NetworkOperationFailed") {};
|
|
39
|
+
/** `docker network create` exhausted Docker's default bridge IPAM
|
|
40
|
+
* pools. This is not a daemon reachability failure; stale long-lived
|
|
41
|
+
* networks or missing explicit subnet/gateway policy are the usual
|
|
42
|
+
* causes. */
|
|
43
|
+
var NetworkAddressPoolExhausted = class extends Data.TaggedError("NetworkAddressPoolExhausted") {};
|
|
44
|
+
/** Container's IP on a secondary network was not allocated within the
|
|
45
|
+
* bounded poll budget. Architecture § Async network-connect. */
|
|
46
|
+
var NetworkIpReadbackTimeout = class extends Data.TaggedError("NetworkIpReadbackTimeout") {};
|
|
47
|
+
/** Volume create / inspect failed. */
|
|
48
|
+
var VolumeOperationFailed = class extends Data.TaggedError("VolumeOperationFailed") {};
|
|
49
|
+
/** Recreate was refused — the caller's `RecreatePolicy` was `never`
|
|
50
|
+
* but the lifecycle state machine concluded recreate was required
|
|
51
|
+
* (image/config mismatch, unclean exit, unknown state). Caller must explicitly opt
|
|
52
|
+
* in to a recreate to proceed (architecture G1 — Move-build-
|
|
53
|
+
* container's no-auto-recreate case). */
|
|
54
|
+
var RecreateRefused = class extends Data.TaggedError("RecreateRefused") {};
|
|
55
|
+
/** Generic exec / one-shot failure when the caller asked us to
|
|
56
|
+
* promote a non-zero exit. */
|
|
57
|
+
var ExecFailed = class extends Data.TaggedError("ExecFailed") {};
|
|
58
|
+
/** `docker save` failed — daemon error, missing image, or pipe failure
|
|
59
|
+
* draining stdout. */
|
|
60
|
+
var ImageSaveFailed = class extends Data.TaggedError("ImageSaveFailed") {};
|
|
61
|
+
/** `docker load` failed — corrupt tar, daemon error, or no `Loaded
|
|
62
|
+
* image:` line parsed from stdout. */
|
|
63
|
+
var ImageLoadFailed = class extends Data.TaggedError("ImageLoadFailed") {};
|
|
64
|
+
/** `docker tag` failed — source image missing or invalid tag string. */
|
|
65
|
+
var ImageTagFailed = class extends Data.TaggedError("ImageTagFailed") {};
|
|
66
|
+
/** `docker image rm` failed while removing managed snapshot/build
|
|
67
|
+
* byproducts. */
|
|
68
|
+
var ImageRemoveFailed = class extends Data.TaggedError("ImageRemoveFailed") {};
|
|
69
|
+
/** Project a typed `DockerRuntimeError` into the contract-shaped
|
|
70
|
+
* `ContainerRuntimeError`. The contract is intentionally narrow
|
|
71
|
+
* (`reason` is a closed enum); plugins that want the precise tag
|
|
72
|
+
* can `Effect.catchTag` against the typed errors BEFORE the contract
|
|
73
|
+
* projection runs. */
|
|
74
|
+
const toContractError = (err) => {
|
|
75
|
+
switch (err._tag) {
|
|
76
|
+
case "DaemonUnreachable": return {
|
|
77
|
+
_tag: "ContainerRuntimeError",
|
|
78
|
+
reason: "daemon-unreachable",
|
|
79
|
+
detail: err.detail
|
|
80
|
+
};
|
|
81
|
+
case "ImageNotFound": return {
|
|
82
|
+
_tag: "ContainerRuntimeError",
|
|
83
|
+
reason: "image-build-failed",
|
|
84
|
+
detail: `${err.ref}: ${err.detail}`
|
|
85
|
+
};
|
|
86
|
+
case "ImagePullFailed": return {
|
|
87
|
+
_tag: "ContainerRuntimeError",
|
|
88
|
+
reason: "image-build-failed",
|
|
89
|
+
detail: `pull ${err.ref} failed: ${err.stderr}`
|
|
90
|
+
};
|
|
91
|
+
case "BuildFailed": return {
|
|
92
|
+
_tag: "ContainerRuntimeError",
|
|
93
|
+
reason: "image-build-failed",
|
|
94
|
+
detail: err.parsedStep ?? err.stderr
|
|
95
|
+
};
|
|
96
|
+
case "ContainerCreateFailed":
|
|
97
|
+
case "ContainerNameCollisionUnrecoverable": return {
|
|
98
|
+
_tag: "ContainerRuntimeError",
|
|
99
|
+
reason: "name-collision",
|
|
100
|
+
detail: "detail" in err ? err.detail : err.stderr
|
|
101
|
+
};
|
|
102
|
+
case "ContainerPortPublishConflict": return {
|
|
103
|
+
_tag: "ContainerRuntimeError",
|
|
104
|
+
reason: "publish-port-conflict",
|
|
105
|
+
detail: `${err.name}: ${err.stderr}`
|
|
106
|
+
};
|
|
107
|
+
case "ContainerExited": return {
|
|
108
|
+
_tag: "ContainerRuntimeError",
|
|
109
|
+
reason: "ready-probe-failed",
|
|
110
|
+
detail: `${err.name} exited ${err.exitCode}: ${err.logTail}`
|
|
111
|
+
};
|
|
112
|
+
case "ContainerRemoveFailed": return {
|
|
113
|
+
_tag: "ContainerRuntimeError",
|
|
114
|
+
reason: "container-replace-failed",
|
|
115
|
+
detail: `${err.name}: ${err.stderr}`
|
|
116
|
+
};
|
|
117
|
+
case "DockerInspectFailed": return {
|
|
118
|
+
_tag: "ContainerRuntimeError",
|
|
119
|
+
reason: "docker-inspect-failed",
|
|
120
|
+
detail: `${err.resource} ${err.name}: ${err.stderr}`
|
|
121
|
+
};
|
|
122
|
+
case "DockerInspectDecodeFailed": return {
|
|
123
|
+
_tag: "ContainerRuntimeError",
|
|
124
|
+
reason: "docker-inspect-failed",
|
|
125
|
+
detail: `${err.resource} ${err.name}: ${err.detail}`
|
|
126
|
+
};
|
|
127
|
+
case "ForeignDockerResource": return {
|
|
128
|
+
_tag: "ContainerRuntimeError",
|
|
129
|
+
reason: "foreign-resource",
|
|
130
|
+
detail: `${err.resource} ${err.name}: ${err.detail}`
|
|
131
|
+
};
|
|
132
|
+
case "NetworkOperationFailed": return {
|
|
133
|
+
_tag: "ContainerRuntimeError",
|
|
134
|
+
reason: "daemon-unreachable",
|
|
135
|
+
detail: `network ${err.op} ${err.network}: ${err.stderr}`
|
|
136
|
+
};
|
|
137
|
+
case "NetworkAddressPoolExhausted": return {
|
|
138
|
+
_tag: "ContainerRuntimeError",
|
|
139
|
+
reason: "network-address-pool-exhausted",
|
|
140
|
+
detail: `network create ${err.network}: ${err.hint} stderr=${err.stderr}`
|
|
141
|
+
};
|
|
142
|
+
case "NetworkIpReadbackTimeout": return {
|
|
143
|
+
_tag: "ContainerRuntimeError",
|
|
144
|
+
reason: "ip-readback-timeout",
|
|
145
|
+
detail: `${err.container} on ${err.network} after ${err.waitedMillis}ms`
|
|
146
|
+
};
|
|
147
|
+
case "VolumeOperationFailed": return {
|
|
148
|
+
_tag: "ContainerRuntimeError",
|
|
149
|
+
reason: "daemon-unreachable",
|
|
150
|
+
detail: `volume ${err.op} ${err.volume}: ${err.stderr}`
|
|
151
|
+
};
|
|
152
|
+
case "RecreateRefused": return {
|
|
153
|
+
_tag: "ContainerRuntimeError",
|
|
154
|
+
reason: "recreate-refused",
|
|
155
|
+
detail: `${err.name}: ${err.reason}`
|
|
156
|
+
};
|
|
157
|
+
case "ExecFailed": return {
|
|
158
|
+
_tag: "ContainerRuntimeError",
|
|
159
|
+
reason: "ready-probe-failed",
|
|
160
|
+
detail: `exec ${err.name} exit ${err.exitCode}: ${err.stderr}`
|
|
161
|
+
};
|
|
162
|
+
case "ImageSaveFailed": return {
|
|
163
|
+
_tag: "ContainerRuntimeError",
|
|
164
|
+
reason: "image-save-failed",
|
|
165
|
+
detail: `${err.ref}: ${err.detail}`
|
|
166
|
+
};
|
|
167
|
+
case "ImageLoadFailed": return {
|
|
168
|
+
_tag: "ContainerRuntimeError",
|
|
169
|
+
reason: "image-load-failed",
|
|
170
|
+
detail: err.stderr !== void 0 ? `${err.detail}: ${err.stderr}` : err.detail
|
|
171
|
+
};
|
|
172
|
+
case "ImageTagFailed": return {
|
|
173
|
+
_tag: "ContainerRuntimeError",
|
|
174
|
+
reason: "image-tag-failed",
|
|
175
|
+
detail: `${err.src} → ${err.dst}: ${err.stderr}`
|
|
176
|
+
};
|
|
177
|
+
case "ImageRemoveFailed": return {
|
|
178
|
+
_tag: "ContainerRuntimeError",
|
|
179
|
+
reason: "image-remove-failed",
|
|
180
|
+
detail: `${err.ref}: ${err.stderr}`
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
//#endregion
|
|
185
|
+
export { BuildFailed, ContainerCreateFailed, ContainerNameCollisionUnrecoverable, ContainerPortPublishConflict, ContainerRemoveFailed, DaemonUnreachable, DockerInspectDecodeFailed, DockerInspectFailed, ExecFailed, ForeignDockerResource, ImageLoadFailed, ImageNotFound, ImagePullFailed, ImageRemoveFailed, ImageSaveFailed, ImageTagFailed, NetworkAddressPoolExhausted, NetworkIpReadbackTimeout, NetworkOperationFailed, RecreateRefused, VolumeOperationFailed, toContractError };
|
|
186
|
+
|
|
187
|
+
//# sourceMappingURL=errors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.mjs","names":[],"sources":["../../../src/runtime/docker/errors.ts"],"sourcesContent":["// Docker runtime — typed error envelopes.\n//\n// Architecture inverts the legacy \"stderr-pattern wording\" coupling:\n// the public surface speaks in typed errors (`ImageNotFound`,\n// `BuildFailed`, …); raw `CaptureError`s from the subprocess seam\n// are translated by `wrap.ts` into these envelopes.\n//\n// Every error is `Data.TaggedError` so callers can `Effect.catchTag`\n// the precise failure mode.\n\nimport { Data } from 'effect';\n\nimport type { ContainerRuntimeError } from '../../contracts/container-runtime.ts';\n\n/** Daemon connection failure. The CLI returned the \"Cannot connect to\n * the Docker daemon\" pattern, or the binary is missing. */\nexport class DaemonUnreachable extends Data.TaggedError('DaemonUnreachable')<{\n\treadonly op: string;\n\treadonly detail: string;\n\treadonly cause?: unknown;\n}> {}\n\n/** Image pull / inspect could not locate the requested image. */\nexport class ImageNotFound extends Data.TaggedError('ImageNotFound')<{\n\treadonly ref: string;\n\treadonly detail: string;\n}> {}\n\n/** `docker pull` non-zero exit (network / auth / unknown ref). */\nexport class ImagePullFailed extends Data.TaggedError('ImagePullFailed')<{\n\treadonly ref: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | undefined;\n}> {}\n\n/** `docker build` non-zero exit. `parsedStep` is best-effort —\n * populated by `wrap.ts` when the build log surfaces a clear failing\n * step line. */\nexport class BuildFailed extends Data.TaggedError('BuildFailed')<{\n\treadonly contextPath: string;\n\treadonly dockerfile: string | undefined;\n\treadonly stderr: string;\n\treadonly parsedStep?: string;\n\treadonly exitCode: number | undefined;\n}> {}\n\n/** `docker create` / `docker run -d` rejected; not a name collision. */\nexport class ContainerCreateFailed extends Data.TaggedError('ContainerCreateFailed')<{\n\treadonly name: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | undefined;\n}> {}\n\n/** `docker run -d -p ...` lost the probe-to-publish race. */\nexport class ContainerPortPublishConflict extends Data.TaggedError('ContainerPortPublishConflict')<{\n\treadonly name: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | undefined;\n}> {}\n\n/** Name-collision recovery exhausted: peer beat us and the\n * start-and-adopt fallback ALSO failed. Architecture forbids the\n * infinite-loop retry; one shot at adopt then surface this. */\nexport class ContainerNameCollisionUnrecoverable extends Data.TaggedError(\n\t'ContainerNameCollisionUnrecoverable',\n)<{\n\treadonly name: string;\n\treadonly detail: string;\n}> {}\n\n/** Container exited (non-zero or unexpected) during the run. */\nexport class ContainerExited extends Data.TaggedError('ContainerExited')<{\n\treadonly name: string;\n\treadonly exitCode: number;\n\treadonly logTail: string;\n}> {}\n\n/** `docker rm -f` failed while deliberately replacing a managed\n * container set. Unlike orphan sweep, restore cannot silently leave\n * the old writable layer in place. */\nexport class ContainerRemoveFailed extends Data.TaggedError('ContainerRemoveFailed')<{\n\treadonly name: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | undefined;\n}> {}\n\nexport type DockerResourceKind = 'container' | 'network' | 'volume';\n\n/** Docker inspect failed for a reason other than \"not found\". */\nexport class DockerInspectFailed extends Data.TaggedError('DockerInspectFailed')<{\n\treadonly resource: DockerResourceKind;\n\treadonly name: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | undefined;\n}> {}\n\n/** Docker inspect returned malformed JSON or a shape outside the\n * runtime's expected schema. */\nexport class DockerInspectDecodeFailed extends Data.TaggedError('DockerInspectDecodeFailed')<{\n\treadonly resource: DockerResourceKind;\n\treadonly name: string;\n\treadonly detail: string;\n\treadonly cause?: unknown;\n}> {}\n\n/** A same-name Docker resource exists but is not owned by the expected\n * devstack label tuple, so mutating it would cross stack/plugin\n * boundaries. */\nexport class ForeignDockerResource extends Data.TaggedError('ForeignDockerResource')<{\n\treadonly resource: DockerResourceKind;\n\treadonly name: string;\n\treadonly expected: Readonly<Record<string, string>>;\n\treadonly actual: Readonly<Record<string, string>>;\n\treadonly detail: string;\n}> {}\n\n/** `docker network connect` / `network create` failure that isn't the\n * idempotent \"already exists in network\" case. */\nexport class NetworkOperationFailed extends Data.TaggedError('NetworkOperationFailed')<{\n\treadonly op: 'create' | 'connect' | 'disconnect' | 'inspect' | 'remove';\n\treadonly network: string;\n\treadonly stderr: string;\n}> {}\n\n/** `docker network create` exhausted Docker's default bridge IPAM\n * pools. This is not a daemon reachability failure; stale long-lived\n * networks or missing explicit subnet/gateway policy are the usual\n * causes. */\nexport class NetworkAddressPoolExhausted extends Data.TaggedError('NetworkAddressPoolExhausted')<{\n\treadonly network: string;\n\treadonly stderr: string;\n\treadonly hint: string;\n}> {}\n\n/** Container's IP on a secondary network was not allocated within the\n * bounded poll budget. Architecture § Async network-connect. */\nexport class NetworkIpReadbackTimeout extends Data.TaggedError('NetworkIpReadbackTimeout')<{\n\treadonly container: string;\n\treadonly network: string;\n\treadonly waitedMillis: number;\n}> {}\n\n/** Volume create / inspect failed. */\nexport class VolumeOperationFailed extends Data.TaggedError('VolumeOperationFailed')<{\n\treadonly op: 'create' | 'inspect' | 'remove';\n\treadonly volume: string;\n\treadonly stderr: string;\n}> {}\n\n/** Recreate was refused — the caller's `RecreatePolicy` was `never`\n * but the lifecycle state machine concluded recreate was required\n * (image/config mismatch, unclean exit, unknown state). Caller must explicitly opt\n * in to a recreate to proceed (architecture G1 — Move-build-\n * container's no-auto-recreate case). */\nexport class RecreateRefused extends Data.TaggedError('RecreateRefused')<{\n\treadonly name: string;\n\treadonly reason:\n\t\t| 'image-mismatch'\n\t\t| 'config-mismatch'\n\t\t| 'unclean-shutdown'\n\t\t| 'resume-failed'\n\t\t| 'unknown-state';\n}> {}\n\n/** Generic exec / one-shot failure when the caller asked us to\n * promote a non-zero exit. */\nexport class ExecFailed extends Data.TaggedError('ExecFailed')<{\n\treadonly name: string;\n\treadonly argv: ReadonlyArray<string>;\n\treadonly exitCode: number;\n\treadonly stderr: string;\n}> {}\n\n/** `docker save` failed — daemon error, missing image, or pipe failure\n * draining stdout. */\nexport class ImageSaveFailed extends Data.TaggedError('ImageSaveFailed')<{\n\treadonly ref: string;\n\treadonly detail: string;\n\treadonly cause?: unknown;\n}> {}\n\n/** `docker load` failed — corrupt tar, daemon error, or no `Loaded\n * image:` line parsed from stdout. */\nexport class ImageLoadFailed extends Data.TaggedError('ImageLoadFailed')<{\n\treadonly detail: string;\n\treadonly stderr?: string;\n\treadonly cause?: unknown;\n}> {}\n\n/** `docker tag` failed — source image missing or invalid tag string. */\nexport class ImageTagFailed extends Data.TaggedError('ImageTagFailed')<{\n\treadonly src: string;\n\treadonly dst: string;\n\treadonly stderr: string;\n}> {}\n\n/** `docker image rm` failed while removing managed snapshot/build\n * byproducts. */\nexport class ImageRemoveFailed extends Data.TaggedError('ImageRemoveFailed')<{\n\treadonly ref: string;\n\treadonly stderr: string;\n\treadonly exitCode: number | undefined;\n}> {}\n\n/** Union of every docker-runtime typed error. */\nexport type DockerRuntimeError =\n\t| DaemonUnreachable\n\t| ImageNotFound\n\t| ImagePullFailed\n\t| BuildFailed\n\t| ContainerCreateFailed\n\t| ContainerPortPublishConflict\n\t| ContainerNameCollisionUnrecoverable\n\t| ContainerExited\n\t| ContainerRemoveFailed\n\t| DockerInspectFailed\n\t| DockerInspectDecodeFailed\n\t| ForeignDockerResource\n\t| NetworkOperationFailed\n\t| NetworkAddressPoolExhausted\n\t| NetworkIpReadbackTimeout\n\t| VolumeOperationFailed\n\t| RecreateRefused\n\t| ExecFailed\n\t| ImageSaveFailed\n\t| ImageLoadFailed\n\t| ImageTagFailed\n\t| ImageRemoveFailed;\n\n/** Project a typed `DockerRuntimeError` into the contract-shaped\n * `ContainerRuntimeError`. The contract is intentionally narrow\n * (`reason` is a closed enum); plugins that want the precise tag\n * can `Effect.catchTag` against the typed errors BEFORE the contract\n * projection runs. */\nexport const toContractError = (err: DockerRuntimeError): ContainerRuntimeError => {\n\tswitch (err._tag) {\n\t\tcase 'DaemonUnreachable':\n\t\t\treturn { _tag: 'ContainerRuntimeError', reason: 'daemon-unreachable', detail: err.detail };\n\t\tcase 'ImageNotFound':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'image-build-failed',\n\t\t\t\tdetail: `${err.ref}: ${err.detail}`,\n\t\t\t};\n\t\tcase 'ImagePullFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'image-build-failed',\n\t\t\t\tdetail: `pull ${err.ref} failed: ${err.stderr}`,\n\t\t\t};\n\t\tcase 'BuildFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'image-build-failed',\n\t\t\t\tdetail: err.parsedStep ?? err.stderr,\n\t\t\t};\n\t\tcase 'ContainerCreateFailed':\n\t\tcase 'ContainerNameCollisionUnrecoverable':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'name-collision',\n\t\t\t\tdetail: 'detail' in err ? err.detail : err.stderr,\n\t\t\t};\n\t\tcase 'ContainerPortPublishConflict':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'publish-port-conflict',\n\t\t\t\tdetail: `${err.name}: ${err.stderr}`,\n\t\t\t};\n\t\tcase 'ContainerExited':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'ready-probe-failed',\n\t\t\t\tdetail: `${err.name} exited ${err.exitCode}: ${err.logTail}`,\n\t\t\t};\n\t\tcase 'ContainerRemoveFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'container-replace-failed',\n\t\t\t\tdetail: `${err.name}: ${err.stderr}`,\n\t\t\t};\n\t\tcase 'DockerInspectFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'docker-inspect-failed',\n\t\t\t\tdetail: `${err.resource} ${err.name}: ${err.stderr}`,\n\t\t\t};\n\t\tcase 'DockerInspectDecodeFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'docker-inspect-failed',\n\t\t\t\tdetail: `${err.resource} ${err.name}: ${err.detail}`,\n\t\t\t};\n\t\tcase 'ForeignDockerResource':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'foreign-resource',\n\t\t\t\tdetail: `${err.resource} ${err.name}: ${err.detail}`,\n\t\t\t};\n\t\tcase 'NetworkOperationFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'daemon-unreachable',\n\t\t\t\tdetail: `network ${err.op} ${err.network}: ${err.stderr}`,\n\t\t\t};\n\t\tcase 'NetworkAddressPoolExhausted':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'network-address-pool-exhausted',\n\t\t\t\tdetail: `network create ${err.network}: ${err.hint} stderr=${err.stderr}`,\n\t\t\t};\n\t\tcase 'NetworkIpReadbackTimeout':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'ip-readback-timeout',\n\t\t\t\tdetail: `${err.container} on ${err.network} after ${err.waitedMillis}ms`,\n\t\t\t};\n\t\tcase 'VolumeOperationFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'daemon-unreachable',\n\t\t\t\tdetail: `volume ${err.op} ${err.volume}: ${err.stderr}`,\n\t\t\t};\n\t\tcase 'RecreateRefused':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'recreate-refused',\n\t\t\t\tdetail: `${err.name}: ${err.reason}`,\n\t\t\t};\n\t\tcase 'ExecFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'ready-probe-failed',\n\t\t\t\tdetail: `exec ${err.name} exit ${err.exitCode}: ${err.stderr}`,\n\t\t\t};\n\t\tcase 'ImageSaveFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'image-save-failed',\n\t\t\t\tdetail: `${err.ref}: ${err.detail}`,\n\t\t\t};\n\t\tcase 'ImageLoadFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'image-load-failed',\n\t\t\t\tdetail: err.stderr !== undefined ? `${err.detail}: ${err.stderr}` : err.detail,\n\t\t\t};\n\t\tcase 'ImageTagFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'image-tag-failed',\n\t\t\t\tdetail: `${err.src} → ${err.dst}: ${err.stderr}`,\n\t\t\t};\n\t\tcase 'ImageRemoveFailed':\n\t\t\treturn {\n\t\t\t\t_tag: 'ContainerRuntimeError',\n\t\t\t\treason: 'image-remove-failed',\n\t\t\t\tdetail: `${err.ref}: ${err.stderr}`,\n\t\t\t};\n\t}\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { Effect, Scope } from "effect";
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { dockerRunOk } from "./client.mjs";
|
|
2
|
+
import { DaemonUnreachable, ExecFailed } from "./errors.mjs";
|
|
3
|
+
import { wrapGeneric } from "./wrap.mjs";
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
//#region src/runtime/docker/exec.ts
|
|
7
|
+
/** `docker exec [-u user] [-w workdir] [-e k=v]... <name> <argv...>`. */
|
|
8
|
+
const dockerExec = (containerNameOrId, argv, opts = {}) => Effect.gen(function* () {
|
|
9
|
+
const args = [];
|
|
10
|
+
if (opts.user) args.push("--user", opts.user);
|
|
11
|
+
if (opts.workdir) args.push("--workdir", opts.workdir);
|
|
12
|
+
if (opts.env) for (const [k, v] of Object.entries(opts.env)) args.push("--env", `${k}=${v}`);
|
|
13
|
+
args.push(containerNameOrId, ...argv);
|
|
14
|
+
const res = yield* dockerRunOk("exec", args, {
|
|
15
|
+
onStdoutLine: opts.onStdoutLine,
|
|
16
|
+
onStderrLine: opts.onStderrLine
|
|
17
|
+
}).pipe(Effect.mapError(wrapGeneric("docker.exec")));
|
|
18
|
+
if (opts.failOnNonZero && res.exitCode !== 0) return yield* Effect.fail(new ExecFailed({
|
|
19
|
+
name: containerNameOrId,
|
|
20
|
+
argv,
|
|
21
|
+
exitCode: res.exitCode,
|
|
22
|
+
stderr: res.stderr
|
|
23
|
+
}));
|
|
24
|
+
return res;
|
|
25
|
+
}).pipe(Effect.withSpan("runtime.docker.exec"));
|
|
26
|
+
/** `docker run --rm [-name <n>] [-e ...] [--mount ...] [--network n]
|
|
27
|
+
* [--entrypoint e] [--label ...] <image> <argv...>`.
|
|
28
|
+
*
|
|
29
|
+
* Belt-and-suspenders: when `keep` is false, a Scope finalizer fires
|
|
30
|
+
* `docker rm -f <name>` to catch containers that outlived the
|
|
31
|
+
* foreground subprocess on the timeout path. */
|
|
32
|
+
const dockerRunOneShot = (opts) => Effect.gen(function* () {
|
|
33
|
+
const args = [];
|
|
34
|
+
if (!opts.keep) args.push("--rm");
|
|
35
|
+
const name = opts.name ?? `devstack-oneshot-${Date.now()}-${randomUUID().replace(/-/g, "").slice(0, 8)}`;
|
|
36
|
+
args.push("--name", name);
|
|
37
|
+
if (opts.network) args.push("--network", opts.network);
|
|
38
|
+
if (opts.entrypoint) args.push("--entrypoint", opts.entrypoint);
|
|
39
|
+
if (opts.user) args.push("--user", opts.user);
|
|
40
|
+
if (opts.env) for (const [k, v] of Object.entries(opts.env)) args.push("--env", `${k}=${v}`);
|
|
41
|
+
if (opts.mounts) for (const m of opts.mounts) {
|
|
42
|
+
const ro = m.readonly ? ",readonly" : "";
|
|
43
|
+
args.push("--mount", `type=bind,source=${m.source},target=${m.target}${ro}`);
|
|
44
|
+
}
|
|
45
|
+
if (opts.labels) for (const l of opts.labels) args.push("--label", l);
|
|
46
|
+
if (opts.extraHosts) for (const [host, ip] of Object.entries(opts.extraHosts)) args.push("--add-host", `${host}:${ip}`);
|
|
47
|
+
args.push(opts.image);
|
|
48
|
+
if (opts.argv) args.push(...opts.argv);
|
|
49
|
+
if (!opts.keep) yield* Effect.addFinalizer(() => dockerRunOk("rm", ["-f", name]).pipe(Effect.catch(() => Effect.void), Effect.asVoid));
|
|
50
|
+
const baseInvocation = dockerRunOk("run", args, {
|
|
51
|
+
onStdoutLine: opts.onStdoutLine,
|
|
52
|
+
onStderrLine: opts.onStderrLine
|
|
53
|
+
}).pipe(Effect.mapError(wrapGeneric("docker.run-oneshot")));
|
|
54
|
+
if (opts.timeoutMillis !== void 0) return yield* baseInvocation.pipe(Effect.timeout(`${opts.timeoutMillis} millis`), Effect.catchTag("TimeoutError", () => Effect.fail(new DaemonUnreachable({
|
|
55
|
+
op: "docker.run-oneshot",
|
|
56
|
+
detail: `one-shot timed out after ${opts.timeoutMillis}ms`
|
|
57
|
+
}))));
|
|
58
|
+
return yield* baseInvocation;
|
|
59
|
+
}).pipe(Effect.withSpan("runtime.docker.oneShot"));
|
|
60
|
+
//#endregion
|
|
61
|
+
export { dockerExec, dockerRunOneShot };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=exec.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.mjs","names":[],"sources":["../../../src/runtime/docker/exec.ts"],"sourcesContent":["// One-shot `docker exec` and `docker run --rm`.\n//\n// Architecture:\n// - `dockerExec` invokes inside an already-running long-lived\n// container; captures stdout/stderr/exitCode.\n// - `dockerRunOneShot` is for `docker run --rm` style invocation —\n// a transient container that runs to completion.\n// - Wall-clock timeout with SIGTERM-then-SIGKILL escalation is\n// scoped at the L0 capture level via `Effect.timeout`; the\n// belt-and-suspenders `rm -f` is registered as a finalizer so a\n// timed-out container that outlived its foreground subprocess is\n// still reaped.\n\nimport { randomUUID } from 'node:crypto';\n\nimport { Effect, Scope } from 'effect';\n\nimport type {\n\tCaptureOptions,\n\tCaptureResult,\n} from '../../substrate/runtime/observability/subprocess-capture.ts';\nimport { DockerHost, DockerSpawner, dockerRunOk } from './client.ts';\nimport { DaemonUnreachable, type DockerRuntimeError, ExecFailed } from './errors.ts';\nimport { wrapGeneric } from './wrap.ts';\n\n// -----------------------------------------------------------------------------\n// Exec — into a running container\n// -----------------------------------------------------------------------------\n\nexport interface DockerExecOptions {\n\treadonly user?: string;\n\treadonly env?: Readonly<Record<string, string>>;\n\treadonly workdir?: string;\n\treadonly onStdoutLine?: (line: string) => Effect.Effect<void>;\n\treadonly onStderrLine?: (line: string) => Effect.Effect<void>;\n\t/** Promote non-zero exit to `ExecFailed`. Default false; the caller\n\t * gets the full result and decides. */\n\treadonly failOnNonZero?: boolean;\n}\n\nexport interface DockerExecResult {\n\treadonly exitCode: number;\n\treadonly stdout: string;\n\treadonly stderr: string;\n}\n\n/** `docker exec [-u user] [-w workdir] [-e k=v]... <name> <argv...>`. */\nexport const dockerExec = (\n\tcontainerNameOrId: string,\n\targv: ReadonlyArray<string>,\n\topts: DockerExecOptions = {},\n): Effect.Effect<DockerExecResult, DockerRuntimeError, DockerHost | DockerSpawner> =>\n\tEffect.gen(function* () {\n\t\tconst args: Array<string> = [];\n\t\tif (opts.user) args.push('--user', opts.user);\n\t\tif (opts.workdir) args.push('--workdir', opts.workdir);\n\t\tif (opts.env) {\n\t\t\tfor (const [k, v] of Object.entries(opts.env)) {\n\t\t\t\targs.push('--env', `${k}=${v}`);\n\t\t\t}\n\t\t}\n\t\targs.push(containerNameOrId, ...argv);\n\t\tconst captureOpts: Omit<CaptureOptions, 'op' | 'nonZeroIsFailure'> = {\n\t\t\tonStdoutLine: opts.onStdoutLine,\n\t\t\tonStderrLine: opts.onStderrLine,\n\t\t};\n\t\tconst res = yield* dockerRunOk('exec', args, captureOpts).pipe(\n\t\t\tEffect.mapError(wrapGeneric('docker.exec')),\n\t\t);\n\t\tif (opts.failOnNonZero && res.exitCode !== 0) {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew ExecFailed({\n\t\t\t\t\tname: containerNameOrId,\n\t\t\t\t\targv,\n\t\t\t\t\texitCode: res.exitCode,\n\t\t\t\t\tstderr: res.stderr,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn res;\n\t}).pipe(Effect.withSpan('runtime.docker.exec'));\n\n// -----------------------------------------------------------------------------\n// One-shot — `docker run --rm`\n// -----------------------------------------------------------------------------\n\nexport interface DockerOneShotOptions {\n\treadonly name?: string;\n\treadonly image: string;\n\treadonly argv?: ReadonlyArray<string>;\n\treadonly env?: Readonly<Record<string, string>>;\n\treadonly mounts?: ReadonlyArray<{\n\t\treadonly source: string;\n\t\treadonly target: string;\n\t\treadonly readonly?: boolean;\n\t}>;\n\treadonly network?: string;\n\treadonly entrypoint?: string;\n\treadonly user?: string;\n\treadonly labels?: ReadonlyArray<string>;\n\t/** `--add-host <host>:<ip>` entries. See contract docs. */\n\treadonly extraHosts?: Readonly<Record<string, string>>;\n\treadonly onStdoutLine?: (line: string) => Effect.Effect<void>;\n\treadonly onStderrLine?: (line: string) => Effect.Effect<void>;\n\t/** Wall-clock timeout. After this the subprocess is killed; the\n\t * outer `rm -f` belt-and-suspenders finalizer catches any\n\t * container that survived the kill. */\n\treadonly timeoutMillis?: number;\n\t/** Keep the container after exit (forensic retention escape hatch).\n\t * When true, drops `--rm` AND the finalizer rm. */\n\treadonly keep?: boolean;\n}\n\n/** `docker run --rm [-name <n>] [-e ...] [--mount ...] [--network n]\n * [--entrypoint e] [--label ...] <image> <argv...>`.\n *\n * Belt-and-suspenders: when `keep` is false, a Scope finalizer fires\n * `docker rm -f <name>` to catch containers that outlived the\n * foreground subprocess on the timeout path. */\nexport const dockerRunOneShot = (\n\topts: DockerOneShotOptions,\n): Effect.Effect<CaptureResult, DockerRuntimeError, DockerHost | DockerSpawner | Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst args: Array<string> = [];\n\t\tif (!opts.keep) args.push('--rm');\n\t\tconst name =\n\t\t\topts.name ?? `devstack-oneshot-${Date.now()}-${randomUUID().replace(/-/g, '').slice(0, 8)}`;\n\t\targs.push('--name', name);\n\t\tif (opts.network) args.push('--network', opts.network);\n\t\tif (opts.entrypoint) args.push('--entrypoint', opts.entrypoint);\n\t\tif (opts.user) args.push('--user', opts.user);\n\t\tif (opts.env) {\n\t\t\tfor (const [k, v] of Object.entries(opts.env)) {\n\t\t\t\targs.push('--env', `${k}=${v}`);\n\t\t\t}\n\t\t}\n\t\tif (opts.mounts) {\n\t\t\tfor (const m of opts.mounts) {\n\t\t\t\tconst ro = m.readonly ? ',readonly' : '';\n\t\t\t\targs.push('--mount', `type=bind,source=${m.source},target=${m.target}${ro}`);\n\t\t\t}\n\t\t}\n\t\tif (opts.labels) {\n\t\t\tfor (const l of opts.labels) args.push('--label', l);\n\t\t}\n\t\tif (opts.extraHosts) {\n\t\t\tfor (const [host, ip] of Object.entries(opts.extraHosts)) {\n\t\t\t\targs.push('--add-host', `${host}:${ip}`);\n\t\t\t}\n\t\t}\n\t\targs.push(opts.image);\n\t\tif (opts.argv) args.push(...opts.argv);\n\n\t\t// Register the belt-and-suspenders rm finalizer BEFORE we\n\t\t// invoke. Even if the spawner blows up mid-flight, the\n\t\t// finalizer fires on scope close.\n\t\tif (!opts.keep) {\n\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\tdockerRunOk('rm', ['-f', name]).pipe(\n\t\t\t\t\tEffect.catch(() => Effect.void),\n\t\t\t\t\tEffect.asVoid,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tconst captureOpts: Omit<CaptureOptions, 'op' | 'nonZeroIsFailure'> = {\n\t\t\tonStdoutLine: opts.onStdoutLine,\n\t\t\tonStderrLine: opts.onStderrLine,\n\t\t};\n\t\tconst baseInvocation = dockerRunOk('run', args, captureOpts).pipe(\n\t\t\tEffect.mapError(wrapGeneric('docker.run-oneshot')),\n\t\t);\n\t\tif (opts.timeoutMillis !== undefined) {\n\t\t\t// Effect.timeout fails with a TimeoutError (Effect v4\n\t\t\t// renamed it from TimeoutException); collapse into our\n\t\t\t// daemon-unreachable envelope so the caller sees the same\n\t\t\t// shape they handle for any docker subprocess.\n\t\t\treturn yield* baseInvocation.pipe(\n\t\t\t\tEffect.timeout(`${opts.timeoutMillis} millis`),\n\t\t\t\tEffect.catchTag('TimeoutError', () =>\n\t\t\t\t\tEffect.fail(\n\t\t\t\t\t\tnew DaemonUnreachable({\n\t\t\t\t\t\t\top: 'docker.run-oneshot',\n\t\t\t\t\t\t\tdetail: `one-shot timed out after ${opts.timeoutMillis}ms`,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn yield* baseInvocation;\n\t}).pipe(Effect.withSpan('runtime.docker.oneShot'));\n"],"mappings":";;;;;;;AA+CA,MAAa,cACZ,mBACA,MACA,OAA0B,EAAE,KAE5B,OAAO,IAAI,aAAa;CACvB,MAAM,OAAsB,EAAE;AAC9B,KAAI,KAAK,KAAM,MAAK,KAAK,UAAU,KAAK,KAAK;AAC7C,KAAI,KAAK,QAAS,MAAK,KAAK,aAAa,KAAK,QAAQ;AACtD,KAAI,KAAK,IACR,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,IAAI,CAC5C,MAAK,KAAK,SAAS,GAAG,EAAE,GAAG,IAAI;AAGjC,MAAK,KAAK,mBAAmB,GAAG,KAAK;CAKrC,MAAM,MAAM,OAAO,YAAY,QAAQ,MAAM;EAH5C,cAAc,KAAK;EACnB,cAAc,KAAK;EAEoC,CAAC,CAAC,KACzD,OAAO,SAAS,YAAY,cAAc,CAAC,CAC3C;AACD,KAAI,KAAK,iBAAiB,IAAI,aAAa,EAC1C,QAAO,OAAO,OAAO,KACpB,IAAI,WAAW;EACd,MAAM;EACN;EACA,UAAU,IAAI;EACd,QAAQ,IAAI;EACZ,CAAC,CACF;AAEF,QAAO;EACN,CAAC,KAAK,OAAO,SAAS,sBAAsB,CAAC;;;;;;;AAuChD,MAAa,oBACZ,SAEA,OAAO,IAAI,aAAa;CACvB,MAAM,OAAsB,EAAE;AAC9B,KAAI,CAAC,KAAK,KAAM,MAAK,KAAK,OAAO;CACjC,MAAM,OACL,KAAK,QAAQ,oBAAoB,KAAK,KAAK,CAAC,GAAG,YAAY,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,GAAG,EAAE;AAC1F,MAAK,KAAK,UAAU,KAAK;AACzB,KAAI,KAAK,QAAS,MAAK,KAAK,aAAa,KAAK,QAAQ;AACtD,KAAI,KAAK,WAAY,MAAK,KAAK,gBAAgB,KAAK,WAAW;AAC/D,KAAI,KAAK,KAAM,MAAK,KAAK,UAAU,KAAK,KAAK;AAC7C,KAAI,KAAK,IACR,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,IAAI,CAC5C,MAAK,KAAK,SAAS,GAAG,EAAE,GAAG,IAAI;AAGjC,KAAI,KAAK,OACR,MAAK,MAAM,KAAK,KAAK,QAAQ;EAC5B,MAAM,KAAK,EAAE,WAAW,cAAc;AACtC,OAAK,KAAK,WAAW,oBAAoB,EAAE,OAAO,UAAU,EAAE,SAAS,KAAK;;AAG9E,KAAI,KAAK,OACR,MAAK,MAAM,KAAK,KAAK,OAAQ,MAAK,KAAK,WAAW,EAAE;AAErD,KAAI,KAAK,WACR,MAAK,MAAM,CAAC,MAAM,OAAO,OAAO,QAAQ,KAAK,WAAW,CACvD,MAAK,KAAK,cAAc,GAAG,KAAK,GAAG,KAAK;AAG1C,MAAK,KAAK,KAAK,MAAM;AACrB,KAAI,KAAK,KAAM,MAAK,KAAK,GAAG,KAAK,KAAK;AAKtC,KAAI,CAAC,KAAK,KACT,QAAO,OAAO,mBACb,YAAY,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,KAC/B,OAAO,YAAY,OAAO,KAAK,EAC/B,OAAO,OACP,CACD;CAOF,MAAM,iBAAiB,YAAY,OAAO,MAAM;EAH/C,cAAc,KAAK;EACnB,cAAc,KAAK;EAEuC,CAAC,CAAC,KAC5D,OAAO,SAAS,YAAY,qBAAqB,CAAC,CAClD;AACD,KAAI,KAAK,kBAAkB,KAAA,EAK1B,QAAO,OAAO,eAAe,KAC5B,OAAO,QAAQ,GAAG,KAAK,cAAc,SAAS,EAC9C,OAAO,SAAS,sBACf,OAAO,KACN,IAAI,kBAAkB;EACrB,IAAI;EACJ,QAAQ,4BAA4B,KAAK,cAAc;EACvD,CAAC,CACF,CACD,CACD;AAEF,QAAO,OAAO;EACb,CAAC,KAAK,OAAO,SAAS,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { Effect, Stream } from "effect";
|