@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,452 @@
|
|
|
1
|
+
import { checkHolderLiveness } from "../../../substrate/runtime/cross-process/liveness.mjs";
|
|
2
|
+
import { readRoster } from "../../../substrate/runtime/cross-process/roster.mjs";
|
|
3
|
+
import { routerProfileLabelsMatch, uniqueSortedEntrypointPorts } from "../../../orchestrators/router/traefik-container.mjs";
|
|
4
|
+
import { makeDefaultRouterProfile } from "../../../orchestrators/router/profile.mjs";
|
|
5
|
+
import { dispatchFileIdFromFilename, parseDispatchRouteFile } from "../../../orchestrators/router/file-provider.mjs";
|
|
6
|
+
import { BUILT_IN_ENTRYPOINTS } from "../../../plugins/router-entrypoints.mjs";
|
|
7
|
+
import { Effect } from "effect";
|
|
8
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
9
|
+
import { createConnection } from "node:net";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { execFileSync } from "node:child_process";
|
|
12
|
+
import { hostname } from "node:os";
|
|
13
|
+
//#region src/surfaces/cli/commands/doctor-probes.ts
|
|
14
|
+
const okOutcome = (detail) => detail !== void 0 ? {
|
|
15
|
+
status: "ok",
|
|
16
|
+
detail
|
|
17
|
+
} : { status: "ok" };
|
|
18
|
+
const captureCommand = (cmd, args, timeoutMs = 3e3) => {
|
|
19
|
+
try {
|
|
20
|
+
return {
|
|
21
|
+
ok: true,
|
|
22
|
+
out: execFileSync(cmd, args, {
|
|
23
|
+
encoding: "utf8",
|
|
24
|
+
timeout: timeoutMs,
|
|
25
|
+
stdio: [
|
|
26
|
+
"ignore",
|
|
27
|
+
"pipe",
|
|
28
|
+
"pipe"
|
|
29
|
+
]
|
|
30
|
+
}).trim()
|
|
31
|
+
};
|
|
32
|
+
} catch (err) {
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
err: err instanceof Error ? err.message : String(err)
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
/** Probe: `docker version` resolves. */
|
|
40
|
+
const dockerProbe = {
|
|
41
|
+
name: "docker",
|
|
42
|
+
description: "Docker daemon reachable",
|
|
43
|
+
required: true,
|
|
44
|
+
run: () => Effect.sync(() => {
|
|
45
|
+
const result = captureCommand("docker", [
|
|
46
|
+
"version",
|
|
47
|
+
"--format",
|
|
48
|
+
"{{.Server.Version}}"
|
|
49
|
+
]);
|
|
50
|
+
if (!result.ok) return {
|
|
51
|
+
status: "fail",
|
|
52
|
+
detail: `docker version failed: ${result.err}`
|
|
53
|
+
};
|
|
54
|
+
return okOutcome(`server ${result.out}`);
|
|
55
|
+
})
|
|
56
|
+
};
|
|
57
|
+
/** Probe: required CLIs on PATH (just sui-cli for fork-aware flows). */
|
|
58
|
+
const suiCliProbe = {
|
|
59
|
+
name: "sui-cli",
|
|
60
|
+
description: "`sui` CLI on PATH",
|
|
61
|
+
required: false,
|
|
62
|
+
run: () => Effect.sync(() => {
|
|
63
|
+
const result = captureCommand("sui", ["--version"]);
|
|
64
|
+
return result.ok ? okOutcome(result.out) : {
|
|
65
|
+
status: "warn",
|
|
66
|
+
detail: "sui CLI not on PATH (only needed for live/fork modes)"
|
|
67
|
+
};
|
|
68
|
+
})
|
|
69
|
+
};
|
|
70
|
+
/** Probe: a TCP port is reachable on localhost. Used to verify the
|
|
71
|
+
* user's reverse-proxy entrypoint isn't squatting the Traefik port. */
|
|
72
|
+
const probePortFree = (port, timeoutMs = 500) => new Promise((resolve) => {
|
|
73
|
+
const socket = createConnection({
|
|
74
|
+
host: "127.0.0.1",
|
|
75
|
+
port
|
|
76
|
+
});
|
|
77
|
+
const finish = (free) => {
|
|
78
|
+
socket.destroy();
|
|
79
|
+
resolve(free);
|
|
80
|
+
};
|
|
81
|
+
const timer = setTimeout(() => finish(true), timeoutMs);
|
|
82
|
+
socket.on("connect", () => {
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
finish(false);
|
|
85
|
+
});
|
|
86
|
+
socket.on("error", () => {
|
|
87
|
+
clearTimeout(timer);
|
|
88
|
+
finish(true);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
const unknownRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
|
|
92
|
+
const stringRecord = (value) => {
|
|
93
|
+
const rec = unknownRecord(value);
|
|
94
|
+
if (rec === null) return {};
|
|
95
|
+
const out = {};
|
|
96
|
+
for (const [key, raw] of Object.entries(rec)) if (typeof raw === "string") out[key] = raw;
|
|
97
|
+
return out;
|
|
98
|
+
};
|
|
99
|
+
const fieldRecord = (record, key) => unknownRecord(record[key]);
|
|
100
|
+
const fieldString = (record, key) => typeof record[key] === "string" ? record[key] : null;
|
|
101
|
+
const fieldBoolean = (record, key) => typeof record[key] === "boolean" ? record[key] : null;
|
|
102
|
+
const parseDockerInspectFirst = (out) => {
|
|
103
|
+
try {
|
|
104
|
+
const parsed = JSON.parse(out);
|
|
105
|
+
if (Array.isArray(parsed)) return unknownRecord(parsed[0]);
|
|
106
|
+
return unknownRecord(parsed);
|
|
107
|
+
} catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const dockerObjectIsAbsent = (err) => /No such (object|container|network)|not found|No such/i.test(err);
|
|
112
|
+
const uniqueNumbers = (values) => [...new Set(values)].sort((a, b) => a - b);
|
|
113
|
+
const inspectRouterContainer = (profile, command) => {
|
|
114
|
+
const result = command("docker", [
|
|
115
|
+
"container",
|
|
116
|
+
"inspect",
|
|
117
|
+
profile.containerName
|
|
118
|
+
]);
|
|
119
|
+
if (!result.ok) return dockerObjectIsAbsent(result.err) ? { status: "absent" } : {
|
|
120
|
+
status: "unavailable",
|
|
121
|
+
detail: result.err
|
|
122
|
+
};
|
|
123
|
+
const doc = parseDockerInspectFirst(result.out);
|
|
124
|
+
if (doc === null) return {
|
|
125
|
+
status: "invalid",
|
|
126
|
+
detail: "container inspect JSON was invalid"
|
|
127
|
+
};
|
|
128
|
+
const state = fieldRecord(doc, "State") ?? {};
|
|
129
|
+
const config = fieldRecord(doc, "Config") ?? {};
|
|
130
|
+
const networkSettings = fieldRecord(doc, "NetworkSettings") ?? {};
|
|
131
|
+
const networks = fieldRecord(networkSettings, "Networks") ?? {};
|
|
132
|
+
const ports = fieldRecord(networkSettings, "Ports") ?? {};
|
|
133
|
+
const publishedPorts = [];
|
|
134
|
+
for (const bindings of Object.values(ports)) {
|
|
135
|
+
if (!Array.isArray(bindings)) continue;
|
|
136
|
+
for (const binding of bindings) {
|
|
137
|
+
const rec = unknownRecord(binding);
|
|
138
|
+
if (rec === null) continue;
|
|
139
|
+
const rawPort = fieldString(rec, "HostPort");
|
|
140
|
+
if (rawPort !== null && /^\d+$/.test(rawPort)) publishedPorts.push(Number.parseInt(rawPort, 10));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const labels = stringRecord(config.Labels);
|
|
144
|
+
return {
|
|
145
|
+
status: "present",
|
|
146
|
+
running: fieldBoolean(state, "Running") === true,
|
|
147
|
+
labelsMatch: routerProfileLabelsMatch(labels, profile),
|
|
148
|
+
attachedToNetwork: Object.keys(networks).includes(profile.networkName),
|
|
149
|
+
publishedPorts: uniqueNumbers(publishedPorts)
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
const inspectRouterNetwork = (profile, command) => {
|
|
153
|
+
const result = command("docker", [
|
|
154
|
+
"network",
|
|
155
|
+
"inspect",
|
|
156
|
+
profile.networkName
|
|
157
|
+
]);
|
|
158
|
+
if (!result.ok) return dockerObjectIsAbsent(result.err) ? { status: "absent" } : {
|
|
159
|
+
status: "unavailable",
|
|
160
|
+
detail: result.err
|
|
161
|
+
};
|
|
162
|
+
const doc = parseDockerInspectFirst(result.out);
|
|
163
|
+
if (doc === null) return {
|
|
164
|
+
status: "invalid",
|
|
165
|
+
detail: "network inspect JSON was invalid"
|
|
166
|
+
};
|
|
167
|
+
const id = fieldString(doc, "Id");
|
|
168
|
+
return id === null ? { status: "present" } : {
|
|
169
|
+
status: "present",
|
|
170
|
+
id
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
const inspectRouterDispatch = (profile) => Effect.gen(function* () {
|
|
174
|
+
if (!existsSync(profile.dispatchDir)) return {
|
|
175
|
+
status: "absent",
|
|
176
|
+
files: 0,
|
|
177
|
+
liveRoutes: 0,
|
|
178
|
+
staleRoutes: 0,
|
|
179
|
+
unknownOwnerRoutes: 0,
|
|
180
|
+
corruptRouteFiles: 0,
|
|
181
|
+
diagnostics: 0,
|
|
182
|
+
safeToPrune: true
|
|
183
|
+
};
|
|
184
|
+
try {
|
|
185
|
+
if (!statSync(profile.dispatchDir).isDirectory()) return {
|
|
186
|
+
status: "not-directory",
|
|
187
|
+
files: 0,
|
|
188
|
+
liveRoutes: 0,
|
|
189
|
+
staleRoutes: 0,
|
|
190
|
+
unknownOwnerRoutes: 1,
|
|
191
|
+
corruptRouteFiles: 1,
|
|
192
|
+
diagnostics: 1,
|
|
193
|
+
safeToPrune: false
|
|
194
|
+
};
|
|
195
|
+
} catch {
|
|
196
|
+
return {
|
|
197
|
+
status: "unreadable",
|
|
198
|
+
files: 0,
|
|
199
|
+
liveRoutes: 0,
|
|
200
|
+
staleRoutes: 0,
|
|
201
|
+
unknownOwnerRoutes: 1,
|
|
202
|
+
corruptRouteFiles: 1,
|
|
203
|
+
diagnostics: 1,
|
|
204
|
+
safeToPrune: false
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
let files;
|
|
208
|
+
try {
|
|
209
|
+
files = readdirSync(profile.dispatchDir);
|
|
210
|
+
} catch {
|
|
211
|
+
return {
|
|
212
|
+
status: "unreadable",
|
|
213
|
+
files: 0,
|
|
214
|
+
liveRoutes: 0,
|
|
215
|
+
staleRoutes: 0,
|
|
216
|
+
unknownOwnerRoutes: 1,
|
|
217
|
+
corruptRouteFiles: 1,
|
|
218
|
+
diagnostics: 1,
|
|
219
|
+
safeToPrune: false
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
let routeFiles = 0;
|
|
223
|
+
let liveRoutes = 0;
|
|
224
|
+
let staleRoutes = 0;
|
|
225
|
+
let unknownOwnerRoutes = 0;
|
|
226
|
+
let corruptRouteFiles = 0;
|
|
227
|
+
let diagnostics = 0;
|
|
228
|
+
for (const filename of files) {
|
|
229
|
+
const dispatchFileId = dispatchFileIdFromFilename(filename);
|
|
230
|
+
if (dispatchFileId === null) continue;
|
|
231
|
+
routeFiles += 1;
|
|
232
|
+
let body;
|
|
233
|
+
try {
|
|
234
|
+
body = readFileSync(join(profile.dispatchDir, filename), "utf8");
|
|
235
|
+
} catch {
|
|
236
|
+
corruptRouteFiles += 1;
|
|
237
|
+
unknownOwnerRoutes += 1;
|
|
238
|
+
diagnostics += 1;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const parsed = parseDispatchRouteFile(body, dispatchFileId);
|
|
242
|
+
diagnostics += parsed.diagnostics.length;
|
|
243
|
+
if (parsed._tag === "invalid") {
|
|
244
|
+
corruptRouteFiles += 1;
|
|
245
|
+
unknownOwnerRoutes += 1;
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (parsed.route.lease === null) {
|
|
249
|
+
unknownOwnerRoutes += 1;
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
if ((yield* checkHolderLiveness(parsed.route.lease.owner).pipe(Effect.catch(() => Effect.succeed("alive")))) === "dead") staleRoutes += 1;
|
|
253
|
+
else liveRoutes += 1;
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
status: "ok",
|
|
257
|
+
files: routeFiles,
|
|
258
|
+
liveRoutes,
|
|
259
|
+
staleRoutes,
|
|
260
|
+
unknownOwnerRoutes,
|
|
261
|
+
corruptRouteFiles,
|
|
262
|
+
diagnostics,
|
|
263
|
+
safeToPrune: liveRoutes === 0 && unknownOwnerRoutes === 0 && corruptRouteFiles === 0
|
|
264
|
+
};
|
|
265
|
+
});
|
|
266
|
+
const inspectRouterStateDir = (profile) => {
|
|
267
|
+
if (!existsSync(profile.stateDir)) return "absent";
|
|
268
|
+
try {
|
|
269
|
+
return statSync(profile.stateDir).isDirectory() ? "present" : "not-directory";
|
|
270
|
+
} catch {
|
|
271
|
+
return "not-directory";
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
const summarizeRouterContainer = (container) => {
|
|
275
|
+
if (container.status !== "present") return container.status;
|
|
276
|
+
return [
|
|
277
|
+
container.running === true ? "running" : "stopped",
|
|
278
|
+
`labels=${container.labelsMatch === true ? "ok" : "mismatch"}`,
|
|
279
|
+
`network=${container.attachedToNetwork === true ? "attached" : "missing"}`,
|
|
280
|
+
`ports=${(container.publishedPorts ?? []).join(",") || "none"}`
|
|
281
|
+
].join("/");
|
|
282
|
+
};
|
|
283
|
+
const routerProfileProbe = (options = {}) => ({
|
|
284
|
+
name: "router-profile",
|
|
285
|
+
description: "router profile state, dispatch leases, and entrypoint listeners",
|
|
286
|
+
required: false,
|
|
287
|
+
run: () => Effect.gen(function* () {
|
|
288
|
+
const profile = options.profile ?? makeDefaultRouterProfile();
|
|
289
|
+
const entrypoints = options.entrypoints ?? BUILT_IN_ENTRYPOINTS;
|
|
290
|
+
const command = options.command ?? captureCommand;
|
|
291
|
+
const probePort = options.probePort ?? probePortFree;
|
|
292
|
+
const ports = uniqueSortedEntrypointPorts(entrypoints);
|
|
293
|
+
const stateDirStatus = inspectRouterStateDir(profile);
|
|
294
|
+
const dispatch = yield* inspectRouterDispatch(profile);
|
|
295
|
+
const container = inspectRouterContainer(profile, command);
|
|
296
|
+
const network = inspectRouterNetwork(profile, command);
|
|
297
|
+
const listenerResults = yield* Effect.tryPromise({
|
|
298
|
+
try: () => Promise.all(ports.map(async (port) => ({
|
|
299
|
+
port,
|
|
300
|
+
free: await probePort(port)
|
|
301
|
+
}))),
|
|
302
|
+
catch: () => "router entrypoint listener probe failed"
|
|
303
|
+
}).pipe(Effect.catch(() => Effect.succeed(ports.map((port) => ({
|
|
304
|
+
port,
|
|
305
|
+
free: true
|
|
306
|
+
})))));
|
|
307
|
+
const freePorts = listenerResults.filter((r) => r.free).map((r) => r.port);
|
|
308
|
+
const occupiedPorts = listenerResults.filter((r) => !r.free).map((r) => r.port);
|
|
309
|
+
const protectedRoutes = dispatch.liveRoutes + dispatch.unknownOwnerRoutes + dispatch.corruptRouteFiles;
|
|
310
|
+
const problems = [];
|
|
311
|
+
if (stateDirStatus === "not-directory") problems.push(`${profile.stateDir} is not a directory`);
|
|
312
|
+
if (dispatch.status === "not-directory" || dispatch.status === "unreadable") problems.push(`dispatch dir is ${dispatch.status}`);
|
|
313
|
+
if (dispatch.unknownOwnerRoutes > 0 || dispatch.corruptRouteFiles > 0) problems.push(`unknown/corrupt dispatch leases=${dispatch.unknownOwnerRoutes + dispatch.corruptRouteFiles}`);
|
|
314
|
+
if (dispatch.staleRoutes > 0) problems.push(`stale dispatch leases=${dispatch.staleRoutes}`);
|
|
315
|
+
if (protectedRoutes > 0 && (container.status !== "present" || container.running !== true)) problems.push("protected dispatch leases exist without a running router container");
|
|
316
|
+
if (container.status === "invalid" || container.status === "unavailable") problems.push(`router container inspect ${container.status}: ${container.detail ?? "unknown"}`);
|
|
317
|
+
if (container.status === "present") {
|
|
318
|
+
if (container.labelsMatch !== true) problems.push("router container labels do not match profile");
|
|
319
|
+
if (container.attachedToNetwork !== true) problems.push("router container is not attached to profile network");
|
|
320
|
+
if (container.running === true && freePorts.length > 0) problems.push(`router entrypoint listeners missing: ${freePorts.join(", ")}`);
|
|
321
|
+
}
|
|
322
|
+
if (container.status !== "present" && occupiedPorts.length > 0) problems.push(`router entrypoint ports already in use without profile container: ${occupiedPorts.join(", ")}`);
|
|
323
|
+
if (network.status === "invalid" || network.status === "unavailable") problems.push(`router network inspect ${network.status}: ${network.detail ?? "unknown"}`);
|
|
324
|
+
const detail = [
|
|
325
|
+
`profile=${profile.id}`,
|
|
326
|
+
`state=${stateDirStatus}`,
|
|
327
|
+
`dispatch=${dispatch.status}:files=${dispatch.files},live=${dispatch.liveRoutes},stale=${dispatch.staleRoutes},unknown=${dispatch.unknownOwnerRoutes},corrupt=${dispatch.corruptRouteFiles},diagnostics=${dispatch.diagnostics},pruneSafe=${dispatch.safeToPrune ? "yes" : "no"}`,
|
|
328
|
+
`container=${summarizeRouterContainer(container)}`,
|
|
329
|
+
`network=${network.status}`,
|
|
330
|
+
`entrypoints=${ports.join(", ") || "none"}`
|
|
331
|
+
].join("; ");
|
|
332
|
+
if (problems.length === 0) return okOutcome(detail);
|
|
333
|
+
return {
|
|
334
|
+
status: "warn",
|
|
335
|
+
detail: `${detail}; ${problems.join("; ")}`
|
|
336
|
+
};
|
|
337
|
+
})
|
|
338
|
+
});
|
|
339
|
+
/** Probe: list orphaned stack locks under `<runtimeRoot>/<app>/`. A
|
|
340
|
+
* stack lock whose owner PID is dead is a stale-lock candidate that
|
|
341
|
+
* `--clean-locks` would reclaim. */
|
|
342
|
+
const locksProbe = (appRoot) => ({
|
|
343
|
+
name: "locks",
|
|
344
|
+
description: "stale cross-process locks",
|
|
345
|
+
required: false,
|
|
346
|
+
run: () => Effect.gen(function* () {
|
|
347
|
+
if (!existsSync(appRoot)) return okOutcome("(no app root yet)");
|
|
348
|
+
const ownHost = hostname();
|
|
349
|
+
let orphans = 0;
|
|
350
|
+
let totalLive = 0;
|
|
351
|
+
try {
|
|
352
|
+
for (const entry of readdirSync(appRoot)) {
|
|
353
|
+
if (entry.startsWith(".")) continue;
|
|
354
|
+
const stackRoot = join(appRoot, entry);
|
|
355
|
+
try {
|
|
356
|
+
if (!statSync(stackRoot).isDirectory()) continue;
|
|
357
|
+
} catch {
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
const rosterFile = join(stackRoot, "roster.json");
|
|
361
|
+
if (!existsSync(rosterFile)) continue;
|
|
362
|
+
const doc = yield* readRoster(rosterFile).pipe(Effect.catch(() => Effect.succeed({
|
|
363
|
+
version: 1,
|
|
364
|
+
holders: []
|
|
365
|
+
})));
|
|
366
|
+
for (const holder of doc.holders) if ((yield* checkHolderLiveness(holder, ownHost).pipe(Effect.catch(() => Effect.succeed("alive")))) === "alive") totalLive += 1;
|
|
367
|
+
else orphans += 1;
|
|
368
|
+
}
|
|
369
|
+
} catch (cause) {
|
|
370
|
+
return {
|
|
371
|
+
status: "warn",
|
|
372
|
+
detail: `lock scan failed: ${cause instanceof Error ? cause.message : String(cause)}`
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
if (orphans === 0) return okOutcome(`${totalLive} live, 0 orphan`);
|
|
376
|
+
return {
|
|
377
|
+
status: "warn",
|
|
378
|
+
detail: `${orphans} orphan holder(s); rerun with --clean-locks`
|
|
379
|
+
};
|
|
380
|
+
})
|
|
381
|
+
});
|
|
382
|
+
/** Probe: state-dir is writable. Validates DEVSTACK_STATE_DIR resolves
|
|
383
|
+
* to a usable path (or the default ~/.devstack does). */
|
|
384
|
+
const stateDirProbe = (stateDir) => ({
|
|
385
|
+
name: "state-dir",
|
|
386
|
+
description: "state directory",
|
|
387
|
+
required: true,
|
|
388
|
+
run: () => Effect.sync(() => {
|
|
389
|
+
if (!existsSync(stateDir)) return okOutcome(`${stateDir} (will be created)`);
|
|
390
|
+
try {
|
|
391
|
+
if (!statSync(stateDir).isDirectory()) return {
|
|
392
|
+
status: "fail",
|
|
393
|
+
detail: `${stateDir} is not a directory`
|
|
394
|
+
};
|
|
395
|
+
return okOutcome(stateDir);
|
|
396
|
+
} catch (cause) {
|
|
397
|
+
return {
|
|
398
|
+
status: "fail",
|
|
399
|
+
detail: cause instanceof Error ? cause.message : String(cause)
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
})
|
|
403
|
+
});
|
|
404
|
+
/** Probe: optional fork-cache directory inspection. Returns the size
|
|
405
|
+
* of the cache (informational). */
|
|
406
|
+
const forkCacheProbe = (appRoot) => ({
|
|
407
|
+
name: "fork-cache",
|
|
408
|
+
description: "sui-fork cache",
|
|
409
|
+
required: false,
|
|
410
|
+
run: () => Effect.sync(() => {
|
|
411
|
+
const cacheDir = join(appRoot, ".fork-cache");
|
|
412
|
+
if (!existsSync(cacheDir)) return okOutcome("(absent)");
|
|
413
|
+
try {
|
|
414
|
+
return okOutcome(`${countTreeSize(cacheDir)} entries`);
|
|
415
|
+
} catch {
|
|
416
|
+
return {
|
|
417
|
+
status: "warn",
|
|
418
|
+
detail: "fork cache scan failed"
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
})
|
|
422
|
+
});
|
|
423
|
+
const countTreeSize = (dir, depth = 0) => {
|
|
424
|
+
if (depth > 3) return 0;
|
|
425
|
+
let n = 0;
|
|
426
|
+
for (const entry of readdirSync(dir)) {
|
|
427
|
+
const p = join(dir, entry);
|
|
428
|
+
try {
|
|
429
|
+
const s = statSync(p);
|
|
430
|
+
if (s.isFile()) n += 1;
|
|
431
|
+
else if (s.isDirectory()) n += countTreeSize(p, depth + 1);
|
|
432
|
+
} catch {}
|
|
433
|
+
}
|
|
434
|
+
return n;
|
|
435
|
+
};
|
|
436
|
+
/** Default probe set. The dispatcher composes this with the resolved
|
|
437
|
+
* app root, runtime state dir, router profile, and router entrypoints. */
|
|
438
|
+
const defaultProbes = (params) => [
|
|
439
|
+
dockerProbe,
|
|
440
|
+
suiCliProbe,
|
|
441
|
+
stateDirProbe(params.stateDir),
|
|
442
|
+
routerProfileProbe({
|
|
443
|
+
...params.routerProfile === void 0 ? {} : { profile: params.routerProfile },
|
|
444
|
+
...params.routerEntrypoints === void 0 ? {} : { entrypoints: params.routerEntrypoints }
|
|
445
|
+
}),
|
|
446
|
+
locksProbe(params.appRoot),
|
|
447
|
+
forkCacheProbe(params.appRoot)
|
|
448
|
+
];
|
|
449
|
+
//#endregion
|
|
450
|
+
export { defaultProbes };
|
|
451
|
+
|
|
452
|
+
//# sourceMappingURL=doctor-probes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-probes.mjs","names":["nodeHostname"],"sources":["../../../../src/surfaces/cli/commands/doctor-probes.ts"],"sourcesContent":["// Built-in doctor probes.\n//\n// Architecture: `doctor` owns cheap preflight checks for the public CLI\n// surface: env, ports, locks, Docker/Sui availability, router profile,\n// and fork cache state. Each probe is a thin, self-contained `Probe`\n// value that the dispatcher composes into the deps bundle.\n//\n// Probes follow a discipline:\n// - Pure Effect — no implicit Layer dependencies. Probes shell out\n// directly via `execFileSync` so the doctor verb stays cheap to\n// boot (no substrate Layer composition).\n// - Each returns `ProbeOutcome` — never throws.\n// - `required: true` means a `fail | unavailable` projects to\n// `CliUnavailableError` and exits 69; non-required probes are\n// informational.\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { hostname as nodeHostname } from 'node:os';\nimport { createConnection } from 'node:net';\nimport { join } from 'node:path';\n\nimport { Effect } from 'effect';\n\nimport {\n\tdispatchFileIdFromFilename,\n\tmakeDefaultRouterProfile,\n\tparseDispatchRouteFile,\n\trouterProfileLabelsMatch,\n\tuniqueSortedEntrypointPorts,\n\ttype Entrypoint,\n\ttype RouterProfile,\n} from '../../../orchestrators/router/index.ts';\nimport { BUILT_IN_ENTRYPOINTS } from '../../../plugins/router-entrypoints.ts';\nimport { checkHolderLiveness, readRoster } from '../../../substrate/runtime/cross-process/index.ts';\nimport type { RosterHolder } from '../../../substrate/cross-process.ts';\nimport type { Probe, ProbeOutcome } from './doctor.ts';\n\nconst okOutcome = (detail?: string): ProbeOutcome =>\n\tdetail !== undefined ? { status: 'ok', detail } : { status: 'ok' };\n\nconst captureCommand = (\n\tcmd: string,\n\targs: ReadonlyArray<string>,\n\ttimeoutMs = 3000,\n): { ok: true; out: string } | { ok: false; err: string } => {\n\ttry {\n\t\tconst out = execFileSync(cmd, args as string[], {\n\t\t\tencoding: 'utf8',\n\t\t\ttimeout: timeoutMs,\n\t\t\tstdio: ['ignore', 'pipe', 'pipe'],\n\t\t});\n\t\treturn { ok: true, out: out.trim() };\n\t} catch (err) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terr: err instanceof Error ? err.message : String(err),\n\t\t};\n\t}\n};\n\n/** Probe: `docker version` resolves. */\nexport const dockerProbe: Probe = {\n\tname: 'docker',\n\tdescription: 'Docker daemon reachable',\n\trequired: true,\n\trun: () =>\n\t\tEffect.sync(() => {\n\t\t\tconst result = captureCommand('docker', ['version', '--format', '{{.Server.Version}}']);\n\t\t\tif (!result.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 'fail',\n\t\t\t\t\tdetail: `docker version failed: ${result.err}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn okOutcome(`server ${result.out}`);\n\t\t}),\n};\n\n/** Probe: required CLIs on PATH (just sui-cli for fork-aware flows). */\nexport const suiCliProbe: Probe = {\n\tname: 'sui-cli',\n\tdescription: '`sui` CLI on PATH',\n\trequired: false,\n\trun: () =>\n\t\tEffect.sync(() => {\n\t\t\tconst result = captureCommand('sui', ['--version']);\n\t\t\treturn result.ok\n\t\t\t\t? okOutcome(result.out)\n\t\t\t\t: {\n\t\t\t\t\t\tstatus: 'warn',\n\t\t\t\t\t\tdetail: 'sui CLI not on PATH (only needed for live/fork modes)',\n\t\t\t\t\t};\n\t\t}),\n};\n\n/** Probe: a TCP port is reachable on localhost. Used to verify the\n * user's reverse-proxy entrypoint isn't squatting the Traefik port. */\nconst probePortFree = (port: number, timeoutMs = 500): Promise<boolean> =>\n\tnew Promise((resolve) => {\n\t\tconst socket = createConnection({ host: '127.0.0.1', port });\n\t\tconst finish = (free: boolean): void => {\n\t\t\tsocket.destroy();\n\t\t\tresolve(free);\n\t\t};\n\t\tconst timer = setTimeout(() => finish(true), timeoutMs);\n\t\tsocket.on('connect', () => {\n\t\t\tclearTimeout(timer);\n\t\t\tfinish(false);\n\t\t});\n\t\tsocket.on('error', () => {\n\t\t\tclearTimeout(timer);\n\t\t\tfinish(true);\n\t\t});\n\t});\n\n/** Probe: caller-selected TCP ports are currently free. Router checks\n * use `routerProfileProbe`, which reads the configured entrypoints. */\nexport const portProbe = (ports: ReadonlyArray<number>): Probe => ({\n\tname: 'ports',\n\tdescription: 'selected TCP ports',\n\trequired: false,\n\trun: () =>\n\t\tEffect.gen(function* () {\n\t\t\tconst results = yield* Effect.tryPromise({\n\t\t\t\ttry: () =>\n\t\t\t\t\tPromise.all(\n\t\t\t\t\t\tports.map(async (port) => ({\n\t\t\t\t\t\t\tport,\n\t\t\t\t\t\t\tfree: await probePortFree(port),\n\t\t\t\t\t\t})),\n\t\t\t\t\t),\n\t\t\t\tcatch: () => 'port probe failed',\n\t\t\t}).pipe(Effect.catch(() => Effect.succeed(ports.map((port) => ({ port, free: true })))));\n\t\t\tconst used = results.filter((r) => !r.free);\n\t\t\tif (used.length === 0) {\n\t\t\t\treturn okOutcome(`free: ${ports.join(', ')}`);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstatus: 'warn',\n\t\t\t\tdetail: `in use: ${used.map((u) => u.port).join(', ')}`,\n\t\t\t};\n\t\t}),\n});\n\nexport type DoctorCommandRunner = typeof captureCommand;\nexport type PortAvailabilityProbe = typeof probePortFree;\n\nexport interface RouterProfileProbeOptions {\n\treadonly profile?: RouterProfile;\n\treadonly entrypoints?: ReadonlyArray<Entrypoint>;\n\treadonly command?: DoctorCommandRunner;\n\treadonly probePort?: PortAvailabilityProbe;\n}\n\ninterface RouterDispatchScan {\n\treadonly status: 'absent' | 'ok' | 'not-directory' | 'unreadable';\n\treadonly files: number;\n\treadonly liveRoutes: number;\n\treadonly staleRoutes: number;\n\treadonly unknownOwnerRoutes: number;\n\treadonly corruptRouteFiles: number;\n\treadonly diagnostics: number;\n\treadonly safeToPrune: boolean;\n}\n\ninterface RouterContainerStatus {\n\treadonly status: 'absent' | 'present' | 'invalid' | 'unavailable';\n\treadonly detail?: string;\n\treadonly running?: boolean;\n\treadonly labelsMatch?: boolean;\n\treadonly attachedToNetwork?: boolean;\n\treadonly publishedPorts?: ReadonlyArray<number>;\n}\n\ninterface RouterNetworkStatus {\n\treadonly status: 'absent' | 'present' | 'invalid' | 'unavailable';\n\treadonly detail?: string;\n\treadonly id?: string;\n}\n\nconst unknownRecord = (value: unknown): Record<string, unknown> | null =>\n\ttypeof value === 'object' && value !== null && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: null;\n\nconst stringRecord = (value: unknown): Record<string, string> => {\n\tconst rec = unknownRecord(value);\n\tif (rec === null) return {};\n\tconst out: Record<string, string> = {};\n\tfor (const [key, raw] of Object.entries(rec)) {\n\t\tif (typeof raw === 'string') out[key] = raw;\n\t}\n\treturn out;\n};\n\nconst fieldRecord = (\n\trecord: Record<string, unknown>,\n\tkey: string,\n): Record<string, unknown> | null => unknownRecord(record[key]);\n\nconst fieldString = (record: Record<string, unknown>, key: string): string | null =>\n\ttypeof record[key] === 'string' ? record[key] : null;\n\nconst fieldBoolean = (record: Record<string, unknown>, key: string): boolean | null =>\n\ttypeof record[key] === 'boolean' ? record[key] : null;\n\nconst parseDockerInspectFirst = (out: string): Record<string, unknown> | null => {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(out);\n\t\tif (Array.isArray(parsed)) return unknownRecord(parsed[0]);\n\t\treturn unknownRecord(parsed);\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nconst dockerObjectIsAbsent = (err: string): boolean =>\n\t/No such (object|container|network)|not found|No such/i.test(err);\n\nconst uniqueNumbers = (values: ReadonlyArray<number>): ReadonlyArray<number> =>\n\t[...new Set(values)].sort((a, b) => a - b);\n\nconst inspectRouterContainer = (\n\tprofile: RouterProfile,\n\tcommand: DoctorCommandRunner,\n): RouterContainerStatus => {\n\tconst result = command('docker', ['container', 'inspect', profile.containerName]);\n\tif (!result.ok) {\n\t\treturn dockerObjectIsAbsent(result.err)\n\t\t\t? { status: 'absent' }\n\t\t\t: { status: 'unavailable', detail: result.err };\n\t}\n\tconst doc = parseDockerInspectFirst(result.out);\n\tif (doc === null) return { status: 'invalid', detail: 'container inspect JSON was invalid' };\n\tconst state = fieldRecord(doc, 'State') ?? {};\n\tconst config = fieldRecord(doc, 'Config') ?? {};\n\tconst networkSettings = fieldRecord(doc, 'NetworkSettings') ?? {};\n\tconst networks = fieldRecord(networkSettings, 'Networks') ?? {};\n\tconst ports = fieldRecord(networkSettings, 'Ports') ?? {};\n\tconst publishedPorts: Array<number> = [];\n\tfor (const bindings of Object.values(ports)) {\n\t\tif (!Array.isArray(bindings)) continue;\n\t\tfor (const binding of bindings) {\n\t\t\tconst rec = unknownRecord(binding);\n\t\t\tif (rec === null) continue;\n\t\t\tconst rawPort = fieldString(rec, 'HostPort');\n\t\t\tif (rawPort !== null && /^\\d+$/.test(rawPort)) {\n\t\t\t\tpublishedPorts.push(Number.parseInt(rawPort, 10));\n\t\t\t}\n\t\t}\n\t}\n\tconst labels = stringRecord(config.Labels);\n\treturn {\n\t\tstatus: 'present',\n\t\trunning: fieldBoolean(state, 'Running') === true,\n\t\tlabelsMatch: routerProfileLabelsMatch(labels, profile),\n\t\tattachedToNetwork: Object.keys(networks).includes(profile.networkName),\n\t\tpublishedPorts: uniqueNumbers(publishedPorts),\n\t};\n};\n\nconst inspectRouterNetwork = (\n\tprofile: RouterProfile,\n\tcommand: DoctorCommandRunner,\n): RouterNetworkStatus => {\n\tconst result = command('docker', ['network', 'inspect', profile.networkName]);\n\tif (!result.ok) {\n\t\treturn dockerObjectIsAbsent(result.err)\n\t\t\t? { status: 'absent' }\n\t\t\t: { status: 'unavailable', detail: result.err };\n\t}\n\tconst doc = parseDockerInspectFirst(result.out);\n\tif (doc === null) return { status: 'invalid', detail: 'network inspect JSON was invalid' };\n\tconst id = fieldString(doc, 'Id');\n\treturn id === null ? { status: 'present' } : { status: 'present', id };\n};\n\nconst inspectRouterDispatch = (profile: RouterProfile): Effect.Effect<RouterDispatchScan> =>\n\tEffect.gen(function* () {\n\t\tif (!existsSync(profile.dispatchDir)) {\n\t\t\treturn {\n\t\t\t\tstatus: 'absent' as const,\n\t\t\t\tfiles: 0,\n\t\t\t\tliveRoutes: 0,\n\t\t\t\tstaleRoutes: 0,\n\t\t\t\tunknownOwnerRoutes: 0,\n\t\t\t\tcorruptRouteFiles: 0,\n\t\t\t\tdiagnostics: 0,\n\t\t\t\tsafeToPrune: true,\n\t\t\t};\n\t\t}\n\t\ttry {\n\t\t\tif (!statSync(profile.dispatchDir).isDirectory()) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 'not-directory' as const,\n\t\t\t\t\tfiles: 0,\n\t\t\t\t\tliveRoutes: 0,\n\t\t\t\t\tstaleRoutes: 0,\n\t\t\t\t\tunknownOwnerRoutes: 1,\n\t\t\t\t\tcorruptRouteFiles: 1,\n\t\t\t\t\tdiagnostics: 1,\n\t\t\t\t\tsafeToPrune: false,\n\t\t\t\t};\n\t\t\t}\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tstatus: 'unreadable' as const,\n\t\t\t\tfiles: 0,\n\t\t\t\tliveRoutes: 0,\n\t\t\t\tstaleRoutes: 0,\n\t\t\t\tunknownOwnerRoutes: 1,\n\t\t\t\tcorruptRouteFiles: 1,\n\t\t\t\tdiagnostics: 1,\n\t\t\t\tsafeToPrune: false,\n\t\t\t};\n\t\t}\n\t\tlet files: ReadonlyArray<string>;\n\t\ttry {\n\t\t\tfiles = readdirSync(profile.dispatchDir);\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tstatus: 'unreadable' as const,\n\t\t\t\tfiles: 0,\n\t\t\t\tliveRoutes: 0,\n\t\t\t\tstaleRoutes: 0,\n\t\t\t\tunknownOwnerRoutes: 1,\n\t\t\t\tcorruptRouteFiles: 1,\n\t\t\t\tdiagnostics: 1,\n\t\t\t\tsafeToPrune: false,\n\t\t\t};\n\t\t}\n\t\tlet routeFiles = 0;\n\t\tlet liveRoutes = 0;\n\t\tlet staleRoutes = 0;\n\t\tlet unknownOwnerRoutes = 0;\n\t\tlet corruptRouteFiles = 0;\n\t\tlet diagnostics = 0;\n\t\tfor (const filename of files) {\n\t\t\tconst dispatchFileId = dispatchFileIdFromFilename(filename);\n\t\t\tif (dispatchFileId === null) continue;\n\t\t\trouteFiles += 1;\n\t\t\tlet body: string;\n\t\t\ttry {\n\t\t\t\tbody = readFileSync(join(profile.dispatchDir, filename), 'utf8');\n\t\t\t} catch {\n\t\t\t\tcorruptRouteFiles += 1;\n\t\t\t\tunknownOwnerRoutes += 1;\n\t\t\t\tdiagnostics += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst parsed = parseDispatchRouteFile(body, dispatchFileId);\n\t\t\tdiagnostics += parsed.diagnostics.length;\n\t\t\tif (parsed._tag === 'invalid') {\n\t\t\t\tcorruptRouteFiles += 1;\n\t\t\t\tunknownOwnerRoutes += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (parsed.route.lease === null) {\n\t\t\t\tunknownOwnerRoutes += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst leaseStatus = yield* checkHolderLiveness(parsed.route.lease.owner).pipe(\n\t\t\t\tEffect.catch(() => Effect.succeed('alive' as const)),\n\t\t\t);\n\t\t\tif (leaseStatus === 'dead') staleRoutes += 1;\n\t\t\telse liveRoutes += 1;\n\t\t}\n\t\tconst safeToPrune = liveRoutes === 0 && unknownOwnerRoutes === 0 && corruptRouteFiles === 0;\n\t\treturn {\n\t\t\tstatus: 'ok' as const,\n\t\t\tfiles: routeFiles,\n\t\t\tliveRoutes,\n\t\t\tstaleRoutes,\n\t\t\tunknownOwnerRoutes,\n\t\t\tcorruptRouteFiles,\n\t\t\tdiagnostics,\n\t\t\tsafeToPrune,\n\t\t};\n\t});\n\nconst inspectRouterStateDir = (profile: RouterProfile): 'absent' | 'present' | 'not-directory' => {\n\tif (!existsSync(profile.stateDir)) return 'absent';\n\ttry {\n\t\treturn statSync(profile.stateDir).isDirectory() ? 'present' : 'not-directory';\n\t} catch {\n\t\treturn 'not-directory';\n\t}\n};\n\nconst summarizeRouterContainer = (container: RouterContainerStatus): string => {\n\tif (container.status !== 'present') return container.status;\n\treturn [\n\t\tcontainer.running === true ? 'running' : 'stopped',\n\t\t`labels=${container.labelsMatch === true ? 'ok' : 'mismatch'}`,\n\t\t`network=${container.attachedToNetwork === true ? 'attached' : 'missing'}`,\n\t\t`ports=${(container.publishedPorts ?? []).join(',') || 'none'}`,\n\t].join('/');\n};\n\nexport const routerProfileProbe = (options: RouterProfileProbeOptions = {}): Probe => ({\n\tname: 'router-profile',\n\tdescription: 'router profile state, dispatch leases, and entrypoint listeners',\n\trequired: false,\n\trun: () =>\n\t\tEffect.gen(function* () {\n\t\t\tconst profile = options.profile ?? makeDefaultRouterProfile();\n\t\t\tconst entrypoints = options.entrypoints ?? BUILT_IN_ENTRYPOINTS;\n\t\t\tconst command = options.command ?? captureCommand;\n\t\t\tconst probePort = options.probePort ?? probePortFree;\n\t\t\tconst ports = uniqueSortedEntrypointPorts(entrypoints);\n\t\t\tconst stateDirStatus = inspectRouterStateDir(profile);\n\t\t\tconst dispatch = yield* inspectRouterDispatch(profile);\n\t\t\tconst container = inspectRouterContainer(profile, command);\n\t\t\tconst network = inspectRouterNetwork(profile, command);\n\t\t\tconst listenerResults = yield* Effect.tryPromise({\n\t\t\t\ttry: () =>\n\t\t\t\t\tPromise.all(\n\t\t\t\t\t\tports.map(async (port) => ({\n\t\t\t\t\t\t\tport,\n\t\t\t\t\t\t\tfree: await probePort(port),\n\t\t\t\t\t\t})),\n\t\t\t\t\t),\n\t\t\t\tcatch: () => 'router entrypoint listener probe failed',\n\t\t\t}).pipe(Effect.catch(() => Effect.succeed(ports.map((port) => ({ port, free: true })))));\n\t\t\tconst freePorts = listenerResults.filter((r) => r.free).map((r) => r.port);\n\t\t\tconst occupiedPorts = listenerResults.filter((r) => !r.free).map((r) => r.port);\n\t\t\tconst protectedRoutes =\n\t\t\t\tdispatch.liveRoutes + dispatch.unknownOwnerRoutes + dispatch.corruptRouteFiles;\n\t\t\tconst problems: string[] = [];\n\t\t\tif (stateDirStatus === 'not-directory')\n\t\t\t\tproblems.push(`${profile.stateDir} is not a directory`);\n\t\t\tif (dispatch.status === 'not-directory' || dispatch.status === 'unreadable') {\n\t\t\t\tproblems.push(`dispatch dir is ${dispatch.status}`);\n\t\t\t}\n\t\t\tif (dispatch.unknownOwnerRoutes > 0 || dispatch.corruptRouteFiles > 0) {\n\t\t\t\tproblems.push(\n\t\t\t\t\t`unknown/corrupt dispatch leases=${dispatch.unknownOwnerRoutes + dispatch.corruptRouteFiles}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (dispatch.staleRoutes > 0) problems.push(`stale dispatch leases=${dispatch.staleRoutes}`);\n\t\t\tif (protectedRoutes > 0 && (container.status !== 'present' || container.running !== true)) {\n\t\t\t\tproblems.push('protected dispatch leases exist without a running router container');\n\t\t\t}\n\t\t\tif (container.status === 'invalid' || container.status === 'unavailable') {\n\t\t\t\tproblems.push(\n\t\t\t\t\t`router container inspect ${container.status}: ${container.detail ?? 'unknown'}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (container.status === 'present') {\n\t\t\t\tif (container.labelsMatch !== true)\n\t\t\t\t\tproblems.push('router container labels do not match profile');\n\t\t\t\tif (container.attachedToNetwork !== true) {\n\t\t\t\t\tproblems.push('router container is not attached to profile network');\n\t\t\t\t}\n\t\t\t\tif (container.running === true && freePorts.length > 0) {\n\t\t\t\t\tproblems.push(`router entrypoint listeners missing: ${freePorts.join(', ')}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (container.status !== 'present' && occupiedPorts.length > 0) {\n\t\t\t\tproblems.push(\n\t\t\t\t\t`router entrypoint ports already in use without profile container: ${occupiedPorts.join(', ')}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (network.status === 'invalid' || network.status === 'unavailable') {\n\t\t\t\tproblems.push(`router network inspect ${network.status}: ${network.detail ?? 'unknown'}`);\n\t\t\t}\n\t\t\tconst detail = [\n\t\t\t\t`profile=${profile.id}`,\n\t\t\t\t`state=${stateDirStatus}`,\n\t\t\t\t`dispatch=${dispatch.status}:files=${dispatch.files},live=${dispatch.liveRoutes},stale=${dispatch.staleRoutes},unknown=${dispatch.unknownOwnerRoutes},corrupt=${dispatch.corruptRouteFiles},diagnostics=${dispatch.diagnostics},pruneSafe=${dispatch.safeToPrune ? 'yes' : 'no'}`,\n\t\t\t\t`container=${summarizeRouterContainer(container)}`,\n\t\t\t\t`network=${network.status}`,\n\t\t\t\t`entrypoints=${ports.join(', ') || 'none'}`,\n\t\t\t].join('; ');\n\t\t\tif (problems.length === 0) return okOutcome(detail);\n\t\t\treturn {\n\t\t\t\tstatus: 'warn' as const,\n\t\t\t\tdetail: `${detail}; ${problems.join('; ')}`,\n\t\t\t};\n\t\t}),\n});\n\n/** Probe: list orphaned stack locks under `<runtimeRoot>/<app>/`. A\n * stack lock whose owner PID is dead is a stale-lock candidate that\n * `--clean-locks` would reclaim. */\nexport const locksProbe = (appRoot: string): Probe => ({\n\tname: 'locks',\n\tdescription: 'stale cross-process locks',\n\trequired: false,\n\trun: () =>\n\t\tEffect.gen(function* () {\n\t\t\tif (!existsSync(appRoot)) return okOutcome('(no app root yet)');\n\t\t\tconst ownHost = nodeHostname();\n\t\t\tlet orphans = 0;\n\t\t\tlet totalLive = 0;\n\t\t\ttry {\n\t\t\t\tfor (const entry of readdirSync(appRoot)) {\n\t\t\t\t\tif (entry.startsWith('.')) continue;\n\t\t\t\t\tconst stackRoot = join(appRoot, entry);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!statSync(stackRoot).isDirectory()) continue;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst rosterFile = join(stackRoot, 'roster.json');\n\t\t\t\t\tif (!existsSync(rosterFile)) continue;\n\t\t\t\t\tconst doc = yield* readRoster(rosterFile).pipe(\n\t\t\t\t\t\tEffect.catch(() =>\n\t\t\t\t\t\t\tEffect.succeed({ version: 1 as const, holders: [] as RosterHolder[] }),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tfor (const holder of doc.holders) {\n\t\t\t\t\t\tconst liveness = yield* checkHolderLiveness(holder, ownHost).pipe(\n\t\t\t\t\t\t\tEffect.catch(() => Effect.succeed('alive' as const)),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (liveness === 'alive') totalLive += 1;\n\t\t\t\t\t\telse orphans += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (cause) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 'warn',\n\t\t\t\t\tdetail: `lock scan failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (orphans === 0) {\n\t\t\t\treturn okOutcome(`${totalLive} live, 0 orphan`);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstatus: 'warn',\n\t\t\t\tdetail: `${orphans} orphan holder(s); rerun with --clean-locks`,\n\t\t\t};\n\t\t}),\n});\n\n/** Probe: state-dir is writable. Validates DEVSTACK_STATE_DIR resolves\n * to a usable path (or the default ~/.devstack does). */\nexport const stateDirProbe = (stateDir: string): Probe => ({\n\tname: 'state-dir',\n\tdescription: 'state directory',\n\trequired: true,\n\trun: () =>\n\t\tEffect.sync(() => {\n\t\t\tif (!existsSync(stateDir)) {\n\t\t\t\t// Not present yet — ok; devstack creates it on first claim.\n\t\t\t\treturn okOutcome(`${stateDir} (will be created)`);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst s = statSync(stateDir);\n\t\t\t\tif (!s.isDirectory()) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: 'fail',\n\t\t\t\t\t\tdetail: `${stateDir} is not a directory`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// Sanity: a malformed state dir would surface here. We don't\n\t\t\t\t// try to read inside — that's per-stack.\n\t\t\t\treturn okOutcome(stateDir);\n\t\t\t} catch (cause) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 'fail',\n\t\t\t\t\tdetail: cause instanceof Error ? cause.message : String(cause),\n\t\t\t\t};\n\t\t\t}\n\t\t}),\n});\n\n/** Probe: optional fork-cache directory inspection. Returns the size\n * of the cache (informational). */\nexport const forkCacheProbe = (appRoot: string): Probe => ({\n\tname: 'fork-cache',\n\tdescription: 'sui-fork cache',\n\trequired: false,\n\trun: () =>\n\t\tEffect.sync(() => {\n\t\t\tconst cacheDir = join(appRoot, '.fork-cache');\n\t\t\tif (!existsSync(cacheDir)) return okOutcome('(absent)');\n\t\t\ttry {\n\t\t\t\tconst size = countTreeSize(cacheDir);\n\t\t\t\treturn okOutcome(`${size} entries`);\n\t\t\t} catch {\n\t\t\t\treturn { status: 'warn', detail: 'fork cache scan failed' };\n\t\t\t}\n\t\t}),\n});\n\nconst countTreeSize = (dir: string, depth = 0): number => {\n\tif (depth > 3) return 0;\n\tlet n = 0;\n\tfor (const entry of readdirSync(dir)) {\n\t\tconst p = join(dir, entry);\n\t\ttry {\n\t\t\tconst s = statSync(p);\n\t\t\tif (s.isFile()) n += 1;\n\t\t\telse if (s.isDirectory()) n += countTreeSize(p, depth + 1);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\treturn n;\n};\n\n/** Default probe set. The dispatcher composes this with the resolved\n * app root, runtime state dir, router profile, and router entrypoints. */\nexport const defaultProbes = (params: {\n\treadonly stateDir: string;\n\treadonly appRoot: string;\n\treadonly routerProfile?: RouterProfile;\n\treadonly routerEntrypoints?: ReadonlyArray<Entrypoint>;\n}): ReadonlyArray<Probe> => [\n\tdockerProbe,\n\tsuiCliProbe,\n\tstateDirProbe(params.stateDir),\n\trouterProfileProbe({\n\t\t...(params.routerProfile === undefined ? {} : { profile: params.routerProfile }),\n\t\t...(params.routerEntrypoints === undefined ? {} : { entrypoints: params.routerEntrypoints }),\n\t}),\n\tlocksProbe(params.appRoot),\n\tforkCacheProbe(params.appRoot),\n];\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { CliUnavailableError } from "../errors.mjs";
|
|
2
|
+
import { emitSuccess } from "../output.mjs";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
//#region src/surfaces/cli/commands/doctor.ts
|
|
5
|
+
const runDoctor = (deps, ctx) => Effect.gen(function* () {
|
|
6
|
+
const started = Date.now();
|
|
7
|
+
const reports = [];
|
|
8
|
+
for (const probe of deps.probes) {
|
|
9
|
+
const outcome = yield* probe.run();
|
|
10
|
+
reports.push({
|
|
11
|
+
name: probe.name,
|
|
12
|
+
description: probe.description,
|
|
13
|
+
required: probe.required,
|
|
14
|
+
outcome
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const requiredFailures = reports.filter((r) => r.required && (r.outcome.status === "fail" || r.outcome.status === "unavailable"));
|
|
18
|
+
if (requiredFailures.length > 0) {
|
|
19
|
+
const first = requiredFailures[0];
|
|
20
|
+
return yield* Effect.fail(new CliUnavailableError({
|
|
21
|
+
message: first.outcome.detail,
|
|
22
|
+
service: first.name,
|
|
23
|
+
hint: first.outcome.detail
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
const humanLines = reports.map((r) => `${r.outcome.status.padEnd(11, " ")} ${r.name}${r.outcome.status !== "ok" && "detail" in r.outcome ? ` — ${r.outcome.detail ?? ""}` : ""}`);
|
|
27
|
+
yield* emitSuccess(ctx.io, ctx.flags.outputMode, {
|
|
28
|
+
command: "doctor",
|
|
29
|
+
elapsedMs: Date.now() - started,
|
|
30
|
+
data: { reports },
|
|
31
|
+
humanLines
|
|
32
|
+
});
|
|
33
|
+
return { exitCode: 0 };
|
|
34
|
+
}).pipe(Effect.withSpan("cli.doctor"));
|
|
35
|
+
//#endregion
|
|
36
|
+
export { runDoctor };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=doctor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.mjs","names":[],"sources":["../../../../src/surfaces/cli/commands/doctor.ts"],"sourcesContent":["// CLI verb: `devstack doctor` — health check / lint of the user's\n// stack.\n//\n// Architecture (distilled/20-cli.md § Subcommands § Diagnostic):\n// \"doctor — preflight check matrix + environment inventory,\n// optionally cleaning stale locks.\"\n//\n// Doctor runs a fixed set of probes. Each probe returns a typed\n// outcome (ok | warn | fail | unavailable); the verb projects them\n// into the JSON data block / human table. Probes are pluggable —\n// the dispatcher composes the L1 docker probe, the move-build-lock\n// probe, the port-allocator probe, etc. The CLI just orchestrates.\n//\n// Surface invariant (architecture § Learnings): \"Doctor's port probe\n// must mirror the engine.\" — the probes themselves must be wired to\n// the same primitives the engine uses.\n\nimport { Effect } from 'effect';\n\nimport { type CliError, CliUnavailableError } from '../errors.ts';\nimport { emitSuccess } from '../output.ts';\nimport type { CommandContext, CommandResult } from './index.ts';\n\nexport type ProbeOutcome =\n\t| { readonly status: 'ok'; readonly detail?: string }\n\t| { readonly status: 'warn'; readonly detail: string }\n\t| { readonly status: 'fail'; readonly detail: string }\n\t| { readonly status: 'unavailable'; readonly detail: string };\n\nexport interface Probe {\n\treadonly name: string;\n\treadonly description: string;\n\treadonly required: boolean;\n\treadonly run: () => Effect.Effect<ProbeOutcome>;\n}\n\nexport interface ProbeReport {\n\treadonly name: string;\n\treadonly description: string;\n\treadonly required: boolean;\n\treadonly outcome: ProbeOutcome;\n}\n\nexport interface DoctorDeps {\n\treadonly probes: ReadonlyArray<Probe>;\n}\n\nexport const runDoctor = (\n\tdeps: DoctorDeps,\n\tctx: CommandContext,\n): Effect.Effect<CommandResult, CliError> =>\n\tEffect.gen(function* () {\n\t\tconst started = Date.now();\n\t\tconst reports: Array<ProbeReport> = [];\n\t\tfor (const probe of deps.probes) {\n\t\t\tconst outcome = yield* probe.run();\n\t\t\treports.push({\n\t\t\t\tname: probe.name,\n\t\t\t\tdescription: probe.description,\n\t\t\t\trequired: probe.required,\n\t\t\t\toutcome,\n\t\t\t});\n\t\t}\n\t\tconst requiredFailures = reports.filter(\n\t\t\t(\n\t\t\t\tr,\n\t\t\t): r is ProbeReport & {\n\t\t\t\toutcome: Extract<ProbeOutcome, { status: 'fail' | 'unavailable' }>;\n\t\t\t} => r.required && (r.outcome.status === 'fail' || r.outcome.status === 'unavailable'),\n\t\t);\n\t\tif (requiredFailures.length > 0) {\n\t\t\t// Surface the first required-failure as an `Unavailable`\n\t\t\t// error so the exit code is `EX_UNAVAILABLE` (architecture\n\t\t\t// edge-case: \"Docker daemon unreachable → doctor surfaces a\n\t\t\t// required-check failure with the unavailable exit code\").\n\t\t\tconst first = requiredFailures[0]!;\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tnew CliUnavailableError({\n\t\t\t\t\tmessage: first.outcome.detail,\n\t\t\t\t\tservice: first.name,\n\t\t\t\t\thint: first.outcome.detail,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst humanLines = reports.map(\n\t\t\t(r) =>\n\t\t\t\t`${r.outcome.status.padEnd(11, ' ')} ${r.name}${\n\t\t\t\t\tr.outcome.status !== 'ok' && 'detail' in r.outcome ? ` — ${r.outcome.detail ?? ''}` : ''\n\t\t\t\t}`,\n\t\t);\n\t\tyield* emitSuccess(ctx.io, ctx.flags.outputMode, {\n\t\t\tcommand: 'doctor',\n\t\t\telapsedMs: Date.now() - started,\n\t\t\tdata: { reports },\n\t\t\thumanLines,\n\t\t});\n\t\treturn { exitCode: 0 } as CommandResult;\n\t}).pipe(Effect.withSpan('cli.doctor'));\n"],"mappings":";;;;AA+CA,MAAa,aACZ,MACA,QAEA,OAAO,IAAI,aAAa;CACvB,MAAM,UAAU,KAAK,KAAK;CAC1B,MAAM,UAA8B,EAAE;AACtC,MAAK,MAAM,SAAS,KAAK,QAAQ;EAChC,MAAM,UAAU,OAAO,MAAM,KAAK;AAClC,UAAQ,KAAK;GACZ,MAAM,MAAM;GACZ,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB;GACA,CAAC;;CAEH,MAAM,mBAAmB,QAAQ,QAE/B,MAGI,EAAE,aAAa,EAAE,QAAQ,WAAW,UAAU,EAAE,QAAQ,WAAW,eACxE;AACD,KAAI,iBAAiB,SAAS,GAAG;EAKhC,MAAM,QAAQ,iBAAiB;AAC/B,SAAO,OAAO,OAAO,KACpB,IAAI,oBAAoB;GACvB,SAAS,MAAM,QAAQ;GACvB,SAAS,MAAM;GACf,MAAM,MAAM,QAAQ;GACpB,CAAC,CACF;;CAEF,MAAM,aAAa,QAAQ,KACzB,MACA,GAAG,EAAE,QAAQ,OAAO,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,OACxC,EAAE,QAAQ,WAAW,QAAQ,YAAY,EAAE,UAAU,MAAM,EAAE,QAAQ,UAAU,OAAO,KAExF;AACD,QAAO,YAAY,IAAI,IAAI,IAAI,MAAM,YAAY;EAChD,SAAS;EACT,WAAW,KAAK,KAAK,GAAG;EACxB,MAAM,EAAE,SAAS;EACjB;EACA,CAAC;AACF,QAAO,EAAE,UAAU,GAAG;EACrB,CAAC,KAAK,OAAO,SAAS,aAAa,CAAC"}
|