@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,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webhook/debounce.ts
|
|
3
|
+
*
|
|
4
|
+
* Time-window debouncing for content change webhooks.
|
|
5
|
+
*
|
|
6
|
+
* When multiple documents are edited in rapid succession (e.g., an editor
|
|
7
|
+
* updating several related articles), we coalesce them into a single
|
|
8
|
+
* evaluation dispatch. This prevents wasting evaluation budget on
|
|
9
|
+
* intermediate states.
|
|
10
|
+
*
|
|
11
|
+
* Strategy: accumulate changed slugs in a time window (default: 5 minutes).
|
|
12
|
+
* When the window expires, dispatch a single evaluation for all accumulated
|
|
13
|
+
* areas. New edits during the window reset the timer ("trailing edge").
|
|
14
|
+
*
|
|
15
|
+
* @see docs/design-docs/report-store/visibility-workflows.md — Debouncing
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Create a debouncer with a configurable time window.
|
|
19
|
+
*
|
|
20
|
+
* @param windowMs - Debounce window in milliseconds (default: 300_000 = 5 min)
|
|
21
|
+
* @param onFlush - Callback invoked when the window closes
|
|
22
|
+
*/
|
|
23
|
+
export function createDebouncer(windowMs, onFlush) {
|
|
24
|
+
const state = {
|
|
25
|
+
slugs: new Set(),
|
|
26
|
+
timer: null,
|
|
27
|
+
windowStart: 0,
|
|
28
|
+
};
|
|
29
|
+
function resetTimer() {
|
|
30
|
+
if (state.timer !== null) {
|
|
31
|
+
clearTimeout(state.timer);
|
|
32
|
+
}
|
|
33
|
+
state.timer = setTimeout(() => {
|
|
34
|
+
void doFlush();
|
|
35
|
+
}, windowMs);
|
|
36
|
+
}
|
|
37
|
+
async function doFlush() {
|
|
38
|
+
if (state.slugs.size === 0)
|
|
39
|
+
return;
|
|
40
|
+
const slugs = [...state.slugs];
|
|
41
|
+
// Reset state before callback (so new pushes start a fresh window)
|
|
42
|
+
state.slugs.clear();
|
|
43
|
+
if (state.timer !== null) {
|
|
44
|
+
clearTimeout(state.timer);
|
|
45
|
+
state.timer = null;
|
|
46
|
+
}
|
|
47
|
+
state.windowStart = 0;
|
|
48
|
+
await onFlush(slugs);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
cancel() {
|
|
52
|
+
if (state.timer !== null) {
|
|
53
|
+
clearTimeout(state.timer);
|
|
54
|
+
state.timer = null;
|
|
55
|
+
}
|
|
56
|
+
state.slugs.clear();
|
|
57
|
+
state.windowStart = 0;
|
|
58
|
+
},
|
|
59
|
+
async flush() {
|
|
60
|
+
await doFlush();
|
|
61
|
+
},
|
|
62
|
+
pending() {
|
|
63
|
+
return state.slugs.size;
|
|
64
|
+
},
|
|
65
|
+
push(slug) {
|
|
66
|
+
if (state.slugs.size === 0) {
|
|
67
|
+
state.windowStart = Date.now();
|
|
68
|
+
}
|
|
69
|
+
state.slugs.add(slug);
|
|
70
|
+
resetTimer();
|
|
71
|
+
},
|
|
72
|
+
state() {
|
|
73
|
+
return { ...state, slugs: new Set(state.slugs) };
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webhook/dispatch.ts
|
|
3
|
+
*
|
|
4
|
+
* Triggers AI Literacy Framework evaluations via GitHub Actions
|
|
5
|
+
* repository_dispatch events.
|
|
6
|
+
*
|
|
7
|
+
* When a content webhook determines that a document change affects
|
|
8
|
+
* tracked evaluation areas, this module dispatches a scoped pipeline
|
|
9
|
+
* run to the AILF repository.
|
|
10
|
+
*
|
|
11
|
+
* The dispatch uses the `external-eval` event type. The client_payload
|
|
12
|
+
* conforms to the PipelineRequestSchema so the receiving workflow can
|
|
13
|
+
* pass it directly to the CLI via `--config` without field translation.
|
|
14
|
+
*
|
|
15
|
+
* @see .github/workflows/external-eval.yml
|
|
16
|
+
* @see docs/design-docs/cross-repo-eval.md
|
|
17
|
+
*/
|
|
18
|
+
import type { DispatchRequest } from "./types.js";
|
|
19
|
+
export interface DispatchOptions {
|
|
20
|
+
/** GitHub personal access token with repo scope */
|
|
21
|
+
githubToken: string;
|
|
22
|
+
/** Target repository (owner/repo). Default: sanity-labs/ai-literacy-framework */
|
|
23
|
+
repo?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface DispatchResult {
|
|
26
|
+
/** Error message on failure */
|
|
27
|
+
error?: string;
|
|
28
|
+
/** The HTTP status code from GitHub API */
|
|
29
|
+
httpStatus: number;
|
|
30
|
+
/** Whether the dispatch was accepted */
|
|
31
|
+
ok: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Dispatch an evaluation via GitHub Actions repository_dispatch.
|
|
35
|
+
*
|
|
36
|
+
* Sends a `repository_dispatch` event with the `external-eval` event type.
|
|
37
|
+
* The payload includes area and task scoping so the pipeline evaluates
|
|
38
|
+
* only what's needed.
|
|
39
|
+
*
|
|
40
|
+
* GitHub API response:
|
|
41
|
+
* - 204: Dispatch accepted
|
|
42
|
+
* - 404: Repository not found or token lacks access
|
|
43
|
+
* - 422: Validation error
|
|
44
|
+
*/
|
|
45
|
+
export declare function dispatchEvaluation(request: DispatchRequest, options: DispatchOptions): Promise<DispatchResult>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webhook/dispatch.ts
|
|
3
|
+
*
|
|
4
|
+
* Triggers AI Literacy Framework evaluations via GitHub Actions
|
|
5
|
+
* repository_dispatch events.
|
|
6
|
+
*
|
|
7
|
+
* When a content webhook determines that a document change affects
|
|
8
|
+
* tracked evaluation areas, this module dispatches a scoped pipeline
|
|
9
|
+
* run to the AILF repository.
|
|
10
|
+
*
|
|
11
|
+
* The dispatch uses the `external-eval` event type. The client_payload
|
|
12
|
+
* conforms to the PipelineRequestSchema so the receiving workflow can
|
|
13
|
+
* pass it directly to the CLI via `--config` without field translation.
|
|
14
|
+
*
|
|
15
|
+
* @see .github/workflows/external-eval.yml
|
|
16
|
+
* @see docs/design-docs/cross-repo-eval.md
|
|
17
|
+
*/
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Constants
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
const DEFAULT_REPO = "sanity-labs/ai-literacy-framework";
|
|
22
|
+
const GITHUB_API = "https://api.github.com";
|
|
23
|
+
/**
|
|
24
|
+
* Dispatch an evaluation via GitHub Actions repository_dispatch.
|
|
25
|
+
*
|
|
26
|
+
* Sends a `repository_dispatch` event with the `external-eval` event type.
|
|
27
|
+
* The payload includes area and task scoping so the pipeline evaluates
|
|
28
|
+
* only what's needed.
|
|
29
|
+
*
|
|
30
|
+
* GitHub API response:
|
|
31
|
+
* - 204: Dispatch accepted
|
|
32
|
+
* - 404: Repository not found or token lacks access
|
|
33
|
+
* - 422: Validation error
|
|
34
|
+
*/
|
|
35
|
+
export async function dispatchEvaluation(request, options) {
|
|
36
|
+
const repo = options.repo ?? DEFAULT_REPO;
|
|
37
|
+
const url = `${GITHUB_API}/repos/${repo}/dispatches`;
|
|
38
|
+
const payload = {
|
|
39
|
+
client_payload: {
|
|
40
|
+
areas: request.areas,
|
|
41
|
+
caller_repo: "ailf-webhook-handler",
|
|
42
|
+
changedDocs: request.documentSlug
|
|
43
|
+
? request.documentSlug.split(",").filter(Boolean)
|
|
44
|
+
: undefined,
|
|
45
|
+
compare: true,
|
|
46
|
+
mode: request.mode ?? "baseline",
|
|
47
|
+
publish: true,
|
|
48
|
+
source: "production",
|
|
49
|
+
tasks: request.taskIds.length > 0 ? request.taskIds : undefined,
|
|
50
|
+
},
|
|
51
|
+
event_type: "external-eval",
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
const response = await fetch(url, {
|
|
55
|
+
body: JSON.stringify(payload),
|
|
56
|
+
headers: {
|
|
57
|
+
Accept: "application/vnd.github+json",
|
|
58
|
+
Authorization: `Bearer ${options.githubToken}`,
|
|
59
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
60
|
+
},
|
|
61
|
+
method: "POST",
|
|
62
|
+
});
|
|
63
|
+
if (response.status === 204) {
|
|
64
|
+
return { httpStatus: 204, ok: true };
|
|
65
|
+
}
|
|
66
|
+
// Try to extract error message
|
|
67
|
+
let error;
|
|
68
|
+
try {
|
|
69
|
+
const body = (await response.json());
|
|
70
|
+
error = body.message ?? `HTTP ${response.status}`;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
error = `HTTP ${response.status}: ${response.statusText}`;
|
|
74
|
+
}
|
|
75
|
+
return { error, httpStatus: response.status, ok: false };
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return {
|
|
79
|
+
error: err instanceof Error ? err.message : String(err),
|
|
80
|
+
httpStatus: 0,
|
|
81
|
+
ok: false,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webhook/eval-request-handler.ts
|
|
3
|
+
*
|
|
4
|
+
* Server-side handler for `ailf.evalRequest` documents from the Sanity
|
|
5
|
+
* Content Lake. This is the counterpart to the Studio's "Request Evaluation"
|
|
6
|
+
* action — when a content editor creates an eval request document via the
|
|
7
|
+
* Studio UI, a Sanity webhook fires and calls this handler.
|
|
8
|
+
*
|
|
9
|
+
* Designed to run in any HTTP environment: Cloudflare Workers, Vercel
|
|
10
|
+
* functions, Express, Hono, etc.
|
|
11
|
+
*
|
|
12
|
+
* Flow:
|
|
13
|
+
* 1. Receive eval request payload (from Sanity webhook projection)
|
|
14
|
+
* 2. Validate: must be `ailf.evalRequest` type, `pending` status,
|
|
15
|
+
* non-empty `perspective`
|
|
16
|
+
* 3. Dispatch a full evaluation to GitHub Actions via `repository_dispatch`
|
|
17
|
+
* with `external-eval` event type and release-scoped client payload
|
|
18
|
+
* 4. On success: PATCH the eval request document → `status: "dispatched"`
|
|
19
|
+
* 5. On failure: PATCH the eval request document → `status: "failed"` + error
|
|
20
|
+
* 6. Return a structured result
|
|
21
|
+
*
|
|
22
|
+
* @see packages/studio/src/actions/dispatch.ts — Studio-side dispatch
|
|
23
|
+
* @see .github/workflows/external-eval.yml — receiving workflow
|
|
24
|
+
* @see docs/design-docs/report-store/visibility-workflows.md
|
|
25
|
+
*/
|
|
26
|
+
/** Projected shape of an `ailf.evalRequest` document from a Sanity webhook. */
|
|
27
|
+
export interface EvalRequestPayload {
|
|
28
|
+
/** The Sanity document _id */
|
|
29
|
+
_id: string;
|
|
30
|
+
/** The Sanity document _type (should be "ailf.evalRequest") */
|
|
31
|
+
_type: string;
|
|
32
|
+
/** Sanity dataset */
|
|
33
|
+
dataset: string;
|
|
34
|
+
/** Error message (only if status is "failed") */
|
|
35
|
+
error?: string;
|
|
36
|
+
/** Evaluation mode */
|
|
37
|
+
mode: string;
|
|
38
|
+
/** Content release perspective ID */
|
|
39
|
+
perspective: string;
|
|
40
|
+
/** Sanity project ID */
|
|
41
|
+
projectId: string;
|
|
42
|
+
/** ISO datetime of when the request was created */
|
|
43
|
+
requestedAt: string;
|
|
44
|
+
/** User ID who requested */
|
|
45
|
+
requestedBy?: string;
|
|
46
|
+
/** Publish tag */
|
|
47
|
+
tag?: string;
|
|
48
|
+
/** Request status */
|
|
49
|
+
status: string;
|
|
50
|
+
}
|
|
51
|
+
/** Configuration for the eval request handler. */
|
|
52
|
+
export interface EvalRequestHandlerConfig {
|
|
53
|
+
/** GitHub PAT with repo or actions:write scope */
|
|
54
|
+
githubToken: string;
|
|
55
|
+
/** Target AILF repo (default: "sanity-labs/ai-literacy-framework") */
|
|
56
|
+
githubRepo?: string;
|
|
57
|
+
/** Sanity API token for updating the eval request document status */
|
|
58
|
+
sanityToken: string;
|
|
59
|
+
}
|
|
60
|
+
/** Result of handling an eval request. */
|
|
61
|
+
export interface EvalRequestResult {
|
|
62
|
+
/** Whether the dispatch succeeded */
|
|
63
|
+
ok: boolean;
|
|
64
|
+
/** The eval request document ID */
|
|
65
|
+
requestId: string;
|
|
66
|
+
/** Error message on failure */
|
|
67
|
+
error?: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Handle an incoming `ailf.evalRequest` document from a Sanity webhook.
|
|
71
|
+
*
|
|
72
|
+
* Validates the payload, dispatches a GitHub Actions evaluation, and
|
|
73
|
+
* updates the eval request document status in the Content Lake.
|
|
74
|
+
*
|
|
75
|
+
* ```ts
|
|
76
|
+
* // In a Cloudflare Worker or Vercel function:
|
|
77
|
+
* export default async function handler(req: Request) {
|
|
78
|
+
* const payload = await req.json()
|
|
79
|
+
* const result = await handleEvalRequest(payload, {
|
|
80
|
+
* githubToken: env.GITHUB_TOKEN,
|
|
81
|
+
* sanityToken: env.SANITY_API_TOKEN,
|
|
82
|
+
* })
|
|
83
|
+
* return Response.json(result, { status: result.ok ? 200 : 400 })
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function handleEvalRequest(payload: EvalRequestPayload, config: EvalRequestHandlerConfig): Promise<EvalRequestResult>;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webhook/eval-request-handler.ts
|
|
3
|
+
*
|
|
4
|
+
* Server-side handler for `ailf.evalRequest` documents from the Sanity
|
|
5
|
+
* Content Lake. This is the counterpart to the Studio's "Request Evaluation"
|
|
6
|
+
* action — when a content editor creates an eval request document via the
|
|
7
|
+
* Studio UI, a Sanity webhook fires and calls this handler.
|
|
8
|
+
*
|
|
9
|
+
* Designed to run in any HTTP environment: Cloudflare Workers, Vercel
|
|
10
|
+
* functions, Express, Hono, etc.
|
|
11
|
+
*
|
|
12
|
+
* Flow:
|
|
13
|
+
* 1. Receive eval request payload (from Sanity webhook projection)
|
|
14
|
+
* 2. Validate: must be `ailf.evalRequest` type, `pending` status,
|
|
15
|
+
* non-empty `perspective`
|
|
16
|
+
* 3. Dispatch a full evaluation to GitHub Actions via `repository_dispatch`
|
|
17
|
+
* with `external-eval` event type and release-scoped client payload
|
|
18
|
+
* 4. On success: PATCH the eval request document → `status: "dispatched"`
|
|
19
|
+
* 5. On failure: PATCH the eval request document → `status: "failed"` + error
|
|
20
|
+
* 6. Return a structured result
|
|
21
|
+
*
|
|
22
|
+
* @see packages/studio/src/actions/dispatch.ts — Studio-side dispatch
|
|
23
|
+
* @see .github/workflows/external-eval.yml — receiving workflow
|
|
24
|
+
* @see docs/design-docs/report-store/visibility-workflows.md
|
|
25
|
+
*/
|
|
26
|
+
import { createClient } from "@sanity/client";
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Constants
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
const DEFAULT_REPO = "sanity-labs/ai-literacy-framework";
|
|
31
|
+
const GITHUB_API = "https://api.github.com";
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Public API
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/**
|
|
36
|
+
* Handle an incoming `ailf.evalRequest` document from a Sanity webhook.
|
|
37
|
+
*
|
|
38
|
+
* Validates the payload, dispatches a GitHub Actions evaluation, and
|
|
39
|
+
* updates the eval request document status in the Content Lake.
|
|
40
|
+
*
|
|
41
|
+
* ```ts
|
|
42
|
+
* // In a Cloudflare Worker or Vercel function:
|
|
43
|
+
* export default async function handler(req: Request) {
|
|
44
|
+
* const payload = await req.json()
|
|
45
|
+
* const result = await handleEvalRequest(payload, {
|
|
46
|
+
* githubToken: env.GITHUB_TOKEN,
|
|
47
|
+
* sanityToken: env.SANITY_API_TOKEN,
|
|
48
|
+
* })
|
|
49
|
+
* return Response.json(result, { status: result.ok ? 200 : 400 })
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export async function handleEvalRequest(payload, config) {
|
|
54
|
+
const requestId = payload._id ?? "unknown";
|
|
55
|
+
// -------------------------------------------------------------------------
|
|
56
|
+
// 1. Validate payload
|
|
57
|
+
// -------------------------------------------------------------------------
|
|
58
|
+
if (payload._type !== "ailf.evalRequest") {
|
|
59
|
+
return {
|
|
60
|
+
error: `Unexpected document type: "${payload._type}" (expected "ailf.evalRequest")`,
|
|
61
|
+
ok: false,
|
|
62
|
+
requestId,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (payload.status !== "pending") {
|
|
66
|
+
return {
|
|
67
|
+
error: `Eval request is not pending (status: "${payload.status}")`,
|
|
68
|
+
ok: false,
|
|
69
|
+
requestId,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (!payload.perspective) {
|
|
73
|
+
return {
|
|
74
|
+
error: "Missing required field: perspective",
|
|
75
|
+
ok: false,
|
|
76
|
+
requestId,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// -------------------------------------------------------------------------
|
|
80
|
+
// 2. Dispatch evaluation via GitHub Actions
|
|
81
|
+
// -------------------------------------------------------------------------
|
|
82
|
+
const repo = config.githubRepo ?? DEFAULT_REPO;
|
|
83
|
+
const dispatchResult = await dispatchGitHubEval(repo, payload, config);
|
|
84
|
+
// -------------------------------------------------------------------------
|
|
85
|
+
// 3. Update eval request document status
|
|
86
|
+
// -------------------------------------------------------------------------
|
|
87
|
+
const client = createClient({
|
|
88
|
+
apiVersion: "2026-03-11",
|
|
89
|
+
dataset: payload.dataset,
|
|
90
|
+
projectId: payload.projectId,
|
|
91
|
+
token: config.sanityToken,
|
|
92
|
+
useCdn: false,
|
|
93
|
+
});
|
|
94
|
+
if (dispatchResult.ok) {
|
|
95
|
+
try {
|
|
96
|
+
await client
|
|
97
|
+
.patch(payload._id)
|
|
98
|
+
.set({
|
|
99
|
+
dispatchedAt: new Date().toISOString(),
|
|
100
|
+
status: "dispatched",
|
|
101
|
+
})
|
|
102
|
+
.commit();
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
// Dispatch succeeded but status update failed — log and still return ok
|
|
106
|
+
console.warn(` ⚠️ Dispatch succeeded but failed to update document status: ${err instanceof Error ? err.message : String(err)}`);
|
|
107
|
+
}
|
|
108
|
+
return { ok: true, requestId };
|
|
109
|
+
}
|
|
110
|
+
// Dispatch failed — mark the document as failed
|
|
111
|
+
try {
|
|
112
|
+
await client
|
|
113
|
+
.patch(payload._id)
|
|
114
|
+
.set({
|
|
115
|
+
error: dispatchResult.error ?? "Unknown dispatch error",
|
|
116
|
+
status: "failed",
|
|
117
|
+
})
|
|
118
|
+
.commit();
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.warn(` ⚠️ Failed to update document with error status: ${err instanceof Error ? err.message : String(err)}`);
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
error: dispatchResult.error,
|
|
125
|
+
ok: false,
|
|
126
|
+
requestId,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Dispatch a release-scoped evaluation via GitHub Actions repository_dispatch.
|
|
131
|
+
*
|
|
132
|
+
* Uses the `external-eval` event type with a client_payload conforming to
|
|
133
|
+
* PipelineRequestSchema. The workflow passes it directly to the CLI via
|
|
134
|
+
* `--config` without field translation.
|
|
135
|
+
*/
|
|
136
|
+
async function dispatchGitHubEval(repo, payload, config) {
|
|
137
|
+
const url = `${GITHUB_API}/repos/${repo}/dispatches`;
|
|
138
|
+
const body = {
|
|
139
|
+
client_payload: {
|
|
140
|
+
caller_repo: "sanity-io/www-sanity-io",
|
|
141
|
+
dataset: payload.dataset,
|
|
142
|
+
mode: payload.mode,
|
|
143
|
+
perspective: payload.perspective,
|
|
144
|
+
projectId: payload.projectId,
|
|
145
|
+
publish: true,
|
|
146
|
+
...(payload.tag ? { publishTag: payload.tag } : {}),
|
|
147
|
+
source: "production",
|
|
148
|
+
},
|
|
149
|
+
event_type: "external-eval",
|
|
150
|
+
};
|
|
151
|
+
try {
|
|
152
|
+
const response = await fetch(url, {
|
|
153
|
+
body: JSON.stringify(body),
|
|
154
|
+
headers: {
|
|
155
|
+
Accept: "application/vnd.github+json",
|
|
156
|
+
Authorization: `Bearer ${config.githubToken}`,
|
|
157
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
158
|
+
},
|
|
159
|
+
method: "POST",
|
|
160
|
+
});
|
|
161
|
+
if (response.status === 204) {
|
|
162
|
+
return { ok: true };
|
|
163
|
+
}
|
|
164
|
+
// Try to extract error message from GitHub response
|
|
165
|
+
let error;
|
|
166
|
+
try {
|
|
167
|
+
const responseBody = (await response.json());
|
|
168
|
+
error = responseBody.message ?? `HTTP ${response.status}`;
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
error = `HTTP ${response.status}: ${response.statusText}`;
|
|
172
|
+
}
|
|
173
|
+
return { error, ok: false };
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
return {
|
|
177
|
+
error: err instanceof Error ? err.message : String(err),
|
|
178
|
+
ok: false,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* webhook/handler.ts
|
|
3
|
+
*
|
|
4
|
+
* Platform-agnostic webhook handler for Sanity content change events.
|
|
5
|
+
*
|
|
6
|
+
* Receives Sanity webhook payloads, determines which evaluation areas
|
|
7
|
+
* are affected by the document change, debounces rapid edits, enforces
|
|
8
|
+
* daily budget limits, and dispatches scoped evaluations via GitHub Actions.
|
|
9
|
+
*
|
|
10
|
+
* This handler is stateless between requests (debounce and budget state
|
|
11
|
+
* is held in-memory by the enclosing WebhookHandler instance). It can be
|
|
12
|
+
* mounted in any HTTP framework: Express, Hono, Cloudflare Workers, etc.
|
|
13
|
+
*
|
|
14
|
+
* Flow:
|
|
15
|
+
* 1. Receive Sanity webhook payload
|
|
16
|
+
* 2. Extract document slug from payload
|
|
17
|
+
* 3. Look up affected areas via reverse mapping
|
|
18
|
+
* 4. If no areas affected → ignore (untracked document)
|
|
19
|
+
* 5. Check daily budget → rate-limit if exceeded
|
|
20
|
+
* 6. Push slug into debounce window
|
|
21
|
+
* 7. When debounce window closes → dispatch scoped eval via GitHub Actions
|
|
22
|
+
*
|
|
23
|
+
* @see docs/design-docs/report-store/visibility-workflows.md
|
|
24
|
+
*/
|
|
25
|
+
import { type DispatchResult } from "./dispatch.js";
|
|
26
|
+
import type { SanityWebhookPayload, WebhookHandlerConfig, WebhookResult } from "./types.js";
|
|
27
|
+
/**
|
|
28
|
+
* A stateful webhook handler that manages debouncing, budgeting,
|
|
29
|
+
* and evaluation dispatch.
|
|
30
|
+
*
|
|
31
|
+
* Create one instance per process and call `handle()` for each
|
|
32
|
+
* incoming webhook payload.
|
|
33
|
+
*
|
|
34
|
+
* ```ts
|
|
35
|
+
* const handler = new WebhookHandler({
|
|
36
|
+
* githubToken: process.env.GITHUB_TOKEN!,
|
|
37
|
+
* rootDir: "/path/to/packages/eval",
|
|
38
|
+
* })
|
|
39
|
+
*
|
|
40
|
+
* // In your HTTP handler:
|
|
41
|
+
* app.post("/webhook", async (req) => {
|
|
42
|
+
* const result = await handler.handle(req.body)
|
|
43
|
+
* return Response.json(result)
|
|
44
|
+
* })
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare class WebhookHandler {
|
|
48
|
+
private readonly budget;
|
|
49
|
+
private readonly config;
|
|
50
|
+
private readonly debouncer;
|
|
51
|
+
/** Recent dispatch results (for diagnostics) */
|
|
52
|
+
private readonly recentDispatches;
|
|
53
|
+
private readonly reverseMapping;
|
|
54
|
+
constructor(config: WebhookHandlerConfig);
|
|
55
|
+
/**
|
|
56
|
+
* Get handler diagnostics (for health check endpoints).
|
|
57
|
+
*/
|
|
58
|
+
diagnostics(): {
|
|
59
|
+
budget: {
|
|
60
|
+
count: number;
|
|
61
|
+
limit: number;
|
|
62
|
+
remaining: number;
|
|
63
|
+
};
|
|
64
|
+
pendingSlugs: number;
|
|
65
|
+
recentDispatches: {
|
|
66
|
+
areas: string[];
|
|
67
|
+
result: DispatchResult;
|
|
68
|
+
timestamp: string;
|
|
69
|
+
}[];
|
|
70
|
+
trackedSlugs: number;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Handle an incoming Sanity webhook payload.
|
|
74
|
+
*
|
|
75
|
+
* This is the main entry point — call once per webhook request.
|
|
76
|
+
* Returns a result indicating what happened (dispatched, debounced,
|
|
77
|
+
* rate-limited, or ignored).
|
|
78
|
+
*/
|
|
79
|
+
handle(payload: SanityWebhookPayload): WebhookResult;
|
|
80
|
+
/**
|
|
81
|
+
* Force-flush the debounce window (for graceful shutdown).
|
|
82
|
+
*/
|
|
83
|
+
shutdown(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Called when the debounce window closes — dispatches a scoped evaluation.
|
|
86
|
+
*/
|
|
87
|
+
private onDebounceFlush;
|
|
88
|
+
}
|