@treeseed/sdk 0.10.28 → 0.12.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +213 -7
- package/dist/agent-capacity.d.ts +916 -0
- package/dist/agent-capacity.js +1600 -0
- package/dist/agent-tools.d.ts +37 -0
- package/dist/agent-tools.js +301 -0
- package/dist/api/app.d.ts +1 -1
- package/dist/api/auth/d1-database.d.ts +2 -2
- package/dist/api/auth/d1-provider.d.ts +4 -4
- package/dist/api/auth/d1-store.d.ts +2 -2
- package/dist/api/auth/memory-provider.d.ts +1 -1
- package/dist/api/auth/tokens.d.ts +1 -1
- package/dist/api/config.d.ts +3 -1
- package/dist/api/config.js +34 -10
- package/dist/api/http.d.ts +2 -2
- package/dist/api/index.d.ts +10 -10
- package/dist/api/index.js +4 -2
- package/dist/api/operations-routes.d.ts +3 -3
- package/dist/api/operations.d.ts +1 -1
- package/dist/api/providers.d.ts +1 -1
- package/dist/api/providers.js +21 -4
- package/dist/api/railway.d.ts +3 -2
- package/dist/api/sdk-dispatch.d.ts +4 -4
- package/dist/api/sdk-routes.d.ts +2 -2
- package/dist/api/templates.d.ts +2 -2
- package/dist/api/types.d.ts +3 -2
- package/dist/capacity-provider.d.ts +118 -59
- package/dist/capacity-provider.js +235 -43
- package/dist/capacity.d.ts +2 -2
- package/dist/cli-tools.d.ts +1 -1
- package/dist/content-operations.d.ts +97 -0
- package/dist/content-operations.js +250 -0
- package/dist/content-store.d.ts +4 -4
- package/dist/control-plane-client.d.ts +13 -18
- package/dist/control-plane-client.js +8 -86
- package/dist/control-plane.d.ts +3 -2
- package/dist/control-plane.js +38 -13
- package/dist/copilot.d.ts +3 -0
- package/dist/copilot.js +16 -1
- package/dist/d1-http.d.ts +1 -1
- package/dist/d1-store.d.ts +32 -57
- package/dist/d1-store.js +115 -318
- package/dist/db/d1.d.ts +1 -232
- package/dist/db/index.d.ts +3 -3
- package/dist/db/market-schema.d.ts +50900 -11018
- package/dist/db/market-schema.js +2313 -467
- package/dist/db/node-sqlite.d.ts +1 -232
- package/dist/db/node-sqlite.js +7 -2
- package/dist/db/schema.d.ts +0 -462
- package/dist/db/schema.js +2 -22
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.js +0 -11
- package/dist/fixture-support.js +52 -4
- package/dist/governance.d.ts +133 -0
- package/dist/governance.js +285 -0
- package/dist/graph/build.d.ts +2 -2
- package/dist/graph/context-query-contracts.d.ts +1 -1
- package/dist/graph/dsl.d.ts +1 -1
- package/dist/graph/query.d.ts +4 -4
- package/dist/graph/ranking.d.ts +1 -1
- package/dist/graph/schema.d.ts +1 -1
- package/dist/graph.d.ts +11 -11
- package/dist/guarantees/index.d.ts +425 -0
- package/dist/guarantees/index.js +1146 -0
- package/dist/hosting/apps.d.ts +12 -0
- package/dist/hosting/apps.js +107 -0
- package/dist/hosting/builtins.d.ts +25 -0
- package/dist/hosting/builtins.js +602 -0
- package/dist/hosting/contracts.d.ts +208 -0
- package/dist/hosting/contracts.js +0 -0
- package/dist/hosting/graph.d.ts +195 -0
- package/dist/hosting/graph.js +1092 -0
- package/dist/hosting/index.d.ts +4 -0
- package/dist/hosting/index.js +4 -0
- package/dist/index.d.ts +88 -67
- package/dist/index.js +142 -14
- package/dist/local-dev/managed-dev.d.ts +85 -0
- package/dist/local-dev/managed-dev.js +368 -0
- package/dist/managed-dependencies.d.ts +9 -0
- package/dist/managed-dependencies.js +10 -9
- package/dist/market-client.d.ts +327 -9
- package/dist/market-client.js +464 -20
- package/dist/model-registry.d.ts +1 -1
- package/dist/model-registry.js +19 -19
- package/dist/operations/agent-tools.d.ts +2 -11
- package/dist/operations/agent-tools.js +2 -14
- package/dist/operations/providers/default.d.ts +1 -1
- package/dist/operations/providers/default.js +20 -37
- package/dist/operations/repository-operations.d.ts +26 -2
- package/dist/operations/repository-operations.js +159 -1
- package/dist/operations/runtime.d.ts +3 -3
- package/dist/operations/services/bootstrap-runner.d.ts +4 -2
- package/dist/operations/services/bootstrap-runner.js +22 -2
- package/dist/operations/services/build-warning-policy.d.ts +34 -0
- package/dist/operations/services/build-warning-policy.js +81 -82
- package/dist/operations/services/commit-message-provider.js +4 -4
- package/dist/operations/services/config-runtime.d.ts +83 -24
- package/dist/operations/services/config-runtime.js +449 -130
- package/dist/operations/services/deploy.d.ts +106 -624
- package/dist/operations/services/deploy.js +746 -263
- package/dist/operations/services/deployment-readiness.d.ts +30 -0
- package/dist/operations/services/deployment-readiness.js +206 -0
- package/dist/operations/services/git-remote-policy.js +12 -4
- package/dist/operations/services/git-runner.d.ts +66 -0
- package/dist/operations/services/git-runner.js +479 -0
- package/dist/operations/services/git-workflow.d.ts +45 -6
- package/dist/operations/services/git-workflow.js +251 -23
- package/dist/operations/services/github-actions-verification.d.ts +4 -1
- package/dist/operations/services/github-actions-verification.js +12 -3
- package/dist/operations/services/github-api.js +22 -6
- package/dist/operations/services/github-automation.d.ts +4 -4
- package/dist/operations/services/github-automation.js +19 -21
- package/dist/operations/services/github-credentials.d.ts +13 -0
- package/dist/operations/services/github-credentials.js +59 -0
- package/dist/operations/services/hosted-service-checks.d.ts +81 -0
- package/dist/operations/services/hosted-service-checks.js +478 -0
- package/dist/operations/services/hosting-audit.d.ts +2 -2
- package/dist/operations/services/hosting-audit.js +7 -7
- package/dist/operations/services/hub-launch.d.ts +1 -1
- package/dist/operations/services/hub-provider-launch.d.ts +5 -5
- package/dist/operations/services/hub-provider-launch.js +22 -17
- package/dist/operations/services/live-hosted-service-checks.d.ts +26 -0
- package/dist/operations/services/live-hosted-service-checks.js +463 -0
- package/dist/operations/services/local-dev.js +0 -1
- package/dist/operations/services/managed-host-security.d.ts +1 -1
- package/dist/operations/services/managed-host-security.js +1 -1
- package/dist/operations/services/managed-repositories.d.ts +37 -0
- package/dist/operations/services/managed-repositories.js +177 -0
- package/dist/operations/services/operations-runner-smoke.d.ts +31 -0
- package/dist/operations/services/operations-runner-smoke.js +198 -0
- package/dist/operations/services/package-adapters.d.ts +170 -0
- package/dist/operations/services/package-adapters.js +859 -0
- package/dist/operations/services/package-reference-policy.d.ts +13 -88
- package/dist/operations/services/package-reference-policy.js +96 -215
- package/dist/operations/services/project-host-operations.d.ts +4 -4
- package/dist/operations/services/project-platform.d.ts +57 -173
- package/dist/operations/services/project-platform.js +80 -111
- package/dist/operations/services/project-web-monitor.d.ts +2 -2
- package/dist/operations/services/project-web-monitor.js +122 -5
- package/dist/operations/services/railway-api.d.ts +117 -5
- package/dist/operations/services/railway-api.js +915 -93
- package/dist/operations/services/railway-deploy.d.ts +30 -112
- package/dist/operations/services/railway-deploy.js +521 -961
- package/dist/operations/services/release-history.js +3 -4
- package/dist/operations/services/release-proof-ledger.d.ts +13 -0
- package/dist/operations/services/release-proof-ledger.js +81 -0
- package/dist/operations/services/release-proof-planner.d.ts +48 -0
- package/dist/operations/services/release-proof-planner.js +195 -0
- package/dist/operations/services/release-proof-runner.d.ts +16 -0
- package/dist/operations/services/release-proof-runner.js +169 -0
- package/dist/operations/services/release-proof.d.ts +81 -0
- package/dist/operations/services/release-proof.js +79 -0
- package/dist/operations/services/repository-save-orchestrator.d.ts +8 -7
- package/dist/operations/services/repository-save-orchestrator.js +604 -212
- package/dist/operations/services/runtime-paths.d.ts +1 -3
- package/dist/operations/services/runtime-paths.js +0 -4
- package/dist/operations/services/runtime-tools.d.ts +1 -191
- package/dist/operations/services/runtime-tools.js +4 -443
- package/dist/operations/services/save-deploy-preflight.js +9 -1
- package/dist/operations/services/template-host-bindings.d.ts +2 -2
- package/dist/operations/services/template-host-bindings.js +3 -2
- package/dist/operations/services/template-registry.d.ts +6 -6
- package/dist/operations/services/template-registry.js +33 -14
- package/dist/operations/services/template-secret-sync.d.ts +3 -3
- package/dist/operations/services/verification-cache.d.ts +25 -0
- package/dist/operations/services/verification-cache.js +71 -0
- package/dist/operations/services/workflow-timing.d.ts +25 -0
- package/dist/operations/services/workflow-timing.js +79 -0
- package/dist/operations/services/workspace-dependency-mode.js +50 -5
- package/dist/operations/services/workspace-preflight.js +8 -8
- package/dist/operations/services/workspace-save-script.d.ts +4 -4
- package/dist/operations/services/workspace-save.d.ts +1 -0
- package/dist/operations/services/workspace-save.js +42 -19
- package/dist/operations/services/workspace-tools.js +42 -7
- package/dist/operations-registry.d.ts +1 -1
- package/dist/operations-registry.js +5 -6
- package/dist/operations-types.d.ts +1 -1
- package/dist/operations.d.ts +17 -11
- package/dist/operations.js +57 -3
- package/dist/platform/book-export.js +2 -0
- package/dist/platform/books-data.d.ts +1 -1
- package/dist/platform/config.d.ts +27 -0
- package/dist/platform/config.js +100 -0
- package/dist/platform/content-runtime-source.d.ts +54 -0
- package/dist/platform/content-runtime-source.js +169 -0
- package/dist/platform/contracts.d.ts +38 -2
- package/dist/platform/deploy-config.d.ts +1 -1
- package/dist/platform/deploy-config.js +80 -9
- package/dist/platform/deploy-runtime.d.ts +1 -1
- package/dist/platform/desired-state.d.ts +63 -0
- package/dist/platform/desired-state.js +1021 -0
- package/dist/platform/env.yaml +568 -45
- package/dist/platform/environment.d.ts +3 -2
- package/dist/platform/environment.js +122 -21
- package/dist/platform/local-content-materialization.d.ts +9 -0
- package/dist/platform/local-content-materialization.js +212 -0
- package/dist/platform/plugin.d.ts +13 -4
- package/dist/platform/plugins/runtime.d.ts +3 -3
- package/dist/platform/plugins/runtime.js +62 -1
- package/dist/platform/plugins.d.ts +6 -6
- package/dist/platform/published-content-pipeline.d.ts +3 -3
- package/dist/platform/published-content-pipeline.js +5 -1
- package/dist/platform/published-content.d.ts +4 -3
- package/dist/platform/site-config-schema.d.ts +1 -0
- package/dist/platform/site-config-schema.js +4 -1
- package/dist/platform/tenant/runtime-config.d.ts +152 -2
- package/dist/platform/tenant-config.d.ts +1 -1
- package/dist/platform/utils/site-config-schema.d.ts +154 -0
- package/dist/platform/utils/site-config-schema.js +400 -461
- package/dist/platform-operation-store.d.ts +1 -1
- package/dist/platform-operation-store.js +2 -2
- package/dist/platform-operations.js +1 -1
- package/dist/plugin-default.d.ts +1 -1
- package/dist/plugin-default.js +27 -12
- package/dist/project-import.d.ts +91 -0
- package/dist/project-import.js +257 -0
- package/dist/project-workflow.d.ts +1 -1
- package/dist/reconcile/bootstrap-systems.d.ts +2 -2
- package/dist/reconcile/bootstrap-systems.js +5 -5
- package/dist/reconcile/builtin-adapters.d.ts +7 -1
- package/dist/reconcile/builtin-adapters.js +3190 -429
- package/dist/reconcile/contracts.d.ts +23 -6
- package/dist/reconcile/desired-state.d.ts +2 -192
- package/dist/reconcile/desired-state.js +29 -38
- package/dist/reconcile/engine.d.ts +61 -395
- package/dist/reconcile/engine.js +229 -44
- package/dist/reconcile/index.d.ts +10 -8
- package/dist/reconcile/index.js +2 -0
- package/dist/reconcile/live-acceptance.d.ts +100 -0
- package/dist/reconcile/live-acceptance.js +2027 -0
- package/dist/reconcile/platform.d.ts +104 -0
- package/dist/reconcile/platform.js +100 -0
- package/dist/reconcile/providers/docker-private.d.ts +54 -0
- package/dist/reconcile/providers/docker-private.js +101 -0
- package/dist/reconcile/providers/github-private.d.ts +65 -0
- package/dist/reconcile/providers/github-private.js +119 -0
- package/dist/reconcile/providers/local-private.d.ts +28 -0
- package/dist/reconcile/providers/local-private.js +75 -0
- package/dist/reconcile/providers/railway-iac.d.ts +66 -0
- package/dist/reconcile/providers/railway-iac.js +275 -0
- package/dist/reconcile/providers/release-private.d.ts +92 -0
- package/dist/reconcile/providers/release-private.js +152 -0
- package/dist/reconcile/registry.d.ts +2 -2
- package/dist/reconcile/registry.js +16 -1
- package/dist/reconcile/state.d.ts +1 -1
- package/dist/reconcile/state.js +7 -44
- package/dist/reconcile/units.d.ts +1 -1
- package/dist/reconcile/units.js +9 -3
- package/dist/remote.d.ts +6 -6
- package/dist/scenes/artifacts.d.ts +16 -0
- package/dist/scenes/artifacts.js +61 -0
- package/dist/scenes/auth.d.ts +2 -0
- package/dist/scenes/auth.js +28 -0
- package/dist/scenes/base-url.d.ts +12 -0
- package/dist/scenes/base-url.js +123 -0
- package/dist/scenes/builtin-plugins.d.ts +2 -0
- package/dist/scenes/builtin-plugins.js +447 -0
- package/dist/scenes/checkpoints.d.ts +14 -0
- package/dist/scenes/checkpoints.js +33 -0
- package/dist/scenes/device-matrix.d.ts +2 -0
- package/dist/scenes/device-matrix.js +97 -0
- package/dist/scenes/devices.d.ts +11 -0
- package/dist/scenes/devices.js +22 -0
- package/dist/scenes/diagnostics.d.ts +5 -0
- package/dist/scenes/diagnostics.js +22 -0
- package/dist/scenes/diagram-providers.d.ts +2 -0
- package/dist/scenes/diagram-providers.js +181 -0
- package/dist/scenes/diagram-validation.d.ts +22 -0
- package/dist/scenes/diagram-validation.js +74 -0
- package/dist/scenes/environment.d.ts +2 -0
- package/dist/scenes/environment.js +65 -0
- package/dist/scenes/evidence-bundle.d.ts +5 -0
- package/dist/scenes/evidence-bundle.js +42 -0
- package/dist/scenes/evidence-report.d.ts +10 -0
- package/dist/scenes/evidence-report.js +73 -0
- package/dist/scenes/evidence.d.ts +16 -0
- package/dist/scenes/evidence.js +277 -0
- package/dist/scenes/index.d.ts +48 -0
- package/dist/scenes/index.js +312 -0
- package/dist/scenes/inspect.d.ts +9 -0
- package/dist/scenes/inspect.js +64 -0
- package/dist/scenes/loader.d.ts +3 -0
- package/dist/scenes/loader.js +38 -0
- package/dist/scenes/logs.d.ts +2 -0
- package/dist/scenes/logs.js +47 -0
- package/dist/scenes/operations.d.ts +3 -0
- package/dist/scenes/operations.js +128 -0
- package/dist/scenes/phase0.d.ts +9 -0
- package/dist/scenes/phase0.js +637 -0
- package/dist/scenes/planner.d.ts +12 -0
- package/dist/scenes/planner.js +166 -0
- package/dist/scenes/playwright-adapter.d.ts +2 -0
- package/dist/scenes/playwright-adapter.js +63 -0
- package/dist/scenes/plugins.d.ts +5 -0
- package/dist/scenes/plugins.js +115 -0
- package/dist/scenes/progress.d.ts +17 -0
- package/dist/scenes/progress.js +24 -0
- package/dist/scenes/publish-destinations.d.ts +12 -0
- package/dist/scenes/publish-destinations.js +99 -0
- package/dist/scenes/publish-plan-report.d.ts +10 -0
- package/dist/scenes/publish-plan-report.js +70 -0
- package/dist/scenes/publish-plan.d.ts +15 -0
- package/dist/scenes/publish-plan.js +248 -0
- package/dist/scenes/publish-redaction.d.ts +16 -0
- package/dist/scenes/publish-redaction.js +148 -0
- package/dist/scenes/publish-release-record.d.ts +13 -0
- package/dist/scenes/publish-release-record.js +34 -0
- package/dist/scenes/publish-report.d.ts +10 -0
- package/dist/scenes/publish-report.js +67 -0
- package/dist/scenes/publish.d.ts +16 -0
- package/dist/scenes/publish.js +298 -0
- package/dist/scenes/registry.d.ts +12 -0
- package/dist/scenes/registry.js +65 -0
- package/dist/scenes/remotion-adapter.d.ts +3 -0
- package/dist/scenes/remotion-adapter.js +94 -0
- package/dist/scenes/remotion-composition-registry.d.ts +2 -0
- package/dist/scenes/remotion-composition-registry.js +12 -0
- package/dist/scenes/remotion-compositions.d.ts +15 -0
- package/dist/scenes/remotion-compositions.js +464 -0
- package/dist/scenes/remotion-diagrams.d.ts +9 -0
- package/dist/scenes/remotion-diagrams.js +188 -0
- package/dist/scenes/remotion-input.d.ts +13 -0
- package/dist/scenes/remotion-input.js +291 -0
- package/dist/scenes/remotion-visuals.d.ts +29 -0
- package/dist/scenes/remotion-visuals.js +198 -0
- package/dist/scenes/render-media-assets.d.ts +9 -0
- package/dist/scenes/render-media-assets.js +117 -0
- package/dist/scenes/render-report.d.ts +10 -0
- package/dist/scenes/render-report.js +27 -0
- package/dist/scenes/render.d.ts +2 -0
- package/dist/scenes/render.js +218 -0
- package/dist/scenes/reporter.d.ts +3 -0
- package/dist/scenes/reporter.js +101 -0
- package/dist/scenes/resume.d.ts +2 -0
- package/dist/scenes/resume.js +79 -0
- package/dist/scenes/runner.d.ts +2 -0
- package/dist/scenes/runner.js +674 -0
- package/dist/scenes/schema.d.ts +6 -0
- package/dist/scenes/schema.js +994 -0
- package/dist/scenes/seed.d.ts +2 -0
- package/dist/scenes/seed.js +83 -0
- package/dist/scenes/segments.d.ts +15 -0
- package/dist/scenes/segments.js +79 -0
- package/dist/scenes/selectors.d.ts +3 -0
- package/dist/scenes/selectors.js +21 -0
- package/dist/scenes/timeline.d.ts +11 -0
- package/dist/scenes/timeline.js +26 -0
- package/dist/scenes/timeouts.d.ts +6 -0
- package/dist/scenes/timeouts.js +17 -0
- package/dist/scenes/training-captions.d.ts +14 -0
- package/dist/scenes/training-captions.js +98 -0
- package/dist/scenes/training-report.d.ts +10 -0
- package/dist/scenes/training-report.js +78 -0
- package/dist/scenes/training-transcript.d.ts +24 -0
- package/dist/scenes/training-transcript.js +204 -0
- package/dist/scenes/training.d.ts +10 -0
- package/dist/scenes/training.js +134 -0
- package/dist/scenes/types.d.ts +1872 -0
- package/dist/scenes/types.js +8 -0
- package/dist/scenes/visual-audit-contact-sheets.d.ts +6 -0
- package/dist/scenes/visual-audit-contact-sheets.js +119 -0
- package/dist/scenes/visual-audit-fixtures.d.ts +25 -0
- package/dist/scenes/visual-audit-fixtures.js +210 -0
- package/dist/scenes/visual-audit-report.d.ts +11 -0
- package/dist/scenes/visual-audit-report.js +85 -0
- package/dist/scenes/visual-audit-review.d.ts +23 -0
- package/dist/scenes/visual-audit-review.js +829 -0
- package/dist/scenes/visual-audit-routes.d.ts +13 -0
- package/dist/scenes/visual-audit-routes.js +308 -0
- package/dist/scenes/visual-audit.d.ts +3 -0
- package/dist/scenes/visual-audit.js +596 -0
- package/dist/scripts/build-dist.js +154 -40
- package/dist/scripts/check-build-warnings.js +42 -53
- package/dist/scripts/cleanup-markdown.js +1 -1
- package/dist/scripts/cli-test-fixtures.js +24 -28
- package/dist/scripts/deployment-readiness.js +20 -0
- package/dist/scripts/generate-treedx-openapi-types.js +186 -0
- package/dist/scripts/migrate-journey-csv-to-guarantees.js +140 -0
- package/dist/scripts/operations-runner-smoke.js +16 -0
- package/dist/scripts/package-tools.js +12 -1
- package/dist/scripts/prepare.js +3 -7
- package/dist/scripts/release-verify.js +6 -6
- package/dist/scripts/run-fixture-astro-command.js +1 -1
- package/dist/scripts/template-catalog.test.js +68 -82
- package/dist/scripts/tenant-dev.js +0 -10
- package/dist/scripts/tenant-workflow-action.js +10 -1
- package/dist/scripts/test-cloudflare-local.js +1 -1
- package/dist/scripts/test-scaffold.js +0 -1
- package/dist/scripts/test-smoke.js +3 -3
- package/dist/scripts/treeseed-build-dist.js +4 -7
- package/dist/scripts/treeseed-release-verify.js +1 -1
- package/dist/scripts/verify-driver.js +30 -21
- package/dist/scripts/workflow-commands.test.js +18 -27
- package/dist/scripts/workspace-command-e2e.js +1 -1
- package/dist/scripts/workspace-lint.js +6 -0
- package/dist/scripts/workspace-release-test.js +90 -1
- package/dist/scripts/workspace-test.js +6 -0
- package/dist/sdk-dispatch.d.ts +1 -1
- package/dist/sdk-dispatch.js +0 -16
- package/dist/sdk-fields.d.ts +1 -1
- package/dist/sdk-filters.d.ts +1 -1
- package/dist/sdk-types.d.ts +1352 -116
- package/dist/sdk-types.js +413 -2
- package/dist/sdk.d.ts +106 -100
- package/dist/sdk.js +211 -51
- package/dist/secrets-capability.d.ts +421 -0
- package/dist/secrets-capability.js +530 -0
- package/dist/seeds/normalize.js +1 -0
- package/dist/seeds/planner.js +38 -0
- package/dist/seeds/schema.js +293 -4
- package/dist/seeds/types.d.ts +60 -0
- package/dist/seeds/types.js +9 -1
- package/dist/service-credentials.d.ts +54 -0
- package/dist/service-credentials.js +112 -0
- package/dist/stores/cursor-store.d.ts +2 -2
- package/dist/stores/envelopes.d.ts +1 -1
- package/dist/stores/helpers.d.ts +1 -1
- package/dist/stores/lease-store.d.ts +2 -2
- package/dist/stores/message-store.d.ts +2 -2
- package/dist/stores/operational-store.d.ts +3 -26
- package/dist/stores/operational-store.js +0 -225
- package/dist/stores/project-workflow-store.d.ts +2 -2
- package/dist/stores/run-store.d.ts +2 -3
- package/dist/stores/run-store.js +0 -98
- package/dist/stores/subscription-store.d.ts +2 -3
- package/dist/stores/subscription-store.js +0 -100
- package/dist/template-catalog.d.ts +1 -1
- package/dist/template-launch-requirements.d.ts +2 -2
- package/dist/template-launch-requirements.js +9 -0
- package/dist/template-launch-ui.d.ts +2 -2
- package/dist/treedx/adapters.d.ts +6 -0
- package/dist/treedx/adapters.js +36 -0
- package/dist/treedx/client.d.ts +222 -0
- package/dist/treedx/client.js +871 -0
- package/dist/treedx/errors.d.ts +13 -0
- package/dist/treedx/errors.js +17 -0
- package/dist/treedx/federated-client.d.ts +27 -0
- package/dist/treedx/federated-client.js +158 -0
- package/dist/treedx/generated/openapi-types.d.ts +3558 -0
- package/dist/treedx/generated/openapi-types.js +0 -0
- package/dist/treedx/graph-adapter.d.ts +33 -0
- package/dist/treedx/graph-adapter.js +156 -0
- package/dist/treedx/index.d.ts +14 -0
- package/dist/treedx/index.js +48 -0
- package/dist/treedx/market-integration.d.ts +27 -0
- package/dist/treedx/market-integration.js +131 -0
- package/dist/treedx/ports.d.ts +166 -0
- package/dist/treedx/ports.js +231 -0
- package/dist/treedx/query-adapter.d.ts +19 -0
- package/dist/treedx/query-adapter.js +62 -0
- package/dist/treedx/registry-client.d.ts +11 -0
- package/dist/treedx/registry-client.js +19 -0
- package/dist/treedx/repository-adapter.d.ts +45 -0
- package/dist/treedx/repository-adapter.js +319 -0
- package/dist/treedx/sdk-integration.d.ts +27 -0
- package/dist/treedx/sdk-integration.js +63 -0
- package/dist/treedx/types.d.ts +1084 -0
- package/dist/treedx/types.js +8 -0
- package/dist/treedx/workspace-adapter.d.ts +27 -0
- package/dist/treedx/workspace-adapter.js +65 -0
- package/dist/treedx-backends.d.ts +220 -0
- package/dist/treedx-backends.js +634 -0
- package/dist/treedx-client.d.ts +89 -0
- package/dist/treedx-client.js +184 -0
- package/dist/treeseed/services/compose.yml +2 -3
- package/dist/treeseed/template-catalog/catalog.fixture.json +27 -27
- package/dist/types/agents.d.ts +256 -0
- package/dist/types/agents.js +42 -1
- package/dist/verification.d.ts +1 -0
- package/dist/verification.js +143 -14
- package/dist/workflow/operations.d.ts +580 -523
- package/dist/workflow/operations.js +2084 -1279
- package/dist/workflow/policy.js +19 -7
- package/dist/workflow/runs.d.ts +9 -3
- package/dist/workflow/runs.js +66 -26
- package/dist/workflow/session.d.ts +4 -1
- package/dist/workflow/session.js +50 -10
- package/dist/workflow/worktrees.d.ts +6 -2
- package/dist/workflow/worktrees.js +98 -15
- package/dist/workflow-state.d.ts +17 -4
- package/dist/workflow-state.js +68 -41
- package/dist/workflow-support.d.ts +26 -17
- package/dist/workflow-support.js +84 -24
- package/dist/workflow.d.ts +51 -16
- package/dist/workflow.js +19 -7
- package/drizzle/d1/0000_treeseed_d1.sql +0 -18
- package/drizzle/market/0000_market_control_plane.sql +1793 -1499
- package/drizzle/market/0004_treedx_market_integration.sql +99 -0
- package/drizzle/market/0005_agent_capacity_coordination.sql +145 -0
- package/drizzle/market/0006_provider_assignment_lifecycle.sql +9 -0
- package/drizzle/market/0007_agent_architecture_gap_closure.sql +157 -0
- package/drizzle/market/0008_agent_capacity_operational_closure.sql +27 -0
- package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +29 -0
- package/drizzle/market/0010_secrets_capability_persistence.sql +130 -0
- package/drizzle/market/0011_github_app_adapter.sql +47 -0
- package/drizzle/market/0012_workday_test_runs.sql +44 -0
- package/drizzle/market/0013_runtime_task_lifecycle.sql +39 -0
- package/drizzle/market/0014_governance_pipeline.sql +189 -0
- package/package.json +106 -18
- package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
- package/templates/github/deploy-web.workflow.yml +49 -12
- package/dist/operations/services/mailpit-runtime.d.ts +0 -20
- package/dist/operations/services/mailpit-runtime.js +0 -67
- package/dist/operations/services/release-candidate.d.ts +0 -41
- package/dist/operations/services/release-candidate.js +0 -616
- package/dist/scripts/ensure-mailpit.js +0 -48
- package/dist/scripts/logs-mailpit.js +0 -2
- package/dist/scripts/run-ts.js +0 -45
- package/dist/scripts/stop-mailpit.js +0 -5
- package/dist/scripts/treeseed-run-ts.js +0 -45
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
const TREESEED_SECRET_CUSTODY_MODES = [
|
|
2
|
+
"github_actions_secret_enclave",
|
|
3
|
+
"client_encrypted_escrow",
|
|
4
|
+
"metadata_only_reentry",
|
|
5
|
+
"host_env_injection",
|
|
6
|
+
"bootstrap_service_secret",
|
|
7
|
+
"provider_owned_secret",
|
|
8
|
+
"external_vault_reference"
|
|
9
|
+
];
|
|
10
|
+
const TREESEED_V1_REPOSITORY_CREDENTIAL_PROVIDERS = ["github-app"];
|
|
11
|
+
const TREESEED_SECRET_CLASSES = [
|
|
12
|
+
"repository_access",
|
|
13
|
+
"workflow_secret",
|
|
14
|
+
"host_runtime_secret",
|
|
15
|
+
"provider_runtime_secret",
|
|
16
|
+
"bootstrap_service_secret",
|
|
17
|
+
"customer_project_secret"
|
|
18
|
+
];
|
|
19
|
+
const TREESEED_PROVIDER_WORKSPACE_ACCESS_MODES = [
|
|
20
|
+
"full_repository_workspace",
|
|
21
|
+
"brokered_file_collection",
|
|
22
|
+
"workflow_operation_only"
|
|
23
|
+
];
|
|
24
|
+
const TREESEED_WORKFLOW_OPERATION_DISPATCH_MODES = ["allowlisted"];
|
|
25
|
+
const TREESEED_SECRET_METADATA_RECORD_STATUSES = ["active", "migrated", "tombstoned", "blocked"];
|
|
26
|
+
const TREESEED_GITHUB_REPOSITORY_GRANT_STATUSES = ["active", "drifted", "revoked", "blocked"];
|
|
27
|
+
const TREESEED_GITHUB_APP_INSTALLATION_STATUSES = ["active", "drifted", "revoked", "suspended", "blocked"];
|
|
28
|
+
const TREESEED_GITHUB_APP_TOKEN_ISSUANCE_STATUSES = ["issued", "expired", "revoked", "blocked"];
|
|
29
|
+
const TREESEED_WORKFLOW_OPERATION_RECORD_STATUSES = ["active", "blocked", "drifted", "archived"];
|
|
30
|
+
const TREESEED_WORKFLOW_DISPATCH_RECORD_STATUSES = [
|
|
31
|
+
"queued",
|
|
32
|
+
"dispatched",
|
|
33
|
+
"running",
|
|
34
|
+
"succeeded",
|
|
35
|
+
"failed",
|
|
36
|
+
"cancelled",
|
|
37
|
+
"blocked"
|
|
38
|
+
];
|
|
39
|
+
const TREESEED_TREEDX_CREDENTIAL_ISSUANCE_STATUSES = ["issued", "expired", "revoked", "blocked"];
|
|
40
|
+
const TREESEED_TREEDX_CREDENTIAL_BRIDGE_OPERATIONS = [
|
|
41
|
+
"clone",
|
|
42
|
+
"fetch",
|
|
43
|
+
"save",
|
|
44
|
+
"commit",
|
|
45
|
+
"push",
|
|
46
|
+
"pull_request",
|
|
47
|
+
"repository_update"
|
|
48
|
+
];
|
|
49
|
+
const TREESEED_SECRET_CAPABILITY_FAIL_CLOSED_CODES = [
|
|
50
|
+
"github_grant_revoked",
|
|
51
|
+
"github_grant_drifted",
|
|
52
|
+
"github_installation_missing",
|
|
53
|
+
"github_installation_revoked",
|
|
54
|
+
"github_installation_suspended",
|
|
55
|
+
"github_repository_removed",
|
|
56
|
+
"github_account_mismatch",
|
|
57
|
+
"github_permission_drift",
|
|
58
|
+
"github_app_token_blocked",
|
|
59
|
+
"github_environment_missing",
|
|
60
|
+
"workflow_trust_drift",
|
|
61
|
+
"workflow_dispatch_blocked",
|
|
62
|
+
"treedx_credential_expired",
|
|
63
|
+
"treedx_credential_revoked",
|
|
64
|
+
"assignment_lease_revoked"
|
|
65
|
+
];
|
|
66
|
+
const TREESEED_CLIENT_ENCRYPTED_ESCROW_STATUSES = [
|
|
67
|
+
"active",
|
|
68
|
+
"migrated",
|
|
69
|
+
"expired",
|
|
70
|
+
"tombstoned",
|
|
71
|
+
"reentry_required"
|
|
72
|
+
];
|
|
73
|
+
function isRecord(value) {
|
|
74
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
75
|
+
}
|
|
76
|
+
function stringArrayIncludes(values, value) {
|
|
77
|
+
return typeof value === "string" && values.includes(value);
|
|
78
|
+
}
|
|
79
|
+
function addProblem(problems, path, code, message) {
|
|
80
|
+
problems.push({ path, code, message });
|
|
81
|
+
}
|
|
82
|
+
function containsTreeseedPlaintextSecretMaterial(value) {
|
|
83
|
+
if (!isRecord(value)) return false;
|
|
84
|
+
const forbiddenKeys = /* @__PURE__ */ new Set([
|
|
85
|
+
"plaintext",
|
|
86
|
+
"plainText",
|
|
87
|
+
"value",
|
|
88
|
+
"raw",
|
|
89
|
+
"rawSecret",
|
|
90
|
+
"secretValue",
|
|
91
|
+
"unencrypted",
|
|
92
|
+
"token",
|
|
93
|
+
"accessToken",
|
|
94
|
+
"privateKey",
|
|
95
|
+
"sshPrivateKey",
|
|
96
|
+
"passphrase",
|
|
97
|
+
"password",
|
|
98
|
+
"derivedKey",
|
|
99
|
+
"decrypted",
|
|
100
|
+
"decryptedPayload",
|
|
101
|
+
"decryptedSecret"
|
|
102
|
+
]);
|
|
103
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
104
|
+
if (forbiddenKeys.has(key)) return true;
|
|
105
|
+
if (isRecord(nested) && containsTreeseedPlaintextSecretMaterial(nested)) return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
function isTreeseedSecretCustodyMode(value) {
|
|
110
|
+
return stringArrayIncludes(TREESEED_SECRET_CUSTODY_MODES, value);
|
|
111
|
+
}
|
|
112
|
+
function isTreeseedV1RepositoryCredentialProvider(value) {
|
|
113
|
+
return stringArrayIncludes(TREESEED_V1_REPOSITORY_CREDENTIAL_PROVIDERS, value);
|
|
114
|
+
}
|
|
115
|
+
function requiresClientSideSecretMaterial(mode) {
|
|
116
|
+
return mode === "client_encrypted_escrow";
|
|
117
|
+
}
|
|
118
|
+
function isApiServiceDecryptableCustomerSecret(metadata) {
|
|
119
|
+
return metadata.owner?.kind === "customer" && metadata.apiDecryptable === true;
|
|
120
|
+
}
|
|
121
|
+
function validateTreeseedWritableSecretMetadata(input, path = "$") {
|
|
122
|
+
const problems = [];
|
|
123
|
+
if (!isRecord(input)) {
|
|
124
|
+
addProblem(problems, path, "invalid_registry", "Secret metadata must be an object.");
|
|
125
|
+
return problems;
|
|
126
|
+
}
|
|
127
|
+
const metadata = input;
|
|
128
|
+
if (isApiServiceDecryptableCustomerSecret(metadata)) {
|
|
129
|
+
addProblem(
|
|
130
|
+
problems,
|
|
131
|
+
`${path}.apiDecryptable`,
|
|
132
|
+
"api_decryptable_customer_secret",
|
|
133
|
+
"Customer project secrets must not be decryptable by the TreeSeed API service."
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
if (metadata.owner?.kind === "customer" && metadata.plaintextAllowed === true) {
|
|
137
|
+
addProblem(
|
|
138
|
+
problems,
|
|
139
|
+
`${path}.plaintextAllowed`,
|
|
140
|
+
"api_decryptable_customer_secret",
|
|
141
|
+
"Customer project secrets must not allow plaintext persistence."
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
if (containsTreeseedPlaintextSecretMaterial(input)) {
|
|
145
|
+
addProblem(
|
|
146
|
+
problems,
|
|
147
|
+
path,
|
|
148
|
+
"plaintext_escrow_material",
|
|
149
|
+
"Secret metadata must not include plaintext secret material."
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
if (metadata.custodyMode === "client_encrypted_escrow") {
|
|
153
|
+
const hasEscrowReference = typeof input.escrowRecordId === "string" || typeof input.escrow_record_id === "string";
|
|
154
|
+
if (!hasEscrowReference) {
|
|
155
|
+
addProblem(
|
|
156
|
+
problems,
|
|
157
|
+
path,
|
|
158
|
+
"invalid_secret_custody_target",
|
|
159
|
+
"Client-encrypted escrow secret metadata must reference an escrow record."
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (metadata.custodyMode === "github_actions_secret_enclave") {
|
|
164
|
+
const target = input.githubSecretTarget ?? input.github_secret_target;
|
|
165
|
+
if (!isRecord(target)) {
|
|
166
|
+
addProblem(
|
|
167
|
+
problems,
|
|
168
|
+
path,
|
|
169
|
+
"invalid_secret_custody_target",
|
|
170
|
+
"GitHub Actions secret enclave metadata must include a GitHub secret target."
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return problems;
|
|
175
|
+
}
|
|
176
|
+
function assertTreeseedWritableSecretMetadata(input) {
|
|
177
|
+
const problems = validateTreeseedWritableSecretMetadata(input);
|
|
178
|
+
if (problems.length > 0) {
|
|
179
|
+
const message = problems.map((problem) => `${problem.path}: ${problem.message}`).join("\n");
|
|
180
|
+
throw new Error(`Invalid Treeseed secret metadata.
|
|
181
|
+
${message}`);
|
|
182
|
+
}
|
|
183
|
+
return input;
|
|
184
|
+
}
|
|
185
|
+
function validateTreeseedClientEncryptedEscrowMetadata(input, path = "$") {
|
|
186
|
+
const problems = [];
|
|
187
|
+
if (!isRecord(input)) {
|
|
188
|
+
addProblem(problems, path, "invalid_registry", "Client-encrypted escrow metadata must be an object.");
|
|
189
|
+
return problems;
|
|
190
|
+
}
|
|
191
|
+
if (containsTreeseedPlaintextSecretMaterial(input)) {
|
|
192
|
+
addProblem(
|
|
193
|
+
problems,
|
|
194
|
+
path,
|
|
195
|
+
"plaintext_escrow_material",
|
|
196
|
+
"Client-encrypted escrow records must contain ciphertext metadata only."
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
if (typeof input.ciphertextRef !== "string" || !input.ciphertextRef.trim()) {
|
|
200
|
+
addProblem(
|
|
201
|
+
problems,
|
|
202
|
+
`${path}.ciphertextRef`,
|
|
203
|
+
"invalid_secret_custody_target",
|
|
204
|
+
"Client-encrypted escrow records must include a ciphertext reference."
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
const hasInlineCiphertext = typeof input.ciphertext === "string" && input.ciphertext.trim();
|
|
208
|
+
if (hasInlineCiphertext) {
|
|
209
|
+
for (const key of ["algorithm", "nonce", "salt", "kdf", "wrappingKeyId", "encryptionVersion"]) {
|
|
210
|
+
if (typeof input[key] !== "string" || !String(input[key]).trim()) {
|
|
211
|
+
addProblem(
|
|
212
|
+
problems,
|
|
213
|
+
`${path}.${key}`,
|
|
214
|
+
"invalid_secret_custody_target",
|
|
215
|
+
`Inline client-encrypted escrow envelopes must include ${key}.`
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (!isRecord(input.kdfParams)) {
|
|
220
|
+
addProblem(
|
|
221
|
+
problems,
|
|
222
|
+
`${path}.kdfParams`,
|
|
223
|
+
"invalid_secret_custody_target",
|
|
224
|
+
"Inline client-encrypted escrow envelopes must include KDF parameters."
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (isRecord(input.deploymentIntent)) {
|
|
229
|
+
const targetMode = input.deploymentIntent.targetMode;
|
|
230
|
+
if (targetMode !== void 0 && ![
|
|
231
|
+
"github_actions_secret_enclave",
|
|
232
|
+
"host_env_injection",
|
|
233
|
+
"metadata_only_reentry"
|
|
234
|
+
].includes(String(targetMode))) {
|
|
235
|
+
addProblem(
|
|
236
|
+
problems,
|
|
237
|
+
`${path}.deploymentIntent.targetMode`,
|
|
238
|
+
"invalid_secret_custody_target",
|
|
239
|
+
"Client-encrypted escrow deployment intent must target GitHub Secrets, host injection, or metadata-only re-entry."
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return problems;
|
|
244
|
+
}
|
|
245
|
+
function assertTreeseedClientEncryptedEscrowMetadata(input) {
|
|
246
|
+
const problems = validateTreeseedClientEncryptedEscrowMetadata(input);
|
|
247
|
+
if (problems.length > 0) {
|
|
248
|
+
const message = problems.map((problem) => `${problem.path}: ${problem.message}`).join("\n");
|
|
249
|
+
throw new Error(`Invalid Treeseed client-encrypted escrow metadata.
|
|
250
|
+
${message}`);
|
|
251
|
+
}
|
|
252
|
+
return input;
|
|
253
|
+
}
|
|
254
|
+
function buildTreeseedClientEncryptedEscrowEnvelope(input) {
|
|
255
|
+
return assertTreeseedClientEncryptedEscrowMetadata({
|
|
256
|
+
...input,
|
|
257
|
+
metadata: input.metadata ?? {}
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
function summarizeTreeseedClientEncryptedEscrowStatus(input, now = /* @__PURE__ */ new Date()) {
|
|
261
|
+
const expired = Boolean(input.expiresAt && Date.parse(input.expiresAt) <= now.getTime());
|
|
262
|
+
const tombstoned = Boolean(input.tombstonedAt) || input.status === "tombstoned";
|
|
263
|
+
const migrated = Boolean(input.migratedTo) || input.status === "migrated";
|
|
264
|
+
const reentryRequired = input.status === "reentry_required" || expired && !migrated && !tombstoned;
|
|
265
|
+
const status = tombstoned ? "tombstoned" : migrated ? "migrated" : reentryRequired ? "reentry_required" : expired ? "expired" : input.status ?? "active";
|
|
266
|
+
return {
|
|
267
|
+
status,
|
|
268
|
+
escrowed: !migrated && !tombstoned,
|
|
269
|
+
migrated,
|
|
270
|
+
expired,
|
|
271
|
+
tombstoned,
|
|
272
|
+
reentryRequired,
|
|
273
|
+
migrationTarget: input.migratedTo ?? null,
|
|
274
|
+
expiresAt: input.expiresAt ?? null
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
function summarizeTreeseedWorkflowCloudAccessDiagnostics(operation) {
|
|
278
|
+
const trustPolicy = isRecord(operation.trustPolicy) ? operation.trustPolicy : isRecord(operation.metadata) && isRecord(operation.metadata.trustPolicy) ? operation.metadata.trustPolicy : {};
|
|
279
|
+
const cloudAccess = isRecord(trustPolicy.cloudAccess) ? trustPolicy.cloudAccess : {};
|
|
280
|
+
if (operation.secretBearing === true && cloudAccess.longLivedSecrets === true && cloudAccess.oidcPreferred !== true) {
|
|
281
|
+
return [{
|
|
282
|
+
code: "oidc_preferred_for_cloud_access",
|
|
283
|
+
severity: "warning",
|
|
284
|
+
message: "Secret-bearing cloud workflows should prefer GitHub OIDC over long-lived cloud API keys when the target cloud supports it."
|
|
285
|
+
}];
|
|
286
|
+
}
|
|
287
|
+
return [];
|
|
288
|
+
}
|
|
289
|
+
function validateTreeseedGitHubActionsEncryptedSecretDeployment(input, path = "$") {
|
|
290
|
+
const problems = [];
|
|
291
|
+
if (!isRecord(input)) {
|
|
292
|
+
addProblem(problems, path, "invalid_registry", "GitHub Actions encrypted secret deployment must be an object.");
|
|
293
|
+
return problems;
|
|
294
|
+
}
|
|
295
|
+
if (containsTreeseedPlaintextSecretMaterial(input)) {
|
|
296
|
+
addProblem(
|
|
297
|
+
problems,
|
|
298
|
+
path,
|
|
299
|
+
"plaintext_escrow_material",
|
|
300
|
+
"GitHub Actions secret deployment payloads must contain GitHub-encrypted values only."
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
for (const key of ["repository", "scope", "secretName", "encryptedValue", "keyId"]) {
|
|
304
|
+
if (typeof input[key] !== "string" || !String(input[key]).trim()) {
|
|
305
|
+
addProblem(
|
|
306
|
+
problems,
|
|
307
|
+
`${path}.${key}`,
|
|
308
|
+
"invalid_secret_custody_target",
|
|
309
|
+
`GitHub Actions encrypted secret deployment must include ${key}.`
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (input.scope === "environment" && (typeof input.environment !== "string" || !input.environment.trim())) {
|
|
314
|
+
addProblem(
|
|
315
|
+
problems,
|
|
316
|
+
`${path}.environment`,
|
|
317
|
+
"invalid_secret_custody_target",
|
|
318
|
+
"GitHub environment secret deployment must include an environment."
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
return problems;
|
|
322
|
+
}
|
|
323
|
+
function assertTreeseedGitHubActionsEncryptedSecretDeployment(input) {
|
|
324
|
+
const problems = validateTreeseedGitHubActionsEncryptedSecretDeployment(input);
|
|
325
|
+
if (problems.length > 0) {
|
|
326
|
+
const message = problems.map((problem) => `${problem.path}: ${problem.message}`).join("\n");
|
|
327
|
+
throw new Error(`Invalid Treeseed GitHub Actions encrypted secret deployment.
|
|
328
|
+
${message}`);
|
|
329
|
+
}
|
|
330
|
+
return input;
|
|
331
|
+
}
|
|
332
|
+
function validateTreeseedSecretsCapabilityRegistry(input) {
|
|
333
|
+
const problems = [];
|
|
334
|
+
if (!isRecord(input)) {
|
|
335
|
+
addProblem(problems, "$", "invalid_registry", "Secrets capability registry must be an object.");
|
|
336
|
+
return { ok: false, problems, registry: null };
|
|
337
|
+
}
|
|
338
|
+
const registry = input;
|
|
339
|
+
const repositoryCredentialProviders = isRecord(input.repositoryCredentialProviders) ? input.repositoryCredentialProviders : {};
|
|
340
|
+
for (const key of Object.keys(repositoryCredentialProviders)) {
|
|
341
|
+
if (key !== "githubApp") {
|
|
342
|
+
addProblem(
|
|
343
|
+
problems,
|
|
344
|
+
`repositoryCredentialProviders.${key}`,
|
|
345
|
+
"unsupported_repository_credential_provider",
|
|
346
|
+
"Only GitHub App repository credential providers are supported in v1."
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const githubApp = repositoryCredentialProviders.githubApp;
|
|
351
|
+
if (githubApp !== void 0 && isRecord(githubApp) && githubApp.type !== "github-app") {
|
|
352
|
+
addProblem(
|
|
353
|
+
problems,
|
|
354
|
+
"repositoryCredentialProviders.githubApp.type",
|
|
355
|
+
"unsupported_repository_credential_provider",
|
|
356
|
+
'GitHub App provider config must use type "github-app".'
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
const secrets = Array.isArray(input.secrets) ? input.secrets : [];
|
|
360
|
+
secrets.forEach((secret, index) => {
|
|
361
|
+
if (!isRecord(secret)) return;
|
|
362
|
+
problems.push(...validateTreeseedWritableSecretMetadata(secret, `secrets.${index}`));
|
|
363
|
+
});
|
|
364
|
+
const operations = isRecord(input.workflowOperations) && Array.isArray(input.workflowOperations.operations) ? input.workflowOperations.operations : [];
|
|
365
|
+
operations.forEach((operation, index) => {
|
|
366
|
+
if (!isRecord(operation)) return;
|
|
367
|
+
const dispatch = isRecord(operation.dispatch) ? operation.dispatch : {};
|
|
368
|
+
if (operation.secretBearing === true && (dispatch.mode !== "allowlisted" || dispatch.arbitraryDispatch === true)) {
|
|
369
|
+
addProblem(
|
|
370
|
+
problems,
|
|
371
|
+
`workflowOperations.operations.${index}.dispatch`,
|
|
372
|
+
"arbitrary_secret_workflow_dispatch",
|
|
373
|
+
"Secret-bearing workflow operations must use allowlisted dispatch only."
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
if (operation.secretBearing === true && operation.providerSuppliedCommandsAllowed === true) {
|
|
377
|
+
addProblem(
|
|
378
|
+
problems,
|
|
379
|
+
`workflowOperations.operations.${index}.providerSuppliedCommandsAllowed`,
|
|
380
|
+
"arbitrary_secret_workflow_dispatch",
|
|
381
|
+
"Secret-bearing workflow operations must not run provider-supplied commands."
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
const trustPolicy = isRecord(operation.trustPolicy) ? operation.trustPolicy : isRecord(operation.metadata) && isRecord(operation.metadata.trustPolicy) ? operation.metadata.trustPolicy : {};
|
|
385
|
+
if (operation.secretBearing === true) {
|
|
386
|
+
if (!Array.isArray(trustPolicy.protectedRefs) || trustPolicy.protectedRefs.length === 0) {
|
|
387
|
+
addProblem(
|
|
388
|
+
problems,
|
|
389
|
+
`workflowOperations.operations.${index}.trustPolicy.protectedRefs`,
|
|
390
|
+
"arbitrary_secret_workflow_dispatch",
|
|
391
|
+
"Secret-bearing workflow operations must declare protected refs."
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
if (!Array.isArray(trustPolicy.allowedWorkflowFiles) || trustPolicy.allowedWorkflowFiles.length === 0) {
|
|
395
|
+
addProblem(
|
|
396
|
+
problems,
|
|
397
|
+
`workflowOperations.operations.${index}.trustPolicy.allowedWorkflowFiles`,
|
|
398
|
+
"arbitrary_secret_workflow_dispatch",
|
|
399
|
+
"Secret-bearing workflow operations must declare allowlisted workflow files."
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
if (trustPolicy.allowUntrustedCheckout === true) {
|
|
403
|
+
addProblem(
|
|
404
|
+
problems,
|
|
405
|
+
`workflowOperations.operations.${index}.trustPolicy.allowUntrustedCheckout`,
|
|
406
|
+
"arbitrary_secret_workflow_dispatch",
|
|
407
|
+
"Secret-bearing workflow operations must not run untrusted branch code."
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
if (trustPolicy.allowLocalActions === true) {
|
|
411
|
+
addProblem(
|
|
412
|
+
problems,
|
|
413
|
+
`workflowOperations.operations.${index}.trustPolicy.allowLocalActions`,
|
|
414
|
+
"arbitrary_secret_workflow_dispatch",
|
|
415
|
+
"Secret-bearing workflow operations must not execute repository-local actions unless a future trusted action scanner is implemented."
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
if (trustPolicy.artifactPolicy !== void 0 && !["none", "metadata_only"].includes(String(trustPolicy.artifactPolicy))) {
|
|
419
|
+
addProblem(
|
|
420
|
+
problems,
|
|
421
|
+
`workflowOperations.operations.${index}.trustPolicy.artifactPolicy`,
|
|
422
|
+
"arbitrary_secret_workflow_dispatch",
|
|
423
|
+
"Secret-bearing workflow operations may only expose no artifacts or metadata-only artifact observations in v1."
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
if (trustPolicy.cachePolicy !== void 0 && !["disabled", "metadata_only"].includes(String(trustPolicy.cachePolicy))) {
|
|
427
|
+
addProblem(
|
|
428
|
+
problems,
|
|
429
|
+
`workflowOperations.operations.${index}.trustPolicy.cachePolicy`,
|
|
430
|
+
"arbitrary_secret_workflow_dispatch",
|
|
431
|
+
"Secret-bearing workflow operations may only disable cache use or expose metadata-only cache observations in v1."
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
const trustedExecutionSets = isRecord(input.workflowOperations) && Array.isArray(input.workflowOperations.trustedExecutionSets) ? input.workflowOperations.trustedExecutionSets : [];
|
|
437
|
+
trustedExecutionSets.forEach((executionSet, index) => {
|
|
438
|
+
if (!isRecord(executionSet)) return;
|
|
439
|
+
if (executionSet.allowProviderSuppliedCommands === true) {
|
|
440
|
+
addProblem(
|
|
441
|
+
problems,
|
|
442
|
+
`workflowOperations.trustedExecutionSets.${index}.allowProviderSuppliedCommands`,
|
|
443
|
+
"arbitrary_secret_workflow_dispatch",
|
|
444
|
+
"Trusted execution sets must not allow provider-supplied commands in v1."
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
if (executionSet.allowLocalActions === true) {
|
|
448
|
+
addProblem(
|
|
449
|
+
problems,
|
|
450
|
+
`workflowOperations.trustedExecutionSets.${index}.allowLocalActions`,
|
|
451
|
+
"arbitrary_secret_workflow_dispatch",
|
|
452
|
+
"Trusted execution sets for secret-bearing operations must not allow repository-local actions in v1."
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
if (executionSet.allowUntrustedCheckout === true) {
|
|
456
|
+
addProblem(
|
|
457
|
+
problems,
|
|
458
|
+
`workflowOperations.trustedExecutionSets.${index}.allowUntrustedCheckout`,
|
|
459
|
+
"arbitrary_secret_workflow_dispatch",
|
|
460
|
+
"Trusted execution sets for secret-bearing operations must not allow untrusted branch checkout in v1."
|
|
461
|
+
);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
if (isRecord(input.capacityProviderWorkspaceDefaults)) {
|
|
465
|
+
if (input.capacityProviderWorkspaceDefaults.receivesSecrets !== false) {
|
|
466
|
+
addProblem(
|
|
467
|
+
problems,
|
|
468
|
+
"capacityProviderWorkspaceDefaults.receivesSecrets",
|
|
469
|
+
"provider_secret_delegation",
|
|
470
|
+
"Capacity providers must receive handles or workspace access, not customer secrets."
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
if (input.capacityProviderWorkspaceDefaults.directSecretDelegation === true) {
|
|
474
|
+
addProblem(
|
|
475
|
+
problems,
|
|
476
|
+
"capacityProviderWorkspaceDefaults.directSecretDelegation",
|
|
477
|
+
"provider_secret_delegation",
|
|
478
|
+
"Direct provider/customer secret delegation is not supported."
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
if (isRecord(input.clientEncryptedEscrow) && Array.isArray(input.clientEncryptedEscrow.metadataRecords)) {
|
|
483
|
+
input.clientEncryptedEscrow.metadataRecords.forEach((record, index) => {
|
|
484
|
+
problems.push(...validateTreeseedClientEncryptedEscrowMetadata(record, `clientEncryptedEscrow.metadataRecords.${index}`));
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
return { ok: problems.length === 0, problems, registry };
|
|
488
|
+
}
|
|
489
|
+
function assertTreeseedSecretsCapabilityRegistry(input) {
|
|
490
|
+
const validation = validateTreeseedSecretsCapabilityRegistry(input);
|
|
491
|
+
if (!validation.ok || validation.registry === null) {
|
|
492
|
+
const message = validation.problems.map((problem) => `${problem.path}: ${problem.message}`).join("\n");
|
|
493
|
+
throw new Error(`Invalid Treeseed secrets capability registry.
|
|
494
|
+
${message}`);
|
|
495
|
+
}
|
|
496
|
+
return validation.registry;
|
|
497
|
+
}
|
|
498
|
+
export {
|
|
499
|
+
TREESEED_CLIENT_ENCRYPTED_ESCROW_STATUSES,
|
|
500
|
+
TREESEED_GITHUB_APP_INSTALLATION_STATUSES,
|
|
501
|
+
TREESEED_GITHUB_APP_TOKEN_ISSUANCE_STATUSES,
|
|
502
|
+
TREESEED_GITHUB_REPOSITORY_GRANT_STATUSES,
|
|
503
|
+
TREESEED_PROVIDER_WORKSPACE_ACCESS_MODES,
|
|
504
|
+
TREESEED_SECRET_CAPABILITY_FAIL_CLOSED_CODES,
|
|
505
|
+
TREESEED_SECRET_CLASSES,
|
|
506
|
+
TREESEED_SECRET_CUSTODY_MODES,
|
|
507
|
+
TREESEED_SECRET_METADATA_RECORD_STATUSES,
|
|
508
|
+
TREESEED_TREEDX_CREDENTIAL_BRIDGE_OPERATIONS,
|
|
509
|
+
TREESEED_TREEDX_CREDENTIAL_ISSUANCE_STATUSES,
|
|
510
|
+
TREESEED_V1_REPOSITORY_CREDENTIAL_PROVIDERS,
|
|
511
|
+
TREESEED_WORKFLOW_DISPATCH_RECORD_STATUSES,
|
|
512
|
+
TREESEED_WORKFLOW_OPERATION_DISPATCH_MODES,
|
|
513
|
+
TREESEED_WORKFLOW_OPERATION_RECORD_STATUSES,
|
|
514
|
+
assertTreeseedClientEncryptedEscrowMetadata,
|
|
515
|
+
assertTreeseedGitHubActionsEncryptedSecretDeployment,
|
|
516
|
+
assertTreeseedSecretsCapabilityRegistry,
|
|
517
|
+
assertTreeseedWritableSecretMetadata,
|
|
518
|
+
buildTreeseedClientEncryptedEscrowEnvelope,
|
|
519
|
+
containsTreeseedPlaintextSecretMaterial,
|
|
520
|
+
isApiServiceDecryptableCustomerSecret,
|
|
521
|
+
isTreeseedSecretCustodyMode,
|
|
522
|
+
isTreeseedV1RepositoryCredentialProvider,
|
|
523
|
+
requiresClientSideSecretMaterial,
|
|
524
|
+
summarizeTreeseedClientEncryptedEscrowStatus,
|
|
525
|
+
summarizeTreeseedWorkflowCloudAccessDiagnostics,
|
|
526
|
+
validateTreeseedClientEncryptedEscrowMetadata,
|
|
527
|
+
validateTreeseedGitHubActionsEncryptedSecretDeployment,
|
|
528
|
+
validateTreeseedSecretsCapabilityRegistry,
|
|
529
|
+
validateTreeseedWritableSecretMetadata
|
|
530
|
+
};
|
package/dist/seeds/normalize.js
CHANGED
|
@@ -83,6 +83,7 @@ function normalizeSeedResources(manifest, selected) {
|
|
|
83
83
|
description: project.description ?? null,
|
|
84
84
|
kind: project.kind ?? null,
|
|
85
85
|
repository: project.repository,
|
|
86
|
+
architecture: project.architecture,
|
|
86
87
|
metadata: withMetadata(manifest, project.key, project.metadata)
|
|
87
88
|
}
|
|
88
89
|
});
|
package/dist/seeds/planner.js
CHANGED
|
@@ -40,9 +40,38 @@ function toAction(resource, currentByKey) {
|
|
|
40
40
|
action: "create"
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
|
+
function orderRecipeSteps(recipe) {
|
|
44
|
+
const byId = new Map(recipe.steps.map((step) => [step.id, step]));
|
|
45
|
+
const ordered = [];
|
|
46
|
+
const visited = /* @__PURE__ */ new Set();
|
|
47
|
+
const visit = (step) => {
|
|
48
|
+
if (visited.has(step.id)) return;
|
|
49
|
+
for (const dependency of step.dependsOn) {
|
|
50
|
+
const dependencyStep = byId.get(dependency);
|
|
51
|
+
if (dependencyStep) visit(dependencyStep);
|
|
52
|
+
}
|
|
53
|
+
visited.add(step.id);
|
|
54
|
+
ordered.push(step);
|
|
55
|
+
};
|
|
56
|
+
for (const step of recipe.steps) {
|
|
57
|
+
visit(step);
|
|
58
|
+
}
|
|
59
|
+
return ordered;
|
|
60
|
+
}
|
|
61
|
+
function planRecipes(manifest, environments) {
|
|
62
|
+
return manifest.operationRecipes.map((recipe) => {
|
|
63
|
+
const selected = recipe.environments.some((environment) => environments.includes(environment));
|
|
64
|
+
return {
|
|
65
|
+
...recipe,
|
|
66
|
+
selected,
|
|
67
|
+
orderedSteps: selected ? orderRecipeSteps(recipe) : []
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
43
71
|
function createSeedPlan(input) {
|
|
44
72
|
const currentByKey = new Map((input.currentResources ?? []).map((resource) => [resource.key, resource]));
|
|
45
73
|
const actions = normalizeSeedResources(input.manifest, input.environments).map((resource) => toAction(resource, currentByKey));
|
|
74
|
+
const recipes = planRecipes(input.manifest, input.environments);
|
|
46
75
|
const summary = emptySummary();
|
|
47
76
|
for (const action of actions) {
|
|
48
77
|
summary[action.action] += 1;
|
|
@@ -58,6 +87,7 @@ function createSeedPlan(input) {
|
|
|
58
87
|
environments: input.environments,
|
|
59
88
|
summary,
|
|
60
89
|
actions,
|
|
90
|
+
recipes,
|
|
61
91
|
diagnostics: input.diagnostics ?? [],
|
|
62
92
|
manifestPath: input.manifestPath
|
|
63
93
|
};
|
|
@@ -95,6 +125,14 @@ function formatSeedPlan(plan) {
|
|
|
95
125
|
if (lines[lines.length - 1] !== "") {
|
|
96
126
|
lines.push("");
|
|
97
127
|
}
|
|
128
|
+
const selectedRecipes = plan.recipes.filter((recipe) => recipe.selected);
|
|
129
|
+
if (selectedRecipes.length > 0) {
|
|
130
|
+
lines.push("Recipes:");
|
|
131
|
+
for (const recipe of selectedRecipes) {
|
|
132
|
+
lines.push(` ${recipe.id}: ${recipe.orderedSteps.length} step${recipe.orderedSteps.length === 1 ? "" : "s"}`);
|
|
133
|
+
}
|
|
134
|
+
lines.push("");
|
|
135
|
+
}
|
|
98
136
|
lines.push(
|
|
99
137
|
"Summary:",
|
|
100
138
|
` create: ${plan.summary.create}`,
|