@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,142 @@
|
|
|
1
|
+
import { checkHolderLiveness, ownHolder } from "./liveness.mjs";
|
|
2
|
+
import { decodeJsonTextSync } from "../runtime-decode.mjs";
|
|
3
|
+
import { Data, Effect, Schema } from "effect";
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { dirname } from "node:path";
|
|
6
|
+
//#region src/substrate/runtime/cross-process/stack-lock.ts
|
|
7
|
+
/** Tagged failure: acquire window elapsed and the lock is still held.
|
|
8
|
+
* Carries the in-disk body (if parseable) so the caller can name the
|
|
9
|
+
* blocking peer in user-facing error reporting. */
|
|
10
|
+
var StackLockTimeoutError = class extends Data.TaggedError("StackLockTimeoutError") {};
|
|
11
|
+
/** Tagged failure: I/O error other than EEXIST during acquire. */
|
|
12
|
+
var StackLockIoError = class extends Data.TaggedError("StackLockIoError") {};
|
|
13
|
+
/** The on-disk body is the same `RosterHolder` shape — re-using the schema
|
|
14
|
+
* means roster sweep + stack-lock reclaim see the same fields. */
|
|
15
|
+
const StackLockBodySchema = Schema.Struct({
|
|
16
|
+
pid: Schema.Number,
|
|
17
|
+
startTime: Schema.Number,
|
|
18
|
+
hostname: Schema.String,
|
|
19
|
+
claimedAt: Schema.Number,
|
|
20
|
+
heartbeatAt: Schema.Number,
|
|
21
|
+
intent: Schema.Literals(["normal", "snapshot"])
|
|
22
|
+
});
|
|
23
|
+
const parseLockBody = (raw) => {
|
|
24
|
+
try {
|
|
25
|
+
return decodeJsonTextSync(StackLockBodySchema, raw, {
|
|
26
|
+
source: "stack.lock",
|
|
27
|
+
mkError: (issue) => issue
|
|
28
|
+
});
|
|
29
|
+
} catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
/** Default acquire timeout — architecture § Claim protocol step 1
|
|
34
|
+
* ("Block up to 5 seconds; if unavailable, retry with backoff"). */
|
|
35
|
+
const DEFAULT_ACQUIRE_TIMEOUT_MILLIS = 5e3;
|
|
36
|
+
/** Per-attempt initial wait. Doubles each retry up to the cap. */
|
|
37
|
+
const INITIAL_BACKOFF_MILLIS = 25;
|
|
38
|
+
const MAX_BACKOFF_MILLIS = 500;
|
|
39
|
+
/**
|
|
40
|
+
* Sync attempt at O_EXCL-create. Returns whether we own the lock now.
|
|
41
|
+
*
|
|
42
|
+
* Effect-platform's FileSystem doesn't expose a sync `open` shape, but
|
|
43
|
+
* the critical-section discipline says we need a non-blocking attempt
|
|
44
|
+
* inside a retry loop. Falling through to Node sync APIs here is the
|
|
45
|
+
* cleanest path; the rest of the substrate stays Effect-native.
|
|
46
|
+
*/
|
|
47
|
+
const tryAcquireSync = (path) => {
|
|
48
|
+
const body = ownHolder();
|
|
49
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
50
|
+
try {
|
|
51
|
+
writeFileSync(path, JSON.stringify(body), { flag: "wx" });
|
|
52
|
+
return { ok: true };
|
|
53
|
+
} catch (err) {
|
|
54
|
+
if (err.code !== "EEXIST") throw err;
|
|
55
|
+
if (!existsSync(path)) return {
|
|
56
|
+
ok: false,
|
|
57
|
+
holder: null
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
return {
|
|
61
|
+
ok: false,
|
|
62
|
+
holder: parseLockBody(readFileSync(path, "utf8"))
|
|
63
|
+
};
|
|
64
|
+
} catch {
|
|
65
|
+
return {
|
|
66
|
+
ok: false,
|
|
67
|
+
holder: null
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Acquire `stack.lock` as a scoped resource. The lock is released
|
|
74
|
+
* when the surrounding Scope closes.
|
|
75
|
+
*
|
|
76
|
+
* Retry loop: exponential backoff up to `timeoutMillis` (default 5s).
|
|
77
|
+
* On every miss, probe the holder's liveness — if it's dead, reclaim
|
|
78
|
+
* by unlinking and looping. The reclaim path is the architecture's
|
|
79
|
+
* "stale lock" handling — same PID + start-time semantics as the
|
|
80
|
+
* roster sweep, so a process that crashed under the lock never blocks
|
|
81
|
+
* the next peer indefinitely.
|
|
82
|
+
*
|
|
83
|
+
* IMPORTANT: this primitive yields a `void` resource. The caller MUST
|
|
84
|
+
* keep its Scope tight — the architecture forbids holding the lock
|
|
85
|
+
* across long operations.
|
|
86
|
+
*/
|
|
87
|
+
const acquireStackLock = (path, timeoutMillis = DEFAULT_ACQUIRE_TIMEOUT_MILLIS) => Effect.gen(function* () {
|
|
88
|
+
yield* Effect.annotateCurrentSpan({
|
|
89
|
+
"devstack.stack-lock.path": path,
|
|
90
|
+
"devstack.stack-lock.timeoutMillis": timeoutMillis
|
|
91
|
+
});
|
|
92
|
+
const startedAt = Date.now();
|
|
93
|
+
let backoff = INITIAL_BACKOFF_MILLIS;
|
|
94
|
+
let lastHolder = null;
|
|
95
|
+
while (true) {
|
|
96
|
+
const elapsed = Date.now() - startedAt;
|
|
97
|
+
if (elapsed > timeoutMillis) return yield* Effect.fail(new StackLockTimeoutError({
|
|
98
|
+
path,
|
|
99
|
+
waitedMillis: elapsed,
|
|
100
|
+
holder: lastHolder
|
|
101
|
+
}));
|
|
102
|
+
const attempt = yield* Effect.try({
|
|
103
|
+
try: () => tryAcquireSync(path),
|
|
104
|
+
catch: (cause) => new StackLockIoError({
|
|
105
|
+
path,
|
|
106
|
+
cause
|
|
107
|
+
})
|
|
108
|
+
});
|
|
109
|
+
if (attempt.ok) {
|
|
110
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
111
|
+
try {
|
|
112
|
+
unlinkSync(path);
|
|
113
|
+
} catch {}
|
|
114
|
+
}));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
lastHolder = attempt.holder;
|
|
118
|
+
if (lastHolder !== null) {
|
|
119
|
+
if ((yield* checkHolderLiveness(lastHolder).pipe(Effect.catch(() => Effect.succeed("alive")))) === "dead") {
|
|
120
|
+
yield* Effect.try({
|
|
121
|
+
try: () => {
|
|
122
|
+
try {
|
|
123
|
+
unlinkSync(path);
|
|
124
|
+
} catch {}
|
|
125
|
+
return null;
|
|
126
|
+
},
|
|
127
|
+
catch: (cause) => new StackLockIoError({
|
|
128
|
+
path,
|
|
129
|
+
cause
|
|
130
|
+
})
|
|
131
|
+
});
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
yield* Effect.sleep(`${backoff} millis`);
|
|
136
|
+
backoff = Math.min(backoff * 2, MAX_BACKOFF_MILLIS);
|
|
137
|
+
}
|
|
138
|
+
}).pipe(Effect.withSpan("cross-process.stack-lock.acquire"));
|
|
139
|
+
//#endregion
|
|
140
|
+
export { acquireStackLock };
|
|
141
|
+
|
|
142
|
+
//# sourceMappingURL=stack-lock.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-lock.mjs","names":[],"sources":["../../../../src/substrate/runtime/cross-process/stack-lock.ts"],"sourcesContent":["// `stack.lock` — O_EXCL exclusive lock for short critical sections.\n//\n// Architecture § Cross-process safety protocol § \"What is locked\":\n// - `stack.lock` — OS-advisory exclusive lock file. Used only for\n// short critical sections (roster mutations, snapshot reservation).\n// Acquired via `flock(LOCK_EX)` on Unix and `LockFileEx` on Windows;\n// never held across a long operation.\n//\n// The implementation here uses a portable O_EXCL-create dance — the\n// same approach the legacy `engine/file-lock.ts` proved out — because\n// `flock` isn't available cross-platform out of `node:fs`. The\n// architecture's wording (\"OS-advisory exclusive lock file\") covers\n// both `flock` and `O_EXCL`-with-pid-body; the latter is what every\n// portable POSIX tool reaches for when `flock` isn't on the table.\n//\n// Discipline:\n// - The lock is held BRIEFLY — within a single Effect.scoped block\n// that mutates the roster or the snapshot reservation.\n// - Stale locks (owner crashed under the lock) are reclaimed via the\n// PID + start-time liveness check before the acquire reattempts.\n// - Acquire retries with exponential backoff up to 5 seconds total\n// (architecture § Claim protocol step 1).\n\nimport { mkdirSync, unlinkSync, readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { Data, Effect, Schema, Scope } from 'effect';\n\nimport { decodeJsonTextSync } from '../runtime-decode.ts';\nimport { checkHolderLiveness, ownHolder } from './liveness.ts';\nimport type { RosterHolder } from '../../cross-process.ts';\n\n// -----------------------------------------------------------------------------\n// Errors\n// -----------------------------------------------------------------------------\n\n/** Tagged failure: acquire window elapsed and the lock is still held.\n * Carries the in-disk body (if parseable) so the caller can name the\n * blocking peer in user-facing error reporting. */\nexport class StackLockTimeoutError extends Data.TaggedError('StackLockTimeoutError')<{\n\treadonly path: string;\n\treadonly waitedMillis: number;\n\treadonly holder: RosterHolder | null;\n}> {}\n\n/** Tagged failure: I/O error other than EEXIST during acquire. */\nexport class StackLockIoError extends Data.TaggedError('StackLockIoError')<{\n\treadonly path: string;\n\treadonly cause: unknown;\n}> {}\n\nexport type StackLockError = StackLockTimeoutError | StackLockIoError;\n\n// -----------------------------------------------------------------------------\n// Codec\n// -----------------------------------------------------------------------------\n\n/** The on-disk body is the same `RosterHolder` shape — re-using the schema\n * means roster sweep + stack-lock reclaim see the same fields. */\nconst StackLockBodySchema = Schema.Struct({\n\tpid: Schema.Number,\n\tstartTime: Schema.Number,\n\thostname: Schema.String,\n\tclaimedAt: Schema.Number,\n\theartbeatAt: Schema.Number,\n\tintent: Schema.Literals(['normal', 'snapshot']),\n});\n\nconst parseLockBody = (raw: string): RosterHolder | null => {\n\ttry {\n\t\treturn decodeJsonTextSync(StackLockBodySchema, raw, {\n\t\t\tsource: 'stack.lock',\n\t\t\tmkError: (issue) => issue,\n\t\t});\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Acquire / release\n// -----------------------------------------------------------------------------\n\n/** Default acquire timeout — architecture § Claim protocol step 1\n * (\"Block up to 5 seconds; if unavailable, retry with backoff\"). */\nexport const DEFAULT_ACQUIRE_TIMEOUT_MILLIS = 5_000;\n\n/** Per-attempt initial wait. Doubles each retry up to the cap. */\nconst INITIAL_BACKOFF_MILLIS = 25;\nconst MAX_BACKOFF_MILLIS = 500;\n\n/**\n * Sync attempt at O_EXCL-create. Returns whether we own the lock now.\n *\n * Effect-platform's FileSystem doesn't expose a sync `open` shape, but\n * the critical-section discipline says we need a non-blocking attempt\n * inside a retry loop. Falling through to Node sync APIs here is the\n * cleanest path; the rest of the substrate stays Effect-native.\n */\nconst tryAcquireSync = (\n\tpath: string,\n): { readonly ok: true } | { readonly ok: false; readonly holder: RosterHolder | null } => {\n\tconst body = ownHolder();\n\t// The lock's parent directory may not exist on first-claim of a\n\t// fresh runtime root — devstack's `<runtimeRoot>/stacks/<stack>/` is\n\t// the substrate's responsibility to bring into being, but no other\n\t// L0 subsystem touches the disk until the first claim. `mkdir -p`\n\t// here is idempotent and harmless on the warm path; it transforms\n\t// the otherwise-fatal ENOENT-during-write into a clean acquire.\n\t// Architecture § Cross-process safety protocol: stack root is\n\t// created by whichever subsystem first reaches for a path under it.\n\tmkdirSync(dirname(path), { recursive: true });\n\ttry {\n\t\twriteFileSync(path, JSON.stringify(body), { flag: 'wx' });\n\t\treturn { ok: true };\n\t} catch (err) {\n\t\tconst code = (err as NodeJS.ErrnoException).code;\n\t\tif (code !== 'EEXIST') {\n\t\t\tthrow err;\n\t\t}\n\t\t// Peer holds it (or stale). Probe the existing body.\n\t\tif (!existsSync(path)) {\n\t\t\t// Race: holder unlinked between our EEXIST and the existsSync.\n\t\t\t// Retry on the next loop iteration.\n\t\t\treturn { ok: false, holder: null };\n\t\t}\n\t\ttry {\n\t\t\tconst raw = readFileSync(path, 'utf8');\n\t\t\treturn { ok: false, holder: parseLockBody(raw) };\n\t\t} catch {\n\t\t\treturn { ok: false, holder: null };\n\t\t}\n\t}\n};\n\n/**\n * Acquire `stack.lock` as a scoped resource. The lock is released\n * when the surrounding Scope closes.\n *\n * Retry loop: exponential backoff up to `timeoutMillis` (default 5s).\n * On every miss, probe the holder's liveness — if it's dead, reclaim\n * by unlinking and looping. The reclaim path is the architecture's\n * \"stale lock\" handling — same PID + start-time semantics as the\n * roster sweep, so a process that crashed under the lock never blocks\n * the next peer indefinitely.\n *\n * IMPORTANT: this primitive yields a `void` resource. The caller MUST\n * keep its Scope tight — the architecture forbids holding the lock\n * across long operations.\n */\nexport const acquireStackLock = (\n\tpath: string,\n\ttimeoutMillis: number = DEFAULT_ACQUIRE_TIMEOUT_MILLIS,\n): Effect.Effect<void, StackLockError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'devstack.stack-lock.path': path,\n\t\t\t'devstack.stack-lock.timeoutMillis': timeoutMillis,\n\t\t});\n\t\tconst startedAt = Date.now();\n\t\tlet backoff = INITIAL_BACKOFF_MILLIS;\n\t\tlet lastHolder: RosterHolder | null = null;\n\t\twhile (true) {\n\t\t\tconst elapsed = Date.now() - startedAt;\n\t\t\tif (elapsed > timeoutMillis) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew StackLockTimeoutError({ path, waitedMillis: elapsed, holder: lastHolder }),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst attempt = yield* Effect.try({\n\t\t\t\ttry: () => tryAcquireSync(path),\n\t\t\t\tcatch: (cause) => new StackLockIoError({ path, cause }),\n\t\t\t});\n\t\t\tif (attempt.ok) {\n\t\t\t\t// Register a finalizer that unlinks the lock on scope close.\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tunlinkSync(path);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Already gone — ok. Crash-during-release is handled\n\t\t\t\t\t\t\t// by the next peer's stale-PID reclaim.\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastHolder = attempt.holder;\n\t\t\t// Reclaim if the holder is dead.\n\t\t\tif (lastHolder !== null) {\n\t\t\t\tconst status = yield* checkHolderLiveness(lastHolder).pipe(\n\t\t\t\t\tEffect.catch(() => Effect.succeed('alive' as const)),\n\t\t\t\t);\n\t\t\t\tif (status === 'dead') {\n\t\t\t\t\tyield* Effect.try({\n\t\t\t\t\t\ttry: () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tunlinkSync(path);\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t// Race with another reclaimer — ok.\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcatch: (cause) => new StackLockIoError({ path, cause }),\n\t\t\t\t\t});\n\t\t\t\t\t// Loop again immediately; don't sleep for a reclaim.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tyield* Effect.sleep(`${backoff} millis`);\n\t\t\tbackoff = Math.min(backoff * 2, MAX_BACKOFF_MILLIS);\n\t\t}\n\t}).pipe(Effect.withSpan('cross-process.stack-lock.acquire'));\n"],"mappings":";;;;;;;;;AAuCA,IAAa,wBAAb,cAA2C,KAAK,YAAY,wBAAwB,CAIjF;;AAGH,IAAa,mBAAb,cAAsC,KAAK,YAAY,mBAAmB,CAGvE;;;AAUH,MAAM,sBAAsB,OAAO,OAAO;CACzC,KAAK,OAAO;CACZ,WAAW,OAAO;CAClB,UAAU,OAAO;CACjB,WAAW,OAAO;CAClB,aAAa,OAAO;CACpB,QAAQ,OAAO,SAAS,CAAC,UAAU,WAAW,CAAC;CAC/C,CAAC;AAEF,MAAM,iBAAiB,QAAqC;AAC3D,KAAI;AACH,SAAO,mBAAmB,qBAAqB,KAAK;GACnD,QAAQ;GACR,UAAU,UAAU;GACpB,CAAC;SACK;AACP,SAAO;;;;;AAUT,MAAa,iCAAiC;;AAG9C,MAAM,yBAAyB;AAC/B,MAAM,qBAAqB;;;;;;;;;AAU3B,MAAM,kBACL,SAC0F;CAC1F,MAAM,OAAO,WAAW;AASxB,WAAU,QAAQ,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;AAC7C,KAAI;AACH,gBAAc,MAAM,KAAK,UAAU,KAAK,EAAE,EAAE,MAAM,MAAM,CAAC;AACzD,SAAO,EAAE,IAAI,MAAM;UACX,KAAK;AAEb,MADc,IAA8B,SAC/B,SACZ,OAAM;AAGP,MAAI,CAAC,WAAW,KAAK,CAGpB,QAAO;GAAE,IAAI;GAAO,QAAQ;GAAM;AAEnC,MAAI;AAEH,UAAO;IAAE,IAAI;IAAO,QAAQ,cADhB,aAAa,MAAM,OACc,CAAC;IAAE;UACzC;AACP,UAAO;IAAE,IAAI;IAAO,QAAQ;IAAM;;;;;;;;;;;;;;;;;;;AAoBrC,MAAa,oBACZ,MACA,gBAAwB,mCAExB,OAAO,IAAI,aAAa;AACvB,QAAO,OAAO,oBAAoB;EACjC,4BAA4B;EAC5B,qCAAqC;EACrC,CAAC;CACF,MAAM,YAAY,KAAK,KAAK;CAC5B,IAAI,UAAU;CACd,IAAI,aAAkC;AACtC,QAAO,MAAM;EACZ,MAAM,UAAU,KAAK,KAAK,GAAG;AAC7B,MAAI,UAAU,cACb,QAAO,OAAO,OAAO,KACpB,IAAI,sBAAsB;GAAE;GAAM,cAAc;GAAS,QAAQ;GAAY,CAAC,CAC9E;EAEF,MAAM,UAAU,OAAO,OAAO,IAAI;GACjC,WAAW,eAAe,KAAK;GAC/B,QAAQ,UAAU,IAAI,iBAAiB;IAAE;IAAM;IAAO,CAAC;GACvD,CAAC;AACF,MAAI,QAAQ,IAAI;AAEf,UAAO,OAAO,mBACb,OAAO,WAAW;AACjB,QAAI;AACH,gBAAW,KAAK;YACT;KAIP,CACF;AACD;;AAED,eAAa,QAAQ;AAErB,MAAI,eAAe;QAId,OAHkB,oBAAoB,WAAW,CAAC,KACrD,OAAO,YAAY,OAAO,QAAQ,QAAiB,CAAC,CACpD,MACc,QAAQ;AACtB,WAAO,OAAO,IAAI;KACjB,WAAW;AACV,UAAI;AACH,kBAAW,KAAK;cACT;AAGR,aAAO;;KAER,QAAQ,UAAU,IAAI,iBAAiB;MAAE;MAAM;MAAO,CAAC;KACvD,CAAC;AAEF;;;AAGF,SAAO,OAAO,MAAM,GAAG,QAAQ,SAAS;AACxC,YAAU,KAAK,IAAI,UAAU,GAAG,mBAAmB;;EAEnD,CAAC,KAAK,OAAO,SAAS,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Context, Effect, Option } from "effect";
|
|
2
|
+
//#region src/substrate/runtime/current-plugin.ts
|
|
3
|
+
var CurrentPluginKey = class extends Context.Service()("@devstack-rewrite/substrate/CurrentPluginKey") {};
|
|
4
|
+
var CurrentPluginProgress = class extends Context.Service()("@devstack-rewrite/substrate/CurrentPluginProgress") {};
|
|
5
|
+
/** Publish acquire-time row narration for the currently supervised
|
|
6
|
+
* plugin. Safe to call from plugin code: if the caller is running
|
|
7
|
+
* outside a supervisor, the helper is a no-op. */
|
|
8
|
+
const setCurrentPluginPhase = (phase) => Effect.gen(function* () {
|
|
9
|
+
const progress = yield* Effect.serviceOption(CurrentPluginProgress);
|
|
10
|
+
if (Option.isSome(progress)) yield* progress.value.setPhase(phase);
|
|
11
|
+
});
|
|
12
|
+
//#endregion
|
|
13
|
+
export { CurrentPluginKey, CurrentPluginProgress, setCurrentPluginPhase };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=current-plugin.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-plugin.mjs","names":[],"sources":["../../../src/substrate/runtime/current-plugin.ts"],"sourcesContent":["import { Context, Effect, Option } from 'effect';\n\nimport type { PluginKey } from '../brand.ts';\nimport type { PhaseNarration } from '../lifecycle.ts';\n\n/** Acquire-time identity for the plugin currently being supervised.\n *\n * Plugins that stream host-process output need the supervisor-minted\n * row key so logger lines publish as `log.appended` events for the\n * correct projection row. */\nexport interface CurrentPluginKeyShape {\n\treadonly key: PluginKey;\n}\n\nexport class CurrentPluginKey extends Context.Service<CurrentPluginKey, CurrentPluginKeyShape>()(\n\t'@devstack-rewrite/substrate/CurrentPluginKey',\n) {}\n\nexport interface CurrentPluginProgressShape {\n\treadonly setPhase: (phase: PhaseNarration | null) => Effect.Effect<void>;\n}\n\nexport class CurrentPluginProgress extends Context.Service<\n\tCurrentPluginProgress,\n\tCurrentPluginProgressShape\n>()('@devstack-rewrite/substrate/CurrentPluginProgress') {}\n\n/** Publish acquire-time row narration for the currently supervised\n * plugin. Safe to call from plugin code: if the caller is running\n * outside a supervisor, the helper is a no-op. */\nexport const setCurrentPluginPhase = (phase: PhaseNarration | null): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tconst progress = yield* Effect.serviceOption(CurrentPluginProgress);\n\t\tif (Option.isSome(progress)) {\n\t\t\tyield* progress.value.setPhase(phase);\n\t\t}\n\t});\n"],"mappings":";;AAcA,IAAa,mBAAb,cAAsC,QAAQ,SAAkD,CAC/F,+CACA,CAAC;AAMF,IAAa,wBAAb,cAA2C,QAAQ,SAGhD,CAAC,oDAAoD,CAAC;;;;AAKzD,MAAa,yBAAyB,UACrC,OAAO,IAAI,aAAa;CACvB,MAAM,WAAW,OAAO,OAAO,cAAc,sBAAsB;AACnE,KAAI,OAAO,OAAO,SAAS,CAC1B,QAAO,SAAS,MAAM,SAAS,MAAM;EAErC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
//#region src/substrate/runtime/errors.ts
|
|
3
|
+
/** Atomic-write failure — one tag covers every stage. The `stage`
|
|
4
|
+
* field discriminates inside renderer messages without
|
|
5
|
+
* proliferating tag types. */
|
|
6
|
+
var AtomicWriteFailed = class extends Schema.TaggedErrorClass()("AtomicWriteFailed", {
|
|
7
|
+
path: Schema.String,
|
|
8
|
+
stage: Schema.Literals([
|
|
9
|
+
"mkdir-parent",
|
|
10
|
+
"open-temp",
|
|
11
|
+
"write",
|
|
12
|
+
"fsync",
|
|
13
|
+
"rename",
|
|
14
|
+
"encode"
|
|
15
|
+
]),
|
|
16
|
+
cause: Schema.optional(Schema.Defect)
|
|
17
|
+
}) {};
|
|
18
|
+
Schema.TaggedErrorClass()("StateStoreError", {
|
|
19
|
+
reason: Schema.Literals([
|
|
20
|
+
"io-failed",
|
|
21
|
+
"corruption",
|
|
22
|
+
"lock-contention"
|
|
23
|
+
]),
|
|
24
|
+
detail: Schema.String,
|
|
25
|
+
cause: Schema.optional(Schema.Defect)
|
|
26
|
+
});
|
|
27
|
+
/** Cache surface — same tri-state as the L0 cache contract. */
|
|
28
|
+
var CacheError = class extends Schema.TaggedErrorClass()("CacheError", {
|
|
29
|
+
reason: Schema.Literals([
|
|
30
|
+
"io-failed",
|
|
31
|
+
"corruption",
|
|
32
|
+
"lock-contention"
|
|
33
|
+
]),
|
|
34
|
+
detail: Schema.String,
|
|
35
|
+
cause: Schema.optional(Schema.Defect)
|
|
36
|
+
}) {};
|
|
37
|
+
/** Strategy registry missing-key surface — mirrors
|
|
38
|
+
* `StrategyNotFoundError` from `contracts/strategy-contributor.ts`
|
|
39
|
+
* as a yieldable. */
|
|
40
|
+
var StrategyNotFoundError = class extends Schema.TaggedErrorClass()("StrategyNotFoundError", {
|
|
41
|
+
capabilityKey: Schema.String,
|
|
42
|
+
registeredKeys: Schema.Array(Schema.String)
|
|
43
|
+
}) {};
|
|
44
|
+
/** Port-broker allocation failure — surfaced when no free port could be
|
|
45
|
+
* found in the configured range, when a caller-supplied `preferredPort`
|
|
46
|
+
* is already taken by another in-process allocation, or when the bind-
|
|
47
|
+
* probe rejected every candidate.
|
|
48
|
+
*
|
|
49
|
+
* `reason` discriminates the failure mode for renderer mapping:
|
|
50
|
+
* - `no-free-port` : scanned the whole window for `kind`, every
|
|
51
|
+
* candidate failed the bind-probe (EADDRINUSE) or
|
|
52
|
+
* was already held by a sibling allocation in
|
|
53
|
+
* this process.
|
|
54
|
+
* - `preferred-busy`: caller supplied a `preferredPort` and the
|
|
55
|
+
* port is currently held by another in-process
|
|
56
|
+
* allocation (refused per architecture §6).
|
|
57
|
+
* - `bind-probe-failed`: the OS-level bind probe surfaced an error
|
|
58
|
+
* OTHER than `EADDRINUSE` (e.g. EACCES on a
|
|
59
|
+
* privileged port, EPERM under jail). Caller
|
|
60
|
+
* should fall back to user opt-in / docs.
|
|
61
|
+
* - `reservation-failed`: the runtime-root scoped port reservation
|
|
62
|
+
* file could not be created/read/reclaimed. */
|
|
63
|
+
var PortBrokerError = class extends Schema.TaggedErrorClass()("PortBrokerError", {
|
|
64
|
+
reason: Schema.Literals([
|
|
65
|
+
"no-free-port",
|
|
66
|
+
"preferred-busy",
|
|
67
|
+
"bind-probe-failed",
|
|
68
|
+
"reservation-failed"
|
|
69
|
+
]),
|
|
70
|
+
detail: Schema.String,
|
|
71
|
+
cause: Schema.optional(Schema.Defect)
|
|
72
|
+
}) {};
|
|
73
|
+
//#endregion
|
|
74
|
+
export { AtomicWriteFailed, CacheError, PortBrokerError, StrategyNotFoundError };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=errors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.mjs","names":[],"sources":["../../../src/substrate/runtime/errors.ts"],"sourcesContent":["// Shared tagged errors for the runtime persistence layer.\n//\n// Per-subsystem tags so `Effect.catchTags({ ... })` reads at the call\n// site as \"what did the state-store / cache / registry just fail with\".\n\nimport { Schema } from 'effect';\n\n/** Atomic-write failure — one tag covers every stage. The `stage`\n * field discriminates inside renderer messages without\n * proliferating tag types. */\nexport class AtomicWriteFailed extends Schema.TaggedErrorClass<AtomicWriteFailed>()(\n\t'AtomicWriteFailed',\n\t{\n\t\tpath: Schema.String,\n\t\tstage: Schema.Literals(['mkdir-parent', 'open-temp', 'write', 'fsync', 'rename', 'encode']),\n\t\tcause: Schema.optional(Schema.Defect),\n\t},\n) {}\n\n/** State-store I/O / corruption surface. Distinct from\n * `AtomicWriteFailed` so consumers can recover (\"re-init on\n * corruption\") without catching write errors. */\nexport class StateStoreError extends Schema.TaggedErrorClass<StateStoreError>()('StateStoreError', {\n\treason: Schema.Literals(['io-failed', 'corruption', 'lock-contention']),\n\tdetail: Schema.String,\n\tcause: Schema.optional(Schema.Defect),\n}) {}\n\n/** Cache surface — same tri-state as the L0 cache contract. */\nexport class CacheError extends Schema.TaggedErrorClass<CacheError>()('CacheError', {\n\treason: Schema.Literals(['io-failed', 'corruption', 'lock-contention']),\n\tdetail: Schema.String,\n\tcause: Schema.optional(Schema.Defect),\n}) {}\n\n/** Strategy registry missing-key surface — mirrors\n * `StrategyNotFoundError` from `contracts/strategy-contributor.ts`\n * as a yieldable. */\nexport class StrategyNotFoundError extends Schema.TaggedErrorClass<StrategyNotFoundError>()(\n\t'StrategyNotFoundError',\n\t{\n\t\tcapabilityKey: Schema.String,\n\t\tregisteredKeys: Schema.Array(Schema.String),\n\t},\n) {}\n\n/** Port-broker allocation failure — surfaced when no free port could be\n * found in the configured range, when a caller-supplied `preferredPort`\n * is already taken by another in-process allocation, or when the bind-\n * probe rejected every candidate.\n *\n * `reason` discriminates the failure mode for renderer mapping:\n * - `no-free-port` : scanned the whole window for `kind`, every\n * candidate failed the bind-probe (EADDRINUSE) or\n * was already held by a sibling allocation in\n * this process.\n * - `preferred-busy`: caller supplied a `preferredPort` and the\n * port is currently held by another in-process\n * allocation (refused per architecture §6).\n * - `bind-probe-failed`: the OS-level bind probe surfaced an error\n * OTHER than `EADDRINUSE` (e.g. EACCES on a\n * privileged port, EPERM under jail). Caller\n * should fall back to user opt-in / docs.\n * - `reservation-failed`: the runtime-root scoped port reservation\n * file could not be created/read/reclaimed. */\nexport class PortBrokerError extends Schema.TaggedErrorClass<PortBrokerError>()('PortBrokerError', {\n\treason: Schema.Literals([\n\t\t'no-free-port',\n\t\t'preferred-busy',\n\t\t'bind-probe-failed',\n\t\t'reservation-failed',\n\t]),\n\tdetail: Schema.String,\n\tcause: Schema.optional(Schema.Defect),\n}) {}\n"],"mappings":";;;;;AAUA,IAAa,oBAAb,cAAuC,OAAO,kBAAqC,CAClF,qBACA;CACC,MAAM,OAAO;CACb,OAAO,OAAO,SAAS;EAAC;EAAgB;EAAa;EAAS;EAAS;EAAU;EAAS,CAAC;CAC3F,OAAO,OAAO,SAAS,OAAO,OAAO;CACrC,CACD,CAAC;AAKmC,OAAO,kBAAmC,CAAC,mBAAmB;CAClG,QAAQ,OAAO,SAAS;EAAC;EAAa;EAAc;EAAkB,CAAC;CACvE,QAAQ,OAAO;CACf,OAAO,OAAO,SAAS,OAAO,OAAO;CACrC,CAAC;;AAGF,IAAa,aAAb,cAAgC,OAAO,kBAA8B,CAAC,cAAc;CACnF,QAAQ,OAAO,SAAS;EAAC;EAAa;EAAc;EAAkB,CAAC;CACvE,QAAQ,OAAO;CACf,OAAO,OAAO,SAAS,OAAO,OAAO;CACrC,CAAC,CAAC;;;;AAKH,IAAa,wBAAb,cAA2C,OAAO,kBAAyC,CAC1F,yBACA;CACC,eAAe,OAAO;CACtB,gBAAgB,OAAO,MAAM,OAAO,OAAO;CAC3C,CACD,CAAC;;;;;;;;;;;;;;;;;;;;AAqBF,IAAa,kBAAb,cAAqC,OAAO,kBAAmC,CAAC,mBAAmB;CAClG,QAAQ,OAAO,SAAS;EACvB;EACA;EACA;EACA;EACA,CAAC;CACF,QAAQ,OAAO;CACf,OAAO,OAAO,SAAS,OAAO,OAAO;CACrC,CAAC,CAAC"}
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { awaitProcessExit, describeProcessExitStatus } from "../process-supervisor.mjs";
|
|
2
|
+
import { Effect, Schema, Stream } from "effect";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
//#region src/substrate/runtime/host-tree-tar/index.ts
|
|
5
|
+
/** Tagged failure during tar / untar. `stage` discriminates the
|
|
6
|
+
* precise step (spawn vs stream-read vs exit-code).
|
|
7
|
+
*
|
|
8
|
+
* `cause` carries the underlying error verbatim; the cascade
|
|
9
|
+
* formatter walks it. */
|
|
10
|
+
var HostTreeTarError = class extends Schema.TaggedErrorClass()("HostTreeTarError", {
|
|
11
|
+
stage: Schema.Literals([
|
|
12
|
+
"spawn",
|
|
13
|
+
"stream-stdout",
|
|
14
|
+
"stream-stdin",
|
|
15
|
+
"exit-code",
|
|
16
|
+
"entry-validation",
|
|
17
|
+
"no-subtrees"
|
|
18
|
+
]),
|
|
19
|
+
operation: Schema.Literals(["tar", "untar"]),
|
|
20
|
+
detail: Schema.String,
|
|
21
|
+
/** Captured stderr from the `tar` subprocess (last ~4 KB). */
|
|
22
|
+
stderrTail: Schema.optional(Schema.String),
|
|
23
|
+
exitCode: Schema.optional(Schema.Number),
|
|
24
|
+
cause: Schema.optional(Schema.Defect)
|
|
25
|
+
}) {};
|
|
26
|
+
const TAR_STDERR_TAIL_BYTES = 4096;
|
|
27
|
+
const collectStderrTail = (chunks) => {
|
|
28
|
+
if (chunks.length === 0) return "";
|
|
29
|
+
let total = 0;
|
|
30
|
+
for (let i = chunks.length - 1; i >= 0; i--) {
|
|
31
|
+
total += chunks[i].length;
|
|
32
|
+
if (total >= TAR_STDERR_TAIL_BYTES) break;
|
|
33
|
+
}
|
|
34
|
+
const bytes = Buffer.concat(chunks);
|
|
35
|
+
return bytes.subarray(Math.max(0, bytes.length - TAR_STDERR_TAIL_BYTES)).toString("utf8");
|
|
36
|
+
};
|
|
37
|
+
const tarExitError = (operation, status, stderrChunks) => new HostTreeTarError({
|
|
38
|
+
stage: "exit-code",
|
|
39
|
+
operation,
|
|
40
|
+
exitCode: status.code ?? -1,
|
|
41
|
+
detail: `'tar' exited with ${describeProcessExitStatus(status)}`,
|
|
42
|
+
stderrTail: collectStderrTail(stderrChunks)
|
|
43
|
+
});
|
|
44
|
+
const TAR_BLOCK_SIZE = 512;
|
|
45
|
+
const MAX_TAR_EXTENDED_PATH_BYTES = 1024 * 1024;
|
|
46
|
+
const bytesToString = (bytes) => {
|
|
47
|
+
const nul = bytes.indexOf(0);
|
|
48
|
+
const end = nul === -1 ? bytes.length : nul;
|
|
49
|
+
return Buffer.from(bytes.subarray(0, end)).toString("utf8");
|
|
50
|
+
};
|
|
51
|
+
const concatBytes = (a, b) => {
|
|
52
|
+
if (a.length === 0) return b;
|
|
53
|
+
if (b.length === 0) return a;
|
|
54
|
+
const out = new Uint8Array(a.length + b.length);
|
|
55
|
+
out.set(a, 0);
|
|
56
|
+
out.set(b, a.length);
|
|
57
|
+
return out;
|
|
58
|
+
};
|
|
59
|
+
const consumeBytes = (buffer, count) => buffer.subarray(count);
|
|
60
|
+
const isZeroBlock = (block) => block.every((byte) => byte === 0);
|
|
61
|
+
const parseTarSize = (header) => {
|
|
62
|
+
const raw = bytesToString(header.subarray(124, 136)).trim();
|
|
63
|
+
if (raw === "") return 0;
|
|
64
|
+
if (!/^[0-7]+$/.test(raw)) return null;
|
|
65
|
+
const parsed = Number.parseInt(raw, 8);
|
|
66
|
+
return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null;
|
|
67
|
+
};
|
|
68
|
+
const tarPathFromHeader = (header) => {
|
|
69
|
+
const name = bytesToString(header.subarray(0, 100));
|
|
70
|
+
const prefix = bytesToString(header.subarray(345, 500));
|
|
71
|
+
return prefix === "" ? name : `${prefix}/${name}`;
|
|
72
|
+
};
|
|
73
|
+
const tarLinkPathFromHeader = (header) => bytesToString(header.subarray(157, 257));
|
|
74
|
+
const trimExtendedPath = (bytes) => {
|
|
75
|
+
const value = Buffer.from(bytes).toString("utf8").replace(/\n$/g, "");
|
|
76
|
+
let end = value.length;
|
|
77
|
+
while (end > 0 && value.charCodeAt(end - 1) === 0) end -= 1;
|
|
78
|
+
return value.slice(0, end);
|
|
79
|
+
};
|
|
80
|
+
const isSafeArchivePath = (entryPath) => {
|
|
81
|
+
if (entryPath === "" || entryPath === "." || entryPath.includes("\0") || entryPath.includes("\\") || entryPath.startsWith("/") || /^[A-Za-z]:/.test(entryPath)) return false;
|
|
82
|
+
const meaningfulSegments = entryPath.split("/").filter((segment) => segment !== "" && segment !== ".");
|
|
83
|
+
return meaningfulSegments.length > 0 && !meaningfulSegments.includes("..");
|
|
84
|
+
};
|
|
85
|
+
const parsePaxRecords = (bytes) => {
|
|
86
|
+
const text = Buffer.from(bytes).toString("utf8");
|
|
87
|
+
const records = {};
|
|
88
|
+
let offset = 0;
|
|
89
|
+
while (offset < text.length) {
|
|
90
|
+
const space = text.indexOf(" ", offset);
|
|
91
|
+
if (space === -1) break;
|
|
92
|
+
const lengthText = text.slice(offset, space);
|
|
93
|
+
const recordLength = Number.parseInt(lengthText, 10);
|
|
94
|
+
if (!Number.isSafeInteger(recordLength) || recordLength <= 0) break;
|
|
95
|
+
const record = text.slice(space + 1, offset + recordLength).replace(/\n$/g, "");
|
|
96
|
+
const eq = record.indexOf("=");
|
|
97
|
+
if (eq > 0) records[record.slice(0, eq)] = record.slice(eq + 1);
|
|
98
|
+
offset += recordLength;
|
|
99
|
+
}
|
|
100
|
+
return records;
|
|
101
|
+
};
|
|
102
|
+
const tarValidationError = (detail) => new HostTreeTarError({
|
|
103
|
+
stage: "entry-validation",
|
|
104
|
+
operation: "untar",
|
|
105
|
+
detail
|
|
106
|
+
});
|
|
107
|
+
const applyExtendedContent = (state, content) => {
|
|
108
|
+
const bytes = content.chunks.length === 1 ? content.chunks[0] : Buffer.concat(content.chunks.map((chunk) => Buffer.from(chunk)));
|
|
109
|
+
if (content.kind === "gnu-path") {
|
|
110
|
+
state.pendingPath = trimExtendedPath(bytes);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
if (content.kind === "gnu-link") {
|
|
114
|
+
state.pendingLinkPath = trimExtendedPath(bytes);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const records = parsePaxRecords(bytes);
|
|
118
|
+
if (content.kind === "pax-global" && (records.path !== void 0 || records.linkpath !== void 0)) return tarValidationError("global pax path/linkpath records are not supported in snapshots");
|
|
119
|
+
if (content.kind === "pax-local") {
|
|
120
|
+
if (records.path !== void 0) state.pendingPath = records.path;
|
|
121
|
+
if (records.linkpath !== void 0) state.pendingLinkPath = records.linkpath;
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
};
|
|
125
|
+
const processTarValidationChunk = (state, chunk) => {
|
|
126
|
+
state.buffer = concatBytes(state.buffer, chunk);
|
|
127
|
+
while (state.buffer.length > 0) {
|
|
128
|
+
if (state.content !== null) {
|
|
129
|
+
const content = state.content;
|
|
130
|
+
const remaining = content.paddedSize - content.totalBytesRead;
|
|
131
|
+
const take = Math.min(remaining, state.buffer.length);
|
|
132
|
+
const contentTake = Math.max(0, Math.min(take, content.size - content.contentBytesRead));
|
|
133
|
+
if (contentTake > 0) content.chunks.push(state.buffer.subarray(0, contentTake));
|
|
134
|
+
state.content = {
|
|
135
|
+
...content,
|
|
136
|
+
contentBytesRead: content.contentBytesRead + contentTake,
|
|
137
|
+
totalBytesRead: content.totalBytesRead + take
|
|
138
|
+
};
|
|
139
|
+
state.buffer = consumeBytes(state.buffer, take);
|
|
140
|
+
if (state.content.totalBytesRead === state.content.paddedSize) {
|
|
141
|
+
const completed = state.content;
|
|
142
|
+
state.content = null;
|
|
143
|
+
const error = applyExtendedContent(state, completed);
|
|
144
|
+
if (error !== null) return error;
|
|
145
|
+
}
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (state.skipRemaining > 0) {
|
|
149
|
+
const take = Math.min(state.skipRemaining, state.buffer.length);
|
|
150
|
+
state.skipRemaining -= take;
|
|
151
|
+
state.buffer = consumeBytes(state.buffer, take);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (state.buffer.length < TAR_BLOCK_SIZE) return null;
|
|
155
|
+
const header = state.buffer.subarray(0, TAR_BLOCK_SIZE);
|
|
156
|
+
state.buffer = consumeBytes(state.buffer, TAR_BLOCK_SIZE);
|
|
157
|
+
if (isZeroBlock(header)) continue;
|
|
158
|
+
const size = parseTarSize(header);
|
|
159
|
+
if (size === null) return tarValidationError("tar entry has an invalid size header");
|
|
160
|
+
const paddedSize = Math.ceil(size / TAR_BLOCK_SIZE) * TAR_BLOCK_SIZE;
|
|
161
|
+
const typeflag = String.fromCharCode(header[156] ?? 0).replace("\0", "");
|
|
162
|
+
if (typeflag === "x" || typeflag === "g" || typeflag === "L" || typeflag === "K") {
|
|
163
|
+
if (size > MAX_TAR_EXTENDED_PATH_BYTES) return tarValidationError("tar extended path record is too large");
|
|
164
|
+
state.content = {
|
|
165
|
+
kind: typeflag === "x" ? "pax-local" : typeflag === "g" ? "pax-global" : typeflag === "L" ? "gnu-path" : "gnu-link",
|
|
166
|
+
size,
|
|
167
|
+
paddedSize,
|
|
168
|
+
chunks: [],
|
|
169
|
+
contentBytesRead: 0,
|
|
170
|
+
totalBytesRead: 0
|
|
171
|
+
};
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const entryPath = state.pendingPath ?? tarPathFromHeader(header);
|
|
175
|
+
state.pendingPath = null;
|
|
176
|
+
if (!isSafeArchivePath(entryPath)) return tarValidationError(`unsafe tar entry path: ${entryPath}`);
|
|
177
|
+
const linkPath = state.pendingLinkPath ?? tarLinkPathFromHeader(header);
|
|
178
|
+
state.pendingLinkPath = null;
|
|
179
|
+
if ((typeflag === "1" || typeflag === "2") && !isSafeArchivePath(linkPath)) return tarValidationError(`unsafe tar link target: ${linkPath}`);
|
|
180
|
+
state.skipRemaining = paddedSize;
|
|
181
|
+
}
|
|
182
|
+
return null;
|
|
183
|
+
};
|
|
184
|
+
const finishTarValidation = (state) => {
|
|
185
|
+
if (state.content !== null) return tarValidationError("tar ended inside an extended header");
|
|
186
|
+
if (state.skipRemaining !== 0) return tarValidationError("tar ended inside file content");
|
|
187
|
+
if (state.buffer.length !== 0 && !isZeroBlock(state.buffer)) return tarValidationError("tar ended with a partial header");
|
|
188
|
+
return null;
|
|
189
|
+
};
|
|
190
|
+
const validateHostTreeTarEntries = (stream) => Effect.gen(function* () {
|
|
191
|
+
const state = {
|
|
192
|
+
buffer: new Uint8Array(0),
|
|
193
|
+
skipRemaining: 0,
|
|
194
|
+
content: null,
|
|
195
|
+
pendingPath: null,
|
|
196
|
+
pendingLinkPath: null
|
|
197
|
+
};
|
|
198
|
+
yield* Stream.runForEach(stream, (chunk) => {
|
|
199
|
+
const error = processTarValidationChunk(state, chunk);
|
|
200
|
+
return error === null ? Effect.void : Effect.fail(error);
|
|
201
|
+
});
|
|
202
|
+
const finalError = finishTarValidation(state);
|
|
203
|
+
if (finalError !== null) return yield* Effect.fail(finalError);
|
|
204
|
+
});
|
|
205
|
+
/**
|
|
206
|
+
* Stream the tar archive of `relPaths` (relative to `parentDir`) as a
|
|
207
|
+
* `Stream<Uint8Array>`. Mode bits are preserved.
|
|
208
|
+
*
|
|
209
|
+
* The subprocess is bound to the consuming Scope: closing the scope
|
|
210
|
+
* before the stream finishes kills the subprocess and surfaces
|
|
211
|
+
* `stream-stdout` if the consumer was mid-read.
|
|
212
|
+
*
|
|
213
|
+
* Caller consumes via `Stream.run(...)` — e.g. pipe to a file via
|
|
214
|
+
* `Stream.run(stream, Sink.fromWritable(() => createWriteStream(...)))`
|
|
215
|
+
* or to an in-memory chunk array for the integrity hash.
|
|
216
|
+
*/
|
|
217
|
+
const tarHostTree = (spec) => Stream.unwrap(Effect.gen(function* () {
|
|
218
|
+
if (spec.relPaths.length === 0) return Stream.fail(new HostTreeTarError({
|
|
219
|
+
stage: "no-subtrees",
|
|
220
|
+
operation: "tar",
|
|
221
|
+
detail: "tarHostTree called with empty relPaths list"
|
|
222
|
+
}));
|
|
223
|
+
const args = [
|
|
224
|
+
"-c",
|
|
225
|
+
"-f",
|
|
226
|
+
"-",
|
|
227
|
+
"-C",
|
|
228
|
+
spec.parentDir,
|
|
229
|
+
"-p",
|
|
230
|
+
...spec.relPaths
|
|
231
|
+
];
|
|
232
|
+
const child = yield* Effect.try({
|
|
233
|
+
try: () => spawn("tar", args, { stdio: [
|
|
234
|
+
"ignore",
|
|
235
|
+
"pipe",
|
|
236
|
+
"pipe"
|
|
237
|
+
] }),
|
|
238
|
+
catch: (cause) => new HostTreeTarError({
|
|
239
|
+
stage: "spawn",
|
|
240
|
+
operation: "tar",
|
|
241
|
+
detail: `failed to spawn 'tar ${args.join(" ")}'`,
|
|
242
|
+
cause
|
|
243
|
+
})
|
|
244
|
+
});
|
|
245
|
+
const stderrChunks = [];
|
|
246
|
+
const onStderr = (chunk) => {
|
|
247
|
+
stderrChunks.push(chunk);
|
|
248
|
+
if (stderrChunks.length > 256) stderrChunks.splice(0, stderrChunks.length - 256);
|
|
249
|
+
};
|
|
250
|
+
child.stderr?.on("data", onStderr);
|
|
251
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
252
|
+
child.stderr?.off("data", onStderr);
|
|
253
|
+
if (child.exitCode === null && child.signalCode === null) child.kill("SIGKILL");
|
|
254
|
+
}));
|
|
255
|
+
const stdout = child.stdout;
|
|
256
|
+
if (stdout === null) return Stream.fail(new HostTreeTarError({
|
|
257
|
+
stage: "spawn",
|
|
258
|
+
operation: "tar",
|
|
259
|
+
detail: `'tar' subprocess produced no stdout pipe`
|
|
260
|
+
}));
|
|
261
|
+
const dataStream = Stream.fromAsyncIterable(stdout, (cause) => new HostTreeTarError({
|
|
262
|
+
stage: "stream-stdout",
|
|
263
|
+
operation: "tar",
|
|
264
|
+
detail: `read from tar stdout failed`,
|
|
265
|
+
cause
|
|
266
|
+
}));
|
|
267
|
+
const exitGate = Stream.fromEffect(Effect.promise(() => awaitProcessExit(child)).pipe(Effect.flatMap((status) => status.code === 0 && status.signal === null ? Effect.succeed(new Uint8Array(0)) : Effect.fail(tarExitError("tar", status, stderrChunks))))).pipe(Stream.filter((bytes) => bytes.length > 0));
|
|
268
|
+
return Stream.concat(dataStream, exitGate);
|
|
269
|
+
}));
|
|
270
|
+
/**
|
|
271
|
+
* Extract a tar `Stream<Uint8Array>` into `target`, preserving mode
|
|
272
|
+
* bits. The target directory MUST already exist; the caller is
|
|
273
|
+
* responsible (stage-and-swap creates the staging directory before
|
|
274
|
+
* calling).
|
|
275
|
+
*
|
|
276
|
+
* The subprocess consumes from the stream and writes into `target`;
|
|
277
|
+
* scope close kills the subprocess. The Effect resolves when `tar`
|
|
278
|
+
* exits cleanly (code 0).
|
|
279
|
+
*/
|
|
280
|
+
const untarHostTree = (stream, spec) => Effect.gen(function* () {
|
|
281
|
+
const args = [
|
|
282
|
+
"-x",
|
|
283
|
+
"-f",
|
|
284
|
+
"-",
|
|
285
|
+
"-C",
|
|
286
|
+
spec.target,
|
|
287
|
+
"-p"
|
|
288
|
+
];
|
|
289
|
+
const child = yield* Effect.try({
|
|
290
|
+
try: () => spawn("tar", args, { stdio: [
|
|
291
|
+
"pipe",
|
|
292
|
+
"ignore",
|
|
293
|
+
"pipe"
|
|
294
|
+
] }),
|
|
295
|
+
catch: (cause) => new HostTreeTarError({
|
|
296
|
+
stage: "spawn",
|
|
297
|
+
operation: "untar",
|
|
298
|
+
detail: `failed to spawn 'tar ${args.join(" ")}'`,
|
|
299
|
+
cause
|
|
300
|
+
})
|
|
301
|
+
});
|
|
302
|
+
const stderrChunks = [];
|
|
303
|
+
const onStderr = (chunk) => {
|
|
304
|
+
stderrChunks.push(chunk);
|
|
305
|
+
if (stderrChunks.length > 256) stderrChunks.splice(0, stderrChunks.length - 256);
|
|
306
|
+
};
|
|
307
|
+
child.stderr?.on("data", onStderr);
|
|
308
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
309
|
+
child.stderr?.off("data", onStderr);
|
|
310
|
+
if (child.exitCode === null && child.signalCode === null) child.kill("SIGKILL");
|
|
311
|
+
}));
|
|
312
|
+
const stdin = child.stdin;
|
|
313
|
+
if (stdin === null) return yield* Effect.fail(new HostTreeTarError({
|
|
314
|
+
stage: "spawn",
|
|
315
|
+
operation: "untar",
|
|
316
|
+
detail: `'tar' subprocess produced no stdin pipe`
|
|
317
|
+
}));
|
|
318
|
+
const validationState = {
|
|
319
|
+
buffer: new Uint8Array(0),
|
|
320
|
+
skipRemaining: 0,
|
|
321
|
+
content: null,
|
|
322
|
+
pendingPath: null,
|
|
323
|
+
pendingLinkPath: null
|
|
324
|
+
};
|
|
325
|
+
const writeChunk = (chunk) => Effect.callback((resume) => {
|
|
326
|
+
let settled = false;
|
|
327
|
+
const settle = (effect) => {
|
|
328
|
+
if (!settled) {
|
|
329
|
+
settled = true;
|
|
330
|
+
resume(effect);
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
const onDrain = () => settle(Effect.void);
|
|
334
|
+
if (!stdin.write(chunk, (cause) => {
|
|
335
|
+
stdin.off("drain", onDrain);
|
|
336
|
+
if (cause) settle(Effect.fail(new HostTreeTarError({
|
|
337
|
+
stage: "stream-stdin",
|
|
338
|
+
operation: "untar",
|
|
339
|
+
detail: `write to tar stdin failed`,
|
|
340
|
+
cause
|
|
341
|
+
})));
|
|
342
|
+
else settle(Effect.void);
|
|
343
|
+
})) stdin.once("drain", onDrain);
|
|
344
|
+
});
|
|
345
|
+
yield* Stream.runForEach(stream, (chunk) => Effect.gen(function* () {
|
|
346
|
+
const validationError = processTarValidationChunk(validationState, chunk);
|
|
347
|
+
if (validationError !== null) return yield* Effect.fail(validationError);
|
|
348
|
+
yield* writeChunk(chunk);
|
|
349
|
+
})).pipe(Effect.catch((cause) => cause instanceof HostTreeTarError ? Effect.fail(cause) : Effect.fail(new HostTreeTarError({
|
|
350
|
+
stage: "stream-stdin",
|
|
351
|
+
operation: "untar",
|
|
352
|
+
detail: `source stream raised before EOF`,
|
|
353
|
+
cause
|
|
354
|
+
}))));
|
|
355
|
+
const finalValidationError = finishTarValidation(validationState);
|
|
356
|
+
if (finalValidationError !== null) return yield* Effect.fail(finalValidationError);
|
|
357
|
+
yield* Effect.sync(() => stdin.end());
|
|
358
|
+
const status = yield* Effect.promise(() => awaitProcessExit(child));
|
|
359
|
+
if (status.code !== 0 || status.signal !== null) return yield* Effect.fail(tarExitError("untar", status, stderrChunks));
|
|
360
|
+
}).pipe(Effect.withSpan("substrate.host-tree-tar.untar"));
|
|
361
|
+
//#endregion
|
|
362
|
+
export { HostTreeTarError, tarHostTree, untarHostTree, validateHostTreeTarEntries };
|
|
363
|
+
|
|
364
|
+
//# sourceMappingURL=index.mjs.map
|