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