@treeseed/sdk 0.10.28 → 0.12.4
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 +213 -7
- package/dist/agent-capacity.d.ts +916 -0
- package/dist/agent-capacity.js +1600 -0
- package/dist/agent-tools.d.ts +37 -0
- package/dist/agent-tools.js +301 -0
- package/dist/api/app.d.ts +1 -1
- package/dist/api/auth/d1-database.d.ts +2 -2
- package/dist/api/auth/d1-provider.d.ts +4 -4
- package/dist/api/auth/d1-store.d.ts +2 -2
- package/dist/api/auth/memory-provider.d.ts +1 -1
- package/dist/api/auth/tokens.d.ts +1 -1
- package/dist/api/config.d.ts +3 -1
- package/dist/api/config.js +34 -10
- package/dist/api/http.d.ts +2 -2
- package/dist/api/index.d.ts +10 -10
- package/dist/api/index.js +4 -2
- package/dist/api/operations-routes.d.ts +3 -3
- package/dist/api/operations.d.ts +1 -1
- package/dist/api/providers.d.ts +1 -1
- package/dist/api/providers.js +21 -4
- package/dist/api/railway.d.ts +3 -2
- package/dist/api/sdk-dispatch.d.ts +4 -4
- package/dist/api/sdk-routes.d.ts +2 -2
- package/dist/api/templates.d.ts +2 -2
- package/dist/api/types.d.ts +3 -2
- package/dist/capacity-provider.d.ts +118 -59
- package/dist/capacity-provider.js +235 -43
- package/dist/capacity.d.ts +2 -2
- package/dist/cli-tools.d.ts +1 -1
- package/dist/content-operations.d.ts +97 -0
- package/dist/content-operations.js +250 -0
- package/dist/content-store.d.ts +4 -4
- package/dist/control-plane-client.d.ts +13 -18
- package/dist/control-plane-client.js +8 -86
- package/dist/control-plane.d.ts +3 -2
- package/dist/control-plane.js +38 -13
- package/dist/copilot.d.ts +3 -0
- package/dist/copilot.js +16 -1
- package/dist/d1-http.d.ts +1 -1
- package/dist/d1-store.d.ts +32 -57
- package/dist/d1-store.js +115 -318
- package/dist/db/d1.d.ts +1 -232
- package/dist/db/index.d.ts +3 -3
- package/dist/db/market-schema.d.ts +50900 -11018
- package/dist/db/market-schema.js +2313 -467
- package/dist/db/node-sqlite.d.ts +1 -232
- package/dist/db/node-sqlite.js +7 -2
- package/dist/db/schema.d.ts +0 -462
- package/dist/db/schema.js +2 -22
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.js +0 -11
- package/dist/fixture-support.js +52 -4
- package/dist/governance.d.ts +133 -0
- package/dist/governance.js +285 -0
- package/dist/graph/build.d.ts +2 -2
- package/dist/graph/context-query-contracts.d.ts +1 -1
- package/dist/graph/dsl.d.ts +1 -1
- package/dist/graph/query.d.ts +4 -4
- package/dist/graph/ranking.d.ts +1 -1
- package/dist/graph/schema.d.ts +1 -1
- package/dist/graph.d.ts +11 -11
- package/dist/guarantees/index.d.ts +425 -0
- package/dist/guarantees/index.js +1146 -0
- package/dist/hosting/apps.d.ts +12 -0
- package/dist/hosting/apps.js +107 -0
- package/dist/hosting/builtins.d.ts +25 -0
- package/dist/hosting/builtins.js +602 -0
- package/dist/hosting/contracts.d.ts +208 -0
- package/dist/hosting/contracts.js +0 -0
- package/dist/hosting/graph.d.ts +195 -0
- package/dist/hosting/graph.js +1092 -0
- package/dist/hosting/index.d.ts +4 -0
- package/dist/hosting/index.js +4 -0
- package/dist/index.d.ts +88 -67
- package/dist/index.js +142 -14
- package/dist/local-dev/managed-dev.d.ts +85 -0
- package/dist/local-dev/managed-dev.js +368 -0
- package/dist/managed-dependencies.d.ts +9 -0
- package/dist/managed-dependencies.js +10 -9
- package/dist/market-client.d.ts +327 -9
- package/dist/market-client.js +464 -20
- package/dist/model-registry.d.ts +1 -1
- package/dist/model-registry.js +19 -19
- package/dist/operations/agent-tools.d.ts +2 -11
- package/dist/operations/agent-tools.js +2 -14
- package/dist/operations/providers/default.d.ts +1 -1
- package/dist/operations/providers/default.js +20 -37
- package/dist/operations/repository-operations.d.ts +26 -2
- package/dist/operations/repository-operations.js +159 -1
- package/dist/operations/runtime.d.ts +3 -3
- package/dist/operations/services/bootstrap-runner.d.ts +4 -2
- package/dist/operations/services/bootstrap-runner.js +22 -2
- package/dist/operations/services/build-warning-policy.d.ts +34 -0
- package/dist/operations/services/build-warning-policy.js +81 -82
- package/dist/operations/services/commit-message-provider.js +4 -4
- package/dist/operations/services/config-runtime.d.ts +83 -24
- package/dist/operations/services/config-runtime.js +449 -130
- package/dist/operations/services/deploy.d.ts +106 -624
- package/dist/operations/services/deploy.js +746 -263
- package/dist/operations/services/deployment-readiness.d.ts +30 -0
- package/dist/operations/services/deployment-readiness.js +206 -0
- package/dist/operations/services/git-remote-policy.js +12 -4
- package/dist/operations/services/git-runner.d.ts +66 -0
- package/dist/operations/services/git-runner.js +479 -0
- package/dist/operations/services/git-workflow.d.ts +45 -6
- package/dist/operations/services/git-workflow.js +251 -23
- package/dist/operations/services/github-actions-verification.d.ts +4 -1
- package/dist/operations/services/github-actions-verification.js +12 -3
- package/dist/operations/services/github-api.js +22 -6
- package/dist/operations/services/github-automation.d.ts +4 -4
- package/dist/operations/services/github-automation.js +19 -21
- package/dist/operations/services/github-credentials.d.ts +13 -0
- package/dist/operations/services/github-credentials.js +59 -0
- package/dist/operations/services/hosted-service-checks.d.ts +81 -0
- package/dist/operations/services/hosted-service-checks.js +478 -0
- package/dist/operations/services/hosting-audit.d.ts +2 -2
- package/dist/operations/services/hosting-audit.js +7 -7
- package/dist/operations/services/hub-launch.d.ts +1 -1
- package/dist/operations/services/hub-provider-launch.d.ts +5 -5
- package/dist/operations/services/hub-provider-launch.js +22 -17
- package/dist/operations/services/live-hosted-service-checks.d.ts +26 -0
- package/dist/operations/services/live-hosted-service-checks.js +463 -0
- package/dist/operations/services/local-dev.js +0 -1
- package/dist/operations/services/managed-host-security.d.ts +1 -1
- package/dist/operations/services/managed-host-security.js +1 -1
- package/dist/operations/services/managed-repositories.d.ts +37 -0
- package/dist/operations/services/managed-repositories.js +177 -0
- package/dist/operations/services/operations-runner-smoke.d.ts +31 -0
- package/dist/operations/services/operations-runner-smoke.js +198 -0
- package/dist/operations/services/package-adapters.d.ts +170 -0
- package/dist/operations/services/package-adapters.js +859 -0
- package/dist/operations/services/package-reference-policy.d.ts +13 -88
- package/dist/operations/services/package-reference-policy.js +96 -215
- package/dist/operations/services/project-host-operations.d.ts +4 -4
- package/dist/operations/services/project-platform.d.ts +57 -173
- package/dist/operations/services/project-platform.js +80 -111
- package/dist/operations/services/project-web-monitor.d.ts +2 -2
- package/dist/operations/services/project-web-monitor.js +122 -5
- package/dist/operations/services/railway-api.d.ts +117 -5
- package/dist/operations/services/railway-api.js +915 -93
- package/dist/operations/services/railway-deploy.d.ts +30 -112
- package/dist/operations/services/railway-deploy.js +521 -961
- package/dist/operations/services/release-history.js +3 -4
- package/dist/operations/services/release-proof-ledger.d.ts +13 -0
- package/dist/operations/services/release-proof-ledger.js +81 -0
- package/dist/operations/services/release-proof-planner.d.ts +48 -0
- package/dist/operations/services/release-proof-planner.js +195 -0
- package/dist/operations/services/release-proof-runner.d.ts +16 -0
- package/dist/operations/services/release-proof-runner.js +169 -0
- package/dist/operations/services/release-proof.d.ts +81 -0
- package/dist/operations/services/release-proof.js +79 -0
- package/dist/operations/services/repository-save-orchestrator.d.ts +8 -7
- package/dist/operations/services/repository-save-orchestrator.js +604 -212
- package/dist/operations/services/runtime-paths.d.ts +1 -3
- package/dist/operations/services/runtime-paths.js +0 -4
- package/dist/operations/services/runtime-tools.d.ts +1 -191
- package/dist/operations/services/runtime-tools.js +4 -443
- package/dist/operations/services/save-deploy-preflight.js +9 -1
- package/dist/operations/services/template-host-bindings.d.ts +2 -2
- package/dist/operations/services/template-host-bindings.js +3 -2
- package/dist/operations/services/template-registry.d.ts +6 -6
- package/dist/operations/services/template-registry.js +33 -14
- package/dist/operations/services/template-secret-sync.d.ts +3 -3
- package/dist/operations/services/verification-cache.d.ts +25 -0
- package/dist/operations/services/verification-cache.js +71 -0
- package/dist/operations/services/workflow-timing.d.ts +25 -0
- package/dist/operations/services/workflow-timing.js +79 -0
- package/dist/operations/services/workspace-dependency-mode.js +50 -5
- package/dist/operations/services/workspace-preflight.js +8 -8
- package/dist/operations/services/workspace-save-script.d.ts +4 -4
- package/dist/operations/services/workspace-save.d.ts +1 -0
- package/dist/operations/services/workspace-save.js +42 -19
- package/dist/operations/services/workspace-tools.js +42 -7
- package/dist/operations-registry.d.ts +1 -1
- package/dist/operations-registry.js +5 -6
- package/dist/operations-types.d.ts +1 -1
- package/dist/operations.d.ts +17 -11
- package/dist/operations.js +57 -3
- package/dist/platform/book-export.js +2 -0
- package/dist/platform/books-data.d.ts +1 -1
- package/dist/platform/config.d.ts +27 -0
- package/dist/platform/config.js +100 -0
- package/dist/platform/content-runtime-source.d.ts +54 -0
- package/dist/platform/content-runtime-source.js +169 -0
- package/dist/platform/contracts.d.ts +38 -2
- package/dist/platform/deploy-config.d.ts +1 -1
- package/dist/platform/deploy-config.js +80 -9
- package/dist/platform/deploy-runtime.d.ts +1 -1
- package/dist/platform/desired-state.d.ts +63 -0
- package/dist/platform/desired-state.js +1021 -0
- package/dist/platform/env.yaml +568 -45
- package/dist/platform/environment.d.ts +3 -2
- package/dist/platform/environment.js +122 -21
- package/dist/platform/local-content-materialization.d.ts +9 -0
- package/dist/platform/local-content-materialization.js +212 -0
- package/dist/platform/plugin.d.ts +13 -4
- package/dist/platform/plugins/runtime.d.ts +3 -3
- package/dist/platform/plugins/runtime.js +62 -1
- package/dist/platform/plugins.d.ts +6 -6
- package/dist/platform/published-content-pipeline.d.ts +3 -3
- package/dist/platform/published-content-pipeline.js +5 -1
- package/dist/platform/published-content.d.ts +4 -3
- package/dist/platform/site-config-schema.d.ts +1 -0
- package/dist/platform/site-config-schema.js +4 -1
- package/dist/platform/tenant/runtime-config.d.ts +152 -2
- package/dist/platform/tenant-config.d.ts +1 -1
- package/dist/platform/utils/site-config-schema.d.ts +154 -0
- package/dist/platform/utils/site-config-schema.js +400 -461
- package/dist/platform-operation-store.d.ts +1 -1
- package/dist/platform-operation-store.js +2 -2
- package/dist/platform-operations.js +1 -1
- package/dist/plugin-default.d.ts +1 -1
- package/dist/plugin-default.js +27 -12
- package/dist/project-import.d.ts +91 -0
- package/dist/project-import.js +257 -0
- package/dist/project-workflow.d.ts +1 -1
- package/dist/reconcile/bootstrap-systems.d.ts +2 -2
- package/dist/reconcile/bootstrap-systems.js +5 -5
- package/dist/reconcile/builtin-adapters.d.ts +7 -1
- package/dist/reconcile/builtin-adapters.js +3190 -429
- package/dist/reconcile/contracts.d.ts +23 -6
- package/dist/reconcile/desired-state.d.ts +2 -192
- package/dist/reconcile/desired-state.js +29 -38
- package/dist/reconcile/engine.d.ts +61 -395
- package/dist/reconcile/engine.js +229 -44
- package/dist/reconcile/index.d.ts +10 -8
- package/dist/reconcile/index.js +2 -0
- package/dist/reconcile/live-acceptance.d.ts +100 -0
- package/dist/reconcile/live-acceptance.js +2027 -0
- package/dist/reconcile/platform.d.ts +104 -0
- package/dist/reconcile/platform.js +100 -0
- package/dist/reconcile/providers/docker-private.d.ts +54 -0
- package/dist/reconcile/providers/docker-private.js +101 -0
- package/dist/reconcile/providers/github-private.d.ts +65 -0
- package/dist/reconcile/providers/github-private.js +119 -0
- package/dist/reconcile/providers/local-private.d.ts +28 -0
- package/dist/reconcile/providers/local-private.js +75 -0
- package/dist/reconcile/providers/railway-iac.d.ts +66 -0
- package/dist/reconcile/providers/railway-iac.js +275 -0
- package/dist/reconcile/providers/release-private.d.ts +92 -0
- package/dist/reconcile/providers/release-private.js +152 -0
- package/dist/reconcile/registry.d.ts +2 -2
- package/dist/reconcile/registry.js +16 -1
- package/dist/reconcile/state.d.ts +1 -1
- package/dist/reconcile/state.js +7 -44
- package/dist/reconcile/units.d.ts +1 -1
- package/dist/reconcile/units.js +9 -3
- package/dist/remote.d.ts +6 -6
- package/dist/scenes/artifacts.d.ts +16 -0
- package/dist/scenes/artifacts.js +61 -0
- package/dist/scenes/auth.d.ts +2 -0
- package/dist/scenes/auth.js +28 -0
- package/dist/scenes/base-url.d.ts +12 -0
- package/dist/scenes/base-url.js +123 -0
- package/dist/scenes/builtin-plugins.d.ts +2 -0
- package/dist/scenes/builtin-plugins.js +447 -0
- package/dist/scenes/checkpoints.d.ts +14 -0
- package/dist/scenes/checkpoints.js +33 -0
- package/dist/scenes/device-matrix.d.ts +2 -0
- package/dist/scenes/device-matrix.js +97 -0
- package/dist/scenes/devices.d.ts +11 -0
- package/dist/scenes/devices.js +22 -0
- package/dist/scenes/diagnostics.d.ts +5 -0
- package/dist/scenes/diagnostics.js +22 -0
- package/dist/scenes/diagram-providers.d.ts +2 -0
- package/dist/scenes/diagram-providers.js +181 -0
- package/dist/scenes/diagram-validation.d.ts +22 -0
- package/dist/scenes/diagram-validation.js +74 -0
- package/dist/scenes/environment.d.ts +2 -0
- package/dist/scenes/environment.js +65 -0
- package/dist/scenes/evidence-bundle.d.ts +5 -0
- package/dist/scenes/evidence-bundle.js +42 -0
- package/dist/scenes/evidence-report.d.ts +10 -0
- package/dist/scenes/evidence-report.js +73 -0
- package/dist/scenes/evidence.d.ts +16 -0
- package/dist/scenes/evidence.js +277 -0
- package/dist/scenes/index.d.ts +48 -0
- package/dist/scenes/index.js +312 -0
- package/dist/scenes/inspect.d.ts +9 -0
- package/dist/scenes/inspect.js +64 -0
- package/dist/scenes/loader.d.ts +3 -0
- package/dist/scenes/loader.js +38 -0
- package/dist/scenes/logs.d.ts +2 -0
- package/dist/scenes/logs.js +47 -0
- package/dist/scenes/operations.d.ts +3 -0
- package/dist/scenes/operations.js +128 -0
- package/dist/scenes/phase0.d.ts +9 -0
- package/dist/scenes/phase0.js +637 -0
- package/dist/scenes/planner.d.ts +12 -0
- package/dist/scenes/planner.js +166 -0
- package/dist/scenes/playwright-adapter.d.ts +2 -0
- package/dist/scenes/playwright-adapter.js +63 -0
- package/dist/scenes/plugins.d.ts +5 -0
- package/dist/scenes/plugins.js +115 -0
- package/dist/scenes/progress.d.ts +17 -0
- package/dist/scenes/progress.js +24 -0
- package/dist/scenes/publish-destinations.d.ts +12 -0
- package/dist/scenes/publish-destinations.js +99 -0
- package/dist/scenes/publish-plan-report.d.ts +10 -0
- package/dist/scenes/publish-plan-report.js +70 -0
- package/dist/scenes/publish-plan.d.ts +15 -0
- package/dist/scenes/publish-plan.js +248 -0
- package/dist/scenes/publish-redaction.d.ts +16 -0
- package/dist/scenes/publish-redaction.js +148 -0
- package/dist/scenes/publish-release-record.d.ts +13 -0
- package/dist/scenes/publish-release-record.js +34 -0
- package/dist/scenes/publish-report.d.ts +10 -0
- package/dist/scenes/publish-report.js +67 -0
- package/dist/scenes/publish.d.ts +16 -0
- package/dist/scenes/publish.js +298 -0
- package/dist/scenes/registry.d.ts +12 -0
- package/dist/scenes/registry.js +65 -0
- package/dist/scenes/remotion-adapter.d.ts +3 -0
- package/dist/scenes/remotion-adapter.js +94 -0
- package/dist/scenes/remotion-composition-registry.d.ts +2 -0
- package/dist/scenes/remotion-composition-registry.js +12 -0
- package/dist/scenes/remotion-compositions.d.ts +15 -0
- package/dist/scenes/remotion-compositions.js +464 -0
- package/dist/scenes/remotion-diagrams.d.ts +9 -0
- package/dist/scenes/remotion-diagrams.js +188 -0
- package/dist/scenes/remotion-input.d.ts +13 -0
- package/dist/scenes/remotion-input.js +291 -0
- package/dist/scenes/remotion-visuals.d.ts +29 -0
- package/dist/scenes/remotion-visuals.js +198 -0
- package/dist/scenes/render-media-assets.d.ts +9 -0
- package/dist/scenes/render-media-assets.js +117 -0
- package/dist/scenes/render-report.d.ts +10 -0
- package/dist/scenes/render-report.js +27 -0
- package/dist/scenes/render.d.ts +2 -0
- package/dist/scenes/render.js +218 -0
- package/dist/scenes/reporter.d.ts +3 -0
- package/dist/scenes/reporter.js +101 -0
- package/dist/scenes/resume.d.ts +2 -0
- package/dist/scenes/resume.js +79 -0
- package/dist/scenes/runner.d.ts +2 -0
- package/dist/scenes/runner.js +674 -0
- package/dist/scenes/schema.d.ts +6 -0
- package/dist/scenes/schema.js +994 -0
- package/dist/scenes/seed.d.ts +2 -0
- package/dist/scenes/seed.js +83 -0
- package/dist/scenes/segments.d.ts +15 -0
- package/dist/scenes/segments.js +79 -0
- package/dist/scenes/selectors.d.ts +3 -0
- package/dist/scenes/selectors.js +21 -0
- package/dist/scenes/timeline.d.ts +11 -0
- package/dist/scenes/timeline.js +26 -0
- package/dist/scenes/timeouts.d.ts +6 -0
- package/dist/scenes/timeouts.js +17 -0
- package/dist/scenes/training-captions.d.ts +14 -0
- package/dist/scenes/training-captions.js +98 -0
- package/dist/scenes/training-report.d.ts +10 -0
- package/dist/scenes/training-report.js +78 -0
- package/dist/scenes/training-transcript.d.ts +24 -0
- package/dist/scenes/training-transcript.js +204 -0
- package/dist/scenes/training.d.ts +10 -0
- package/dist/scenes/training.js +134 -0
- package/dist/scenes/types.d.ts +1872 -0
- package/dist/scenes/types.js +8 -0
- package/dist/scenes/visual-audit-contact-sheets.d.ts +6 -0
- package/dist/scenes/visual-audit-contact-sheets.js +119 -0
- package/dist/scenes/visual-audit-fixtures.d.ts +25 -0
- package/dist/scenes/visual-audit-fixtures.js +210 -0
- package/dist/scenes/visual-audit-report.d.ts +11 -0
- package/dist/scenes/visual-audit-report.js +85 -0
- package/dist/scenes/visual-audit-review.d.ts +23 -0
- package/dist/scenes/visual-audit-review.js +829 -0
- package/dist/scenes/visual-audit-routes.d.ts +13 -0
- package/dist/scenes/visual-audit-routes.js +308 -0
- package/dist/scenes/visual-audit.d.ts +3 -0
- package/dist/scenes/visual-audit.js +596 -0
- package/dist/scripts/build-dist.js +154 -40
- package/dist/scripts/check-build-warnings.js +42 -53
- package/dist/scripts/cleanup-markdown.js +1 -1
- package/dist/scripts/cli-test-fixtures.js +24 -28
- package/dist/scripts/deployment-readiness.js +20 -0
- package/dist/scripts/generate-treedx-openapi-types.js +186 -0
- package/dist/scripts/migrate-journey-csv-to-guarantees.js +140 -0
- package/dist/scripts/operations-runner-smoke.js +16 -0
- package/dist/scripts/package-tools.js +12 -1
- package/dist/scripts/prepare.js +3 -7
- package/dist/scripts/release-verify.js +6 -6
- package/dist/scripts/run-fixture-astro-command.js +1 -1
- package/dist/scripts/template-catalog.test.js +68 -82
- package/dist/scripts/tenant-dev.js +0 -10
- package/dist/scripts/tenant-workflow-action.js +10 -1
- package/dist/scripts/test-cloudflare-local.js +1 -1
- package/dist/scripts/test-scaffold.js +0 -1
- package/dist/scripts/test-smoke.js +3 -3
- package/dist/scripts/treeseed-build-dist.js +4 -7
- package/dist/scripts/treeseed-release-verify.js +1 -1
- package/dist/scripts/verify-driver.js +30 -21
- package/dist/scripts/workflow-commands.test.js +18 -27
- package/dist/scripts/workspace-command-e2e.js +1 -1
- package/dist/scripts/workspace-lint.js +6 -0
- package/dist/scripts/workspace-release-test.js +90 -1
- package/dist/scripts/workspace-test.js +6 -0
- package/dist/sdk-dispatch.d.ts +1 -1
- package/dist/sdk-dispatch.js +0 -16
- package/dist/sdk-fields.d.ts +1 -1
- package/dist/sdk-filters.d.ts +1 -1
- package/dist/sdk-types.d.ts +1352 -116
- package/dist/sdk-types.js +413 -2
- package/dist/sdk.d.ts +106 -100
- package/dist/sdk.js +211 -51
- package/dist/secrets-capability.d.ts +421 -0
- package/dist/secrets-capability.js +530 -0
- package/dist/seeds/normalize.js +1 -0
- package/dist/seeds/planner.js +38 -0
- package/dist/seeds/schema.js +293 -4
- package/dist/seeds/types.d.ts +60 -0
- package/dist/seeds/types.js +9 -1
- package/dist/service-credentials.d.ts +54 -0
- package/dist/service-credentials.js +112 -0
- package/dist/stores/cursor-store.d.ts +2 -2
- package/dist/stores/envelopes.d.ts +1 -1
- package/dist/stores/helpers.d.ts +1 -1
- package/dist/stores/lease-store.d.ts +2 -2
- package/dist/stores/message-store.d.ts +2 -2
- package/dist/stores/operational-store.d.ts +3 -26
- package/dist/stores/operational-store.js +0 -225
- package/dist/stores/project-workflow-store.d.ts +2 -2
- package/dist/stores/run-store.d.ts +2 -3
- package/dist/stores/run-store.js +0 -98
- package/dist/stores/subscription-store.d.ts +2 -3
- package/dist/stores/subscription-store.js +0 -100
- package/dist/template-catalog.d.ts +1 -1
- package/dist/template-launch-requirements.d.ts +2 -2
- package/dist/template-launch-requirements.js +9 -0
- package/dist/template-launch-ui.d.ts +2 -2
- package/dist/treedx/adapters.d.ts +6 -0
- package/dist/treedx/adapters.js +36 -0
- package/dist/treedx/client.d.ts +222 -0
- package/dist/treedx/client.js +871 -0
- package/dist/treedx/errors.d.ts +13 -0
- package/dist/treedx/errors.js +17 -0
- package/dist/treedx/federated-client.d.ts +27 -0
- package/dist/treedx/federated-client.js +158 -0
- package/dist/treedx/generated/openapi-types.d.ts +3558 -0
- package/dist/treedx/generated/openapi-types.js +0 -0
- package/dist/treedx/graph-adapter.d.ts +33 -0
- package/dist/treedx/graph-adapter.js +156 -0
- package/dist/treedx/index.d.ts +14 -0
- package/dist/treedx/index.js +48 -0
- package/dist/treedx/market-integration.d.ts +27 -0
- package/dist/treedx/market-integration.js +131 -0
- package/dist/treedx/ports.d.ts +166 -0
- package/dist/treedx/ports.js +231 -0
- package/dist/treedx/query-adapter.d.ts +19 -0
- package/dist/treedx/query-adapter.js +62 -0
- package/dist/treedx/registry-client.d.ts +11 -0
- package/dist/treedx/registry-client.js +19 -0
- package/dist/treedx/repository-adapter.d.ts +45 -0
- package/dist/treedx/repository-adapter.js +319 -0
- package/dist/treedx/sdk-integration.d.ts +27 -0
- package/dist/treedx/sdk-integration.js +63 -0
- package/dist/treedx/types.d.ts +1084 -0
- package/dist/treedx/types.js +8 -0
- package/dist/treedx/workspace-adapter.d.ts +27 -0
- package/dist/treedx/workspace-adapter.js +65 -0
- package/dist/treedx-backends.d.ts +220 -0
- package/dist/treedx-backends.js +634 -0
- package/dist/treedx-client.d.ts +89 -0
- package/dist/treedx-client.js +184 -0
- package/dist/treeseed/services/compose.yml +2 -3
- package/dist/treeseed/template-catalog/catalog.fixture.json +27 -27
- package/dist/types/agents.d.ts +256 -0
- package/dist/types/agents.js +42 -1
- package/dist/verification.d.ts +1 -0
- package/dist/verification.js +143 -14
- package/dist/workflow/operations.d.ts +580 -523
- package/dist/workflow/operations.js +2084 -1279
- package/dist/workflow/policy.js +19 -7
- package/dist/workflow/runs.d.ts +9 -3
- package/dist/workflow/runs.js +66 -26
- package/dist/workflow/session.d.ts +4 -1
- package/dist/workflow/session.js +50 -10
- package/dist/workflow/worktrees.d.ts +6 -2
- package/dist/workflow/worktrees.js +98 -15
- package/dist/workflow-state.d.ts +17 -4
- package/dist/workflow-state.js +68 -41
- package/dist/workflow-support.d.ts +26 -17
- package/dist/workflow-support.js +84 -24
- package/dist/workflow.d.ts +51 -16
- package/dist/workflow.js +19 -7
- package/drizzle/d1/0000_treeseed_d1.sql +0 -18
- package/drizzle/market/0000_market_control_plane.sql +1793 -1499
- package/drizzle/market/0004_treedx_market_integration.sql +99 -0
- package/drizzle/market/0005_agent_capacity_coordination.sql +145 -0
- package/drizzle/market/0006_provider_assignment_lifecycle.sql +9 -0
- package/drizzle/market/0007_agent_architecture_gap_closure.sql +157 -0
- package/drizzle/market/0008_agent_capacity_operational_closure.sql +27 -0
- package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +29 -0
- package/drizzle/market/0010_secrets_capability_persistence.sql +130 -0
- package/drizzle/market/0011_github_app_adapter.sql +47 -0
- package/drizzle/market/0012_workday_test_runs.sql +44 -0
- package/drizzle/market/0013_runtime_task_lifecycle.sql +39 -0
- package/drizzle/market/0014_governance_pipeline.sql +189 -0
- package/package.json +106 -18
- package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
- package/templates/github/deploy-web.workflow.yml +49 -12
- package/dist/operations/services/mailpit-runtime.d.ts +0 -20
- package/dist/operations/services/mailpit-runtime.js +0 -67
- package/dist/operations/services/release-candidate.d.ts +0 -41
- package/dist/operations/services/release-candidate.js +0 -616
- package/dist/scripts/ensure-mailpit.js +0 -48
- package/dist/scripts/logs-mailpit.js +0 -2
- package/dist/scripts/run-ts.js +0 -45
- package/dist/scripts/stop-mailpit.js +0 -5
- package/dist/scripts/treeseed-run-ts.js +0 -45
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import { loadTreeseedPlatformConfig } from "../../platform/config.js";
|
|
2
|
+
import { resolveTreeseedLaunchEnvironment } from "./config-runtime.js";
|
|
3
|
+
import {
|
|
4
|
+
getRailwayServiceInstance,
|
|
5
|
+
inspectRailwayServiceDeploymentHealth,
|
|
6
|
+
listRailwayEnvironments,
|
|
7
|
+
listRailwayProjects,
|
|
8
|
+
listRailwayServices,
|
|
9
|
+
listRailwayVariables,
|
|
10
|
+
listRailwayVolumes,
|
|
11
|
+
normalizeRailwayEnvironmentName,
|
|
12
|
+
resolveRailwayWorkspaceContext
|
|
13
|
+
} from "./railway-api.js";
|
|
14
|
+
import { configuredRailwayServices, findStaleTreeseedOperationsRunnerResources } from "./railway-deploy.js";
|
|
15
|
+
import { discoverTreeseedApplications } from "../../hosting/apps.js";
|
|
16
|
+
import {
|
|
17
|
+
collectTreeseedHostedServiceChecks
|
|
18
|
+
} from "./hosted-service-checks.js";
|
|
19
|
+
const DEFAULT_RETRY_ATTEMPTS = 3;
|
|
20
|
+
const DEFAULT_RETRY_INTERVAL_MS = 1500;
|
|
21
|
+
const DEFAULT_RAILWAY_DEPLOYMENT_SETTLE_ATTEMPTS = 60;
|
|
22
|
+
const DEFAULT_RAILWAY_DEPLOYMENT_SETTLE_INTERVAL_MS = 5e3;
|
|
23
|
+
function sleep(ms) {
|
|
24
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
25
|
+
}
|
|
26
|
+
function liveCheckErrorMessage(error, fallback) {
|
|
27
|
+
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
28
|
+
return message.trim() || fallback;
|
|
29
|
+
}
|
|
30
|
+
function normalizeBaseUrl(value) {
|
|
31
|
+
return typeof value === "string" && value.trim() ? value.trim().replace(/\/+$/u, "") : null;
|
|
32
|
+
}
|
|
33
|
+
function urlForDomain(value) {
|
|
34
|
+
const normalized = normalizeBaseUrl(value);
|
|
35
|
+
if (!normalized) return null;
|
|
36
|
+
return /^https?:\/\//iu.test(normalized) ? normalized : `https://${normalized}`;
|
|
37
|
+
}
|
|
38
|
+
function selectedWebConfig(deployConfig, selectedApplication) {
|
|
39
|
+
return selectedApplication?.roles.includes("web") ? selectedApplication.config : deployConfig;
|
|
40
|
+
}
|
|
41
|
+
function pagesBranchName(config, target) {
|
|
42
|
+
const pages = config.cloudflare?.pages && typeof config.cloudflare.pages === "object" ? config.cloudflare.pages : {};
|
|
43
|
+
const key = target === "prod" ? "productionBranch" : "stagingBranch";
|
|
44
|
+
const fallback = target === "prod" ? "main" : "staging";
|
|
45
|
+
return typeof pages[key] === "string" && pages[key].trim() ? pages[key].trim() : fallback;
|
|
46
|
+
}
|
|
47
|
+
async function observeHttp(url, options) {
|
|
48
|
+
const attempts = Math.max(1, Math.floor(options.retry?.attempts ?? DEFAULT_RETRY_ATTEMPTS));
|
|
49
|
+
const intervalMs = Math.max(0, Math.floor(options.retry?.intervalMs ?? DEFAULT_RETRY_INTERVAL_MS));
|
|
50
|
+
const timeoutMs = Math.max(1e3, Math.floor(options.timeoutMs ?? 1e4));
|
|
51
|
+
let lastError = "";
|
|
52
|
+
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
55
|
+
try {
|
|
56
|
+
const response = await (options.fetchImpl ?? fetch)(url, {
|
|
57
|
+
method: "GET",
|
|
58
|
+
headers: { accept: "application/json, text/plain, */*" },
|
|
59
|
+
signal: controller.signal
|
|
60
|
+
});
|
|
61
|
+
clearTimeout(timeout);
|
|
62
|
+
return { status: response.status, ok: response.ok };
|
|
63
|
+
} catch (error) {
|
|
64
|
+
clearTimeout(timeout);
|
|
65
|
+
lastError = error instanceof Error ? error.message : String(error);
|
|
66
|
+
if (attempt + 1 < attempts) await sleep(intervalMs);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { ok: false, error: lastError || "HTTP request failed." };
|
|
70
|
+
}
|
|
71
|
+
async function inspectRailwayServiceDeploymentHealthWithRetry(input) {
|
|
72
|
+
const attempts = Math.max(1, Math.floor(input.options.retry?.attempts ?? DEFAULT_RAILWAY_DEPLOYMENT_SETTLE_ATTEMPTS));
|
|
73
|
+
const intervalMs = Math.max(0, Math.floor(input.options.retry?.intervalMs ?? DEFAULT_RAILWAY_DEPLOYMENT_SETTLE_INTERVAL_MS));
|
|
74
|
+
let lastDeployment = null;
|
|
75
|
+
let lastError = null;
|
|
76
|
+
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
77
|
+
try {
|
|
78
|
+
const deployment = await inspectRailwayServiceDeploymentHealth({
|
|
79
|
+
serviceId: input.serviceId,
|
|
80
|
+
environmentId: input.environmentId,
|
|
81
|
+
env: input.options.env,
|
|
82
|
+
fetchImpl: input.options.fetchImpl
|
|
83
|
+
});
|
|
84
|
+
lastDeployment = deployment;
|
|
85
|
+
if (deployment.ok) return deployment;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
lastError = error;
|
|
88
|
+
}
|
|
89
|
+
if (attempt + 1 < attempts) await sleep(intervalMs);
|
|
90
|
+
}
|
|
91
|
+
return lastDeployment ?? {
|
|
92
|
+
ok: false,
|
|
93
|
+
status: null,
|
|
94
|
+
message: lastError instanceof Error ? lastError.message : String(lastError ?? "Unable to inspect deployment health.")
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function findByName(items, nameOrId) {
|
|
98
|
+
if (!nameOrId) return null;
|
|
99
|
+
return items.find((item) => item.name === nameOrId || item.id === nameOrId) ?? null;
|
|
100
|
+
}
|
|
101
|
+
function indexedName(baseName, index) {
|
|
102
|
+
return `${baseName.replace(/-\d+$/u, "")}-${String(Math.max(1, index)).padStart(2, "0")}`;
|
|
103
|
+
}
|
|
104
|
+
function isActiveRailwayVolumeInstance(instance) {
|
|
105
|
+
const state = String(instance.state ?? "READY").toUpperCase();
|
|
106
|
+
return instance.isPendingDeletion !== true && !(typeof instance.deletedAt === "string" && instance.deletedAt.trim()) && state !== "DELETING" && state !== "DELETED";
|
|
107
|
+
}
|
|
108
|
+
function activeRailwayVolumeInstances(volume) {
|
|
109
|
+
const instances = Array.isArray(volume.instances) ? volume.instances : [];
|
|
110
|
+
return instances.filter(isActiveRailwayVolumeInstance);
|
|
111
|
+
}
|
|
112
|
+
function railwayVolumeInstanceStates(volume) {
|
|
113
|
+
const states = (Array.isArray(volume.instances) ? volume.instances : []).map((instance) => {
|
|
114
|
+
const state = String(instance.state ?? "READY").trim().toUpperCase();
|
|
115
|
+
return `${state}${instance.isPendingDeletion === true ? ":PENDING_DELETION" : ""}${instance.deletedAt ? `:DELETED_AT=${instance.deletedAt}` : ""}`;
|
|
116
|
+
}).filter(Boolean);
|
|
117
|
+
return states.length > 0 ? [...new Set(states)].join(",") : "none";
|
|
118
|
+
}
|
|
119
|
+
function isRetainedDetachedRailwayVolume(value) {
|
|
120
|
+
return String(value ?? "").trim().startsWith("retained-");
|
|
121
|
+
}
|
|
122
|
+
function selectedServiceKeySet(options) {
|
|
123
|
+
return new Set((options.serviceKeys ?? []).map((key) => key.trim()).filter(Boolean));
|
|
124
|
+
}
|
|
125
|
+
function serviceIsSelected(selected, serviceKey) {
|
|
126
|
+
return selected.size === 0 || selected.has(serviceKey);
|
|
127
|
+
}
|
|
128
|
+
function resolveLiveProviderEnv(options) {
|
|
129
|
+
let launchValues = {};
|
|
130
|
+
try {
|
|
131
|
+
launchValues = resolveTreeseedLaunchEnvironment({
|
|
132
|
+
tenantRoot: options.tenantRoot,
|
|
133
|
+
scope: options.target,
|
|
134
|
+
baseEnv: { ...process.env, ...options.env ?? {} }
|
|
135
|
+
});
|
|
136
|
+
} catch {
|
|
137
|
+
launchValues = {};
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
...process.env,
|
|
141
|
+
...launchValues,
|
|
142
|
+
...options.env ?? {}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
async function collectRailwayObservations(options) {
|
|
146
|
+
const observed = {};
|
|
147
|
+
const issues = [];
|
|
148
|
+
const inspectedVolumeScopes = /* @__PURE__ */ new Set();
|
|
149
|
+
const inspectedRunnerScopes = /* @__PURE__ */ new Set();
|
|
150
|
+
const selectedServiceKeys = selectedServiceKeySet(options);
|
|
151
|
+
try {
|
|
152
|
+
const workspace = await resolveRailwayWorkspaceContext({ env: options.env, fetchImpl: options.fetchImpl });
|
|
153
|
+
const projects = await listRailwayProjects({ workspaceId: workspace.id, env: options.env, fetchImpl: options.fetchImpl });
|
|
154
|
+
const configuredServices = configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId).filter((entry) => serviceIsSelected(selectedServiceKeys, entry.key));
|
|
155
|
+
for (const service of configuredServices) {
|
|
156
|
+
const project = service.projectId ? findByName(projects, service.projectId) : findByName(projects, service.projectName);
|
|
157
|
+
if (!project?.id) {
|
|
158
|
+
issues.push(`${service.serviceName}: Railway project ${service.projectName} was not found.`);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const environments = await listRailwayEnvironments({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl });
|
|
162
|
+
const environment = findByName(environments, service.railwayEnvironment);
|
|
163
|
+
if (!environment?.id) {
|
|
164
|
+
issues.push(`${service.serviceName}: Railway environment ${service.railwayEnvironment} was not found.`);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const volumeScope = `${project.id}:${environment.id}`;
|
|
168
|
+
if (!inspectedVolumeScopes.has(volumeScope)) {
|
|
169
|
+
inspectedVolumeScopes.add(volumeScope);
|
|
170
|
+
const volumes2 = await listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => []);
|
|
171
|
+
for (const volume of volumes2) {
|
|
172
|
+
if (isRetainedDetachedRailwayVolume(volume.name)) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const detachedPostgresInstances = activeRailwayVolumeInstances(volume).filter(
|
|
176
|
+
(instance2) => instance2.environmentId === environment.id && instance2.mountPath === "/var/lib/postgresql/data" && !instance2.serviceId
|
|
177
|
+
);
|
|
178
|
+
if (detachedPostgresInstances.length > 0) {
|
|
179
|
+
issues.push(`${volume.name ?? volume.id}: detached PostgreSQL volume remains in Railway project ${project.name} (states=${railwayVolumeInstanceStates(volume)}).`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const services = await listRailwayServices({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl });
|
|
184
|
+
const runnerScope = `${project.id}:${environment.id}`;
|
|
185
|
+
if (service.key === "operationsRunner" && !inspectedRunnerScopes.has(runnerScope)) {
|
|
186
|
+
inspectedRunnerScopes.add(runnerScope);
|
|
187
|
+
const desiredRunnerNames = new Set(configuredServices.filter((entry) => entry.key === "operationsRunner").filter((entry) => entry.projectId ? entry.projectId === project.id : entry.projectName === project.name).filter((entry) => normalizeRailwayEnvironmentName(entry.railwayEnvironment) === normalizeRailwayEnvironmentName(environment.name)).map((entry) => entry.serviceName).filter(Boolean));
|
|
188
|
+
const desiredRunnerServiceIds = new Set(services.filter((entry) => desiredRunnerNames.has(entry.name)).map((entry) => entry.id));
|
|
189
|
+
for (const staleService of findStaleTreeseedOperationsRunnerResources(services, desiredRunnerNames)) {
|
|
190
|
+
issues.push(`${staleService.name}: stale operations runner Railway service remains in project ${project.name}.`);
|
|
191
|
+
}
|
|
192
|
+
const volumes2 = await listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => []);
|
|
193
|
+
const desiredRunnerVolumeNames = new Set([...desiredRunnerNames].map((name) => `${name}-volume`));
|
|
194
|
+
for (const staleVolume of findStaleTreeseedOperationsRunnerResources(volumes2, desiredRunnerVolumeNames)) {
|
|
195
|
+
const activeInstances = activeRailwayVolumeInstances(staleVolume);
|
|
196
|
+
const relevant = staleVolume.instances.length === 0 || activeInstances.length > 0;
|
|
197
|
+
const attachedToDesiredRunner = activeInstances.some((instance2) => desiredRunnerServiceIds.has(instance2.serviceId ?? ""));
|
|
198
|
+
if (relevant && !attachedToDesiredRunner) {
|
|
199
|
+
issues.push(`${staleVolume.name ?? staleVolume.id}: stale operations runner Railway volume remains in project ${project.name} (states=${railwayVolumeInstanceStates(staleVolume)}).`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const railwayService = service.serviceId ? findByName(services, service.serviceId) : findByName(services, service.serviceName);
|
|
204
|
+
if (!railwayService?.id) {
|
|
205
|
+
issues.push(`${service.serviceName}: Railway service was not found.`);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
const [instance, variables, volumes] = await Promise.all([
|
|
209
|
+
getRailwayServiceInstance({ serviceId: railwayService.id, environmentId: environment.id, env: options.env, fetchImpl: options.fetchImpl }),
|
|
210
|
+
listRailwayVariables({ projectId: project.id, environmentId: environment.id, serviceId: railwayService.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => ({})),
|
|
211
|
+
listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => [])
|
|
212
|
+
]);
|
|
213
|
+
const mountedVolume = Array.isArray(volumes) ? volumes.find((entry) => {
|
|
214
|
+
const instances = Array.isArray(entry.instances) ? entry.instances : Array.isArray(entry.volumeInstances) ? entry.volumeInstances : [];
|
|
215
|
+
return instances.some(
|
|
216
|
+
(instance2) => instance2?.serviceId === railwayService.id && instance2?.environmentId === environment.id && (!service.volumeMountPath || instance2?.mountPath === service.volumeMountPath) && isActiveRailwayVolumeInstance(instance2)
|
|
217
|
+
);
|
|
218
|
+
}) ?? null : null;
|
|
219
|
+
const volumeInstance = mountedVolume ? (Array.isArray(mountedVolume.instances) ? mountedVolume.instances : Array.isArray(mountedVolume.volumeInstances) ? mountedVolume.volumeInstances : []).find(
|
|
220
|
+
(instance2) => instance2?.serviceId === railwayService.id && instance2?.environmentId === environment.id && (!service.volumeMountPath || instance2?.mountPath === service.volumeMountPath) && isActiveRailwayVolumeInstance(instance2)
|
|
221
|
+
) ?? null : null;
|
|
222
|
+
const variableKeys = Object.keys(variables ?? {});
|
|
223
|
+
const deployment = await inspectRailwayServiceDeploymentHealthWithRetry({
|
|
224
|
+
serviceId: railwayService.id,
|
|
225
|
+
environmentId: environment.id,
|
|
226
|
+
options
|
|
227
|
+
}).catch((error) => ({
|
|
228
|
+
ok: false,
|
|
229
|
+
status: null,
|
|
230
|
+
message: error instanceof Error ? error.message : String(error ?? "Unable to inspect Railway deployment health.")
|
|
231
|
+
}));
|
|
232
|
+
if (!deployment.ok) {
|
|
233
|
+
issues.push(`${service.serviceName}: latest Railway deployment is not healthy. ${deployment.message}`);
|
|
234
|
+
}
|
|
235
|
+
if (service.volumeMountPath && !volumeInstance) {
|
|
236
|
+
issues.push(`${service.serviceName}: Railway volume is not mounted at ${service.volumeMountPath}.`);
|
|
237
|
+
}
|
|
238
|
+
observed[service.serviceName] = {
|
|
239
|
+
projectName: project.name,
|
|
240
|
+
environmentName: environment.name,
|
|
241
|
+
serviceName: railwayService.name,
|
|
242
|
+
serviceId: railwayService.id,
|
|
243
|
+
rootDirectory: instance.rootDirectory,
|
|
244
|
+
buildCommand: instance.buildCommand,
|
|
245
|
+
dockerfilePath: instance.dockerfilePath,
|
|
246
|
+
startCommand: instance.startCommand,
|
|
247
|
+
healthcheckPath: instance.healthcheckPath,
|
|
248
|
+
healthcheckTimeoutSeconds: instance.healthcheckTimeoutSeconds,
|
|
249
|
+
runtimeMode: service.runtimeMode ?? instance.runtimeMode,
|
|
250
|
+
deploymentStatus: deployment.status,
|
|
251
|
+
deploymentHealthy: deployment.ok,
|
|
252
|
+
deploymentBranch: deployment.branch ?? null,
|
|
253
|
+
deploymentRepo: deployment.repo ?? null,
|
|
254
|
+
deploymentRootDirectory: deployment.rootDirectory ?? null,
|
|
255
|
+
deploymentCommitHash: deployment.commitHash ?? null,
|
|
256
|
+
deploymentRequiredMountPath: deployment.requiredMountPath ?? null,
|
|
257
|
+
deploymentVolumeMounts: deployment.volumeMounts ?? [],
|
|
258
|
+
volumeName: mountedVolume?.name ?? null,
|
|
259
|
+
volumeId: mountedVolume?.id ?? null,
|
|
260
|
+
volumeMountPath: volumeInstance?.mountPath ?? null,
|
|
261
|
+
volumeServiceId: volumeInstance?.serviceId ?? null,
|
|
262
|
+
volumeEnvironmentId: volumeInstance?.environmentId ?? null,
|
|
263
|
+
volumeState: volumeInstance?.state ?? null,
|
|
264
|
+
volumePendingDeletion: volumeInstance?.isPendingDeletion ?? null,
|
|
265
|
+
volumeDeletedAt: volumeInstance?.deletedAt ?? null,
|
|
266
|
+
variables: variableKeys,
|
|
267
|
+
secrets: variableKeys,
|
|
268
|
+
health: "unknown"
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
if (selectedServiceKeys.size === 0) {
|
|
272
|
+
const deployConfig = loadTreeseedPlatformConfig({ tenantRoot: options.tenantRoot, environment: options.target, env: process.env }).deployConfig;
|
|
273
|
+
const appConfigs = [
|
|
274
|
+
...!options.appId || options.appId === "web" ? [deployConfig] : [],
|
|
275
|
+
...discoverTreeseedApplications(options.tenantRoot).filter((application) => application.id === "api" && (!options.appId || options.appId === "api")).map((application) => application.config)
|
|
276
|
+
];
|
|
277
|
+
for (const config of appConfigs) {
|
|
278
|
+
const nodePool = config.publicTreeDxFederation?.railway?.nodePool;
|
|
279
|
+
if (!nodePool && config.hosting?.kind !== "treeseed_control_plane") continue;
|
|
280
|
+
const bootstrapCount = Math.max(1, Number.parseInt(String(nodePool?.bootstrapCount ?? 1), 10) || 1);
|
|
281
|
+
const projectName = config.slug ?? "treeseed-api";
|
|
282
|
+
const environmentName = normalizeRailwayEnvironmentName(options.target) || options.target;
|
|
283
|
+
const project = findByName(projects, projectName);
|
|
284
|
+
if (!project?.id) {
|
|
285
|
+
issues.push(`public-treedx: Railway project ${projectName} was not found.`);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
const environments = await listRailwayEnvironments({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl });
|
|
289
|
+
const environment = findByName(environments, environmentName);
|
|
290
|
+
if (!environment?.id) {
|
|
291
|
+
issues.push(`public-treedx: Railway environment ${environmentName} was not found.`);
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
const [services, volumes] = await Promise.all([
|
|
295
|
+
listRailwayServices({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }),
|
|
296
|
+
listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => [])
|
|
297
|
+
]);
|
|
298
|
+
for (let index = 1; index <= bootstrapCount; index += 1) {
|
|
299
|
+
const serviceName = indexedName("public-treedx-node", index);
|
|
300
|
+
const volumeName = `${serviceName}-volume`;
|
|
301
|
+
const configuredNode = Array.isArray(config.services) ? config.services.find((service2) => service2?.id === serviceName || service2?.name === serviceName) : null;
|
|
302
|
+
const volumeMountPath = typeof configuredNode?.volumeMountPath === "string" && configuredNode.volumeMountPath.trim() ? configuredNode.volumeMountPath.trim() : "/data";
|
|
303
|
+
const service = findByName(services, serviceName);
|
|
304
|
+
if (!service?.id) {
|
|
305
|
+
issues.push(`${serviceName}: public TreeDX Railway service was not found.`);
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
const deployment = await inspectRailwayServiceDeploymentHealthWithRetry({
|
|
309
|
+
serviceId: service.id,
|
|
310
|
+
environmentId: environment.id,
|
|
311
|
+
options
|
|
312
|
+
}).catch((error) => ({
|
|
313
|
+
ok: false,
|
|
314
|
+
status: null,
|
|
315
|
+
message: error instanceof Error ? error.message : String(error ?? "Unable to inspect TreeDX deployment health.")
|
|
316
|
+
}));
|
|
317
|
+
if (!deployment.ok) {
|
|
318
|
+
issues.push(`${serviceName}: public TreeDX latest deployment is not healthy. ${deployment.message}`);
|
|
319
|
+
}
|
|
320
|
+
const variables = await listRailwayVariables({ projectId: project.id, environmentId: environment.id, serviceId: service.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => ({}));
|
|
321
|
+
if (variables.TREEDX_FEDERATION_MODE !== "connected_library") {
|
|
322
|
+
issues.push(`${serviceName}: TREEDX_FEDERATION_MODE is not connected_library.`);
|
|
323
|
+
}
|
|
324
|
+
const mountedVolume = volumes.find((volume) => volume.name === volumeName && volume.instances.some(
|
|
325
|
+
(instance) => instance.serviceId === service.id && instance.environmentId === environment.id && instance.mountPath === volumeMountPath && isActiveRailwayVolumeInstance(instance)
|
|
326
|
+
));
|
|
327
|
+
if (!mountedVolume) {
|
|
328
|
+
issues.push(`${serviceName}: public TreeDX volume ${volumeName} is not mounted at ${volumeMountPath}.`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return { observed, status: "observed", issues };
|
|
334
|
+
} catch (error) {
|
|
335
|
+
return {
|
|
336
|
+
observed,
|
|
337
|
+
status: "failed",
|
|
338
|
+
issues: [...issues, liveCheckErrorMessage(error, "Railway live observation failed without provider details.")].filter((issue) => issue.trim())
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
async function collectHttpObservations(options) {
|
|
343
|
+
const deployConfig = loadTreeseedPlatformConfig({ tenantRoot: options.tenantRoot, environment: options.target, env: process.env }).deployConfig;
|
|
344
|
+
const urls = /* @__PURE__ */ new Set();
|
|
345
|
+
const fallbacks = /* @__PURE__ */ new Map();
|
|
346
|
+
const selectedServiceKeys = selectedServiceKeySet(options);
|
|
347
|
+
const selectedApplication = options.appId ? discoverTreeseedApplications(options.tenantRoot).find((application) => application.id === options.appId || application.relativeRoot === options.appId) : null;
|
|
348
|
+
if (!options.appId || options.appId === "web" || selectedApplication?.roles.includes("web")) {
|
|
349
|
+
const webConfig = selectedWebConfig(deployConfig, selectedApplication);
|
|
350
|
+
const webDomain = webConfig.surfaces?.web?.environments?.[options.target]?.domain ?? webConfig.surfaces?.web?.publicBaseUrl ?? webConfig.siteUrl;
|
|
351
|
+
const webUrl = urlForDomain(webDomain);
|
|
352
|
+
if (webUrl) {
|
|
353
|
+
urls.add(webUrl);
|
|
354
|
+
if (!options.appId || options.appId === "web" || selectedApplication?.roles.includes("api")) {
|
|
355
|
+
urls.add(`${webUrl}/v1/healthz`);
|
|
356
|
+
}
|
|
357
|
+
const pagesProjectName = webConfig.cloudflare?.pages?.projectName;
|
|
358
|
+
if (pagesProjectName) {
|
|
359
|
+
const branchName = pagesBranchName(webConfig, options.target);
|
|
360
|
+
const pagesUrl = options.target === "prod" ? `https://${pagesProjectName}.pages.dev` : `https://${branchName}.${pagesProjectName}.pages.dev`;
|
|
361
|
+
fallbacks.set(webUrl, pagesUrl);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
for (const service of configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId).filter((entry) => serviceIsSelected(selectedServiceKeys, entry.key))) {
|
|
366
|
+
const serviceConfig = deployConfig.services?.[service.key];
|
|
367
|
+
const domain = service.publicBaseUrl ?? serviceConfig?.environments?.[options.target]?.baseUrl ?? serviceConfig?.environments?.[options.target]?.domain ?? (service.key === "api" ? deployConfig.surfaces?.api?.environments?.[options.target]?.domain : null);
|
|
368
|
+
const baseUrl = urlForDomain(domain);
|
|
369
|
+
if (!baseUrl) continue;
|
|
370
|
+
urls.add(`${baseUrl}${service.healthcheckPath ?? "/healthz"}`);
|
|
371
|
+
if (service.key === "api") urls.add(`${baseUrl}/healthz/deep`);
|
|
372
|
+
}
|
|
373
|
+
const entries = await Promise.all([...urls].map(async (url) => {
|
|
374
|
+
const observed = await observeHttp(url, options);
|
|
375
|
+
const fallbackUrl = fallbacks.get(url);
|
|
376
|
+
if (observed.ok !== true && !observed.status && fallbackUrl) {
|
|
377
|
+
const fallback = await observeHttp(fallbackUrl, options);
|
|
378
|
+
return [url, {
|
|
379
|
+
...observed,
|
|
380
|
+
fallbackUrl,
|
|
381
|
+
fallbackStatus: fallback.status,
|
|
382
|
+
fallbackOk: fallback.ok,
|
|
383
|
+
fallbackError: fallback.error
|
|
384
|
+
}];
|
|
385
|
+
}
|
|
386
|
+
return [url, observed];
|
|
387
|
+
}));
|
|
388
|
+
return Object.fromEntries(entries);
|
|
389
|
+
}
|
|
390
|
+
function strictenReport(report, options) {
|
|
391
|
+
if (!options.strict) return report;
|
|
392
|
+
const checks = report.checks.map((check) => {
|
|
393
|
+
if (check.status !== "skipped") return check;
|
|
394
|
+
const providerRequired = options.requireLiveRailway && check.provider === "railway" || options.requireLiveHttp && check.provider === "http";
|
|
395
|
+
if (!providerRequired) return check;
|
|
396
|
+
return {
|
|
397
|
+
...check,
|
|
398
|
+
status: "failed",
|
|
399
|
+
issues: check.issues.length > 0 ? check.issues : ["Required live observation was not available."],
|
|
400
|
+
remediation: check.remediation ?? "Run provider configuration bootstrap or verify provider credentials, then rerun with --live."
|
|
401
|
+
};
|
|
402
|
+
});
|
|
403
|
+
const summary = {
|
|
404
|
+
passed: checks.filter((entry) => entry.status === "passed").length,
|
|
405
|
+
failed: checks.filter((entry) => entry.status === "failed").length,
|
|
406
|
+
skipped: checks.filter((entry) => entry.status === "skipped").length,
|
|
407
|
+
warning: checks.filter((entry) => entry.status === "warning").length
|
|
408
|
+
};
|
|
409
|
+
return { ...report, checks, summary };
|
|
410
|
+
}
|
|
411
|
+
async function collectTreeseedLiveHostedServiceChecks(options) {
|
|
412
|
+
const effectiveOptions = {
|
|
413
|
+
...options,
|
|
414
|
+
env: resolveLiveProviderEnv(options)
|
|
415
|
+
};
|
|
416
|
+
const requireLiveRailway = options.requireLiveRailway ?? options.strict === true;
|
|
417
|
+
const requireLiveHttp = options.requireLiveHttp ?? options.strict === true;
|
|
418
|
+
const railway = requireLiveRailway ? await collectRailwayObservations(effectiveOptions) : { observed: {}, status: "skipped", issues: [] };
|
|
419
|
+
const httpChecks = requireLiveHttp ? await collectHttpObservations(effectiveOptions) : {};
|
|
420
|
+
const report = collectTreeseedHostedServiceChecks({
|
|
421
|
+
tenantRoot: effectiveOptions.tenantRoot,
|
|
422
|
+
target: effectiveOptions.target,
|
|
423
|
+
appId: effectiveOptions.appId,
|
|
424
|
+
serviceKeys: effectiveOptions.serviceKeys,
|
|
425
|
+
observedRailwayServices: railway.observed,
|
|
426
|
+
httpChecks
|
|
427
|
+
});
|
|
428
|
+
const railwayIssues = railway.issues.map((issue) => issue.trim()).filter(Boolean);
|
|
429
|
+
const providerIssueChecks = railwayIssues.map((issue, index) => ({
|
|
430
|
+
id: `railway:live-issue:${index + 1}`,
|
|
431
|
+
provider: "railway",
|
|
432
|
+
serviceType: "unknown",
|
|
433
|
+
target: options.target,
|
|
434
|
+
description: "Railway live provider verification issue.",
|
|
435
|
+
expected: { ok: true },
|
|
436
|
+
observed: { issue },
|
|
437
|
+
status: "failed",
|
|
438
|
+
issues: [issue]
|
|
439
|
+
}));
|
|
440
|
+
const reportWithLiveIssues = providerIssueChecks.length > 0 ? {
|
|
441
|
+
...report,
|
|
442
|
+
checks: [...report.checks, ...providerIssueChecks],
|
|
443
|
+
summary: {
|
|
444
|
+
passed: report.checks.filter((entry) => entry.status === "passed").length,
|
|
445
|
+
failed: report.checks.filter((entry) => entry.status === "failed").length + providerIssueChecks.length,
|
|
446
|
+
skipped: report.checks.filter((entry) => entry.status === "skipped").length,
|
|
447
|
+
warning: report.checks.filter((entry) => entry.status === "warning").length
|
|
448
|
+
}
|
|
449
|
+
} : report;
|
|
450
|
+
const httpStatus = requireLiveHttp ? Object.values(httpChecks).some((entry) => entry.ok === true || entry.status) ? "observed" : "failed" : "skipped";
|
|
451
|
+
return strictenReport({
|
|
452
|
+
...reportWithLiveIssues,
|
|
453
|
+
live: true,
|
|
454
|
+
liveObservation: {
|
|
455
|
+
railway: railway.status,
|
|
456
|
+
http: httpStatus,
|
|
457
|
+
issues: railwayIssues
|
|
458
|
+
}
|
|
459
|
+
}, options);
|
|
460
|
+
}
|
|
461
|
+
export {
|
|
462
|
+
collectTreeseedLiveHostedServiceChecks
|
|
463
|
+
};
|
|
@@ -53,7 +53,6 @@ function prepareCloudflareLocalRuntime({ envOverrides = {}, persistTo, outDir }
|
|
|
53
53
|
};
|
|
54
54
|
runNodeScript("./scripts/patch-starlight-content-path.js");
|
|
55
55
|
runNodeScript("./scripts/aggregate-book.js");
|
|
56
|
-
runNodeScript("./scripts/ensure-mailpit.js");
|
|
57
56
|
runLocalD1Migration(persistTo);
|
|
58
57
|
const astroArgs = ["astro", "build", "--root", fixtureRoot];
|
|
59
58
|
if (outDir) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TreeseedDeployConfig } from '../../platform/contracts.
|
|
1
|
+
import type { TreeseedDeployConfig } from '../../platform/contracts.js';
|
|
2
2
|
export declare const MANAGED_HOST_DIRECT_CI_OPT_IN_ENV = "TREESEED_ALLOW_MANAGED_HOST_DIRECT_CI_SECRETS";
|
|
3
3
|
export declare function allowsManagedHostDirectCiSecrets(env?: Record<string, string | undefined>): boolean;
|
|
4
4
|
export declare function isTreeseedManagedHostedProject(deployConfig: Pick<TreeseedDeployConfig, 'hosting' | 'hub' | 'runtime'> | null | undefined): boolean;
|
|
@@ -5,7 +5,7 @@ const SAFE_MANAGED_HOST_CI_VARIABLES = /* @__PURE__ */ new Set([
|
|
|
5
5
|
"TREESEED_HOSTING_KIND",
|
|
6
6
|
"TREESEED_HOSTING_REGISTRATION",
|
|
7
7
|
"TREESEED_HOSTING_TEAM_ID",
|
|
8
|
-
"
|
|
8
|
+
"TREESEED_API_BASE_URL",
|
|
9
9
|
"TREESEED_PROJECT_ID"
|
|
10
10
|
]);
|
|
11
11
|
const SAFE_MANAGED_HOST_CI_SECRETS = /* @__PURE__ */ new Set([
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export type TreeseedManagedRepositoryKind = 'root' | 'package' | 'template' | 'fixture' | 'project';
|
|
2
|
+
export type TreeseedTemplateRepositoryManifest = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
category: string;
|
|
6
|
+
repository: string | null;
|
|
7
|
+
version: string | null;
|
|
8
|
+
versionSource: string;
|
|
9
|
+
manifestPath: string | null;
|
|
10
|
+
verify: {
|
|
11
|
+
fast: string | null;
|
|
12
|
+
local: string | null;
|
|
13
|
+
release: string | null;
|
|
14
|
+
};
|
|
15
|
+
release: {
|
|
16
|
+
tagPrefix: string;
|
|
17
|
+
recordPath: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export type TreeseedManagedRepository = {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
kind: TreeseedManagedRepositoryKind;
|
|
24
|
+
dir: string;
|
|
25
|
+
relativeDir: string;
|
|
26
|
+
branchName: string | null;
|
|
27
|
+
dirty: boolean;
|
|
28
|
+
detached: boolean;
|
|
29
|
+
hasOriginRemote: boolean;
|
|
30
|
+
remoteUrl: string | null;
|
|
31
|
+
templateManifest: TreeseedTemplateRepositoryManifest | null;
|
|
32
|
+
};
|
|
33
|
+
export declare function parseGitmodulesPaths(root: string): string[];
|
|
34
|
+
export declare function readTreeseedTemplateRepositoryManifest(repoDir: string): TreeseedTemplateRepositoryManifest | null;
|
|
35
|
+
export declare function discoverTreeseedManagedRepositories(root: string): TreeseedManagedRepository[];
|
|
36
|
+
export declare function checkedOutManagedWorkflowRepos(root: string): TreeseedManagedRepository[];
|
|
37
|
+
export declare function checkedOutTemplateRepositories(root: string): TreeseedManagedRepository[];
|