@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,300 @@
1
+ /**
2
+ * Reference Solution: GROQ Joins and References
3
+ *
4
+ * Demonstrates:
5
+ * - Following single references with ->
6
+ * - Resolving arrays of references
7
+ * - Nested/reverse joins using parent scope (^)
8
+ * - The references() function
9
+ * - Building rich nested responses
10
+ */
11
+
12
+ import { createClient } from "@sanity/client"
13
+
14
+ // ---------- Client setup ----------
15
+
16
+ const client = createClient({
17
+ projectId: "your-project-id",
18
+ dataset: "production",
19
+ apiVersion: "2024-01-01",
20
+ useCdn: true,
21
+ })
22
+
23
+ // ---------- Types ----------
24
+
25
+ interface SanityImage {
26
+ _type: "image"
27
+ asset: {
28
+ _ref: string
29
+ _type: "reference"
30
+ }
31
+ }
32
+
33
+ interface Author {
34
+ _id: string
35
+ _type: "author"
36
+ name: string
37
+ bio: unknown[] // Portable Text blocks
38
+ image: SanityImage | null
39
+ }
40
+
41
+ interface Category {
42
+ _id: string
43
+ _type: "category"
44
+ title: string
45
+ slug: { current: string }
46
+ }
47
+
48
+ interface Post {
49
+ _id: string
50
+ _type: "post"
51
+ title: string
52
+ slug: { current: string }
53
+ publishedAt: string
54
+ }
55
+
56
+ // ---------- Result types for each query ----------
57
+
58
+ /** Result of resolving a post with its author (single reference) */
59
+ interface PostWithAuthor {
60
+ _id: string
61
+ title: string
62
+ slug: { current: string }
63
+ publishedAt: string
64
+ author: {
65
+ name: string
66
+ bio: unknown[]
67
+ image: SanityImage | null
68
+ } | null
69
+ }
70
+
71
+ /** Result of resolving a post with its categories (array of references) */
72
+ interface PostWithCategories {
73
+ _id: string
74
+ title: string
75
+ categories: Array<{
76
+ _id: string
77
+ title: string
78
+ }>
79
+ }
80
+
81
+ /** Result of resolving an author with their latest posts (nested/reverse join) */
82
+ interface AuthorWithLatestPosts {
83
+ _id: string
84
+ name: string
85
+ bio: unknown[]
86
+ image: SanityImage | null
87
+ latestPosts: Array<{
88
+ _id: string
89
+ title: string
90
+ slug: { current: string }
91
+ publishedAt: string
92
+ }>
93
+ }
94
+
95
+ /** Result of finding all documents that reference a specific document */
96
+ interface ReferencingDocument {
97
+ _id: string
98
+ _type: string
99
+ title: string
100
+ }
101
+
102
+ /** Result of a full post with all references resolved */
103
+ interface FullPost {
104
+ _id: string
105
+ title: string
106
+ slug: { current: string }
107
+ publishedAt: string
108
+ author: {
109
+ _id: string
110
+ name: string
111
+ image: SanityImage | null
112
+ } | null
113
+ categories: Array<{
114
+ _id: string
115
+ title: string
116
+ }>
117
+ }
118
+
119
+ // ---------- 1. Follow a single reference with -> ----------
120
+ // The -> operator dereferences a reference field, replacing the
121
+ // { _ref: "abc123" } stub with the full referenced document.
122
+
123
+ async function fetchPostWithAuthor(
124
+ postSlug: string
125
+ ): Promise<PostWithAuthor | null> {
126
+ const query = `
127
+ *[_type == "post" && slug.current == $postSlug][0]{
128
+ _id,
129
+ title,
130
+ slug,
131
+ publishedAt,
132
+ // Dereference the author and pick specific fields
133
+ author->{
134
+ name,
135
+ bio,
136
+ image
137
+ }
138
+ }
139
+ `
140
+
141
+ return client.fetch<PostWithAuthor | null>(query, { postSlug })
142
+ }
143
+
144
+ // ---------- 2. Follow an array of references ----------
145
+ // When a field is an array of references, use []-> to dereference
146
+ // every item in the array in one go.
147
+
148
+ async function fetchPostWithCategories(
149
+ postSlug: string
150
+ ): Promise<PostWithCategories | null> {
151
+ const query = `
152
+ *[_type == "post" && slug.current == $postSlug][0]{
153
+ _id,
154
+ title,
155
+ // Dereference each category reference in the array
156
+ "categories": categories[]->{
157
+ _id,
158
+ title
159
+ }
160
+ }
161
+ `
162
+
163
+ return client.fetch<PostWithCategories | null>(query, { postSlug })
164
+ }
165
+
166
+ // ---------- 3. Nested join with reverse reference ----------
167
+ // Combine -> with a sub-query that uses references() and ^._id
168
+ // to build a rich nested response in a single round trip.
169
+
170
+ async function fetchAuthorWithLatestPosts(
171
+ authorSlug: string
172
+ ): Promise<AuthorWithLatestPosts | null> {
173
+ const query = `
174
+ *[_type == "author" && slug.current == $authorSlug][0]{
175
+ _id,
176
+ name,
177
+ bio,
178
+ image,
179
+ // Reverse join: find posts that reference this author.
180
+ // ^._id refers to the _id of the outer (parent) document.
181
+ "latestPosts": *[_type == "post" && references(^._id)] | order(publishedAt desc)[0...5]{
182
+ _id,
183
+ title,
184
+ slug,
185
+ publishedAt
186
+ }
187
+ }
188
+ `
189
+
190
+ return client.fetch<AuthorWithLatestPosts | null>(query, { authorSlug })
191
+ }
192
+
193
+ // ---------- 4. The references() function ----------
194
+ // references(id) matches any document that contains a reference
195
+ // to the given document ID, at any depth in its tree.
196
+
197
+ async function fetchDocumentsReferencingId(
198
+ documentId: string
199
+ ): Promise<ReferencingDocument[]> {
200
+ const query = `
201
+ *[references($documentId)]{
202
+ _id,
203
+ _type,
204
+ title
205
+ }
206
+ `
207
+
208
+ return client.fetch<ReferencingDocument[]>(query, { documentId })
209
+ }
210
+
211
+ // ---------- 5. Reverse reference with parent scope (^) ----------
212
+ // Use ^ to access the parent scope in nested projections.
213
+ // This enables "give me X and, for each X, find related Y" patterns.
214
+
215
+ async function fetchCategoriesWithPostCount(): Promise<
216
+ Array<{
217
+ _id: string
218
+ title: string
219
+ postCount: number
220
+ }>
221
+ > {
222
+ const query = `
223
+ *[_type == "category"]{
224
+ _id,
225
+ title,
226
+ // Count how many posts reference this category.
227
+ // ^._id is the current category's _id.
228
+ "postCount": count(*[_type == "post" && references(^._id)])
229
+ } | order(postCount desc)
230
+ `
231
+
232
+ return client.fetch(query)
233
+ }
234
+
235
+ // ---------- 6. Combining multiple join patterns ----------
236
+ // A single query can mix all patterns: forward references,
237
+ // array dereferencing, and reverse joins.
238
+
239
+ async function fetchFullPost(postSlug: string): Promise<FullPost | null> {
240
+ const query = `
241
+ *[_type == "post" && slug.current == $postSlug][0]{
242
+ _id,
243
+ title,
244
+ slug,
245
+ publishedAt,
246
+ // Single reference join
247
+ author->{
248
+ _id,
249
+ name,
250
+ image
251
+ },
252
+ // Array of references join
253
+ "categories": categories[]->{
254
+ _id,
255
+ title
256
+ }
257
+ }
258
+ `
259
+
260
+ return client.fetch<FullPost | null>(query, { postSlug })
261
+ }
262
+
263
+ // ---------- Usage examples ----------
264
+
265
+ async function main() {
266
+ // 1. Get a post with its author resolved
267
+ const postWithAuthor = await fetchPostWithAuthor("my-first-post")
268
+ console.log("Post author:", postWithAuthor?.author?.name)
269
+
270
+ // 2. Get a post with its categories resolved
271
+ const postWithCategories = await fetchPostWithCategories("my-first-post")
272
+ console.log(
273
+ "Categories:",
274
+ postWithCategories?.categories.map((c) => c.title)
275
+ )
276
+
277
+ // 3. Get an author with their 5 latest posts (nested reverse join)
278
+ const authorWithPosts = await fetchAuthorWithLatestPosts("jane-doe")
279
+ console.log(
280
+ "Latest posts:",
281
+ authorWithPosts?.latestPosts.map((p) => p.title)
282
+ )
283
+
284
+ // 4. Find everything that references a specific document
285
+ const referencingDocs = await fetchDocumentsReferencingId("author-abc123")
286
+ console.log("Documents referencing author:", referencingDocs.length)
287
+
288
+ // 5. Get categories with their post counts (reverse reference)
289
+ const categoriesWithCounts = await fetchCategoriesWithPostCount()
290
+ console.log(
291
+ "Categories by post count:",
292
+ categoriesWithCounts.map((c) => `${c.title}: ${c.postCount}`)
293
+ )
294
+
295
+ // 6. Get a fully resolved post (combines all patterns)
296
+ const fullPost = await fetchFullPost("my-first-post")
297
+ console.log("Full post:", fullPost?.title, "by", fullPost?.author?.name)
298
+ }
299
+
300
+ main()
@@ -0,0 +1,128 @@
1
+ // Next.js App Router + Sanity Integration
2
+ // Demonstrates: sanity client setup, GROQ queries, server components, ISR, draft mode
3
+
4
+ // --- lib/sanity.client.ts ---
5
+ import { createClient } from "next-sanity"
6
+
7
+ export const client = createClient({
8
+ projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!,
9
+ dataset: process.env.NEXT_PUBLIC_SANITY_DATASET ?? "production",
10
+ apiVersion: "2024-01-01",
11
+ useCdn: true,
12
+ // For authenticated requests (preview/drafts)
13
+ token: process.env.SANITY_API_READ_TOKEN,
14
+ })
15
+
16
+ // --- lib/sanity.queries.ts ---
17
+ import { groq } from "next-sanity"
18
+
19
+ export const postsQuery = groq`*[_type == "post"] | order(publishedAt desc) {
20
+ _id,
21
+ title,
22
+ slug,
23
+ publishedAt,
24
+ "author": author->name,
25
+ "categories": categories[]->title,
26
+ mainImage
27
+ }`
28
+
29
+ export const postBySlugQuery = groq`*[_type == "post" && slug.current == $slug][0] {
30
+ _id,
31
+ title,
32
+ slug,
33
+ body,
34
+ publishedAt,
35
+ "author": author->{name, image, bio},
36
+ "categories": categories[]->title,
37
+ mainImage
38
+ }`
39
+
40
+ // --- app/posts/page.tsx ---
41
+ // Server Component — fetches at request time with ISR
42
+ import { client } from "@/lib/sanity.client"
43
+ import { postsQuery } from "@/lib/sanity.queries"
44
+ import Link from "next/link"
45
+
46
+ // Enable ISR with revalidation
47
+ export const revalidate = 60
48
+
49
+ interface Post {
50
+ _id: string
51
+ title: string
52
+ slug: { current: string }
53
+ publishedAt: string
54
+ author: string
55
+ categories: string[]
56
+ }
57
+
58
+ export default async function PostsPage() {
59
+ const posts = await client.fetch<Post[]>(postsQuery)
60
+
61
+ return (
62
+ <main>
63
+ <h1>Blog Posts</h1>
64
+ <ul>
65
+ {posts.map((post) => (
66
+ <li key={post._id}>
67
+ <Link href={`/posts/${post.slug.current}`}>
68
+ {post.title}
69
+ </Link>
70
+ <span>by {post.author}</span>
71
+ </li>
72
+ ))}
73
+ </ul>
74
+ </main>
75
+ )
76
+ }
77
+
78
+ // --- app/posts/[slug]/page.tsx ---
79
+ import { client } from "@/lib/sanity.client"
80
+ import { postBySlugQuery, postsQuery } from "@/lib/sanity.queries"
81
+ import { notFound } from "next/navigation"
82
+
83
+ export const revalidate = 60
84
+
85
+ // Generate static paths for all posts
86
+ export async function generateStaticParams() {
87
+ const posts = await client.fetch<Array<{ slug: { current: string } }>>(
88
+ groq`*[_type == "post"]{ slug }`
89
+ )
90
+ return posts.map((post) => ({ slug: post.slug.current }))
91
+ }
92
+
93
+ export default async function PostPage({
94
+ params,
95
+ }: {
96
+ params: Promise<{ slug: string }>
97
+ }) {
98
+ const { slug } = await params
99
+ const post = await client.fetch(postBySlugQuery, { slug })
100
+
101
+ if (!post) notFound()
102
+
103
+ return (
104
+ <article>
105
+ <h1>{post.title}</h1>
106
+ <p>By {post.author?.name}</p>
107
+ {/* Render portable text body with @portabletext/react */}
108
+ </article>
109
+ )
110
+ }
111
+
112
+ // --- app/api/draft-mode/enable/route.ts ---
113
+ import { draftMode } from "next/headers"
114
+ import { redirect } from "next/navigation"
115
+
116
+ export async function GET(request: Request) {
117
+ const { searchParams } = new URL(request.url)
118
+ const secret = searchParams.get("secret")
119
+ const slug = searchParams.get("slug") ?? "/"
120
+
121
+ if (secret !== process.env.SANITY_PREVIEW_SECRET) {
122
+ return new Response("Invalid secret", { status: 401 })
123
+ }
124
+
125
+ const draft = await draftMode()
126
+ draft.enable()
127
+ redirect(slug)
128
+ }
@@ -0,0 +1,143 @@
1
+ // Blog schema: posts with rich text, authors with bios, categories
2
+ // Demonstrates: defineType, defineField, document types, references, arrays, images
3
+
4
+ import { defineField, defineType } from "sanity"
5
+
6
+ export const category = defineType({
7
+ name: "category",
8
+ title: "Category",
9
+ type: "document",
10
+ fields: [
11
+ defineField({
12
+ name: "title",
13
+ title: "Title",
14
+ type: "string",
15
+ validation: (rule) => rule.required(),
16
+ }),
17
+ defineField({
18
+ name: "slug",
19
+ title: "Slug",
20
+ type: "slug",
21
+ options: { source: "title", maxLength: 96 },
22
+ validation: (rule) => rule.required(),
23
+ }),
24
+ defineField({
25
+ name: "description",
26
+ title: "Description",
27
+ type: "text",
28
+ }),
29
+ ],
30
+ })
31
+
32
+ export const author = defineType({
33
+ name: "author",
34
+ title: "Author",
35
+ type: "document",
36
+ fields: [
37
+ defineField({
38
+ name: "name",
39
+ title: "Name",
40
+ type: "string",
41
+ validation: (rule) => rule.required(),
42
+ }),
43
+ defineField({
44
+ name: "slug",
45
+ title: "Slug",
46
+ type: "slug",
47
+ options: { source: "name", maxLength: 96 },
48
+ validation: (rule) => rule.required(),
49
+ }),
50
+ defineField({
51
+ name: "image",
52
+ title: "Image",
53
+ type: "image",
54
+ options: { hotspot: true },
55
+ }),
56
+ defineField({
57
+ name: "bio",
58
+ title: "Bio",
59
+ type: "array",
60
+ of: [{ type: "block" }],
61
+ }),
62
+ ],
63
+ preview: {
64
+ select: {
65
+ title: "name",
66
+ media: "image",
67
+ },
68
+ },
69
+ })
70
+
71
+ export const post = defineType({
72
+ name: "post",
73
+ title: "Post",
74
+ type: "document",
75
+ fields: [
76
+ defineField({
77
+ name: "title",
78
+ title: "Title",
79
+ type: "string",
80
+ validation: (rule) => rule.required(),
81
+ }),
82
+ defineField({
83
+ name: "slug",
84
+ title: "Slug",
85
+ type: "slug",
86
+ options: { source: "title", maxLength: 96 },
87
+ validation: (rule) => rule.required(),
88
+ }),
89
+ defineField({
90
+ name: "author",
91
+ title: "Author",
92
+ type: "reference",
93
+ to: [{ type: "author" }],
94
+ }),
95
+ defineField({
96
+ name: "mainImage",
97
+ title: "Main image",
98
+ type: "image",
99
+ options: { hotspot: true },
100
+ }),
101
+ defineField({
102
+ name: "categories",
103
+ title: "Categories",
104
+ type: "array",
105
+ of: [{ type: "reference", to: [{ type: "category" }] }],
106
+ }),
107
+ defineField({
108
+ name: "publishedAt",
109
+ title: "Published at",
110
+ type: "datetime",
111
+ }),
112
+ defineField({
113
+ name: "body",
114
+ title: "Body",
115
+ type: "array",
116
+ of: [
117
+ { type: "block" },
118
+ {
119
+ type: "image",
120
+ options: { hotspot: true },
121
+ fields: [
122
+ defineField({
123
+ name: "alt",
124
+ title: "Alternative text",
125
+ type: "string",
126
+ }),
127
+ ],
128
+ },
129
+ ],
130
+ }),
131
+ ],
132
+ preview: {
133
+ select: {
134
+ title: "title",
135
+ author: "author.name",
136
+ media: "mainImage",
137
+ },
138
+ prepare(selection) {
139
+ const { author } = selection
140
+ return { ...selection, subtitle: author && `by ${author}` }
141
+ },
142
+ },
143
+ })
@@ -0,0 +1,78 @@
1
+ // Custom Studio Tool: Analytics Dashboard
2
+ // Demonstrates: definePlugin, tool API, Studio UI components, React integration
3
+
4
+ import { ChartUpwardIcon } from "@sanity/icons"
5
+ import { Box, Card, Flex, Heading, Stack, Text } from "@sanity/ui"
6
+ import { useEffect, useState } from "react"
7
+ import { definePlugin, type Tool } from "sanity"
8
+
9
+ // Component that renders the tool's UI
10
+ function AnalyticsDashboard() {
11
+ const [stats, setStats] = useState<{
12
+ documents: number
13
+ drafts: number
14
+ published: number
15
+ } | null>(null)
16
+
17
+ useEffect(() => {
18
+ // In a real tool, you'd fetch data from Sanity or an external API
19
+ // This demonstrates the pattern
20
+ setStats({ documents: 142, drafts: 12, published: 130 })
21
+ }, [])
22
+
23
+ if (!stats) {
24
+ return (
25
+ <Card padding={4}>
26
+ <Text>Loading...</Text>
27
+ </Card>
28
+ )
29
+ }
30
+
31
+ return (
32
+ <Box padding={4}>
33
+ <Stack space={4}>
34
+ <Heading as="h1" size={3}>
35
+ Analytics Dashboard
36
+ </Heading>
37
+ <Flex gap={4} wrap="wrap">
38
+ <StatCard label="Total Documents" value={stats.documents} />
39
+ <StatCard label="Drafts" value={stats.drafts} />
40
+ <StatCard label="Published" value={stats.published} />
41
+ </Flex>
42
+ </Stack>
43
+ </Box>
44
+ )
45
+ }
46
+
47
+ function StatCard({ label, value }: { label: string; value: number }) {
48
+ return (
49
+ <Card padding={4} radius={2} shadow={1} style={{ minWidth: 200 }}>
50
+ <Stack space={3}>
51
+ <Text size={1} muted>
52
+ {label}
53
+ </Text>
54
+ <Heading size={4}>{value}</Heading>
55
+ </Stack>
56
+ </Card>
57
+ )
58
+ }
59
+
60
+ // Define the tool using Sanity's plugin API
61
+ const analyticsTool: Tool = {
62
+ name: "analytics",
63
+ title: "Analytics",
64
+ icon: ChartUpwardIcon,
65
+ component: AnalyticsDashboard,
66
+ }
67
+
68
+ // Export as a Sanity plugin
69
+ export const analyticsPlugin = definePlugin({
70
+ name: "sanity-plugin-analytics",
71
+ tools: [analyticsTool],
72
+ })
73
+
74
+ // Usage in sanity.config.ts:
75
+ // import { analyticsPlugin } from "./plugins/analytics"
76
+ // export default defineConfig({
77
+ // plugins: [analyticsPlugin()],
78
+ // })