@treeseed/sdk 0.11.0 → 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 +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 +627 -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 +63 -0
- package/dist/platform/desired-state.js +1021 -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,8 @@
|
|
|
1
|
+
const TREESEED_SCENE_SCHEMA_VERSION = "treeseed.scene/v1";
|
|
2
|
+
const TREESEED_SCENE_ENVIRONMENTS = ["local", "staging", "prod"];
|
|
3
|
+
const TREESEED_SCENE_BROWSERS = ["chromium", "firefox", "webkit"];
|
|
4
|
+
export {
|
|
5
|
+
TREESEED_SCENE_BROWSERS,
|
|
6
|
+
TREESEED_SCENE_ENVIRONMENTS,
|
|
7
|
+
TREESEED_SCENE_SCHEMA_VERSION
|
|
8
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TreeseedSceneVisualAuditManifest, TreeseedSceneVisualAuditPaths, TreeseedSceneVisualAuditReview } from './types.js';
|
|
2
|
+
export declare function writeTreeseedSceneVisualAuditContactSheets(input: {
|
|
3
|
+
manifest: TreeseedSceneVisualAuditManifest;
|
|
4
|
+
review: TreeseedSceneVisualAuditReview;
|
|
5
|
+
paths: TreeseedSceneVisualAuditPaths;
|
|
6
|
+
}): void;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { relative } from "node:path";
|
|
3
|
+
function esc(value) {
|
|
4
|
+
return String(value ?? "").replace(/&/gu, "&").replace(/</gu, "<").replace(/>/gu, ">").replace(/"/gu, """);
|
|
5
|
+
}
|
|
6
|
+
function slug(value) {
|
|
7
|
+
return value === "/" ? "root" : value.replace(/^\/+|\/+$/gu, "").replace(/[^a-z0-9]+/giu, "-").toLowerCase() || "root";
|
|
8
|
+
}
|
|
9
|
+
function rel(from, path) {
|
|
10
|
+
return path ? relative(from, path) : "";
|
|
11
|
+
}
|
|
12
|
+
function styles() {
|
|
13
|
+
return `<style>
|
|
14
|
+
body{margin:0;background:#0f172a;color:#e2e8f0;font:14px/1.45 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
|
|
15
|
+
a{color:#38bdf8}
|
|
16
|
+
header{position:sticky;top:0;background:#111827f2;border-bottom:1px solid #334155;padding:16px 22px;z-index:2}
|
|
17
|
+
h1{margin:0 0 8px;font-size:22px} h2{margin:28px 22px 12px;font-size:18px}
|
|
18
|
+
.meta{color:#cbd5e1}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;padding:0 22px 24px}
|
|
19
|
+
.card{background:#1e293b;border:1px solid #334155;border-radius:8px;overflow:hidden;box-shadow:0 12px 30px #0004}
|
|
20
|
+
.shot{display:block;background:#020617;aspect-ratio:16/10;overflow:hidden}.shot img{width:100%;height:100%;object-fit:contain;display:block}
|
|
21
|
+
.body{padding:12px}.path{font-weight:700;color:#f8fafc}.sub{color:#cbd5e1;font-size:12px;margin-top:4px}.badges{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
|
|
22
|
+
.badge{font-size:11px;border-radius:999px;padding:3px 8px;background:#334155;color:#e2e8f0}.blocking,.high{background:#7f1d1d;color:#fecaca}.medium{background:#78350f;color:#fde68a}.low{background:#164e63;color:#bae6fd}.info{background:#365314;color:#d9f99d}
|
|
23
|
+
.finding{font-size:12px;margin-top:8px;color:#f8fafc}.empty{padding:22px;color:#cbd5e1}
|
|
24
|
+
.action{font-size:12px;margin-top:8px;color:#cbd5e1}.rank{background:#0f766e;color:#ccfbf1}.owner{background:#312e81;color:#ddd6fe}
|
|
25
|
+
nav{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px}
|
|
26
|
+
nav a{border:1px solid #334155;border-radius:999px;padding:4px 10px;text-decoration:none;color:#e2e8f0}
|
|
27
|
+
</style>`;
|
|
28
|
+
}
|
|
29
|
+
function renderPage(input) {
|
|
30
|
+
const reviewRoot = input.paths.reviewRoot;
|
|
31
|
+
const findingsByCapture = /* @__PURE__ */ new Map();
|
|
32
|
+
for (const finding of input.findings) {
|
|
33
|
+
const list = findingsByCapture.get(finding.captureId) ?? [];
|
|
34
|
+
list.push(finding);
|
|
35
|
+
findingsByCapture.set(finding.captureId, list);
|
|
36
|
+
}
|
|
37
|
+
const nav = [
|
|
38
|
+
`<a href="index.html">All</a>`,
|
|
39
|
+
`<a href="flagged.html">Flagged</a>`,
|
|
40
|
+
...input.allRoots.map((root) => `<a href="${slug(root)}.html">${esc(root)}</a>`)
|
|
41
|
+
].join("");
|
|
42
|
+
const cards = input.captures.map((capture) => {
|
|
43
|
+
const list = findingsByCapture.get(capture.id) ?? [];
|
|
44
|
+
const image = capture.screenshotPath ? rel(reviewRoot, capture.screenshotPath) : "";
|
|
45
|
+
const badges = list.slice(0, 5).map((finding) => `<span class="badge ${esc(finding.severity)}">${esc(finding.severity)} ${esc(finding.code.replace(/^visual\./u, ""))}</span>`).join("");
|
|
46
|
+
const findingText = list[0] ? `<div class="finding">${esc(list[0].message)}</div>` : "";
|
|
47
|
+
return `<article class="card">
|
|
48
|
+
${image ? `<a class="shot" href="${esc(image)}"><img src="${esc(image)}" alt="${esc(capture.path)} ${esc(capture.role)} ${esc(capture.device)}"></a>` : '<div class="shot empty">No screenshot</div>'}
|
|
49
|
+
<div class="body">
|
|
50
|
+
<div class="path">${esc(capture.path)}</div>
|
|
51
|
+
<div class="sub">${esc(capture.role)} / ${esc(capture.device)} / ${esc(capture.status)} / ${esc(capture.finalUrl ?? capture.url)}</div>
|
|
52
|
+
${badges ? `<div class="badges">${badges}</div>` : ""}
|
|
53
|
+
${findingText}
|
|
54
|
+
</div>
|
|
55
|
+
</article>`;
|
|
56
|
+
}).join("\n");
|
|
57
|
+
return `<!doctype html>
|
|
58
|
+
<html lang="en">
|
|
59
|
+
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${esc(input.title)}</title>${styles()}</head>
|
|
60
|
+
<body>
|
|
61
|
+
<header>
|
|
62
|
+
<h1>${esc(input.title)}</h1>
|
|
63
|
+
<div class="meta">Scene ${esc(input.manifest.sceneId)} / audit ${esc(input.manifest.auditId)} / captures ${input.captures.length} / findings ${input.findings.length}</div>
|
|
64
|
+
<nav>${nav}</nav>
|
|
65
|
+
</header>
|
|
66
|
+
${cards ? `<main class="grid">${cards}</main>` : '<main class="empty">No captures in this sheet.</main>'}
|
|
67
|
+
</body>
|
|
68
|
+
</html>
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
function renderRootCausePage(input) {
|
|
72
|
+
const reviewRoot = input.paths.reviewRoot;
|
|
73
|
+
const nav = `<a href="index.html">All</a><a href="flagged.html">Flagged</a><a href="root-causes.html">Root causes</a>`;
|
|
74
|
+
const cards = input.rootCauses.map((entry) => {
|
|
75
|
+
const image = entry.exampleScreenshotPath ? rel(reviewRoot, entry.exampleScreenshotPath) : "";
|
|
76
|
+
return `<article class="card" id="${esc(entry.id)}">
|
|
77
|
+
${image ? `<a class="shot" href="${esc(image)}"><img src="${esc(image)}" alt="${esc(entry.title)}"></a>` : '<div class="shot empty">No screenshot</div>'}
|
|
78
|
+
<div class="body">
|
|
79
|
+
<div class="path">#${esc(entry.priorityRank)} ${esc(entry.title)}</div>
|
|
80
|
+
<div class="sub">${esc(entry.suspectedOwner)} / ${esc(entry.severity)} / score ${esc(entry.priorityScore)} / count ${esc(entry.count)}</div>
|
|
81
|
+
<div class="badges"><span class="badge rank">rank ${esc(entry.priorityRank)}</span><span class="badge owner">${esc(entry.suspectedOwner)}</span><span class="badge ${esc(entry.severity)}">${esc(entry.severity)}</span></div>
|
|
82
|
+
<div class="finding">${esc(entry.paths.slice(0, 8).join(", "))}</div>
|
|
83
|
+
<div class="action">${esc(entry.recommendedAction)}</div>
|
|
84
|
+
</div>
|
|
85
|
+
</article>`;
|
|
86
|
+
}).join("\n");
|
|
87
|
+
return `<!doctype html>
|
|
88
|
+
<html lang="en">
|
|
89
|
+
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Visual Audit Root Causes</title>${styles()}</head>
|
|
90
|
+
<body>
|
|
91
|
+
<header>
|
|
92
|
+
<h1>Visual Audit Root Causes</h1>
|
|
93
|
+
<div class="meta">Scene ${esc(input.manifest.sceneId)} / audit ${esc(input.manifest.auditId)} / root causes ${input.rootCauses.length}</div>
|
|
94
|
+
<nav>${nav}</nav>
|
|
95
|
+
</header>
|
|
96
|
+
${cards ? `<main class="grid">${cards}</main>` : '<main class="empty">No root causes.</main>'}
|
|
97
|
+
</body>
|
|
98
|
+
</html>
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
function writeTreeseedSceneVisualAuditContactSheets(input) {
|
|
102
|
+
if (!input.paths.reviewRoot) return;
|
|
103
|
+
const root = `${input.paths.reviewRoot}/contact-sheets`;
|
|
104
|
+
mkdirSync(root, { recursive: true });
|
|
105
|
+
const roots = [...new Set(input.manifest.routes.map((route) => route.pathRoot))].sort();
|
|
106
|
+
const write = (name, title, captures, findings = input.review.findings) => {
|
|
107
|
+
writeFileSync(`${root}/${name}.html`, renderPage({ title, manifest: input.manifest, paths: input.paths, captures, findings, allRoots: roots }), "utf8");
|
|
108
|
+
};
|
|
109
|
+
write("index", "Visual Audit Contact Sheets", input.manifest.captures);
|
|
110
|
+
const flaggedIds = new Set(input.review.findings.map((finding) => finding.captureId));
|
|
111
|
+
write("flagged", "Flagged Visual Audit Captures", input.manifest.captures.filter((capture) => flaggedIds.has(capture.id)));
|
|
112
|
+
writeFileSync(`${root}/root-causes.html`, renderRootCausePage({ manifest: input.manifest, paths: input.paths, rootCauses: input.review.rootCauses }), "utf8");
|
|
113
|
+
for (const pathRoot of roots) {
|
|
114
|
+
write(slug(pathRoot), `Visual Audit ${pathRoot}`, input.manifest.captures.filter((capture) => capture.pathRoot === pathRoot));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
writeTreeseedSceneVisualAuditContactSheets
|
|
119
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TreeseedSceneDiagnostic, TreeseedSceneVisualAuditRole } from './types.js';
|
|
2
|
+
export declare const TREESEED_VISUAL_AUDIT_PASSWORD = "TreeSeedVisualAudit!2026";
|
|
3
|
+
export declare const TREESEED_VISUAL_AUDIT_USERS: Record<string, {
|
|
4
|
+
email: string;
|
|
5
|
+
password: string;
|
|
6
|
+
label: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function treeseedSceneVisualAuditUserForRole(role: TreeseedSceneVisualAuditRole): {
|
|
9
|
+
email: string;
|
|
10
|
+
password: string;
|
|
11
|
+
label: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function validateTreeseedSceneVisualAuditRoles(roles: TreeseedSceneVisualAuditRole[]): TreeseedSceneDiagnostic[];
|
|
14
|
+
export declare function ensureTreeseedSceneVisualAuditRoleFixtures(input: {
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
roles: TreeseedSceneVisualAuditRole[];
|
|
17
|
+
projectRoot?: string;
|
|
18
|
+
environment?: string;
|
|
19
|
+
}): Promise<TreeseedSceneDiagnostic[]>;
|
|
20
|
+
export declare function signInTreeseedSceneVisualAuditRole(input: {
|
|
21
|
+
page: any;
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
apiBaseUrl?: string | null;
|
|
24
|
+
role: TreeseedSceneVisualAuditRole;
|
|
25
|
+
}): Promise<TreeseedSceneDiagnostic[]>;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { sceneErrorDiagnostic, sceneWarningDiagnostic } from "./diagnostics.js";
|
|
2
|
+
import { MarketClient, MarketClientError } from "../market-client.js";
|
|
3
|
+
import { resolveTreeseedMachineEnvironmentValues } from "../operations/services/config-runtime.js";
|
|
4
|
+
const TREESEED_VISUAL_AUDIT_PASSWORD = "TreeSeedVisualAudit!2026";
|
|
5
|
+
const TREESEED_VISUAL_AUDIT_USERS = {
|
|
6
|
+
owner: { email: "visual.owner@treeseed.io", password: TREESEED_VISUAL_AUDIT_PASSWORD, label: "Visual Audit Owner" },
|
|
7
|
+
admin: { email: "visual.admin@treeseed.io", password: TREESEED_VISUAL_AUDIT_PASSWORD, label: "Visual Audit Admin" },
|
|
8
|
+
member: { email: "visual.member@treeseed.io", password: TREESEED_VISUAL_AUDIT_PASSWORD, label: "Visual Audit Member" }
|
|
9
|
+
};
|
|
10
|
+
function treeseedSceneVisualAuditUserForRole(role) {
|
|
11
|
+
return TREESEED_VISUAL_AUDIT_USERS[role] ?? null;
|
|
12
|
+
}
|
|
13
|
+
function validateTreeseedSceneVisualAuditRoles(roles) {
|
|
14
|
+
const diagnostics = [];
|
|
15
|
+
for (const role of roles) {
|
|
16
|
+
if (role === "anonymous") continue;
|
|
17
|
+
if (!treeseedSceneVisualAuditUserForRole(role)) {
|
|
18
|
+
diagnostics.push(sceneWarningDiagnostic("scene.visual_audit_role_unknown", `Visual audit role "${role}" has no built-in fixture login. Routes for this role will be skipped unless a future fixture provider supplies it.`, "roles"));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return diagnostics;
|
|
22
|
+
}
|
|
23
|
+
function usernameForRole(role) {
|
|
24
|
+
return `visual-${role}`;
|
|
25
|
+
}
|
|
26
|
+
function clientFor(baseUrl, accessToken) {
|
|
27
|
+
return new MarketClient({
|
|
28
|
+
profile: {
|
|
29
|
+
id: "visual-audit-local",
|
|
30
|
+
label: "Visual audit local",
|
|
31
|
+
baseUrl,
|
|
32
|
+
kind: "specialized"
|
|
33
|
+
},
|
|
34
|
+
accessToken: accessToken ?? void 0,
|
|
35
|
+
userAgent: "treeseed-scene-visual-audit"
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function isAuthFailure(error) {
|
|
39
|
+
if (error instanceof MarketClientError) return error.status === 400 || error.status === 401 || error.status === 403 || error.status === 409;
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
function configuredValue(input, name) {
|
|
43
|
+
const envValue = process.env[name];
|
|
44
|
+
if (typeof envValue === "string" && envValue.trim()) return envValue.trim();
|
|
45
|
+
if (!input?.projectRoot || !input.environment) return null;
|
|
46
|
+
try {
|
|
47
|
+
const values = resolveTreeseedMachineEnvironmentValues(input.projectRoot, input.environment);
|
|
48
|
+
const value = values?.[name];
|
|
49
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
50
|
+
} catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function serviceHeaders(input) {
|
|
55
|
+
return {
|
|
56
|
+
"content-type": "application/json",
|
|
57
|
+
"x-treeseed-service-id": configuredValue(input, "TREESEED_API_WEB_SERVICE_ID") ?? configuredValue(input, "TREESEED_WEB_SERVICE_ID") ?? "web",
|
|
58
|
+
"x-treeseed-service-secret": configuredValue(input, "TREESEED_API_WEB_SERVICE_SECRET") ?? configuredValue(input, "TREESEED_WEB_SERVICE_SECRET") ?? "treeseed-web-service-dev-secret"
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function seedActorsForRoles(roles) {
|
|
62
|
+
const actors = {};
|
|
63
|
+
for (const role of roles) {
|
|
64
|
+
const user = treeseedSceneVisualAuditUserForRole(role);
|
|
65
|
+
if (!user) continue;
|
|
66
|
+
actors[role] = {
|
|
67
|
+
email: user.email,
|
|
68
|
+
username: usernameForRole(role),
|
|
69
|
+
displayName: user.label,
|
|
70
|
+
siteRoles: role === "admin" ? ["member"] : ["member"],
|
|
71
|
+
teamRole: role === "owner" ? "team_owner" : role === "admin" ? "project_lead" : "contributor"
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return actors;
|
|
75
|
+
}
|
|
76
|
+
async function seedVisualAuditFixtures(input) {
|
|
77
|
+
const actors = seedActorsForRoles(input.roles);
|
|
78
|
+
if (Object.keys(actors).length === 0) return [];
|
|
79
|
+
try {
|
|
80
|
+
const response = await fetch(new URL("/v1/acceptance/seed", input.baseUrl).toString(), {
|
|
81
|
+
method: "POST",
|
|
82
|
+
headers: serviceHeaders(input),
|
|
83
|
+
body: JSON.stringify({
|
|
84
|
+
namespace: "visual-audit",
|
|
85
|
+
password: TREESEED_VISUAL_AUDIT_PASSWORD,
|
|
86
|
+
actors
|
|
87
|
+
})
|
|
88
|
+
});
|
|
89
|
+
const text = await response.text();
|
|
90
|
+
if (!response.ok) {
|
|
91
|
+
return [sceneWarningDiagnostic(
|
|
92
|
+
"scene.visual_audit_fixture_unavailable",
|
|
93
|
+
`Visual audit API fixture seed failed with HTTP ${response.status}: ${text.slice(0, 500)}`,
|
|
94
|
+
"roles"
|
|
95
|
+
)];
|
|
96
|
+
}
|
|
97
|
+
return [];
|
|
98
|
+
} catch (error) {
|
|
99
|
+
return [sceneWarningDiagnostic(
|
|
100
|
+
"scene.visual_audit_fixture_unavailable",
|
|
101
|
+
`Visual audit API fixture seed failed against ${input.baseUrl}: ${error instanceof Error ? error.message : String(error ?? "local fixture API is unavailable")}.`,
|
|
102
|
+
"roles"
|
|
103
|
+
)];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function ensureTreeseedSceneVisualAuditRoleFixtures(input) {
|
|
107
|
+
const diagnostics = [];
|
|
108
|
+
const roles = [...new Set(input.roles)].filter((role) => role !== "anonymous");
|
|
109
|
+
diagnostics.push(...await seedVisualAuditFixtures({
|
|
110
|
+
baseUrl: input.baseUrl,
|
|
111
|
+
roles,
|
|
112
|
+
projectRoot: input.projectRoot,
|
|
113
|
+
environment: input.environment
|
|
114
|
+
}));
|
|
115
|
+
for (const role of roles) {
|
|
116
|
+
const user = treeseedSceneVisualAuditUserForRole(role);
|
|
117
|
+
if (!user) continue;
|
|
118
|
+
const client = clientFor(input.baseUrl);
|
|
119
|
+
try {
|
|
120
|
+
await client.webSignIn({ login: user.email, password: user.password });
|
|
121
|
+
continue;
|
|
122
|
+
} catch (error) {
|
|
123
|
+
if (!isAuthFailure(error)) {
|
|
124
|
+
diagnostics.push(sceneWarningDiagnostic(
|
|
125
|
+
"scene.visual_audit_fixture_unavailable",
|
|
126
|
+
`Visual audit fixture setup for ${role} failed against ${input.baseUrl}: ${error instanceof Error ? error.message : String(error ?? "local fixture API is unavailable")}. Authenticated screenshots require the local API and database to be healthy.`,
|
|
127
|
+
"roles"
|
|
128
|
+
));
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
const [firstName = "Visual", lastName = String(role)] = user.label.split(/\s+/u);
|
|
134
|
+
const signup = await client.webSignUp({
|
|
135
|
+
email: user.email,
|
|
136
|
+
username: usernameForRole(role),
|
|
137
|
+
password: user.password,
|
|
138
|
+
firstName,
|
|
139
|
+
lastName,
|
|
140
|
+
name: user.label
|
|
141
|
+
});
|
|
142
|
+
const payload = signup.payload;
|
|
143
|
+
if (payload.confirmationToken) {
|
|
144
|
+
await client.confirmWebEmail({ token: payload.confirmationToken });
|
|
145
|
+
} else if (payload.confirmationRequired) {
|
|
146
|
+
diagnostics.push(sceneWarningDiagnostic("scene.visual_audit_fixture_unavailable", `Visual audit fixture user ${user.email} requires email confirmation, but the local API did not return a confirmation token.`, "roles"));
|
|
147
|
+
}
|
|
148
|
+
} catch (error) {
|
|
149
|
+
try {
|
|
150
|
+
await client.webSignIn({ login: user.email, password: user.password });
|
|
151
|
+
} catch {
|
|
152
|
+
diagnostics.push(sceneWarningDiagnostic(
|
|
153
|
+
"scene.visual_audit_fixture_unavailable",
|
|
154
|
+
`Visual audit fixture setup for ${role} failed against ${input.baseUrl}: ${error instanceof Error ? error.message : String(error ?? "local fixture API is unavailable")}. Authenticated screenshots require the local API and database to be healthy.`,
|
|
155
|
+
"roles"
|
|
156
|
+
));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return diagnostics;
|
|
161
|
+
}
|
|
162
|
+
async function signInTreeseedSceneVisualAuditRole(input) {
|
|
163
|
+
const user = treeseedSceneVisualAuditUserForRole(input.role);
|
|
164
|
+
if (!user) {
|
|
165
|
+
return [sceneErrorDiagnostic("scene.visual_audit_role_unknown", `Visual audit role "${input.role}" has no fixture login.`, "role")];
|
|
166
|
+
}
|
|
167
|
+
const apiBaseUrl = input.apiBaseUrl?.trim() || input.baseUrl;
|
|
168
|
+
try {
|
|
169
|
+
const session = await clientFor(apiBaseUrl).webSignIn({ login: user.email, password: user.password });
|
|
170
|
+
const accessToken = session.payload.accessToken;
|
|
171
|
+
if (accessToken) {
|
|
172
|
+
const webUrl = new URL(input.baseUrl);
|
|
173
|
+
await input.page.context().addCookies([{
|
|
174
|
+
name: "ts_market_api_access",
|
|
175
|
+
value: accessToken,
|
|
176
|
+
domain: webUrl.hostname,
|
|
177
|
+
path: "/",
|
|
178
|
+
httpOnly: true,
|
|
179
|
+
secure: webUrl.protocol === "https:",
|
|
180
|
+
sameSite: "Lax",
|
|
181
|
+
expires: Math.floor(Date.now() / 1e3) + Number(session.payload.expiresInSeconds ?? 900)
|
|
182
|
+
}]);
|
|
183
|
+
await input.page.goto(new URL("/app/", input.baseUrl).toString(), { waitUntil: "networkidle", timeout: 2e4 });
|
|
184
|
+
if (!/\/auth\/sign-in/u.test(input.page.url())) return [];
|
|
185
|
+
}
|
|
186
|
+
} catch {
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
await input.page.goto(new URL("/auth/sign-in", input.baseUrl).toString(), { waitUntil: "networkidle", timeout: 2e4 });
|
|
190
|
+
await input.page.locator('input[name="login"], input[name="email"], input[name="emailOrUsername"], input[name="username"]').first().fill(user.email, { timeout: 5e3 });
|
|
191
|
+
await input.page.locator('input[name="password"]').first().fill(user.password, { timeout: 5e3 });
|
|
192
|
+
await input.page.getByRole("button", { name: /sign in/i }).click({ timeout: 5e3 });
|
|
193
|
+
await input.page.waitForLoadState("networkidle", { timeout: 5e3 }).catch(() => void 0);
|
|
194
|
+
const url = input.page.url();
|
|
195
|
+
if (/\/auth\/sign-in/u.test(url)) {
|
|
196
|
+
return [sceneWarningDiagnostic("scene.visual_audit_role_login_failed", `Visual audit login for ${input.role} did not leave the sign-in page. Ensure deterministic fixture user ${user.email} exists.`, "roles")];
|
|
197
|
+
}
|
|
198
|
+
return [];
|
|
199
|
+
} catch (error) {
|
|
200
|
+
return [sceneWarningDiagnostic("scene.visual_audit_role_login_failed", error instanceof Error ? error.message : String(error ?? `Visual audit login for ${input.role} failed.`), "roles")];
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export {
|
|
204
|
+
TREESEED_VISUAL_AUDIT_PASSWORD,
|
|
205
|
+
TREESEED_VISUAL_AUDIT_USERS,
|
|
206
|
+
ensureTreeseedSceneVisualAuditRoleFixtures,
|
|
207
|
+
signInTreeseedSceneVisualAuditRole,
|
|
208
|
+
treeseedSceneVisualAuditUserForRole,
|
|
209
|
+
validateTreeseedSceneVisualAuditRoles
|
|
210
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TreeseedSceneVisualAuditManifest, TreeseedSceneVisualAuditPaths, TreeseedSceneVisualAuditReview } from './types.js';
|
|
2
|
+
export declare function formatTreeseedSceneVisualAuditMarkdown(input: {
|
|
3
|
+
manifest: TreeseedSceneVisualAuditManifest;
|
|
4
|
+
paths: TreeseedSceneVisualAuditPaths;
|
|
5
|
+
review?: TreeseedSceneVisualAuditReview | null;
|
|
6
|
+
}): string;
|
|
7
|
+
export declare function writeTreeseedSceneVisualAuditReport(input: {
|
|
8
|
+
manifest: TreeseedSceneVisualAuditManifest;
|
|
9
|
+
paths: TreeseedSceneVisualAuditPaths;
|
|
10
|
+
review?: TreeseedSceneVisualAuditReview | null;
|
|
11
|
+
}): void;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { relative } from "node:path";
|
|
3
|
+
function md(value) {
|
|
4
|
+
return String(value ?? "").replace(/\|/gu, "\\|").replace(/\n/gu, " ");
|
|
5
|
+
}
|
|
6
|
+
function rel(root, path) {
|
|
7
|
+
return path ? relative(root, path) : "";
|
|
8
|
+
}
|
|
9
|
+
function firstDiagnostic(capture) {
|
|
10
|
+
return capture.diagnostics[0] ?? null;
|
|
11
|
+
}
|
|
12
|
+
function formatTreeseedSceneVisualAuditMarkdown(input) {
|
|
13
|
+
const { manifest, paths } = input;
|
|
14
|
+
const failed = manifest.captures.filter((capture) => capture.status === "failed");
|
|
15
|
+
const skipped = manifest.captures.filter((capture) => capture.status === "skipped");
|
|
16
|
+
const captured = manifest.captures.filter((capture) => capture.status === "captured");
|
|
17
|
+
const roots = [...new Set(manifest.routes.map((route) => route.pathRoot))].sort();
|
|
18
|
+
const lines = [
|
|
19
|
+
"# TreeSeed Scene Visual Audit",
|
|
20
|
+
"",
|
|
21
|
+
`Scene: ${manifest.sceneId ?? "(unknown)"}`,
|
|
22
|
+
`Audit: ${manifest.auditId}`,
|
|
23
|
+
`Base URL: ${manifest.baseUrl ?? "(unresolved)"}`,
|
|
24
|
+
`Generated: ${manifest.generatedAt}`,
|
|
25
|
+
"",
|
|
26
|
+
"## Summary",
|
|
27
|
+
"",
|
|
28
|
+
`- Roles: ${manifest.roles.join(", ") || "(none)"}`,
|
|
29
|
+
`- Devices: ${manifest.devices.join(", ") || "(none)"}`,
|
|
30
|
+
`- Routes: ${manifest.routes.length}`,
|
|
31
|
+
`- Captures: ${captured.length}`,
|
|
32
|
+
`- Failed: ${failed.length}`,
|
|
33
|
+
`- Skipped: ${skipped.length}`,
|
|
34
|
+
`- Review findings: ${input.review?.summary.findingCount ?? 0}`,
|
|
35
|
+
`- Root causes: ${input.review?.summary.rootCauseCount ?? 0}`,
|
|
36
|
+
`- Incidents: ${input.review?.summary.incidentCount ?? 0}`,
|
|
37
|
+
`- Raw client errors: ${input.review?.summary.clientErrorCount ?? 0}`,
|
|
38
|
+
""
|
|
39
|
+
];
|
|
40
|
+
if (input.review && paths.reviewRoot) {
|
|
41
|
+
lines.push("## Review", "");
|
|
42
|
+
lines.push(`- Agent brief: [review/agent-brief.md](${md(rel(paths.auditRoot, paths.reviewAgentBriefPath))})`);
|
|
43
|
+
lines.push(`- Issue index: [review/issue-index.json](${md(rel(paths.auditRoot, `${paths.reviewRoot}/issue-index.json`))})`);
|
|
44
|
+
lines.push(`- Top priority: [review/query/top-priority.json](${md(rel(paths.auditRoot, `${paths.reviewRoot}/query/top-priority.json`))})`);
|
|
45
|
+
lines.push(`- Root causes: [review/root-causes.json](${md(rel(paths.auditRoot, `${paths.reviewRoot}/root-causes.json`))})`);
|
|
46
|
+
lines.push(`- Incidents: [review/incidents.json](${md(rel(paths.auditRoot, `${paths.reviewRoot}/incidents.json`))})`);
|
|
47
|
+
lines.push(`- Findings JSON: [review/findings.json](${md(rel(paths.auditRoot, paths.reviewFindingsPath))})`);
|
|
48
|
+
lines.push(`- Contact sheets: [review/contact-sheets/index.html](${md(rel(paths.auditRoot, `${paths.reviewRoot}/contact-sheets/index.html`))})`);
|
|
49
|
+
lines.push(`- Flagged contact sheet: [review/contact-sheets/flagged.html](${md(rel(paths.auditRoot, `${paths.reviewRoot}/contact-sheets/flagged.html`))})`);
|
|
50
|
+
lines.push(`- Root-cause contact sheet: [review/contact-sheets/root-causes.html](${md(rel(paths.auditRoot, `${paths.reviewRoot}/contact-sheets/root-causes.html`))})`);
|
|
51
|
+
lines.push("");
|
|
52
|
+
}
|
|
53
|
+
lines.push("## By Path Root", "");
|
|
54
|
+
for (const root of roots) {
|
|
55
|
+
lines.push(`### ${root}`, "");
|
|
56
|
+
lines.push("| Role | Device | Path | Status | Screenshot |");
|
|
57
|
+
lines.push("| --- | --- | --- | --- | --- |");
|
|
58
|
+
const captures = manifest.captures.filter((capture) => capture.pathRoot === root).sort((a, b) => `${a.role}:${a.device}:${a.path}`.localeCompare(`${b.role}:${b.device}:${b.path}`));
|
|
59
|
+
for (const capture of captures) {
|
|
60
|
+
const screenshot = capture.screenshotPath ? `[view](${md(rel(paths.auditRoot, capture.screenshotPath))})` : "";
|
|
61
|
+
lines.push(`| ${md(capture.role)} | ${md(capture.device)} | ${md(capture.path)} | ${md(capture.status)} | ${screenshot} |`);
|
|
62
|
+
}
|
|
63
|
+
lines.push("");
|
|
64
|
+
}
|
|
65
|
+
lines.push("## Failures", "");
|
|
66
|
+
lines.push("| Role | Device | Path | Code | Message |");
|
|
67
|
+
lines.push("| --- | --- | --- | --- | --- |");
|
|
68
|
+
for (const capture of [...failed, ...skipped]) {
|
|
69
|
+
const diagnostic = firstDiagnostic(capture);
|
|
70
|
+
lines.push(`| ${md(capture.role)} | ${md(capture.device)} | ${md(capture.path)} | ${md(diagnostic?.code ?? capture.status)} | ${md(diagnostic?.message ?? capture.status)} |`);
|
|
71
|
+
}
|
|
72
|
+
lines.push("");
|
|
73
|
+
return `${lines.join("\n")}
|
|
74
|
+
`;
|
|
75
|
+
}
|
|
76
|
+
function writeTreeseedSceneVisualAuditReport(input) {
|
|
77
|
+
mkdirSync(input.paths.auditRoot, { recursive: true });
|
|
78
|
+
writeFileSync(input.paths.manifestPath, `${JSON.stringify(input.manifest, null, 2)}
|
|
79
|
+
`, "utf8");
|
|
80
|
+
writeFileSync(input.paths.reportPath, formatTreeseedSceneVisualAuditMarkdown(input), "utf8");
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
formatTreeseedSceneVisualAuditMarkdown,
|
|
84
|
+
writeTreeseedSceneVisualAuditReport
|
|
85
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { TreeseedSceneVisualAuditClientError, TreeseedSceneVisualAuditManifest, TreeseedSceneVisualAuditPaths, TreeseedSceneVisualAuditReview, TreeseedSceneVisualAuditReviewDetail } from './types.js';
|
|
2
|
+
export declare function isTreeseedSceneVisualAuditIgnoredClientError(error: Pick<TreeseedSceneVisualAuditClientError, 'url' | 'message'>): boolean;
|
|
3
|
+
export declare function buildTreeseedSceneVisualAuditReview(input: {
|
|
4
|
+
manifest: TreeseedSceneVisualAuditManifest;
|
|
5
|
+
paths: TreeseedSceneVisualAuditPaths;
|
|
6
|
+
detail?: TreeseedSceneVisualAuditReviewDetail;
|
|
7
|
+
maxFindings?: number;
|
|
8
|
+
}): TreeseedSceneVisualAuditReview;
|
|
9
|
+
export declare function formatTreeseedSceneVisualAuditFindingsMarkdown(input: {
|
|
10
|
+
manifest: TreeseedSceneVisualAuditManifest;
|
|
11
|
+
review: TreeseedSceneVisualAuditReview;
|
|
12
|
+
paths: TreeseedSceneVisualAuditPaths;
|
|
13
|
+
}): string;
|
|
14
|
+
export declare function formatTreeseedSceneVisualAuditAgentBrief(input: {
|
|
15
|
+
manifest: TreeseedSceneVisualAuditManifest;
|
|
16
|
+
review: TreeseedSceneVisualAuditReview;
|
|
17
|
+
paths: TreeseedSceneVisualAuditPaths;
|
|
18
|
+
}): string;
|
|
19
|
+
export declare function writeTreeseedSceneVisualAuditReview(input: {
|
|
20
|
+
manifest: TreeseedSceneVisualAuditManifest;
|
|
21
|
+
review: TreeseedSceneVisualAuditReview;
|
|
22
|
+
paths: TreeseedSceneVisualAuditPaths;
|
|
23
|
+
}): void;
|