@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,447 @@
|
|
|
1
|
+
import { resolveTreeseedSceneBaseUrl } from "./base-url.js";
|
|
2
|
+
import { prepareTreeseedSceneEnvironment } from "./environment.js";
|
|
3
|
+
import { resolveTreeseedSceneAuth } from "./auth.js";
|
|
4
|
+
import { planOrApplyTreeseedSceneSeed } from "./seed.js";
|
|
5
|
+
import { sceneErrorDiagnostic } from "./diagnostics.js";
|
|
6
|
+
import { createBuiltInTreeseedSceneDiagramProvider } from "./diagram-providers.js";
|
|
7
|
+
import { buildTreeseedSceneNarrationEntries } from "./training-transcript.js";
|
|
8
|
+
function duration(start, end) {
|
|
9
|
+
return Math.max(0, end.getTime() - start.getTime());
|
|
10
|
+
}
|
|
11
|
+
function mailpitApiUrl(mailpitUrl, pathname) {
|
|
12
|
+
const url = new URL(pathname, mailpitUrl.endsWith("/") ? mailpitUrl : `${mailpitUrl}/`);
|
|
13
|
+
return url.toString();
|
|
14
|
+
}
|
|
15
|
+
function stringValue(value) {
|
|
16
|
+
return typeof value === "string" ? value : "";
|
|
17
|
+
}
|
|
18
|
+
function mailpitMessageId(value) {
|
|
19
|
+
if (!value || typeof value !== "object") return "";
|
|
20
|
+
const record = value;
|
|
21
|
+
return stringValue(record.ID) || stringValue(record.Id) || stringValue(record.id);
|
|
22
|
+
}
|
|
23
|
+
function mailpitMessageSubject(value) {
|
|
24
|
+
if (!value || typeof value !== "object") return "";
|
|
25
|
+
const record = value;
|
|
26
|
+
return stringValue(record.Subject) || stringValue(record.subject);
|
|
27
|
+
}
|
|
28
|
+
function mailpitMessageRecipients(value) {
|
|
29
|
+
if (!value || typeof value !== "object") return [];
|
|
30
|
+
const record = value;
|
|
31
|
+
const recipients = record.To ?? record.to ?? record.Recipients ?? record.recipients;
|
|
32
|
+
if (!Array.isArray(recipients)) return [];
|
|
33
|
+
return recipients.map((recipient) => {
|
|
34
|
+
if (typeof recipient === "string") return recipient;
|
|
35
|
+
if (!recipient || typeof recipient !== "object") return "";
|
|
36
|
+
const entry = recipient;
|
|
37
|
+
return stringValue(entry.Address) || stringValue(entry.address) || stringValue(entry.Email) || stringValue(entry.email);
|
|
38
|
+
}).filter(Boolean);
|
|
39
|
+
}
|
|
40
|
+
function mailpitMessages(value) {
|
|
41
|
+
if (!value || typeof value !== "object") return [];
|
|
42
|
+
const record = value;
|
|
43
|
+
const messages = record.messages ?? record.Messages;
|
|
44
|
+
return Array.isArray(messages) ? messages : [];
|
|
45
|
+
}
|
|
46
|
+
function mailpitMessageBody(value) {
|
|
47
|
+
if (!value || typeof value !== "object") return "";
|
|
48
|
+
const record = value;
|
|
49
|
+
const html = stringValue(record.HTML) || stringValue(record.Html) || stringValue(record.html);
|
|
50
|
+
const text = stringValue(record.Text) || stringValue(record.text);
|
|
51
|
+
return `${html}
|
|
52
|
+
${text}`.replace(/&/gu, "&");
|
|
53
|
+
}
|
|
54
|
+
function extractConfirmationUrl(body) {
|
|
55
|
+
const absolute = body.match(/https?:\/\/[^"' <>\n]+(?:\/auth\/confirm-email\?[^"' <>\n]+|\/team-invites\/[^"' <>\n]+\/accept)/u)?.[0];
|
|
56
|
+
if (absolute) return absolute;
|
|
57
|
+
const relative = body.match(/(?:\/auth\/confirm-email\?[^"' <>\n]+|\/team-invites\/[^"' <>\n]+\/accept)/u)?.[0];
|
|
58
|
+
return relative ?? null;
|
|
59
|
+
}
|
|
60
|
+
async function assertionReport(kind, action, selector) {
|
|
61
|
+
const startedAt = /* @__PURE__ */ new Date();
|
|
62
|
+
try {
|
|
63
|
+
await action();
|
|
64
|
+
const finishedAt = /* @__PURE__ */ new Date();
|
|
65
|
+
return { kind, status: "passed", startedAt: startedAt.toISOString(), finishedAt: finishedAt.toISOString(), durationMs: duration(startedAt, finishedAt), ...selector ? { selector } : {} };
|
|
66
|
+
} catch (error) {
|
|
67
|
+
const finishedAt = /* @__PURE__ */ new Date();
|
|
68
|
+
const diagnostic = error && typeof error === "object" && "code" in error ? error : sceneErrorDiagnostic("scene.assertion_failed", error instanceof Error ? error.message : String(error ?? "Assertion failed."));
|
|
69
|
+
return { kind, status: "failed", startedAt: startedAt.toISOString(), finishedAt: finishedAt.toISOString(), durationMs: duration(startedAt, finishedAt), message: diagnostic.message, error: diagnostic, ...selector ? { selector } : {} };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function createBuiltInTreeseedScenePlugins() {
|
|
73
|
+
return [
|
|
74
|
+
{
|
|
75
|
+
id: "treeseed.scene.browser-actions",
|
|
76
|
+
version: "1.0.0",
|
|
77
|
+
phase: 4,
|
|
78
|
+
status: "available",
|
|
79
|
+
summary: "Browser actions for Playwright-backed scene execution.",
|
|
80
|
+
actions: {
|
|
81
|
+
goto: {
|
|
82
|
+
id: "goto",
|
|
83
|
+
phase: 2,
|
|
84
|
+
status: "available",
|
|
85
|
+
summary: "Navigate to a route or absolute URL.",
|
|
86
|
+
async run({ action, context }) {
|
|
87
|
+
if (!("goto" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected goto action.", "workflow.action.goto")] };
|
|
88
|
+
await context.session.page.goto(context.resolveUrl(action.goto));
|
|
89
|
+
return { ok: true, diagnostics: [] };
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
click: {
|
|
93
|
+
id: "click",
|
|
94
|
+
phase: 2,
|
|
95
|
+
status: "available",
|
|
96
|
+
summary: "Click a semantic selector.",
|
|
97
|
+
async run({ action, context }) {
|
|
98
|
+
if (!("click" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected click action.", "workflow.action.click")] };
|
|
99
|
+
const locator = context.resolveSelector(action.click);
|
|
100
|
+
await locator.waitFor({ state: "visible", timeout: 1e4 });
|
|
101
|
+
await locator.click();
|
|
102
|
+
return { ok: true, diagnostics: [] };
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
fill: {
|
|
106
|
+
id: "fill",
|
|
107
|
+
phase: 2,
|
|
108
|
+
status: "available",
|
|
109
|
+
summary: "Fill a semantic selector with a value.",
|
|
110
|
+
async run({ action, context }) {
|
|
111
|
+
if (!("fill" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected fill action.", "workflow.action.fill")] };
|
|
112
|
+
const locator = context.resolveSelector(action.fill);
|
|
113
|
+
await locator.waitFor({ state: "visible", timeout: 1e4 });
|
|
114
|
+
await locator.fill(action.fill.value);
|
|
115
|
+
return { ok: true, diagnostics: [] };
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
select: {
|
|
119
|
+
id: "select",
|
|
120
|
+
phase: 2,
|
|
121
|
+
status: "available",
|
|
122
|
+
summary: "Select an option in a dropdown control.",
|
|
123
|
+
async run({ action, context }) {
|
|
124
|
+
if (!("select" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected select action.", "workflow.action.select")] };
|
|
125
|
+
const locator = context.resolveSelector(action.select);
|
|
126
|
+
await locator.waitFor({ state: "visible", timeout: 1e4 });
|
|
127
|
+
if (!locator.selectOption) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.unsupported_runtime_action", "The active browser adapter does not support select actions.", "workflow.action.select")] };
|
|
128
|
+
await locator.selectOption(action.select.value ?? { label: action.select.label ?? "" });
|
|
129
|
+
return { ok: true, diagnostics: [] };
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
keyboard: {
|
|
133
|
+
id: "keyboard",
|
|
134
|
+
phase: 2,
|
|
135
|
+
status: "available",
|
|
136
|
+
summary: "Send keyboard input.",
|
|
137
|
+
async run({ action, context }) {
|
|
138
|
+
if (!("keyboard" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected keyboard action.", "workflow.action.keyboard")] };
|
|
139
|
+
await context.session.page.keyboard.press(action.keyboard);
|
|
140
|
+
return { ok: true, diagnostics: [] };
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
apiRequest: {
|
|
144
|
+
id: "apiRequest",
|
|
145
|
+
phase: 4,
|
|
146
|
+
status: "deferred",
|
|
147
|
+
summary: "API request actions are reserved for the plugin-contract extension point.",
|
|
148
|
+
async run() {
|
|
149
|
+
return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.unsupported_runtime_action", 'Action "apiRequest" is deferred until an API action plugin is available.', "workflow.action.apiRequest")] };
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
pause: {
|
|
153
|
+
id: "pause",
|
|
154
|
+
phase: 5,
|
|
155
|
+
status: "available",
|
|
156
|
+
summary: "Pause execution for live demos and long workflow orchestration.",
|
|
157
|
+
async run({ action, step, context }) {
|
|
158
|
+
if (!("pause" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected pause action.", `workflow.${step.id}.action.pause`)] };
|
|
159
|
+
context.timeline.push("pause.waiting", { mode: action.pause.mode, prompt: action.pause.prompt ?? null }, step.id);
|
|
160
|
+
context.progress?.push("pause.waiting", { mode: action.pause.mode, prompt: action.pause.prompt ?? null }, { stepId: step.id });
|
|
161
|
+
if (action.pause.mode === "timed") {
|
|
162
|
+
await context.sleep((action.pause.durationSeconds ?? 0) * 1e3);
|
|
163
|
+
context.timeline.push("pause.resumed", { mode: "timed" }, step.id);
|
|
164
|
+
context.progress?.push("pause.resumed", { mode: "timed" }, { stepId: step.id });
|
|
165
|
+
return { ok: true, diagnostics: [] };
|
|
166
|
+
}
|
|
167
|
+
if (!context.interactive || !context.pauseController) {
|
|
168
|
+
return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.manual_pause_requires_tty", "Manual pause steps require an interactive terminal.", `workflow.${step.id}.action.pause`)] };
|
|
169
|
+
}
|
|
170
|
+
const result = await context.pauseController({
|
|
171
|
+
sceneId: context.scene.id,
|
|
172
|
+
stepId: step.id,
|
|
173
|
+
title: step.title,
|
|
174
|
+
prompt: action.pause.prompt
|
|
175
|
+
});
|
|
176
|
+
if (result.ok) {
|
|
177
|
+
context.timeline.push("pause.resumed", { mode: "manual" }, step.id);
|
|
178
|
+
context.progress?.push("pause.resumed", { mode: "manual" }, { stepId: step.id });
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
mailpitConfirmLatest: {
|
|
184
|
+
id: "mailpitConfirmLatest",
|
|
185
|
+
phase: 11,
|
|
186
|
+
status: "available",
|
|
187
|
+
summary: "Confirm the latest local Mailpit email by navigating the browser to its confirmation link.",
|
|
188
|
+
async run({ action, step, context }) {
|
|
189
|
+
if (!("mailpitConfirmLatest" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected mailpitConfirmLatest action.", `workflow.${step.id}.action.mailpitConfirmLatest`)] };
|
|
190
|
+
const { mailpitUrl, email, subjectIncludes, displayInboxSeconds, displayMessageSeconds } = action.mailpitConfirmLatest;
|
|
191
|
+
try {
|
|
192
|
+
const listResponse = await fetch(mailpitApiUrl(mailpitUrl, "/api/v1/messages"));
|
|
193
|
+
if (!listResponse.ok) {
|
|
194
|
+
return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_unavailable", `Mailpit message list returned HTTP ${listResponse.status}.`, `workflow.${step.id}.action.mailpitConfirmLatest`)] };
|
|
195
|
+
}
|
|
196
|
+
const list = await listResponse.json();
|
|
197
|
+
const target = mailpitMessages(list).find((message2) => {
|
|
198
|
+
const recipients = mailpitMessageRecipients(message2);
|
|
199
|
+
const subject = mailpitMessageSubject(message2);
|
|
200
|
+
return recipients.some((recipient) => recipient.toLowerCase() === email.toLowerCase()) && (!subjectIncludes || subject.toLowerCase().includes(subjectIncludes.toLowerCase()));
|
|
201
|
+
});
|
|
202
|
+
const id = mailpitMessageId(target);
|
|
203
|
+
if (!id) {
|
|
204
|
+
return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_message_not_found", `No Mailpit message found for ${email}.`, `workflow.${step.id}.action.mailpitConfirmLatest.email`)] };
|
|
205
|
+
}
|
|
206
|
+
const messageResponse = await fetch(mailpitApiUrl(mailpitUrl, `/api/v1/message/${encodeURIComponent(id)}`));
|
|
207
|
+
if (!messageResponse.ok) {
|
|
208
|
+
return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_unavailable", `Mailpit message ${id} returned HTTP ${messageResponse.status}.`, `workflow.${step.id}.action.mailpitConfirmLatest`)] };
|
|
209
|
+
}
|
|
210
|
+
const message = await messageResponse.json();
|
|
211
|
+
const confirmationUrl = extractConfirmationUrl(mailpitMessageBody(message));
|
|
212
|
+
if (!confirmationUrl) {
|
|
213
|
+
return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_confirm_link_not_found", `No confirmation link was found in Mailpit message ${id}.`, `workflow.${step.id}.action.mailpitConfirmLatest`)] };
|
|
214
|
+
}
|
|
215
|
+
const resolvedUrl = confirmationUrl.startsWith("/") ? context.resolveUrl(confirmationUrl) : confirmationUrl;
|
|
216
|
+
const mailpitBase = mailpitUrl.endsWith("/") ? mailpitUrl : `${mailpitUrl}/`;
|
|
217
|
+
if (displayInboxSeconds && displayInboxSeconds > 0) {
|
|
218
|
+
const search = new URL("search", mailpitBase);
|
|
219
|
+
search.searchParams.set("query", `to:${email}`);
|
|
220
|
+
context.timeline.push("mailpit.inbox.open", { messageId: id, email, url: search.toString() }, step.id);
|
|
221
|
+
context.progress?.push("mailpit.inbox.open", { messageId: id, email }, { stepId: step.id });
|
|
222
|
+
await context.session.page.goto(search.toString());
|
|
223
|
+
await context.sleep(displayInboxSeconds * 1e3);
|
|
224
|
+
}
|
|
225
|
+
if (displayMessageSeconds && displayMessageSeconds > 0) {
|
|
226
|
+
const view = new URL(`view/${encodeURIComponent(id)}`, mailpitBase);
|
|
227
|
+
context.timeline.push("mailpit.message.open", { messageId: id, email, url: view.toString() }, step.id);
|
|
228
|
+
context.progress?.push("mailpit.message.open", { messageId: id, email }, { stepId: step.id });
|
|
229
|
+
await context.session.page.goto(view.toString());
|
|
230
|
+
await context.sleep(displayMessageSeconds * 1e3);
|
|
231
|
+
}
|
|
232
|
+
context.timeline.push("mailpit.confirm.open", { messageId: id, email, url: resolvedUrl }, step.id);
|
|
233
|
+
await context.session.page.goto(resolvedUrl);
|
|
234
|
+
return { ok: true, diagnostics: [] };
|
|
235
|
+
} catch (error) {
|
|
236
|
+
return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_unavailable", error instanceof Error ? error.message : String(error ?? "Mailpit confirmation failed."), `workflow.${step.id}.action.mailpitConfirmLatest`)] };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
id: "treeseed.scene.operation-actions",
|
|
244
|
+
version: "1.0.0",
|
|
245
|
+
phase: 4,
|
|
246
|
+
status: "available",
|
|
247
|
+
summary: "Operation wait actions for backend workflow proof.",
|
|
248
|
+
actions: {
|
|
249
|
+
waitForOperation: {
|
|
250
|
+
id: "waitForOperation",
|
|
251
|
+
phase: 3,
|
|
252
|
+
status: "available",
|
|
253
|
+
summary: "Wait for a linked or explicit Treeseed platform operation.",
|
|
254
|
+
async run({ action, step, context }) {
|
|
255
|
+
if (!("waitForOperation" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected waitForOperation action.", `workflow.${step.id}.action.waitForOperation`)] };
|
|
256
|
+
context.timeline.push("operation.poll.start", { spec: action.waitForOperation }, step.id);
|
|
257
|
+
const report = await context.operationWaiter({
|
|
258
|
+
projectRoot: context.projectRoot,
|
|
259
|
+
scene: context.scene,
|
|
260
|
+
environment: context.environment,
|
|
261
|
+
baseUrl: context.baseUrl,
|
|
262
|
+
spec: action.waitForOperation,
|
|
263
|
+
linkedOperationIds: context.linkedOperationIds,
|
|
264
|
+
onUpdate: async (update) => {
|
|
265
|
+
context.timeline.push("operation.poll.tick", { operationId: update.operationId, status: update.finalStatus }, step.id);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
context.timeline.push("operation.poll.end", { ok: report.ok, operationId: report.operationId, status: report.finalStatus }, step.id);
|
|
269
|
+
context.operationReports.push(report);
|
|
270
|
+
if (report.operationId && !context.linkedOperationIds.includes(report.operationId)) context.linkedOperationIds.push(report.operationId);
|
|
271
|
+
return { ok: report.ok, operationReport: report, diagnostics: report.diagnostics };
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
id: "treeseed.scene.browser-assertions",
|
|
278
|
+
version: "1.0.0",
|
|
279
|
+
phase: 4,
|
|
280
|
+
status: "available",
|
|
281
|
+
summary: "Browser assertions for Playwright-backed scene execution.",
|
|
282
|
+
assertions: {
|
|
283
|
+
visible: {
|
|
284
|
+
id: "visible",
|
|
285
|
+
phase: 2,
|
|
286
|
+
status: "available",
|
|
287
|
+
summary: "Expect selectors to be visible.",
|
|
288
|
+
async run({ value, step, context }) {
|
|
289
|
+
const selectors = Array.isArray(value) ? value : [];
|
|
290
|
+
const results = [];
|
|
291
|
+
for (const selector of selectors) {
|
|
292
|
+
results.push(await assertionReport("visible", async () => {
|
|
293
|
+
const locator = context.resolveSelector(selector);
|
|
294
|
+
await locator.waitFor({ state: "visible", timeout: 1e4 });
|
|
295
|
+
if (!await locator.isVisible()) throw sceneErrorDiagnostic("scene.selector_not_found", "Expected selector to be visible.", `workflow.${step.id}.expect.visible`);
|
|
296
|
+
}, selector));
|
|
297
|
+
}
|
|
298
|
+
return results.find((result) => result.status === "failed") ?? results[0] ?? await assertionReport("visible", async () => void 0);
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
text: {
|
|
302
|
+
id: "text",
|
|
303
|
+
phase: 2,
|
|
304
|
+
status: "available",
|
|
305
|
+
summary: "Expect text to appear.",
|
|
306
|
+
async run({ value, step, context }) {
|
|
307
|
+
const text = String(value ?? "");
|
|
308
|
+
const selector = { text };
|
|
309
|
+
return assertionReport("text", async () => {
|
|
310
|
+
const textLocator = context.session.page.getByText(text);
|
|
311
|
+
const locator = textLocator.first ? textLocator.first() : textLocator;
|
|
312
|
+
await locator.waitFor({ state: "visible", timeout: 1e4 });
|
|
313
|
+
if (!await locator.isVisible()) throw sceneErrorDiagnostic("scene.text_not_found", `Expected text to be visible: ${text}.`, `workflow.${step.id}.expect.text`);
|
|
314
|
+
}, selector);
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
urlIncludes: {
|
|
318
|
+
id: "urlIncludes",
|
|
319
|
+
phase: 2,
|
|
320
|
+
status: "available",
|
|
321
|
+
summary: "Expect the URL to include a fragment.",
|
|
322
|
+
async run({ value, step, context }) {
|
|
323
|
+
const expected = String(value ?? "");
|
|
324
|
+
return assertionReport("urlIncludes", async () => {
|
|
325
|
+
const timeoutMs = 1e4;
|
|
326
|
+
const deadline = Date.now() + timeoutMs;
|
|
327
|
+
let current = context.session.page.url();
|
|
328
|
+
while (!current.includes(expected) && Date.now() < deadline) {
|
|
329
|
+
await context.sleep(250);
|
|
330
|
+
current = context.session.page.url();
|
|
331
|
+
}
|
|
332
|
+
if (!current.includes(expected)) {
|
|
333
|
+
throw sceneErrorDiagnostic("scene.url_mismatch", `Expected URL to include "${expected}", got "${current}".`, `workflow.${step.id}.expect.urlIncludes`);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
id: "treeseed.scene.operation-assertions",
|
|
342
|
+
version: "1.0.0",
|
|
343
|
+
phase: 4,
|
|
344
|
+
status: "available",
|
|
345
|
+
summary: "Operation assertions for backend workflow proof.",
|
|
346
|
+
assertions: {
|
|
347
|
+
operation: {
|
|
348
|
+
id: "operation",
|
|
349
|
+
phase: 3,
|
|
350
|
+
status: "available",
|
|
351
|
+
summary: "Expect a Treeseed platform operation to reach an accepted status.",
|
|
352
|
+
async run({ value, step, context }) {
|
|
353
|
+
return assertionReport("operation", async () => {
|
|
354
|
+
context.timeline.push("operation.poll.start", { spec: value }, step.id);
|
|
355
|
+
const report = await context.operationWaiter({
|
|
356
|
+
projectRoot: context.projectRoot,
|
|
357
|
+
scene: context.scene,
|
|
358
|
+
environment: context.environment,
|
|
359
|
+
baseUrl: context.baseUrl,
|
|
360
|
+
spec: value,
|
|
361
|
+
linkedOperationIds: context.linkedOperationIds,
|
|
362
|
+
onUpdate: async (update) => {
|
|
363
|
+
context.timeline.push("operation.poll.tick", { operationId: update.operationId, status: update.finalStatus }, step.id);
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
context.timeline.push("operation.poll.end", { ok: report.ok, operationId: report.operationId, status: report.finalStatus }, step.id);
|
|
367
|
+
context.operationReports.push(report);
|
|
368
|
+
if (report.operationId && !context.linkedOperationIds.includes(report.operationId)) context.linkedOperationIds.push(report.operationId);
|
|
369
|
+
if (!report.ok) throw report.diagnostics[0] ?? sceneErrorDiagnostic("scene.operation_failed", "Operation assertion failed.", `workflow.${step.id}.expect.operation`);
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
id: "treeseed.scene.environment",
|
|
377
|
+
version: "1.0.0",
|
|
378
|
+
phase: 4,
|
|
379
|
+
status: "available",
|
|
380
|
+
summary: "Treeseed environment preparation, auth, seed, and base URL integration.",
|
|
381
|
+
environment: {
|
|
382
|
+
prepare: prepareTreeseedSceneEnvironment,
|
|
383
|
+
resolveAuth: resolveTreeseedSceneAuth,
|
|
384
|
+
prepareSeed: planOrApplyTreeseedSceneSeed,
|
|
385
|
+
resolveBaseUrl: resolveTreeseedSceneBaseUrl
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
id: "treeseed.scene.capture.playwright",
|
|
390
|
+
version: "1.0.0",
|
|
391
|
+
phase: 4,
|
|
392
|
+
status: "available",
|
|
393
|
+
summary: "Built-in Playwright capture providers exposed through the plugin registry.",
|
|
394
|
+
captures: Object.fromEntries(["playwright-trace", "playwright-video", "playwright-screenshots", "playwright-console", "playwright-network", "operation-id-detection"].map((id) => [id, { id, phase: 4, status: "available", summary: `Built-in capture provider: ${id}.` }]))
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
id: "treeseed.scene.artifacts.default",
|
|
398
|
+
version: "1.0.0",
|
|
399
|
+
phase: 4,
|
|
400
|
+
status: "available",
|
|
401
|
+
summary: "Default scene artifact writers exposed through the plugin registry.",
|
|
402
|
+
artifacts: Object.fromEntries(["json-run", "json-timeline", "json-plan", "json-normalized-scene", "markdown-report", "setup-json", "managed-dev-logs"].map((id) => [id, { id, phase: 4, status: "available", summary: `Built-in artifact writer: ${id}.` }]))
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
id: "treeseed.scene.renderer.remotion",
|
|
406
|
+
version: "1.0.0",
|
|
407
|
+
phase: 6,
|
|
408
|
+
status: "available",
|
|
409
|
+
summary: "Render scene timelines and browser artifacts through Remotion.",
|
|
410
|
+
renderers: {
|
|
411
|
+
remotion: { id: "remotion", phase: 6, status: "available", summary: "Render demo, training, chapter, and failure-review videos from scene run artifacts." }
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
id: "treeseed.scene.diagrams.remotion",
|
|
416
|
+
version: "1.0.0",
|
|
417
|
+
phase: 7,
|
|
418
|
+
status: "available",
|
|
419
|
+
summary: "Built-in typed Remotion diagram providers for scene videos.",
|
|
420
|
+
diagrams: {
|
|
421
|
+
"treeseed-remotion-diagrams": createBuiltInTreeseedSceneDiagramProvider()
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
id: "treeseed.scene.training.deterministic",
|
|
426
|
+
version: "1.0.0",
|
|
427
|
+
phase: 8,
|
|
428
|
+
status: "available",
|
|
429
|
+
summary: "Deterministic captions, transcripts, narration scripts, glossary, and chapter clip manifests.",
|
|
430
|
+
narration: {
|
|
431
|
+
"deterministic-narration": {
|
|
432
|
+
id: "deterministic-narration",
|
|
433
|
+
phase: 8,
|
|
434
|
+
status: "available",
|
|
435
|
+
summary: "Generate deterministic scene narration scripts from transcript entries.",
|
|
436
|
+
generate({ scene, run, transcript, style }) {
|
|
437
|
+
return buildTreeseedSceneNarrationEntries({ scene, run, transcript, style });
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
},
|
|
441
|
+
artifacts: Object.fromEntries(["training-json", "training-markdown", "training-captions", "training-chapter-clips"].map((id) => [id, { id, phase: 8, status: "available", summary: `Built-in training artifact writer: ${id}.` }]))
|
|
442
|
+
}
|
|
443
|
+
];
|
|
444
|
+
}
|
|
445
|
+
export {
|
|
446
|
+
createBuiltInTreeseedScenePlugins
|
|
447
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TreeseedSceneArtifactPathPlan, TreeseedSceneCheckpoint } from './types.js';
|
|
2
|
+
export declare function createTreeseedSceneCheckpoint(input: {
|
|
3
|
+
paths: TreeseedSceneArtifactPathPlan;
|
|
4
|
+
sceneId: string;
|
|
5
|
+
runId: string;
|
|
6
|
+
stepId: string;
|
|
7
|
+
chapterId: string;
|
|
8
|
+
segmentId: string;
|
|
9
|
+
completedStepIds: string[];
|
|
10
|
+
nextStepId: string | null;
|
|
11
|
+
checkpointId?: string;
|
|
12
|
+
resumable: boolean;
|
|
13
|
+
}): TreeseedSceneCheckpoint;
|
|
14
|
+
export declare function writeTreeseedSceneCheckpoint(checkpoint: TreeseedSceneCheckpoint): void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
function createTreeseedSceneCheckpoint(input) {
|
|
4
|
+
const id = input.checkpointId ?? input.stepId;
|
|
5
|
+
const checkpointPath = join(input.paths.checkpointsRoot, `${id}.json`);
|
|
6
|
+
return {
|
|
7
|
+
id,
|
|
8
|
+
sceneId: input.sceneId,
|
|
9
|
+
runId: input.runId,
|
|
10
|
+
stepId: input.stepId,
|
|
11
|
+
chapterId: input.chapterId,
|
|
12
|
+
segmentId: input.segmentId,
|
|
13
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
14
|
+
resumable: input.resumable,
|
|
15
|
+
completedStepIds: [...input.completedStepIds],
|
|
16
|
+
nextStepId: input.nextStepId,
|
|
17
|
+
artifactPaths: {
|
|
18
|
+
checkpointPath,
|
|
19
|
+
runRoot: input.paths.runRoot,
|
|
20
|
+
timelinePath: input.paths.timelinePath,
|
|
21
|
+
reportPath: input.paths.markdownReportPath
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function writeTreeseedSceneCheckpoint(checkpoint) {
|
|
26
|
+
mkdirSync(dirname(checkpoint.artifactPaths.checkpointPath), { recursive: true });
|
|
27
|
+
writeFileSync(checkpoint.artifactPaths.checkpointPath, `${JSON.stringify(checkpoint, null, 2)}
|
|
28
|
+
`, "utf8");
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
createTreeseedSceneCheckpoint,
|
|
32
|
+
writeTreeseedSceneCheckpoint
|
|
33
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { listTreeseedSceneDeviceProfiles, resolveTreeseedSceneDeviceProfile } from "./devices.js";
|
|
4
|
+
import { validateTreeseedScene } from "./planner.js";
|
|
5
|
+
import { runTreeseedScene } from "./runner.js";
|
|
6
|
+
function splitDiagnostics(diagnostics, severity) {
|
|
7
|
+
return diagnostics.filter((entry) => entry.severity === severity);
|
|
8
|
+
}
|
|
9
|
+
function timestampId(value) {
|
|
10
|
+
return value ?? (/* @__PURE__ */ new Date()).toISOString().replace(/[-:]/gu, "").replace(/\.\d{3}Z$/u, "Z");
|
|
11
|
+
}
|
|
12
|
+
async function runTreeseedSceneDeviceMatrix(input) {
|
|
13
|
+
const validation = validateTreeseedScene({ projectRoot: input.projectRoot, scene: input.scene });
|
|
14
|
+
if (!validation.ok || !validation.scene) {
|
|
15
|
+
return {
|
|
16
|
+
ok: false,
|
|
17
|
+
phase: 11,
|
|
18
|
+
sceneId: validation.scene?.id ?? null,
|
|
19
|
+
matrixId: null,
|
|
20
|
+
scenePath: validation.scenePath,
|
|
21
|
+
devices: input.devices ?? [],
|
|
22
|
+
runReports: [],
|
|
23
|
+
matrixRoot: null,
|
|
24
|
+
matrixPath: null,
|
|
25
|
+
diagnostics: validation.diagnostics,
|
|
26
|
+
warnings: splitDiagnostics(validation.diagnostics, "warning"),
|
|
27
|
+
blockers: splitDiagnostics(validation.diagnostics, "error")
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const scene = validation.scene;
|
|
31
|
+
const requested = input.devices?.length ? input.devices : listTreeseedSceneDeviceProfiles(scene).map((profile) => profile.id);
|
|
32
|
+
const diagnostics = [];
|
|
33
|
+
const profiles = [];
|
|
34
|
+
for (const device of requested) {
|
|
35
|
+
const resolved = resolveTreeseedSceneDeviceProfile({ scene, device });
|
|
36
|
+
diagnostics.push(...resolved.diagnostics);
|
|
37
|
+
if (resolved.profile) profiles.push(resolved.profile.id);
|
|
38
|
+
}
|
|
39
|
+
if (diagnostics.some((entry) => entry.severity === "error")) {
|
|
40
|
+
return {
|
|
41
|
+
ok: false,
|
|
42
|
+
phase: 11,
|
|
43
|
+
sceneId: scene.id,
|
|
44
|
+
matrixId: null,
|
|
45
|
+
scenePath: validation.scenePath,
|
|
46
|
+
devices: requested,
|
|
47
|
+
runReports: [],
|
|
48
|
+
matrixRoot: null,
|
|
49
|
+
matrixPath: null,
|
|
50
|
+
diagnostics,
|
|
51
|
+
warnings: splitDiagnostics(diagnostics, "warning"),
|
|
52
|
+
blockers: splitDiagnostics(diagnostics, "error")
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const matrixId = timestampId(input.timestamp).toLowerCase();
|
|
56
|
+
const matrixRoot = join(input.projectRoot, ".treeseed", "scenes", "matrix", scene.id, `${timestampId(input.timestamp)}-${matrixId}`);
|
|
57
|
+
const matrixPath = join(matrixRoot, "matrix.json");
|
|
58
|
+
mkdirSync(matrixRoot, { recursive: true });
|
|
59
|
+
const runReports = [];
|
|
60
|
+
for (const device of profiles) {
|
|
61
|
+
const runReport = await runTreeseedScene({
|
|
62
|
+
projectRoot: input.projectRoot,
|
|
63
|
+
scene: input.scene,
|
|
64
|
+
environment: input.environment,
|
|
65
|
+
device,
|
|
66
|
+
record: input.record,
|
|
67
|
+
mode: input.mode,
|
|
68
|
+
timestamp: input.timestamp,
|
|
69
|
+
runId: `${matrixId}-${device}`,
|
|
70
|
+
browserAdapter: input.browserAdapter
|
|
71
|
+
});
|
|
72
|
+
runReports.push(runReport);
|
|
73
|
+
}
|
|
74
|
+
const ok = runReports.every((report2) => report2.ok);
|
|
75
|
+
const runDiagnostics = runReports.flatMap((entry) => entry.diagnostics ?? []);
|
|
76
|
+
const allDiagnostics = [...diagnostics, ...runDiagnostics];
|
|
77
|
+
const report = {
|
|
78
|
+
ok,
|
|
79
|
+
phase: 11,
|
|
80
|
+
sceneId: scene.id,
|
|
81
|
+
matrixId,
|
|
82
|
+
scenePath: validation.scenePath,
|
|
83
|
+
devices: profiles,
|
|
84
|
+
runReports,
|
|
85
|
+
matrixRoot,
|
|
86
|
+
matrixPath,
|
|
87
|
+
diagnostics: allDiagnostics,
|
|
88
|
+
warnings: splitDiagnostics(allDiagnostics, "warning"),
|
|
89
|
+
blockers: splitDiagnostics(allDiagnostics, "error")
|
|
90
|
+
};
|
|
91
|
+
writeFileSync(matrixPath, `${JSON.stringify(report, null, 2)}
|
|
92
|
+
`, "utf8");
|
|
93
|
+
return report;
|
|
94
|
+
}
|
|
95
|
+
export {
|
|
96
|
+
runTreeseedSceneDeviceMatrix
|
|
97
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { defaultTreeseedSceneDeviceConfig } from './schema.js';
|
|
2
|
+
import type { TreeseedSceneDeviceProfile, TreeseedSceneDiagnostic, TreeseedSceneManifest } from './types.js';
|
|
3
|
+
export { defaultTreeseedSceneDeviceConfig };
|
|
4
|
+
export declare function listTreeseedSceneDeviceProfiles(scene: TreeseedSceneManifest): TreeseedSceneDeviceProfile[];
|
|
5
|
+
export declare function resolveTreeseedSceneDeviceProfile(input: {
|
|
6
|
+
scene: TreeseedSceneManifest;
|
|
7
|
+
device?: string;
|
|
8
|
+
}): {
|
|
9
|
+
profile: TreeseedSceneDeviceProfile | null;
|
|
10
|
+
diagnostics: TreeseedSceneDiagnostic[];
|
|
11
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { sceneErrorDiagnostic } from "./diagnostics.js";
|
|
2
|
+
import { defaultTreeseedSceneDeviceConfig } from "./schema.js";
|
|
3
|
+
function listTreeseedSceneDeviceProfiles(scene) {
|
|
4
|
+
return scene.devices?.profiles?.length ? scene.devices.profiles : defaultTreeseedSceneDeviceConfig().profiles;
|
|
5
|
+
}
|
|
6
|
+
function resolveTreeseedSceneDeviceProfile(input) {
|
|
7
|
+
const profiles = listTreeseedSceneDeviceProfiles(input.scene);
|
|
8
|
+
const selected = input.device ?? input.scene.devices?.defaultProfile ?? "desktop";
|
|
9
|
+
const profile = profiles.find((entry) => entry.id === selected) ?? null;
|
|
10
|
+
if (!profile) {
|
|
11
|
+
return {
|
|
12
|
+
profile: null,
|
|
13
|
+
diagnostics: [sceneErrorDiagnostic("scene.device_unknown", `Unknown scene device profile: ${selected}.`, "device")]
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return { profile, diagnostics: [] };
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
defaultTreeseedSceneDeviceConfig,
|
|
20
|
+
listTreeseedSceneDeviceProfiles,
|
|
21
|
+
resolveTreeseedSceneDeviceProfile
|
|
22
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TreeseedSceneDiagnostic } from './types.js';
|
|
2
|
+
export declare function sceneErrorDiagnostic(code: string, message: string, path?: string): TreeseedSceneDiagnostic;
|
|
3
|
+
export declare function sceneWarningDiagnostic(code: string, message: string, path?: string): TreeseedSceneDiagnostic;
|
|
4
|
+
export declare function hasTreeseedSceneErrors(diagnostics: TreeseedSceneDiagnostic[]): boolean;
|
|
5
|
+
export declare function formatTreeseedSceneDiagnostics(diagnostics: TreeseedSceneDiagnostic[]): string[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
function sceneErrorDiagnostic(code, message, path) {
|
|
2
|
+
return { severity: "error", code, message, path };
|
|
3
|
+
}
|
|
4
|
+
function sceneWarningDiagnostic(code, message, path) {
|
|
5
|
+
return { severity: "warning", code, message, path };
|
|
6
|
+
}
|
|
7
|
+
function hasTreeseedSceneErrors(diagnostics) {
|
|
8
|
+
return diagnostics.some((diagnostic) => diagnostic.severity === "error");
|
|
9
|
+
}
|
|
10
|
+
function formatTreeseedSceneDiagnostics(diagnostics) {
|
|
11
|
+
return diagnostics.map((diagnostic) => {
|
|
12
|
+
const prefix = diagnostic.severity === "error" ? "ERROR" : "WARN";
|
|
13
|
+
const location = diagnostic.path ? ` ${diagnostic.path}` : "";
|
|
14
|
+
return `${prefix} ${diagnostic.code}${location}: ${diagnostic.message}`;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
formatTreeseedSceneDiagnostics,
|
|
19
|
+
hasTreeseedSceneErrors,
|
|
20
|
+
sceneErrorDiagnostic,
|
|
21
|
+
sceneWarningDiagnostic
|
|
22
|
+
};
|