@sanity/ailf 2.0.0 → 2.0.2
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/canonical/grader-references/README.md +2 -2
- package/canonical/reference-solutions/content-lake/mutations.ts +160 -0
- package/canonical/reference-solutions/content-lake/realtime.ts +187 -0
- package/canonical/reference-solutions/image-handling/asset-pipeline.tsx +166 -0
- package/canonical/reference-solutions/portable-text/custom-blocks.ts +204 -0
- package/canonical/reference-solutions/portable-text/rendering.tsx +163 -0
- package/config/features.ts +1 -1
- package/config/models.ts +28 -23
- package/config/sources.ts +1 -1
- package/config/thresholds.ts +1 -1
- package/dist/_vendor/ailf-core/__tests__/comparison-formatters.test.d.ts +10 -0
- package/dist/_vendor/ailf-core/__tests__/comparison-formatters.test.js +185 -0
- package/dist/_vendor/ailf-core/artifact-capture/__tests__/noop-collector.test.d.ts +6 -0
- package/dist/_vendor/ailf-core/artifact-capture/__tests__/noop-collector.test.js +42 -0
- package/dist/_vendor/ailf-core/artifact-capture/noop-collector.d.ts +14 -0
- package/dist/_vendor/ailf-core/artifact-capture/noop-collector.js +25 -0
- package/dist/_vendor/ailf-core/config-helpers.d.ts +6 -0
- package/dist/_vendor/ailf-core/config-helpers.js +29 -0
- package/dist/_vendor/ailf-core/examples/index.d.ts +164 -94
- package/dist/_vendor/ailf-core/examples/index.js +208 -114
- package/dist/_vendor/ailf-core/index.d.ts +1 -0
- package/dist/_vendor/ailf-core/index.js +1 -0
- package/dist/_vendor/ailf-core/ports/artifact-collector.d.ts +94 -0
- package/dist/_vendor/ailf-core/ports/artifact-collector.js +13 -0
- package/dist/_vendor/ailf-core/ports/capture-comparator.d.ts +138 -0
- package/dist/_vendor/ailf-core/ports/capture-comparator.js +10 -0
- package/dist/_vendor/ailf-core/ports/context.d.ts +20 -1
- package/dist/_vendor/ailf-core/ports/eval-runner.d.ts +6 -0
- package/dist/_vendor/ailf-core/ports/index.d.ts +2 -0
- package/dist/_vendor/ailf-core/ports/pipeline-step.d.ts +11 -0
- package/dist/_vendor/ailf-core/ports/task-source.d.ts +3 -3
- package/dist/_vendor/ailf-core/ports/task-source.js +3 -3
- package/dist/_vendor/ailf-core/schemas/pipeline-request.d.ts +6 -1
- package/dist/_vendor/ailf-core/schemas/pipeline-request.js +14 -2
- package/dist/_vendor/ailf-core/services/config-helpers.d.ts +16 -1
- package/dist/_vendor/ailf-core/services/config-helpers.js +21 -0
- package/dist/_vendor/ailf-core/services/index.d.ts +1 -1
- package/dist/_vendor/ailf-core/services/index.js +1 -1
- package/dist/_vendor/ailf-core/services/scoring.js +9 -0
- package/dist/_vendor/ailf-core/types/generalized-task.d.ts +12 -1
- package/dist/_vendor/ailf-core/types/generalized-task.js +1 -1
- package/dist/_vendor/ailf-core/types/index.d.ts +47 -4
- package/dist/_vendor/ailf-core/types/plugin-registry.d.ts +27 -0
- package/dist/_vendor/ailf-shared/eval-modes.d.ts +15 -0
- package/dist/_vendor/ailf-shared/eval-modes.js +18 -0
- package/dist/_vendor/ailf-tasks/cli.d.ts +8 -0
- package/dist/_vendor/ailf-tasks/cli.js +61 -0
- package/dist/_vendor/ailf-tasks/index.d.ts +13 -0
- package/dist/_vendor/ailf-tasks/index.js +16 -0
- package/dist/_vendor/ailf-tasks/parser.d.ts +27 -0
- package/dist/_vendor/ailf-tasks/parser.js +73 -0
- package/dist/_vendor/ailf-tasks/schemas.d.ts +198 -0
- package/dist/_vendor/ailf-tasks/schemas.js +180 -0
- package/dist/_vendor/ailf-tasks/validation.d.ts +47 -0
- package/dist/_vendor/ailf-tasks/validation.js +162 -0
- package/dist/adapters/api-client/remediation.js +2 -2
- package/dist/adapters/config-sources/file-config-adapter.js +6 -1
- package/dist/adapters/eval-runners/promptfoo-eval-adapter.js +8 -2
- package/dist/adapters/index.d.ts +0 -1
- package/dist/adapters/index.js +0 -1
- package/dist/adapters/task-sources/composite-task-source.d.ts +1 -1
- package/dist/adapters/task-sources/composite-task-source.js +1 -1
- package/dist/adapters/task-sources/content-lake-task-source.d.ts +4 -6
- package/dist/adapters/task-sources/content-lake-task-source.js +4 -6
- package/dist/adapters/task-sources/index.d.ts +1 -2
- package/dist/adapters/task-sources/index.js +1 -2
- package/dist/adapters/task-sources/repo-schemas.d.ts +1 -1
- package/dist/adapters/task-sources/repo-schemas.js +2 -2
- package/dist/adapters/task-sources/repo-task-source.js +1 -1
- package/dist/adapters/task-sources/repo-trigger.d.ts +1 -1
- package/dist/adapters/task-sources/repo-trigger.js +1 -1
- package/dist/adapters/task-sources/task-file-loader.d.ts +9 -6
- package/dist/adapters/task-sources/task-file-loader.js +20 -6
- package/dist/agent-observer/test-imports.d.ts +7 -0
- package/dist/agent-observer/test-imports.js +185 -0
- package/dist/artifact-capture/comparator.d.ts +22 -0
- package/dist/artifact-capture/comparator.js +493 -0
- package/dist/artifact-capture/filesystem-collector.d.ts +42 -0
- package/dist/artifact-capture/filesystem-collector.js +237 -0
- package/dist/artifact-capture/redact-artifact.d.ts +20 -0
- package/dist/artifact-capture/redact-artifact.js +115 -0
- package/dist/assertions/source-isolation.d.ts +1 -1
- package/dist/assertions/source-isolation.js +1 -1
- package/dist/cli.js +4 -0
- package/dist/commands/calculate-scores.js +1 -0
- package/dist/commands/capture-compare.d.ts +15 -0
- package/dist/commands/capture-compare.js +253 -0
- package/dist/commands/capture-list.d.ts +12 -0
- package/dist/commands/capture-list.js +147 -0
- package/dist/commands/capture.d.ts +9 -0
- package/dist/commands/capture.js +16 -0
- package/dist/commands/chronic-failures.d.ts +8 -0
- package/dist/commands/chronic-failures.js +33 -0
- package/dist/commands/explain-handler.d.ts +1 -1
- package/dist/commands/explain-handler.js +37 -8
- package/dist/commands/fetch-docs.js +1 -0
- package/dist/commands/generate-configs.d.ts +3 -3
- package/dist/commands/generate-configs.js +20 -8
- package/dist/commands/init.d.ts +2 -3
- package/dist/commands/init.js +56 -170
- package/dist/commands/pipeline-action.d.ts +7 -1
- package/dist/commands/pipeline-action.js +43 -19
- package/dist/commands/pipeline.d.ts +6 -1
- package/dist/commands/pipeline.js +7 -2
- package/dist/commands/pr-comment.js +1 -0
- package/dist/commands/publish.js +1 -0
- package/dist/commands/shared/help.js +2 -2
- package/dist/commands/update-quality-scores.d.ts +5 -0
- package/dist/commands/update-quality-scores.js +20 -0
- package/dist/composition-root.d.ts +2 -3
- package/dist/composition-root.js +27 -14
- package/dist/config/features.ts +23 -0
- package/dist/config/models.ts +100 -0
- package/dist/config/prompts.ts +16 -0
- package/dist/config/rubrics.ts +225 -0
- package/dist/config/schedules.ts +47 -0
- package/dist/config/sinks.ts +37 -0
- package/dist/config/sources.ts +21 -0
- package/dist/config/thresholds.ts +61 -0
- package/dist/lib/agent-behavior-report.d.ts +8 -0
- package/dist/lib/agent-behavior-report.js +185 -0
- package/dist/lib/baseline.d.ts +19 -0
- package/dist/lib/baseline.js +153 -0
- package/dist/lib/calculate-scores.d.ts +23 -0
- package/dist/lib/calculate-scores.js +42 -0
- package/dist/lib/compare.d.ts +18 -0
- package/dist/lib/compare.js +170 -0
- package/dist/lib/coverage-audit.d.ts +4 -0
- package/dist/lib/coverage-audit.js +42 -0
- package/dist/lib/discovery-report.d.ts +13 -0
- package/dist/lib/discovery-report.js +57 -0
- package/dist/lib/fetch-docs.d.ts +30 -0
- package/dist/lib/fetch-docs.js +171 -0
- package/dist/lib/generate-configs.d.ts +25 -0
- package/dist/lib/generate-configs.js +42 -0
- package/dist/lib/grader-api.d.ts +21 -0
- package/dist/lib/grader-api.js +34 -0
- package/dist/lib/grader-compare.d.ts +19 -0
- package/dist/lib/grader-compare.js +91 -0
- package/dist/lib/grader-consistency.d.ts +27 -0
- package/dist/lib/grader-consistency.js +79 -0
- package/dist/lib/grader-sensitivity.d.ts +19 -0
- package/dist/lib/grader-sensitivity.js +75 -0
- package/dist/lib/grader-validate.d.ts +19 -0
- package/dist/lib/grader-validate.js +78 -0
- package/dist/lib/measure-retrieval.d.ts +14 -0
- package/dist/lib/measure-retrieval.js +71 -0
- package/dist/lib/pr-comment.d.ts +16 -0
- package/dist/lib/pr-comment.js +28 -0
- package/dist/lib/readiness-report.d.ts +13 -0
- package/dist/lib/readiness-report.js +108 -0
- package/dist/lib/webhook-server.d.ts +11 -0
- package/dist/lib/webhook-server.js +24 -0
- package/dist/lib/weekly-digest.d.ts +24 -0
- package/dist/lib/weekly-digest.js +148 -0
- package/dist/orchestration/build-app-context.js +13 -0
- package/dist/orchestration/cache-context.d.ts +23 -0
- package/dist/orchestration/cache-context.js +43 -0
- package/dist/orchestration/env-bridge.d.ts +21 -0
- package/dist/orchestration/env-bridge.js +66 -0
- package/dist/orchestration/load-pipeline-tasks.d.ts +34 -0
- package/dist/orchestration/load-pipeline-tasks.js +52 -0
- package/dist/orchestration/pipeline-orchestrator.js +75 -5
- package/dist/orchestration/step-runner.js +5 -1
- package/dist/orchestration/steps/calculate-scores-step.d.ts +1 -0
- package/dist/orchestration/steps/calculate-scores-step.js +13 -0
- package/dist/orchestration/steps/callback-step.js +10 -1
- package/dist/orchestration/steps/compare-step.js +6 -3
- package/dist/orchestration/steps/discovery-report-step.js +6 -2
- package/dist/orchestration/steps/fetch-docs-shell.d.ts +17 -0
- package/dist/orchestration/steps/fetch-docs-shell.js +30 -0
- package/dist/orchestration/steps/fetch-docs-step.d.ts +1 -0
- package/dist/orchestration/steps/fetch-docs-step.js +30 -16
- package/dist/orchestration/steps/gap-analysis-step.js +13 -2
- package/dist/orchestration/steps/generate-configs-step.d.ts +1 -0
- package/dist/orchestration/steps/generate-configs-step.js +50 -15
- package/dist/orchestration/steps/mirror-repo-tasks-step.d.ts +1 -1
- package/dist/orchestration/steps/mirror-repo-tasks-step.js +1 -1
- package/dist/orchestration/steps/publish-report-step.js +19 -0
- package/dist/orchestration/steps/readiness-step.js +8 -3
- package/dist/orchestration/steps/report-step.js +17 -4
- package/dist/orchestration/steps/run-eval-step.d.ts +1 -0
- package/dist/orchestration/steps/run-eval-step.js +52 -32
- package/dist/pipeline/agent-behavior-report.js +6 -0
- package/dist/pipeline/attribution.d.ts +1 -1
- package/dist/pipeline/attribution.js +1 -1
- package/dist/pipeline/cache.js +29 -15
- package/dist/pipeline/calculate-scores.d.ts +2 -0
- package/dist/pipeline/calculate-scores.js +70 -33
- package/dist/pipeline/checks.d.ts +8 -3
- package/dist/pipeline/checks.js +23 -3
- package/dist/pipeline/chronic-failures.d.ts +55 -0
- package/dist/pipeline/chronic-failures.js +110 -0
- package/dist/pipeline/compiler/__tests__/mcp-server-handler.test.js +33 -0
- package/dist/pipeline/compiler/__tests__/promptfoo-compiler.test.js +2 -3
- package/dist/pipeline/compiler/__tests__/task-bridge.test.d.ts +9 -0
- package/dist/pipeline/compiler/__tests__/task-bridge.test.js +339 -0
- package/dist/pipeline/compiler/__tests__/tool-loop-openai.test.d.ts +10 -0
- package/dist/pipeline/compiler/__tests__/tool-loop-openai.test.js +509 -0
- package/dist/pipeline/compiler/assertion-mapper.d.ts +1 -1
- package/dist/pipeline/compiler/assertion-mapper.js +1 -1
- package/dist/pipeline/compiler/compiler-to-yaml.d.ts +2 -7
- package/dist/pipeline/compiler/compiler-to-yaml.js +2 -7
- package/dist/pipeline/compiler/config-loader.d.ts +14 -0
- package/dist/pipeline/compiler/config-loader.js +42 -2
- package/dist/pipeline/compiler/fixture-resolver.d.ts +1 -1
- package/dist/pipeline/compiler/fixture-resolver.js +1 -1
- package/dist/pipeline/compiler/ignore-fields.d.ts +1 -1
- package/dist/pipeline/compiler/ignore-fields.js +1 -1
- package/dist/pipeline/compiler/index.d.ts +2 -5
- package/dist/pipeline/compiler/index.js +2 -5
- package/dist/pipeline/compiler/literacy-bridge.d.ts +1 -1
- package/dist/pipeline/compiler/literacy-bridge.js +1 -1
- package/dist/pipeline/compiler/mode-bases/agent-harness.d.ts +1 -1
- package/dist/pipeline/compiler/mode-bases/agent-harness.js +1 -1
- package/dist/pipeline/compiler/mode-bases/knowledge-probe.d.ts +1 -1
- package/dist/pipeline/compiler/mode-bases/knowledge-probe.js +1 -1
- package/dist/pipeline/compiler/mode-bases/literacy.d.ts +13 -2
- package/dist/pipeline/compiler/mode-bases/literacy.js +55 -1
- package/dist/pipeline/compiler/mode-bases/mcp-server.d.ts +1 -1
- package/dist/pipeline/compiler/mode-bases/mcp-server.js +1 -1
- package/dist/pipeline/compiler/mode-handlers/agent-harness/index.d.ts +1 -1
- package/dist/pipeline/compiler/mode-handlers/agent-harness/index.js +1 -1
- package/dist/pipeline/compiler/mode-handlers/agent-harness-handler.d.ts +70 -0
- package/dist/pipeline/compiler/mode-handlers/agent-harness-handler.js +485 -0
- package/dist/pipeline/compiler/mode-handlers/index.d.ts +2 -2
- package/dist/pipeline/compiler/mode-handlers/index.js +2 -2
- package/dist/pipeline/compiler/mode-handlers/knowledge-probe/index.d.ts +1 -1
- package/dist/pipeline/compiler/mode-handlers/knowledge-probe/index.js +1 -1
- package/dist/pipeline/compiler/mode-handlers/knowledge-probe-handler.d.ts +76 -0
- package/dist/pipeline/compiler/mode-handlers/knowledge-probe-handler.js +245 -0
- package/dist/pipeline/compiler/mode-handlers/literacy/index.d.ts +1 -1
- package/dist/pipeline/compiler/mode-handlers/literacy/index.js +1 -1
- package/dist/pipeline/compiler/mode-handlers/literacy-handler.d.ts +89 -0
- package/dist/pipeline/compiler/mode-handlers/literacy-handler.js +379 -0
- package/dist/pipeline/compiler/mode-handlers/mcp-assertions.d.ts +50 -0
- package/dist/pipeline/compiler/mode-handlers/mcp-assertions.js +334 -0
- package/dist/pipeline/compiler/mode-handlers/mcp-server/assertions.d.ts +1 -1
- package/dist/pipeline/compiler/mode-handlers/mcp-server/assertions.js +1 -1
- package/dist/pipeline/compiler/mode-handlers/mcp-server/index.d.ts +1 -1
- package/dist/pipeline/compiler/mode-handlers/mcp-server/index.js +1 -1
- package/dist/pipeline/compiler/mode-handlers/mcp-server/provider-config.js +4 -0
- package/dist/pipeline/compiler/mode-handlers/mcp-server-handler.d.ts +69 -0
- package/dist/pipeline/compiler/mode-handlers/mcp-server-handler.js +307 -0
- package/dist/pipeline/compiler/mode-handlers/mcp-tool-provider/index.js +22 -5
- package/dist/pipeline/compiler/mode-handlers/mcp-tool-provider/mcp-connection.js +6 -0
- package/dist/pipeline/compiler/mode-handlers/mcp-tool-provider/tool-loop-openai.d.ts +10 -5
- package/dist/pipeline/compiler/mode-handlers/mcp-tool-provider/tool-loop-openai.js +314 -7
- package/dist/pipeline/compiler/mode-handlers/mcp-tool-provider/types.d.ts +10 -0
- package/dist/pipeline/compiler/mode-handlers/mcp-tool-provider.d.ts +65 -0
- package/dist/pipeline/compiler/mode-handlers/mcp-tool-provider.js +368 -0
- package/dist/pipeline/compiler/presets/sanity-literacy.d.ts +1 -1
- package/dist/pipeline/compiler/presets/sanity-literacy.js +1 -1
- package/dist/pipeline/compiler/promptfoo-compiler.d.ts +1 -4
- package/dist/pipeline/compiler/promptfoo-compiler.js +3 -12
- package/dist/pipeline/compiler/provider-assembler.js +13 -7
- package/dist/pipeline/compiler/sandbox/docker-sandbox.d.ts +1 -1
- package/dist/pipeline/compiler/sandbox/docker-sandbox.js +1 -1
- package/dist/pipeline/compiler/sandbox/fixture-provisioner.d.ts +1 -1
- package/dist/pipeline/compiler/sandbox/fixture-provisioner.js +1 -1
- package/dist/pipeline/compiler/sandbox/git-worktree-sandbox.d.ts +1 -1
- package/dist/pipeline/compiler/sandbox/git-worktree-sandbox.js +1 -1
- package/dist/pipeline/compiler/sandbox/index.d.ts +1 -1
- package/dist/pipeline/compiler/sandbox/index.js +1 -1
- package/dist/pipeline/compiler/sandbox/sandbox-selector.d.ts +1 -1
- package/dist/pipeline/compiler/sandbox/sandbox-selector.js +1 -1
- package/dist/pipeline/compiler/sandbox/sandbox-strategy.d.ts +1 -1
- package/dist/pipeline/compiler/sandbox/sandbox-strategy.js +1 -1
- package/dist/pipeline/compiler/sandbox/tempdir-sandbox.d.ts +1 -1
- package/dist/pipeline/compiler/sandbox/tempdir-sandbox.js +1 -1
- package/dist/pipeline/compiler/scoring-bridge.d.ts +1 -1
- package/dist/pipeline/compiler/scoring-bridge.js +1 -1
- package/dist/pipeline/compiler/task-bridge.d.ts +41 -0
- package/dist/pipeline/compiler/task-bridge.js +92 -0
- package/dist/pipeline/compiler/task-graph-builder.d.ts +1 -4
- package/dist/pipeline/compiler/task-graph-builder.js +1 -4
- package/dist/pipeline/compiler/telemetry/index.d.ts +1 -1
- package/dist/pipeline/compiler/telemetry/index.js +1 -1
- package/dist/pipeline/compiler/variable-resolver.d.ts +1 -1
- package/dist/pipeline/compiler/variable-resolver.js +1 -1
- package/dist/pipeline/coverage-audit.d.ts +1 -1
- package/dist/pipeline/coverage-audit.js +1 -1
- package/dist/pipeline/degradations.d.ts +1 -1
- package/dist/pipeline/degradations.js +1 -1
- package/dist/pipeline/failure-modes.d.ts +1 -1
- package/dist/pipeline/failure-modes.js +13 -1
- package/dist/pipeline/gap-analysis.d.ts +1 -1
- package/dist/pipeline/gap-analysis.js +3 -1
- package/dist/pipeline/generate-configs.d.ts +2 -2
- package/dist/pipeline/generate-configs.js +15 -8
- package/dist/pipeline/grader-compare-runner.d.ts +1 -1
- package/dist/pipeline/grader-compare-runner.js +7 -1
- package/dist/pipeline/grader-comparison.d.ts +1 -1
- package/dist/pipeline/grader-comparison.js +1 -1
- package/dist/pipeline/grader-consistency-runner.d.ts +1 -1
- package/dist/pipeline/grader-consistency-runner.js +7 -1
- package/dist/pipeline/grader-consistency.d.ts +1 -1
- package/dist/pipeline/grader-consistency.js +1 -1
- package/dist/pipeline/grader-sensitivity-runner.d.ts +1 -1
- package/dist/pipeline/grader-sensitivity-runner.js +1 -1
- package/dist/pipeline/grader-sensitivity.d.ts +1 -1
- package/dist/pipeline/grader-sensitivity.js +1 -1
- package/dist/pipeline/grader-validate-runner.d.ts +1 -1
- package/dist/pipeline/grader-validate-runner.js +2 -2
- package/dist/pipeline/grader-validation.d.ts +1 -1
- package/dist/pipeline/grader-validation.js +1 -1
- package/dist/pipeline/map-request-to-config.js +15 -2
- package/dist/pipeline/mirror-repo-tasks.d.ts +1 -1
- package/dist/pipeline/mirror-repo-tasks.js +1 -1
- package/dist/pipeline/plan-format.d.ts +1 -1
- package/dist/pipeline/plan-format.js +1 -1
- package/dist/pipeline/plan.d.ts +1 -1
- package/dist/pipeline/plan.js +67 -29
- package/dist/pipeline/probe.d.ts +1 -1
- package/dist/pipeline/probe.js +1 -1
- package/dist/pipeline/readiness-report.d.ts +2 -2
- package/dist/pipeline/readiness-report.js +2 -2
- package/dist/pipeline/release-classification.d.ts +1 -1
- package/dist/pipeline/release-classification.js +1 -1
- package/dist/pipeline/release-report.d.ts +1 -1
- package/dist/pipeline/release-report.js +1 -1
- package/dist/pipeline/repo-eval-comment.d.ts +1 -1
- package/dist/pipeline/repo-eval-comment.js +1 -1
- package/dist/pipeline/repo-threshold-evaluator.d.ts +1 -1
- package/dist/pipeline/repo-threshold-evaluator.js +1 -1
- package/dist/pipeline/resolve-mappings.d.ts +6 -6
- package/dist/pipeline/resolve-mappings.js +44 -44
- package/dist/pipeline/retrieval-metrics.d.ts +3 -3
- package/dist/pipeline/retrieval-metrics.js +28 -20
- package/dist/pipeline/steps/calculate-scores-step.d.ts +11 -0
- package/dist/pipeline/steps/calculate-scores-step.js +89 -0
- package/dist/pipeline/steps/compare-step.d.ts +18 -0
- package/dist/pipeline/steps/compare-step.js +90 -0
- package/dist/pipeline/steps/eval-step.d.ts +53 -0
- package/dist/pipeline/steps/eval-step.js +347 -0
- package/dist/pipeline/steps/fetch-docs-step.d.ts +11 -0
- package/dist/pipeline/steps/fetch-docs-step.js +84 -0
- package/dist/pipeline/steps/generate-configs-step.d.ts +11 -0
- package/dist/pipeline/steps/generate-configs-step.js +98 -0
- package/dist/pipeline/steps/grader-consistency-step.d.ts +21 -0
- package/dist/pipeline/steps/grader-consistency-step.js +74 -0
- package/dist/pipeline/steps/publish-report-step.d.ts +57 -0
- package/dist/pipeline/steps/publish-report-step.js +243 -0
- package/dist/pipeline/steps/report-step.d.ts +13 -0
- package/dist/pipeline/steps/report-step.js +56 -0
- package/dist/pipeline/steps/update-scores-step.d.ts +11 -0
- package/dist/pipeline/steps/update-scores-step.js +42 -0
- package/dist/pipeline/targeted-loo.d.ts +1 -1
- package/dist/pipeline/targeted-loo.js +1 -1
- package/dist/pipeline/thresholds.d.ts +1 -1
- package/dist/pipeline/thresholds.js +1 -1
- package/dist/pipeline/validate.js +13 -0
- package/dist/report-store.d.ts +17 -0
- package/dist/report-store.js +24 -0
- package/dist/scripts/agent-behavior-report.d.ts +19 -0
- package/dist/scripts/agent-behavior-report.js +315 -0
- package/dist/scripts/baseline.d.ts +43 -0
- package/dist/scripts/baseline.js +267 -0
- package/dist/scripts/calculate-scores.d.ts +166 -0
- package/dist/scripts/calculate-scores.js +1296 -0
- package/dist/scripts/compare.d.ts +22 -0
- package/dist/scripts/compare.js +334 -0
- package/dist/scripts/coverage-audit.d.ts +44 -0
- package/dist/scripts/coverage-audit.js +209 -0
- package/dist/scripts/debug-eval.d.ts +19 -0
- package/dist/scripts/debug-eval.js +73 -0
- package/dist/scripts/discovery-report.d.ts +58 -0
- package/dist/scripts/discovery-report.js +250 -0
- package/dist/scripts/fetch-docs.d.ts +35 -0
- package/dist/scripts/fetch-docs.js +472 -0
- package/dist/scripts/generate-configs.d.ts +66 -0
- package/dist/scripts/generate-configs.js +459 -0
- package/dist/scripts/grader-api.d.ts +27 -0
- package/dist/scripts/grader-api.js +206 -0
- package/dist/scripts/grader-compare.d.ts +22 -0
- package/dist/scripts/grader-compare.js +368 -0
- package/dist/scripts/grader-consistency.d.ts +20 -0
- package/dist/scripts/grader-consistency.js +313 -0
- package/dist/scripts/grader-sensitivity.d.ts +22 -0
- package/dist/scripts/grader-sensitivity.js +354 -0
- package/dist/scripts/grader-validate.d.ts +19 -0
- package/dist/scripts/grader-validate.js +267 -0
- package/dist/scripts/measure-retrieval.d.ts +10 -0
- package/dist/scripts/measure-retrieval.js +145 -0
- package/dist/scripts/migrate-task-mode.d.ts +1 -1
- package/dist/scripts/migrate-task-mode.js +1 -1
- package/dist/scripts/migrate-tasks-to-content-lake.d.ts +1 -1
- package/dist/scripts/migrate-tasks-to-content-lake.js +1 -1
- package/dist/scripts/pipeline.d.ts +76 -0
- package/dist/scripts/pipeline.js +1031 -0
- package/dist/scripts/pr-comment.d.ts +10 -0
- package/dist/scripts/pr-comment.js +510 -0
- package/dist/scripts/readiness-report.d.ts +88 -0
- package/dist/scripts/readiness-report.js +342 -0
- package/dist/scripts/update-quality-scores.d.ts +15 -0
- package/dist/scripts/update-quality-scores.js +184 -0
- package/dist/scripts/validate-task-sources.d.ts +1 -1
- package/dist/scripts/validate-task-sources.js +1 -1
- package/dist/scripts/validate.d.ts +13 -0
- package/dist/scripts/validate.js +79 -0
- package/dist/scripts/webhook-server.d.ts +26 -0
- package/dist/scripts/webhook-server.js +147 -0
- package/dist/scripts/weekly-digest.d.ts +24 -0
- package/dist/scripts/weekly-digest.js +144 -0
- package/dist/sinks/format-slack.d.ts +64 -0
- package/dist/sinks/format-slack.js +306 -0
- package/dist/sinks/slack-sink.d.ts +27 -0
- package/dist/sinks/slack-sink.js +78 -0
- package/dist/sinks/types.d.ts +1 -1
- package/dist/sinks/types.js +1 -1
- package/dist/sinks/webhook-sink.d.ts +19 -0
- package/dist/sinks/webhook-sink.js +50 -0
- package/dist/tasks/knowledge-probe/define-type-api.task.ts +66 -0
- package/dist/tasks/knowledge-probe/groq-projections.task.ts +62 -0
- package/dist/tasks/literacy/content-lake.task.ts +181 -0
- package/dist/tasks/literacy/frameworks.task.ts +129 -0
- package/dist/tasks/literacy/functions.task.ts +70 -0
- package/dist/tasks/literacy/groq.task.ts +259 -0
- package/dist/tasks/literacy/image-handling.task.ts +95 -0
- package/dist/tasks/literacy/nextjs-live.task.ts +76 -0
- package/dist/tasks/literacy/portable-text.task.ts +169 -0
- package/dist/tasks/literacy/studio-setup.task.ts +134 -0
- package/dist/tasks/literacy/visual-editing.task.ts +147 -0
- package/package.json +25 -25
- package/tasks/.expanded.agentic.yaml +280 -0
- package/tasks/.expanded.yaml +565 -0
- package/tasks/knowledge-probe/define-type-api.task.ts +11 -0
- package/tasks/knowledge-probe/groq-projections.task.ts +3 -0
- package/tasks/literacy/content-lake.task.ts +181 -0
- package/tasks/literacy/frameworks.task.ts +1 -0
- package/tasks/literacy/functions.task.ts +1 -0
- package/tasks/literacy/groq.task.ts +1 -0
- package/tasks/literacy/image-handling.task.ts +95 -0
- package/tasks/literacy/nextjs-live.task.ts +2 -1
- package/tasks/literacy/portable-text.task.ts +169 -0
- package/tasks/literacy/studio-setup.task.ts +5 -2
- package/tasks/literacy/visual-editing.task.ts +1 -0
- package/LICENSE +0 -21
- package/tasks/frameworks.yaml +0 -98
- package/tasks/functions.yaml +0 -51
- package/tasks/groq.yaml +0 -216
- package/tasks/nextjs-live.yaml +0 -62
- package/tasks/studio-setup.yaml +0 -111
- package/tasks/visual-editing.yaml +0 -120
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* comparison-formatters.test.ts
|
|
3
|
+
*
|
|
4
|
+
* Verifies that formatComparisonMarkdown() and formatComparisonTable()
|
|
5
|
+
* dynamically derive column headers from the dimension keys present
|
|
6
|
+
* in the report data, rather than hardcoding literacy-specific names.
|
|
7
|
+
*
|
|
8
|
+
* Run: npx tsx --test src/__tests__/comparison-formatters.test.ts
|
|
9
|
+
*/
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
import { describe, it } from "node:test";
|
|
12
|
+
import { formatComparisonMarkdown, formatComparisonTable, } from "../services/comparison-formatters.js";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Helpers
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Minimal ScoreSummary stub — only fields the formatters actually read */
|
|
17
|
+
function stubSummary(avgScore) {
|
|
18
|
+
return {
|
|
19
|
+
belowCritical: [],
|
|
20
|
+
lowestArea: "area-a",
|
|
21
|
+
lowestScore: 40,
|
|
22
|
+
overall: {
|
|
23
|
+
avgCeilingScore: 80,
|
|
24
|
+
avgScore,
|
|
25
|
+
avgDocLift: 10,
|
|
26
|
+
avgDocQualityGap: 20,
|
|
27
|
+
avgFloorScore: 30,
|
|
28
|
+
negativeDocLiftCount: 0,
|
|
29
|
+
},
|
|
30
|
+
scores: [],
|
|
31
|
+
timestamp: "2026-04-05T00:00:00.000Z",
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function makeReport(overrides) {
|
|
35
|
+
return {
|
|
36
|
+
areas: [
|
|
37
|
+
{
|
|
38
|
+
area: "area-a",
|
|
39
|
+
baseline: 60,
|
|
40
|
+
experiment: 65,
|
|
41
|
+
delta: 5,
|
|
42
|
+
change: "improved",
|
|
43
|
+
dimensions: overrides.areaDimensions,
|
|
44
|
+
ceilingDelta: 0,
|
|
45
|
+
docLiftDelta: 2,
|
|
46
|
+
floorDelta: 0,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
baseline: stubSummary(60),
|
|
50
|
+
experiment: stubSummary(65),
|
|
51
|
+
deltas: {
|
|
52
|
+
overall: 5,
|
|
53
|
+
perArea: { "area-a": 5 },
|
|
54
|
+
perDimension: overrides.perDimension,
|
|
55
|
+
docLift: 2,
|
|
56
|
+
},
|
|
57
|
+
generatedAt: "2026-04-05T00:00:00.000Z",
|
|
58
|
+
improved: ["area-a"],
|
|
59
|
+
regressed: [],
|
|
60
|
+
unchanged: [],
|
|
61
|
+
notEvaluated: [],
|
|
62
|
+
mismatched: { onlyInBaseline: [], onlyInExperiment: [] },
|
|
63
|
+
noiseThreshold: 2,
|
|
64
|
+
noiseThresholdEmpirical: false,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Tests — literacy dimensions (backward compatibility)
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
describe("formatComparisonMarkdown", () => {
|
|
71
|
+
it("renders literacy dimension columns dynamically", () => {
|
|
72
|
+
const report = makeReport({
|
|
73
|
+
areaDimensions: {
|
|
74
|
+
"task-completion": { baseline: 60, experiment: 65, delta: 5 },
|
|
75
|
+
"code-correctness": { baseline: 50, experiment: 55, delta: 5 },
|
|
76
|
+
"doc-coverage": { baseline: 40, experiment: 42, delta: 2 },
|
|
77
|
+
},
|
|
78
|
+
perDimension: {
|
|
79
|
+
"task-completion": 5,
|
|
80
|
+
"code-correctness": 5,
|
|
81
|
+
"doc-coverage": 2,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
const md = formatComparisonMarkdown(report);
|
|
85
|
+
// Column headers should be title-cased from kebab-case
|
|
86
|
+
assert.ok(md.includes("Task Completion"), "should have Task Completion column header");
|
|
87
|
+
assert.ok(md.includes("Code Correctness"), "should have Code Correctness column header");
|
|
88
|
+
assert.ok(md.includes("Doc Coverage"), "should have Doc Coverage column header");
|
|
89
|
+
// Per-dimension averages section should also show dynamic labels
|
|
90
|
+
assert.ok(md.includes("| Task Completion |"), "dimension averages should include Task Completion");
|
|
91
|
+
assert.ok(md.includes("| Code Correctness |"), "dimension averages should include Code Correctness");
|
|
92
|
+
assert.ok(md.includes("| Doc Coverage |"), "dimension averages should include Doc Coverage");
|
|
93
|
+
});
|
|
94
|
+
it("renders MCP dimension columns dynamically", () => {
|
|
95
|
+
const report = makeReport({
|
|
96
|
+
areaDimensions: {
|
|
97
|
+
"input-validation": { baseline: 50, experiment: 60, delta: 10 },
|
|
98
|
+
"output-correctness": { baseline: 70, experiment: 75, delta: 5 },
|
|
99
|
+
"error-handling": { baseline: 40, experiment: 45, delta: 5 },
|
|
100
|
+
security: { baseline: 80, experiment: 82, delta: 2 },
|
|
101
|
+
},
|
|
102
|
+
perDimension: {
|
|
103
|
+
"input-validation": 10,
|
|
104
|
+
"output-correctness": 5,
|
|
105
|
+
"error-handling": 5,
|
|
106
|
+
security: 2,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
const md = formatComparisonMarkdown(report);
|
|
110
|
+
// 4 MCP columns instead of 3 literacy columns
|
|
111
|
+
assert.ok(md.includes("Input Validation"), "should have Input Validation column");
|
|
112
|
+
assert.ok(md.includes("Output Correctness"), "should have Output Correctness column");
|
|
113
|
+
assert.ok(md.includes("Error Handling"), "should have Error Handling column");
|
|
114
|
+
assert.ok(md.includes("Security"), "should have Security column");
|
|
115
|
+
// Per-dimension averages
|
|
116
|
+
assert.ok(md.includes("| Input Validation |"), "dimension averages should include Input Validation");
|
|
117
|
+
assert.ok(md.includes("| Security |"), "dimension averages should include Security");
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("formatComparisonTable", () => {
|
|
121
|
+
it("renders literacy dimension columns dynamically", () => {
|
|
122
|
+
const report = makeReport({
|
|
123
|
+
areaDimensions: {
|
|
124
|
+
"task-completion": { baseline: 60, experiment: 65, delta: 5 },
|
|
125
|
+
"code-correctness": { baseline: 50, experiment: 55, delta: 5 },
|
|
126
|
+
"doc-coverage": { baseline: 40, experiment: 42, delta: 2 },
|
|
127
|
+
},
|
|
128
|
+
perDimension: {
|
|
129
|
+
"task-completion": 5,
|
|
130
|
+
"code-correctness": 5,
|
|
131
|
+
"doc-coverage": 2,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
const table = formatComparisonTable(report);
|
|
135
|
+
// Dimension averages section
|
|
136
|
+
assert.ok(table.includes("Task Completion:"), "should show Task Completion in dimension averages");
|
|
137
|
+
assert.ok(table.includes("Code Correctness:"), "should show Code Correctness in dimension averages");
|
|
138
|
+
assert.ok(table.includes("Doc Coverage:"), "should show Doc Coverage in dimension averages");
|
|
139
|
+
// Per-area table header
|
|
140
|
+
assert.ok(table.includes("Task Completion"), "per-area table should have Task Completion header");
|
|
141
|
+
assert.ok(table.includes("Code Correctness"), "per-area table should have Code Correctness header");
|
|
142
|
+
assert.ok(table.includes("Doc Coverage"), "per-area table should have Doc Coverage header");
|
|
143
|
+
});
|
|
144
|
+
it("renders MCP dimension columns dynamically", () => {
|
|
145
|
+
const report = makeReport({
|
|
146
|
+
areaDimensions: {
|
|
147
|
+
"input-validation": { baseline: 50, experiment: 60, delta: 10 },
|
|
148
|
+
"output-correctness": { baseline: 70, experiment: 75, delta: 5 },
|
|
149
|
+
"error-handling": { baseline: 40, experiment: 45, delta: 5 },
|
|
150
|
+
security: { baseline: 80, experiment: 82, delta: 2 },
|
|
151
|
+
},
|
|
152
|
+
perDimension: {
|
|
153
|
+
"input-validation": 10,
|
|
154
|
+
"output-correctness": 5,
|
|
155
|
+
"error-handling": 5,
|
|
156
|
+
security: 2,
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
const table = formatComparisonTable(report);
|
|
160
|
+
// 4 MCP columns in the per-area table
|
|
161
|
+
assert.ok(table.includes("Input Validation"), "should have Input Validation");
|
|
162
|
+
assert.ok(table.includes("Output Correctness"), "should have Output Correctness");
|
|
163
|
+
assert.ok(table.includes("Error Handling"), "should have Error Handling");
|
|
164
|
+
assert.ok(table.includes("Security"), "should have Security");
|
|
165
|
+
// Should NOT have literacy dimension headers
|
|
166
|
+
assert.ok(!table.includes("Task Completion"), "should not contain Task Completion");
|
|
167
|
+
assert.ok(!table.includes("Doc Coverage"), "should not contain Doc Coverage");
|
|
168
|
+
});
|
|
169
|
+
it("includes delta values for each dimension in the per-area rows", () => {
|
|
170
|
+
const report = makeReport({
|
|
171
|
+
areaDimensions: {
|
|
172
|
+
"input-validation": { baseline: 50, experiment: 60, delta: 10 },
|
|
173
|
+
"output-correctness": { baseline: 70, experiment: 75, delta: 5 },
|
|
174
|
+
},
|
|
175
|
+
perDimension: {
|
|
176
|
+
"input-validation": 10,
|
|
177
|
+
"output-correctness": 5,
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
const table = formatComparisonTable(report);
|
|
181
|
+
// The per-area row should include the delta values (+10 and +5)
|
|
182
|
+
assert.ok(table.includes("+10"), "should show +10 delta for area-a");
|
|
183
|
+
assert.ok(table.includes("+5"), "should show +5 delta for area-a");
|
|
184
|
+
});
|
|
185
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* noop-collector.test.ts — verifies the NoOpArtifactCollector is truly zero-cost.
|
|
3
|
+
*
|
|
4
|
+
* Run: npx tsx --test src/artifact-capture/__tests__/noop-collector.test.ts
|
|
5
|
+
*/
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { describe, it } from "node:test";
|
|
8
|
+
import { NoOpArtifactCollector } from "../noop-collector.js";
|
|
9
|
+
describe("NoOpArtifactCollector", () => {
|
|
10
|
+
it("enabled returns false", () => {
|
|
11
|
+
const collector = new NoOpArtifactCollector();
|
|
12
|
+
assert.equal(collector.enabled, false);
|
|
13
|
+
});
|
|
14
|
+
it("extrasEnabled returns false", () => {
|
|
15
|
+
const collector = new NoOpArtifactCollector();
|
|
16
|
+
assert.equal(collector.extrasEnabled, false);
|
|
17
|
+
});
|
|
18
|
+
it("capture() is callable and returns void", () => {
|
|
19
|
+
const collector = new NoOpArtifactCollector();
|
|
20
|
+
const result = collector.capture("step", "type", { data: true });
|
|
21
|
+
assert.equal(result, undefined);
|
|
22
|
+
});
|
|
23
|
+
it("captureFile() is callable and returns void", () => {
|
|
24
|
+
const collector = new NoOpArtifactCollector();
|
|
25
|
+
const result = collector.captureFile("step", "type", "/some/path");
|
|
26
|
+
assert.equal(result, undefined);
|
|
27
|
+
});
|
|
28
|
+
it("flush() returns zero-count result", async () => {
|
|
29
|
+
const collector = new NoOpArtifactCollector();
|
|
30
|
+
const result = await collector.flush();
|
|
31
|
+
assert.equal(result.artifactCount, 0);
|
|
32
|
+
assert.equal(result.destination, "");
|
|
33
|
+
assert.equal(result.totalBytes, 0);
|
|
34
|
+
assert.equal(result.compressed, false);
|
|
35
|
+
});
|
|
36
|
+
it("flush() returns the same frozen object every time", async () => {
|
|
37
|
+
const collector = new NoOpArtifactCollector();
|
|
38
|
+
const a = await collector.flush();
|
|
39
|
+
const b = await collector.flush();
|
|
40
|
+
assert.equal(a, b);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* No-op artifact collector — used when --capture is not set.
|
|
3
|
+
*
|
|
4
|
+
* All methods are constant-time stubs. Zero overhead on the
|
|
5
|
+
* default pipeline path.
|
|
6
|
+
*/
|
|
7
|
+
import type { ArtifactCollector, CaptureFlushResult } from "../ports/artifact-collector.js";
|
|
8
|
+
export declare class NoOpArtifactCollector implements ArtifactCollector {
|
|
9
|
+
readonly enabled = false;
|
|
10
|
+
readonly extrasEnabled = false;
|
|
11
|
+
capture(): void;
|
|
12
|
+
captureFile(): void;
|
|
13
|
+
flush(): Promise<CaptureFlushResult>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* No-op artifact collector — used when --capture is not set.
|
|
3
|
+
*
|
|
4
|
+
* All methods are constant-time stubs. Zero overhead on the
|
|
5
|
+
* default pipeline path.
|
|
6
|
+
*/
|
|
7
|
+
const EMPTY_RESULT = Object.freeze({
|
|
8
|
+
artifactCount: 0,
|
|
9
|
+
compressed: false,
|
|
10
|
+
destination: "",
|
|
11
|
+
totalBytes: 0,
|
|
12
|
+
});
|
|
13
|
+
export class NoOpArtifactCollector {
|
|
14
|
+
enabled = false;
|
|
15
|
+
extrasEnabled = false;
|
|
16
|
+
capture() {
|
|
17
|
+
// no-op
|
|
18
|
+
}
|
|
19
|
+
captureFile() {
|
|
20
|
+
// no-op
|
|
21
|
+
}
|
|
22
|
+
async flush() {
|
|
23
|
+
return EMPTY_RESULT;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -51,6 +51,12 @@ export declare function defineTask(task: GeneralizedTaskDefinition): Generalized
|
|
|
51
51
|
* Define the model registry (models to evaluate and grader model).
|
|
52
52
|
*
|
|
53
53
|
* Used in `config/models.ts` for typed model configuration.
|
|
54
|
+
*
|
|
55
|
+
* Validates:
|
|
56
|
+
* - Every `modes` entry is a canonical eval mode name
|
|
57
|
+
* - Every `variants` key is a mode the model is enrolled in
|
|
58
|
+
*
|
|
59
|
+
* @throws {Error} On invalid mode names or mismatched variant keys
|
|
54
60
|
*/
|
|
55
61
|
export declare function defineModels(models: ModelsConfig): ModelsConfig;
|
|
56
62
|
/**
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
*
|
|
26
26
|
* @see docs/design-docs/architecture-overhaul/typescript-configuration.md (canonical)
|
|
27
27
|
*/
|
|
28
|
+
import { CANONICAL_EVAL_MODES } from "../ailf-shared/index.js";
|
|
28
29
|
// ---------------------------------------------------------------------------
|
|
29
30
|
// Config-level helpers
|
|
30
31
|
// ---------------------------------------------------------------------------
|
|
@@ -57,8 +58,36 @@ export function defineTask(task) {
|
|
|
57
58
|
* Define the model registry (models to evaluate and grader model).
|
|
58
59
|
*
|
|
59
60
|
* Used in `config/models.ts` for typed model configuration.
|
|
61
|
+
*
|
|
62
|
+
* Validates:
|
|
63
|
+
* - Every `modes` entry is a canonical eval mode name
|
|
64
|
+
* - Every `variants` key is a mode the model is enrolled in
|
|
65
|
+
*
|
|
66
|
+
* @throws {Error} On invalid mode names or mismatched variant keys
|
|
60
67
|
*/
|
|
61
68
|
export function defineModels(models) {
|
|
69
|
+
const validModes = new Set(CANONICAL_EVAL_MODES);
|
|
70
|
+
for (const model of models.models) {
|
|
71
|
+
if (model.modes) {
|
|
72
|
+
for (const mode of model.modes) {
|
|
73
|
+
if (!validModes.has(mode)) {
|
|
74
|
+
throw new Error(`Model "${model.label ?? model.id}": unknown mode "${mode}". ` +
|
|
75
|
+
`Valid modes: ${CANONICAL_EVAL_MODES.join(", ")}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (model.variants) {
|
|
80
|
+
const enrolledModes = new Set(model.modes ?? []);
|
|
81
|
+
for (const variantMode of Object.keys(model.variants)) {
|
|
82
|
+
if (!enrolledModes.has(variantMode)) {
|
|
83
|
+
throw new Error(`Model "${model.label ?? model.id}": variants specified for ` +
|
|
84
|
+
`mode "${variantMode}" but model does not include "${variantMode}" ` +
|
|
85
|
+
`in its modes array. Add "${variantMode}" to modes or remove ` +
|
|
86
|
+
`the variants entry.`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
62
91
|
return models;
|
|
63
92
|
}
|
|
64
93
|
// ---------------------------------------------------------------------------
|