@sanity/ailf 0.1.0
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 +89 -0
- package/bin/ailf.js +64 -0
- package/canonical/grader-references/README.md +88 -0
- package/canonical/grader-references/groq.yaml +234 -0
- package/canonical/grader-references/studio-setup.yaml +275 -0
- package/canonical/reference-solutions/.gitkeep +1 -0
- package/canonical/reference-solutions/frameworks/nuxt.ts +119 -0
- package/canonical/reference-solutions/frameworks/remix.tsx +100 -0
- package/canonical/reference-solutions/functions/publish-webhook.ts +60 -0
- package/canonical/reference-solutions/groq/advanced-filtering.ts +379 -0
- package/canonical/reference-solutions/groq/blog-queries.ts +137 -0
- package/canonical/reference-solutions/groq/joins-references.ts +300 -0
- package/canonical/reference-solutions/nextjs/app-router-integration.tsx +128 -0
- package/canonical/reference-solutions/studio-setup/blog-schema.ts +143 -0
- package/canonical/reference-solutions/studio-setup/custom-tool.tsx +78 -0
- package/canonical/reference-solutions/visual-editing/live-preview.tsx +137 -0
- package/canonical/reference-solutions/visual-editing/presentation-nextjs.tsx +130 -0
- package/config/airbyte/ai_literacy_framework.connector.yaml +639 -0
- package/config/bigquery/README.md +74 -0
- package/config/bigquery/views/area_scores.sql +87 -0
- package/config/bigquery/views/reports.sql +49 -0
- package/config/features.yaml +116 -0
- package/config/models.yaml +115 -0
- package/config/prompts.yaml +75 -0
- package/config/rubrics.yaml +62 -0
- package/config/schedules.yaml +43 -0
- package/config/sinks.yaml +54 -0
- package/config/sources.yaml +51 -0
- package/config/thresholds.yaml +49 -0
- package/dist/_vendor/ailf-core/examples/index.d.ts +190 -0
- package/dist/_vendor/ailf-core/examples/index.js +285 -0
- package/dist/_vendor/ailf-core/index.d.ts +17 -0
- package/dist/_vendor/ailf-core/index.js +17 -0
- package/dist/_vendor/ailf-core/ports/cache-store.d.ts +72 -0
- package/dist/_vendor/ailf-core/ports/cache-store.js +17 -0
- package/dist/_vendor/ailf-core/ports/config-source.d.ts +33 -0
- package/dist/_vendor/ailf-core/ports/config-source.js +15 -0
- package/dist/_vendor/ailf-core/ports/context.d.ts +172 -0
- package/dist/_vendor/ailf-core/ports/context.js +14 -0
- package/dist/_vendor/ailf-core/ports/doc-fetcher.d.ts +131 -0
- package/dist/_vendor/ailf-core/ports/doc-fetcher.js +12 -0
- package/dist/_vendor/ailf-core/ports/eval-runner.d.ts +24 -0
- package/dist/_vendor/ailf-core/ports/eval-runner.js +8 -0
- package/dist/_vendor/ailf-core/ports/index.d.ts +15 -0
- package/dist/_vendor/ailf-core/ports/index.js +7 -0
- package/dist/_vendor/ailf-core/ports/logger.d.ts +36 -0
- package/dist/_vendor/ailf-core/ports/logger.js +11 -0
- package/dist/_vendor/ailf-core/ports/pipeline-step.d.ts +46 -0
- package/dist/_vendor/ailf-core/ports/pipeline-step.js +8 -0
- package/dist/_vendor/ailf-core/ports/task-source.d.ts +159 -0
- package/dist/_vendor/ailf-core/ports/task-source.js +72 -0
- package/dist/_vendor/ailf-core/schemas/callback-payload.d.ts +24 -0
- package/dist/_vendor/ailf-core/schemas/callback-payload.js +29 -0
- package/dist/_vendor/ailf-core/schemas/eval-config.d.ts +55 -0
- package/dist/_vendor/ailf-core/schemas/eval-config.js +78 -0
- package/dist/_vendor/ailf-core/schemas/index.d.ts +16 -0
- package/dist/_vendor/ailf-core/schemas/index.js +16 -0
- package/dist/_vendor/ailf-core/schemas/pipeline-request.d.ts +125 -0
- package/dist/_vendor/ailf-core/schemas/pipeline-request.js +67 -0
- package/dist/_vendor/ailf-core/schemas/pipeline.d.ts +531 -0
- package/dist/_vendor/ailf-core/schemas/pipeline.js +318 -0
- package/dist/_vendor/ailf-core/schemas/schedules.d.ts +68 -0
- package/dist/_vendor/ailf-core/schemas/schedules.js +74 -0
- package/dist/_vendor/ailf-core/schemas/sinks.d.ts +207 -0
- package/dist/_vendor/ailf-core/schemas/sinks.js +108 -0
- package/dist/_vendor/ailf-core/services/comparison-formatters.d.ts +18 -0
- package/dist/_vendor/ailf-core/services/comparison-formatters.js +189 -0
- package/dist/_vendor/ailf-core/services/config-helpers.d.ts +41 -0
- package/dist/_vendor/ailf-core/services/config-helpers.js +86 -0
- package/dist/_vendor/ailf-core/services/index.d.ts +12 -0
- package/dist/_vendor/ailf-core/services/index.js +12 -0
- package/dist/_vendor/ailf-core/services/scoring.d.ts +49 -0
- package/dist/_vendor/ailf-core/services/scoring.js +222 -0
- package/dist/_vendor/ailf-core/types/index.d.ts +1082 -0
- package/dist/_vendor/ailf-core/types/index.js +21 -0
- package/dist/_vendor/ailf-core/types/scoring-input.d.ts +54 -0
- package/dist/_vendor/ailf-core/types/scoring-input.js +9 -0
- package/dist/_vendor/ailf-shared/dimension-names.d.ts +21 -0
- package/dist/_vendor/ailf-shared/dimension-names.js +27 -0
- package/dist/_vendor/ailf-shared/document-ref.d.ts +29 -0
- package/dist/_vendor/ailf-shared/document-ref.js +1 -0
- package/dist/_vendor/ailf-shared/eval-modes.d.ts +12 -0
- package/dist/_vendor/ailf-shared/eval-modes.js +8 -0
- package/dist/_vendor/ailf-shared/index.d.ts +16 -0
- package/dist/_vendor/ailf-shared/index.js +16 -0
- package/dist/_vendor/ailf-shared/noise-threshold.d.ts +9 -0
- package/dist/_vendor/ailf-shared/noise-threshold.js +9 -0
- package/dist/_vendor/ailf-shared/score-grades.d.ts +17 -0
- package/dist/_vendor/ailf-shared/score-grades.js +23 -0
- package/dist/adapters/cache/content-lake-cache.d.ts +24 -0
- package/dist/adapters/cache/content-lake-cache.js +59 -0
- package/dist/adapters/cache/filesystem-cache.d.ts +18 -0
- package/dist/adapters/cache/filesystem-cache.js +54 -0
- package/dist/adapters/cache/index.d.ts +2 -0
- package/dist/adapters/cache/index.js +2 -0
- package/dist/adapters/config-sources/cli-config-adapter.d.ts +17 -0
- package/dist/adapters/config-sources/cli-config-adapter.js +23 -0
- package/dist/adapters/config-sources/file-config-adapter.d.ts +26 -0
- package/dist/adapters/config-sources/file-config-adapter.js +96 -0
- package/dist/adapters/config-sources/index.d.ts +2 -0
- package/dist/adapters/config-sources/index.js +2 -0
- package/dist/adapters/doc-fetchers/index.d.ts +1 -0
- package/dist/adapters/doc-fetchers/index.js +1 -0
- package/dist/adapters/doc-fetchers/sanity-doc-fetcher.d.ts +76 -0
- package/dist/adapters/doc-fetchers/sanity-doc-fetcher.js +620 -0
- package/dist/adapters/eval-runners/index.d.ts +1 -0
- package/dist/adapters/eval-runners/index.js +1 -0
- package/dist/adapters/eval-runners/promptfoo-eval-adapter.d.ts +14 -0
- package/dist/adapters/eval-runners/promptfoo-eval-adapter.js +63 -0
- package/dist/adapters/index.d.ts +12 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/loggers/console-logger.d.ts +22 -0
- package/dist/adapters/loggers/console-logger.js +54 -0
- package/dist/adapters/loggers/index.d.ts +9 -0
- package/dist/adapters/loggers/index.js +9 -0
- package/dist/adapters/loggers/json-logger.d.ts +18 -0
- package/dist/adapters/loggers/json-logger.js +33 -0
- package/dist/adapters/loggers/quiet-logger.d.ts +16 -0
- package/dist/adapters/loggers/quiet-logger.js +30 -0
- package/dist/adapters/task-sources/composite-task-source.d.ts +20 -0
- package/dist/adapters/task-sources/composite-task-source.js +59 -0
- package/dist/adapters/task-sources/content-lake-task-source.d.ts +20 -0
- package/dist/adapters/task-sources/content-lake-task-source.js +219 -0
- package/dist/adapters/task-sources/index.d.ts +7 -0
- package/dist/adapters/task-sources/index.js +7 -0
- package/dist/adapters/task-sources/repo-schemas.d.ts +245 -0
- package/dist/adapters/task-sources/repo-schemas.js +234 -0
- package/dist/adapters/task-sources/repo-task-source.d.ts +22 -0
- package/dist/adapters/task-sources/repo-task-source.js +104 -0
- package/dist/adapters/task-sources/repo-trigger.d.ts +52 -0
- package/dist/adapters/task-sources/repo-trigger.js +153 -0
- package/dist/adapters/task-sources/repo-validation.d.ts +49 -0
- package/dist/adapters/task-sources/repo-validation.js +164 -0
- package/dist/adapters/task-sources/yaml-task-source.d.ts +18 -0
- package/dist/adapters/task-sources/yaml-task-source.js +136 -0
- package/dist/agent-observer/agentic-provider.d.ts +132 -0
- package/dist/agent-observer/agentic-provider.js +983 -0
- package/dist/agent-observer/classifier.d.ts +62 -0
- package/dist/agent-observer/classifier.js +269 -0
- package/dist/agent-observer/index.d.ts +7 -0
- package/dist/agent-observer/index.js +4 -0
- package/dist/agent-observer/pricing.d.ts +35 -0
- package/dist/agent-observer/pricing.js +82 -0
- package/dist/agent-observer/provider.d.ts +77 -0
- package/dist/agent-observer/provider.js +151 -0
- package/dist/agent-observer/proxy.d.ts +91 -0
- package/dist/agent-observer/proxy.js +321 -0
- package/dist/agent-observer/test-imports.d.ts +7 -0
- package/dist/agent-observer/test-imports.js +185 -0
- package/dist/agent-observer/types.d.ts +137 -0
- package/dist/agent-observer/types.js +16 -0
- package/dist/assertions/source-isolation.d.ts +72 -0
- package/dist/assertions/source-isolation.js +117 -0
- package/dist/cli.d.ts +24 -0
- package/dist/cli.js +199 -0
- package/dist/commands/agent-report.d.ts +5 -0
- package/dist/commands/agent-report.js +69 -0
- package/dist/commands/baseline.d.ts +9 -0
- package/dist/commands/baseline.js +141 -0
- package/dist/commands/cache.d.ts +13 -0
- package/dist/commands/cache.js +135 -0
- package/dist/commands/calculate-scores.d.ts +8 -0
- package/dist/commands/calculate-scores.js +48 -0
- package/dist/commands/compare.d.ts +8 -0
- package/dist/commands/compare.js +120 -0
- package/dist/commands/completion.d.ts +18 -0
- package/dist/commands/completion.js +260 -0
- package/dist/commands/coverage-audit.d.ts +7 -0
- package/dist/commands/coverage-audit.js +40 -0
- package/dist/commands/discovery-report.d.ts +10 -0
- package/dist/commands/discovery-report.js +44 -0
- package/dist/commands/eval.d.ts +9 -0
- package/dist/commands/eval.js +35 -0
- package/dist/commands/explain-handler.d.ts +34 -0
- package/dist/commands/explain-handler.js +719 -0
- package/dist/commands/fetch-docs.d.ts +8 -0
- package/dist/commands/fetch-docs.js +128 -0
- package/dist/commands/generate-configs.d.ts +8 -0
- package/dist/commands/generate-configs.js +46 -0
- package/dist/commands/grader/index.d.ts +11 -0
- package/dist/commands/grader/index.js +118 -0
- package/dist/commands/init.d.ts +19 -0
- package/dist/commands/init.js +150 -0
- package/dist/commands/interactive.d.ts +12 -0
- package/dist/commands/interactive.js +238 -0
- package/dist/commands/lookup-doc.d.ts +15 -0
- package/dist/commands/lookup-doc.js +84 -0
- package/dist/commands/measure-retrieval.d.ts +5 -0
- package/dist/commands/measure-retrieval.js +65 -0
- package/dist/commands/pipeline-action.d.ts +71 -0
- package/dist/commands/pipeline-action.js +305 -0
- package/dist/commands/pipeline.d.ts +62 -0
- package/dist/commands/pipeline.js +53 -0
- package/dist/commands/pr-comment.d.ts +8 -0
- package/dist/commands/pr-comment.js +47 -0
- package/dist/commands/publish.d.ts +26 -0
- package/dist/commands/publish.js +253 -0
- package/dist/commands/readiness-report.d.ts +10 -0
- package/dist/commands/readiness-report.js +104 -0
- package/dist/commands/shared/options.d.ts +29 -0
- package/dist/commands/shared/options.js +57 -0
- package/dist/commands/update-quality-scores.d.ts +5 -0
- package/dist/commands/update-quality-scores.js +20 -0
- package/dist/commands/validate-tasks.d.ts +16 -0
- package/dist/commands/validate-tasks.js +93 -0
- package/dist/commands/validate.d.ts +9 -0
- package/dist/commands/validate.js +73 -0
- package/dist/commands/webhook-server.d.ts +5 -0
- package/dist/commands/webhook-server.js +30 -0
- package/dist/commands/weekly-digest.d.ts +10 -0
- package/dist/commands/weekly-digest.js +104 -0
- package/dist/composition-root.d.ts +26 -0
- package/dist/composition-root.js +107 -0
- package/dist/interpolate.d.ts +26 -0
- package/dist/interpolate.js +70 -0
- package/dist/job-store.d.ts +104 -0
- package/dist/job-store.js +188 -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.d.ts +27 -0
- package/dist/orchestration/build-app-context.js +81 -0
- package/dist/orchestration/build-step-sequence.d.ts +15 -0
- package/dist/orchestration/build-step-sequence.js +84 -0
- package/dist/orchestration/config-to-source-overrides.d.ts +9 -0
- package/dist/orchestration/config-to-source-overrides.js +28 -0
- package/dist/orchestration/env-bridge.d.ts +21 -0
- package/dist/orchestration/env-bridge.js +66 -0
- package/dist/orchestration/index.d.ts +11 -0
- package/dist/orchestration/index.js +11 -0
- package/dist/orchestration/pipeline-orchestrator.d.ts +24 -0
- package/dist/orchestration/pipeline-orchestrator.js +153 -0
- package/dist/orchestration/step-runner.d.ts +20 -0
- package/dist/orchestration/step-runner.js +88 -0
- package/dist/orchestration/steps/calculate-scores-step.d.ts +13 -0
- package/dist/orchestration/steps/calculate-scores-step.js +95 -0
- package/dist/orchestration/steps/callback-step.d.ts +24 -0
- package/dist/orchestration/steps/callback-step.js +76 -0
- package/dist/orchestration/steps/compare-step.d.ts +14 -0
- package/dist/orchestration/steps/compare-step.js +92 -0
- package/dist/orchestration/steps/discovery-report-step.d.ts +13 -0
- package/dist/orchestration/steps/discovery-report-step.js +55 -0
- 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 +14 -0
- package/dist/orchestration/steps/fetch-docs-step.js +135 -0
- package/dist/orchestration/steps/gap-analysis-step.d.ts +16 -0
- package/dist/orchestration/steps/gap-analysis-step.js +136 -0
- package/dist/orchestration/steps/generate-configs-step.d.ts +14 -0
- package/dist/orchestration/steps/generate-configs-step.js +85 -0
- package/dist/orchestration/steps/grader-consistency-step.d.ts +13 -0
- package/dist/orchestration/steps/grader-consistency-step.js +64 -0
- package/dist/orchestration/steps/index.d.ts +19 -0
- package/dist/orchestration/steps/index.js +19 -0
- package/dist/orchestration/steps/mirror-repo-tasks-step.d.ts +21 -0
- package/dist/orchestration/steps/mirror-repo-tasks-step.js +94 -0
- package/dist/orchestration/steps/publish-report-step.d.ts +26 -0
- package/dist/orchestration/steps/publish-report-step.js +216 -0
- package/dist/orchestration/steps/readiness-step.d.ts +13 -0
- package/dist/orchestration/steps/readiness-step.js +91 -0
- package/dist/orchestration/steps/report-step.d.ts +12 -0
- package/dist/orchestration/steps/report-step.js +49 -0
- package/dist/orchestration/steps/run-eval-step.d.ts +17 -0
- package/dist/orchestration/steps/run-eval-step.js +195 -0
- package/dist/orchestration/steps/validate-step.d.ts +12 -0
- package/dist/orchestration/steps/validate-step.js +41 -0
- package/dist/pipeline/agent-behavior-report.d.ts +53 -0
- package/dist/pipeline/agent-behavior-report.js +132 -0
- package/dist/pipeline/attribution.d.ts +47 -0
- package/dist/pipeline/attribution.js +226 -0
- package/dist/pipeline/baseline.d.ts +37 -0
- package/dist/pipeline/baseline.js +141 -0
- package/dist/pipeline/cache.d.ts +101 -0
- package/dist/pipeline/cache.js +283 -0
- package/dist/pipeline/calculate-scores.d.ts +102 -0
- package/dist/pipeline/calculate-scores.js +1128 -0
- package/dist/pipeline/callback-delivery.d.ts +50 -0
- package/dist/pipeline/callback-delivery.js +89 -0
- package/dist/pipeline/checks.d.ts +39 -0
- package/dist/pipeline/checks.js +280 -0
- package/dist/pipeline/classify-url.d.ts +61 -0
- package/dist/pipeline/classify-url.js +93 -0
- package/dist/pipeline/compare.d.ts +31 -0
- package/dist/pipeline/compare.js +208 -0
- package/dist/pipeline/coverage-audit.d.ts +39 -0
- package/dist/pipeline/coverage-audit.js +165 -0
- package/dist/pipeline/degradations.d.ts +85 -0
- package/dist/pipeline/degradations.js +242 -0
- package/dist/pipeline/discovery-report.d.ts +55 -0
- package/dist/pipeline/discovery-report.js +178 -0
- package/dist/pipeline/eval-constants.d.ts +68 -0
- package/dist/pipeline/eval-constants.js +111 -0
- package/dist/pipeline/eval-fingerprint.d.ts +66 -0
- package/dist/pipeline/eval-fingerprint.js +175 -0
- package/dist/pipeline/expand-tasks.d.ts +220 -0
- package/dist/pipeline/expand-tasks.js +421 -0
- package/dist/pipeline/failure-modes.d.ts +46 -0
- package/dist/pipeline/failure-modes.js +348 -0
- package/dist/pipeline/fetch-url-content.d.ts +44 -0
- package/dist/pipeline/fetch-url-content.js +93 -0
- package/dist/pipeline/gap-analysis.d.ts +48 -0
- package/dist/pipeline/gap-analysis.js +231 -0
- package/dist/pipeline/generate-configs.d.ts +72 -0
- package/dist/pipeline/generate-configs.js +395 -0
- package/dist/pipeline/grader-api.d.ts +49 -0
- package/dist/pipeline/grader-api.js +200 -0
- package/dist/pipeline/grader-compare-runner.d.ts +44 -0
- package/dist/pipeline/grader-compare-runner.js +301 -0
- package/dist/pipeline/grader-comparison.d.ts +111 -0
- package/dist/pipeline/grader-comparison.js +161 -0
- package/dist/pipeline/grader-consistency-runner.d.ts +60 -0
- package/dist/pipeline/grader-consistency-runner.js +270 -0
- package/dist/pipeline/grader-consistency.d.ts +103 -0
- package/dist/pipeline/grader-consistency.js +146 -0
- package/dist/pipeline/grader-sensitivity-runner.d.ts +40 -0
- package/dist/pipeline/grader-sensitivity-runner.js +282 -0
- package/dist/pipeline/grader-sensitivity.d.ts +94 -0
- package/dist/pipeline/grader-sensitivity.js +144 -0
- package/dist/pipeline/grader-validate-runner.d.ts +38 -0
- package/dist/pipeline/grader-validate-runner.js +229 -0
- package/dist/pipeline/grader-validation.d.ts +107 -0
- package/dist/pipeline/grader-validation.js +169 -0
- package/dist/pipeline/map-request-to-config.d.ts +19 -0
- package/dist/pipeline/map-request-to-config.js +80 -0
- package/dist/pipeline/measure-retrieval.d.ts +59 -0
- package/dist/pipeline/measure-retrieval.js +111 -0
- package/dist/pipeline/mirror-repo-tasks.d.ts +86 -0
- package/dist/pipeline/mirror-repo-tasks.js +350 -0
- package/dist/pipeline/plan-format.d.ts +33 -0
- package/dist/pipeline/plan-format.js +202 -0
- package/dist/pipeline/plan.d.ts +169 -0
- package/dist/pipeline/plan.js +708 -0
- package/dist/pipeline/pr-comment.d.ts +19 -0
- package/dist/pipeline/pr-comment.js +502 -0
- package/dist/pipeline/probe.d.ts +52 -0
- package/dist/pipeline/probe.js +390 -0
- package/dist/pipeline/provenance.d.ts +47 -0
- package/dist/pipeline/provenance.js +146 -0
- package/dist/pipeline/readiness-report.d.ts +87 -0
- package/dist/pipeline/readiness-report.js +205 -0
- package/dist/pipeline/release-classification.d.ts +54 -0
- package/dist/pipeline/release-classification.js +238 -0
- package/dist/pipeline/release-report.d.ts +37 -0
- package/dist/pipeline/release-report.js +222 -0
- package/dist/pipeline/repo-eval-comment.d.ts +37 -0
- package/dist/pipeline/repo-eval-comment.js +165 -0
- package/dist/pipeline/repo-threshold-evaluator.d.ts +89 -0
- package/dist/pipeline/repo-threshold-evaluator.js +162 -0
- package/dist/pipeline/resolve-mappings.d.ts +35 -0
- package/dist/pipeline/resolve-mappings.js +72 -0
- package/dist/pipeline/retrieval-metrics.d.ts +39 -0
- package/dist/pipeline/retrieval-metrics.js +136 -0
- package/dist/pipeline/reverse-mapping.d.ts +67 -0
- package/dist/pipeline/reverse-mapping.js +88 -0
- package/dist/pipeline/schemas.d.ts +9 -0
- package/dist/pipeline/schemas.js +9 -0
- 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 +88 -0
- package/dist/pipeline/targeted-loo.js +203 -0
- package/dist/pipeline/thresholds.d.ts +27 -0
- package/dist/pipeline/thresholds.js +245 -0
- package/dist/pipeline/types.d.ts +10 -0
- package/dist/pipeline/types.js +10 -0
- package/dist/pipeline/validate.d.ts +67 -0
- package/dist/pipeline/validate.js +406 -0
- package/dist/pipeline/webhook-server.d.ts +37 -0
- package/dist/pipeline/webhook-server.js +133 -0
- package/dist/report-store.d.ts +84 -0
- package/dist/report-store.js +208 -0
- package/dist/sanity/client.d.ts +38 -0
- package/dist/sanity/client.js +86 -0
- package/dist/sanity/portable-text.d.ts +11 -0
- package/dist/sanity/portable-text.js +211 -0
- package/dist/sanity/queries.d.ts +133 -0
- package/dist/sanity/queries.js +300 -0
- package/dist/schedules/digest.d.ts +116 -0
- package/dist/schedules/digest.js +156 -0
- package/dist/schedules/index.d.ts +12 -0
- package/dist/schedules/index.js +10 -0
- package/dist/schedules/loader.d.ts +31 -0
- package/dist/schedules/loader.js +73 -0
- package/dist/schedules/schema.d.ts +9 -0
- package/dist/schedules/schema.js +9 -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-tasks-to-content-lake.d.ts +24 -0
- package/dist/scripts/migrate-tasks-to-content-lake.js +327 -0
- 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 +21 -0
- package/dist/scripts/validate-task-sources.js +210 -0
- 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/bigquery/index.d.ts +131 -0
- package/dist/sinks/bigquery/index.js +222 -0
- package/dist/sinks/format-slack.d.ts +64 -0
- package/dist/sinks/format-slack.js +306 -0
- package/dist/sinks/index.d.ts +23 -0
- package/dist/sinks/index.js +18 -0
- package/dist/sinks/loader.d.ts +18 -0
- package/dist/sinks/loader.js +82 -0
- package/dist/sinks/retry.d.ts +24 -0
- package/dist/sinks/retry.js +52 -0
- package/dist/sinks/schema.d.ts +9 -0
- package/dist/sinks/schema.js +9 -0
- package/dist/sinks/slack/format.d.ts +65 -0
- package/dist/sinks/slack/format.js +327 -0
- package/dist/sinks/slack/index.d.ts +27 -0
- package/dist/sinks/slack/index.js +78 -0
- package/dist/sinks/slack-sink.d.ts +27 -0
- package/dist/sinks/slack-sink.js +78 -0
- package/dist/sinks/types.d.ts +59 -0
- package/dist/sinks/types.js +44 -0
- package/dist/sinks/webhook/index.d.ts +19 -0
- package/dist/sinks/webhook/index.js +50 -0
- package/dist/sinks/webhook-sink.d.ts +19 -0
- package/dist/sinks/webhook-sink.js +50 -0
- package/dist/sources.d.ts +104 -0
- package/dist/sources.js +292 -0
- package/dist/webhook/budget.d.ts +42 -0
- package/dist/webhook/budget.js +60 -0
- package/dist/webhook/debounce.d.ts +67 -0
- package/dist/webhook/debounce.js +76 -0
- package/dist/webhook/dispatch.d.ts +45 -0
- package/dist/webhook/dispatch.js +84 -0
- package/dist/webhook/eval-request-handler.d.ts +87 -0
- package/dist/webhook/eval-request-handler.js +181 -0
- package/dist/webhook/handler.d.ts +88 -0
- package/dist/webhook/handler.js +203 -0
- package/dist/webhook/index.d.ts +17 -0
- package/dist/webhook/index.js +12 -0
- package/dist/webhook/types.d.ts +109 -0
- package/dist/webhook/types.js +10 -0
- package/package.json +72 -0
- package/tasks/.expanded.agentic.yaml +51 -0
- package/tasks/.expanded.yaml +66 -0
- package/tasks/frameworks.yaml +98 -0
- package/tasks/functions.yaml +51 -0
- package/tasks/groq.yaml +216 -0
- package/tasks/nextjs-live.yaml +62 -0
- package/tasks/studio-setup.yaml +111 -0
- package/tasks/visual-editing.yaml +120 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter: Run evaluation via Promptfoo CLI subprocess.
|
|
3
|
+
*
|
|
4
|
+
* This wraps the current execSync-based eval execution behind the
|
|
5
|
+
* EvalRunner port interface, enabling mock-based testing of the
|
|
6
|
+
* pipeline orchestrator.
|
|
7
|
+
*/
|
|
8
|
+
import { execSync } from "child_process";
|
|
9
|
+
import { existsSync, readFileSync } from "fs";
|
|
10
|
+
import { resolve } from "path";
|
|
11
|
+
export class PromptfooEvalAdapter {
|
|
12
|
+
rootDir;
|
|
13
|
+
constructor(rootDir) {
|
|
14
|
+
this.rootDir = rootDir;
|
|
15
|
+
}
|
|
16
|
+
async run(config) {
|
|
17
|
+
const start = Date.now();
|
|
18
|
+
// Resolve .env path — monorepo root (../../.env) or caller's cwd (.env)
|
|
19
|
+
const monorepoEnv = resolve(this.rootDir, "..", "..", ".env");
|
|
20
|
+
const callerEnv = resolve(process.env.AILF_CALLER_CWD ?? process.cwd(), ".env");
|
|
21
|
+
const envFile = existsSync(monorepoEnv) ? monorepoEnv : callerEnv;
|
|
22
|
+
const dotenvPrefix = existsSync(envFile) ? `dotenv -e ${envFile} -o --` : "";
|
|
23
|
+
const parts = [
|
|
24
|
+
dotenvPrefix,
|
|
25
|
+
"npx promptfoo eval",
|
|
26
|
+
`-c ${config.configPath}`,
|
|
27
|
+
config.filterFlags ?? "",
|
|
28
|
+
config.concurrency ? `--max-concurrency ${config.concurrency}` : "",
|
|
29
|
+
].filter(Boolean);
|
|
30
|
+
const cmd = parts.join(" ");
|
|
31
|
+
try {
|
|
32
|
+
execSync(cmd, {
|
|
33
|
+
cwd: this.rootDir,
|
|
34
|
+
env: { ...process.env, ...config.env },
|
|
35
|
+
stdio: "inherit",
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
durationMs: Date.now() - start,
|
|
39
|
+
status: "success",
|
|
40
|
+
summary: `Evaluation complete (${config.configPath})`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return {
|
|
45
|
+
durationMs: Date.now() - start,
|
|
46
|
+
error: `Promptfoo evaluation failed: ${config.configPath}`,
|
|
47
|
+
status: "failed",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
extractShareUrl(outputPath) {
|
|
52
|
+
if (!existsSync(outputPath))
|
|
53
|
+
return undefined;
|
|
54
|
+
try {
|
|
55
|
+
const raw = readFileSync(outputPath, "utf-8");
|
|
56
|
+
const data = JSON.parse(raw);
|
|
57
|
+
return data.shareableUrl ?? undefined;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapters barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Adapters implement port interfaces from @sanity/ailf-core.
|
|
5
|
+
* This is the "outside" of the hexagonal architecture.
|
|
6
|
+
*/
|
|
7
|
+
export { ContentLakeCacheAdapter, FilesystemCache } from "./cache/index.js";
|
|
8
|
+
export { SanityDocFetcher } from "./doc-fetchers/index.js";
|
|
9
|
+
export { PromptfooEvalAdapter } from "./eval-runners/index.js";
|
|
10
|
+
export { ConsoleLogger, type ConsoleLoggerOptions, JsonLogger, QuietLogger, } from "./loggers/index.js";
|
|
11
|
+
export { CliConfigAdapter, FileConfigAdapter } from "./config-sources/index.js";
|
|
12
|
+
export { YamlTaskSource } from "./task-sources/index.js";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapters barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Adapters implement port interfaces from @sanity/ailf-core.
|
|
5
|
+
* This is the "outside" of the hexagonal architecture.
|
|
6
|
+
*/
|
|
7
|
+
export { ContentLakeCacheAdapter, FilesystemCache } from "./cache/index.js";
|
|
8
|
+
export { SanityDocFetcher } from "./doc-fetchers/index.js";
|
|
9
|
+
export { PromptfooEvalAdapter } from "./eval-runners/index.js";
|
|
10
|
+
export { ConsoleLogger, JsonLogger, QuietLogger, } from "./loggers/index.js";
|
|
11
|
+
export { CliConfigAdapter, FileConfigAdapter } from "./config-sources/index.js";
|
|
12
|
+
export { YamlTaskSource } from "./task-sources/index.js";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConsoleLogger — the default human-readable logger adapter.
|
|
3
|
+
*
|
|
4
|
+
* Matches the existing emoji-prefix console output style used throughout
|
|
5
|
+
* the pipeline. This is a drop-in replacement for the scattered
|
|
6
|
+
* console.log calls — same visual output, structured interface.
|
|
7
|
+
*/
|
|
8
|
+
import type { Logger, StepResult } from "../../_vendor/ailf-core/index.d.ts";
|
|
9
|
+
export interface ConsoleLoggerOptions {
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class ConsoleLogger implements Logger {
|
|
13
|
+
private readonly verbose;
|
|
14
|
+
constructor(options?: ConsoleLoggerOptions);
|
|
15
|
+
debug(msg: string, ctx?: Record<string, unknown>): void;
|
|
16
|
+
info(msg: string): void;
|
|
17
|
+
warn(msg: string): void;
|
|
18
|
+
error(msg: string): void;
|
|
19
|
+
step(name: string, result: StepResult): void;
|
|
20
|
+
section(title: string): void;
|
|
21
|
+
table(headers: string[], rows: string[][]): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConsoleLogger — the default human-readable logger adapter.
|
|
3
|
+
*
|
|
4
|
+
* Matches the existing emoji-prefix console output style used throughout
|
|
5
|
+
* the pipeline. This is a drop-in replacement for the scattered
|
|
6
|
+
* console.log calls — same visual output, structured interface.
|
|
7
|
+
*/
|
|
8
|
+
export class ConsoleLogger {
|
|
9
|
+
verbose;
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
this.verbose = options.verbose ?? false;
|
|
12
|
+
}
|
|
13
|
+
debug(msg, ctx) {
|
|
14
|
+
if (!this.verbose)
|
|
15
|
+
return;
|
|
16
|
+
console.log(` 🔍 ${msg}${ctx ? ` ${JSON.stringify(ctx)}` : ""}`);
|
|
17
|
+
}
|
|
18
|
+
info(msg) {
|
|
19
|
+
console.log(` ${msg}`);
|
|
20
|
+
}
|
|
21
|
+
warn(msg) {
|
|
22
|
+
console.warn(` ⚠️ ${msg}`);
|
|
23
|
+
}
|
|
24
|
+
error(msg) {
|
|
25
|
+
console.error(` ❌ ${msg}`);
|
|
26
|
+
}
|
|
27
|
+
step(name, result) {
|
|
28
|
+
const icon = result.status === "success"
|
|
29
|
+
? "✅"
|
|
30
|
+
: result.status === "skipped"
|
|
31
|
+
? "⏭️"
|
|
32
|
+
: "❌";
|
|
33
|
+
const detail = result.status === "success"
|
|
34
|
+
? `(${result.durationMs}ms) ${result.summary}`
|
|
35
|
+
: result.status === "skipped"
|
|
36
|
+
? result.reason
|
|
37
|
+
: result.error;
|
|
38
|
+
console.log(` ${icon} ${name}: ${detail}`);
|
|
39
|
+
}
|
|
40
|
+
section(title) {
|
|
41
|
+
const line = "═".repeat(65);
|
|
42
|
+
console.log(`\n${line}\n ${title}\n${line}\n`);
|
|
43
|
+
}
|
|
44
|
+
table(headers, rows) {
|
|
45
|
+
const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? "").length)));
|
|
46
|
+
const pad = (s, w) => s.padEnd(w);
|
|
47
|
+
const sep = widths.map((w) => "─".repeat(w)).join("─┼─");
|
|
48
|
+
console.log(headers.map((h, i) => pad(h, widths[i])).join(" │ "));
|
|
49
|
+
console.log(sep);
|
|
50
|
+
for (const row of rows) {
|
|
51
|
+
console.log(row.map((c, i) => pad(c ?? "", widths[i])).join(" │ "));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger adapters barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Each adapter implements the Logger port from @sanity/ailf-core
|
|
5
|
+
* with different output strategies.
|
|
6
|
+
*/
|
|
7
|
+
export { ConsoleLogger, type ConsoleLoggerOptions } from "./console-logger.js";
|
|
8
|
+
export { QuietLogger } from "./quiet-logger.js";
|
|
9
|
+
export { JsonLogger } from "./json-logger.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger adapters barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Each adapter implements the Logger port from @sanity/ailf-core
|
|
5
|
+
* with different output strategies.
|
|
6
|
+
*/
|
|
7
|
+
export { ConsoleLogger } from "./console-logger.js";
|
|
8
|
+
export { QuietLogger } from "./quiet-logger.js";
|
|
9
|
+
export { JsonLogger } from "./json-logger.js";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JsonLogger — machine-readable NDJSON output.
|
|
3
|
+
*
|
|
4
|
+
* Used with --format json flag. Every log call emits a single JSON
|
|
5
|
+
* line to stdout, suitable for piping to jq, structured log collectors,
|
|
6
|
+
* or programmatic consumption.
|
|
7
|
+
*/
|
|
8
|
+
import type { Logger, StepResult } from "../../_vendor/ailf-core/index.d.ts";
|
|
9
|
+
export declare class JsonLogger implements Logger {
|
|
10
|
+
private emit;
|
|
11
|
+
debug(msg: string, ctx?: Record<string, unknown>): void;
|
|
12
|
+
info(msg: string, ctx?: Record<string, unknown>): void;
|
|
13
|
+
warn(msg: string, ctx?: Record<string, unknown>): void;
|
|
14
|
+
error(msg: string, ctx?: Record<string, unknown>): void;
|
|
15
|
+
step(name: string, result: StepResult): void;
|
|
16
|
+
section(title: string): void;
|
|
17
|
+
table(headers: string[], rows: string[][]): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JsonLogger — machine-readable NDJSON output.
|
|
3
|
+
*
|
|
4
|
+
* Used with --format json flag. Every log call emits a single JSON
|
|
5
|
+
* line to stdout, suitable for piping to jq, structured log collectors,
|
|
6
|
+
* or programmatic consumption.
|
|
7
|
+
*/
|
|
8
|
+
export class JsonLogger {
|
|
9
|
+
emit(level, msg, ctx) {
|
|
10
|
+
console.log(JSON.stringify({ level, msg, ts: Date.now(), ...ctx }));
|
|
11
|
+
}
|
|
12
|
+
debug(msg, ctx) {
|
|
13
|
+
this.emit("debug", msg, ctx);
|
|
14
|
+
}
|
|
15
|
+
info(msg, ctx) {
|
|
16
|
+
this.emit("info", msg, ctx);
|
|
17
|
+
}
|
|
18
|
+
warn(msg, ctx) {
|
|
19
|
+
this.emit("warn", msg, ctx);
|
|
20
|
+
}
|
|
21
|
+
error(msg, ctx) {
|
|
22
|
+
this.emit("error", msg, ctx);
|
|
23
|
+
}
|
|
24
|
+
step(name, result) {
|
|
25
|
+
this.emit("step", name, { result });
|
|
26
|
+
}
|
|
27
|
+
section(title) {
|
|
28
|
+
this.emit("section", title);
|
|
29
|
+
}
|
|
30
|
+
table(headers, rows) {
|
|
31
|
+
this.emit("table", "data", { headers, rows });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QuietLogger — only errors and step failures.
|
|
3
|
+
*
|
|
4
|
+
* Used with --quiet flag. Suppresses all informational output,
|
|
5
|
+
* showing only errors and failed pipeline steps.
|
|
6
|
+
*/
|
|
7
|
+
import type { Logger, StepResult } from "../../_vendor/ailf-core/index.d.ts";
|
|
8
|
+
export declare class QuietLogger implements Logger {
|
|
9
|
+
debug(): void;
|
|
10
|
+
info(): void;
|
|
11
|
+
warn(): void;
|
|
12
|
+
error(msg: string): void;
|
|
13
|
+
step(name: string, result: StepResult): void;
|
|
14
|
+
section(): void;
|
|
15
|
+
table(): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QuietLogger — only errors and step failures.
|
|
3
|
+
*
|
|
4
|
+
* Used with --quiet flag. Suppresses all informational output,
|
|
5
|
+
* showing only errors and failed pipeline steps.
|
|
6
|
+
*/
|
|
7
|
+
export class QuietLogger {
|
|
8
|
+
debug() {
|
|
9
|
+
/* noop */
|
|
10
|
+
}
|
|
11
|
+
info() {
|
|
12
|
+
/* noop */
|
|
13
|
+
}
|
|
14
|
+
warn() {
|
|
15
|
+
/* noop */
|
|
16
|
+
}
|
|
17
|
+
error(msg) {
|
|
18
|
+
console.error(msg);
|
|
19
|
+
}
|
|
20
|
+
step(name, result) {
|
|
21
|
+
if (result.status === "failed")
|
|
22
|
+
console.error(`❌ ${name}: ${result.error}`);
|
|
23
|
+
}
|
|
24
|
+
section() {
|
|
25
|
+
/* noop */
|
|
26
|
+
}
|
|
27
|
+
table() {
|
|
28
|
+
/* noop */
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter: Merge tasks from multiple TaskSource implementations.
|
|
3
|
+
*
|
|
4
|
+
* CompositeTaskSource wraps N TaskSource adapters and returns the union
|
|
5
|
+
* of their tasks. When two sources produce a task with the same ID,
|
|
6
|
+
* the later source wins (repo overrides Content Lake). A warning is
|
|
7
|
+
* logged on ID collision.
|
|
8
|
+
*
|
|
9
|
+
* This is how the pipeline sees both Content Lake tasks and repo-based
|
|
10
|
+
* tasks in a single TaskDefinition[].
|
|
11
|
+
*
|
|
12
|
+
* @see packages/core/src/ports/task-source.ts — TaskSource port
|
|
13
|
+
* @see docs/exec-plans/completed/tasks-as-content/phase-4-repo-based-tasks.md
|
|
14
|
+
*/
|
|
15
|
+
import type { FilterOptions, TaskDefinition, TaskSource } from "../../_vendor/ailf-core/index.d.ts";
|
|
16
|
+
export declare class CompositeTaskSource implements TaskSource {
|
|
17
|
+
private readonly sources;
|
|
18
|
+
constructor(sources: TaskSource[]);
|
|
19
|
+
loadTasks(filter?: FilterOptions): Promise<TaskDefinition[]>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter: Merge tasks from multiple TaskSource implementations.
|
|
3
|
+
*
|
|
4
|
+
* CompositeTaskSource wraps N TaskSource adapters and returns the union
|
|
5
|
+
* of their tasks. When two sources produce a task with the same ID,
|
|
6
|
+
* the later source wins (repo overrides Content Lake). A warning is
|
|
7
|
+
* logged on ID collision.
|
|
8
|
+
*
|
|
9
|
+
* This is how the pipeline sees both Content Lake tasks and repo-based
|
|
10
|
+
* tasks in a single TaskDefinition[].
|
|
11
|
+
*
|
|
12
|
+
* @see packages/core/src/ports/task-source.ts — TaskSource port
|
|
13
|
+
* @see docs/exec-plans/completed/tasks-as-content/phase-4-repo-based-tasks.md
|
|
14
|
+
*/
|
|
15
|
+
export class CompositeTaskSource {
|
|
16
|
+
sources;
|
|
17
|
+
constructor(sources) {
|
|
18
|
+
this.sources = sources;
|
|
19
|
+
if (sources.length === 0) {
|
|
20
|
+
throw new Error("CompositeTaskSource requires at least one source");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async loadTasks(filter) {
|
|
24
|
+
const results = await Promise.all(this.sources.map((s) => s.loadTasks(filter)));
|
|
25
|
+
return deduplicateById(results);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Deduplication — later sources override earlier ones
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/**
|
|
32
|
+
* Merge task arrays with later-wins deduplication.
|
|
33
|
+
*
|
|
34
|
+
* Sources are ordered [Content Lake, Repo, ...]. When a repo defines a
|
|
35
|
+
* task with the same ID as a Content Lake task, the repo version wins
|
|
36
|
+
* because it's fresher (the developer just edited it locally).
|
|
37
|
+
*
|
|
38
|
+
* Logs a warning on ID collision so it's visible but not blocking.
|
|
39
|
+
*/
|
|
40
|
+
function deduplicateById(taskArrays) {
|
|
41
|
+
const seen = new Map();
|
|
42
|
+
const merged = [];
|
|
43
|
+
for (let sourceIdx = 0; sourceIdx < taskArrays.length; sourceIdx++) {
|
|
44
|
+
for (const task of taskArrays[sourceIdx]) {
|
|
45
|
+
const existing = seen.get(task.id);
|
|
46
|
+
if (existing !== undefined) {
|
|
47
|
+
// Later source wins — replace the earlier task
|
|
48
|
+
console.warn(` ⚠️ Task "${task.id}" from source ${sourceIdx} overrides source ${existing.sourceIdx}`);
|
|
49
|
+
merged[existing.index] = task;
|
|
50
|
+
seen.set(task.id, { index: existing.index, sourceIdx });
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
seen.set(task.id, { index: merged.length, sourceIdx });
|
|
54
|
+
merged.push(task);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return merged;
|
|
59
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter: Load task definitions from the Sanity Content Lake.
|
|
3
|
+
*
|
|
4
|
+
* Fetches ailf.task documents via GROQ and maps them to the canonical
|
|
5
|
+
* TaskDefinition type. This adapter is the Content Lake counterpart of
|
|
6
|
+
* YamlTaskSource — both produce identical TaskDefinition[] for the same
|
|
7
|
+
* logical tasks. The pipeline never knows which adapter loaded the tasks.
|
|
8
|
+
*
|
|
9
|
+
* Wired in the composition root when --task-source content-lake is set.
|
|
10
|
+
*
|
|
11
|
+
* @see packages/core/src/ports/task-source.ts — TaskSource port
|
|
12
|
+
* @see docs/exec-plans/completed/tasks-as-content/phase-2-pipeline-integration.md
|
|
13
|
+
*/
|
|
14
|
+
import type { SanityClient } from "@sanity/client";
|
|
15
|
+
import type { FilterOptions, TaskDefinition, TaskSource } from "../../_vendor/ailf-core/index.d.ts";
|
|
16
|
+
export declare class ContentLakeTaskSource implements TaskSource {
|
|
17
|
+
private readonly client;
|
|
18
|
+
constructor(client: SanityClient);
|
|
19
|
+
loadTasks(filter?: FilterOptions): Promise<TaskDefinition[]>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter: Load task definitions from the Sanity Content Lake.
|
|
3
|
+
*
|
|
4
|
+
* Fetches ailf.task documents via GROQ and maps them to the canonical
|
|
5
|
+
* TaskDefinition type. This adapter is the Content Lake counterpart of
|
|
6
|
+
* YamlTaskSource — both produce identical TaskDefinition[] for the same
|
|
7
|
+
* logical tasks. The pipeline never knows which adapter loaded the tasks.
|
|
8
|
+
*
|
|
9
|
+
* Wired in the composition root when --task-source content-lake is set.
|
|
10
|
+
*
|
|
11
|
+
* @see packages/core/src/ports/task-source.ts — TaskSource port
|
|
12
|
+
* @see docs/exec-plans/completed/tasks-as-content/phase-2-pipeline-integration.md
|
|
13
|
+
*/
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// GROQ query — fetches ailf.task documents with resolved references
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* GROQ query that projects ailf.task documents into a shape suitable for
|
|
19
|
+
* mapping to TaskDefinition.
|
|
20
|
+
*
|
|
21
|
+
* Key projections:
|
|
22
|
+
* - featureArea reference → dereferenced areaId string
|
|
23
|
+
* - canonicalDocs[] → dereferenced article slugs with reason
|
|
24
|
+
* - referenceSolution → title (for identification, not full content)
|
|
25
|
+
*
|
|
26
|
+
* Filter parameters:
|
|
27
|
+
* - $areas: string[] | null — when non-null, only tasks in these areas
|
|
28
|
+
* - $taskIds: string[] | null — when non-null, only these task IDs
|
|
29
|
+
*/
|
|
30
|
+
const TASKS_QUERY = /* groq */ `
|
|
31
|
+
*[_type == "ailf.task"
|
|
32
|
+
&& (!defined($areas) || featureArea->areaId.current in $areas)
|
|
33
|
+
&& (!defined($taskIds) || id.current in $taskIds)
|
|
34
|
+
&& (execution.enabled != false)
|
|
35
|
+
] | order(featureArea->areaId.current asc, id.current asc) {
|
|
36
|
+
"taskId": id.current,
|
|
37
|
+
description,
|
|
38
|
+
"featureAreaId": featureArea->areaId.current,
|
|
39
|
+
taskPrompt,
|
|
40
|
+
docCoverage,
|
|
41
|
+
"canonicalDocs": canonicalDocs[] {
|
|
42
|
+
refType,
|
|
43
|
+
"slug": doc->slug.current,
|
|
44
|
+
"docRefId": doc->_id,
|
|
45
|
+
"sectionSlug": doc->primarySection->slug.current,
|
|
46
|
+
path,
|
|
47
|
+
"docId": docId,
|
|
48
|
+
perspective,
|
|
49
|
+
reason
|
|
50
|
+
},
|
|
51
|
+
assert,
|
|
52
|
+
rawAssert,
|
|
53
|
+
baseline,
|
|
54
|
+
"referenceSolutionTitle": referenceSolution->title
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// ContentLakeTaskSource adapter
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
export class ContentLakeTaskSource {
|
|
61
|
+
client;
|
|
62
|
+
constructor(client) {
|
|
63
|
+
this.client = client;
|
|
64
|
+
}
|
|
65
|
+
async loadTasks(filter) {
|
|
66
|
+
const params = buildGroqParams(filter);
|
|
67
|
+
const raw = await this.client.fetch(TASKS_QUERY, params);
|
|
68
|
+
if (!Array.isArray(raw)) {
|
|
69
|
+
throw new Error("ContentLakeTaskSource: GROQ query did not return an array");
|
|
70
|
+
}
|
|
71
|
+
const definitions = [];
|
|
72
|
+
for (const entry of raw) {
|
|
73
|
+
const mapped = mapToTaskDefinition(entry);
|
|
74
|
+
if (!mapped)
|
|
75
|
+
continue;
|
|
76
|
+
definitions.push(mapped);
|
|
77
|
+
}
|
|
78
|
+
if (definitions.length === 0 && !filter) {
|
|
79
|
+
console.warn(" ⚠️ ContentLakeTaskSource: no ailf.task documents found in the Content Lake. " +
|
|
80
|
+
"Have you run the migration (Phase 3) or created tasks in Studio?");
|
|
81
|
+
}
|
|
82
|
+
return definitions;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// GROQ parameter builder
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
function buildGroqParams(filter) {
|
|
89
|
+
return {
|
|
90
|
+
areas: filter?.areas && filter.areas.length > 0
|
|
91
|
+
? filter.areas.map((a) => a.toLowerCase())
|
|
92
|
+
: null,
|
|
93
|
+
taskIds: filter?.taskIds && filter.taskIds.length > 0 ? filter.taskIds : null,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Mapping: Content Lake → TaskDefinition
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
/**
|
|
100
|
+
* Map a Content Lake ailf.task document to the canonical TaskDefinition.
|
|
101
|
+
*
|
|
102
|
+
* Returns null if the document is missing required fields (taskId,
|
|
103
|
+
* description, featureAreaId, taskPrompt). These are required by the
|
|
104
|
+
* Studio schema, but defensive coding handles edge cases (drafts,
|
|
105
|
+
* partially-created documents, etc.).
|
|
106
|
+
*/
|
|
107
|
+
function mapToTaskDefinition(raw) {
|
|
108
|
+
// Required fields — skip malformed documents
|
|
109
|
+
if (!raw.taskId ||
|
|
110
|
+
!raw.description ||
|
|
111
|
+
!raw.featureAreaId ||
|
|
112
|
+
!raw.taskPrompt) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
const canonicalDocs = (raw.canonicalDocs ?? [])
|
|
116
|
+
.map(mapCanonicalDocRef)
|
|
117
|
+
.filter((d) => d !== null);
|
|
118
|
+
const assertions = mapAssertions(raw.assert ?? []);
|
|
119
|
+
const baseline = raw.baseline
|
|
120
|
+
? {
|
|
121
|
+
...(raw.baseline.enabled !== undefined
|
|
122
|
+
? { enabled: raw.baseline.enabled }
|
|
123
|
+
: {}),
|
|
124
|
+
...(raw.baseline.rubric
|
|
125
|
+
? {
|
|
126
|
+
rubric: raw.baseline.rubric,
|
|
127
|
+
}
|
|
128
|
+
: {}),
|
|
129
|
+
}
|
|
130
|
+
: undefined;
|
|
131
|
+
return {
|
|
132
|
+
assertions,
|
|
133
|
+
canonicalDocs,
|
|
134
|
+
description: raw.description,
|
|
135
|
+
docCoverage: raw.docCoverage ?? false,
|
|
136
|
+
featureArea: raw.featureAreaId,
|
|
137
|
+
id: raw.taskId,
|
|
138
|
+
// Reference solution path is not meaningful for CL tasks — the solution
|
|
139
|
+
// content lives in the Content Lake document, not on the filesystem.
|
|
140
|
+
// Downstream consumers that need the solution content will need to fetch
|
|
141
|
+
// it via the referenceSolution reference. For now, use empty string
|
|
142
|
+
// (same as tasks without a reference solution).
|
|
143
|
+
referenceSolution: "",
|
|
144
|
+
taskPrompt: raw.taskPrompt,
|
|
145
|
+
...(baseline ? { baseline } : {}),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Map a Content Lake canonical doc entry to the polymorphic CanonicalDocRef.
|
|
150
|
+
*
|
|
151
|
+
* Uses `refType` to determine which value field to read. Falls back to
|
|
152
|
+
* slug-based resolution for backward compatibility (documents created
|
|
153
|
+
* before the polymorphic schema migration).
|
|
154
|
+
*/
|
|
155
|
+
function mapCanonicalDocRef(raw) {
|
|
156
|
+
const reason = raw.reason ?? "";
|
|
157
|
+
const refType = raw.refType ?? "slug"; // default for legacy documents (pre-id-default)
|
|
158
|
+
switch (refType) {
|
|
159
|
+
case "slug":
|
|
160
|
+
return raw.slug ? { slug: raw.slug, reason } : null;
|
|
161
|
+
case "path": {
|
|
162
|
+
// Prefer explicit path field; fall back to deriving from doc reference
|
|
163
|
+
const path = raw.path ||
|
|
164
|
+
(raw.sectionSlug && raw.slug ? `${raw.sectionSlug}/${raw.slug}` : null);
|
|
165
|
+
return path ? { path, reason } : null;
|
|
166
|
+
}
|
|
167
|
+
case "id": {
|
|
168
|
+
// Prefer explicit docId field; fall back to doc reference _id
|
|
169
|
+
const id = raw.docId || raw.docRefId || null;
|
|
170
|
+
if (!id)
|
|
171
|
+
return null;
|
|
172
|
+
// Carry slug and derived path as optional DX annotations
|
|
173
|
+
const derivedPath = raw.sectionSlug && raw.slug
|
|
174
|
+
? `${raw.sectionSlug}/${raw.slug}`
|
|
175
|
+
: undefined;
|
|
176
|
+
return {
|
|
177
|
+
id,
|
|
178
|
+
reason,
|
|
179
|
+
...(raw.slug ? { slug: raw.slug } : {}),
|
|
180
|
+
...(derivedPath ? { path: derivedPath } : {}),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
case "perspective":
|
|
184
|
+
return raw.perspective ? { perspective: raw.perspective, reason } : null;
|
|
185
|
+
default:
|
|
186
|
+
// Unknown refType — try slug as fallback
|
|
187
|
+
return raw.slug ? { slug: raw.slug, reason } : null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Map Content Lake assertion objects to domain AssertionDefinition[].
|
|
192
|
+
*
|
|
193
|
+
* Content Lake assertions use the same field names as the domain type
|
|
194
|
+
* (type, template, criteria, value, threshold, weight) but all fields
|
|
195
|
+
* are optional in the raw response. This function normalizes them.
|
|
196
|
+
*/
|
|
197
|
+
function mapAssertions(raw) {
|
|
198
|
+
return raw
|
|
199
|
+
.filter((a) => !!a.type)
|
|
200
|
+
.map((a) => {
|
|
201
|
+
if (a.type === "llm-rubric" && a.template && a.criteria) {
|
|
202
|
+
return {
|
|
203
|
+
criteria: a.criteria,
|
|
204
|
+
template: a.template,
|
|
205
|
+
type: "llm-rubric",
|
|
206
|
+
...(a.weight !== undefined ? { weight: a.weight } : {}),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// Value-based assertion
|
|
210
|
+
const result = { type: a.type };
|
|
211
|
+
if (a.value !== undefined)
|
|
212
|
+
result.value = a.value;
|
|
213
|
+
if (a.threshold !== undefined)
|
|
214
|
+
result.threshold = a.threshold;
|
|
215
|
+
if (a.weight !== undefined)
|
|
216
|
+
result.weight = a.weight;
|
|
217
|
+
return result;
|
|
218
|
+
});
|
|
219
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { CompositeTaskSource } from "./composite-task-source.js";
|
|
2
|
+
export { ContentLakeTaskSource } from "./content-lake-task-source.js";
|
|
3
|
+
export { parseRepoConfig, parseRepoTaskFile, RepoConfigSchema, RepoTaskSchema, CURATED_ASSERTION_TYPES, RUBRIC_TEMPLATE_NAMES, type RepoConfig, type RepoTask, } from "./repo-schemas.js";
|
|
4
|
+
export { RepoTaskSource } from "./repo-task-source.js";
|
|
5
|
+
export { detectTriggerContext, resolveTrigger, type ResolvedTrigger, type TriggerContext, } from "./repo-trigger.js";
|
|
6
|
+
export { formatValidationResult, validateRepoTasks, type ValidationMessage, type ValidationResult, } from "./repo-validation.js";
|
|
7
|
+
export { YamlTaskSource } from "./yaml-task-source.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { CompositeTaskSource } from "./composite-task-source.js";
|
|
2
|
+
export { ContentLakeTaskSource } from "./content-lake-task-source.js";
|
|
3
|
+
export { parseRepoConfig, parseRepoTaskFile, RepoConfigSchema, RepoTaskSchema, CURATED_ASSERTION_TYPES, RUBRIC_TEMPLATE_NAMES, } from "./repo-schemas.js";
|
|
4
|
+
export { RepoTaskSource } from "./repo-task-source.js";
|
|
5
|
+
export { detectTriggerContext, resolveTrigger, } from "./repo-trigger.js";
|
|
6
|
+
export { formatValidationResult, validateRepoTasks, } from "./repo-validation.js";
|
|
7
|
+
export { YamlTaskSource } from "./yaml-task-source.js";
|