@mysten-incubation/devstack 0.0.1 → 0.1.1
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/README.md +8 -4
- package/dashboard-ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dashboard-ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dashboard-ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dashboard-ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
- package/dashboard-ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dashboard-ui/assets/index-Bmi1UtAg.js +1356 -0
- package/dashboard-ui/assets/index-D5EShVt4.js +3 -0
- package/dashboard-ui/assets/index-Deml9drg.css +1 -0
- package/dashboard-ui/index.html +13 -0
- package/dist/api/define-capabilities.d.mts +14 -3
- package/dist/api/define-capabilities.mjs +18 -1
- package/dist/api/define-capabilities.mjs.map +1 -1
- package/dist/api/define-devstack.d.mts +1 -1
- package/dist/api/define-devstack.mjs +6 -26
- package/dist/api/define-devstack.mjs.map +1 -1
- package/dist/api/define-plugin.d.mts +1 -0
- package/dist/api/define-plugin.mjs +2 -0
- package/dist/api/inference-network.d.mts +132 -0
- package/dist/api/inference-network.mjs +105 -16
- package/dist/api/inference-network.mjs.map +1 -1
- package/dist/api/plugin-errors.d.mts +7 -0
- package/dist/api/run-stack.d.mts +20 -9
- package/dist/api/run-stack.mjs +56 -29
- package/dist/api/run-stack.mjs.map +1 -1
- package/dist/build-integrations/playwright/config.d.mts +6 -4
- package/dist/build-integrations/playwright/config.mjs +5 -3
- package/dist/build-integrations/playwright/config.mjs.map +1 -1
- package/dist/build-integrations/playwright/errors.d.mts +1 -1
- package/dist/build-integrations/playwright/global-setup.d.mts +43 -17
- package/dist/build-integrations/playwright/global-setup.mjs +250 -13
- package/dist/build-integrations/playwright/global-setup.mjs.map +1 -1
- package/dist/build-integrations/playwright/index.d.mts +5 -3
- package/dist/build-integrations/playwright/index.mjs +4 -2
- package/dist/build-integrations/playwright/stack-context.d.mts +0 -1
- package/dist/build-integrations/playwright/stack-context.mjs +24 -63
- package/dist/build-integrations/playwright/stack-context.mjs.map +1 -1
- package/dist/build-integrations/playwright/wallet-context.d.mts +7 -10
- package/dist/build-integrations/playwright/wallet-context.mjs +8 -13
- package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -1
- package/dist/build-integrations/runtime/cold-start-url.d.mts +5 -0
- package/dist/build-integrations/runtime/cold-start-url.mjs +4 -3
- package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -1
- package/dist/build-integrations/runtime/conventional-routes.d.mts +51 -0
- package/dist/build-integrations/runtime/conventional-routes.mjs +92 -0
- package/dist/build-integrations/runtime/conventional-routes.mjs.map +1 -0
- package/dist/build-integrations/runtime/discover.d.mts +38 -30
- package/dist/build-integrations/runtime/discover.mjs +73 -70
- package/dist/build-integrations/runtime/discover.mjs.map +1 -1
- package/dist/build-integrations/runtime/endpoint-registry.d.mts +3 -1
- package/dist/build-integrations/runtime/endpoint-registry.mjs +3 -1
- package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -1
- package/dist/build-integrations/runtime/index.d.mts +7 -2
- package/dist/build-integrations/runtime/index.mjs +9 -2
- package/dist/build-integrations/runtime/manifest-types.d.mts +2 -0
- package/dist/build-integrations/runtime/manifest-types.mjs +3 -0
- package/dist/build-integrations/runtime/playwright-stack-context-slot.d.mts +29 -0
- package/dist/build-integrations/runtime/playwright-stack-context-slot.mjs +10 -0
- package/dist/build-integrations/runtime/playwright-stack-context-slot.mjs.map +1 -0
- package/dist/build-integrations/runtime/read-stack-context.d.mts +1 -1
- package/dist/build-integrations/runtime/read-stack-context.mjs +10 -4
- package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -1
- package/dist/build-integrations/runtime/resolve-discovery-env.d.mts +48 -0
- package/dist/build-integrations/runtime/resolve-discovery-env.mjs +42 -0
- package/dist/build-integrations/runtime/resolve-discovery-env.mjs.map +1 -0
- package/dist/build-integrations/runtime/stack-context.d.mts +1 -1
- package/dist/build-integrations/runtime/wallet-paths.mjs +2 -0
- package/dist/build-integrations/vite/index.d.mts +51 -0
- package/dist/build-integrations/vite/index.mjs +73 -0
- package/dist/build-integrations/vite/index.mjs.map +1 -0
- package/dist/build-integrations/vitest/env.d.mts +4 -3
- package/dist/build-integrations/vitest/env.mjs +6 -4
- package/dist/build-integrations/vitest/env.mjs.map +1 -1
- package/dist/build-integrations/vitest/errors.d.mts +25 -4
- package/dist/build-integrations/vitest/errors.mjs +15 -2
- package/dist/build-integrations/vitest/errors.mjs.map +1 -1
- package/dist/build-integrations/vitest/index.d.mts +2 -2
- package/dist/build-integrations/vitest/index.mjs +3 -3
- package/dist/build-integrations/vitest/setup.d.mts +4 -2
- package/dist/build-integrations/vitest/setup.mjs +2 -2
- package/dist/build-integrations/vitest/setup.mjs.map +1 -1
- package/dist/build-integrations/vitest/stack-context.d.mts +0 -1
- package/dist/build-integrations/vitest/stack-context.mjs +33 -13
- package/dist/build-integrations/vitest/stack-context.mjs.map +1 -1
- package/dist/cli/bail.mjs +23 -0
- package/dist/cli/bail.mjs.map +1 -0
- package/dist/{surfaces/cli/commands → cli}/doctor-probes.mjs +26 -16
- package/dist/cli/doctor-probes.mjs.map +1 -0
- package/dist/cli/main.d.mts +15 -1
- package/dist/cli/main.mjs +166 -482
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/prune-direct.mjs +31 -201
- package/dist/cli/prune-direct.mjs.map +1 -1
- package/dist/cli/snapshot-reader.mjs +14 -11
- package/dist/cli/snapshot-reader.mjs.map +1 -1
- package/dist/cli/up-lifecycle.mjs +4 -1
- package/dist/cli/up-lifecycle.mjs.map +1 -1
- package/dist/cli/wirings/apply.mjs +95 -0
- package/dist/cli/wirings/apply.mjs.map +1 -0
- package/dist/cli/wirings/build-verb-layers.mjs +42 -0
- package/dist/cli/wirings/build-verb-layers.mjs.map +1 -0
- package/dist/cli/wirings/config-loader.mjs +69 -0
- package/dist/cli/wirings/config-loader.mjs.map +1 -0
- package/dist/cli/wirings/engine-command.mjs +30 -0
- package/dist/cli/wirings/engine-command.mjs.map +1 -0
- package/dist/cli/wirings/identity.mjs +72 -0
- package/dist/cli/wirings/identity.mjs.map +1 -0
- package/dist/cli/wirings/provide-file-system.mjs +7 -0
- package/dist/cli/wirings/provide-file-system.mjs.map +1 -0
- package/dist/cli/wirings/snapshot.mjs +177 -0
- package/dist/cli/wirings/snapshot.mjs.map +1 -0
- package/dist/cli/wirings/up.mjs +287 -0
- package/dist/cli/wirings/up.mjs.map +1 -0
- package/dist/cli/wirings/wipe.mjs +40 -0
- package/dist/cli/wirings/wipe.mjs.map +1 -0
- package/dist/contracts/capability-decl.d.mts +0 -2
- package/dist/contracts/codegenable.d.mts +43 -0
- package/dist/contracts/container-runtime.d.mts +26 -1
- package/dist/contracts/faucet-strategy.d.mts +25 -0
- package/dist/contracts/funding-strategy.d.mts +42 -0
- package/dist/contracts/plugin-expander.mjs +60 -0
- package/dist/contracts/plugin-expander.mjs.map +1 -0
- package/dist/contracts/projection.d.mts +5 -3
- package/dist/contracts/renderer.d.mts +23 -0
- package/dist/contracts/routable.d.mts +14 -1
- package/dist/contracts/snapshotable.d.mts +25 -3
- package/dist/contracts/wallet-protocol.d.mts +52 -0
- package/dist/contracts/wallet-protocol.mjs +52 -0
- package/dist/contracts/wallet-protocol.mjs.map +1 -0
- package/dist/index.d.mts +26 -25
- package/dist/index.mjs +20 -13
- package/dist/{runtime → orchestrators}/built-in-plugin-layers.mjs +10 -5
- package/dist/orchestrators/built-in-plugin-layers.mjs.map +1 -0
- package/dist/orchestrators/codegen/bindings.d.mts +1 -2
- package/dist/orchestrators/codegen/bindings.mjs +52 -186
- package/dist/orchestrators/codegen/bindings.mjs.map +1 -1
- package/dist/orchestrators/codegen/emit.mjs +19 -1
- package/dist/orchestrators/codegen/emit.mjs.map +1 -1
- package/dist/orchestrators/codegen/errors.mjs +8 -3
- package/dist/orchestrators/codegen/errors.mjs.map +1 -1
- package/dist/orchestrators/codegen/format.mjs +47 -39
- package/dist/orchestrators/codegen/format.mjs.map +1 -1
- package/dist/orchestrators/codegen/gitignore.mjs +3 -1
- package/dist/orchestrators/codegen/gitignore.mjs.map +1 -1
- package/dist/orchestrators/codegen/output-location.mjs +41 -0
- package/dist/orchestrators/codegen/output-location.mjs.map +1 -0
- package/dist/orchestrators/codegen/paths.d.mts +1 -1
- package/dist/orchestrators/codegen/paths.mjs +40 -14
- package/dist/orchestrators/codegen/paths.mjs.map +1 -1
- package/dist/orchestrators/codegen/permissions.mjs +3 -1
- package/dist/orchestrators/codegen/permissions.mjs.map +1 -1
- package/dist/orchestrators/codegen/service.mjs +157 -105
- package/dist/orchestrators/codegen/service.mjs.map +1 -1
- package/dist/orchestrators/lifecycle-prune/errors.mjs +31 -0
- package/dist/orchestrators/lifecycle-prune/errors.mjs.map +1 -0
- package/dist/orchestrators/lifecycle-prune/index.mjs +350 -0
- package/dist/orchestrators/lifecycle-prune/index.mjs.map +1 -0
- package/dist/orchestrators/router/cleanup.mjs +26 -27
- package/dist/orchestrators/router/cleanup.mjs.map +1 -1
- package/dist/orchestrators/router/entrypoints.mjs +2 -2
- package/dist/orchestrators/router/entrypoints.mjs.map +1 -1
- package/dist/orchestrators/router/file-provider.mjs +14 -5
- package/dist/orchestrators/router/file-provider.mjs.map +1 -1
- package/dist/orchestrators/router/hostname.mjs +19 -55
- package/dist/orchestrators/router/hostname.mjs.map +1 -1
- package/dist/orchestrators/router/index.mjs +11 -0
- package/dist/orchestrators/router/profile.mjs +2 -2
- package/dist/orchestrators/router/sentinels.mjs +26 -0
- package/dist/orchestrators/router/sentinels.mjs.map +1 -0
- package/dist/orchestrators/router/service.mjs +40 -37
- package/dist/orchestrators/router/service.mjs.map +1 -1
- package/dist/orchestrators/router/traefik-container.mjs +27 -16
- package/dist/orchestrators/router/traefik-container.mjs.map +1 -1
- package/dist/{substrate/runtime → orchestrators}/run.mjs +26 -21
- package/dist/orchestrators/run.mjs.map +1 -0
- package/dist/orchestrators/runtime-composition.d.mts +1 -1
- package/dist/orchestrators/runtime-composition.mjs +123 -39
- package/dist/orchestrators/runtime-composition.mjs.map +1 -1
- package/dist/orchestrators/snapshot/capture-command.d.mts +1 -0
- package/dist/orchestrators/snapshot/capture-command.mjs +25 -0
- package/dist/orchestrators/snapshot/capture-command.mjs.map +1 -0
- package/dist/orchestrators/snapshot/capture.mjs +42 -28
- package/dist/orchestrators/snapshot/capture.mjs.map +1 -1
- package/dist/orchestrators/snapshot/descriptor.mjs +35 -10
- package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -1
- package/dist/orchestrators/snapshot/identity-guard.mjs +1 -1
- package/dist/orchestrators/snapshot/index.mjs +13 -0
- package/dist/orchestrators/snapshot/integrity.d.mts +1 -1
- package/dist/orchestrators/snapshot/integrity.mjs +73 -17
- package/dist/orchestrators/snapshot/integrity.mjs.map +1 -1
- package/dist/orchestrators/snapshot/pending-marker.d.mts +1 -0
- package/dist/orchestrators/snapshot/pending-marker.mjs +99 -0
- package/dist/orchestrators/snapshot/pending-marker.mjs.map +1 -0
- package/dist/orchestrators/snapshot/phase-error.mjs +23 -0
- package/dist/orchestrators/snapshot/phase-error.mjs.map +1 -0
- package/dist/orchestrators/snapshot/prune.mjs +20 -55
- package/dist/orchestrators/snapshot/prune.mjs.map +1 -1
- package/dist/orchestrators/snapshot/recover-pending.d.mts +1 -0
- package/dist/orchestrators/snapshot/recover-pending.mjs +223 -0
- package/dist/orchestrators/snapshot/recover-pending.mjs.map +1 -0
- package/dist/orchestrators/snapshot/restore.mjs +118 -84
- package/dist/orchestrators/snapshot/restore.mjs.map +1 -1
- package/dist/orchestrators/snapshot/service.mjs +53 -56
- package/dist/orchestrators/snapshot/service.mjs.map +1 -1
- package/dist/orchestrators/snapshot/state-document.d.mts +1 -0
- package/dist/orchestrators/snapshot/state-document.mjs +47 -7
- package/dist/orchestrators/snapshot/state-document.mjs.map +1 -1
- package/dist/orchestrators/snapshot/wipe.mjs +67 -10
- package/dist/orchestrators/snapshot/wipe.mjs.map +1 -1
- package/dist/plugins/account/codegen.mjs +9 -8
- package/dist/plugins/account/codegen.mjs.map +1 -1
- package/dist/plugins/account/errors.d.mts +33 -6
- package/dist/plugins/account/errors.mjs.map +1 -1
- package/dist/plugins/account/funding.d.mts +29 -19
- package/dist/plugins/account/funding.mjs +84 -66
- package/dist/plugins/account/funding.mjs.map +1 -1
- package/dist/plugins/account/index.d.mts +2 -4
- package/dist/plugins/account/index.mjs +64 -31
- package/dist/plugins/account/index.mjs.map +1 -1
- package/dist/plugins/account/keypair.mjs +6 -9
- package/dist/plugins/account/keypair.mjs.map +1 -1
- package/dist/plugins/account/lease.mjs +1 -0
- package/dist/plugins/account/lease.mjs.map +1 -1
- package/dist/plugins/account/registry.d.mts +14 -1
- package/dist/plugins/account/registry.mjs +18 -18
- package/dist/plugins/account/registry.mjs.map +1 -1
- package/dist/plugins/account/service.d.mts +23 -4
- package/dist/plugins/account/service.mjs +83 -45
- package/dist/plugins/account/service.mjs.map +1 -1
- package/dist/plugins/account/snapshot.mjs +2 -5
- package/dist/plugins/account/snapshot.mjs.map +1 -1
- package/dist/plugins/account/spans.mjs +16 -0
- package/dist/plugins/account/spans.mjs.map +1 -0
- package/dist/plugins/account/variants/keystore.mjs +6 -8
- package/dist/plugins/account/variants/keystore.mjs.map +1 -1
- package/dist/plugins/action/build-context.d.mts +3 -2
- package/dist/plugins/action/errors.d.mts +16 -12
- package/dist/plugins/action/errors.mjs.map +1 -1
- package/dist/plugins/action/execute.mjs +65 -103
- package/dist/plugins/action/execute.mjs.map +1 -1
- package/dist/plugins/action/index.d.mts +0 -2
- package/dist/plugins/action/index.mjs +17 -13
- package/dist/plugins/action/index.mjs.map +1 -1
- package/dist/plugins/action/service.mjs +38 -35
- package/dist/plugins/action/service.mjs.map +1 -1
- package/dist/plugins/action/spans.mjs +11 -0
- package/dist/plugins/action/spans.mjs.map +1 -0
- package/dist/plugins/coin/codegen.mjs +9 -8
- package/dist/plugins/coin/codegen.mjs.map +1 -1
- package/dist/plugins/coin/discovery.mjs +8 -4
- package/dist/plugins/coin/discovery.mjs.map +1 -1
- package/dist/plugins/coin/index.d.mts +11 -29
- package/dist/plugins/coin/index.mjs +56 -27
- package/dist/plugins/coin/index.mjs.map +1 -1
- package/dist/plugins/coin/metadata.mjs +8 -15
- package/dist/plugins/coin/metadata.mjs.map +1 -1
- package/dist/plugins/coin/mint.d.mts +30 -11
- package/dist/plugins/coin/mint.mjs +78 -74
- package/dist/plugins/coin/mint.mjs.map +1 -1
- package/dist/plugins/coin/registry.mjs +4 -7
- package/dist/plugins/coin/registry.mjs.map +1 -1
- package/dist/plugins/coin/service.d.mts +39 -1
- package/dist/plugins/coin/service.mjs +11 -4
- package/dist/plugins/coin/service.mjs.map +1 -1
- package/dist/plugins/coin/spans.mjs +20 -0
- package/dist/plugins/coin/spans.mjs.map +1 -0
- package/dist/plugins/dashboard/domain.mjs +402 -0
- package/dist/plugins/dashboard/domain.mjs.map +1 -0
- package/dist/plugins/dashboard/index.d.mts +29 -0
- package/dist/plugins/dashboard/index.mjs +91 -0
- package/dist/plugins/dashboard/index.mjs.map +1 -0
- package/dist/plugins/dashboard/origin-policy.mjs +36 -0
- package/dist/plugins/dashboard/origin-policy.mjs.map +1 -0
- package/dist/plugins/dashboard/routable.mjs +27 -0
- package/dist/plugins/dashboard/routable.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/builder.mjs +21 -0
- package/dist/plugins/dashboard/schema/builder.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/enums.mjs +72 -0
- package/dist/plugins/dashboard/schema/enums.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/root.mjs +351 -0
- package/dist/plugins/dashboard/schema/root.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/types.mjs +508 -0
- package/dist/plugins/dashboard/schema/types.mjs.map +1 -0
- package/dist/plugins/dashboard/schema.mjs +11 -0
- package/dist/plugins/dashboard/schema.mjs.map +1 -0
- package/dist/plugins/dashboard/server.mjs +166 -0
- package/dist/plugins/dashboard/server.mjs.map +1 -0
- package/dist/plugins/deepbook/deploy.mjs +53 -115
- package/dist/plugins/deepbook/deploy.mjs.map +1 -1
- package/dist/plugins/deepbook/errors.mjs +1 -0
- package/dist/plugins/deepbook/errors.mjs.map +1 -1
- package/dist/plugins/deepbook/faucet-strategy.mjs +47 -34
- package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -1
- package/dist/plugins/deepbook/hash.mjs +9 -0
- package/dist/plugins/deepbook/hash.mjs.map +1 -0
- package/dist/plugins/deepbook/index.d.mts +1 -10
- package/dist/plugins/deepbook/index.mjs +25 -22
- package/dist/plugins/deepbook/index.mjs.map +1 -1
- package/dist/plugins/deepbook/pyth/index.mjs +26 -55
- package/dist/plugins/deepbook/pyth/index.mjs.map +1 -1
- package/dist/plugins/deepbook/snapshot.mjs +17 -29
- package/dist/plugins/deepbook/snapshot.mjs.map +1 -1
- package/dist/plugins/deepbook/spans.mjs +18 -0
- package/dist/plugins/deepbook/spans.mjs.map +1 -0
- package/dist/plugins/deepbook/type-strings.mjs +65 -0
- package/dist/plugins/deepbook/type-strings.mjs.map +1 -0
- package/dist/plugins/deepbook/types.d.mts +2 -3
- package/dist/plugins/deepbook/types.mjs.map +1 -1
- package/dist/plugins/faucet/dispatcher.d.mts +21 -2
- package/dist/plugins/faucet/dispatcher.mjs +1 -2
- package/dist/plugins/faucet/dispatcher.mjs.map +1 -1
- package/dist/plugins/faucet/errors.d.mts +11 -24
- package/dist/plugins/faucet/errors.mjs.map +1 -1
- package/dist/plugins/faucet/http.mjs +33 -14
- package/dist/plugins/faucet/http.mjs.map +1 -1
- package/dist/plugins/faucet/index.d.mts +15 -5
- package/dist/plugins/faucet/index.mjs +3 -0
- package/dist/plugins/faucet/index.mjs.map +1 -1
- package/dist/plugins/faucet/spans.mjs +12 -0
- package/dist/plugins/faucet/spans.mjs.map +1 -0
- package/dist/plugins/host-service/errors.d.mts +1 -1
- package/dist/plugins/host-service/index.mjs +34 -8
- package/dist/plugins/host-service/index.mjs.map +1 -1
- package/dist/plugins/host-service/routable.mjs +2 -1
- package/dist/plugins/host-service/routable.mjs.map +1 -1
- package/dist/plugins/host-service/service.d.mts +21 -0
- package/dist/plugins/host-service/service.mjs +136 -81
- package/dist/plugins/host-service/service.mjs.map +1 -1
- package/dist/plugins/internal/acquire-on-chain-artifact.mjs +23 -0
- package/dist/plugins/internal/acquire-on-chain-artifact.mjs.map +1 -0
- package/dist/plugins/internal/codegen-helpers.mjs +18 -0
- package/dist/plugins/internal/codegen-helpers.mjs.map +1 -0
- package/dist/plugins/internal/funding-failure-error.mjs +32 -0
- package/dist/plugins/internal/funding-failure-error.mjs.map +1 -0
- package/dist/plugins/package/build.mjs +1 -1
- package/dist/plugins/package/build.mjs.map +1 -1
- package/dist/plugins/package/codegen.mjs +26 -0
- package/dist/plugins/package/codegen.mjs.map +1 -1
- package/dist/plugins/package/errors.d.mts +16 -6
- package/dist/plugins/package/errors.mjs.map +1 -1
- package/dist/plugins/package/index.d.mts +0 -4
- package/dist/plugins/package/index.mjs +27 -21
- package/dist/plugins/package/index.mjs.map +1 -1
- package/dist/plugins/package/mode-known.mjs +26 -12
- package/dist/plugins/package/mode-known.mjs.map +1 -1
- package/dist/plugins/package/mode-local.mjs +47 -41
- package/dist/plugins/package/mode-local.mjs.map +1 -1
- package/dist/plugins/package/publish-executor.mjs +55 -114
- package/dist/plugins/package/publish-executor.mjs.map +1 -1
- package/dist/plugins/package/registry.mjs +2 -1
- package/dist/plugins/package/registry.mjs.map +1 -1
- package/dist/plugins/package/service.mjs.map +1 -1
- package/dist/plugins/package/spans.mjs +14 -0
- package/dist/plugins/package/spans.mjs.map +1 -0
- package/dist/plugins/postgres/db-ensure.mjs +19 -12
- package/dist/plugins/postgres/db-ensure.mjs.map +1 -1
- package/dist/plugins/postgres/errors.d.mts +5 -0
- package/dist/plugins/postgres/errors.mjs.map +1 -1
- package/dist/plugins/postgres/index.mjs +10 -17
- package/dist/plugins/postgres/index.mjs.map +1 -1
- package/dist/plugins/postgres/service.mjs +58 -24
- package/dist/plugins/postgres/service.mjs.map +1 -1
- package/dist/plugins/postgres/snapshot.mjs.map +1 -1
- package/dist/plugins/postgres/spans.mjs +11 -0
- package/dist/plugins/postgres/spans.mjs.map +1 -0
- package/dist/plugins/router-entrypoints.mjs +4 -4
- package/dist/plugins/router-entrypoints.mjs.map +1 -1
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +15 -13
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -1
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +15 -19
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -1
- package/dist/plugins/seal/codegen.d.mts +2 -3
- package/dist/plugins/seal/codegen.mjs.map +1 -1
- package/dist/plugins/seal/config-render.mjs +35 -8
- package/dist/plugins/seal/config-render.mjs.map +1 -1
- package/dist/plugins/seal/deploy.mjs +31 -39
- package/dist/plugins/seal/deploy.mjs.map +1 -1
- package/dist/plugins/seal/errors.d.mts +1 -3
- package/dist/plugins/seal/errors.mjs +7 -1
- package/dist/plugins/seal/errors.mjs.map +1 -1
- package/dist/plugins/seal/index.d.mts +1 -6
- package/dist/plugins/seal/index.mjs +40 -14
- package/dist/plugins/seal/index.mjs.map +1 -1
- package/dist/plugins/seal/key-manager.d.mts +1 -9
- package/dist/plugins/seal/key-manager.mjs +2 -18
- package/dist/plugins/seal/key-manager.mjs.map +1 -1
- package/dist/plugins/seal/key-server.mjs +37 -36
- package/dist/plugins/seal/key-server.mjs.map +1 -1
- package/dist/plugins/seal/keygen.mjs +16 -17
- package/dist/plugins/seal/keygen.mjs.map +1 -1
- package/dist/plugins/seal/mode/fork-known.mjs +36 -14
- package/dist/plugins/seal/mode/fork-known.mjs.map +1 -1
- package/dist/plugins/seal/mode/live.d.mts +6 -4
- package/dist/plugins/seal/mode/live.mjs +14 -21
- package/dist/plugins/seal/mode/live.mjs.map +1 -1
- package/dist/plugins/seal/mode/local-keygen.mjs +57 -21
- package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -1
- package/dist/plugins/seal/registry-publish.mjs +1 -0
- package/dist/plugins/seal/registry-publish.mjs.map +1 -1
- package/dist/plugins/seal/routable.mjs.map +1 -1
- package/dist/plugins/seal/service.mjs.map +1 -1
- package/dist/plugins/seal/spans.mjs +18 -0
- package/dist/plugins/seal/spans.mjs.map +1 -0
- package/dist/plugins/sui/auto-tick.mjs +17 -23
- package/dist/plugins/sui/auto-tick.mjs.map +1 -1
- package/dist/plugins/sui/chain-build-container.mjs +18 -0
- package/dist/plugins/sui/chain-build-container.mjs.map +1 -0
- package/dist/plugins/sui/chain-probe.d.mts +5 -5
- package/dist/plugins/sui/chain-probe.mjs +28 -58
- package/dist/plugins/sui/chain-probe.mjs.map +1 -1
- package/dist/plugins/sui/codegen.mjs +26 -0
- package/dist/plugins/sui/codegen.mjs.map +1 -1
- package/dist/plugins/sui/errors.d.mts +2 -29
- package/dist/plugins/sui/errors.mjs +1 -3
- package/dist/plugins/sui/errors.mjs.map +1 -1
- package/dist/plugins/sui/fork-faucet-strategy.d.mts +1 -0
- package/dist/plugins/sui/fork-faucet-strategy.mjs +55 -0
- package/dist/plugins/sui/fork-faucet-strategy.mjs.map +1 -0
- package/dist/plugins/sui/fork-orchestration.d.mts +1 -0
- package/dist/plugins/sui/fork-orchestration.mjs +170 -2
- package/dist/plugins/sui/fork-orchestration.mjs.map +1 -1
- package/dist/plugins/sui/fork-transaction.d.mts +2 -0
- package/dist/plugins/sui/fork-transaction.mjs +92 -28
- package/dist/plugins/sui/fork-transaction.mjs.map +1 -1
- package/dist/plugins/sui/index.d.mts +33 -70
- package/dist/plugins/sui/index.mjs +58 -35
- package/dist/plugins/sui/index.mjs.map +1 -1
- package/dist/plugins/{faucet/strategies/sui-local.mjs → sui/local-faucet-strategy.mjs} +10 -7
- package/dist/plugins/sui/local-faucet-strategy.mjs.map +1 -0
- package/dist/plugins/sui/mode/external.mjs +7 -13
- package/dist/plugins/sui/mode/external.mjs.map +1 -1
- package/dist/plugins/sui/mode/fork.mjs +136 -59
- package/dist/plugins/sui/mode/fork.mjs.map +1 -1
- package/dist/plugins/sui/mode/live.mjs +10 -16
- package/dist/plugins/sui/mode/live.mjs.map +1 -1
- package/dist/plugins/sui/mode/local.mjs +37 -36
- package/dist/plugins/sui/mode/local.mjs.map +1 -1
- package/dist/plugins/sui/mode/shared-boot.mjs +38 -115
- package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -1
- package/dist/plugins/sui/mode/shared.d.mts +1 -5
- package/dist/plugins/sui/mode/shared.mjs.map +1 -1
- package/dist/plugins/sui/mode/spec.d.mts +18 -0
- package/dist/plugins/sui/move-summary-runner.mjs +207 -0
- package/dist/plugins/sui/move-summary-runner.mjs.map +1 -0
- package/dist/plugins/sui/network-resolver.d.mts +4 -3
- package/dist/plugins/sui/service.mjs.map +1 -1
- package/dist/plugins/sui/snapshot.mjs +3 -0
- package/dist/plugins/sui/snapshot.mjs.map +1 -1
- package/dist/plugins/sui/spans.mjs +17 -0
- package/dist/plugins/sui/spans.mjs.map +1 -0
- package/dist/plugins/wallet/codegen.d.mts +0 -1
- package/dist/plugins/wallet/codegen.mjs +8 -9
- package/dist/plugins/wallet/codegen.mjs.map +1 -1
- package/dist/plugins/wallet/index.d.mts +6 -8
- package/dist/plugins/wallet/index.mjs +46 -35
- package/dist/plugins/wallet/index.mjs.map +1 -1
- package/dist/plugins/wallet/origin-policy.mjs +12 -28
- package/dist/plugins/wallet/origin-policy.mjs.map +1 -1
- package/dist/plugins/wallet/pairing.mjs +6 -4
- package/dist/plugins/wallet/pairing.mjs.map +1 -1
- package/dist/plugins/wallet/protocol.d.mts +1 -0
- package/dist/plugins/wallet/protocol.mjs +5 -44
- package/dist/plugins/wallet/protocol.mjs.map +1 -1
- package/dist/plugins/wallet/routable.mjs +2 -8
- package/dist/plugins/wallet/routable.mjs.map +1 -1
- package/dist/plugins/wallet/server.mjs +36 -44
- package/dist/plugins/wallet/server.mjs.map +1 -1
- package/dist/plugins/wallet/service.d.mts +1 -5
- package/dist/plugins/wallet/service.mjs +22 -18
- package/dist/plugins/wallet/service.mjs.map +1 -1
- package/dist/plugins/wallet/spans.mjs +22 -0
- package/dist/plugins/wallet/spans.mjs.map +1 -0
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +33 -8
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -1
- package/dist/plugins/walrus/codegen.d.mts +3 -3
- package/dist/plugins/walrus/codegen.mjs.map +1 -1
- package/dist/plugins/walrus/deploy-paths.mjs +21 -5
- package/dist/plugins/walrus/deploy-paths.mjs.map +1 -1
- package/dist/plugins/walrus/deploy.mjs +67 -69
- package/dist/plugins/walrus/deploy.mjs.map +1 -1
- package/dist/plugins/walrus/errors.mjs +1 -0
- package/dist/plugins/walrus/errors.mjs.map +1 -1
- package/dist/plugins/walrus/faucet-strategy.mjs +12 -7
- package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -1
- package/dist/plugins/walrus/index.d.mts +2 -13
- package/dist/plugins/walrus/index.mjs +18 -23
- package/dist/plugins/walrus/index.mjs.map +1 -1
- package/dist/plugins/walrus/mode/known-deploy.mjs +7 -5
- package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -1
- package/dist/plugins/walrus/mode/local-cluster.mjs +26 -7
- package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -1
- package/dist/plugins/walrus/registry-publish.mjs.map +1 -1
- package/dist/plugins/walrus/routable.mjs +7 -23
- package/dist/plugins/walrus/routable.mjs.map +1 -1
- package/dist/plugins/walrus/service.mjs.map +1 -1
- package/dist/plugins/walrus/spans.mjs +18 -0
- package/dist/plugins/walrus/spans.mjs.map +1 -0
- package/dist/plugins/walrus/storage-nodes.d.mts +6 -2
- package/dist/plugins/walrus/storage-nodes.mjs +15 -8
- package/dist/plugins/walrus/storage-nodes.mjs.map +1 -1
- package/dist/plugins/walrus/wal-swap.mjs +58 -15
- package/dist/plugins/walrus/wal-swap.mjs.map +1 -1
- package/dist/primitives/artifact-publisher.d.mts +1 -1
- package/dist/primitives/artifact-publisher.mjs +15 -0
- package/dist/primitives/artifact-publisher.mjs.map +1 -0
- package/dist/runtime/docker/client.mjs +17 -4
- package/dist/runtime/docker/client.mjs.map +1 -1
- package/dist/runtime/docker/container.mjs +219 -132
- package/dist/runtime/docker/container.mjs.map +1 -1
- package/dist/runtime/docker/errors.mjs +0 -6
- package/dist/runtime/docker/errors.mjs.map +1 -1
- package/dist/runtime/docker/exec.mjs +21 -18
- package/dist/runtime/docker/exec.mjs.map +1 -1
- package/dist/runtime/docker/image.mjs +36 -13
- package/dist/runtime/docker/image.mjs.map +1 -1
- package/dist/runtime/docker/index.mjs +14 -0
- package/dist/runtime/docker/inspect-and-decode.mjs +51 -0
- package/dist/runtime/docker/inspect-and-decode.mjs.map +1 -0
- package/dist/runtime/docker/inventory.mjs +14 -11
- package/dist/runtime/docker/inventory.mjs.map +1 -1
- package/dist/runtime/docker/labels.mjs +38 -5
- package/dist/runtime/docker/labels.mjs.map +1 -1
- package/dist/runtime/docker/logs.d.mts +1 -1
- package/dist/runtime/docker/logs.mjs.map +1 -1
- package/dist/runtime/docker/network.mjs +83 -47
- package/dist/runtime/docker/network.mjs.map +1 -1
- package/dist/runtime/docker/render-run-args.mjs +82 -0
- package/dist/runtime/docker/render-run-args.mjs.map +1 -0
- package/dist/runtime/docker/service.d.mts +1 -1
- package/dist/runtime/docker/service.mjs +12 -7
- package/dist/runtime/docker/service.mjs.map +1 -1
- package/dist/runtime/docker/sweep.mjs +118 -43
- package/dist/runtime/docker/sweep.mjs.map +1 -1
- package/dist/runtime/docker/volume.mjs +2 -0
- package/dist/runtime/docker/volume.mjs.map +1 -1
- package/dist/runtime/docker/wrap.mjs +30 -1
- package/dist/runtime/docker/wrap.mjs.map +1 -1
- package/dist/substrate/cross-process.mjs +14 -8
- package/dist/substrate/cross-process.mjs.map +1 -1
- package/dist/substrate/event-time.mjs +33 -0
- package/dist/substrate/event-time.mjs.map +1 -0
- package/dist/substrate/events.d.mts +28 -8
- package/dist/substrate/identity.d.mts +2 -1
- package/dist/substrate/manifest.d.mts +68 -5
- package/dist/substrate/manifest.mjs +34 -5
- package/dist/substrate/manifest.mjs.map +1 -1
- package/dist/substrate/network.d.mts +3 -5
- package/dist/substrate/options.d.mts +0 -2
- package/dist/substrate/plugin.d.mts +13 -0
- package/dist/substrate/plugin.mjs +4 -2
- package/dist/substrate/plugin.mjs.map +1 -1
- package/dist/substrate/projection.d.mts +35 -3
- package/dist/substrate/runtime/artifact-publisher/index.mjs +19 -9
- package/dist/substrate/runtime/artifact-publisher/index.mjs.map +1 -1
- package/dist/substrate/runtime/atomic-write.mjs +97 -32
- package/dist/substrate/runtime/atomic-write.mjs.map +1 -1
- package/dist/substrate/runtime/cache/index.mjs +3 -0
- package/dist/substrate/runtime/cache/schema.mjs +2 -2
- package/dist/substrate/runtime/cache/schema.mjs.map +1 -1
- package/dist/substrate/runtime/cache/service.mjs +9 -7
- package/dist/substrate/runtime/cache/service.mjs.map +1 -1
- package/dist/substrate/runtime/capability-sinks/index.d.mts +1 -1
- package/dist/substrate/runtime/capability-sinks/index.mjs +3 -0
- package/dist/substrate/runtime/capability-sinks/layer.mjs +1 -1
- package/dist/substrate/runtime/capability-sinks/service.d.mts +61 -2
- package/dist/substrate/runtime/capability-sinks/service.mjs +21 -26
- package/dist/substrate/runtime/capability-sinks/service.mjs.map +1 -1
- package/dist/substrate/runtime/config-validation.d.mts +1 -13
- package/dist/substrate/runtime/config-validation.mjs +2 -91
- package/dist/substrate/runtime/config-validation.mjs.map +1 -1
- package/dist/substrate/runtime/container-runtime.d.mts +1 -0
- package/dist/substrate/runtime/container-runtime.mjs +2 -0
- package/dist/substrate/runtime/control-plane/domain.mjs +101 -0
- package/dist/substrate/runtime/control-plane/domain.mjs.map +1 -0
- package/dist/substrate/runtime/control-plane/service.mjs +7 -0
- package/dist/substrate/runtime/control-plane/service.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +46 -19
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs +30 -12
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/index.mjs +5 -0
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs +11 -2
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs +1 -1
- package/dist/substrate/runtime/cross-process/index.mjs +11 -0
- package/dist/substrate/runtime/cross-process/live-clock.mjs +34 -0
- package/dist/substrate/runtime/cross-process/live-clock.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/liveness.mjs +52 -10
- package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/lock.d.mts +1 -0
- package/dist/substrate/runtime/cross-process/lock.mjs +23 -0
- package/dist/substrate/runtime/cross-process/lock.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs +64 -0
- package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/roster.mjs +97 -83
- package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/self-pid.mjs +8 -0
- package/dist/substrate/runtime/cross-process/self-pid.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +24 -28
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/stack-lock.mjs +41 -20
- package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -1
- package/dist/substrate/runtime/current-plugin.mjs +2 -2
- package/dist/substrate/runtime/current-plugin.mjs.map +1 -1
- package/dist/substrate/runtime/errors.mjs +12 -6
- package/dist/substrate/runtime/errors.mjs.map +1 -1
- package/dist/substrate/runtime/format-unknown-error.mjs +30 -0
- package/dist/substrate/runtime/format-unknown-error.mjs.map +1 -0
- package/dist/substrate/runtime/host-bind-mount-owner.mjs +10 -0
- package/dist/substrate/runtime/host-bind-mount-owner.mjs.map +1 -0
- package/dist/substrate/runtime/host-gateway.mjs +20 -0
- package/dist/substrate/runtime/host-gateway.mjs.map +1 -0
- package/dist/substrate/runtime/host-tree-tar/index.mjs +61 -50
- package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -1
- package/dist/substrate/runtime/http-probe.d.mts +1 -1
- package/dist/substrate/runtime/index.mjs +14 -0
- package/dist/substrate/runtime/lease-broker/index.d.mts +1 -1
- package/dist/substrate/runtime/lease-broker/index.mjs +2 -0
- package/dist/substrate/runtime/lease-broker/service.d.mts +1 -64
- package/dist/substrate/runtime/lease-broker/service.mjs +1 -1
- package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs +22 -3
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/index.mjs +9 -0
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +20 -3
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs +1 -1
- package/dist/substrate/runtime/lifecycle/signals.mjs +5 -5
- package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/state-machine.mjs +1 -1
- package/dist/substrate/runtime/managed-container.d.mts +19 -1
- package/dist/substrate/runtime/managed-container.mjs +20 -1
- package/dist/substrate/runtime/managed-container.mjs.map +1 -1
- package/dist/substrate/runtime/manifest/index.mjs +3 -0
- package/dist/substrate/runtime/manifest/manifest.mjs +15 -11
- package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -1
- package/dist/substrate/runtime/mode-errors.mjs +20 -0
- package/dist/substrate/runtime/mode-errors.mjs.map +1 -0
- package/dist/substrate/runtime/observability/cascade-formatter.mjs +9 -13
- package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -1
- package/dist/substrate/runtime/observability/formatter-registry.mjs +19 -36
- package/dist/substrate/runtime/observability/formatter-registry.mjs.map +1 -1
- package/dist/substrate/runtime/observability/ignore-with-log.d.mts +1 -0
- package/dist/substrate/runtime/observability/ignore-with-log.mjs +17 -0
- package/dist/substrate/runtime/observability/ignore-with-log.mjs.map +1 -0
- package/dist/substrate/runtime/observability/index.d.mts +1 -1
- package/dist/substrate/runtime/observability/index.mjs +13 -0
- package/dist/substrate/runtime/observability/log-store.d.mts +1 -0
- package/dist/substrate/runtime/observability/log-store.mjs +175 -0
- package/dist/substrate/runtime/observability/log-store.mjs.map +1 -0
- package/dist/substrate/runtime/observability/logger.d.mts +2 -1
- package/dist/substrate/runtime/observability/logger.mjs +5 -9
- package/dist/substrate/runtime/observability/logger.mjs.map +1 -1
- package/dist/substrate/runtime/observability/output-truncate.mjs +35 -0
- package/dist/substrate/runtime/observability/output-truncate.mjs.map +1 -0
- package/dist/substrate/runtime/observability/pretty-error.mjs +9 -12
- package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -1
- package/dist/substrate/runtime/observability/redaction.d.mts +2 -13
- package/dist/substrate/runtime/observability/redaction.mjs +8 -14
- package/dist/substrate/runtime/observability/redaction.mjs.map +1 -1
- package/dist/substrate/runtime/observability/span-store.d.mts +1 -0
- package/dist/substrate/runtime/observability/span-store.mjs +110 -0
- package/dist/substrate/runtime/observability/span-store.mjs.map +1 -0
- package/dist/substrate/runtime/observability/spans.mjs +14 -14
- package/dist/substrate/runtime/observability/spans.mjs.map +1 -1
- package/dist/substrate/runtime/observability/subprocess-capture.mjs +1 -1
- package/dist/substrate/runtime/passthrough-or-wrap.mjs +33 -0
- package/dist/substrate/runtime/passthrough-or-wrap.mjs.map +1 -0
- package/dist/substrate/runtime/paths.d.mts +1 -1
- package/dist/substrate/runtime/paths.mjs +4 -3
- package/dist/substrate/runtime/paths.mjs.map +1 -1
- package/dist/substrate/runtime/phase-preserving-produce.mjs +40 -0
- package/dist/substrate/runtime/phase-preserving-produce.mjs.map +1 -0
- package/dist/substrate/runtime/port-broker/index.mjs +3 -0
- package/dist/substrate/runtime/port-broker/service.mjs +170 -126
- package/dist/substrate/runtime/port-broker/service.mjs.map +1 -1
- package/dist/substrate/runtime/post-acquire-tasks.mjs +1 -1
- package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -1
- package/dist/substrate/runtime/probes.d.mts +7 -5
- package/dist/substrate/runtime/probes.mjs +3 -1
- package/dist/substrate/runtime/probes.mjs.map +1 -1
- package/dist/substrate/runtime/projection/index.mjs +4 -0
- package/dist/substrate/runtime/projection/operational-endpoints.mjs +1 -2
- package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -1
- package/dist/substrate/runtime/projection/persisted.mjs +33 -15
- package/dist/substrate/runtime/projection/persisted.mjs.map +1 -1
- package/dist/substrate/runtime/projection/state-ref.mjs +26 -2
- package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -1
- package/dist/substrate/runtime/projection/update.mjs +88 -24
- package/dist/substrate/runtime/projection/update.mjs.map +1 -1
- package/dist/substrate/runtime/random-suffix.mjs +11 -0
- package/dist/substrate/runtime/random-suffix.mjs.map +1 -0
- package/dist/substrate/runtime/retry-policy.d.mts +59 -1
- package/dist/substrate/runtime/retry-policy.mjs +66 -1
- package/dist/substrate/runtime/retry-policy.mjs.map +1 -1
- package/dist/substrate/runtime/routed-url.d.mts +1 -0
- package/dist/substrate/runtime/routed-url.mjs +79 -0
- package/dist/substrate/runtime/routed-url.mjs.map +1 -0
- package/dist/substrate/runtime/runtime-decode.d.mts +1 -1
- package/dist/substrate/runtime/runtime-decode.mjs.map +1 -1
- package/dist/substrate/runtime/scoped-http-server.mjs +2 -3
- package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -1
- package/dist/substrate/runtime/scoped-multimap/index.mjs +2 -0
- package/dist/substrate/runtime/scoped-multimap/service.mjs +52 -0
- package/dist/substrate/runtime/scoped-multimap/service.mjs.map +1 -0
- package/dist/substrate/runtime/scoped-ref-map/index.mjs +2 -0
- package/dist/substrate/runtime/scoped-ref-map/service.mjs +2 -2
- package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +1 -1
- package/dist/substrate/runtime/stage-and-swap/index.mjs +72 -4
- package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -1
- package/dist/substrate/runtime/state-store/index.d.mts +1 -0
- package/dist/substrate/runtime/state-store/index.mjs +3 -0
- package/dist/substrate/runtime/state-store/schema.d.mts +1 -0
- package/dist/substrate/runtime/state-store/schema.mjs +19 -14
- package/dist/substrate/runtime/state-store/schema.mjs.map +1 -1
- package/dist/substrate/runtime/state-store/service.d.mts +1 -0
- package/dist/substrate/runtime/state-store/service.mjs +145 -0
- package/dist/substrate/runtime/state-store/service.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs +33 -0
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs +1 -1
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -1
- package/dist/substrate/runtime/strategy-registry/index.mjs +4 -0
- package/dist/substrate/runtime/strategy-registry/service.mjs +19 -33
- package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -1
- package/dist/substrate/runtime/subnet-broker.mjs +60 -0
- package/dist/substrate/runtime/subnet-broker.mjs.map +1 -0
- package/dist/substrate/runtime/sui-execute/index.d.mts +21 -1
- package/dist/substrate/runtime/sui-execute/index.mjs +84 -20
- package/dist/substrate/runtime/sui-execute/index.mjs.map +1 -1
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.d.mts +1 -0
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs +32 -0
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs.map +1 -0
- package/dist/substrate/runtime/sui-ledger/object-ref.mjs +32 -0
- package/dist/substrate/runtime/sui-ledger/object-ref.mjs.map +1 -0
- package/dist/substrate/runtime/sui-move-build/index.mjs +93 -19
- package/dist/substrate/runtime/sui-move-build/index.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/acquire-node.mjs +181 -0
- package/dist/substrate/runtime/supervisor/acquire-node.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/background-tasks.mjs +144 -0
- package/dist/substrate/runtime/supervisor/background-tasks.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/command-loop.mjs +68 -0
- package/dist/substrate/runtime/supervisor/command-loop.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs +151 -0
- package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/errors.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/errors.mjs +9 -0
- package/dist/substrate/runtime/supervisor/errors.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/index.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/index.mjs +3 -0
- package/dist/substrate/runtime/supervisor/shutdown.mjs +51 -0
- package/dist/substrate/runtime/supervisor/shutdown.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/start-supervisor.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/start-supervisor.mjs +250 -0
- package/dist/substrate/runtime/supervisor/start-supervisor.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/state.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/state.mjs +22 -0
- package/dist/substrate/runtime/supervisor/state.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/teardown.mjs +57 -0
- package/dist/substrate/runtime/supervisor/teardown.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/types.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/wiring.mjs +133 -0
- package/dist/substrate/runtime/supervisor/wiring.mjs.map +1 -0
- package/dist/substrate/runtime/typed-env.mjs +8 -0
- package/dist/substrate/runtime/typed-env.mjs.map +1 -0
- package/dist/substrate/state-store.d.mts +1 -0
- package/dist/substrate/versioned-doc-schema.mjs +17 -0
- package/dist/substrate/versioned-doc-schema.mjs.map +1 -0
- package/dist/substrate/versioned-doc-sync.mjs +94 -0
- package/dist/substrate/versioned-doc-sync.mjs.map +1 -0
- package/dist/surfaces/cli/command-tree.mjs.map +1 -1
- package/dist/surfaces/cli/commands/index.mjs +9 -0
- package/dist/surfaces/cli/commands/prune-picker-entry.mjs +13 -0
- package/dist/surfaces/cli/commands/prune-picker-entry.mjs.map +1 -0
- package/dist/surfaces/cli/commands/prune-picker.mjs +3 -2
- package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -1
- package/dist/surfaces/cli/commands/prune.mjs +34 -17
- package/dist/surfaces/cli/commands/prune.mjs.map +1 -1
- package/dist/surfaces/cli/commands/status.mjs +2 -2
- package/dist/surfaces/cli/commands/status.mjs.map +1 -1
- package/dist/surfaces/cli/commands/supervisor-presence.mjs +5 -3
- package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -1
- package/dist/surfaces/cli/commands/wipe.mjs +38 -4
- package/dist/surfaces/cli/commands/wipe.mjs.map +1 -1
- package/dist/surfaces/cli/errors.mjs +1 -1
- package/dist/surfaces/cli/errors.mjs.map +1 -1
- package/dist/surfaces/cli/flags.mjs +0 -1
- package/dist/surfaces/cli/flags.mjs.map +1 -1
- package/dist/surfaces/cli/index.mjs +98 -18
- package/dist/surfaces/cli/index.mjs.map +1 -1
- package/dist/surfaces/cli/output.mjs +1 -0
- package/dist/surfaces/cli/output.mjs.map +1 -1
- package/dist/surfaces/cli/sysexits.mjs +2 -1
- package/dist/surfaces/cli/sysexits.mjs.map +1 -1
- package/dist/surfaces/tui/app.mjs +25 -3
- package/dist/surfaces/tui/app.mjs.map +1 -1
- package/dist/surfaces/tui/display-derivation.mjs +23 -74
- package/dist/surfaces/tui/display-derivation.mjs.map +1 -1
- package/dist/surfaces/tui/event-log.mjs +35 -23
- package/dist/surfaces/tui/event-log.mjs.map +1 -1
- package/dist/surfaces/tui/input.mjs +5 -1
- package/dist/surfaces/tui/input.mjs.map +1 -1
- package/dist/surfaces/tui/plain-renderer.mjs +70 -34
- package/dist/surfaces/tui/plain-renderer.mjs.map +1 -1
- package/package.json +24 -4
- package/dist/contracts/liveness-classifier.d.mts +0 -19
- package/dist/contracts/network-resolver.d.mts +0 -15
- package/dist/contracts/network-resolver.mjs +0 -7
- package/dist/contracts/network-resolver.mjs.map +0 -1
- package/dist/orchestrators/codegen/extras.mjs +0 -16
- package/dist/orchestrators/codegen/extras.mjs.map +0 -1
- package/dist/plugins/deepbook/routable.mjs +0 -21
- package/dist/plugins/deepbook/routable.mjs.map +0 -1
- package/dist/plugins/faucet/service.d.mts +0 -20
- package/dist/plugins/faucet/strategies/sui-local.d.mts +0 -23
- package/dist/plugins/faucet/strategies/sui-local.mjs.map +0 -1
- package/dist/plugins/sui/seed-objects.d.mts +0 -18
- package/dist/plugins/sui/seed-objects.mjs +0 -25
- package/dist/plugins/sui/seed-objects.mjs.map +0 -1
- package/dist/runtime/built-in-plugin-layers.mjs.map +0 -1
- package/dist/substrate/runtime/context-helpers.mjs +0 -32
- package/dist/substrate/runtime/context-helpers.mjs.map +0 -1
- package/dist/substrate/runtime/run.mjs.map +0 -1
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs +0 -30
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs.map +0 -1
- package/dist/substrate/runtime/supervisor.d.mts +0 -1
- package/dist/substrate/runtime/supervisor.mjs +0 -831
- package/dist/substrate/runtime/supervisor.mjs.map +0 -1
- package/dist/surfaces/cli/commands/doctor-probes.mjs.map +0 -1
- /package/dist/{substrate/runtime/strategy-registry/faucet-capability-for.d.mts → plugins/faucet/http.d.mts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.mjs","names":["Logger"],"sources":["../../../src/substrate/runtime/supervisor.ts"],"sourcesContent":["// Stack supervisor — the substrate's orchestrator.\n//\n// Architecture § Engine / supervisor split:\n// \"Stack supervisor (L0): the outer driver — boot identity, consult\n// network resolver, run scheduler, fire shutdown finalizers, emit\n// lifecycle events.\"\n//\n// Responsibilities:\n// - Resolve the plugin graph from a `Stack` value.\n// - Start plugins in dep order; each plugin's `start` runs under\n// its own Scope; ready-gate awaits its start effect.\n// - Maintain the per-plugin lifecycle state machine.\n// - Emit typed `EngineEvent`s onto the projection ref + event hub.\n// - Watch invalidation → selective restart through the dep-graph\n// closure planner.\n// - SIGINT/SIGTERM → graceful drain; second signal escalates to abort.\n// - Restart / drain / shutdown commands on the command stream.\n\n// What's explicitly NOT here:\n// - The thick watcher (L0 primitive — separate module).\n// - The cause walker / cascade formatter (shared between supervisor\n// and renderer, lives under `observability/`).\n// - Cache eviction / strategy-registry mutation (separate modules).\n// - Container runtime (L1 adapter; supervisor doesn't know docker).\n\nimport {\n\tCause,\n\tContext,\n\tData,\n\tDeferred,\n\tEffect,\n\tExit,\n\tFiber,\n\tLayer,\n\tQueue,\n\tRef,\n\tScope,\n\tSubscriptionRef,\n} from 'effect';\n\nimport type { CapabilityDecl } from '../../contracts/capability-decl.ts';\nimport type {\n\tStrategyContributorDecl,\n\tStrategyRegistry,\n} from '../../contracts/strategy-contributor.ts';\nimport type { PluginKey } from '../brand.ts';\nimport type { EngineCommand, EngineEvent } from '../events.ts';\nimport type { Identity } from '../identity.ts';\nimport type { LifecycleStatus, PluginRole } from '../lifecycle.ts';\nimport type { DevstackOptions } from '../options.ts';\nimport {\n\tresolvePluginDependencies,\n\ttype AcquireContext,\n\ttype AnyPlugin,\n\ttype PluginErrorContribution,\n} from '../plugin.ts';\nimport type { AccountProjection, SubscribableState } from '../projection.ts';\nimport {\n\tCapabilitySinksService,\n\tlayerCapabilitySinksDefault,\n\ttype AnyContribution,\n\ttype CapabilitySinksShape,\n\ttype HarvestContext,\n\ttype OrchestratorSinks,\n} from './capability-sinks/index.ts';\nimport { CurrentPluginKey, CurrentPluginProgress } from './current-plugin.ts';\nimport {\n\tLogger,\n\ttype LoggerShape,\n\twithPluginSpan,\n\twithStackSpan,\n\tannotatePhase,\n\tannotateOp,\n\tprettyErrorStructured,\n} from './observability/index.ts';\nimport { PostAcquireTaskFailed } from './post-acquire-tasks.ts';\nimport { RuntimeRoot } from './paths.ts';\nimport { getOrDefault, getOrDefaultEffect } from './context-helpers.ts';\nimport { operationalEndpointEventsFromResolvedValue } from './projection/operational-endpoints.ts';\nimport { declareAccount, setIdentity, updateRef } from './projection/update.ts';\nimport {\n\tawaitUpstreams,\n\tbuildDependencyReaderFor,\n\tbuildWatchIndex,\n\texactPrefixMatch,\n\tinstallSignalHandler,\n\tisReadyOrTerminal,\n\tmakeEntry,\n\tmakeRegistry,\n\tplanFullDrain,\n\tplanRestart,\n\tresolveGraph,\n\ttype DepGraphError,\n\ttype PluginAcquireFailed,\n\ttype PluginEntry,\n\ttype PluginRegistry,\n\ttype ResolvedGraph,\n\ttype RestartTargetMissing,\n\ttype UnknownDependency,\n\ttype WatchEntry,\n} from './lifecycle/index.ts';\nimport { StrategyRegistryService } from './strategy-registry/service.ts';\n\n// -----------------------------------------------------------------------------\n// Public Stack shape (mirror — `define-devstack.ts` exports)\n// -----------------------------------------------------------------------------\n\n/** Minimum surface the supervisor reads off a `Stack`. The full\n * `Stack<Members>` shape lives in `api/define-devstack.ts` and carries\n * type-level provenance — at the runtime boundary the supervisor only\n * needs the erased plugin list + options. */\nexport interface SupervisedStack {\n\treadonly _tag: 'Stack';\n\treadonly members: ReadonlyArray<AnyPlugin>;\n\treadonly options: DevstackOptions;\n}\n\n// -----------------------------------------------------------------------------\n// Errors\n// -----------------------------------------------------------------------------\n\nexport class SupervisorBootError extends Data.TaggedError('SupervisorBootError')<{\n\treadonly cause: DepGraphError;\n}> {}\n\nexport class SupervisorPostAcquireFailed extends Data.TaggedError('SupervisorPostAcquireFailed')<{\n\treadonly cause: Cause.Cause<unknown>;\n}> {}\n\nexport class CapabilityFactoryFailed extends Data.TaggedError('CapabilityFactoryFailed')<{\n\treadonly pluginKey: PluginKey;\n\treadonly message: string;\n\treadonly cause: unknown;\n}> {}\n\n/** Fallback used when the supervisor's `pluginContext` doesn't carry a\n * Logger service. Swallows every line — the trade-off is that bare\n * `supervise()` smoke tests stay log-free, while the wired CLI / e2e\n * layer stack picks up the real Logger. */\nconst noopLogger: LoggerShape = {\n\tlog: () => Effect.void,\n\treadTag: () => Effect.succeed({ lines: [], truncated: false }),\n\treadAll: Effect.succeed(new Map()),\n\tclearTag: () => Effect.void,\n};\n\nconst projectionLevel = (\n\tlevel: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal',\n): Extract<EngineEvent, { tag: 'log.appended' }>['level'] | null => {\n\tswitch (level) {\n\t\tcase 'trace':\n\t\tcase 'debug':\n\t\t\treturn null;\n\t\tcase 'info':\n\t\t\treturn 'info';\n\t\tcase 'warn':\n\t\t\treturn 'warn';\n\t\tcase 'error':\n\t\tcase 'fatal':\n\t\t\treturn 'error';\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = level;\n\t\t\tvoid _exhaustive;\n\t\t\treturn 'info';\n\t\t}\n\t}\n};\n\nconst withEventPublishingLogger = (\n\tbase: LoggerShape,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n): LoggerShape => ({\n\t...base,\n\tlog: (tag, pluginKey, payload) =>\n\t\tEffect.gen(function* () {\n\t\t\tyield* base.log(tag, pluginKey, payload);\n\t\t\tif (pluginKey === null) return;\n\t\t\tconst level = projectionLevel(payload.level);\n\t\t\tif (level === null) return;\n\t\t\tyield* publish(ref, hub, {\n\t\t\t\ttag: 'log.appended',\n\t\t\t\tpluginKey,\n\t\t\t\tline: payload.message,\n\t\t\t\tlevel,\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t}),\n});\n\nexport type SupervisorError =\n\t| SupervisorBootError\n\t| SupervisorPostAcquireFailed\n\t| CapabilityFactoryFailed\n\t| PluginAcquireFailed\n\t| RestartTargetMissing\n\t| UnknownDependency;\n\nconst noopStrategyRegistry: StrategyRegistry = {\n\tget: (key) =>\n\t\tEffect.fail({\n\t\t\t_tag: 'StrategyNotFoundError',\n\t\t\tcapabilityKey: key,\n\t\t\tregisteredKeys: [],\n\t\t}),\n\tlist: () => Effect.succeed([]),\n\tregister: () => Effect.void,\n};\n\nexport interface SupervisorCommandHandlerContext {\n\treadonly publish: (event: EngineEvent) => Effect.Effect<void, never, never>;\n}\n\nexport type SupervisorCommandHandler = (\n\tcmd: EngineCommand,\n\tctx: SupervisorCommandHandlerContext,\n) => Effect.Effect<ReadonlyArray<EngineEvent>, unknown, never>;\n\nexport interface SupervisorPostAcquireContext {\n\treadonly graph: ResolvedGraph;\n\treadonly registry: PluginRegistry;\n\treadonly identity: Identity;\n\treadonly runtimeRoot: string;\n}\n\nexport type SupervisorPostAcquireHook = (\n\tctx: SupervisorPostAcquireContext,\n) => Effect.Effect<ReadonlyArray<EngineEvent>, unknown, never>;\n\n// -----------------------------------------------------------------------------\n// Event publishing\n// -----------------------------------------------------------------------------\n\n/** Publishing helper: writes the event to the projection ref AND\n * enqueues it onto the live event hub for renderers that subscribe to\n * the raw stream. */\nconst publish = (\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\tevent: EngineEvent,\n): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tyield* updateRef(ref, event);\n\t\tyield* Queue.offer(hub, event);\n\t});\n\nconst setCyclePhase = (\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\tphase: SubscribableState['cycle']['phase'],\n): Effect.Effect<void> =>\n\tSubscriptionRef.update(ref, (state) => ({\n\t\t...state,\n\t\tcycle: {\n\t\t\t...state.cycle,\n\t\t\tstartedAt: state.cycle.startedAt === 0 ? Date.now() : state.cycle.startedAt,\n\t\t\tphase,\n\t\t},\n\t}));\n\n/** Build the registry's `onTransition` callback — turns status changes\n * into typed events. */\nconst buildTransitionEmitter =\n\t(\n\t\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\t\thub: Queue.Enqueue<EngineEvent>,\n\t): ((key: PluginKey, from: LifecycleStatus, to: LifecycleStatus) => Effect.Effect<void>) =>\n\t(key, from, to) =>\n\t\tpublish(ref, hub, {\n\t\t\ttag: 'lifecycle.statusChanged',\n\t\t\tpluginKey: key,\n\t\t\tfrom,\n\t\t\tto,\n\t\t\tat: Date.now(),\n\t\t});\n\n// -----------------------------------------------------------------------------\n// Boot the registry from a graph\n// -----------------------------------------------------------------------------\n\nconst buildRegistry = (\n\tgraph: ResolvedGraph,\n\tparentScope: Scope.Scope,\n\temit: (key: PluginKey, from: LifecycleStatus, to: LifecycleStatus) => Effect.Effect<void>,\n): Effect.Effect<PluginRegistry, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst entries = new Map<PluginKey, PluginEntry>();\n\t\tfor (const [key, node] of graph.nodes) {\n\t\t\tconst entry = yield* makeEntry(node, parentScope);\n\t\t\tentries.set(key, entry);\n\t\t}\n\t\treturn makeRegistry(entries, emit);\n\t});\n\n// -----------------------------------------------------------------------------\n// Capability sinks — orchestrator registration callbacks\n// -----------------------------------------------------------------------------\n//\n// The substrate-name-blind kind→sink registry lives in\n// `capability-sinks/`. The supervisor accepts an `OrchestratorSinks`\n// bag (the L3 orchestrator's callbacks) and the substrate composes it\n// into the `CapabilitySinksService` Layer that backs the harvest loop.\n// `OrchestratorSinks` is re-exported from this module so existing\n// callers (CLI, e2e tests) keep their import paths.\n\nexport type { OrchestratorSinks } from './capability-sinks/index.ts';\n\n/**\n * Resolve a plugin's `capabilities` field to a concrete decl tuple.\n *\n * Two accepted shapes (see `Plugin.capabilities` for the\n * authoring-side contract):\n *\n * (a) Static — a plain `ReadonlyArray<CapabilityDecl>`. Returned\n * as-is.\n *\n * (b) Dynamic — a `CapabilitiesFactory<…>` function. Invoked with\n * the resolved plugin value + the acquire context built from\n * the supervisor's identity + runtime root. The function is\n * called once per acquire (post-success); the returned tuple\n * flows into `dispatchContributions` like a static one.\n *\n * The dynamic seam exists so plugins' snapshot subtrees, codegen\n * bindings, routable URLs, strategy contributions, etc. can stamp\n * the REAL chain id / package id / network alias produced by their\n * acquire body, instead of the factory-time placeholder strings the\n * static form forces.\n *\n * The substrate stays generic: this resolver doesn't know any\n * service name; the discrimination is purely structural\n * (`typeof === 'function'`).\n */\nconst resolveCapabilities = (\n\tpluginKey: PluginKey,\n\tfield:\n\t\t| ReadonlyArray<CapabilityDecl>\n\t\t| ((resolved: unknown, ctx: AcquireContext) => ReadonlyArray<CapabilityDecl>)\n\t\t| undefined,\n\tresolved: unknown,\n\tacquireContext: AcquireContext,\n): Effect.Effect<ReadonlyArray<CapabilityDecl>, CapabilityFactoryFailed> => {\n\tif (field === undefined) return Effect.succeed([]);\n\tif (typeof field === 'function') {\n\t\treturn Effect.try({\n\t\t\ttry: () => field(resolved, acquireContext),\n\t\t\tcatch: (cause) =>\n\t\t\t\tnew CapabilityFactoryFailed({\n\t\t\t\t\tpluginKey,\n\t\t\t\t\tmessage: `capability factory failed for ${pluginKey}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t});\n\t}\n\treturn Effect.succeed(field);\n};\n\n/**\n * Walk a plugin's `capabilities` tuple + `errorContributions` after a\n * successful acquire, route every contribution through the\n * substrate-owned `CapabilitySinksService`. The plugin's scope is\n * provided so each sink's `addFinalizer` lands on the plugin's scope —\n * registrations reap on selective-restart / shutdown.\n *\n * The supervisor stays kind-blind: it builds the contribution union\n * (`{source: 'capability'|'error', ...}`) and the dispatch happens\n * inside the service. Unknown kinds are downgraded to no-ops here so\n * the substrate-open-by-default contract holds — plugin authors can\n * emit a custom-kind decl that is observed only by the orchestrators\n * that registered the matching sink.\n */\nconst dispatchContributions = (\n\tpluginKey: PluginKey,\n\tcapabilities: ReadonlyArray<CapabilityDecl>,\n\terrorContributions: ReadonlyArray<PluginErrorContribution>,\n\tpluginRole: PluginRole,\n\tidentity: Identity,\n\tpluginContext: Context.Context<never>,\n\tpluginScope: Scope.Scope,\n\tsinks: CapabilitySinksShape,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n): Effect.Effect<void, unknown, never> =>\n\tEffect.gen(function* () {\n\t\tconst strategyRegistry = getOrDefault(\n\t\t\tpluginContext,\n\t\t\tStrategyRegistryService,\n\t\t\tnoopStrategyRegistry,\n\t\t);\n\t\tconst harvestCtx: HarvestContext = {\n\t\t\tpluginKey,\n\t\t\tidentity,\n\t\t\tpublish: (event) => publish(ref, hub, event),\n\t\t\tregisterStrategy: (decl: StrategyContributorDecl<string, unknown>) =>\n\t\t\t\tstrategyRegistry.register(decl.capabilityKey, decl.strategy, {\n\t\t\t\t\tautoMounted: decl.autoMounted,\n\t\t\t\t\t...(decl.priority === undefined ? {} : { priority: decl.priority }),\n\t\t\t\t}),\n\t\t};\n\n\t\tconst items: ReadonlyArray<AnyContribution> = [\n\t\t\t...capabilities.map<AnyContribution>((decl) => ({\n\t\t\t\tsource: 'capability',\n\t\t\t\tdecl,\n\t\t\t})),\n\t\t\t...errorContributions.map<AnyContribution>((contribution) => ({\n\t\t\t\tsource: 'error',\n\t\t\t\tcontribution,\n\t\t\t})),\n\t\t];\n\n\t\tfor (const item of items) {\n\t\t\tconst dispatch = sinks\n\t\t\t\t.dispatch(item, harvestCtx)\n\t\t\t\t.pipe(Effect.catchTag('UnknownContributionKind', () => Effect.void));\n\t\t\tyield* Scope.provide(dispatch, pluginScope);\n\t\t}\n\t}).pipe(\n\t\twithPluginSpan('lifecycle.supervisor.dispatchContributions', {\n\t\t\tapp: identity.app,\n\t\t\tstack: identity.stack,\n\t\t\tnetwork: identity.chain,\n\t\t\tpluginKey,\n\t\t\trole: pluginRole,\n\t\t}),\n\t);\n\n// -----------------------------------------------------------------------------\n// Acquire one node\n// -----------------------------------------------------------------------------\n\n/**\n * Run one node's `start` under its own scope. Steps:\n * 1. Await upstreams (their ready-gates).\n * 2. Transition `pending → acquiring` (publishes the event).\n * 3. Build resolved dependency values from declared resource refs.\n * 4. Run the plugin's `start` Effect inside the entry's Scope,\n * after providing the substrate-context services bundle so the\n * plugin's R-channel yields (`IdentityContext`,\n * `ContainerRuntimeService`, etc.) resolve to live instances.\n * 5. On success: stash the resolved value + `markReady` (publishes\n * the `ready` transition).\n * 6. On failure: `markFailed` (publishes the `failed` transition, fails\n * the deferred so downstream consumers short-circuit).\n *\n * Errors are caught and stashed onto the registry entry — the outer\n * scheduler doesn't propagate per-plugin failures; ready-gate failure\n * propagation handles the downstream blocking. The supervisor's outer\n * fiber surfaces the union via `Fiber.join` when the user asks for\n * \"stack ready or err\".\n */\nconst acquireNode = (\n\tregistry: PluginRegistry,\n\tkey: PluginKey,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\tpluginContext: Context.Context<never>,\n\tsinks: CapabilitySinksShape,\n\tlogger: LoggerShape,\n\tidentity: Identity,\n\truntimeRoot: string,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst entry = registry.entries.get(key);\n\t\tif (entry === undefined) return;\n\t\t// Wait for upstreams. If any failed, mark this one failed too —\n\t\t// the cause walker carries the upstream's `PluginAcquireFailed`.\n\t\tconst upstreamWait = awaitUpstreams(registry, entry.node).pipe(\n\t\t\tEffect.matchEffect({\n\t\t\t\tonFailure: (cause) =>\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* registry.markFailed(key, cause).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t\treturn false as const;\n\t\t\t\t\t}),\n\t\t\t\tonSuccess: () => Effect.succeed(true as const),\n\t\t\t}),\n\t\t);\n\t\tconst ok = yield* upstreamWait;\n\t\tif (ok !== true) {\n\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\tlevel: 'warn',\n\t\t\t\tmessage: 'plugin acquire skipped — upstream failed',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tyield* annotatePhase('acquire');\n\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\tlevel: 'debug',\n\t\t\tmessage: 'plugin acquire start',\n\t\t\tfields: { role: entry.node.member.role },\n\t\t});\n\t\tyield* registry.transition(key, 'acquiring').pipe(Effect.catch(() => Effect.void));\n\t\t// Build resolved dependency values over the registry's resolved\n\t\t// values, then run the plugin's `start` against the entry's\n\t\t// Scope via `Scope.provide` — provides the scope to the acquire\n\t\t// effect's requirements WITHOUT closing it (unlike `Scope.use`,\n\t\t// which closes on exit). Finalizers stay registered on the\n\t\t// entry's scope; the supervisor closes the scope explicitly in\n\t\t// `teardownNode`.\n\t\t//\n\t\t// `Effect.provide(pluginContext)` injects the substrate-context\n\t\t// services the plugin's acquire body yields (Identity,\n\t\t// ContainerRuntime, etc.). The plugin's R channel narrows from\n\t\t// the per-plugin union to `Scope.Scope` once these are provided;\n\t\t// `Scope.provide` then absorbs the scope itself. After both,\n\t\t// R = never — safe to run inside the supervisor's `never` fiber.\n\t\tconst readDependency = buildDependencyReaderFor(registry, entry.node);\n\t\tconst deps = resolvePluginDependencies(entry.node.member, readDependency);\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst start = entry.node.member.start as (\n\t\t\tdeps: unknown,\n\t\t) => Effect.Effect<unknown, unknown, any>;\n\t\tconst currentPluginContext = pluginContext.pipe(\n\t\t\tContext.add(CurrentPluginKey, { key }),\n\t\t\tContext.add(CurrentPluginProgress, {\n\t\t\t\tsetPhase: (phase) =>\n\t\t\t\t\tpublish(ref, hub, {\n\t\t\t\t\t\ttag: 'lifecycle.phaseSet',\n\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t}),\n\t\t\t}),\n\t\t);\n\t\tconst providedAcquire = Effect.provide(start(deps), currentPluginContext) as Effect.Effect<\n\t\t\tunknown,\n\t\t\tunknown,\n\t\t\tScope.Scope\n\t\t>;\n\t\tconst result = yield* Scope.provide(providedAcquire, entry.scope).pipe(\n\t\t\tEffect.matchEffect({\n\t\t\t\tonFailure: (cause) =>\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tyield* registry.markFailed(key, cause).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t\tyield* publish(ref, hub, {\n\t\t\t\t\t\t\ttag: 'error.reported',\n\t\t\t\t\t\t\terror: prettyErrorStructured(Cause.fail(cause), {\n\t\t\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t\t\t\tseverity: 'error',\n\t\t\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn { ok: false as const };\n\t\t\t\t\t}),\n\t\t\t\tonSuccess: (value: unknown) =>\n\t\t\t\t\tEffect.succeed({ ok: true as const, value: value as unknown }),\n\t\t\t}),\n\t\t);\n\t\tif (result.ok) {\n\t\t\t// Harvest contributions:\n\t\t\t// 1. The plugin's `capabilities` tuple (or post-acquire\n\t\t\t// dynamic factory) — yields `CapabilityDecl`s.\n\t\t\t// 2. The plugin's `errorContributions` field — yields\n\t\t\t// `PluginErrorContribution`s for the FormatterRegistry.\n\t\t\t// Registrations land on the plugin's scope so they reap on\n\t\t\t// plugin teardown (selective restart, shutdown). The\n\t\t\t// supervisor stays kind-blind: routing is the registry's job.\n\t\t\tconst acquireContext: AcquireContext = {\n\t\t\t\tidentity,\n\t\t\t\tchain: identity.chain,\n\t\t\t\truntimeRoot,\n\t\t\t};\n\t\t\tconst capsExit = yield* Effect.exit(\n\t\t\t\tresolveCapabilities(\n\t\t\t\t\tkey,\n\t\t\t\t\tentry.node.member.capabilities as\n\t\t\t\t\t\t| ReadonlyArray<CapabilityDecl>\n\t\t\t\t\t\t| ((r: unknown, c: AcquireContext) => ReadonlyArray<CapabilityDecl>)\n\t\t\t\t\t\t| undefined,\n\t\t\t\t\tresult.value,\n\t\t\t\t\tacquireContext,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (Exit.isFailure(capsExit)) {\n\t\t\t\tyield* registry.markFailed(key, capsExit.cause).pipe(Effect.catch(() => Effect.void));\n\t\t\t\tyield* publish(ref, hub, {\n\t\t\t\t\ttag: 'error.reported',\n\t\t\t\t\terror: prettyErrorStructured(capsExit.cause, {\n\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t\tseverity: 'error',\n\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\t\tlevel: 'error',\n\t\t\t\t\tmessage: 'plugin capability factory failed',\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst caps = capsExit.value;\n\t\t\tconst errorContributions = entry.node.member.errorContributions ?? [];\n\t\t\tif (caps.length > 0 || errorContributions.length > 0) {\n\t\t\t\tconst dispatchExit = yield* Effect.exit(\n\t\t\t\t\tdispatchContributions(\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tcaps,\n\t\t\t\t\t\terrorContributions,\n\t\t\t\t\t\tentry.node.member.role,\n\t\t\t\t\t\tidentity,\n\t\t\t\t\t\tpluginContext,\n\t\t\t\t\t\tentry.scope,\n\t\t\t\t\t\tsinks,\n\t\t\t\t\t\tref,\n\t\t\t\t\t\thub,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tif (Exit.isFailure(dispatchExit)) {\n\t\t\t\t\tyield* registry.markFailed(key, dispatchExit.cause).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\tyield* publish(ref, hub, {\n\t\t\t\t\t\ttag: 'error.reported',\n\t\t\t\t\t\terror: prettyErrorStructured(dispatchExit.cause, {\n\t\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t\t\tseverity: 'error',\n\t\t\t\t\t\t\tat: Date.now(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t});\n\t\t\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\t\t\tlevel: 'error',\n\t\t\t\t\t\tmessage: 'plugin capability dispatch failed',\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst routablesPresent = caps.some((capability) => capability.kind === 'routable');\n\t\t\tfor (const event of operationalEndpointEventsFromResolvedValue(\n\t\t\t\tkey,\n\t\t\t\tresult.value,\n\t\t\t\tDate.now(),\n\t\t\t\t{\n\t\t\t\t\troutablesPresent,\n\t\t\t\t},\n\t\t\t)) {\n\t\t\t\tyield* publish(ref, hub, event);\n\t\t\t}\n\t\t\tyield* publish(ref, hub, {\n\t\t\t\ttag: 'lifecycle.phaseSet',\n\t\t\t\tpluginKey: key,\n\t\t\t\tphase: null,\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t\t// `markReady` populates the synchronous resolved-value map AND\n\t\t\t// resolves the deferred; downstream dependency resolution reads\n\t\t\t// from the former.\n\t\t\tyield* registry.markReady(key, result.value).pipe(Effect.catch(() => Effect.void));\n\t\t\tif (entry.node.member.role === 'task') {\n\t\t\t\tyield* registry.transition(key, 'done').pipe(Effect.catch(() => Effect.void));\n\t\t\t}\n\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\tlevel: 'debug',\n\t\t\t\tmessage: entry.node.member.role === 'task' ? 'plugin done' : 'plugin ready',\n\t\t\t\tfields: {\n\t\t\t\t\tcapabilities: caps.length,\n\t\t\t\t\terrorContributions: errorContributions.length,\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tyield* logger.log(`supervisor/${key}`, key, {\n\t\t\t\tlevel: 'debug',\n\t\t\t\tmessage: 'plugin acquire failed',\n\t\t\t});\n\t\t}\n\t}).pipe(\n\t\twithPluginSpan('lifecycle.supervisor.acquireNode', {\n\t\t\tapp: identity.app,\n\t\t\tstack: identity.stack,\n\t\t\tnetwork: identity.chain,\n\t\t\tpluginKey: key,\n\t\t\trole: registry.entries.get(key)?.node.member.role ?? 'service',\n\t\t}),\n\t);\n\n// -----------------------------------------------------------------------------\n// Acquire a key set in parallel. Each node waits on its own upstreams,\n// so downstream nodes begin as soon as their dependencies are ready\n// instead of waiting for unrelated nodes in the same topological level.\n// -----------------------------------------------------------------------------\n\nconst acquireKeys = (\n\tregistry: PluginRegistry,\n\tkeys: ReadonlyArray<PluginKey>,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\tpluginContext: Context.Context<never>,\n\tsinks: CapabilitySinksShape,\n\tlogger: LoggerShape,\n\tidentity: Identity,\n\truntimeRoot: string,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tyield* Effect.annotateCurrentSpan({ 'devstack.level.size': keys.length });\n\t\tyield* Effect.all(\n\t\t\tkeys.map((key) =>\n\t\t\t\tacquireNode(registry, key, ref, hub, pluginContext, sinks, logger, identity, runtimeRoot),\n\t\t\t),\n\t\t\t{ concurrency: 'unbounded', discard: true },\n\t\t);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.acquireKeys'));\n\nconst acquireFullGraph = (\n\tgraph: ResolvedGraph,\n\tregistry: PluginRegistry,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\tpluginContext: Context.Context<never>,\n\tsinks: CapabilitySinksShape,\n\tlogger: LoggerShape,\n\tidentity: Identity,\n\truntimeRoot: string,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tyield* annotateOp('acquireFullGraph');\n\t\tyield* acquireKeys(\n\t\t\tregistry,\n\t\t\t[...graph.nodes.keys()],\n\t\t\tref,\n\t\t\thub,\n\t\t\tpluginContext,\n\t\t\tsinks,\n\t\t\tlogger,\n\t\t\tidentity,\n\t\t\truntimeRoot,\n\t\t);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.acquireFullGraph'));\n\n// -----------------------------------------------------------------------------\n// Teardown\n// -----------------------------------------------------------------------------\n\n/**\n * Tear down a slice in reverse-dep order, parallel within each level.\n * Each node's scope close runs its finalizers; status transitions\n * `ready → stopping → stopped` are emitted.\n *\n * Architecture § Stack lifecycle: \"shutdown.requested → parallel\n * teardown (max grace, not sum grace)\".\n */\nconst teardownKeys = (\n\tgraph: ResolvedGraph,\n\tregistry: PluginRegistry,\n\tkeys: ReadonlyArray<PluginKey>,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\t// Bucket by level so the reverse-order array preserves the\n\t\t// \"parallel within level\" invariant.\n\t\tconst byLevel: Array<Array<PluginKey>> = graph.levels.map(() => []);\n\t\tconst keySet = new Set(keys);\n\t\tfor (let i = 0; i < graph.levels.length; i++) {\n\t\t\tfor (const key of graph.levels[i]!) {\n\t\t\t\tif (keySet.has(key)) byLevel[i]!.push(key);\n\t\t\t}\n\t\t}\n\t\tfor (let i = byLevel.length - 1; i >= 0; i--) {\n\t\t\tconst level = byLevel[i]!;\n\t\t\tif (level.length === 0) continue;\n\t\t\tyield* Effect.all(\n\t\t\t\tlevel.map((key) => teardownNode(registry, key)),\n\t\t\t\t{ concurrency: 'unbounded', discard: true },\n\t\t\t);\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.teardownKeys'));\n\nconst teardownNode = (\n\tregistry: PluginRegistry,\n\tkey: PluginKey,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst entry = registry.entries.get(key);\n\t\tif (entry === undefined) return;\n\t\tconst status = yield* registry\n\t\t\t.getStatus(key)\n\t\t\t.pipe(Effect.catch(() => Effect.succeed<LifecycleStatus>('pending')));\n\t\t// Only `ready` plugins need stopping. `acquiring` plugins are\n\t\t// interrupted by the scope close. `failed` / `stopped` / `done`\n\t\t// are no-ops.\n\t\tif (status === 'ready') {\n\t\t\tyield* registry.transition(key, 'stopping').pipe(Effect.catch(() => Effect.void));\n\t\t}\n\t\tyield* Scope.close(entry.scope, Exit.void).pipe(Effect.catch(() => Effect.void));\n\t\tif (status === 'ready') {\n\t\t\tyield* registry.transition(key, 'stopped').pipe(Effect.catch(() => Effect.void));\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.teardownNode'));\n\n// -----------------------------------------------------------------------------\n// Selective restart\n// -----------------------------------------------------------------------------\n\nconst doSelectiveRestart = (\n\tgraph: ResolvedGraph,\n\tregistry: PluginRegistry,\n\tref: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\thub: Queue.Enqueue<EngineEvent>,\n\troots: ReadonlySet<PluginKey>,\n\tpluginContext: Context.Context<never>,\n\tsinks: CapabilitySinksShape,\n\tlogger: LoggerShape,\n\tidentity: Identity,\n\truntimeRoot: string,\n\tparentScope: Scope.Scope,\n): Effect.Effect<void, RestartTargetMissing> =>\n\tEffect.gen(function* () {\n\t\tconst plan = yield* planRestart(graph, roots);\n\t\tconst at = Date.now();\n\t\tfor (const root of roots) {\n\t\t\tyield* publish(ref, hub, {\n\t\t\t\ttag: 'restart.requested',\n\t\t\t\ttarget: { pluginKey: root },\n\t\t\t\tat,\n\t\t\t});\n\t\t}\n\t\tyield* teardownKeys(graph, registry, plan.teardownOrder);\n\t\t// Re-acquire the slice in parallel. Each node waits on its own\n\t\t// upstream ready gate, so a downstream node in the slice can't\n\t\t// acquire until its upstream is back to `ready`; unrelated\n\t\t// siblings do not act as a level barrier. Nodes outside the\n\t\t// slice are already `ready`. We need to mark slice nodes back\n\t\t// to `pending` so the state\n\t\t// machine accepts the `pending → acquiring` transition.\n\t\tfor (const key of plan.acquireOrder) {\n\t\t\tyield* registry.resetForRestart(key, parentScope).pipe(Effect.catch(() => Effect.void));\n\t\t\tyield* registry.transition(key, 'pending').pipe(Effect.catch(() => Effect.void));\n\t\t}\n\t\tyield* acquireKeys(\n\t\t\tregistry,\n\t\t\tplan.acquireOrder,\n\t\t\tref,\n\t\t\thub,\n\t\t\tpluginContext,\n\t\t\tsinks,\n\t\t\tlogger,\n\t\t\tidentity,\n\t\t\truntimeRoot,\n\t\t);\n\t\tfor (const root of roots) {\n\t\t\tyield* publish(ref, hub, {\n\t\t\t\ttag: 'restart.completed',\n\t\t\t\ttarget: { pluginKey: root },\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.selectiveRestart'));\n\n// -----------------------------------------------------------------------------\n// Command loop\n// -----------------------------------------------------------------------------\n\ninterface CommandLoopDeps {\n\treadonly graph: ResolvedGraph;\n\treadonly registry: PluginRegistry;\n\treadonly ref: SubscriptionRef.SubscriptionRef<SubscribableState>;\n\treadonly hub: Queue.Enqueue<EngineEvent>;\n\treadonly queuedCommands: Queue.Dequeue<QueuedCommand>;\n\treadonly stackRestartTask: Ref.Ref<StackRestartTaskState>;\n\treadonly stackRestartSeq: Ref.Ref<number>;\n\treadonly snapshotCaptureTask: Ref.Ref<SnapshotCaptureTaskState>;\n\treadonly snapshotCaptureSeq: Ref.Ref<number>;\n\treadonly shutdownLatch: Ref.Ref<boolean>;\n\treadonly shutdownComplete: Deferred.Deferred<void>;\n\treadonly pluginContext: Context.Context<never>;\n\treadonly sinks: CapabilitySinksShape;\n\treadonly logger: LoggerShape;\n\treadonly identity: Identity;\n\treadonly runtimeRoot: string;\n\treadonly parentScope: Scope.Scope;\n\treadonly commandHandler?: SupervisorCommandHandler;\n\treadonly postAcquireHook?: SupervisorPostAcquireHook;\n}\n\ninterface CommandSubmission {\n\treadonly command: EngineCommand;\n\treadonly completion: Deferred.Deferred<Exit.Exit<void, unknown>>;\n}\n\ntype StackRestartTaskState =\n\t| { readonly tag: 'idle' }\n\t| { readonly tag: 'starting'; readonly token: number }\n\t| { readonly tag: 'running'; readonly token: number; readonly fiber: Fiber.Fiber<void, never> };\n\ntype SnapshotCaptureTaskState =\n\t| { readonly tag: 'idle' }\n\t| { readonly tag: 'starting'; readonly token: number; readonly snapshotId: string | null }\n\t| {\n\t\t\treadonly tag: 'running';\n\t\t\treadonly token: number;\n\t\t\treadonly snapshotId: string | null;\n\t\t\treadonly fiber: Fiber.Fiber<void, never>;\n\t };\n\nconst runInjectedCommandHandler = (\n\tdeps: CommandLoopDeps,\n\tcmd: EngineCommand,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tif (deps.commandHandler === undefined) return;\n\t\tconst publishFromHandler = (event: EngineEvent): Effect.Effect<void, never, never> =>\n\t\t\tpublish(deps.ref, deps.hub, event);\n\t\tconst exit = yield* Effect.exit(\n\t\t\tdeps.commandHandler(cmd, {\n\t\t\t\tpublish: publishFromHandler,\n\t\t\t}),\n\t\t);\n\t\tif (Exit.isSuccess(exit)) {\n\t\t\tfor (const event of exit.value) {\n\t\t\t\tyield* publish(deps.ref, deps.hub, event);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (Cause.hasInterruptsOnly(exit.cause)) return;\n\t\tif (cmd.tag === 'snapshot.capture') {\n\t\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\t\ttag: 'snapshot.captureFailed',\n\t\t\t\t...(cmd.snapshotId === undefined ? {} : { snapshotId: cmd.snapshotId }),\n\t\t\t\t...(cmd.name === undefined ? {} : { name: cmd.name }),\n\t\t\t\tsummary: Cause.pretty(exit.cause).split('\\n')[0] ?? 'snapshot capture failed',\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t}\n\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\ttag: 'error.reported',\n\t\t\terror: prettyErrorStructured(exit.cause, {\n\t\t\t\tpluginKey: null,\n\t\t\t\tseverity: 'error',\n\t\t\t\tat: Date.now(),\n\t\t\t}),\n\t\t});\n\t\tyield* deps.logger.log('supervisor', null, {\n\t\t\tlevel: 'error',\n\t\t\tmessage: `command handler failed for ${cmd.tag}`,\n\t\t});\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.injectedCommandHandler'));\n\nconst startBackgroundSnapshotCapture = (\n\tdeps: CommandLoopDeps,\n\tcmd: Extract<EngineCommand, { readonly tag: 'snapshot.capture' }>,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst token = yield* Ref.updateAndGet(deps.snapshotCaptureSeq, (n) => n + 1);\n\t\tconst started = yield* Ref.modify(deps.snapshotCaptureTask, (state) =>\n\t\t\tstate.tag === 'idle'\n\t\t\t\t? [\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttag: 'starting' as const,\n\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\tsnapshotId: cmd.snapshotId ?? null,\n\t\t\t\t\t\t} satisfies SnapshotCaptureTaskState,\n\t\t\t\t\t]\n\t\t\t\t: [false, state],\n\t\t);\n\n\t\tif (!started) {\n\t\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\t\ttag: 'snapshot.captureSkipped',\n\t\t\t\treason: 'already-running',\n\t\t\t\tat: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\ttag: 'snapshot.captureStarted',\n\t\t\t...(cmd.snapshotId === undefined ? {} : { snapshotId: cmd.snapshotId }),\n\t\t\t...(cmd.name === undefined ? {} : { name: cmd.name }),\n\t\t\tat: Date.now(),\n\t\t});\n\n\t\tconst fiber = yield* runInjectedCommandHandler(deps, cmd).pipe(\n\t\t\tEffect.ensuring(\n\t\t\t\tRef.update(deps.snapshotCaptureTask, (state) =>\n\t\t\t\t\tstate.tag !== 'idle' && state.token === token\n\t\t\t\t\t\t? ({ tag: 'idle' } satisfies SnapshotCaptureTaskState)\n\t\t\t\t\t\t: state,\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.forkIn(deps.parentScope),\n\t\t);\n\n\t\tyield* Ref.update(deps.snapshotCaptureTask, (state) =>\n\t\t\tstate.tag === 'starting' && state.token === token\n\t\t\t\t? ({\n\t\t\t\t\t\ttag: 'running',\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\tsnapshotId: cmd.snapshotId ?? null,\n\t\t\t\t\t\tfiber,\n\t\t\t\t\t} satisfies SnapshotCaptureTaskState)\n\t\t\t\t: state,\n\t\t);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.backgroundSnapshotCapture'));\n\nconst requestBackgroundSnapshotInterrupt = (\n\tdeps: Pick<CommandLoopDeps, 'snapshotCaptureTask'>,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst fiber = yield* Ref.modify(deps.snapshotCaptureTask, (state) =>\n\t\t\tstate.tag === 'running'\n\t\t\t\t? [state.fiber, { tag: 'idle' } as SnapshotCaptureTaskState]\n\t\t\t\t: [null, state],\n\t\t);\n\t\tif (fiber !== null) {\n\t\t\tyield* Effect.sync(() => {\n\t\t\t\tfiber.interruptUnsafe();\n\t\t\t});\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.interruptSnapshotCapture'));\n\nconst startBackgroundStackRestart = (\n\tdeps: CommandLoopDeps,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst token = yield* Ref.updateAndGet(deps.stackRestartSeq, (n) => n + 1);\n\t\tconst started = yield* Ref.modify(deps.stackRestartTask, (state) =>\n\t\t\tstate.tag === 'idle'\n\t\t\t\t? [true, { tag: 'starting' as const, token }]\n\t\t\t\t: [false, state],\n\t\t);\n\n\t\tif (!started) {\n\t\t\tyield* deps.logger.log('supervisor', null, {\n\t\t\t\tlevel: 'debug',\n\t\t\t\tmessage: 'stack restart skipped because one is already running',\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst fiber = yield* handleCommand(deps, { tag: 'stack.restart' }).pipe(\n\t\t\tEffect.catch(() => Effect.void),\n\t\t\tEffect.ensuring(\n\t\t\t\tRef.update(deps.stackRestartTask, (state) =>\n\t\t\t\t\tstate.tag !== 'idle' && state.token === token\n\t\t\t\t\t\t? ({ tag: 'idle' } satisfies StackRestartTaskState)\n\t\t\t\t\t\t: state,\n\t\t\t\t),\n\t\t\t),\n\t\t\tEffect.forkIn(deps.parentScope),\n\t\t);\n\n\t\tyield* Ref.update(deps.stackRestartTask, (state) =>\n\t\t\tstate.tag === 'starting' && state.token === token\n\t\t\t\t? ({ tag: 'running', token, fiber } satisfies StackRestartTaskState)\n\t\t\t\t: state,\n\t\t);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.backgroundStackRestart'));\n\nconst requestBackgroundStackRestartInterrupt = (\n\tdeps: Pick<CommandLoopDeps, 'stackRestartTask'>,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tconst fiber = yield* Ref.modify(deps.stackRestartTask, (state) =>\n\t\t\tstate.tag === 'running'\n\t\t\t\t? [state.fiber, { tag: 'idle' } as StackRestartTaskState]\n\t\t\t\t: [null, state],\n\t\t);\n\t\tif (fiber !== null) {\n\t\t\tyield* Fiber.interrupt(fiber);\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.interruptStackRestart'));\n\nconst publishHookFailure = (\n\tdeps: CommandLoopDeps,\n\tcause: Cause.Cause<unknown>,\n\tmessage: string,\n\tpluginKey: PluginKey | null = null,\n): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\tyield* publish(deps.ref, deps.hub, {\n\t\t\ttag: 'error.reported',\n\t\t\terror: prettyErrorStructured(cause, {\n\t\t\t\tpluginKey,\n\t\t\t\tseverity: 'error',\n\t\t\t\tat: Date.now(),\n\t\t\t}),\n\t\t});\n\t\tyield* deps.logger.log('supervisor', null, {\n\t\t\tlevel: 'error',\n\t\t\tmessage,\n\t\t});\n\t});\n\nconst findPostAcquireTaskFailure = (cause: Cause.Cause<unknown>): PostAcquireTaskFailed | null => {\n\tfor (const reason of cause.reasons) {\n\t\tif (!Cause.isFailReason(reason)) continue;\n\t\tif (reason.error instanceof PostAcquireTaskFailed) return reason.error;\n\t}\n\treturn null;\n};\n\nconst runPostAcquireHook = (\n\tdeps: CommandLoopDeps,\n): Effect.Effect<void, SupervisorPostAcquireFailed, never> =>\n\tEffect.gen(function* () {\n\t\tif (deps.postAcquireHook === undefined) return;\n\t\tconst exit = yield* Effect.exit(\n\t\t\tdeps.postAcquireHook({\n\t\t\t\tgraph: deps.graph,\n\t\t\t\tregistry: deps.registry,\n\t\t\t\tidentity: deps.identity,\n\t\t\t\truntimeRoot: deps.runtimeRoot,\n\t\t\t}),\n\t\t);\n\t\tif (Exit.isSuccess(exit)) {\n\t\t\tfor (const event of exit.value) {\n\t\t\t\tyield* publish(deps.ref, deps.hub, event);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst taskFailure = findPostAcquireTaskFailure(exit.cause);\n\t\tif (taskFailure !== null) {\n\t\t\tyield* deps.registry\n\t\t\t\t.markFailed(taskFailure.pluginKey, taskFailure.cause)\n\t\t\t\t.pipe(Effect.catch(() => Effect.void));\n\t\t}\n\t\tyield* publishHookFailure(\n\t\t\tdeps,\n\t\t\texit.cause,\n\t\t\ttaskFailure === null\n\t\t\t\t? 'post-acquire hook failed'\n\t\t\t\t: `post-acquire task failed: ${taskFailure.label}`,\n\t\t\ttaskFailure?.pluginKey ?? null,\n\t\t);\n\t\treturn yield* Effect.fail(new SupervisorPostAcquireFailed({ cause: exit.cause }));\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.postAcquireHook'));\n\nconst allReadyOrTerminal = (\n\tgraph: ResolvedGraph,\n\tregistry: PluginRegistry,\n): Effect.Effect<boolean, never, never> =>\n\tEffect.gen(function* () {\n\t\tfor (const key of graph.nodes.keys()) {\n\t\t\tconst status = yield* registry\n\t\t\t\t.getStatus(key)\n\t\t\t\t.pipe(Effect.catch(() => Effect.succeed<LifecycleStatus>('failed')));\n\t\t\tif (!isReadyOrTerminal(status)) return false;\n\t\t}\n\t\treturn true;\n\t});\n\nconst handleCommand = (\n\tdeps: CommandLoopDeps,\n\tcmd: EngineCommand,\n\toptions: { readonly failOnPostAcquireHook?: boolean } = {},\n): Effect.Effect<void, SupervisorPostAcquireFailed, never> =>\n\tEffect.gen(function* () {\n\t\tconst {\n\t\t\tgraph,\n\t\t\tregistry,\n\t\t\tref,\n\t\t\thub,\n\t\t\tshutdownLatch,\n\t\t\tpluginContext,\n\t\t\tsinks,\n\t\t\tlogger,\n\t\t\tidentity,\n\t\t\truntimeRoot,\n\t\t\tparentScope,\n\t\t} = deps;\n\t\tswitch (cmd.tag) {\n\t\t\tcase 'shutdown.requested':\n\t\t\tcase 'stack.stop': {\n\t\t\t\tyield* requestBackgroundSnapshotInterrupt(deps);\n\t\t\t\tyield* setCyclePhase(ref, 'shutting-down');\n\t\t\t\tyield* Ref.set(shutdownLatch, true);\n\t\t\t\tyield* logger.log('supervisor', null, {\n\t\t\t\t\tlevel: 'info',\n\t\t\t\t\tmessage: 'shutdown requested',\n\t\t\t\t});\n\t\t\t\tyield* requestBackgroundStackRestartInterrupt(deps);\n\t\t\t\tyield* setCyclePhase(ref, 'shutting-down');\n\t\t\t\tconst plan = planFullDrain(graph);\n\t\t\t\tyield* teardownKeys(graph, registry, plan.teardownOrder);\n\t\t\t\tyield* Effect.yieldNow;\n\t\t\t\tyield* Deferred.succeed(deps.shutdownComplete, void 0).pipe(Effect.ignore);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'shutdown.hardKillRequested': {\n\t\t\t\tyield* requestBackgroundSnapshotInterrupt(deps);\n\t\t\t\tyield* publish(ref, hub, {\n\t\t\t\t\ttag: 'shutdown.escalated',\n\t\t\t\t\tsignal: cmd.signal,\n\t\t\t\t\texitCode: cmd.exitCode,\n\t\t\t\t\tat: cmd.at,\n\t\t\t\t});\n\t\t\t\tyield* setCyclePhase(ref, 'shutting-down');\n\t\t\t\tyield* Ref.set(shutdownLatch, true);\n\t\t\t\tyield* requestBackgroundStackRestartInterrupt(deps);\n\t\t\t\tyield* setCyclePhase(ref, 'shutting-down');\n\t\t\t\tyield* Deferred.succeed(deps.shutdownComplete, void 0).pipe(Effect.ignore);\n\t\t\t\tyield* logger.log('supervisor', null, {\n\t\t\t\t\tlevel: 'fatal',\n\t\t\t\t\tmessage: `shutdown escalated by ${cmd.signal}`,\n\t\t\t\t\tfields: { signal: cmd.signal, exitCode: cmd.exitCode },\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'stack.restart': {\n\t\t\t\tconst plan = planFullDrain(graph);\n\t\t\t\tconst restarted = yield* doSelectiveRestart(\n\t\t\t\t\tgraph,\n\t\t\t\t\tregistry,\n\t\t\t\t\tref,\n\t\t\t\t\thub,\n\t\t\t\t\tnew Set(plan.slice),\n\t\t\t\t\tpluginContext,\n\t\t\t\t\tsinks,\n\t\t\t\t\tlogger,\n\t\t\t\t\tidentity,\n\t\t\t\t\truntimeRoot,\n\t\t\t\t\tparentScope,\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.as(true),\n\t\t\t\t\tEffect.catch(() => Effect.succeed(false)),\n\t\t\t\t);\n\t\t\t\tif (restarted && (yield* allReadyOrTerminal(graph, registry))) {\n\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'selective-restart.requested': {\n\t\t\t\tconst restarted = yield* doSelectiveRestart(\n\t\t\t\t\tgraph,\n\t\t\t\t\tregistry,\n\t\t\t\t\tref,\n\t\t\t\t\thub,\n\t\t\t\t\tnew Set<PluginKey>([cmd.pluginKey]),\n\t\t\t\t\tpluginContext,\n\t\t\t\t\tsinks,\n\t\t\t\t\tlogger,\n\t\t\t\t\tidentity,\n\t\t\t\t\truntimeRoot,\n\t\t\t\t\tparentScope,\n\t\t\t\t).pipe(\n\t\t\t\t\tEffect.as(true),\n\t\t\t\t\tEffect.catch(() => Effect.succeed(false)),\n\t\t\t\t);\n\t\t\t\tif (restarted && (yield* allReadyOrTerminal(graph, registry))) {\n\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'apply.requested': {\n\t\t\t\t// Re-acquire after watch invalidation. Caller may target a\n\t\t\t\t// specific plugin; otherwise no-op (the watcher already fed\n\t\t\t\t// `selective-restart.requested` for the affected keys).\n\t\t\t\tif (cmd.pluginKey !== undefined) {\n\t\t\t\t\tconst restarted = yield* doSelectiveRestart(\n\t\t\t\t\t\tgraph,\n\t\t\t\t\t\tregistry,\n\t\t\t\t\t\tref,\n\t\t\t\t\t\thub,\n\t\t\t\t\t\tnew Set<PluginKey>([cmd.pluginKey]),\n\t\t\t\t\t\tpluginContext,\n\t\t\t\t\t\tsinks,\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t\tidentity,\n\t\t\t\t\t\truntimeRoot,\n\t\t\t\t\t\tparentScope,\n\t\t\t\t\t).pipe(\n\t\t\t\t\t\tEffect.as(true),\n\t\t\t\t\t\tEffect.catch(() => Effect.succeed(false)),\n\t\t\t\t\t);\n\t\t\t\t\tif (restarted && (yield* allReadyOrTerminal(graph, registry))) {\n\t\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (yield* allReadyOrTerminal(graph, registry)) {\n\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'codegen.requested': {\n\t\t\t\tif (yield* allReadyOrTerminal(graph, registry)) {\n\t\t\t\t\tif (options.failOnPostAcquireHook === true) {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tyield* runPostAcquireHook(deps).pipe(Effect.catch(() => Effect.void));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Snapshot/wipe/prune are owned by injected L3 handlers. The\n\t\t\t// supervisor keeps one consumer of the command queue and only\n\t\t\t// publishes the handler's typed events / errors.\n\t\t\tcase 'snapshot.capture':\n\t\t\t\tyield* startBackgroundSnapshotCapture(deps, cmd);\n\t\t\t\treturn;\n\t\t\tcase 'snapshot.restore':\n\t\t\tcase 'snapshot.list':\n\t\t\tcase 'snapshot.delete':\n\t\t\tcase 'wipe.requested':\n\t\t\tcase 'prune.requested':\n\t\t\t\tyield* runInjectedCommandHandler(deps, cmd);\n\t\t\t\treturn;\n\t\t\tcase 'advance-clock.requested':\n\t\t\tcase 'stack.start':\n\t\t\t\treturn;\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.handleCommand'));\n\ntype QueuedCommand =\n\t| { readonly kind: 'fire-and-forget'; readonly command: EngineCommand }\n\t| { readonly kind: 'submitted'; readonly submission: CommandSubmission };\n\nconst commandLoop = (deps: CommandLoopDeps): Effect.Effect<void, never, never> =>\n\tEffect.gen(function* () {\n\t\twhile (true) {\n\t\t\tconst next = yield* Queue.take(deps.queuedCommands);\n\t\t\tif (next.kind === 'submitted') {\n\t\t\t\tconst exit = yield* Effect.exit(\n\t\t\t\t\thandleCommand(deps, next.submission.command, { failOnPostAcquireHook: true }),\n\t\t\t\t);\n\t\t\t\tyield* Deferred.succeed(next.submission.completion, exit).pipe(Effect.ignore);\n\t\t\t} else if (next.command.tag === 'stack.restart') {\n\t\t\t\tyield* startBackgroundStackRestart(deps);\n\t\t\t} else {\n\t\t\t\tyield* handleCommand(deps, next.command).pipe(Effect.catch(() => Effect.void));\n\t\t\t}\n\t\t\tconst drained = yield* Ref.get(deps.shutdownLatch);\n\t\t\tif (drained) return;\n\t\t}\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.commandLoop'));\n\n// -----------------------------------------------------------------------------\n// Top-level supervisor entry\n// -----------------------------------------------------------------------------\n\nexport interface SupervisorHandle {\n\treadonly identity: Identity;\n\treadonly graph: ResolvedGraph;\n\treadonly registry: PluginRegistry;\n\treadonly events: Queue.Dequeue<EngineEvent>;\n\treadonly commands: Queue.Enqueue<EngineCommand>;\n\treadonly runCommand: (command: EngineCommand) => Effect.Effect<void, unknown>;\n\treadonly state: SubscriptionRef.SubscriptionRef<SubscribableState>;\n\treadonly watchIndex: ReadonlyArray<WatchEntry>;\n\t/** Fire a watch event for the given path. Substrate-level glue:\n\t * the thick L0 watcher calls this; tests call it directly. */\n\treadonly notifyWatchFire: (path: string) => Effect.Effect<void>;\n\t/** Block until the supervisor's command loop sets the shutdown\n\t * latch. The outer runtime then closes the supervisor scope, which\n\t * tears down every plugin in reverse-dep order. */\n\treadonly awaitShutdown: Effect.Effect<void>;\n}\n\nexport interface SupervisorStartup {\n\treadonly handle: SupervisorHandle;\n\treadonly runInitialAcquire: Effect.Effect<void, SupervisorPostAcquireFailed, never>;\n}\n\nexport interface SupervisorStartupOptions {\n\treadonly commandLoop?: boolean;\n}\n\n/**\n * Prepare a supervisor for `stack` without running the initial acquire.\n * The returned `SupervisorHandle` is Scope-managed; the supervisor's\n * lifecycle is the surrounding Scope's lifecycle. Signal handlers,\n * the command loop, and every plugin's scope are children of the\n * supervisor scope. Callers that mount renderers can subscribe to the\n * returned state before invoking `runInitialAcquire`.\n *\n * `pluginContext` carries the substrate-context services available to\n * each plugin's `acquire` body (`IdentityContext`,\n * `ContainerRuntimeService`, `RuntimeRoot`, `StackPathsService`, etc.).\n * Plugins declare what they need by yielding the corresponding\n * `Context.Service` tag from within `Effect.gen`; the supervisor\n * provides this context before running the acquire effect so the\n * plugin's R-channel narrows to `Scope.Scope` (then to `never` after\n * the per-plugin Scope is provided). The orchestrator layer (L3)\n * builds this context once per stack from its layer stack and hands\n * it to the supervisor; substrate doesn't name the services itself\n * (the context is opaque `Context.Context<never>` at this boundary).\n *\n * `CapabilitySinksService` extension (ARCHITECTURE.md § Plugin-author\n * extension via Layer composition): if the caller layers a\n * `CapabilitySinksService` into `pluginContext`, the supervisor\n * harvests through THAT instance instead of building its own. This is\n * the seam plugin authors use to register custom-kind sinks: compose\n * `layerCapabilitySinksDefault(orchestratorSinks)` with one or more\n * `Layer.effectDiscard` overlays that yield `CapabilitySinksService`\n * and call `registerSink({ kind: 'my-custom', accept: ... })`. The\n * `sinks: OrchestratorSinks` parameter is ignored when context carries\n * a pre-built service (the caller's Layer already supplies whatever\n * sink registrations it wants).\n *\n * Architecture § Stack lifecycle:\n * \"defineStack(config) → Identity validated → NetworkResolver\n * consulted → Plugin dep-graph computed → level-batched parallel\n * acquire → manifest.flushed → ready event → cycle running.\"\n */\nexport const startSupervisor = (\n\tstack: SupervisedStack,\n\tidentity: Identity,\n\tstate: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\tpluginContext: Context.Context<never> = Context.empty(),\n\tsinks: OrchestratorSinks = [],\n\tcommandHandler?: SupervisorCommandHandler,\n\tpostAcquireHook?: SupervisorPostAcquireHook,\n\toptions: SupervisorStartupOptions = {},\n): Effect.Effect<SupervisorStartup, SupervisorBootError | UnknownDependency, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t'devstack.stack.memberCount': stack.members.length,\n\t\t});\n\n\t\t// Optional Logger service — pull from the plugin context if the\n\t\t// caller layered it in (CLI / e2e do). Bare smoke tests get the\n\t\t// no-op fallback so they remain log-free.\n\t\tconst baseLogger: LoggerShape = getOrDefault(pluginContext, Logger, noopLogger);\n\n\t\tyield* baseLogger.log('supervisor', null, {\n\t\t\tlevel: 'debug',\n\t\t\tmessage: 'supervisor boot start',\n\t\t\tfields: {\n\t\t\t\tapp: identity.app,\n\t\t\t\tstack: identity.stack,\n\t\t\t\tnetwork: identity.chain,\n\t\t\t\tmemberCount: stack.members.length,\n\t\t\t},\n\t\t});\n\n\t\t// Seed the projection's identity and booting slices before\n\t\t// acquire starts so renderers mounting early have a complete\n\t\t// baseline.\n\t\tyield* SubscriptionRef.update(\n\t\t\tstate,\n\t\t\t(s) =>\n\t\t\t\t({\n\t\t\t\t\t...setIdentity(s, {\n\t\t\t\t\t\tapp: identity.app,\n\t\t\t\t\t\tstack: identity.stack,\n\t\t\t\t\t\tnetwork: identity.chain,\n\t\t\t\t\t}),\n\t\t\t\t\tcycle: {\n\t\t\t\t\t\t...s.cycle,\n\t\t\t\t\t\tstartedAt: s.cycle.startedAt === 0 ? Date.now() : s.cycle.startedAt,\n\t\t\t\t\t\tphase: 'booting',\n\t\t\t\t\t},\n\t\t\t\t}) satisfies SubscribableState,\n\t\t);\n\n\t\t// Resolve the dep graph.\n\t\tconst graph = yield* resolveGraph(stack.members).pipe(\n\t\t\tEffect.mapError((cause) => new SupervisorBootError({ cause })),\n\t\t);\n\n\t\t// Event hub + command channel.\n\t\tconst hub = yield* Queue.unbounded<EngineEvent>();\n\t\tconst commands = yield* Queue.unbounded<EngineCommand>();\n\t\tconst queuedCommands = yield* Queue.unbounded<QueuedCommand>();\n\t\tconst stackRestartTask = yield* Ref.make<StackRestartTaskState>({ tag: 'idle' });\n\t\tconst stackRestartSeq = yield* Ref.make(0);\n\t\tconst snapshotCaptureTask = yield* Ref.make<SnapshotCaptureTaskState>({ tag: 'idle' });\n\t\tconst snapshotCaptureSeq = yield* Ref.make(0);\n\t\tconst shutdownLatch = yield* Ref.make(false);\n\t\tconst shutdownComplete = yield* Deferred.make<void>();\n\t\tconst initialAcquireStarted = yield* Ref.make(false);\n\t\tconst logger = withEventPublishingLogger(baseLogger, state, hub);\n\t\tconst pluginRuntimeContext = pluginContext.pipe(\n\t\t\tContext.add(Logger, Logger.of(logger)),\n\t\t) as Context.Context<never>;\n\n\t\t// Per-plugin scopes parent off the supervisor scope.\n\t\tconst supervisorScope = yield* Effect.scope;\n\n\t\tconst emit = buildTransitionEmitter(state, hub);\n\t\tconst registry = yield* buildRegistry(graph, supervisorScope, emit);\n\n\t\t// Declare a row for every plugin so the projection's\n\t\t// `lifecycle.statusChanged` events have a row to attach to.\n\t\tfor (const [key, node] of graph.nodes) {\n\t\t\tconst declaredAccount = pendingAccountProjection(key, node.member.id, Date.now());\n\t\t\tyield* SubscriptionRef.update(state, (s) => ({\n\t\t\t\t...(declaredAccount === null ? s : declareAccount(s, declaredAccount)),\n\t\t\t\trows: s.rows.some((r) => r.key === key)\n\t\t\t\t\t? s.rows\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t...s.rows,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\trole: node.member.role,\n\t\t\t\t\t\t\t\tstatus: 'pending' as LifecycleStatus,\n\t\t\t\t\t\t\t\tphase: null,\n\t\t\t\t\t\t\t\tlastError: null,\n\t\t\t\t\t\t\t\tlogTail: { lines: [], level: 'info' as const, truncated: false },\n\t\t\t\t\t\t\t\tendpoints: [],\n\t\t\t\t\t\t\t\tselectiveRestartHighlight: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t}));\n\t\t}\n\n\t\t// Extract `RuntimeRoot` from the plugin context — needed to\n\t\t// build the `AcquireContext` handed to dynamic capability\n\t\t// factories (`Plugin.capabilities` as a function). The\n\t\t// runtimeRoot is the on-disk base under which the stack's\n\t\t// state lives; identity carries app/stack/chain. Together\n\t\t// they let plugins stamp REAL paths and chain ids into their\n\t\t// snapshot subtrees, codegen bindings, routable URLs, etc.\n\t\t//\n\t\t// Fallback to '' if the caller didn't add `RuntimeRoot` to\n\t\t// the plugin context — keeps the bare `supervise()` smoke\n\t\t// tests working without a substrate Layer stack.\n\t\tconst runtimeRoot = getOrDefault(pluginContext, RuntimeRoot, { root: '' }).root;\n\n\t\t// Resolve the CapabilitySinks registry for this stack. Two paths:\n\t\t//\n\t\t// (a) Plugin-author / orchestrator pre-built path: the caller\n\t\t// layered a `CapabilitySinksService` into `pluginContext`\n\t\t// (typically by composing `layerCapabilitySinksDefault(...)`\n\t\t// PLUS one or more custom-sink Layers). The supervisor\n\t\t// harvests through THAT instance, so custom sinks\n\t\t// registered by plugin authors actually fire. The\n\t\t// `sinks: OrchestratorSinks` arg is ignored in this path\n\t\t// (the caller already composed its own sink registrations\n\t\t// into the Layer they handed in).\n\t\t//\n\t\t// (b) Bare path: no service in context — the supervisor builds\n\t\t// the substrate default with the orchestrator sinks passed\n\t\t// in. `Layer.build` opens the layer's resources on the\n\t\t// SURROUNDING scope (the supervisor's), so the sinks +\n\t\t// formatter registry live for the supervisor's lifetime\n\t\t// and reap on its scope close.\n\t\t//\n\t\t// Plugin-author symmetry (ARCHITECTURE.md § Plugin-author\n\t\t// surface = user-surface): a custom plugin registers its own\n\t\t// sinks via standard Layer composition, NOT by reaching into\n\t\t// the supervisor. Same surface a built-in (Logger, RuntimeRoot,\n\t\t// ContainerRuntime, etc.) uses.\n\t\tconst sinksService = yield* getOrDefaultEffect(\n\t\t\tpluginRuntimeContext,\n\t\t\tCapabilitySinksService,\n\t\t\tEffect.gen(function* () {\n\t\t\t\treturn Context.get(\n\t\t\t\t\tyield* Layer.build(layerCapabilitySinksDefault(sinks)),\n\t\t\t\t\tCapabilitySinksService,\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\n\t\tconst enableCommandLoop = options.commandLoop !== false;\n\t\tif (enableCommandLoop) {\n\t\t\tyield* Effect.forkScoped(installSignalHandler(commands));\n\t\t\tyield* Effect.forkScoped(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tconst command = yield* Queue.take(commands);\n\t\t\t\t\t\tyield* Queue.offer(queuedCommands, { kind: 'fire-and-forget', command });\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst commandLoopDeps: CommandLoopDeps = {\n\t\t\tgraph,\n\t\t\tregistry,\n\t\t\tref: state,\n\t\t\thub,\n\t\t\tqueuedCommands,\n\t\t\tstackRestartTask,\n\t\t\tstackRestartSeq,\n\t\t\tsnapshotCaptureTask,\n\t\t\tsnapshotCaptureSeq,\n\t\t\tshutdownLatch,\n\t\t\tshutdownComplete,\n\t\t\tpluginContext: pluginRuntimeContext,\n\t\t\tsinks: sinksService,\n\t\t\tlogger,\n\t\t\tidentity,\n\t\t\truntimeRoot,\n\t\t\tparentScope: supervisorScope,\n\t\t\tcommandHandler,\n\t\t\tpostAcquireHook,\n\t\t};\n\n\t\tconst runInitialAcquire = Effect.gen(function* () {\n\t\t\tconst alreadyStarted = yield* Ref.modify(initialAcquireStarted, (started) => [started, true]);\n\t\t\tif (alreadyStarted) return;\n\t\t\tif (yield* Ref.get(shutdownLatch)) return;\n\t\t\t// Fire the initial acquire — level-batched parallel. The plugin\n\t\t\t// context provides the substrate-context services the plugins'\n\t\t\t// acquire bodies yield (Identity, ContainerRuntime, etc.). The\n\t\t\t// substrate's `CapabilitySinksService` routes each harvested\n\t\t\t// contribution to the matching sink; production orchestrator\n\t\t\t// sinks are registered by the higher-level runtime composer.\n\t\t\tyield* acquireFullGraph(\n\t\t\t\tgraph,\n\t\t\t\tregistry,\n\t\t\t\tstate,\n\t\t\t\thub,\n\t\t\t\tpluginRuntimeContext,\n\t\t\t\tsinksService,\n\t\t\t\tlogger,\n\t\t\t\tidentity,\n\t\t\t\truntimeRoot,\n\t\t\t);\n\t\t\tif (yield* Ref.get(shutdownLatch)) return;\n\t\t\tconst initialReady = yield* allReadyOrTerminal(graph, registry);\n\t\t\tif (initialReady) {\n\t\t\t\tyield* runPostAcquireHook(commandLoopDeps);\n\t\t\t\tif (!(yield* Ref.get(shutdownLatch))) {\n\t\t\t\t\tyield* setCyclePhase(state, 'running');\n\t\t\t\t}\n\t\t\t} else if (!(yield* Ref.get(shutdownLatch))) {\n\t\t\t\tyield* setCyclePhase(state, 'running');\n\t\t\t}\n\t\t}).pipe(Effect.withSpan('lifecycle.supervisor.initialAcquire'));\n\n\t\t// Build the watch index up front; the supervisor exposes\n\t\t// `notifyWatchFire` so the L0 thick watcher can call into it.\n\t\tconst watchIndex = buildWatchIndex(graph.nodes);\n\n\t\tconst notifyWatchFire = (path: string): Effect.Effect<void> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst matched = new Set<PluginKey>();\n\t\t\t\tfor (const entry of watchIndex) {\n\t\t\t\t\tfor (const pat of entry.paths) {\n\t\t\t\t\t\tif (exactPrefixMatch(pat, path)) {\n\t\t\t\t\t\t\tmatched.add(entry.pluginKey);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (matched.size === 0) return;\n\t\t\t\tyield* Queue.offer(commands, {\n\t\t\t\t\ttag: 'selective-restart.requested',\n\t\t\t\t\tpluginKey: [...matched][0]!,\n\t\t\t\t} satisfies EngineCommand);\n\t\t\t\t// If multiple keys matched, queue further selective-restarts\n\t\t\t\t// for each so the command loop processes them serially.\n\t\t\t\tconst rest = [...matched].slice(1);\n\t\t\t\tfor (const key of rest) {\n\t\t\t\t\tyield* Queue.offer(commands, {\n\t\t\t\t\t\ttag: 'selective-restart.requested',\n\t\t\t\t\t\tpluginKey: key,\n\t\t\t\t\t} satisfies EngineCommand);\n\t\t\t\t}\n\t\t\t}).pipe(Effect.withSpan('lifecycle.supervisor.notifyWatchFire'));\n\n\t\t// Fork the command loop.\n\t\tif (enableCommandLoop) {\n\t\t\tyield* Effect.forkScoped(commandLoop(commandLoopDeps));\n\t\t}\n\n\t\t// Tear-down finalizer: closes every plugin scope in reverse-dep\n\t\t// order. The supervisor scope itself closes when the surrounding\n\t\t// caller closes — `Scope.close` cascades to plugin scopes.\n\t\tyield* Effect.addFinalizer(() =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst plan = planFullDrain(graph);\n\t\t\t\tyield* teardownKeys(graph, registry, plan.teardownOrder).pipe(\n\t\t\t\t\tEffect.catch(() => Effect.void),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\n\t\tconst awaitShutdown: Effect.Effect<void> = Deferred.await(shutdownComplete).pipe(\n\t\t\tEffect.withSpan('lifecycle.supervisor.awaitShutdown'),\n\t\t);\n\n\t\tconst runCommand = (command: EngineCommand): Effect.Effect<void, unknown> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst completion = yield* Deferred.make<Exit.Exit<void, unknown>>();\n\t\t\t\tyield* Queue.offer(queuedCommands, {\n\t\t\t\t\tkind: 'submitted',\n\t\t\t\t\tsubmission: { command, completion },\n\t\t\t\t});\n\t\t\t\tconst exit = yield* Deferred.await(completion);\n\t\t\t\tif (Exit.isFailure(exit)) {\n\t\t\t\t\treturn yield* Effect.failCause(exit.cause);\n\t\t\t\t}\n\t\t\t}).pipe(Effect.withSpan('lifecycle.supervisor.runCommand'));\n\n\t\tconst handle = {\n\t\t\tidentity,\n\t\t\tgraph,\n\t\t\tregistry,\n\t\t\tevents: hub,\n\t\t\tcommands,\n\t\t\trunCommand,\n\t\t\tstate,\n\t\t\twatchIndex,\n\t\t\tnotifyWatchFire,\n\t\t\tawaitShutdown,\n\t\t} satisfies SupervisorHandle;\n\t\treturn { handle, runInitialAcquire } satisfies SupervisorStartup;\n\t}).pipe(\n\t\twithStackSpan('lifecycle.supervisor.startSupervisor', {\n\t\t\tapp: identity.app,\n\t\t\tstack: identity.stack,\n\t\t\tnetwork: identity.chain,\n\t\t}),\n\t);\n\n/**\n * Boot a supervisor for `stack` and wait for the initial acquire to\n * finish before returning the handle. Existing callers that only need\n * a ready-or-failed handle keep this simpler entry point; live surfaces\n * that need startup display use `startSupervisor`.\n */\nexport const supervise = (\n\tstack: SupervisedStack,\n\tidentity: Identity,\n\tstate: SubscriptionRef.SubscriptionRef<SubscribableState>,\n\tpluginContext: Context.Context<never> = Context.empty(),\n\tsinks: OrchestratorSinks = [],\n\tcommandHandler?: SupervisorCommandHandler,\n\tpostAcquireHook?: SupervisorPostAcquireHook,\n): Effect.Effect<SupervisorHandle, SupervisorError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst startup = yield* startSupervisor(\n\t\t\tstack,\n\t\t\tidentity,\n\t\t\tstate,\n\t\t\tpluginContext,\n\t\t\tsinks,\n\t\t\tcommandHandler,\n\t\t\tpostAcquireHook,\n\t\t\t{ commandLoop: true },\n\t\t);\n\t\tyield* startup.runInitialAcquire;\n\t\treturn startup.handle;\n\t}).pipe(\n\t\twithStackSpan('lifecycle.supervisor.supervise', {\n\t\t\tapp: identity.app,\n\t\t\tstack: identity.stack,\n\t\t\tnetwork: identity.chain,\n\t\t}),\n\t);\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\nconst pendingAccountProjection = (\n\trowKey: PluginKey,\n\tresourceId: string,\n\tupdatedAt: number,\n): AccountProjection | null => {\n\tif (!resourceId.startsWith('account/')) return null;\n\tconst name = resourceId.slice('account/'.length);\n\tif (name.length === 0) return null;\n\treturn {\n\t\tkey: resourceId as `account/${string}`,\n\t\trowKey,\n\t\tname,\n\t\taddress: null,\n\t\tscheme: null,\n\t\tsource: null,\n\t\tfunding: { status: 'pending', balanceMist: null, requestedMist: null, entries: [] },\n\t\twalletVisible: false,\n\t\tupdatedAt,\n\t};\n};\n\n// -----------------------------------------------------------------------------\n// Run-to-completion helper (test + programmable API entry)\n// -----------------------------------------------------------------------------\n\n/**\n * Block until the supervisor's shutdown latch fires OR the surrounding\n * scope is interrupted (signal-driven exit). Wraps `awaitShutdown` for\n * the common \"boot then wait\" shape.\n *\n * Returns the final supervisor state so callers (CLI, programmable\n * API) can inspect the projection after shutdown.\n */\nexport const runToShutdown = (\n\thandle: SupervisorHandle,\n): Effect.Effect<SubscribableState, never, never> =>\n\tEffect.gen(function* () {\n\t\tyield* handle.awaitShutdown;\n\t\treturn yield* SubscriptionRef.get(handle.state);\n\t}).pipe(Effect.withSpan('lifecycle.supervisor.runToShutdown'));\n\n// -----------------------------------------------------------------------------\n// Public re-exports of the lifecycle subsystem types\n// -----------------------------------------------------------------------------\n\nexport type { Fiber };\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
File without changes
|