@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,73 @@
1
+ /**
2
+ * validate command — checks pipeline configuration consistency.
3
+ *
4
+ * Validates all YAML files, task-to-mapping cross-references, reference
5
+ * solutions, context files, and environment variables.
6
+ *
7
+ */
8
+ import { Command } from "commander";
9
+ import { dirname, resolve } from "path";
10
+ import { fileURLToPath } from "url";
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const ROOT = resolve(__dirname, "..", "..");
13
+ export function createValidateCommand() {
14
+ return new Command("validate")
15
+ .description("Validate pipeline configuration")
16
+ .option("--strict", "Treat warnings as errors", false)
17
+ .option("--contexts", "Check that context files exist", false)
18
+ .action(async (opts) => {
19
+ const { validateConfiguration } = await import("../pipeline/validate.js");
20
+ const { checkContextsExist, checkEnvironment } = await import("../pipeline/checks.js");
21
+ console.log("=== ai-literacy-framework — Configuration Validator ===\n");
22
+ const result = validateConfiguration(ROOT);
23
+ // Optionally check contexts
24
+ if (opts.contexts) {
25
+ const { ALL_FEATURE_AREAS } = await import("../sanity/queries.js");
26
+ const contextIssues = checkContextsExist(ROOT, ALL_FEATURE_AREAS);
27
+ result.issues.push(...contextIssues);
28
+ result.valid =
29
+ result.valid && contextIssues.every((i) => i.severity !== "error");
30
+ }
31
+ // Check environment
32
+ const envIssues = checkEnvironment(ROOT);
33
+ result.issues.push(...envIssues);
34
+ // Report results
35
+ const errors = result.issues.filter((i) => i.severity === "error");
36
+ const warnings = result.issues.filter((i) => i.severity === "warning");
37
+ if (errors.length > 0) {
38
+ console.log(`❌ ${errors.length} error(s):\n`);
39
+ for (const issue of errors) {
40
+ console.log(` ERROR [${issue.source}] ${issue.message}`);
41
+ if (issue.path)
42
+ console.log(` at ${issue.path}`);
43
+ }
44
+ console.log();
45
+ }
46
+ if (warnings.length > 0) {
47
+ console.log(`⚠️ ${warnings.length} warning(s):\n`);
48
+ for (const issue of warnings) {
49
+ console.log(` WARN [${issue.source}] ${issue.message}`);
50
+ if (issue.path)
51
+ console.log(` at ${issue.path}`);
52
+ }
53
+ console.log();
54
+ }
55
+ if (errors.length === 0 && warnings.length === 0) {
56
+ console.log("✅ All checks passed — configuration is valid.\n");
57
+ }
58
+ if (errors.length === 0 && warnings.length > 0) {
59
+ console.log(`✅ Configuration is valid (${warnings.length} warning(s)).\n`);
60
+ }
61
+ // In strict mode, warnings are treated as errors
62
+ const exitCode = opts.strict
63
+ ? result.issues.length > 0
64
+ ? 1
65
+ : 0
66
+ : errors.length > 0
67
+ ? 1
68
+ : 0;
69
+ if (exitCode !== 0) {
70
+ process.exit(exitCode);
71
+ }
72
+ });
73
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * webhook-server command — local development server for webhook testing.
3
+ */
4
+ import { Command } from "commander";
5
+ export declare function createWebhookServerCommand(): Command;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * webhook-server command — local development server for webhook testing.
3
+ */
4
+ import { dirname, resolve } from "path";
5
+ import { fileURLToPath } from "url";
6
+ import { Command } from "commander";
7
+ import { startWebhookServer } from "../pipeline/webhook-server.js";
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ const ROOT = resolve(__dirname, "..", "..");
10
+ export function createWebhookServerCommand() {
11
+ return new Command("webhook-server")
12
+ .description("Start a local webhook development server for testing triggers")
13
+ .option("-p, --port <port>", "Server port", parseInt)
14
+ .action(async (opts) => {
15
+ try {
16
+ startWebhookServer({
17
+ dailyBudget: parseInt(process.env.WEBHOOK_DAILY_BUDGET ?? "20", 10),
18
+ debounceMs: parseInt(process.env.WEBHOOK_DEBOUNCE_MS ?? "10000", 10),
19
+ githubToken: process.env.GITHUB_TOKEN ?? "",
20
+ port: opts.port ?? parseInt(process.env.WEBHOOK_PORT ?? "3333", 10),
21
+ rootDir: ROOT,
22
+ });
23
+ }
24
+ catch (err) {
25
+ process.exitCode = 1;
26
+ if (err instanceof Error)
27
+ console.error(err.message);
28
+ }
29
+ });
30
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * weekly-digest command — generates and delivers a weekly evaluation digest.
3
+ *
4
+ * Queries the Sanity Content Lake for reports within the configured
5
+ * lookback window, computes trend analysis, and delivers the digest
6
+ * via Slack or stdout.
7
+ *
8
+ */
9
+ import { Command } from "commander";
10
+ export declare function createWeeklyDigestCommand(): Command;
@@ -0,0 +1,104 @@
1
+ /**
2
+ * weekly-digest command — generates and delivers a weekly evaluation digest.
3
+ *
4
+ * Queries the Sanity Content Lake for reports within the configured
5
+ * lookback window, computes trend analysis, and delivers the digest
6
+ * via Slack or stdout.
7
+ *
8
+ */
9
+ import { Command } from "commander";
10
+ export function createWeeklyDigestCommand() {
11
+ return new Command("weekly-digest")
12
+ .description("Generate and deliver a weekly evaluation digest")
13
+ .option("-n, --dry-run", "Print to stdout only, do not send to Slack", false)
14
+ .option("--lookback <days>", "Lookback window in days (default: from config or 7)", parseInt)
15
+ .option("--json", "Output raw JSON digest data", false)
16
+ .action(async (opts) => {
17
+ const { generateDigest } = await import("../schedules/digest.js");
18
+ const { getDigestConfig } = await import("../schedules/loader.js");
19
+ const { formatWeeklyDigest } = await import("../sinks/slack/format.js");
20
+ console.log();
21
+ console.log("=== AI Literacy Weekly Digest ===");
22
+ console.log();
23
+ // Load digest config
24
+ const digestConfig = getDigestConfig();
25
+ const lookbackDays = opts.lookback ?? digestConfig?.lookbackDays ?? 7;
26
+ console.log(` Lookback: ${lookbackDays} days`);
27
+ console.log(` Mode: ${opts.dryRun ? "dry run (stdout only)" : "live"}`);
28
+ console.log();
29
+ // Generate digest — uses AILF_REPORT_* env vars for report store access
30
+ const digest = await generateDigest({
31
+ dataset: process.env.AILF_REPORT_DATASET,
32
+ lookbackDays,
33
+ projectId: process.env.AILF_REPORT_PROJECT_ID,
34
+ token: process.env.AILF_REPORT_SANITY_API_TOKEN ??
35
+ process.env.SANITY_API_TOKEN,
36
+ });
37
+ if (!digest) {
38
+ console.log(" No reports found in the lookback window. Nothing to send.");
39
+ process.exit(0);
40
+ }
41
+ // Output summary
42
+ console.log(` Reports found: ${digest.reportCount}`);
43
+ console.log(` Overall: ${Math.round(digest.overallLatest)} (${digest.overallTrend})`);
44
+ console.log(` Improved: ${digest.improved.join(", ") || "none"}`);
45
+ console.log(` Regressed: ${digest.regressed.join(", ") || "none"}`);
46
+ console.log(` Stable: ${digest.stable.join(", ") || "none"}`);
47
+ console.log();
48
+ if (opts.json) {
49
+ console.log(JSON.stringify(digest, null, 2));
50
+ return;
51
+ }
52
+ // Format for Slack
53
+ const message = formatWeeklyDigest(digest);
54
+ if (opts.dryRun) {
55
+ console.log(" --- Slack Message Preview ---");
56
+ console.log(` Text: ${message.text}`);
57
+ console.log();
58
+ for (const block of message.blocks) {
59
+ if (block.text) {
60
+ console.log(` [${block.type}] ${block.text.text}`);
61
+ }
62
+ if (block.fields) {
63
+ for (const field of block.fields) {
64
+ console.log(` [field] ${field.text}`);
65
+ }
66
+ }
67
+ if (block.elements) {
68
+ for (const el of block.elements) {
69
+ console.log(` [element] ${el.text}`);
70
+ }
71
+ }
72
+ }
73
+ console.log();
74
+ return;
75
+ }
76
+ // Deliver via Slack
77
+ const webhookUrl = digestConfig?.slackWebhookUrl ?? process.env.SLACK_WEBHOOK_URL;
78
+ if (!webhookUrl) {
79
+ console.warn(" ⚠️ No Slack webhook URL configured. Set SLACK_WEBHOOK_URL or configure in schedules.yaml");
80
+ console.log(" Printing digest to stdout instead:");
81
+ console.log();
82
+ console.log(` ${message.text}`);
83
+ return;
84
+ }
85
+ console.log(" Sending to Slack...");
86
+ try {
87
+ const response = await fetch(webhookUrl, {
88
+ body: JSON.stringify(message),
89
+ headers: { "Content-Type": "application/json" },
90
+ method: "POST",
91
+ });
92
+ if (response.ok) {
93
+ console.log(" ✅ Digest sent successfully");
94
+ }
95
+ else {
96
+ const text = await response.text();
97
+ console.warn(` ⚠️ Slack delivery failed: ${response.status} ${text}`);
98
+ }
99
+ }
100
+ catch (error) {
101
+ console.warn(` ⚠️ Slack delivery error: ${error instanceof Error ? error.message : String(error)}`);
102
+ }
103
+ });
104
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Composition Root — the single place that knows about all concrete adapters.
3
+ *
4
+ * Creates a fully wired AppContext from resolved configuration.
5
+ * This function is called ONCE per CLI invocation, at the top of each
6
+ * command's action handler.
7
+ *
8
+ * Design principle: no DI container, no decorators, no reflection.
9
+ * Just a plain factory function that builds a plain object.
10
+ *
11
+ * Why this exists:
12
+ * - Before: each command constructs its own adapters (scattered coupling)
13
+ * - After: one factory, one place to change adapter wiring
14
+ *
15
+ * @see packages/core/src/ports/context.ts — AppContext interface
16
+ * @see docs/exec-plans/active/ports-and-adapters/phase-7-composition-root.md
17
+ */
18
+ import type { AppContext, ResolvedConfig } from "./_vendor/ailf-core/index.d.ts";
19
+ /**
20
+ * Create a fully wired AppContext from resolved configuration.
21
+ *
22
+ * Every adapter is constructed here and nowhere else (outside of tests).
23
+ * Swapping an adapter (e.g., YamlTaskSource → ContentLakeTaskSource)
24
+ * is a one-line change in this function.
25
+ */
26
+ export declare function createAppContext(config: ResolvedConfig): AppContext;
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Composition Root — the single place that knows about all concrete adapters.
3
+ *
4
+ * Creates a fully wired AppContext from resolved configuration.
5
+ * This function is called ONCE per CLI invocation, at the top of each
6
+ * command's action handler.
7
+ *
8
+ * Design principle: no DI container, no decorators, no reflection.
9
+ * Just a plain factory function that builds a plain object.
10
+ *
11
+ * Why this exists:
12
+ * - Before: each command constructs its own adapters (scattered coupling)
13
+ * - After: one factory, one place to change adapter wiring
14
+ *
15
+ * @see packages/core/src/ports/context.ts — AppContext interface
16
+ * @see docs/exec-plans/active/ports-and-adapters/phase-7-composition-root.md
17
+ */
18
+ import { ContentLakeCacheAdapter } from "./adapters/cache/content-lake-cache.js";
19
+ import { FilesystemCache } from "./adapters/cache/filesystem-cache.js";
20
+ import { SanityDocFetcher } from "./adapters/doc-fetchers/index.js";
21
+ import { PromptfooEvalAdapter } from "./adapters/eval-runners/promptfoo-eval-adapter.js";
22
+ import { ConsoleLogger, JsonLogger, QuietLogger, } from "./adapters/loggers/index.js";
23
+ import { CompositeTaskSource, ContentLakeTaskSource, RepoTaskSource, YamlTaskSource, } from "./adapters/task-sources/index.js";
24
+ import { getSanityClient } from "./sanity/client.js";
25
+ import { ReportStore } from "./report-store.js";
26
+ import { loadSinks } from "./sinks/index.js";
27
+ /**
28
+ * Create a fully wired AppContext from resolved configuration.
29
+ *
30
+ * Every adapter is constructed here and nowhere else (outside of tests).
31
+ * Swapping an adapter (e.g., YamlTaskSource → ContentLakeTaskSource)
32
+ * is a one-line change in this function.
33
+ */
34
+ export function createAppContext(config) {
35
+ // Logger — selected by env var preferences
36
+ const logger = createLogger();
37
+ // Cache — filesystem, optionally decorated with Content Lake fallback
38
+ const cache = config.noCache ? undefined : createCache(config);
39
+ // Task source — selected by config.taskSourceType
40
+ const taskSource = createTaskSource(config);
41
+ // Doc fetcher — Sanity Content Lake
42
+ const docFetcher = new SanityDocFetcher(config.rootDir);
43
+ // Eval runner — Promptfoo subprocess
44
+ const evalRunner = new PromptfooEvalAdapter(config.rootDir);
45
+ // Report store — Sanity Content Lake (for publish + auto-compare)
46
+ const reportStore = createReportStore();
47
+ // Sinks — loaded from config/sinks.yaml
48
+ const sinks = loadSinks();
49
+ return {
50
+ cache,
51
+ config,
52
+ docFetcher,
53
+ evalRunner,
54
+ logger,
55
+ reportStore,
56
+ sinks,
57
+ taskSource,
58
+ };
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // Sub-factories (extracted to keep createAppContext readable)
62
+ // ---------------------------------------------------------------------------
63
+ function createLogger() {
64
+ if (process.env.AILF_LOG_FORMAT === "json")
65
+ return new JsonLogger();
66
+ if (process.env.AILF_QUIET === "1")
67
+ return new QuietLogger();
68
+ return new ConsoleLogger({ verbose: process.env.AILF_VERBOSE === "1" });
69
+ }
70
+ function createCache(config) {
71
+ const local = new FilesystemCache(config.rootDir);
72
+ if (config.noRemoteCache)
73
+ return local;
74
+ // Only add Content Lake decorator when a report store token exists
75
+ const token = process.env.AILF_REPORT_SANITY_API_TOKEN ?? process.env.SANITY_API_TOKEN;
76
+ if (!token)
77
+ return local;
78
+ return new ContentLakeCacheAdapter(local, createReportStore());
79
+ }
80
+ function createTaskSource(config) {
81
+ // Primary source — selected by config.taskSourceType
82
+ // Content Lake tasks may require the report token for access.
83
+ const primary = config.taskSourceType === "yaml"
84
+ ? new YamlTaskSource(config.rootDir)
85
+ : new ContentLakeTaskSource(getSanityClient({
86
+ token: process.env.AILF_REPORT_SANITY_API_TOKEN ??
87
+ process.env.SANITY_API_TOKEN ??
88
+ undefined,
89
+ }));
90
+ // If repo tasks path is set, combine primary + repo sources
91
+ if (config.repoTasksPath) {
92
+ return new CompositeTaskSource([
93
+ primary,
94
+ new RepoTaskSource(config.repoTasksPath),
95
+ ]);
96
+ }
97
+ return primary;
98
+ }
99
+ function createReportStore() {
100
+ return new ReportStore({
101
+ dataset: process.env.AILF_REPORT_DATASET ?? undefined,
102
+ projectId: process.env.AILF_REPORT_PROJECT_ID ?? undefined,
103
+ token: process.env.AILF_REPORT_SANITY_API_TOKEN ??
104
+ process.env.SANITY_API_TOKEN ??
105
+ undefined,
106
+ });
107
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * interpolate.ts
3
+ *
4
+ * Resolves ${{ VAR }} and ${{ VAR | default }} expressions in YAML-loaded
5
+ * configuration values. Used by the source loader to inject environment
6
+ * variables into config/sources.yaml at parse time.
7
+ *
8
+ * Design choices:
9
+ * - ${{ }} syntax (not ${ }) to avoid collision with shell and JS templates
10
+ * - Required by default — missing var with no default throws immediately
11
+ * - Pipe | for defaults — familiar from GitHub Actions, Helm, etc.
12
+ * - No nested logic — this is substitution, not a template engine
13
+ * - Recursive on objects/arrays — env vars work at any depth
14
+ */
15
+ /**
16
+ * Recursively interpolate all string values in a parsed YAML structure.
17
+ * Non-string values (numbers, booleans, null) pass through unchanged.
18
+ */
19
+ export declare function interpolate<T>(value: T, env?: Record<string, string | undefined>): T;
20
+ /**
21
+ * Interpolate a single string value, replacing all ${{ VAR }} expressions
22
+ * with values from the provided environment record.
23
+ *
24
+ * @throws Error if a required variable (no default) is not set
25
+ */
26
+ export declare function interpolateString(value: string, env?: Record<string, string | undefined>): string;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * interpolate.ts
3
+ *
4
+ * Resolves ${{ VAR }} and ${{ VAR | default }} expressions in YAML-loaded
5
+ * configuration values. Used by the source loader to inject environment
6
+ * variables into config/sources.yaml at parse time.
7
+ *
8
+ * Design choices:
9
+ * - ${{ }} syntax (not ${ }) to avoid collision with shell and JS templates
10
+ * - Required by default — missing var with no default throws immediately
11
+ * - Pipe | for defaults — familiar from GitHub Actions, Helm, etc.
12
+ * - No nested logic — this is substitution, not a template engine
13
+ * - Recursive on objects/arrays — env vars work at any depth
14
+ */
15
+ // ---------------------------------------------------------------------------
16
+ // Core interpolation
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Pattern matching ${{ VAR }} and ${{ VAR | default_value }}.
20
+ * Captures:
21
+ * group 1: variable name (trimmed)
22
+ * group 2: default value (trimmed), or undefined if no pipe
23
+ */
24
+ const INTERP_PATTERN = /\$\{\{\s*([^}|]+?)(?:\s*\|\s*([^}]*?))?\s*\}\}/g;
25
+ /**
26
+ * Recursively interpolate all string values in a parsed YAML structure.
27
+ * Non-string values (numbers, booleans, null) pass through unchanged.
28
+ */
29
+ export function interpolate(value, env = process.env) {
30
+ if (typeof value === "string") {
31
+ return interpolateString(value, env);
32
+ }
33
+ if (Array.isArray(value)) {
34
+ return value.map((item) => interpolate(item, env));
35
+ }
36
+ if (value !== null && typeof value === "object") {
37
+ const result = {};
38
+ for (const [key, val] of Object.entries(value)) {
39
+ result[key] = interpolate(val, env);
40
+ }
41
+ return result;
42
+ }
43
+ // Numbers, booleans, null — pass through
44
+ return value;
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Recursive interpolation for parsed YAML structures
48
+ // ---------------------------------------------------------------------------
49
+ /**
50
+ * Interpolate a single string value, replacing all ${{ VAR }} expressions
51
+ * with values from the provided environment record.
52
+ *
53
+ * @throws Error if a required variable (no default) is not set
54
+ */
55
+ export function interpolateString(value, env = process.env) {
56
+ return value.replace(INTERP_PATTERN, (match, varName, defaultValue) => {
57
+ const name = varName.trim();
58
+ const resolved = env[name];
59
+ if (resolved !== undefined && resolved !== "")
60
+ return resolved;
61
+ if (defaultValue !== undefined)
62
+ return defaultValue.trim();
63
+ throw new Error("Required environment variable " +
64
+ name +
65
+ " is not set and has no default. " +
66
+ "Set it in the environment file or pass it directly. " +
67
+ "Expression: " +
68
+ match);
69
+ });
70
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * job-store.ts
3
+ *
4
+ * Job tracking store backed by the Sanity Content Lake.
5
+ * Provides CRUD operations for `ailf.job` documents that track
6
+ * API-triggered pipeline evaluations.
7
+ *
8
+ * Job documents are created by the API gateway and updated by the
9
+ * CLI as the pipeline progresses through steps.
10
+ *
11
+ * @see docs/design-docs/api-service-gateway.md
12
+ * @see packages/studio/src/schema/job.ts — Sanity document schema
13
+ */
14
+ import type { SanityClient } from "@sanity/client";
15
+ export type JobStatus = "completed" | "failed" | "queued" | "received" | "running" | "timed-out";
16
+ export interface JobDocument {
17
+ apiKeyPrefix?: string;
18
+ callback?: {
19
+ headers?: Record<string, string>;
20
+ url: string;
21
+ };
22
+ completedAt?: string;
23
+ config?: Record<string, unknown>;
24
+ createdAt: string;
25
+ deadlineAt?: string;
26
+ error?: {
27
+ message: string;
28
+ step?: string;
29
+ };
30
+ execution?: {
31
+ backend?: string;
32
+ runId?: string;
33
+ runUrl?: string;
34
+ };
35
+ jobId: string;
36
+ progress?: {
37
+ completedSteps?: number;
38
+ currentStep?: string;
39
+ totalSteps?: number;
40
+ };
41
+ reportId?: string;
42
+ startedAt?: string;
43
+ status: JobStatus;
44
+ }
45
+ export interface CreateJobOptions {
46
+ /** API key prefix — identifies which consumer created this job */
47
+ apiKeyPrefix: string;
48
+ /** Callback configuration (URL + optional headers) */
49
+ callback?: {
50
+ headers?: Record<string, string>;
51
+ url: string;
52
+ };
53
+ /** The pipeline request config (stored as JSON blob) */
54
+ config: Record<string, unknown>;
55
+ /** Custom deadline in milliseconds from now (default: 45 min) */
56
+ deadlineMs?: number;
57
+ }
58
+ export interface JobStoreOptions {
59
+ /** Override the Sanity client (for testing) */
60
+ client?: SanityClient;
61
+ /** Sanity dataset name */
62
+ dataset?: string;
63
+ /** Sanity project ID */
64
+ projectId?: string;
65
+ /** Sanity API token (required for writes) */
66
+ token?: string;
67
+ }
68
+ export declare class JobStore {
69
+ private readonly client;
70
+ constructor(options?: JobStoreOptions);
71
+ /**
72
+ * Create a new job document in the Content Lake.
73
+ *
74
+ * Generates a job ID (e.g. "job_a1b2c3d4e5f6") and writes the
75
+ * initial document with status "received". The job ID is used
76
+ * directly as the Sanity document `_id`.
77
+ *
78
+ * @returns The generated job ID, or null on failure
79
+ */
80
+ createJob(options: CreateJobOptions): Promise<string | null>;
81
+ /**
82
+ * Count jobs created today for a given API key prefix.
83
+ * Used for daily eval budget enforcement.
84
+ */
85
+ countTodayJobs(apiKeyPrefix: string): Promise<number>;
86
+ /**
87
+ * Count active (non-terminal) jobs for a given API key prefix.
88
+ * Used for concurrent job limit enforcement.
89
+ */
90
+ countActiveJobs(apiKeyPrefix: string): Promise<number>;
91
+ /**
92
+ * Find stale jobs that have exceeded their deadline.
93
+ * Used by the timeout cron job.
94
+ */
95
+ findStaleJobs(): Promise<JobDocument[]>;
96
+ /**
97
+ * Read a job by its job ID.
98
+ */
99
+ readJob(jobId: string): Promise<JobDocument | null>;
100
+ /**
101
+ * Update a job's status and optional associated data.
102
+ */
103
+ updateJob(jobId: string, update: Partial<Pick<JobDocument, "completedAt" | "error" | "execution" | "progress" | "reportId" | "startedAt" | "status">>): Promise<boolean>;
104
+ }