@mysten-incubation/devstack 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dashboard-ui/assets/grpc-a4usE3Nk.js +3 -0
- package/dashboard-ui/assets/index-B82Bh84P.css +1 -0
- package/dashboard-ui/assets/index-CRYJ4pru.js +1277 -0
- package/dashboard-ui/index.html +2 -2
- package/dist/api/define-capabilities.d.mts +1 -20
- package/dist/api/define-capabilities.mjs +15 -22
- package/dist/api/define-capabilities.mjs.map +1 -1
- package/dist/api/define-devstack-with.d.mts +7 -1
- package/dist/api/define-devstack-with.mjs.map +1 -1
- package/dist/api/define-devstack.mjs.map +1 -1
- package/dist/api/define-plugin.d.mts +2 -1
- package/dist/api/inference-network.d.mts +31 -17
- package/dist/api/inference-network.mjs +40 -43
- package/dist/api/inference-network.mjs.map +1 -1
- package/dist/api/load-config.mjs +88 -0
- package/dist/api/load-config.mjs.map +1 -0
- package/dist/api/mode-narrowed-factory.d.mts +1 -1
- package/dist/api/mode-narrowed-factory.mjs.map +1 -1
- package/dist/api/run-stack-internal.mjs +202 -0
- package/dist/api/run-stack-internal.mjs.map +1 -0
- package/dist/api/run-stack.d.mts +82 -31
- package/dist/api/run-stack.mjs +22 -141
- package/dist/api/run-stack.mjs.map +1 -1
- package/dist/build-integrations/dapp-kit/index.d.mts +61 -0
- package/dist/build-integrations/dapp-kit/index.mjs +58 -0
- package/dist/build-integrations/dapp-kit/index.mjs.map +1 -0
- package/dist/build-integrations/playwright/config.d.mts +1 -30
- package/dist/build-integrations/playwright/config.mjs +1 -27
- package/dist/build-integrations/playwright/config.mjs.map +1 -1
- package/dist/build-integrations/playwright/errors.d.mts +4 -7
- package/dist/build-integrations/playwright/errors.mjs.map +1 -1
- package/dist/build-integrations/playwright/global-setup.d.mts +42 -71
- package/dist/build-integrations/playwright/global-setup.mjs +142 -218
- package/dist/build-integrations/playwright/global-setup.mjs.map +1 -1
- package/dist/build-integrations/playwright/index.d.mts +2 -2
- package/dist/build-integrations/playwright/index.mjs +2 -2
- package/dist/build-integrations/playwright/stack-context.d.mts +3 -1
- package/dist/build-integrations/playwright/stack-context.mjs +4 -2
- package/dist/build-integrations/playwright/stack-context.mjs.map +1 -1
- package/dist/build-integrations/playwright/wallet-context.mjs +44 -19
- package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -1
- package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -1
- package/dist/build-integrations/runtime/conventional-routes.mjs.map +1 -1
- package/dist/build-integrations/runtime/dapp-kit-slot.mjs.map +1 -1
- package/dist/build-integrations/runtime/discover.d.mts +6 -4
- package/dist/build-integrations/runtime/discover.mjs +15 -4
- package/dist/build-integrations/runtime/discover.mjs.map +1 -1
- package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -1
- package/dist/build-integrations/runtime/errors.mjs.map +1 -1
- package/dist/build-integrations/runtime/read-stack-context.mjs +3 -3
- package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -1
- package/dist/build-integrations/runtime/resolve-discovery-env.d.mts +23 -7
- package/dist/build-integrations/runtime/resolve-discovery-env.mjs +25 -12
- package/dist/build-integrations/runtime/resolve-discovery-env.mjs.map +1 -1
- package/dist/build-integrations/runtime/stack-context.d.mts +2 -2
- package/dist/build-integrations/vite/index.d.mts +84 -19
- package/dist/build-integrations/vite/index.mjs +203 -28
- package/dist/build-integrations/vite/index.mjs.map +1 -1
- package/dist/build-integrations/vitest/config.d.mts +20 -2
- package/dist/build-integrations/vitest/config.mjs +16 -4
- package/dist/build-integrations/vitest/config.mjs.map +1 -1
- package/dist/build-integrations/vitest/env.d.mts +18 -10
- package/dist/build-integrations/vitest/env.mjs +11 -10
- package/dist/build-integrations/vitest/env.mjs.map +1 -1
- package/dist/build-integrations/vitest/errors.d.mts +7 -11
- package/dist/build-integrations/vitest/errors.mjs +3 -4
- package/dist/build-integrations/vitest/errors.mjs.map +1 -1
- package/dist/build-integrations/vitest/global-setup.d.mts +35 -0
- package/dist/build-integrations/vitest/global-setup.mjs +156 -0
- package/dist/build-integrations/vitest/global-setup.mjs.map +1 -0
- package/dist/build-integrations/vitest/index.d.mts +3 -2
- package/dist/build-integrations/vitest/index.mjs +3 -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 +5 -3
- package/dist/build-integrations/vitest/stack-context.mjs +3 -2
- package/dist/build-integrations/vitest/stack-context.mjs.map +1 -1
- package/dist/cli/bail.mjs.map +1 -1
- package/dist/cli/doctor-probes.mjs +1 -3
- package/dist/cli/doctor-probes.mjs.map +1 -1
- package/dist/cli/main.d.mts +23 -1
- package/dist/cli/main.mjs +63 -8
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/prune-direct.mjs.map +1 -1
- package/dist/cli/snapshot-reader.mjs.map +1 -1
- package/dist/cli/up-lifecycle.mjs.map +1 -1
- package/dist/cli/wirings/apply.mjs +28 -21
- package/dist/cli/wirings/apply.mjs.map +1 -1
- package/dist/cli/wirings/codegen.mjs +108 -0
- package/dist/cli/wirings/codegen.mjs.map +1 -0
- package/dist/cli/wirings/config-loader.mjs +12 -62
- package/dist/cli/wirings/config-loader.mjs.map +1 -1
- package/dist/cli/wirings/dump-ids.mjs +86 -0
- package/dist/cli/wirings/dump-ids.mjs.map +1 -0
- package/dist/cli/wirings/engine-command.mjs +1 -1
- package/dist/cli/wirings/engine-command.mjs.map +1 -1
- package/dist/cli/wirings/identity.mjs +2 -2
- package/dist/cli/wirings/identity.mjs.map +1 -1
- package/dist/cli/wirings/provide-file-system.mjs.map +1 -1
- package/dist/cli/wirings/read-devstack-version.mjs +17 -0
- package/dist/cli/wirings/read-devstack-version.mjs.map +1 -0
- package/dist/cli/wirings/snapshot.mjs +27 -34
- package/dist/cli/wirings/snapshot.mjs.map +1 -1
- package/dist/cli/wirings/up-ipc.mjs +147 -0
- package/dist/cli/wirings/up-ipc.mjs.map +1 -0
- package/dist/cli/wirings/up.mjs +218 -198
- package/dist/cli/wirings/up.mjs.map +1 -1
- package/dist/cli/wirings/wipe.mjs +1 -1
- package/dist/cli/wirings/wipe.mjs.map +1 -1
- package/dist/contracts/chain-probe.d.mts +1 -1
- package/dist/contracts/chain-probe.mjs +1 -1
- package/dist/contracts/chain-probe.mjs.map +1 -1
- package/dist/contracts/codegenable.d.mts +60 -6
- package/dist/contracts/codegenable.mjs +28 -0
- package/dist/contracts/codegenable.mjs.map +1 -0
- package/dist/contracts/config-bindings.mjs +162 -0
- package/dist/contracts/config-bindings.mjs.map +1 -0
- package/dist/contracts/container-runtime.d.mts +23 -17
- package/dist/contracts/plugin-expander.mjs.map +1 -1
- package/dist/contracts/snapshotable.d.mts +5 -7
- package/dist/contracts/wallet-protocol.d.mts +2 -5
- package/dist/contracts/wallet-protocol.mjs +2 -5
- package/dist/contracts/wallet-protocol.mjs.map +1 -1
- package/dist/index.d.mts +21 -26
- package/dist/index.mjs +8 -9
- package/dist/orchestrators/boot.d.mts +28 -0
- package/dist/orchestrators/boot.mjs +440 -0
- package/dist/orchestrators/boot.mjs.map +1 -0
- package/dist/orchestrators/codegen/bindings.d.mts +13 -1
- package/dist/orchestrators/codegen/bindings.mjs +23 -9
- package/dist/orchestrators/codegen/bindings.mjs.map +1 -1
- package/dist/orchestrators/codegen/config-runtime.mjs +208 -0
- package/dist/orchestrators/codegen/config-runtime.mjs.map +1 -0
- package/dist/orchestrators/codegen/emit.mjs +1 -1
- package/dist/orchestrators/codegen/emit.mjs.map +1 -1
- package/dist/orchestrators/codegen/errors.mjs +21 -1
- package/dist/orchestrators/codegen/errors.mjs.map +1 -1
- package/dist/orchestrators/codegen/format.mjs +2 -0
- package/dist/orchestrators/codegen/format.mjs.map +1 -1
- package/dist/orchestrators/codegen/gitignore.mjs +30 -11
- package/dist/orchestrators/codegen/gitignore.mjs.map +1 -1
- package/dist/orchestrators/codegen/id-config.mjs +107 -0
- package/dist/orchestrators/codegen/id-config.mjs.map +1 -0
- package/dist/orchestrators/codegen/output-location.mjs +23 -32
- package/dist/orchestrators/codegen/output-location.mjs.map +1 -1
- package/dist/orchestrators/codegen/paths.mjs +8 -1
- package/dist/orchestrators/codegen/paths.mjs.map +1 -1
- package/dist/orchestrators/codegen/permissions.mjs.map +1 -1
- package/dist/orchestrators/codegen/service.mjs +286 -58
- package/dist/orchestrators/codegen/service.mjs.map +1 -1
- package/dist/orchestrators/layers.mjs +31 -0
- package/dist/orchestrators/layers.mjs.map +1 -0
- package/dist/orchestrators/lifecycle-prune/errors.mjs.map +1 -1
- package/dist/orchestrators/lifecycle-prune/index.mjs +8 -10
- package/dist/orchestrators/lifecycle-prune/index.mjs.map +1 -1
- package/dist/orchestrators/network-options.d.mts +52 -0
- package/dist/orchestrators/network-options.mjs +43 -0
- package/dist/orchestrators/network-options.mjs.map +1 -0
- package/dist/orchestrators/router/cleanup.mjs.map +1 -1
- package/dist/orchestrators/router/cors.mjs.map +1 -1
- package/dist/orchestrators/router/entrypoints.mjs.map +1 -1
- package/dist/orchestrators/router/errors.mjs.map +1 -1
- package/dist/orchestrators/router/file-provider.mjs.map +1 -1
- package/dist/orchestrators/router/hostname.mjs.map +1 -1
- package/dist/orchestrators/router/profile.mjs +1 -1
- package/dist/orchestrators/router/profile.mjs.map +1 -1
- package/dist/orchestrators/router/service.d.mts +2 -2
- package/dist/orchestrators/router/service.mjs +12 -27
- package/dist/orchestrators/router/service.mjs.map +1 -1
- package/dist/orchestrators/router/traefik-container.mjs +1 -1
- package/dist/orchestrators/router/traefik-container.mjs.map +1 -1
- package/dist/orchestrators/snapshot/capture.mjs +171 -195
- package/dist/orchestrators/snapshot/capture.mjs.map +1 -1
- package/dist/orchestrators/snapshot/descriptor.d.mts +1 -1
- package/dist/orchestrators/snapshot/descriptor.mjs +53 -11
- package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -1
- package/dist/orchestrators/snapshot/identity-guard.mjs +3 -5
- package/dist/orchestrators/snapshot/identity-guard.mjs.map +1 -1
- package/dist/orchestrators/snapshot/image-bundle-tags.mjs +32 -101
- package/dist/orchestrators/snapshot/image-bundle-tags.mjs.map +1 -1
- package/dist/orchestrators/snapshot/index.mjs +1 -4
- package/dist/orchestrators/snapshot/integrity.mjs.map +1 -1
- package/dist/orchestrators/snapshot/interrupted-restore.mjs +116 -0
- package/dist/orchestrators/snapshot/interrupted-restore.mjs.map +1 -0
- package/dist/orchestrators/snapshot/phase-error.mjs.map +1 -1
- package/dist/orchestrators/snapshot/prune.mjs +40 -31
- package/dist/orchestrators/snapshot/prune.mjs.map +1 -1
- package/dist/orchestrators/snapshot/restore.mjs +221 -196
- package/dist/orchestrators/snapshot/restore.mjs.map +1 -1
- package/dist/orchestrators/snapshot/service.mjs +72 -62
- package/dist/orchestrators/snapshot/service.mjs.map +1 -1
- package/dist/orchestrators/snapshot/wipe.mjs +67 -56
- package/dist/orchestrators/snapshot/wipe.mjs.map +1 -1
- package/dist/plugins/account/codegen.mjs +3 -0
- package/dist/plugins/account/codegen.mjs.map +1 -1
- package/dist/plugins/account/errors.d.mts +2 -2
- package/dist/plugins/account/errors.mjs +1 -4
- package/dist/plugins/account/errors.mjs.map +1 -1
- package/dist/plugins/account/funding.mjs +3 -27
- package/dist/plugins/account/funding.mjs.map +1 -1
- package/dist/plugins/account/index.d.mts +3 -8
- package/dist/plugins/account/index.mjs +71 -35
- package/dist/plugins/account/index.mjs.map +1 -1
- package/dist/plugins/account/keypair.d.mts +8 -7
- package/dist/plugins/account/keypair.mjs +5 -18
- package/dist/plugins/account/keypair.mjs.map +1 -1
- package/dist/plugins/account/lease.mjs.map +1 -1
- package/dist/plugins/account/registry.d.mts +1 -46
- package/dist/plugins/account/registry.mjs.map +1 -1
- package/dist/plugins/account/service.d.mts +43 -34
- package/dist/plugins/account/service.mjs +9 -54
- package/dist/plugins/account/service.mjs.map +1 -1
- package/dist/plugins/account/snapshot.mjs.map +1 -1
- package/dist/plugins/account/variants/ephemeral.mjs.map +1 -1
- package/dist/plugins/account/variants/impersonate.mjs.map +1 -1
- package/dist/plugins/account/variants/signer.mjs.map +1 -1
- package/dist/plugins/action/discriminator.mjs.map +1 -1
- package/dist/plugins/action/errors.mjs +1 -4
- package/dist/plugins/action/errors.mjs.map +1 -1
- package/dist/plugins/action/execute.mjs +3 -4
- package/dist/plugins/action/execute.mjs.map +1 -1
- package/dist/plugins/action/index.d.mts +2 -2
- package/dist/plugins/action/index.mjs +7 -11
- package/dist/plugins/action/index.mjs.map +1 -1
- package/dist/plugins/action/service.d.mts +5 -7
- package/dist/plugins/action/service.mjs +2 -16
- package/dist/plugins/action/service.mjs.map +1 -1
- package/dist/plugins/coin/address-resolution.mjs.map +1 -1
- package/dist/plugins/coin/codegen.mjs +97 -16
- package/dist/plugins/coin/codegen.mjs.map +1 -1
- package/dist/plugins/coin/discovery.mjs.map +1 -1
- package/dist/plugins/coin/errors.mjs +1 -4
- package/dist/plugins/coin/errors.mjs.map +1 -1
- package/dist/plugins/coin/index.d.mts +4 -34
- package/dist/plugins/coin/index.mjs +47 -28
- package/dist/plugins/coin/index.mjs.map +1 -1
- package/dist/plugins/coin/metadata.d.mts +1 -0
- package/dist/plugins/coin/metadata.mjs +8 -9
- package/dist/plugins/coin/metadata.mjs.map +1 -1
- package/dist/plugins/coin/mint.mjs +7 -21
- package/dist/plugins/coin/mint.mjs.map +1 -1
- package/dist/plugins/coin/registry.mjs +33 -20
- package/dist/plugins/coin/registry.mjs.map +1 -1
- package/dist/plugins/coin/service.d.mts +1 -1
- package/dist/plugins/coin/service.mjs +1 -8
- package/dist/plugins/coin/service.mjs.map +1 -1
- package/dist/plugins/coin/snapshot.mjs.map +1 -1
- package/dist/plugins/coin/type-strings.mjs.map +1 -1
- package/dist/plugins/dashboard/domain.mjs +106 -167
- package/dist/plugins/dashboard/domain.mjs.map +1 -1
- package/dist/plugins/dashboard/index.mjs +13 -13
- package/dist/plugins/dashboard/index.mjs.map +1 -1
- package/dist/plugins/dashboard/origin-policy.mjs +3 -3
- package/dist/plugins/dashboard/origin-policy.mjs.map +1 -1
- package/dist/plugins/dashboard/routable.mjs.map +1 -1
- package/dist/plugins/dashboard/schema/builder.mjs.map +1 -1
- package/dist/plugins/dashboard/schema/enums.mjs.map +1 -1
- package/dist/plugins/dashboard/schema/root.mjs +23 -44
- package/dist/plugins/dashboard/schema/root.mjs.map +1 -1
- package/dist/plugins/dashboard/schema/types.mjs +37 -91
- package/dist/plugins/dashboard/schema/types.mjs.map +1 -1
- package/dist/plugins/dashboard/schema.mjs.map +1 -1
- package/dist/plugins/dashboard/server.mjs.map +1 -1
- package/dist/plugins/deepbook/codegen.d.mts +12 -11
- package/dist/plugins/deepbook/codegen.mjs +108 -11
- package/dist/plugins/deepbook/codegen.mjs.map +1 -1
- package/dist/plugins/deepbook/deploy.mjs +7 -14
- package/dist/plugins/deepbook/deploy.mjs.map +1 -1
- package/dist/plugins/deepbook/errors.mjs +4 -2
- package/dist/plugins/deepbook/errors.mjs.map +1 -1
- package/dist/plugins/deepbook/faucet-strategy.mjs +4 -10
- package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -1
- package/dist/plugins/deepbook/hash.mjs.map +1 -1
- package/dist/plugins/deepbook/index.d.mts +38 -34
- package/dist/plugins/deepbook/index.mjs +133 -64
- package/dist/plugins/deepbook/index.mjs.map +1 -1
- package/dist/plugins/deepbook/plugin-key.mjs.map +1 -1
- package/dist/plugins/deepbook/pyth/index.mjs +4 -8
- package/dist/plugins/deepbook/pyth/index.mjs.map +1 -1
- package/dist/plugins/deepbook/snapshot.mjs +0 -1
- package/dist/plugins/deepbook/snapshot.mjs.map +1 -1
- package/dist/plugins/deepbook/type-strings.mjs.map +1 -1
- package/dist/plugins/deepbook/types.d.mts +2 -1
- package/dist/plugins/deepbook/types.mjs.map +1 -1
- package/dist/plugins/faucet/dispatcher.d.mts +3 -3
- package/dist/plugins/faucet/dispatcher.mjs.map +1 -1
- package/dist/plugins/faucet/errors.mjs.map +1 -1
- package/dist/plugins/faucet/http.mjs +2 -10
- package/dist/plugins/faucet/http.mjs.map +1 -1
- package/dist/plugins/faucet/index.mjs +0 -1
- package/dist/plugins/faucet/index.mjs.map +1 -1
- package/dist/plugins/host-service/errors.d.mts +1 -3
- package/dist/plugins/host-service/errors.mjs +1 -2
- package/dist/plugins/host-service/errors.mjs.map +1 -1
- package/dist/plugins/host-service/index.d.mts +1 -2
- package/dist/plugins/host-service/index.mjs +11 -11
- package/dist/plugins/host-service/index.mjs.map +1 -1
- package/dist/plugins/host-service/routable.mjs.map +1 -1
- package/dist/plugins/host-service/service.mjs +13 -13
- package/dist/plugins/host-service/service.mjs.map +1 -1
- package/dist/plugins/internal/acquire-on-chain-artifact.mjs.map +1 -1
- package/dist/plugins/internal/codegen-helpers.mjs +2 -0
- package/dist/plugins/internal/codegen-helpers.mjs.map +1 -1
- package/dist/plugins/internal/funding-failure-error.mjs.map +1 -1
- package/dist/plugins/{postgres → internal/postgres-sidecar}/connection.mjs +1 -1
- package/dist/plugins/internal/postgres-sidecar/connection.mjs.map +1 -0
- package/dist/plugins/{postgres → internal/postgres-sidecar}/db-ensure.mjs +30 -16
- package/dist/plugins/internal/postgres-sidecar/db-ensure.mjs.map +1 -0
- package/dist/plugins/internal/postgres-sidecar/errors.mjs +21 -0
- package/dist/plugins/internal/postgres-sidecar/errors.mjs.map +1 -0
- package/dist/{substrate/runtime/scoped-multimap → plugins/internal/postgres-sidecar}/index.mjs +1 -0
- package/dist/plugins/internal/postgres-sidecar/service.mjs +121 -0
- package/dist/plugins/internal/postgres-sidecar/service.mjs.map +1 -0
- package/dist/plugins/package/build.mjs +2 -2
- package/dist/plugins/package/build.mjs.map +1 -1
- package/dist/plugins/package/codegen.d.mts +7 -14
- package/dist/plugins/package/codegen.mjs +187 -59
- package/dist/plugins/package/codegen.mjs.map +1 -1
- package/dist/plugins/package/dep-resolution.mjs +51 -3
- package/dist/plugins/package/dep-resolution.mjs.map +1 -1
- package/dist/plugins/package/errors.mjs +1 -4
- package/dist/plugins/package/errors.mjs.map +1 -1
- package/dist/plugins/package/git-source.d.mts +18 -0
- package/dist/plugins/package/git-source.mjs +119 -0
- package/dist/plugins/package/git-source.mjs.map +1 -0
- package/dist/plugins/package/index.d.mts +28 -19
- package/dist/plugins/package/index.mjs +107 -32
- package/dist/plugins/package/index.mjs.map +1 -1
- package/dist/plugins/package/mode-known.mjs +2 -2
- package/dist/plugins/package/mode-known.mjs.map +1 -1
- package/dist/plugins/package/mode-local.mjs +18 -35
- package/dist/plugins/package/mode-local.mjs.map +1 -1
- package/dist/plugins/package/publish-executor.mjs +13 -8
- package/dist/plugins/package/publish-executor.mjs.map +1 -1
- package/dist/plugins/package/publish-output.d.mts +1 -11
- package/dist/plugins/package/publish-output.mjs +1 -9
- package/dist/plugins/package/publish-output.mjs.map +1 -1
- package/dist/plugins/package/registry.d.mts +1 -1
- package/dist/plugins/package/registry.mjs +26 -14
- package/dist/plugins/package/registry.mjs.map +1 -1
- package/dist/plugins/package/service.mjs.map +1 -1
- package/dist/plugins/package/snapshot.mjs.map +1 -1
- package/dist/plugins/router-entrypoints.mjs +1 -3
- package/dist/plugins/router-entrypoints.mjs.map +1 -1
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +1 -2
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -1
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +1 -6
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -1
- package/dist/plugins/seal/codegen.d.mts +1 -5
- package/dist/plugins/seal/codegen.mjs +83 -12
- package/dist/plugins/seal/codegen.mjs.map +1 -1
- package/dist/plugins/seal/config-render.mjs +2 -6
- package/dist/plugins/seal/config-render.mjs.map +1 -1
- package/dist/plugins/seal/deploy.mjs +18 -29
- package/dist/plugins/seal/deploy.mjs.map +1 -1
- package/dist/plugins/seal/errors.d.mts +4 -5
- package/dist/plugins/seal/errors.mjs +1 -8
- package/dist/plugins/seal/errors.mjs.map +1 -1
- package/dist/plugins/seal/index.d.mts +7 -28
- package/dist/plugins/seal/index.mjs +69 -47
- package/dist/plugins/seal/index.mjs.map +1 -1
- package/dist/plugins/seal/key-manager.mjs.map +1 -1
- package/dist/plugins/seal/key-server.mjs +1 -6
- package/dist/plugins/seal/key-server.mjs.map +1 -1
- package/dist/plugins/seal/keygen.mjs +2 -3
- package/dist/plugins/seal/keygen.mjs.map +1 -1
- package/dist/plugins/seal/mode/fork-known.mjs.map +1 -1
- package/dist/plugins/seal/mode/live.mjs +1 -1
- package/dist/plugins/seal/mode/live.mjs.map +1 -1
- package/dist/plugins/seal/mode/local-keygen.mjs +4 -10
- package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -1
- package/dist/plugins/seal/plugin-key.mjs.map +1 -1
- 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/snapshot.mjs +1 -2
- package/dist/plugins/seal/snapshot.mjs.map +1 -1
- package/dist/plugins/sui/auto-tick.mjs +5 -5
- package/dist/plugins/sui/auto-tick.mjs.map +1 -1
- package/dist/plugins/sui/chain-build-container.mjs +2 -2
- package/dist/plugins/sui/chain-build-container.mjs.map +1 -1
- package/dist/plugins/sui/chain-probe.mjs +4 -4
- package/dist/plugins/sui/chain-probe.mjs.map +1 -1
- package/dist/plugins/sui/codegen.d.mts +9 -7
- package/dist/plugins/sui/codegen.mjs +49 -46
- package/dist/plugins/sui/codegen.mjs.map +1 -1
- package/dist/plugins/sui/errors.d.mts +1 -1
- package/dist/plugins/sui/errors.mjs +1 -9
- package/dist/plugins/sui/errors.mjs.map +1 -1
- package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/index.d.mts +1 -1
- package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/index.mjs +3 -7
- package/dist/plugins/sui/exec/index.mjs.map +1 -0
- package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/sign-and-dispatch.mjs +1 -1
- package/dist/plugins/sui/exec/sign-and-dispatch.mjs.map +1 -0
- package/dist/plugins/sui/fork-faucet-strategy.mjs +2 -6
- package/dist/plugins/sui/fork-faucet-strategy.mjs.map +1 -1
- package/dist/plugins/sui/fork-orchestration.mjs +13 -23
- package/dist/plugins/sui/fork-orchestration.mjs.map +1 -1
- package/dist/plugins/sui/fork-transaction.mjs.map +1 -1
- package/dist/plugins/sui/index.d.mts +34 -83
- package/dist/plugins/sui/index.mjs +200 -68
- package/dist/plugins/sui/index.mjs.map +1 -1
- package/dist/{substrate/runtime/sui-ledger → plugins/sui/ledger}/object-ref.mjs +1 -1
- package/dist/plugins/sui/ledger/object-ref.mjs.map +1 -0
- package/dist/plugins/sui/local-faucet-strategy.mjs +1 -5
- package/dist/plugins/sui/local-faucet-strategy.mjs.map +1 -1
- package/dist/plugins/sui/log-attrs.mjs +11 -0
- package/dist/plugins/sui/log-attrs.mjs.map +1 -0
- package/dist/plugins/sui/mode/external.mjs +4 -12
- package/dist/plugins/sui/mode/external.mjs.map +1 -1
- package/dist/plugins/sui/mode/fork.mjs +19 -16
- package/dist/plugins/sui/mode/fork.mjs.map +1 -1
- package/dist/plugins/sui/mode/live.mjs +4 -17
- package/dist/plugins/sui/mode/live.mjs.map +1 -1
- package/dist/plugins/sui/mode/local.d.mts +1 -0
- package/dist/plugins/sui/mode/local.mjs +203 -61
- package/dist/plugins/sui/mode/local.mjs.map +1 -1
- package/dist/plugins/sui/mode/shared-boot.mjs +18 -23
- package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -1
- package/dist/plugins/sui/mode/shared.d.mts +6 -7
- package/dist/plugins/sui/mode/shared.mjs.map +1 -1
- package/dist/plugins/sui/mode/spec.d.mts +23 -6
- package/dist/{substrate/runtime/sui-move-build → plugins/sui/move}/index.mjs +28 -30
- package/dist/plugins/sui/move/index.mjs.map +1 -0
- package/dist/plugins/sui/move-summary-runner.mjs +8 -4
- package/dist/plugins/sui/move-summary-runner.mjs.map +1 -1
- package/dist/{substrate/network.d.mts → plugins/sui/network-config.d.mts} +11 -10
- package/dist/plugins/sui/network-resolver.d.mts +6 -6
- package/dist/plugins/sui/routable.mjs.map +1 -1
- package/dist/plugins/sui/service.mjs +10 -6
- package/dist/plugins/sui/service.mjs.map +1 -1
- package/dist/plugins/sui/snapshot.mjs +10 -5
- package/dist/plugins/sui/snapshot.mjs.map +1 -1
- package/dist/plugins/wallet/codegen.d.mts +8 -6
- package/dist/plugins/wallet/codegen.mjs +4 -10
- package/dist/plugins/wallet/codegen.mjs.map +1 -1
- package/dist/plugins/wallet/errors.mjs +1 -4
- package/dist/plugins/wallet/errors.mjs.map +1 -1
- package/dist/plugins/wallet/index.d.mts +3 -6
- package/dist/plugins/wallet/index.mjs +16 -21
- package/dist/plugins/wallet/index.mjs.map +1 -1
- package/dist/plugins/wallet/origin-policy.mjs +3 -3
- package/dist/plugins/wallet/origin-policy.mjs.map +1 -1
- package/dist/plugins/wallet/pairing.mjs +6 -24
- package/dist/plugins/wallet/pairing.mjs.map +1 -1
- package/dist/plugins/wallet/protocol.mjs.map +1 -1
- package/dist/plugins/wallet/routable.mjs.map +1 -1
- package/dist/plugins/wallet/server.mjs +17 -24
- package/dist/plugins/wallet/server.mjs.map +1 -1
- package/dist/plugins/wallet/service.d.mts +2 -2
- package/dist/plugins/wallet/service.mjs +4 -15
- package/dist/plugins/wallet/service.mjs.map +1 -1
- package/dist/plugins/wallet/snapshot.mjs.map +1 -1
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +1 -5
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -1
- package/dist/plugins/walrus/codegen.d.mts +2 -13
- package/dist/plugins/walrus/codegen.mjs +93 -28
- package/dist/plugins/walrus/codegen.mjs.map +1 -1
- package/dist/plugins/walrus/deploy-paths.mjs +2 -3
- package/dist/plugins/walrus/deploy-paths.mjs.map +1 -1
- package/dist/plugins/walrus/deploy.mjs +26 -19
- package/dist/plugins/walrus/deploy.mjs.map +1 -1
- package/dist/plugins/walrus/errors.mjs +1 -8
- package/dist/plugins/walrus/errors.mjs.map +1 -1
- package/dist/plugins/walrus/faucet-strategy.mjs +15 -1
- package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -1
- package/dist/plugins/walrus/index.d.mts +13 -44
- package/dist/plugins/walrus/index.mjs +119 -122
- package/dist/plugins/walrus/index.mjs.map +1 -1
- package/dist/plugins/walrus/mode/known-deploy.mjs +6 -6
- package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -1
- package/dist/plugins/walrus/mode/local-cluster.d.mts +2 -2
- package/dist/plugins/walrus/mode/local-cluster.mjs +2 -10
- package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -1
- package/dist/plugins/walrus/plugin-key.mjs.map +1 -1
- package/dist/plugins/walrus/registry-publish.mjs.map +1 -1
- package/dist/plugins/walrus/routable.mjs.map +1 -1
- package/dist/plugins/walrus/service.mjs.map +1 -1
- package/dist/plugins/walrus/snapshot.mjs +3 -3
- package/dist/plugins/walrus/snapshot.mjs.map +1 -1
- package/dist/plugins/walrus/storage-nodes.mjs +53 -14
- package/dist/plugins/walrus/storage-nodes.mjs.map +1 -1
- package/dist/plugins/walrus/wal-swap.mjs +4 -8
- package/dist/plugins/walrus/wal-swap.mjs.map +1 -1
- package/dist/primitives/artifact-publisher.mjs.map +1 -1
- package/dist/primitives/cache.d.mts +1 -1
- package/dist/runtime/docker/client.mjs +47 -3
- package/dist/runtime/docker/client.mjs.map +1 -1
- package/dist/runtime/docker/container.mjs +37 -57
- package/dist/runtime/docker/container.mjs.map +1 -1
- package/dist/runtime/docker/errors.mjs.map +1 -1
- package/dist/runtime/docker/exec.mjs +2 -2
- package/dist/runtime/docker/exec.mjs.map +1 -1
- package/dist/runtime/docker/image.mjs +10 -11
- package/dist/runtime/docker/image.mjs.map +1 -1
- package/dist/runtime/docker/index.mjs +0 -1
- package/dist/runtime/docker/inspect-and-decode.mjs.map +1 -1
- package/dist/runtime/docker/inventory.mjs +9 -9
- package/dist/runtime/docker/inventory.mjs.map +1 -1
- package/dist/runtime/docker/labels.mjs +12 -1
- package/dist/runtime/docker/labels.mjs.map +1 -1
- package/dist/runtime/docker/network.mjs +6 -6
- package/dist/runtime/docker/network.mjs.map +1 -1
- package/dist/runtime/docker/render-run-args.mjs.map +1 -1
- package/dist/runtime/docker/service.mjs +31 -45
- package/dist/runtime/docker/service.mjs.map +1 -1
- package/dist/runtime/docker/sweep.mjs +14 -64
- package/dist/runtime/docker/sweep.mjs.map +1 -1
- package/dist/runtime/docker/volume.mjs +1 -1
- package/dist/runtime/docker/volume.mjs.map +1 -1
- package/dist/runtime/docker/wrap.mjs +14 -2
- package/dist/runtime/docker/wrap.mjs.map +1 -1
- package/dist/substrate/brand.d.mts +2 -5
- package/dist/substrate/brand.mjs +3 -2
- package/dist/substrate/brand.mjs.map +1 -1
- package/dist/substrate/cross-process.mjs +2 -16
- package/dist/substrate/cross-process.mjs.map +1 -1
- package/dist/substrate/event-time.mjs +0 -2
- package/dist/substrate/event-time.mjs.map +1 -1
- package/dist/substrate/events.d.mts +46 -16
- package/dist/substrate/identity.d.mts +11 -5
- package/dist/substrate/manifest.d.mts +33 -26
- package/dist/substrate/manifest.mjs +8 -3
- package/dist/substrate/manifest.mjs.map +1 -1
- package/dist/substrate/options.d.mts +33 -4
- package/dist/substrate/plugin-ctx.d.mts +70 -0
- package/dist/substrate/plugin-ctx.mjs +66 -0
- package/dist/substrate/plugin-ctx.mjs.map +1 -0
- package/dist/substrate/plugin.d.mts +46 -38
- package/dist/substrate/plugin.mjs +13 -9
- package/dist/substrate/plugin.mjs.map +1 -1
- package/dist/substrate/projection.d.mts +1 -1
- package/dist/substrate/runtime/atomic-write.mjs +3 -4
- package/dist/substrate/runtime/atomic-write.mjs.map +1 -1
- package/dist/substrate/runtime/cache/schema.mjs.map +1 -1
- package/dist/substrate/runtime/cache/service.mjs +50 -20
- package/dist/substrate/runtime/cache/service.mjs.map +1 -1
- package/dist/substrate/runtime/config-validation.mjs.map +1 -1
- package/dist/substrate/runtime/control-plane/domain.mjs +34 -12
- package/dist/substrate/runtime/control-plane/domain.mjs.map +1 -1
- package/dist/substrate/runtime/control-plane/service.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +14 -17
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -1
- 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.map +1 -1
- package/dist/substrate/runtime/cross-process/index.mjs +0 -2
- package/dist/substrate/runtime/cross-process/live-clock.mjs +1 -1
- package/dist/substrate/runtime/cross-process/live-clock.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/liveness.mjs +11 -18
- package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs +2 -2
- package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/roster.mjs +17 -127
- package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/self-pid.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/stack-lock.mjs +29 -28
- package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -1
- package/dist/substrate/runtime/current-plugin.mjs.map +1 -1
- package/dist/substrate/runtime/errors.mjs +1 -13
- package/dist/substrate/runtime/errors.mjs.map +1 -1
- package/dist/substrate/runtime/format-unknown-error.mjs.map +1 -1
- package/dist/substrate/runtime/host-bind-mount-owner.mjs.map +1 -1
- package/dist/substrate/runtime/host-gateway.mjs.map +1 -1
- package/dist/substrate/runtime/host-tree-tar/index.mjs +15 -163
- package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -1
- package/dist/substrate/runtime/http-probe.d.mts +1 -3
- package/dist/substrate/runtime/http-probe.mjs.map +1 -1
- package/dist/substrate/runtime/index.mjs +1 -6
- package/dist/substrate/runtime/lease-broker/service.mjs +5 -23
- package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs +3 -3
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/graph-input-id.d.mts +1 -0
- package/dist/substrate/runtime/lifecycle/graph-input-id.mjs +133 -0
- package/dist/substrate/runtime/lifecycle/graph-input-id.mjs.map +1 -0
- package/dist/substrate/runtime/lifecycle/index.mjs +2 -2
- package/dist/substrate/runtime/lifecycle/plugin-registry.d.mts +1 -1
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +22 -1
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/ready-gate.mjs +2 -15
- package/dist/substrate/runtime/lifecycle/ready-gate.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs +29 -25
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/signals.mjs +1 -1
- package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/state-machine.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/watch-attribution.d.mts +1 -1
- package/dist/substrate/runtime/lifecycle/watch-attribution.mjs +0 -1
- package/dist/substrate/runtime/lifecycle/watch-attribution.mjs.map +1 -1
- package/dist/substrate/runtime/managed-container.d.mts +5 -1
- package/dist/substrate/runtime/managed-container.mjs +8 -10
- package/dist/substrate/runtime/managed-container.mjs.map +1 -1
- package/dist/substrate/runtime/manifest/manifest.mjs +8 -30
- package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -1
- package/dist/substrate/runtime/mode-errors.d.mts +1 -2
- package/dist/substrate/runtime/mode-errors.mjs.map +1 -1
- package/dist/substrate/runtime/observability/cascade-formatter.mjs +1 -11
- package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -1
- package/dist/substrate/runtime/observability/ignore-with-log.mjs.map +1 -1
- package/dist/substrate/runtime/observability/index.d.mts +1 -1
- package/dist/substrate/runtime/observability/index.mjs +4 -6
- package/dist/substrate/runtime/observability/log-attrs.mjs +46 -0
- package/dist/substrate/runtime/observability/log-attrs.mjs.map +1 -0
- package/dist/substrate/runtime/observability/log-store.mjs.map +1 -1
- package/dist/substrate/runtime/observability/logger.mjs +3 -3
- package/dist/substrate/runtime/observability/logger.mjs.map +1 -1
- package/dist/substrate/runtime/observability/output-truncate.mjs.map +1 -1
- package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -1
- package/dist/substrate/runtime/observability/process-lines.mjs.map +1 -1
- package/dist/substrate/runtime/observability/redaction.mjs.map +1 -1
- package/dist/substrate/runtime/observability/subprocess-capture.mjs +2 -2
- package/dist/substrate/runtime/observability/subprocess-capture.mjs.map +1 -1
- package/dist/substrate/runtime/passthrough-or-wrap.mjs.map +1 -1
- package/dist/substrate/runtime/paths.mjs +27 -9
- package/dist/substrate/runtime/paths.mjs.map +1 -1
- package/dist/substrate/runtime/phase-preserving-produce.mjs.map +1 -1
- package/dist/substrate/runtime/port-broker/service.mjs +10 -27
- package/dist/substrate/runtime/port-broker/service.mjs.map +1 -1
- package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -1
- package/dist/substrate/runtime/probes.d.mts +2 -3
- package/dist/substrate/runtime/probes.mjs.map +1 -1
- package/dist/substrate/runtime/process-supervisor.mjs.map +1 -1
- package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -1
- package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -1
- package/dist/substrate/runtime/projection/update.mjs +87 -11
- package/dist/substrate/runtime/projection/update.mjs.map +1 -1
- package/dist/substrate/runtime/random-suffix.mjs.map +1 -1
- package/dist/substrate/runtime/reconcile/fs-plan.mjs +146 -0
- package/dist/substrate/runtime/reconcile/fs-plan.mjs.map +1 -0
- package/dist/substrate/runtime/reconcile/graph.mjs +19 -0
- package/dist/substrate/runtime/reconcile/graph.mjs.map +1 -0
- package/dist/substrate/runtime/reconcile/index.mjs +5 -0
- package/dist/substrate/runtime/reconcile/label.mjs +41 -0
- package/dist/substrate/runtime/reconcile/label.mjs.map +1 -0
- package/dist/substrate/runtime/reconcile/spec.mjs +15 -0
- package/dist/substrate/runtime/reconcile/spec.mjs.map +1 -0
- package/dist/substrate/runtime/retry-policy.d.mts +2 -3
- package/dist/substrate/runtime/retry-policy.mjs.map +1 -1
- package/dist/substrate/runtime/routed-url.mjs.map +1 -1
- package/dist/substrate/runtime/runtime-decode.mjs.map +1 -1
- package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -1
- package/dist/substrate/runtime/stage-and-swap/index.mjs +49 -12
- package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -1
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs.map +1 -1
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -1
- package/dist/substrate/runtime/strategy-registry/service.mjs +29 -17
- package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -1
- package/dist/substrate/runtime/subnet-broker.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/acquire-node.mjs +188 -56
- package/dist/substrate/runtime/supervisor/acquire-node.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/background-tasks.mjs +79 -65
- package/dist/substrate/runtime/supervisor/background-tasks.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/command-loop.mjs +82 -23
- package/dist/substrate/runtime/supervisor/command-loop.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/contribution-dispatcher.mjs +16 -0
- package/dist/substrate/runtime/supervisor/contribution-dispatcher.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/errors.mjs +11 -2
- package/dist/substrate/runtime/supervisor/errors.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/index.mjs +2 -0
- package/dist/substrate/runtime/supervisor/shutdown.mjs +6 -6
- package/dist/substrate/runtime/supervisor/shutdown.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/start-supervisor.mjs +60 -70
- package/dist/substrate/runtime/supervisor/start-supervisor.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/state.d.mts +1 -1
- package/dist/substrate/runtime/supervisor/state.mjs +1 -1
- package/dist/substrate/runtime/supervisor/state.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/teardown.mjs +10 -9
- package/dist/substrate/runtime/supervisor/teardown.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/wiring.mjs +6 -20
- package/dist/substrate/runtime/supervisor/wiring.mjs.map +1 -1
- package/dist/substrate/runtime/tar/reader.mjs +216 -0
- package/dist/substrate/runtime/tar/reader.mjs.map +1 -0
- package/dist/substrate/runtime/typed-env.mjs.map +1 -1
- package/dist/substrate/versioned-doc-schema.mjs.map +1 -1
- package/dist/substrate/versioned-doc-sync.mjs +5 -5
- package/dist/substrate/versioned-doc-sync.mjs.map +1 -1
- package/dist/surfaces/cli/command-tree.mjs +49 -7
- package/dist/surfaces/cli/command-tree.mjs.map +1 -1
- package/dist/surfaces/cli/commands/config.mjs +1 -1
- package/dist/surfaces/cli/commands/config.mjs.map +1 -1
- package/dist/surfaces/cli/commands/confirm-node.mjs.map +1 -1
- package/dist/surfaces/cli/commands/confirm.mjs.map +1 -1
- package/dist/surfaces/cli/commands/doctor.mjs +1 -1
- package/dist/surfaces/cli/commands/doctor.mjs.map +1 -1
- package/dist/surfaces/cli/commands/prune-picker-entry.mjs.map +1 -1
- package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -1
- package/dist/surfaces/cli/commands/prune.mjs +1 -1
- package/dist/surfaces/cli/commands/prune.mjs.map +1 -1
- package/dist/surfaces/cli/commands/snapshot.mjs +1 -1
- package/dist/surfaces/cli/commands/snapshot.mjs.map +1 -1
- package/dist/surfaces/cli/commands/status.mjs +1 -1
- package/dist/surfaces/cli/commands/status.mjs.map +1 -1
- package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -1
- package/dist/surfaces/cli/commands/wipe.mjs +3 -4
- package/dist/surfaces/cli/commands/wipe.mjs.map +1 -1
- package/dist/surfaces/cli/envelope.mjs.map +1 -1
- package/dist/surfaces/cli/errors.mjs.map +1 -1
- package/dist/surfaces/cli/flags.mjs.map +1 -1
- package/dist/surfaces/cli/index.mjs +45 -14
- package/dist/surfaces/cli/index.mjs.map +1 -1
- package/dist/surfaces/cli/output.mjs.map +1 -1
- package/dist/surfaces/cli/sysexits.mjs.map +1 -1
- package/dist/surfaces/tui/app.mjs +0 -21
- package/dist/surfaces/tui/app.mjs.map +1 -1
- package/dist/surfaces/tui/dashboard.mjs +0 -48
- package/dist/surfaces/tui/dashboard.mjs.map +1 -1
- package/dist/surfaces/tui/display-derivation.mjs +80 -16
- package/dist/surfaces/tui/display-derivation.mjs.map +1 -1
- package/dist/surfaces/tui/errors.mjs.map +1 -1
- package/dist/surfaces/tui/event-log.mjs +0 -9
- package/dist/surfaces/tui/event-log.mjs.map +1 -1
- package/dist/surfaces/tui/heartbeat.mjs.map +1 -1
- package/dist/surfaces/tui/index.mjs +2 -2
- package/dist/surfaces/tui/index.mjs.map +1 -1
- package/dist/surfaces/tui/input.mjs.map +1 -1
- package/dist/surfaces/tui/mode-detect.mjs.map +1 -1
- package/dist/surfaces/tui/mount-ink.mjs.map +1 -1
- package/dist/surfaces/tui/plain-renderer.mjs +26 -19
- package/dist/surfaces/tui/plain-renderer.mjs.map +1 -1
- package/dist/surfaces/tui/resource-table.mjs +8 -10
- package/dist/surfaces/tui/resource-table.mjs.map +1 -1
- package/images/postgres/Dockerfile +0 -1
- package/images/sui/Dockerfile +27 -54
- package/images/sui/entrypoint.sh +17 -179
- package/package.json +23 -15
- package/dashboard-ui/assets/index-Bmi1UtAg.js +0 -1356
- package/dashboard-ui/assets/index-D5EShVt4.js +0 -3
- package/dashboard-ui/assets/index-Deml9drg.css +0 -1
- package/dist/api/plugin-errors.d.mts +0 -7
- package/dist/api/plugin-errors.mjs +0 -10
- package/dist/api/plugin-errors.mjs.map +0 -1
- package/dist/cli/wirings/build-verb-layers.mjs +0 -42
- package/dist/cli/wirings/build-verb-layers.mjs.map +0 -1
- package/dist/contracts/capability-decl.d.mts +0 -40
- package/dist/orchestrators/built-in-plugin-layers.mjs +0 -54
- package/dist/orchestrators/built-in-plugin-layers.mjs.map +0 -1
- package/dist/orchestrators/run.mjs +0 -91
- package/dist/orchestrators/run.mjs.map +0 -1
- package/dist/orchestrators/runtime-composition.d.mts +0 -10
- package/dist/orchestrators/runtime-composition.mjs +0 -252
- package/dist/orchestrators/runtime-composition.mjs.map +0 -1
- package/dist/orchestrators/snapshot/capture-command.d.mts +0 -1
- package/dist/orchestrators/snapshot/capture-command.mjs +0 -25
- package/dist/orchestrators/snapshot/capture-command.mjs.map +0 -1
- package/dist/orchestrators/snapshot/pending-marker.mjs +0 -99
- package/dist/orchestrators/snapshot/pending-marker.mjs.map +0 -1
- package/dist/orchestrators/snapshot/recover-pending.mjs +0 -223
- package/dist/orchestrators/snapshot/recover-pending.mjs.map +0 -1
- package/dist/orchestrators/snapshot/state-document.d.mts +0 -1
- package/dist/orchestrators/snapshot/state-document.mjs +0 -58
- package/dist/orchestrators/snapshot/state-document.mjs.map +0 -1
- package/dist/plugins/account/spans.mjs +0 -16
- package/dist/plugins/account/spans.mjs.map +0 -1
- package/dist/plugins/account/variants/env.mjs +0 -24
- package/dist/plugins/account/variants/env.mjs.map +0 -1
- package/dist/plugins/account/variants/inline.mjs +0 -13
- package/dist/plugins/account/variants/inline.mjs.map +0 -1
- package/dist/plugins/account/variants/keystore.mjs +0 -91
- package/dist/plugins/account/variants/keystore.mjs.map +0 -1
- package/dist/plugins/action/spans.mjs +0 -11
- package/dist/plugins/action/spans.mjs.map +0 -1
- package/dist/plugins/coin/spans.mjs +0 -20
- package/dist/plugins/coin/spans.mjs.map +0 -1
- package/dist/plugins/deepbook/spans.mjs +0 -18
- package/dist/plugins/deepbook/spans.mjs.map +0 -1
- package/dist/plugins/faucet/spans.mjs +0 -12
- package/dist/plugins/faucet/spans.mjs.map +0 -1
- package/dist/plugins/package/spans.mjs +0 -14
- package/dist/plugins/package/spans.mjs.map +0 -1
- package/dist/plugins/postgres/codegen.mjs +0 -42
- package/dist/plugins/postgres/codegen.mjs.map +0 -1
- package/dist/plugins/postgres/connection.d.mts +0 -33
- package/dist/plugins/postgres/connection.mjs.map +0 -1
- package/dist/plugins/postgres/db-ensure.mjs.map +0 -1
- package/dist/plugins/postgres/errors.d.mts +0 -60
- package/dist/plugins/postgres/errors.mjs +0 -29
- package/dist/plugins/postgres/errors.mjs.map +0 -1
- package/dist/plugins/postgres/index.d.mts +0 -37
- package/dist/plugins/postgres/index.mjs +0 -68
- package/dist/plugins/postgres/index.mjs.map +0 -1
- package/dist/plugins/postgres/routable.mjs +0 -33
- package/dist/plugins/postgres/routable.mjs.map +0 -1
- package/dist/plugins/postgres/service.d.mts +0 -50
- package/dist/plugins/postgres/service.mjs +0 -179
- package/dist/plugins/postgres/service.mjs.map +0 -1
- package/dist/plugins/postgres/snapshot.mjs +0 -32
- package/dist/plugins/postgres/snapshot.mjs.map +0 -1
- package/dist/plugins/postgres/spans.mjs +0 -11
- package/dist/plugins/postgres/spans.mjs.map +0 -1
- package/dist/plugins/seal/spans.mjs +0 -18
- package/dist/plugins/seal/spans.mjs.map +0 -1
- package/dist/plugins/sui/spans.mjs +0 -17
- package/dist/plugins/sui/spans.mjs.map +0 -1
- package/dist/plugins/wallet/spans.mjs +0 -22
- package/dist/plugins/wallet/spans.mjs.map +0 -1
- package/dist/plugins/walrus/registry-publish.d.mts +0 -24
- package/dist/plugins/walrus/spans.mjs +0 -18
- package/dist/plugins/walrus/spans.mjs.map +0 -1
- package/dist/runtime/docker/logs.d.mts +0 -1
- package/dist/runtime/docker/logs.mjs +0 -34
- package/dist/runtime/docker/logs.mjs.map +0 -1
- package/dist/substrate/runtime/artifact-publisher/index.mjs +0 -86
- package/dist/substrate/runtime/artifact-publisher/index.mjs.map +0 -1
- package/dist/substrate/runtime/capability-sinks/index.d.mts +0 -1
- package/dist/substrate/runtime/capability-sinks/index.mjs +0 -3
- package/dist/substrate/runtime/capability-sinks/layer.d.mts +0 -1
- package/dist/substrate/runtime/capability-sinks/layer.mjs +0 -31
- package/dist/substrate/runtime/capability-sinks/layer.mjs.map +0 -1
- package/dist/substrate/runtime/capability-sinks/service.d.mts +0 -95
- package/dist/substrate/runtime/capability-sinks/service.mjs +0 -69
- package/dist/substrate/runtime/capability-sinks/service.mjs.map +0 -1
- package/dist/substrate/runtime/cross-process/lock.d.mts +0 -1
- package/dist/substrate/runtime/cross-process/lock.mjs +0 -23
- package/dist/substrate/runtime/cross-process/lock.mjs.map +0 -1
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +0 -113
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +0 -1
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs +0 -31
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +0 -1
- package/dist/substrate/runtime/observability/formatter-registry.d.mts +0 -1
- package/dist/substrate/runtime/observability/formatter-registry.mjs +0 -48
- package/dist/substrate/runtime/observability/formatter-registry.mjs.map +0 -1
- package/dist/substrate/runtime/observability/span-store.d.mts +0 -1
- package/dist/substrate/runtime/observability/span-store.mjs +0 -110
- package/dist/substrate/runtime/observability/span-store.mjs.map +0 -1
- package/dist/substrate/runtime/observability/spans.d.mts +0 -1
- package/dist/substrate/runtime/observability/spans.mjs +0 -87
- package/dist/substrate/runtime/observability/spans.mjs.map +0 -1
- package/dist/substrate/runtime/projection/index.mjs +0 -4
- package/dist/substrate/runtime/projection/persisted.mjs +0 -213
- package/dist/substrate/runtime/projection/persisted.mjs.map +0 -1
- package/dist/substrate/runtime/scoped-multimap/service.mjs +0 -52
- package/dist/substrate/runtime/scoped-multimap/service.mjs.map +0 -1
- package/dist/substrate/runtime/scoped-ref-map/index.mjs +0 -2
- package/dist/substrate/runtime/scoped-ref-map/service.mjs +0 -83
- package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +0 -1
- package/dist/substrate/runtime/state-store/index.mjs +0 -3
- package/dist/substrate/runtime/state-store/schema.d.mts +0 -1
- package/dist/substrate/runtime/state-store/schema.mjs +0 -41
- package/dist/substrate/runtime/state-store/schema.mjs.map +0 -1
- package/dist/substrate/runtime/state-store/service.d.mts +0 -1
- package/dist/substrate/runtime/state-store/service.mjs +0 -145
- package/dist/substrate/runtime/state-store/service.mjs.map +0 -1
- package/dist/substrate/runtime/sui-execute/index.mjs.map +0 -1
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs.map +0 -1
- package/dist/substrate/runtime/sui-ledger/object-ref.mjs.map +0 -1
- package/dist/substrate/runtime/sui-move-build/index.mjs.map +0 -1
- package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs +0 -151
- package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs.map +0 -1
- package/dist/substrate/state-store.d.mts +0 -1
- /package/dist/orchestrators/{snapshot/pending-marker.d.mts → codegen/id-config.d.mts} +0 -0
- /package/dist/orchestrators/snapshot/{recover-pending.d.mts → interrupted-restore.d.mts} +0 -0
- /package/dist/{substrate/runtime/sui-execute → plugins/sui/exec}/sign-and-dispatch.d.mts +0 -0
- /package/dist/plugins/{postgres/snapshot.d.mts → sui/ledger/object-ref.d.mts} +0 -0
- /package/dist/{substrate/runtime/sui-move-build → plugins/sui/move}/index.d.mts +0 -0
- /package/dist/substrate/runtime/{state-store/index.d.mts → reconcile/graph.d.mts} +0 -0
- /package/dist/substrate/runtime/{cross-process/snapshot-reservation.d.mts → supervisor/contribution-dispatcher.d.mts} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AccountProjectionSchema, PackageProjectionSchema } from "../../substrate/runtime/projection/persisted.mjs";
|
|
2
1
|
import { eventAt } from "../../substrate/event-time.mjs";
|
|
3
|
-
import {
|
|
2
|
+
import { AccountProjectionSchema, PackageProjectionSchema } from "../../substrate/runtime/projection/update.mjs";
|
|
4
3
|
import { accountLine, endpointLine, labelForRow, packageLine, roleLabel, statusLabel } from "./display-derivation.mjs";
|
|
4
|
+
import { mountFailed } from "./errors.mjs";
|
|
5
5
|
import { Effect, Schema, Stream, SubscriptionRef } from "effect";
|
|
6
6
|
//#region src/surfaces/tui/plain-renderer.ts
|
|
7
7
|
/**
|
|
@@ -27,15 +27,33 @@ const formatEventLine = (event) => {
|
|
|
27
27
|
* Mount subscribes to the live event stream, writes one line per
|
|
28
28
|
* event to stderr. The state-ref is sampled for the initial sweep
|
|
29
29
|
* (one line per declared row) so a renderer attached after boot
|
|
30
|
-
* still sees a coherent baseline.
|
|
30
|
+
* still sees a coherent baseline. In quiet mode the sweep collapses
|
|
31
|
+
* to the single `stack.identity` line — at boot the per-row/account
|
|
32
|
+
* lines are all `<pending>` and the real signal arrives as readiness
|
|
33
|
+
* + endpoint events.
|
|
31
34
|
*/
|
|
32
|
-
const makePlainRenderer = () => ({
|
|
35
|
+
const makePlainRenderer = (options = {}) => ({
|
|
33
36
|
mount: (stateRef, events) => Effect.gen(function* () {
|
|
34
|
-
yield* emitInitialSweep(yield* SubscriptionRef.get(stateRef));
|
|
35
|
-
yield* events.pipe(Stream.runForEach((event) => writeStderrLine(formatEventLine(event))));
|
|
37
|
+
yield* emitInitialSweep(yield* SubscriptionRef.get(stateRef), { quiet: options.quiet });
|
|
38
|
+
yield* (options.quiet ? events.pipe(Stream.filter(keepInQuiet)) : events).pipe(Stream.runForEach((event) => writeStderrLine(formatEventLine(event))));
|
|
36
39
|
}).pipe(Effect.catch((cause) => Effect.fail(mountFailed(cause instanceof Error ? cause.message : String(cause))))),
|
|
37
40
|
flush: Effect.void.pipe(Effect.catch(() => Effect.fail(mountFailed("flush"))))
|
|
38
41
|
});
|
|
42
|
+
/**
|
|
43
|
+
* Quiet-mode event predicate (pure; exported for tests). Keeps milestone
|
|
44
|
+
* and non-INFO events; drops routine INFO churn. Anything that formats as
|
|
45
|
+
* WARN/ERROR is always kept so failures are never silently filtered out.
|
|
46
|
+
*/
|
|
47
|
+
const keepInQuiet = (event) => {
|
|
48
|
+
if (levelForEvent(event) !== "INFO") return true;
|
|
49
|
+
switch (event.tag) {
|
|
50
|
+
case "lifecycle.statusChanged": return event.to === "ready";
|
|
51
|
+
case "endpoint.registered":
|
|
52
|
+
case "codegen.emitted":
|
|
53
|
+
case "shutdown.escalated": return true;
|
|
54
|
+
default: return false;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
39
57
|
const isoTimestamp = (at) => new Date(at || Date.now()).toISOString();
|
|
40
58
|
const levelForEvent = (event) => {
|
|
41
59
|
switch (event.tag) {
|
|
@@ -140,18 +158,6 @@ const payloadFor = (event) => {
|
|
|
140
158
|
signal: event.signal,
|
|
141
159
|
exitCode: event.exitCode
|
|
142
160
|
});
|
|
143
|
-
case "snapshot.captureStarted": return kv({
|
|
144
|
-
snapshotId: event.snapshotId,
|
|
145
|
-
name: event.name
|
|
146
|
-
});
|
|
147
|
-
case "snapshot.captureProgress": return kv({
|
|
148
|
-
snapshotId: event.snapshotId,
|
|
149
|
-
name: event.name,
|
|
150
|
-
phase: event.phase,
|
|
151
|
-
detail: event.detail,
|
|
152
|
-
paused: event.pausedContainers,
|
|
153
|
-
total: event.totalContainers
|
|
154
|
-
});
|
|
155
161
|
case "snapshot.captureSkipped": return kv({ reason: event.reason });
|
|
156
162
|
case "snapshot.captureFailed": return kv({
|
|
157
163
|
snapshotId: event.snapshotId,
|
|
@@ -183,8 +189,9 @@ const tryDecodeProjection = (schema, payload) => {
|
|
|
183
189
|
return null;
|
|
184
190
|
}
|
|
185
191
|
};
|
|
186
|
-
const emitInitialSweep = (state) => Effect.gen(function* () {
|
|
192
|
+
const emitInitialSweep = (state, options = {}) => Effect.gen(function* () {
|
|
187
193
|
yield* writeStderrLine(`${isoTimestamp(state.cycle.startedAt || Date.now())} INFO stack.identity app=${state.identity.app} stack=${state.identity.stack} network=${state.identity.network} cycle=${state.cycle.id}`);
|
|
194
|
+
if (options.quiet) return;
|
|
188
195
|
for (const row of state.rows) yield* writeStderrLine(`${isoTimestamp(Date.now())} INFO row.declared ${kv({
|
|
189
196
|
key: row.key,
|
|
190
197
|
label: labelForRow(row.key),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plain-renderer.mjs","names":[],"sources":["../../../src/surfaces/tui/plain-renderer.ts"],"sourcesContent":["// Plain (non-TTY) renderer.\n//\n// Architecture §11 + distilled/21-tui §Renderers: when stdout is not\n// a TTY (CI, pipe, log file), the live ink dashboard is replaced by\n// a structured line stream. One line per event; periodic heartbeat\n// per internally-acquiring row, surfaced to operators as \"starting\".\n//\n// Discipline:\n// - One line per EngineEvent — no batching, no aggregation, no\n// diffing. Each event maps to exactly one structured line.\n// - Writes to stderr (architecture invariant: plain renderer goes\n// to stderr so stdout stays clean for whatever consumes the\n// pipe).\n// - EPIPE swallowed (pipe-safety invariant).\n// - Pure formatting helpers exposed for tests; the Effect-shaped\n// side is the `mount` function.\n// - Heartbeat formatting is pure here; scheduling belongs to the\n// renderer mount path. The architecture says it\n// \"anchors on first sighting in the internal acquiring state; phase\n// changes do NOT reset the clock; a late tick emits exactly one\n// heartbeat (no backlog catch-up)\". The seam is exposed via\n// `formatHeartbeat`.\n\nimport { Effect, Schema, Stream, SubscriptionRef } from 'effect';\n\nimport type { Renderer } from '../../contracts/renderer.ts';\nimport type { EngineEvent } from '../../substrate/events.ts';\nimport type { SubscribableState } from '../../substrate/projection.ts';\nimport {\n\tAccountProjectionSchema,\n\tPackageProjectionSchema,\n} from '../../substrate/runtime/projection/persisted.ts';\nimport {\n\taccountLine,\n\tendpointLine,\n\tlabelForRow,\n\tnarrationFor,\n\tpackageLine,\n\troleLabel,\n\tstatusLabel,\n} from './display-derivation.ts';\nimport { mountFailed } from './errors.ts';\nimport { eventAt } from '../../substrate/event-time.ts';\n\n// -----------------------------------------------------------------------------\n// Line shape — pure formatters\n// -----------------------------------------------------------------------------\n\n/**\n * Plain-renderer line shape (each call returns exactly one line, no\n * trailing newline).\n *\n * <iso-timestamp> <level> <event-tag> <key>=<value> ...\n *\n * Example:\n * 2026-05-19T20:11:32.001Z INFO lifecycle.statusChanged key=sui from=starting to=ready\n * 2026-05-19T20:11:32.500Z WARN log.appended key=walrus line=\"failed to bind port 9000\"\n * 2026-05-19T20:11:33.000Z INFO endpoint.registered name=aggregator url=http://localhost:9000\n */\nexport const formatEventLine = (event: EngineEvent): string => {\n\tconst ts = isoTimestamp(eventAt(event));\n\tconst level = levelForEvent(event);\n\tconst payload = payloadFor(event);\n\treturn `${ts} ${level} ${event.tag} ${payload}`;\n};\n\n/**\n * Heartbeat line for an in-flight internal acquiring row. Emitted by the\n * scheduler at architecture-blessed intervals; this function is the\n * pure formatter only.\n */\nexport const formatHeartbeat = (\n\tnow: number,\n\tkey: string,\n\tphase: string | null,\n\troleToken: string,\n): string => {\n\tconst ts = isoTimestamp(now);\n\tconst narration = narrationFor(phase, 'acquiring');\n\treturn `${ts} INFO heartbeat key=${key} role=${roleToken} narration=${quote(narration)}`;\n};\n\n// -----------------------------------------------------------------------------\n// Renderer implementation\n// -----------------------------------------------------------------------------\n\n/**\n * Build a plain renderer satisfying the `Renderer` contract.\n *\n * Mount subscribes to the live event stream, writes one line per\n * event to stderr. The state-ref is sampled for the initial sweep\n * (one line per declared row) so a renderer attached after boot\n * still sees a coherent baseline.\n */\nexport const makePlainRenderer = (): Renderer => ({\n\tmount: (stateRef, events) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst initial = yield* SubscriptionRef.get(stateRef);\n\t\t\tyield* emitInitialSweep(initial);\n\t\t\tyield* events.pipe(Stream.runForEach((event) => writeStderrLine(formatEventLine(event))));\n\t\t}).pipe(\n\t\t\tEffect.catch((cause: unknown) =>\n\t\t\t\tEffect.fail(mountFailed(cause instanceof Error ? cause.message : String(cause))),\n\t\t\t),\n\t\t),\n\tflush: Effect.void.pipe(Effect.catch(() => Effect.fail(mountFailed('flush')))),\n});\n\n// -----------------------------------------------------------------------------\n// Internals — formatting\n// -----------------------------------------------------------------------------\n\nconst isoTimestamp = (at: number): string => new Date(at || Date.now()).toISOString();\n\nconst levelForEvent = (event: EngineEvent): 'INFO' | 'WARN' | 'ERROR' => {\n\tswitch (event.tag) {\n\t\tcase 'log.appended':\n\t\t\treturn event.level === 'error' ? 'ERROR' : event.level === 'warn' ? 'WARN' : 'INFO';\n\t\tcase 'error.reported':\n\t\t\treturn event.error.severity === 'fatal' || event.error.severity === 'error'\n\t\t\t\t? 'ERROR'\n\t\t\t\t: 'WARN';\n\t\t// A broken orchestrator capability sink leaves the plugin `ready`\n\t\t// (non-fatal by design — see dispatch-contributions.ts), so this\n\t\t// is the operator's ONLY signal that e.g. RPC/wallet routing is\n\t\t// dead. It must not render as a routine INFO line.\n\t\tcase 'engine.orchestrator.dispatchFailed':\n\t\t\treturn 'WARN';\n\t\tdefault:\n\t\t\treturn 'INFO';\n\t}\n};\n\nconst payloadFor = (event: EngineEvent): string => {\n\tswitch (event.tag) {\n\t\tcase 'lifecycle.statusChanged':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tfrom: statusLabel(event.from),\n\t\t\t\tto: statusLabel(event.to),\n\t\t\t});\n\t\tcase 'lifecycle.phaseSet':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tphase: event.phase ?? '',\n\t\t\t});\n\t\tcase 'log.appended':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tline: event.line,\n\t\t\t});\n\t\tcase 'endpoint.registered':\n\t\t\treturn kv({\n\t\t\t\tkey: event.endpoint.endpointKey,\n\t\t\t\tname: event.endpoint.name,\n\t\t\t\tdisplayUrl: event.endpoint.displayUrl ?? event.endpoint.url,\n\t\t\t\turl: event.endpoint.url,\n\t\t\t\twire: event.endpoint.wireProtocol,\n\t\t\t});\n\t\tcase 'projection.updated':\n\t\t\tif (event.kind === 'account') {\n\t\t\t\t// STYLE_GUIDE §19 — substrate-side `decodeUnknownSync` so a\n\t\t\t\t// malformed payload skips the line rather than rendering\n\t\t\t\t// garbage (`Schema.decodeUnknownSync(...) as A` bare-cast\n\t\t\t\t// is banned). The reducer at\n\t\t\t\t// `substrate/runtime/projection/update.ts` performs the\n\t\t\t\t// same decode; we repeat it here because the renderer\n\t\t\t\t// reads the raw event stream, not the reduced state slice.\n\t\t\t\tconst account = tryDecodeProjection(AccountProjectionSchema, event.payload);\n\t\t\t\tif (account === null) return kv({ kind: event.kind, key: event.key });\n\t\t\t\treturn kv({\n\t\t\t\t\tkey: account.key,\n\t\t\t\t\trow: account.rowKey ?? '',\n\t\t\t\t\tname: account.name,\n\t\t\t\t\taddress: account.address ?? '',\n\t\t\t\t\tscheme: account.scheme ?? '',\n\t\t\t\t\tsource: account.source ?? '',\n\t\t\t\t\tfunding: account.funding.status,\n\t\t\t\t\tfundingEntries: (account.funding.entries ?? [])\n\t\t\t\t\t\t.map((entry) => `${entry.coin}:${entry.amount}:${entry.status}`)\n\t\t\t\t\t\t.join(','),\n\t\t\t\t\trequestedMist: account.funding.requestedMist ?? '',\n\t\t\t\t\tbalanceMist: account.funding.balanceMist ?? '',\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (event.kind === 'package') {\n\t\t\t\tconst pkg = tryDecodeProjection(PackageProjectionSchema, event.payload);\n\t\t\t\tif (pkg === null) return kv({ kind: event.kind, key: event.key });\n\t\t\t\treturn kv({\n\t\t\t\t\tkey: pkg.key,\n\t\t\t\t\trow: pkg.rowKey ?? '',\n\t\t\t\t\tname: pkg.name,\n\t\t\t\t\tkind: pkg.kind,\n\t\t\t\t\tpackageId: pkg.packageId,\n\t\t\t\t\tupgradeCapId: pkg.upgradeCapId ?? '',\n\t\t\t\t\tmvr: pkg.mvrPlaceholder,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn kv({ kind: event.kind, key: event.key });\n\t\tcase 'endpoint.released':\n\t\t\treturn kv({ key: event.endpointKey });\n\t\tcase 'strategy.registered':\n\t\t\treturn kv({\n\t\t\t\tcapability: event.capabilityKey,\n\t\t\t\tautoMounted: event.autoMounted,\n\t\t\t});\n\t\tcase 'strategy.unregistered':\n\t\t\treturn kv({ capability: event.capabilityKey });\n\t\tcase 'manifest.flushed':\n\t\t\treturn kv({ version: event.manifestVersion });\n\t\tcase 'codegen.emitted':\n\t\t\treturn kv({ files: event.files.length });\n\t\tcase 'engine.orchestrator.dispatchFailed':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tkind: event.kind,\n\t\t\t\t// `causeType` (the failing sink error's `_tag`, e.g.\n\t\t\t\t// `RouterBootFailed`) is the discriminator an operator scans\n\t\t\t\t// for to tell dead RPC routing from a codegen collision. `kv`\n\t\t\t\t// drops it when undefined, so untagged causes stay clean.\n\t\t\t\tcauseType: event.causeType ?? '',\n\t\t\t\tsummary: event.message,\n\t\t\t});\n\t\tcase 'error.reported':\n\t\t\treturn kv({\n\t\t\t\tkey: event.error.pluginKey ?? '',\n\t\t\t\ttag: event.error.tag,\n\t\t\t\tsummary: event.error.summary,\n\t\t\t\tcause: event.error.chain.join(' | '),\n\t\t\t\tseverity: event.error.severity,\n\t\t\t});\n\t\tcase 'build.statusChanged':\n\t\t\treturn kv({\n\t\t\t\tkey: event.entry.pluginKey ?? '',\n\t\t\t\tphase: event.entry.phase,\n\t\t\t\tprogress: event.entry.progress,\n\t\t\t});\n\t\tcase 'restart.requested':\n\t\tcase 'restart.completed':\n\t\t\treturn kv({\n\t\t\t\ttarget: event.target === 'stack' ? 'stack' : event.target.pluginKey,\n\t\t\t});\n\t\tcase 'shutdown.escalated':\n\t\t\treturn kv({\n\t\t\t\tmode: 'hard-kill',\n\t\t\t\tsignal: event.signal,\n\t\t\t\texitCode: event.exitCode,\n\t\t\t});\n\t\tcase 'snapshot.captureStarted':\n\t\t\treturn kv({ snapshotId: event.snapshotId, name: event.name });\n\t\tcase 'snapshot.captureProgress':\n\t\t\treturn kv({\n\t\t\t\tsnapshotId: event.snapshotId,\n\t\t\t\tname: event.name,\n\t\t\t\tphase: event.phase,\n\t\t\t\tdetail: event.detail,\n\t\t\t\tpaused: event.pausedContainers,\n\t\t\t\ttotal: event.totalContainers,\n\t\t\t});\n\t\tcase 'snapshot.captureSkipped':\n\t\t\treturn kv({ reason: event.reason });\n\t\tcase 'snapshot.captureFailed':\n\t\t\treturn kv({ snapshotId: event.snapshotId, name: event.name, summary: event.summary });\n\t\tcase 'snapshot.captured':\n\t\tcase 'snapshot.restored':\n\t\t\treturn kv({ snapshotId: event.snapshotId });\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = event;\n\t\t\tvoid _exhaustive;\n\t\t\treturn '';\n\t\t}\n\t}\n};\n\nconst kv = (record: Readonly<Record<string, unknown>>): string =>\n\tObject.entries(record)\n\t\t.filter(([, v]) => v !== '' && v !== null && v !== undefined)\n\t\t.map(([k, v]) => `${k}=${quoteIfNeeded(String(v))}`)\n\t\t.join(' ');\n\n// Quote anything that contains whitespace, a `\"`, or an ASCII control\n// byte (`\\x00-\\x1f`). Control bytes are the load-bearing case: a\n// projection payload field that contains a stray `\\x1b` (ESC) would\n// otherwise inject an ANSI escape sequence into the plain-renderer's\n// stdout, corrupting subsequent terminal state for callers tailing\n// `--format plain` output.\nconst quoteIfNeeded = (s: string): string => (/[\\s\"\\x00-\\x1f]/.test(s) ? quote(s) : s);\n\nconst quote = (s: string): string => `\"${s.replace(/\"/g, '\\\\\"')}\"`;\n\n/**\n * Structural validate-then-narrow for `projection.updated` payloads\n * before they are formatted as text. Mirrors\n * `tryDecodeProjectionPayload` in the substrate reducer — returns\n * `null` on schema-decode failure so the renderer drops the slice\n * rather than printing fields off a malformed object. The substrate\n * reducer emits the `Effect.logWarning` for the same payload (the\n * decode is deterministic), so we stay silent here to avoid double\n * logging.\n */\nconst tryDecodeProjection = <S extends Schema.Decoder<unknown>>(\n\tschema: S,\n\tpayload: unknown,\n): S['Type'] | null => {\n\ttry {\n\t\treturn Schema.decodeUnknownSync(schema)(payload);\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Internals — initial sweep\n// -----------------------------------------------------------------------------\n\nconst emitInitialSweep = (state: SubscribableState): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tyield* writeStderrLine(\n\t\t\t`${isoTimestamp(state.cycle.startedAt || Date.now())} INFO stack.identity app=${state.identity.app} stack=${state.identity.stack} network=${state.identity.network} cycle=${state.cycle.id}`,\n\t\t);\n\t\tfor (const row of state.rows) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(Date.now())} INFO row.declared ${kv({\n\t\t\t\t\tkey: row.key,\n\t\t\t\t\tlabel: labelForRow(row.key),\n\t\t\t\t\trole: roleLabel(row.role),\n\t\t\t\t\tstatus: statusLabel(row.status),\n\t\t\t\t})}`,\n\t\t\t);\n\t\t}\n\t\tfor (const endpoint of state.endpoints) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(endpoint.registeredAt)} INFO endpoint.registered ${endpointLine(endpoint)}`,\n\t\t\t);\n\t\t}\n\t\tfor (const account of state.accounts) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(account.updatedAt)} INFO projection.updated[account] ${accountLine(account)}`,\n\t\t\t);\n\t\t}\n\t\tfor (const pkg of state.packages) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(pkg.updatedAt)} INFO projection.updated[package] ${packageLine(pkg)}`,\n\t\t\t);\n\t\t}\n\t});\n\n// -----------------------------------------------------------------------------\n// Internals — IO (pipe-safe)\n// -----------------------------------------------------------------------------\n\nconst writeStderrLine = (line: string): Effect.Effect<void> =>\n\tEffect.sync(() => {\n\t\ttry {\n\t\t\tprocess.stderr.write(`${line}\\n`);\n\t\t} catch (err) {\n\t\t\t// EPIPE swallowed (pipe-safety invariant); other errors\n\t\t\t// likewise swallowed because \"rendering never crashes the\n\t\t\t// stack\" (distilled/21-tui § Invariants).\n\t\t\tvoid err;\n\t\t}\n\t});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plain-renderer.mjs","names":[],"sources":["../../../src/surfaces/tui/plain-renderer.ts"],"sourcesContent":["// Plain (non-TTY) renderer.\n//\n// Architecture §11 + distilled/21-tui §Renderers: when stdout is not\n// a TTY (CI, pipe, log file), the live ink dashboard is replaced by\n// a structured line stream. One line per event; periodic heartbeat\n// per internally-acquiring row, surfaced to operators as \"starting\".\n//\n// Discipline:\n// - One line per EngineEvent — no batching, no aggregation, no\n// diffing. Each event maps to exactly one structured line.\n// - Writes to stderr (architecture invariant: plain renderer goes\n// to stderr so stdout stays clean for whatever consumes the\n// pipe).\n// - EPIPE swallowed (pipe-safety invariant).\n// - Pure formatting helpers exposed for tests; the Effect-shaped\n// side is the `mount` function.\n// - Heartbeat formatting is pure here; scheduling belongs to the\n// renderer mount path. The architecture says it\n// \"anchors on first sighting in the internal acquiring state; phase\n// changes do NOT reset the clock; a late tick emits exactly one\n// heartbeat (no backlog catch-up)\". The seam is exposed via\n// `formatHeartbeat`.\n\nimport { Effect, Schema, Stream, SubscriptionRef } from 'effect';\n\nimport type { Renderer } from '../../contracts/renderer.ts';\nimport type { EngineEvent } from '../../substrate/events.ts';\nimport type { SubscribableState } from '../../substrate/projection.ts';\nimport {\n\tAccountProjectionSchema,\n\tPackageProjectionSchema,\n} from '../../substrate/runtime/projection/update.ts';\nimport {\n\taccountLine,\n\tendpointLine,\n\tlabelForRow,\n\tnarrationFor,\n\tpackageLine,\n\troleLabel,\n\tstatusLabel,\n} from './display-derivation.ts';\nimport { mountFailed } from './errors.ts';\nimport { eventAt } from '../../substrate/event-time.ts';\n\n// -----------------------------------------------------------------------------\n// Line shape — pure formatters\n// -----------------------------------------------------------------------------\n\n/**\n * Plain-renderer line shape (each call returns exactly one line, no\n * trailing newline).\n *\n * <iso-timestamp> <level> <event-tag> <key>=<value> ...\n *\n * Example:\n * 2026-05-19T20:11:32.001Z INFO lifecycle.statusChanged key=sui from=starting to=ready\n * 2026-05-19T20:11:32.500Z WARN log.appended key=walrus line=\"failed to bind port 9000\"\n * 2026-05-19T20:11:33.000Z INFO endpoint.registered name=aggregator url=http://localhost:9000\n */\nexport const formatEventLine = (event: EngineEvent): string => {\n\tconst ts = isoTimestamp(eventAt(event));\n\tconst level = levelForEvent(event);\n\tconst payload = payloadFor(event);\n\treturn `${ts} ${level} ${event.tag} ${payload}`;\n};\n\n/**\n * Heartbeat line for an in-flight internal acquiring row. Emitted by the\n * scheduler at architecture-blessed intervals; this function is the\n * pure formatter only.\n */\nexport const formatHeartbeat = (\n\tnow: number,\n\tkey: string,\n\tphase: string | null,\n\troleToken: string,\n): string => {\n\tconst ts = isoTimestamp(now);\n\tconst narration = narrationFor(phase, 'acquiring');\n\treturn `${ts} INFO heartbeat key=${key} role=${roleToken} narration=${quote(narration)}`;\n};\n\n// -----------------------------------------------------------------------------\n// Renderer implementation\n// -----------------------------------------------------------------------------\n\nexport interface PlainRendererOptions {\n\t/**\n\t * Quiet mode: emit only the milestones an operator tailing the stream\n\t * cares about — per-plugin readiness, endpoint registrations, codegen,\n\t * hard-kill escalations, and ALL warnings/errors — and drop the routine\n\t * intermediate transitions (starting/acquiring), info `log.appended`\n\t * lines, projection churn, build progress, and teardown chatter.\n\t *\n\t * OFF by default: the normal `--format plain` / CI stream keeps the\n\t * architecture invariant of one line per event (no aggregation). This\n\t * is opted into by embedded consumers that pipe the supervisor's output\n\t * through another tool — notably the Playwright `webServer`, where the\n\t * full firehose surfaces as confusing `[WebServer]`-prefixed noise.\n\t */\n\treadonly quiet?: boolean;\n}\n\n/**\n * Build a plain renderer satisfying the `Renderer` contract.\n *\n * Mount subscribes to the live event stream, writes one line per\n * event to stderr. The state-ref is sampled for the initial sweep\n * (one line per declared row) so a renderer attached after boot\n * still sees a coherent baseline. In quiet mode the sweep collapses\n * to the single `stack.identity` line — at boot the per-row/account\n * lines are all `<pending>` and the real signal arrives as readiness\n * + endpoint events.\n */\nexport const makePlainRenderer = (options: PlainRendererOptions = {}): Renderer => ({\n\tmount: (stateRef, events) =>\n\t\tEffect.gen(function* () {\n\t\t\tconst initial = yield* SubscriptionRef.get(stateRef);\n\t\t\tyield* emitInitialSweep(initial, { quiet: options.quiet });\n\t\t\tconst stream = options.quiet ? events.pipe(Stream.filter(keepInQuiet)) : events;\n\t\t\tyield* stream.pipe(Stream.runForEach((event) => writeStderrLine(formatEventLine(event))));\n\t\t}).pipe(\n\t\t\tEffect.catch((cause: unknown) =>\n\t\t\t\tEffect.fail(mountFailed(cause instanceof Error ? cause.message : String(cause))),\n\t\t\t),\n\t\t),\n\tflush: Effect.void.pipe(Effect.catch(() => Effect.fail(mountFailed('flush')))),\n});\n\n/**\n * Quiet-mode event predicate (pure; exported for tests). Keeps milestone\n * and non-INFO events; drops routine INFO churn. Anything that formats as\n * WARN/ERROR is always kept so failures are never silently filtered out.\n */\nexport const keepInQuiet = (event: EngineEvent): boolean => {\n\tif (levelForEvent(event) !== 'INFO') return true;\n\tswitch (event.tag) {\n\t\tcase 'lifecycle.statusChanged':\n\t\t\t// Only the readiness milestone, not every starting/acquiring tick.\n\t\t\treturn event.to === 'ready';\n\t\tcase 'endpoint.registered':\n\t\tcase 'codegen.emitted':\n\t\tcase 'shutdown.escalated':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Internals — formatting\n// -----------------------------------------------------------------------------\n\nconst isoTimestamp = (at: number): string => new Date(at || Date.now()).toISOString();\n\nconst levelForEvent = (event: EngineEvent): 'INFO' | 'WARN' | 'ERROR' => {\n\tswitch (event.tag) {\n\t\tcase 'log.appended':\n\t\t\treturn event.level === 'error' ? 'ERROR' : event.level === 'warn' ? 'WARN' : 'INFO';\n\t\tcase 'error.reported':\n\t\t\treturn event.error.severity === 'fatal' || event.error.severity === 'error'\n\t\t\t\t? 'ERROR'\n\t\t\t\t: 'WARN';\n\t\t// A failed buffered contribution replayed through the\n\t\t// `ContributionDispatcher` leaves the plugin `ready` (non-fatal by\n\t\t// design — see `dispatchBufferedContributions` in acquire-node.ts),\n\t\t// so this is the operator's ONLY signal that e.g. RPC/wallet routing\n\t\t// is dead. It must not render as a routine INFO line.\n\t\tcase 'engine.orchestrator.dispatchFailed':\n\t\t\treturn 'WARN';\n\t\tdefault:\n\t\t\treturn 'INFO';\n\t}\n};\n\nconst payloadFor = (event: EngineEvent): string => {\n\tswitch (event.tag) {\n\t\tcase 'lifecycle.statusChanged':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tfrom: statusLabel(event.from),\n\t\t\t\tto: statusLabel(event.to),\n\t\t\t});\n\t\tcase 'lifecycle.phaseSet':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tphase: event.phase ?? '',\n\t\t\t});\n\t\tcase 'log.appended':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tline: event.line,\n\t\t\t});\n\t\tcase 'endpoint.registered':\n\t\t\treturn kv({\n\t\t\t\tkey: event.endpoint.endpointKey,\n\t\t\t\tname: event.endpoint.name,\n\t\t\t\tdisplayUrl: event.endpoint.displayUrl ?? event.endpoint.url,\n\t\t\t\turl: event.endpoint.url,\n\t\t\t\twire: event.endpoint.wireProtocol,\n\t\t\t});\n\t\tcase 'projection.updated':\n\t\t\tif (event.kind === 'account') {\n\t\t\t\t// STYLE_GUIDE §19 — substrate-side `decodeUnknownSync` so a\n\t\t\t\t// malformed payload skips the line rather than rendering\n\t\t\t\t// garbage (`Schema.decodeUnknownSync(...) as A` bare-cast\n\t\t\t\t// is banned). The reducer at\n\t\t\t\t// `substrate/runtime/projection/update.ts` performs the\n\t\t\t\t// same decode; we repeat it here because the renderer\n\t\t\t\t// reads the raw event stream, not the reduced state slice.\n\t\t\t\tconst account = tryDecodeProjection(AccountProjectionSchema, event.payload);\n\t\t\t\tif (account === null) return kv({ kind: event.kind, key: event.key });\n\t\t\t\treturn kv({\n\t\t\t\t\tkey: account.key,\n\t\t\t\t\trow: account.rowKey ?? '',\n\t\t\t\t\tname: account.name,\n\t\t\t\t\taddress: account.address ?? '',\n\t\t\t\t\tscheme: account.scheme ?? '',\n\t\t\t\t\tsource: account.source ?? '',\n\t\t\t\t\tfunding: account.funding.status,\n\t\t\t\t\tfundingEntries: (account.funding.entries ?? [])\n\t\t\t\t\t\t.map((entry) => `${entry.coin}:${entry.amount}:${entry.status}`)\n\t\t\t\t\t\t.join(','),\n\t\t\t\t\trequestedMist: account.funding.requestedMist ?? '',\n\t\t\t\t\tbalanceMist: account.funding.balanceMist ?? '',\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (event.kind === 'package') {\n\t\t\t\tconst pkg = tryDecodeProjection(PackageProjectionSchema, event.payload);\n\t\t\t\tif (pkg === null) return kv({ kind: event.kind, key: event.key });\n\t\t\t\treturn kv({\n\t\t\t\t\tkey: pkg.key,\n\t\t\t\t\trow: pkg.rowKey ?? '',\n\t\t\t\t\tname: pkg.name,\n\t\t\t\t\tkind: pkg.kind,\n\t\t\t\t\tpackageId: pkg.packageId,\n\t\t\t\t\tupgradeCapId: pkg.upgradeCapId ?? '',\n\t\t\t\t\tmvr: pkg.mvrPlaceholder,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn kv({ kind: event.kind, key: event.key });\n\t\tcase 'endpoint.released':\n\t\t\treturn kv({ key: event.endpointKey });\n\t\tcase 'strategy.registered':\n\t\t\treturn kv({\n\t\t\t\tcapability: event.capabilityKey,\n\t\t\t\tautoMounted: event.autoMounted,\n\t\t\t});\n\t\tcase 'strategy.unregistered':\n\t\t\treturn kv({ capability: event.capabilityKey });\n\t\tcase 'manifest.flushed':\n\t\t\treturn kv({ version: event.manifestVersion });\n\t\tcase 'codegen.emitted':\n\t\t\treturn kv({ files: event.files.length });\n\t\tcase 'engine.orchestrator.dispatchFailed':\n\t\t\treturn kv({\n\t\t\t\tkey: event.pluginKey,\n\t\t\t\tkind: event.kind,\n\t\t\t\t// `causeType` (the failing sink error's `_tag`, e.g.\n\t\t\t\t// `RouterBootFailed`) is the discriminator an operator scans\n\t\t\t\t// for to tell dead RPC routing from a codegen collision. `kv`\n\t\t\t\t// drops it when undefined, so untagged causes stay clean.\n\t\t\t\tcauseType: event.causeType ?? '',\n\t\t\t\tsummary: event.message,\n\t\t\t});\n\t\tcase 'error.reported':\n\t\t\treturn kv({\n\t\t\t\tkey: event.error.pluginKey ?? '',\n\t\t\t\ttag: event.error.tag,\n\t\t\t\tsummary: event.error.summary,\n\t\t\t\tcause: event.error.chain.join(' | '),\n\t\t\t\tseverity: event.error.severity,\n\t\t\t});\n\t\tcase 'build.statusChanged':\n\t\t\treturn kv({\n\t\t\t\tkey: event.entry.pluginKey ?? '',\n\t\t\t\tphase: event.entry.phase,\n\t\t\t\tprogress: event.entry.progress,\n\t\t\t});\n\t\tcase 'restart.requested':\n\t\tcase 'restart.completed':\n\t\t\treturn kv({\n\t\t\t\ttarget: event.target === 'stack' ? 'stack' : event.target.pluginKey,\n\t\t\t});\n\t\tcase 'shutdown.escalated':\n\t\t\treturn kv({\n\t\t\t\tmode: 'hard-kill',\n\t\t\t\tsignal: event.signal,\n\t\t\t\texitCode: event.exitCode,\n\t\t\t});\n\t\tcase 'snapshot.captureSkipped':\n\t\t\treturn kv({ reason: event.reason });\n\t\tcase 'snapshot.captureFailed':\n\t\t\treturn kv({ snapshotId: event.snapshotId, name: event.name, summary: event.summary });\n\t\tcase 'snapshot.captured':\n\t\tcase 'snapshot.restored':\n\t\t\treturn kv({ snapshotId: event.snapshotId });\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = event;\n\t\t\tvoid _exhaustive;\n\t\t\treturn '';\n\t\t}\n\t}\n};\n\nconst kv = (record: Readonly<Record<string, unknown>>): string =>\n\tObject.entries(record)\n\t\t.filter(([, v]) => v !== '' && v !== null && v !== undefined)\n\t\t.map(([k, v]) => `${k}=${quoteIfNeeded(String(v))}`)\n\t\t.join(' ');\n\n// Quote anything that contains whitespace, a `\"`, or an ASCII control\n// byte (`\\x00-\\x1f`). Control bytes are the load-bearing case: a\n// projection payload field that contains a stray `\\x1b` (ESC) would\n// otherwise inject an ANSI escape sequence into the plain-renderer's\n// stdout, corrupting subsequent terminal state for callers tailing\n// `--format plain` output.\nconst quoteIfNeeded = (s: string): string => (/[\\s\"\\x00-\\x1f]/.test(s) ? quote(s) : s);\n\nconst quote = (s: string): string => `\"${s.replace(/\"/g, '\\\\\"')}\"`;\n\n/**\n * Structural validate-then-narrow for `projection.updated` payloads\n * before they are formatted as text. Mirrors\n * `tryDecodeProjectionPayload` in the substrate reducer — returns\n * `null` on schema-decode failure so the renderer drops the slice\n * rather than printing fields off a malformed object. The substrate\n * reducer emits the `Effect.logWarning` for the same payload (the\n * decode is deterministic), so we stay silent here to avoid double\n * logging.\n */\nconst tryDecodeProjection = <S extends Schema.Decoder<unknown>>(\n\tschema: S,\n\tpayload: unknown,\n): S['Type'] | null => {\n\ttry {\n\t\treturn Schema.decodeUnknownSync(schema)(payload);\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n// -----------------------------------------------------------------------------\n// Internals — initial sweep\n// -----------------------------------------------------------------------------\n\nconst emitInitialSweep = (\n\tstate: SubscribableState,\n\toptions: { readonly quiet?: boolean } = {},\n): Effect.Effect<void> =>\n\tEffect.gen(function* () {\n\t\tyield* writeStderrLine(\n\t\t\t`${isoTimestamp(state.cycle.startedAt || Date.now())} INFO stack.identity app=${state.identity.app} stack=${state.identity.stack} network=${state.identity.network} cycle=${state.cycle.id}`,\n\t\t);\n\t\t// Quiet mode: stop after the identity line. The per-row/account/\n\t\t// endpoint/package sweep is all `<pending>` at boot; the real signal\n\t\t// arrives as readiness + endpoint events on the (filtered) stream.\n\t\tif (options.quiet) return;\n\t\tfor (const row of state.rows) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(Date.now())} INFO row.declared ${kv({\n\t\t\t\t\tkey: row.key,\n\t\t\t\t\tlabel: labelForRow(row.key),\n\t\t\t\t\trole: roleLabel(row.role),\n\t\t\t\t\tstatus: statusLabel(row.status),\n\t\t\t\t})}`,\n\t\t\t);\n\t\t}\n\t\tfor (const endpoint of state.endpoints) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(endpoint.registeredAt)} INFO endpoint.registered ${endpointLine(endpoint)}`,\n\t\t\t);\n\t\t}\n\t\tfor (const account of state.accounts) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(account.updatedAt)} INFO projection.updated[account] ${accountLine(account)}`,\n\t\t\t);\n\t\t}\n\t\tfor (const pkg of state.packages) {\n\t\t\tyield* writeStderrLine(\n\t\t\t\t`${isoTimestamp(pkg.updatedAt)} INFO projection.updated[package] ${packageLine(pkg)}`,\n\t\t\t);\n\t\t}\n\t});\n\n// -----------------------------------------------------------------------------\n// Internals — IO (pipe-safe)\n// -----------------------------------------------------------------------------\n\nconst writeStderrLine = (line: string): Effect.Effect<void> =>\n\tEffect.sync(() => {\n\t\ttry {\n\t\t\tprocess.stderr.write(`${line}\\n`);\n\t\t} catch (err) {\n\t\t\t// EPIPE swallowed (pipe-safety invariant); other errors\n\t\t\t// likewise swallowed because \"rendering never crashes the\n\t\t\t// stack\" (distilled/21-tui § Invariants).\n\t\t\tvoid err;\n\t\t}\n\t});\n"],"mappings":"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"}
|
|
@@ -436,8 +436,8 @@ const clip = (value, width) => {
|
|
|
436
436
|
};
|
|
437
437
|
const pluginTableLayout = (columns) => {
|
|
438
438
|
const gapCount = (showDetail) => showDetail ? 3 : 2;
|
|
439
|
-
const showDetail = columns >=
|
|
440
|
-
const fixedWidth =
|
|
439
|
+
const showDetail = columns >= 95 + gapCount(true);
|
|
440
|
+
const fixedWidth = 31 + (showDetail ? DETAIL_WIDTH : 0) + gapCount(showDetail);
|
|
441
441
|
const availableUrlWidth = Math.max(MIN_URL_WIDTH, columns - fixedWidth);
|
|
442
442
|
return {
|
|
443
443
|
showDetail,
|
|
@@ -445,28 +445,26 @@ const pluginTableLayout = (columns) => {
|
|
|
445
445
|
};
|
|
446
446
|
};
|
|
447
447
|
const accountTableLayout = (columns) => {
|
|
448
|
-
const fullWidth =
|
|
449
|
-
const midWidth =
|
|
448
|
+
const fullWidth = 183;
|
|
449
|
+
const midWidth = 114;
|
|
450
450
|
const showDetail = columns >= fullWidth;
|
|
451
451
|
const showMeta = columns >= midWidth;
|
|
452
452
|
const showFunding = columns >= midWidth;
|
|
453
|
-
const fixed = STATE_WIDTH + ACCOUNT_WIDTH + (showMeta ? SCHEME_WIDTH + SOURCE_WIDTH : 0) + (showFunding ? FUNDING_WIDTH : 0) + (showDetail ? DETAIL_WIDTH : 0) + (1 + (showMeta ? 2 : 0) + (showFunding ? 1 : 0) + (showDetail ? 1 : 0));
|
|
454
453
|
return {
|
|
455
454
|
showDetail,
|
|
456
455
|
showMeta,
|
|
457
456
|
showFunding,
|
|
458
|
-
addressWidth: Math.min(ADDRESS_WIDTH, Math.max(24, columns -
|
|
457
|
+
addressWidth: Math.min(ADDRESS_WIDTH, Math.max(24, columns - (27 + (showMeta ? 16 : 0) + (showFunding ? FUNDING_WIDTH : 0) + (showDetail ? DETAIL_WIDTH : 0) + (1 + (showMeta ? 2 : 0) + (showFunding ? 1 : 0) + (showDetail ? 1 : 0)))))
|
|
459
458
|
};
|
|
460
459
|
};
|
|
461
460
|
const packageTableLayout = (columns) => {
|
|
462
|
-
const showDetail = columns >=
|
|
463
|
-
const showMvr = columns >=
|
|
464
|
-
const fixed = STATE_WIDTH + PACKAGE_WIDTH + (showMvr ? MVR_WIDTH : 0) + (showDetail ? DETAIL_WIDTH : 0) + (1 + (showMvr ? 1 : 0) + (showDetail ? 1 : 0));
|
|
461
|
+
const showDetail = columns >= 163;
|
|
462
|
+
const showMvr = columns >= 74;
|
|
465
463
|
return {
|
|
466
464
|
showDetail,
|
|
467
465
|
showMvr,
|
|
468
466
|
mvrWidth: showDetail ? MVR_WIDTH : 20,
|
|
469
|
-
packageIdWidth: Math.min(PACKAGE_ID_WIDTH, Math.max(24, columns -
|
|
467
|
+
packageIdWidth: Math.min(PACKAGE_ID_WIDTH, Math.max(24, columns - (31 + (showMvr ? MVR_WIDTH : 0) + (showDetail ? DETAIL_WIDTH : 0) + (1 + (showMvr ? 1 : 0) + (showDetail ? 1 : 0)))))
|
|
470
468
|
};
|
|
471
469
|
};
|
|
472
470
|
const wrap = (value, width) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-table.mjs","names":[],"sources":["../../../src/surfaces/tui/resource-table.tsx"],"sourcesContent":["import { Box, Text, useWindowSize } from 'ink';\nimport type React from 'react';\n\nimport type {\n\tAccountProjection,\n\tEndpoint,\n\tPackageProjection,\n\tRow,\n} from '../../substrate/projection.ts';\nimport {\n\taccountCells,\n\tderiveDisplayCells,\n\tendpointLine,\n\tgroupRows,\n\tpackageCells,\n\tvisibleEndpointsForRow,\n\ttype ColorToken,\n\ttype DisplayRow,\n\ttype DisplaySection,\n} from './display-derivation.ts';\n\nexport interface ResourceTablesProps {\n\treadonly rows: ReadonlyArray<Row>;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly accounts: ReadonlyArray<AccountProjection>;\n\treadonly packages: ReadonlyArray<PackageProjection>;\n}\n\nconst STATE_WIDTH = 13;\nconst NAME_WIDTH = 18;\nconst MIN_URL_WIDTH = 32;\nconst MAX_URL_WIDTH = 96;\nconst DETAIL_WIDTH = 32;\nconst ACCOUNT_WIDTH = 14;\nconst ADDRESS_WIDTH = 68;\nconst SCHEME_WIDTH = 8;\nconst SOURCE_WIDTH = 8;\nconst FUNDING_WIDTH = 34;\nconst PACKAGE_WIDTH = 18;\nconst PACKAGE_ID_WIDTH = 68;\nconst MVR_WIDTH = 28;\n\ninterface PluginTableLayout {\n\treadonly urlWidth: number;\n\treadonly showDetail: boolean;\n}\n\ninterface AccountTableLayout {\n\treadonly addressWidth: number;\n\treadonly showMeta: boolean;\n\treadonly showFunding: boolean;\n\treadonly showDetail: boolean;\n}\n\ninterface PackageTableLayout {\n\treadonly packageIdWidth: number;\n\treadonly mvrWidth: number;\n\treadonly showMvr: boolean;\n\treadonly showDetail: boolean;\n}\n\nexport const ResourceTables = ({\n\trows,\n\tendpoints,\n\taccounts,\n\tpackages,\n}: ResourceTablesProps): React.JSX.Element => {\n\tconst { columns } = useWindowSize();\n\tconst pluginLayout = pluginTableLayout(columns);\n\tconst accountLayout = accountTableLayout(columns);\n\tconst packageLayout = packageTableLayout(columns);\n\tconst sections = groupRows(rows, endpoints);\n\tconst bySection = new Map(sections.map((section) => [section.key, section]));\n\tconst orderedSections = [\n\t\tbySection.get('service'),\n\t\tbySection.get('package'),\n\t\tbySection.get('account'),\n\t\tbySection.get('action'),\n\t\tbySection.get('app'),\n\t\tbySection.get('other'),\n\t].filter((section): section is DisplaySection => section !== undefined);\n\n\treturn (\n\t\t<Box flexDirection=\"column\">\n\t\t\t<Text bold>Stack</Text>\n\t\t\t{rows.length === 0 && accounts.length === 0 && packages.length === 0 && (\n\t\t\t\t<Text>no plugins declared</Text>\n\t\t\t)}\n\t\t\t{orderedSections.map((section) =>\n\t\t\t\tsection.key === 'account' ? (\n\t\t\t\t\t<AccountSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\taccounts={accounts}\n\t\t\t\t\t\tlayout={accountLayout}\n\t\t\t\t\t/>\n\t\t\t\t) : section.key === 'package' ? (\n\t\t\t\t\t<PackageSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\tpackages={packages}\n\t\t\t\t\t\tlayout={packageLayout}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<PluginSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\tendpoints={endpoints}\n\t\t\t\t\t\tlayout={pluginLayout}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t)}\n\t\t\t{bySection.has('account') ? null : accounts.length > 0 ? (\n\t\t\t\t<AccountSection section={undefined} accounts={accounts} layout={accountLayout} />\n\t\t\t) : null}\n\t\t\t{bySection.has('package') ? null : packages.length > 0 ? (\n\t\t\t\t<PackageSection section={undefined} packages={packages} layout={packageLayout} />\n\t\t\t) : null}\n\t\t</Box>\n\t);\n};\n\nconst PluginSection = ({\n\tsection,\n\tendpoints,\n\tlayout,\n}: {\n\treadonly section: DisplaySection;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly layout: PluginTableLayout;\n}): React.JSX.Element => (\n\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t<Text bold>{section.label}</Text>\n\t\t<Header\n\t\t\tcells={layout.showDetail ? ['STATE', 'NAME', 'URLS', 'DETAIL'] : ['STATE', 'NAME', 'URLS']}\n\t\t\twidths={\n\t\t\t\tlayout.showDetail\n\t\t\t\t\t? [STATE_WIDTH, NAME_WIDTH, layout.urlWidth, DETAIL_WIDTH]\n\t\t\t\t\t: [STATE_WIDTH, NAME_WIDTH, layout.urlWidth]\n\t\t\t}\n\t\t/>\n\t\t{section.rows.map((displayRow) => (\n\t\t\t<PluginRow\n\t\t\t\tkey={displayRow.row.key}\n\t\t\t\tdisplayRow={displayRow}\n\t\t\t\tendpoints={endpoints}\n\t\t\t\tlayout={layout}\n\t\t\t/>\n\t\t))}\n\t</Box>\n);\n\nconst PluginRow = ({\n\tdisplayRow,\n\tendpoints,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly layout: PluginTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row, endpoints);\n\tconst urlLines = visibleEndpointsForRow(displayRow.row, endpoints).map(endpointLine);\n\tconst detail = cells.errorSummary || cells.narration;\n\tconst detailLines = detail.length === 0 ? [] : [`detail: ${detail}`];\n\tconst compactUrlLines = [\n\t\t...(urlLines.length === 0 ? ['-'] : urlLines),\n\t\t...(layout.showDetail ? [] : detailLines),\n\t];\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={NAME_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{cells.label}\n\t\t\t</FixedText>\n\t\t\t<MultiLineFixedText\n\t\t\t\twidth={layout.urlWidth}\n\t\t\t\tcolor={urlLines.length === 0 ? 'white' : 'cyan'}\n\t\t\t\tlines={compactUrlLines}\n\t\t\t/>\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst AccountSection = ({\n\tsection,\n\taccounts,\n\tlayout,\n}: {\n\treadonly section: DisplaySection | undefined;\n\treadonly accounts: ReadonlyArray<AccountProjection>;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst rows = section?.rows ?? [];\n\tconst accountByRow = new Map(\n\t\taccounts\n\t\t\t.filter((account) => account.rowKey !== null)\n\t\t\t.map((account) => [account.rowKey as string, account]),\n\t);\n\tconst rowKeys = new Set(rows.map(({ row }) => row.key));\n\tconst unownedAccounts = accounts.filter(\n\t\t(account) => account.rowKey === null || !rowKeys.has(account.rowKey),\n\t);\n\n\treturn (\n\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t<Text bold>Accounts</Text>\n\t\t\t<Header\n\t\t\t\tcells={[\n\t\t\t\t\t'STATE',\n\t\t\t\t\t'ACCOUNT',\n\t\t\t\t\t'ADDRESS',\n\t\t\t\t\t...(layout.showMeta ? ['SCHEME', 'SOURCE'] : []),\n\t\t\t\t\t...(layout.showFunding ? ['FUNDING'] : []),\n\t\t\t\t\t...(layout.showDetail ? ['DETAIL'] : []),\n\t\t\t\t]}\n\t\t\t\twidths={[\n\t\t\t\t\tSTATE_WIDTH,\n\t\t\t\t\tACCOUNT_WIDTH,\n\t\t\t\t\tlayout.addressWidth,\n\t\t\t\t\t...(layout.showMeta ? [SCHEME_WIDTH, SOURCE_WIDTH] : []),\n\t\t\t\t\t...(layout.showFunding ? [FUNDING_WIDTH] : []),\n\t\t\t\t\t...(layout.showDetail ? [DETAIL_WIDTH] : []),\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t{rows.map((displayRow) => (\n\t\t\t\t<AccountRow\n\t\t\t\t\tkey={displayRow.row.key}\n\t\t\t\t\tdisplayRow={displayRow}\n\t\t\t\t\taccount={accountByRow.get(displayRow.row.key)}\n\t\t\t\t\tlayout={layout}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{unownedAccounts.map((account) => (\n\t\t\t\t<AccountRecordRow key={account.key} account={account} layout={layout} />\n\t\t\t))}\n\t\t</Box>\n\t);\n};\n\nconst PackageSection = ({\n\tsection,\n\tpackages,\n\tlayout,\n}: {\n\treadonly section: DisplaySection | undefined;\n\treadonly packages: ReadonlyArray<PackageProjection>;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst rows = section?.rows ?? [];\n\tconst packageByRow = new Map(\n\t\tpackages.filter((pkg) => pkg.rowKey !== null).map((pkg) => [pkg.rowKey as string, pkg]),\n\t);\n\tconst rowKeys = new Set(rows.map(({ row }) => row.key));\n\tconst unownedPackages = packages.filter((pkg) => pkg.rowKey === null || !rowKeys.has(pkg.rowKey));\n\n\treturn (\n\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t<Text bold>Packages</Text>\n\t\t\t<Header\n\t\t\t\tcells={[\n\t\t\t\t\t'STATE',\n\t\t\t\t\t'PACKAGE',\n\t\t\t\t\t'PACKAGE ID',\n\t\t\t\t\t...(layout.showMvr ? ['MVR'] : []),\n\t\t\t\t\t...(layout.showDetail ? ['DETAIL'] : []),\n\t\t\t\t]}\n\t\t\t\twidths={[\n\t\t\t\t\tSTATE_WIDTH,\n\t\t\t\t\tPACKAGE_WIDTH,\n\t\t\t\t\tlayout.packageIdWidth,\n\t\t\t\t\t...(layout.showMvr ? [layout.mvrWidth] : []),\n\t\t\t\t\t...(layout.showDetail ? [DETAIL_WIDTH] : []),\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t{rows.map((displayRow) => (\n\t\t\t\t<PackageRow\n\t\t\t\t\tkey={displayRow.row.key}\n\t\t\t\t\tdisplayRow={displayRow}\n\t\t\t\t\tpkg={packageByRow.get(displayRow.row.key)}\n\t\t\t\t\tlayout={layout}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{unownedPackages.map((pkg) => (\n\t\t\t\t<PackageRecordRow key={pkg.key} pkg={pkg} layout={layout} />\n\t\t\t))}\n\t\t</Box>\n\t);\n};\n\nconst AccountRow = ({\n\tdisplayRow,\n\taccount,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly account: AccountProjection | undefined;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row);\n\tconst facts =\n\t\taccount === undefined\n\t\t\t? {\n\t\t\t\t\tname: cells.label,\n\t\t\t\t\taddress: '<pending>',\n\t\t\t\t\tscheme: 'pending',\n\t\t\t\t\tsource: 'pending',\n\t\t\t\t\tfunding: 'funding pending',\n\t\t\t\t}\n\t\t\t: accountCells(account);\n\tconst detail = cells.errorSummary || cells.narration || '-';\n\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={ACCOUNT_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.addressWidth} color=\"white\">\n\t\t\t\t{facts.address}\n\t\t\t</FixedText>\n\t\t\t{layout.showMeta && (\n\t\t\t\t<>\n\t\t\t\t\t<FixedText width={SCHEME_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.scheme}\n\t\t\t\t\t</FixedText>\n\t\t\t\t\t<FixedText width={SOURCE_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.source}\n\t\t\t\t\t</FixedText>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{layout.showFunding && (\n\t\t\t\t<FixedText width={FUNDING_WIDTH} color=\"white\">\n\t\t\t\t\t{facts.funding}\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst PackageRow = ({\n\tdisplayRow,\n\tpkg,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly pkg: PackageProjection | undefined;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row);\n\tconst facts =\n\t\tpkg === undefined\n\t\t\t? {\n\t\t\t\t\tname: cells.label,\n\t\t\t\t\tpackageId: '<pending>',\n\t\t\t\t\tmvr: 'pending',\n\t\t\t\t\tdetail: cells.errorSummary || cells.narration || 'publish pending',\n\t\t\t\t}\n\t\t\t: packageCells(pkg);\n\tconst detail = cells.errorSummary || cells.narration || facts.detail || '-';\n\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={PACKAGE_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.packageIdWidth} color=\"white\">\n\t\t\t\t{facts.packageId}\n\t\t\t</FixedText>\n\t\t\t{layout.showMvr && (\n\t\t\t\t<MultiLineFixedText width={layout.mvrWidth} color=\"white\" lines={[facts.mvr]} />\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst AccountRecordRow = ({\n\taccount,\n\tlayout,\n}: {\n\treadonly account: AccountProjection;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst facts = accountCells(account);\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<FixedText width={STATE_WIDTH} color=\"white\">\n\t\t\t\trecord\n\t\t\t</FixedText>\n\t\t\t<FixedText width={ACCOUNT_WIDTH} color=\"magenta\" bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.addressWidth} color=\"white\">\n\t\t\t\t{facts.address}\n\t\t\t</FixedText>\n\t\t\t{layout.showMeta && (\n\t\t\t\t<>\n\t\t\t\t\t<FixedText width={SCHEME_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.scheme}\n\t\t\t\t\t</FixedText>\n\t\t\t\t\t<FixedText width={SOURCE_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.source}\n\t\t\t\t\t</FixedText>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{layout.showFunding && (\n\t\t\t\t<FixedText width={FUNDING_WIDTH} color=\"white\">\n\t\t\t\t\t{facts.funding}\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<FixedText width={DETAIL_WIDTH} color=\"white\">\n\t\t\t\t\t-\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst PackageRecordRow = ({\n\tpkg,\n\tlayout,\n}: {\n\treadonly pkg: PackageProjection;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst facts = packageCells(pkg);\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<FixedText width={STATE_WIDTH} color=\"white\">\n\t\t\t\trecord\n\t\t\t</FixedText>\n\t\t\t<FixedText width={PACKAGE_WIDTH} color=\"magenta\" bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.packageIdWidth} color=\"white\">\n\t\t\t\t{facts.packageId}\n\t\t\t</FixedText>\n\t\t\t{layout.showMvr && (\n\t\t\t\t<MultiLineFixedText width={layout.mvrWidth} color=\"white\" lines={[facts.mvr]} />\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText width={DETAIL_WIDTH} color=\"white\" lines={[facts.detail]} />\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst StateCell = ({\n\tglyph,\n\tlabel,\n\tcolor,\n}: {\n\treadonly glyph: string;\n\treadonly label: string;\n\treadonly color: ColorToken;\n}): React.JSX.Element => (\n\t<FixedText width={STATE_WIDTH} color={color}>\n\t\t{`${glyph} ${label}`}\n\t</FixedText>\n);\n\nconst Header = ({\n\tcells,\n\twidths,\n}: {\n\treadonly cells: ReadonlyArray<string>;\n\treadonly widths: ReadonlyArray<number>;\n}): React.JSX.Element => (\n\t<Box flexDirection=\"row\" gap={1}>\n\t\t{cells.map((cell, index) =>\n\t\t\twidths[index] === 0 ? (\n\t\t\t\t<Text key={`${index}:${cell}`} bold>\n\t\t\t\t\t{cell}\n\t\t\t\t</Text>\n\t\t\t) : (\n\t\t\t\t<FixedText key={`${index}:${cell}`} width={widths[index] ?? 0} color=\"white\" bold>\n\t\t\t\t\t{cell}\n\t\t\t\t</FixedText>\n\t\t\t),\n\t\t)}\n\t</Box>\n);\n\nconst FixedText = ({\n\twidth,\n\tcolor,\n\tbold = false,\n\tchildren,\n}: {\n\treadonly width: number;\n\treadonly color: ColorToken;\n\treadonly bold?: boolean;\n\treadonly children: string;\n}): React.JSX.Element => (\n\t<Box width={width} flexShrink={0}>\n\t\t<Text color={color} bold={bold}>\n\t\t\t{clip(children, width)}\n\t\t</Text>\n\t</Box>\n);\n\nconst MultiLineFixedText = ({\n\twidth,\n\tcolor,\n\tlines,\n}: {\n\treadonly width: number;\n\treadonly color: ColorToken;\n\treadonly lines: ReadonlyArray<string>;\n}): React.JSX.Element => (\n\t<Box width={width} flexShrink={0} flexDirection=\"column\">\n\t\t{lines\n\t\t\t.flatMap((line) => wrap(line, width))\n\t\t\t.map((line, index) => (\n\t\t\t\t<Text key={`${index}:${line}`} color={color} wrap=\"truncate-end\">\n\t\t\t\t\t{line}\n\t\t\t\t</Text>\n\t\t\t))}\n\t</Box>\n);\n\nconst clip = (value: string, width: number): string => {\n\tif (width <= 0 || value.length <= width) return value;\n\tif (width <= 1) return value.slice(0, width);\n\treturn `${value.slice(0, width - 1)}…`;\n};\n\nconst pluginTableLayout = (columns: number): PluginTableLayout => {\n\tconst gapCount = (showDetail: boolean): number => (showDetail ? 3 : 2);\n\tconst detailBudget = STATE_WIDTH + NAME_WIDTH + DETAIL_WIDTH + MIN_URL_WIDTH + gapCount(true);\n\tconst showDetail = columns >= detailBudget;\n\tconst fixedWidth =\n\t\tSTATE_WIDTH + NAME_WIDTH + (showDetail ? DETAIL_WIDTH : 0) + gapCount(showDetail);\n\tconst availableUrlWidth = Math.max(MIN_URL_WIDTH, columns - fixedWidth);\n\treturn {\n\t\tshowDetail,\n\t\turlWidth: Math.min(MAX_URL_WIDTH, availableUrlWidth),\n\t};\n};\n\nconst accountTableLayout = (columns: number): AccountTableLayout => {\n\tconst fullWidth =\n\t\tSTATE_WIDTH +\n\t\tACCOUNT_WIDTH +\n\t\tADDRESS_WIDTH +\n\t\tSCHEME_WIDTH +\n\t\tSOURCE_WIDTH +\n\t\tFUNDING_WIDTH +\n\t\tDETAIL_WIDTH +\n\t\t6;\n\tconst midWidth =\n\t\tSTATE_WIDTH + ACCOUNT_WIDTH + 32 + SCHEME_WIDTH + SOURCE_WIDTH + FUNDING_WIDTH + 5;\n\tconst showDetail = columns >= fullWidth;\n\tconst showMeta = columns >= midWidth;\n\tconst showFunding = columns >= midWidth;\n\tconst fixed =\n\t\tSTATE_WIDTH +\n\t\tACCOUNT_WIDTH +\n\t\t(showMeta ? SCHEME_WIDTH + SOURCE_WIDTH : 0) +\n\t\t(showFunding ? FUNDING_WIDTH : 0) +\n\t\t(showDetail ? DETAIL_WIDTH : 0) +\n\t\t(1 + (showMeta ? 2 : 0) + (showFunding ? 1 : 0) + (showDetail ? 1 : 0));\n\treturn {\n\t\tshowDetail,\n\t\tshowMeta,\n\t\tshowFunding,\n\t\taddressWidth: Math.min(ADDRESS_WIDTH, Math.max(24, columns - fixed)),\n\t};\n};\n\nconst packageTableLayout = (columns: number): PackageTableLayout => {\n\tconst fullWidth = STATE_WIDTH + PACKAGE_WIDTH + PACKAGE_ID_WIDTH + MVR_WIDTH + DETAIL_WIDTH + 4;\n\tconst showDetail = columns >= fullWidth;\n\tconst showMvr = columns >= STATE_WIDTH + PACKAGE_WIDTH + 24 + 16 + 3;\n\tconst fixed =\n\t\tSTATE_WIDTH +\n\t\tPACKAGE_WIDTH +\n\t\t(showMvr ? MVR_WIDTH : 0) +\n\t\t(showDetail ? DETAIL_WIDTH : 0) +\n\t\t(1 + (showMvr ? 1 : 0) + (showDetail ? 1 : 0));\n\treturn {\n\t\tshowDetail,\n\t\tshowMvr,\n\t\tmvrWidth: showDetail ? MVR_WIDTH : 20,\n\t\tpackageIdWidth: Math.min(PACKAGE_ID_WIDTH, Math.max(24, columns - fixed)),\n\t};\n};\n\nconst wrap = (value: string, width: number): ReadonlyArray<string> => {\n\tconst limit = Math.max(1, width - 1);\n\tif (width <= 0 || value.length <= limit) return [value];\n\tconst lines: Array<string> = [];\n\tlet rest = value;\n\twhile (rest.length > limit) {\n\t\tconst idx = wrapIndex(rest, limit);\n\t\tlines.push(rest.slice(0, idx).trimEnd());\n\t\trest = rest.slice(idx).trimStart();\n\t}\n\tif (rest.length > 0) lines.push(rest);\n\treturn lines;\n};\n\nconst wrapIndex = (value: string, width: number): number => {\n\tconst window = value.slice(0, width + 1);\n\tconst candidates = [' -> ', ' | ', ' '];\n\tlet bestIndex = -1;\n\tlet bestLength = 0;\n\tfor (const candidate of candidates) {\n\t\tconst idx = window.lastIndexOf(candidate);\n\t\tif (idx > bestIndex) {\n\t\t\tbestIndex = idx;\n\t\t\tbestLength = candidate.length;\n\t\t}\n\t}\n\tif (bestIndex > 0) return bestIndex + bestLength;\n\treturn width;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resource-table.mjs","names":[],"sources":["../../../src/surfaces/tui/resource-table.tsx"],"sourcesContent":["import { Box, Text, useWindowSize } from 'ink';\nimport type React from 'react';\n\nimport type {\n\tAccountProjection,\n\tEndpoint,\n\tPackageProjection,\n\tRow,\n} from '../../substrate/projection.ts';\nimport {\n\taccountCells,\n\tderiveDisplayCells,\n\tendpointLine,\n\tgroupRows,\n\tpackageCells,\n\tvisibleEndpointsForRow,\n\ttype ColorToken,\n\ttype DisplayRow,\n\ttype DisplaySection,\n} from './display-derivation.ts';\n\nexport interface ResourceTablesProps {\n\treadonly rows: ReadonlyArray<Row>;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly accounts: ReadonlyArray<AccountProjection>;\n\treadonly packages: ReadonlyArray<PackageProjection>;\n}\n\nconst STATE_WIDTH = 13;\nconst NAME_WIDTH = 18;\nconst MIN_URL_WIDTH = 32;\nconst MAX_URL_WIDTH = 96;\nconst DETAIL_WIDTH = 32;\nconst ACCOUNT_WIDTH = 14;\nconst ADDRESS_WIDTH = 68;\nconst SCHEME_WIDTH = 8;\nconst SOURCE_WIDTH = 8;\nconst FUNDING_WIDTH = 34;\nconst PACKAGE_WIDTH = 18;\nconst PACKAGE_ID_WIDTH = 68;\nconst MVR_WIDTH = 28;\n\ninterface PluginTableLayout {\n\treadonly urlWidth: number;\n\treadonly showDetail: boolean;\n}\n\ninterface AccountTableLayout {\n\treadonly addressWidth: number;\n\treadonly showMeta: boolean;\n\treadonly showFunding: boolean;\n\treadonly showDetail: boolean;\n}\n\ninterface PackageTableLayout {\n\treadonly packageIdWidth: number;\n\treadonly mvrWidth: number;\n\treadonly showMvr: boolean;\n\treadonly showDetail: boolean;\n}\n\nexport const ResourceTables = ({\n\trows,\n\tendpoints,\n\taccounts,\n\tpackages,\n}: ResourceTablesProps): React.JSX.Element => {\n\tconst { columns } = useWindowSize();\n\tconst pluginLayout = pluginTableLayout(columns);\n\tconst accountLayout = accountTableLayout(columns);\n\tconst packageLayout = packageTableLayout(columns);\n\tconst sections = groupRows(rows, endpoints);\n\tconst bySection = new Map(sections.map((section) => [section.key, section]));\n\tconst orderedSections = [\n\t\tbySection.get('service'),\n\t\tbySection.get('package'),\n\t\tbySection.get('account'),\n\t\tbySection.get('action'),\n\t\tbySection.get('app'),\n\t\tbySection.get('other'),\n\t].filter((section): section is DisplaySection => section !== undefined);\n\n\treturn (\n\t\t<Box flexDirection=\"column\">\n\t\t\t<Text bold>Stack</Text>\n\t\t\t{rows.length === 0 && accounts.length === 0 && packages.length === 0 && (\n\t\t\t\t<Text>no plugins declared</Text>\n\t\t\t)}\n\t\t\t{orderedSections.map((section) =>\n\t\t\t\tsection.key === 'account' ? (\n\t\t\t\t\t<AccountSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\taccounts={accounts}\n\t\t\t\t\t\tlayout={accountLayout}\n\t\t\t\t\t/>\n\t\t\t\t) : section.key === 'package' ? (\n\t\t\t\t\t<PackageSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\tpackages={packages}\n\t\t\t\t\t\tlayout={packageLayout}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<PluginSection\n\t\t\t\t\t\tkey={section.key}\n\t\t\t\t\t\tsection={section}\n\t\t\t\t\t\tendpoints={endpoints}\n\t\t\t\t\t\tlayout={pluginLayout}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t)}\n\t\t\t{bySection.has('account') ? null : accounts.length > 0 ? (\n\t\t\t\t<AccountSection section={undefined} accounts={accounts} layout={accountLayout} />\n\t\t\t) : null}\n\t\t\t{bySection.has('package') ? null : packages.length > 0 ? (\n\t\t\t\t<PackageSection section={undefined} packages={packages} layout={packageLayout} />\n\t\t\t) : null}\n\t\t</Box>\n\t);\n};\n\nconst PluginSection = ({\n\tsection,\n\tendpoints,\n\tlayout,\n}: {\n\treadonly section: DisplaySection;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly layout: PluginTableLayout;\n}): React.JSX.Element => (\n\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t<Text bold>{section.label}</Text>\n\t\t<Header\n\t\t\tcells={layout.showDetail ? ['STATE', 'NAME', 'URLS', 'DETAIL'] : ['STATE', 'NAME', 'URLS']}\n\t\t\twidths={\n\t\t\t\tlayout.showDetail\n\t\t\t\t\t? [STATE_WIDTH, NAME_WIDTH, layout.urlWidth, DETAIL_WIDTH]\n\t\t\t\t\t: [STATE_WIDTH, NAME_WIDTH, layout.urlWidth]\n\t\t\t}\n\t\t/>\n\t\t{section.rows.map((displayRow) => (\n\t\t\t<PluginRow\n\t\t\t\tkey={displayRow.row.key}\n\t\t\t\tdisplayRow={displayRow}\n\t\t\t\tendpoints={endpoints}\n\t\t\t\tlayout={layout}\n\t\t\t/>\n\t\t))}\n\t</Box>\n);\n\nconst PluginRow = ({\n\tdisplayRow,\n\tendpoints,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly endpoints: ReadonlyArray<Endpoint>;\n\treadonly layout: PluginTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row, endpoints);\n\tconst urlLines = visibleEndpointsForRow(displayRow.row, endpoints).map(endpointLine);\n\tconst detail = cells.errorSummary || cells.narration;\n\tconst detailLines = detail.length === 0 ? [] : [`detail: ${detail}`];\n\tconst compactUrlLines = [\n\t\t...(urlLines.length === 0 ? ['-'] : urlLines),\n\t\t...(layout.showDetail ? [] : detailLines),\n\t];\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={NAME_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{cells.label}\n\t\t\t</FixedText>\n\t\t\t<MultiLineFixedText\n\t\t\t\twidth={layout.urlWidth}\n\t\t\t\tcolor={urlLines.length === 0 ? 'white' : 'cyan'}\n\t\t\t\tlines={compactUrlLines}\n\t\t\t/>\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst AccountSection = ({\n\tsection,\n\taccounts,\n\tlayout,\n}: {\n\treadonly section: DisplaySection | undefined;\n\treadonly accounts: ReadonlyArray<AccountProjection>;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst rows = section?.rows ?? [];\n\tconst accountByRow = new Map(\n\t\taccounts\n\t\t\t.filter((account) => account.rowKey !== null)\n\t\t\t.map((account) => [account.rowKey as string, account]),\n\t);\n\tconst rowKeys = new Set(rows.map(({ row }) => row.key));\n\tconst unownedAccounts = accounts.filter(\n\t\t(account) => account.rowKey === null || !rowKeys.has(account.rowKey),\n\t);\n\n\treturn (\n\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t<Text bold>Accounts</Text>\n\t\t\t<Header\n\t\t\t\tcells={[\n\t\t\t\t\t'STATE',\n\t\t\t\t\t'ACCOUNT',\n\t\t\t\t\t'ADDRESS',\n\t\t\t\t\t...(layout.showMeta ? ['SCHEME', 'SOURCE'] : []),\n\t\t\t\t\t...(layout.showFunding ? ['FUNDING'] : []),\n\t\t\t\t\t...(layout.showDetail ? ['DETAIL'] : []),\n\t\t\t\t]}\n\t\t\t\twidths={[\n\t\t\t\t\tSTATE_WIDTH,\n\t\t\t\t\tACCOUNT_WIDTH,\n\t\t\t\t\tlayout.addressWidth,\n\t\t\t\t\t...(layout.showMeta ? [SCHEME_WIDTH, SOURCE_WIDTH] : []),\n\t\t\t\t\t...(layout.showFunding ? [FUNDING_WIDTH] : []),\n\t\t\t\t\t...(layout.showDetail ? [DETAIL_WIDTH] : []),\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t{rows.map((displayRow) => (\n\t\t\t\t<AccountRow\n\t\t\t\t\tkey={displayRow.row.key}\n\t\t\t\t\tdisplayRow={displayRow}\n\t\t\t\t\taccount={accountByRow.get(displayRow.row.key)}\n\t\t\t\t\tlayout={layout}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{unownedAccounts.map((account) => (\n\t\t\t\t<AccountRecordRow key={account.key} account={account} layout={layout} />\n\t\t\t))}\n\t\t</Box>\n\t);\n};\n\nconst PackageSection = ({\n\tsection,\n\tpackages,\n\tlayout,\n}: {\n\treadonly section: DisplaySection | undefined;\n\treadonly packages: ReadonlyArray<PackageProjection>;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst rows = section?.rows ?? [];\n\tconst packageByRow = new Map(\n\t\tpackages.filter((pkg) => pkg.rowKey !== null).map((pkg) => [pkg.rowKey as string, pkg]),\n\t);\n\tconst rowKeys = new Set(rows.map(({ row }) => row.key));\n\tconst unownedPackages = packages.filter((pkg) => pkg.rowKey === null || !rowKeys.has(pkg.rowKey));\n\n\treturn (\n\t\t<Box flexDirection=\"column\" marginTop={1}>\n\t\t\t<Text bold>Packages</Text>\n\t\t\t<Header\n\t\t\t\tcells={[\n\t\t\t\t\t'STATE',\n\t\t\t\t\t'PACKAGE',\n\t\t\t\t\t'PACKAGE ID',\n\t\t\t\t\t...(layout.showMvr ? ['MVR'] : []),\n\t\t\t\t\t...(layout.showDetail ? ['DETAIL'] : []),\n\t\t\t\t]}\n\t\t\t\twidths={[\n\t\t\t\t\tSTATE_WIDTH,\n\t\t\t\t\tPACKAGE_WIDTH,\n\t\t\t\t\tlayout.packageIdWidth,\n\t\t\t\t\t...(layout.showMvr ? [layout.mvrWidth] : []),\n\t\t\t\t\t...(layout.showDetail ? [DETAIL_WIDTH] : []),\n\t\t\t\t]}\n\t\t\t/>\n\t\t\t{rows.map((displayRow) => (\n\t\t\t\t<PackageRow\n\t\t\t\t\tkey={displayRow.row.key}\n\t\t\t\t\tdisplayRow={displayRow}\n\t\t\t\t\tpkg={packageByRow.get(displayRow.row.key)}\n\t\t\t\t\tlayout={layout}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{unownedPackages.map((pkg) => (\n\t\t\t\t<PackageRecordRow key={pkg.key} pkg={pkg} layout={layout} />\n\t\t\t))}\n\t\t</Box>\n\t);\n};\n\nconst AccountRow = ({\n\tdisplayRow,\n\taccount,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly account: AccountProjection | undefined;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row);\n\tconst facts =\n\t\taccount === undefined\n\t\t\t? {\n\t\t\t\t\tname: cells.label,\n\t\t\t\t\taddress: '<pending>',\n\t\t\t\t\tscheme: 'pending',\n\t\t\t\t\tsource: 'pending',\n\t\t\t\t\tfunding: 'funding pending',\n\t\t\t\t}\n\t\t\t: accountCells(account);\n\tconst detail = cells.errorSummary || cells.narration || '-';\n\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={ACCOUNT_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.addressWidth} color=\"white\">\n\t\t\t\t{facts.address}\n\t\t\t</FixedText>\n\t\t\t{layout.showMeta && (\n\t\t\t\t<>\n\t\t\t\t\t<FixedText width={SCHEME_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.scheme}\n\t\t\t\t\t</FixedText>\n\t\t\t\t\t<FixedText width={SOURCE_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.source}\n\t\t\t\t\t</FixedText>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{layout.showFunding && (\n\t\t\t\t<FixedText width={FUNDING_WIDTH} color=\"white\">\n\t\t\t\t\t{facts.funding}\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst PackageRow = ({\n\tdisplayRow,\n\tpkg,\n\tlayout,\n}: {\n\treadonly displayRow: DisplayRow;\n\treadonly pkg: PackageProjection | undefined;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst cells = deriveDisplayCells(displayRow.row);\n\tconst facts =\n\t\tpkg === undefined\n\t\t\t? {\n\t\t\t\t\tname: cells.label,\n\t\t\t\t\tpackageId: '<pending>',\n\t\t\t\t\tmvr: 'pending',\n\t\t\t\t\tdetail: cells.errorSummary || cells.narration || 'publish pending',\n\t\t\t\t}\n\t\t\t: packageCells(pkg);\n\tconst detail = cells.errorSummary || cells.narration || facts.detail || '-';\n\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<StateCell glyph={cells.statusGlyph} label={cells.statusLabel} color={cells.statusColor} />\n\t\t\t<FixedText width={PACKAGE_WIDTH} color={cells.labelColor} bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.packageIdWidth} color=\"white\">\n\t\t\t\t{facts.packageId}\n\t\t\t</FixedText>\n\t\t\t{layout.showMvr && (\n\t\t\t\t<MultiLineFixedText width={layout.mvrWidth} color=\"white\" lines={[facts.mvr]} />\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText\n\t\t\t\t\twidth={DETAIL_WIDTH}\n\t\t\t\t\tcolor={cells.errorSummary ? 'red' : 'white'}\n\t\t\t\t\tlines={[detail]}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst AccountRecordRow = ({\n\taccount,\n\tlayout,\n}: {\n\treadonly account: AccountProjection;\n\treadonly layout: AccountTableLayout;\n}): React.JSX.Element => {\n\tconst facts = accountCells(account);\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<FixedText width={STATE_WIDTH} color=\"white\">\n\t\t\t\trecord\n\t\t\t</FixedText>\n\t\t\t<FixedText width={ACCOUNT_WIDTH} color=\"magenta\" bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.addressWidth} color=\"white\">\n\t\t\t\t{facts.address}\n\t\t\t</FixedText>\n\t\t\t{layout.showMeta && (\n\t\t\t\t<>\n\t\t\t\t\t<FixedText width={SCHEME_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.scheme}\n\t\t\t\t\t</FixedText>\n\t\t\t\t\t<FixedText width={SOURCE_WIDTH} color=\"white\">\n\t\t\t\t\t\t{facts.source}\n\t\t\t\t\t</FixedText>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{layout.showFunding && (\n\t\t\t\t<FixedText width={FUNDING_WIDTH} color=\"white\">\n\t\t\t\t\t{facts.funding}\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<FixedText width={DETAIL_WIDTH} color=\"white\">\n\t\t\t\t\t-\n\t\t\t\t</FixedText>\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst PackageRecordRow = ({\n\tpkg,\n\tlayout,\n}: {\n\treadonly pkg: PackageProjection;\n\treadonly layout: PackageTableLayout;\n}): React.JSX.Element => {\n\tconst facts = packageCells(pkg);\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1}>\n\t\t\t<FixedText width={STATE_WIDTH} color=\"white\">\n\t\t\t\trecord\n\t\t\t</FixedText>\n\t\t\t<FixedText width={PACKAGE_WIDTH} color=\"magenta\" bold>\n\t\t\t\t{facts.name}\n\t\t\t</FixedText>\n\t\t\t<FixedText width={layout.packageIdWidth} color=\"white\">\n\t\t\t\t{facts.packageId}\n\t\t\t</FixedText>\n\t\t\t{layout.showMvr && (\n\t\t\t\t<MultiLineFixedText width={layout.mvrWidth} color=\"white\" lines={[facts.mvr]} />\n\t\t\t)}\n\t\t\t{layout.showDetail && (\n\t\t\t\t<MultiLineFixedText width={DETAIL_WIDTH} color=\"white\" lines={[facts.detail]} />\n\t\t\t)}\n\t\t</Box>\n\t);\n};\n\nconst StateCell = ({\n\tglyph,\n\tlabel,\n\tcolor,\n}: {\n\treadonly glyph: string;\n\treadonly label: string;\n\treadonly color: ColorToken;\n}): React.JSX.Element => (\n\t<FixedText width={STATE_WIDTH} color={color}>\n\t\t{`${glyph} ${label}`}\n\t</FixedText>\n);\n\nconst Header = ({\n\tcells,\n\twidths,\n}: {\n\treadonly cells: ReadonlyArray<string>;\n\treadonly widths: ReadonlyArray<number>;\n}): React.JSX.Element => (\n\t<Box flexDirection=\"row\" gap={1}>\n\t\t{cells.map((cell, index) =>\n\t\t\twidths[index] === 0 ? (\n\t\t\t\t<Text key={`${index}:${cell}`} bold>\n\t\t\t\t\t{cell}\n\t\t\t\t</Text>\n\t\t\t) : (\n\t\t\t\t<FixedText key={`${index}:${cell}`} width={widths[index] ?? 0} color=\"white\" bold>\n\t\t\t\t\t{cell}\n\t\t\t\t</FixedText>\n\t\t\t),\n\t\t)}\n\t</Box>\n);\n\nconst FixedText = ({\n\twidth,\n\tcolor,\n\tbold = false,\n\tchildren,\n}: {\n\treadonly width: number;\n\treadonly color: ColorToken;\n\treadonly bold?: boolean;\n\treadonly children: string;\n}): React.JSX.Element => (\n\t<Box width={width} flexShrink={0}>\n\t\t<Text color={color} bold={bold}>\n\t\t\t{clip(children, width)}\n\t\t</Text>\n\t</Box>\n);\n\nconst MultiLineFixedText = ({\n\twidth,\n\tcolor,\n\tlines,\n}: {\n\treadonly width: number;\n\treadonly color: ColorToken;\n\treadonly lines: ReadonlyArray<string>;\n}): React.JSX.Element => (\n\t<Box width={width} flexShrink={0} flexDirection=\"column\">\n\t\t{lines\n\t\t\t.flatMap((line) => wrap(line, width))\n\t\t\t.map((line, index) => (\n\t\t\t\t<Text key={`${index}:${line}`} color={color} wrap=\"truncate-end\">\n\t\t\t\t\t{line}\n\t\t\t\t</Text>\n\t\t\t))}\n\t</Box>\n);\n\nconst clip = (value: string, width: number): string => {\n\tif (width <= 0 || value.length <= width) return value;\n\tif (width <= 1) return value.slice(0, width);\n\treturn `${value.slice(0, width - 1)}…`;\n};\n\nconst pluginTableLayout = (columns: number): PluginTableLayout => {\n\tconst gapCount = (showDetail: boolean): number => (showDetail ? 3 : 2);\n\tconst detailBudget = STATE_WIDTH + NAME_WIDTH + DETAIL_WIDTH + MIN_URL_WIDTH + gapCount(true);\n\tconst showDetail = columns >= detailBudget;\n\tconst fixedWidth =\n\t\tSTATE_WIDTH + NAME_WIDTH + (showDetail ? DETAIL_WIDTH : 0) + gapCount(showDetail);\n\tconst availableUrlWidth = Math.max(MIN_URL_WIDTH, columns - fixedWidth);\n\treturn {\n\t\tshowDetail,\n\t\turlWidth: Math.min(MAX_URL_WIDTH, availableUrlWidth),\n\t};\n};\n\nconst accountTableLayout = (columns: number): AccountTableLayout => {\n\tconst fullWidth =\n\t\tSTATE_WIDTH +\n\t\tACCOUNT_WIDTH +\n\t\tADDRESS_WIDTH +\n\t\tSCHEME_WIDTH +\n\t\tSOURCE_WIDTH +\n\t\tFUNDING_WIDTH +\n\t\tDETAIL_WIDTH +\n\t\t6;\n\tconst midWidth =\n\t\tSTATE_WIDTH + ACCOUNT_WIDTH + 32 + SCHEME_WIDTH + SOURCE_WIDTH + FUNDING_WIDTH + 5;\n\tconst showDetail = columns >= fullWidth;\n\tconst showMeta = columns >= midWidth;\n\tconst showFunding = columns >= midWidth;\n\tconst fixed =\n\t\tSTATE_WIDTH +\n\t\tACCOUNT_WIDTH +\n\t\t(showMeta ? SCHEME_WIDTH + SOURCE_WIDTH : 0) +\n\t\t(showFunding ? FUNDING_WIDTH : 0) +\n\t\t(showDetail ? DETAIL_WIDTH : 0) +\n\t\t(1 + (showMeta ? 2 : 0) + (showFunding ? 1 : 0) + (showDetail ? 1 : 0));\n\treturn {\n\t\tshowDetail,\n\t\tshowMeta,\n\t\tshowFunding,\n\t\taddressWidth: Math.min(ADDRESS_WIDTH, Math.max(24, columns - fixed)),\n\t};\n};\n\nconst packageTableLayout = (columns: number): PackageTableLayout => {\n\tconst fullWidth = STATE_WIDTH + PACKAGE_WIDTH + PACKAGE_ID_WIDTH + MVR_WIDTH + DETAIL_WIDTH + 4;\n\tconst showDetail = columns >= fullWidth;\n\tconst showMvr = columns >= STATE_WIDTH + PACKAGE_WIDTH + 24 + 16 + 3;\n\tconst fixed =\n\t\tSTATE_WIDTH +\n\t\tPACKAGE_WIDTH +\n\t\t(showMvr ? MVR_WIDTH : 0) +\n\t\t(showDetail ? DETAIL_WIDTH : 0) +\n\t\t(1 + (showMvr ? 1 : 0) + (showDetail ? 1 : 0));\n\treturn {\n\t\tshowDetail,\n\t\tshowMvr,\n\t\tmvrWidth: showDetail ? MVR_WIDTH : 20,\n\t\tpackageIdWidth: Math.min(PACKAGE_ID_WIDTH, Math.max(24, columns - fixed)),\n\t};\n};\n\nconst wrap = (value: string, width: number): ReadonlyArray<string> => {\n\tconst limit = Math.max(1, width - 1);\n\tif (width <= 0 || value.length <= limit) return [value];\n\tconst lines: Array<string> = [];\n\tlet rest = value;\n\twhile (rest.length > limit) {\n\t\tconst idx = wrapIndex(rest, limit);\n\t\tlines.push(rest.slice(0, idx).trimEnd());\n\t\trest = rest.slice(idx).trimStart();\n\t}\n\tif (rest.length > 0) lines.push(rest);\n\treturn lines;\n};\n\nconst wrapIndex = (value: string, width: number): number => {\n\tconst window = value.slice(0, width + 1);\n\tconst candidates = [' -> ', ' | ', ' '];\n\tlet bestIndex = -1;\n\tlet bestLength = 0;\n\tfor (const candidate of candidates) {\n\t\tconst idx = window.lastIndexOf(candidate);\n\t\tif (idx > bestIndex) {\n\t\t\tbestIndex = idx;\n\t\t\tbestLength = candidate.length;\n\t\t}\n\t}\n\tif (bestIndex > 0) return bestIndex + bestLength;\n\treturn width;\n};\n"],"mappings":"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"}
|
package/images/sui/Dockerfile
CHANGED
|
@@ -2,72 +2,45 @@
|
|
|
2
2
|
# Dockerfile fed to `ContainerRuntime.ensureImage` (content-addressed
|
|
3
3
|
# builds — same Dockerfile + build args produce the same image digest).
|
|
4
4
|
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
# instead so the resulting image runs natively on the host.
|
|
10
|
-
#
|
|
11
|
-
# `ubuntu:24.04` — the Sui release tarballs are linked against
|
|
12
|
-
# glibc 2.38+; debian:bookworm (glibc 2.36) fails at runtime with a
|
|
13
|
-
# GLIBC_2.38-missing error.
|
|
14
|
-
|
|
15
|
-
FROM ubuntu:24.04
|
|
5
|
+
# Base: `mysten/sui-tools` pinned per-arch (the tag is NOT a multi-arch
|
|
6
|
+
# manifest list, so the caller appends `-arm64` on Apple Silicon — see
|
|
7
|
+
# `suiCliImageBuildContext` in src/plugins/sui/move/index.ts). The image
|
|
8
|
+
# bundles `sui`/`sui-faucet`/`sui-tool`/`git`/`libpq`.
|
|
16
9
|
|
|
17
|
-
ARG
|
|
18
|
-
|
|
10
|
+
ARG SUI_TOOLS_IMAGE
|
|
11
|
+
FROM ${SUI_TOOLS_IMAGE}
|
|
19
12
|
|
|
13
|
+
# `gawk` — the in-container Move.lock scrub uses `gawk -i inplace` (the
|
|
14
|
+
# `-i` inplace mode is gawk-only; mawk doesn't support it). sui-tools
|
|
15
|
+
# ships `git` (Move's dep resolver runs `git fetch`) but not gawk.
|
|
20
16
|
RUN apt-get update \
|
|
21
|
-
&& apt-get install -y --no-install-recommends \
|
|
22
|
-
ca-certificates curl gawk git postgresql \
|
|
23
|
-
&& PG_BIN_DIR="$(dirname "$(find /usr/lib/postgresql -name initdb -type f | sort | tail -n 1)")" \
|
|
24
|
-
&& test -x "$PG_BIN_DIR/initdb" \
|
|
25
|
-
&& ln -sf "$PG_BIN_DIR/initdb" /usr/local/bin/initdb \
|
|
26
|
-
&& ln -sf "$PG_BIN_DIR/pg_ctl" /usr/local/bin/pg_ctl \
|
|
27
|
-
&& ln -sf "$PG_BIN_DIR/postgres" /usr/local/bin/postgres \
|
|
28
|
-
&& useradd --create-home --shell /bin/sh devstack-sui \
|
|
17
|
+
&& apt-get install -y --no-install-recommends gawk \
|
|
29
18
|
&& rm -rf /var/lib/apt/lists/*
|
|
30
19
|
|
|
31
|
-
# Why `gawk` + `git`:
|
|
32
|
-
# - `gawk` — the in-container Move.lock scrub uses `gawk -i inplace`
|
|
33
|
-
# (the `-i` inplace mode is gawk-only; mawk doesn't support it).
|
|
34
|
-
# Without this, the package plugin's `containerScrubShellScript`
|
|
35
|
-
# fails inside `sui move build` with `find: 'gawk': No such
|
|
36
|
-
# file or directory` (host scrub may have already run, but the
|
|
37
|
-
# in-container path still invokes gawk).
|
|
38
|
-
# - `git` — Move's dep resolver invokes `git fetch` against vendored
|
|
39
|
-
# `[dependencies]` blocks (`{ git = "..." }`). Without git on PATH,
|
|
40
|
-
# `sui move build` aborts with a dep-fetch error before reaching
|
|
41
|
-
# the bytecode pass.
|
|
42
|
-
# - `postgresql` — `sui start --with-graphql` initializes an embedded
|
|
43
|
-
# local indexer database and shells out to `initdb`/`postgres`.
|
|
44
|
-
|
|
45
|
-
# Sui release-tarball fetch. The TARGETARCH branch picks the
|
|
46
|
-
# native-architecture asset name and unpacks `sui` (and siblings,
|
|
47
|
-
# including `sui-faucet`) into `/usr/local/bin/`.
|
|
48
|
-
RUN set -eux; \
|
|
49
|
-
case "$TARGETARCH" in \
|
|
50
|
-
arm64) SUI_PLATFORM=ubuntu-aarch64 ;; \
|
|
51
|
-
amd64) SUI_PLATFORM=ubuntu-x86_64 ;; \
|
|
52
|
-
*) echo "unsupported TARGETARCH=$TARGETARCH" >&2; exit 1 ;; \
|
|
53
|
-
esac; \
|
|
54
|
-
url="https://github.com/MystenLabs/sui/releases/download/${SUI_VERSION}/sui-${SUI_VERSION}-${SUI_PLATFORM}.tgz"; \
|
|
55
|
-
curl -fsSL "$url" -o /tmp/sui.tgz; \
|
|
56
|
-
mkdir -p /tmp/sui-unpack; \
|
|
57
|
-
tar -xzf /tmp/sui.tgz -C /tmp/sui-unpack; \
|
|
58
|
-
find /tmp/sui-unpack -maxdepth 2 -type f -executable -exec mv {} /usr/local/bin/ \; ; \
|
|
59
|
-
rm -rf /tmp/sui.tgz /tmp/sui-unpack; \
|
|
60
|
-
sui --version
|
|
61
|
-
|
|
62
|
-
COPY _shared/signal-forward.sh /usr/local/lib/devstack/signal-forward.sh
|
|
63
20
|
COPY sui/entrypoint.sh /usr/local/bin/devstack-entrypoint.sh
|
|
64
21
|
RUN chmod +x /usr/local/bin/devstack-entrypoint.sh
|
|
65
22
|
|
|
66
23
|
ENV RUST_LOG=info,sui=info
|
|
67
24
|
|
|
25
|
+
# Stop with SIGINT, not SIGTERM. The entrypoint `exec sui …` makes sui
|
|
26
|
+
# PID 1, and `sui start --with-faucet` only registers a SIGINT (ctrl-c)
|
|
27
|
+
# handler — `start_faucet`'s `axum::serve(...).await` shadows sui's
|
|
28
|
+
# `tokio::signal::ctrl_c()` for SIGTERM, so SIGTERM is ignored. Without
|
|
29
|
+
# this, `docker stop` (default SIGTERM) waits the full grace then escalates
|
|
30
|
+
# to SIGKILL → exit 137; `recreate: 'on-failure'` then RECREATES the
|
|
31
|
+
# validator on the next boot, destroying the persisted RocksDB chain state
|
|
32
|
+
# that warm restart/resume relies on. SIGINT drains RocksDB and exits 0 in
|
|
33
|
+
# <1s (verified, plain + external-indexer configs).
|
|
34
|
+
STOPSIGNAL SIGINT
|
|
35
|
+
|
|
68
36
|
# RPC (9000), faucet (9123), GraphQL consistent-store helper (9124),
|
|
69
37
|
# and GraphQL HTTP (9125). Local-mode boot probes the public surfaces.
|
|
70
38
|
EXPOSE 9000 9123 9124 9125
|
|
71
39
|
|
|
40
|
+
# GraphQL is gated at the env-wiring layer (NOT in this static CMD, which
|
|
41
|
+
# must stay graphql-less so the indexer:false path works): the entrypoint
|
|
42
|
+
# appends `--with-graphql` only when `DEVSTACK_SUI_INDEXER_URL` is set. The
|
|
43
|
+
# sui plugin sets that var by DEFAULT (pointing at the postgres sidecar it
|
|
44
|
+
# owns), so the default boot is full RPC + faucet + GraphQL.
|
|
72
45
|
ENTRYPOINT ["/usr/local/bin/devstack-entrypoint.sh"]
|
|
73
|
-
CMD ["start", "--with-faucet=0.0.0.0:9123"
|
|
46
|
+
CMD ["start", "--with-faucet=0.0.0.0:9123"]
|