everything-dev 1.53.2 → 2.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -11
- package/dist/_virtual/_rolldown/runtime.cjs +17 -2
- package/dist/_virtual/_rolldown/runtime.mjs +36 -0
- package/dist/api/auth-middleware.cjs +161 -0
- package/dist/api/auth-middleware.cjs.map +1 -0
- package/dist/api/auth-middleware.d.cts +69 -0
- package/dist/api/auth-middleware.d.mts +69 -0
- package/dist/api/auth-middleware.mjs +160 -0
- package/dist/api/auth-middleware.mjs.map +1 -0
- package/dist/api-contract.cjs +250 -62
- package/dist/api-contract.cjs.map +1 -1
- package/dist/api-contract.mjs +246 -65
- package/dist/api-contract.mjs.map +1 -1
- package/dist/app.cjs +99 -26
- package/dist/app.cjs.map +1 -1
- package/dist/app.d.cts +3 -0
- package/dist/app.d.mts +3 -0
- package/dist/app.mjs +100 -27
- package/dist/app.mjs.map +1 -1
- package/dist/auth-login.cjs +163 -0
- package/dist/auth-login.cjs.map +1 -0
- package/dist/auth-login.mjs +162 -0
- package/dist/auth-login.mjs.map +1 -0
- package/dist/auth-session.cjs +64 -0
- package/dist/auth-session.cjs.map +1 -0
- package/dist/auth-session.mjs +58 -0
- package/dist/auth-session.mjs.map +1 -0
- package/dist/auth-types-gen.cjs +0 -1
- package/dist/auth-types-gen.cjs.map +1 -1
- package/dist/build.cjs +37 -173
- package/dist/build.cjs.map +1 -1
- package/dist/build.mjs +37 -171
- package/dist/build.mjs.map +1 -1
- package/dist/bundle-cache.cjs +74 -0
- package/dist/bundle-cache.cjs.map +1 -0
- package/dist/bundle-cache.d.cts +27 -0
- package/dist/bundle-cache.d.mts +27 -0
- package/dist/bundle-cache.mjs +68 -0
- package/dist/bundle-cache.mjs.map +1 -0
- package/dist/bundle-fs-resolve.cjs +209 -0
- package/dist/bundle-fs-resolve.cjs.map +1 -0
- package/dist/bundle-fs-resolve.d.cts +76 -0
- package/dist/bundle-fs-resolve.d.mts +76 -0
- package/dist/bundle-fs-resolve.mjs +202 -0
- package/dist/bundle-fs-resolve.mjs.map +1 -0
- package/dist/cdn-deploy.cjs +126 -0
- package/dist/cdn-deploy.cjs.map +1 -0
- package/dist/cdn-deploy.mjs +124 -0
- package/dist/cdn-deploy.mjs.map +1 -0
- package/dist/cli/db-doctor.cjs +19 -19
- package/dist/cli/db-doctor.cjs.map +1 -1
- package/dist/cli/db-doctor.mjs +18 -18
- package/dist/cli/db-doctor.mjs.map +1 -1
- package/dist/cli/db-repair.cjs +9 -32
- package/dist/cli/db-repair.cjs.map +1 -1
- package/dist/cli/db-repair.mjs +9 -32
- package/dist/cli/db-repair.mjs.map +1 -1
- package/dist/cli/framework-version.cjs +7 -3
- package/dist/cli/framework-version.cjs.map +1 -1
- package/dist/cli/framework-version.mjs +7 -3
- package/dist/cli/framework-version.mjs.map +1 -1
- package/dist/cli/infra.cjs +159 -251
- package/dist/cli/infra.cjs.map +1 -1
- package/dist/cli/infra.mjs +154 -242
- package/dist/cli/infra.mjs.map +1 -1
- package/dist/cli/init.cjs +624 -196
- package/dist/cli/init.cjs.map +1 -1
- package/dist/cli/init.d.cts +61 -8
- package/dist/cli/init.d.mts +61 -8
- package/dist/cli/init.mjs +613 -194
- package/dist/cli/init.mjs.map +1 -1
- package/dist/cli/parse.cjs +8 -7
- package/dist/cli/parse.cjs.map +1 -1
- package/dist/cli/parse.mjs +9 -7
- package/dist/cli/parse.mjs.map +1 -1
- package/dist/cli/prompts.cjs +14 -1
- package/dist/cli/prompts.cjs.map +1 -1
- package/dist/cli/prompts.mjs +14 -1
- package/dist/cli/prompts.mjs.map +1 -1
- package/dist/cli/prune.cjs +220 -0
- package/dist/cli/prune.cjs.map +1 -0
- package/dist/cli/prune.mjs +220 -0
- package/dist/cli/prune.mjs.map +1 -0
- package/dist/cli/snapshot.cjs +2 -1
- package/dist/cli/snapshot.cjs.map +1 -1
- package/dist/cli/snapshot.mjs +2 -1
- package/dist/cli/snapshot.mjs.map +1 -1
- package/dist/cli/status.cjs +5 -4
- package/dist/cli/status.cjs.map +1 -1
- package/dist/cli/status.mjs +6 -5
- package/dist/cli/status.mjs.map +1 -1
- package/dist/cli/sync.cjs +156 -58
- package/dist/cli/sync.cjs.map +1 -1
- package/dist/cli/sync.mjs +158 -63
- package/dist/cli/sync.mjs.map +1 -1
- package/dist/cli/timing.cjs +0 -1
- package/dist/cli/timing.cjs.map +1 -1
- package/dist/cli/upgrade.cjs +95 -69
- package/dist/cli/upgrade.cjs.map +1 -1
- package/dist/cli/upgrade.mjs +97 -72
- package/dist/cli/upgrade.mjs.map +1 -1
- package/dist/cli/utils/helpers.cjs.map +1 -1
- package/dist/cli.cjs +320 -72
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +316 -68
- package/dist/cli.mjs.map +1 -1
- package/dist/code-artifacts.cjs +76 -8
- package/dist/code-artifacts.cjs.map +1 -1
- package/dist/code-artifacts.mjs +76 -10
- package/dist/code-artifacts.mjs.map +1 -1
- package/dist/commands/build.cjs +65 -0
- package/dist/commands/build.cjs.map +1 -0
- package/dist/commands/build.mjs +65 -0
- package/dist/commands/build.mjs.map +1 -0
- package/dist/commands/config.cjs +77 -0
- package/dist/commands/config.cjs.map +1 -0
- package/dist/commands/config.d.cts +8 -0
- package/dist/commands/config.d.mts +8 -0
- package/dist/commands/config.mjs +74 -0
- package/dist/commands/config.mjs.map +1 -0
- package/dist/commands/db.cjs +107 -0
- package/dist/commands/db.cjs.map +1 -0
- package/dist/commands/db.mjs +107 -0
- package/dist/commands/db.mjs.map +1 -0
- package/dist/commands/deploy.cjs +336 -0
- package/dist/commands/deploy.cjs.map +1 -0
- package/dist/commands/deploy.mjs +334 -0
- package/dist/commands/deploy.mjs.map +1 -0
- package/dist/commands/dev.cjs +75 -0
- package/dist/commands/dev.cjs.map +1 -0
- package/dist/commands/dev.mjs +73 -0
- package/dist/commands/dev.mjs.map +1 -0
- package/dist/commands/init.cjs +234 -0
- package/dist/commands/init.cjs.map +1 -0
- package/dist/commands/init.mjs +231 -0
- package/dist/commands/init.mjs.map +1 -0
- package/dist/commands/keys.cjs +255 -0
- package/dist/commands/keys.cjs.map +1 -0
- package/dist/commands/keys.mjs +253 -0
- package/dist/commands/keys.mjs.map +1 -0
- package/dist/commands/ops.cjs +199 -0
- package/dist/commands/ops.cjs.map +1 -0
- package/dist/commands/ops.mjs +197 -0
- package/dist/commands/ops.mjs.map +1 -0
- package/dist/commands/plugins.cjs +211 -0
- package/dist/commands/plugins.cjs.map +1 -0
- package/dist/commands/plugins.mjs +211 -0
- package/dist/commands/plugins.mjs.map +1 -0
- package/dist/commands/shared.cjs +8 -0
- package/dist/commands/shared.cjs.map +1 -0
- package/dist/commands/shared.d.cts +6 -0
- package/dist/commands/shared.d.mts +6 -0
- package/dist/commands/shared.mjs +8 -0
- package/dist/commands/shared.mjs.map +1 -0
- package/dist/commands/upgrade.cjs +325 -0
- package/dist/commands/upgrade.cjs.map +1 -0
- package/dist/commands/upgrade.mjs +323 -0
- package/dist/commands/upgrade.mjs.map +1 -0
- package/dist/components/dev-render.cjs +340 -0
- package/dist/components/dev-render.cjs.map +1 -0
- package/dist/components/dev-render.mjs +332 -0
- package/dist/components/dev-render.mjs.map +1 -0
- package/dist/config.cjs +460 -221
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +491 -48
- package/dist/config.d.mts +491 -48
- package/dist/config.mjs +439 -212
- package/dist/config.mjs.map +1 -1
- package/dist/contract.cjs +327 -50
- package/dist/contract.cjs.map +1 -1
- package/dist/contract.d.cts +1951 -1062
- package/dist/contract.d.mts +1951 -1062
- package/dist/contract.meta.cjs +107 -12
- package/dist/contract.meta.cjs.map +1 -1
- package/dist/contract.meta.d.cts +166 -8
- package/dist/contract.meta.d.mts +166 -8
- package/dist/contract.meta.mjs +107 -11
- package/dist/contract.meta.mjs.map +1 -1
- package/dist/contract.mjs +580 -327
- package/dist/contract.mjs.map +1 -1
- package/dist/dag.cjs +5 -3
- package/dist/dag.cjs.map +1 -1
- package/dist/dag.mjs +6 -3
- package/dist/dag.mjs.map +1 -1
- package/dist/db/binding.cjs +80 -0
- package/dist/db/binding.cjs.map +1 -0
- package/dist/db/binding.d.cts +39 -0
- package/dist/db/binding.d.mts +39 -0
- package/dist/db/binding.mjs +78 -0
- package/dist/db/binding.mjs.map +1 -0
- package/dist/db/bindings.cjs +78 -0
- package/dist/db/bindings.cjs.map +1 -0
- package/dist/db/bindings.d.cts +34 -0
- package/dist/db/bindings.d.mts +34 -0
- package/dist/db/bindings.mjs +76 -0
- package/dist/db/bindings.mjs.map +1 -0
- package/dist/db/core.cjs +204 -0
- package/dist/db/core.cjs.map +1 -0
- package/dist/db/core.d.cts +69 -0
- package/dist/db/core.d.mts +69 -0
- package/dist/db/core.mjs +192 -0
- package/dist/db/core.mjs.map +1 -0
- package/dist/db/driver.cjs +167 -0
- package/dist/db/driver.cjs.map +1 -0
- package/dist/db/driver.d.cts +50 -0
- package/dist/db/driver.d.mts +50 -0
- package/dist/db/driver.mjs +165 -0
- package/dist/db/driver.mjs.map +1 -0
- package/dist/db/drizzle-kit.cjs +177 -0
- package/dist/db/drizzle-kit.cjs.map +1 -0
- package/dist/db/drizzle-kit.d.cts +25 -0
- package/dist/db/drizzle-kit.d.mts +25 -0
- package/dist/db/drizzle-kit.mjs +175 -0
- package/dist/db/drizzle-kit.mjs.map +1 -0
- package/dist/db/errors.cjs +27 -0
- package/dist/db/errors.cjs.map +1 -0
- package/dist/db/errors.d.cts +16 -0
- package/dist/db/errors.d.mts +16 -0
- package/dist/db/errors.mjs +26 -0
- package/dist/db/errors.mjs.map +1 -0
- package/dist/db/identity.cjs +55 -0
- package/dist/db/identity.cjs.map +1 -0
- package/dist/db/identity.d.cts +40 -0
- package/dist/db/identity.d.mts +40 -0
- package/dist/db/identity.mjs +53 -0
- package/dist/db/identity.mjs.map +1 -0
- package/dist/db/index.cjs +43 -0
- package/dist/db/index.d.cts +9 -0
- package/dist/db/index.d.mts +9 -0
- package/dist/db/index.mjs +10 -0
- package/dist/db/run-migrations.cjs +343 -0
- package/dist/db/run-migrations.cjs.map +1 -0
- package/dist/db/run-migrations.d.cts +87 -0
- package/dist/db/run-migrations.d.mts +87 -0
- package/dist/db/run-migrations.mjs +341 -0
- package/dist/db/run-migrations.mjs.map +1 -0
- package/dist/delegate-signer.cjs +85 -0
- package/dist/delegate-signer.cjs.map +1 -0
- package/dist/delegate-signer.mjs +84 -0
- package/dist/delegate-signer.mjs.map +1 -0
- package/dist/deploy-diff.cjs +119 -0
- package/dist/deploy-diff.cjs.map +1 -0
- package/dist/deploy-diff.mjs +109 -0
- package/dist/deploy-diff.mjs.map +1 -0
- package/dist/descriptor/constructors.cjs +49 -0
- package/dist/descriptor/constructors.cjs.map +1 -0
- package/dist/descriptor/constructors.d.cts +27 -0
- package/dist/descriptor/constructors.d.mts +27 -0
- package/dist/descriptor/constructors.mjs +45 -0
- package/dist/descriptor/constructors.mjs.map +1 -0
- package/dist/descriptor/index.cjs +24 -0
- package/dist/descriptor/index.d.cts +5 -0
- package/dist/descriptor/index.d.mts +5 -0
- package/dist/descriptor/index.mjs +6 -0
- package/dist/descriptor/resolve.cjs +258 -0
- package/dist/descriptor/resolve.cjs.map +1 -0
- package/dist/descriptor/resolve.d.cts +50 -0
- package/dist/descriptor/resolve.d.mts +50 -0
- package/dist/descriptor/resolve.mjs +252 -0
- package/dist/descriptor/resolve.mjs.map +1 -0
- package/dist/descriptor/schema.cjs +109 -0
- package/dist/descriptor/schema.cjs.map +1 -0
- package/dist/descriptor/schema.d.cts +217 -0
- package/dist/descriptor/schema.d.mts +217 -0
- package/dist/descriptor/schema.mjs +102 -0
- package/dist/descriptor/schema.mjs.map +1 -0
- package/dist/descriptor/serialize.cjs +45 -0
- package/dist/descriptor/serialize.cjs.map +1 -0
- package/dist/descriptor/serialize.d.cts +7 -0
- package/dist/descriptor/serialize.d.mts +7 -0
- package/dist/descriptor/serialize.mjs +45 -0
- package/dist/descriptor/serialize.mjs.map +1 -0
- package/dist/dev-log-pipeline.cjs +273 -0
- package/dist/dev-log-pipeline.cjs.map +1 -0
- package/dist/dev-log-pipeline.mjs +267 -0
- package/dist/dev-log-pipeline.mjs.map +1 -0
- package/dist/dev-logs.cjs +39 -8
- package/dist/dev-logs.cjs.map +1 -1
- package/dist/dev-logs.mjs +37 -9
- package/dist/dev-logs.mjs.map +1 -1
- package/dist/dev-program.cjs +405 -0
- package/dist/dev-program.cjs.map +1 -0
- package/dist/dev-program.d.cts +10 -0
- package/dist/dev-program.d.mts +10 -0
- package/dist/dev-program.mjs +395 -0
- package/dist/dev-program.mjs.map +1 -0
- package/dist/dev-session-data.d.cts +27 -0
- package/dist/dev-session-data.d.mts +27 -0
- package/dist/dev-session.cjs +178 -105
- package/dist/dev-session.cjs.map +1 -1
- package/dist/dev-session.mjs +180 -105
- package/dist/dev-session.mjs.map +1 -1
- package/dist/env/process-env.cjs +16 -0
- package/dist/env/process-env.cjs.map +1 -0
- package/dist/env/process-env.mjs +13 -0
- package/dist/env/process-env.mjs.map +1 -0
- package/dist/env/project-env.cjs +144 -0
- package/dist/env/project-env.cjs.map +1 -0
- package/dist/env/project-env.d.cts +1 -0
- package/dist/env/project-env.d.mts +1 -0
- package/dist/env/project-env.mjs +132 -0
- package/dist/env/project-env.mjs.map +1 -0
- package/dist/fastkv.cjs +59 -12
- package/dist/fastkv.cjs.map +1 -1
- package/dist/fastkv.d.cts +42 -6
- package/dist/fastkv.d.mts +42 -6
- package/dist/fastkv.mjs +58 -13
- package/dist/fastkv.mjs.map +1 -1
- package/dist/fingerprint.cjs +57 -0
- package/dist/fingerprint.cjs.map +1 -0
- package/dist/fingerprint.d.cts +14 -0
- package/dist/fingerprint.d.mts +14 -0
- package/dist/fingerprint.mjs +55 -0
- package/dist/fingerprint.mjs.map +1 -0
- package/dist/http-client.cjs +17 -17
- package/dist/http-client.cjs.map +1 -1
- package/dist/http-client.mjs +17 -17
- package/dist/http-client.mjs.map +1 -1
- package/dist/image-deploy.cjs +186 -0
- package/dist/image-deploy.cjs.map +1 -0
- package/dist/image-deploy.mjs +182 -0
- package/dist/image-deploy.mjs.map +1 -0
- package/dist/index.cjs +66 -18
- package/dist/index.d.cts +8 -7
- package/dist/index.d.mts +8 -7
- package/dist/index.mjs +6 -5
- package/dist/infra/docker.cjs +77 -0
- package/dist/infra/docker.cjs.map +1 -0
- package/dist/infra/docker.d.cts +10 -0
- package/dist/infra/docker.d.mts +10 -0
- package/dist/infra/docker.mjs +69 -0
- package/dist/infra/docker.mjs.map +1 -0
- package/dist/infra/materializer.cjs +74 -0
- package/dist/infra/materializer.cjs.map +1 -0
- package/dist/infra/materializer.mjs +70 -0
- package/dist/infra/materializer.mjs.map +1 -0
- package/dist/infra/planner.cjs +135 -103
- package/dist/infra/planner.cjs.map +1 -1
- package/dist/infra/planner.mjs +137 -104
- package/dist/infra/planner.mjs.map +1 -1
- package/dist/infra/port-ownership.cjs +57 -0
- package/dist/infra/port-ownership.cjs.map +1 -0
- package/dist/infra/port-ownership.mjs +57 -0
- package/dist/infra/port-ownership.mjs.map +1 -0
- package/dist/infra/preflight.cjs +45 -33
- package/dist/infra/preflight.cjs.map +1 -1
- package/dist/infra/preflight.d.cts +1 -0
- package/dist/infra/preflight.d.mts +1 -0
- package/dist/infra/preflight.mjs +46 -34
- package/dist/infra/preflight.mjs.map +1 -1
- package/dist/infra/types.cjs.map +1 -1
- package/dist/infra/types.d.cts +2 -0
- package/dist/infra/types.d.mts +2 -0
- package/dist/infra/types.mjs.map +1 -1
- package/dist/integrity.cjs +50 -61
- package/dist/integrity.cjs.map +1 -1
- package/dist/integrity.d.cts +16 -10
- package/dist/integrity.d.mts +16 -10
- package/dist/integrity.mjs +50 -59
- package/dist/integrity.mjs.map +1 -1
- package/dist/internal/manifest-normalizer.cjs +8 -2
- package/dist/internal/manifest-normalizer.cjs.map +1 -1
- package/dist/internal/manifest-normalizer.mjs +9 -3
- package/dist/internal/manifest-normalizer.mjs.map +1 -1
- package/dist/merge.cjs +19 -1
- package/dist/merge.cjs.map +1 -1
- package/dist/merge.d.cts +1 -1
- package/dist/merge.d.mts +1 -1
- package/dist/merge.mjs +19 -2
- package/dist/merge.mjs.map +1 -1
- package/dist/mf.cjs +190 -3
- package/dist/mf.cjs.map +1 -1
- package/dist/mf.d.cts +24 -2
- package/dist/mf.d.mts +24 -2
- package/dist/mf.mjs +189 -4
- package/dist/mf.mjs.map +1 -1
- package/dist/near-cli.cjs +59 -91
- package/dist/near-cli.cjs.map +1 -1
- package/dist/near-cli.mjs +58 -90
- package/dist/near-cli.mjs.map +1 -1
- package/dist/near-signer.cjs +73 -0
- package/dist/near-signer.cjs.map +1 -0
- package/dist/near-signer.mjs +70 -0
- package/dist/near-signer.mjs.map +1 -0
- package/dist/network.cjs +0 -1
- package/dist/network.cjs.map +1 -1
- package/dist/orchestrator.cjs +256 -87
- package/dist/orchestrator.cjs.map +1 -1
- package/dist/orchestrator.mjs +248 -87
- package/dist/orchestrator.mjs.map +1 -1
- package/dist/platform-deploy.cjs +81 -0
- package/dist/platform-deploy.cjs.map +1 -0
- package/dist/platform-deploy.mjs +80 -0
- package/dist/platform-deploy.mjs.map +1 -0
- package/dist/plugin.cjs +54 -1389
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +6 -896
- package/dist/plugin.d.mts +6 -896
- package/dist/plugin.mjs +53 -1387
- package/dist/plugin.mjs.map +1 -1
- package/dist/process-kill.cjs +44 -0
- package/dist/process-kill.cjs.map +1 -0
- package/dist/process-kill.mjs +43 -0
- package/dist/process-kill.mjs.map +1 -0
- package/dist/process-registry.cjs +64 -9
- package/dist/process-registry.cjs.map +1 -1
- package/dist/process-registry.mjs +61 -10
- package/dist/process-registry.mjs.map +1 -1
- package/dist/progress.cjs +45 -0
- package/dist/progress.cjs.map +1 -0
- package/dist/progress.d.cts +13 -0
- package/dist/progress.d.mts +13 -0
- package/dist/progress.mjs +42 -0
- package/dist/progress.mjs.map +1 -0
- package/dist/publish.cjs +513 -79
- package/dist/publish.cjs.map +1 -1
- package/dist/publish.mjs +515 -82
- package/dist/publish.mjs.map +1 -1
- package/dist/registry-use.cjs +41 -0
- package/dist/registry-use.cjs.map +1 -0
- package/dist/registry-use.mjs +40 -0
- package/dist/registry-use.mjs.map +1 -0
- package/dist/resolution/session.cjs +335 -0
- package/dist/resolution/session.cjs.map +1 -0
- package/dist/resolution/session.d.cts +105 -0
- package/dist/resolution/session.d.mts +105 -0
- package/dist/resolution/session.mjs +331 -0
- package/dist/resolution/session.mjs.map +1 -0
- package/dist/rollback.cjs +131 -0
- package/dist/rollback.cjs.map +1 -0
- package/dist/rollback.mjs +128 -0
- package/dist/rollback.mjs.map +1 -0
- package/dist/sdk.cjs +7 -7
- package/dist/sdk.d.cts +3 -3
- package/dist/sdk.d.mts +3 -3
- package/dist/sdk.mjs +2 -2
- package/dist/service-descriptor.cjs +67 -34
- package/dist/service-descriptor.cjs.map +1 -1
- package/dist/service-descriptor.d.cts +4 -1
- package/dist/service-descriptor.d.mts +3 -0
- package/dist/service-descriptor.mjs +63 -35
- package/dist/service-descriptor.mjs.map +1 -1
- package/dist/shared-deps.cjs +17 -16
- package/dist/shared-deps.cjs.map +1 -1
- package/dist/shared-deps.mjs +17 -16
- package/dist/shared-deps.mjs.map +1 -1
- package/dist/start-config-source.cjs +24 -0
- package/dist/start-config-source.cjs.map +1 -0
- package/dist/start-config-source.d.cts +29 -0
- package/dist/start-config-source.d.mts +29 -0
- package/dist/start-config-source.mjs +22 -0
- package/dist/start-config-source.mjs.map +1 -0
- package/dist/storage-upload.cjs +145 -0
- package/dist/storage-upload.cjs.map +1 -0
- package/dist/storage-upload.mjs +143 -0
- package/dist/storage-upload.mjs.map +1 -0
- package/dist/types.cjs +126 -20
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +867 -585
- package/dist/types.d.mts +867 -585
- package/dist/types.mjs +307 -208
- package/dist/types.mjs.map +1 -1
- package/dist/ui/api.cjs +105 -0
- package/dist/ui/api.cjs.map +1 -0
- package/dist/ui/api.d.cts +31 -0
- package/dist/ui/api.d.mts +31 -0
- package/dist/ui/api.mjs +99 -0
- package/dist/ui/api.mjs.map +1 -0
- package/dist/ui/auth-guards.cjs +50 -0
- package/dist/ui/auth-guards.cjs.map +1 -0
- package/dist/ui/auth-guards.d.cts +39 -0
- package/dist/ui/auth-guards.d.mts +39 -0
- package/dist/ui/auth-guards.mjs +48 -0
- package/dist/ui/auth-guards.mjs.map +1 -0
- package/dist/ui/auth.cjs +197 -0
- package/dist/ui/auth.cjs.map +1 -0
- package/dist/ui/auth.d.cts +56 -0
- package/dist/ui/auth.d.mts +56 -0
- package/dist/ui/auth.mjs +179 -0
- package/dist/ui/auth.mjs.map +1 -0
- package/dist/ui/entry.cjs +16 -0
- package/dist/ui/entry.cjs.map +1 -0
- package/dist/ui/entry.d.cts +12 -0
- package/dist/ui/entry.d.mts +12 -0
- package/dist/ui/entry.mjs +15 -0
- package/dist/ui/entry.mjs.map +1 -0
- package/dist/ui/head.cjs +14 -7
- package/dist/ui/head.cjs.map +1 -1
- package/dist/ui/head.mjs +15 -7
- package/dist/ui/head.mjs.map +1 -1
- package/dist/ui/hydrate.cjs +265 -0
- package/dist/ui/hydrate.cjs.map +1 -0
- package/dist/ui/hydrate.d.cts +48 -0
- package/dist/ui/hydrate.d.mts +48 -0
- package/dist/ui/hydrate.mjs +263 -0
- package/dist/ui/hydrate.mjs.map +1 -0
- package/dist/ui/i18n.cjs +153 -0
- package/dist/ui/i18n.cjs.map +1 -0
- package/dist/ui/i18n.d.cts +29 -0
- package/dist/ui/i18n.d.mts +29 -0
- package/dist/ui/i18n.mjs +140 -0
- package/dist/ui/i18n.mjs.map +1 -0
- package/dist/ui/index.cjs +19 -1
- package/dist/ui/index.d.cts +6 -3
- package/dist/ui/index.d.mts +6 -3
- package/dist/ui/index.mjs +5 -2
- package/dist/ui/locale.cjs +53 -0
- package/dist/ui/locale.cjs.map +1 -0
- package/dist/ui/locale.d.cts +18 -0
- package/dist/ui/locale.d.mts +18 -0
- package/dist/ui/locale.mjs +49 -0
- package/dist/ui/locale.mjs.map +1 -0
- package/dist/ui/manifest/index.cjs +25 -0
- package/dist/ui/manifest/index.cjs.map +1 -0
- package/dist/ui/manifest/index.d.cts +9 -0
- package/dist/ui/manifest/index.d.mts +9 -0
- package/dist/ui/manifest/index.mjs +13 -0
- package/dist/ui/manifest/index.mjs.map +1 -0
- package/dist/ui/manifest-generator.cjs +8 -0
- package/dist/ui/manifest-generator.d.cts +1 -0
- package/dist/ui/manifest-generator.d.mts +1 -0
- package/dist/ui/manifest-generator.mjs +3 -0
- package/dist/ui/message-catalogs.cjs +8 -0
- package/dist/ui/message-catalogs.cjs.map +1 -0
- package/dist/ui/message-catalogs.d.cts +5 -0
- package/dist/ui/message-catalogs.d.mts +5 -0
- package/dist/ui/message-catalogs.mjs +8 -0
- package/dist/ui/message-catalogs.mjs.map +1 -0
- package/dist/ui/metadata.cjs +0 -1
- package/dist/ui/metadata.cjs.map +1 -1
- package/dist/ui/metadata.d.cts +1 -1
- package/dist/ui/metadata.d.mts +1 -1
- package/dist/ui/plugin-path.cjs +37 -0
- package/dist/ui/plugin-path.cjs.map +1 -0
- package/dist/ui/plugin-path.d.cts +25 -0
- package/dist/ui/plugin-path.d.mts +25 -0
- package/dist/ui/plugin-path.mjs +35 -0
- package/dist/ui/plugin-path.mjs.map +1 -0
- package/dist/ui/router-client.cjs +61 -0
- package/dist/ui/router-client.cjs.map +1 -0
- package/dist/ui/router-client.d.cts +20 -0
- package/dist/ui/router-client.d.mts +20 -0
- package/dist/ui/router-client.mjs +60 -0
- package/dist/ui/router-client.mjs.map +1 -0
- package/dist/ui/router-defaults.cjs +48 -0
- package/dist/ui/router-defaults.cjs.map +1 -0
- package/dist/ui/router-defaults.d.cts +8 -0
- package/dist/ui/router-defaults.d.mts +8 -0
- package/dist/ui/router-defaults.mjs +45 -0
- package/dist/ui/router-defaults.mjs.map +1 -0
- package/dist/ui/router-error.cjs +70 -0
- package/dist/ui/router-error.cjs.map +1 -0
- package/dist/ui/router-error.d.cts +19 -0
- package/dist/ui/router-error.d.mts +19 -0
- package/dist/ui/router-error.mjs +69 -0
- package/dist/ui/router-error.mjs.map +1 -0
- package/dist/ui/router-server.cjs +153 -0
- package/dist/ui/router-server.cjs.map +1 -0
- package/dist/ui/router-server.d.cts +38 -0
- package/dist/ui/router-server.d.mts +38 -0
- package/dist/ui/router-server.mjs +152 -0
- package/dist/ui/router-server.mjs.map +1 -0
- package/dist/ui/router.cjs +4 -16
- package/dist/ui/router.cjs.map +1 -1
- package/dist/ui/router.mjs +4 -15
- package/dist/ui/router.mjs.map +1 -1
- package/dist/ui/runtime.cjs +5 -1
- package/dist/ui/runtime.cjs.map +1 -1
- package/dist/ui/runtime.d.cts +2 -1
- package/dist/ui/runtime.d.mts +2 -1
- package/dist/ui/runtime.mjs +5 -1
- package/dist/ui/runtime.mjs.map +1 -1
- package/dist/ui/slot.cjs +34 -0
- package/dist/ui/slot.cjs.map +1 -0
- package/dist/ui/slot.d.cts +43 -0
- package/dist/ui/slot.d.mts +43 -0
- package/dist/ui/slot.mjs +34 -0
- package/dist/ui/slot.mjs.map +1 -0
- package/dist/ui/tenant.cjs +300 -0
- package/dist/ui/tenant.cjs.map +1 -0
- package/dist/ui/tenant.d.cts +122 -0
- package/dist/ui/tenant.d.mts +122 -0
- package/dist/ui/tenant.mjs +279 -0
- package/dist/ui/tenant.mjs.map +1 -0
- package/dist/ui/types.d.cts +32 -2
- package/dist/ui/types.d.mts +32 -2
- package/dist/ui/version-check.cjs +47 -0
- package/dist/ui/version-check.cjs.map +1 -0
- package/dist/ui/version-check.d.cts +23 -0
- package/dist/ui/version-check.d.mts +23 -0
- package/dist/ui/version-check.mjs +46 -0
- package/dist/ui/version-check.mjs.map +1 -0
- package/dist/utils/banner.cjs +2 -2
- package/dist/utils/banner.cjs.map +1 -1
- package/dist/utils/banner.mjs +2 -2
- package/dist/utils/banner.mjs.map +1 -1
- package/dist/utils/linkify.cjs +1 -1
- package/dist/utils/linkify.cjs.map +1 -1
- package/dist/utils/linkify.mjs +1 -0
- package/dist/utils/linkify.mjs.map +1 -1
- package/dist/utils/run.cjs +6 -6
- package/dist/utils/run.cjs.map +1 -1
- package/dist/utils/run.mjs +6 -6
- package/dist/utils/run.mjs.map +1 -1
- package/dist/utils/save-config.cjs +12 -0
- package/dist/utils/save-config.cjs.map +1 -1
- package/dist/utils/save-config.mjs +12 -0
- package/dist/utils/save-config.mjs.map +1 -1
- package/dist/utils/snapshot-hash.cjs +10 -0
- package/dist/utils/snapshot-hash.cjs.map +1 -0
- package/dist/utils/snapshot-hash.mjs +10 -0
- package/dist/utils/snapshot-hash.mjs.map +1 -0
- package/dist/utils/string.cjs +0 -1
- package/dist/utils/string.cjs.map +1 -1
- package/dist/utils/theme.cjs +30 -12
- package/dist/utils/theme.cjs.map +1 -1
- package/dist/utils/theme.mjs +30 -11
- package/dist/utils/theme.mjs.map +1 -1
- package/dist/version-manifest-deploy.cjs +50 -0
- package/dist/version-manifest-deploy.cjs.map +1 -0
- package/dist/version-manifest-deploy.mjs +49 -0
- package/dist/version-manifest-deploy.mjs.map +1 -0
- package/dist/version-manifest-resolve.cjs +42 -0
- package/dist/version-manifest-resolve.cjs.map +1 -0
- package/dist/version-manifest-resolve.d.cts +38 -0
- package/dist/version-manifest-resolve.d.mts +38 -0
- package/dist/version-manifest-resolve.mjs +40 -0
- package/dist/version-manifest-resolve.mjs.map +1 -0
- package/dist/version-status.cjs +18 -0
- package/dist/version-status.cjs.map +1 -0
- package/dist/version-status.d.cts +22 -0
- package/dist/version-status.d.mts +22 -0
- package/dist/version-status.mjs +17 -0
- package/dist/version-status.mjs.map +1 -0
- package/dist/workspace-catalog.cjs +53 -0
- package/dist/workspace-catalog.cjs.map +1 -0
- package/dist/workspace-catalog.mjs +51 -0
- package/dist/workspace-catalog.mjs.map +1 -0
- package/dist/workspace.cjs +237 -0
- package/dist/workspace.cjs.map +1 -0
- package/dist/workspace.mjs +233 -0
- package/dist/workspace.mjs.map +1 -0
- package/package.json +179 -27
- package/skills/add-a-route/SKILL.md +132 -0
- package/skills/api-and-auth/SKILL.md +87 -21
- package/skills/api-and-auth/references/middleware.md +1 -1
- package/skills/cli-reference/SKILL.md +48 -21
- package/skills/code-style/SKILL.md +8 -0
- package/skills/dev-workflow/SKILL.md +50 -26
- package/skills/extends-config/SKILL.md +31 -19
- package/skills/init-upgrade/SKILL.md +29 -16
- package/skills/plugin-development/SKILL.md +46 -112
- package/skills/plugin-development/references/database.md +82 -0
- package/skills/plugin-development/references/request-context.md +67 -0
- package/skills/publish-sync/SKILL.md +99 -22
- package/skills/registry/SKILL.md +82 -0
- package/skills/super-app/SKILL.md +25 -15
- package/skills/talk-to-the-app/SKILL.md +138 -0
- package/skills/ui-integration/SKILL.md +93 -11
- package/dist/cli/db-studio.cjs +0 -131
- package/dist/cli/db-studio.cjs.map +0 -1
- package/dist/cli/db-studio.mjs +0 -127
- package/dist/cli/db-studio.mjs.map +0 -1
- package/dist/cli/init.d.cts.map +0 -1
- package/dist/cli/init.d.mts.map +0 -1
- package/dist/components/dev-view.cjs +0 -309
- package/dist/components/dev-view.cjs.map +0 -1
- package/dist/components/dev-view.mjs +0 -309
- package/dist/components/dev-view.mjs.map +0 -1
- package/dist/components/streaming-view.cjs +0 -134
- package/dist/components/streaming-view.cjs.map +0 -1
- package/dist/components/streaming-view.mjs +0 -132
- package/dist/components/streaming-view.mjs.map +0 -1
- package/dist/config.d.cts.map +0 -1
- package/dist/config.d.mts.map +0 -1
- package/dist/contract.d.cts.map +0 -1
- package/dist/contract.d.mts.map +0 -1
- package/dist/contract.meta.d.cts.map +0 -1
- package/dist/contract.meta.d.mts.map +0 -1
- package/dist/dag.d.cts.map +0 -1
- package/dist/dag.d.mts.map +0 -1
- package/dist/db.cjs +0 -81
- package/dist/db.cjs.map +0 -1
- package/dist/db.d.cts +0 -30
- package/dist/db.d.cts.map +0 -1
- package/dist/db.d.mts +0 -30
- package/dist/db.d.mts.map +0 -1
- package/dist/db.mjs +0 -75
- package/dist/db.mjs.map +0 -1
- package/dist/fastkv.d.cts.map +0 -1
- package/dist/fastkv.d.mts.map +0 -1
- package/dist/integrity.d.cts.map +0 -1
- package/dist/integrity.d.mts.map +0 -1
- package/dist/merge.d.cts.map +0 -1
- package/dist/merge.d.mts.map +0 -1
- package/dist/mf.d.cts.map +0 -1
- package/dist/mf.d.mts.map +0 -1
- package/dist/plugin.d.cts.map +0 -1
- package/dist/plugin.d.mts.map +0 -1
- package/dist/service-descriptor.d.cts.map +0 -1
- package/dist/service-descriptor.d.mts.map +0 -1
- package/dist/types.d.cts.map +0 -1
- package/dist/types.d.mts.map +0 -1
- package/dist/ui/head.d.cts.map +0 -1
- package/dist/ui/head.d.mts.map +0 -1
- package/dist/ui/metadata.d.cts.map +0 -1
- package/dist/ui/metadata.d.mts.map +0 -1
- package/dist/ui/router.d.cts.map +0 -1
- package/dist/ui/router.d.mts.map +0 -1
- package/dist/ui/runtime.d.cts.map +0 -1
- package/dist/ui/runtime.d.mts.map +0 -1
- package/dist/ui/types.d.cts.map +0 -1
- package/dist/ui/types.d.mts.map +0 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_fastkv = require('../fastkv.cjs');
|
|
3
|
+
const require_config = require('../config.cjs');
|
|
4
|
+
const require_resolution_session = require('../resolution/session.cjs');
|
|
5
|
+
const require_fingerprint = require('../fingerprint.cjs');
|
|
6
|
+
const require_version_status = require('../version-status.cjs');
|
|
7
|
+
const require_shared = require('./shared.cjs');
|
|
8
|
+
const require_process_registry = require('../process-registry.cjs');
|
|
9
|
+
const require_app = require('../app.cjs');
|
|
10
|
+
const require_infra = require('../cli/infra.cjs');
|
|
11
|
+
const require_port_ownership = require('../infra/port-ownership.cjs');
|
|
12
|
+
const require_status = require('../cli/status.cjs');
|
|
13
|
+
const require_dev_logs = require('../dev-logs.cjs');
|
|
14
|
+
const require_process_kill = require('../process-kill.cjs');
|
|
15
|
+
let node_path = require("node:path");
|
|
16
|
+
let effect = require("effect");
|
|
17
|
+
let node_process = require("node:process");
|
|
18
|
+
node_process = require_runtime.__toESM(node_process, 1);
|
|
19
|
+
|
|
20
|
+
//#region src/commands/ops.ts
|
|
21
|
+
function registerOps(builder) {
|
|
22
|
+
return {
|
|
23
|
+
status: builder.status.handler(async ({ context }) => {
|
|
24
|
+
try {
|
|
25
|
+
const deps = effect.Context.get(context["effect/context"], require_shared.BosDepsTag);
|
|
26
|
+
const configPath = require_config.findConfigPath();
|
|
27
|
+
if (!configPath) return {
|
|
28
|
+
status: "error",
|
|
29
|
+
packages: [],
|
|
30
|
+
envFile: "missing",
|
|
31
|
+
error: `${require_config.MISSING_CONFIG_MESSAGE} in current directory`
|
|
32
|
+
};
|
|
33
|
+
const projectDir = (0, node_path.resolve)((0, node_path.dirname)(configPath));
|
|
34
|
+
return {
|
|
35
|
+
...await require_status.getStatus(projectDir),
|
|
36
|
+
deployedVersion: await deployedVersionStatus(deps)
|
|
37
|
+
};
|
|
38
|
+
} catch (error) {
|
|
39
|
+
return {
|
|
40
|
+
status: "error",
|
|
41
|
+
packages: [],
|
|
42
|
+
envFile: "missing",
|
|
43
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}),
|
|
47
|
+
logs: builder.logs.handler(async ({ input, context }) => {
|
|
48
|
+
try {
|
|
49
|
+
const configDir = effect.Context.get(context["effect/context"], require_shared.BosDepsTag).session?.root ?? node_process.default.cwd();
|
|
50
|
+
const text = await require_dev_logs.readDevLatestLog(configDir, { tail: input.tail });
|
|
51
|
+
const service = input.service;
|
|
52
|
+
const lines = text.split("\n").filter((line) => line.length > 0).filter((line) => {
|
|
53
|
+
if (!service) return true;
|
|
54
|
+
const match = /\] \[([^\]]+)\] \[(?:OUT|ERR)\] /.exec(line);
|
|
55
|
+
return match?.[1] === service || match?.[1] === `plugin:${service}`;
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
logFile: require_dev_logs.resolveDevLatestFile(configDir),
|
|
59
|
+
lines
|
|
60
|
+
};
|
|
61
|
+
} catch (error) {
|
|
62
|
+
return {
|
|
63
|
+
logFile: "unknown",
|
|
64
|
+
lines: [error instanceof Error ? `Failed to read logs: ${error.message}` : "Failed to read logs"]
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}),
|
|
68
|
+
ps: builder.ps.handler(async () => {
|
|
69
|
+
try {
|
|
70
|
+
return {
|
|
71
|
+
status: "ok",
|
|
72
|
+
entries: await effect.Effect.runPromise(require_process_registry.pruneDeadEffect(require_process_registry.readRegistry()))
|
|
73
|
+
};
|
|
74
|
+
} catch (error) {
|
|
75
|
+
return {
|
|
76
|
+
status: "error",
|
|
77
|
+
entries: [],
|
|
78
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}),
|
|
82
|
+
kill: builder.kill.handler(async ({ input }) => {
|
|
83
|
+
try {
|
|
84
|
+
const configPath = require_config.findConfigPath();
|
|
85
|
+
const targetConfigDir = input.all ? void 0 : input.configDir ?? (configPath ? (0, node_path.resolve)((0, node_path.dirname)(configPath)) : void 0);
|
|
86
|
+
const targets = targetConfigDir ? require_process_registry.readRegistry().filter((entry) => entry.configDir === targetConfigDir) : require_process_registry.readRegistry();
|
|
87
|
+
const killed = [];
|
|
88
|
+
const skipped = [];
|
|
89
|
+
for (const entry of targets) {
|
|
90
|
+
const wasAlive = require_process_registry.isPidAlive(entry.pid);
|
|
91
|
+
if (wasAlive) await effect.Effect.runPromise(require_process_kill.killProcessGroupEscalating(entry.pid, {
|
|
92
|
+
terminateMs: 5e3,
|
|
93
|
+
signal: input.signal === "SIGKILL" ? "SIGKILL" : "SIGTERM"
|
|
94
|
+
}));
|
|
95
|
+
const reapedChildren = [];
|
|
96
|
+
for (const childPid of entry.childPids ?? []) if (require_process_registry.isPidAlive(childPid)) {
|
|
97
|
+
require_process_kill.reapGroup(childPid);
|
|
98
|
+
reapedChildren.push(childPid);
|
|
99
|
+
}
|
|
100
|
+
const ports = Object.values(entry.ports ?? {}).filter((port) => Number.isFinite(port) && port > 0);
|
|
101
|
+
const stillBound = [];
|
|
102
|
+
for (const port of ports) {
|
|
103
|
+
let bindable = false;
|
|
104
|
+
for (let attempt = 0; attempt < 4; attempt++) {
|
|
105
|
+
bindable = await effect.Effect.runPromise(require_app.probePortBindable(port));
|
|
106
|
+
if (bindable) break;
|
|
107
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
108
|
+
}
|
|
109
|
+
if (!bindable) stillBound.push(port);
|
|
110
|
+
}
|
|
111
|
+
if (stillBound.length > 0) {
|
|
112
|
+
const owner = await effect.Effect.runPromise(require_port_ownership.ownerOfPort(stillBound[0]));
|
|
113
|
+
skipped.push({
|
|
114
|
+
pid: entry.pid,
|
|
115
|
+
reason: `ports still bound after kill: ${stillBound.join(", ")}${owner ? ` — held by pid ${owner.pid} (${owner.command})` : " — owner unknown"}`
|
|
116
|
+
});
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
require_process_registry.unregisterPid(entry.pid);
|
|
120
|
+
killed.push({
|
|
121
|
+
pid: entry.pid,
|
|
122
|
+
configDir: entry.configDir
|
|
123
|
+
});
|
|
124
|
+
if (!wasAlive && reapedChildren.length > 0) skipped.push({
|
|
125
|
+
pid: entry.pid,
|
|
126
|
+
reason: `process already exited; reaped orphaned children ${reapedChildren.join(", ")}`
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
status: "killed",
|
|
131
|
+
killed,
|
|
132
|
+
skipped
|
|
133
|
+
};
|
|
134
|
+
} catch (error) {
|
|
135
|
+
return {
|
|
136
|
+
status: "error",
|
|
137
|
+
killed: [],
|
|
138
|
+
skipped: [],
|
|
139
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}),
|
|
143
|
+
infraExport: builder.infraExport.handler(async ({ input, context }) => {
|
|
144
|
+
const deps = effect.Context.get(context["effect/context"], require_shared.BosDepsTag);
|
|
145
|
+
const configDir = input.configDir ?? deps.session?.root ?? node_process.default.cwd();
|
|
146
|
+
const ci = deps.session?.runtime ? require_infra.buildCiInfraPlan(deps.session.runtime) : null;
|
|
147
|
+
if (!ci) {
|
|
148
|
+
const refreshed = await require_resolution_session.openResolution({ cwd: configDir });
|
|
149
|
+
if (!refreshed?.runtime) throw new Error("No resolved runtime config available for infra export");
|
|
150
|
+
return require_infra.buildCiInfraPlan(refreshed.runtime);
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
...ci,
|
|
154
|
+
account: deps.session?.config?.account ?? ci.account,
|
|
155
|
+
gateway: ci.gateway ?? deps.session?.config?.domain ?? deps.session?.config?.account ?? ci.account
|
|
156
|
+
};
|
|
157
|
+
})
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function deployedVersionStatus(deps) {
|
|
161
|
+
const config = deps.session?.config;
|
|
162
|
+
if (!config?.account || !config.domain) return void 0;
|
|
163
|
+
const { account, domain } = config;
|
|
164
|
+
let publishedFingerprint;
|
|
165
|
+
try {
|
|
166
|
+
const published = await require_fastkv.fetchBosConfigFromFastKv(`bos://${account}/${domain}`);
|
|
167
|
+
publishedFingerprint = require_fingerprint.pointerFingerprint(published);
|
|
168
|
+
} catch {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const hostUrl = deps.session?.runtime?.host?.url;
|
|
172
|
+
if (!hostUrl) return require_version_status.computeDeployedVersionStatus({
|
|
173
|
+
publishedFingerprint,
|
|
174
|
+
servedFingerprint: null
|
|
175
|
+
});
|
|
176
|
+
try {
|
|
177
|
+
const response = await fetch(new URL("/.well-known/version", hostUrl));
|
|
178
|
+
if (!response.ok) return require_version_status.computeDeployedVersionStatus({
|
|
179
|
+
publishedFingerprint,
|
|
180
|
+
servedFingerprint: null,
|
|
181
|
+
servedError: `version endpoint returned ${response.status}`
|
|
182
|
+
});
|
|
183
|
+
const body = await response.json();
|
|
184
|
+
return require_version_status.computeDeployedVersionStatus({
|
|
185
|
+
publishedFingerprint,
|
|
186
|
+
servedFingerprint: body.fingerprint ?? null
|
|
187
|
+
});
|
|
188
|
+
} catch (error) {
|
|
189
|
+
return require_version_status.computeDeployedVersionStatus({
|
|
190
|
+
publishedFingerprint,
|
|
191
|
+
servedFingerprint: null,
|
|
192
|
+
servedError: error instanceof Error ? error.message : String(error)
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
//#endregion
|
|
198
|
+
exports.registerOps = registerOps;
|
|
199
|
+
//# sourceMappingURL=ops.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops.cjs","names":["Context","BosDepsTag","findConfigPath","MISSING_CONFIG_MESSAGE","resolve","dirname","getStatus","process","readDevLatestLog","resolveDevLatestFile","Effect","pruneDeadEffect","readRegistry","isPidAlive","killProcessGroupEscalating","probePortBindable","ownerOfPort","buildCiInfraPlan","openResolution","fetchBosConfigFromFastKv","pointerFingerprint","computeDeployedVersionStatus"],"sources":["../../src/commands/ops.ts"],"sourcesContent":["import { dirname, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { Context, Effect } from \"effect\";\nimport { probePortBindable } from \"../app\";\nimport { buildCiInfraPlan, type CiInfraPlan } from \"../cli/infra\";\nimport { getStatus } from \"../cli/status\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE } from \"../config\";\nimport { readDevLatestLog, resolveDevLatestFile } from \"../dev-logs\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { pointerFingerprint } from \"../fingerprint\";\nimport { ownerOfPort } from \"../infra/port-ownership\";\nimport { killProcessGroupEscalating, reapGroup } from \"../process-kill\";\nimport { isPidAlive, pruneDeadEffect, readRegistry, unregisterPid } from \"../process-registry\";\nimport { openResolution } from \"../resolution/session\";\nimport { computeDeployedVersionStatus, type DeployedVersionStatus } from \"../version-status\";\nimport { type BosBuilder, type BosDeps, BosDepsTag } from \"./shared\";\n\nexport function registerOps(builder: BosBuilder) {\n return {\n status: builder.status.handler(async ({ context }) => {\n try {\n const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n envFile: \"missing\" as const,\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const status = await getStatus(projectDir);\n return {\n ...status,\n deployedVersion: await deployedVersionStatus(deps),\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n envFile: \"missing\" as const,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n logs: builder.logs.handler(async ({ input, context }) => {\n try {\n const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n const configDir = deps.session?.root ?? process.cwd();\n const text = await readDevLatestLog(configDir, { tail: input.tail });\n const service = input.service;\n const lines = text\n .split(\"\\n\")\n .filter((line) => line.length > 0)\n .filter((line) => {\n if (!service) return true;\n const match = /\\] \\[([^\\]]+)\\] \\[(?:OUT|ERR)\\] /.exec(line);\n return match?.[1] === service || match?.[1] === `plugin:${service}`;\n });\n return {\n logFile: resolveDevLatestFile(configDir),\n lines,\n };\n } catch (error) {\n return {\n logFile: \"unknown\",\n lines: [\n error instanceof Error\n ? `Failed to read logs: ${error.message}`\n : \"Failed to read logs\",\n ],\n };\n }\n }),\n\n ps: builder.ps.handler(async () => {\n try {\n const entries = await Effect.runPromise(pruneDeadEffect(readRegistry()));\n return {\n status: \"ok\" as const,\n entries,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n entries: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n kill: builder.kill.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n const targetConfigDir = input.all\n ? undefined\n : (input.configDir ?? (configPath ? resolve(dirname(configPath)) : undefined));\n\n const targets = targetConfigDir\n ? readRegistry().filter((entry) => entry.configDir === targetConfigDir)\n : readRegistry();\n\n const killed: Array<{ pid: number; configDir: string }> = [];\n const skipped: Array<{ pid: number; reason: string }> = [];\n\n for (const entry of targets) {\n const wasAlive = isPidAlive(entry.pid);\n if (wasAlive) {\n await Effect.runPromise(\n killProcessGroupEscalating(entry.pid, {\n terminateMs: 5000,\n signal: input.signal === \"SIGKILL\" ? \"SIGKILL\" : \"SIGTERM\",\n }),\n );\n }\n\n const reapedChildren: number[] = [];\n for (const childPid of entry.childPids ?? []) {\n if (isPidAlive(childPid)) {\n reapGroup(childPid);\n reapedChildren.push(childPid);\n }\n }\n\n const ports = Object.values(entry.ports ?? {}).filter(\n (port) => Number.isFinite(port) && port > 0,\n );\n const stillBound: number[] = [];\n for (const port of ports) {\n let bindable = false;\n for (let attempt = 0; attempt < 4; attempt++) {\n bindable = await Effect.runPromise(probePortBindable(port));\n if (bindable) break;\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n if (!bindable) stillBound.push(port);\n }\n\n if (stillBound.length > 0) {\n const owner = await Effect.runPromise(ownerOfPort(stillBound[0]));\n skipped.push({\n pid: entry.pid,\n reason: `ports still bound after kill: ${stillBound.join(\", \")}${\n owner ? ` — held by pid ${owner.pid} (${owner.command})` : \" — owner unknown\"\n }`,\n });\n continue;\n }\n\n unregisterPid(entry.pid);\n killed.push({ pid: entry.pid, configDir: entry.configDir });\n if (!wasAlive && reapedChildren.length > 0) {\n skipped.push({\n pid: entry.pid,\n reason: `process already exited; reaped orphaned children ${reapedChildren.join(\", \")}`,\n });\n }\n }\n\n return {\n status: \"killed\" as const,\n killed,\n skipped,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n killed: [],\n skipped: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n infraExport: builder.infraExport.handler(async ({ input, context }) => {\n const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n const configDir = input.configDir ?? deps.session?.root ?? process.cwd();\n const ci = deps.session?.runtime ? buildCiInfraPlan(deps.session.runtime) : null;\n if (!ci) {\n const refreshed = await openResolution({ cwd: configDir });\n if (!refreshed?.runtime) {\n throw new Error(\"No resolved runtime config available for infra export\");\n }\n return buildCiInfraPlan(refreshed.runtime);\n }\n const result: CiInfraPlan & { account: string; gateway: string } = {\n ...ci,\n account: deps.session?.config?.account ?? ci.account,\n gateway:\n ci.gateway ?? deps.session?.config?.domain ?? deps.session?.config?.account ?? ci.account,\n };\n return result;\n }),\n };\n}\n\nasync function deployedVersionStatus(deps: BosDeps): Promise<DeployedVersionStatus | undefined> {\n const config = deps.session?.config;\n if (!config?.account || !config.domain) return undefined;\n const { account, domain } = config;\n let publishedFingerprint: string | undefined;\n try {\n const published = await fetchBosConfigFromFastKv<Record<string, unknown>>(\n `bos://${account}/${domain}`,\n );\n publishedFingerprint = pointerFingerprint(published as never);\n } catch {\n return undefined;\n }\n\n const hostUrl = deps.session?.runtime?.host?.url;\n if (!hostUrl) {\n return computeDeployedVersionStatus({ publishedFingerprint, servedFingerprint: null });\n }\n try {\n const response = await fetch(new URL(\"/.well-known/version\", hostUrl));\n if (!response.ok) {\n return computeDeployedVersionStatus({\n publishedFingerprint,\n servedFingerprint: null,\n servedError: `version endpoint returned ${response.status}`,\n });\n }\n const body = (await response.json()) as { fingerprint?: string };\n return computeDeployedVersionStatus({\n publishedFingerprint,\n servedFingerprint: body.fingerprint ?? null,\n });\n } catch (error) {\n return computeDeployedVersionStatus({\n publishedFingerprint,\n servedFingerprint: null,\n servedError: error instanceof Error ? error.message : String(error),\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { fetchBosConfigFromFastKv } from "../fastkv.mjs";
|
|
2
|
+
import { MISSING_CONFIG_MESSAGE, findConfigPath } from "../config.mjs";
|
|
3
|
+
import { openResolution } from "../resolution/session.mjs";
|
|
4
|
+
import { pointerFingerprint } from "../fingerprint.mjs";
|
|
5
|
+
import { computeDeployedVersionStatus } from "../version-status.mjs";
|
|
6
|
+
import { BosDepsTag } from "./shared.mjs";
|
|
7
|
+
import { isPidAlive, pruneDeadEffect, readRegistry, unregisterPid } from "../process-registry.mjs";
|
|
8
|
+
import { probePortBindable } from "../app.mjs";
|
|
9
|
+
import { buildCiInfraPlan } from "../cli/infra.mjs";
|
|
10
|
+
import { ownerOfPort } from "../infra/port-ownership.mjs";
|
|
11
|
+
import { getStatus } from "../cli/status.mjs";
|
|
12
|
+
import { readDevLatestLog, resolveDevLatestFile } from "../dev-logs.mjs";
|
|
13
|
+
import { killProcessGroupEscalating, reapGroup } from "../process-kill.mjs";
|
|
14
|
+
import { dirname, resolve } from "node:path";
|
|
15
|
+
import { Context, Effect } from "effect";
|
|
16
|
+
import process from "node:process";
|
|
17
|
+
|
|
18
|
+
//#region src/commands/ops.ts
|
|
19
|
+
function registerOps(builder) {
|
|
20
|
+
return {
|
|
21
|
+
status: builder.status.handler(async ({ context }) => {
|
|
22
|
+
try {
|
|
23
|
+
const deps = Context.get(context["effect/context"], BosDepsTag);
|
|
24
|
+
const configPath = findConfigPath();
|
|
25
|
+
if (!configPath) return {
|
|
26
|
+
status: "error",
|
|
27
|
+
packages: [],
|
|
28
|
+
envFile: "missing",
|
|
29
|
+
error: `${MISSING_CONFIG_MESSAGE} in current directory`
|
|
30
|
+
};
|
|
31
|
+
const projectDir = resolve(dirname(configPath));
|
|
32
|
+
return {
|
|
33
|
+
...await getStatus(projectDir),
|
|
34
|
+
deployedVersion: await deployedVersionStatus(deps)
|
|
35
|
+
};
|
|
36
|
+
} catch (error) {
|
|
37
|
+
return {
|
|
38
|
+
status: "error",
|
|
39
|
+
packages: [],
|
|
40
|
+
envFile: "missing",
|
|
41
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}),
|
|
45
|
+
logs: builder.logs.handler(async ({ input, context }) => {
|
|
46
|
+
try {
|
|
47
|
+
const configDir = Context.get(context["effect/context"], BosDepsTag).session?.root ?? process.cwd();
|
|
48
|
+
const text = await readDevLatestLog(configDir, { tail: input.tail });
|
|
49
|
+
const service = input.service;
|
|
50
|
+
const lines = text.split("\n").filter((line) => line.length > 0).filter((line) => {
|
|
51
|
+
if (!service) return true;
|
|
52
|
+
const match = /\] \[([^\]]+)\] \[(?:OUT|ERR)\] /.exec(line);
|
|
53
|
+
return match?.[1] === service || match?.[1] === `plugin:${service}`;
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
logFile: resolveDevLatestFile(configDir),
|
|
57
|
+
lines
|
|
58
|
+
};
|
|
59
|
+
} catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
logFile: "unknown",
|
|
62
|
+
lines: [error instanceof Error ? `Failed to read logs: ${error.message}` : "Failed to read logs"]
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}),
|
|
66
|
+
ps: builder.ps.handler(async () => {
|
|
67
|
+
try {
|
|
68
|
+
return {
|
|
69
|
+
status: "ok",
|
|
70
|
+
entries: await Effect.runPromise(pruneDeadEffect(readRegistry()))
|
|
71
|
+
};
|
|
72
|
+
} catch (error) {
|
|
73
|
+
return {
|
|
74
|
+
status: "error",
|
|
75
|
+
entries: [],
|
|
76
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}),
|
|
80
|
+
kill: builder.kill.handler(async ({ input }) => {
|
|
81
|
+
try {
|
|
82
|
+
const configPath = findConfigPath();
|
|
83
|
+
const targetConfigDir = input.all ? void 0 : input.configDir ?? (configPath ? resolve(dirname(configPath)) : void 0);
|
|
84
|
+
const targets = targetConfigDir ? readRegistry().filter((entry) => entry.configDir === targetConfigDir) : readRegistry();
|
|
85
|
+
const killed = [];
|
|
86
|
+
const skipped = [];
|
|
87
|
+
for (const entry of targets) {
|
|
88
|
+
const wasAlive = isPidAlive(entry.pid);
|
|
89
|
+
if (wasAlive) await Effect.runPromise(killProcessGroupEscalating(entry.pid, {
|
|
90
|
+
terminateMs: 5e3,
|
|
91
|
+
signal: input.signal === "SIGKILL" ? "SIGKILL" : "SIGTERM"
|
|
92
|
+
}));
|
|
93
|
+
const reapedChildren = [];
|
|
94
|
+
for (const childPid of entry.childPids ?? []) if (isPidAlive(childPid)) {
|
|
95
|
+
reapGroup(childPid);
|
|
96
|
+
reapedChildren.push(childPid);
|
|
97
|
+
}
|
|
98
|
+
const ports = Object.values(entry.ports ?? {}).filter((port) => Number.isFinite(port) && port > 0);
|
|
99
|
+
const stillBound = [];
|
|
100
|
+
for (const port of ports) {
|
|
101
|
+
let bindable = false;
|
|
102
|
+
for (let attempt = 0; attempt < 4; attempt++) {
|
|
103
|
+
bindable = await Effect.runPromise(probePortBindable(port));
|
|
104
|
+
if (bindable) break;
|
|
105
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
106
|
+
}
|
|
107
|
+
if (!bindable) stillBound.push(port);
|
|
108
|
+
}
|
|
109
|
+
if (stillBound.length > 0) {
|
|
110
|
+
const owner = await Effect.runPromise(ownerOfPort(stillBound[0]));
|
|
111
|
+
skipped.push({
|
|
112
|
+
pid: entry.pid,
|
|
113
|
+
reason: `ports still bound after kill: ${stillBound.join(", ")}${owner ? ` — held by pid ${owner.pid} (${owner.command})` : " — owner unknown"}`
|
|
114
|
+
});
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
unregisterPid(entry.pid);
|
|
118
|
+
killed.push({
|
|
119
|
+
pid: entry.pid,
|
|
120
|
+
configDir: entry.configDir
|
|
121
|
+
});
|
|
122
|
+
if (!wasAlive && reapedChildren.length > 0) skipped.push({
|
|
123
|
+
pid: entry.pid,
|
|
124
|
+
reason: `process already exited; reaped orphaned children ${reapedChildren.join(", ")}`
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
status: "killed",
|
|
129
|
+
killed,
|
|
130
|
+
skipped
|
|
131
|
+
};
|
|
132
|
+
} catch (error) {
|
|
133
|
+
return {
|
|
134
|
+
status: "error",
|
|
135
|
+
killed: [],
|
|
136
|
+
skipped: [],
|
|
137
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}),
|
|
141
|
+
infraExport: builder.infraExport.handler(async ({ input, context }) => {
|
|
142
|
+
const deps = Context.get(context["effect/context"], BosDepsTag);
|
|
143
|
+
const configDir = input.configDir ?? deps.session?.root ?? process.cwd();
|
|
144
|
+
const ci = deps.session?.runtime ? buildCiInfraPlan(deps.session.runtime) : null;
|
|
145
|
+
if (!ci) {
|
|
146
|
+
const refreshed = await openResolution({ cwd: configDir });
|
|
147
|
+
if (!refreshed?.runtime) throw new Error("No resolved runtime config available for infra export");
|
|
148
|
+
return buildCiInfraPlan(refreshed.runtime);
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
...ci,
|
|
152
|
+
account: deps.session?.config?.account ?? ci.account,
|
|
153
|
+
gateway: ci.gateway ?? deps.session?.config?.domain ?? deps.session?.config?.account ?? ci.account
|
|
154
|
+
};
|
|
155
|
+
})
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async function deployedVersionStatus(deps) {
|
|
159
|
+
const config = deps.session?.config;
|
|
160
|
+
if (!config?.account || !config.domain) return void 0;
|
|
161
|
+
const { account, domain } = config;
|
|
162
|
+
let publishedFingerprint;
|
|
163
|
+
try {
|
|
164
|
+
const published = await fetchBosConfigFromFastKv(`bos://${account}/${domain}`);
|
|
165
|
+
publishedFingerprint = pointerFingerprint(published);
|
|
166
|
+
} catch {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const hostUrl = deps.session?.runtime?.host?.url;
|
|
170
|
+
if (!hostUrl) return computeDeployedVersionStatus({
|
|
171
|
+
publishedFingerprint,
|
|
172
|
+
servedFingerprint: null
|
|
173
|
+
});
|
|
174
|
+
try {
|
|
175
|
+
const response = await fetch(new URL("/.well-known/version", hostUrl));
|
|
176
|
+
if (!response.ok) return computeDeployedVersionStatus({
|
|
177
|
+
publishedFingerprint,
|
|
178
|
+
servedFingerprint: null,
|
|
179
|
+
servedError: `version endpoint returned ${response.status}`
|
|
180
|
+
});
|
|
181
|
+
const body = await response.json();
|
|
182
|
+
return computeDeployedVersionStatus({
|
|
183
|
+
publishedFingerprint,
|
|
184
|
+
servedFingerprint: body.fingerprint ?? null
|
|
185
|
+
});
|
|
186
|
+
} catch (error) {
|
|
187
|
+
return computeDeployedVersionStatus({
|
|
188
|
+
publishedFingerprint,
|
|
189
|
+
servedFingerprint: null,
|
|
190
|
+
servedError: error instanceof Error ? error.message : String(error)
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
//#endregion
|
|
196
|
+
export { registerOps };
|
|
197
|
+
//# sourceMappingURL=ops.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops.mjs","names":[],"sources":["../../src/commands/ops.ts"],"sourcesContent":["import { dirname, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { Context, Effect } from \"effect\";\nimport { probePortBindable } from \"../app\";\nimport { buildCiInfraPlan, type CiInfraPlan } from \"../cli/infra\";\nimport { getStatus } from \"../cli/status\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE } from \"../config\";\nimport { readDevLatestLog, resolveDevLatestFile } from \"../dev-logs\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport { pointerFingerprint } from \"../fingerprint\";\nimport { ownerOfPort } from \"../infra/port-ownership\";\nimport { killProcessGroupEscalating, reapGroup } from \"../process-kill\";\nimport { isPidAlive, pruneDeadEffect, readRegistry, unregisterPid } from \"../process-registry\";\nimport { openResolution } from \"../resolution/session\";\nimport { computeDeployedVersionStatus, type DeployedVersionStatus } from \"../version-status\";\nimport { type BosBuilder, type BosDeps, BosDepsTag } from \"./shared\";\n\nexport function registerOps(builder: BosBuilder) {\n return {\n status: builder.status.handler(async ({ context }) => {\n try {\n const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n envFile: \"missing\" as const,\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const status = await getStatus(projectDir);\n return {\n ...status,\n deployedVersion: await deployedVersionStatus(deps),\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n envFile: \"missing\" as const,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n logs: builder.logs.handler(async ({ input, context }) => {\n try {\n const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n const configDir = deps.session?.root ?? process.cwd();\n const text = await readDevLatestLog(configDir, { tail: input.tail });\n const service = input.service;\n const lines = text\n .split(\"\\n\")\n .filter((line) => line.length > 0)\n .filter((line) => {\n if (!service) return true;\n const match = /\\] \\[([^\\]]+)\\] \\[(?:OUT|ERR)\\] /.exec(line);\n return match?.[1] === service || match?.[1] === `plugin:${service}`;\n });\n return {\n logFile: resolveDevLatestFile(configDir),\n lines,\n };\n } catch (error) {\n return {\n logFile: \"unknown\",\n lines: [\n error instanceof Error\n ? `Failed to read logs: ${error.message}`\n : \"Failed to read logs\",\n ],\n };\n }\n }),\n\n ps: builder.ps.handler(async () => {\n try {\n const entries = await Effect.runPromise(pruneDeadEffect(readRegistry()));\n return {\n status: \"ok\" as const,\n entries,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n entries: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n kill: builder.kill.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n const targetConfigDir = input.all\n ? undefined\n : (input.configDir ?? (configPath ? resolve(dirname(configPath)) : undefined));\n\n const targets = targetConfigDir\n ? readRegistry().filter((entry) => entry.configDir === targetConfigDir)\n : readRegistry();\n\n const killed: Array<{ pid: number; configDir: string }> = [];\n const skipped: Array<{ pid: number; reason: string }> = [];\n\n for (const entry of targets) {\n const wasAlive = isPidAlive(entry.pid);\n if (wasAlive) {\n await Effect.runPromise(\n killProcessGroupEscalating(entry.pid, {\n terminateMs: 5000,\n signal: input.signal === \"SIGKILL\" ? \"SIGKILL\" : \"SIGTERM\",\n }),\n );\n }\n\n const reapedChildren: number[] = [];\n for (const childPid of entry.childPids ?? []) {\n if (isPidAlive(childPid)) {\n reapGroup(childPid);\n reapedChildren.push(childPid);\n }\n }\n\n const ports = Object.values(entry.ports ?? {}).filter(\n (port) => Number.isFinite(port) && port > 0,\n );\n const stillBound: number[] = [];\n for (const port of ports) {\n let bindable = false;\n for (let attempt = 0; attempt < 4; attempt++) {\n bindable = await Effect.runPromise(probePortBindable(port));\n if (bindable) break;\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n if (!bindable) stillBound.push(port);\n }\n\n if (stillBound.length > 0) {\n const owner = await Effect.runPromise(ownerOfPort(stillBound[0]));\n skipped.push({\n pid: entry.pid,\n reason: `ports still bound after kill: ${stillBound.join(\", \")}${\n owner ? ` — held by pid ${owner.pid} (${owner.command})` : \" — owner unknown\"\n }`,\n });\n continue;\n }\n\n unregisterPid(entry.pid);\n killed.push({ pid: entry.pid, configDir: entry.configDir });\n if (!wasAlive && reapedChildren.length > 0) {\n skipped.push({\n pid: entry.pid,\n reason: `process already exited; reaped orphaned children ${reapedChildren.join(\", \")}`,\n });\n }\n }\n\n return {\n status: \"killed\" as const,\n killed,\n skipped,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n killed: [],\n skipped: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n infraExport: builder.infraExport.handler(async ({ input, context }) => {\n const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n const configDir = input.configDir ?? deps.session?.root ?? process.cwd();\n const ci = deps.session?.runtime ? buildCiInfraPlan(deps.session.runtime) : null;\n if (!ci) {\n const refreshed = await openResolution({ cwd: configDir });\n if (!refreshed?.runtime) {\n throw new Error(\"No resolved runtime config available for infra export\");\n }\n return buildCiInfraPlan(refreshed.runtime);\n }\n const result: CiInfraPlan & { account: string; gateway: string } = {\n ...ci,\n account: deps.session?.config?.account ?? ci.account,\n gateway:\n ci.gateway ?? deps.session?.config?.domain ?? deps.session?.config?.account ?? ci.account,\n };\n return result;\n }),\n };\n}\n\nasync function deployedVersionStatus(deps: BosDeps): Promise<DeployedVersionStatus | undefined> {\n const config = deps.session?.config;\n if (!config?.account || !config.domain) return undefined;\n const { account, domain } = config;\n let publishedFingerprint: string | undefined;\n try {\n const published = await fetchBosConfigFromFastKv<Record<string, unknown>>(\n `bos://${account}/${domain}`,\n );\n publishedFingerprint = pointerFingerprint(published as never);\n } catch {\n return undefined;\n }\n\n const hostUrl = deps.session?.runtime?.host?.url;\n if (!hostUrl) {\n return computeDeployedVersionStatus({ publishedFingerprint, servedFingerprint: null });\n }\n try {\n const response = await fetch(new URL(\"/.well-known/version\", hostUrl));\n if (!response.ok) {\n return computeDeployedVersionStatus({\n publishedFingerprint,\n servedFingerprint: null,\n servedError: `version endpoint returned ${response.status}`,\n });\n }\n const body = (await response.json()) as { fingerprint?: string };\n return computeDeployedVersionStatus({\n publishedFingerprint,\n servedFingerprint: body.fingerprint ?? null,\n });\n } catch (error) {\n return computeDeployedVersionStatus({\n publishedFingerprint,\n servedFingerprint: null,\n servedError: error instanceof Error ? error.message : String(error),\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
const require_fastkv = require('../fastkv.cjs');
|
|
2
|
+
const require_config = require('../config.cjs');
|
|
3
|
+
const require_save_config = require('../utils/save-config.cjs');
|
|
4
|
+
const require_resolution_session = require('../resolution/session.cjs');
|
|
5
|
+
const require_build = require('../build.cjs');
|
|
6
|
+
const require_code_artifacts = require('../code-artifacts.cjs');
|
|
7
|
+
const require_shared = require('./shared.cjs');
|
|
8
|
+
const require_publish = require('../publish.cjs');
|
|
9
|
+
let node_fs = require("node:fs");
|
|
10
|
+
let node_path = require("node:path");
|
|
11
|
+
let effect = require("effect");
|
|
12
|
+
|
|
13
|
+
//#region src/commands/plugins.ts
|
|
14
|
+
function registerPlugins(builder) {
|
|
15
|
+
return {
|
|
16
|
+
pluginAdd: builder.pluginAdd.handler(async ({ input, context }) => {
|
|
17
|
+
const session = effect.Context.get(context["effect/context"], require_shared.BosDepsTag).session;
|
|
18
|
+
if (!session?.config) return {
|
|
19
|
+
status: "error",
|
|
20
|
+
key: "",
|
|
21
|
+
error: require_config.MISSING_CONFIG_MESSAGE
|
|
22
|
+
};
|
|
23
|
+
const isBosRef = input.source.startsWith("bos://");
|
|
24
|
+
const isLocal = input.source.startsWith("local:");
|
|
25
|
+
const key = sanitizePluginKey(input.as ?? (isBosRef ? input.source.split("/").pop() ?? "plugin" : defaultPluginKey(input.source)));
|
|
26
|
+
const existing = session.config.plugins?.[key];
|
|
27
|
+
const existingEntry = existing && typeof existing === "object" ? existing : {};
|
|
28
|
+
const applyEntryDelta = (base) => {
|
|
29
|
+
if (isBosRef) {
|
|
30
|
+
const { development: _dropped, ...rest } = base;
|
|
31
|
+
return {
|
|
32
|
+
...rest,
|
|
33
|
+
extends: input.source
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (isLocal) {
|
|
37
|
+
const { extends: _dropped, ...rest } = base;
|
|
38
|
+
return {
|
|
39
|
+
...rest,
|
|
40
|
+
development: input.source
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const { development: _dropped, ...rest } = base;
|
|
44
|
+
return {
|
|
45
|
+
...rest,
|
|
46
|
+
production: input.production ?? input.source
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
const nextPlugins = { ...session.config.plugins };
|
|
50
|
+
nextPlugins[key] = applyEntryDelta(existingEntry);
|
|
51
|
+
const nextConfig = {
|
|
52
|
+
...session.config,
|
|
53
|
+
plugins: nextPlugins
|
|
54
|
+
};
|
|
55
|
+
const authored = session.rawConfig;
|
|
56
|
+
if (authored) {
|
|
57
|
+
const authoredExisting = authored.plugins?.[key];
|
|
58
|
+
const authoredBase = typeof authoredExisting === "string" ? { extends: authoredExisting } : authoredExisting && typeof authoredExisting === "object" ? authoredExisting : {};
|
|
59
|
+
await require_save_config.saveBosConfig(session.root, {
|
|
60
|
+
...authored,
|
|
61
|
+
plugins: {
|
|
62
|
+
...authored.plugins ?? {},
|
|
63
|
+
[key]: applyEntryDelta(authoredBase)
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
} else await require_save_config.saveBosConfig(session.root, nextConfig);
|
|
67
|
+
await require_code_artifacts.generateCodeArtifacts(session.root, nextConfig);
|
|
68
|
+
const stored = nextConfig.plugins?.[key];
|
|
69
|
+
const storedObj = stored && typeof stored === "object" ? stored : {};
|
|
70
|
+
return {
|
|
71
|
+
status: "added",
|
|
72
|
+
key,
|
|
73
|
+
development: storedObj.development,
|
|
74
|
+
production: storedObj.production,
|
|
75
|
+
integrity: storedObj.integrity,
|
|
76
|
+
version: storedObj.version
|
|
77
|
+
};
|
|
78
|
+
}),
|
|
79
|
+
pluginRemove: builder.pluginRemove.handler(async ({ input, context }) => {
|
|
80
|
+
const session = effect.Context.get(context["effect/context"], require_shared.BosDepsTag).session;
|
|
81
|
+
if (!session?.config) return {
|
|
82
|
+
status: "error",
|
|
83
|
+
key: input.key,
|
|
84
|
+
error: require_config.MISSING_CONFIG_MESSAGE
|
|
85
|
+
};
|
|
86
|
+
if (!session.config.plugins?.[input.key]) return {
|
|
87
|
+
status: "error",
|
|
88
|
+
key: input.key,
|
|
89
|
+
error: `Plugin '${input.key}' is not configured`
|
|
90
|
+
};
|
|
91
|
+
const nextPlugins = { ...session.config.plugins };
|
|
92
|
+
delete nextPlugins[input.key];
|
|
93
|
+
const nextConfig = {
|
|
94
|
+
...session.config,
|
|
95
|
+
plugins: Object.keys(nextPlugins).length > 0 ? nextPlugins : void 0
|
|
96
|
+
};
|
|
97
|
+
const authored = session.rawConfig;
|
|
98
|
+
if (authored) {
|
|
99
|
+
const authoredPlugins = { ...authored.plugins ?? {} };
|
|
100
|
+
if (authoredPlugins[input.key] === void 0) {
|
|
101
|
+
if ((0, node_fs.existsSync)((0, node_path.join)(session.root, "bos.app.ts"))) return {
|
|
102
|
+
status: "error",
|
|
103
|
+
key: input.key,
|
|
104
|
+
error: `'${input.key}' is inherited from the parent runtime — remove it in the parent config or override it there (the authored descriptor cannot express removal)`
|
|
105
|
+
};
|
|
106
|
+
authoredPlugins[input.key] = null;
|
|
107
|
+
} else delete authoredPlugins[input.key];
|
|
108
|
+
await require_save_config.saveBosConfig(session.root, {
|
|
109
|
+
...authored,
|
|
110
|
+
plugins: Object.keys(authoredPlugins).length > 0 ? authoredPlugins : void 0
|
|
111
|
+
});
|
|
112
|
+
} else await require_save_config.saveBosConfig(session.root, nextConfig);
|
|
113
|
+
await require_code_artifacts.generateCodeArtifacts(session.root, nextConfig);
|
|
114
|
+
return {
|
|
115
|
+
status: "removed",
|
|
116
|
+
key: input.key
|
|
117
|
+
};
|
|
118
|
+
}),
|
|
119
|
+
pluginList: builder.pluginList.handler(async ({ context }) => {
|
|
120
|
+
return {
|
|
121
|
+
status: "listed",
|
|
122
|
+
plugins: listPluginAttachments(effect.Context.get(context["effect/context"], require_shared.BosDepsTag).session?.config ?? null)
|
|
123
|
+
};
|
|
124
|
+
}),
|
|
125
|
+
pluginPublish: builder.pluginPublish.handler(async ({ input, context }) => {
|
|
126
|
+
const session = effect.Context.get(context["effect/context"], require_shared.BosDepsTag).session;
|
|
127
|
+
if (!session?.config) return {
|
|
128
|
+
status: "error",
|
|
129
|
+
key: input.key,
|
|
130
|
+
error: require_config.MISSING_CONFIG_MESSAGE
|
|
131
|
+
};
|
|
132
|
+
const attachment = session.config?.plugins?.[input.key];
|
|
133
|
+
if (!attachment) return {
|
|
134
|
+
status: "error",
|
|
135
|
+
key: input.key,
|
|
136
|
+
error: `Plugin '${input.key}' is not configured`
|
|
137
|
+
};
|
|
138
|
+
const localPath = pluginLocalPath(session.root, attachment);
|
|
139
|
+
if (!localPath) return {
|
|
140
|
+
status: "error",
|
|
141
|
+
key: input.key,
|
|
142
|
+
error: `Plugin '${input.key}' does not have a local development path`
|
|
143
|
+
};
|
|
144
|
+
const result = await require_publish.publishToFastKv({
|
|
145
|
+
bosConfig: session.config,
|
|
146
|
+
runtimeConfig: session.runtime,
|
|
147
|
+
configDir: session.root,
|
|
148
|
+
env: "production",
|
|
149
|
+
build: true,
|
|
150
|
+
dryRun: false,
|
|
151
|
+
verbose: false,
|
|
152
|
+
packages: input.key
|
|
153
|
+
});
|
|
154
|
+
if (result.status === "error") return {
|
|
155
|
+
status: "error",
|
|
156
|
+
key: input.key,
|
|
157
|
+
error: result.error
|
|
158
|
+
};
|
|
159
|
+
const nextSession = await require_resolution_session.openResolution({ cwd: session.root }) ?? session;
|
|
160
|
+
const production = (nextSession.config?.plugins?.[input.key])?.production;
|
|
161
|
+
const manifest = production ? await require_fastkv.fetchRemotePluginManifest(production) : null;
|
|
162
|
+
if (production && nextSession.config) await require_code_artifacts.generateCodeArtifacts(session.root, nextSession.config);
|
|
163
|
+
return {
|
|
164
|
+
status: "published",
|
|
165
|
+
key: input.key,
|
|
166
|
+
path: localPath,
|
|
167
|
+
production,
|
|
168
|
+
fingerprint: result.fingerprint,
|
|
169
|
+
version: manifest?.plugin.version
|
|
170
|
+
};
|
|
171
|
+
})
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function sanitizePluginKey(value) {
|
|
175
|
+
return value.replace(/[^A-Za-z0-9/_-]/g, "-").replace(/\/+/g, "/").split("/").filter(Boolean).map((segment) => segment.replace(/[^A-Za-z0-9_-]/g, "-")).join("/").replace(/^\/+|\/+$/g, "");
|
|
176
|
+
}
|
|
177
|
+
function defaultPluginKey(source) {
|
|
178
|
+
const normalized = source.replace(/^local:/, "").replace(/\/$/, "");
|
|
179
|
+
if (source.startsWith("local:")) return sanitizePluginKey((0, node_path.basename)(normalized)) || "plugin";
|
|
180
|
+
try {
|
|
181
|
+
const url = new URL(source);
|
|
182
|
+
return sanitizePluginKey((0, node_path.basename)(url.pathname) || url.hostname) || "plugin";
|
|
183
|
+
} catch {
|
|
184
|
+
return sanitizePluginKey(source) || "plugin";
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function pluginLocalPath(configDir, attachment) {
|
|
188
|
+
const ref = require_build.getPluginRef(attachment);
|
|
189
|
+
const source = ref?.development ?? ref?.production;
|
|
190
|
+
if (!source?.startsWith("local:")) return null;
|
|
191
|
+
return (0, node_path.join)(configDir, source.slice(6));
|
|
192
|
+
}
|
|
193
|
+
function listPluginAttachments(config) {
|
|
194
|
+
return Object.entries(config?.plugins ?? {}).map(([key, attachment]) => {
|
|
195
|
+
const ref = require_build.getPluginRef(attachment);
|
|
196
|
+
return {
|
|
197
|
+
key,
|
|
198
|
+
development: ref?.development,
|
|
199
|
+
production: ref?.production,
|
|
200
|
+
localPath: ref?.development?.startsWith("local:") ? ref.development.slice(6) : void 0,
|
|
201
|
+
source: ref?.development?.startsWith("local:") ? "local" : "remote",
|
|
202
|
+
integrity: ref?.integrity,
|
|
203
|
+
version: ref?.version,
|
|
204
|
+
name: ref?.name
|
|
205
|
+
};
|
|
206
|
+
}).sort((a, b) => a.key.localeCompare(b.key));
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
//#endregion
|
|
210
|
+
exports.registerPlugins = registerPlugins;
|
|
211
|
+
//# sourceMappingURL=plugins.cjs.map
|