@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,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* report-store.ts
|
|
3
|
+
*
|
|
4
|
+
* Persistent report store backed by the Sanity Content Lake.
|
|
5
|
+
* Provides write, read, and lineage-query operations for evaluation reports.
|
|
6
|
+
*
|
|
7
|
+
* The Sanity Content Lake is the system of record (P1: immutable events).
|
|
8
|
+
* Reports are stored as typed documents in the shared dataset, enabling
|
|
9
|
+
* GROQ queries, Studio dashboards, and webhook-driven notifications.
|
|
10
|
+
*
|
|
11
|
+
* If Sanity is unreachable, the store logs a warning and returns gracefully
|
|
12
|
+
* (P5: local-first — the pipeline never fails because of a store write).
|
|
13
|
+
*
|
|
14
|
+
* @see docs/design-docs/report-store/architecture.md
|
|
15
|
+
* @see docs/design-docs/report-store/domain-model.md
|
|
16
|
+
*/
|
|
17
|
+
import { getSanityClient } from "./sanity/client.js";
|
|
18
|
+
import { compare } from "./pipeline/compare.js";
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Constants
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
const REPORT_TYPE = "ailf.report";
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Report Store
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
export class ReportStore {
|
|
27
|
+
client;
|
|
28
|
+
constructor(options = {}) {
|
|
29
|
+
if (options.client) {
|
|
30
|
+
this.client = options.client;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.client = getSanityClient({
|
|
34
|
+
...(options.dataset ? { dataset: options.dataset } : {}),
|
|
35
|
+
...(options.projectId ? { projectId: options.projectId } : {}),
|
|
36
|
+
...(options.token ? { token: options.token } : {}),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Auto-compare: find the most recent comparable report and compute
|
|
42
|
+
* a ComparisonReport using the existing compare() primitive.
|
|
43
|
+
*
|
|
44
|
+
* @returns The comparison report, or null if no baseline found or on error
|
|
45
|
+
*/
|
|
46
|
+
async autoCompare(currentSummary, provenance, completedAt) {
|
|
47
|
+
const baseline = await this.findComparableBaseline({
|
|
48
|
+
before: completedAt,
|
|
49
|
+
mode: provenance.mode,
|
|
50
|
+
source: { name: provenance.source.name },
|
|
51
|
+
});
|
|
52
|
+
if (!baseline) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
return compare(baseline.summary, currentSummary);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.warn(` ⚠️ Auto-comparison failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Find a report by its evaluation fingerprint (cross-environment cache lookup).
|
|
65
|
+
*
|
|
66
|
+
* Returns the most recent non-debug report whose provenance contains a
|
|
67
|
+
* matching `evalFingerprint`. Used by the pipeline to skip the expensive
|
|
68
|
+
* eval step when identical inputs have already been evaluated.
|
|
69
|
+
*
|
|
70
|
+
* @returns The cached report, or null if no match or on error
|
|
71
|
+
* @see docs/design-docs/content-lake-eval-caching.md
|
|
72
|
+
*/
|
|
73
|
+
async findByFingerprint(fingerprint) {
|
|
74
|
+
try {
|
|
75
|
+
const groq = `*[_type == $type
|
|
76
|
+
&& provenance.evalFingerprint == $fingerprint
|
|
77
|
+
] | order(completedAt desc) [0]`;
|
|
78
|
+
const doc = await this.client.fetch(groq, { fingerprint, type: REPORT_TYPE });
|
|
79
|
+
return doc ? toReport(doc) : null;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
console.warn(` ⚠️ Failed to query cached report by fingerprint: ${error instanceof Error ? error.message : String(error)}`);
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Find the most recent comparable report for auto-comparison.
|
|
88
|
+
*
|
|
89
|
+
* Uses GROQ to match on key provenance dimensions (mode, source name)
|
|
90
|
+
* and returns the most recent report before the given timestamp.
|
|
91
|
+
*
|
|
92
|
+
* "Comparable" means: same evaluation mode + same source name.
|
|
93
|
+
* More granular matching (areas, models) can be added as needed.
|
|
94
|
+
*
|
|
95
|
+
* @see docs/design-docs/report-store/architecture.md — Auto-comparison
|
|
96
|
+
*/
|
|
97
|
+
async findComparableBaseline(query) {
|
|
98
|
+
try {
|
|
99
|
+
const groq = `*[_type == $type
|
|
100
|
+
&& provenance.mode == $mode
|
|
101
|
+
${query.source?.name ? "&& provenance.source.name == $sourceName" : ""}
|
|
102
|
+
${query.before ? "&& completedAt < $before" : ""}
|
|
103
|
+
] | order(completedAt desc) [0]`;
|
|
104
|
+
const params = {
|
|
105
|
+
mode: query.mode,
|
|
106
|
+
type: REPORT_TYPE,
|
|
107
|
+
};
|
|
108
|
+
if (query.source?.name) {
|
|
109
|
+
params.sourceName = query.source.name;
|
|
110
|
+
}
|
|
111
|
+
if (query.before) {
|
|
112
|
+
params.before = query.before;
|
|
113
|
+
}
|
|
114
|
+
const doc = await this.client.fetch(groq, params);
|
|
115
|
+
return doc ? toReport(doc) : null;
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.warn(` ⚠️ Failed to query comparable baseline: ${error instanceof Error ? error.message : String(error)}`);
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Read a report by its ID.
|
|
124
|
+
*/
|
|
125
|
+
async read(id) {
|
|
126
|
+
try {
|
|
127
|
+
const doc = await this.client.fetch(`*[_type == $type && reportId == $id][0]`, { id, type: REPORT_TYPE });
|
|
128
|
+
return doc ? toReport(doc) : null;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.warn(` ⚠️ Failed to read report from Sanity: ${error instanceof Error ? error.message : String(error)}`);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Write a report to the Sanity Content Lake.
|
|
137
|
+
*
|
|
138
|
+
* Creates an immutable `ailf.report` document. The document _id is
|
|
139
|
+
* prefixed with `report-` for easy GROQ filtering.
|
|
140
|
+
*
|
|
141
|
+
* @returns The report ID on success, null on failure (logged, not thrown)
|
|
142
|
+
*/
|
|
143
|
+
async write(report) {
|
|
144
|
+
try {
|
|
145
|
+
await this.client.create({
|
|
146
|
+
_id: `report-${report.id}`,
|
|
147
|
+
_type: REPORT_TYPE,
|
|
148
|
+
comparison: report.comparison ?? null,
|
|
149
|
+
completedAt: report.completedAt,
|
|
150
|
+
durationMs: report.durationMs,
|
|
151
|
+
provenance: report.provenance,
|
|
152
|
+
reportId: report.id,
|
|
153
|
+
summary: report.summary,
|
|
154
|
+
tag: report.tag ?? null,
|
|
155
|
+
});
|
|
156
|
+
return report.id;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.warn(` ⚠️ Failed to write report to Sanity: ${error instanceof Error ? error.message : String(error)}`);
|
|
160
|
+
console.warn(" Report was not persisted. Pipeline results are still available locally.");
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Generate a UUID v7 (time-sortable) for report identification.
|
|
167
|
+
*
|
|
168
|
+
* UUID v7 encodes the current timestamp in the high bits, making reports
|
|
169
|
+
* naturally sort by creation time in both GROQ and string comparisons.
|
|
170
|
+
*
|
|
171
|
+
* Uses crypto.randomUUID() as a base and overwrites the timestamp portion.
|
|
172
|
+
*/
|
|
173
|
+
export function generateReportId() {
|
|
174
|
+
const now = Date.now();
|
|
175
|
+
const uuid = crypto.randomUUID();
|
|
176
|
+
// UUID v7: encode 48-bit timestamp in the first 12 hex chars
|
|
177
|
+
const hex = now.toString(16).padStart(12, "0");
|
|
178
|
+
const v7 = hex.slice(0, 8) +
|
|
179
|
+
"-" +
|
|
180
|
+
hex.slice(8, 12) +
|
|
181
|
+
"-7" +
|
|
182
|
+
uuid.slice(15, 18) +
|
|
183
|
+
"-" +
|
|
184
|
+
uuid.slice(19, 23) +
|
|
185
|
+
"-" +
|
|
186
|
+
uuid.slice(24);
|
|
187
|
+
return v7;
|
|
188
|
+
}
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
// Sanity document → Report mapping
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
/**
|
|
193
|
+
* Convert a raw Sanity document to a typed Report.
|
|
194
|
+
*
|
|
195
|
+
* The Sanity document shape mirrors the Report type but includes Sanity
|
|
196
|
+
* metadata (_id, _type, _rev, etc.) that we strip.
|
|
197
|
+
*/
|
|
198
|
+
function toReport(doc) {
|
|
199
|
+
return {
|
|
200
|
+
comparison: doc.comparison,
|
|
201
|
+
completedAt: doc.completedAt,
|
|
202
|
+
durationMs: doc.durationMs,
|
|
203
|
+
id: doc.reportId,
|
|
204
|
+
provenance: doc.provenance,
|
|
205
|
+
summary: doc.summary,
|
|
206
|
+
tag: doc.tag,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type SanityClient } from "@sanity/client";
|
|
2
|
+
import type { ResolvedSourceConfig } from "../sources.js";
|
|
3
|
+
export interface SanityConfig {
|
|
4
|
+
apiVersion: string;
|
|
5
|
+
dataset: string;
|
|
6
|
+
perspective?: string[];
|
|
7
|
+
projectId: string;
|
|
8
|
+
token?: string;
|
|
9
|
+
useCdn: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a Sanity client configured for a specific perspective.
|
|
13
|
+
*
|
|
14
|
+
* Unlike getSanityClient(), this always creates a fresh (uncached) client.
|
|
15
|
+
* Used for perspective diffing — comparing published vs. perspective content.
|
|
16
|
+
*
|
|
17
|
+
* @param perspective - The perspective ID (e.g., "agent-c7OKTk"). Stacked
|
|
18
|
+
* on top of "published" as [perspectiveId, "published"].
|
|
19
|
+
* @param source - Optional ResolvedSourceConfig for projectId/dataset overrides.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createPerspectiveClient(perspective: string, source?: ResolvedSourceConfig): SanityClient;
|
|
22
|
+
/**
|
|
23
|
+
* Create a Sanity client that reads only published content (no perspectives).
|
|
24
|
+
*
|
|
25
|
+
* Unlike getSanityClient(), this always creates a fresh (uncached) client.
|
|
26
|
+
* Used for perspective diffing — fetching the "before" state.
|
|
27
|
+
*
|
|
28
|
+
* @param source - Optional ResolvedSourceConfig for projectId/dataset overrides.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createPublishedClient(source?: ResolvedSourceConfig): SanityClient;
|
|
31
|
+
/**
|
|
32
|
+
* Create or return a cached Sanity client.
|
|
33
|
+
*
|
|
34
|
+
* When a ResolvedSourceConfig is provided, its projectId, dataset, and perspective
|
|
35
|
+
* override the defaults. For release perspectives, the perspective is
|
|
36
|
+
* passed as a stacked array: [perspectiveId, "published"].
|
|
37
|
+
*/
|
|
38
|
+
export declare function getSanityClient(overrides?: Partial<SanityConfig>, source?: ResolvedSourceConfig): SanityClient;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createClient } from "@sanity/client";
|
|
2
|
+
/**
|
|
3
|
+
* Build the default Sanity client config by reading process.env at call time.
|
|
4
|
+
*
|
|
5
|
+
* IMPORTANT: This is a function, not a module-level const. In ESM, static
|
|
6
|
+
* imports are resolved before module-level code runs. If this were a const,
|
|
7
|
+
* it would capture process.env values at import time — before dotenv has
|
|
8
|
+
* loaded the .env file. By deferring to call time, we ensure env vars set
|
|
9
|
+
* by dotenvConfig() in cli.ts (or migration scripts) are always picked up.
|
|
10
|
+
*/
|
|
11
|
+
function getDefaultConfig() {
|
|
12
|
+
return {
|
|
13
|
+
apiVersion: new Date().toISOString().split("T")[0],
|
|
14
|
+
// oxlint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty string env var should fall back to default
|
|
15
|
+
dataset: process.env.SANITY_DATASET || "next",
|
|
16
|
+
// oxlint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty string env var should fall back to default
|
|
17
|
+
projectId: process.env.SANITY_PROJECT_ID || "3do82whm",
|
|
18
|
+
token: process.env.SANITY_API_TOKEN,
|
|
19
|
+
useCdn: false,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
let _client = null;
|
|
23
|
+
/**
|
|
24
|
+
* Create a Sanity client configured for a specific perspective.
|
|
25
|
+
*
|
|
26
|
+
* Unlike getSanityClient(), this always creates a fresh (uncached) client.
|
|
27
|
+
* Used for perspective diffing — comparing published vs. perspective content.
|
|
28
|
+
*
|
|
29
|
+
* @param perspective - The perspective ID (e.g., "agent-c7OKTk"). Stacked
|
|
30
|
+
* on top of "published" as [perspectiveId, "published"].
|
|
31
|
+
* @param source - Optional ResolvedSourceConfig for projectId/dataset overrides.
|
|
32
|
+
*/
|
|
33
|
+
export function createPerspectiveClient(perspective, source) {
|
|
34
|
+
const config = {
|
|
35
|
+
...getDefaultConfig(),
|
|
36
|
+
...(source?.dataset ? { dataset: source.dataset } : {}),
|
|
37
|
+
...(source?.projectId ? { projectId: source.projectId } : {}),
|
|
38
|
+
perspective: [perspective, "published"],
|
|
39
|
+
};
|
|
40
|
+
return createClient(config);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a Sanity client that reads only published content (no perspectives).
|
|
44
|
+
*
|
|
45
|
+
* Unlike getSanityClient(), this always creates a fresh (uncached) client.
|
|
46
|
+
* Used for perspective diffing — fetching the "before" state.
|
|
47
|
+
*
|
|
48
|
+
* @param source - Optional ResolvedSourceConfig for projectId/dataset overrides.
|
|
49
|
+
*/
|
|
50
|
+
export function createPublishedClient(source) {
|
|
51
|
+
const config = {
|
|
52
|
+
...getDefaultConfig(),
|
|
53
|
+
...(source?.dataset ? { dataset: source.dataset } : {}),
|
|
54
|
+
...(source?.projectId ? { projectId: source.projectId } : {}),
|
|
55
|
+
perspective: ["published"],
|
|
56
|
+
};
|
|
57
|
+
return createClient(config);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create or return a cached Sanity client.
|
|
61
|
+
*
|
|
62
|
+
* When a ResolvedSourceConfig is provided, its projectId, dataset, and perspective
|
|
63
|
+
* override the defaults. For release perspectives, the perspective is
|
|
64
|
+
* passed as a stacked array: [perspectiveId, "published"].
|
|
65
|
+
*/
|
|
66
|
+
export function getSanityClient(overrides, source) {
|
|
67
|
+
// If a source is provided, always create a fresh client (don't cache)
|
|
68
|
+
if (source) {
|
|
69
|
+
const config = {
|
|
70
|
+
...getDefaultConfig(),
|
|
71
|
+
...overrides,
|
|
72
|
+
...(source.dataset ? { dataset: source.dataset } : {}),
|
|
73
|
+
...(source.projectId ? { projectId: source.projectId } : {}),
|
|
74
|
+
...(source.perspective
|
|
75
|
+
? { perspective: [source.perspective, "published"] }
|
|
76
|
+
: {}),
|
|
77
|
+
};
|
|
78
|
+
return createClient(config);
|
|
79
|
+
}
|
|
80
|
+
if (_client && !overrides) {
|
|
81
|
+
return _client;
|
|
82
|
+
}
|
|
83
|
+
const config = { ...getDefaultConfig(), ...overrides };
|
|
84
|
+
_client = createClient(config);
|
|
85
|
+
return _client;
|
|
86
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type PortableTextArray = PortableTextBlock[];
|
|
2
|
+
interface PortableTextBlock {
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
_key?: string;
|
|
5
|
+
_type: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Convert a Sanity Portable Text `content` array to well-structured Markdown.
|
|
9
|
+
*/
|
|
10
|
+
export declare function toMarkdown(blocks: PortableTextArray): string;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portable-text.ts
|
|
3
|
+
*
|
|
4
|
+
* Converts Sanity Portable Text `content` arrays into well-structured
|
|
5
|
+
* Markdown using @portabletext/markdown. Includes custom renderers for the
|
|
6
|
+
* doc-platform's bespoke block types.
|
|
7
|
+
*
|
|
8
|
+
* Block type inventory (content field):
|
|
9
|
+
*
|
|
10
|
+
* Standard: block
|
|
11
|
+
* Code: codeBlock
|
|
12
|
+
* Tables: propertiesTable, tableBlock, methodTable
|
|
13
|
+
* Callouts: docsCallout
|
|
14
|
+
* Cards/Links: docsCardCollection, docsCallToAction
|
|
15
|
+
* Media: image, muxVideo, youtube, youtubePlaylist, codesandbox
|
|
16
|
+
* Other: docsPaidFeature, button, methodHeading
|
|
17
|
+
*/
|
|
18
|
+
import { DefaultHorizontalRuleRenderer, DefaultImageRenderer, portableTextToMarkdown, } from "@portabletext/markdown";
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Recursive helper – convert nested PT to markdown
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/**
|
|
23
|
+
* Convert a Sanity Portable Text `content` array to well-structured Markdown.
|
|
24
|
+
*/
|
|
25
|
+
export function toMarkdown(blocks) {
|
|
26
|
+
if (!blocks || blocks.length === 0) {
|
|
27
|
+
return "";
|
|
28
|
+
}
|
|
29
|
+
return portableTextToMarkdown(blocks, {
|
|
30
|
+
// --- Custom mark renderers ---
|
|
31
|
+
marks: {
|
|
32
|
+
link: renderLink,
|
|
33
|
+
},
|
|
34
|
+
// --- Custom type renderers ---
|
|
35
|
+
types: {
|
|
36
|
+
button: () => "",
|
|
37
|
+
// Code
|
|
38
|
+
codeBlock: renderCodeBlock,
|
|
39
|
+
codesandbox: ({ value }) => {
|
|
40
|
+
const v = value;
|
|
41
|
+
const url = v.url ?? "";
|
|
42
|
+
return url ? `[CodeSandbox](${url})` : "*[CodeSandbox]*";
|
|
43
|
+
},
|
|
44
|
+
// Callouts
|
|
45
|
+
docsCallout: renderDocsCallout,
|
|
46
|
+
docsCallToAction: ({ value }) => {
|
|
47
|
+
const title = value.title;
|
|
48
|
+
return title ? `**${title}**` : "";
|
|
49
|
+
},
|
|
50
|
+
// Cards / CTAs
|
|
51
|
+
docsCardCollection: renderDocsCardCollection,
|
|
52
|
+
// Skip / minimal rendering
|
|
53
|
+
docsPaidFeature: () => "",
|
|
54
|
+
"horizontal-rule": DefaultHorizontalRuleRenderer,
|
|
55
|
+
// Media — render a placeholder rather than dropping silently
|
|
56
|
+
image: DefaultImageRenderer,
|
|
57
|
+
methodHeading: renderMethodHeading,
|
|
58
|
+
methodTable: renderPropertiesTable, // Same shape
|
|
59
|
+
muxVideo: () => "*[Video]*",
|
|
60
|
+
// Tables
|
|
61
|
+
propertiesTable: renderPropertiesTable,
|
|
62
|
+
tableBlock: renderTableBlock,
|
|
63
|
+
youtube: ({ value }) => {
|
|
64
|
+
const v = value;
|
|
65
|
+
const url = v.url ?? "";
|
|
66
|
+
return url ? `[Video](${url})` : "*[Video]*";
|
|
67
|
+
},
|
|
68
|
+
youtubePlaylist: () => "*[YouTube Playlist]*",
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Custom type renderers
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
function nestedToMarkdown(blocks) {
|
|
76
|
+
if (!blocks || blocks.length === 0) {
|
|
77
|
+
return "";
|
|
78
|
+
}
|
|
79
|
+
return toMarkdown(blocks);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* CodeBlock
|
|
83
|
+
* Shape: { blocks: [{ code: { code, language }, filename }] }
|
|
84
|
+
*
|
|
85
|
+
* May contain multiple tabs (e.g. "Action" / "Mutation").
|
|
86
|
+
*/
|
|
87
|
+
function renderCodeBlock({ value, }) {
|
|
88
|
+
const blocks = (value.blocks ?? []);
|
|
89
|
+
return blocks
|
|
90
|
+
.map((b) => {
|
|
91
|
+
const code = b.code?.code ?? "";
|
|
92
|
+
const lang = b.code?.language ?? "";
|
|
93
|
+
const filename = b.filename ? ` (${b.filename})` : "";
|
|
94
|
+
return `\`\`\`${lang}${filename}\n${code}\n\`\`\``;
|
|
95
|
+
})
|
|
96
|
+
.join("\n\n");
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* DocsCallout
|
|
100
|
+
* Shape: { type: "warning"|"info"|..., title?: string, content: PT[] }
|
|
101
|
+
*/
|
|
102
|
+
function renderDocsCallout({ value, }) {
|
|
103
|
+
const type = value.type ?? "info";
|
|
104
|
+
const title = value.title;
|
|
105
|
+
const inner = nestedToMarkdown(value.content);
|
|
106
|
+
const label = title ?? type.charAt(0).toUpperCase() + type.slice(1);
|
|
107
|
+
const lines = inner.split("\n").map((l) => `> ${l}`);
|
|
108
|
+
return `> **${label}**\n>\n${lines.join("\n")}`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* DocsCardCollection
|
|
112
|
+
* Shape (after GROQ reference resolution):
|
|
113
|
+
* { cards: [{ title?, description?, resolvedTitle?, resolvedSlug?, url? }] }
|
|
114
|
+
*/
|
|
115
|
+
function renderDocsCardCollection({ value, }) {
|
|
116
|
+
const cards = (value.cards ?? []);
|
|
117
|
+
if (cards.length === 0) {
|
|
118
|
+
return "";
|
|
119
|
+
}
|
|
120
|
+
const rendered = cards
|
|
121
|
+
.map((c) => {
|
|
122
|
+
// oxlint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty strings should fall through to next candidate
|
|
123
|
+
const title = c.title || c.resolvedTitle || c.description;
|
|
124
|
+
if (!title) {
|
|
125
|
+
return null;
|
|
126
|
+
} // Skip cards with no meaningful content
|
|
127
|
+
const url = c.resolvedSlug
|
|
128
|
+
? `https://sanity.io/docs/${c.resolvedSlug}`
|
|
129
|
+
: (c.url ?? "");
|
|
130
|
+
const desc = c.description && c.description !== title ? ` — ${c.description}` : "";
|
|
131
|
+
return url ? `- [${title}](${url})${desc}` : `- **${title}**${desc}`;
|
|
132
|
+
})
|
|
133
|
+
.filter(Boolean);
|
|
134
|
+
return rendered.join("\n");
|
|
135
|
+
}
|
|
136
|
+
function renderLink({ children, value, }) {
|
|
137
|
+
const href = value?.url ?? value?.href ?? "";
|
|
138
|
+
return href ? `[${children}](${href})` : children;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* MethodTable / methodHeading — API method documentation
|
|
142
|
+
*/
|
|
143
|
+
function renderMethodHeading({ value, }) {
|
|
144
|
+
const name = value.name ?? "";
|
|
145
|
+
const signature = value.signature ?? "";
|
|
146
|
+
return signature ? `### \`${name}(${signature})\`` : `### \`${name}\``;
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Link mark renderer
|
|
150
|
+
//
|
|
151
|
+
// Sanity docs use `url` in the content field's link annotations.
|
|
152
|
+
// The library default only handles `href`. This handles `url` as well.
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
/**
|
|
155
|
+
* PropertiesTable
|
|
156
|
+
* Shape: { properties: [{ name, propertyDataType, explanation: PT[], isRequired? }] }
|
|
157
|
+
*/
|
|
158
|
+
function renderPropertiesTable({ value, }) {
|
|
159
|
+
const properties = (value.properties ?? []);
|
|
160
|
+
if (properties.length === 0) {
|
|
161
|
+
return "";
|
|
162
|
+
}
|
|
163
|
+
const rows = properties.map((p) => {
|
|
164
|
+
const name = p.name ?? "";
|
|
165
|
+
const type = p.propertyDataType ?? "";
|
|
166
|
+
const required = p.isRequired ? " **(required)**" : "";
|
|
167
|
+
const explanation = nestedToMarkdown(p.explanation)
|
|
168
|
+
.replace(/\n/g, " ")
|
|
169
|
+
.trim();
|
|
170
|
+
return `| \`${name}\`${required} | \`${type}\` | ${explanation} |`;
|
|
171
|
+
});
|
|
172
|
+
return [
|
|
173
|
+
"| Property | Type | Description |",
|
|
174
|
+
"|----------|------|-------------|",
|
|
175
|
+
...rows,
|
|
176
|
+
].join("\n");
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Public API
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
/**
|
|
182
|
+
* TableBlock
|
|
183
|
+
* Shape: { headerRow: boolean, title?: string, table: { rows: [{ cells: string[] }] } }
|
|
184
|
+
*/
|
|
185
|
+
function renderTableBlock({ value, }) {
|
|
186
|
+
const title = value.title;
|
|
187
|
+
const headerRow = value.headerRow;
|
|
188
|
+
const table = value.table;
|
|
189
|
+
const rows = table?.rows ?? [];
|
|
190
|
+
if (rows.length === 0) {
|
|
191
|
+
return "";
|
|
192
|
+
}
|
|
193
|
+
const lines = [];
|
|
194
|
+
if (title) {
|
|
195
|
+
lines.push(`**${title}**\n`);
|
|
196
|
+
}
|
|
197
|
+
rows.forEach((row, i) => {
|
|
198
|
+
const cells = (row.cells ?? []).map((c) => c.replace(/\|/g, "\\|"));
|
|
199
|
+
lines.push(`| ${cells.join(" | ")} |`);
|
|
200
|
+
if (i === 0 && headerRow) {
|
|
201
|
+
lines.push(`| ${cells.map(() => "---").join(" | ")} |`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
// If no header row marker yet, add one after the first row anyway
|
|
205
|
+
// So the markdown table is valid
|
|
206
|
+
if (!headerRow && rows.length > 0) {
|
|
207
|
+
const firstCells = rows[0].cells ?? [];
|
|
208
|
+
lines.splice(1, 0, `| ${firstCells.map(() => "---").join(" | ")} |`);
|
|
209
|
+
}
|
|
210
|
+
return lines.join("\n");
|
|
211
|
+
}
|