@treeseed/sdk 0.11.0 → 0.12.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -4
- package/dist/agent-capacity.d.ts +916 -0
- package/dist/agent-capacity.js +1600 -0
- package/dist/agent-tools.d.ts +37 -0
- package/dist/agent-tools.js +301 -0
- package/dist/api/app.d.ts +1 -1
- package/dist/api/auth/d1-database.d.ts +2 -2
- package/dist/api/auth/d1-provider.d.ts +4 -4
- package/dist/api/auth/d1-store.d.ts +2 -2
- package/dist/api/auth/memory-provider.d.ts +1 -1
- package/dist/api/auth/tokens.d.ts +1 -1
- package/dist/api/config.d.ts +3 -1
- package/dist/api/config.js +34 -10
- package/dist/api/http.d.ts +2 -2
- package/dist/api/index.d.ts +10 -10
- package/dist/api/index.js +4 -2
- package/dist/api/operations-routes.d.ts +3 -3
- package/dist/api/operations.d.ts +1 -1
- package/dist/api/providers.d.ts +1 -1
- package/dist/api/providers.js +21 -4
- package/dist/api/railway.d.ts +3 -2
- package/dist/api/sdk-dispatch.d.ts +4 -4
- package/dist/api/sdk-routes.d.ts +2 -2
- package/dist/api/templates.d.ts +2 -2
- package/dist/api/types.d.ts +3 -2
- package/dist/capacity-provider.d.ts +117 -60
- package/dist/capacity-provider.js +215 -43
- package/dist/capacity.d.ts +2 -2
- package/dist/cli-tools.d.ts +1 -1
- package/dist/content-operations.d.ts +97 -0
- package/dist/content-operations.js +250 -0
- package/dist/content-store.d.ts +4 -4
- package/dist/control-plane-client.d.ts +13 -18
- package/dist/control-plane-client.js +8 -86
- package/dist/control-plane.d.ts +2 -2
- package/dist/copilot.d.ts +3 -0
- package/dist/copilot.js +16 -1
- package/dist/d1-http.d.ts +1 -1
- package/dist/d1-store.d.ts +32 -57
- package/dist/d1-store.js +115 -318
- package/dist/db/d1.d.ts +1 -232
- package/dist/db/index.d.ts +3 -3
- package/dist/db/market-schema.d.ts +49037 -11843
- package/dist/db/market-schema.js +1788 -50
- package/dist/db/node-sqlite.d.ts +1 -232
- package/dist/db/schema.d.ts +0 -462
- package/dist/db/schema.js +2 -22
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.js +0 -11
- package/dist/fixture-support.js +52 -4
- package/dist/governance.d.ts +133 -0
- package/dist/governance.js +285 -0
- package/dist/graph/build.d.ts +2 -2
- package/dist/graph/context-query-contracts.d.ts +1 -1
- package/dist/graph/dsl.d.ts +1 -1
- package/dist/graph/query.d.ts +4 -4
- package/dist/graph/ranking.d.ts +1 -1
- package/dist/graph/schema.d.ts +1 -1
- package/dist/graph.d.ts +11 -11
- package/dist/guarantees/index.d.ts +425 -0
- package/dist/guarantees/index.js +1146 -0
- package/dist/hosting/apps.d.ts +1 -1
- package/dist/hosting/builtins.d.ts +1 -1
- package/dist/hosting/builtins.js +9 -198
- package/dist/hosting/contracts.d.ts +3 -2
- package/dist/hosting/graph.d.ts +24 -21
- package/dist/hosting/graph.js +280 -294
- package/dist/hosting/index.d.ts +4 -4
- package/dist/index.d.ts +88 -74
- package/dist/index.js +81 -10
- package/dist/local-dev/managed-dev.d.ts +85 -0
- package/dist/local-dev/managed-dev.js +368 -0
- package/dist/managed-dependencies.d.ts +9 -0
- package/dist/managed-dependencies.js +10 -8
- package/dist/market-client.d.ts +265 -7
- package/dist/market-client.js +381 -9
- package/dist/model-registry.d.ts +1 -1
- package/dist/model-registry.js +19 -19
- package/dist/operations/agent-tools.d.ts +2 -11
- package/dist/operations/agent-tools.js +2 -14
- package/dist/operations/providers/default.d.ts +1 -1
- package/dist/operations/providers/default.js +20 -37
- package/dist/operations/repository-operations.d.ts +26 -2
- package/dist/operations/repository-operations.js +159 -1
- package/dist/operations/runtime.d.ts +3 -3
- package/dist/operations/services/bootstrap-runner.d.ts +1 -1
- package/dist/operations/services/build-warning-policy.d.ts +34 -0
- package/dist/operations/services/build-warning-policy.js +81 -82
- package/dist/operations/services/commit-message-provider.js +4 -4
- package/dist/operations/services/config-runtime.d.ts +73 -19
- package/dist/operations/services/config-runtime.js +276 -100
- package/dist/operations/services/deploy.d.ts +41 -622
- package/dist/operations/services/deploy.js +181 -213
- package/dist/operations/services/deployment-readiness.d.ts +1 -1
- package/dist/operations/services/deployment-readiness.js +38 -7
- package/dist/operations/services/git-remote-policy.js +12 -4
- package/dist/operations/services/git-runner.d.ts +66 -0
- package/dist/operations/services/git-runner.js +479 -0
- package/dist/operations/services/git-workflow.d.ts +43 -5
- package/dist/operations/services/git-workflow.js +242 -20
- package/dist/operations/services/github-actions-verification.d.ts +3 -1
- package/dist/operations/services/github-actions-verification.js +11 -3
- package/dist/operations/services/github-api.js +21 -5
- package/dist/operations/services/github-automation.d.ts +3 -3
- package/dist/operations/services/github-automation.js +15 -18
- package/dist/operations/services/github-credentials.js +2 -1
- package/dist/operations/services/hosted-service-checks.d.ts +19 -1
- package/dist/operations/services/hosted-service-checks.js +162 -11
- package/dist/operations/services/hosting-audit.d.ts +2 -2
- package/dist/operations/services/hosting-audit.js +7 -7
- package/dist/operations/services/hub-launch.d.ts +1 -1
- package/dist/operations/services/hub-provider-launch.d.ts +5 -5
- package/dist/operations/services/hub-provider-launch.js +19 -14
- package/dist/operations/services/live-hosted-service-checks.d.ts +2 -1
- package/dist/operations/services/live-hosted-service-checks.js +193 -80
- package/dist/operations/services/local-dev.js +0 -1
- package/dist/operations/services/managed-host-security.d.ts +1 -1
- package/dist/operations/services/managed-repositories.d.ts +37 -0
- package/dist/operations/services/managed-repositories.js +177 -0
- package/dist/operations/services/operations-runner-smoke.d.ts +3 -2
- package/dist/operations/services/operations-runner-smoke.js +22 -4
- package/dist/operations/services/package-adapters.d.ts +77 -2
- package/dist/operations/services/package-adapters.js +629 -56
- package/dist/operations/services/package-reference-policy.d.ts +12 -88
- package/dist/operations/services/package-reference-policy.js +81 -213
- package/dist/operations/services/project-host-operations.d.ts +4 -4
- package/dist/operations/services/project-platform.d.ts +19 -193
- package/dist/operations/services/project-platform.js +31 -103
- package/dist/operations/services/project-web-monitor.d.ts +2 -2
- package/dist/operations/services/project-web-monitor.js +97 -2
- package/dist/operations/services/railway-api.d.ts +36 -7
- package/dist/operations/services/railway-api.js +331 -100
- package/dist/operations/services/railway-deploy.d.ts +7 -95
- package/dist/operations/services/railway-deploy.js +334 -742
- package/dist/operations/services/release-history.js +3 -4
- package/dist/operations/services/release-proof-ledger.d.ts +13 -0
- package/dist/operations/services/release-proof-ledger.js +81 -0
- package/dist/operations/services/release-proof-planner.d.ts +48 -0
- package/dist/operations/services/release-proof-planner.js +195 -0
- package/dist/operations/services/release-proof-runner.d.ts +16 -0
- package/dist/operations/services/release-proof-runner.js +169 -0
- package/dist/operations/services/release-proof.d.ts +81 -0
- package/dist/operations/services/release-proof.js +79 -0
- package/dist/operations/services/repository-save-orchestrator.d.ts +6 -7
- package/dist/operations/services/repository-save-orchestrator.js +353 -174
- package/dist/operations/services/runtime-paths.d.ts +1 -3
- package/dist/operations/services/runtime-paths.js +0 -4
- package/dist/operations/services/runtime-tools.d.ts +1 -192
- package/dist/operations/services/runtime-tools.js +4 -444
- package/dist/operations/services/save-deploy-preflight.js +9 -1
- package/dist/operations/services/template-host-bindings.d.ts +2 -2
- package/dist/operations/services/template-host-bindings.js +3 -2
- package/dist/operations/services/template-registry.d.ts +6 -6
- package/dist/operations/services/template-registry.js +33 -14
- package/dist/operations/services/template-secret-sync.d.ts +3 -3
- package/dist/operations/services/workflow-timing.d.ts +25 -0
- package/dist/operations/services/workflow-timing.js +79 -0
- package/dist/operations/services/workspace-dependency-mode.js +41 -4
- package/dist/operations/services/workspace-preflight.js +8 -8
- package/dist/operations/services/workspace-save-script.d.ts +4 -4
- package/dist/operations/services/workspace-save.d.ts +1 -0
- package/dist/operations/services/workspace-save.js +41 -18
- package/dist/operations/services/workspace-tools.js +40 -6
- package/dist/operations-registry.d.ts +1 -1
- package/dist/operations-registry.js +5 -6
- package/dist/operations-types.d.ts +1 -1
- package/dist/operations.d.ts +17 -11
- package/dist/operations.js +57 -3
- package/dist/platform/book-export.js +2 -0
- package/dist/platform/books-data.d.ts +1 -1
- package/dist/platform/config.d.ts +27 -0
- package/dist/platform/config.js +100 -0
- package/dist/platform/content-runtime-source.d.ts +54 -0
- package/dist/platform/content-runtime-source.js +169 -0
- package/dist/platform/contracts.d.ts +6 -1
- package/dist/platform/deploy-config.d.ts +1 -1
- package/dist/platform/deploy-config.js +7 -1
- package/dist/platform/deploy-runtime.d.ts +1 -1
- package/dist/platform/desired-state.d.ts +66 -0
- package/dist/platform/desired-state.js +1052 -0
- package/dist/platform/env.yaml +414 -19
- package/dist/platform/environment.d.ts +2 -2
- package/dist/platform/environment.js +54 -22
- package/dist/platform/local-content-materialization.d.ts +9 -0
- package/dist/platform/local-content-materialization.js +212 -0
- package/dist/platform/plugin.d.ts +5 -5
- package/dist/platform/plugins/runtime.d.ts +3 -3
- package/dist/platform/plugins/runtime.js +62 -1
- package/dist/platform/plugins.d.ts +6 -6
- package/dist/platform/published-content-pipeline.d.ts +3 -3
- package/dist/platform/published-content-pipeline.js +5 -1
- package/dist/platform/published-content.d.ts +4 -3
- package/dist/platform/site-config-schema.d.ts +1 -0
- package/dist/platform/site-config-schema.js +4 -1
- package/dist/platform/tenant/runtime-config.d.ts +152 -2
- package/dist/platform/tenant-config.d.ts +1 -1
- package/dist/platform/utils/site-config-schema.d.ts +154 -0
- package/dist/platform/utils/site-config-schema.js +400 -461
- package/dist/platform-operation-store.d.ts +1 -1
- package/dist/plugin-default.d.ts +1 -1
- package/dist/plugin-default.js +27 -12
- package/dist/project-import.d.ts +91 -0
- package/dist/project-import.js +257 -0
- package/dist/project-workflow.d.ts +1 -1
- package/dist/reconcile/bootstrap-systems.d.ts +2 -2
- package/dist/reconcile/bootstrap-systems.js +3 -3
- package/dist/reconcile/builtin-adapters.d.ts +7 -1
- package/dist/reconcile/builtin-adapters.js +2924 -346
- package/dist/reconcile/contracts.d.ts +15 -2
- package/dist/reconcile/desired-state.d.ts +2 -193
- package/dist/reconcile/desired-state.js +24 -33
- package/dist/reconcile/engine.d.ts +60 -397
- package/dist/reconcile/engine.js +182 -18
- package/dist/reconcile/index.d.ts +10 -10
- package/dist/reconcile/live-acceptance.d.ts +22 -1
- package/dist/reconcile/live-acceptance.js +456 -44
- package/dist/reconcile/providers/docker-private.d.ts +54 -0
- package/dist/reconcile/providers/docker-private.js +101 -0
- package/dist/reconcile/providers/github-private.d.ts +65 -0
- package/dist/reconcile/providers/github-private.js +119 -0
- package/dist/reconcile/providers/local-private.d.ts +28 -0
- package/dist/reconcile/providers/local-private.js +75 -0
- package/dist/reconcile/providers/railway-iac.d.ts +66 -0
- package/dist/reconcile/providers/railway-iac.js +275 -0
- package/dist/reconcile/providers/release-private.d.ts +92 -0
- package/dist/reconcile/providers/release-private.js +152 -0
- package/dist/reconcile/registry.d.ts +2 -2
- package/dist/reconcile/registry.js +16 -1
- package/dist/reconcile/state.d.ts +1 -1
- package/dist/reconcile/state.js +3 -40
- package/dist/reconcile/units.d.ts +1 -1
- package/dist/reconcile/units.js +7 -1
- package/dist/remote.d.ts +6 -6
- package/dist/scenes/artifacts.d.ts +16 -0
- package/dist/scenes/artifacts.js +61 -0
- package/dist/scenes/auth.d.ts +2 -0
- package/dist/scenes/auth.js +28 -0
- package/dist/scenes/base-url.d.ts +12 -0
- package/dist/scenes/base-url.js +123 -0
- package/dist/scenes/builtin-plugins.d.ts +2 -0
- package/dist/scenes/builtin-plugins.js +447 -0
- package/dist/scenes/checkpoints.d.ts +14 -0
- package/dist/scenes/checkpoints.js +33 -0
- package/dist/scenes/device-matrix.d.ts +2 -0
- package/dist/scenes/device-matrix.js +97 -0
- package/dist/scenes/devices.d.ts +11 -0
- package/dist/scenes/devices.js +22 -0
- package/dist/scenes/diagnostics.d.ts +5 -0
- package/dist/scenes/diagnostics.js +22 -0
- package/dist/scenes/diagram-providers.d.ts +2 -0
- package/dist/scenes/diagram-providers.js +181 -0
- package/dist/scenes/diagram-validation.d.ts +22 -0
- package/dist/scenes/diagram-validation.js +74 -0
- package/dist/scenes/environment.d.ts +2 -0
- package/dist/scenes/environment.js +65 -0
- package/dist/scenes/evidence-bundle.d.ts +5 -0
- package/dist/scenes/evidence-bundle.js +42 -0
- package/dist/scenes/evidence-report.d.ts +10 -0
- package/dist/scenes/evidence-report.js +73 -0
- package/dist/scenes/evidence.d.ts +16 -0
- package/dist/scenes/evidence.js +277 -0
- package/dist/scenes/index.d.ts +48 -0
- package/dist/scenes/index.js +312 -0
- package/dist/scenes/inspect.d.ts +9 -0
- package/dist/scenes/inspect.js +64 -0
- package/dist/scenes/loader.d.ts +3 -0
- package/dist/scenes/loader.js +38 -0
- package/dist/scenes/logs.d.ts +2 -0
- package/dist/scenes/logs.js +47 -0
- package/dist/scenes/operations.d.ts +3 -0
- package/dist/scenes/operations.js +128 -0
- package/dist/scenes/phase0.d.ts +9 -0
- package/dist/scenes/phase0.js +637 -0
- package/dist/scenes/planner.d.ts +12 -0
- package/dist/scenes/planner.js +166 -0
- package/dist/scenes/playwright-adapter.d.ts +2 -0
- package/dist/scenes/playwright-adapter.js +63 -0
- package/dist/scenes/plugins.d.ts +5 -0
- package/dist/scenes/plugins.js +115 -0
- package/dist/scenes/progress.d.ts +17 -0
- package/dist/scenes/progress.js +24 -0
- package/dist/scenes/publish-destinations.d.ts +12 -0
- package/dist/scenes/publish-destinations.js +99 -0
- package/dist/scenes/publish-plan-report.d.ts +10 -0
- package/dist/scenes/publish-plan-report.js +70 -0
- package/dist/scenes/publish-plan.d.ts +15 -0
- package/dist/scenes/publish-plan.js +248 -0
- package/dist/scenes/publish-redaction.d.ts +16 -0
- package/dist/scenes/publish-redaction.js +148 -0
- package/dist/scenes/publish-release-record.d.ts +13 -0
- package/dist/scenes/publish-release-record.js +34 -0
- package/dist/scenes/publish-report.d.ts +10 -0
- package/dist/scenes/publish-report.js +67 -0
- package/dist/scenes/publish.d.ts +16 -0
- package/dist/scenes/publish.js +298 -0
- package/dist/scenes/registry.d.ts +12 -0
- package/dist/scenes/registry.js +65 -0
- package/dist/scenes/remotion-adapter.d.ts +3 -0
- package/dist/scenes/remotion-adapter.js +94 -0
- package/dist/scenes/remotion-composition-registry.d.ts +2 -0
- package/dist/scenes/remotion-composition-registry.js +12 -0
- package/dist/scenes/remotion-compositions.d.ts +15 -0
- package/dist/scenes/remotion-compositions.js +464 -0
- package/dist/scenes/remotion-diagrams.d.ts +9 -0
- package/dist/scenes/remotion-diagrams.js +188 -0
- package/dist/scenes/remotion-input.d.ts +13 -0
- package/dist/scenes/remotion-input.js +291 -0
- package/dist/scenes/remotion-visuals.d.ts +29 -0
- package/dist/scenes/remotion-visuals.js +198 -0
- package/dist/scenes/render-media-assets.d.ts +9 -0
- package/dist/scenes/render-media-assets.js +117 -0
- package/dist/scenes/render-report.d.ts +10 -0
- package/dist/scenes/render-report.js +27 -0
- package/dist/scenes/render.d.ts +2 -0
- package/dist/scenes/render.js +218 -0
- package/dist/scenes/reporter.d.ts +3 -0
- package/dist/scenes/reporter.js +101 -0
- package/dist/scenes/resume.d.ts +2 -0
- package/dist/scenes/resume.js +79 -0
- package/dist/scenes/runner.d.ts +2 -0
- package/dist/scenes/runner.js +674 -0
- package/dist/scenes/schema.d.ts +6 -0
- package/dist/scenes/schema.js +994 -0
- package/dist/scenes/seed.d.ts +2 -0
- package/dist/scenes/seed.js +83 -0
- package/dist/scenes/segments.d.ts +15 -0
- package/dist/scenes/segments.js +79 -0
- package/dist/scenes/selectors.d.ts +3 -0
- package/dist/scenes/selectors.js +21 -0
- package/dist/scenes/timeline.d.ts +11 -0
- package/dist/scenes/timeline.js +26 -0
- package/dist/scenes/timeouts.d.ts +6 -0
- package/dist/scenes/timeouts.js +17 -0
- package/dist/scenes/training-captions.d.ts +14 -0
- package/dist/scenes/training-captions.js +98 -0
- package/dist/scenes/training-report.d.ts +10 -0
- package/dist/scenes/training-report.js +78 -0
- package/dist/scenes/training-transcript.d.ts +24 -0
- package/dist/scenes/training-transcript.js +204 -0
- package/dist/scenes/training.d.ts +10 -0
- package/dist/scenes/training.js +134 -0
- package/dist/scenes/types.d.ts +1872 -0
- package/dist/scenes/types.js +8 -0
- package/dist/scenes/visual-audit-contact-sheets.d.ts +6 -0
- package/dist/scenes/visual-audit-contact-sheets.js +119 -0
- package/dist/scenes/visual-audit-fixtures.d.ts +25 -0
- package/dist/scenes/visual-audit-fixtures.js +210 -0
- package/dist/scenes/visual-audit-report.d.ts +11 -0
- package/dist/scenes/visual-audit-report.js +85 -0
- package/dist/scenes/visual-audit-review.d.ts +23 -0
- package/dist/scenes/visual-audit-review.js +829 -0
- package/dist/scenes/visual-audit-routes.d.ts +13 -0
- package/dist/scenes/visual-audit-routes.js +308 -0
- package/dist/scenes/visual-audit.d.ts +3 -0
- package/dist/scenes/visual-audit.js +596 -0
- package/dist/scripts/build-dist.js +154 -40
- package/dist/scripts/check-build-warnings.js +42 -53
- package/dist/scripts/cleanup-markdown.js +1 -1
- package/dist/scripts/cli-test-fixtures.js +24 -28
- package/dist/scripts/migrate-journey-csv-to-guarantees.js +140 -0
- package/dist/scripts/package-tools.js +12 -1
- package/dist/scripts/prepare.js +3 -7
- package/dist/scripts/release-verify.js +2 -5
- package/dist/scripts/run-fixture-astro-command.js +1 -1
- package/dist/scripts/template-catalog.test.js +68 -82
- package/dist/scripts/tenant-dev.js +0 -10
- package/dist/scripts/test-cloudflare-local.js +1 -1
- package/dist/scripts/test-scaffold.js +0 -1
- package/dist/scripts/test-smoke.js +3 -3
- package/dist/scripts/treeseed-build-dist.js +4 -7
- package/dist/scripts/treeseed-release-verify.js +1 -1
- package/dist/scripts/verify-driver.js +30 -21
- package/dist/scripts/workflow-commands.test.js +18 -27
- package/dist/scripts/workspace-command-e2e.js +1 -1
- package/dist/scripts/workspace-lint.js +6 -0
- package/dist/scripts/workspace-release-test.js +90 -1
- package/dist/scripts/workspace-test.js +6 -0
- package/dist/sdk-dispatch.d.ts +1 -1
- package/dist/sdk-dispatch.js +0 -16
- package/dist/sdk-fields.d.ts +1 -1
- package/dist/sdk-filters.d.ts +1 -1
- package/dist/sdk-types.d.ts +1184 -113
- package/dist/sdk-types.js +393 -0
- package/dist/sdk.d.ts +74 -79
- package/dist/sdk.js +27 -36
- package/dist/secrets-capability.d.ts +421 -0
- package/dist/secrets-capability.js +530 -0
- package/dist/seeds/normalize.js +1 -0
- package/dist/seeds/planner.js +38 -0
- package/dist/seeds/schema.js +293 -4
- package/dist/seeds/types.d.ts +60 -0
- package/dist/seeds/types.js +9 -1
- package/dist/service-credentials.d.ts +54 -0
- package/dist/service-credentials.js +112 -0
- package/dist/stores/cursor-store.d.ts +2 -2
- package/dist/stores/envelopes.d.ts +1 -1
- package/dist/stores/helpers.d.ts +1 -1
- package/dist/stores/lease-store.d.ts +2 -2
- package/dist/stores/message-store.d.ts +2 -2
- package/dist/stores/operational-store.d.ts +3 -26
- package/dist/stores/operational-store.js +0 -225
- package/dist/stores/project-workflow-store.d.ts +2 -2
- package/dist/stores/run-store.d.ts +2 -3
- package/dist/stores/run-store.js +0 -98
- package/dist/stores/subscription-store.d.ts +2 -3
- package/dist/stores/subscription-store.js +0 -100
- package/dist/template-catalog.d.ts +1 -1
- package/dist/template-launch-requirements.d.ts +2 -2
- package/dist/template-launch-ui.d.ts +2 -2
- package/dist/treedx/adapters.d.ts +6 -6
- package/dist/treedx/client.d.ts +1 -1
- package/dist/treedx/errors.d.ts +1 -1
- package/dist/treedx/federated-client.d.ts +3 -3
- package/dist/treedx/graph-adapter.d.ts +2 -2
- package/dist/treedx/index.d.ts +14 -14
- package/dist/treedx/market-integration.d.ts +1 -1
- package/dist/treedx/ports.d.ts +30 -30
- package/dist/treedx/query-adapter.d.ts +3 -3
- package/dist/treedx/registry-client.d.ts +2 -2
- package/dist/treedx/repository-adapter.d.ts +4 -4
- package/dist/treedx/repository-adapter.js +14 -3
- package/dist/treedx/sdk-integration.d.ts +3 -3
- package/dist/treedx/types.d.ts +2 -2
- package/dist/treedx/workspace-adapter.d.ts +2 -2
- package/dist/treedx-backends.d.ts +13 -11
- package/dist/treedx-backends.js +52 -50
- package/dist/treedx-client.d.ts +3 -0
- package/dist/treedx-client.js +10 -1
- package/dist/treeseed/services/compose.yml +2 -3
- package/dist/treeseed/template-catalog/catalog.fixture.json +4 -4
- package/dist/types/agents.d.ts +256 -0
- package/dist/types/agents.js +42 -1
- package/dist/verification.d.ts +1 -0
- package/dist/verification.js +143 -14
- package/dist/workflow/operations.d.ts +510 -559
- package/dist/workflow/operations.js +1891 -1342
- package/dist/workflow/policy.js +19 -7
- package/dist/workflow/runs.d.ts +9 -3
- package/dist/workflow/runs.js +66 -26
- package/dist/workflow/session.d.ts +4 -1
- package/dist/workflow/session.js +50 -10
- package/dist/workflow/worktrees.d.ts +6 -2
- package/dist/workflow/worktrees.js +98 -15
- package/dist/workflow-state.d.ts +5 -5
- package/dist/workflow-state.js +27 -17
- package/dist/workflow-support.d.ts +26 -25
- package/dist/workflow-support.js +27 -31
- package/dist/workflow.d.ts +46 -16
- package/dist/workflow.js +19 -7
- package/drizzle/d1/0000_treeseed_d1.sql +0 -18
- package/drizzle/market/0000_market_control_plane.sql +1793 -1499
- package/drizzle/market/0005_agent_capacity_coordination.sql +145 -0
- package/drizzle/market/0006_provider_assignment_lifecycle.sql +9 -0
- package/drizzle/market/0007_agent_architecture_gap_closure.sql +157 -0
- package/drizzle/market/0008_agent_capacity_operational_closure.sql +27 -0
- package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +29 -0
- package/drizzle/market/0010_secrets_capability_persistence.sql +130 -0
- package/drizzle/market/0011_github_app_adapter.sql +47 -0
- package/drizzle/market/0012_workday_test_runs.sql +44 -0
- package/drizzle/market/0013_runtime_task_lifecycle.sql +39 -0
- package/drizzle/market/0014_governance_pipeline.sql +189 -0
- package/package.json +75 -18
- package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
- package/templates/github/deploy-web.workflow.yml +12 -8
- package/dist/operations/services/mailpit-runtime.d.ts +0 -20
- package/dist/operations/services/mailpit-runtime.js +0 -67
- package/dist/operations/services/release-candidate.d.ts +0 -60
- package/dist/operations/services/release-candidate.js +0 -953
- package/dist/scripts/ensure-mailpit.js +0 -48
- package/dist/scripts/logs-mailpit.js +0 -2
- package/dist/scripts/run-ts.js +0 -45
- package/dist/scripts/stop-mailpit.js +0 -5
- package/dist/scripts/treeseed-run-ts.js +0 -45
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { sceneErrorDiagnostic, sceneWarningDiagnostic } from "./diagnostics.js";
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_TREESEED_SCENE_PUBLICATION_TARGETS,
|
|
6
|
+
createTreeseedScenePublishDestinations,
|
|
7
|
+
destinationIdsForTreeseedScenePublishedArtifact,
|
|
8
|
+
isTreeseedSceneExternalPublishTarget
|
|
9
|
+
} from "./publish-destinations.js";
|
|
10
|
+
import { resolveTreeseedSceneRunRoot } from "./inspect.js";
|
|
11
|
+
import { validateTreeseedScene } from "./planner.js";
|
|
12
|
+
import { publishTreeseedSceneEvidence } from "./publish.js";
|
|
13
|
+
import { appendTreeseedScenePublishPlanPaths, writeTreeseedScenePublishPlanReport } from "./publish-plan-report.js";
|
|
14
|
+
function readJson(path) {
|
|
15
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
16
|
+
}
|
|
17
|
+
function writeJson(path, value) {
|
|
18
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
19
|
+
writeFileSync(path, `${JSON.stringify(value, null, 2)}
|
|
20
|
+
`, "utf8");
|
|
21
|
+
}
|
|
22
|
+
function nowIso() {
|
|
23
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
24
|
+
}
|
|
25
|
+
function safeExportPath(exportRoot, relativePath) {
|
|
26
|
+
return join(exportRoot, relativePath.replace(/^(\.\.[/\\])+/u, "").replace(/^[/\\]+/u, ""));
|
|
27
|
+
}
|
|
28
|
+
function failedReport(input) {
|
|
29
|
+
const blockers = input.blockers ?? input.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
phase: 11,
|
|
33
|
+
sceneId: input.sceneId ?? null,
|
|
34
|
+
sourceRunId: input.sourceRunId ?? null,
|
|
35
|
+
scenePath: input.scenePath,
|
|
36
|
+
runRoot: input.runRoot,
|
|
37
|
+
publishRoot: input.publishRoot ?? (input.runRoot ? join(input.runRoot, "publish") : null),
|
|
38
|
+
publishPlanRoot: input.publishPlanRoot ?? (input.runRoot ? join(input.runRoot, "publish-plan") : null),
|
|
39
|
+
manifest: input.manifest ?? null,
|
|
40
|
+
paths: input.paths ?? null,
|
|
41
|
+
diagnostics: input.diagnostics,
|
|
42
|
+
warnings: input.warnings ?? input.diagnostics.filter((diagnostic) => diagnostic.severity === "warning"),
|
|
43
|
+
blockers
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function validateTargets(targets) {
|
|
47
|
+
return targets.filter((target) => !isTreeseedSceneExternalPublishTarget(target)).map((target) => sceneErrorDiagnostic("scene.publish_plan_target_unsupported", `Unsupported scene publication target "${String(target)}".`, "target"));
|
|
48
|
+
}
|
|
49
|
+
function buildTreeseedScenePublishPlanManifest(input) {
|
|
50
|
+
const diagnostics = [...input.publish.diagnostics, ...validateTargets(input.targets)];
|
|
51
|
+
if (input.targets.includes("release-evidence") && input.publish.workflowStatus !== "passed") {
|
|
52
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_plan_release_blocked", "Release-evidence publication planning is blocked until the scene workflow passes.", "target"));
|
|
53
|
+
}
|
|
54
|
+
const validTargets = input.targets.filter(isTreeseedSceneExternalPublishTarget);
|
|
55
|
+
const destinations = createTreeseedScenePublishDestinations({ runRoot: input.runRoot, targets: validTargets });
|
|
56
|
+
const artifacts = input.publish.artifacts.map((artifact) => ({
|
|
57
|
+
id: artifact.id,
|
|
58
|
+
kind: artifact.kind,
|
|
59
|
+
sourcePath: artifact.publishedPath ?? artifact.sourcePath,
|
|
60
|
+
relativePath: artifact.relativePath,
|
|
61
|
+
destinationIds: destinationIdsForTreeseedScenePublishedArtifact({ artifact, targets: validTargets }),
|
|
62
|
+
sha256: artifact.sha256,
|
|
63
|
+
bytes: artifact.bytes,
|
|
64
|
+
redactionDecision: artifact.decision
|
|
65
|
+
})).filter((artifact) => artifact.destinationIds.length > 0);
|
|
66
|
+
if (artifacts.length === 0) {
|
|
67
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_plan_no_artifacts", "No redacted published artifacts matched the selected publication targets.", "publish-plan"));
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
schemaVersion: "treeseed.scene.publish-plan/v1",
|
|
71
|
+
phase: 11,
|
|
72
|
+
generatedAt: input.timestamp ?? nowIso(),
|
|
73
|
+
sourcePublishManifestPath: input.publishManifestPath,
|
|
74
|
+
sourceRunRoot: input.runRoot,
|
|
75
|
+
sceneId: input.publish.sceneId,
|
|
76
|
+
sourceRunId: input.publish.sourceRunId,
|
|
77
|
+
workflowStatus: input.publish.workflowStatus,
|
|
78
|
+
mode: input.mode,
|
|
79
|
+
targets: validTargets,
|
|
80
|
+
destinations,
|
|
81
|
+
artifacts,
|
|
82
|
+
reconciliationIntents: destinations.map((destination) => ({
|
|
83
|
+
id: `scene-publication-${destination.target}`,
|
|
84
|
+
target: destination.target,
|
|
85
|
+
action: "plan-only",
|
|
86
|
+
reason: "Phase 11 records publication intent for a future canonical reconciliation apply; it does not mutate external stores.",
|
|
87
|
+
desiredState: destination.reconciliationResource.desiredState
|
|
88
|
+
})),
|
|
89
|
+
diagnostics
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function writeTreeseedScenePublishPlan(input) {
|
|
93
|
+
const publishPlanRoot = join(input.runRoot, "publish-plan");
|
|
94
|
+
const exportRoot = input.manifest.mode === "local-export" ? join(publishPlanRoot, "export") : null;
|
|
95
|
+
const paths = {
|
|
96
|
+
publishPlanRoot,
|
|
97
|
+
manifestPath: join(publishPlanRoot, "manifest.json"),
|
|
98
|
+
reportPath: join(publishPlanRoot, "report.md"),
|
|
99
|
+
exportRoot,
|
|
100
|
+
exportManifestPath: exportRoot ? join(exportRoot, "export-manifest.json") : null
|
|
101
|
+
};
|
|
102
|
+
if (exportRoot) {
|
|
103
|
+
const copied = [];
|
|
104
|
+
for (const destination of input.manifest.destinations) {
|
|
105
|
+
mkdirSync(destination.root, { recursive: true });
|
|
106
|
+
for (const artifact of input.manifest.artifacts.filter((entry) => entry.destinationIds.includes(destination.id))) {
|
|
107
|
+
if (destination.target === "artifact-store") {
|
|
108
|
+
copied.push({
|
|
109
|
+
artifactId: artifact.id,
|
|
110
|
+
destinationId: destination.id,
|
|
111
|
+
sourcePath: artifact.sourcePath,
|
|
112
|
+
exportedPath: null,
|
|
113
|
+
relativePath: artifact.relativePath
|
|
114
|
+
});
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (!existsSync(artifact.sourcePath)) continue;
|
|
118
|
+
const targetPath = safeExportPath(destination.root, artifact.relativePath);
|
|
119
|
+
mkdirSync(dirname(targetPath), { recursive: true });
|
|
120
|
+
copyFileSync(artifact.sourcePath, targetPath);
|
|
121
|
+
copied.push({
|
|
122
|
+
artifactId: artifact.id,
|
|
123
|
+
destinationId: destination.id,
|
|
124
|
+
sourcePath: artifact.sourcePath,
|
|
125
|
+
exportedPath: targetPath,
|
|
126
|
+
relativePath: artifact.relativePath
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
writeJson(paths.exportManifestPath, {
|
|
131
|
+
schemaVersion: "treeseed.scene.publication-export/v1",
|
|
132
|
+
phase: 11,
|
|
133
|
+
generatedAt: input.manifest.generatedAt,
|
|
134
|
+
sceneId: input.manifest.sceneId,
|
|
135
|
+
sourceRunId: input.manifest.sourceRunId,
|
|
136
|
+
targets: input.manifest.targets,
|
|
137
|
+
destinations: input.manifest.destinations,
|
|
138
|
+
artifacts: copied
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
writeTreeseedScenePublishPlanReport({ manifest: input.manifest, paths });
|
|
142
|
+
return paths;
|
|
143
|
+
}
|
|
144
|
+
async function loadOrGenerateLocalPublish(input) {
|
|
145
|
+
const publishManifestPath = join(input.runRoot, "publish", "local", "manifest.json");
|
|
146
|
+
if (existsSync(publishManifestPath)) {
|
|
147
|
+
return { publish: readJson(publishManifestPath), publishManifestPath, diagnostics: [], warnings: [] };
|
|
148
|
+
}
|
|
149
|
+
const report = await publishTreeseedSceneEvidence({
|
|
150
|
+
projectRoot: input.projectRoot,
|
|
151
|
+
scene: input.scene,
|
|
152
|
+
from: input.from,
|
|
153
|
+
target: "local",
|
|
154
|
+
timestamp: input.timestamp
|
|
155
|
+
});
|
|
156
|
+
if (!report.ok || !report.manifest || !report.paths) {
|
|
157
|
+
return { publish: null, publishManifestPath, diagnostics: report.diagnostics, warnings: report.warnings };
|
|
158
|
+
}
|
|
159
|
+
const warning = sceneWarningDiagnostic("scene.publish_plan_missing_publish", "Local Phase 10 publish manifest was missing, so Phase 11 generated a local redacted publish bundle first.", "publish/local/manifest.json");
|
|
160
|
+
return {
|
|
161
|
+
publish: report.manifest,
|
|
162
|
+
publishManifestPath: report.paths.manifestPath,
|
|
163
|
+
diagnostics: [warning, ...report.diagnostics],
|
|
164
|
+
warnings: [warning, ...report.warnings]
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
async function runPublicationPlan(input) {
|
|
168
|
+
const resolved = resolveTreeseedSceneRunRoot(input.projectRoot, input.from);
|
|
169
|
+
if (!resolved.runRoot) return failedReport({ scenePath: input.scene, runRoot: null, diagnostics: resolved.diagnostics });
|
|
170
|
+
const scenePath = join(resolved.runRoot, "scene.normalized.json");
|
|
171
|
+
const runPath = join(resolved.runRoot, "run.json");
|
|
172
|
+
const blockers = [];
|
|
173
|
+
if (!existsSync(scenePath)) blockers.push(sceneErrorDiagnostic("scene.publish_plan_missing_scene", `Normalized scene artifact not found: ${scenePath}.`, "scene"));
|
|
174
|
+
if (!existsSync(runPath)) blockers.push(sceneErrorDiagnostic("scene.publish_plan_missing_run", `Run report artifact not found: ${runPath}.`, "from"));
|
|
175
|
+
if (blockers.length > 0) return failedReport({ scenePath: input.scene, runRoot: resolved.runRoot, diagnostics: [...resolved.diagnostics, ...blockers], blockers });
|
|
176
|
+
const sourceScene = readJson(scenePath);
|
|
177
|
+
const run = readJson(runPath);
|
|
178
|
+
const validation = validateTreeseedScene({ projectRoot: input.projectRoot, scene: input.scene });
|
|
179
|
+
if (!validation.ok) return failedReport({ scenePath: validation.scenePath, runRoot: resolved.runRoot, diagnostics: validation.diagnostics, sceneId: sourceScene.id, sourceRunId: run.runId });
|
|
180
|
+
if (validation.scene?.id !== sourceScene.id) {
|
|
181
|
+
const diagnostic = sceneErrorDiagnostic("scene.publish_plan_scene_mismatch", `Scene manifest "${validation.scene?.id ?? "(unknown)"}" does not match source run scene "${sourceScene.id}".`, "scene");
|
|
182
|
+
return failedReport({ scenePath: validation.scenePath, runRoot: resolved.runRoot, diagnostics: [diagnostic], blockers: [diagnostic], sceneId: sourceScene.id, sourceRunId: run.runId });
|
|
183
|
+
}
|
|
184
|
+
const targets = input.targets ?? DEFAULT_TREESEED_SCENE_PUBLICATION_TARGETS;
|
|
185
|
+
const targetDiagnostics = validateTargets(targets);
|
|
186
|
+
if (targetDiagnostics.length > 0) {
|
|
187
|
+
return failedReport({ scenePath: validation.scenePath, runRoot: resolved.runRoot, diagnostics: targetDiagnostics, blockers: targetDiagnostics, sceneId: sourceScene.id, sourceRunId: run.runId });
|
|
188
|
+
}
|
|
189
|
+
const publishResult = await loadOrGenerateLocalPublish({ projectRoot: input.projectRoot, scene: input.scene, from: input.from, runRoot: resolved.runRoot, timestamp: input.timestamp });
|
|
190
|
+
if (!publishResult.publish) {
|
|
191
|
+
return failedReport({ scenePath: validation.scenePath, runRoot: resolved.runRoot, diagnostics: publishResult.diagnostics, warnings: publishResult.warnings, blockers: publishResult.diagnostics.filter((diagnostic) => diagnostic.severity === "error"), sceneId: sourceScene.id, sourceRunId: run.runId });
|
|
192
|
+
}
|
|
193
|
+
const manifest = buildTreeseedScenePublishPlanManifest({
|
|
194
|
+
publish: publishResult.publish,
|
|
195
|
+
publishManifestPath: publishResult.publishManifestPath,
|
|
196
|
+
runRoot: resolved.runRoot,
|
|
197
|
+
targets,
|
|
198
|
+
mode: input.mode,
|
|
199
|
+
timestamp: input.timestamp
|
|
200
|
+
});
|
|
201
|
+
const manifestErrors = manifest.diagnostics.filter((diagnostic) => diagnostic.severity === "error" && diagnostic.code.startsWith("scene.publish_plan_"));
|
|
202
|
+
if (manifestErrors.length > 0) {
|
|
203
|
+
return failedReport({
|
|
204
|
+
scenePath: validation.scenePath,
|
|
205
|
+
runRoot: resolved.runRoot,
|
|
206
|
+
diagnostics: [...publishResult.diagnostics, ...manifest.diagnostics],
|
|
207
|
+
warnings: publishResult.warnings,
|
|
208
|
+
blockers: manifestErrors,
|
|
209
|
+
sceneId: sourceScene.id,
|
|
210
|
+
sourceRunId: run.runId,
|
|
211
|
+
manifest
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
const paths = writeTreeseedScenePublishPlan({ runRoot: resolved.runRoot, manifest });
|
|
216
|
+
const updateWarnings = appendTreeseedScenePublishPlanPaths({ runPath, paths });
|
|
217
|
+
return {
|
|
218
|
+
ok: true,
|
|
219
|
+
phase: 11,
|
|
220
|
+
sceneId: sourceScene.id,
|
|
221
|
+
sourceRunId: run.runId,
|
|
222
|
+
scenePath: validation.scenePath,
|
|
223
|
+
runRoot: resolved.runRoot,
|
|
224
|
+
publishRoot: join(resolved.runRoot, "publish"),
|
|
225
|
+
publishPlanRoot: paths.publishPlanRoot,
|
|
226
|
+
manifest,
|
|
227
|
+
paths,
|
|
228
|
+
diagnostics: [...publishResult.diagnostics, ...updateWarnings],
|
|
229
|
+
warnings: [...publishResult.warnings, ...updateWarnings],
|
|
230
|
+
blockers: []
|
|
231
|
+
};
|
|
232
|
+
} catch (error) {
|
|
233
|
+
const diagnostic = sceneErrorDiagnostic(input.mode === "local-export" ? "scene.publish_plan_export_failed" : "scene.publish_plan_write_failed", `Publish plan artifacts could not be written. ${error instanceof Error ? error.message : String(error ?? "")}`.trim(), "publish-plan");
|
|
234
|
+
return failedReport({ scenePath: validation.scenePath, runRoot: resolved.runRoot, diagnostics: [diagnostic], warnings: publishResult.warnings, blockers: [diagnostic], sceneId: sourceScene.id, sourceRunId: run.runId, manifest });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function planTreeseedScenePublication(input) {
|
|
238
|
+
return runPublicationPlan({ ...input, mode: input.mode ?? "plan" });
|
|
239
|
+
}
|
|
240
|
+
function exportTreeseedScenePublication(input) {
|
|
241
|
+
return runPublicationPlan({ ...input, mode: "local-export" });
|
|
242
|
+
}
|
|
243
|
+
export {
|
|
244
|
+
buildTreeseedScenePublishPlanManifest,
|
|
245
|
+
exportTreeseedScenePublication,
|
|
246
|
+
planTreeseedScenePublication,
|
|
247
|
+
writeTreeseedScenePublishPlan
|
|
248
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TreeseedSceneDiagnostic, TreeseedSceneEvidenceArtifactKind, TreeseedSceneRedactionPolicy, TreeseedSceneRedactionRule, TreeseedScenePublishTarget, TreeseedSceneRunStatus } from './types.js';
|
|
2
|
+
export declare function createDefaultTreeseedSceneRedactionPolicy(target: TreeseedScenePublishTarget): TreeseedSceneRedactionPolicy;
|
|
3
|
+
export declare function validateTreeseedSceneRedactionPolicy(input: {
|
|
4
|
+
policy: unknown;
|
|
5
|
+
path?: string;
|
|
6
|
+
}): TreeseedSceneDiagnostic[];
|
|
7
|
+
export declare function readTreeseedSceneRedactionPolicyFile(path: string): {
|
|
8
|
+
policy: TreeseedSceneRedactionPolicy | null;
|
|
9
|
+
diagnostics: TreeseedSceneDiagnostic[];
|
|
10
|
+
};
|
|
11
|
+
export declare function resolveTreeseedSceneRedactionRule(input: {
|
|
12
|
+
policy: TreeseedSceneRedactionPolicy;
|
|
13
|
+
artifactKind: TreeseedSceneEvidenceArtifactKind;
|
|
14
|
+
target: TreeseedScenePublishTarget;
|
|
15
|
+
workflowStatus: TreeseedSceneRunStatus;
|
|
16
|
+
}): TreeseedSceneRedactionRule | null;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { parse as parseYaml } from "yaml";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { extname } from "node:path";
|
|
4
|
+
import { sceneErrorDiagnostic } from "./diagnostics.js";
|
|
5
|
+
const EVIDENCE_ARTIFACT_KINDS = /* @__PURE__ */ new Set([
|
|
6
|
+
"run-report",
|
|
7
|
+
"markdown-report",
|
|
8
|
+
"timeline",
|
|
9
|
+
"setup",
|
|
10
|
+
"progress",
|
|
11
|
+
"segment",
|
|
12
|
+
"checkpoint",
|
|
13
|
+
"screenshot",
|
|
14
|
+
"render-report",
|
|
15
|
+
"render-video",
|
|
16
|
+
"training-output",
|
|
17
|
+
"log-summary"
|
|
18
|
+
]);
|
|
19
|
+
const RUN_STATUSES = /* @__PURE__ */ new Set(["passed", "failed", "blocked", "skipped"]);
|
|
20
|
+
const PUBLISH_TARGETS = /* @__PURE__ */ new Set(["local", "release"]);
|
|
21
|
+
function isRecord(value) {
|
|
22
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
function stringArray(value) {
|
|
25
|
+
if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string")) return null;
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
function ruleApplies(input) {
|
|
29
|
+
const target = input.rule.allowWhen?.target;
|
|
30
|
+
if (target && !target.includes(input.target)) return false;
|
|
31
|
+
const workflowStatus = input.rule.allowWhen?.workflowStatus;
|
|
32
|
+
if (workflowStatus && !workflowStatus.includes(input.workflowStatus)) return false;
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
function createDefaultTreeseedSceneRedactionPolicy(target) {
|
|
36
|
+
void target;
|
|
37
|
+
const include = (artifactKind, reason) => ({
|
|
38
|
+
id: `include-${artifactKind}`,
|
|
39
|
+
artifactKind,
|
|
40
|
+
include: true,
|
|
41
|
+
reason
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
schemaVersion: "treeseed.scene.redaction-policy/v1",
|
|
45
|
+
id: "treeseed.scene.redaction.default",
|
|
46
|
+
mode: "deny-by-default",
|
|
47
|
+
rules: [
|
|
48
|
+
include("run-report", "Run report metadata is safe for local evidence publication."),
|
|
49
|
+
include("markdown-report", "Markdown summary is safe for local evidence publication."),
|
|
50
|
+
include("timeline", "Timeline metadata is safe for local evidence publication."),
|
|
51
|
+
include("setup", "Setup summary is safe for local evidence publication."),
|
|
52
|
+
include("progress", "Progress events are safe for local evidence publication."),
|
|
53
|
+
include("segment", "Segment metadata is safe for local evidence publication."),
|
|
54
|
+
include("checkpoint", "Checkpoint metadata is safe for local evidence publication."),
|
|
55
|
+
include("screenshot", "Only screenshots already selected by sanitized evidence are safe for publication."),
|
|
56
|
+
include("render-report", "Render report metadata is safe for local evidence publication."),
|
|
57
|
+
include("training-output", "Deterministic training sidecars are safe for local evidence publication.")
|
|
58
|
+
]
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function validateTreeseedSceneRedactionPolicy(input) {
|
|
62
|
+
const diagnostics = [];
|
|
63
|
+
const policy = input.policy;
|
|
64
|
+
if (!isRecord(policy)) {
|
|
65
|
+
return [sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy must be an object.", input.path)];
|
|
66
|
+
}
|
|
67
|
+
if (policy.schemaVersion !== "treeseed.scene.redaction-policy/v1") {
|
|
68
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", 'Redaction policy schemaVersion must be "treeseed.scene.redaction-policy/v1".', input.path ? `${input.path}.schemaVersion` : "schemaVersion"));
|
|
69
|
+
}
|
|
70
|
+
if (typeof policy.id !== "string" || policy.id.trim().length === 0) {
|
|
71
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy id is required.", input.path ? `${input.path}.id` : "id"));
|
|
72
|
+
}
|
|
73
|
+
if (policy.mode !== "deny-by-default") {
|
|
74
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", 'Redaction policy mode must be "deny-by-default".', input.path ? `${input.path}.mode` : "mode"));
|
|
75
|
+
}
|
|
76
|
+
if (!Array.isArray(policy.rules)) {
|
|
77
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy rules must be an array.", input.path ? `${input.path}.rules` : "rules"));
|
|
78
|
+
return diagnostics;
|
|
79
|
+
}
|
|
80
|
+
const seen = /* @__PURE__ */ new Set();
|
|
81
|
+
for (const [index, rawRule] of policy.rules.entries()) {
|
|
82
|
+
const path = input.path ? `${input.path}.rules[${index}]` : `rules[${index}]`;
|
|
83
|
+
if (!isRecord(rawRule)) {
|
|
84
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy rule must be an object.", path));
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const id = rawRule.id;
|
|
88
|
+
if (typeof id !== "string" || id.trim().length === 0) {
|
|
89
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy rule id is required.", `${path}.id`));
|
|
90
|
+
} else if (seen.has(id)) {
|
|
91
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", `Duplicate redaction policy rule id "${id}".`, `${path}.id`));
|
|
92
|
+
} else {
|
|
93
|
+
seen.add(id);
|
|
94
|
+
}
|
|
95
|
+
if (typeof rawRule.artifactKind !== "string" || !EVIDENCE_ARTIFACT_KINDS.has(rawRule.artifactKind)) {
|
|
96
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", `Unsupported redaction artifact kind "${String(rawRule.artifactKind ?? "")}".`, `${path}.artifactKind`));
|
|
97
|
+
}
|
|
98
|
+
if (typeof rawRule.include !== "boolean") {
|
|
99
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy rule include must be boolean.", `${path}.include`));
|
|
100
|
+
}
|
|
101
|
+
if (typeof rawRule.reason !== "string" || rawRule.reason.trim().length === 0) {
|
|
102
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy rule reason is required.", `${path}.reason`));
|
|
103
|
+
}
|
|
104
|
+
if (rawRule.allowWhen !== void 0) {
|
|
105
|
+
if (!isRecord(rawRule.allowWhen)) {
|
|
106
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy allowWhen must be an object.", `${path}.allowWhen`));
|
|
107
|
+
} else {
|
|
108
|
+
const targets = rawRule.allowWhen.target;
|
|
109
|
+
if (targets !== void 0) {
|
|
110
|
+
const values = stringArray(targets);
|
|
111
|
+
if (!values || values.some((value) => !PUBLISH_TARGETS.has(value))) {
|
|
112
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy allowWhen.target contains unsupported publish targets.", `${path}.allowWhen.target`));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const statuses = rawRule.allowWhen.workflowStatus;
|
|
116
|
+
if (statuses !== void 0) {
|
|
117
|
+
const values = stringArray(statuses);
|
|
118
|
+
if (!values || values.some((value) => !RUN_STATUSES.has(value))) {
|
|
119
|
+
diagnostics.push(sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", "Redaction policy allowWhen.workflowStatus contains unsupported run statuses.", `${path}.allowWhen.workflowStatus`));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return diagnostics;
|
|
126
|
+
}
|
|
127
|
+
function readTreeseedSceneRedactionPolicyFile(path) {
|
|
128
|
+
try {
|
|
129
|
+
const raw = readFileSync(path, "utf8");
|
|
130
|
+
const parsed = extname(path).toLowerCase() === ".json" ? JSON.parse(raw) : parseYaml(raw);
|
|
131
|
+
const diagnostics = validateTreeseedSceneRedactionPolicy({ policy: parsed, path });
|
|
132
|
+
return { policy: diagnostics.length > 0 ? null : parsed, diagnostics };
|
|
133
|
+
} catch (error) {
|
|
134
|
+
return {
|
|
135
|
+
policy: null,
|
|
136
|
+
diagnostics: [sceneErrorDiagnostic("scene.publish_redaction_policy_invalid", `Redaction policy could not be read. ${error instanceof Error ? error.message : String(error ?? "")}`.trim(), path)]
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function resolveTreeseedSceneRedactionRule(input) {
|
|
141
|
+
return input.policy.rules.find((rule) => rule.artifactKind === input.artifactKind && ruleApplies({ rule, target: input.target, workflowStatus: input.workflowStatus })) ?? null;
|
|
142
|
+
}
|
|
143
|
+
export {
|
|
144
|
+
createDefaultTreeseedSceneRedactionPolicy,
|
|
145
|
+
readTreeseedSceneRedactionPolicyFile,
|
|
146
|
+
resolveTreeseedSceneRedactionRule,
|
|
147
|
+
validateTreeseedSceneRedactionPolicy
|
|
148
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TreeseedScenePublishManifest } from './types.js';
|
|
2
|
+
export declare function treeseedSceneReleaseEvidenceRecordPath(input: {
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
sceneId: string | null;
|
|
5
|
+
runId: string | null;
|
|
6
|
+
}): string;
|
|
7
|
+
export declare function writeTreeseedSceneReleaseEvidenceRecord(input: {
|
|
8
|
+
projectRoot: string;
|
|
9
|
+
manifest: TreeseedScenePublishManifest;
|
|
10
|
+
manifestPath: string;
|
|
11
|
+
reportPath: string;
|
|
12
|
+
bundleRoot: string;
|
|
13
|
+
}): string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
function safePathPart(value) {
|
|
4
|
+
return (value ?? "unknown").toLowerCase().replace(/[^a-z0-9._-]/gu, "-").replace(/^-+|-+$/gu, "") || "unknown";
|
|
5
|
+
}
|
|
6
|
+
function treeseedSceneReleaseEvidenceRecordPath(input) {
|
|
7
|
+
return join(input.projectRoot, ".treeseed", "workflow", "scene-evidence", safePathPart(input.sceneId), `${safePathPart(input.runId)}.json`);
|
|
8
|
+
}
|
|
9
|
+
function writeTreeseedSceneReleaseEvidenceRecord(input) {
|
|
10
|
+
const path = treeseedSceneReleaseEvidenceRecordPath({
|
|
11
|
+
projectRoot: input.projectRoot,
|
|
12
|
+
sceneId: input.manifest.sceneId,
|
|
13
|
+
runId: input.manifest.sourceRunId
|
|
14
|
+
});
|
|
15
|
+
const record = {
|
|
16
|
+
schemaVersion: "treeseed.scene.release-evidence/v1",
|
|
17
|
+
generatedAt: input.manifest.generatedAt,
|
|
18
|
+
sceneId: input.manifest.sceneId,
|
|
19
|
+
sourceRunId: input.manifest.sourceRunId,
|
|
20
|
+
workflowStatus: input.manifest.workflowStatus,
|
|
21
|
+
publishManifestPath: input.manifestPath,
|
|
22
|
+
publishReportPath: input.reportPath,
|
|
23
|
+
publishBundleRoot: input.bundleRoot,
|
|
24
|
+
sourceEvidenceManifestPath: input.manifest.sourceEvidenceManifestPath
|
|
25
|
+
};
|
|
26
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
27
|
+
writeFileSync(path, `${JSON.stringify(record, null, 2)}
|
|
28
|
+
`, "utf8");
|
|
29
|
+
return path;
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
treeseedSceneReleaseEvidenceRecordPath,
|
|
33
|
+
writeTreeseedSceneReleaseEvidenceRecord
|
|
34
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TreeseedSceneDiagnostic, TreeseedScenePublishManifest, TreeseedScenePublishPaths } from './types.js';
|
|
2
|
+
export declare function formatTreeseedScenePublishMarkdownReport(manifest: TreeseedScenePublishManifest): string;
|
|
3
|
+
export declare function writeTreeseedScenePublishReport(input: {
|
|
4
|
+
manifest: TreeseedScenePublishManifest;
|
|
5
|
+
paths: TreeseedScenePublishPaths;
|
|
6
|
+
}): void;
|
|
7
|
+
export declare function appendTreeseedScenePublishPaths(input: {
|
|
8
|
+
runPath: string;
|
|
9
|
+
paths: TreeseedScenePublishPaths;
|
|
10
|
+
}): TreeseedSceneDiagnostic[];
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { sceneWarningDiagnostic } from "./diagnostics.js";
|
|
4
|
+
function writeJson(path, value) {
|
|
5
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
6
|
+
writeFileSync(path, `${JSON.stringify(value, null, 2)}
|
|
7
|
+
`, "utf8");
|
|
8
|
+
}
|
|
9
|
+
function writeText(path, value) {
|
|
10
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
11
|
+
writeFileSync(path, value, "utf8");
|
|
12
|
+
}
|
|
13
|
+
function formatTreeseedScenePublishMarkdownReport(manifest) {
|
|
14
|
+
const included = manifest.artifacts.filter((artifact) => artifact.decision === "include");
|
|
15
|
+
const excluded = manifest.artifacts.filter((artifact) => artifact.decision !== "include");
|
|
16
|
+
const lines = [
|
|
17
|
+
`# Treeseed Scene Publish: ${manifest.sceneId ?? "(unknown scene)"}`,
|
|
18
|
+
"",
|
|
19
|
+
`Scene: ${manifest.sceneId ?? "(unknown)"}`,
|
|
20
|
+
`Source run: ${manifest.sourceRunId ?? "(unknown)"}`,
|
|
21
|
+
`Target: ${manifest.target}`,
|
|
22
|
+
`Workflow: ${manifest.workflowStatus}`,
|
|
23
|
+
`Policy: ${manifest.redactionPolicy.id}`,
|
|
24
|
+
`Included artifacts: ${included.length}`,
|
|
25
|
+
`Excluded artifacts: ${excluded.length}`,
|
|
26
|
+
`Release record: ${manifest.releaseRecordPath ?? "(none)"}`,
|
|
27
|
+
"",
|
|
28
|
+
"## Included Artifacts",
|
|
29
|
+
"",
|
|
30
|
+
"| Kind | Source | Published | SHA-256 |",
|
|
31
|
+
"| --- | --- | --- | --- |",
|
|
32
|
+
...included.length > 0 ? included.map((artifact) => `| ${artifact.kind} | ${artifact.relativePath} | ${artifact.publishedPath ?? "(none)"} | ${artifact.sha256 ?? "(none)"} |`) : ["| (none) | (none) | (none) | (none) |"],
|
|
33
|
+
"",
|
|
34
|
+
"## Redaction Decisions",
|
|
35
|
+
"",
|
|
36
|
+
"| Kind | Source | Decision | Reason |",
|
|
37
|
+
"| --- | --- | --- | --- |",
|
|
38
|
+
...excluded.length > 0 ? excluded.map((artifact) => `| ${artifact.kind} | ${artifact.relativePath} | ${artifact.decision} | ${artifact.reason} |`) : ["| (none) | (none) | (none) | (none) |"],
|
|
39
|
+
""
|
|
40
|
+
];
|
|
41
|
+
return lines.join("\n");
|
|
42
|
+
}
|
|
43
|
+
function writeTreeseedScenePublishReport(input) {
|
|
44
|
+
writeJson(input.paths.manifestPath, input.manifest);
|
|
45
|
+
writeText(input.paths.reportPath, formatTreeseedScenePublishMarkdownReport(input.manifest));
|
|
46
|
+
}
|
|
47
|
+
function appendTreeseedScenePublishPaths(input) {
|
|
48
|
+
try {
|
|
49
|
+
if ((statSync(input.runPath).mode & 146) === 0) {
|
|
50
|
+
throw new Error("run.json is not writable.");
|
|
51
|
+
}
|
|
52
|
+
const run = JSON.parse(readFileSync(input.runPath, "utf8"));
|
|
53
|
+
writeJson(input.runPath, {
|
|
54
|
+
...run,
|
|
55
|
+
publishPaths: input.paths,
|
|
56
|
+
logs: run.logs ? { ...run.logs, publish: input.paths.publishRoot } : run.logs
|
|
57
|
+
});
|
|
58
|
+
return [];
|
|
59
|
+
} catch (error) {
|
|
60
|
+
return [sceneWarningDiagnostic("scene.publish_run_update_failed", `Publish artifacts were written but run.json could not be updated. ${error instanceof Error ? error.message : String(error ?? "")}`.trim(), "run.json")];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
appendTreeseedScenePublishPaths,
|
|
65
|
+
formatTreeseedScenePublishMarkdownReport,
|
|
66
|
+
writeTreeseedScenePublishReport
|
|
67
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TreeseedSceneEvidenceManifest, TreeseedScenePublishManifest, TreeseedScenePublishOptions, TreeseedScenePublishPaths, TreeseedScenePublishReport, TreeseedScenePublishTarget, TreeseedSceneRedactionPolicy } from './types.js';
|
|
2
|
+
export declare function buildTreeseedScenePublishManifest(input: {
|
|
3
|
+
evidence: TreeseedSceneEvidenceManifest;
|
|
4
|
+
evidencePath: string;
|
|
5
|
+
runRoot: string;
|
|
6
|
+
target: TreeseedScenePublishTarget;
|
|
7
|
+
redactionPolicy?: TreeseedSceneRedactionPolicy;
|
|
8
|
+
timestamp?: string;
|
|
9
|
+
}): TreeseedScenePublishManifest;
|
|
10
|
+
export declare function writeTreeseedScenePublish(input: {
|
|
11
|
+
runRoot: string;
|
|
12
|
+
manifest: TreeseedScenePublishManifest;
|
|
13
|
+
evidence: TreeseedSceneEvidenceManifest;
|
|
14
|
+
projectRoot?: string;
|
|
15
|
+
}): TreeseedScenePublishPaths;
|
|
16
|
+
export declare function publishTreeseedSceneEvidence(input: TreeseedScenePublishOptions): Promise<TreeseedScenePublishReport>;
|