@treeseed/sdk 0.11.0 → 0.12.5
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 +9 -4
- 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 +117 -60
- package/dist/capacity-provider.js +215 -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 +2 -2
- 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 +49037 -11843
- package/dist/db/market-schema.js +1788 -50
- package/dist/db/node-sqlite.d.ts +1 -232
- 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 +1 -1
- package/dist/hosting/builtins.d.ts +1 -1
- package/dist/hosting/builtins.js +9 -198
- package/dist/hosting/contracts.d.ts +3 -2
- package/dist/hosting/graph.d.ts +24 -21
- package/dist/hosting/graph.js +280 -294
- package/dist/hosting/index.d.ts +4 -4
- package/dist/index.d.ts +88 -74
- package/dist/index.js +81 -10
- 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 -8
- package/dist/market-client.d.ts +265 -7
- package/dist/market-client.js +381 -9
- 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 +1 -1
- 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 +73 -19
- package/dist/operations/services/config-runtime.js +276 -100
- package/dist/operations/services/deploy.d.ts +41 -622
- package/dist/operations/services/deploy.js +181 -213
- package/dist/operations/services/deployment-readiness.d.ts +1 -1
- package/dist/operations/services/deployment-readiness.js +38 -7
- 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 +43 -5
- package/dist/operations/services/git-workflow.js +242 -20
- package/dist/operations/services/github-actions-verification.d.ts +3 -1
- package/dist/operations/services/github-actions-verification.js +11 -3
- package/dist/operations/services/github-api.js +21 -5
- package/dist/operations/services/github-automation.d.ts +3 -3
- package/dist/operations/services/github-automation.js +15 -18
- package/dist/operations/services/github-credentials.js +2 -1
- package/dist/operations/services/hosted-service-checks.d.ts +19 -1
- package/dist/operations/services/hosted-service-checks.js +162 -11
- 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 +19 -14
- package/dist/operations/services/live-hosted-service-checks.d.ts +2 -1
- package/dist/operations/services/live-hosted-service-checks.js +193 -80
- 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-repositories.d.ts +37 -0
- package/dist/operations/services/managed-repositories.js +177 -0
- package/dist/operations/services/operations-runner-smoke.d.ts +3 -2
- package/dist/operations/services/operations-runner-smoke.js +22 -4
- package/dist/operations/services/package-adapters.d.ts +77 -2
- package/dist/operations/services/package-adapters.js +629 -56
- package/dist/operations/services/package-reference-policy.d.ts +12 -88
- package/dist/operations/services/package-reference-policy.js +81 -213
- package/dist/operations/services/project-host-operations.d.ts +4 -4
- package/dist/operations/services/project-platform.d.ts +19 -193
- package/dist/operations/services/project-platform.js +31 -103
- package/dist/operations/services/project-web-monitor.d.ts +2 -2
- package/dist/operations/services/project-web-monitor.js +97 -2
- package/dist/operations/services/railway-api.d.ts +36 -7
- package/dist/operations/services/railway-api.js +331 -100
- package/dist/operations/services/railway-deploy.d.ts +7 -95
- package/dist/operations/services/railway-deploy.js +334 -742
- 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 +6 -7
- package/dist/operations/services/repository-save-orchestrator.js +353 -174
- 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 -192
- package/dist/operations/services/runtime-tools.js +4 -444
- 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/workflow-timing.d.ts +25 -0
- package/dist/operations/services/workflow-timing.js +79 -0
- package/dist/operations/services/workspace-dependency-mode.js +41 -4
- 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 +41 -18
- package/dist/operations/services/workspace-tools.js +40 -6
- 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 +6 -1
- package/dist/platform/deploy-config.d.ts +1 -1
- package/dist/platform/deploy-config.js +7 -1
- package/dist/platform/deploy-runtime.d.ts +1 -1
- package/dist/platform/desired-state.d.ts +66 -0
- package/dist/platform/desired-state.js +1052 -0
- package/dist/platform/env.yaml +414 -19
- package/dist/platform/environment.d.ts +2 -2
- package/dist/platform/environment.js +54 -22
- 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 +5 -5
- 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/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 +3 -3
- package/dist/reconcile/builtin-adapters.d.ts +7 -1
- package/dist/reconcile/builtin-adapters.js +2924 -346
- package/dist/reconcile/contracts.d.ts +15 -2
- package/dist/reconcile/desired-state.d.ts +2 -193
- package/dist/reconcile/desired-state.js +24 -33
- package/dist/reconcile/engine.d.ts +60 -397
- package/dist/reconcile/engine.js +182 -18
- package/dist/reconcile/index.d.ts +10 -10
- package/dist/reconcile/live-acceptance.d.ts +22 -1
- package/dist/reconcile/live-acceptance.js +456 -44
- 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 +3 -40
- package/dist/reconcile/units.d.ts +1 -1
- package/dist/reconcile/units.js +7 -1
- 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/migrate-journey-csv-to-guarantees.js +140 -0
- package/dist/scripts/package-tools.js +12 -1
- package/dist/scripts/prepare.js +3 -7
- package/dist/scripts/release-verify.js +2 -5
- 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/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 +1184 -113
- package/dist/sdk-types.js +393 -0
- package/dist/sdk.d.ts +74 -79
- package/dist/sdk.js +27 -36
- 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-ui.d.ts +2 -2
- package/dist/treedx/adapters.d.ts +6 -6
- package/dist/treedx/client.d.ts +1 -1
- package/dist/treedx/errors.d.ts +1 -1
- package/dist/treedx/federated-client.d.ts +3 -3
- package/dist/treedx/graph-adapter.d.ts +2 -2
- package/dist/treedx/index.d.ts +14 -14
- package/dist/treedx/market-integration.d.ts +1 -1
- package/dist/treedx/ports.d.ts +30 -30
- package/dist/treedx/query-adapter.d.ts +3 -3
- package/dist/treedx/registry-client.d.ts +2 -2
- package/dist/treedx/repository-adapter.d.ts +4 -4
- package/dist/treedx/repository-adapter.js +14 -3
- package/dist/treedx/sdk-integration.d.ts +3 -3
- package/dist/treedx/types.d.ts +2 -2
- package/dist/treedx/workspace-adapter.d.ts +2 -2
- package/dist/treedx-backends.d.ts +13 -11
- package/dist/treedx-backends.js +52 -50
- package/dist/treedx-client.d.ts +3 -0
- package/dist/treedx-client.js +10 -1
- package/dist/treeseed/services/compose.yml +2 -3
- package/dist/treeseed/template-catalog/catalog.fixture.json +4 -4
- 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 +510 -559
- package/dist/workflow/operations.js +1891 -1342
- 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 +5 -5
- package/dist/workflow-state.js +27 -17
- package/dist/workflow-support.d.ts +26 -25
- package/dist/workflow-support.js +27 -31
- package/dist/workflow.d.ts +46 -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/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 +75 -18
- package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
- package/templates/github/deploy-web.workflow.yml +12 -8
- 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 -60
- package/dist/operations/services/release-candidate.js +0 -953
- 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
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { loadTreeseedPlatformConfig } from "../../platform/config.js";
|
|
2
|
+
import { resolveTreeseedLaunchEnvironment } from "./config-runtime.js";
|
|
2
3
|
import {
|
|
3
4
|
getRailwayServiceInstance,
|
|
4
5
|
inspectRailwayServiceDeploymentHealth,
|
|
@@ -15,9 +16,17 @@ import { discoverTreeseedApplications } from "../../hosting/apps.js";
|
|
|
15
16
|
import {
|
|
16
17
|
collectTreeseedHostedServiceChecks
|
|
17
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;
|
|
18
23
|
function sleep(ms) {
|
|
19
24
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
20
25
|
}
|
|
26
|
+
function liveCheckErrorMessage(error, fallback) {
|
|
27
|
+
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
28
|
+
return message.trim() || fallback;
|
|
29
|
+
}
|
|
21
30
|
function normalizeBaseUrl(value) {
|
|
22
31
|
return typeof value === "string" && value.trim() ? value.trim().replace(/\/+$/u, "") : null;
|
|
23
32
|
}
|
|
@@ -36,8 +45,8 @@ function pagesBranchName(config, target) {
|
|
|
36
45
|
return typeof pages[key] === "string" && pages[key].trim() ? pages[key].trim() : fallback;
|
|
37
46
|
}
|
|
38
47
|
async function observeHttp(url, options) {
|
|
39
|
-
const attempts = Math.max(1, Math.floor(options.retry?.attempts ??
|
|
40
|
-
const intervalMs = Math.max(0, Math.floor(options.retry?.intervalMs ??
|
|
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));
|
|
41
50
|
const timeoutMs = Math.max(1e3, Math.floor(options.timeoutMs ?? 1e4));
|
|
42
51
|
let lastError = "";
|
|
43
52
|
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
@@ -60,8 +69,8 @@ async function observeHttp(url, options) {
|
|
|
60
69
|
return { ok: false, error: lastError || "HTTP request failed." };
|
|
61
70
|
}
|
|
62
71
|
async function inspectRailwayServiceDeploymentHealthWithRetry(input) {
|
|
63
|
-
const attempts = Math.max(1, Math.floor(input.options.retry?.attempts ??
|
|
64
|
-
const intervalMs = Math.max(0, Math.floor(input.options.retry?.intervalMs ??
|
|
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));
|
|
65
74
|
let lastDeployment = null;
|
|
66
75
|
let lastError = null;
|
|
67
76
|
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
@@ -92,26 +101,57 @@ function findByName(items, nameOrId) {
|
|
|
92
101
|
function indexedName(baseName, index) {
|
|
93
102
|
return `${baseName.replace(/-\d+$/u, "")}-${String(Math.max(1, index)).padStart(2, "0")}`;
|
|
94
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
|
+
}
|
|
95
108
|
function activeRailwayVolumeInstances(volume) {
|
|
96
109
|
const instances = Array.isArray(volume.instances) ? volume.instances : [];
|
|
97
|
-
return instances.filter(
|
|
98
|
-
const state = String(instance.state ?? "READY").toUpperCase();
|
|
99
|
-
return state !== "DELETING" && state !== "DELETED";
|
|
100
|
-
});
|
|
110
|
+
return instances.filter(isActiveRailwayVolumeInstance);
|
|
101
111
|
}
|
|
102
112
|
function railwayVolumeInstanceStates(volume) {
|
|
103
|
-
const states = (Array.isArray(volume.instances) ? volume.instances : []).map((instance) =>
|
|
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);
|
|
104
117
|
return states.length > 0 ? [...new Set(states)].join(",") : "none";
|
|
105
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
|
+
}
|
|
106
145
|
async function collectRailwayObservations(options) {
|
|
107
146
|
const observed = {};
|
|
108
147
|
const issues = [];
|
|
109
148
|
const inspectedVolumeScopes = /* @__PURE__ */ new Set();
|
|
110
149
|
const inspectedRunnerScopes = /* @__PURE__ */ new Set();
|
|
150
|
+
const selectedServiceKeys = selectedServiceKeySet(options);
|
|
111
151
|
try {
|
|
112
152
|
const workspace = await resolveRailwayWorkspaceContext({ env: options.env, fetchImpl: options.fetchImpl });
|
|
113
153
|
const projects = await listRailwayProjects({ workspaceId: workspace.id, env: options.env, fetchImpl: options.fetchImpl });
|
|
114
|
-
const configuredServices = configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId);
|
|
154
|
+
const configuredServices = configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId).filter((entry) => serviceIsSelected(selectedServiceKeys, entry.key));
|
|
115
155
|
for (const service of configuredServices) {
|
|
116
156
|
const project = service.projectId ? findByName(projects, service.projectId) : findByName(projects, service.projectName);
|
|
117
157
|
if (!project?.id) {
|
|
@@ -128,12 +168,15 @@ async function collectRailwayObservations(options) {
|
|
|
128
168
|
if (!inspectedVolumeScopes.has(volumeScope)) {
|
|
129
169
|
inspectedVolumeScopes.add(volumeScope);
|
|
130
170
|
const volumes2 = await listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => []);
|
|
131
|
-
for (const
|
|
132
|
-
|
|
171
|
+
for (const volume of volumes2) {
|
|
172
|
+
if (isRetainedDetachedRailwayVolume(volume.name)) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const detachedPostgresInstances = activeRailwayVolumeInstances(volume).filter(
|
|
133
176
|
(instance2) => instance2.environmentId === environment.id && instance2.mountPath === "/var/lib/postgresql/data" && !instance2.serviceId
|
|
134
177
|
);
|
|
135
178
|
if (detachedPostgresInstances.length > 0) {
|
|
136
|
-
issues.push(`${
|
|
179
|
+
issues.push(`${volume.name ?? volume.id}: detached PostgreSQL volume remains in Railway project ${project.name} (states=${railwayVolumeInstanceStates(volume)}).`);
|
|
137
180
|
}
|
|
138
181
|
}
|
|
139
182
|
}
|
|
@@ -167,81 +210,123 @@ async function collectRailwayObservations(options) {
|
|
|
167
210
|
listRailwayVariables({ projectId: project.id, environmentId: environment.id, serviceId: railwayService.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => ({})),
|
|
168
211
|
listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => [])
|
|
169
212
|
]);
|
|
170
|
-
const
|
|
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;
|
|
171
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
|
+
}
|
|
172
238
|
observed[service.serviceName] = {
|
|
173
239
|
projectName: project.name,
|
|
174
240
|
environmentName: environment.name,
|
|
175
241
|
serviceName: railwayService.name,
|
|
242
|
+
serviceId: railwayService.id,
|
|
176
243
|
rootDirectory: instance.rootDirectory,
|
|
177
244
|
buildCommand: instance.buildCommand,
|
|
245
|
+
dockerfilePath: instance.dockerfilePath,
|
|
178
246
|
startCommand: instance.startCommand,
|
|
179
247
|
healthcheckPath: instance.healthcheckPath,
|
|
180
248
|
healthcheckTimeoutSeconds: instance.healthcheckTimeoutSeconds,
|
|
181
249
|
runtimeMode: service.runtimeMode ?? instance.runtimeMode,
|
|
182
|
-
|
|
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,
|
|
183
266
|
variables: variableKeys,
|
|
184
267
|
secrets: variableKeys,
|
|
185
268
|
health: "unknown"
|
|
186
269
|
};
|
|
187
270
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
const environments = await listRailwayEnvironments({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl });
|
|
205
|
-
const environment = findByName(environments, environmentName);
|
|
206
|
-
if (!environment?.id) {
|
|
207
|
-
issues.push(`public-treedx: Railway environment ${environmentName} was not found.`);
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
const [services, volumes] = await Promise.all([
|
|
211
|
-
listRailwayServices({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }),
|
|
212
|
-
listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => [])
|
|
213
|
-
]);
|
|
214
|
-
for (let index = 1; index <= bootstrapCount; index += 1) {
|
|
215
|
-
const serviceName = indexedName("public-treedx-node", index);
|
|
216
|
-
const volumeName = `${serviceName}-volume`;
|
|
217
|
-
const configuredNode = Array.isArray(config.services) ? config.services.find((service2) => service2?.id === serviceName || service2?.name === serviceName) : null;
|
|
218
|
-
const volumeMountPath = typeof configuredNode?.volumeMountPath === "string" && configuredNode.volumeMountPath.trim() ? configuredNode.volumeMountPath.trim() : "/data";
|
|
219
|
-
const service = findByName(services, serviceName);
|
|
220
|
-
if (!service?.id) {
|
|
221
|
-
issues.push(`${serviceName}: public TreeDX Railway service was not found.`);
|
|
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.`);
|
|
222
286
|
continue;
|
|
223
287
|
}
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
ok: false,
|
|
230
|
-
status: null,
|
|
231
|
-
message: error instanceof Error ? error.message : String(error ?? "Unable to inspect TreeDX deployment health.")
|
|
232
|
-
}));
|
|
233
|
-
if (!deployment.ok) {
|
|
234
|
-
issues.push(`${serviceName}: public TreeDX latest deployment is not healthy. ${deployment.message}`);
|
|
235
|
-
}
|
|
236
|
-
const variables = await listRailwayVariables({ projectId: project.id, environmentId: environment.id, serviceId: service.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => ({}));
|
|
237
|
-
if (variables.TREEDX_FEDERATION_MODE !== "connected_library") {
|
|
238
|
-
issues.push(`${serviceName}: TREEDX_FEDERATION_MODE is not connected_library.`);
|
|
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;
|
|
239
293
|
}
|
|
240
|
-
const
|
|
241
|
-
(
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
+
}
|
|
245
330
|
}
|
|
246
331
|
}
|
|
247
332
|
}
|
|
@@ -250,14 +335,15 @@ async function collectRailwayObservations(options) {
|
|
|
250
335
|
return {
|
|
251
336
|
observed,
|
|
252
337
|
status: "failed",
|
|
253
|
-
issues: [...issues, error
|
|
338
|
+
issues: [...issues, liveCheckErrorMessage(error, "Railway live observation failed without provider details.")].filter((issue) => issue.trim())
|
|
254
339
|
};
|
|
255
340
|
}
|
|
256
341
|
}
|
|
257
342
|
async function collectHttpObservations(options) {
|
|
258
|
-
const deployConfig =
|
|
343
|
+
const deployConfig = loadTreeseedPlatformConfig({ tenantRoot: options.tenantRoot, environment: options.target, env: process.env }).deployConfig;
|
|
259
344
|
const urls = /* @__PURE__ */ new Set();
|
|
260
345
|
const fallbacks = /* @__PURE__ */ new Map();
|
|
346
|
+
const selectedServiceKeys = selectedServiceKeySet(options);
|
|
261
347
|
const selectedApplication = options.appId ? discoverTreeseedApplications(options.tenantRoot).find((application) => application.id === options.appId || application.relativeRoot === options.appId) : null;
|
|
262
348
|
if (!options.appId || options.appId === "web" || selectedApplication?.roles.includes("web")) {
|
|
263
349
|
const webConfig = selectedWebConfig(deployConfig, selectedApplication);
|
|
@@ -276,7 +362,7 @@ async function collectHttpObservations(options) {
|
|
|
276
362
|
}
|
|
277
363
|
}
|
|
278
364
|
}
|
|
279
|
-
for (const service of configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId)) {
|
|
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))) {
|
|
280
366
|
const serviceConfig = deployConfig.services?.[service.key];
|
|
281
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);
|
|
282
368
|
const baseUrl = urlForDomain(domain);
|
|
@@ -323,25 +409,52 @@ function strictenReport(report, options) {
|
|
|
323
409
|
return { ...report, checks, summary };
|
|
324
410
|
}
|
|
325
411
|
async function collectTreeseedLiveHostedServiceChecks(options) {
|
|
412
|
+
const effectiveOptions = {
|
|
413
|
+
...options,
|
|
414
|
+
env: resolveLiveProviderEnv(options)
|
|
415
|
+
};
|
|
326
416
|
const requireLiveRailway = options.requireLiveRailway ?? options.strict === true;
|
|
327
417
|
const requireLiveHttp = options.requireLiveHttp ?? options.strict === true;
|
|
328
|
-
const railway = requireLiveRailway ? await collectRailwayObservations(
|
|
329
|
-
const httpChecks = requireLiveHttp ? await collectHttpObservations(
|
|
418
|
+
const railway = requireLiveRailway ? await collectRailwayObservations(effectiveOptions) : { observed: {}, status: "skipped", issues: [] };
|
|
419
|
+
const httpChecks = requireLiveHttp ? await collectHttpObservations(effectiveOptions) : {};
|
|
330
420
|
const report = collectTreeseedHostedServiceChecks({
|
|
331
|
-
tenantRoot:
|
|
332
|
-
target:
|
|
333
|
-
appId:
|
|
421
|
+
tenantRoot: effectiveOptions.tenantRoot,
|
|
422
|
+
target: effectiveOptions.target,
|
|
423
|
+
appId: effectiveOptions.appId,
|
|
424
|
+
serviceKeys: effectiveOptions.serviceKeys,
|
|
334
425
|
observedRailwayServices: railway.observed,
|
|
335
426
|
httpChecks
|
|
336
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;
|
|
337
450
|
const httpStatus = requireLiveHttp ? Object.values(httpChecks).some((entry) => entry.ok === true || entry.status) ? "observed" : "failed" : "skipped";
|
|
338
451
|
return strictenReport({
|
|
339
|
-
...
|
|
452
|
+
...reportWithLiveIssues,
|
|
340
453
|
live: true,
|
|
341
454
|
liveObservation: {
|
|
342
455
|
railway: railway.status,
|
|
343
456
|
http: httpStatus,
|
|
344
|
-
issues:
|
|
457
|
+
issues: railwayIssues
|
|
345
458
|
}
|
|
346
459
|
}, options);
|
|
347
460
|
}
|
|
@@ -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;
|
|
@@ -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[];
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { basename, relative, resolve } from "node:path";
|
|
3
|
+
import { parse as parseYaml } from "yaml";
|
|
4
|
+
import { currentBranch, gitStatusPorcelain, originRemoteUrl, repoRoot } from "./workspace-save.js";
|
|
5
|
+
import { hasCompleteTreeseedPackageCheckout, sortWorkspacePackages, workspacePackages } from "./workspace-tools.js";
|
|
6
|
+
import { discoverTreeseedPackageAdapters } from "./package-adapters.js";
|
|
7
|
+
function readJsonFile(filePath) {
|
|
8
|
+
try {
|
|
9
|
+
return JSON.parse(readFileSync(filePath, "utf8"));
|
|
10
|
+
} catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function readStructuredFile(filePath) {
|
|
15
|
+
try {
|
|
16
|
+
const source = readFileSync(filePath, "utf8");
|
|
17
|
+
return filePath.endsWith(".yaml") || filePath.endsWith(".yml") ? parseYaml(source) : JSON.parse(source);
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function stringValue(value) {
|
|
23
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
24
|
+
}
|
|
25
|
+
function parseGitmodulesPaths(root) {
|
|
26
|
+
const gitmodulesPath = resolve(root, ".gitmodules");
|
|
27
|
+
if (!existsSync(gitmodulesPath)) return [];
|
|
28
|
+
const source = readFileSync(gitmodulesPath, "utf8");
|
|
29
|
+
return [...source.matchAll(/^\s*path\s*=\s*(.+?)\s*$/gmu)].map((match) => match[1].replaceAll("\\", "/").trim()).filter(Boolean);
|
|
30
|
+
}
|
|
31
|
+
function isIndependentGitRepo(repoDir) {
|
|
32
|
+
try {
|
|
33
|
+
return resolve(repoRoot(repoDir)) === resolve(repoDir);
|
|
34
|
+
} catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function branchName(repoDir) {
|
|
39
|
+
return currentBranch(repoDir) || null;
|
|
40
|
+
}
|
|
41
|
+
function hasOriginRemote(repoDir) {
|
|
42
|
+
try {
|
|
43
|
+
originRemoteUrl(repoDir);
|
|
44
|
+
return true;
|
|
45
|
+
} catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function remoteUrl(repoDir) {
|
|
50
|
+
try {
|
|
51
|
+
return originRemoteUrl(repoDir);
|
|
52
|
+
} catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function templateManifestPath(repoDir) {
|
|
57
|
+
for (const name of ["treeseed.template.yaml", "treeseed.template.yml", "treeseed.template.json"]) {
|
|
58
|
+
const candidate = resolve(repoDir, name);
|
|
59
|
+
if (existsSync(candidate)) return candidate;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
function defaultTemplateConfigPath(repoDir) {
|
|
64
|
+
const candidate = resolve(repoDir, "template.config.json");
|
|
65
|
+
return existsSync(candidate) ? candidate : null;
|
|
66
|
+
}
|
|
67
|
+
function templateVersion(repoDir, manifest, config) {
|
|
68
|
+
const versionSource = stringValue(manifest?.versionSource) ?? "template.config.json";
|
|
69
|
+
const configured = stringValue(manifest?.version) ?? stringValue(config?.templateVersion);
|
|
70
|
+
if (configured) return { version: configured, versionSource };
|
|
71
|
+
const sourcePath = resolve(repoDir, versionSource);
|
|
72
|
+
const source = readJsonFile(sourcePath);
|
|
73
|
+
return {
|
|
74
|
+
version: stringValue(source?.templateVersion) ?? stringValue(source?.version),
|
|
75
|
+
versionSource
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function readTreeseedTemplateRepositoryManifest(repoDir) {
|
|
79
|
+
const manifestPath = templateManifestPath(repoDir);
|
|
80
|
+
const configPath = defaultTemplateConfigPath(repoDir);
|
|
81
|
+
const manifest = manifestPath ? readStructuredFile(manifestPath) : null;
|
|
82
|
+
const config = configPath ? readStructuredFile(configPath) : null;
|
|
83
|
+
if (!manifest && !config) return null;
|
|
84
|
+
const id = stringValue(manifest?.id) ?? stringValue(config?.id) ?? basename(repoDir);
|
|
85
|
+
const release = manifest?.release && typeof manifest.release === "object" && !Array.isArray(manifest.release) ? manifest.release : {};
|
|
86
|
+
const verify = manifest?.verify && typeof manifest.verify === "object" && !Array.isArray(manifest.verify) ? manifest.verify : {};
|
|
87
|
+
const version = templateVersion(repoDir, manifest, config);
|
|
88
|
+
return {
|
|
89
|
+
id,
|
|
90
|
+
name: stringValue(manifest?.name) ?? stringValue(config?.displayName) ?? id,
|
|
91
|
+
category: stringValue(manifest?.category) ?? stringValue(config?.category) ?? "starter",
|
|
92
|
+
repository: stringValue(manifest?.repository) ?? remoteUrl(repoDir),
|
|
93
|
+
version: version.version,
|
|
94
|
+
versionSource: version.versionSource,
|
|
95
|
+
manifestPath: manifestPath ?? configPath,
|
|
96
|
+
verify: {
|
|
97
|
+
fast: stringValue(verify.fast),
|
|
98
|
+
local: stringValue(verify.local) ?? stringValue(config?.testing?.buildCommand),
|
|
99
|
+
release: stringValue(verify.release) ?? stringValue(verify.local) ?? stringValue(config?.testing?.buildCommand)
|
|
100
|
+
},
|
|
101
|
+
release: {
|
|
102
|
+
tagPrefix: stringValue(release.tagPrefix) ?? "template/",
|
|
103
|
+
recordPath: stringValue(release.recordPath) ?? `.treeseed/templates/${id}/latest-release.json`
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function classifyManagedRepo(root, relativeDir, repoDir) {
|
|
108
|
+
if (relativeDir === ".") return "root";
|
|
109
|
+
if (/^starters\/[^/]+$/u.test(relativeDir) || readTreeseedTemplateRepositoryManifest(repoDir)) return "template";
|
|
110
|
+
if (/(^|\/)\.fixtures\/treeseed-fixtures$/u.test(relativeDir)) return "fixture";
|
|
111
|
+
if (/^packages\/[^/]+$/u.test(relativeDir)) return "package";
|
|
112
|
+
return "project";
|
|
113
|
+
}
|
|
114
|
+
function addRecursiveSubmodules(root, relativeDir, repoDir, repos) {
|
|
115
|
+
for (const submodulePath of parseGitmodulesPaths(repoDir)) {
|
|
116
|
+
const childDir = resolve(repoDir, submodulePath);
|
|
117
|
+
const childRelativeDir = relative(root, childDir).replaceAll("\\", "/") || ".";
|
|
118
|
+
if (!existsSync(childDir) || !isIndependentGitRepo(childDir)) continue;
|
|
119
|
+
if (!repos.has(childRelativeDir)) {
|
|
120
|
+
repos.set(childRelativeDir, childDir);
|
|
121
|
+
}
|
|
122
|
+
addRecursiveSubmodules(root, childRelativeDir, childDir, repos);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function discoverTreeseedManagedRepositories(root) {
|
|
126
|
+
const gitRoot = repoRoot(root);
|
|
127
|
+
const repos = /* @__PURE__ */ new Map();
|
|
128
|
+
repos.set(".", gitRoot);
|
|
129
|
+
if (hasCompleteTreeseedPackageCheckout(root)) {
|
|
130
|
+
for (const pkg of workspacePackages(root).filter((pkg2) => pkg2.name?.startsWith("@treeseed/"))) {
|
|
131
|
+
if (existsSync(resolve(pkg.dir, ".git")) && isIndependentGitRepo(pkg.dir)) {
|
|
132
|
+
repos.set(pkg.relativeDir, pkg.dir);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
for (const adapter of discoverTreeseedPackageAdapters(root)) {
|
|
137
|
+
if (existsSync(resolve(adapter.dir, ".git")) && isIndependentGitRepo(adapter.dir)) {
|
|
138
|
+
repos.set(adapter.relativeDir, adapter.dir);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
addRecursiveSubmodules(root, ".", gitRoot, repos);
|
|
142
|
+
return [...repos.entries()].map(([relativeDir, dir]) => {
|
|
143
|
+
const kind = classifyManagedRepo(root, relativeDir, dir);
|
|
144
|
+
const templateManifest = kind === "template" ? readTreeseedTemplateRepositoryManifest(dir) : null;
|
|
145
|
+
const name = kind === "root" ? "@treeseed/market" : kind === "template" ? `template:${templateManifest?.id ?? basename(dir)}` : kind === "fixture" ? `fixture:${relativeDir}` : readJsonFile(resolve(dir, "package.json"))?.name ?? basename(dir);
|
|
146
|
+
const branch = branchName(dir);
|
|
147
|
+
return {
|
|
148
|
+
id: relativeDir,
|
|
149
|
+
name,
|
|
150
|
+
kind,
|
|
151
|
+
dir,
|
|
152
|
+
relativeDir,
|
|
153
|
+
branchName: branch,
|
|
154
|
+
dirty: gitStatusPorcelain(dir).length > 0,
|
|
155
|
+
detached: branch == null,
|
|
156
|
+
hasOriginRemote: hasOriginRemote(dir),
|
|
157
|
+
remoteUrl: remoteUrl(dir),
|
|
158
|
+
templateManifest
|
|
159
|
+
};
|
|
160
|
+
}).sort((left, right) => sortWorkspacePackages([
|
|
161
|
+
{ name: left.name, dir: left.dir, relativeDir: left.relativeDir, packageJson: {} },
|
|
162
|
+
{ name: right.name, dir: right.dir, relativeDir: right.relativeDir, packageJson: {} }
|
|
163
|
+
])[0]?.name === left.name ? -1 : 1);
|
|
164
|
+
}
|
|
165
|
+
function checkedOutManagedWorkflowRepos(root) {
|
|
166
|
+
return discoverTreeseedManagedRepositories(root).filter((repo) => repo.kind !== "root");
|
|
167
|
+
}
|
|
168
|
+
function checkedOutTemplateRepositories(root) {
|
|
169
|
+
return discoverTreeseedManagedRepositories(root).filter((repo) => repo.kind === "template" && repo.templateManifest);
|
|
170
|
+
}
|
|
171
|
+
export {
|
|
172
|
+
checkedOutManagedWorkflowRepos,
|
|
173
|
+
checkedOutTemplateRepositories,
|
|
174
|
+
discoverTreeseedManagedRepositories,
|
|
175
|
+
parseGitmodulesPaths,
|
|
176
|
+
readTreeseedTemplateRepositoryManifest
|
|
177
|
+
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
export type TreeseedOperationsRunnerSmokeEnvironment = 'local' | 'staging' | 'prod';
|
|
1
2
|
export interface TreeseedOperationsRunnerSmokeReport {
|
|
2
|
-
environment:
|
|
3
|
+
environment: TreeseedOperationsRunnerSmokeEnvironment;
|
|
3
4
|
ok: boolean;
|
|
4
5
|
baseUrl: string;
|
|
5
6
|
operationId?: string;
|
|
@@ -18,7 +19,7 @@ export interface TreeseedOperationsRunnerSmokeReport {
|
|
|
18
19
|
}
|
|
19
20
|
export interface TreeseedOperationsRunnerSmokeOptions {
|
|
20
21
|
tenantRoot: string;
|
|
21
|
-
environment:
|
|
22
|
+
environment: TreeseedOperationsRunnerSmokeEnvironment;
|
|
22
23
|
baseUrl?: string | null;
|
|
23
24
|
serviceId?: string | null;
|
|
24
25
|
serviceSecret?: string | null;
|