@mysten-incubation/devstack 0.1.0 → 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 +7 -4
- 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 -31
- 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-render.mjs","names":[],"sources":["../../../src/plugins/seal/config-render.ts"],"sourcesContent":["// Seal plugin — key-server-config.yaml renderer.\n//\n// Distilled-doc invariant #19: the `network: !Devnet` discriminator\n// is LOAD-BEARING. Env-only mode silently routes at the public\n// testnet fullnode regardless of `NODE_URL`; going through the\n// config file with the `!Devnet` discriminator binds the daemon to\n// the in-stack sui RPC.\n//\n// Distilled-doc invariant #20: the rendered file MUST land under\n// `runtime/seal/`, NOT a scoped temp dir. The substrate's\n// service-path resolver (`servicePath('seal')`) produces the host\n// path; we land both the yaml and the master-key env-file there.\n//\n// This file declares the renderer + the staging procedure. The\n// renderer is a pure string builder; the staging procedure uses the\n// substrate's atomic-write primitive (FileSystem-backed).\n\nimport { Effect, FileSystem } from 'effect';\n\nimport { atomicWriteFile } from '../../substrate/runtime/atomic-write.ts';\nimport { sealConfigError, sealError, type SealError } from './errors.ts';\nimport { KEY_SERVER_CONFIG_BASENAME, MASTER_KEY_ENVFILE_BASENAME } from './keygen.ts';\nimport { SealSpans } from './spans.ts';\n\n// ---------------------------------------------------------------------------\n// Render inputs\n// ---------------------------------------------------------------------------\n\n/** Inputs the renderer consumes. The substrate provides the\n * sui node URL (in-container DNS form, e.g. `http://sui-localnet:9000`)\n * + the seal package id + the on-chain key-server object id. */\nexport interface SealKeyServerConfigInputs {\n\t/** Seal Move package id (from publish). */\n\treadonly sealPackageId: string;\n\t/** Sui RPC node URL as seen from inside the container's network. */\n\treadonly nodeUrl: string;\n\t/** On-chain `KeyServer` object id (from register). */\n\treadonly keyServerObjectId: string;\n\t/** Optional ts-sdk version requirement override. Default is the\n\t * pin distilled from v3 (`'>=0.4.5'`); v2 plans expose this so\n\t * consumers running older `@mysten/seal` aren't silently\n\t * rejected. Distilled-doc opportunity #8. */\n\treadonly tsSdkVersionRequirement?: string;\n}\n\nexport interface ParsedSealKeyServerConfig {\n\treadonly sealPackageId: string;\n\treadonly nodeUrl: string;\n\treadonly keyServerObjectId: string;\n}\n\nconst DEFAULT_TS_SDK_REQUIREMENT = '>=0.4.5';\n\n// ---------------------------------------------------------------------------\n// Render — pure string builder\n// ---------------------------------------------------------------------------\n\n/** Allowed character set for raw interpolation into a YAML double-quoted\n * string. A `\"` would close the quote and let downstream characters\n * inject YAML syntax; a backslash would start an escape sequence the\n * parser then chokes on. Sui/Seal object ids + node URLs only need\n * alphanumerics, `:/_.-`, and `0x` — so the conservative whitelist is\n * safe. The `ts_sdk_version_requirement` allows the SemVer comparator\n * characters as well. */\nconst YAML_INTERP_FIELD_RE = /^[0-9a-zA-Z:/_.\\-]+$/;\nconst YAML_INTERP_SEMVER_RE = /^[0-9a-zA-Z:/_.\\-<>=^~* |!]+$/;\n\nconst assertYamlSafe = (field: string, value: string, pattern: RegExp): string => {\n\tif (pattern.test(value)) return value;\n\tthrow sealConfigError({\n\t\tfield,\n\t\tmessage: `seal.config-render: ${field} contains characters that would break YAML quoting`,\n\t\thint: `allowed characters: ${pattern.source}`,\n\t});\n};\n\n/** Render the key-server config yaml.\n *\n * Distilled-doc invariant #19: `network: !Devnet` is hardcoded.\n * This is the \"custom chain via node_url\" discriminator the\n * upstream binary expects when devstack supplies its own RPC.\n *\n * Each interpolated value is whitelist-asserted BEFORE rendering — a\n * `\"` in any field would close the YAML quoted string and let\n * downstream characters inject syntax. The assertion raises a\n * `SealConfigError({phase: 'config-render'})` naming the offending\n * field so callers see a typed refusal, not silently-broken YAML. */\nexport const renderSealKeyServerConfig = (inputs: SealKeyServerConfigInputs): string => {\n\tconst sealPackageId = assertYamlSafe('sealPackageId', inputs.sealPackageId, YAML_INTERP_FIELD_RE);\n\tconst nodeUrl = assertYamlSafe('nodeUrl', inputs.nodeUrl, YAML_INTERP_FIELD_RE);\n\tconst keyServerObjectId = assertYamlSafe(\n\t\t'keyServerObjectId',\n\t\tinputs.keyServerObjectId,\n\t\tYAML_INTERP_FIELD_RE,\n\t);\n\tconst tsReq = assertYamlSafe(\n\t\t'tsSdkVersionRequirement',\n\t\tinputs.tsSdkVersionRequirement ?? DEFAULT_TS_SDK_REQUIREMENT,\n\t\tYAML_INTERP_SEMVER_RE,\n\t);\n\treturn [\n\t\t'network: !Devnet',\n\t\t` seal_package: \"${sealPackageId}\"`,\n\t\t`node_url: \"${nodeUrl}\"`,\n\t\t'server_mode: !Open',\n\t\t` key_server_object_id: \"${keyServerObjectId}\"`,\n\t\t`ts_sdk_version_requirement: \"${tsReq}\"`,\n\t\t'',\n\t].join('\\n');\n};\n\n// ---------------------------------------------------------------------------\n// Master-key env-file body\n// ---------------------------------------------------------------------------\n\n/** Render the docker `--env-file` body. Single `KEY=value` line.\n * Distilled-doc invariant #3 — this is the ONLY path the master key\n * reaches the container; inline `-e MASTER_KEY=…` would surface\n * the secret in `docker inspect` and host process env. */\nexport const renderMasterKeyEnvFile = (masterKeyHex: string): string =>\n\t`MASTER_KEY=${masterKeyHex}\\n`;\n\nconst readQuotedYamlField = (body: string, field: string): string | null => {\n\tconst escaped = field.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\t// Anchor to start-of-line: `(?:^|\\n)` plus a whitespace-only run\n\t// (`[ \\t]*` — explicitly excludes `#`) so a commented field\n\t// (`# node_url: \"fake\"`) can never accidentally match. The renderer\n\t// does not emit comments today, but the parser is also used on\n\t// snapshot-restore bodies that may grow comments in future. The\n\t// previous `\\s*` admitted no `#`, but `\\s` includes `\\n` which let\n\t// the regex engine skip past the start-of-line anchor; restricting\n\t// to inline-whitespace makes the line-anchoring strict.\n\tconst match = new RegExp(`(?:^|\\\\n)[ \\\\t]*${escaped}:[ \\\\t]*\"([^\"]+)\"[ \\\\t]*(?:\\\\n|$)`).exec(\n\t\tbody,\n\t);\n\treturn match?.[1] ?? null;\n};\n\nexport const parseSealKeyServerConfig = (body: string): ParsedSealKeyServerConfig | null => {\n\tconst sealPackageId = readQuotedYamlField(body, 'seal_package');\n\tconst nodeUrl = readQuotedYamlField(body, 'node_url');\n\tconst keyServerObjectId = readQuotedYamlField(body, 'key_server_object_id');\n\tif (sealPackageId === null || nodeUrl === null || keyServerObjectId === null) {\n\t\treturn null;\n\t}\n\treturn { sealPackageId, nodeUrl, keyServerObjectId };\n};\n\nexport const parseMasterKeyEnvFile = (body: string): string | null => {\n\tconst match = /^MASTER_KEY=(0x)?([0-9a-fA-F]+)\\s*$/m.exec(body);\n\treturn match?.[2] ?? null;\n};\n\n// ---------------------------------------------------------------------------\n// Staging procedure — write yaml + env-file with proper mode bits\n// ---------------------------------------------------------------------------\n\n/** Compose the two writes the local-keygen mode needs.\n *\n * Writes:\n *\n * - `${servicePath}/key-server-config.yaml` (mode 0o644 — public)\n * - `${servicePath}/master-key.env` (mode 0o600 — secret)\n *\n * Parent dir is created with 0o700 (distilled-doc invariant #2).\n * Both writes flow through the substrate's `atomicWriteFile`\n * (tempfile + fsync + rename, never partial-write visible).\n *\n * Distilled-doc invariant #4: `master-key.env` MUST NOT be unlinked\n * on scope close (snapshot → restore round-trip retains the key).\n * We do NOT register a finalizer here.\n *\n * Error surface: `SealError({phase: 'config-render'})` wraps any\n * underlying `AtomicWriteFailed`. The substrate's atomic write owns\n * fsync + rename + cleanup semantics. */\nexport const stageSealConfig = (\n\tyamlBody: string,\n\tmasterKeyHex: string,\n\tservicePath: string,\n\tname: string,\n): Effect.Effect<\n\t{\n\t\treadonly configPath: string;\n\t\treadonly masterKeyEnvFile: string;\n\t},\n\tSealError,\n\tFileSystem.FileSystem\n> =>\n\tEffect.gen(function* () {\n\t\tconst configPath = `${servicePath}/${KEY_SERVER_CONFIG_BASENAME}`;\n\t\tconst masterKeyEnvFile = `${servicePath}/${MASTER_KEY_ENVFILE_BASENAME}`;\n\t\tconst yamlBytes = new TextEncoder().encode(yamlBody);\n\t\tconst envBytes = new TextEncoder().encode(renderMasterKeyEnvFile(masterKeyHex));\n\n\t\t// World-readable yaml (no secrets) inside 0o700 parent — the\n\t\t// daemon process inside the container reads via the bind-mount\n\t\t// so host-side mode bits don't fully matter, but 0o644 is the\n\t\t// least-surprising default for a non-secret config.\n\t\tyield* atomicWriteFile(configPath, yamlBytes, {\n\t\t\tmode: 0o644,\n\t\t\tparentMode: 0o700,\n\t\t}).pipe(\n\t\t\tEffect.catch((cause) =>\n\t\t\t\tEffect.fail(\n\t\t\t\t\tsealError('config-render', {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tmessage: `seal.config-render: failed to write ${KEY_SERVER_CONFIG_BASENAME} (${cause.stage})`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\t\t// SECRET — 0o600 inside the same 0o700 parent. Distilled-doc\n\t\t// §Hard requirements #2.\n\t\tyield* atomicWriteFile(masterKeyEnvFile, envBytes, {\n\t\t\tmode: 0o600,\n\t\t\tparentMode: 0o700,\n\t\t}).pipe(\n\t\t\tEffect.catch((cause) =>\n\t\t\t\tEffect.fail(\n\t\t\t\t\tsealError('config-render', {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tmessage: `seal.config-render: failed to write ${MASTER_KEY_ENVFILE_BASENAME} (${cause.stage})`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\t\treturn { configPath, masterKeyEnvFile };\n\t}).pipe(\n\t\tEffect.withSpan('devstack.plugin.seal.config-render.stage', {\n\t\t\tattributes: { [SealSpans.name]: name, [SealSpans.servicePath]: servicePath },\n\t\t}),\n\t);\n"],"mappings":";;;;;;AAmDA,MAAM,6BAA6B;;;;;;;;AAanC,MAAM,uBAAuB;AAC7B,MAAM,wBAAwB;AAE9B,MAAM,kBAAkB,OAAe,OAAe,YAA4B;AACjF,KAAI,QAAQ,KAAK,MAAM,CAAE,QAAO;AAChC,OAAM,gBAAgB;EACrB;EACA,SAAS,uBAAuB,MAAM;EACtC,MAAM,uBAAuB,QAAQ;EACrC,CAAC;;;;;;;;;;;;;AAcH,MAAa,6BAA6B,WAA8C;CACvF,MAAM,gBAAgB,eAAe,iBAAiB,OAAO,eAAe,qBAAqB;CACjG,MAAM,UAAU,eAAe,WAAW,OAAO,SAAS,qBAAqB;CAC/E,MAAM,oBAAoB,eACzB,qBACA,OAAO,mBACP,qBACA;CACD,MAAM,QAAQ,eACb,2BACA,OAAO,2BAA2B,4BAClC,sBACA;AACD,QAAO;EACN;EACA,oBAAoB,cAAc;EAClC,cAAc,QAAQ;EACtB;EACA,4BAA4B,kBAAkB;EAC9C,gCAAgC,MAAM;EACtC;EACA,CAAC,KAAK,KAAK;;;;;;AAWb,MAAa,0BAA0B,iBACtC,cAAc,aAAa;AA4B5B,MAAa,yBAAyB,SAAgC;AAErE,QADc,uCAAuC,KAAK,KAC9C,GAAG,MAAM;;;;;;;;;;;;;;;;;;;;AAyBtB,MAAa,mBACZ,UACA,cACA,aACA,SASA,OAAO,IAAI,aAAa;CACvB,MAAM,aAAa,GAAG,YAAY,GAAG;CACrC,MAAM,mBAAmB,GAAG,YAAY,GAAG;CAC3C,MAAM,YAAY,IAAI,aAAa,CAAC,OAAO,SAAS;CACpD,MAAM,WAAW,IAAI,aAAa,CAAC,OAAO,uBAAuB,aAAa,CAAC;AAM/E,QAAO,gBAAgB,YAAY,WAAW;EAC7C,MAAM;EACN,YAAY;EACZ,CAAC,CAAC,KACF,OAAO,OAAO,UACb,OAAO,KACN,UAAU,iBAAiB;EAC1B;EACA,SAAS,uCAAuC,2BAA2B,IAAI,MAAM,MAAM;EAC3F;EACA,CAAC,CACF,CACD,CACD;AAID,QAAO,gBAAgB,kBAAkB,UAAU;EAClD,MAAM;EACN,YAAY;EACZ,CAAC,CAAC,KACF,OAAO,OAAO,UACb,OAAO,KACN,UAAU,iBAAiB;EAC1B;EACA,SAAS,uCAAuC,4BAA4B,IAAI,MAAM,MAAM;EAC5F;EACA,CAAC,CACF,CACD,CACD;AAED,QAAO;EAAE;EAAY;EAAkB;EACtC,CAAC,KACF,OAAO,SAAS,4CAA4C,EAC3D,YAAY;EAAG,UAAU,OAAO;EAAO,UAAU,cAAc;CAAa,EAC5E,CAAC,CACF"}
|
|
1
|
+
{"version":3,"file":"config-render.mjs","names":[],"sources":["../../../src/plugins/seal/config-render.ts"],"sourcesContent":["// Seal plugin — key-server-config.yaml renderer.\n//\n// Distilled-doc invariant #19: the `network: !Devnet` discriminator\n// is LOAD-BEARING. Env-only mode silently routes at the public\n// testnet fullnode regardless of `NODE_URL`; going through the\n// config file with the `!Devnet` discriminator binds the daemon to\n// the in-stack sui RPC.\n//\n// Distilled-doc invariant #20: the rendered file MUST land under\n// `runtime/seal/`, NOT a scoped temp dir. The substrate's\n// service-path resolver (`servicePath('seal')`) produces the host\n// path; we land both the yaml and the master-key env-file there.\n//\n// This file declares the renderer + the staging procedure. The\n// renderer is a pure string builder; the staging procedure uses the\n// substrate's atomic-write primitive (FileSystem-backed).\n\nimport { Effect, FileSystem } from 'effect';\n\nimport { atomicWriteFile } from '../../substrate/runtime/atomic-write.ts';\nimport { sealConfigError, sealError, type SealError } from './errors.ts';\nimport { KEY_SERVER_CONFIG_BASENAME, MASTER_KEY_ENVFILE_BASENAME } from './keygen.ts';\n\n// ---------------------------------------------------------------------------\n// Render inputs\n// ---------------------------------------------------------------------------\n\n/** Inputs the renderer consumes. The substrate provides the\n * sui node URL (in-container DNS form, e.g. `http://sui-localnet:9000`)\n * + the seal package id + the on-chain key-server object id. */\nexport interface SealKeyServerConfigInputs {\n\t/** Seal Move package id (from publish). */\n\treadonly sealPackageId: string;\n\t/** Sui RPC node URL as seen from inside the container's network. */\n\treadonly nodeUrl: string;\n\t/** On-chain `KeyServer` object id (from register). */\n\treadonly keyServerObjectId: string;\n\t/** Optional ts-sdk version requirement override. Default pin is\n\t * `'>=0.4.5'`; exposing this lets consumers running older\n\t * `@mysten/seal` avoid being silently rejected. */\n\treadonly tsSdkVersionRequirement?: string;\n}\n\nexport interface ParsedSealKeyServerConfig {\n\treadonly sealPackageId: string;\n\treadonly nodeUrl: string;\n\treadonly keyServerObjectId: string;\n}\n\nconst DEFAULT_TS_SDK_REQUIREMENT = '>=0.4.5';\n\n// ---------------------------------------------------------------------------\n// Render — pure string builder\n// ---------------------------------------------------------------------------\n\n/** Allowed character set for raw interpolation into a YAML double-quoted\n * string. A `\"` would close the quote and let downstream characters\n * inject YAML syntax; a backslash would start an escape sequence the\n * parser then chokes on. Sui/Seal object ids + node URLs only need\n * alphanumerics, `:/_.-`, and `0x` — so the conservative whitelist is\n * safe. The `ts_sdk_version_requirement` allows the SemVer comparator\n * characters as well. */\nconst YAML_INTERP_FIELD_RE = /^[0-9a-zA-Z:/_.-]+$/;\nconst YAML_INTERP_SEMVER_RE = /^[0-9a-zA-Z:/_.\\-<>=^~* |!]+$/;\n\nconst assertYamlSafe = (field: string, value: string, pattern: RegExp): string => {\n\tif (pattern.test(value)) return value;\n\tthrow sealConfigError({\n\t\tfield,\n\t\tmessage: `seal.config-render: ${field} contains characters that would break YAML quoting`,\n\t\thint: `allowed characters: ${pattern.source}`,\n\t});\n};\n\n/** Render the key-server config yaml.\n *\n * Distilled-doc invariant #19: `network: !Devnet` is hardcoded.\n * This is the \"custom chain via node_url\" discriminator the\n * upstream binary expects when devstack supplies its own RPC.\n *\n * Each interpolated value is whitelist-asserted BEFORE rendering — a\n * `\"` in any field would close the YAML quoted string and let\n * downstream characters inject syntax. The assertion raises a\n * `SealConfigError({phase: 'config-render'})` naming the offending\n * field so callers see a typed refusal, not silently-broken YAML. */\nexport const renderSealKeyServerConfig = (inputs: SealKeyServerConfigInputs): string => {\n\tconst sealPackageId = assertYamlSafe('sealPackageId', inputs.sealPackageId, YAML_INTERP_FIELD_RE);\n\tconst nodeUrl = assertYamlSafe('nodeUrl', inputs.nodeUrl, YAML_INTERP_FIELD_RE);\n\tconst keyServerObjectId = assertYamlSafe(\n\t\t'keyServerObjectId',\n\t\tinputs.keyServerObjectId,\n\t\tYAML_INTERP_FIELD_RE,\n\t);\n\tconst tsReq = assertYamlSafe(\n\t\t'tsSdkVersionRequirement',\n\t\tinputs.tsSdkVersionRequirement ?? DEFAULT_TS_SDK_REQUIREMENT,\n\t\tYAML_INTERP_SEMVER_RE,\n\t);\n\treturn [\n\t\t'network: !Devnet',\n\t\t` seal_package: \"${sealPackageId}\"`,\n\t\t`node_url: \"${nodeUrl}\"`,\n\t\t'server_mode: !Open',\n\t\t` key_server_object_id: \"${keyServerObjectId}\"`,\n\t\t`ts_sdk_version_requirement: \"${tsReq}\"`,\n\t\t'',\n\t].join('\\n');\n};\n\n// ---------------------------------------------------------------------------\n// Master-key env-file body\n// ---------------------------------------------------------------------------\n\n/** Render the docker `--env-file` body. Single `KEY=value` line.\n * Distilled-doc invariant #3 — this is the ONLY path the master key\n * reaches the container; inline `-e MASTER_KEY=…` would surface\n * the secret in `docker inspect` and host process env. */\nexport const renderMasterKeyEnvFile = (masterKeyHex: string): string =>\n\t`MASTER_KEY=${masterKeyHex}\\n`;\n\nconst readQuotedYamlField = (body: string, field: string): string | null => {\n\tconst escaped = field.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\t// Anchor to start-of-line: `(?:^|\\n)` plus a whitespace-only run\n\t// (`[ \\t]*` — explicitly excludes `#`) so a commented field\n\t// (`# node_url: \"fake\"`) can never accidentally match. The renderer\n\t// does not emit comments today, but the parser is also used on\n\t// snapshot-restore bodies that may grow comments in future. The\n\t// previous `\\s*` admitted no `#`, but `\\s` includes `\\n` which let\n\t// the regex engine skip past the start-of-line anchor; restricting\n\t// to inline-whitespace makes the line-anchoring strict.\n\tconst match = new RegExp(`(?:^|\\\\n)[ \\\\t]*${escaped}:[ \\\\t]*\"([^\"]+)\"[ \\\\t]*(?:\\\\n|$)`).exec(\n\t\tbody,\n\t);\n\treturn match?.[1] ?? null;\n};\n\nexport const parseSealKeyServerConfig = (body: string): ParsedSealKeyServerConfig | null => {\n\tconst sealPackageId = readQuotedYamlField(body, 'seal_package');\n\tconst nodeUrl = readQuotedYamlField(body, 'node_url');\n\tconst keyServerObjectId = readQuotedYamlField(body, 'key_server_object_id');\n\tif (sealPackageId === null || nodeUrl === null || keyServerObjectId === null) {\n\t\treturn null;\n\t}\n\treturn { sealPackageId, nodeUrl, keyServerObjectId };\n};\n\nexport const parseMasterKeyEnvFile = (body: string): string | null => {\n\tconst match = /^MASTER_KEY=(0x)?([0-9a-fA-F]+)\\s*$/m.exec(body);\n\treturn match?.[2] ?? null;\n};\n\n// ---------------------------------------------------------------------------\n// Staging procedure — write yaml + env-file with proper mode bits\n// ---------------------------------------------------------------------------\n\n/** Compose the two writes the local-keygen mode needs.\n *\n * Writes:\n *\n * - `${servicePath}/key-server-config.yaml` (mode 0o644 — public)\n * - `${servicePath}/master-key.env` (mode 0o600 — secret)\n *\n * Parent dir is created with 0o700 (distilled-doc invariant #2).\n * Both writes flow through the substrate's `atomicWriteFile`\n * (tempfile + fsync + rename, never partial-write visible).\n *\n * Distilled-doc invariant #4: `master-key.env` MUST NOT be unlinked\n * on scope close (snapshot → restore round-trip retains the key).\n * We do NOT register a finalizer here.\n *\n * Error surface: `SealError({phase: 'config-render'})` wraps any\n * underlying `AtomicWriteFailed`. The substrate's atomic write owns\n * fsync + rename + cleanup semantics. */\nexport const stageSealConfig = (\n\tyamlBody: string,\n\tmasterKeyHex: string,\n\tservicePath: string,\n\tname: string,\n): Effect.Effect<\n\t{\n\t\treadonly configPath: string;\n\t\treadonly masterKeyEnvFile: string;\n\t},\n\tSealError,\n\tFileSystem.FileSystem\n> =>\n\tEffect.gen(function* () {\n\t\tconst configPath = `${servicePath}/${KEY_SERVER_CONFIG_BASENAME}`;\n\t\tconst masterKeyEnvFile = `${servicePath}/${MASTER_KEY_ENVFILE_BASENAME}`;\n\t\tconst yamlBytes = new TextEncoder().encode(yamlBody);\n\t\tconst envBytes = new TextEncoder().encode(renderMasterKeyEnvFile(masterKeyHex));\n\n\t\t// World-readable yaml (no secrets) inside 0o700 parent — the\n\t\t// daemon process inside the container reads via the bind-mount\n\t\t// so host-side mode bits don't fully matter, but 0o644 is the\n\t\t// least-surprising default for a non-secret config.\n\t\tyield* atomicWriteFile(configPath, yamlBytes, {\n\t\t\tmode: 0o644,\n\t\t\tparentMode: 0o700,\n\t\t}).pipe(\n\t\t\tEffect.catch((cause) =>\n\t\t\t\tEffect.fail(\n\t\t\t\t\tsealError('config-render', {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tmessage: `seal.config-render: failed to write ${KEY_SERVER_CONFIG_BASENAME} (${cause.stage})`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\t\t// SECRET — 0o600 inside the same 0o700 parent. Distilled-doc\n\t\t// §Hard requirements #2.\n\t\tyield* atomicWriteFile(masterKeyEnvFile, envBytes, {\n\t\t\tmode: 0o600,\n\t\t\tparentMode: 0o700,\n\t\t}).pipe(\n\t\t\tEffect.catch((cause) =>\n\t\t\t\tEffect.fail(\n\t\t\t\t\tsealError('config-render', {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tmessage: `seal.config-render: failed to write ${MASTER_KEY_ENVFILE_BASENAME} (${cause.stage})`,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\t\treturn { configPath, masterKeyEnvFile };\n\t});\n"],"mappings":";;;;;AAiDA,MAAM,6BAA6B;;;;;;;;AAanC,MAAM,uBAAuB;AAC7B,MAAM,wBAAwB;AAE9B,MAAM,kBAAkB,OAAe,OAAe,YAA4B;CACjF,IAAI,QAAQ,KAAK,KAAK,GAAG,OAAO;CAChC,MAAM,gBAAgB;EACrB;EACA,SAAS,uBAAuB,MAAM;EACtC,MAAM,uBAAuB,QAAQ;CACtC,CAAC;AACF;;;;;;;;;;;;AAaA,MAAa,6BAA6B,WAA8C;CACvF,MAAM,gBAAgB,eAAe,iBAAiB,OAAO,eAAe,oBAAoB;CAChG,MAAM,UAAU,eAAe,WAAW,OAAO,SAAS,oBAAoB;CAC9E,MAAM,oBAAoB,eACzB,qBACA,OAAO,mBACP,oBACD;CACA,MAAM,QAAQ,eACb,2BACA,OAAO,2BAA2B,4BAClC,qBACD;CACA,OAAO;EACN;EACA,oBAAoB,cAAc;EAClC,cAAc,QAAQ;EACtB;EACA,4BAA4B,kBAAkB;EAC9C,gCAAgC,MAAM;EACtC;CACD,CAAC,CAAC,KAAK,IAAI;AACZ;;;;;AAUA,MAAa,0BAA0B,iBACtC,cAAc,aAAa;AA4B5B,MAAa,yBAAyB,SAAgC;CAErE,OADc,uCAAuC,KAAK,IAC/C,CAAC,GAAG,MAAM;AACtB;;;;;;;;;;;;;;;;;;;AAwBA,MAAa,mBACZ,UACA,cACA,aACA,SASA,OAAO,IAAI,aAAa;CACvB,MAAM,aAAa,GAAG,YAAY,GAAG;CACrC,MAAM,mBAAmB,GAAG,YAAY,GAAG;CAC3C,MAAM,YAAY,IAAI,YAAY,CAAC,CAAC,OAAO,QAAQ;CACnD,MAAM,WAAW,IAAI,YAAY,CAAC,CAAC,OAAO,uBAAuB,YAAY,CAAC;CAM9E,OAAO,gBAAgB,YAAY,WAAW;EAC7C,MAAM;EACN,YAAY;CACb,CAAC,CAAC,CAAC,KACF,OAAO,OAAO,UACb,OAAO,KACN,UAAU,iBAAiB;EAC1B;EACA,SAAS,uCAAuC,2BAA2B,IAAI,MAAM,MAAM;EAC3F;CACD,CAAC,CACF,CACD,CACD;CAIA,OAAO,gBAAgB,kBAAkB,UAAU;EAClD,MAAM;EACN,YAAY;CACb,CAAC,CAAC,CAAC,KACF,OAAO,OAAO,UACb,OAAO,KACN,UAAU,iBAAiB;EAC1B;EACA,SAAS,uCAAuC,4BAA4B,IAAI,MAAM,MAAM;EAC5F;CACD,CAAC,CACF,CACD,CACD;CAEA,OAAO;EAAE;EAAY;CAAiB;AACvC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { contentHash } from "../../substrate/brand.mjs";
|
|
2
|
-
import { hashMoveSources, runMoveBuild, scrubLocksHost } from "
|
|
3
|
-
import { executeSuiTx, formatExecutedFailure } from "
|
|
2
|
+
import { hashMoveSources, runMoveBuild, scrubLocksHost, withMoveBuildLock } from "../sui/move/index.mjs";
|
|
3
|
+
import { executeSuiTx, formatExecutedFailure } from "../sui/exec/index.mjs";
|
|
4
|
+
import "../sui/index.mjs";
|
|
4
5
|
import { artifactPublishError } from "../../primitives/artifact-publisher.mjs";
|
|
5
6
|
import { sealError } from "./errors.mjs";
|
|
6
|
-
import { SealSpans } from "./spans.mjs";
|
|
7
7
|
import { Effect, Schema } from "effect";
|
|
8
8
|
import { createHash } from "node:crypto";
|
|
9
9
|
import { fromHex } from "@mysten/sui/utils";
|
|
@@ -57,14 +57,15 @@ const projectSealPublishReceipt = (name, receipt) => {
|
|
|
57
57
|
});
|
|
58
58
|
};
|
|
59
59
|
const runSealPublishTransaction = (inputs) => Effect.gen(function* () {
|
|
60
|
-
yield*
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
const buildOutput = yield* withMoveBuildLock(Effect.gen(function* () {
|
|
61
|
+
yield* scrubLocksHost(inputs.movePackagePath, "~/.move").pipe(Effect.mapError((err) => moveBuildToSealError(inputs.name, err)));
|
|
62
|
+
return yield* runMoveBuild({
|
|
63
|
+
sourcePath: inputs.movePackagePath,
|
|
64
|
+
packageName: inputs.name,
|
|
65
|
+
runtime: inputs.runtime,
|
|
66
|
+
...inputs.buildImage !== void 0 ? { buildImage: inputs.buildImage } : {}
|
|
67
|
+
}).pipe(Effect.mapError((err) => moveBuildToSealError(inputs.name, err)));
|
|
68
|
+
}));
|
|
68
69
|
const result = yield* executeSuiTx({
|
|
69
70
|
client: inputs.sdk.client,
|
|
70
71
|
signer: inputs.signer,
|
|
@@ -83,24 +84,18 @@ const runSealPublishTransaction = (inputs) => Effect.gen(function* () {
|
|
|
83
84
|
message: `seal publish tx executed but on-chain execution failed for signer '${inputs.signer.name}' (address=${inputs.signer.address}) ` + formatExecutedFailure(result.FailedTransaction)
|
|
84
85
|
}));
|
|
85
86
|
return yield* projectSealPublishReceipt(inputs.name, result.Transaction);
|
|
86
|
-
})
|
|
87
|
-
[SealSpans.name]: inputs.name,
|
|
88
|
-
[SealSpans.signer]: inputs.signer.address
|
|
89
|
-
} }));
|
|
87
|
+
});
|
|
90
88
|
const publishSealPackage = (publisher, inputs) => Effect.gen(function* () {
|
|
91
89
|
const inputsHash = sealPackageInputsHash(yield* hashMoveSources(inputs.movePackagePath).pipe(Effect.mapError((err) => moveBuildToSealError(inputs.name, err))), inputs.signer.address);
|
|
92
90
|
return { packageId: (yield* publisher.publish({
|
|
93
91
|
namespace: SEAL_PACKAGE_NAMESPACE,
|
|
94
|
-
chain: inputs.
|
|
92
|
+
chain: inputs.chainId,
|
|
95
93
|
contentHash: inputsHash,
|
|
96
94
|
verify: (cached) => verifyObjectLenient(inputs.chainProbe, cached.packageId, SealPackageVerifyShape),
|
|
97
95
|
produce: runSealPublishTransaction(inputs).pipe(Effect.mapError((err) => sealProduceFailed("publish", err))),
|
|
98
96
|
register: () => Effect.void
|
|
99
97
|
})).packageId };
|
|
100
|
-
})
|
|
101
|
-
[SealSpans.name]: inputs.name,
|
|
102
|
-
[SealSpans.chain]: inputs.chain
|
|
103
|
-
} }));
|
|
98
|
+
});
|
|
104
99
|
const SEAL_KEY_SERVER_NAMESPACE = "seal/key-server-id";
|
|
105
100
|
const SealKeyServerVerifyShape = Schema.Struct({
|
|
106
101
|
objectId: Schema.String,
|
|
@@ -166,24 +161,18 @@ const runRegisterKeyServerTransaction = (sdk, signer, inputs) => Effect.gen(func
|
|
|
166
161
|
message: `seal register tx executed but on-chain execution failed for signer '${signer.name}' (address=${signer.address}) ` + formatExecutedFailure(result.FailedTransaction)
|
|
167
162
|
}));
|
|
168
163
|
return yield* projectRegisterKeyServerReceipt(inputs.name, result.Transaction);
|
|
169
|
-
})
|
|
170
|
-
[SealSpans.name]: inputs.name,
|
|
171
|
-
[SealSpans.url]: inputs.keyServerUrl
|
|
172
|
-
} }));
|
|
164
|
+
});
|
|
173
165
|
const registerKeyServer = (publisher, inputs) => Effect.gen(function* () {
|
|
174
166
|
const inputsHash = sealRegisterInputsHash(inputs, inputs.signer.address);
|
|
175
167
|
return { objectId: (yield* publisher.publish({
|
|
176
168
|
namespace: SEAL_KEY_SERVER_NAMESPACE,
|
|
177
|
-
chain: inputs.
|
|
169
|
+
chain: inputs.chainId,
|
|
178
170
|
contentHash: inputsHash,
|
|
179
171
|
verify: (cached) => verifyObjectLenient(inputs.chainProbe, cached.objectId, SealKeyServerVerifyShape),
|
|
180
172
|
produce: runRegisterKeyServerTransaction(inputs.sdk, inputs.signer, inputs).pipe(Effect.mapError((err) => sealProduceFailed("register", err))),
|
|
181
173
|
register: () => Effect.void
|
|
182
174
|
})).objectId };
|
|
183
|
-
})
|
|
184
|
-
[SealSpans.name]: inputs.name,
|
|
185
|
-
[SealSpans.url]: inputs.keyServerUrl
|
|
186
|
-
} }));
|
|
175
|
+
});
|
|
187
176
|
//#endregion
|
|
188
177
|
export { publishSealPackage, registerKeyServer };
|
|
189
178
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.mjs","names":[],"sources":["../../../src/plugins/seal/deploy.ts"],"sourcesContent":["// Seal plugin — SDK-backed Move publish + on-chain KeyServer register.\n\nimport { createHash } from 'node:crypto';\n\nimport { Effect, Schema, type Scope } from 'effect';\n\nimport {\n\tTransaction,\n\ttype TransactionArgument,\n\ttype TransactionObjectArgument,\n} from '@mysten/sui/transactions';\n\nimport type { ChainProbe, ChainProbeSchema } from '../../contracts/chain-probe.ts';\nimport type { ContainerRuntime, ImageRef } from '../../contracts/container-runtime.ts';\nimport {\n\tartifactPublishError,\n\ttype ArtifactPublishError,\n\ttype ArtifactPublisher,\n} from '../../primitives/artifact-publisher.ts';\nimport { contentHash, type ChainId, type ContentHash } from '../../substrate/brand.ts';\nimport {\n\texecuteSuiTx,\n\tformatExecutedFailure,\n\ttype ExecutedReceipt,\n} from '../../substrate/runtime/sui-execute/index.ts';\nimport {\n\thashMoveSources,\n\trunMoveBuild,\n\tscrubLocksHost,\n\ttype BuildOutput,\n\ttype MoveBuildError,\n} from '../../substrate/runtime/sui-move-build/index.ts';\nimport { fromHex } from '@mysten/sui/utils';\n\nimport type { AccountValue } from '../account/index.ts';\nimport type { ClientWithCoreApi } from '../sui/index.ts';\nimport { sealError, type SealError } from './errors.ts';\nimport { SealSpans } from './spans.ts';\n\nconst KEY_TYPE_BONEH_FRANKLIN_BLS12381 = 0;\n\nexport type SealObjectProbeKey = { readonly kind: 'object'; readonly objectId: string };\n\nexport interface SealSuiSdk {\n\treadonly client: ClientWithCoreApi;\n}\n\nconst sealProduceFailed = (op: 'publish' | 'register', err: SealError): ArtifactPublishError =>\n\tartifactPublishError('produce-failed', `seal.${op} ${err.phase}: ${err.message}`);\n\nconst moveBuildToSealError = (name: string, err: MoveBuildError): SealError =>\n\tsealError('publish', {\n\t\tname,\n\t\tmessage: `seal publish ${err.phase} failed for source '${err.sourcePath}': ${err.message}`,\n\t\tcause: err,\n\t});\n\nconst verifyObjectLenient = <Verified>(\n\tprobe: ChainProbe<SealObjectProbeKey>,\n\tobjectId: string,\n\tschema: ChainProbeSchema<Verified>,\n): Effect.Effect<Verified | null, never> =>\n\tprobe\n\t\t.get({ kind: 'object', objectId }, schema, 'lenient')\n\t\t.pipe(Effect.catch(() => Effect.succeed(null as Verified | null)));\n\n// ---------------------------------------------------------------------------\n// Move publish — `sealPackage` artifact\n// ---------------------------------------------------------------------------\n\nexport const SEAL_PACKAGE_NAMESPACE = 'seal/package' as const;\n\nexport interface SealPackageCached {\n\treadonly packageId: string;\n\treadonly upgradeCapId?: string;\n}\n\nexport const SealPackageVerifyShape = Schema.Struct({\n\tobjectId: Schema.String,\n\ttype: Schema.optional(Schema.Unknown),\n});\nexport type SealPackageVerified = Schema.Schema.Type<typeof SealPackageVerifyShape>;\n\nexport interface SealPublishInputs {\n\treadonly name: string;\n\treadonly chain: ChainId;\n\treadonly movePackagePath: string;\n\treadonly signer: AccountValue;\n\treadonly sdk: SealSuiSdk;\n\treadonly runtime: ContainerRuntime;\n\treadonly buildImage?: ImageRef;\n\treadonly chainProbe: ChainProbe<SealObjectProbeKey>;\n}\n\nexport const sealPackageInputsHash = (\n\tsourceHash: ContentHash,\n\tsignerAddress: string,\n): ContentHash => contentHash(`seal-package|source=${sourceHash}|signer=${signerAddress}`);\n\nexport interface SealPublishTransactionBuilder<TUpgradeCap = unknown> {\n\treadonly setSender: (address: string) => void;\n\treadonly publish: (input: {\n\t\treadonly modules: ReadonlyArray<ReadonlyArray<number>>;\n\t\treadonly dependencies: ReadonlyArray<string>;\n\t}) => TUpgradeCap;\n\treadonly transferObjects: (objects: ReadonlyArray<TUpgradeCap>, recipient: string) => void;\n}\n\nconst publishTransactionBuilder = (\n\ttx: Transaction,\n): SealPublishTransactionBuilder<TransactionObjectArgument> => ({\n\tsetSender: (address) => tx.setSender(address),\n\tpublish: (input) =>\n\t\ttx.publish({\n\t\t\tmodules: input.modules.map((m) => [...m]),\n\t\t\tdependencies: [...input.dependencies],\n\t\t}),\n\ttransferObjects: (objects, recipient) => tx.transferObjects([...objects], recipient),\n});\n\nexport const buildSealPublishTransaction = <TUpgradeCap>(\n\ttx: SealPublishTransactionBuilder<TUpgradeCap>,\n\tbuildOutput: BuildOutput,\n\tsignerAddress: string,\n): void => {\n\ttx.setSender(signerAddress);\n\tconst upgradeCap = tx.publish({\n\t\tmodules: buildOutput.modules.map((m) => Array.from(m)),\n\t\tdependencies: [...buildOutput.dependencies],\n\t});\n\ttx.transferObjects([upgradeCap], signerAddress);\n};\n\nexport const pickPackageWriteObjectId = (receipt: ExecutedReceipt): string | null =>\n\treceipt.objectChanges.find((change) => change.outputState === 'PackageWrite')?.objectId ?? null;\n\nexport const pickUpgradeCapObjectId = (receipt: ExecutedReceipt): string | null =>\n\treceipt.objectChanges.find(\n\t\t(change) =>\n\t\t\tchange.idOperation === 'Created' &&\n\t\t\t(change.objectType?.endsWith('::package::UpgradeCap') ?? false),\n\t)?.objectId ?? null;\n\nexport const projectSealPublishReceipt = (\n\tname: string,\n\treceipt: ExecutedReceipt,\n): Effect.Effect<SealPackageCached, SealError> => {\n\tconst packageId = pickPackageWriteObjectId(receipt);\n\tif (packageId === null) {\n\t\treturn Effect.fail(\n\t\t\tsealError('publish', {\n\t\t\t\tname,\n\t\t\t\tmessage: `seal publish tx wrote no PackageWrite object ` + `(digest=${receipt.digest})`,\n\t\t\t}),\n\t\t);\n\t}\n\tconst upgradeCapId = pickUpgradeCapObjectId(receipt);\n\treturn Effect.succeed({\n\t\tpackageId,\n\t\t...(upgradeCapId !== null ? { upgradeCapId } : {}),\n\t});\n};\n\nexport const runSealPublishTransaction = (\n\tinputs: SealPublishInputs,\n): Effect.Effect<SealPackageCached, SealError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\t// Scrub the shared Move git cache so a stale pin can't leak into the\n\t\t// build. The package's own Move.lock is scrubbed inside the container\n\t\t// on a disposable copy, so the developer's checked-in source is left\n\t\t// untouched host-side.\n\t\tyield* scrubLocksHost(inputs.movePackagePath, '~/.move').pipe(\n\t\t\tEffect.mapError((err) => moveBuildToSealError(inputs.name, err)),\n\t\t);\n\n\t\tconst buildOutput = yield* runMoveBuild({\n\t\t\tsourcePath: inputs.movePackagePath,\n\t\t\tpackageName: inputs.name,\n\t\t\tchainId: inputs.chain,\n\t\t\truntime: inputs.runtime,\n\t\t\t...(inputs.buildImage !== undefined ? { buildImage: inputs.buildImage } : {}),\n\t\t}).pipe(Effect.mapError((err) => moveBuildToSealError(inputs.name, err)));\n\n\t\tconst result = yield* executeSuiTx({\n\t\t\tclient: inputs.sdk.client,\n\t\t\tsigner: inputs.signer,\n\t\t\tbuild: async () => {\n\t\t\t\tconst tx = new Transaction();\n\t\t\t\tbuildSealPublishTransaction(\n\t\t\t\t\tpublishTransactionBuilder(tx),\n\t\t\t\t\tbuildOutput,\n\t\t\t\t\tinputs.signer.address,\n\t\t\t\t);\n\t\t\t\treturn tx.build({ client: inputs.sdk.client });\n\t\t\t},\n\t\t}).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tsealError('publish', {\n\t\t\t\t\tname: inputs.name,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`seal publish tx failed for signer '${inputs.signer.name}' ` +\n\t\t\t\t\t\t`(address=${inputs.signer.address}) during ${cause.phase}: ${cause.message}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t\tif (result.$kind === 'FailedTransaction') {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tsealError('publish', {\n\t\t\t\t\tname: inputs.name,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`seal publish tx executed but on-chain execution failed for signer ` +\n\t\t\t\t\t\t`'${inputs.signer.name}' (address=${inputs.signer.address}) ` +\n\t\t\t\t\t\tformatExecutedFailure(result.FailedTransaction),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn yield* projectSealPublishReceipt(inputs.name, result.Transaction);\n\t}).pipe(\n\t\tEffect.withSpan('devstack.plugin.seal.publish.suiTx', {\n\t\t\tattributes: {\n\t\t\t\t[SealSpans.name]: inputs.name,\n\t\t\t\t[SealSpans.signer]: inputs.signer.address,\n\t\t\t},\n\t\t}),\n\t);\n\nexport const publishSealPackage = (\n\tpublisher: ArtifactPublisher,\n\tinputs: SealPublishInputs,\n): Effect.Effect<{ readonly packageId: string }, ArtifactPublishError | SealError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst sourceHash = yield* hashMoveSources(inputs.movePackagePath).pipe(\n\t\t\tEffect.mapError((err) => moveBuildToSealError(inputs.name, err)),\n\t\t);\n\t\tconst inputsHash = sealPackageInputsHash(sourceHash, inputs.signer.address);\n\n\t\tconst cached: SealPackageCached = yield* publisher.publish<\n\t\t\tSealPackageCached,\n\t\t\tSealPackageVerified\n\t\t>({\n\t\t\tnamespace: SEAL_PACKAGE_NAMESPACE,\n\t\t\tchain: inputs.chain,\n\t\t\tcontentHash: inputsHash,\n\t\t\tverify: (cached) =>\n\t\t\t\tverifyObjectLenient(inputs.chainProbe, cached.packageId, SealPackageVerifyShape),\n\t\t\tproduce: runSealPublishTransaction(inputs).pipe(\n\t\t\t\tEffect.mapError((err) => sealProduceFailed('publish', err)),\n\t\t\t),\n\t\t\tregister: () => Effect.void,\n\t\t});\n\n\t\treturn { packageId: cached.packageId };\n\t}).pipe(\n\t\tEffect.withSpan('devstack.plugin.seal.publish', {\n\t\t\tattributes: { [SealSpans.name]: inputs.name, [SealSpans.chain]: inputs.chain },\n\t\t}),\n\t);\n\n// ---------------------------------------------------------------------------\n// KeyServer register — `keyServer` artifact\n// ---------------------------------------------------------------------------\n\nexport const SEAL_KEY_SERVER_NAMESPACE = 'seal/key-server-id' as const;\n\nexport interface SealKeyServerCached {\n\treadonly objectId: string;\n}\n\nexport const SealKeyServerVerifyShape = Schema.Struct({\n\tobjectId: Schema.String,\n\ttype: Schema.optional(Schema.Unknown),\n});\nexport type SealKeyServerVerified = Schema.Schema.Type<typeof SealKeyServerVerifyShape>;\n\nexport interface RegisterKeyServerTransactionInputs {\n\treadonly keyServerUrl: string;\n\treadonly sealPackageId: string;\n\treadonly publicKeyHex: string;\n\treadonly keyServerName: string;\n}\n\nexport interface RegisterKeyServerInputs extends RegisterKeyServerTransactionInputs {\n\treadonly name: string;\n\treadonly chain: ChainId;\n\treadonly signer: AccountValue;\n\treadonly sdk: SealSuiSdk;\n\treadonly chainProbe: ChainProbe<SealObjectProbeKey>;\n}\n\nexport const sealRegisterInputsHash = (\n\tinputs: RegisterKeyServerTransactionInputs,\n\tsignerAddress: string,\n): ContentHash =>\n\t// Keep the cache key path-safe and bounded. The raw material includes\n\t// a routed URL plus a long BLS public key; using it directly made the\n\t// best-effort cache write miss on normal restarts.\n\tcontentHash(\n\t\t`seal-register-v2|${createHash('sha256')\n\t\t\t.update(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tpackageId: inputs.sealPackageId,\n\t\t\t\t\tkeyServerUrl: inputs.keyServerUrl,\n\t\t\t\t\tkeyServerName: inputs.keyServerName,\n\t\t\t\t\tpublicKeyHex: inputs.publicKeyHex,\n\t\t\t\t\tsignerAddress,\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.digest('hex')}`,\n\t);\n\nexport interface SealRegisterTransactionBuilder<TArgument = unknown> {\n\treadonly pure: {\n\t\treadonly string: (value: string) => TArgument;\n\t\treadonly u8: (value: number) => TArgument;\n\t\treadonly vector: (type: 'u8', value: ReadonlyArray<number>) => TArgument;\n\t};\n\treadonly setSender: (address: string) => void;\n\treadonly moveCall: (input: {\n\t\treadonly target: string;\n\t\treadonly arguments: ReadonlyArray<TArgument>;\n\t}) => unknown;\n}\n\nexport type SealRegisterSdk = SealSuiSdk;\n\nconst registerTransactionBuilder = (\n\ttx: Transaction,\n): SealRegisterTransactionBuilder<TransactionArgument> => ({\n\tpure: {\n\t\tstring: (value) => tx.pure.string(value),\n\t\tu8: (value) => tx.pure.u8(value),\n\t\tvector: (type, value) => tx.pure.vector(type, [...value]),\n\t},\n\tsetSender: (address) => tx.setSender(address),\n\tmoveCall: (input) =>\n\t\ttx.moveCall({\n\t\t\ttarget: input.target,\n\t\t\targuments: [...input.arguments],\n\t\t}),\n});\n\nexport const buildRegisterKeyServerMoveCall = <TArgument>(\n\ttx: SealRegisterTransactionBuilder<TArgument>,\n\tinputs: RegisterKeyServerTransactionInputs,\n\tsignerAddress: string,\n): void => {\n\tconst pkBytes = fromHex(inputs.publicKeyHex);\n\ttx.setSender(signerAddress);\n\ttx.moveCall({\n\t\ttarget: `${inputs.sealPackageId}::key_server::create_and_transfer_v2_independent_server`,\n\t\targuments: [\n\t\t\ttx.pure.string(inputs.keyServerName),\n\t\t\ttx.pure.string(inputs.keyServerUrl),\n\t\t\ttx.pure.u8(KEY_TYPE_BONEH_FRANKLIN_BLS12381),\n\t\t\ttx.pure.vector('u8', Array.from(pkBytes)),\n\t\t],\n\t});\n};\n\nexport const pickCreatedKeyServerObjectId = (receipt: ExecutedReceipt): string | null =>\n\treceipt.objectChanges.find(\n\t\t(change) =>\n\t\t\tchange.idOperation === 'Created' &&\n\t\t\t(change.objectType?.endsWith('::key_server::KeyServer') ?? false),\n\t)?.objectId ?? null;\n\nexport const projectRegisterKeyServerReceipt = (\n\tname: string,\n\treceipt: ExecutedReceipt,\n): Effect.Effect<SealKeyServerCached, SealError> => {\n\tconst objectId = pickCreatedKeyServerObjectId(receipt);\n\tif (objectId === null) {\n\t\treturn Effect.fail(\n\t\t\tsealError('register', {\n\t\t\t\tname,\n\t\t\t\tmessage:\n\t\t\t\t\t`seal register tx created no ::key_server::KeyServer object ` +\n\t\t\t\t\t`(digest=${receipt.digest})`,\n\t\t\t}),\n\t\t);\n\t}\n\treturn Effect.succeed({ objectId });\n};\n\nexport const runRegisterKeyServerTransaction = (\n\tsdk: SealRegisterSdk,\n\tsigner: AccountValue,\n\tinputs: RegisterKeyServerInputs,\n): Effect.Effect<SealKeyServerCached, SealError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst result = yield* executeSuiTx({\n\t\t\tclient: sdk.client,\n\t\t\tsigner,\n\t\t\tbuild: async () => {\n\t\t\t\tconst tx = new Transaction();\n\t\t\t\tbuildRegisterKeyServerMoveCall(registerTransactionBuilder(tx), inputs, signer.address);\n\t\t\t\treturn tx.build({ client: sdk.client });\n\t\t\t},\n\t\t}).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tsealError('register', {\n\t\t\t\t\tname: inputs.name,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`seal register tx failed for signer '${signer.name}' ` +\n\t\t\t\t\t\t`(address=${signer.address}) during ${cause.phase}: ${cause.message}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t\tif (result.$kind === 'FailedTransaction') {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tsealError('register', {\n\t\t\t\t\tname: inputs.name,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`seal register tx executed but on-chain execution failed for signer ` +\n\t\t\t\t\t\t`'${signer.name}' (address=${signer.address}) ` +\n\t\t\t\t\t\tformatExecutedFailure(result.FailedTransaction),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn yield* projectRegisterKeyServerReceipt(inputs.name, result.Transaction);\n\t}).pipe(\n\t\tEffect.withSpan('devstack.plugin.seal.register.suiTx', {\n\t\t\tattributes: { [SealSpans.name]: inputs.name, [SealSpans.url]: inputs.keyServerUrl },\n\t\t}),\n\t);\n\nexport const registerKeyServer = (\n\tpublisher: ArtifactPublisher,\n\tinputs: RegisterKeyServerInputs,\n): Effect.Effect<{ readonly objectId: string }, ArtifactPublishError | SealError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst inputsHash = sealRegisterInputsHash(inputs, inputs.signer.address);\n\t\tconst cached: SealKeyServerCached = yield* publisher.publish<\n\t\t\tSealKeyServerCached,\n\t\t\tSealKeyServerVerified\n\t\t>({\n\t\t\tnamespace: SEAL_KEY_SERVER_NAMESPACE,\n\t\t\tchain: inputs.chain,\n\t\t\tcontentHash: inputsHash,\n\t\t\tverify: (cached) =>\n\t\t\t\tverifyObjectLenient(inputs.chainProbe, cached.objectId, SealKeyServerVerifyShape),\n\t\t\tproduce: runRegisterKeyServerTransaction(inputs.sdk, inputs.signer, inputs).pipe(\n\t\t\t\tEffect.mapError((err) => sealProduceFailed('register', err)),\n\t\t\t),\n\t\t\tregister: () => Effect.void,\n\t\t});\n\n\t\treturn { objectId: cached.objectId };\n\t}).pipe(\n\t\tEffect.withSpan('devstack.plugin.seal.register', {\n\t\t\tattributes: { [SealSpans.name]: inputs.name, [SealSpans.url]: inputs.keyServerUrl },\n\t\t}),\n\t);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"deploy.mjs","names":[],"sources":["../../../src/plugins/seal/deploy.ts"],"sourcesContent":["// Seal plugin — SDK-backed Move publish + on-chain KeyServer register.\n\nimport { createHash } from 'node:crypto';\n\nimport { Effect, Schema, type Scope } from 'effect';\n\nimport {\n\tTransaction,\n\ttype TransactionArgument,\n\ttype TransactionObjectArgument,\n} from '@mysten/sui/transactions';\n\nimport type { ChainProbe, ChainProbeSchema } from '../../contracts/chain-probe.ts';\nimport type { ContainerRuntime, ImageRef } from '../../contracts/container-runtime.ts';\nimport {\n\tartifactPublishError,\n\ttype ArtifactPublishError,\n\ttype ArtifactPublisher,\n} from '../../primitives/artifact-publisher.ts';\nimport { contentHash, type ContentHash } from '../../substrate/brand.ts';\nimport {\n\texecuteSuiTx,\n\tformatExecutedFailure,\n\thashMoveSources,\n\trunMoveBuild,\n\tscrubLocksHost,\n\twithMoveBuildLock,\n\ttype BuildOutput,\n\ttype ExecutedReceipt,\n\ttype MoveBuildError,\n\ttype ClientWithCoreApi,\n} from '../sui/index.ts';\nimport { fromHex } from '@mysten/sui/utils';\n\nimport type { AccountValue } from '../account/index.ts';\nimport { sealError, type SealError } from './errors.ts';\n\nconst KEY_TYPE_BONEH_FRANKLIN_BLS12381 = 0;\n\nexport type SealObjectProbeKey = { readonly kind: 'object'; readonly objectId: string };\n\nexport interface SealSuiSdk {\n\treadonly client: ClientWithCoreApi;\n}\n\nconst sealProduceFailed = (op: 'publish' | 'register', err: SealError): ArtifactPublishError =>\n\tartifactPublishError('produce-failed', `seal.${op} ${err.phase}: ${err.message}`);\n\nconst moveBuildToSealError = (name: string, err: MoveBuildError): SealError =>\n\tsealError('publish', {\n\t\tname,\n\t\tmessage: `seal publish ${err.phase} failed for source '${err.sourcePath}': ${err.message}`,\n\t\tcause: err,\n\t});\n\nconst verifyObjectLenient = <Verified>(\n\tprobe: ChainProbe<SealObjectProbeKey>,\n\tobjectId: string,\n\tschema: ChainProbeSchema<Verified>,\n): Effect.Effect<Verified | null, never> =>\n\tprobe\n\t\t.get({ kind: 'object', objectId }, schema, 'lenient')\n\t\t.pipe(Effect.catch(() => Effect.succeed(null as Verified | null)));\n\n// ---------------------------------------------------------------------------\n// Move publish — `sealPackage` artifact\n// ---------------------------------------------------------------------------\n\nexport const SEAL_PACKAGE_NAMESPACE = 'seal/package' as const;\n\nexport interface SealPackageCached {\n\treadonly packageId: string;\n\treadonly upgradeCapId?: string;\n}\n\nexport const SealPackageVerifyShape = Schema.Struct({\n\tobjectId: Schema.String,\n\ttype: Schema.optional(Schema.Unknown),\n});\nexport type SealPackageVerified = Schema.Schema.Type<typeof SealPackageVerifyShape>;\n\nexport interface SealPublishInputs {\n\treadonly name: string;\n\treadonly chainId: string;\n\treadonly movePackagePath: string;\n\treadonly signer: AccountValue;\n\treadonly sdk: SealSuiSdk;\n\treadonly runtime: ContainerRuntime;\n\treadonly buildImage?: ImageRef;\n\treadonly chainProbe: ChainProbe<SealObjectProbeKey>;\n}\n\nexport const sealPackageInputsHash = (\n\tsourceHash: ContentHash,\n\tsignerAddress: string,\n): ContentHash => contentHash(`seal-package|source=${sourceHash}|signer=${signerAddress}`);\n\nexport interface SealPublishTransactionBuilder<TUpgradeCap = unknown> {\n\treadonly setSender: (address: string) => void;\n\treadonly publish: (input: {\n\t\treadonly modules: ReadonlyArray<ReadonlyArray<number>>;\n\t\treadonly dependencies: ReadonlyArray<string>;\n\t}) => TUpgradeCap;\n\treadonly transferObjects: (objects: ReadonlyArray<TUpgradeCap>, recipient: string) => void;\n}\n\nconst publishTransactionBuilder = (\n\ttx: Transaction,\n): SealPublishTransactionBuilder<TransactionObjectArgument> => ({\n\tsetSender: (address) => tx.setSender(address),\n\tpublish: (input) =>\n\t\ttx.publish({\n\t\t\tmodules: input.modules.map((m) => [...m]),\n\t\t\tdependencies: [...input.dependencies],\n\t\t}),\n\ttransferObjects: (objects, recipient) => tx.transferObjects([...objects], recipient),\n});\n\nexport const buildSealPublishTransaction = <TUpgradeCap>(\n\ttx: SealPublishTransactionBuilder<TUpgradeCap>,\n\tbuildOutput: BuildOutput,\n\tsignerAddress: string,\n): void => {\n\ttx.setSender(signerAddress);\n\tconst upgradeCap = tx.publish({\n\t\tmodules: buildOutput.modules.map((m) => Array.from(m)),\n\t\tdependencies: [...buildOutput.dependencies],\n\t});\n\ttx.transferObjects([upgradeCap], signerAddress);\n};\n\nexport const pickPackageWriteObjectId = (receipt: ExecutedReceipt): string | null =>\n\treceipt.objectChanges.find((change) => change.outputState === 'PackageWrite')?.objectId ?? null;\n\nexport const pickUpgradeCapObjectId = (receipt: ExecutedReceipt): string | null =>\n\treceipt.objectChanges.find(\n\t\t(change) =>\n\t\t\tchange.idOperation === 'Created' &&\n\t\t\t(change.objectType?.endsWith('::package::UpgradeCap') ?? false),\n\t)?.objectId ?? null;\n\nexport const projectSealPublishReceipt = (\n\tname: string,\n\treceipt: ExecutedReceipt,\n): Effect.Effect<SealPackageCached, SealError> => {\n\tconst packageId = pickPackageWriteObjectId(receipt);\n\tif (packageId === null) {\n\t\treturn Effect.fail(\n\t\t\tsealError('publish', {\n\t\t\t\tname,\n\t\t\t\tmessage: `seal publish tx wrote no PackageWrite object ` + `(digest=${receipt.digest})`,\n\t\t\t}),\n\t\t);\n\t}\n\tconst upgradeCapId = pickUpgradeCapObjectId(receipt);\n\treturn Effect.succeed({\n\t\tpackageId,\n\t\t...(upgradeCapId !== null ? { upgradeCapId } : {}),\n\t});\n};\n\nexport const runSealPublishTransaction = (\n\tinputs: SealPublishInputs,\n): Effect.Effect<SealPackageCached, SealError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\t// Scrub the shared Move git cache, then build — both under the\n\t\t// process-wide Move-build permit (`withMoveBuildLock`) so this build\n\t\t// can't race a concurrent package build's host scrub against a sibling\n\t\t// container's `git clone` into the same `~/.move/git` cache. The host\n\t\t// scrub strips stale pins so they can't leak into the build; the\n\t\t// package's own Move.lock is scrubbed inside the container on a\n\t\t// disposable copy, leaving the developer's checked-in source untouched.\n\t\tconst buildOutput = yield* withMoveBuildLock(\n\t\t\tEffect.gen(function* () {\n\t\t\t\tyield* scrubLocksHost(inputs.movePackagePath, '~/.move').pipe(\n\t\t\t\t\tEffect.mapError((err) => moveBuildToSealError(inputs.name, err)),\n\t\t\t\t);\n\n\t\t\t\treturn yield* runMoveBuild({\n\t\t\t\t\tsourcePath: inputs.movePackagePath,\n\t\t\t\t\tpackageName: inputs.name,\n\t\t\t\t\truntime: inputs.runtime,\n\t\t\t\t\t...(inputs.buildImage !== undefined ? { buildImage: inputs.buildImage } : {}),\n\t\t\t\t}).pipe(Effect.mapError((err) => moveBuildToSealError(inputs.name, err)));\n\t\t\t}),\n\t\t);\n\n\t\tconst result = yield* executeSuiTx({\n\t\t\tclient: inputs.sdk.client,\n\t\t\tsigner: inputs.signer,\n\t\t\tbuild: async () => {\n\t\t\t\tconst tx = new Transaction();\n\t\t\t\tbuildSealPublishTransaction(\n\t\t\t\t\tpublishTransactionBuilder(tx),\n\t\t\t\t\tbuildOutput,\n\t\t\t\t\tinputs.signer.address,\n\t\t\t\t);\n\t\t\t\treturn tx.build({ client: inputs.sdk.client });\n\t\t\t},\n\t\t}).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tsealError('publish', {\n\t\t\t\t\tname: inputs.name,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`seal publish tx failed for signer '${inputs.signer.name}' ` +\n\t\t\t\t\t\t`(address=${inputs.signer.address}) during ${cause.phase}: ${cause.message}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t\tif (result.$kind === 'FailedTransaction') {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tsealError('publish', {\n\t\t\t\t\tname: inputs.name,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`seal publish tx executed but on-chain execution failed for signer ` +\n\t\t\t\t\t\t`'${inputs.signer.name}' (address=${inputs.signer.address}) ` +\n\t\t\t\t\t\tformatExecutedFailure(result.FailedTransaction),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn yield* projectSealPublishReceipt(inputs.name, result.Transaction);\n\t});\n\nexport const publishSealPackage = (\n\tpublisher: ArtifactPublisher,\n\tinputs: SealPublishInputs,\n): Effect.Effect<{ readonly packageId: string }, ArtifactPublishError | SealError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst sourceHash = yield* hashMoveSources(inputs.movePackagePath).pipe(\n\t\t\tEffect.mapError((err) => moveBuildToSealError(inputs.name, err)),\n\t\t);\n\t\tconst inputsHash = sealPackageInputsHash(sourceHash, inputs.signer.address);\n\n\t\tconst cached: SealPackageCached = yield* publisher.publish<\n\t\t\tSealPackageCached,\n\t\t\tSealPackageVerified\n\t\t>({\n\t\t\tnamespace: SEAL_PACKAGE_NAMESPACE,\n\t\t\tchain: inputs.chainId,\n\t\t\tcontentHash: inputsHash,\n\t\t\tverify: (cached) =>\n\t\t\t\tverifyObjectLenient(inputs.chainProbe, cached.packageId, SealPackageVerifyShape),\n\t\t\tproduce: runSealPublishTransaction(inputs).pipe(\n\t\t\t\tEffect.mapError((err) => sealProduceFailed('publish', err)),\n\t\t\t),\n\t\t\tregister: () => Effect.void,\n\t\t});\n\n\t\treturn { packageId: cached.packageId };\n\t});\n\n// ---------------------------------------------------------------------------\n// KeyServer register — `keyServer` artifact\n// ---------------------------------------------------------------------------\n\nexport const SEAL_KEY_SERVER_NAMESPACE = 'seal/key-server-id' as const;\n\nexport interface SealKeyServerCached {\n\treadonly objectId: string;\n}\n\nexport const SealKeyServerVerifyShape = Schema.Struct({\n\tobjectId: Schema.String,\n\ttype: Schema.optional(Schema.Unknown),\n});\nexport type SealKeyServerVerified = Schema.Schema.Type<typeof SealKeyServerVerifyShape>;\n\nexport interface RegisterKeyServerTransactionInputs {\n\treadonly keyServerUrl: string;\n\treadonly sealPackageId: string;\n\treadonly publicKeyHex: string;\n\treadonly keyServerName: string;\n}\n\nexport interface RegisterKeyServerInputs extends RegisterKeyServerTransactionInputs {\n\treadonly name: string;\n\treadonly chainId: string;\n\treadonly signer: AccountValue;\n\treadonly sdk: SealSuiSdk;\n\treadonly chainProbe: ChainProbe<SealObjectProbeKey>;\n}\n\nexport const sealRegisterInputsHash = (\n\tinputs: RegisterKeyServerTransactionInputs,\n\tsignerAddress: string,\n): ContentHash =>\n\t// Keep the cache key path-safe and bounded. The raw material includes\n\t// a routed URL plus a long BLS public key; using it directly made the\n\t// best-effort cache write miss on normal restarts.\n\tcontentHash(\n\t\t`seal-register-v2|${createHash('sha256')\n\t\t\t.update(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tpackageId: inputs.sealPackageId,\n\t\t\t\t\tkeyServerUrl: inputs.keyServerUrl,\n\t\t\t\t\tkeyServerName: inputs.keyServerName,\n\t\t\t\t\tpublicKeyHex: inputs.publicKeyHex,\n\t\t\t\t\tsignerAddress,\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.digest('hex')}`,\n\t);\n\nexport interface SealRegisterTransactionBuilder<TArgument = unknown> {\n\treadonly pure: {\n\t\treadonly string: (value: string) => TArgument;\n\t\treadonly u8: (value: number) => TArgument;\n\t\treadonly vector: (type: 'u8', value: ReadonlyArray<number>) => TArgument;\n\t};\n\treadonly setSender: (address: string) => void;\n\treadonly moveCall: (input: {\n\t\treadonly target: string;\n\t\treadonly arguments: ReadonlyArray<TArgument>;\n\t}) => unknown;\n}\n\nexport type SealRegisterSdk = SealSuiSdk;\n\nconst registerTransactionBuilder = (\n\ttx: Transaction,\n): SealRegisterTransactionBuilder<TransactionArgument> => ({\n\tpure: {\n\t\tstring: (value) => tx.pure.string(value),\n\t\tu8: (value) => tx.pure.u8(value),\n\t\tvector: (type, value) => tx.pure.vector(type, [...value]),\n\t},\n\tsetSender: (address) => tx.setSender(address),\n\tmoveCall: (input) =>\n\t\ttx.moveCall({\n\t\t\ttarget: input.target,\n\t\t\targuments: [...input.arguments],\n\t\t}),\n});\n\nexport const buildRegisterKeyServerMoveCall = <TArgument>(\n\ttx: SealRegisterTransactionBuilder<TArgument>,\n\tinputs: RegisterKeyServerTransactionInputs,\n\tsignerAddress: string,\n): void => {\n\tconst pkBytes = fromHex(inputs.publicKeyHex);\n\ttx.setSender(signerAddress);\n\ttx.moveCall({\n\t\ttarget: `${inputs.sealPackageId}::key_server::create_and_transfer_v2_independent_server`,\n\t\targuments: [\n\t\t\ttx.pure.string(inputs.keyServerName),\n\t\t\ttx.pure.string(inputs.keyServerUrl),\n\t\t\ttx.pure.u8(KEY_TYPE_BONEH_FRANKLIN_BLS12381),\n\t\t\ttx.pure.vector('u8', Array.from(pkBytes)),\n\t\t],\n\t});\n};\n\nexport const pickCreatedKeyServerObjectId = (receipt: ExecutedReceipt): string | null =>\n\treceipt.objectChanges.find(\n\t\t(change) =>\n\t\t\tchange.idOperation === 'Created' &&\n\t\t\t(change.objectType?.endsWith('::key_server::KeyServer') ?? false),\n\t)?.objectId ?? null;\n\nexport const projectRegisterKeyServerReceipt = (\n\tname: string,\n\treceipt: ExecutedReceipt,\n): Effect.Effect<SealKeyServerCached, SealError> => {\n\tconst objectId = pickCreatedKeyServerObjectId(receipt);\n\tif (objectId === null) {\n\t\treturn Effect.fail(\n\t\t\tsealError('register', {\n\t\t\t\tname,\n\t\t\t\tmessage:\n\t\t\t\t\t`seal register tx created no ::key_server::KeyServer object ` +\n\t\t\t\t\t`(digest=${receipt.digest})`,\n\t\t\t}),\n\t\t);\n\t}\n\treturn Effect.succeed({ objectId });\n};\n\nexport const runRegisterKeyServerTransaction = (\n\tsdk: SealRegisterSdk,\n\tsigner: AccountValue,\n\tinputs: RegisterKeyServerInputs,\n): Effect.Effect<SealKeyServerCached, SealError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst result = yield* executeSuiTx({\n\t\t\tclient: sdk.client,\n\t\t\tsigner,\n\t\t\tbuild: async () => {\n\t\t\t\tconst tx = new Transaction();\n\t\t\t\tbuildRegisterKeyServerMoveCall(registerTransactionBuilder(tx), inputs, signer.address);\n\t\t\t\treturn tx.build({ client: sdk.client });\n\t\t\t},\n\t\t}).pipe(\n\t\t\tEffect.mapError((cause) =>\n\t\t\t\tsealError('register', {\n\t\t\t\t\tname: inputs.name,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`seal register tx failed for signer '${signer.name}' ` +\n\t\t\t\t\t\t`(address=${signer.address}) during ${cause.phase}: ${cause.message}`,\n\t\t\t\t\tcause,\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t\tif (result.$kind === 'FailedTransaction') {\n\t\t\treturn yield* Effect.fail(\n\t\t\t\tsealError('register', {\n\t\t\t\t\tname: inputs.name,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`seal register tx executed but on-chain execution failed for signer ` +\n\t\t\t\t\t\t`'${signer.name}' (address=${signer.address}) ` +\n\t\t\t\t\t\tformatExecutedFailure(result.FailedTransaction),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn yield* projectRegisterKeyServerReceipt(inputs.name, result.Transaction);\n\t});\n\nexport const registerKeyServer = (\n\tpublisher: ArtifactPublisher,\n\tinputs: RegisterKeyServerInputs,\n): Effect.Effect<{ readonly objectId: string }, ArtifactPublishError | SealError, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst inputsHash = sealRegisterInputsHash(inputs, inputs.signer.address);\n\t\tconst cached: SealKeyServerCached = yield* publisher.publish<\n\t\t\tSealKeyServerCached,\n\t\t\tSealKeyServerVerified\n\t\t>({\n\t\t\tnamespace: SEAL_KEY_SERVER_NAMESPACE,\n\t\t\tchain: inputs.chainId,\n\t\t\tcontentHash: inputsHash,\n\t\t\tverify: (cached) =>\n\t\t\t\tverifyObjectLenient(inputs.chainProbe, cached.objectId, SealKeyServerVerifyShape),\n\t\t\tproduce: runRegisterKeyServerTransaction(inputs.sdk, inputs.signer, inputs).pipe(\n\t\t\t\tEffect.mapError((err) => sealProduceFailed('register', err)),\n\t\t\t),\n\t\t\tregister: () => Effect.void,\n\t\t});\n\n\t\treturn { objectId: cached.objectId };\n\t});\n"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { ConfigIssue } from "../../substrate/runtime/config-validation.mjs";
|
|
|
2
2
|
import { ForkIncompatibleError } from "../../substrate/runtime/mode-errors.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/plugins/seal/errors.d.ts
|
|
5
|
-
/** Phases for `SealError`. Closed sum
|
|
6
|
-
*
|
|
5
|
+
/** Phases for `SealError`. Closed sum (07-seal.md §"Adjacent Seal
|
|
6
|
+
* references").
|
|
7
7
|
*
|
|
8
8
|
* Phase semantics:
|
|
9
9
|
* - `port-alloc` — router `seal` entrypoint not registered.
|
|
@@ -20,9 +20,8 @@ import { ForkIncompatibleError } from "../../substrate/runtime/mode-errors.mjs";
|
|
|
20
20
|
* - `ready` — /health probe timed out.
|
|
21
21
|
* - `seal` — generic catch-all for non-phaseable failures. */
|
|
22
22
|
type SealPhase = 'port-alloc' | 'image' | 'keygen' | 'publish' | 'register' | 'config-render' | 'container' | 'ready' | 'seal';
|
|
23
|
-
/** Generic Seal plugin error.
|
|
24
|
-
*
|
|
25
|
-
* `keyServer` field (07-seal.md §Opportunities #6).
|
|
23
|
+
/** Generic Seal plugin error. A structured tagged error
|
|
24
|
+
* (07-seal.md §Opportunities #6).
|
|
26
25
|
*
|
|
27
26
|
* Distilled-doc invariant #16: `stdout` / `stderr` MUST be redacted
|
|
28
27
|
* via `redactMasterKey` at every raise site that touches `seal-cli`
|
|
@@ -12,14 +12,7 @@ const sealError = (phase, parts) => ({
|
|
|
12
12
|
* two-layer cause walk. */
|
|
13
13
|
const isSealError = (value) => typeof value === "object" && value !== null && value._tag === "SealError";
|
|
14
14
|
const sealConfigError = defineConfigError("SealConfigError");
|
|
15
|
-
/** Error tags this plugin contributes — surfaced to the cause walker
|
|
16
|
-
* via `PluginErrorContribution`. */
|
|
17
|
-
const SEAL_ERROR_TAGS = [
|
|
18
|
-
"SealError",
|
|
19
|
-
"ForkIncompatibleError",
|
|
20
|
-
"SealConfigError"
|
|
21
|
-
];
|
|
22
15
|
//#endregion
|
|
23
|
-
export {
|
|
16
|
+
export { isSealError, sealConfigError, sealError };
|
|
24
17
|
|
|
25
18
|
//# sourceMappingURL=errors.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.mjs","names":[],"sources":["../../../src/plugins/seal/errors.ts"],"sourcesContent":["// Seal plugin — typed errors.\n//\n// Every error surfacing site that may carry stdout/stderr from the\n// seal-cli MUST run the bytes through a master-key redactor. The\n// redactor lives in `keygen.ts` so the keygen pipeline is the single\n// owner of the redaction substrate; this file only declares the\n// closed phase set + the structured error shapes.\n//\n// Effect v4: errors are plain interfaces with a `_tag` discriminator\n// (per surrounding subsystem style). `Effect.catchTag` / `catchTags`\n// match on the literal `_tag`.\n//\n// `ForkIncompatibleError` is a cross-cutting mode-refusal shape\n// owned by `substrate/runtime/mode-errors.ts`; seal contributes\n// the `sealLocalKeygen` variant via the factory below. Substrate\n// owns the canonical re-export; this module does NOT re-export the\n// class — the cross-plugin re-export was the cause of a name\n// collision at the root barrel.\n\nimport { ForkIncompatibleError } from '../../substrate/runtime/mode-errors.ts';\nimport { defineConfigError, type ConfigIssue } from '../../substrate/runtime/config-validation.ts';\n\n// ---------------------------------------------------------------------------\n// SealError — the plugin's primary tagged error\n// ---------------------------------------------------------------------------\n\n/** Phases for `SealError`. Closed sum
|
|
1
|
+
{"version":3,"file":"errors.mjs","names":[],"sources":["../../../src/plugins/seal/errors.ts"],"sourcesContent":["// Seal plugin — typed errors.\n//\n// Every error surfacing site that may carry stdout/stderr from the\n// seal-cli MUST run the bytes through a master-key redactor. The\n// redactor lives in `keygen.ts` so the keygen pipeline is the single\n// owner of the redaction substrate; this file only declares the\n// closed phase set + the structured error shapes.\n//\n// Effect v4: errors are plain interfaces with a `_tag` discriminator\n// (per surrounding subsystem style). `Effect.catchTag` / `catchTags`\n// match on the literal `_tag`.\n//\n// `ForkIncompatibleError` is a cross-cutting mode-refusal shape\n// owned by `substrate/runtime/mode-errors.ts`; seal contributes\n// the `sealLocalKeygen` variant via the factory below. Substrate\n// owns the canonical re-export; this module does NOT re-export the\n// class — the cross-plugin re-export was the cause of a name\n// collision at the root barrel.\n\nimport { ForkIncompatibleError } from '../../substrate/runtime/mode-errors.ts';\nimport { defineConfigError, type ConfigIssue } from '../../substrate/runtime/config-validation.ts';\n\n// ---------------------------------------------------------------------------\n// SealError — the plugin's primary tagged error\n// ---------------------------------------------------------------------------\n\n/** Phases for `SealError`. Closed sum (07-seal.md §\"Adjacent Seal\n * references\").\n *\n * Phase semantics:\n * - `port-alloc` — router `seal` entrypoint not registered.\n * - `image` — image build / pull failed (bootstrap-asset\n * cargo step).\n * - `keygen` — `seal-cli genkey` container failed OR stdout\n * parse failed.\n * - `publish` — Move publish of the seal contracts failed.\n * - `register` — `KeyServer::create_and_transfer_v2_independent_server`\n * Move call failed OR object id parse failed.\n * - `config-render` — key-server-config.yaml / master-key.env write\n * failed (FS perms, disk full).\n * - `container` — long-running key-server container start failed.\n * - `ready` — /health probe timed out.\n * - `seal` — generic catch-all for non-phaseable failures. */\nexport type SealPhase =\n\t| 'port-alloc'\n\t| 'image'\n\t| 'keygen'\n\t| 'publish'\n\t| 'register'\n\t| 'config-render'\n\t| 'container'\n\t| 'ready'\n\t| 'seal';\n\n/** Generic Seal plugin error. A structured tagged error\n * (07-seal.md §Opportunities #6).\n *\n * Distilled-doc invariant #16: `stdout` / `stderr` MUST be redacted\n * via `redactMasterKey` at every raise site that touches `seal-cli`\n * output. The raise sites in this plugin pipe their captures\n * through the redactor before constructing the error. */\nexport interface SealError {\n\treadonly _tag: 'SealError';\n\treadonly phase: SealPhase;\n\t/** Seal instance name (default `'seal'`). Folds into TUI display\n\t * + cause-walker context. */\n\treadonly name: string;\n\treadonly message: string;\n\treadonly stdout?: string;\n\treadonly stderr?: string;\n\treadonly exitCode?: number;\n\treadonly cause?: unknown;\n}\n\nexport const sealError = (\n\tphase: SealPhase,\n\tparts: Omit<SealError, '_tag' | 'phase'>,\n): SealError => ({ _tag: 'SealError', phase, ...parts });\n\n/** Structural predicate — true iff `value` has the `SealError` tag.\n * Used at re-wrap sites (e.g. `key-server.ts` probe mapError) to\n * unwrap a nested `SealError` rather than re-wrap and create a\n * two-layer cause walk. */\nexport const isSealError = (value: unknown): value is SealError =>\n\ttypeof value === 'object' &&\n\tvalue !== null &&\n\t(value as { readonly _tag?: unknown })._tag === 'SealError';\n\n// ---------------------------------------------------------------------------\n// SealConfigError — synchronous factory-time configuration faults\n// ---------------------------------------------------------------------------\n\nexport interface SealConfigError extends ConfigIssue {\n\treadonly _tag: 'SealConfigError';\n}\n\nexport const sealConfigError = defineConfigError('SealConfigError');\n\n// ---------------------------------------------------------------------------\n// Error-tag inventory\n// ---------------------------------------------------------------------------\n\n/** The catchable error tags this plugin exposes. Pinned against the\n * user-facing error catalog by the error-catalog-parity test. */\nexport const SEAL_ERROR_TAGS = ['SealError', 'ForkIncompatibleError', 'SealConfigError'] as const;\n\n/** Union of every error a Seal-plugin caller may encounter. */\nexport type SealAnyError = SealError | ForkIncompatibleError | SealConfigError;\n"],"mappings":";;;AA0EA,MAAa,aACZ,OACA,WACgB;CAAE,MAAM;CAAa;CAAO,GAAG;AAAM;;;;;AAMtD,MAAa,eAAe,UAC3B,OAAO,UAAU,YACjB,UAAU,QACT,MAAsC,SAAS;AAUjD,MAAa,kBAAkB,kBAAkB,iBAAiB"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { CodegenableDecl } from "../../contracts/codegenable.mjs";
|
|
2
|
-
import { RoutableDecl } from "../../contracts/routable.mjs";
|
|
3
|
-
import { SnapshotableDecl } from "../../contracts/snapshotable.mjs";
|
|
4
1
|
import { AnyResourceRef, Plugin, ResourceRef } from "../../substrate/plugin.mjs";
|
|
5
2
|
import { ModeNamespace } from "../../api/mode-narrowed-factory.mjs";
|
|
6
|
-
import { SuiClient } from "../sui/mode/shared.mjs";
|
|
7
3
|
import { SuiOptions } from "../sui/mode/spec.mjs";
|
|
4
|
+
import { SuiClient } from "../sui/mode/shared.mjs";
|
|
8
5
|
import { AccountValue } from "../account/service.mjs";
|
|
9
6
|
import { AccountResourceId } from "../account/index.mjs";
|
|
10
7
|
import { SealKeyManager } from "./key-manager.mjs";
|
|
@@ -76,19 +73,7 @@ declare const seal: <const Signer extends SealSignerMember = SealSignerMember>(o
|
|
|
76
73
|
readonly mode: SuiOptions["mode"];
|
|
77
74
|
}>;
|
|
78
75
|
readonly signer: Signer;
|
|
79
|
-
} ? T extends Readonly<Record<string, AnyResourceRef>> ? readonly T[keyof T][] : readonly [] : never : never
|
|
80
|
-
mode: "live";
|
|
81
|
-
manager: null;
|
|
82
|
-
serverConfigs: ReadonlyArray<SealKeyServerEntry>;
|
|
83
|
-
keyServerUrl: string;
|
|
84
|
-
objectId: string;
|
|
85
|
-
}, readonly [], readonly [SnapshotableDecl, CodegenableDecl<"seal-key-server">]> | Plugin<`seal:${string}`, {
|
|
86
|
-
mode: "fork-known";
|
|
87
|
-
manager: null;
|
|
88
|
-
serverConfigs: ReadonlyArray<SealKeyServerEntry>;
|
|
89
|
-
keyServerUrl: string;
|
|
90
|
-
objectId: string;
|
|
91
|
-
}, readonly [], readonly [SnapshotableDecl, CodegenableDecl<"seal-key-server">]>;
|
|
76
|
+
} ? T extends Readonly<Record<string, AnyResourceRef>> ? readonly T[keyof T][] : readonly [] : never : never> | Plugin<`seal:${string}`, SealResolved, readonly []>;
|
|
92
77
|
/** Mode-narrowed factory namespace.
|
|
93
78
|
*
|
|
94
79
|
* Usage:
|
|
@@ -116,7 +101,7 @@ declare const sealFor: ModeNamespace<{
|
|
|
116
101
|
readonly mode: SuiOptions["mode"];
|
|
117
102
|
}>;
|
|
118
103
|
readonly signer: Signer;
|
|
119
|
-
} ? T extends Readonly<Record<string, AnyResourceRef>> ? readonly T[keyof T][] : readonly [] : never : never
|
|
104
|
+
} ? T extends Readonly<Record<string, AnyResourceRef>> ? readonly T[keyof T][] : readonly [] : never : never>;
|
|
120
105
|
};
|
|
121
106
|
live: {
|
|
122
107
|
testnet: (opts?: Omit<SealLiveOptions, "network">) => Plugin<`seal:${string}`, {
|
|
@@ -125,30 +110,24 @@ declare const sealFor: ModeNamespace<{
|
|
|
125
110
|
serverConfigs: ReadonlyArray<SealKeyServerEntry>;
|
|
126
111
|
keyServerUrl: string;
|
|
127
112
|
objectId: string;
|
|
128
|
-
}, readonly []
|
|
113
|
+
}, readonly []>;
|
|
129
114
|
mainnet: (opts?: Omit<SealLiveOptions, "network">) => Plugin<`seal:${string}`, {
|
|
130
115
|
mode: "live";
|
|
131
116
|
manager: null;
|
|
132
117
|
serverConfigs: ReadonlyArray<SealKeyServerEntry>;
|
|
133
118
|
keyServerUrl: string;
|
|
134
119
|
objectId: string;
|
|
135
|
-
}, readonly []
|
|
120
|
+
}, readonly []>;
|
|
136
121
|
custom: (opts: Required<Pick<SealLiveOptions, "objectId" | "keyServerUrl">> & SealLiveOptions) => Plugin<`seal:${string}`, {
|
|
137
122
|
mode: "live";
|
|
138
123
|
manager: null;
|
|
139
124
|
serverConfigs: ReadonlyArray<SealKeyServerEntry>;
|
|
140
125
|
keyServerUrl: string;
|
|
141
126
|
objectId: string;
|
|
142
|
-
}, readonly []
|
|
127
|
+
}, readonly []>;
|
|
143
128
|
};
|
|
144
129
|
fork: {
|
|
145
|
-
forkKnown: (opts: SealForkKnownOptions) => Plugin<`seal:${string}`,
|
|
146
|
-
mode: "fork-known";
|
|
147
|
-
manager: null;
|
|
148
|
-
serverConfigs: ReadonlyArray<SealKeyServerEntry>;
|
|
149
|
-
keyServerUrl: string;
|
|
150
|
-
objectId: string;
|
|
151
|
-
}, readonly [], readonly [SnapshotableDecl, CodegenableDecl<"seal-key-server">]>;
|
|
130
|
+
forkKnown: (opts: SealForkKnownOptions) => Plugin<`seal:${string}`, SealResolved, readonly []>;
|
|
152
131
|
};
|
|
153
132
|
}>;
|
|
154
133
|
//#endregion
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { definePlugin } from "../../substrate/plugin.mjs";
|
|
2
2
|
import "../../api/define-plugin.mjs";
|
|
3
3
|
import { IdentityContext, StackPathsService } from "../../substrate/runtime/paths.mjs";
|
|
4
|
+
import { CacheService } from "../../substrate/runtime/cache/service.mjs";
|
|
5
|
+
import "../../substrate/runtime/cache/index.mjs";
|
|
4
6
|
import { ContainerRuntimeService } from "../../runtime/docker/service.mjs";
|
|
5
|
-
import {
|
|
7
|
+
import { PluginContext } from "../../substrate/plugin-ctx.mjs";
|
|
6
8
|
import { chainProbeFor } from "../../substrate/runtime/strategy-registry/chain-probe-for.mjs";
|
|
7
9
|
import "../../substrate/runtime/strategy-registry/index.mjs";
|
|
8
10
|
import { DEFAULT_KEY_SERVER_PORT, buildSealKeyServerPublicRoute, makeSealRoutable } from "./routable.mjs";
|
|
9
|
-
import { pluginErrorContributions } from "../../api/plugin-errors.mjs";
|
|
10
11
|
import { defineModeNamespace } from "../../api/mode-narrowed-factory.mjs";
|
|
11
12
|
import { suiResource } from "../sui/index.mjs";
|
|
12
13
|
import { withSubnetAddressing } from "../../substrate/runtime/subnet-broker.mjs";
|
|
13
14
|
import { sealPluginKey } from "./plugin-key.mjs";
|
|
14
|
-
import { makeSealCodegenable } from "./codegen.mjs";
|
|
15
|
-
import {
|
|
15
|
+
import { makeSealCodegenable, makeSealStaticCodegen } from "./codegen.mjs";
|
|
16
|
+
import { sealError } from "./errors.mjs";
|
|
16
17
|
import { validateLiveInputs } from "./mode/live.mjs";
|
|
17
18
|
import { validateForkKnownInputs } from "./mode/fork-known.mjs";
|
|
18
|
-
import "./spans.mjs";
|
|
19
19
|
import { buildSealNetworkName, deriveSealSubnetPrefix } from "./key-server.mjs";
|
|
20
20
|
import { DEFAULT_SEAL_VERSION } from "./bootstrap-assets/source-fetch.mjs";
|
|
21
21
|
import { bootLocalKeygen, resolveLocalKeygenOptions } from "./mode/local-keygen.mjs";
|
|
@@ -24,7 +24,6 @@ import { makeKnownSnapshotable, makeLocalKeygenSnapshotable } from "./snapshot.m
|
|
|
24
24
|
import { bootSealService } from "./service.mjs";
|
|
25
25
|
import { Effect, FileSystem, Path } from "effect";
|
|
26
26
|
//#region src/plugins/seal/index.ts
|
|
27
|
-
const sealErrorContributions = pluginErrorContributions(SEAL_ERROR_TAGS);
|
|
28
27
|
/** Constants + shared knobs for the buildXyz helpers below. */
|
|
29
28
|
const DEFAULT_NAME = "seal";
|
|
30
29
|
/** Build the local-keygen-mode plugin. The service contributes
|
|
@@ -44,15 +43,20 @@ const buildLocalKeygenPlugin = (opts) => {
|
|
|
44
43
|
role: "service",
|
|
45
44
|
section: "service",
|
|
46
45
|
pluginKey: sealPluginKey(resolved.name),
|
|
46
|
+
staticCodegen: () => [makeSealStaticCodegen({
|
|
47
|
+
name: resolved.name,
|
|
48
|
+
mode: "local-keygen"
|
|
49
|
+
})],
|
|
47
50
|
start: (deps) => Effect.gen(function* () {
|
|
51
|
+
const ctx = yield* PluginContext;
|
|
48
52
|
const { sui, signer: signerAccount } = deps;
|
|
49
53
|
const runtime = yield* ContainerRuntimeService;
|
|
50
54
|
const identity = yield* IdentityContext;
|
|
51
|
-
const publisher = yield*
|
|
55
|
+
const publisher = yield* CacheService;
|
|
52
56
|
const stackPaths = yield* StackPathsService;
|
|
53
57
|
const fs = yield* FileSystem.FileSystem;
|
|
54
58
|
const path = yield* Path.Path;
|
|
55
|
-
const probe = yield* chainProbeFor(sui.
|
|
59
|
+
const probe = yield* chainProbeFor(sui.chainId);
|
|
56
60
|
const servicePath = path.join(stackPaths.stackRoot, "seal", resolved.name);
|
|
57
61
|
yield* fs.makeDirectory(servicePath, { recursive: true }).pipe(Effect.catch((cause) => Effect.fail(sealError("config-render", {
|
|
58
62
|
name: resolved.name,
|
|
@@ -83,7 +87,7 @@ const buildLocalKeygenPlugin = (opts) => {
|
|
|
83
87
|
sdk: sui.sdk,
|
|
84
88
|
...sui.buildImage !== null ? { buildImage: sui.buildImage } : {},
|
|
85
89
|
chainProbe: probe,
|
|
86
|
-
|
|
90
|
+
chainId: sui.chainId,
|
|
87
91
|
servicePath,
|
|
88
92
|
containerName: `devstack-${identity.app}-${identity.stack}-seal-${resolved.name}-key-server`,
|
|
89
93
|
labels: {
|
|
@@ -97,34 +101,29 @@ const buildLocalKeygenPlugin = (opts) => {
|
|
|
97
101
|
routedHostname: routed.hostname,
|
|
98
102
|
routedUrl: routed.url
|
|
99
103
|
}, resolved);
|
|
100
|
-
|
|
104
|
+
const resolvedValue = {
|
|
101
105
|
...boot.keyServer,
|
|
102
106
|
mode: "local-keygen",
|
|
103
107
|
manager: boot.keyManager
|
|
104
108
|
};
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
ctx.snapshotExtra(makeLocalKeygenSnapshotable({
|
|
110
|
+
name: resolved.name,
|
|
111
|
+
app: identity.app,
|
|
112
|
+
stack: identity.stack
|
|
113
|
+
}));
|
|
114
|
+
ctx.codegen(makeSealCodegenable({
|
|
108
115
|
name: resolved.name,
|
|
109
|
-
objectId:
|
|
110
|
-
keyServerUrl:
|
|
111
|
-
serverConfigs:
|
|
116
|
+
objectId: resolvedValue.objectId,
|
|
117
|
+
keyServerUrl: resolvedValue.keyServerUrl,
|
|
118
|
+
serverConfigs: resolvedValue.serverConfigs,
|
|
112
119
|
mode: "local-keygen"
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
makeSealCodegenable(bindings),
|
|
121
|
-
makeSealRoutable({
|
|
122
|
-
name: resolved.name,
|
|
123
|
-
containerName: `devstack-${acquireCtx.identity.app}-${acquireCtx.identity.stack}-seal-${resolved.name}-key-server`
|
|
124
|
-
})
|
|
125
|
-
];
|
|
126
|
-
},
|
|
127
|
-
errorContributions: sealErrorContributions
|
|
120
|
+
}));
|
|
121
|
+
ctx.endpoint(makeSealRoutable({
|
|
122
|
+
name: resolved.name,
|
|
123
|
+
containerName: `devstack-${identity.app}-${identity.stack}-seal-${resolved.name}-key-server`
|
|
124
|
+
}));
|
|
125
|
+
return resolvedValue;
|
|
126
|
+
})
|
|
128
127
|
});
|
|
129
128
|
};
|
|
130
129
|
/** Build the live-mode plugin. No Routable (URL is remote). */
|
|
@@ -146,25 +145,35 @@ const buildLivePlugin = (opts) => {
|
|
|
146
145
|
mode: "live"
|
|
147
146
|
};
|
|
148
147
|
const snap = makeKnownSnapshotable({ name });
|
|
149
|
-
const codegen = makeSealCodegenable(bindings);
|
|
150
148
|
return definePlugin({
|
|
151
149
|
id: sealResource.id,
|
|
152
150
|
role: "task",
|
|
153
151
|
section: "service",
|
|
152
|
+
staticCodegen: () => [makeSealStaticCodegen({
|
|
153
|
+
name,
|
|
154
|
+
mode: "live",
|
|
155
|
+
known: {
|
|
156
|
+
objectId: bindings.objectId,
|
|
157
|
+
keyServerUrl: bindings.keyServerUrl,
|
|
158
|
+
serverConfigs: bindings.serverConfigs
|
|
159
|
+
}
|
|
160
|
+
})],
|
|
154
161
|
start: () => Effect.gen(function* () {
|
|
162
|
+
const ctx = yield* PluginContext;
|
|
155
163
|
const mode = {
|
|
156
164
|
mode: "live",
|
|
157
165
|
name,
|
|
158
166
|
resolved: validated
|
|
159
167
|
};
|
|
168
|
+
const resolved = yield* bootSealService(yield* CacheService, mode);
|
|
169
|
+
ctx.snapshotExtra(snap);
|
|
170
|
+
ctx.codegen(makeSealCodegenable(bindings));
|
|
160
171
|
return {
|
|
161
|
-
...
|
|
172
|
+
...resolved.keyServer,
|
|
162
173
|
mode: "live",
|
|
163
174
|
manager: null
|
|
164
175
|
};
|
|
165
|
-
})
|
|
166
|
-
capabilities: [snap, codegen],
|
|
167
|
-
errorContributions: sealErrorContributions
|
|
176
|
+
})
|
|
168
177
|
});
|
|
169
178
|
};
|
|
170
179
|
/** Build the fork-known-mode plugin. Structurally symmetric with
|
|
@@ -191,29 +200,42 @@ const buildForkKnownPlugin = (opts) => {
|
|
|
191
200
|
id: sealResource.id,
|
|
192
201
|
role: "task",
|
|
193
202
|
section: "service",
|
|
203
|
+
staticCodegen: () => [makeSealStaticCodegen({
|
|
204
|
+
name,
|
|
205
|
+
mode: "fork-known",
|
|
206
|
+
known: {
|
|
207
|
+
objectId: validated.objectId,
|
|
208
|
+
keyServerUrl: validated.keyServerUrl,
|
|
209
|
+
serverConfigs: [{
|
|
210
|
+
objectId: validated.objectId,
|
|
211
|
+
weight: 1
|
|
212
|
+
}]
|
|
213
|
+
}
|
|
214
|
+
})],
|
|
194
215
|
start: () => Effect.gen(function* () {
|
|
216
|
+
const ctx = yield* PluginContext;
|
|
195
217
|
const mode = {
|
|
196
218
|
mode: "fork-known",
|
|
197
219
|
name,
|
|
198
220
|
upstream: opts.upstream,
|
|
199
221
|
resolved: validated
|
|
200
222
|
};
|
|
201
|
-
|
|
202
|
-
|
|
223
|
+
const resolved = yield* bootSealService(yield* CacheService, mode);
|
|
224
|
+
const resolvedValue = {
|
|
225
|
+
...resolved.keyServer,
|
|
203
226
|
mode: "fork-known",
|
|
204
227
|
manager: null
|
|
205
228
|
};
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
return [snap, makeSealCodegenable({
|
|
229
|
+
ctx.snapshotExtra(snap);
|
|
230
|
+
ctx.codegen(makeSealCodegenable({
|
|
209
231
|
name,
|
|
210
|
-
objectId:
|
|
211
|
-
keyServerUrl:
|
|
212
|
-
serverConfigs:
|
|
232
|
+
objectId: resolved.keyServer.objectId,
|
|
233
|
+
keyServerUrl: resolved.keyServer.keyServerUrl,
|
|
234
|
+
serverConfigs: resolved.keyServer.serverConfigs,
|
|
213
235
|
mode: "fork-known"
|
|
214
|
-
})
|
|
215
|
-
|
|
216
|
-
|
|
236
|
+
}));
|
|
237
|
+
return resolvedValue;
|
|
238
|
+
})
|
|
217
239
|
});
|
|
218
240
|
};
|
|
219
241
|
/** Explicit Seal factory. `local-keygen` requires a signer; live and
|