@mysten-incubation/devstack 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -4
- package/dashboard-ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dashboard-ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dashboard-ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dashboard-ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
- package/dashboard-ui/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
- package/dashboard-ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dashboard-ui/assets/index-Bmi1UtAg.js +1356 -0
- package/dashboard-ui/assets/index-D5EShVt4.js +3 -0
- package/dashboard-ui/assets/index-Deml9drg.css +1 -0
- package/dashboard-ui/index.html +13 -0
- package/dist/api/define-capabilities.d.mts +14 -3
- package/dist/api/define-capabilities.mjs +18 -1
- package/dist/api/define-capabilities.mjs.map +1 -1
- package/dist/api/define-devstack.d.mts +1 -1
- package/dist/api/define-devstack.mjs +6 -26
- package/dist/api/define-devstack.mjs.map +1 -1
- package/dist/api/define-plugin.d.mts +1 -0
- package/dist/api/define-plugin.mjs +2 -0
- package/dist/api/inference-network.d.mts +132 -0
- package/dist/api/inference-network.mjs +105 -16
- package/dist/api/inference-network.mjs.map +1 -1
- package/dist/api/plugin-errors.d.mts +7 -0
- package/dist/api/run-stack.d.mts +20 -9
- package/dist/api/run-stack.mjs +56 -29
- package/dist/api/run-stack.mjs.map +1 -1
- package/dist/build-integrations/playwright/config.d.mts +6 -4
- package/dist/build-integrations/playwright/config.mjs +5 -3
- package/dist/build-integrations/playwright/config.mjs.map +1 -1
- package/dist/build-integrations/playwright/errors.d.mts +1 -1
- package/dist/build-integrations/playwright/global-setup.d.mts +43 -17
- package/dist/build-integrations/playwright/global-setup.mjs +250 -13
- package/dist/build-integrations/playwright/global-setup.mjs.map +1 -1
- package/dist/build-integrations/playwright/index.d.mts +5 -3
- package/dist/build-integrations/playwright/index.mjs +4 -2
- package/dist/build-integrations/playwright/stack-context.d.mts +0 -1
- package/dist/build-integrations/playwright/stack-context.mjs +24 -63
- package/dist/build-integrations/playwright/stack-context.mjs.map +1 -1
- package/dist/build-integrations/playwright/wallet-context.d.mts +7 -10
- package/dist/build-integrations/playwright/wallet-context.mjs +8 -13
- package/dist/build-integrations/playwright/wallet-context.mjs.map +1 -1
- package/dist/build-integrations/runtime/cold-start-url.d.mts +5 -0
- package/dist/build-integrations/runtime/cold-start-url.mjs +4 -3
- package/dist/build-integrations/runtime/cold-start-url.mjs.map +1 -1
- package/dist/build-integrations/runtime/conventional-routes.d.mts +51 -0
- package/dist/build-integrations/runtime/conventional-routes.mjs +92 -0
- package/dist/build-integrations/runtime/conventional-routes.mjs.map +1 -0
- package/dist/build-integrations/runtime/discover.d.mts +38 -30
- package/dist/build-integrations/runtime/discover.mjs +73 -70
- package/dist/build-integrations/runtime/discover.mjs.map +1 -1
- package/dist/build-integrations/runtime/endpoint-registry.d.mts +3 -1
- package/dist/build-integrations/runtime/endpoint-registry.mjs +3 -1
- package/dist/build-integrations/runtime/endpoint-registry.mjs.map +1 -1
- package/dist/build-integrations/runtime/index.d.mts +7 -2
- package/dist/build-integrations/runtime/index.mjs +9 -2
- package/dist/build-integrations/runtime/manifest-types.d.mts +2 -0
- package/dist/build-integrations/runtime/manifest-types.mjs +3 -0
- package/dist/build-integrations/runtime/playwright-stack-context-slot.d.mts +29 -0
- package/dist/build-integrations/runtime/playwright-stack-context-slot.mjs +10 -0
- package/dist/build-integrations/runtime/playwright-stack-context-slot.mjs.map +1 -0
- package/dist/build-integrations/runtime/read-stack-context.d.mts +1 -1
- package/dist/build-integrations/runtime/read-stack-context.mjs +10 -4
- package/dist/build-integrations/runtime/read-stack-context.mjs.map +1 -1
- package/dist/build-integrations/runtime/resolve-discovery-env.d.mts +48 -0
- package/dist/build-integrations/runtime/resolve-discovery-env.mjs +42 -0
- package/dist/build-integrations/runtime/resolve-discovery-env.mjs.map +1 -0
- package/dist/build-integrations/runtime/stack-context.d.mts +1 -1
- package/dist/build-integrations/runtime/wallet-paths.mjs +2 -0
- package/dist/build-integrations/vite/index.d.mts +51 -0
- package/dist/build-integrations/vite/index.mjs +73 -0
- package/dist/build-integrations/vite/index.mjs.map +1 -0
- package/dist/build-integrations/vitest/env.d.mts +4 -3
- package/dist/build-integrations/vitest/env.mjs +6 -4
- package/dist/build-integrations/vitest/env.mjs.map +1 -1
- package/dist/build-integrations/vitest/errors.d.mts +25 -4
- package/dist/build-integrations/vitest/errors.mjs +15 -2
- package/dist/build-integrations/vitest/errors.mjs.map +1 -1
- package/dist/build-integrations/vitest/index.d.mts +2 -2
- package/dist/build-integrations/vitest/index.mjs +3 -3
- package/dist/build-integrations/vitest/setup.d.mts +4 -2
- package/dist/build-integrations/vitest/setup.mjs +2 -2
- package/dist/build-integrations/vitest/setup.mjs.map +1 -1
- package/dist/build-integrations/vitest/stack-context.d.mts +0 -1
- package/dist/build-integrations/vitest/stack-context.mjs +33 -13
- package/dist/build-integrations/vitest/stack-context.mjs.map +1 -1
- package/dist/cli/bail.mjs +23 -0
- package/dist/cli/bail.mjs.map +1 -0
- package/dist/{surfaces/cli/commands → cli}/doctor-probes.mjs +26 -16
- package/dist/cli/doctor-probes.mjs.map +1 -0
- package/dist/cli/main.d.mts +15 -1
- package/dist/cli/main.mjs +166 -482
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/prune-direct.mjs +31 -201
- package/dist/cli/prune-direct.mjs.map +1 -1
- package/dist/cli/snapshot-reader.mjs +14 -11
- package/dist/cli/snapshot-reader.mjs.map +1 -1
- package/dist/cli/up-lifecycle.mjs +4 -1
- package/dist/cli/up-lifecycle.mjs.map +1 -1
- package/dist/cli/wirings/apply.mjs +95 -0
- package/dist/cli/wirings/apply.mjs.map +1 -0
- package/dist/cli/wirings/build-verb-layers.mjs +42 -0
- package/dist/cli/wirings/build-verb-layers.mjs.map +1 -0
- package/dist/cli/wirings/config-loader.mjs +69 -0
- package/dist/cli/wirings/config-loader.mjs.map +1 -0
- package/dist/cli/wirings/engine-command.mjs +30 -0
- package/dist/cli/wirings/engine-command.mjs.map +1 -0
- package/dist/cli/wirings/identity.mjs +72 -0
- package/dist/cli/wirings/identity.mjs.map +1 -0
- package/dist/cli/wirings/provide-file-system.mjs +7 -0
- package/dist/cli/wirings/provide-file-system.mjs.map +1 -0
- package/dist/cli/wirings/snapshot.mjs +177 -0
- package/dist/cli/wirings/snapshot.mjs.map +1 -0
- package/dist/cli/wirings/up.mjs +287 -0
- package/dist/cli/wirings/up.mjs.map +1 -0
- package/dist/cli/wirings/wipe.mjs +40 -0
- package/dist/cli/wirings/wipe.mjs.map +1 -0
- package/dist/contracts/capability-decl.d.mts +0 -2
- package/dist/contracts/codegenable.d.mts +43 -0
- package/dist/contracts/container-runtime.d.mts +26 -1
- package/dist/contracts/faucet-strategy.d.mts +25 -0
- package/dist/contracts/funding-strategy.d.mts +42 -0
- package/dist/contracts/plugin-expander.mjs +60 -0
- package/dist/contracts/plugin-expander.mjs.map +1 -0
- package/dist/contracts/projection.d.mts +5 -3
- package/dist/contracts/renderer.d.mts +23 -0
- package/dist/contracts/routable.d.mts +14 -1
- package/dist/contracts/snapshotable.d.mts +25 -3
- package/dist/contracts/wallet-protocol.d.mts +52 -0
- package/dist/contracts/wallet-protocol.mjs +52 -0
- package/dist/contracts/wallet-protocol.mjs.map +1 -0
- package/dist/index.d.mts +26 -25
- package/dist/index.mjs +20 -13
- package/dist/{runtime → orchestrators}/built-in-plugin-layers.mjs +10 -5
- package/dist/orchestrators/built-in-plugin-layers.mjs.map +1 -0
- package/dist/orchestrators/codegen/bindings.d.mts +1 -2
- package/dist/orchestrators/codegen/bindings.mjs +52 -186
- package/dist/orchestrators/codegen/bindings.mjs.map +1 -1
- package/dist/orchestrators/codegen/emit.mjs +19 -1
- package/dist/orchestrators/codegen/emit.mjs.map +1 -1
- package/dist/orchestrators/codegen/errors.mjs +8 -3
- package/dist/orchestrators/codegen/errors.mjs.map +1 -1
- package/dist/orchestrators/codegen/format.mjs +47 -39
- package/dist/orchestrators/codegen/format.mjs.map +1 -1
- package/dist/orchestrators/codegen/gitignore.mjs +3 -1
- package/dist/orchestrators/codegen/gitignore.mjs.map +1 -1
- package/dist/orchestrators/codegen/output-location.mjs +41 -0
- package/dist/orchestrators/codegen/output-location.mjs.map +1 -0
- package/dist/orchestrators/codegen/paths.d.mts +1 -1
- package/dist/orchestrators/codegen/paths.mjs +40 -14
- package/dist/orchestrators/codegen/paths.mjs.map +1 -1
- package/dist/orchestrators/codegen/permissions.mjs +3 -1
- package/dist/orchestrators/codegen/permissions.mjs.map +1 -1
- package/dist/orchestrators/codegen/service.mjs +157 -105
- package/dist/orchestrators/codegen/service.mjs.map +1 -1
- package/dist/orchestrators/lifecycle-prune/errors.mjs +31 -0
- package/dist/orchestrators/lifecycle-prune/errors.mjs.map +1 -0
- package/dist/orchestrators/lifecycle-prune/index.mjs +350 -0
- package/dist/orchestrators/lifecycle-prune/index.mjs.map +1 -0
- package/dist/orchestrators/router/cleanup.mjs +26 -27
- package/dist/orchestrators/router/cleanup.mjs.map +1 -1
- package/dist/orchestrators/router/entrypoints.mjs +2 -2
- package/dist/orchestrators/router/entrypoints.mjs.map +1 -1
- package/dist/orchestrators/router/file-provider.mjs +14 -5
- package/dist/orchestrators/router/file-provider.mjs.map +1 -1
- package/dist/orchestrators/router/hostname.mjs +19 -55
- package/dist/orchestrators/router/hostname.mjs.map +1 -1
- package/dist/orchestrators/router/index.mjs +11 -0
- package/dist/orchestrators/router/profile.mjs +2 -2
- package/dist/orchestrators/router/sentinels.mjs +26 -0
- package/dist/orchestrators/router/sentinels.mjs.map +1 -0
- package/dist/orchestrators/router/service.mjs +40 -37
- package/dist/orchestrators/router/service.mjs.map +1 -1
- package/dist/orchestrators/router/traefik-container.mjs +27 -16
- package/dist/orchestrators/router/traefik-container.mjs.map +1 -1
- package/dist/{substrate/runtime → orchestrators}/run.mjs +26 -21
- package/dist/orchestrators/run.mjs.map +1 -0
- package/dist/orchestrators/runtime-composition.d.mts +1 -1
- package/dist/orchestrators/runtime-composition.mjs +123 -39
- package/dist/orchestrators/runtime-composition.mjs.map +1 -1
- package/dist/orchestrators/snapshot/capture-command.d.mts +1 -0
- package/dist/orchestrators/snapshot/capture-command.mjs +25 -0
- package/dist/orchestrators/snapshot/capture-command.mjs.map +1 -0
- package/dist/orchestrators/snapshot/capture.mjs +42 -28
- package/dist/orchestrators/snapshot/capture.mjs.map +1 -1
- package/dist/orchestrators/snapshot/descriptor.mjs +35 -10
- package/dist/orchestrators/snapshot/descriptor.mjs.map +1 -1
- package/dist/orchestrators/snapshot/identity-guard.mjs +1 -1
- package/dist/orchestrators/snapshot/index.mjs +13 -0
- package/dist/orchestrators/snapshot/integrity.d.mts +1 -1
- package/dist/orchestrators/snapshot/integrity.mjs +73 -17
- package/dist/orchestrators/snapshot/integrity.mjs.map +1 -1
- package/dist/orchestrators/snapshot/pending-marker.d.mts +1 -0
- package/dist/orchestrators/snapshot/pending-marker.mjs +99 -0
- package/dist/orchestrators/snapshot/pending-marker.mjs.map +1 -0
- package/dist/orchestrators/snapshot/phase-error.mjs +23 -0
- package/dist/orchestrators/snapshot/phase-error.mjs.map +1 -0
- package/dist/orchestrators/snapshot/prune.mjs +20 -55
- package/dist/orchestrators/snapshot/prune.mjs.map +1 -1
- package/dist/orchestrators/snapshot/recover-pending.d.mts +1 -0
- package/dist/orchestrators/snapshot/recover-pending.mjs +223 -0
- package/dist/orchestrators/snapshot/recover-pending.mjs.map +1 -0
- package/dist/orchestrators/snapshot/restore.mjs +118 -84
- package/dist/orchestrators/snapshot/restore.mjs.map +1 -1
- package/dist/orchestrators/snapshot/service.mjs +53 -56
- package/dist/orchestrators/snapshot/service.mjs.map +1 -1
- package/dist/orchestrators/snapshot/state-document.d.mts +1 -0
- package/dist/orchestrators/snapshot/state-document.mjs +47 -7
- package/dist/orchestrators/snapshot/state-document.mjs.map +1 -1
- package/dist/orchestrators/snapshot/wipe.mjs +67 -10
- package/dist/orchestrators/snapshot/wipe.mjs.map +1 -1
- package/dist/plugins/account/codegen.mjs +9 -8
- package/dist/plugins/account/codegen.mjs.map +1 -1
- package/dist/plugins/account/errors.d.mts +33 -6
- package/dist/plugins/account/errors.mjs.map +1 -1
- package/dist/plugins/account/funding.d.mts +29 -19
- package/dist/plugins/account/funding.mjs +84 -66
- package/dist/plugins/account/funding.mjs.map +1 -1
- package/dist/plugins/account/index.d.mts +2 -4
- package/dist/plugins/account/index.mjs +64 -31
- package/dist/plugins/account/index.mjs.map +1 -1
- package/dist/plugins/account/keypair.mjs +6 -9
- package/dist/plugins/account/keypair.mjs.map +1 -1
- package/dist/plugins/account/lease.mjs +1 -0
- package/dist/plugins/account/lease.mjs.map +1 -1
- package/dist/plugins/account/registry.d.mts +14 -1
- package/dist/plugins/account/registry.mjs +18 -18
- package/dist/plugins/account/registry.mjs.map +1 -1
- package/dist/plugins/account/service.d.mts +23 -4
- package/dist/plugins/account/service.mjs +83 -45
- package/dist/plugins/account/service.mjs.map +1 -1
- package/dist/plugins/account/snapshot.mjs +2 -5
- package/dist/plugins/account/snapshot.mjs.map +1 -1
- package/dist/plugins/account/spans.mjs +16 -0
- package/dist/plugins/account/spans.mjs.map +1 -0
- package/dist/plugins/account/variants/keystore.mjs +6 -8
- package/dist/plugins/account/variants/keystore.mjs.map +1 -1
- package/dist/plugins/action/build-context.d.mts +3 -2
- package/dist/plugins/action/errors.d.mts +16 -12
- package/dist/plugins/action/errors.mjs.map +1 -1
- package/dist/plugins/action/execute.mjs +65 -103
- package/dist/plugins/action/execute.mjs.map +1 -1
- package/dist/plugins/action/index.d.mts +0 -2
- package/dist/plugins/action/index.mjs +17 -13
- package/dist/plugins/action/index.mjs.map +1 -1
- package/dist/plugins/action/service.mjs +38 -35
- package/dist/plugins/action/service.mjs.map +1 -1
- package/dist/plugins/action/spans.mjs +11 -0
- package/dist/plugins/action/spans.mjs.map +1 -0
- package/dist/plugins/coin/codegen.mjs +9 -8
- package/dist/plugins/coin/codegen.mjs.map +1 -1
- package/dist/plugins/coin/discovery.mjs +8 -4
- package/dist/plugins/coin/discovery.mjs.map +1 -1
- package/dist/plugins/coin/index.d.mts +11 -29
- package/dist/plugins/coin/index.mjs +56 -27
- package/dist/plugins/coin/index.mjs.map +1 -1
- package/dist/plugins/coin/metadata.mjs +8 -15
- package/dist/plugins/coin/metadata.mjs.map +1 -1
- package/dist/plugins/coin/mint.d.mts +30 -11
- package/dist/plugins/coin/mint.mjs +78 -74
- package/dist/plugins/coin/mint.mjs.map +1 -1
- package/dist/plugins/coin/registry.mjs +4 -7
- package/dist/plugins/coin/registry.mjs.map +1 -1
- package/dist/plugins/coin/service.d.mts +39 -1
- package/dist/plugins/coin/service.mjs +11 -4
- package/dist/plugins/coin/service.mjs.map +1 -1
- package/dist/plugins/coin/spans.mjs +20 -0
- package/dist/plugins/coin/spans.mjs.map +1 -0
- package/dist/plugins/dashboard/domain.mjs +402 -0
- package/dist/plugins/dashboard/domain.mjs.map +1 -0
- package/dist/plugins/dashboard/index.d.mts +29 -0
- package/dist/plugins/dashboard/index.mjs +91 -0
- package/dist/plugins/dashboard/index.mjs.map +1 -0
- package/dist/plugins/dashboard/origin-policy.mjs +36 -0
- package/dist/plugins/dashboard/origin-policy.mjs.map +1 -0
- package/dist/plugins/dashboard/routable.mjs +27 -0
- package/dist/plugins/dashboard/routable.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/builder.mjs +21 -0
- package/dist/plugins/dashboard/schema/builder.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/enums.mjs +72 -0
- package/dist/plugins/dashboard/schema/enums.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/root.mjs +351 -0
- package/dist/plugins/dashboard/schema/root.mjs.map +1 -0
- package/dist/plugins/dashboard/schema/types.mjs +508 -0
- package/dist/plugins/dashboard/schema/types.mjs.map +1 -0
- package/dist/plugins/dashboard/schema.mjs +11 -0
- package/dist/plugins/dashboard/schema.mjs.map +1 -0
- package/dist/plugins/dashboard/server.mjs +166 -0
- package/dist/plugins/dashboard/server.mjs.map +1 -0
- package/dist/plugins/deepbook/deploy.mjs +53 -115
- package/dist/plugins/deepbook/deploy.mjs.map +1 -1
- package/dist/plugins/deepbook/errors.mjs +1 -0
- package/dist/plugins/deepbook/errors.mjs.map +1 -1
- package/dist/plugins/deepbook/faucet-strategy.mjs +47 -34
- package/dist/plugins/deepbook/faucet-strategy.mjs.map +1 -1
- package/dist/plugins/deepbook/hash.mjs +9 -0
- package/dist/plugins/deepbook/hash.mjs.map +1 -0
- package/dist/plugins/deepbook/index.d.mts +1 -10
- package/dist/plugins/deepbook/index.mjs +25 -22
- package/dist/plugins/deepbook/index.mjs.map +1 -1
- package/dist/plugins/deepbook/pyth/index.mjs +26 -55
- package/dist/plugins/deepbook/pyth/index.mjs.map +1 -1
- package/dist/plugins/deepbook/snapshot.mjs +17 -29
- package/dist/plugins/deepbook/snapshot.mjs.map +1 -1
- package/dist/plugins/deepbook/spans.mjs +18 -0
- package/dist/plugins/deepbook/spans.mjs.map +1 -0
- package/dist/plugins/deepbook/type-strings.mjs +65 -0
- package/dist/plugins/deepbook/type-strings.mjs.map +1 -0
- package/dist/plugins/deepbook/types.d.mts +2 -3
- package/dist/plugins/deepbook/types.mjs.map +1 -1
- package/dist/plugins/faucet/dispatcher.d.mts +21 -2
- package/dist/plugins/faucet/dispatcher.mjs +1 -2
- package/dist/plugins/faucet/dispatcher.mjs.map +1 -1
- package/dist/plugins/faucet/errors.d.mts +11 -24
- package/dist/plugins/faucet/errors.mjs.map +1 -1
- package/dist/plugins/faucet/http.mjs +33 -14
- package/dist/plugins/faucet/http.mjs.map +1 -1
- package/dist/plugins/faucet/index.d.mts +15 -5
- package/dist/plugins/faucet/index.mjs +3 -0
- package/dist/plugins/faucet/index.mjs.map +1 -1
- package/dist/plugins/faucet/spans.mjs +12 -0
- package/dist/plugins/faucet/spans.mjs.map +1 -0
- package/dist/plugins/host-service/errors.d.mts +1 -1
- package/dist/plugins/host-service/index.mjs +34 -8
- package/dist/plugins/host-service/index.mjs.map +1 -1
- package/dist/plugins/host-service/routable.mjs +2 -1
- package/dist/plugins/host-service/routable.mjs.map +1 -1
- package/dist/plugins/host-service/service.d.mts +21 -0
- package/dist/plugins/host-service/service.mjs +136 -81
- package/dist/plugins/host-service/service.mjs.map +1 -1
- package/dist/plugins/internal/acquire-on-chain-artifact.mjs +23 -0
- package/dist/plugins/internal/acquire-on-chain-artifact.mjs.map +1 -0
- package/dist/plugins/internal/codegen-helpers.mjs +18 -0
- package/dist/plugins/internal/codegen-helpers.mjs.map +1 -0
- package/dist/plugins/internal/funding-failure-error.mjs +32 -0
- package/dist/plugins/internal/funding-failure-error.mjs.map +1 -0
- package/dist/plugins/package/build.mjs +1 -1
- package/dist/plugins/package/build.mjs.map +1 -1
- package/dist/plugins/package/codegen.mjs +26 -0
- package/dist/plugins/package/codegen.mjs.map +1 -1
- package/dist/plugins/package/errors.d.mts +16 -6
- package/dist/plugins/package/errors.mjs.map +1 -1
- package/dist/plugins/package/index.d.mts +0 -4
- package/dist/plugins/package/index.mjs +27 -21
- package/dist/plugins/package/index.mjs.map +1 -1
- package/dist/plugins/package/mode-known.mjs +26 -12
- package/dist/plugins/package/mode-known.mjs.map +1 -1
- package/dist/plugins/package/mode-local.mjs +47 -41
- package/dist/plugins/package/mode-local.mjs.map +1 -1
- package/dist/plugins/package/publish-executor.mjs +55 -114
- package/dist/plugins/package/publish-executor.mjs.map +1 -1
- package/dist/plugins/package/registry.mjs +2 -1
- package/dist/plugins/package/registry.mjs.map +1 -1
- package/dist/plugins/package/service.mjs.map +1 -1
- package/dist/plugins/package/spans.mjs +14 -0
- package/dist/plugins/package/spans.mjs.map +1 -0
- package/dist/plugins/postgres/db-ensure.mjs +19 -12
- package/dist/plugins/postgres/db-ensure.mjs.map +1 -1
- package/dist/plugins/postgres/errors.d.mts +5 -0
- package/dist/plugins/postgres/errors.mjs.map +1 -1
- package/dist/plugins/postgres/index.mjs +10 -17
- package/dist/plugins/postgres/index.mjs.map +1 -1
- package/dist/plugins/postgres/service.mjs +58 -24
- package/dist/plugins/postgres/service.mjs.map +1 -1
- package/dist/plugins/postgres/snapshot.mjs.map +1 -1
- package/dist/plugins/postgres/spans.mjs +11 -0
- package/dist/plugins/postgres/spans.mjs.map +1 -0
- package/dist/plugins/router-entrypoints.mjs +4 -4
- package/dist/plugins/router-entrypoints.mjs.map +1 -1
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs +15 -13
- package/dist/plugins/seal/bootstrap-assets/cargo-image.mjs.map +1 -1
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs +15 -19
- package/dist/plugins/seal/bootstrap-assets/source-fetch.mjs.map +1 -1
- package/dist/plugins/seal/codegen.d.mts +2 -3
- package/dist/plugins/seal/codegen.mjs.map +1 -1
- package/dist/plugins/seal/config-render.mjs +35 -8
- package/dist/plugins/seal/config-render.mjs.map +1 -1
- package/dist/plugins/seal/deploy.mjs +31 -39
- package/dist/plugins/seal/deploy.mjs.map +1 -1
- package/dist/plugins/seal/errors.d.mts +1 -3
- package/dist/plugins/seal/errors.mjs +7 -1
- package/dist/plugins/seal/errors.mjs.map +1 -1
- package/dist/plugins/seal/index.d.mts +1 -6
- package/dist/plugins/seal/index.mjs +40 -14
- package/dist/plugins/seal/index.mjs.map +1 -1
- package/dist/plugins/seal/key-manager.d.mts +1 -9
- package/dist/plugins/seal/key-manager.mjs +2 -18
- package/dist/plugins/seal/key-manager.mjs.map +1 -1
- package/dist/plugins/seal/key-server.mjs +37 -36
- package/dist/plugins/seal/key-server.mjs.map +1 -1
- package/dist/plugins/seal/keygen.mjs +16 -17
- package/dist/plugins/seal/keygen.mjs.map +1 -1
- package/dist/plugins/seal/mode/fork-known.mjs +36 -14
- package/dist/plugins/seal/mode/fork-known.mjs.map +1 -1
- package/dist/plugins/seal/mode/live.d.mts +6 -4
- package/dist/plugins/seal/mode/live.mjs +14 -21
- package/dist/plugins/seal/mode/live.mjs.map +1 -1
- package/dist/plugins/seal/mode/local-keygen.mjs +57 -21
- package/dist/plugins/seal/mode/local-keygen.mjs.map +1 -1
- package/dist/plugins/seal/registry-publish.mjs +1 -0
- package/dist/plugins/seal/registry-publish.mjs.map +1 -1
- package/dist/plugins/seal/routable.mjs.map +1 -1
- package/dist/plugins/seal/service.mjs.map +1 -1
- package/dist/plugins/seal/spans.mjs +18 -0
- package/dist/plugins/seal/spans.mjs.map +1 -0
- package/dist/plugins/sui/auto-tick.mjs +17 -23
- package/dist/plugins/sui/auto-tick.mjs.map +1 -1
- package/dist/plugins/sui/chain-build-container.mjs +18 -0
- package/dist/plugins/sui/chain-build-container.mjs.map +1 -0
- package/dist/plugins/sui/chain-probe.d.mts +5 -5
- package/dist/plugins/sui/chain-probe.mjs +28 -58
- package/dist/plugins/sui/chain-probe.mjs.map +1 -1
- package/dist/plugins/sui/codegen.mjs +26 -0
- package/dist/plugins/sui/codegen.mjs.map +1 -1
- package/dist/plugins/sui/errors.d.mts +2 -29
- package/dist/plugins/sui/errors.mjs +1 -3
- package/dist/plugins/sui/errors.mjs.map +1 -1
- package/dist/plugins/sui/fork-faucet-strategy.d.mts +1 -0
- package/dist/plugins/sui/fork-faucet-strategy.mjs +55 -0
- package/dist/plugins/sui/fork-faucet-strategy.mjs.map +1 -0
- package/dist/plugins/sui/fork-orchestration.d.mts +1 -0
- package/dist/plugins/sui/fork-orchestration.mjs +170 -2
- package/dist/plugins/sui/fork-orchestration.mjs.map +1 -1
- package/dist/plugins/sui/fork-transaction.d.mts +2 -0
- package/dist/plugins/sui/fork-transaction.mjs +92 -28
- package/dist/plugins/sui/fork-transaction.mjs.map +1 -1
- package/dist/plugins/sui/index.d.mts +33 -70
- package/dist/plugins/sui/index.mjs +58 -35
- package/dist/plugins/sui/index.mjs.map +1 -1
- package/dist/plugins/{faucet/strategies/sui-local.mjs → sui/local-faucet-strategy.mjs} +10 -7
- package/dist/plugins/sui/local-faucet-strategy.mjs.map +1 -0
- package/dist/plugins/sui/mode/external.mjs +7 -13
- package/dist/plugins/sui/mode/external.mjs.map +1 -1
- package/dist/plugins/sui/mode/fork.mjs +136 -59
- package/dist/plugins/sui/mode/fork.mjs.map +1 -1
- package/dist/plugins/sui/mode/live.mjs +10 -16
- package/dist/plugins/sui/mode/live.mjs.map +1 -1
- package/dist/plugins/sui/mode/local.mjs +37 -36
- package/dist/plugins/sui/mode/local.mjs.map +1 -1
- package/dist/plugins/sui/mode/shared-boot.mjs +38 -115
- package/dist/plugins/sui/mode/shared-boot.mjs.map +1 -1
- package/dist/plugins/sui/mode/shared.d.mts +1 -5
- package/dist/plugins/sui/mode/shared.mjs.map +1 -1
- package/dist/plugins/sui/mode/spec.d.mts +18 -0
- package/dist/plugins/sui/move-summary-runner.mjs +207 -0
- package/dist/plugins/sui/move-summary-runner.mjs.map +1 -0
- package/dist/plugins/sui/network-resolver.d.mts +4 -3
- package/dist/plugins/sui/service.mjs.map +1 -1
- package/dist/plugins/sui/snapshot.mjs +3 -0
- package/dist/plugins/sui/snapshot.mjs.map +1 -1
- package/dist/plugins/sui/spans.mjs +17 -0
- package/dist/plugins/sui/spans.mjs.map +1 -0
- package/dist/plugins/wallet/codegen.d.mts +0 -1
- package/dist/plugins/wallet/codegen.mjs +8 -9
- package/dist/plugins/wallet/codegen.mjs.map +1 -1
- package/dist/plugins/wallet/index.d.mts +6 -8
- package/dist/plugins/wallet/index.mjs +46 -35
- package/dist/plugins/wallet/index.mjs.map +1 -1
- package/dist/plugins/wallet/origin-policy.mjs +12 -28
- package/dist/plugins/wallet/origin-policy.mjs.map +1 -1
- package/dist/plugins/wallet/pairing.mjs +6 -4
- package/dist/plugins/wallet/pairing.mjs.map +1 -1
- package/dist/plugins/wallet/protocol.d.mts +1 -0
- package/dist/plugins/wallet/protocol.mjs +5 -44
- package/dist/plugins/wallet/protocol.mjs.map +1 -1
- package/dist/plugins/wallet/routable.mjs +2 -8
- package/dist/plugins/wallet/routable.mjs.map +1 -1
- package/dist/plugins/wallet/server.mjs +36 -44
- package/dist/plugins/wallet/server.mjs.map +1 -1
- package/dist/plugins/wallet/service.d.mts +1 -5
- package/dist/plugins/wallet/service.mjs +22 -18
- package/dist/plugins/wallet/service.mjs.map +1 -1
- package/dist/plugins/wallet/spans.mjs +22 -0
- package/dist/plugins/wallet/spans.mjs.map +1 -0
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs +33 -8
- package/dist/plugins/walrus/bootstrap-assets/cargo-image.mjs.map +1 -1
- package/dist/plugins/walrus/codegen.d.mts +3 -3
- package/dist/plugins/walrus/codegen.mjs.map +1 -1
- package/dist/plugins/walrus/deploy-paths.mjs +21 -5
- package/dist/plugins/walrus/deploy-paths.mjs.map +1 -1
- package/dist/plugins/walrus/deploy.mjs +67 -69
- package/dist/plugins/walrus/deploy.mjs.map +1 -1
- package/dist/plugins/walrus/errors.mjs +1 -0
- package/dist/plugins/walrus/errors.mjs.map +1 -1
- package/dist/plugins/walrus/faucet-strategy.mjs +12 -7
- package/dist/plugins/walrus/faucet-strategy.mjs.map +1 -1
- package/dist/plugins/walrus/index.d.mts +2 -13
- package/dist/plugins/walrus/index.mjs +18 -23
- package/dist/plugins/walrus/index.mjs.map +1 -1
- package/dist/plugins/walrus/mode/known-deploy.mjs +7 -5
- package/dist/plugins/walrus/mode/known-deploy.mjs.map +1 -1
- package/dist/plugins/walrus/mode/local-cluster.mjs +26 -7
- package/dist/plugins/walrus/mode/local-cluster.mjs.map +1 -1
- package/dist/plugins/walrus/registry-publish.mjs.map +1 -1
- package/dist/plugins/walrus/routable.mjs +7 -23
- package/dist/plugins/walrus/routable.mjs.map +1 -1
- package/dist/plugins/walrus/service.mjs.map +1 -1
- package/dist/plugins/walrus/spans.mjs +18 -0
- package/dist/plugins/walrus/spans.mjs.map +1 -0
- package/dist/plugins/walrus/storage-nodes.d.mts +6 -2
- package/dist/plugins/walrus/storage-nodes.mjs +15 -8
- package/dist/plugins/walrus/storage-nodes.mjs.map +1 -1
- package/dist/plugins/walrus/wal-swap.mjs +58 -15
- package/dist/plugins/walrus/wal-swap.mjs.map +1 -1
- package/dist/primitives/artifact-publisher.d.mts +1 -1
- package/dist/primitives/artifact-publisher.mjs +15 -0
- package/dist/primitives/artifact-publisher.mjs.map +1 -0
- package/dist/runtime/docker/client.mjs +17 -4
- package/dist/runtime/docker/client.mjs.map +1 -1
- package/dist/runtime/docker/container.mjs +219 -132
- package/dist/runtime/docker/container.mjs.map +1 -1
- package/dist/runtime/docker/errors.mjs +0 -6
- package/dist/runtime/docker/errors.mjs.map +1 -1
- package/dist/runtime/docker/exec.mjs +21 -18
- package/dist/runtime/docker/exec.mjs.map +1 -1
- package/dist/runtime/docker/image.mjs +36 -13
- package/dist/runtime/docker/image.mjs.map +1 -1
- package/dist/runtime/docker/index.mjs +14 -0
- package/dist/runtime/docker/inspect-and-decode.mjs +51 -0
- package/dist/runtime/docker/inspect-and-decode.mjs.map +1 -0
- package/dist/runtime/docker/inventory.mjs +14 -11
- package/dist/runtime/docker/inventory.mjs.map +1 -1
- package/dist/runtime/docker/labels.mjs +38 -5
- package/dist/runtime/docker/labels.mjs.map +1 -1
- package/dist/runtime/docker/logs.d.mts +1 -1
- package/dist/runtime/docker/logs.mjs.map +1 -1
- package/dist/runtime/docker/network.mjs +83 -47
- package/dist/runtime/docker/network.mjs.map +1 -1
- package/dist/runtime/docker/render-run-args.mjs +82 -0
- package/dist/runtime/docker/render-run-args.mjs.map +1 -0
- package/dist/runtime/docker/service.d.mts +1 -1
- package/dist/runtime/docker/service.mjs +12 -7
- package/dist/runtime/docker/service.mjs.map +1 -1
- package/dist/runtime/docker/sweep.mjs +118 -43
- package/dist/runtime/docker/sweep.mjs.map +1 -1
- package/dist/runtime/docker/volume.mjs +2 -0
- package/dist/runtime/docker/volume.mjs.map +1 -1
- package/dist/runtime/docker/wrap.mjs +30 -1
- package/dist/runtime/docker/wrap.mjs.map +1 -1
- package/dist/substrate/cross-process.mjs +14 -8
- package/dist/substrate/cross-process.mjs.map +1 -1
- package/dist/substrate/event-time.mjs +33 -0
- package/dist/substrate/event-time.mjs.map +1 -0
- package/dist/substrate/events.d.mts +28 -8
- package/dist/substrate/identity.d.mts +2 -1
- package/dist/substrate/manifest.d.mts +68 -5
- package/dist/substrate/manifest.mjs +34 -5
- package/dist/substrate/manifest.mjs.map +1 -1
- package/dist/substrate/network.d.mts +3 -5
- package/dist/substrate/options.d.mts +0 -2
- package/dist/substrate/plugin.d.mts +13 -0
- package/dist/substrate/plugin.mjs +4 -2
- package/dist/substrate/plugin.mjs.map +1 -1
- package/dist/substrate/projection.d.mts +35 -3
- package/dist/substrate/runtime/artifact-publisher/index.mjs +19 -9
- package/dist/substrate/runtime/artifact-publisher/index.mjs.map +1 -1
- package/dist/substrate/runtime/atomic-write.mjs +97 -32
- package/dist/substrate/runtime/atomic-write.mjs.map +1 -1
- package/dist/substrate/runtime/cache/index.mjs +3 -0
- package/dist/substrate/runtime/cache/schema.mjs +2 -2
- package/dist/substrate/runtime/cache/schema.mjs.map +1 -1
- package/dist/substrate/runtime/cache/service.mjs +9 -7
- package/dist/substrate/runtime/cache/service.mjs.map +1 -1
- package/dist/substrate/runtime/capability-sinks/index.d.mts +1 -1
- package/dist/substrate/runtime/capability-sinks/index.mjs +3 -0
- package/dist/substrate/runtime/capability-sinks/layer.mjs +1 -1
- package/dist/substrate/runtime/capability-sinks/service.d.mts +61 -2
- package/dist/substrate/runtime/capability-sinks/service.mjs +21 -26
- package/dist/substrate/runtime/capability-sinks/service.mjs.map +1 -1
- package/dist/substrate/runtime/config-validation.d.mts +1 -13
- package/dist/substrate/runtime/config-validation.mjs +2 -91
- package/dist/substrate/runtime/config-validation.mjs.map +1 -1
- package/dist/substrate/runtime/container-runtime.d.mts +1 -0
- package/dist/substrate/runtime/container-runtime.mjs +2 -0
- package/dist/substrate/runtime/control-plane/domain.mjs +101 -0
- package/dist/substrate/runtime/control-plane/domain.mjs.map +1 -0
- package/dist/substrate/runtime/control-plane/service.mjs +7 -0
- package/dist/substrate/runtime/control-plane/service.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs +46 -19
- package/dist/substrate/runtime/cross-process/command-channel/channel.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs +30 -12
- package/dist/substrate/runtime/cross-process/command-channel/file-channel.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/index.mjs +5 -0
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs +11 -2
- package/dist/substrate/runtime/cross-process/command-channel/protocol.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/command-channel/runtime-control-lock.mjs +1 -1
- package/dist/substrate/runtime/cross-process/index.mjs +11 -0
- package/dist/substrate/runtime/cross-process/live-clock.mjs +34 -0
- package/dist/substrate/runtime/cross-process/live-clock.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/liveness.mjs +52 -10
- package/dist/substrate/runtime/cross-process/liveness.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/lock.d.mts +1 -0
- package/dist/substrate/runtime/cross-process/lock.mjs +23 -0
- package/dist/substrate/runtime/cross-process/lock.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs +64 -0
- package/dist/substrate/runtime/cross-process/reclaim-stale-file.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/roster.mjs +97 -83
- package/dist/substrate/runtime/cross-process/roster.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/self-pid.mjs +8 -0
- package/dist/substrate/runtime/cross-process/self-pid.mjs.map +1 -0
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs +24 -28
- package/dist/substrate/runtime/cross-process/snapshot-reservation.mjs.map +1 -1
- package/dist/substrate/runtime/cross-process/stack-lock.mjs +41 -20
- package/dist/substrate/runtime/cross-process/stack-lock.mjs.map +1 -1
- package/dist/substrate/runtime/current-plugin.mjs +2 -2
- package/dist/substrate/runtime/current-plugin.mjs.map +1 -1
- package/dist/substrate/runtime/errors.mjs +12 -6
- package/dist/substrate/runtime/errors.mjs.map +1 -1
- package/dist/substrate/runtime/format-unknown-error.mjs +30 -0
- package/dist/substrate/runtime/format-unknown-error.mjs.map +1 -0
- package/dist/substrate/runtime/host-bind-mount-owner.mjs +10 -0
- package/dist/substrate/runtime/host-bind-mount-owner.mjs.map +1 -0
- package/dist/substrate/runtime/host-gateway.mjs +20 -0
- package/dist/substrate/runtime/host-gateway.mjs.map +1 -0
- package/dist/substrate/runtime/host-tree-tar/index.mjs +61 -50
- package/dist/substrate/runtime/host-tree-tar/index.mjs.map +1 -1
- package/dist/substrate/runtime/http-probe.d.mts +1 -1
- package/dist/substrate/runtime/index.mjs +14 -0
- package/dist/substrate/runtime/lease-broker/index.d.mts +1 -1
- package/dist/substrate/runtime/lease-broker/index.mjs +2 -0
- package/dist/substrate/runtime/lease-broker/service.d.mts +1 -64
- package/dist/substrate/runtime/lease-broker/service.mjs +1 -1
- package/dist/substrate/runtime/lease-broker/service.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs +22 -3
- package/dist/substrate/runtime/lifecycle/dep-graph.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/index.mjs +9 -0
- package/dist/substrate/runtime/lifecycle/lifecycle-fact.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs +20 -3
- package/dist/substrate/runtime/lifecycle/plugin-registry.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/selective-restart.mjs +1 -1
- package/dist/substrate/runtime/lifecycle/signals.mjs +5 -5
- package/dist/substrate/runtime/lifecycle/signals.mjs.map +1 -1
- package/dist/substrate/runtime/lifecycle/state-machine.mjs +1 -1
- package/dist/substrate/runtime/managed-container.d.mts +19 -1
- package/dist/substrate/runtime/managed-container.mjs +20 -1
- package/dist/substrate/runtime/managed-container.mjs.map +1 -1
- package/dist/substrate/runtime/manifest/index.mjs +3 -0
- package/dist/substrate/runtime/manifest/manifest.mjs +15 -11
- package/dist/substrate/runtime/manifest/manifest.mjs.map +1 -1
- package/dist/substrate/runtime/mode-errors.mjs +20 -0
- package/dist/substrate/runtime/mode-errors.mjs.map +1 -0
- package/dist/substrate/runtime/observability/cascade-formatter.mjs +9 -13
- package/dist/substrate/runtime/observability/cascade-formatter.mjs.map +1 -1
- package/dist/substrate/runtime/observability/formatter-registry.mjs +19 -36
- package/dist/substrate/runtime/observability/formatter-registry.mjs.map +1 -1
- package/dist/substrate/runtime/observability/ignore-with-log.d.mts +1 -0
- package/dist/substrate/runtime/observability/ignore-with-log.mjs +17 -0
- package/dist/substrate/runtime/observability/ignore-with-log.mjs.map +1 -0
- package/dist/substrate/runtime/observability/index.d.mts +1 -1
- package/dist/substrate/runtime/observability/index.mjs +13 -0
- package/dist/substrate/runtime/observability/log-store.d.mts +1 -0
- package/dist/substrate/runtime/observability/log-store.mjs +175 -0
- package/dist/substrate/runtime/observability/log-store.mjs.map +1 -0
- package/dist/substrate/runtime/observability/logger.d.mts +2 -1
- package/dist/substrate/runtime/observability/logger.mjs +5 -9
- package/dist/substrate/runtime/observability/logger.mjs.map +1 -1
- package/dist/substrate/runtime/observability/output-truncate.mjs +35 -0
- package/dist/substrate/runtime/observability/output-truncate.mjs.map +1 -0
- package/dist/substrate/runtime/observability/pretty-error.mjs +9 -12
- package/dist/substrate/runtime/observability/pretty-error.mjs.map +1 -1
- package/dist/substrate/runtime/observability/redaction.d.mts +2 -13
- package/dist/substrate/runtime/observability/redaction.mjs +8 -14
- package/dist/substrate/runtime/observability/redaction.mjs.map +1 -1
- package/dist/substrate/runtime/observability/span-store.d.mts +1 -0
- package/dist/substrate/runtime/observability/span-store.mjs +110 -0
- package/dist/substrate/runtime/observability/span-store.mjs.map +1 -0
- package/dist/substrate/runtime/observability/spans.mjs +14 -14
- package/dist/substrate/runtime/observability/spans.mjs.map +1 -1
- package/dist/substrate/runtime/observability/subprocess-capture.mjs +1 -1
- package/dist/substrate/runtime/passthrough-or-wrap.mjs +33 -0
- package/dist/substrate/runtime/passthrough-or-wrap.mjs.map +1 -0
- package/dist/substrate/runtime/paths.d.mts +1 -1
- package/dist/substrate/runtime/paths.mjs +4 -3
- package/dist/substrate/runtime/paths.mjs.map +1 -1
- package/dist/substrate/runtime/phase-preserving-produce.mjs +40 -0
- package/dist/substrate/runtime/phase-preserving-produce.mjs.map +1 -0
- package/dist/substrate/runtime/port-broker/index.mjs +3 -0
- package/dist/substrate/runtime/port-broker/service.mjs +170 -126
- package/dist/substrate/runtime/port-broker/service.mjs.map +1 -1
- package/dist/substrate/runtime/post-acquire-tasks.mjs +1 -1
- package/dist/substrate/runtime/post-acquire-tasks.mjs.map +1 -1
- package/dist/substrate/runtime/probes.d.mts +7 -5
- package/dist/substrate/runtime/probes.mjs +3 -1
- package/dist/substrate/runtime/probes.mjs.map +1 -1
- package/dist/substrate/runtime/projection/index.mjs +4 -0
- package/dist/substrate/runtime/projection/operational-endpoints.mjs +1 -2
- package/dist/substrate/runtime/projection/operational-endpoints.mjs.map +1 -1
- package/dist/substrate/runtime/projection/persisted.mjs +33 -15
- package/dist/substrate/runtime/projection/persisted.mjs.map +1 -1
- package/dist/substrate/runtime/projection/state-ref.mjs +26 -2
- package/dist/substrate/runtime/projection/state-ref.mjs.map +1 -1
- package/dist/substrate/runtime/projection/update.mjs +88 -24
- package/dist/substrate/runtime/projection/update.mjs.map +1 -1
- package/dist/substrate/runtime/random-suffix.mjs +11 -0
- package/dist/substrate/runtime/random-suffix.mjs.map +1 -0
- package/dist/substrate/runtime/retry-policy.d.mts +59 -1
- package/dist/substrate/runtime/retry-policy.mjs +66 -1
- package/dist/substrate/runtime/retry-policy.mjs.map +1 -1
- package/dist/substrate/runtime/routed-url.d.mts +1 -0
- package/dist/substrate/runtime/routed-url.mjs +79 -0
- package/dist/substrate/runtime/routed-url.mjs.map +1 -0
- package/dist/substrate/runtime/runtime-decode.d.mts +1 -1
- package/dist/substrate/runtime/runtime-decode.mjs.map +1 -1
- package/dist/substrate/runtime/scoped-http-server.mjs +2 -3
- package/dist/substrate/runtime/scoped-http-server.mjs.map +1 -1
- package/dist/substrate/runtime/scoped-multimap/index.mjs +2 -0
- package/dist/substrate/runtime/scoped-multimap/service.mjs +52 -0
- package/dist/substrate/runtime/scoped-multimap/service.mjs.map +1 -0
- package/dist/substrate/runtime/scoped-ref-map/index.mjs +2 -0
- package/dist/substrate/runtime/scoped-ref-map/service.mjs +2 -2
- package/dist/substrate/runtime/scoped-ref-map/service.mjs.map +1 -1
- package/dist/substrate/runtime/stage-and-swap/index.mjs +72 -4
- package/dist/substrate/runtime/stage-and-swap/index.mjs.map +1 -1
- package/dist/substrate/runtime/state-store/index.d.mts +1 -0
- package/dist/substrate/runtime/state-store/index.mjs +3 -0
- package/dist/substrate/runtime/state-store/schema.d.mts +1 -0
- package/dist/substrate/runtime/state-store/schema.mjs +19 -14
- package/dist/substrate/runtime/state-store/schema.mjs.map +1 -1
- package/dist/substrate/runtime/state-store/service.d.mts +1 -0
- package/dist/substrate/runtime/state-store/service.mjs +145 -0
- package/dist/substrate/runtime/state-store/service.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.d.mts +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs +33 -0
- package/dist/substrate/runtime/strategy-registry/chain-keyed-strategy-for.mjs.map +1 -0
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs +1 -1
- package/dist/substrate/runtime/strategy-registry/chain-probe-for.mjs.map +1 -1
- package/dist/substrate/runtime/strategy-registry/index.mjs +4 -0
- package/dist/substrate/runtime/strategy-registry/service.mjs +19 -33
- package/dist/substrate/runtime/strategy-registry/service.mjs.map +1 -1
- package/dist/substrate/runtime/subnet-broker.mjs +60 -0
- package/dist/substrate/runtime/subnet-broker.mjs.map +1 -0
- package/dist/substrate/runtime/sui-execute/index.d.mts +21 -1
- package/dist/substrate/runtime/sui-execute/index.mjs +84 -20
- package/dist/substrate/runtime/sui-execute/index.mjs.map +1 -1
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.d.mts +1 -0
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs +32 -0
- package/dist/substrate/runtime/sui-execute/sign-and-dispatch.mjs.map +1 -0
- package/dist/substrate/runtime/sui-ledger/object-ref.mjs +32 -0
- package/dist/substrate/runtime/sui-ledger/object-ref.mjs.map +1 -0
- package/dist/substrate/runtime/sui-move-build/index.mjs +93 -19
- package/dist/substrate/runtime/sui-move-build/index.mjs.map +1 -1
- package/dist/substrate/runtime/supervisor/acquire-node.mjs +181 -0
- package/dist/substrate/runtime/supervisor/acquire-node.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/background-tasks.mjs +144 -0
- package/dist/substrate/runtime/supervisor/background-tasks.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/command-loop.mjs +68 -0
- package/dist/substrate/runtime/supervisor/command-loop.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs +151 -0
- package/dist/substrate/runtime/supervisor/dispatch-contributions.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/errors.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/errors.mjs +9 -0
- package/dist/substrate/runtime/supervisor/errors.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/index.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/index.mjs +3 -0
- package/dist/substrate/runtime/supervisor/shutdown.mjs +51 -0
- package/dist/substrate/runtime/supervisor/shutdown.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/start-supervisor.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/start-supervisor.mjs +250 -0
- package/dist/substrate/runtime/supervisor/start-supervisor.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/state.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/state.mjs +22 -0
- package/dist/substrate/runtime/supervisor/state.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/teardown.mjs +57 -0
- package/dist/substrate/runtime/supervisor/teardown.mjs.map +1 -0
- package/dist/substrate/runtime/supervisor/types.d.mts +1 -0
- package/dist/substrate/runtime/supervisor/wiring.mjs +133 -0
- package/dist/substrate/runtime/supervisor/wiring.mjs.map +1 -0
- package/dist/substrate/runtime/typed-env.mjs +8 -0
- package/dist/substrate/runtime/typed-env.mjs.map +1 -0
- package/dist/substrate/state-store.d.mts +1 -0
- package/dist/substrate/versioned-doc-schema.mjs +17 -0
- package/dist/substrate/versioned-doc-schema.mjs.map +1 -0
- package/dist/substrate/versioned-doc-sync.mjs +94 -0
- package/dist/substrate/versioned-doc-sync.mjs.map +1 -0
- package/dist/surfaces/cli/command-tree.mjs.map +1 -1
- package/dist/surfaces/cli/commands/index.mjs +9 -0
- package/dist/surfaces/cli/commands/prune-picker-entry.mjs +13 -0
- package/dist/surfaces/cli/commands/prune-picker-entry.mjs.map +1 -0
- package/dist/surfaces/cli/commands/prune-picker.mjs +3 -2
- package/dist/surfaces/cli/commands/prune-picker.mjs.map +1 -1
- package/dist/surfaces/cli/commands/prune.mjs +34 -17
- package/dist/surfaces/cli/commands/prune.mjs.map +1 -1
- package/dist/surfaces/cli/commands/status.mjs +2 -2
- package/dist/surfaces/cli/commands/status.mjs.map +1 -1
- package/dist/surfaces/cli/commands/supervisor-presence.mjs +5 -3
- package/dist/surfaces/cli/commands/supervisor-presence.mjs.map +1 -1
- package/dist/surfaces/cli/commands/wipe.mjs +38 -4
- package/dist/surfaces/cli/commands/wipe.mjs.map +1 -1
- package/dist/surfaces/cli/errors.mjs +1 -1
- package/dist/surfaces/cli/errors.mjs.map +1 -1
- package/dist/surfaces/cli/flags.mjs +0 -1
- package/dist/surfaces/cli/flags.mjs.map +1 -1
- package/dist/surfaces/cli/index.mjs +98 -18
- package/dist/surfaces/cli/index.mjs.map +1 -1
- package/dist/surfaces/cli/output.mjs +1 -0
- package/dist/surfaces/cli/output.mjs.map +1 -1
- package/dist/surfaces/cli/sysexits.mjs +2 -1
- package/dist/surfaces/cli/sysexits.mjs.map +1 -1
- package/dist/surfaces/tui/app.mjs +25 -3
- package/dist/surfaces/tui/app.mjs.map +1 -1
- package/dist/surfaces/tui/display-derivation.mjs +23 -74
- package/dist/surfaces/tui/display-derivation.mjs.map +1 -1
- package/dist/surfaces/tui/event-log.mjs +35 -23
- package/dist/surfaces/tui/event-log.mjs.map +1 -1
- package/dist/surfaces/tui/input.mjs +5 -1
- package/dist/surfaces/tui/input.mjs.map +1 -1
- package/dist/surfaces/tui/plain-renderer.mjs +70 -34
- package/dist/surfaces/tui/plain-renderer.mjs.map +1 -1
- package/package.json +24 -4
- package/dist/contracts/liveness-classifier.d.mts +0 -19
- package/dist/contracts/network-resolver.d.mts +0 -15
- package/dist/contracts/network-resolver.mjs +0 -7
- package/dist/contracts/network-resolver.mjs.map +0 -1
- package/dist/orchestrators/codegen/extras.mjs +0 -16
- package/dist/orchestrators/codegen/extras.mjs.map +0 -1
- package/dist/plugins/deepbook/routable.mjs +0 -21
- package/dist/plugins/deepbook/routable.mjs.map +0 -1
- package/dist/plugins/faucet/service.d.mts +0 -20
- package/dist/plugins/faucet/strategies/sui-local.d.mts +0 -23
- package/dist/plugins/faucet/strategies/sui-local.mjs.map +0 -1
- package/dist/plugins/sui/seed-objects.d.mts +0 -18
- package/dist/plugins/sui/seed-objects.mjs +0 -25
- package/dist/plugins/sui/seed-objects.mjs.map +0 -1
- package/dist/runtime/built-in-plugin-layers.mjs.map +0 -1
- package/dist/substrate/runtime/context-helpers.mjs +0 -32
- package/dist/substrate/runtime/context-helpers.mjs.map +0 -1
- package/dist/substrate/runtime/run.mjs.map +0 -1
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs +0 -30
- package/dist/substrate/runtime/strategy-registry/faucet-capability-for.mjs.map +0 -1
- package/dist/substrate/runtime/supervisor.d.mts +0 -1
- package/dist/substrate/runtime/supervisor.mjs +0 -831
- package/dist/substrate/runtime/supervisor.mjs.map +0 -1
- package/dist/surfaces/cli/commands/doctor-probes.mjs.map +0 -1
- /package/dist/{substrate/runtime/strategy-registry/faucet-capability-for.d.mts → plugins/faucet/http.d.mts} +0 -0
|
@@ -1,32 +1,120 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { acquireStackLock } from "../../substrate/runtime/cross-process/stack-lock.mjs";
|
|
2
|
+
import { mintRandomSuffix } from "../../substrate/runtime/random-suffix.mjs";
|
|
3
|
+
import { StageAndSwapError, stageAndSwap } from "../../substrate/runtime/stage-and-swap/index.mjs";
|
|
4
|
+
import { CodegenEmitFailed, CodegenEmitterCollision, CodegenPathConflict, CodegenWriteFailed } from "./errors.mjs";
|
|
2
5
|
import { emitOne } from "./emit.mjs";
|
|
3
|
-
import { modeFor } from "./permissions.mjs";
|
|
4
|
-
import { emitBindings } from "./bindings.mjs";
|
|
6
|
+
import { dirModeFor, modeFor } from "./permissions.mjs";
|
|
7
|
+
import { MoveCodegenService, MoveSummaryRunnerService, emitBindings } from "./bindings.mjs";
|
|
5
8
|
import { CodegenPathsService } from "./paths.mjs";
|
|
6
9
|
import { renderFile } from "./format.mjs";
|
|
7
10
|
import { writeGitignore } from "./gitignore.mjs";
|
|
8
11
|
import { Context, Effect, Layer, Order, Ref } from "effect";
|
|
12
|
+
import { dirname } from "node:path";
|
|
9
13
|
//#region src/orchestrators/codegen/service.ts
|
|
10
|
-
const
|
|
14
|
+
const buildParentModeResolver = (paths, decls) => Effect.gen(function* () {
|
|
15
|
+
const byParent = /* @__PURE__ */ new Map();
|
|
16
|
+
for (const decl of decls) {
|
|
17
|
+
const parent = dirname(yield* paths.resolve(decl.outputPath));
|
|
18
|
+
const current = byParent.get(parent);
|
|
19
|
+
if (current === void 0) byParent.set(parent, [decl]);
|
|
20
|
+
else current.push(decl);
|
|
21
|
+
}
|
|
22
|
+
const modes = /* @__PURE__ */ new Map();
|
|
23
|
+
for (const [parent, parentDecls] of byParent) modes.set(parent, dirModeFor(parentDecls));
|
|
24
|
+
return (absolutePath) => modes.get(dirname(absolutePath)) ?? 493;
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Per-cycle lock acquire timeout. Codegen cycles can be file-system
|
|
28
|
+
* heavy (multi-emitter, Move-bindings compilation), so we allow more
|
|
29
|
+
* than the substrate's default 5s for `stack.lock` — a custom CLI
|
|
30
|
+
* caller that hits a supervisor mid-cycle should wait, not error.
|
|
31
|
+
* Mirrors `MOVE_BUILD_LOCK_TIMEOUT_MS` (5 minutes).
|
|
32
|
+
*/
|
|
33
|
+
const CODEGEN_CYCLE_LOCK_TIMEOUT_MS = 5 * 6e4;
|
|
34
|
+
const runEmitCycle = (input) => Effect.scoped(Effect.gen(function* () {
|
|
11
35
|
const paths = yield* CodegenPathsService;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
36
|
+
yield* acquireStackLock(paths.codegenLockFile, CODEGEN_CYCLE_LOCK_TIMEOUT_MS).pipe(Effect.mapError((cause) => new CodegenWriteFailed({
|
|
37
|
+
outputPath: paths.codegenLockFile,
|
|
38
|
+
stage: "write",
|
|
39
|
+
cause
|
|
40
|
+
})));
|
|
41
|
+
return yield* runEmitCycleLocked(input);
|
|
42
|
+
}));
|
|
43
|
+
const runEmitCycleLocked = (input) => Effect.gen(function* () {
|
|
44
|
+
const paths = yield* CodegenPathsService;
|
|
45
|
+
const moveRunner = yield* MoveSummaryRunnerService;
|
|
46
|
+
const moveCodegen = yield* MoveCodegenService;
|
|
47
|
+
yield* validateUniqueness(input.contributions);
|
|
48
|
+
yield* validateAggregatePathAvailability(input.contributions);
|
|
49
|
+
const cycleId = mintRandomSuffix(16);
|
|
50
|
+
const stagingPaths = paths.withRoot(`${paths.outputDir}.staging.${cycleId}`);
|
|
51
|
+
return yield* stageAndSwap({
|
|
52
|
+
targetPath: paths.outputDir,
|
|
53
|
+
idSuffix: cycleId,
|
|
54
|
+
preserveOnPreseed: true,
|
|
55
|
+
build: Effect.gen(function* () {
|
|
56
|
+
return rewriteResultPaths(yield* runEmitCycleInner(input, stagingPaths).pipe(Effect.provideService(MoveSummaryRunnerService, moveRunner), Effect.provideService(MoveCodegenService, moveCodegen)), stagingPaths.outputDir, paths.outputDir);
|
|
57
|
+
})
|
|
58
|
+
}).pipe(Effect.mapError((e) => {
|
|
59
|
+
if (e instanceof StageAndSwapError) return new CodegenWriteFailed({
|
|
60
|
+
outputPath: paths.outputDir,
|
|
61
|
+
stage: "rename",
|
|
62
|
+
cause: e
|
|
63
|
+
});
|
|
64
|
+
return e;
|
|
65
|
+
}), Effect.withSpan("codegen.runEmitCycle", { attributes: {
|
|
66
|
+
"codegen.contributions": input.contributions.length,
|
|
67
|
+
"codegen.cycleId": cycleId,
|
|
68
|
+
"codegen.stagingDir": stagingPaths.outputDir
|
|
69
|
+
} }));
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* Project a staging-rooted `RunEmitCycleResult` back into the user-
|
|
73
|
+
* visible `outputDir` namespace. The build effect writes through
|
|
74
|
+
* `stagingDir` paths; callers (and tests) expect to see the final
|
|
75
|
+
* post-rename locations.
|
|
76
|
+
*/
|
|
77
|
+
const rewriteResultPaths = (result, stagingDir, outputDir) => {
|
|
78
|
+
const stripped = stagingDir.replace(/\/+$/, "");
|
|
79
|
+
const target = outputDir.replace(/\/+$/, "");
|
|
80
|
+
const rewrite = (p) => p.startsWith(stripped) ? `${target}${p.slice(stripped.length)}` : p;
|
|
81
|
+
return {
|
|
82
|
+
filesWritten: result.filesWritten.map(rewrite),
|
|
83
|
+
filesUnchanged: result.filesUnchanged.map(rewrite),
|
|
84
|
+
filesChmod: result.filesChmod.map(rewrite),
|
|
85
|
+
bindings: result.bindings === null ? null : {
|
|
86
|
+
...result.bindings,
|
|
87
|
+
filesWritten: result.bindings.filesWritten.map(rewrite)
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* The body of one emit cycle. Pulled out of `runEmitCycle` so the
|
|
93
|
+
* stage-and-swap wrapper can drive it against a redirected
|
|
94
|
+
* `CodegenPathsService` (the staging tree). Validation runs BEFORE
|
|
95
|
+
* this function so callers know the contribution set is well-formed.
|
|
96
|
+
*/
|
|
97
|
+
const runEmitCycleInner = (input, paths) => Effect.gen(function* () {
|
|
98
|
+
const fileEmitters = [...input.contributions];
|
|
16
99
|
const filesWritten = [];
|
|
17
100
|
const filesUnchanged = [];
|
|
18
101
|
const filesChmod = [];
|
|
19
|
-
const aggregates =
|
|
102
|
+
const aggregates = /* @__PURE__ */ new Map();
|
|
20
103
|
const packageContribs = [];
|
|
21
104
|
const sortedDecls = [...fileEmitters].sort(Order.mapInput(Order.String, (d) => d.outputPath));
|
|
105
|
+
const parentModeFor = yield* buildParentModeResolver(paths, fileEmitters);
|
|
22
106
|
for (const decl of sortedDecls) {
|
|
23
107
|
const emission = yield* runEmitter(decl);
|
|
24
108
|
const exported = emission.exports;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
109
|
+
if (decl.aggregate !== void 0) {
|
|
110
|
+
const projected = decl.aggregate.project(exported);
|
|
111
|
+
if (projected !== null) {
|
|
112
|
+
const bucket = aggregates.get(decl.aggregate.bucket) ?? {};
|
|
113
|
+
Object.assign(bucket, projected);
|
|
114
|
+
aggregates.set(decl.aggregate.bucket, bucket);
|
|
115
|
+
}
|
|
29
116
|
}
|
|
117
|
+
for (const value of Object.values(exported)) if (isPackageBindings(value)) packageContribs.push(value);
|
|
30
118
|
const rendered = renderFile({
|
|
31
119
|
emitterName: decl.emitterName,
|
|
32
120
|
outputPath: decl.outputPath,
|
|
@@ -34,12 +122,13 @@ const runEmitCycle = (input) => Effect.gen(function* () {
|
|
|
34
122
|
exports: exported,
|
|
35
123
|
imports: emission.imports
|
|
36
124
|
});
|
|
37
|
-
if (rendered
|
|
38
|
-
const abs = paths.resolve(decl.outputPath);
|
|
125
|
+
if (!rendered.ok) return yield* Effect.fail(rendered.error);
|
|
126
|
+
const abs = yield* paths.resolve(decl.outputPath);
|
|
39
127
|
switch ((yield* emitOne({
|
|
40
128
|
path: abs,
|
|
41
|
-
content: rendered,
|
|
42
|
-
mode: modeFor(decl)
|
|
129
|
+
content: rendered.text,
|
|
130
|
+
mode: modeFor(decl),
|
|
131
|
+
parentMode: parentModeFor(abs)
|
|
43
132
|
})).outcome) {
|
|
44
133
|
case "wrote":
|
|
45
134
|
filesWritten.push(abs);
|
|
@@ -59,12 +148,13 @@ const runEmitCycle = (input) => Effect.gen(function* () {
|
|
|
59
148
|
sensitive: false,
|
|
60
149
|
exports: aggregate.exports
|
|
61
150
|
});
|
|
62
|
-
if (rendered
|
|
63
|
-
const abs = paths.resolve(aggregate.outputPath);
|
|
151
|
+
if (!rendered.ok) return yield* Effect.fail(rendered.error);
|
|
152
|
+
const abs = yield* paths.resolve(aggregate.outputPath);
|
|
64
153
|
switch ((yield* emitOne({
|
|
65
154
|
path: abs,
|
|
66
|
-
content: rendered,
|
|
67
|
-
mode: 420
|
|
155
|
+
content: rendered.text,
|
|
156
|
+
mode: 420,
|
|
157
|
+
parentMode: parentModeFor(abs)
|
|
68
158
|
})).outcome) {
|
|
69
159
|
case "wrote":
|
|
70
160
|
filesWritten.push(abs);
|
|
@@ -87,7 +177,8 @@ const runEmitCycle = (input) => Effect.gen(function* () {
|
|
|
87
177
|
const sensitivePaths = fileEmitters.filter((d) => d.sensitive === true).map((d) => d.outputPath);
|
|
88
178
|
yield* writeGitignore({
|
|
89
179
|
path: paths.gitignoreFile,
|
|
90
|
-
sensitivePaths
|
|
180
|
+
sensitivePaths,
|
|
181
|
+
parentMode: parentModeFor(paths.gitignoreFile)
|
|
91
182
|
});
|
|
92
183
|
return {
|
|
93
184
|
filesWritten,
|
|
@@ -95,7 +186,7 @@ const runEmitCycle = (input) => Effect.gen(function* () {
|
|
|
95
186
|
filesChmod,
|
|
96
187
|
bindings
|
|
97
188
|
};
|
|
98
|
-
})
|
|
189
|
+
});
|
|
99
190
|
const runEmitter = (decl) => Effect.gen(function* () {
|
|
100
191
|
const exports = {};
|
|
101
192
|
const imports = [];
|
|
@@ -119,10 +210,11 @@ const runEmitter = (decl) => Effect.gen(function* () {
|
|
|
119
210
|
};
|
|
120
211
|
});
|
|
121
212
|
/**
|
|
122
|
-
* Uniqueness check: emitter name (literal) must be unique
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
213
|
+
* Uniqueness check: emitter name (literal) must be unique unless
|
|
214
|
+
* the decl opts into repetition via `allowEmitterNameRepetition`
|
|
215
|
+
* (used by per-item plugins like Package, which emit one decl per
|
|
216
|
+
* published package under a shared emitter name). Output paths
|
|
217
|
+
* must be unique across ALL emitters.
|
|
126
218
|
*/
|
|
127
219
|
const validateUniqueness = (decls) => Effect.gen(function* () {
|
|
128
220
|
const byPath = /* @__PURE__ */ new Map();
|
|
@@ -131,12 +223,13 @@ const validateUniqueness = (decls) => Effect.gen(function* () {
|
|
|
131
223
|
const ps = byPath.get(d.outputPath) ?? [];
|
|
132
224
|
ps.push(d.emitterName);
|
|
133
225
|
byPath.set(d.outputPath, ps);
|
|
134
|
-
if (d.
|
|
226
|
+
if (d.allowEmitterNameRepetition === true) continue;
|
|
135
227
|
const ns = byName.get(d.emitterName) ?? [];
|
|
136
228
|
ns.push(d.outputPath);
|
|
137
229
|
byName.set(d.emitterName, ns);
|
|
138
230
|
}
|
|
139
231
|
for (const [path, emitters] of byPath) if (emitters.length > 1) return yield* Effect.fail(new CodegenPathConflict({
|
|
232
|
+
kind: "duplicate",
|
|
140
233
|
outputPath: path,
|
|
141
234
|
emitters
|
|
142
235
|
}));
|
|
@@ -145,98 +238,57 @@ const validateUniqueness = (decls) => Effect.gen(function* () {
|
|
|
145
238
|
outputPaths
|
|
146
239
|
}));
|
|
147
240
|
});
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const aggregatePathFor = (decl) => {
|
|
155
|
-
if (decl.emitterName.startsWith("account/")) return AGGREGATE_OUTPUTS.accounts;
|
|
156
|
-
if (decl.emitterName.startsWith("coin/")) return AGGREGATE_OUTPUTS.coins;
|
|
157
|
-
if (decl.emitterName === "package") return AGGREGATE_OUTPUTS.packages;
|
|
158
|
-
if (decl.emitterName === "sui-network") return AGGREGATE_OUTPUTS.services;
|
|
159
|
-
return null;
|
|
160
|
-
};
|
|
241
|
+
/**
|
|
242
|
+
* Reject contribution sets that would have an aggregate bucket
|
|
243
|
+
* collide with a per-decl `outputPath`. The orchestrator only knows
|
|
244
|
+
* bucket names because plugins declared them via `aggregate.bucket`;
|
|
245
|
+
* it does not enumerate or recognize plugin identities here.
|
|
246
|
+
*/
|
|
161
247
|
const validateAggregatePathAvailability = (decls) => Effect.gen(function* () {
|
|
162
248
|
const aggregatePaths = /* @__PURE__ */ new Set();
|
|
163
|
-
for (const decl of decls)
|
|
164
|
-
const path = aggregatePathFor(decl);
|
|
165
|
-
if (path !== null) aggregatePaths.add(path);
|
|
166
|
-
}
|
|
249
|
+
for (const decl of decls) if (decl.aggregate !== void 0) aggregatePaths.add(decl.aggregate.bucket);
|
|
167
250
|
for (const path of aggregatePaths) {
|
|
168
251
|
const colliding = decls.filter((decl) => decl.outputPath === path);
|
|
169
252
|
if (colliding.length > 0) return yield* Effect.fail(new CodegenPathConflict({
|
|
253
|
+
kind: "duplicate",
|
|
170
254
|
outputPath: path,
|
|
171
255
|
emitters: [...colliding.map((decl) => decl.emitterName), `aggregate/${path}`]
|
|
172
256
|
}));
|
|
173
257
|
}
|
|
174
258
|
});
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
Object.assign(buckets.accounts, exported);
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
if (decl.emitterName.startsWith("coin/")) {
|
|
187
|
-
Object.assign(buckets.coins, exported);
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
if (decl.emitterName === "package") {
|
|
191
|
-
const bindings = exported["packageBindings"];
|
|
192
|
-
if (isPackageBindings(bindings)) buckets.packages[bindings.name] = bindings;
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
if (decl.emitterName === "sui-network") {
|
|
196
|
-
const network = exported["suiNetwork"];
|
|
197
|
-
if (isRecord(network)) {
|
|
198
|
-
const rpcUrl = stringField(network, "rpcUrl");
|
|
199
|
-
const faucetUrl = stringField(network, "faucetUrl");
|
|
200
|
-
const graphqlUrl = stringField(network, "graphqlUrl");
|
|
201
|
-
buckets.services["sui"] = {
|
|
202
|
-
rpc: { url: rpcUrl ?? "" },
|
|
203
|
-
faucet: faucetUrl === null ? null : { url: faucetUrl },
|
|
204
|
-
graphql: graphqlUrl === null ? null : { url: graphqlUrl }
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
};
|
|
259
|
+
/**
|
|
260
|
+
* Synthesize one `AggregateFile` per non-empty bucket. The exports
|
|
261
|
+
* map is keyed by the bucket's stem (e.g. `accounts.ts` → `accounts`)
|
|
262
|
+
* so the rendered file exports `export const <stem> = { ... }`. The
|
|
263
|
+
* orchestrator picks the export key from the bucket filename; the
|
|
264
|
+
* stem itself is not a plugin identifier — it is the filename
|
|
265
|
+
* without the `.ts` extension, derived mechanically.
|
|
266
|
+
*/
|
|
209
267
|
const buildAggregateFiles = (buckets) => {
|
|
210
268
|
const files = [];
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
}
|
|
221
|
-
if (Object.keys(buckets.packages).length > 0) files.push({
|
|
222
|
-
emitterName: "aggregate/packages",
|
|
223
|
-
outputPath: AGGREGATE_OUTPUTS.packages,
|
|
224
|
-
exports: { packages: buckets.packages }
|
|
225
|
-
});
|
|
226
|
-
if (Object.keys(buckets.services).length > 0) files.push({
|
|
227
|
-
emitterName: "aggregate/services",
|
|
228
|
-
outputPath: AGGREGATE_OUTPUTS.services,
|
|
229
|
-
exports: { services: buckets.services }
|
|
230
|
-
});
|
|
269
|
+
const sortedEntries = [...buckets.entries()].sort(([a], [b]) => a.localeCompare(b));
|
|
270
|
+
for (const [bucket, contents] of sortedEntries) {
|
|
271
|
+
if (Object.keys(contents).length === 0) continue;
|
|
272
|
+
const stem = bucketStem(bucket);
|
|
273
|
+
files.push({
|
|
274
|
+
emitterName: `aggregate/${stem}`,
|
|
275
|
+
outputPath: bucket,
|
|
276
|
+
exports: { [stem]: contents }
|
|
277
|
+
});
|
|
278
|
+
}
|
|
231
279
|
return files;
|
|
232
280
|
};
|
|
281
|
+
const bucketStem = (bucket) => bucket.replace(/\.ts$/, "").replace(/^.*\//, "");
|
|
282
|
+
/**
|
|
283
|
+
* Consumer-side shape guard: does this aggregated value look like a
|
|
284
|
+
* Move-bindings contribution that `emitBindings` knows how to
|
|
285
|
+
* consume? This is structural validation of the orchestrator's own
|
|
286
|
+
* input contract, NOT a plugin-name match. Any plugin whose
|
|
287
|
+
* `aggregate.project` returns objects with this shape will be
|
|
288
|
+
* forwarded to the Move bindings emitter.
|
|
289
|
+
*/
|
|
233
290
|
const isPackageBindings = (v) => typeof v === "object" && v !== null && "name" in v && "packageId" in v && "mvrPlaceholder" in v && "sourcePath" in v;
|
|
234
|
-
|
|
235
|
-
const stringField = (record, key) => {
|
|
236
|
-
const value = record[key];
|
|
237
|
-
return typeof value === "string" && value.length > 0 ? value : null;
|
|
238
|
-
};
|
|
239
|
-
var CodegenOrchestratorService = class extends Context.Service()("@devstack-rewrite/orchestrators/Codegen") {};
|
|
291
|
+
var CodegenOrchestratorService = class extends Context.Service()("@devstack/orchestrators/Codegen") {};
|
|
240
292
|
/** Layer-wired codegen orchestrator. No upstream requirements at boot
|
|
241
293
|
* time — the per-cycle effect carries the `FileSystem` + Move-codegen
|
|
242
294
|
* service requirements through to the caller. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.mjs","names":[],"sources":["../../../src/orchestrators/codegen/service.ts"],"sourcesContent":["// Codegen orchestrator — main service.\n//\n// Architecture §6 (Codegenable):\n// \"Codegen is a surface (L4) that walks the plugin-emitted\n// `Codegenable` capability decls.\"\n//\n// Hard boundary (distilled-doc §\"Hard boundary\"):\n// \"Apps consume codegen output, NOT devstack.\" Every runtime value\n// the app needs flows through codegen-emitted TS files. The\n// orchestrator owns the only legitimate channel from stack state\n// to app code.\n//\n// Lifecycle (distilled-doc §\"Lifecycle states\"):\n// - at-up: per supervisor cycle, run all emitters serially,\n// with per-file atomic/idempotent writes.\n// - on-change: re-run as part of the new cycle when the\n// supervisor restarts.\n// - on-demand: same emit pipeline for snapshot resume.\n// - idempotency: per-file no-touch on unchanged content.\n//\n// Pipeline (one cycle):\n// 1. Collect `Codegenable` contributions from the active stack\n// members (the supervisor walks `member.capabilities`).\n// 2. Validate uniqueness: emitter name (literal) is globally\n// unique; output path is globally unique.\n// 3. Run each emitter serially (distilled-doc § \"Serial within a\n// cycle\"). Each emit writes exports through a per-file context.\n// 4. Render each collected file emission to a TS source string.\n// 5. Emit each file with an atomic write + per-file no-touch\n// idempotency.\n// 6. Run the Move-bindings emitter against the collected\n// `package`-emitted contributions.\n// 7. Write the `.gitignore`.\n//\n// What this module does NOT do:\n// - Construct plugin-level resolved blobs (plugins pass them at\n// factory-build time).\n// - Decode the manifest envelope (see `manifest-bridge.ts`).\n// - Watch files (see `watcher.ts`).\n// - Walk the user's Move-source mtimes (see `bindings.ts`).\n\nimport { Context, Effect, FileSystem, Layer, Order, Ref, Scope } from 'effect';\n\nimport type {\n\tCodegenableDecl,\n\tCodegenEmitDone,\n\tCodegenEmitContext,\n} from '../../contracts/codegenable.ts';\n\nimport {\n\temitBindings,\n\ttype EmitBindingsResult,\n\tMoveCodegenService,\n\tMoveSummaryRunnerService,\n\ttype PackageBindings,\n} from './bindings.ts';\nimport { emitOne } from './emit.ts';\nimport {\n\tCodegenEmitFailed,\n\tCodegenEmitterCollision,\n\tCodegenPathConflict,\n\ttype CodegenError,\n} from './errors.ts';\nimport { renderFile } from './format.ts';\nimport { writeGitignore } from './gitignore.ts';\nimport { CodegenPathsService } from './paths.ts';\nimport { modeFor } from './permissions.ts';\n\n// -----------------------------------------------------------------------------\n// Public types\n// -----------------------------------------------------------------------------\n\n/** A type alias the orchestrator uses internally to avoid restating\n * the wide-erased `CodegenableDecl` generic in every signature. */\nexport type Codegenable = CodegenableDecl<string>;\n\nexport interface RunEmitCycleInput {\n\t/** All Codegenable contributions, as collected from the active\n\t * stack members' `capabilities` tuples. The orchestrator does\n\t * not look at plugins — only at the decl set. */\n\treadonly contributions: ReadonlyArray<Codegenable>;\n\t/** Optional: import-extension for bindings emission. Default `.ts`. */\n\treadonly bindingsImportExtension?: '.ts' | '.js' | '';\n}\n\nexport interface RunEmitCycleResult {\n\treadonly filesWritten: ReadonlyArray<string>;\n\treadonly filesUnchanged: ReadonlyArray<string>;\n\treadonly filesChmod: ReadonlyArray<string>;\n\treadonly bindings: EmitBindingsResult | null;\n}\n\n// -----------------------------------------------------------------------------\n// Main entry — one cycle of the codegen pipeline\n// -----------------------------------------------------------------------------\n\nexport const runEmitCycle = (\n\tinput: RunEmitCycleInput,\n): Effect.Effect<\n\tRunEmitCycleResult,\n\tCodegenError,\n\tFileSystem.FileSystem | CodegenPathsService | MoveSummaryRunnerService | MoveCodegenService\n> =>\n\tEffect.gen(function* () {\n\t\tconst paths = yield* CodegenPathsService;\n\n\t\t// 1. All contributions go through the generic file emit path.\n\t\t// Package outputs are collected for the bindings emitter\n\t\t// from the same single evaluated result used to render the\n\t\t// package pointer file.\n\t\tconst fileEmitters: Array<Codegenable> = [];\n\t\tfor (const decl of input.contributions) {\n\t\t\tfileEmitters.push(decl);\n\t\t}\n\n\t\t// 2. Validate uniqueness — both `emitterName` and `outputPath`.\n\t\t// Detected BEFORE write so the user-visible tree is\n\t\t// never half-written. `package` is the one exception:\n\t\t// multiple instances (one per Package) share the same\n\t\t// `emitterName` literal by design.\n\t\tyield* validateUniqueness(fileEmitters);\n\t\tyield* validateAggregatePathAvailability(fileEmitters);\n\n\t\t// 3-5. Run + render + emit each non-bindings contribution.\n\t\tconst filesWritten: Array<string> = [];\n\t\tconst filesUnchanged: Array<string> = [];\n\t\tconst filesChmod: Array<string> = [];\n\t\tconst aggregates = emptyAggregateBuckets();\n\t\tconst packageContribs: Array<PackageBindings> = [];\n\t\tconst sortedDecls = [...fileEmitters].sort(\n\t\t\tOrder.mapInput(Order.String, (d: Codegenable) => d.outputPath),\n\t\t);\n\t\tfor (const decl of sortedDecls) {\n\t\t\tconst emission = yield* runEmitter(decl);\n\t\t\tconst exported = emission.exports;\n\t\t\tcollectAggregateExport(aggregates, decl, exported);\n\t\t\tif (decl.emitterName === 'package') {\n\t\t\t\tconst bindings = exported['packageBindings'];\n\t\t\t\tif (isPackageBindings(bindings)) {\n\t\t\t\t\tpackageContribs.push(bindings);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst rendered = renderFile({\n\t\t\t\temitterName: decl.emitterName,\n\t\t\t\toutputPath: decl.outputPath,\n\t\t\t\tsensitive: decl.sensitive === true,\n\t\t\t\texports: exported,\n\t\t\t\timports: emission.imports,\n\t\t\t});\n\t\t\tif (rendered instanceof Error) {\n\t\t\t\t// `renderFile` returns either a string or a\n\t\t\t\t// `CodegenRenderError` (extends Error). Yield the\n\t\t\t\t// tagged form.\n\t\t\t\treturn yield* Effect.fail(rendered as CodegenError);\n\t\t\t}\n\t\t\tconst abs = paths.resolve(decl.outputPath);\n\t\t\tconst outcome = yield* emitOne({\n\t\t\t\tpath: abs,\n\t\t\t\tcontent: rendered,\n\t\t\t\tmode: modeFor(decl),\n\t\t\t});\n\t\t\tswitch (outcome.outcome) {\n\t\t\t\tcase 'wrote':\n\t\t\t\t\tfilesWritten.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'unchanged':\n\t\t\t\t\tfilesUnchanged.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'chmod-only':\n\t\t\t\t\tfilesChmod.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor (const aggregate of buildAggregateFiles(aggregates)) {\n\t\t\tconst rendered = renderFile({\n\t\t\t\temitterName: aggregate.emitterName,\n\t\t\t\toutputPath: aggregate.outputPath,\n\t\t\t\tsensitive: false,\n\t\t\t\texports: aggregate.exports,\n\t\t\t});\n\t\t\tif (rendered instanceof Error) {\n\t\t\t\treturn yield* Effect.fail(rendered as CodegenError);\n\t\t\t}\n\t\t\tconst abs = paths.resolve(aggregate.outputPath);\n\t\t\tconst outcome = yield* emitOne({\n\t\t\t\tpath: abs,\n\t\t\t\tcontent: rendered,\n\t\t\t\tmode: 0o644,\n\t\t\t});\n\t\t\tswitch (outcome.outcome) {\n\t\t\t\tcase 'wrote':\n\t\t\t\t\tfilesWritten.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'unchanged':\n\t\t\t\t\tfilesUnchanged.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'chmod-only':\n\t\t\t\t\tfilesChmod.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// 6. Bindings emitter. Skipped when there are no local\n\t\t// packages (distilled-doc § \"Skip-emit is explicit and\n\t\t// logged\").\n\t\tlet bindings: EmitBindingsResult | null = null;\n\t\tif (packageContribs.length > 0) {\n\t\t\tbindings = yield* emitBindings({\n\t\t\t\tbindingsDir: paths.bindingsDir,\n\t\t\t\tpackages: packageContribs,\n\t\t\t\timportExtension: input.bindingsImportExtension,\n\t\t\t});\n\t\t} else {\n\t\t\tyield* Effect.logInfo(\n\t\t\t\t'codegen: no package contributions; skipping Move-to-TS bindings step.',\n\t\t\t);\n\t\t}\n\n\t\t// 7. Gitignore. Sensitive paths get an explicit mention.\n\t\tconst sensitivePaths = fileEmitters\n\t\t\t.filter((d) => d.sensitive === true)\n\t\t\t.map((d) => d.outputPath);\n\t\tyield* writeGitignore({\n\t\t\tpath: paths.gitignoreFile,\n\t\t\tsensitivePaths,\n\t\t});\n\n\t\treturn {\n\t\t\tfilesWritten,\n\t\t\tfilesUnchanged,\n\t\t\tfilesChmod,\n\t\t\tbindings,\n\t\t};\n\t}).pipe(\n\t\tEffect.withSpan('codegen.runEmitCycle', {\n\t\t\tattributes: {\n\t\t\t\t'codegen.contributions': input.contributions.length,\n\t\t\t},\n\t\t}),\n\t);\n\n// -----------------------------------------------------------------------------\n// Internals\n// -----------------------------------------------------------------------------\n\ninterface CodegenEmission {\n\treadonly exports: { readonly [key: string]: unknown };\n\treadonly imports: ReadonlyArray<string>;\n}\n\nconst runEmitter = (decl: Codegenable): Effect.Effect<CodegenEmission, CodegenEmitFailed> =>\n\tEffect.gen(function* () {\n\t\tconst exports: Record<string, unknown> = {};\n\t\tconst imports: Array<string> = [];\n\t\tconst done: CodegenEmitDone = { _tag: 'CodegenEmitDone' };\n\t\tconst ctx: CodegenEmitContext = {\n\t\t\texportConst: (name, value) => {\n\t\t\t\texports[name] = value;\n\t\t\t},\n\t\t\timportStatement: (statement) => {\n\t\t\t\timports.push(statement);\n\t\t\t},\n\t\t\tdone: () => done,\n\t\t};\n\t\tyield* decl.emit(ctx).pipe(\n\t\t\tEffect.mapError(\n\t\t\t\t(cause) =>\n\t\t\t\t\tnew CodegenEmitFailed({\n\t\t\t\t\t\temitterName: decl.emitterName,\n\t\t\t\t\t\toutputPath: decl.outputPath,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t\treturn { exports, imports };\n\t});\n\n/**\n * Uniqueness check: emitter name (literal) must be unique EXCEPT\n * for the `package` emitter, which legitimately appears once per\n * Package contribution. Output paths must be unique across ALL\n * emitters (including each `package`-emitted pointer file).\n */\nconst validateUniqueness = (\n\tdecls: ReadonlyArray<Codegenable>,\n): Effect.Effect<void, CodegenPathConflict | CodegenEmitterCollision> =>\n\tEffect.gen(function* () {\n\t\tconst byPath = new Map<string, Array<string>>();\n\t\tconst byName = new Map<string, Array<string>>();\n\t\tfor (const d of decls) {\n\t\t\tconst ps = byPath.get(d.outputPath) ?? [];\n\t\t\tps.push(d.emitterName);\n\t\t\tbyPath.set(d.outputPath, ps);\n\t\t\t// `package` is allowed to repeat — it's per-Package by design.\n\t\t\tif (d.emitterName === 'package') continue;\n\t\t\tconst ns = byName.get(d.emitterName) ?? [];\n\t\t\tns.push(d.outputPath);\n\t\t\tbyName.set(d.emitterName, ns);\n\t\t}\n\t\tfor (const [path, emitters] of byPath) {\n\t\t\tif (emitters.length > 1) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew CodegenPathConflict({\n\t\t\t\t\t\toutputPath: path,\n\t\t\t\t\t\temitters,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tfor (const [name, outputPaths] of byName) {\n\t\t\tif (outputPaths.length > 1) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew CodegenEmitterCollision({\n\t\t\t\t\t\temitterName: name,\n\t\t\t\t\t\toutputPaths,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\nconst AGGREGATE_OUTPUTS = {\n\taccounts: 'accounts.ts',\n\tcoins: 'coins.ts',\n\tpackages: 'packages.ts',\n\tservices: 'services.ts',\n} as const;\n\nconst aggregatePathFor = (decl: Codegenable): string | null => {\n\tif (decl.emitterName.startsWith('account/')) return AGGREGATE_OUTPUTS.accounts;\n\tif (decl.emitterName.startsWith('coin/')) return AGGREGATE_OUTPUTS.coins;\n\tif (decl.emitterName === 'package') return AGGREGATE_OUTPUTS.packages;\n\tif (decl.emitterName === 'sui-network') return AGGREGATE_OUTPUTS.services;\n\treturn null;\n};\n\nconst validateAggregatePathAvailability = (\n\tdecls: ReadonlyArray<Codegenable>,\n): Effect.Effect<void, CodegenPathConflict> =>\n\tEffect.gen(function* () {\n\t\tconst aggregatePaths = new Set<string>();\n\t\tfor (const decl of decls) {\n\t\t\tconst path = aggregatePathFor(decl);\n\t\t\tif (path !== null) aggregatePaths.add(path);\n\t\t}\n\t\tfor (const path of aggregatePaths) {\n\t\t\tconst colliding = decls.filter((decl) => decl.outputPath === path);\n\t\t\tif (colliding.length > 0) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew CodegenPathConflict({\n\t\t\t\t\t\toutputPath: path,\n\t\t\t\t\t\temitters: [...colliding.map((decl) => decl.emitterName), `aggregate/${path}`],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\ninterface AggregateBuckets {\n\treadonly accounts: Record<string, unknown>;\n\treadonly coins: Record<string, unknown>;\n\treadonly packages: Record<string, unknown>;\n\treadonly services: Record<string, unknown>;\n}\n\nconst emptyAggregateBuckets = (): AggregateBuckets => ({\n\taccounts: {},\n\tcoins: {},\n\tpackages: {},\n\tservices: {},\n});\n\nconst collectAggregateExport = (\n\tbuckets: AggregateBuckets,\n\tdecl: Codegenable,\n\texported: { readonly [key: string]: unknown },\n): void => {\n\tif (decl.emitterName.startsWith('account/')) {\n\t\tObject.assign(buckets.accounts, exported);\n\t\treturn;\n\t}\n\tif (decl.emitterName.startsWith('coin/')) {\n\t\tObject.assign(buckets.coins, exported);\n\t\treturn;\n\t}\n\tif (decl.emitterName === 'package') {\n\t\tconst bindings = exported['packageBindings'];\n\t\tif (isPackageBindings(bindings)) {\n\t\t\tbuckets.packages[bindings.name] = bindings;\n\t\t}\n\t\treturn;\n\t}\n\tif (decl.emitterName === 'sui-network') {\n\t\tconst network = exported['suiNetwork'];\n\t\tif (isRecord(network)) {\n\t\t\tconst rpcUrl = stringField(network, 'rpcUrl');\n\t\t\tconst faucetUrl = stringField(network, 'faucetUrl');\n\t\t\tconst graphqlUrl = stringField(network, 'graphqlUrl');\n\t\t\tbuckets.services['sui'] = {\n\t\t\t\trpc: { url: rpcUrl ?? '' },\n\t\t\t\tfaucet: faucetUrl === null ? null : { url: faucetUrl },\n\t\t\t\tgraphql: graphqlUrl === null ? null : { url: graphqlUrl },\n\t\t\t};\n\t\t}\n\t}\n};\n\ninterface AggregateFile {\n\treadonly emitterName: string;\n\treadonly outputPath: string;\n\treadonly exports: { readonly [key: string]: unknown };\n}\n\nconst buildAggregateFiles = (buckets: AggregateBuckets): ReadonlyArray<AggregateFile> => {\n\tconst files: Array<AggregateFile> = [];\n\tif (Object.keys(buckets.accounts).length > 0) {\n\t\tfiles.push({\n\t\t\temitterName: 'aggregate/accounts',\n\t\t\toutputPath: AGGREGATE_OUTPUTS.accounts,\n\t\t\texports: { accounts: buckets.accounts },\n\t\t});\n\t}\n\tif (Object.keys(buckets.coins).length > 0) {\n\t\tfiles.push({\n\t\t\temitterName: 'aggregate/coins',\n\t\t\toutputPath: AGGREGATE_OUTPUTS.coins,\n\t\t\texports: { coins: buckets.coins },\n\t\t});\n\t}\n\tif (Object.keys(buckets.packages).length > 0) {\n\t\tfiles.push({\n\t\t\temitterName: 'aggregate/packages',\n\t\t\toutputPath: AGGREGATE_OUTPUTS.packages,\n\t\t\texports: { packages: buckets.packages },\n\t\t});\n\t}\n\tif (Object.keys(buckets.services).length > 0) {\n\t\tfiles.push({\n\t\t\temitterName: 'aggregate/services',\n\t\t\toutputPath: AGGREGATE_OUTPUTS.services,\n\t\t\texports: { services: buckets.services },\n\t\t});\n\t}\n\treturn files;\n};\n\nconst isPackageBindings = (v: unknown): v is PackageBindings =>\n\ttypeof v === 'object' &&\n\tv !== null &&\n\t'name' in v &&\n\t'packageId' in v &&\n\t'mvrPlaceholder' in v &&\n\t'sourcePath' in v;\n\nconst isRecord = (v: unknown): v is Readonly<Record<string, unknown>> =>\n\ttypeof v === 'object' && v !== null;\n\nconst stringField = (record: Readonly<Record<string, unknown>>, key: string): string | null => {\n\tconst value = record[key];\n\treturn typeof value === 'string' && value.length > 0 ? value : null;\n};\n\n// -----------------------------------------------------------------------------\n// Service surface — registration API + emit-cycle trigger\n// -----------------------------------------------------------------------------\n\n/**\n * The codegen orchestrator's Context-bound service. The substrate's\n * supervisor calls `registerContribution(pluginKey, decl)` once per\n * `CodegenableDecl` on each plugin's `capabilities` tuple, scope-bound\n * to that plugin's acquire scope. `runCycle()` walks the registered\n * set and runs one full emit pipeline.\n */\nexport interface CodegenOrchestrator {\n\t/** Register a `CodegenableDecl` from a plugin. Scope-bound — when\n\t * the caller's scope (the plugin's acquire scope) closes, the\n\t * registration is reaped. */\n\treadonly registerContribution: (\n\t\tpluginKey: string,\n\t\tdecl: Codegenable,\n\t) => Effect.Effect<void, never, Scope.Scope>;\n\n\t/** Run one emit cycle against the currently-registered set.\n\t * `extraContributions` are merged into the active set (callers\n\t * that have a one-off decl not tied to a plugin scope).\n\t * `bindingsImportExtension` mirrors `runEmitCycle`. */\n\treadonly runCycle: (args?: {\n\t\treadonly extraContributions?: ReadonlyArray<Codegenable>;\n\t\treadonly bindingsImportExtension?: '.ts' | '.js' | '';\n\t}) => Effect.Effect<\n\t\tRunEmitCycleResult,\n\t\tCodegenError,\n\t\tFileSystem.FileSystem | CodegenPathsService | MoveSummaryRunnerService | MoveCodegenService\n\t>;\n}\n\nexport class CodegenOrchestratorService extends Context.Service<\n\tCodegenOrchestratorService,\n\tCodegenOrchestrator\n>()('@devstack-rewrite/orchestrators/Codegen') {}\n\ninterface RegisteredCodegenEntry {\n\treadonly pluginKey: string;\n\treadonly decl: Codegenable;\n\treadonly seq: number;\n}\n\n/** Layer-wired codegen orchestrator. No upstream requirements at boot\n * time — the per-cycle effect carries the `FileSystem` + Move-codegen\n * service requirements through to the caller. */\nexport const layerCodegenOrchestrator: Layer.Layer<CodegenOrchestratorService> = Layer.effect(\n\tCodegenOrchestratorService,\n\tEffect.gen(function* () {\n\t\tconst contributionsRef = yield* Ref.make<ReadonlyArray<RegisteredCodegenEntry>>([]);\n\t\tconst seqRef = yield* Ref.make(0);\n\n\t\tconst registerContribution: CodegenOrchestrator['registerContribution'] = (pluginKey, decl) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst seq = yield* Ref.updateAndGet(seqRef, (n) => n + 1);\n\t\t\t\tconst entry: RegisteredCodegenEntry = { pluginKey, decl, seq };\n\t\t\t\tyield* Ref.update(contributionsRef, (xs) => [...xs, entry]);\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tRef.update(contributionsRef, (xs) => xs.filter((e) => e.seq !== seq)),\n\t\t\t\t);\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t'codegen.contribution.plugin': pluginKey,\n\t\t\t\t\t'codegen.contribution.emitter': decl.emitterName,\n\t\t\t\t\t'codegen.contribution.outputPath': decl.outputPath,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('orchestrator.codegen.registerContribution')) as Effect.Effect<\n\t\t\t\tvoid,\n\t\t\t\tnever,\n\t\t\t\tScope.Scope\n\t\t\t>;\n\n\t\tconst runCycle: CodegenOrchestrator['runCycle'] = (args) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst registered = (yield* Ref.get(contributionsRef)).map((e) => e.decl);\n\t\t\t\tconst merged: ReadonlyArray<Codegenable> = args?.extraContributions\n\t\t\t\t\t? [...registered, ...args.extraContributions]\n\t\t\t\t\t: registered;\n\t\t\t\treturn yield* runEmitCycle({\n\t\t\t\t\tcontributions: merged,\n\t\t\t\t\tbindingsImportExtension: args?.bindingsImportExtension,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('orchestrator.codegen.runCycle'));\n\n\t\treturn CodegenOrchestratorService.of({\n\t\t\tregisterContribution,\n\t\t\trunCycle,\n\t\t});\n\t}),\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.mjs","names":[],"sources":["../../../src/orchestrators/codegen/service.ts"],"sourcesContent":["// Codegen orchestrator — main service.\n//\n// Architecture §6 (Codegenable):\n// \"Codegen is a surface (L4) that walks the plugin-emitted\n// `Codegenable` capability decls.\"\n//\n// Hard boundary (distilled-doc §\"Hard boundary\"):\n// \"Apps consume codegen output, NOT devstack.\" Every runtime value\n// the app needs flows through codegen-emitted TS files. The\n// orchestrator owns the only legitimate channel from stack state\n// to app code.\n//\n// Lifecycle (distilled-doc §\"Lifecycle states\"):\n// - at-up: per supervisor cycle, run all emitters serially,\n// with per-file atomic/idempotent writes inside a\n// cycle-level stage-and-swap (rollback on any\n// per-file failure leaves the user-visible tree\n// unchanged).\n// - on-change: re-run as part of the new cycle when the\n// supervisor restarts.\n// - on-demand: same emit pipeline for snapshot resume.\n// - idempotency: per-file no-touch on unchanged content.\n//\n// Pipeline (one cycle):\n// 1. Collect `Codegenable` contributions from the active stack\n// members (the supervisor walks `member.capabilities`).\n// 2. Validate uniqueness: emitter name (literal) is globally\n// unique; output path is globally unique.\n// 3. Run each emitter serially (distilled-doc § \"Serial within a\n// cycle\"). Each emit writes exports through a per-file context.\n// 4. Render each collected file emission to a TS source string.\n// 5. Emit each file with an atomic write + per-file no-touch\n// idempotency.\n// 6. Run the Move-bindings emitter against the collected\n// `package`-emitted contributions.\n// 7. Write the `.gitignore`.\n//\n// What this module does NOT do:\n// - Construct plugin-level resolved blobs (plugins pass them at\n// factory-build time).\n// - Decode the manifest envelope (see `manifest-bridge.ts`).\n// - Watch files. Re-emit is driven by the supervisor cycle (and\n// on-demand by the CLI); the app's own toolchain (Vite/HMR)\n// watches the emitted output tree.\n// - Walk the user's Move-source mtimes (see `bindings.ts`).\n\nimport { Context, Effect, FileSystem, Layer, Order, Ref, Scope } from 'effect';\nimport { dirname } from 'node:path';\n\nimport type {\n\tCodegenableDecl,\n\tCodegenEmitDone,\n\tCodegenEmitContext,\n} from '../../contracts/codegenable.ts';\nimport { acquireStackLock } from '../../substrate/runtime/cross-process/stack-lock.ts';\nimport { mintRandomSuffix } from '../../substrate/runtime/random-suffix.ts';\nimport { stageAndSwap, StageAndSwapError } from '../../substrate/runtime/stage-and-swap/index.ts';\n\nimport {\n\temitBindings,\n\ttype EmitBindingsResult,\n\tMoveCodegenService,\n\tMoveSummaryRunnerService,\n\ttype PackageBindings,\n} from './bindings.ts';\nimport { emitOne } from './emit.ts';\nimport {\n\tCodegenEmitFailed,\n\tCodegenEmitterCollision,\n\tCodegenPathConflict,\n\tCodegenWriteFailed,\n\ttype CodegenError,\n} from './errors.ts';\nimport { renderFile } from './format.ts';\nimport { writeGitignore } from './gitignore.ts';\nimport { CodegenPathsService, type CodegenPaths } from './paths.ts';\nimport { dirModeFor, modeFor, NON_SENSITIVE_DIR_MODE } from './permissions.ts';\n\n// -----------------------------------------------------------------------------\n// Public types\n// -----------------------------------------------------------------------------\n\n/** A type alias the orchestrator uses internally to avoid restating\n * the wide-erased `CodegenableDecl` generic in every signature. */\nexport type Codegenable = CodegenableDecl<string>;\n\nexport interface RunEmitCycleInput {\n\t/** All Codegenable contributions, as collected from the active\n\t * stack members' `capabilities` tuples. The orchestrator does\n\t * not look at plugins — only at the decl set. */\n\treadonly contributions: ReadonlyArray<Codegenable>;\n\t/** Optional: import-extension for bindings emission. Default `.ts`. */\n\treadonly bindingsImportExtension?: '.ts' | '.js' | '';\n}\n\nexport interface RunEmitCycleResult {\n\treadonly filesWritten: ReadonlyArray<string>;\n\treadonly filesUnchanged: ReadonlyArray<string>;\n\treadonly filesChmod: ReadonlyArray<string>;\n\treadonly bindings: EmitBindingsResult | null;\n}\n\nconst buildParentModeResolver = (\n\tpaths: CodegenPaths,\n\tdecls: ReadonlyArray<Codegenable>,\n): Effect.Effect<(absolutePath: string) => number, CodegenPathConflict> =>\n\tEffect.gen(function* () {\n\t\tconst byParent = new Map<string, Array<Pick<Codegenable, 'sensitive'>>>();\n\t\tfor (const decl of decls) {\n\t\t\tconst parent = dirname(yield* paths.resolve(decl.outputPath));\n\t\t\tconst current = byParent.get(parent);\n\t\t\tif (current === undefined) {\n\t\t\t\tbyParent.set(parent, [decl]);\n\t\t\t} else {\n\t\t\t\tcurrent.push(decl);\n\t\t\t}\n\t\t}\n\t\tconst modes = new Map<string, number>();\n\t\tfor (const [parent, parentDecls] of byParent) {\n\t\t\tmodes.set(parent, dirModeFor(parentDecls));\n\t\t}\n\t\treturn (absolutePath: string) => modes.get(dirname(absolutePath)) ?? NON_SENSITIVE_DIR_MODE;\n\t});\n\n// -----------------------------------------------------------------------------\n// Main entry — one cycle of the codegen pipeline\n// -----------------------------------------------------------------------------\n\n/**\n * Per-cycle lock acquire timeout. Codegen cycles can be file-system\n * heavy (multi-emitter, Move-bindings compilation), so we allow more\n * than the substrate's default 5s for `stack.lock` — a custom CLI\n * caller that hits a supervisor mid-cycle should wait, not error.\n * Mirrors `MOVE_BUILD_LOCK_TIMEOUT_MS` (5 minutes).\n */\nconst CODEGEN_CYCLE_LOCK_TIMEOUT_MS = 5 * 60_000;\n\nexport const runEmitCycle = (\n\tinput: RunEmitCycleInput,\n): Effect.Effect<\n\tRunEmitCycleResult,\n\tCodegenError,\n\tFileSystem.FileSystem | CodegenPathsService | MoveSummaryRunnerService | MoveCodegenService\n> =>\n\t// Per-process lock. The supervisor's serialized post-acquire path\n\t// is fine for the normal lifecycle, but custom callers (CLI direct\n\t// invocations, future watcher hooks) can call `runCycle`\n\t// concurrently. With `stageAndSwap` writing under shared\n\t// `<outputDir>.staging.<cycleId>` and `<outputDir>.bak.<cycleId>`\n\t// siblings — and with the pre-seed `fs.copy` reading from the\n\t// shared `outputDir` — two overlapping cycles can stage from a\n\t// half-published tree of the other. The lock serializes them.\n\t//\n\t// Dedicated `codegenLockFile` (NOT the substrate `stack.lock`):\n\t// codegen cycles can run for many seconds when Move bindings\n\t// compile, and the substrate's `stack.lock` is reserved for short\n\t// critical sections (roster mutations, snapshot reservation). A\n\t// dedicated lock isolates codegen contention from those subsystems.\n\tEffect.scoped(\n\t\tEffect.gen(function* () {\n\t\t\tconst paths = yield* CodegenPathsService;\n\t\t\tyield* acquireStackLock(paths.codegenLockFile, CODEGEN_CYCLE_LOCK_TIMEOUT_MS).pipe(\n\t\t\t\tEffect.mapError(\n\t\t\t\t\t(cause) =>\n\t\t\t\t\t\tnew CodegenWriteFailed({\n\t\t\t\t\t\t\toutputPath: paths.codegenLockFile,\n\t\t\t\t\t\t\tstage: 'write',\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn yield* runEmitCycleLocked(input);\n\t\t}),\n\t);\n\nconst runEmitCycleLocked = (\n\tinput: RunEmitCycleInput,\n): Effect.Effect<\n\tRunEmitCycleResult,\n\tCodegenError,\n\tFileSystem.FileSystem | CodegenPathsService | MoveSummaryRunnerService | MoveCodegenService\n> =>\n\tEffect.gen(function* () {\n\t\tconst paths = yield* CodegenPathsService;\n\t\t// Yield the Move-codegen services here (outside the\n\t\t// stage-and-swap build) so the build's R-channel collapses to\n\t\t// just `FileSystem.FileSystem` — the substrate `stageAndSwap`\n\t\t// primitive constrains `build`'s requirements to\n\t\t// `FileSystem.FileSystem`.\n\t\tconst moveRunner = yield* MoveSummaryRunnerService;\n\t\tconst moveCodegen = yield* MoveCodegenService;\n\n\t\t// Pre-flight contribution-set validation. Detected BEFORE the\n\t\t// stage-and-swap so a programming-bug rejection (duplicate\n\t\t// emitterName / outputPath collision) never opens an empty\n\t\t// staging dir on disk. `package` is the one exception:\n\t\t// multiple instances (one per Package) legitimately share the\n\t\t// `emitterName` literal by design.\n\t\tyield* validateUniqueness(input.contributions);\n\t\tyield* validateAggregatePathAvailability(input.contributions);\n\n\t\t// Cycle-level atomicity: substrate stage-and-swap. The build\n\t\t// populates `<outputDir>.staging.<cycleId>/`; on success the\n\t\t// substrate renames it into place; on any failure the previous\n\t\t// tree (if any) is restored byte-for-byte. Without this wrapper\n\t\t// a mid-cycle emit failure would leave `src/generated/`\n\t\t// half-rewritten — see STYLE_GUIDE §19.\n\t\t//\n\t\t// `preserveOnPreseed: true` — substrate clones the current\n\t\t// target into staging before `build` runs so the per-file\n\t\t// no-touch idempotency (and gitignore user-block preservation)\n\t\t// sees the right baseline. Files this cycle rewrites are\n\t\t// overwritten in staging; files this cycle does NOT touch\n\t\t// survive into the next target verbatim with their original\n\t\t// mtimes (HMR watchers stay quiet for unchanged outputs).\n\t\t//\n\t\t// Cycle id is a random suffix. STYLE_GUIDE §17 mandates 8\n\t\t// hex chars for external-facing identifiers; this is a\n\t\t// deliberate 16-char carve-out because the value only\n\t\t// appears in transient staging-directory names\n\t\t// (`.staging.<id>` / `.bak.<id>`) that the substrate rm's\n\t\t// after publish. The extra entropy is defense-in-depth for\n\t\t// the race-window where two concurrent emit cycles under a\n\t\t// custom-CLI caller could mint overlapping staging dirs\n\t\t// against the same shared `outputDir`; a collision there\n\t\t// would corrupt a half-built tree, not just clash an\n\t\t// operator-visible name.\n\t\tconst cycleId = mintRandomSuffix(16);\n\t\tconst stagingPaths = paths.withRoot(`${paths.outputDir}.staging.${cycleId}`);\n\n\t\treturn yield* stageAndSwap({\n\t\t\ttargetPath: paths.outputDir,\n\t\t\tidSuffix: cycleId,\n\t\t\tpreserveOnPreseed: true,\n\t\t\tbuild: Effect.gen(function* () {\n\t\t\t\tconst inner = yield* runEmitCycleInner(input, stagingPaths).pipe(\n\t\t\t\t\tEffect.provideService(MoveSummaryRunnerService, moveRunner),\n\t\t\t\t\tEffect.provideService(MoveCodegenService, moveCodegen),\n\t\t\t\t);\n\t\t\t\t// Rewrite paths so callers see the final user-visible\n\t\t\t\t// `outputDir` location, not the staging directory that\n\t\t\t\t// only exists for the duration of the build.\n\t\t\t\treturn rewriteResultPaths(inner, stagingPaths.outputDir, paths.outputDir);\n\t\t\t}),\n\t\t}).pipe(\n\t\t\tEffect.mapError((e): CodegenError => {\n\t\t\t\tif (e instanceof StageAndSwapError) {\n\t\t\t\t\treturn new CodegenWriteFailed({\n\t\t\t\t\t\toutputPath: paths.outputDir,\n\t\t\t\t\t\tstage: 'rename',\n\t\t\t\t\t\tcause: e,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn e;\n\t\t\t}),\n\t\t\tEffect.withSpan('codegen.runEmitCycle', {\n\t\t\t\tattributes: {\n\t\t\t\t\t'codegen.contributions': input.contributions.length,\n\t\t\t\t\t'codegen.cycleId': cycleId,\n\t\t\t\t\t'codegen.stagingDir': stagingPaths.outputDir,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t});\n\n/**\n * Project a staging-rooted `RunEmitCycleResult` back into the user-\n * visible `outputDir` namespace. The build effect writes through\n * `stagingDir` paths; callers (and tests) expect to see the final\n * post-rename locations.\n */\nconst rewriteResultPaths = (\n\tresult: RunEmitCycleResult,\n\tstagingDir: string,\n\toutputDir: string,\n): RunEmitCycleResult => {\n\tconst stripped = stagingDir.replace(/\\/+$/, '');\n\tconst target = outputDir.replace(/\\/+$/, '');\n\tconst rewrite = (p: string): string =>\n\t\tp.startsWith(stripped) ? `${target}${p.slice(stripped.length)}` : p;\n\treturn {\n\t\tfilesWritten: result.filesWritten.map(rewrite),\n\t\tfilesUnchanged: result.filesUnchanged.map(rewrite),\n\t\tfilesChmod: result.filesChmod.map(rewrite),\n\t\tbindings:\n\t\t\tresult.bindings === null\n\t\t\t\t? null\n\t\t\t\t: {\n\t\t\t\t\t\t...result.bindings,\n\t\t\t\t\t\tfilesWritten: result.bindings.filesWritten.map(rewrite),\n\t\t\t\t\t},\n\t};\n};\n\n/**\n * The body of one emit cycle. Pulled out of `runEmitCycle` so the\n * stage-and-swap wrapper can drive it against a redirected\n * `CodegenPathsService` (the staging tree). Validation runs BEFORE\n * this function so callers know the contribution set is well-formed.\n */\nconst runEmitCycleInner = (\n\tinput: RunEmitCycleInput,\n\tpaths: CodegenPaths,\n): Effect.Effect<\n\tRunEmitCycleResult,\n\tCodegenError,\n\tFileSystem.FileSystem | MoveSummaryRunnerService | MoveCodegenService\n> =>\n\tEffect.gen(function* () {\n\t\tconst fileEmitters: Array<Codegenable> = [...input.contributions];\n\n\t\tconst filesWritten: Array<string> = [];\n\t\tconst filesUnchanged: Array<string> = [];\n\t\tconst filesChmod: Array<string> = [];\n\t\t// Aggregate buckets keyed by plugin-supplied bucket name. The\n\t\t// orchestrator treats bucket names as opaque tags chosen by\n\t\t// the contributor; it never branches on plugin identity. See\n\t\t// `CodegenableDecl.aggregate` (contracts/codegenable.ts).\n\t\tconst aggregates = new Map<string, Record<string, unknown>>();\n\t\tconst packageContribs: Array<PackageBindings> = [];\n\t\tconst sortedDecls = [...fileEmitters].sort(\n\t\t\tOrder.mapInput(Order.String, (d: Codegenable) => d.outputPath),\n\t\t);\n\t\tconst parentModeFor = yield* buildParentModeResolver(paths, fileEmitters);\n\t\tfor (const decl of sortedDecls) {\n\t\t\tconst emission = yield* runEmitter(decl);\n\t\t\tconst exported = emission.exports;\n\t\t\tif (decl.aggregate !== undefined) {\n\t\t\t\tconst projected = decl.aggregate.project(exported);\n\t\t\t\tif (projected !== null) {\n\t\t\t\t\tconst bucket = aggregates.get(decl.aggregate.bucket) ?? {};\n\t\t\t\t\tObject.assign(bucket, projected);\n\t\t\t\t\taggregates.set(decl.aggregate.bucket, bucket);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move-bindings collection: any export whose shape matches\n\t\t\t// the orchestrator's `PackageBindings` consumer contract is\n\t\t\t// forwarded to `emitBindings`. Runs against the raw `exported`\n\t\t\t// map (not via `aggregate.project`) so direct `codegenable(...)`\n\t\t\t// contributions — which carry no `aggregate` — are picked up\n\t\t\t// too. The orchestrator validates the shape it consumes; it\n\t\t\t// does NOT name the plugin that produced it.\n\t\t\tfor (const value of Object.values(exported)) {\n\t\t\t\tif (isPackageBindings(value)) {\n\t\t\t\t\tpackageContribs.push(value);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst rendered = renderFile({\n\t\t\t\temitterName: decl.emitterName,\n\t\t\t\toutputPath: decl.outputPath,\n\t\t\t\tsensitive: decl.sensitive === true,\n\t\t\t\texports: exported,\n\t\t\t\timports: emission.imports,\n\t\t\t});\n\t\t\tif (!rendered.ok) {\n\t\t\t\treturn yield* Effect.fail(rendered.error);\n\t\t\t}\n\t\t\tconst abs = yield* paths.resolve(decl.outputPath);\n\t\t\tconst outcome = yield* emitOne({\n\t\t\t\tpath: abs,\n\t\t\t\tcontent: rendered.text,\n\t\t\t\tmode: modeFor(decl),\n\t\t\t\tparentMode: parentModeFor(abs),\n\t\t\t});\n\t\t\tswitch (outcome.outcome) {\n\t\t\t\tcase 'wrote':\n\t\t\t\t\tfilesWritten.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'unchanged':\n\t\t\t\t\tfilesUnchanged.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'chmod-only':\n\t\t\t\t\tfilesChmod.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor (const aggregate of buildAggregateFiles(aggregates)) {\n\t\t\tconst rendered = renderFile({\n\t\t\t\temitterName: aggregate.emitterName,\n\t\t\t\toutputPath: aggregate.outputPath,\n\t\t\t\tsensitive: false,\n\t\t\t\texports: aggregate.exports,\n\t\t\t});\n\t\t\tif (!rendered.ok) {\n\t\t\t\treturn yield* Effect.fail(rendered.error);\n\t\t\t}\n\t\t\tconst abs = yield* paths.resolve(aggregate.outputPath);\n\t\t\tconst outcome = yield* emitOne({\n\t\t\t\tpath: abs,\n\t\t\t\tcontent: rendered.text,\n\t\t\t\tmode: 0o644,\n\t\t\t\tparentMode: parentModeFor(abs),\n\t\t\t});\n\t\t\tswitch (outcome.outcome) {\n\t\t\t\tcase 'wrote':\n\t\t\t\t\tfilesWritten.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'unchanged':\n\t\t\t\t\tfilesUnchanged.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'chmod-only':\n\t\t\t\t\tfilesChmod.push(abs);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tlet bindings: EmitBindingsResult | null = null;\n\t\tif (packageContribs.length > 0) {\n\t\t\tbindings = yield* emitBindings({\n\t\t\t\tbindingsDir: paths.bindingsDir,\n\t\t\t\tpackages: packageContribs,\n\t\t\t\timportExtension: input.bindingsImportExtension,\n\t\t\t});\n\t\t} else {\n\t\t\tyield* Effect.logInfo(\n\t\t\t\t'codegen: no package contributions; skipping Move-to-TS bindings step.',\n\t\t\t);\n\t\t}\n\n\t\tconst sensitivePaths = fileEmitters\n\t\t\t.filter((d) => d.sensitive === true)\n\t\t\t.map((d) => d.outputPath);\n\t\tyield* writeGitignore({\n\t\t\tpath: paths.gitignoreFile,\n\t\t\tsensitivePaths,\n\t\t\tparentMode: parentModeFor(paths.gitignoreFile),\n\t\t});\n\n\t\treturn {\n\t\t\tfilesWritten,\n\t\t\tfilesUnchanged,\n\t\t\tfilesChmod,\n\t\t\tbindings,\n\t\t};\n\t});\n\n// -----------------------------------------------------------------------------\n// Internals\n// -----------------------------------------------------------------------------\n\ninterface CodegenEmission {\n\treadonly exports: { readonly [key: string]: unknown };\n\treadonly imports: ReadonlyArray<string>;\n}\n\nconst runEmitter = (decl: Codegenable): Effect.Effect<CodegenEmission, CodegenEmitFailed> =>\n\tEffect.gen(function* () {\n\t\tconst exports: Record<string, unknown> = {};\n\t\tconst imports: Array<string> = [];\n\t\tconst done: CodegenEmitDone = { _tag: 'CodegenEmitDone' };\n\t\tconst ctx: CodegenEmitContext = {\n\t\t\texportConst: (name, value) => {\n\t\t\t\texports[name] = value;\n\t\t\t},\n\t\t\timportStatement: (statement) => {\n\t\t\t\timports.push(statement);\n\t\t\t},\n\t\t\tdone: () => done,\n\t\t};\n\t\tyield* decl.emit(ctx).pipe(\n\t\t\tEffect.mapError(\n\t\t\t\t(cause) =>\n\t\t\t\t\tnew CodegenEmitFailed({\n\t\t\t\t\t\temitterName: decl.emitterName,\n\t\t\t\t\t\toutputPath: decl.outputPath,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t}),\n\t\t\t),\n\t\t);\n\t\treturn { exports, imports };\n\t});\n\n/**\n * Uniqueness check: emitter name (literal) must be unique unless\n * the decl opts into repetition via `allowEmitterNameRepetition`\n * (used by per-item plugins like Package, which emit one decl per\n * published package under a shared emitter name). Output paths\n * must be unique across ALL emitters.\n */\nconst validateUniqueness = (\n\tdecls: ReadonlyArray<Codegenable>,\n): Effect.Effect<void, CodegenPathConflict | CodegenEmitterCollision> =>\n\tEffect.gen(function* () {\n\t\tconst byPath = new Map<string, Array<string>>();\n\t\tconst byName = new Map<string, Array<string>>();\n\t\tfor (const d of decls) {\n\t\t\tconst ps = byPath.get(d.outputPath) ?? [];\n\t\t\tps.push(d.emitterName);\n\t\t\tbyPath.set(d.outputPath, ps);\n\t\t\tif (d.allowEmitterNameRepetition === true) continue;\n\t\t\tconst ns = byName.get(d.emitterName) ?? [];\n\t\t\tns.push(d.outputPath);\n\t\t\tbyName.set(d.emitterName, ns);\n\t\t}\n\t\tfor (const [path, emitters] of byPath) {\n\t\t\tif (emitters.length > 1) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew CodegenPathConflict({\n\t\t\t\t\t\tkind: 'duplicate',\n\t\t\t\t\t\toutputPath: path,\n\t\t\t\t\t\temitters,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tfor (const [name, outputPaths] of byName) {\n\t\t\tif (outputPaths.length > 1) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew CodegenEmitterCollision({\n\t\t\t\t\t\temitterName: name,\n\t\t\t\t\t\toutputPaths,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n/**\n * Reject contribution sets that would have an aggregate bucket\n * collide with a per-decl `outputPath`. The orchestrator only knows\n * bucket names because plugins declared them via `aggregate.bucket`;\n * it does not enumerate or recognize plugin identities here.\n */\nconst validateAggregatePathAvailability = (\n\tdecls: ReadonlyArray<Codegenable>,\n): Effect.Effect<void, CodegenPathConflict> =>\n\tEffect.gen(function* () {\n\t\tconst aggregatePaths = new Set<string>();\n\t\tfor (const decl of decls) {\n\t\t\tif (decl.aggregate !== undefined) aggregatePaths.add(decl.aggregate.bucket);\n\t\t}\n\t\tfor (const path of aggregatePaths) {\n\t\t\tconst colliding = decls.filter((decl) => decl.outputPath === path);\n\t\t\tif (colliding.length > 0) {\n\t\t\t\treturn yield* Effect.fail(\n\t\t\t\t\tnew CodegenPathConflict({\n\t\t\t\t\t\tkind: 'duplicate',\n\t\t\t\t\t\toutputPath: path,\n\t\t\t\t\t\temitters: [...colliding.map((decl) => decl.emitterName), `aggregate/${path}`],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\ninterface AggregateFile {\n\treadonly emitterName: string;\n\treadonly outputPath: string;\n\treadonly exports: { readonly [key: string]: unknown };\n}\n\n/**\n * Synthesize one `AggregateFile` per non-empty bucket. The exports\n * map is keyed by the bucket's stem (e.g. `accounts.ts` → `accounts`)\n * so the rendered file exports `export const <stem> = { ... }`. The\n * orchestrator picks the export key from the bucket filename; the\n * stem itself is not a plugin identifier — it is the filename\n * without the `.ts` extension, derived mechanically.\n */\nconst buildAggregateFiles = (\n\tbuckets: ReadonlyMap<string, Record<string, unknown>>,\n): ReadonlyArray<AggregateFile> => {\n\tconst files: Array<AggregateFile> = [];\n\tconst sortedEntries = [...buckets.entries()].sort(([a], [b]) => a.localeCompare(b));\n\tfor (const [bucket, contents] of sortedEntries) {\n\t\tif (Object.keys(contents).length === 0) continue;\n\t\tconst stem = bucketStem(bucket);\n\t\tfiles.push({\n\t\t\temitterName: `aggregate/${stem}`,\n\t\t\toutputPath: bucket,\n\t\t\texports: { [stem]: contents },\n\t\t});\n\t}\n\treturn files;\n};\n\nconst bucketStem = (bucket: string): string => bucket.replace(/\\.ts$/, '').replace(/^.*\\//, '');\n\n/**\n * Consumer-side shape guard: does this aggregated value look like a\n * Move-bindings contribution that `emitBindings` knows how to\n * consume? This is structural validation of the orchestrator's own\n * input contract, NOT a plugin-name match. Any plugin whose\n * `aggregate.project` returns objects with this shape will be\n * forwarded to the Move bindings emitter.\n */\nconst isPackageBindings = (v: unknown): v is PackageBindings =>\n\ttypeof v === 'object' &&\n\tv !== null &&\n\t'name' in v &&\n\t'packageId' in v &&\n\t'mvrPlaceholder' in v &&\n\t'sourcePath' in v;\n\n// -----------------------------------------------------------------------------\n// Service surface — registration API + emit-cycle trigger\n// -----------------------------------------------------------------------------\n\n/**\n * The codegen orchestrator's Context-bound service. The substrate's\n * supervisor calls `registerContribution(pluginKey, decl)` once per\n * `CodegenableDecl` on each plugin's `capabilities` tuple, scope-bound\n * to that plugin's acquire scope. `runCycle()` walks the registered\n * set and runs one full emit pipeline.\n */\nexport interface CodegenOrchestrator {\n\t/** Register a `CodegenableDecl` from a plugin. Scope-bound — when\n\t * the caller's scope (the plugin's acquire scope) closes, the\n\t * registration is reaped. */\n\treadonly registerContribution: (\n\t\tpluginKey: string,\n\t\tdecl: Codegenable,\n\t) => Effect.Effect<void, never, Scope.Scope>;\n\n\t/** Run one emit cycle against the currently-registered set.\n\t * `extraContributions` are merged into the active set (callers\n\t * that have a one-off decl not tied to a plugin scope).\n\t * `bindingsImportExtension` mirrors `runEmitCycle`. */\n\treadonly runCycle: (args?: {\n\t\treadonly extraContributions?: ReadonlyArray<Codegenable>;\n\t\treadonly bindingsImportExtension?: '.ts' | '.js' | '';\n\t}) => Effect.Effect<\n\t\tRunEmitCycleResult,\n\t\tCodegenError,\n\t\tFileSystem.FileSystem | CodegenPathsService | MoveSummaryRunnerService | MoveCodegenService\n\t>;\n}\n\nexport class CodegenOrchestratorService extends Context.Service<\n\tCodegenOrchestratorService,\n\tCodegenOrchestrator\n>()('@devstack/orchestrators/Codegen') {}\n\ninterface RegisteredCodegenEntry {\n\treadonly pluginKey: string;\n\treadonly decl: Codegenable;\n\treadonly seq: number;\n}\n\n/** Layer-wired codegen orchestrator. No upstream requirements at boot\n * time — the per-cycle effect carries the `FileSystem` + Move-codegen\n * service requirements through to the caller. */\nexport const layerCodegenOrchestrator: Layer.Layer<CodegenOrchestratorService> = Layer.effect(\n\tCodegenOrchestratorService,\n\tEffect.gen(function* () {\n\t\tconst contributionsRef = yield* Ref.make<ReadonlyArray<RegisteredCodegenEntry>>([]);\n\t\tconst seqRef = yield* Ref.make(0);\n\n\t\tconst registerContribution: CodegenOrchestrator['registerContribution'] = (pluginKey, decl) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst seq = yield* Ref.updateAndGet(seqRef, (n) => n + 1);\n\t\t\t\tconst entry: RegisteredCodegenEntry = { pluginKey, decl, seq };\n\t\t\t\tyield* Ref.update(contributionsRef, (xs) => [...xs, entry]);\n\t\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\t\tRef.update(contributionsRef, (xs) => xs.filter((e) => e.seq !== seq)),\n\t\t\t\t);\n\t\t\t\tyield* Effect.annotateCurrentSpan({\n\t\t\t\t\t'codegen.contribution.plugin': pluginKey,\n\t\t\t\t\t'codegen.contribution.emitter': decl.emitterName,\n\t\t\t\t\t'codegen.contribution.outputPath': decl.outputPath,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('orchestrator.codegen.registerContribution')) as Effect.Effect<\n\t\t\t\tvoid,\n\t\t\t\tnever,\n\t\t\t\tScope.Scope\n\t\t\t>;\n\n\t\tconst runCycle: CodegenOrchestrator['runCycle'] = (args) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst registered = (yield* Ref.get(contributionsRef)).map((e) => e.decl);\n\t\t\t\tconst merged: ReadonlyArray<Codegenable> = args?.extraContributions\n\t\t\t\t\t? [...registered, ...args.extraContributions]\n\t\t\t\t\t: registered;\n\t\t\t\treturn yield* runEmitCycle({\n\t\t\t\t\tcontributions: merged,\n\t\t\t\t\tbindingsImportExtension: args?.bindingsImportExtension,\n\t\t\t\t});\n\t\t\t}).pipe(Effect.withSpan('orchestrator.codegen.runCycle'));\n\n\t\treturn CodegenOrchestratorService.of({\n\t\t\tregisterContribution,\n\t\t\trunCycle,\n\t\t});\n\t}),\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
//#region src/orchestrators/lifecycle-prune/errors.ts
|
|
3
|
+
/** Phase discriminator: which step of the cross-stack sweep failed.
|
|
4
|
+
* `inventory` covers the parallel listDevstack* fan-out and the
|
|
5
|
+
* per-group bucketing; the four `remove-*` phases cover the
|
|
6
|
+
* resource-specific sweep loops in `runLifecyclePrune`. */
|
|
7
|
+
const LifecyclePrunePhase = Schema.Literals([
|
|
8
|
+
"inventory",
|
|
9
|
+
"remove-containers",
|
|
10
|
+
"remove-networks",
|
|
11
|
+
"remove-volumes",
|
|
12
|
+
"remove-images"
|
|
13
|
+
]);
|
|
14
|
+
var LifecyclePruneError = class extends Schema.TaggedErrorClass()("LifecyclePruneError", {
|
|
15
|
+
phase: LifecyclePrunePhase,
|
|
16
|
+
detail: Schema.String,
|
|
17
|
+
cause: Schema.optional(Schema.Defect)
|
|
18
|
+
}) {};
|
|
19
|
+
/** Curry: `phase` → `(DockerRuntimeError) → LifecyclePruneError`.
|
|
20
|
+
* Used as `Effect.mapError(failPhase('inventory'))` to project the L1
|
|
21
|
+
* docker error union onto a single phase-tagged envelope while
|
|
22
|
+
* preserving the underlying cause for diagnostics. */
|
|
23
|
+
const failPhase = (phase) => (cause) => new LifecyclePruneError({
|
|
24
|
+
phase,
|
|
25
|
+
detail: `${phase}: ${cause._tag}`,
|
|
26
|
+
cause
|
|
27
|
+
});
|
|
28
|
+
//#endregion
|
|
29
|
+
export { LifecyclePruneError, LifecyclePrunePhase, failPhase };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=errors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.mjs","names":[],"sources":["../../../src/orchestrators/lifecycle-prune/errors.ts"],"sourcesContent":["// Tagged failures for the lifecycle-prune orchestrator.\n//\n// Per STYLE_GUIDE §2.2: orchestrator-level failures use\n// `Schema.TaggedErrorClass`; never plain `Error`; never `unknown` at\n// the public surface. The orchestrator's underlying L1 docker calls\n// raise `DockerRuntimeError` (itself a union of 16+ tagged errors);\n// we project each underlying failure onto a single phase-tagged\n// envelope so CLI consumers can `Effect.catchTag('LifecyclePruneError')`\n// and branch on `phase` instead of inspecting the L1 union directly.\n\nimport { Schema } from 'effect';\n\nimport type { DockerRuntimeError } from '../../runtime/docker/errors.ts';\n\n/** Phase discriminator: which step of the cross-stack sweep failed.\n * `inventory` covers the parallel listDevstack* fan-out and the\n * per-group bucketing; the four `remove-*` phases cover the\n * resource-specific sweep loops in `runLifecyclePrune`. */\nexport const LifecyclePrunePhase = Schema.Literals([\n\t'inventory',\n\t'remove-containers',\n\t'remove-networks',\n\t'remove-volumes',\n\t'remove-images',\n]);\nexport type LifecyclePrunePhase = typeof LifecyclePrunePhase.Type;\n\nexport class LifecyclePruneError extends Schema.TaggedErrorClass<LifecyclePruneError>()(\n\t'LifecyclePruneError',\n\t{\n\t\tphase: LifecyclePrunePhase,\n\t\tdetail: Schema.String,\n\t\tcause: Schema.optional(Schema.Defect),\n\t},\n) {}\n\n/** Curry: `phase` → `(DockerRuntimeError) → LifecyclePruneError`.\n * Used as `Effect.mapError(failPhase('inventory'))` to project the L1\n * docker error union onto a single phase-tagged envelope while\n * preserving the underlying cause for diagnostics. */\nexport const failPhase =\n\t(phase: LifecyclePrunePhase) =>\n\t(cause: DockerRuntimeError): LifecyclePruneError =>\n\t\tnew LifecyclePruneError({\n\t\t\tphase,\n\t\t\tdetail: `${phase}: ${cause._tag}`,\n\t\t\tcause,\n\t\t});\n"],"mappings":";;;;;;AAkBA,MAAa,sBAAsB,OAAO,SAAS;CAClD;CACA;CACA;CACA;CACA;CACA,CAAC;AAGF,IAAa,sBAAb,cAAyC,OAAO,kBAAuC,CACtF,uBACA;CACC,OAAO;CACP,QAAQ,OAAO;CACf,OAAO,OAAO,SAAS,OAAO,OAAO;CACrC,CACD,CAAC;;;;;AAMF,MAAa,aACX,WACA,UACA,IAAI,oBAAoB;CACvB;CACA,QAAQ,GAAG,MAAM,IAAI,MAAM;CAC3B;CACA,CAAC"}
|