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