@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,379 @@
1
+ /**
2
+ * Reference Solution: Advanced GROQ Filtering and Projections
3
+ *
4
+ * Demonstrates:
5
+ * - Conditional projections with select()
6
+ * - Computed/aliased fields
7
+ * - Coalesce for fallback values
8
+ * - Text matching with match operator
9
+ * - count() and defined() functions
10
+ * - Array filtering and mapping
11
+ * - Multi-field ordering
12
+ */
13
+
14
+ import { createClient } from "@sanity/client"
15
+
16
+ // --- Sanity client setup ---
17
+
18
+ const client = createClient({
19
+ projectId: "your-project-id",
20
+ dataset: "production",
21
+ apiVersion: "2024-01-01",
22
+ useCdn: true,
23
+ })
24
+
25
+ // --- Types ---
26
+
27
+ type ContentItem = {
28
+ _id: string
29
+ _type: "article" | "tutorial" | "changelog"
30
+ title: string
31
+ displayTitle: string
32
+ status: string
33
+ statusLabel: string
34
+ categoryCount: number
35
+ featuredTags: string[]
36
+ publishedAt: string
37
+ }
38
+
39
+ type SearchResult = {
40
+ _id: string
41
+ title: string
42
+ excerpt: string | null
43
+ }
44
+
45
+ type AuthorWithStats = {
46
+ _id: string
47
+ name: string
48
+ postCount: number
49
+ latestPostDate: string | null
50
+ }
51
+
52
+ type ProjectSummary = {
53
+ _id: string
54
+ title: string
55
+ memberCount: number
56
+ activeTasks: string[]
57
+ completionPct: number
58
+ }
59
+
60
+ // --- 1. Conditional projections with select() ---
61
+ // Show different labels depending on document status
62
+
63
+ async function fetchWithConditionalProjections(): Promise<ContentItem[]> {
64
+ const query = `
65
+ *[_type in ["article", "tutorial", "changelog"]] {
66
+ _id,
67
+ _type,
68
+ title,
69
+
70
+ // select() returns different values based on conditions
71
+ "statusLabel": select(
72
+ status == "published" => "Live",
73
+ status == "draft" => "In Progress",
74
+ status == "archived" => "Archived",
75
+ "Unknown"
76
+ ),
77
+
78
+ // Conditional projection based on _type
79
+ "displayTitle": select(
80
+ _type == "changelog" => "📋 " + title,
81
+ _type == "tutorial" => "📖 " + title,
82
+ title
83
+ )
84
+ }
85
+ `
86
+
87
+ return client.fetch<ContentItem[]>(query)
88
+ }
89
+
90
+ // --- 2. Computed/aliased fields ---
91
+ // Rename and compute fields using "alias": expression syntax
92
+
93
+ async function fetchWithComputedFields(): Promise<AuthorWithStats[]> {
94
+ const query = `
95
+ *[_type == "author"] {
96
+ _id,
97
+ name,
98
+
99
+ // Count referencing documents using a sub-query
100
+ "postCount": count(*[_type == "post" && references(^._id)]),
101
+
102
+ // Compute the latest post date via a sub-query + order
103
+ "latestPostDate": *[_type == "post" && references(^._id)]
104
+ | order(publishedAt desc)[0].publishedAt,
105
+
106
+ // Derive a slug from the name (aliased field)
107
+ "profileUrl": "/authors/" + slug.current
108
+ }
109
+ `
110
+
111
+ return client.fetch<AuthorWithStats[]>(query)
112
+ }
113
+
114
+ // --- 3. Coalesce for fallback values ---
115
+ // Use coalesce() to pick the first non-null value
116
+
117
+ async function fetchWithCoalesce(): Promise<SearchResult[]> {
118
+ const query = `
119
+ *[_type == "article"] {
120
+ _id,
121
+
122
+ // Prefer seoTitle, fall back to title, then a default string
123
+ "title": coalesce(seoTitle, title, "Untitled"),
124
+
125
+ // Prefer metaDescription, fall back to a truncated excerpt
126
+ "excerpt": coalesce(
127
+ metaDescription,
128
+ excerpt,
129
+ pt::text(content)[0...160]
130
+ )
131
+ }
132
+ `
133
+
134
+ return client.fetch<SearchResult[]>(query)
135
+ }
136
+
137
+ // --- 4. Text matching with the match operator ---
138
+ // Use match for full-text style pattern matching
139
+
140
+ async function searchByText(term: string): Promise<SearchResult[]> {
141
+ // match supports trailing wildcards for prefix matching
142
+ const query = `
143
+ *[_type == "article" && title match $term] {
144
+ _id,
145
+ title,
146
+ "excerpt": coalesce(excerpt, pt::text(content)[0...160])
147
+ }
148
+ `
149
+
150
+ // Pass the search term as a parameter (safe from injection)
151
+ return client.fetch<SearchResult[]>(query, { term: `${term}*` })
152
+ }
153
+
154
+ // Match across multiple fields at once
155
+ async function searchMultipleFields(term: string): Promise<SearchResult[]> {
156
+ const query = `
157
+ *[_type == "article" && (title match $term || excerpt match $term)] {
158
+ _id,
159
+ title,
160
+ "excerpt": coalesce(excerpt, null)
161
+ }
162
+ `
163
+
164
+ return client.fetch<SearchResult[]>(query, { term: `${term}*` })
165
+ }
166
+
167
+ // --- 5. count() and defined() functions ---
168
+ // count() for aggregation, defined() for existence checks
169
+
170
+ async function fetchDocumentsWithCounts(): Promise<ProjectSummary[]> {
171
+ const query = `
172
+ *[_type == "project" && defined(title)] {
173
+ _id,
174
+ title,
175
+
176
+ // count() in a projection — count related members
177
+ "memberCount": count(members),
178
+
179
+ // count() with a filtered sub-query
180
+ "openIssueCount": count(*[_type == "issue" && references(^._id) && status != "closed"]),
181
+
182
+ // defined() to filter: only include projects that have a deadline
183
+ "hasDeadline": defined(deadline)
184
+ }
185
+ `
186
+
187
+ return client.fetch<ProjectSummary[]>(query)
188
+ }
189
+
190
+ // count() in a top-level filter — find documents with at least 3 tags
191
+ async function fetchPopularContent(): Promise<ContentItem[]> {
192
+ const query = `
193
+ *[_type == "article" && count(tags) >= 3 && defined(publishedAt)] {
194
+ _id,
195
+ title,
196
+ "tagCount": count(tags),
197
+ publishedAt
198
+ }
199
+ `
200
+
201
+ return client.fetch<ContentItem[]>(query)
202
+ }
203
+
204
+ // --- 6. Array filtering and mapping ---
205
+ // Filter inside arrays with [condition], project with {}
206
+
207
+ async function fetchWithArrayOperations(): Promise<ProjectSummary[]> {
208
+ const query = `
209
+ *[_type == "project"] {
210
+ _id,
211
+ title,
212
+
213
+ // Filter an array of inline objects — keep only active tasks
214
+ "activeTasks": tasks[status == "active"] {
215
+ title,
216
+ assignee,
217
+ dueDate
218
+ },
219
+
220
+ // Compute a completion percentage from the tasks array
221
+ "completionPct": (
222
+ count(tasks[status == "done"]) * 100 /
223
+ select(count(tasks) > 0 => count(tasks), 1)
224
+ ),
225
+
226
+ // Map array items to a simpler shape (projection on array)
227
+ "memberNames": members[].name,
228
+
229
+ // Combine filter + projection on an array of references
230
+ "recentMilestones": milestones[completed == true] {
231
+ title,
232
+ completedAt
233
+ } | order(completedAt desc)[0...3]
234
+ }
235
+ `
236
+
237
+ return client.fetch<ProjectSummary[]>(query)
238
+ }
239
+
240
+ // --- 7. @ (current item in scope) in array filters ---
241
+ // Use @ to refer to the current element when filtering scalar arrays
242
+
243
+ async function fetchWithAtOperator(): Promise<ContentItem[]> {
244
+ const query = `
245
+ *[_type == "article"] {
246
+ _id,
247
+ title,
248
+
249
+ // @ refers to each string in the tags array
250
+ "featuredTags": tags[@ in ["featured", "spotlight", "editors-pick"]],
251
+
252
+ // @ with match for pattern matching inside scalar arrays
253
+ "techTags": tags[@ match "tech-*"],
254
+
255
+ // @ with comparison on an array of numbers
256
+ "highScores": scores[@ > 90],
257
+
258
+ // Combine @ filter with count() — number of featured tags
259
+ "featuredTagCount": count(tags[@ in ["featured", "spotlight"]])
260
+ }
261
+ `
262
+
263
+ return client.fetch<ContentItem[]>(query)
264
+ }
265
+
266
+ // --- 8. order() and multi-field sorting ---
267
+ // Sort by multiple fields with mixed directions
268
+
269
+ async function fetchOrdered(): Promise<ContentItem[]> {
270
+ // Primary sort by publishedAt descending, secondary by title ascending
271
+ const query = `
272
+ *[_type == "article" && defined(publishedAt)]
273
+ | order(publishedAt desc, title asc)
274
+ [0...20]
275
+ {
276
+ _id,
277
+ title,
278
+ publishedAt,
279
+ "statusLabel": select(
280
+ status == "published" => "Live",
281
+ status == "draft" => "In Progress",
282
+ "Unknown"
283
+ )
284
+ }
285
+ `
286
+
287
+ return client.fetch<ContentItem[]>(query)
288
+ }
289
+
290
+ // order() inside a sub-query for "latest N" patterns
291
+ async function fetchAuthorsWithLatestPosts(): Promise<AuthorWithStats[]> {
292
+ const query = `
293
+ *[_type == "author"]
294
+ | order(name asc)
295
+ {
296
+ _id,
297
+ name,
298
+ "postCount": count(*[_type == "post" && references(^._id)]),
299
+
300
+ // Sub-query with order() to get the 3 most recent posts
301
+ "recentPosts": *[_type == "post" && references(^._id)]
302
+ | order(publishedAt desc)[0...3]
303
+ {
304
+ _id,
305
+ title,
306
+ publishedAt,
307
+ "categoryCount": count(categories)
308
+ }
309
+ }
310
+ `
311
+
312
+ return client.fetch<AuthorWithStats[]>(query)
313
+ }
314
+
315
+ // --- 9. Combining multiple patterns ---
316
+ // A realistic query that uses several advanced features together
317
+
318
+ type DashboardItem = {
319
+ _id: string
320
+ _type: string
321
+ displayTitle: string
322
+ status: string
323
+ tagSummary: string[]
324
+ relatedCount: number
325
+ sortDate: string
326
+ }
327
+
328
+ async function fetchDashboard(): Promise<DashboardItem[]> {
329
+ const query = `
330
+ *[_type in ["article", "tutorial"] && defined(publishedAt)]
331
+ | order(publishedAt desc)
332
+ [0...50]
333
+ {
334
+ _id,
335
+ _type,
336
+
337
+ // Coalesce + select for a display-ready title
338
+ "displayTitle": select(
339
+ _type == "tutorial" => "📖 " + coalesce(seoTitle, title),
340
+ coalesce(seoTitle, title)
341
+ ),
342
+
343
+ // Conditional status mapping
344
+ "status": select(
345
+ publishedAt < now() && status == "published" => "live",
346
+ status == "draft" => "draft",
347
+ "scheduled"
348
+ ),
349
+
350
+ // Array filter with @ + count
351
+ "tagSummary": tags[@ in ["featured", "new", "updated"]],
352
+
353
+ // Sub-query count for related documents
354
+ "relatedCount": count(
355
+ *[_type == ^._type && _id != ^._id && count((tags[])[@ in ^.tags[]]) > 0]
356
+ ),
357
+
358
+ // Coalesce for sort stability
359
+ "sortDate": coalesce(publishedAt, _createdAt)
360
+ }
361
+ `
362
+
363
+ return client.fetch<DashboardItem[]>(query)
364
+ }
365
+
366
+ export {
367
+ fetchAuthorsWithLatestPosts,
368
+ fetchDashboard,
369
+ fetchDocumentsWithCounts,
370
+ fetchOrdered,
371
+ fetchPopularContent,
372
+ fetchWithArrayOperations,
373
+ fetchWithAtOperator,
374
+ fetchWithCoalesce,
375
+ fetchWithComputedFields,
376
+ fetchWithConditionalProjections,
377
+ searchByText,
378
+ searchMultipleFields,
379
+ }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Reference Solution: GROQ Blog Queries
3
+ *
4
+ * Demonstrates:
5
+ * - Filtering documents by type
6
+ * - Projections to shape query output
7
+ * - Ordering and pagination with slicing
8
+ * - Parameterized queries
9
+ * - Date filtering
10
+ * - Reference-based filtering
11
+ */
12
+
13
+ import { createClient } from "@sanity/client"
14
+
15
+ export const client = createClient({
16
+ projectId: "your-project-id",
17
+ dataset: "production",
18
+ apiVersion: "2024-01-01",
19
+ useCdn: process.env.NODE_ENV === "production",
20
+ })
21
+
22
+ // ---------------------------------------------------------------------------
23
+ // Types
24
+ // ---------------------------------------------------------------------------
25
+
26
+ interface PostSummary {
27
+ _id: string
28
+ title: string
29
+ slug: string
30
+ publishedAt: string
31
+ excerpt: string
32
+ authorName: string
33
+ }
34
+
35
+ interface PostDetail extends PostSummary {
36
+ body: unknown[] // Portable Text blocks
37
+ }
38
+
39
+ // ---------------------------------------------------------------------------
40
+ // 1. Fetch paginated blog posts — filter, project, order & slice
41
+ // ---------------------------------------------------------------------------
42
+
43
+ const paginatedPostsQuery = /* groq */ `
44
+ *[_type == "post"] | order(publishedAt desc) [0...10] {
45
+ _id,
46
+ title,
47
+ "slug": slug.current,
48
+ publishedAt,
49
+ excerpt,
50
+ "authorName": author->name
51
+ }
52
+ `
53
+
54
+ export async function getPaginatedPosts(
55
+ start = 0,
56
+ end = 10,
57
+ ): Promise<PostSummary[]> {
58
+ return client.fetch(
59
+ /* groq */ `
60
+ *[_type == "post"] | order(publishedAt desc) [$start...$end] {
61
+ _id,
62
+ title,
63
+ "slug": slug.current,
64
+ publishedAt,
65
+ excerpt,
66
+ "authorName": author->name
67
+ }
68
+ `,
69
+ { start, end },
70
+ )
71
+ }
72
+
73
+ // ---------------------------------------------------------------------------
74
+ // 2. Fetch a single post by slug — parameterized query
75
+ // ---------------------------------------------------------------------------
76
+
77
+ const postBySlugQuery = /* groq */ `
78
+ *[_type == "post" && slug.current == $slug][0] {
79
+ _id,
80
+ title,
81
+ "slug": slug.current,
82
+ publishedAt,
83
+ excerpt,
84
+ "authorName": author->name,
85
+ body
86
+ }
87
+ `
88
+
89
+ export async function getPostBySlug(
90
+ slug: string,
91
+ ): Promise<PostDetail | null> {
92
+ return client.fetch(postBySlugQuery, { slug })
93
+ }
94
+
95
+ // ---------------------------------------------------------------------------
96
+ // 3. Fetch posts published after a specific date — dateTime() filtering
97
+ // ---------------------------------------------------------------------------
98
+
99
+ const recentPostsQuery = /* groq */ `
100
+ *[_type == "post" && dateTime(publishedAt) > dateTime($since)]
101
+ | order(publishedAt desc) {
102
+ _id,
103
+ title,
104
+ "slug": slug.current,
105
+ publishedAt,
106
+ excerpt,
107
+ "authorName": author->name
108
+ }
109
+ `
110
+
111
+ export async function getPostsPublishedAfter(
112
+ since: string,
113
+ ): Promise<PostSummary[]> {
114
+ return client.fetch(recentPostsQuery, { since })
115
+ }
116
+
117
+ // ---------------------------------------------------------------------------
118
+ // 4. Fetch posts by category — reference check in an array
119
+ // ---------------------------------------------------------------------------
120
+
121
+ const postsByCategoryQuery = /* groq */ `
122
+ *[_type == "post" && $categoryId in categories[]._ref]
123
+ | order(publishedAt desc) {
124
+ _id,
125
+ title,
126
+ "slug": slug.current,
127
+ publishedAt,
128
+ excerpt,
129
+ "authorName": author->name
130
+ }
131
+ `
132
+
133
+ export async function getPostsByCategory(
134
+ categoryId: string,
135
+ ): Promise<PostSummary[]> {
136
+ return client.fetch(postsByCategoryQuery, { categoryId })
137
+ }