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
package/dist/plugin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { Effect } from \"effect\";\nimport { buildRuntimeConfig, detectLocalPackages, PortAllocatorLive } from \"./app\";\nimport {\n buildEveryPluginQuietly,\n buildEverythingDevQuietly,\n buildWorkspaceTargets,\n fileExists,\n getPluginRef,\n readJsonFile,\n selectWorkspaceTargets,\n} from \"./build\";\nimport {\n ensureEnvFile,\n loadProjectEnv,\n syncGeneratedInfra,\n writeGeneratedInfra,\n} from \"./cli/infra\";\nimport {\n buildInitPatterns,\n buildPluginRouteExclusions,\n copyFilteredFiles,\n detectGitRemoteUrl,\n fetchParentConfig,\n generateDatabaseMigrations,\n personalizeAgentsMd,\n personalizeConfig,\n removeInitLockfile,\n resolveSourceDir,\n runBunInstall,\n runTypesGen,\n scaffoldMinimalProject,\n stripOrphanedWorkspacesFromLockfile,\n writeInitSnapshot,\n} from \"./cli/init\";\nimport { getStatus } from \"./cli/status\";\nimport { syncTemplate } from \"./cli/sync\";\nimport { upgradeTemplate } from \"./cli/upgrade\";\nimport { generateCodeArtifacts } from \"./code-artifacts\";\nimport {\n buildRuntimePluginsForConfig,\n drainConfigWarnings,\n findConfigPath,\n getHostDevelopmentPort,\n getProjectRoot,\n loadLocalConfig,\n loadResolvedConfig,\n resolveConfigComposableEntries,\n resumeWarnings,\n suppressWarnings,\n} from \"./config\";\nimport {\n type BosConfigResult,\n bosContract,\n type OverrideSection,\n type PhaseTiming,\n type PluginListResult,\n} from \"./contract\";\nimport {\n buildRegistryConfigUrl,\n fetchBosConfigFromFastKv,\n fetchRemotePluginManifest,\n getRegistryNamespaceForAccount,\n type PluginManifest,\n parseBosUrl,\n} from \"./fastkv\";\nimport { planInfra } from \"./infra/planner\";\nimport { preflightLocalInfra } from \"./infra/preflight\";\nimport type { InfraPlan } from \"./infra/types\";\nimport { computeSriHashForUrl, parseDeployLines } from \"./integrity\";\nimport { type BosEnv, mergeBosConfigWithExtends, resolveExtendsRef } from \"./merge\";\nimport {\n addFunctionCallAccessKey,\n deleteAccessKeys,\n ensureNearCli,\n listPublishKeys,\n} from \"./near-cli\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport { pruneDeadEffect, readRegistry, unregisterPid } from \"./process-registry\";\nimport { extractPublishedUrl, publishToFastKv } from \"./publish\";\nimport { createPlugin, z } from \"./sdk\";\nimport {\n type AppOrchestrator,\n buildDescription,\n buildServiceDescriptorMap,\n buildServiceDescriptorMapFromPlan,\n type ServiceDescriptor,\n} from \"./service-descriptor\";\nimport { syncResolvedSharedDeps } from \"./shared-deps\";\nimport type { BosConfig, BosConfigInput, ExtendsConfig, RuntimeConfig, SourceMode } from \"./types\";\nimport { BosConfigSchema } from \"./types\";\nimport { run } from \"./utils/run\";\nimport { saveBosConfig } from \"./utils/save-config\";\nimport { colors } from \"./utils/theme\";\n\nexport interface DevSessionData {\n orchestrator: AppOrchestrator;\n services: Map<string, ServiceDescriptor>;\n runtimeConfig: RuntimeConfig;\n}\n\nexport interface StartSummary {\n configSource: string;\n configSourceHttp?: string;\n account: string;\n domain?: string;\n modules: { host?: string; ui?: string; api?: string; auth?: string };\n warnings: string[];\n}\n\nexport type ProgressEvent = {\n phase: string;\n status: \"running\" | \"done\" | \"error\";\n durationMs?: number;\n message?: string;\n};\n\nexport const pluginEvents = new EventEmitter();\n\nlet pendingSession: DevSessionData | null = null;\nlet pendingStartSummary: StartSummary | null = null;\n\nexport function consumeDevSession(): (DevSessionData & { summary?: StartSummary }) | null {\n const data = pendingSession;\n const summary = pendingStartSummary;\n pendingSession = null;\n pendingStartSummary = null;\n if (!data) return null;\n return summary ? { ...data, summary } : data;\n}\n\nasync function timePhase<T>(\n timings: PhaseTiming[],\n name: string,\n fn: () => Promise<T>,\n): Promise<T> {\n pluginEvents.emit(\"progress\", { phase: name, status: \"running\" } satisfies ProgressEvent);\n const startedAt = Date.now();\n try {\n const result = await fn();\n timings.push({ name, durationMs: Date.now() - startedAt });\n pluginEvents.emit(\"progress\", {\n phase: name,\n status: \"done\",\n durationMs: Date.now() - startedAt,\n } satisfies ProgressEvent);\n return result;\n } catch (error) {\n pluginEvents.emit(\"progress\", {\n phase: name,\n status: \"error\",\n durationMs: Date.now() - startedAt,\n } satisfies ProgressEvent);\n throw error;\n }\n}\n\nconst PUBLISH_FUNCTION_NAMES = [\"__fastdata_kv\"];\n\ntype BosDeps = {\n bosConfig: BosConfig | null;\n runtimeConfig: RuntimeConfig | null;\n configDir: string;\n};\n\ntype PluginAttachmentConfig = NonNullable<BosConfig[\"plugins\"]>[string];\n\nfunction parseSourceMode(value: string | undefined, defaultValue: SourceMode): SourceMode {\n if (value === \"local\" || value === \"remote\") return value;\n return defaultValue;\n}\n\nfunction buildConfigResult(\n bosConfig: BosConfigInput | BosConfig | null,\n full = false,\n): BosConfigResult {\n const packages =\n bosConfig?.app && typeof bosConfig.app === \"object\" ? Object.keys(bosConfig.app) : [];\n const remotes = packages.filter((name) => name !== \"host\");\n\n return {\n config: bosConfig ?? null,\n packages,\n remotes,\n full,\n };\n}\n\nfunction isValidProxyUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction resolveProxyUrl(bosConfig: BosConfig | null): string | null {\n if (!bosConfig) return null;\n const apiConfig = bosConfig.app.api;\n if (!apiConfig) return null;\n if (apiConfig.proxy && isValidProxyUrl(apiConfig.proxy)) return apiConfig.proxy;\n if (apiConfig.production && isValidProxyUrl(apiConfig.production)) return apiConfig.production;\n return null;\n}\n\nfunction sanitizePluginKey(value: string): string {\n return value\n .replace(/[^A-Za-z0-9/_-]/g, \"-\")\n .replace(/\\/+/g, \"/\")\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => segment.replace(/[^A-Za-z0-9_-]/g, \"-\"))\n .join(\"/\")\n .replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction defaultPluginKey(source: string): string {\n const normalized = source.replace(/^local:/, \"\").replace(/\\/$/, \"\");\n if (source.startsWith(\"local:\")) {\n return sanitizePluginKey(basename(normalized)) || \"plugin\";\n }\n\n try {\n const url = new URL(source);\n return sanitizePluginKey(basename(url.pathname) || url.hostname) || \"plugin\";\n } catch {\n return sanitizePluginKey(source) || \"plugin\";\n }\n}\n\nfunction pluginLocalPath(configDir: string, attachment: PluginAttachmentConfig): string | null {\n const ref = getPluginRef(attachment);\n const source = ref?.development ?? ref?.production;\n if (!source?.startsWith(\"local:\")) {\n return null;\n }\n\n return join(configDir, source.slice(\"local:\".length));\n}\n\nfunction listPluginAttachments(config: BosConfig | null) {\n return (Object.entries(config?.plugins ?? {}) as Array<[string, PluginAttachmentConfig]>)\n .map(([key, attachment]) => {\n const ref = getPluginRef(attachment);\n return {\n key,\n development: ref?.development,\n production: ref?.production,\n localPath: ref?.development?.startsWith(\"local:\")\n ? ref.development.slice(\"local:\".length)\n : undefined,\n source: ref?.development?.startsWith(\"local:\") ? (\"local\" as const) : (\"remote\" as const),\n integrity: ref?.integrity,\n version: ref?.version,\n name: ref?.name,\n };\n })\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nexport async function resolveRemoteConfigChain(\n accountId: string,\n gatewayId: string,\n visited: Set<string>,\n): Promise<BosConfig> {\n const selfRef = `bos://${accountId}/${gatewayId}`;\n if (visited.has(selfRef)) {\n throw new Error(`Circular extends detected: ${selfRef}`);\n }\n\n const nextVisited = new Set(visited);\n nextVisited.add(selfRef);\n\n const config = await fetchBosConfigFromFastKv<BosConfigInput>(selfRef);\n const parentRef = config.extends\n ? resolveExtendsRef(config.extends as string | ExtendsConfig, \"production\")\n : undefined;\n\n let merged: BosConfigInput;\n if (!parentRef) {\n merged = config;\n } else {\n const { accountId: parentAccountId, gatewayId: parentGatewayId } = parseBosUrl(parentRef);\n const parentResolved = await resolveRemoteConfigChain(\n parentAccountId,\n parentGatewayId,\n nextVisited,\n );\n merged = mergeBosConfigWithExtends(parentResolved as BosConfigInput, config);\n }\n\n return resolveConfigComposableEntries(BosConfigSchema.parse(merged), process.cwd(), \"production\");\n}\n\nasync function fetchPublishedConfig(\n accountId: string,\n gatewayId: string,\n): Promise<BosConfig | null> {\n try {\n return await resolveRemoteConfigChain(accountId, gatewayId, new Set());\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"No config found\")) {\n return null;\n }\n throw error;\n }\n}\n\nexport default createPlugin({\n variables: z.object({\n configPath: z.string().optional(),\n }),\n secrets: z.object({}),\n contract: bosContract,\n initialize: (config) =>\n Effect.promise(async () => {\n const configResult = await loadResolvedConfig({ path: config.variables.configPath });\n return {\n bosConfig: configResult?.config ?? null,\n runtimeConfig: configResult?.runtime ?? null,\n configDir: getProjectRoot(),\n } satisfies BosDeps;\n }),\n shutdown: () => Effect.void,\n createRouter: (deps, builder) => ({\n config: builder.config.handler(async ({ input }) => {\n if (input.full) {\n return buildConfigResult(deps.bosConfig, true);\n }\n\n const localConfig = await loadLocalConfig({ cwd: deps.configDir });\n return buildConfigResult(localConfig?.config ?? null, false);\n }),\n\n pluginAdd: builder.pluginAdd.handler(async ({ input }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n key: \"\",\n error: \"No bos.config.json found\",\n };\n }\n\n const isBosRef = input.source.startsWith(\"bos://\");\n const isLocal = input.source.startsWith(\"local:\");\n const key = sanitizePluginKey(\n input.as ??\n (isBosRef ? (input.source.split(\"/\").pop() ?? \"plugin\") : defaultPluginKey(input.source)),\n );\n const existing = deps.bosConfig.plugins?.[key];\n const existingEntry = existing && typeof existing === \"object\" ? existing : {};\n const nextPlugins = { ...(deps.bosConfig.plugins ?? {}) };\n\n if (isBosRef) {\n nextPlugins[key] = {\n ...existingEntry,\n extends: input.source,\n };\n } else if (isLocal) {\n nextPlugins[key] = {\n ...existingEntry,\n development: input.source,\n ...(existingEntry.extends ? {} : {}),\n };\n } else {\n nextPlugins[key] = {\n ...existingEntry,\n production: input.production ?? input.source,\n };\n }\n\n deps.bosConfig = {\n ...deps.bosConfig,\n plugins: nextPlugins,\n };\n\n await saveBosConfig(deps.configDir, deps.bosConfig);\n await generateCodeArtifacts(deps.configDir, deps.bosConfig);\n\n const stored = deps.bosConfig.plugins?.[key];\n const storedObj = stored && typeof stored === \"object\" ? stored : {};\n\n return {\n status: \"added\" as const,\n key,\n development: storedObj.development,\n production: storedObj.production,\n integrity: storedObj.integrity,\n version: storedObj.version,\n };\n }),\n\n pluginRemove: builder.pluginRemove.handler(async ({ input }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: \"No bos.config.json found\",\n };\n }\n\n if (!deps.bosConfig.plugins?.[input.key]) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Plugin '${input.key}' is not configured`,\n };\n }\n\n const nextPlugins = { ...(deps.bosConfig.plugins ?? {}) };\n delete nextPlugins[input.key];\n deps.bosConfig = {\n ...deps.bosConfig,\n plugins: Object.keys(nextPlugins).length > 0 ? nextPlugins : undefined,\n };\n\n await saveBosConfig(deps.configDir, deps.bosConfig);\n await generateCodeArtifacts(deps.configDir, deps.bosConfig);\n\n return {\n status: \"removed\" as const,\n key: input.key,\n };\n }),\n\n pluginList: builder.pluginList.handler(async () => {\n const plugins: PluginListResult[\"plugins\"] = listPluginAttachments(deps.bosConfig);\n return {\n status: \"listed\" as const,\n plugins,\n };\n }),\n\n pluginPublish: builder.pluginPublish.handler(async ({ input }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: \"No bos.config.json found\",\n };\n }\n\n const attachment = deps.bosConfig.plugins?.[input.key];\n if (!attachment) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Plugin '${input.key}' is not configured`,\n };\n }\n\n const attachmentRef = getPluginRef(attachment);\n\n const localPath = pluginLocalPath(deps.configDir, attachment);\n if (!localPath) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Plugin '${input.key}' does not have a local development path`,\n };\n }\n\n const pkgPath = join(localPath, \"package.json\");\n if (!(await fileExists(pkgPath))) {\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Missing package.json at ${localPath}`,\n };\n }\n\n const pkgJson = await readJsonFile<{\n scripts?: Record<string, string>;\n name?: string;\n version?: string;\n }>(pkgPath);\n const script = pkgJson.scripts?.deploy ? \"deploy\" : \"build\";\n\n const { stdout, stderr, exitCode } = (await run(\"bun\", [\"run\", script], {\n cwd: localPath,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (exitCode !== 0) {\n if (stdout.trim()) process.stdout.write(stdout);\n if (stderr.trim()) process.stderr.write(stderr);\n return {\n status: \"error\" as const,\n key: input.key,\n error: `Publish failed with exit code ${exitCode}`,\n };\n }\n\n if (stdout.trim()) process.stdout.write(stdout);\n if (stderr.trim()) process.stderr.write(stderr);\n\n const output = `${stdout}\\n${stderr}`;\n const deployEntries = parseDeployLines(output);\n const deployEntry = deployEntries.find(\n (e) => e.urlField === `plugins.${input.key}.production`,\n );\n\n let publishedUrl: string | undefined;\n let integrity: string | undefined;\n if (deployEntry) {\n publishedUrl = deployEntry.url;\n integrity = deployEntry.integrity;\n } else {\n publishedUrl = extractPublishedUrl(output) ?? undefined;\n integrity = publishedUrl\n ? ((await computeSriHashForUrl(publishedUrl)) ?? undefined)\n : undefined;\n }\n\n let manifest: PluginManifest | null = null;\n if (publishedUrl) {\n manifest = await fetchRemotePluginManifest(publishedUrl);\n } else if (attachmentRef?.production) {\n manifest = await fetchRemotePluginManifest(attachmentRef.production);\n if (manifest) {\n publishedUrl = attachmentRef.production;\n }\n }\n\n const version = manifest?.plugin.version ?? pkgJson.version;\n\n if (publishedUrl) {\n const rootConfigPath = join(deps.configDir, \"bos.config.json\");\n try {\n const rootConfig = JSON.parse(readFileSync(rootConfigPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n if (!rootConfig.plugins || typeof rootConfig.plugins !== \"object\") {\n rootConfig.plugins = {};\n }\n const plugins = rootConfig.plugins as Record<string, unknown>;\n if (!plugins[input.key] || typeof plugins[input.key] !== \"object\") {\n plugins[input.key] = {};\n }\n const entry = plugins[input.key] as Record<string, unknown>;\n entry.production = publishedUrl;\n if (integrity) {\n entry.integrity = integrity;\n } else {\n delete entry.integrity;\n }\n writeFileSync(rootConfigPath, `${JSON.stringify(rootConfig, null, 2)}\\n`);\n console.log(` ✅ Updated bos.config.json: plugins.${input.key}.production`);\n } catch (err) {\n console.error(\n ` ❌ Failed to update bos.config.json:`,\n err instanceof Error ? err.message : err,\n );\n }\n\n await generateCodeArtifacts(deps.configDir, deps.bosConfig);\n }\n\n return {\n status: \"published\" as const,\n key: input.key,\n path: localPath,\n script,\n production: publishedUrl ?? attachmentRef?.production,\n integrity: integrity ?? undefined,\n version: version ?? undefined,\n };\n }),\n\n dev: builder.dev.handler(async ({ input }) => {\n const devTimings: PhaseTiming[] = [];\n\n ensureEnvFile(deps.configDir);\n loadProjectEnv(deps.configDir);\n\n const localPackages = detectLocalPackages(\n deps.bosConfig ?? undefined,\n deps.runtimeConfig ?? undefined,\n );\n\n const hostSource: SourceMode = localPackages.includes(\"host\")\n ? parseSourceMode(input.host, \"local\")\n : \"remote\";\n const uiSource: SourceMode = localPackages.includes(\"ui\")\n ? parseSourceMode(input.ui, \"local\")\n : \"remote\";\n const apiSource: SourceMode = localPackages.includes(\"api\")\n ? parseSourceMode(input.api, \"local\")\n : \"remote\";\n const authSource: SourceMode = localPackages.includes(\"auth\")\n ? parseSourceMode(input.auth, \"local\")\n : \"remote\";\n const ssr = input.ssr ?? false;\n const proxy = input.proxy ?? false;\n\n const sharedSync = await timePhase(devTimings, \"shared deps\", () =>\n syncResolvedSharedDeps({\n configDir: deps.configDir,\n hostMode: hostSource,\n bosConfig: deps.bosConfig ?? undefined,\n extendsChain: [],\n }),\n );\n let configMayHaveChanged = false;\n if (sharedSync.catalogChanged) {\n await timePhase(devTimings, \"install\", () =>\n run(\"bun\", [\"install\"], { cwd: deps.configDir }),\n );\n configMayHaveChanged = true;\n }\n const shouldBuildPlugin =\n (apiSource === \"local\" && !proxy) || localPackages.some((pkg) => pkg.startsWith(\"plugin:\"));\n\n await timePhase(devTimings, \"build\", async () => {\n const buildTasks: Promise<void>[] = [buildEverythingDevQuietly(deps.configDir)];\n if (shouldBuildPlugin) {\n buildTasks.push(buildEveryPluginQuietly(deps.configDir));\n }\n await Promise.all(buildTasks);\n });\n\n let devExtendsChain: string[] | undefined;\n if (configMayHaveChanged || input.remotePlugins !== undefined) {\n const refreshed = await timePhase(devTimings, \"resolve config\", () =>\n loadResolvedConfig({\n cwd: deps.configDir,\n remotePlugins: input.remotePlugins,\n }),\n );\n deps.bosConfig = refreshed?.config ?? deps.bosConfig;\n deps.runtimeConfig = refreshed?.runtime ?? deps.runtimeConfig;\n devExtendsChain = refreshed?.source.extended;\n }\n\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n description: \"No bos.config.json found\",\n processes: [],\n timings: devTimings,\n };\n }\n\n if (proxy && !resolveProxyUrl(deps.bosConfig)) {\n return {\n status: \"error\" as const,\n description: \"No valid proxy URL configured in bos.config.json\",\n processes: [],\n timings: devTimings,\n };\n }\n\n suppressWarnings();\n const developmentRuntime = await buildRuntimeConfig(deps.bosConfig, {\n uiSource,\n apiSource,\n authSource,\n hostSource,\n env: \"development\",\n plugins: deps.runtimeConfig?.plugins,\n });\n drainConfigWarnings();\n resumeWarnings();\n\n const plan: InfraPlan = await timePhase(devTimings, \"ports\", () =>\n Effect.runPromise(\n planInfra({\n configDir: deps.configDir,\n bosConfig: developmentRuntime,\n cli: {\n port: input.port,\n apiPort: input.apiPort,\n authPort: input.authPort,\n uiPort: input.uiPort,\n pluginPortStart: input.pluginPortStart,\n ssr,\n proxy,\n hostSource,\n uiSource,\n apiSource,\n authSource,\n interactive: input.interactive,\n },\n }).pipe(Effect.provide(PortAllocatorLive)),\n ),\n );\n\n const mergedEnv: Record<string, string> = { ...plan.envGenerated };\n for (const [k, v] of Object.entries(process.env)) {\n if (v != null && !(k in plan.envGenerated)) {\n mergedEnv[k] = v;\n }\n }\n const preflightFailures = await Effect.runPromise(\n preflightLocalInfra(plan.envGenerated, mergedEnv),\n );\n if (preflightFailures.length > 0) {\n const messages = preflightFailures.map((f) => f.error).join(\"; \");\n return {\n status: \"error\" as const,\n description: `Infra preflight failed: ${messages}`,\n processes: [],\n timings: devTimings,\n };\n }\n\n const services = buildServiceDescriptorMapFromPlan(plan, { ssr, proxy });\n writeGeneratedInfra(deps.configDir, plan.runtimeConfig);\n ensureEnvFile(deps.configDir);\n loadProjectEnv(deps.configDir);\n\n const packages = [...plan.serviceDescriptors.keys()];\n if (process.env.DEBUG === \"true\" || process.env.DEBUG === \"1\") {\n console.error(\"[DEBUG dev] services keys:\", packages.join(\", \"));\n }\n const apiSvc = services.get(\"api\");\n if (apiSvc?.proxy) {\n const proxyUrl = resolveProxyUrl(deps.bosConfig);\n if (proxyUrl) plan.orchestrator.env.API_PROXY = proxyUrl;\n }\n\n pendingSession = {\n orchestrator: plan.orchestrator,\n services,\n runtimeConfig: plan.runtimeConfig,\n };\n\n await timePhase(devTimings, \"generate artifacts\", () =>\n generateCodeArtifacts(deps.configDir, deps.bosConfig!, {\n env: \"development\",\n extendsChain: devExtendsChain,\n runtimeConfig: plan.runtimeConfig,\n }),\n );\n\n return {\n status: \"started\" as const,\n description: buildDescription(services) || plan.description,\n processes: packages,\n timings: devTimings,\n };\n }),\n\n start: builder.start.handler(async ({ input }) => {\n ensureEnvFile(deps.configDir);\n loadProjectEnv(deps.configDir);\n\n pluginEvents.emit(\"progress\", { phase: \"config\", status: \"running\" } satisfies ProgressEvent);\n\n const bosEnv = input.env ?? (process.env.BOS_ENV === \"staging\" ? \"staging\" : \"production\");\n const account = input.account ?? process.env.BOS_ACCOUNT;\n const domain = input.domain ?? process.env.BOS_GATEWAY;\n\n let config: BosConfig | null = null;\n let remoteConfig: BosConfig | null = null;\n\n if (account && domain) {\n try {\n remoteConfig = await fetchPublishedConfig(account, domain);\n if (remoteConfig) {\n config = remoteConfig;\n } else {\n return {\n status: \"error\" as const,\n url: \"\",\n error: `No config found at bos://${account}/${domain}. Verify the account and gateway are correct and the config has been published.\\nExpected URL: ${buildRegistryConfigUrl(account, domain)}`,\n };\n }\n } catch (error) {\n return {\n status: \"error\" as const,\n url: \"\",\n error: `Failed to fetch config for bos://${account}/${domain}: ${error instanceof Error ? error.message : \"Unknown error\"}\\nExpected URL: ${buildRegistryConfigUrl(account, domain)}`,\n };\n }\n } else {\n config = deps.bosConfig;\n }\n\n if (!config) {\n return {\n status: \"error\" as const,\n url: \"\",\n error:\n \"No configuration found. Provide --account and --gateway flags, or create a local bos.config.json.\",\n };\n }\n\n // Apply runtime overrides from CLI flags / env vars\n if (account) {\n config = { ...config, account };\n }\n if (domain) {\n config = { ...config, domain };\n }\n\n const port = input.port ?? getHostDevelopmentPort(config.app.host.development);\n const isStaging = bosEnv === \"staging\";\n const runtimePlugins = await buildRuntimePluginsForConfig(\n config,\n deps.configDir,\n \"production\",\n );\n suppressWarnings();\n const runtimeConfig = await buildRuntimeConfig(config, {\n uiSource: \"remote\",\n apiSource: \"remote\",\n authSource: \"remote\",\n hostSource: \"remote\",\n env: \"production\",\n plugins: runtimePlugins,\n });\n drainConfigWarnings();\n resumeWarnings();\n\n if (isStaging && config.staging?.domain) {\n runtimeConfig.domain = config.staging.domain;\n }\n\n if (isStaging) {\n runtimeConfig.env = \"staging\";\n }\n\n syncGeneratedInfra(deps.configDir, runtimeConfig);\n ensureEnvFile(deps.configDir);\n loadProjectEnv(deps.configDir);\n\n pluginEvents.emit(\"progress\", {\n phase: \"generate artifacts\",\n status: \"running\",\n } satisfies ProgressEvent);\n await generateCodeArtifacts(deps.configDir, config, {\n env: \"production\",\n runtimeConfig,\n });\n pluginEvents.emit(\"progress\", {\n phase: \"generate artifacts\",\n status: \"done\",\n } satisfies ProgressEvent);\n\n // ── Production Readiness Validation ──\n const productionEnv: Record<string, string> = {};\n const warnings: string[] = [];\n\n // Default CORS_ORIGIN to the configured domain if not set\n if (!process.env.CORS_ORIGIN && config.domain) {\n const effectiveDomain = isStaging\n ? (config.staging?.domain ?? config.domain)\n : config.domain;\n const defaultOrigin = `https://${effectiveDomain}`;\n productionEnv.CORS_ORIGIN = defaultOrigin;\n warnings.push(`CORS_ORIGIN defaulting to ${defaultOrigin}`);\n }\n\n // Validate required secrets\n const requiredSecrets = new Set<string>();\n const missingSecrets: string[] = [];\n\n if (runtimeConfig.host.secrets) {\n for (const s of runtimeConfig.host.secrets) requiredSecrets.add(s);\n }\n if (runtimeConfig.auth?.secrets) {\n for (const s of runtimeConfig.auth.secrets) requiredSecrets.add(s);\n }\n if (runtimeConfig.api?.secrets) {\n for (const s of runtimeConfig.api.secrets) requiredSecrets.add(s);\n }\n for (const plugin of Object.values(runtimeConfig.plugins ?? {})) {\n if (plugin.secrets) {\n for (const s of plugin.secrets) requiredSecrets.add(s);\n }\n }\n\n for (const secret of requiredSecrets) {\n const value = process.env[secret];\n if (!value || value.length === 0) {\n missingSecrets.push(secret);\n }\n }\n\n if (missingSecrets.length > 0) {\n warnings.push(`Missing ${missingSecrets.length} secret(s): ${missingSecrets.join(\", \")}`);\n }\n\n const stagingEnvVars: Record<string, string> = isStaging\n ? { BOS_GATEWAY: config.staging?.domain ?? config.domain ?? \"\" }\n : {};\n\n const plan: InfraPlan = await Effect.runPromise(\n planInfra({\n configDir: deps.configDir,\n bosConfig: runtimeConfig,\n cli: {\n port: input.port,\n ssr: false,\n proxy: false,\n hostSource: \"remote\",\n uiSource: \"remote\",\n apiSource: \"remote\",\n authSource: \"remote\",\n interactive: input.interactive,\n },\n }).pipe(Effect.provide(PortAllocatorLive)),\n );\n\n const services = buildServiceDescriptorMap(plan.runtimeConfig);\n\n const configSource = remoteConfig\n ? `bos://${account}/${domain}`\n : (findConfigPath() ?? \"bos.config.json\");\n\n const configSourceHttp =\n remoteConfig && account && domain ? buildRegistryConfigUrl(account, domain) : undefined;\n\n const summary: StartSummary = {\n configSource,\n configSourceHttp,\n account: config.account,\n domain: config.domain ?? undefined,\n modules: {\n host: plan.runtimeConfig.host.remoteUrl ?? plan.runtimeConfig.host.url ?? \"local\",\n ui: plan.runtimeConfig.ui.url ?? \"local\",\n api: plan.runtimeConfig.api.url ?? \"local\",\n auth: plan.runtimeConfig.auth?.url ?? undefined,\n },\n warnings,\n };\n\n const orchestrator: AppOrchestrator = {\n packages: [\"host\"],\n env: {\n NODE_ENV: \"production\",\n ...productionEnv,\n ...stagingEnvVars,\n ...plan.launch.env,\n },\n description: `${isStaging ? \"Staging\" : \"Production\"} Mode (${config.account})`,\n port: plan.resolvedPorts.host ?? port,\n interactive: input.interactive,\n noLogs: true,\n };\n\n pendingSession = { orchestrator, services, runtimeConfig: plan.runtimeConfig };\n pendingStartSummary = summary;\n\n pluginEvents.emit(\"progress\", { phase: \"config\", status: \"done\" } satisfies ProgressEvent);\n\n return {\n status: \"running\" as const,\n url: plan.launch.hostUrl ?? `http://localhost:${plan.resolvedPorts.host ?? port}`,\n };\n }),\n\n build: builder.build.handler(async ({ input }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n built: [],\n skipped: [],\n };\n }\n\n const buildEnv: BosEnv = input.deploy ? \"production\" : \"development\";\n\n const targets = selectWorkspaceTargets(input.packages, deps.bosConfig);\n if (targets.length === 0) {\n return {\n status: \"error\" as const,\n built: [],\n skipped: [],\n };\n }\n\n suppressWarnings();\n const runtimeConfig = await buildRuntimeConfig(deps.bosConfig, {\n uiSource: deps.bosConfig.app.ui?.development ? \"local\" : \"remote\",\n apiSource: deps.bosConfig.app.api?.development ? \"local\" : \"remote\",\n authSource: deps.bosConfig.app.auth?.development ? \"local\" : \"remote\",\n hostSource: deps.bosConfig.app.host?.development ? \"local\" : \"remote\",\n env: buildEnv,\n plugins: deps.runtimeConfig?.plugins,\n });\n drainConfigWarnings();\n resumeWarnings();\n\n await generateCodeArtifacts(deps.configDir, deps.bosConfig, {\n env: buildEnv,\n runtimeConfig,\n });\n\n const { built, skipped } = await buildWorkspaceTargets({\n configDir: deps.configDir,\n bosConfig: deps.bosConfig,\n runtimeConfig: runtimeConfig,\n targets,\n deploy: input.deploy,\n });\n\n if (built.length === 0) {\n return {\n status: \"error\" as const,\n built: [],\n skipped,\n };\n }\n\n return {\n status: \"success\" as const,\n built,\n skipped,\n deployed: input.deploy,\n };\n }),\n\n publish: builder.publish.handler(async ({ input }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n registryUrl: \"\",\n error: \"No bos.config.json found\",\n };\n }\n\n const result = await publishToFastKv({\n bosConfig: deps.bosConfig,\n runtimeConfig: deps.runtimeConfig,\n configDir: deps.configDir,\n env: input.env,\n build: input.deploy,\n dryRun: input.dryRun,\n verbose: input.verbose,\n packages: input.packages,\n network: input.network,\n privateKey: input.privateKey,\n });\n\n if (result.publishConfig) {\n const refreshed = await loadResolvedConfig({ cwd: deps.configDir });\n if (refreshed?.config) {\n deps.bosConfig = refreshed.config;\n deps.runtimeConfig = refreshed.runtime;\n }\n }\n\n return {\n status: result.status,\n registryUrl: result.registryUrl,\n txHash: result.txHash,\n error: result.error,\n built: result.built,\n skipped: result.skipped,\n deployResults: result.deployResults,\n };\n }),\n\n deploy: builder.deploy.handler(async ({ input }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n registryUrl: \"\",\n redeployed: false,\n error: \"No bos.config.json found\",\n };\n }\n\n const result = await publishToFastKv({\n bosConfig: deps.bosConfig,\n runtimeConfig: deps.runtimeConfig,\n configDir: deps.configDir,\n env: input.env,\n build: input.build,\n dryRun: input.dryRun,\n verbose: input.verbose,\n packages: input.packages,\n network: input.network,\n privateKey: input.privateKey,\n });\n\n if (result.status === \"error\") {\n return {\n status: \"error\" as const,\n registryUrl: result.registryUrl,\n txHash: result.txHash,\n built: result.built,\n skipped: result.skipped,\n redeployed: false,\n error: result.error,\n deployResults: result.deployResults,\n };\n }\n\n if (result.status === \"dry-run\") {\n return {\n status: \"dry-run\" as const,\n registryUrl: result.registryUrl,\n built: result.built,\n skipped: result.skipped,\n redeployed: false,\n };\n }\n\n if (result.publishConfig) {\n const refreshed = await loadResolvedConfig({ cwd: deps.configDir });\n if (refreshed?.config) {\n deps.bosConfig = refreshed.config;\n deps.runtimeConfig = refreshed.runtime;\n }\n }\n\n let redeployed = false;\n let service: string | undefined;\n\n if (process.env.RAILWAY_TOKEN) {\n const railwayService = input.service ?? deps.bosConfig.ci?.railway?.service;\n if (!railwayService) {\n console.log();\n console.log(\n colors.yellow(\n \" Railway redeploy skipped: ci.railway.service is not configured in bos.config.json\",\n ),\n );\n return {\n status: \"published\" as const,\n registryUrl: result.registryUrl,\n txHash: result.txHash,\n built: result.built,\n skipped: result.skipped,\n redeployed: false,\n deployResults: result.deployResults,\n error:\n \"Config published but Railway redeploy failed: ci.railway.service is not configured in bos.config.json\",\n };\n }\n\n service = railwayService;\n console.log();\n console.log(` Redeploying Railway service ${colors.cyan(railwayService)}...`);\n try {\n const railResult = await run(\n \"railway\",\n [\"redeploy\", \"--service\", railwayService, \"--yes\"],\n {\n capture: true,\n },\n );\n if (railResult?.stdout) {\n for (const line of railResult.stdout.split(\"\\n\")) {\n if (line.trim()) console.log(` ${colors.dim(line.trim())}`);\n }\n }\n redeployed = true;\n console.log(colors.green(` Railway redeploy complete`));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const railError =\n message.includes(\"not found\") || message.includes(\"ENOENT\")\n ? \"Railway CLI not found. Install it: npm i -g @railway/cli\"\n : `Railway redeploy failed: ${message}`;\n console.log(colors.yellow(` ${railError}`));\n return {\n status: \"published\" as const,\n registryUrl: result.registryUrl,\n txHash: result.txHash,\n built: result.built,\n skipped: result.skipped,\n redeployed: false,\n service,\n deployResults: result.deployResults,\n error: `Config published but ${railError}`,\n };\n }\n } else {\n console.log();\n console.log(colors.yellow(\" Railway redeploy skipped (RAILWAY_TOKEN not set)\"));\n }\n\n return {\n status: \"deployed\" as const,\n registryUrl: result.registryUrl,\n txHash: result.txHash,\n built: result.built,\n skipped: result.skipped,\n redeployed,\n service,\n deployResults: result.deployResults,\n };\n }),\n\n keyPublish: builder.keyPublish.handler(async ({ input }) => {\n if (!deps.bosConfig) {\n return {\n status: \"error\" as const,\n account: \"\",\n network: \"mainnet\" as const,\n contract: \"\",\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n error: \"No bos.config.json found\",\n };\n }\n\n const account = deps.bosConfig.account;\n const network = getNetworkIdForAccount(account);\n const contract = getRegistryNamespaceForAccount(account);\n try {\n await Effect.runPromise(ensureNearCli);\n\n const oldKeys = await listPublishKeys({ account, contract, network });\n\n const keyPair = await addFunctionCallAccessKey({\n account,\n contract,\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n network,\n });\n\n if (oldKeys.length > 0) {\n console.log();\n console.log(\n ` Found ${oldKeys.length} existing publish key${oldKeys.length > 1 ? \"s\" : \"\"}:`,\n );\n for (const k of oldKeys) {\n console.log(` ${colors.dim(k)}`);\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const answer = await rl.question(\" Remove old key(s)? [Y/n] \");\n rl.close();\n\n if (answer.toLowerCase() !== \"n\" && answer.toLowerCase() !== \"no\") {\n try {\n await deleteAccessKeys(account, oldKeys, network);\n console.log(\n ` ${colors.green(\"✓\")} Removed ${oldKeys.length} old key${oldKeys.length > 1 ? \"s\" : \"\"}`,\n );\n } catch {\n console.log(\n ` ${colors.yellow(\"⚠\")} Failed to remove old key${oldKeys.length > 1 ? \"s\" : \"\"} (new key still active)`,\n );\n }\n } else {\n console.log(` ${colors.dim(\"Old key(s) retained.\")}`);\n }\n }\n\n return {\n status: \"published\" as const,\n account,\n network,\n contract,\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n publicKey: keyPair.publicKey,\n privateKey: keyPair.privateKey,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n account,\n network,\n contract,\n allowance: input.allowance,\n functionNames: PUBLISH_FUNCTION_NAMES,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n init: builder.init.handler(async ({ input }) => {\n try {\n const timings: PhaseTiming[] = [];\n let extendsAccount = \"\";\n let extendsGateway = \"\";\n let directory = input.directory;\n const account = input.account;\n const domain = input.domain;\n let overrides = input.overrides as OverrideSection[] | undefined;\n let plugins = input.plugins;\n\n if (input.extends) {\n const normalized = input.extends.startsWith(\"bos://\")\n ? input.extends\n : `bos://${input.extends}`;\n const match = normalized.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (match) {\n extendsAccount = match[1];\n extendsGateway = match[2];\n }\n }\n\n extendsAccount = extendsAccount || \"dev.everything.near\";\n extendsGateway = extendsGateway || \"everything.dev\";\n\n let parentPluginKeys: string[] = [];\n let parentConfig: BosConfig | null = null;\n try {\n parentConfig = await timePhase(timings, \"parent config\", () =>\n fetchParentConfig(extendsAccount, extendsGateway),\n );\n if (parentConfig?.plugins && typeof parentConfig.plugins === \"object\") {\n parentPluginKeys = Object.keys(parentConfig.plugins);\n }\n } catch (e) {\n console.warn(\n `[init] Failed to fetch parent config from ${extendsAccount}/${extendsGateway}: ${e instanceof Error ? e.message : e}`,\n );\n }\n\n overrides = overrides?.length ? overrides : ([\"ui\", \"api\"] as OverrideSection[]);\n if (overrides.includes(\"plugins\") && plugins === undefined) {\n plugins = parentPluginKeys;\n }\n plugins = plugins ?? [];\n\n const pluginDirMap: Record<string, string> = {};\n if (parentConfig?.plugins) {\n for (const plugin of plugins) {\n const entry = (parentConfig.plugins as Record<string, unknown>)?.[plugin];\n if (entry && typeof entry === \"object\") {\n const dev = (entry as Record<string, unknown>).development;\n if (typeof dev === \"string\") {\n const match = dev.match(/^local:plugins\\/(.+)$/);\n if (match?.[1] && match[1] !== plugin) pluginDirMap[plugin] = match[1];\n }\n }\n }\n }\n\n directory = directory || domain || extendsGateway;\n const targetDir = resolve(directory);\n const extendsRef = `bos://${extendsAccount}/${extendsGateway}`;\n\n const repository =\n (await detectGitRemoteUrl(process.cwd()).catch(() => undefined)) ??\n parentConfig?.repository;\n\n if (!parentConfig) {\n try {\n parentConfig = await timePhase(timings, \"parent config\", () =>\n fetchParentConfig(extendsAccount, extendsGateway),\n );\n } catch {\n return {\n status: \"error\" as const,\n directory,\n extendsRef,\n account,\n domain,\n extends: extendsRef,\n plugins,\n overrides,\n filesCopied: 0,\n timings,\n error: `No config found at ${extendsRef} — are you sure this is the right parent?`,\n };\n }\n }\n\n const {\n sourceDir,\n parentConfig: resolvedParentConfig,\n cleanup,\n } = await timePhase(timings, \"template source\", () =>\n resolveSourceDir({\n extendsAccount,\n extendsGateway,\n source: input.source,\n }),\n );\n\n parentConfig = resolvedParentConfig;\n\n const isMinimalScaffold = sourceDir === \"\";\n\n try {\n let filesCopied: number;\n\n if (isMinimalScaffold) {\n filesCopied = await timePhase(timings, \"scaffold project\", () =>\n scaffoldMinimalProject(targetDir, parentConfig as unknown as BosConfigInput, {\n extendsAccount,\n extendsGateway,\n account: account || extendsAccount,\n domain,\n plugins,\n overrides,\n repository,\n title: parentConfig?.title,\n description: parentConfig?.description,\n }),\n );\n\n await timePhase(timings, \"personalize config\", () =>\n personalizeConfig(targetDir, {\n extendsAccount,\n extendsGateway,\n account: account || extendsAccount,\n domain: domain || extendsGateway,\n plugins,\n overrides,\n mode: \"init\",\n repository,\n title: parentConfig?.title,\n description: parentConfig?.description,\n testnet: parentConfig?.testnet,\n staging: parentConfig?.staging,\n }),\n );\n } else {\n const patterns = buildInitPatterns(overrides, plugins, pluginDirMap);\n const routeExclusions = overrides.includes(\"ui\")\n ? buildPluginRouteExclusions(parentConfig, plugins)\n : [];\n\n filesCopied = await timePhase(timings, \"copy files\", () =>\n copyFilteredFiles(sourceDir, targetDir, patterns, {\n overrides,\n plugins,\n ignore: routeExclusions,\n }),\n );\n\n await timePhase(timings, \"personalize config\", () =>\n personalizeConfig(targetDir, {\n extendsAccount,\n extendsGateway,\n account: account || extendsAccount,\n domain: domain || extendsGateway,\n plugins,\n overrides,\n workspaceOpts: { sourceDir },\n repository,\n title: parentConfig?.title,\n description: parentConfig?.description,\n testnet: parentConfig?.testnet,\n staging: parentConfig?.staging,\n }),\n );\n\n await timePhase(timings, \"write snapshot\", () =>\n writeInitSnapshot(targetDir, extendsAccount, extendsGateway, sourceDir, patterns, {\n overrides,\n plugins,\n ignore: routeExclusions,\n }),\n );\n\n await timePhase(timings, \"personalize agents\", () =>\n personalizeAgentsMd(targetDir, { overrides, plugins }),\n );\n }\n\n await timePhase(timings, \"sync shared deps\", () =>\n syncResolvedSharedDeps({\n configDir: targetDir,\n hostMode: \"local\",\n }),\n );\n\n const lockfilePath = join(targetDir, \"bun.lock\");\n const allowedWorkspaces = computeAllowedWorkspaces(overrides, plugins);\n stripOrphanedWorkspacesFromLockfile(lockfilePath, allowedWorkspaces);\n removeInitLockfile(lockfilePath);\n\n const initConfig = await timePhase(timings, \"resolve config\", () =>\n loadResolvedConfig({ cwd: targetDir }),\n );\n if (initConfig?.runtime) {\n await timePhase(timings, \"generate env/docker\", async () => {\n writeGeneratedInfra(targetDir, initConfig.runtime);\n });\n }\n await timePhase(timings, \"create env file\", async () => {\n ensureEnvFile(targetDir);\n });\n\n if (!input.noInstall) {\n await timePhase(timings, \"install dependencies\", () => runBunInstall(targetDir));\n await timePhase(timings, \"generate types\", () => runTypesGen(targetDir));\n await timePhase(timings, \"generate migrations\", () =>\n generateDatabaseMigrations(targetDir),\n );\n }\n\n if (input.noInstall && initConfig?.config) {\n await timePhase(timings, \"generate code artifacts\", () =>\n generateCodeArtifacts(targetDir, initConfig.config),\n );\n }\n\n return {\n status: \"initialized\" as const,\n directory,\n extendsRef,\n account,\n domain,\n extends: extendsRef,\n plugins,\n overrides,\n filesCopied,\n timings,\n targetDir,\n };\n } finally {\n await cleanup();\n }\n } catch (error) {\n const extendsRef = input.extends\n ? input.extends.startsWith(\"bos://\")\n ? input.extends\n : `bos://${input.extends}`\n : \"bos://dev.everything.near/everything.dev\";\n return {\n status: \"error\" as const,\n directory: input.directory ?? \"\",\n extendsRef,\n account: input.account,\n domain: input.domain,\n extends: extendsRef,\n plugins: input.plugins ?? [],\n overrides: input.overrides,\n filesCopied: 0,\n timings: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n sync: builder.sync.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const result = await syncTemplate(projectDir, input);\n\n if (result.status === \"synced\" || result.status === \"dry-run\") {\n const syncedConfig = await loadResolvedConfig({ cwd: projectDir });\n if (syncedConfig?.config) {\n await generateCodeArtifacts(projectDir, syncedConfig.config);\n }\n }\n\n return result;\n } catch (error) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n upgrade: builder.upgrade.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await upgradeTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typesGen: builder.typesGen.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const env =\n input.env ?? (process.env.NODE_ENV === \"production\" ? \"production\" : \"development\");\n\n const refreshed = await loadResolvedConfig({\n cwd: projectDir,\n env,\n remotePlugins: input.remotePlugins,\n });\n if (!refreshed) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: \"Failed to load bos.config.json\",\n };\n }\n\n if (input.dryRun) {\n const pluginEntries = Object.entries(refreshed.runtime.plugins ?? {});\n const fetched: string[] = [];\n const skipped: string[] = [];\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n\n if (refreshed.runtime.api.source !== \"local\") {\n fetched.push(`api remote (${refreshed.runtime.api.url})`);\n } else {\n const path = refreshed.runtime.api.localPath\n ? ` (${relative(projectDir, refreshed.runtime.api.localPath)})`\n : \"\";\n skipped.push(`api local${path}`);\n }\n\n if (refreshed.runtime.auth) {\n if (refreshed.runtime.auth.source !== \"local\") {\n fetched.push(`auth remote (${refreshed.runtime.auth.url})`);\n } else {\n const path = refreshed.runtime.auth.localPath\n ? ` (${relative(projectDir, refreshed.runtime.auth.localPath)})`\n : \"\";\n skipped.push(`auth local${path}`);\n }\n }\n\n for (const [key, plugin] of pluginEntries) {\n if (plugin.url && plugin.source !== \"local\") {\n fetched.push(`${key} remote (${plugin.url})`);\n } else if (plugin.localPath) {\n skipped.push(`${key} local (${relative(projectDir, plugin.localPath)})`);\n } else {\n skipped.push(`${key} no URL resolved`);\n }\n }\n\n const generated = [\"ui/src/lib/api-types.gen.ts\", \"ui/src/lib/auth-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [key, _plugin] of pluginEntries) {\n const pluginSrc = join(\n projectDir,\n \"plugins\",\n key,\n \"src\",\n \"lib\",\n \"plugins-client.gen.ts\",\n );\n if (existsSync(pluginSrc)) {\n generated.push(`plugins/${key}/src/lib/plugins-client.gen.ts`);\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed: [],\n };\n }\n\n const artifacts = await generateCodeArtifacts(projectDir, refreshed.config, {\n runtimeConfig: refreshed.runtime,\n });\n\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n const generated = [\"ui/src/lib/api-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (\n refreshed.runtime.auth &&\n (refreshed.runtime.auth.source !== \"local\" || refreshed.runtime.auth.localPath)\n ) {\n generated.push(\"ui/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [key, _plugin] of Object.entries(refreshed.runtime.plugins ?? {})) {\n const pluginSrc = join(projectDir, \"plugins\", key, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(`plugins/${key}/src/lib/plugins-client.gen.ts`);\n }\n }\n\n const contractStatus = artifacts?.contractStatus ?? [];\n const fetched: string[] = [];\n const skipped: string[] = [];\n const failed: string[] = [];\n for (const entry of contractStatus) {\n if (entry.source === \"remote\") {\n fetched.push(entry.url ? `${entry.key} remote (${entry.url})` : entry.key);\n } else if (entry.source === \"local\") {\n const path = entry.localPath ? ` (${relative(projectDir, entry.localPath)})` : \"\";\n skipped.push(`${entry.key} local${path}`);\n } else if (entry.source === \"skipped\") {\n skipped.push(`${entry.key} no URL resolved`);\n } else if (entry.source === \"failed\") {\n const detail = entry.error ? `: ${entry.error}` : \"\";\n failed.push(`${entry.key}${detail}`);\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n dbStudio: builder.dbStudio.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n plugin: input.plugin,\n source: \"remote\" as const,\n section: \"\",\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n loadProjectEnv(projectDir);\n const refreshed = await loadResolvedConfig({ cwd: projectDir });\n if (!refreshed) {\n return {\n status: \"error\" as const,\n plugin: input.plugin,\n source: \"remote\" as const,\n section: \"\",\n error: \"Failed to load bos.config.json\",\n };\n }\n\n const { resolvePluginDbInfo } = await import(\"./cli/db-studio\");\n const info = resolvePluginDbInfo(input.plugin, refreshed.runtime, projectDir);\n\n return {\n status: \"success\" as const,\n plugin: info.key,\n source: info.source,\n section: info.section,\n databaseSecret: info.databaseSecret,\n databaseUrl: info.databaseUrl,\n workspaceDir: info.workspaceDir,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n plugin: input.plugin,\n source: \"remote\" as const,\n section: \"\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n dbDoctor: builder.dbDoctor.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n plugin: input.plugin,\n slug: \"\",\n journalTable: \"\",\n journalSchema: \"\",\n diagnosis: \"error\",\n localMigrationCount: 0,\n appliedHashCount: 0,\n expectedTables: [],\n missingTables: [],\n error: \"No bos.config.json\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n loadProjectEnv(projectDir);\n const refreshed = await loadResolvedConfig({ cwd: projectDir });\n if (!refreshed) {\n return {\n status: \"error\" as const,\n plugin: input.plugin,\n slug: \"\",\n journalTable: \"\",\n journalSchema: \"\",\n diagnosis: \"error\",\n localMigrationCount: 0,\n appliedHashCount: 0,\n expectedTables: [],\n missingTables: [],\n error: \"Failed to load config\",\n };\n }\n\n const { resolvePluginDbInfo } = await import(\"./cli/db-studio\");\n const info = resolvePluginDbInfo(input.plugin, refreshed.runtime, projectDir);\n\n const { diagnosePlugin } = await import(\"./cli/db-doctor\");\n const report = await diagnosePlugin(info);\n\n return {\n status: \"success\" as const,\n ...report,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n plugin: input.plugin,\n slug: \"\",\n journalTable: \"\",\n journalSchema: \"\",\n diagnosis: \"error\",\n localMigrationCount: 0,\n appliedHashCount: 0,\n expectedTables: [],\n missingTables: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n dbRepair: builder.dbRepair.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n message: \"No bos.config.json found\",\n diagnosis: null,\n error: \"No config\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n loadProjectEnv(projectDir);\n const refreshed = await loadResolvedConfig({ cwd: projectDir });\n if (!refreshed) {\n return {\n status: \"error\" as const,\n message: \"Failed to load config\",\n diagnosis: null,\n error: \"Config load failed\",\n };\n }\n\n const { resolvePluginDbInfo } = await import(\"./cli/db-studio\");\n const info = resolvePluginDbInfo(input.plugin, refreshed.runtime, projectDir);\n\n const { repairPlugin } = await import(\"./cli/db-repair\");\n const result = await repairPlugin(info, input.mode ?? \"history-reset\");\n\n return {\n ...result,\n error: result.status === \"error\" ? result.message : undefined,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n message: error instanceof Error ? error.message : \"Unknown error\",\n diagnosis: null,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n status: builder.status.handler(async () => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n envFile: \"missing\" as const,\n error: \"No bos.config.json found in current directory\",\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await getStatus(projectDir);\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 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 entries = await Effect.runPromise(pruneDeadEffect(readRegistry()));\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 ? entries.filter((entry) => entry.configDir === targetConfigDir)\n : entries;\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 try {\n process.kill(entry.pid, input.signal === \"SIGKILL\" ? \"SIGKILL\" : \"SIGTERM\");\n killed.push({ pid: entry.pid, configDir: entry.configDir });\n unregisterPid(entry.pid);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ESRCH\") {\n skipped.push({ pid: entry.pid, reason: \"process already exited\" });\n unregisterPid(entry.pid);\n } else {\n skipped.push({\n pid: entry.pid,\n reason: (err as Error).message ?? \"kill failed\",\n });\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});\n\nfunction computeAllowedWorkspaces(overrides: string[], plugins?: string[]): string[] {\n const workspaces: string[] = [];\n for (const section of overrides) {\n if (section === \"host\") workspaces.push(\"host\");\n if (section === \"ui\") workspaces.push(\"ui\");\n if (section === \"api\") workspaces.push(\"api\");\n }\n if (plugins && plugins.length > 0) {\n workspaces.push(\"plugins/*\");\n }\n return workspaces;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.mjs","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { buildScoped, buildScopedContext } from \"every-plugin\";\nimport { registerBuild } from \"./commands/build\";\nimport { registerConfig } from \"./commands/config\";\nimport { registerDb } from \"./commands/db\";\nimport { registerDeploy } from \"./commands/deploy\";\nimport { registerDev } from \"./commands/dev\";\nimport { registerInit } from \"./commands/init\";\nimport { registerKeys } from \"./commands/keys\";\nimport { registerOps } from \"./commands/ops\";\nimport { registerPlugins } from \"./commands/plugins\";\nimport { type BosDeps, BosDepsTag } from \"./commands/shared\";\nimport { registerUpgrade } from \"./commands/upgrade\";\nimport { bosContract } from \"./contract\";\nimport { DatabaseBindings, DrizzleKit, makeDatabaseBindings, makeDrizzleKitLive } from \"./db\";\nimport { ProjectEnv, ProjectEnvLive } from \"./env/project-env\";\nimport { openResolution } from \"./resolution/session\";\nimport { createPlugin, z } from \"./sdk\";\n\nexport { resolveRemoteConfigChain } from \"./commands/config\";\nexport type { DevSessionData, StartSummary } from \"./dev-program\";\nexport { type ProgressEvent, pluginEvents } from \"./progress\";\n\nexport default createPlugin({\n variables: z.object({\n configPath: z.string().optional(),\n // The artifact root (cwd-derived) — decoupled from configPath so an\n // explicit boot config (--config-path fixture) validates and loads\n // without redirecting where the CLI writes generated artifacts.\n configDir: z.string().optional(),\n }),\n secrets: z.object({}),\n contract: bosContract,\n initialize: (config, _plugins) =>\n Effect.gen(function* () {\n const session = yield* Effect.promise(() =>\n openResolution({ path: config.variables.configPath }),\n );\n\n const projectEnv = yield* buildScoped(ProjectEnv, ProjectEnvLive);\n const effectContext = yield* Effect.context();\n\n const configDir = config.variables.configDir ?? session?.root ?? process.cwd();\n\n const services = yield* buildScopedContext(\n Layer.mergeAll(\n makeDatabaseBindings({\n projectDir: configDir,\n loadRuntimeConfig: async () => (await session?.buildRuntime()) ?? null,\n loadEnv: () => Effect.runPromiseWith(effectContext)(projectEnv.load(configDir)),\n }),\n makeDrizzleKitLive({\n projectDir: configDir,\n onLog: (message) => p.log.info(message),\n }),\n ),\n );\n\n return Layer.succeed(BosDepsTag, {\n session,\n databaseBindings: Context.get(services, DatabaseBindings),\n drizzleKit: Context.get(services, DrizzleKit),\n } satisfies BosDeps);\n }),\n createRouter: (builder) => ({\n ...registerConfig(builder),\n ...registerPlugins(builder),\n ...registerDev(builder),\n ...registerBuild(builder),\n ...registerDeploy(builder),\n ...registerKeys(builder),\n ...registerInit(builder),\n ...registerUpgrade(builder),\n ...registerDb(builder),\n ...registerOps(builder),\n }),\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBA,qBAAe,aAAa;CAC1B,WAAW,EAAE,OAAO;EAClB,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;EAIhC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,CAAC;CACD,SAAS,EAAE,OAAO,CAAC,CAAC;CACpB,UAAU;CACV,aAAa,QAAQ,aACnB,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,OAAO,cAC5B,eAAe,EAAE,MAAM,OAAO,UAAU,WAAW,CAAC,CACtD;EAEA,MAAM,aAAa,OAAO,YAAY,YAAY,cAAc;EAChE,MAAM,gBAAgB,OAAO,OAAO,QAAQ;EAE5C,MAAM,YAAY,OAAO,UAAU,aAAa,SAAS,QAAQ,QAAQ,IAAI;EAE7E,MAAM,WAAW,OAAO,mBACtB,MAAM,SACJ,qBAAqB;GACnB,YAAY;GACZ,mBAAmB,YAAa,MAAM,SAAS,aAAa,KAAM;GAClE,eAAe,OAAO,eAAe,aAAa,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC;EAChF,CAAC,GACD,mBAAmB;GACjB,YAAY;GACZ,QAAQ,YAAY,EAAE,IAAI,KAAK,OAAO;EACxC,CAAC,CACH,CACF;EAEA,OAAO,MAAM,QAAQ,YAAY;GAC/B;GACA,kBAAkB,QAAQ,IAAI,UAAU,gBAAgB;GACxD,YAAY,QAAQ,IAAI,UAAU,UAAU;EAC9C,CAAmB;CACrB,CAAC;CACH,eAAe,aAAa;EAC1B,GAAG,eAAe,OAAO;EACzB,GAAG,gBAAgB,OAAO;EAC1B,GAAG,YAAY,OAAO;EACtB,GAAG,cAAc,OAAO;EACxB,GAAG,eAAe,OAAO;EACzB,GAAG,aAAa,OAAO;EACvB,GAAG,aAAa,OAAO;EACvB,GAAG,gBAAgB,OAAO;EAC1B,GAAG,WAAW,OAAO;EACrB,GAAG,YAAY,OAAO;CACxB;AACF,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const require_process_registry = require('./process-registry.cjs');
|
|
2
|
+
let effect = require("effect");
|
|
3
|
+
|
|
4
|
+
//#region src/process-kill.ts
|
|
5
|
+
const DEFAULT_TERMINATE_MS = 5e3;
|
|
6
|
+
const POLL_INTERVAL_MS = 250;
|
|
7
|
+
const groupKill = (pid, signal) => {
|
|
8
|
+
try {
|
|
9
|
+
process.kill(-pid, signal);
|
|
10
|
+
} catch {
|
|
11
|
+
try {
|
|
12
|
+
process.kill(pid, signal);
|
|
13
|
+
} catch {}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const waitGone = (pid, timeoutMs) => effect.Effect.gen(function* () {
|
|
17
|
+
const deadline = (yield* effect.Clock.currentTimeMillis) + timeoutMs;
|
|
18
|
+
while (require_process_registry.isPidAlive(pid)) {
|
|
19
|
+
if ((yield* effect.Clock.currentTimeMillis) >= deadline) return false;
|
|
20
|
+
yield* effect.Effect.sleep(POLL_INTERVAL_MS);
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
const killProcessGroupEscalating = (pid, options) => effect.Effect.gen(function* () {
|
|
25
|
+
const terminateMs = options?.terminateMs ?? DEFAULT_TERMINATE_MS;
|
|
26
|
+
const signal = options?.signal ?? "SIGTERM";
|
|
27
|
+
if (pid <= 1 || pid === process.pid) return;
|
|
28
|
+
if (!require_process_registry.isPidAlive(pid)) return;
|
|
29
|
+
groupKill(pid, signal);
|
|
30
|
+
if (signal === "SIGKILL") return;
|
|
31
|
+
if (!(yield* waitGone(pid, terminateMs))) {
|
|
32
|
+
groupKill(pid, "SIGKILL");
|
|
33
|
+
yield* waitGone(pid, 1e3);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const reapGroup = (pid) => {
|
|
37
|
+
if (pid <= 1 || pid === process.pid) return;
|
|
38
|
+
groupKill(pid, "SIGKILL");
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
exports.killProcessGroupEscalating = killProcessGroupEscalating;
|
|
43
|
+
exports.reapGroup = reapGroup;
|
|
44
|
+
//# sourceMappingURL=process-kill.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-kill.cjs","names":["Effect","Clock","isPidAlive"],"sources":["../src/process-kill.ts"],"sourcesContent":["import { Clock, Effect } from \"effect\";\nimport { isPidAlive } from \"./process-registry\";\n\nexport interface KillEscalationOptions {\n terminateMs?: number;\n signal?: NodeJS.Signals;\n}\n\nconst DEFAULT_TERMINATE_MS = 5000;\nconst POLL_INTERVAL_MS = 250;\n\nconst groupKill = (pid: number, signal: NodeJS.Signals): void => {\n try {\n process.kill(-pid, signal);\n } catch {\n try {\n process.kill(pid, signal);\n } catch {\n // already gone\n }\n }\n};\n\nconst waitGone = (pid: number, timeoutMs: number): Effect.Effect<boolean> =>\n Effect.gen(function* () {\n const started = yield* Clock.currentTimeMillis;\n const deadline = started + timeoutMs;\n while (isPidAlive(pid)) {\n const now = yield* Clock.currentTimeMillis;\n if (now >= deadline) return false;\n yield* Effect.sleep(POLL_INTERVAL_MS);\n }\n return true;\n });\n\n// killProcessGroupEscalating mirrors the dev session's per-child kill: signal\n// the process group (direct-pid fallback), wait for exit, then SIGKILL the\n// group if the graceful signal was ignored.\nexport const killProcessGroupEscalating = (\n pid: number,\n options?: KillEscalationOptions,\n): Effect.Effect<void> =>\n Effect.gen(function* () {\n const terminateMs = options?.terminateMs ?? DEFAULT_TERMINATE_MS;\n const signal = options?.signal ?? \"SIGTERM\";\n if (pid <= 1 || pid === process.pid) return;\n if (!isPidAlive(pid)) return;\n groupKill(pid, signal);\n if (signal === \"SIGKILL\") return;\n const gone = yield* waitGone(pid, terminateMs);\n if (!gone) {\n groupKill(pid, \"SIGKILL\");\n yield* waitGone(pid, 1000);\n }\n });\n\n// reapGroup hard-kills a process group with direct-pid fallback — the\n// post-escalation cleanup for service trees and their watcher grandchildren.\nexport const reapGroup = (pid: number): void => {\n if (pid <= 1 || pid === process.pid) return;\n groupKill(pid, \"SIGKILL\");\n};\n"],"mappings":";;;;AAQA,MAAM,uBAAuB;AAC7B,MAAM,mBAAmB;AAEzB,MAAM,aAAa,KAAa,WAAiC;CAC/D,IAAI;EACF,QAAQ,KAAK,CAAC,KAAK,MAAM;CAC3B,QAAQ;EACN,IAAI;GACF,QAAQ,KAAK,KAAK,MAAM;EAC1B,QAAQ,CAER;CACF;AACF;AAEA,MAAM,YAAY,KAAa,cAC7BA,cAAO,IAAI,aAAa;CAEtB,MAAM,YAAW,OADMC,aAAM,qBACF;CAC3B,OAAOC,oCAAW,GAAG,GAAG;EAEtB,KAAI,OADeD,aAAM,sBACd,UAAU,OAAO;EAC5B,OAAOD,cAAO,MAAM,gBAAgB;CACtC;CACA,OAAO;AACT,CAAC;AAKH,MAAa,8BACX,KACA,YAEAA,cAAO,IAAI,aAAa;CACtB,MAAM,cAAc,SAAS,eAAe;CAC5C,MAAM,SAAS,SAAS,UAAU;CAClC,IAAI,OAAO,KAAK,QAAQ,QAAQ,KAAK;CACrC,IAAI,CAACE,oCAAW,GAAG,GAAG;CACtB,UAAU,KAAK,MAAM;CACrB,IAAI,WAAW,WAAW;CAE1B,IAAI,EAAC,OADe,SAAS,KAAK,WAAW,IAClC;EACT,UAAU,KAAK,SAAS;EACxB,OAAO,SAAS,KAAK,GAAI;CAC3B;AACF,CAAC;AAIH,MAAa,aAAa,QAAsB;CAC9C,IAAI,OAAO,KAAK,QAAQ,QAAQ,KAAK;CACrC,UAAU,KAAK,SAAS;AAC1B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { isPidAlive } from "./process-registry.mjs";
|
|
2
|
+
import { Clock, Effect } from "effect";
|
|
3
|
+
|
|
4
|
+
//#region src/process-kill.ts
|
|
5
|
+
const DEFAULT_TERMINATE_MS = 5e3;
|
|
6
|
+
const POLL_INTERVAL_MS = 250;
|
|
7
|
+
const groupKill = (pid, signal) => {
|
|
8
|
+
try {
|
|
9
|
+
process.kill(-pid, signal);
|
|
10
|
+
} catch {
|
|
11
|
+
try {
|
|
12
|
+
process.kill(pid, signal);
|
|
13
|
+
} catch {}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const waitGone = (pid, timeoutMs) => Effect.gen(function* () {
|
|
17
|
+
const deadline = (yield* Clock.currentTimeMillis) + timeoutMs;
|
|
18
|
+
while (isPidAlive(pid)) {
|
|
19
|
+
if ((yield* Clock.currentTimeMillis) >= deadline) return false;
|
|
20
|
+
yield* Effect.sleep(POLL_INTERVAL_MS);
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
const killProcessGroupEscalating = (pid, options) => Effect.gen(function* () {
|
|
25
|
+
const terminateMs = options?.terminateMs ?? DEFAULT_TERMINATE_MS;
|
|
26
|
+
const signal = options?.signal ?? "SIGTERM";
|
|
27
|
+
if (pid <= 1 || pid === process.pid) return;
|
|
28
|
+
if (!isPidAlive(pid)) return;
|
|
29
|
+
groupKill(pid, signal);
|
|
30
|
+
if (signal === "SIGKILL") return;
|
|
31
|
+
if (!(yield* waitGone(pid, terminateMs))) {
|
|
32
|
+
groupKill(pid, "SIGKILL");
|
|
33
|
+
yield* waitGone(pid, 1e3);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const reapGroup = (pid) => {
|
|
37
|
+
if (pid <= 1 || pid === process.pid) return;
|
|
38
|
+
groupKill(pid, "SIGKILL");
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
export { killProcessGroupEscalating, reapGroup };
|
|
43
|
+
//# sourceMappingURL=process-kill.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-kill.mjs","names":[],"sources":["../src/process-kill.ts"],"sourcesContent":["import { Clock, Effect } from \"effect\";\nimport { isPidAlive } from \"./process-registry\";\n\nexport interface KillEscalationOptions {\n terminateMs?: number;\n signal?: NodeJS.Signals;\n}\n\nconst DEFAULT_TERMINATE_MS = 5000;\nconst POLL_INTERVAL_MS = 250;\n\nconst groupKill = (pid: number, signal: NodeJS.Signals): void => {\n try {\n process.kill(-pid, signal);\n } catch {\n try {\n process.kill(pid, signal);\n } catch {\n // already gone\n }\n }\n};\n\nconst waitGone = (pid: number, timeoutMs: number): Effect.Effect<boolean> =>\n Effect.gen(function* () {\n const started = yield* Clock.currentTimeMillis;\n const deadline = started + timeoutMs;\n while (isPidAlive(pid)) {\n const now = yield* Clock.currentTimeMillis;\n if (now >= deadline) return false;\n yield* Effect.sleep(POLL_INTERVAL_MS);\n }\n return true;\n });\n\n// killProcessGroupEscalating mirrors the dev session's per-child kill: signal\n// the process group (direct-pid fallback), wait for exit, then SIGKILL the\n// group if the graceful signal was ignored.\nexport const killProcessGroupEscalating = (\n pid: number,\n options?: KillEscalationOptions,\n): Effect.Effect<void> =>\n Effect.gen(function* () {\n const terminateMs = options?.terminateMs ?? DEFAULT_TERMINATE_MS;\n const signal = options?.signal ?? \"SIGTERM\";\n if (pid <= 1 || pid === process.pid) return;\n if (!isPidAlive(pid)) return;\n groupKill(pid, signal);\n if (signal === \"SIGKILL\") return;\n const gone = yield* waitGone(pid, terminateMs);\n if (!gone) {\n groupKill(pid, \"SIGKILL\");\n yield* waitGone(pid, 1000);\n }\n });\n\n// reapGroup hard-kills a process group with direct-pid fallback — the\n// post-escalation cleanup for service trees and their watcher grandchildren.\nexport const reapGroup = (pid: number): void => {\n if (pid <= 1 || pid === process.pid) return;\n groupKill(pid, \"SIGKILL\");\n};\n"],"mappings":";;;;AAQA,MAAM,uBAAuB;AAC7B,MAAM,mBAAmB;AAEzB,MAAM,aAAa,KAAa,WAAiC;CAC/D,IAAI;EACF,QAAQ,KAAK,CAAC,KAAK,MAAM;CAC3B,QAAQ;EACN,IAAI;GACF,QAAQ,KAAK,KAAK,MAAM;EAC1B,QAAQ,CAER;CACF;AACF;AAEA,MAAM,YAAY,KAAa,cAC7B,OAAO,IAAI,aAAa;CAEtB,MAAM,YAAW,OADM,MAAM,qBACF;CAC3B,OAAO,WAAW,GAAG,GAAG;EAEtB,KAAI,OADe,MAAM,sBACd,UAAU,OAAO;EAC5B,OAAO,OAAO,MAAM,gBAAgB;CACtC;CACA,OAAO;AACT,CAAC;AAKH,MAAa,8BACX,KACA,YAEA,OAAO,IAAI,aAAa;CACtB,MAAM,cAAc,SAAS,eAAe;CAC5C,MAAM,SAAS,SAAS,UAAU;CAClC,IAAI,OAAO,KAAK,QAAQ,QAAQ,KAAK;CACrC,IAAI,CAAC,WAAW,GAAG,GAAG;CACtB,UAAU,KAAK,MAAM;CACrB,IAAI,WAAW,WAAW;CAE1B,IAAI,EAAC,OADe,SAAS,KAAK,WAAW,IAClC;EACT,UAAU,KAAK,SAAS;EACxB,OAAO,SAAS,KAAK,GAAI;CAC3B;AACF,CAAC;AAIH,MAAa,aAAa,QAAsB;CAC9C,IAAI,OAAO,KAAK,QAAQ,QAAQ,KAAK;CACrC,UAAU,KAAK,SAAS;AAC1B"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
let node_fs = require("node:fs");
|
|
2
2
|
let node_path = require("node:path");
|
|
3
3
|
let effect = require("effect");
|
|
4
|
-
let node_fs_promises = require("node:fs/promises");
|
|
5
4
|
let node_os = require("node:os");
|
|
5
|
+
let node_fs_promises = require("node:fs/promises");
|
|
6
|
+
let node_child_process = require("node:child_process");
|
|
6
7
|
|
|
7
8
|
//#region src/process-registry.ts
|
|
8
9
|
function getRegistryDir() {
|
|
9
10
|
return (0, node_path.join)((0, node_os.homedir)(), ".cache", "everything-dev");
|
|
10
11
|
}
|
|
11
12
|
function ensureRegistryDir() {
|
|
12
|
-
const
|
|
13
|
+
const path = getRegistryPath();
|
|
14
|
+
const dir = (0, node_path.join)(path, "..");
|
|
13
15
|
if (!(0, node_fs.existsSync)(dir)) (0, node_fs.mkdirSync)(dir, { recursive: true });
|
|
14
16
|
}
|
|
15
17
|
function readRegistry() {
|
|
@@ -31,8 +33,42 @@ function isPidAlive(pid) {
|
|
|
31
33
|
return err.code !== "ESRCH";
|
|
32
34
|
}
|
|
33
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Identity of a process generation, stable across PID reuse: Linux reads the
|
|
38
|
+
* kernel's starttime tick from /proc, macOS falls back to `ps -o lstart=`.
|
|
39
|
+
* Null when the generation cannot be determined (the caller then treats the
|
|
40
|
+
* claim as unverifiable and keeps legacy behavior).
|
|
41
|
+
*/
|
|
42
|
+
function processStartTime(pid) {
|
|
43
|
+
if (pid <= 1) return null;
|
|
44
|
+
try {
|
|
45
|
+
const stat = (0, node_fs.readFileSync)(`/proc/${pid}/stat`, "utf-8");
|
|
46
|
+
const close = stat.lastIndexOf(")");
|
|
47
|
+
const starttime = stat.slice(close + 2).split(" ")[19];
|
|
48
|
+
return starttime ? `proc:${starttime}` : null;
|
|
49
|
+
} catch {
|
|
50
|
+
try {
|
|
51
|
+
const text = (0, node_child_process.spawnSync)("ps", [
|
|
52
|
+
"-o",
|
|
53
|
+
"lstart=",
|
|
54
|
+
"-p",
|
|
55
|
+
String(pid)
|
|
56
|
+
], { timeout: 5e3 }).stdout?.toString().trim();
|
|
57
|
+
return text ? `ps:${text}` : null;
|
|
58
|
+
} catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function isEntryLive(entry) {
|
|
64
|
+
if (entry.pid <= 1) return false;
|
|
65
|
+
if (!(0, node_fs.existsSync)(entry.configDir)) return false;
|
|
66
|
+
if (!isPidAlive(entry.pid)) return false;
|
|
67
|
+
if (entry.processStart !== void 0) return processStartTime(entry.pid) === entry.processStart;
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
34
70
|
function pruneDead(entries) {
|
|
35
|
-
return entries.filter(
|
|
71
|
+
return entries.filter(isEntryLive);
|
|
36
72
|
}
|
|
37
73
|
function pruneDeadEffect(entries) {
|
|
38
74
|
return effect.Effect.forEach(entries, (entry) => {
|
|
@@ -40,6 +76,9 @@ function pruneDeadEffect(entries) {
|
|
|
40
76
|
return effect.Effect.gen(function* () {
|
|
41
77
|
if (!(yield* effect.Effect.promise(() => (0, node_fs_promises.access)(entry.configDir).then(() => true).catch(() => false)))) return null;
|
|
42
78
|
if (!isPidAlive(entry.pid)) return null;
|
|
79
|
+
if (entry.processStart !== void 0) {
|
|
80
|
+
if ((yield* effect.Effect.promise(() => Promise.resolve(processStartTime(entry.pid)))) !== entry.processStart) return null;
|
|
81
|
+
}
|
|
43
82
|
return entry;
|
|
44
83
|
});
|
|
45
84
|
}, { concurrency: "unbounded" }).pipe(effect.Effect.map((results) => results.filter((e) => e !== null)));
|
|
@@ -55,37 +94,53 @@ function registerStandalone(entry) {
|
|
|
55
94
|
const live = pruneDead(readRegistry());
|
|
56
95
|
const full = {
|
|
57
96
|
...entry,
|
|
58
|
-
role: "standalone"
|
|
97
|
+
role: "standalone",
|
|
98
|
+
processStart: processStartTime(entry.pid) ?? entry.processStart
|
|
59
99
|
};
|
|
60
100
|
const withoutSelf = live.filter((existing) => existing.pid !== entry.pid);
|
|
61
101
|
withoutSelf.push(full);
|
|
62
102
|
writeRegistry(withoutSelf);
|
|
63
103
|
return full;
|
|
64
104
|
}
|
|
65
|
-
function
|
|
105
|
+
function updateChildPids(pid, childPids) {
|
|
66
106
|
const live = pruneDead(readRegistry());
|
|
67
|
-
const
|
|
68
|
-
if (
|
|
107
|
+
const entry = live.find((existing) => existing.pid === pid);
|
|
108
|
+
if (!entry) return;
|
|
109
|
+
entry.childPids = childPids;
|
|
110
|
+
writeRegistry(live);
|
|
111
|
+
}
|
|
112
|
+
function unregisterPid(pid) {
|
|
113
|
+
const entries = readRegistry();
|
|
114
|
+
const next = pruneDead(entries).filter((entry) => entry.pid !== pid);
|
|
115
|
+
if (next.length === entries.length) return;
|
|
69
116
|
writeRegistry(next);
|
|
70
117
|
}
|
|
71
118
|
function getRegistryPath() {
|
|
72
119
|
return process.env.BO_PID_REGISTRY_PATH ?? (0, node_path.join)(getRegistryDir(), "pids.json");
|
|
73
120
|
}
|
|
74
121
|
function claimedPorts() {
|
|
122
|
+
return new Set(claimedPortOwners().keys());
|
|
123
|
+
}
|
|
124
|
+
/** Port → the live registry entry claiming it, for occupancy diagnostics. */
|
|
125
|
+
function claimedPortOwners() {
|
|
75
126
|
const live = pruneDead(readRegistry());
|
|
76
|
-
const out = /* @__PURE__ */ new
|
|
77
|
-
for (const entry of live) for (const port of Object.values(entry.ports)) if (typeof port === "number") out.
|
|
127
|
+
const out = /* @__PURE__ */ new Map();
|
|
128
|
+
for (const entry of live) for (const port of Object.values(entry.ports)) if (typeof port === "number") out.set(port, entry);
|
|
78
129
|
return out;
|
|
79
130
|
}
|
|
80
131
|
|
|
81
132
|
//#endregion
|
|
133
|
+
exports.claimedPortOwners = claimedPortOwners;
|
|
82
134
|
exports.claimedPorts = claimedPorts;
|
|
83
135
|
exports.getRegistryPath = getRegistryPath;
|
|
136
|
+
exports.isEntryLive = isEntryLive;
|
|
84
137
|
exports.isPidAlive = isPidAlive;
|
|
138
|
+
exports.processStartTime = processStartTime;
|
|
85
139
|
exports.pruneDead = pruneDead;
|
|
86
140
|
exports.pruneDeadEffect = pruneDeadEffect;
|
|
87
141
|
exports.readRegistry = readRegistry;
|
|
88
142
|
exports.registerStandalone = registerStandalone;
|
|
89
143
|
exports.unregisterPid = unregisterPid;
|
|
144
|
+
exports.updateChildPids = updateChildPids;
|
|
90
145
|
exports.writeRegistry = writeRegistry;
|
|
91
146
|
//# sourceMappingURL=process-registry.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-registry.cjs","names":["Effect"],"sources":["../src/process-registry.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { Effect } from \"effect\";\n\nexport type ProcessRole = \"standalone\" | \"workspace-parent\" | \"workspace-child\";\n\nexport interface PidEntry {\n pid: number;\n configDir: string;\n parentPid?: number;\n role: ProcessRole;\n ports: Record<string, number>;\n budget?: { min: number; max: number };\n startedAt: number;\n description: string;\n}\n\nfunction getRegistryDir(): string {\n return join(homedir(), \".cache\", \"everything-dev\");\n}\n\nfunction ensureRegistryDir(): void {\n const path = getRegistryPath();\n const dir = join(path, \"..\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function readRegistry(): PidEntry[] {\n const path = getRegistryPath();\n if (!existsSync(path)) return [];\n try {\n const raw = JSON.parse(readFileSync(path, \"utf-8\"));\n if (!Array.isArray(raw)) return [];\n return raw.filter(\n (entry): entry is PidEntry =>\n entry &&\n typeof entry === \"object\" &&\n typeof entry.pid === \"number\" &&\n typeof entry.configDir === \"string\" &&\n typeof entry.role === \"string\",\n );\n } catch {\n return [];\n }\n}\n\nexport function isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code !== \"ESRCH\";\n }\n}\n\nexport function
|
|
1
|
+
{"version":3,"file":"process-registry.cjs","names":["join","homedir","existsSync","readFileSync","spawnSync","Effect","access"],"sources":["../src/process-registry.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { Effect } from \"effect\";\n\nexport type ProcessRole = \"standalone\" | \"workspace-parent\" | \"workspace-child\";\n\nexport interface PidEntry {\n pid: number;\n configDir: string;\n parentPid?: number;\n role: ProcessRole;\n ports: Record<string, number>;\n childPids?: number[];\n budget?: { min: number; max: number };\n // Lease seam (ADR 0012 §6): entries are leases on shared resources, keyed\n // by what they hold; refcount-ready for the shared-plugin broker.\n leaseKey?: string;\n refcount?: number;\n startedAt: number;\n // Identity of the claimed pid captured at registration time (ADR 0012\n // amendment): PIDs are reused across container restarts, so a bare pid\n // cannot prove a claim live. `processStartTime` is stable per process\n // generation — a mismatch proves the recorded session is dead.\n processStart?: string;\n description: string;\n}\n\nfunction getRegistryDir(): string {\n return join(homedir(), \".cache\", \"everything-dev\");\n}\n\nfunction ensureRegistryDir(): void {\n const path = getRegistryPath();\n const dir = join(path, \"..\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function readRegistry(): PidEntry[] {\n const path = getRegistryPath();\n if (!existsSync(path)) return [];\n try {\n const raw = JSON.parse(readFileSync(path, \"utf-8\"));\n if (!Array.isArray(raw)) return [];\n return raw.filter(\n (entry): entry is PidEntry =>\n entry &&\n typeof entry === \"object\" &&\n typeof entry.pid === \"number\" &&\n typeof entry.configDir === \"string\" &&\n typeof entry.role === \"string\",\n );\n } catch {\n return [];\n }\n}\n\nexport function isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code !== \"ESRCH\";\n }\n}\n\n/**\n * Identity of a process generation, stable across PID reuse: Linux reads the\n * kernel's starttime tick from /proc, macOS falls back to `ps -o lstart=`.\n * Null when the generation cannot be determined (the caller then treats the\n * claim as unverifiable and keeps legacy behavior).\n */\nexport function processStartTime(pid: number): string | null {\n if (pid <= 1) return null;\n try {\n const stat = readFileSync(`/proc/${pid}/stat`, \"utf-8\");\n const close = stat.lastIndexOf(\")\");\n const fields = stat.slice(close + 2).split(\" \");\n const starttime = fields[19];\n return starttime ? `proc:${starttime}` : null;\n } catch {\n try {\n const out = spawnSync(\"ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], { timeout: 5000 });\n const text = out.stdout?.toString().trim();\n return text ? `ps:${text}` : null;\n } catch {\n return null;\n }\n }\n}\n\nexport function isEntryLive(entry: PidEntry): boolean {\n if (entry.pid <= 1) return false;\n if (!existsSync(entry.configDir)) return false;\n if (!isPidAlive(entry.pid)) return false;\n if (entry.processStart !== undefined) {\n return processStartTime(entry.pid) === entry.processStart;\n }\n return true;\n}\n\nexport function pruneDead(entries: PidEntry[]): PidEntry[] {\n return entries.filter(isEntryLive);\n}\n\nexport function pruneDeadEffect(entries: PidEntry[]): Effect.Effect<PidEntry[]> {\n return Effect.forEach(\n entries,\n (entry) => {\n if (entry.pid <= 1) return Effect.succeed(null);\n return Effect.gen(function* () {\n const dirExists = yield* Effect.promise(() =>\n access(entry.configDir)\n .then(() => true)\n .catch(() => false),\n );\n if (!dirExists) return null;\n if (!isPidAlive(entry.pid)) return null;\n if (entry.processStart !== undefined) {\n const current = yield* Effect.promise(() => Promise.resolve(processStartTime(entry.pid)));\n if (current !== entry.processStart) return null;\n }\n return entry;\n });\n },\n { concurrency: \"unbounded\" },\n ).pipe(Effect.map((results) => results.filter((e): e is PidEntry => e !== null)));\n}\n\nexport function writeRegistry(entries: PidEntry[]): void {\n ensureRegistryDir();\n const path = getRegistryPath();\n const tmpPath = `${path}.tmp`;\n writeFileSync(tmpPath, `${JSON.stringify(entries, null, 2)}\\n`);\n renameSync(tmpPath, path);\n}\n\nexport function registerStandalone(entry: Omit<PidEntry, \"role\">): PidEntry {\n const live = pruneDead(readRegistry());\n const full: PidEntry = {\n ...entry,\n role: \"standalone\",\n processStart: processStartTime(entry.pid) ?? entry.processStart,\n };\n const withoutSelf = live.filter((existing) => existing.pid !== entry.pid);\n withoutSelf.push(full);\n writeRegistry(withoutSelf);\n return full;\n}\n\nexport function registerEntry(entry: PidEntry): void {\n const live = pruneDead(readRegistry());\n const withoutSelf = live.filter((existing) => existing.pid !== entry.pid);\n withoutSelf.push({\n ...entry,\n processStart: processStartTime(entry.pid) ?? entry.processStart,\n });\n writeRegistry(withoutSelf);\n}\n\nexport function updateChildPids(pid: number, childPids: number[]): void {\n const live = pruneDead(readRegistry());\n const entry = live.find((existing) => existing.pid === pid);\n if (!entry) return;\n entry.childPids = childPids;\n writeRegistry(live);\n}\n\nexport function unregisterPid(pid: number): void {\n const entries = readRegistry();\n const next = pruneDead(entries).filter((entry) => entry.pid !== pid);\n if (next.length === entries.length) return;\n writeRegistry(next);\n}\n\nexport function removeRegistryFile(): void {\n const path = getRegistryPath();\n if (existsSync(path)) {\n rmSync(path, { force: true });\n }\n}\n\nexport function getRegistryPath(): string {\n return process.env.BO_PID_REGISTRY_PATH ?? join(getRegistryDir(), \"pids.json\");\n}\n\nexport function claimedPorts(): Set<number> {\n const out = new Set<number>(claimedPortOwners().keys());\n return out;\n}\n\n/** Port → the live registry entry claiming it, for occupancy diagnostics. */\nexport function claimedPortOwners(): Map<number, PidEntry> {\n const live = pruneDead(readRegistry());\n const out = new Map<number, PidEntry>();\n for (const entry of live) {\n for (const port of Object.values(entry.ports)) {\n if (typeof port === \"number\") out.set(port, entry);\n }\n }\n return out;\n}\n"],"mappings":"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"}
|