@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
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { TreeseedDeployConfig, TreeseedTenantConfig } from './contracts.
|
|
2
|
-
import { type LoadedTreeseedPluginEntry } from './plugins.
|
|
1
|
+
import type { TreeseedDeployConfig, TreeseedTenantConfig } from './contracts.js';
|
|
2
|
+
import { type LoadedTreeseedPluginEntry } from './plugins.js';
|
|
3
3
|
export declare const TREESEED_ENVIRONMENT_SCOPES: readonly ["local", "staging", "prod"];
|
|
4
4
|
export declare const TREESEED_ENVIRONMENT_REQUIREMENTS: readonly ["required", "conditional", "optional", "generated"];
|
|
5
5
|
export declare const TREESEED_ENVIRONMENT_TARGETS: readonly ["local-runtime", "local-cloudflare", "github-secret", "github-variable", "cloudflare-secret", "cloudflare-var", "railway-secret", "railway-var", "config-file"];
|
|
@@ -75,6 +75,7 @@ export type TreeseedEnvironmentEntry = {
|
|
|
75
75
|
howToGet: string;
|
|
76
76
|
sensitivity: TreeseedEnvironmentSensitivity;
|
|
77
77
|
targets: TreeseedEnvironmentTarget[];
|
|
78
|
+
appTargets?: string[];
|
|
78
79
|
serviceTargets?: string[];
|
|
79
80
|
scopes: TreeseedEnvironmentScope[];
|
|
80
81
|
requirement: TreeseedEnvironmentRequirement;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
|
-
import {
|
|
2
|
+
import { runTreeseedGit } from "../operations/services/git-runner.js";
|
|
3
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
4
4
|
import { dirname, resolve } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
import { parse as parseYaml } from "yaml";
|
|
7
|
+
import { discoverTreeseedApplications } from "../hosting/apps.js";
|
|
8
|
+
import { githubRepositoryCredentialEnvName } from "../operations/services/github-credentials.js";
|
|
9
|
+
import { discoverTreeseedPackageAdapters } from "../operations/services/package-adapters.js";
|
|
7
10
|
import { loadTreeseedDeployConfig } from "./deploy-config.js";
|
|
8
11
|
import { loadTreeseedPlugins } from "./plugins.js";
|
|
9
12
|
import { loadTreeseedManifest } from "./tenant-config.js";
|
|
@@ -32,6 +35,8 @@ function firstExistingPath(candidates) {
|
|
|
32
35
|
function resolveSdkEnvironmentPath() {
|
|
33
36
|
const candidates = [
|
|
34
37
|
resolve(moduleDir, "env.yaml"),
|
|
38
|
+
resolve(moduleDir, "../../src/platform/env.yaml"),
|
|
39
|
+
resolve(moduleDir, "../../dist/platform/env.yaml"),
|
|
35
40
|
resolve(moduleDir, "../src/platform/env.yaml"),
|
|
36
41
|
resolve(moduleDir, "../dist/platform/env.yaml")
|
|
37
42
|
];
|
|
@@ -45,11 +50,8 @@ function resolveSiblingPackageEnvironmentPath(packageDir) {
|
|
|
45
50
|
resolve(moduleDir, `../../${packageDir}/dist/env.yaml`)
|
|
46
51
|
]);
|
|
47
52
|
}
|
|
48
|
-
const SDK_ENVIRONMENT_PATH = resolveSdkEnvironmentPath();
|
|
49
|
-
const CORE_ENVIRONMENT_PATH = resolveSiblingPackageEnvironmentPath("core");
|
|
50
|
-
const AGENT_ENVIRONMENT_PATH = resolveSiblingPackageEnvironmentPath("agent");
|
|
51
53
|
const TENANT_ENVIRONMENT_OVERLAY_PATH = "src/env.yaml";
|
|
52
|
-
const DEFAULT_TREESEED_MARKET_BASE_URL = "https://api.treeseed.
|
|
54
|
+
const DEFAULT_TREESEED_MARKET_BASE_URL = "https://api.treeseed.dev";
|
|
53
55
|
function loadOptionalTenantConfig() {
|
|
54
56
|
try {
|
|
55
57
|
return loadTreeseedManifest();
|
|
@@ -113,6 +115,9 @@ function codexExecutionSelected(context) {
|
|
|
113
115
|
const execution = context.deployConfig.providers?.agents?.execution ?? "codex";
|
|
114
116
|
return execution === "codex" || execution === "codex_subscription";
|
|
115
117
|
}
|
|
118
|
+
function copilotExecutionSelected(context) {
|
|
119
|
+
return context.deployConfig.providers?.agents?.execution === "github_copilot";
|
|
120
|
+
}
|
|
116
121
|
function railwayManagedEnabled(context) {
|
|
117
122
|
if (!workflowPlaneAllows("processing")) {
|
|
118
123
|
return false;
|
|
@@ -146,7 +151,7 @@ function resolveHostingRegistration(context) {
|
|
|
146
151
|
return context.deployConfig.hosting?.registration ?? "none";
|
|
147
152
|
}
|
|
148
153
|
function marketControlPlaneEnabled(context) {
|
|
149
|
-
return resolveHostingKind(context) === "
|
|
154
|
+
return resolveHostingKind(context) === "treeseed_control_plane";
|
|
150
155
|
}
|
|
151
156
|
function hostedProjectEnabled(context) {
|
|
152
157
|
return resolveHostingKind(context) === "hosted_project";
|
|
@@ -175,6 +180,13 @@ function contactEmailDefault(context) {
|
|
|
175
180
|
function workdayWindowsDefault() {
|
|
176
181
|
return JSON.stringify([{ days: [1, 2, 3, 4, 5], startTime: "09:00", endTime: "17:00" }]);
|
|
177
182
|
}
|
|
183
|
+
function localApiDatabaseUrlDefault(_context, _scope, values = {}) {
|
|
184
|
+
const port = values.TREESEED_MARKET_LOCAL_POSTGRES_PORT?.trim() || values.TREESEED_API_LOCAL_POSTGRES_PORT?.trim() || process.env.TREESEED_MARKET_LOCAL_POSTGRES_PORT?.trim() || "54329";
|
|
185
|
+
const database = values.TREESEED_MARKET_LOCAL_POSTGRES_DATABASE?.trim() || values.TREESEED_API_LOCAL_POSTGRES_DATABASE?.trim() || "treeseed_api";
|
|
186
|
+
const user = values.TREESEED_MARKET_LOCAL_POSTGRES_USER?.trim() || values.TREESEED_API_LOCAL_POSTGRES_USER?.trim() || "treeseed";
|
|
187
|
+
const password = values.TREESEED_MARKET_LOCAL_POSTGRES_PASSWORD?.trim() || values.TREESEED_API_LOCAL_POSTGRES_PASSWORD?.trim() || "treeseed-local-dev";
|
|
188
|
+
return `postgres://${encodeURIComponent(user)}:${encodeURIComponent(password)}@127.0.0.1:${port}/${encodeURIComponent(database)}`;
|
|
189
|
+
}
|
|
178
190
|
function normalizeUrl(value) {
|
|
179
191
|
return value.trim().replace(/\/$/u, "");
|
|
180
192
|
}
|
|
@@ -204,6 +216,15 @@ function deriveApiDomainFromProjectDomain(domain) {
|
|
|
204
216
|
}
|
|
205
217
|
return `api.${segments.slice(1).join(".")}`;
|
|
206
218
|
}
|
|
219
|
+
function projectDomainsDefault(context, scope) {
|
|
220
|
+
if (scope === "staging") {
|
|
221
|
+
return context.deployConfig.surfaces?.web?.environments?.staging?.domain ?? primaryHostFromUrl(context.deployConfig.surfaces?.web?.environments?.staging?.baseUrl) ?? primaryHostFromUrl(context.deployConfig.siteUrl);
|
|
222
|
+
}
|
|
223
|
+
if (scope === "prod") {
|
|
224
|
+
return context.deployConfig.surfaces?.web?.environments?.prod?.domain ?? primaryHostFromUrl(context.deployConfig.surfaces?.web?.environments?.prod?.baseUrl) ?? primaryHostFromUrl(context.deployConfig.surfaces?.web?.publicBaseUrl) ?? primaryHostFromUrl(context.deployConfig.siteUrl);
|
|
225
|
+
}
|
|
226
|
+
return primaryHostFromUrl(context.deployConfig.siteUrl);
|
|
227
|
+
}
|
|
207
228
|
function resolveConfiguredApiBaseUrl(context, scope, values = {}) {
|
|
208
229
|
const localBaseUrl = context.deployConfig.services?.api?.environments?.local?.baseUrl ?? context.deployConfig.surfaces?.api?.localBaseUrl ?? "http://127.0.0.1:3000";
|
|
209
230
|
if (scope === "local") {
|
|
@@ -235,7 +256,7 @@ function resolvePagesProjectName(context) {
|
|
|
235
256
|
return context.deployConfig.slug;
|
|
236
257
|
}
|
|
237
258
|
function resolvePagesPreviewProjectName(context, _scope, values = {}) {
|
|
238
|
-
return values.TREESEED_CLOUDFLARE_PAGES_PROJECT_NAME?.trim() ||
|
|
259
|
+
return values.TREESEED_CLOUDFLARE_PAGES_PROJECT_NAME?.trim() || context.deployConfig.cloudflare.pages?.projectName?.trim() || context.deployConfig.slug;
|
|
239
260
|
}
|
|
240
261
|
function resolveContentBucketName(context) {
|
|
241
262
|
return `${context.deployConfig.slug}-content`;
|
|
@@ -244,13 +265,13 @@ function resolveContentBucketBinding(context) {
|
|
|
244
265
|
return context.deployConfig.cloudflare.r2?.binding?.trim() || "TREESEED_CONTENT_BUCKET";
|
|
245
266
|
}
|
|
246
267
|
function resolveMarketBaseUrl(context, _scope, values = {}) {
|
|
247
|
-
return values.
|
|
268
|
+
return values.TREESEED_API_BASE_URL?.trim() || values.TREESEED_CENTRAL_MARKET_API_BASE_URL?.trim() || process.env.TREESEED_API_BASE_URL?.trim() || process.env.TREESEED_CENTRAL_MARKET_API_BASE_URL?.trim() || context.deployConfig.runtime?.marketBaseUrl?.trim() || context.deployConfig.hosting?.marketBaseUrl?.trim() || DEFAULT_TREESEED_MARKET_BASE_URL;
|
|
248
269
|
}
|
|
249
270
|
function resolveCentralMarketBaseUrl(context, scope, values = {}) {
|
|
250
271
|
return values.TREESEED_CENTRAL_MARKET_API_BASE_URL?.trim() || process.env.TREESEED_CENTRAL_MARKET_API_BASE_URL?.trim() || resolveMarketBaseUrl(context, scope, values) || DEFAULT_TREESEED_MARKET_BASE_URL;
|
|
251
272
|
}
|
|
252
273
|
function resolveCatalogMarketBaseUrls(context, scope, values = {}) {
|
|
253
|
-
return values.TREESEED_CATALOG_MARKET_API_BASE_URLS?.trim() || values.
|
|
274
|
+
return values.TREESEED_CATALOG_MARKET_API_BASE_URLS?.trim() || values.TREESEED_API_BASE_URL?.trim() || values.TREESEED_CENTRAL_MARKET_API_BASE_URL?.trim() || process.env.TREESEED_CATALOG_MARKET_API_BASE_URLS?.trim() || resolveCentralMarketBaseUrl(context, scope, values);
|
|
254
275
|
}
|
|
255
276
|
function resolveHostedTeamId(context) {
|
|
256
277
|
return context.deployConfig.slug;
|
|
@@ -262,7 +283,7 @@ function resolveRailwayWorkspaceDefault() {
|
|
|
262
283
|
return "knowledge-coop";
|
|
263
284
|
}
|
|
264
285
|
function resolvePlatformRunnerIdDefault(_context, scope) {
|
|
265
|
-
return scope === "prod" ? "
|
|
286
|
+
return scope === "prod" ? "treeseed-ops-prod-1" : scope === "staging" ? "treeseed-ops-staging-1" : "treeseed-ops-local-1";
|
|
266
287
|
}
|
|
267
288
|
function resolvePlatformRunnerEnvironmentDefault(_context, scope) {
|
|
268
289
|
return scope === "prod" ? "production" : scope;
|
|
@@ -280,10 +301,18 @@ function parseGitHubRepositorySlugFromRemote(remoteUrl) {
|
|
|
280
301
|
return null;
|
|
281
302
|
}
|
|
282
303
|
function resolveGitHubOriginRepository(context) {
|
|
283
|
-
const
|
|
304
|
+
const rootResult = runTreeseedGit(["rev-parse", "--show-toplevel"], {
|
|
284
305
|
cwd: context.tenantRoot,
|
|
285
|
-
|
|
286
|
-
|
|
306
|
+
mode: "read",
|
|
307
|
+
allowFailure: true
|
|
308
|
+
});
|
|
309
|
+
if (rootResult.status !== 0 || resolve(rootResult.stdout.trim()) !== resolve(context.tenantRoot)) {
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
const result = runTreeseedGit(["remote", "get-url", "origin"], {
|
|
313
|
+
cwd: context.tenantRoot,
|
|
314
|
+
mode: "read",
|
|
315
|
+
allowFailure: true
|
|
287
316
|
});
|
|
288
317
|
if (result.status !== 0) {
|
|
289
318
|
return null;
|
|
@@ -301,8 +330,9 @@ const VALUE_RESOLVERS = {
|
|
|
301
330
|
localFormsBypassDefault: () => "true",
|
|
302
331
|
localSmtpHostDefault: () => localSmtpHostDefault(),
|
|
303
332
|
localSmtpPortDefault: () => localSmtpPortDefault(),
|
|
333
|
+
localApiDatabaseUrlDefault: (context, scope, values) => localApiDatabaseUrlDefault(context, scope, values),
|
|
304
334
|
contactEmailDefault: (context) => contactEmailDefault(context),
|
|
305
|
-
projectDomainsDefault: (context) =>
|
|
335
|
+
projectDomainsDefault: (context, scope) => projectDomainsDefault(context, scope),
|
|
306
336
|
apiBaseUrlDefault: (context, scope, values) => resolveConfiguredApiBaseUrl(context, scope, values),
|
|
307
337
|
webServiceIdDefault: (_context, _scope, values) => resolveWebServiceId(values),
|
|
308
338
|
apiWebServiceIdDefault: (_context, _scope, values) => resolveApiWebServiceId(values),
|
|
@@ -324,6 +354,7 @@ const VALUE_RESOLVERS = {
|
|
|
324
354
|
platformRunnerIdDefault: (context, scope) => resolvePlatformRunnerIdDefault(context, scope),
|
|
325
355
|
platformRunnerEnvironmentDefault: (context, scope) => resolvePlatformRunnerEnvironmentDefault(context, scope),
|
|
326
356
|
platformRunnerDataDirDefault: () => "/data",
|
|
357
|
+
treedxDockerImageDefault: () => "treeseed/treedx:latest",
|
|
327
358
|
githubOwnerDefault: (context) => resolveGitHubOwnerDefault(context),
|
|
328
359
|
githubRepositoryNameDefault: (context) => resolveGitHubRepositoryNameDefault(context),
|
|
329
360
|
githubRepositoryVisibilityDefault: () => "private",
|
|
@@ -350,6 +381,7 @@ const PREDICATES = {
|
|
|
350
381
|
processingPlaneEnabled: (context) => processingPlaneEnabled(context),
|
|
351
382
|
formsEnabled: (context) => formsEnabled(context),
|
|
352
383
|
codexExecutionSelected: (context) => codexExecutionSelected(context),
|
|
384
|
+
copilotExecutionSelected: (context) => copilotExecutionSelected(context),
|
|
353
385
|
railwayManagedEnabled: (context) => railwayManagedEnabled(context),
|
|
354
386
|
hubTreeseedHosted: (context) => resolveHubMode(context) === "treeseed_hosted",
|
|
355
387
|
hubCustomerHosted: (context) => resolveHubMode(context) === "customer_hosted",
|
|
@@ -413,6 +445,44 @@ function readPluginEnvironmentOverlay(baseDir) {
|
|
|
413
445
|
}
|
|
414
446
|
return null;
|
|
415
447
|
}
|
|
448
|
+
function packageRepositoryCredentialOverlay(tenantRoot) {
|
|
449
|
+
const entries = {};
|
|
450
|
+
let packages = [];
|
|
451
|
+
try {
|
|
452
|
+
packages = discoverTreeseedPackageAdapters(tenantRoot);
|
|
453
|
+
} catch {
|
|
454
|
+
packages = [];
|
|
455
|
+
}
|
|
456
|
+
for (const pkg of packages) {
|
|
457
|
+
const repository = typeof pkg.metadata.repository === "string" && pkg.metadata.repository.trim() ? pkg.metadata.repository.trim() : null;
|
|
458
|
+
if (!repository) continue;
|
|
459
|
+
let id = "";
|
|
460
|
+
try {
|
|
461
|
+
id = githubRepositoryCredentialEnvName(repository);
|
|
462
|
+
} catch {
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
entries[id] = {
|
|
466
|
+
label: `${pkg.name} GitHub token`,
|
|
467
|
+
group: "github",
|
|
468
|
+
cluster: `github:${repository}`,
|
|
469
|
+
description: `GitHub token used by Treeseed package workflows for ${pkg.name} in ${repository}.`,
|
|
470
|
+
howToGet: `Create a GitHub token with Actions workflow and environment secret permissions for ${repository}, then store it as ${id}.`,
|
|
471
|
+
sensitivity: "secret",
|
|
472
|
+
targets: ["local-runtime"],
|
|
473
|
+
scopes: ["staging", "prod"],
|
|
474
|
+
storage: "shared",
|
|
475
|
+
requirement: "optional",
|
|
476
|
+
purposes: ["deploy", "config"],
|
|
477
|
+
validation: {
|
|
478
|
+
kind: "nonempty",
|
|
479
|
+
minLength: 8
|
|
480
|
+
},
|
|
481
|
+
sourcePriority: ["machine-config", "process-env"]
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
return { entries };
|
|
485
|
+
}
|
|
416
486
|
function loadTreeseedEnvironmentOverlay(tenantRoot) {
|
|
417
487
|
const overlayPath = resolve(tenantRoot, TENANT_ENVIRONMENT_OVERLAY_PATH);
|
|
418
488
|
return {
|
|
@@ -460,23 +530,54 @@ function mergeEntryYaml(baseEntry, id, override) {
|
|
|
460
530
|
}
|
|
461
531
|
function collectOverlaySources(context) {
|
|
462
532
|
const sources = [];
|
|
463
|
-
const
|
|
533
|
+
const sdkEnvironmentPath = resolveSdkEnvironmentPath();
|
|
534
|
+
const sdkOverlay = readYamlOverlayIfPresent(sdkEnvironmentPath);
|
|
464
535
|
if (!sdkOverlay) {
|
|
465
|
-
throw new Error(`Treeseed SDK environment registry file was not found at ${
|
|
536
|
+
throw new Error(`Treeseed SDK environment registry file was not found at ${sdkEnvironmentPath}.`);
|
|
466
537
|
}
|
|
467
|
-
sources.push({ label:
|
|
538
|
+
sources.push({ label: sdkEnvironmentPath, overlay: sdkOverlay });
|
|
468
539
|
if (webSurfaceEnabled(context)) {
|
|
469
|
-
const
|
|
540
|
+
const coreEnvironmentPath = resolveSiblingPackageEnvironmentPath("core");
|
|
541
|
+
const coreOverlay = readYamlOverlayIfPresent(coreEnvironmentPath);
|
|
470
542
|
if (coreOverlay) {
|
|
471
|
-
sources.push({ label:
|
|
543
|
+
sources.push({ label: coreEnvironmentPath, overlay: coreOverlay });
|
|
472
544
|
}
|
|
473
545
|
}
|
|
474
546
|
if (apiSurfaceEnabled(context) || processingPlaneEnabled(context)) {
|
|
475
|
-
const
|
|
547
|
+
const apiEnvironmentPath = resolveSiblingPackageEnvironmentPath("api");
|
|
548
|
+
const apiOverlay = readYamlOverlayIfPresent(apiEnvironmentPath);
|
|
549
|
+
if (apiOverlay) {
|
|
550
|
+
sources.push({ label: apiEnvironmentPath, overlay: apiOverlay });
|
|
551
|
+
}
|
|
552
|
+
const agentEnvironmentPath = resolveSiblingPackageEnvironmentPath("agent");
|
|
553
|
+
const agentOverlay = readYamlOverlayIfPresent(agentEnvironmentPath);
|
|
476
554
|
if (agentOverlay) {
|
|
477
|
-
sources.push({ label:
|
|
555
|
+
sources.push({ label: agentEnvironmentPath, overlay: agentOverlay });
|
|
478
556
|
}
|
|
479
557
|
}
|
|
558
|
+
let discoveredApiApps = [];
|
|
559
|
+
try {
|
|
560
|
+
discoveredApiApps = discoverTreeseedApplications(context.tenantRoot).filter((application) => application.root !== context.tenantRoot && application.roles.some((role) => role === "api" || role === "operations-runner" || role === "treeseed-control-plane"));
|
|
561
|
+
} catch {
|
|
562
|
+
discoveredApiApps = [];
|
|
563
|
+
}
|
|
564
|
+
const discoveredApiEnvironmentPath = resolveSiblingPackageEnvironmentPath("api");
|
|
565
|
+
if (discoveredApiApps.length > 0 && !sources.some((source) => source.label === discoveredApiEnvironmentPath)) {
|
|
566
|
+
const apiOverlay = readYamlOverlayIfPresent(discoveredApiEnvironmentPath);
|
|
567
|
+
if (apiOverlay) {
|
|
568
|
+
sources.push({ label: discoveredApiEnvironmentPath, overlay: apiOverlay });
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
for (const application of discoveredApiApps) {
|
|
572
|
+
const overlay = readYamlOverlayIfPresent(resolve(application.root, "src/env.yaml"));
|
|
573
|
+
if (overlay) {
|
|
574
|
+
sources.push({ label: resolve(application.root, "src/env.yaml"), overlay });
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
const packageCredentialOverlay = packageRepositoryCredentialOverlay(context.tenantRoot);
|
|
578
|
+
if (Object.keys(packageCredentialOverlay.entries ?? {}).length > 0) {
|
|
579
|
+
sources.push({ label: "discovered package repository credentials", overlay: packageCredentialOverlay });
|
|
580
|
+
}
|
|
480
581
|
for (const pluginEntry of context.plugins) {
|
|
481
582
|
const fileOverlay = readPluginEnvironmentOverlay(pluginEntry.baseDir);
|
|
482
583
|
if (fileOverlay) {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TreeseedDesiredEnvironment, TreeseedDesiredResource } from './desired-state.js';
|
|
2
|
+
export declare const TREESEED_LOCAL_CONTENT_MODES: readonly ["auto", "none", "preview", "edit"];
|
|
3
|
+
export type TreeseedLocalContentMode = typeof TREESEED_LOCAL_CONTENT_MODES[number];
|
|
4
|
+
export type TreeseedLocalContentMaterializationStatus = 'not_requested' | 'existing_path_ready' | 'existing_path_missing' | 'managed_clone_ready' | 'managed_clone_missing' | 'submodule_ready' | 'submodule_missing' | 'site_not_prepared' | 'blocked';
|
|
5
|
+
export declare function buildProjectLocalContentResources({ tenantRoot, environment, localContent, }: {
|
|
6
|
+
tenantRoot: string;
|
|
7
|
+
environment: TreeseedDesiredEnvironment;
|
|
8
|
+
localContent?: TreeseedLocalContentMode;
|
|
9
|
+
}): TreeseedDesiredResource[];
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { existsSync, statSync } from "node:fs";
|
|
2
|
+
import { basename, resolve } from "node:path";
|
|
3
|
+
import { loadAndPlanSeed } from "../seeds/index.js";
|
|
4
|
+
const TREESEED_LOCAL_CONTENT_MODES = ["auto", "none", "preview", "edit"];
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function stringValue(value, fallback = "") {
|
|
9
|
+
return typeof value === "string" && value.trim() ? value.trim() : fallback;
|
|
10
|
+
}
|
|
11
|
+
function safeSegment(value) {
|
|
12
|
+
return value.toLowerCase().replace(/[^a-z0-9]+/gu, "-").replace(/^-+|-+$/gu, "") || "project";
|
|
13
|
+
}
|
|
14
|
+
function normalizeRelativePath(value, fallback = ".") {
|
|
15
|
+
const raw = stringValue(value, fallback).replace(/\\/gu, "/").replace(/^\/+/u, "");
|
|
16
|
+
const parts = raw.split("/").filter((part) => part && part !== ".");
|
|
17
|
+
if (parts.some((part) => part === "..")) {
|
|
18
|
+
return fallback;
|
|
19
|
+
}
|
|
20
|
+
return parts.length === 0 ? "." : parts.join("/");
|
|
21
|
+
}
|
|
22
|
+
function pathFrom(root, ...parts) {
|
|
23
|
+
const clean = parts.filter((part) => Boolean(part && part !== "."));
|
|
24
|
+
return resolve(root, ...clean);
|
|
25
|
+
}
|
|
26
|
+
function isPreparedSitePath(path) {
|
|
27
|
+
if (!existsSync(path)) return false;
|
|
28
|
+
const stat = statSync(path);
|
|
29
|
+
if (!stat.isDirectory()) return false;
|
|
30
|
+
return [
|
|
31
|
+
"treeseed.site.yaml",
|
|
32
|
+
"astro.config.ts",
|
|
33
|
+
"astro.config.ts",
|
|
34
|
+
"package.json",
|
|
35
|
+
"src"
|
|
36
|
+
].some((entry) => existsSync(resolve(path, entry)));
|
|
37
|
+
}
|
|
38
|
+
function contentSourceMode(source) {
|
|
39
|
+
if (source === "local_directory") return "local_directory";
|
|
40
|
+
if (source === "treedx_snapshot") return "treedx";
|
|
41
|
+
return "r2";
|
|
42
|
+
}
|
|
43
|
+
function projectRepository(value) {
|
|
44
|
+
if (!isRecord(value)) return null;
|
|
45
|
+
const provider = stringValue(value.provider);
|
|
46
|
+
const owner = stringValue(value.owner);
|
|
47
|
+
const name = stringValue(value.name);
|
|
48
|
+
const gitUrl = stringValue(value.gitUrl);
|
|
49
|
+
const role = stringValue(value.role, "software");
|
|
50
|
+
if (!provider || !owner || !name || !gitUrl) return null;
|
|
51
|
+
return {
|
|
52
|
+
role,
|
|
53
|
+
provider,
|
|
54
|
+
owner,
|
|
55
|
+
name,
|
|
56
|
+
gitUrl,
|
|
57
|
+
defaultBranch: stringValue(value.defaultBranch, "main"),
|
|
58
|
+
checkoutPath: stringValue(value.checkoutPath) || void 0,
|
|
59
|
+
submodulePath: stringValue(value.submodulePath) || void 0,
|
|
60
|
+
webUrl: stringValue(value.webUrl) || void 0
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function projectArchitecture(value) {
|
|
64
|
+
if (!isRecord(value)) return null;
|
|
65
|
+
const topology = stringValue(value.topology);
|
|
66
|
+
const contentRuntimeSource = stringValue(value.contentRuntimeSource);
|
|
67
|
+
const localContentMaterialization = stringValue(value.localContentMaterialization);
|
|
68
|
+
if (!topology || !contentRuntimeSource || !localContentMaterialization) return null;
|
|
69
|
+
return {
|
|
70
|
+
topology,
|
|
71
|
+
rootPath: normalizeRelativePath(value.rootPath),
|
|
72
|
+
sitePath: normalizeRelativePath(value.sitePath),
|
|
73
|
+
contentPath: stringValue(value.contentPath) ? normalizeRelativePath(value.contentPath) : void 0,
|
|
74
|
+
contentRuntimeSource,
|
|
75
|
+
localContentMaterialization,
|
|
76
|
+
contentPublishTarget: isRecord(value.contentPublishTarget) ? value.contentPublishTarget : void 0,
|
|
77
|
+
requiresLocalContentForCi: value.requiresLocalContentForCi === true,
|
|
78
|
+
requiresLocalContentForDeploy: value.requiresLocalContentForDeploy === true
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function hubRepository(value) {
|
|
82
|
+
if (!isRecord(value)) return null;
|
|
83
|
+
const payload = value;
|
|
84
|
+
const projectKey = stringValue(payload.projectKey);
|
|
85
|
+
const role = stringValue(payload.role);
|
|
86
|
+
const provider = stringValue(payload.provider);
|
|
87
|
+
const owner = stringValue(payload.owner);
|
|
88
|
+
const name = stringValue(payload.name);
|
|
89
|
+
const gitUrl = stringValue(payload.gitUrl);
|
|
90
|
+
if (!projectKey || role !== "content" || !provider || !owner || !name || !gitUrl) return null;
|
|
91
|
+
return {
|
|
92
|
+
projectKey,
|
|
93
|
+
role,
|
|
94
|
+
provider,
|
|
95
|
+
owner,
|
|
96
|
+
name,
|
|
97
|
+
gitUrl,
|
|
98
|
+
defaultBranch: stringValue(payload.defaultBranch) || stringValue(payload.currentBranch) || "main",
|
|
99
|
+
submodulePath: stringValue(payload.submodulePath) || void 0
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function requestedMaterialization(architecture, mode) {
|
|
103
|
+
if (mode === "none") return "none";
|
|
104
|
+
if (mode === "preview" || mode === "edit") {
|
|
105
|
+
if (architecture.localContentMaterialization === "none" && architecture.contentRuntimeSource !== "local_directory") {
|
|
106
|
+
return "managed_clone";
|
|
107
|
+
}
|
|
108
|
+
return architecture.localContentMaterialization === "none" ? "managed_clone" : architecture.localContentMaterialization;
|
|
109
|
+
}
|
|
110
|
+
return architecture.localContentMaterialization;
|
|
111
|
+
}
|
|
112
|
+
function buildProjectLocalContentResources({
|
|
113
|
+
tenantRoot,
|
|
114
|
+
environment,
|
|
115
|
+
localContent = "auto"
|
|
116
|
+
}) {
|
|
117
|
+
if (environment !== "local") return [];
|
|
118
|
+
const seed = loadAndPlanSeed({
|
|
119
|
+
projectRoot: tenantRoot,
|
|
120
|
+
seedName: "treeseed",
|
|
121
|
+
environments: "local",
|
|
122
|
+
mode: "plan"
|
|
123
|
+
});
|
|
124
|
+
if (!seed.ok || !seed.plan) return [];
|
|
125
|
+
const contentRepositories = /* @__PURE__ */ new Map();
|
|
126
|
+
for (const action of seed.plan.actions) {
|
|
127
|
+
if (action.kind !== "hubRepository") continue;
|
|
128
|
+
const repo = hubRepository(action.payload);
|
|
129
|
+
if (repo) contentRepositories.set(repo.projectKey, repo);
|
|
130
|
+
}
|
|
131
|
+
return seed.plan.actions.flatMap((action) => {
|
|
132
|
+
if (action.kind !== "project") return [];
|
|
133
|
+
const payload = action.payload;
|
|
134
|
+
const architecture = projectArchitecture(payload.architecture);
|
|
135
|
+
const repository = projectRepository(payload.repository);
|
|
136
|
+
const slug = stringValue(payload.slug, safeSegment(action.key));
|
|
137
|
+
const teamSlug = stringValue(payload.teamKey, "team:treeseed").replace(/^team:/u, "") || "treeseed";
|
|
138
|
+
if (!architecture || !repository) return [];
|
|
139
|
+
const contentRepository = contentRepositories.get(action.key) ?? repository;
|
|
140
|
+
const materialization = requestedMaterialization(architecture, localContent);
|
|
141
|
+
const rootPath = normalizeRelativePath(architecture.rootPath);
|
|
142
|
+
const sitePath = normalizeRelativePath(architecture.sitePath);
|
|
143
|
+
const contentPath = architecture.contentPath ? normalizeRelativePath(architecture.contentPath) : null;
|
|
144
|
+
const repositoryCheckoutPath = normalizeRelativePath(repository.checkoutPath, ".");
|
|
145
|
+
const sourceRepoSlug = `${contentRepository.owner}/${contentRepository.name}`;
|
|
146
|
+
const managedTarget = pathFrom(tenantRoot, ".treeseed", "local-content", safeSegment(teamSlug), safeSegment(slug), "content");
|
|
147
|
+
const existingRoot = pathFrom(tenantRoot, repositoryCheckoutPath, rootPath);
|
|
148
|
+
const effectiveLocalPath = materialization === "managed_clone" ? managedTarget : materialization === "submodule" ? pathFrom(tenantRoot, repositoryCheckoutPath, normalizeRelativePath(contentRepository.submodulePath ?? repository.submodulePath ?? contentPath ?? sitePath)) : materialization === "existing_path" ? pathFrom(existingRoot, contentPath ?? sitePath) : null;
|
|
149
|
+
const siteLocalPath = materialization === "managed_clone" ? pathFrom(managedTarget, sitePath) : pathFrom(existingRoot, sitePath);
|
|
150
|
+
const siteReady = isPreparedSitePath(siteLocalPath);
|
|
151
|
+
const exists = effectiveLocalPath ? existsSync(effectiveLocalPath) : false;
|
|
152
|
+
const materializationStatus = materialization === "none" ? "not_requested" : materialization === "existing_path" ? exists ? siteReady ? "existing_path_ready" : "site_not_prepared" : "existing_path_missing" : materialization === "managed_clone" ? exists ? siteReady ? "managed_clone_ready" : "site_not_prepared" : "managed_clone_missing" : exists ? siteReady ? "submodule_ready" : "site_not_prepared" : "submodule_missing";
|
|
153
|
+
const executeRequested = (localContent === "preview" || localContent === "edit") && (materialization === "managed_clone" || materialization === "submodule");
|
|
154
|
+
return [{
|
|
155
|
+
id: `local-content-materialization:${safeSegment(teamSlug)}:${safeSegment(slug)}:content`,
|
|
156
|
+
kind: "local-content-materialization",
|
|
157
|
+
provider: "local",
|
|
158
|
+
environment,
|
|
159
|
+
packageId: "@treeseed/market",
|
|
160
|
+
serviceId: `content:${slug}`,
|
|
161
|
+
logicalName: `${stringValue(payload.name, slug)} local content materialization`,
|
|
162
|
+
dependencies: architecture.contentRuntimeSource === "treedx_snapshot" && !executeRequested ? ["local-treedx:team-primary"] : [],
|
|
163
|
+
spec: {
|
|
164
|
+
teamKey: stringValue(payload.teamKey, "team:treeseed"),
|
|
165
|
+
teamSlug,
|
|
166
|
+
projectKey: action.key,
|
|
167
|
+
projectSlug: slug,
|
|
168
|
+
projectName: stringValue(payload.name, slug),
|
|
169
|
+
topology: architecture.topology,
|
|
170
|
+
rootPath,
|
|
171
|
+
sitePath,
|
|
172
|
+
contentPath,
|
|
173
|
+
contentRuntimeSource: architecture.contentRuntimeSource,
|
|
174
|
+
contentSourceMode: contentSourceMode(architecture.contentRuntimeSource),
|
|
175
|
+
localContentMaterialization: materialization,
|
|
176
|
+
configuredLocalContentMaterialization: architecture.localContentMaterialization,
|
|
177
|
+
requestedLocalContentMode: localContent,
|
|
178
|
+
executeRequested,
|
|
179
|
+
repository: {
|
|
180
|
+
provider: repository.provider,
|
|
181
|
+
owner: repository.owner,
|
|
182
|
+
name: repository.name,
|
|
183
|
+
gitUrl: repository.gitUrl,
|
|
184
|
+
defaultBranch: repository.defaultBranch ?? "main",
|
|
185
|
+
checkoutPath: repository.checkoutPath ?? null,
|
|
186
|
+
submodulePath: repository.submodulePath ?? null
|
|
187
|
+
},
|
|
188
|
+
contentRepository: {
|
|
189
|
+
provider: contentRepository.provider,
|
|
190
|
+
owner: contentRepository.owner,
|
|
191
|
+
name: contentRepository.name,
|
|
192
|
+
gitUrl: contentRepository.gitUrl,
|
|
193
|
+
defaultBranch: contentRepository.defaultBranch ?? repository.defaultBranch ?? "main",
|
|
194
|
+
submodulePath: contentRepository.submodulePath ?? null
|
|
195
|
+
},
|
|
196
|
+
sourceRepoSlug,
|
|
197
|
+
effectiveLocalPath,
|
|
198
|
+
siteLocalPath,
|
|
199
|
+
docsSiteReadiness: siteReady ? "ready" : "site_not_prepared",
|
|
200
|
+
materializationStatus,
|
|
201
|
+
targetRelativePath: effectiveLocalPath ? effectiveLocalPath.replace(`${tenantRoot}/`, "") : null,
|
|
202
|
+
managedCloneRoot: resolve(tenantRoot, ".treeseed", "local-content"),
|
|
203
|
+
defaultDirectoryName: basename(effectiveLocalPath ?? slug)
|
|
204
|
+
},
|
|
205
|
+
source: { type: "package-adapter", id: `project-architecture:${action.key}` }
|
|
206
|
+
}];
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
export {
|
|
210
|
+
TREESEED_LOCAL_CONTENT_MODES,
|
|
211
|
+
buildProjectLocalContentResources
|
|
212
|
+
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { TreeseedDeployConfig, TreeseedPlatformLayerDefinition, TreeseedPlatformResourceKind, TreeseedPlatformSurfaceName, TreeseedTenantConfig } from './contracts.
|
|
2
|
-
import type { TreeseedEnvironmentRegistryOverlay } from './environment.
|
|
3
|
-
import type { SdkGraphRankingProvider } from '../sdk-types.
|
|
4
|
-
import type { TreeseedReconcileAdapter } from '../reconcile/contracts.
|
|
1
|
+
import type { TreeseedDeployConfig, TreeseedPlatformLayerDefinition, TreeseedPlatformResourceKind, TreeseedPlatformSurfaceName, TreeseedTenantConfig } from './contracts.js';
|
|
2
|
+
import type { TreeseedEnvironmentRegistryOverlay } from './environment.js';
|
|
3
|
+
import type { SdkGraphRankingProvider } from '../sdk-types.js';
|
|
4
|
+
import type { TreeseedReconcileAdapter } from '../reconcile/contracts.js';
|
|
5
|
+
import type { TreeseedApplicationHostingProfile, TreeseedHostAdapter, TreeseedServiceTypeAdapter } from '../hosting/contracts.js';
|
|
5
6
|
export type TreeseedSiteLayerDefinition = TreeseedPlatformLayerDefinition & {
|
|
6
7
|
kinds?: Array<'pages' | 'styles' | 'components'>;
|
|
7
8
|
};
|
|
@@ -65,6 +66,13 @@ export type TreeseedContentProviderContext = TreeseedPluginEnvironmentContext &
|
|
|
65
66
|
tenantConfig: TreeseedTenantConfig;
|
|
66
67
|
};
|
|
67
68
|
export type TreeseedGraphRankingProviderContribution = SdkGraphRankingProvider | ((context: TreeseedPluginEnvironmentContext) => SdkGraphRankingProvider | undefined);
|
|
69
|
+
export type TreeseedHostingContribution = {
|
|
70
|
+
hostAdapters?: Record<string, TreeseedHostAdapter>;
|
|
71
|
+
serviceTypeAdapters?: Record<string, TreeseedServiceTypeAdapter>;
|
|
72
|
+
profiles?: TreeseedApplicationHostingProfile[];
|
|
73
|
+
uiPlacements?: Record<string, unknown>;
|
|
74
|
+
environmentDefaults?: Record<string, unknown>;
|
|
75
|
+
};
|
|
68
76
|
export interface TreeseedPlugin {
|
|
69
77
|
id?: string;
|
|
70
78
|
provides?: Record<string, any> & {
|
|
@@ -88,6 +96,7 @@ export interface TreeseedPlugin {
|
|
|
88
96
|
platformLayers?: TreeseedPlatformLayerContribution[] | ((context: TreeseedPluginPlatformContext) => TreeseedPlatformLayerContribution[] | undefined);
|
|
89
97
|
environmentRegistry?: TreeseedEnvironmentRegistryOverlay | ((context: TreeseedPluginEnvironmentContext) => TreeseedEnvironmentRegistryOverlay | undefined);
|
|
90
98
|
reconcileAdapters?: Record<string, TreeseedReconcileAdapter | ((context: TreeseedPluginEnvironmentContext) => TreeseedReconcileAdapter | undefined)> | ((context: TreeseedPluginEnvironmentContext) => Record<string, TreeseedReconcileAdapter | ((context: TreeseedPluginEnvironmentContext) => TreeseedReconcileAdapter | undefined)> | undefined);
|
|
99
|
+
hosting?: TreeseedHostingContribution | ((context: TreeseedPluginEnvironmentContext) => TreeseedHostingContribution | undefined);
|
|
91
100
|
graphRankingProviders?: Record<string, TreeseedGraphRankingProviderContribution>;
|
|
92
101
|
[key: string]: unknown;
|
|
93
102
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { TreeseedDeployConfig } from '../contracts.
|
|
2
|
-
import type { TreeseedPluginEnvironmentContext } from '../plugin.
|
|
3
|
-
import type { SdkGraphRankingProvider } from '../../sdk-types.
|
|
1
|
+
import type { TreeseedDeployConfig } from '../contracts.js';
|
|
2
|
+
import type { TreeseedPluginEnvironmentContext } from '../plugin.js';
|
|
3
|
+
import type { SdkGraphRankingProvider } from '../../sdk-types.js';
|
|
4
4
|
type LoadedPluginEntry = {
|
|
5
5
|
package: string;
|
|
6
6
|
config: Record<string, unknown>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { existsSync } from "node:fs";
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
2
3
|
import { createRequire } from "node:module";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
import { fileURLToPath } from "node:url";
|
|
@@ -52,6 +53,59 @@ function resolveInstalledPluginPath(packageName, tenantRoot) {
|
|
|
52
53
|
paths: [tenantRoot, process.cwd()]
|
|
53
54
|
});
|
|
54
55
|
}
|
|
56
|
+
function parseTreeseedPackageReference(packageName) {
|
|
57
|
+
const match = packageName.match(/^@treeseed\/([^/]+)(?:\/(.+))?$/u);
|
|
58
|
+
if (!match) return null;
|
|
59
|
+
return {
|
|
60
|
+
packageId: match[1],
|
|
61
|
+
subpath: match[2] ?? "index"
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function buildWorkspacePluginArtifacts(packageDir, packageName) {
|
|
65
|
+
const packageJsonPath = path.resolve(packageDir, "package.json");
|
|
66
|
+
let packageJson;
|
|
67
|
+
try {
|
|
68
|
+
packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
|
|
69
|
+
} catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const scripts = packageJson.scripts && typeof packageJson.scripts === "object" && !Array.isArray(packageJson.scripts) ? packageJson.scripts : {};
|
|
73
|
+
const buildScript = typeof scripts["build:dist"] === "string" && scripts["build:dist"].trim() ? "build:dist" : typeof scripts.build === "string" && scripts.build.trim() ? "build" : null;
|
|
74
|
+
if (!buildScript) return false;
|
|
75
|
+
const result = spawnSync("npm", ["--prefix", packageDir, "run", buildScript], {
|
|
76
|
+
cwd: path.resolve(packageDir, "..", ".."),
|
|
77
|
+
stdio: "inherit",
|
|
78
|
+
env: process.env
|
|
79
|
+
});
|
|
80
|
+
if (result.status !== 0) {
|
|
81
|
+
throw new Error(`Failed to build ${packageName} workspace plugin artifacts with npm run ${buildScript}.`);
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
function resolveLocalWorkspacePluginPath(packageName, tenantRoot) {
|
|
86
|
+
const parsed = parseTreeseedPackageReference(packageName);
|
|
87
|
+
if (!parsed) return null;
|
|
88
|
+
const packageDir = path.resolve(tenantRoot, "packages", parsed.packageId);
|
|
89
|
+
const packageJsonPath = path.resolve(packageDir, "package.json");
|
|
90
|
+
if (!existsSync(packageJsonPath)) return null;
|
|
91
|
+
try {
|
|
92
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
|
|
93
|
+
if (packageJson?.name !== `@treeseed/${parsed.packageId}`) return null;
|
|
94
|
+
} catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const normalizedSubpath = parsed.subpath.replace(/^\.\//u, "").replace(/\.js$/u, "");
|
|
98
|
+
const candidates = [
|
|
99
|
+
path.resolve(packageDir, "dist", `${normalizedSubpath}.js`),
|
|
100
|
+
path.resolve(packageDir, `${normalizedSubpath}.js`)
|
|
101
|
+
];
|
|
102
|
+
const existing = candidates.find((candidate) => existsSync(candidate));
|
|
103
|
+
if (existing) return existing;
|
|
104
|
+
if (buildWorkspacePluginArtifacts(packageDir, packageName)) {
|
|
105
|
+
return candidates.find((candidate) => existsSync(candidate)) ?? null;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
55
109
|
function loadPluginModule(packageName, tenantRoot) {
|
|
56
110
|
if (packageName === TREESEED_DEFAULT_PLUGIN_PACKAGE) {
|
|
57
111
|
const localDefaultPluginPath = resolveLocalDefaultPluginPath();
|
|
@@ -68,6 +122,13 @@ function loadPluginModule(packageName, tenantRoot) {
|
|
|
68
122
|
baseDir: path.dirname(resolvedPath2)
|
|
69
123
|
};
|
|
70
124
|
}
|
|
125
|
+
const localWorkspacePluginPath = resolveLocalWorkspacePluginPath(packageName, tenantRoot);
|
|
126
|
+
if (localWorkspacePluginPath) {
|
|
127
|
+
return {
|
|
128
|
+
moduleExports: require2(localWorkspacePluginPath),
|
|
129
|
+
baseDir: path.dirname(localWorkspacePluginPath)
|
|
130
|
+
};
|
|
131
|
+
}
|
|
71
132
|
const resolvedPath = resolveInstalledPluginPath(packageName, tenantRoot);
|
|
72
133
|
return {
|
|
73
134
|
moduleExports: require2(resolvedPath),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { TREESEED_DEFAULT_PLUGIN_PACKAGE, TREESEED_DEFAULT_PLUGIN_REFERENCES, TREESEED_DEFAULT_PROVIDER_SELECTIONS, } from './plugins/constants.
|
|
2
|
-
export { getTreeseedAgentProviderSelections, getTreeseedContentPublishProvider, getTreeseedContentRuntimeProvider, getTreeseedDeployConfig, getTreeseedDeployProvider, getTreeseedDocsProvider, getTreeseedFormsProvider, getTreeseedOperationsProvider, getTreeseedSiteProvider, isTreeseedSmtpEnabled, isTreeseedTurnstileEnabled, resetTreeseedDeployConfigForTests, } from './deploy-runtime.
|
|
3
|
-
export { defineTreeseedPlugin } from './plugin.
|
|
4
|
-
export type * from './plugin.
|
|
5
|
-
export { loadTreeseedPluginRuntime, loadTreeseedPlugins, resolveTreeseedGraphRankingProvider } from './plugins/runtime.
|
|
6
|
-
export type { LoadedTreeseedPluginEntry } from './plugins/runtime.
|
|
1
|
+
export { TREESEED_DEFAULT_PLUGIN_PACKAGE, TREESEED_DEFAULT_PLUGIN_REFERENCES, TREESEED_DEFAULT_PROVIDER_SELECTIONS, } from './plugins/constants.js';
|
|
2
|
+
export { getTreeseedAgentProviderSelections, getTreeseedContentPublishProvider, getTreeseedContentRuntimeProvider, getTreeseedDeployConfig, getTreeseedDeployProvider, getTreeseedDocsProvider, getTreeseedFormsProvider, getTreeseedOperationsProvider, getTreeseedSiteProvider, isTreeseedSmtpEnabled, isTreeseedTurnstileEnabled, resetTreeseedDeployConfigForTests, } from './deploy-runtime.js';
|
|
3
|
+
export { defineTreeseedPlugin } from './plugin.js';
|
|
4
|
+
export type * from './plugin.js';
|
|
5
|
+
export { loadTreeseedPluginRuntime, loadTreeseedPlugins, resolveTreeseedGraphRankingProvider } from './plugins/runtime.js';
|
|
6
|
+
export type { LoadedTreeseedPluginEntry } from './plugins/runtime.js';
|