@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.
Files changed (530) hide show
  1. package/README.md +89 -0
  2. package/bin/ailf.js +64 -0
  3. package/canonical/grader-references/README.md +88 -0
  4. package/canonical/grader-references/groq.yaml +234 -0
  5. package/canonical/grader-references/studio-setup.yaml +275 -0
  6. package/canonical/reference-solutions/.gitkeep +1 -0
  7. package/canonical/reference-solutions/frameworks/nuxt.ts +119 -0
  8. package/canonical/reference-solutions/frameworks/remix.tsx +100 -0
  9. package/canonical/reference-solutions/functions/publish-webhook.ts +60 -0
  10. package/canonical/reference-solutions/groq/advanced-filtering.ts +379 -0
  11. package/canonical/reference-solutions/groq/blog-queries.ts +137 -0
  12. package/canonical/reference-solutions/groq/joins-references.ts +300 -0
  13. package/canonical/reference-solutions/nextjs/app-router-integration.tsx +128 -0
  14. package/canonical/reference-solutions/studio-setup/blog-schema.ts +143 -0
  15. package/canonical/reference-solutions/studio-setup/custom-tool.tsx +78 -0
  16. package/canonical/reference-solutions/visual-editing/live-preview.tsx +137 -0
  17. package/canonical/reference-solutions/visual-editing/presentation-nextjs.tsx +130 -0
  18. package/config/airbyte/ai_literacy_framework.connector.yaml +639 -0
  19. package/config/bigquery/README.md +74 -0
  20. package/config/bigquery/views/area_scores.sql +87 -0
  21. package/config/bigquery/views/reports.sql +49 -0
  22. package/config/features.yaml +116 -0
  23. package/config/models.yaml +115 -0
  24. package/config/prompts.yaml +75 -0
  25. package/config/rubrics.yaml +62 -0
  26. package/config/schedules.yaml +43 -0
  27. package/config/sinks.yaml +54 -0
  28. package/config/sources.yaml +51 -0
  29. package/config/thresholds.yaml +49 -0
  30. package/dist/_vendor/ailf-core/examples/index.d.ts +190 -0
  31. package/dist/_vendor/ailf-core/examples/index.js +285 -0
  32. package/dist/_vendor/ailf-core/index.d.ts +17 -0
  33. package/dist/_vendor/ailf-core/index.js +17 -0
  34. package/dist/_vendor/ailf-core/ports/cache-store.d.ts +72 -0
  35. package/dist/_vendor/ailf-core/ports/cache-store.js +17 -0
  36. package/dist/_vendor/ailf-core/ports/config-source.d.ts +33 -0
  37. package/dist/_vendor/ailf-core/ports/config-source.js +15 -0
  38. package/dist/_vendor/ailf-core/ports/context.d.ts +172 -0
  39. package/dist/_vendor/ailf-core/ports/context.js +14 -0
  40. package/dist/_vendor/ailf-core/ports/doc-fetcher.d.ts +131 -0
  41. package/dist/_vendor/ailf-core/ports/doc-fetcher.js +12 -0
  42. package/dist/_vendor/ailf-core/ports/eval-runner.d.ts +24 -0
  43. package/dist/_vendor/ailf-core/ports/eval-runner.js +8 -0
  44. package/dist/_vendor/ailf-core/ports/index.d.ts +15 -0
  45. package/dist/_vendor/ailf-core/ports/index.js +7 -0
  46. package/dist/_vendor/ailf-core/ports/logger.d.ts +36 -0
  47. package/dist/_vendor/ailf-core/ports/logger.js +11 -0
  48. package/dist/_vendor/ailf-core/ports/pipeline-step.d.ts +46 -0
  49. package/dist/_vendor/ailf-core/ports/pipeline-step.js +8 -0
  50. package/dist/_vendor/ailf-core/ports/task-source.d.ts +159 -0
  51. package/dist/_vendor/ailf-core/ports/task-source.js +72 -0
  52. package/dist/_vendor/ailf-core/schemas/callback-payload.d.ts +24 -0
  53. package/dist/_vendor/ailf-core/schemas/callback-payload.js +29 -0
  54. package/dist/_vendor/ailf-core/schemas/eval-config.d.ts +55 -0
  55. package/dist/_vendor/ailf-core/schemas/eval-config.js +78 -0
  56. package/dist/_vendor/ailf-core/schemas/index.d.ts +16 -0
  57. package/dist/_vendor/ailf-core/schemas/index.js +16 -0
  58. package/dist/_vendor/ailf-core/schemas/pipeline-request.d.ts +125 -0
  59. package/dist/_vendor/ailf-core/schemas/pipeline-request.js +67 -0
  60. package/dist/_vendor/ailf-core/schemas/pipeline.d.ts +531 -0
  61. package/dist/_vendor/ailf-core/schemas/pipeline.js +318 -0
  62. package/dist/_vendor/ailf-core/schemas/schedules.d.ts +68 -0
  63. package/dist/_vendor/ailf-core/schemas/schedules.js +74 -0
  64. package/dist/_vendor/ailf-core/schemas/sinks.d.ts +207 -0
  65. package/dist/_vendor/ailf-core/schemas/sinks.js +108 -0
  66. package/dist/_vendor/ailf-core/services/comparison-formatters.d.ts +18 -0
  67. package/dist/_vendor/ailf-core/services/comparison-formatters.js +189 -0
  68. package/dist/_vendor/ailf-core/services/config-helpers.d.ts +41 -0
  69. package/dist/_vendor/ailf-core/services/config-helpers.js +86 -0
  70. package/dist/_vendor/ailf-core/services/index.d.ts +12 -0
  71. package/dist/_vendor/ailf-core/services/index.js +12 -0
  72. package/dist/_vendor/ailf-core/services/scoring.d.ts +49 -0
  73. package/dist/_vendor/ailf-core/services/scoring.js +222 -0
  74. package/dist/_vendor/ailf-core/types/index.d.ts +1082 -0
  75. package/dist/_vendor/ailf-core/types/index.js +21 -0
  76. package/dist/_vendor/ailf-core/types/scoring-input.d.ts +54 -0
  77. package/dist/_vendor/ailf-core/types/scoring-input.js +9 -0
  78. package/dist/_vendor/ailf-shared/dimension-names.d.ts +21 -0
  79. package/dist/_vendor/ailf-shared/dimension-names.js +27 -0
  80. package/dist/_vendor/ailf-shared/document-ref.d.ts +29 -0
  81. package/dist/_vendor/ailf-shared/document-ref.js +1 -0
  82. package/dist/_vendor/ailf-shared/eval-modes.d.ts +12 -0
  83. package/dist/_vendor/ailf-shared/eval-modes.js +8 -0
  84. package/dist/_vendor/ailf-shared/index.d.ts +16 -0
  85. package/dist/_vendor/ailf-shared/index.js +16 -0
  86. package/dist/_vendor/ailf-shared/noise-threshold.d.ts +9 -0
  87. package/dist/_vendor/ailf-shared/noise-threshold.js +9 -0
  88. package/dist/_vendor/ailf-shared/score-grades.d.ts +17 -0
  89. package/dist/_vendor/ailf-shared/score-grades.js +23 -0
  90. package/dist/adapters/cache/content-lake-cache.d.ts +24 -0
  91. package/dist/adapters/cache/content-lake-cache.js +59 -0
  92. package/dist/adapters/cache/filesystem-cache.d.ts +18 -0
  93. package/dist/adapters/cache/filesystem-cache.js +54 -0
  94. package/dist/adapters/cache/index.d.ts +2 -0
  95. package/dist/adapters/cache/index.js +2 -0
  96. package/dist/adapters/config-sources/cli-config-adapter.d.ts +17 -0
  97. package/dist/adapters/config-sources/cli-config-adapter.js +23 -0
  98. package/dist/adapters/config-sources/file-config-adapter.d.ts +26 -0
  99. package/dist/adapters/config-sources/file-config-adapter.js +96 -0
  100. package/dist/adapters/config-sources/index.d.ts +2 -0
  101. package/dist/adapters/config-sources/index.js +2 -0
  102. package/dist/adapters/doc-fetchers/index.d.ts +1 -0
  103. package/dist/adapters/doc-fetchers/index.js +1 -0
  104. package/dist/adapters/doc-fetchers/sanity-doc-fetcher.d.ts +76 -0
  105. package/dist/adapters/doc-fetchers/sanity-doc-fetcher.js +620 -0
  106. package/dist/adapters/eval-runners/index.d.ts +1 -0
  107. package/dist/adapters/eval-runners/index.js +1 -0
  108. package/dist/adapters/eval-runners/promptfoo-eval-adapter.d.ts +14 -0
  109. package/dist/adapters/eval-runners/promptfoo-eval-adapter.js +63 -0
  110. package/dist/adapters/index.d.ts +12 -0
  111. package/dist/adapters/index.js +12 -0
  112. package/dist/adapters/loggers/console-logger.d.ts +22 -0
  113. package/dist/adapters/loggers/console-logger.js +54 -0
  114. package/dist/adapters/loggers/index.d.ts +9 -0
  115. package/dist/adapters/loggers/index.js +9 -0
  116. package/dist/adapters/loggers/json-logger.d.ts +18 -0
  117. package/dist/adapters/loggers/json-logger.js +33 -0
  118. package/dist/adapters/loggers/quiet-logger.d.ts +16 -0
  119. package/dist/adapters/loggers/quiet-logger.js +30 -0
  120. package/dist/adapters/task-sources/composite-task-source.d.ts +20 -0
  121. package/dist/adapters/task-sources/composite-task-source.js +59 -0
  122. package/dist/adapters/task-sources/content-lake-task-source.d.ts +20 -0
  123. package/dist/adapters/task-sources/content-lake-task-source.js +219 -0
  124. package/dist/adapters/task-sources/index.d.ts +7 -0
  125. package/dist/adapters/task-sources/index.js +7 -0
  126. package/dist/adapters/task-sources/repo-schemas.d.ts +245 -0
  127. package/dist/adapters/task-sources/repo-schemas.js +234 -0
  128. package/dist/adapters/task-sources/repo-task-source.d.ts +22 -0
  129. package/dist/adapters/task-sources/repo-task-source.js +104 -0
  130. package/dist/adapters/task-sources/repo-trigger.d.ts +52 -0
  131. package/dist/adapters/task-sources/repo-trigger.js +153 -0
  132. package/dist/adapters/task-sources/repo-validation.d.ts +49 -0
  133. package/dist/adapters/task-sources/repo-validation.js +164 -0
  134. package/dist/adapters/task-sources/yaml-task-source.d.ts +18 -0
  135. package/dist/adapters/task-sources/yaml-task-source.js +136 -0
  136. package/dist/agent-observer/agentic-provider.d.ts +132 -0
  137. package/dist/agent-observer/agentic-provider.js +983 -0
  138. package/dist/agent-observer/classifier.d.ts +62 -0
  139. package/dist/agent-observer/classifier.js +269 -0
  140. package/dist/agent-observer/index.d.ts +7 -0
  141. package/dist/agent-observer/index.js +4 -0
  142. package/dist/agent-observer/pricing.d.ts +35 -0
  143. package/dist/agent-observer/pricing.js +82 -0
  144. package/dist/agent-observer/provider.d.ts +77 -0
  145. package/dist/agent-observer/provider.js +151 -0
  146. package/dist/agent-observer/proxy.d.ts +91 -0
  147. package/dist/agent-observer/proxy.js +321 -0
  148. package/dist/agent-observer/test-imports.d.ts +7 -0
  149. package/dist/agent-observer/test-imports.js +185 -0
  150. package/dist/agent-observer/types.d.ts +137 -0
  151. package/dist/agent-observer/types.js +16 -0
  152. package/dist/assertions/source-isolation.d.ts +72 -0
  153. package/dist/assertions/source-isolation.js +117 -0
  154. package/dist/cli.d.ts +24 -0
  155. package/dist/cli.js +199 -0
  156. package/dist/commands/agent-report.d.ts +5 -0
  157. package/dist/commands/agent-report.js +69 -0
  158. package/dist/commands/baseline.d.ts +9 -0
  159. package/dist/commands/baseline.js +141 -0
  160. package/dist/commands/cache.d.ts +13 -0
  161. package/dist/commands/cache.js +135 -0
  162. package/dist/commands/calculate-scores.d.ts +8 -0
  163. package/dist/commands/calculate-scores.js +48 -0
  164. package/dist/commands/compare.d.ts +8 -0
  165. package/dist/commands/compare.js +120 -0
  166. package/dist/commands/completion.d.ts +18 -0
  167. package/dist/commands/completion.js +260 -0
  168. package/dist/commands/coverage-audit.d.ts +7 -0
  169. package/dist/commands/coverage-audit.js +40 -0
  170. package/dist/commands/discovery-report.d.ts +10 -0
  171. package/dist/commands/discovery-report.js +44 -0
  172. package/dist/commands/eval.d.ts +9 -0
  173. package/dist/commands/eval.js +35 -0
  174. package/dist/commands/explain-handler.d.ts +34 -0
  175. package/dist/commands/explain-handler.js +719 -0
  176. package/dist/commands/fetch-docs.d.ts +8 -0
  177. package/dist/commands/fetch-docs.js +128 -0
  178. package/dist/commands/generate-configs.d.ts +8 -0
  179. package/dist/commands/generate-configs.js +46 -0
  180. package/dist/commands/grader/index.d.ts +11 -0
  181. package/dist/commands/grader/index.js +118 -0
  182. package/dist/commands/init.d.ts +19 -0
  183. package/dist/commands/init.js +150 -0
  184. package/dist/commands/interactive.d.ts +12 -0
  185. package/dist/commands/interactive.js +238 -0
  186. package/dist/commands/lookup-doc.d.ts +15 -0
  187. package/dist/commands/lookup-doc.js +84 -0
  188. package/dist/commands/measure-retrieval.d.ts +5 -0
  189. package/dist/commands/measure-retrieval.js +65 -0
  190. package/dist/commands/pipeline-action.d.ts +71 -0
  191. package/dist/commands/pipeline-action.js +305 -0
  192. package/dist/commands/pipeline.d.ts +62 -0
  193. package/dist/commands/pipeline.js +53 -0
  194. package/dist/commands/pr-comment.d.ts +8 -0
  195. package/dist/commands/pr-comment.js +47 -0
  196. package/dist/commands/publish.d.ts +26 -0
  197. package/dist/commands/publish.js +253 -0
  198. package/dist/commands/readiness-report.d.ts +10 -0
  199. package/dist/commands/readiness-report.js +104 -0
  200. package/dist/commands/shared/options.d.ts +29 -0
  201. package/dist/commands/shared/options.js +57 -0
  202. package/dist/commands/update-quality-scores.d.ts +5 -0
  203. package/dist/commands/update-quality-scores.js +20 -0
  204. package/dist/commands/validate-tasks.d.ts +16 -0
  205. package/dist/commands/validate-tasks.js +93 -0
  206. package/dist/commands/validate.d.ts +9 -0
  207. package/dist/commands/validate.js +73 -0
  208. package/dist/commands/webhook-server.d.ts +5 -0
  209. package/dist/commands/webhook-server.js +30 -0
  210. package/dist/commands/weekly-digest.d.ts +10 -0
  211. package/dist/commands/weekly-digest.js +104 -0
  212. package/dist/composition-root.d.ts +26 -0
  213. package/dist/composition-root.js +107 -0
  214. package/dist/interpolate.d.ts +26 -0
  215. package/dist/interpolate.js +70 -0
  216. package/dist/job-store.d.ts +104 -0
  217. package/dist/job-store.js +188 -0
  218. package/dist/lib/agent-behavior-report.d.ts +8 -0
  219. package/dist/lib/agent-behavior-report.js +185 -0
  220. package/dist/lib/baseline.d.ts +19 -0
  221. package/dist/lib/baseline.js +153 -0
  222. package/dist/lib/calculate-scores.d.ts +23 -0
  223. package/dist/lib/calculate-scores.js +42 -0
  224. package/dist/lib/compare.d.ts +18 -0
  225. package/dist/lib/compare.js +170 -0
  226. package/dist/lib/coverage-audit.d.ts +4 -0
  227. package/dist/lib/coverage-audit.js +42 -0
  228. package/dist/lib/discovery-report.d.ts +13 -0
  229. package/dist/lib/discovery-report.js +57 -0
  230. package/dist/lib/fetch-docs.d.ts +30 -0
  231. package/dist/lib/fetch-docs.js +171 -0
  232. package/dist/lib/generate-configs.d.ts +25 -0
  233. package/dist/lib/generate-configs.js +42 -0
  234. package/dist/lib/grader-api.d.ts +21 -0
  235. package/dist/lib/grader-api.js +34 -0
  236. package/dist/lib/grader-compare.d.ts +19 -0
  237. package/dist/lib/grader-compare.js +91 -0
  238. package/dist/lib/grader-consistency.d.ts +27 -0
  239. package/dist/lib/grader-consistency.js +79 -0
  240. package/dist/lib/grader-sensitivity.d.ts +19 -0
  241. package/dist/lib/grader-sensitivity.js +75 -0
  242. package/dist/lib/grader-validate.d.ts +19 -0
  243. package/dist/lib/grader-validate.js +78 -0
  244. package/dist/lib/measure-retrieval.d.ts +14 -0
  245. package/dist/lib/measure-retrieval.js +71 -0
  246. package/dist/lib/pr-comment.d.ts +16 -0
  247. package/dist/lib/pr-comment.js +28 -0
  248. package/dist/lib/readiness-report.d.ts +13 -0
  249. package/dist/lib/readiness-report.js +108 -0
  250. package/dist/lib/webhook-server.d.ts +11 -0
  251. package/dist/lib/webhook-server.js +24 -0
  252. package/dist/lib/weekly-digest.d.ts +24 -0
  253. package/dist/lib/weekly-digest.js +148 -0
  254. package/dist/orchestration/build-app-context.d.ts +27 -0
  255. package/dist/orchestration/build-app-context.js +81 -0
  256. package/dist/orchestration/build-step-sequence.d.ts +15 -0
  257. package/dist/orchestration/build-step-sequence.js +84 -0
  258. package/dist/orchestration/config-to-source-overrides.d.ts +9 -0
  259. package/dist/orchestration/config-to-source-overrides.js +28 -0
  260. package/dist/orchestration/env-bridge.d.ts +21 -0
  261. package/dist/orchestration/env-bridge.js +66 -0
  262. package/dist/orchestration/index.d.ts +11 -0
  263. package/dist/orchestration/index.js +11 -0
  264. package/dist/orchestration/pipeline-orchestrator.d.ts +24 -0
  265. package/dist/orchestration/pipeline-orchestrator.js +153 -0
  266. package/dist/orchestration/step-runner.d.ts +20 -0
  267. package/dist/orchestration/step-runner.js +88 -0
  268. package/dist/orchestration/steps/calculate-scores-step.d.ts +13 -0
  269. package/dist/orchestration/steps/calculate-scores-step.js +95 -0
  270. package/dist/orchestration/steps/callback-step.d.ts +24 -0
  271. package/dist/orchestration/steps/callback-step.js +76 -0
  272. package/dist/orchestration/steps/compare-step.d.ts +14 -0
  273. package/dist/orchestration/steps/compare-step.js +92 -0
  274. package/dist/orchestration/steps/discovery-report-step.d.ts +13 -0
  275. package/dist/orchestration/steps/discovery-report-step.js +55 -0
  276. package/dist/orchestration/steps/fetch-docs-shell.d.ts +17 -0
  277. package/dist/orchestration/steps/fetch-docs-shell.js +30 -0
  278. package/dist/orchestration/steps/fetch-docs-step.d.ts +14 -0
  279. package/dist/orchestration/steps/fetch-docs-step.js +135 -0
  280. package/dist/orchestration/steps/gap-analysis-step.d.ts +16 -0
  281. package/dist/orchestration/steps/gap-analysis-step.js +136 -0
  282. package/dist/orchestration/steps/generate-configs-step.d.ts +14 -0
  283. package/dist/orchestration/steps/generate-configs-step.js +85 -0
  284. package/dist/orchestration/steps/grader-consistency-step.d.ts +13 -0
  285. package/dist/orchestration/steps/grader-consistency-step.js +64 -0
  286. package/dist/orchestration/steps/index.d.ts +19 -0
  287. package/dist/orchestration/steps/index.js +19 -0
  288. package/dist/orchestration/steps/mirror-repo-tasks-step.d.ts +21 -0
  289. package/dist/orchestration/steps/mirror-repo-tasks-step.js +94 -0
  290. package/dist/orchestration/steps/publish-report-step.d.ts +26 -0
  291. package/dist/orchestration/steps/publish-report-step.js +216 -0
  292. package/dist/orchestration/steps/readiness-step.d.ts +13 -0
  293. package/dist/orchestration/steps/readiness-step.js +91 -0
  294. package/dist/orchestration/steps/report-step.d.ts +12 -0
  295. package/dist/orchestration/steps/report-step.js +49 -0
  296. package/dist/orchestration/steps/run-eval-step.d.ts +17 -0
  297. package/dist/orchestration/steps/run-eval-step.js +195 -0
  298. package/dist/orchestration/steps/validate-step.d.ts +12 -0
  299. package/dist/orchestration/steps/validate-step.js +41 -0
  300. package/dist/pipeline/agent-behavior-report.d.ts +53 -0
  301. package/dist/pipeline/agent-behavior-report.js +132 -0
  302. package/dist/pipeline/attribution.d.ts +47 -0
  303. package/dist/pipeline/attribution.js +226 -0
  304. package/dist/pipeline/baseline.d.ts +37 -0
  305. package/dist/pipeline/baseline.js +141 -0
  306. package/dist/pipeline/cache.d.ts +101 -0
  307. package/dist/pipeline/cache.js +283 -0
  308. package/dist/pipeline/calculate-scores.d.ts +102 -0
  309. package/dist/pipeline/calculate-scores.js +1128 -0
  310. package/dist/pipeline/callback-delivery.d.ts +50 -0
  311. package/dist/pipeline/callback-delivery.js +89 -0
  312. package/dist/pipeline/checks.d.ts +39 -0
  313. package/dist/pipeline/checks.js +280 -0
  314. package/dist/pipeline/classify-url.d.ts +61 -0
  315. package/dist/pipeline/classify-url.js +93 -0
  316. package/dist/pipeline/compare.d.ts +31 -0
  317. package/dist/pipeline/compare.js +208 -0
  318. package/dist/pipeline/coverage-audit.d.ts +39 -0
  319. package/dist/pipeline/coverage-audit.js +165 -0
  320. package/dist/pipeline/degradations.d.ts +85 -0
  321. package/dist/pipeline/degradations.js +242 -0
  322. package/dist/pipeline/discovery-report.d.ts +55 -0
  323. package/dist/pipeline/discovery-report.js +178 -0
  324. package/dist/pipeline/eval-constants.d.ts +68 -0
  325. package/dist/pipeline/eval-constants.js +111 -0
  326. package/dist/pipeline/eval-fingerprint.d.ts +66 -0
  327. package/dist/pipeline/eval-fingerprint.js +175 -0
  328. package/dist/pipeline/expand-tasks.d.ts +220 -0
  329. package/dist/pipeline/expand-tasks.js +421 -0
  330. package/dist/pipeline/failure-modes.d.ts +46 -0
  331. package/dist/pipeline/failure-modes.js +348 -0
  332. package/dist/pipeline/fetch-url-content.d.ts +44 -0
  333. package/dist/pipeline/fetch-url-content.js +93 -0
  334. package/dist/pipeline/gap-analysis.d.ts +48 -0
  335. package/dist/pipeline/gap-analysis.js +231 -0
  336. package/dist/pipeline/generate-configs.d.ts +72 -0
  337. package/dist/pipeline/generate-configs.js +395 -0
  338. package/dist/pipeline/grader-api.d.ts +49 -0
  339. package/dist/pipeline/grader-api.js +200 -0
  340. package/dist/pipeline/grader-compare-runner.d.ts +44 -0
  341. package/dist/pipeline/grader-compare-runner.js +301 -0
  342. package/dist/pipeline/grader-comparison.d.ts +111 -0
  343. package/dist/pipeline/grader-comparison.js +161 -0
  344. package/dist/pipeline/grader-consistency-runner.d.ts +60 -0
  345. package/dist/pipeline/grader-consistency-runner.js +270 -0
  346. package/dist/pipeline/grader-consistency.d.ts +103 -0
  347. package/dist/pipeline/grader-consistency.js +146 -0
  348. package/dist/pipeline/grader-sensitivity-runner.d.ts +40 -0
  349. package/dist/pipeline/grader-sensitivity-runner.js +282 -0
  350. package/dist/pipeline/grader-sensitivity.d.ts +94 -0
  351. package/dist/pipeline/grader-sensitivity.js +144 -0
  352. package/dist/pipeline/grader-validate-runner.d.ts +38 -0
  353. package/dist/pipeline/grader-validate-runner.js +229 -0
  354. package/dist/pipeline/grader-validation.d.ts +107 -0
  355. package/dist/pipeline/grader-validation.js +169 -0
  356. package/dist/pipeline/map-request-to-config.d.ts +19 -0
  357. package/dist/pipeline/map-request-to-config.js +80 -0
  358. package/dist/pipeline/measure-retrieval.d.ts +59 -0
  359. package/dist/pipeline/measure-retrieval.js +111 -0
  360. package/dist/pipeline/mirror-repo-tasks.d.ts +86 -0
  361. package/dist/pipeline/mirror-repo-tasks.js +350 -0
  362. package/dist/pipeline/plan-format.d.ts +33 -0
  363. package/dist/pipeline/plan-format.js +202 -0
  364. package/dist/pipeline/plan.d.ts +169 -0
  365. package/dist/pipeline/plan.js +708 -0
  366. package/dist/pipeline/pr-comment.d.ts +19 -0
  367. package/dist/pipeline/pr-comment.js +502 -0
  368. package/dist/pipeline/probe.d.ts +52 -0
  369. package/dist/pipeline/probe.js +390 -0
  370. package/dist/pipeline/provenance.d.ts +47 -0
  371. package/dist/pipeline/provenance.js +146 -0
  372. package/dist/pipeline/readiness-report.d.ts +87 -0
  373. package/dist/pipeline/readiness-report.js +205 -0
  374. package/dist/pipeline/release-classification.d.ts +54 -0
  375. package/dist/pipeline/release-classification.js +238 -0
  376. package/dist/pipeline/release-report.d.ts +37 -0
  377. package/dist/pipeline/release-report.js +222 -0
  378. package/dist/pipeline/repo-eval-comment.d.ts +37 -0
  379. package/dist/pipeline/repo-eval-comment.js +165 -0
  380. package/dist/pipeline/repo-threshold-evaluator.d.ts +89 -0
  381. package/dist/pipeline/repo-threshold-evaluator.js +162 -0
  382. package/dist/pipeline/resolve-mappings.d.ts +35 -0
  383. package/dist/pipeline/resolve-mappings.js +72 -0
  384. package/dist/pipeline/retrieval-metrics.d.ts +39 -0
  385. package/dist/pipeline/retrieval-metrics.js +136 -0
  386. package/dist/pipeline/reverse-mapping.d.ts +67 -0
  387. package/dist/pipeline/reverse-mapping.js +88 -0
  388. package/dist/pipeline/schemas.d.ts +9 -0
  389. package/dist/pipeline/schemas.js +9 -0
  390. package/dist/pipeline/steps/calculate-scores-step.d.ts +11 -0
  391. package/dist/pipeline/steps/calculate-scores-step.js +89 -0
  392. package/dist/pipeline/steps/compare-step.d.ts +18 -0
  393. package/dist/pipeline/steps/compare-step.js +90 -0
  394. package/dist/pipeline/steps/eval-step.d.ts +53 -0
  395. package/dist/pipeline/steps/eval-step.js +347 -0
  396. package/dist/pipeline/steps/fetch-docs-step.d.ts +11 -0
  397. package/dist/pipeline/steps/fetch-docs-step.js +84 -0
  398. package/dist/pipeline/steps/generate-configs-step.d.ts +11 -0
  399. package/dist/pipeline/steps/generate-configs-step.js +98 -0
  400. package/dist/pipeline/steps/grader-consistency-step.d.ts +21 -0
  401. package/dist/pipeline/steps/grader-consistency-step.js +74 -0
  402. package/dist/pipeline/steps/publish-report-step.d.ts +57 -0
  403. package/dist/pipeline/steps/publish-report-step.js +243 -0
  404. package/dist/pipeline/steps/report-step.d.ts +13 -0
  405. package/dist/pipeline/steps/report-step.js +56 -0
  406. package/dist/pipeline/steps/update-scores-step.d.ts +11 -0
  407. package/dist/pipeline/steps/update-scores-step.js +42 -0
  408. package/dist/pipeline/targeted-loo.d.ts +88 -0
  409. package/dist/pipeline/targeted-loo.js +203 -0
  410. package/dist/pipeline/thresholds.d.ts +27 -0
  411. package/dist/pipeline/thresholds.js +245 -0
  412. package/dist/pipeline/types.d.ts +10 -0
  413. package/dist/pipeline/types.js +10 -0
  414. package/dist/pipeline/validate.d.ts +67 -0
  415. package/dist/pipeline/validate.js +406 -0
  416. package/dist/pipeline/webhook-server.d.ts +37 -0
  417. package/dist/pipeline/webhook-server.js +133 -0
  418. package/dist/report-store.d.ts +84 -0
  419. package/dist/report-store.js +208 -0
  420. package/dist/sanity/client.d.ts +38 -0
  421. package/dist/sanity/client.js +86 -0
  422. package/dist/sanity/portable-text.d.ts +11 -0
  423. package/dist/sanity/portable-text.js +211 -0
  424. package/dist/sanity/queries.d.ts +133 -0
  425. package/dist/sanity/queries.js +300 -0
  426. package/dist/schedules/digest.d.ts +116 -0
  427. package/dist/schedules/digest.js +156 -0
  428. package/dist/schedules/index.d.ts +12 -0
  429. package/dist/schedules/index.js +10 -0
  430. package/dist/schedules/loader.d.ts +31 -0
  431. package/dist/schedules/loader.js +73 -0
  432. package/dist/schedules/schema.d.ts +9 -0
  433. package/dist/schedules/schema.js +9 -0
  434. package/dist/scripts/agent-behavior-report.d.ts +19 -0
  435. package/dist/scripts/agent-behavior-report.js +315 -0
  436. package/dist/scripts/baseline.d.ts +43 -0
  437. package/dist/scripts/baseline.js +267 -0
  438. package/dist/scripts/calculate-scores.d.ts +166 -0
  439. package/dist/scripts/calculate-scores.js +1296 -0
  440. package/dist/scripts/compare.d.ts +22 -0
  441. package/dist/scripts/compare.js +334 -0
  442. package/dist/scripts/coverage-audit.d.ts +44 -0
  443. package/dist/scripts/coverage-audit.js +209 -0
  444. package/dist/scripts/debug-eval.d.ts +19 -0
  445. package/dist/scripts/debug-eval.js +73 -0
  446. package/dist/scripts/discovery-report.d.ts +58 -0
  447. package/dist/scripts/discovery-report.js +250 -0
  448. package/dist/scripts/fetch-docs.d.ts +35 -0
  449. package/dist/scripts/fetch-docs.js +472 -0
  450. package/dist/scripts/generate-configs.d.ts +66 -0
  451. package/dist/scripts/generate-configs.js +459 -0
  452. package/dist/scripts/grader-api.d.ts +27 -0
  453. package/dist/scripts/grader-api.js +206 -0
  454. package/dist/scripts/grader-compare.d.ts +22 -0
  455. package/dist/scripts/grader-compare.js +368 -0
  456. package/dist/scripts/grader-consistency.d.ts +20 -0
  457. package/dist/scripts/grader-consistency.js +313 -0
  458. package/dist/scripts/grader-sensitivity.d.ts +22 -0
  459. package/dist/scripts/grader-sensitivity.js +354 -0
  460. package/dist/scripts/grader-validate.d.ts +19 -0
  461. package/dist/scripts/grader-validate.js +267 -0
  462. package/dist/scripts/measure-retrieval.d.ts +10 -0
  463. package/dist/scripts/measure-retrieval.js +145 -0
  464. package/dist/scripts/migrate-tasks-to-content-lake.d.ts +24 -0
  465. package/dist/scripts/migrate-tasks-to-content-lake.js +327 -0
  466. package/dist/scripts/pipeline.d.ts +76 -0
  467. package/dist/scripts/pipeline.js +1031 -0
  468. package/dist/scripts/pr-comment.d.ts +10 -0
  469. package/dist/scripts/pr-comment.js +510 -0
  470. package/dist/scripts/readiness-report.d.ts +88 -0
  471. package/dist/scripts/readiness-report.js +342 -0
  472. package/dist/scripts/update-quality-scores.d.ts +15 -0
  473. package/dist/scripts/update-quality-scores.js +184 -0
  474. package/dist/scripts/validate-task-sources.d.ts +21 -0
  475. package/dist/scripts/validate-task-sources.js +210 -0
  476. package/dist/scripts/validate.d.ts +13 -0
  477. package/dist/scripts/validate.js +79 -0
  478. package/dist/scripts/webhook-server.d.ts +26 -0
  479. package/dist/scripts/webhook-server.js +147 -0
  480. package/dist/scripts/weekly-digest.d.ts +24 -0
  481. package/dist/scripts/weekly-digest.js +144 -0
  482. package/dist/sinks/bigquery/index.d.ts +131 -0
  483. package/dist/sinks/bigquery/index.js +222 -0
  484. package/dist/sinks/format-slack.d.ts +64 -0
  485. package/dist/sinks/format-slack.js +306 -0
  486. package/dist/sinks/index.d.ts +23 -0
  487. package/dist/sinks/index.js +18 -0
  488. package/dist/sinks/loader.d.ts +18 -0
  489. package/dist/sinks/loader.js +82 -0
  490. package/dist/sinks/retry.d.ts +24 -0
  491. package/dist/sinks/retry.js +52 -0
  492. package/dist/sinks/schema.d.ts +9 -0
  493. package/dist/sinks/schema.js +9 -0
  494. package/dist/sinks/slack/format.d.ts +65 -0
  495. package/dist/sinks/slack/format.js +327 -0
  496. package/dist/sinks/slack/index.d.ts +27 -0
  497. package/dist/sinks/slack/index.js +78 -0
  498. package/dist/sinks/slack-sink.d.ts +27 -0
  499. package/dist/sinks/slack-sink.js +78 -0
  500. package/dist/sinks/types.d.ts +59 -0
  501. package/dist/sinks/types.js +44 -0
  502. package/dist/sinks/webhook/index.d.ts +19 -0
  503. package/dist/sinks/webhook/index.js +50 -0
  504. package/dist/sinks/webhook-sink.d.ts +19 -0
  505. package/dist/sinks/webhook-sink.js +50 -0
  506. package/dist/sources.d.ts +104 -0
  507. package/dist/sources.js +292 -0
  508. package/dist/webhook/budget.d.ts +42 -0
  509. package/dist/webhook/budget.js +60 -0
  510. package/dist/webhook/debounce.d.ts +67 -0
  511. package/dist/webhook/debounce.js +76 -0
  512. package/dist/webhook/dispatch.d.ts +45 -0
  513. package/dist/webhook/dispatch.js +84 -0
  514. package/dist/webhook/eval-request-handler.d.ts +87 -0
  515. package/dist/webhook/eval-request-handler.js +181 -0
  516. package/dist/webhook/handler.d.ts +88 -0
  517. package/dist/webhook/handler.js +203 -0
  518. package/dist/webhook/index.d.ts +17 -0
  519. package/dist/webhook/index.js +12 -0
  520. package/dist/webhook/types.d.ts +109 -0
  521. package/dist/webhook/types.js +10 -0
  522. package/package.json +72 -0
  523. package/tasks/.expanded.agentic.yaml +51 -0
  524. package/tasks/.expanded.yaml +66 -0
  525. package/tasks/frameworks.yaml +98 -0
  526. package/tasks/functions.yaml +51 -0
  527. package/tasks/groq.yaml +216 -0
  528. package/tasks/nextjs-live.yaml +62 -0
  529. package/tasks/studio-setup.yaml +111 -0
  530. 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
+ }