blume 1.7.2 → 2.0.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 (677) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +227 -0
  3. package/README.md +34 -21
  4. package/dist/cli/chunk-11j0384y.js +148 -0
  5. package/dist/cli/chunk-11j0384y.js.map +10 -0
  6. package/dist/cli/{chunk-xhtpx3ff.js → chunk-1w8dp3qb.js} +17 -16
  7. package/dist/cli/{chunk-xhtpx3ff.js.map → chunk-1w8dp3qb.js.map} +3 -3
  8. package/dist/cli/chunk-2q1dwty4.js +75 -0
  9. package/dist/cli/chunk-2q1dwty4.js.map +11 -0
  10. package/dist/cli/chunk-41za066z.js +122 -0
  11. package/dist/cli/chunk-41za066z.js.map +11 -0
  12. package/dist/cli/chunk-5a2z0198.js +133 -0
  13. package/dist/cli/chunk-5a2z0198.js.map +10 -0
  14. package/dist/cli/{chunk-9he6crym.js → chunk-6k8vp3ta.js} +25 -13
  15. package/dist/cli/{chunk-9he6crym.js.map → chunk-6k8vp3ta.js.map} +4 -4
  16. package/dist/cli/{chunk-mt76t7dj.js → chunk-79njf86q.js} +133 -54
  17. package/dist/cli/chunk-79njf86q.js.map +11 -0
  18. package/dist/cli/{chunk-3w7b2vcx.js → chunk-7ez8ny0t.js} +2 -2
  19. package/dist/cli/{chunk-688e0dde.js → chunk-88cpgt6h.js} +1 -1
  20. package/dist/cli/chunk-a9kptbw5.js +361 -0
  21. package/dist/cli/chunk-a9kptbw5.js.map +14 -0
  22. package/dist/cli/chunk-abh8yjkn.js +31 -0
  23. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  24. package/dist/cli/chunk-b5aj94ah.js +91 -0
  25. package/dist/cli/chunk-b5aj94ah.js.map +10 -0
  26. package/dist/cli/{chunk-hs3gbh8p.js → chunk-bctazmbk.js} +9 -5
  27. package/dist/cli/chunk-bctazmbk.js.map +10 -0
  28. package/dist/cli/chunk-beat36xx.js +279 -0
  29. package/dist/cli/chunk-beat36xx.js.map +10 -0
  30. package/dist/cli/chunk-bnbmcwfb.js +145 -0
  31. package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
  32. package/dist/cli/{chunk-9bkjd11x.js → chunk-bw22s759.js} +15 -5
  33. package/dist/cli/{chunk-9bkjd11x.js.map → chunk-bw22s759.js.map} +4 -4
  34. package/dist/cli/chunk-by2290sx.js +39 -0
  35. package/dist/cli/chunk-by2290sx.js.map +10 -0
  36. package/dist/cli/chunk-d1tadaw7.js +79 -0
  37. package/dist/cli/chunk-d1tadaw7.js.map +10 -0
  38. package/dist/cli/{chunk-t3tj0dgr.js → chunk-d80hr03s.js} +24 -19
  39. package/dist/cli/chunk-d80hr03s.js.map +15 -0
  40. package/dist/cli/chunk-ernrthtr.js +97 -0
  41. package/dist/cli/chunk-ernrthtr.js.map +10 -0
  42. package/dist/cli/chunk-f2972sbt.js +374 -0
  43. package/dist/cli/chunk-f2972sbt.js.map +10 -0
  44. package/dist/cli/{chunk-exeeb35e.js → chunk-f7t03s3g.js} +2 -2
  45. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  46. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  47. package/dist/cli/{chunk-12dxjqk7.js → chunk-fh5hj5jt.js} +44 -21
  48. package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
  49. package/dist/cli/{chunk-8cd8tj54.js → chunk-j8mw0za6.js} +86 -57
  50. package/dist/cli/chunk-j8mw0za6.js.map +35 -0
  51. package/dist/cli/chunk-jts8mvcz.js +106 -0
  52. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  53. package/dist/cli/{chunk-ejjx8znq.js → chunk-mnqj32sj.js} +505 -536
  54. package/dist/cli/chunk-mnqj32sj.js.map +12 -0
  55. package/dist/cli/{chunk-196vjxp9.js → chunk-mwt1k8n7.js} +100 -372
  56. package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
  57. package/dist/cli/chunk-nk3ts2xk.js +51 -0
  58. package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
  59. package/dist/cli/{chunk-n9sra6sy.js → chunk-pat2zzwc.js} +10 -14
  60. package/dist/cli/{chunk-n9sra6sy.js.map → chunk-pat2zzwc.js.map} +2 -2
  61. package/dist/cli/chunk-pnnvybbk.js +176 -0
  62. package/dist/cli/chunk-pnnvybbk.js.map +11 -0
  63. package/dist/cli/{chunk-cvky9gb2.js → chunk-sqn5t4q0.js} +81 -87
  64. package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
  65. package/dist/cli/{chunk-eevwt1sc.js → chunk-tzne8qfq.js} +15 -15
  66. package/dist/cli/{chunk-eevwt1sc.js.map → chunk-tzne8qfq.js.map} +1 -1
  67. package/dist/cli/chunk-xaz13gwg.js +12449 -0
  68. package/dist/cli/chunk-xaz13gwg.js.map +182 -0
  69. package/dist/cli/chunk-y3e45rc8.js +102 -0
  70. package/dist/cli/chunk-y3e45rc8.js.map +10 -0
  71. package/dist/cli/chunk-z01ze5c1.js +261 -0
  72. package/dist/cli/chunk-z01ze5c1.js.map +10 -0
  73. package/dist/cli/{chunk-5n7t497w.js → chunk-z1f5arsg.js} +247 -755
  74. package/dist/cli/chunk-z1f5arsg.js.map +36 -0
  75. package/dist/cli/{chunk-hdm2dkd2.js → chunk-zg2gtj10.js} +1086 -2596
  76. package/dist/cli/chunk-zg2gtj10.js.map +35 -0
  77. package/dist/cli/{chunk-ppfvdcd4.js → chunk-zxccj738.js} +1 -1
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask.d.ts +368 -0
  85. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  86. package/dist/types/ai/component-markdown.d.ts +2 -2
  87. package/dist/types/ai/index.d.ts +24 -0
  88. package/dist/types/ai/link-headers.d.ts +24 -0
  89. package/dist/types/ai/llms.d.ts +25 -0
  90. package/dist/types/ai/markdown.d.ts +45 -0
  91. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  92. package/dist/types/ai/mcp/tools.d.ts +16 -0
  93. package/dist/types/ai/openapi-components.d.ts +43 -0
  94. package/dist/types/ai/relative-links.d.ts +26 -0
  95. package/dist/types/ai/serializers.d.ts +15 -0
  96. package/dist/types/ai/skills.d.ts +42 -0
  97. package/dist/types/ai/tar.d.ts +25 -0
  98. package/dist/types/ai/visibility.d.ts +17 -0
  99. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  100. package/dist/types/analytics/adobe.d.ts +35 -0
  101. package/dist/types/analytics/amplitude.d.ts +50 -0
  102. package/dist/types/analytics/clarity.d.ts +31 -0
  103. package/dist/types/analytics/clearbit.d.ts +29 -0
  104. package/dist/types/analytics/cloudflare.d.ts +41 -0
  105. package/dist/types/analytics/fathom.d.ts +41 -0
  106. package/dist/types/analytics/google-analytics.d.ts +44 -0
  107. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  108. package/dist/types/analytics/head.d.ts +30 -0
  109. package/dist/types/analytics/heap.d.ts +40 -0
  110. package/dist/types/analytics/hightouch.d.ts +44 -0
  111. package/dist/types/analytics/hotjar.d.ts +33 -0
  112. package/dist/types/analytics/index.d.ts +61 -0
  113. package/dist/types/analytics/inline.d.ts +17 -0
  114. package/dist/types/analytics/logrocket.d.ts +44 -0
  115. package/dist/types/analytics/mixpanel.d.ts +67 -0
  116. package/dist/types/analytics/pirsch.d.ts +42 -0
  117. package/dist/types/analytics/plausible.d.ts +56 -0
  118. package/dist/types/analytics/posthog.d.ts +45 -0
  119. package/dist/types/analytics/schema.d.ts +320 -0
  120. package/dist/types/analytics/script.d.ts +46 -0
  121. package/dist/types/analytics/segment.d.ts +50 -0
  122. package/dist/types/analytics/vercel.d.ts +48 -0
  123. package/dist/types/astro/integration.d.ts +76 -0
  124. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  125. package/dist/types/astro/module-types.d.ts +14 -0
  126. package/dist/types/astro/pages.d.ts +44 -0
  127. package/dist/types/cli/env.d.ts +12 -0
  128. package/dist/types/cli/init/scaffold.d.ts +154 -0
  129. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  130. package/dist/types/core/adapter.d.ts +47 -0
  131. package/dist/types/core/api-name.d.ts +7 -0
  132. package/dist/types/core/changelog-index.d.ts +13 -0
  133. package/dist/types/core/config-input.d.ts +209 -505
  134. package/dist/types/core/config.d.ts +60 -34
  135. package/dist/types/core/content-assets.d.ts +76 -0
  136. package/dist/types/core/custom-pages.d.ts +33 -0
  137. package/dist/types/core/data.d.ts +28 -11
  138. package/dist/types/core/define-components.d.ts +12 -9
  139. package/dist/types/core/deployment-env.d.ts +6 -11
  140. package/dist/types/core/frontmatter.d.ts +10 -0
  141. package/dist/types/core/graph.d.ts +18 -0
  142. package/dist/types/core/heading-markers.d.ts +54 -0
  143. package/dist/types/core/i18n-ui.d.ts +6 -2
  144. package/dist/types/core/i18n.d.ts +87 -0
  145. package/dist/types/core/includes.d.ts +138 -0
  146. package/dist/types/core/last-modified.d.ts +47 -0
  147. package/dist/types/core/links.d.ts +95 -0
  148. package/dist/types/core/locale-links.d.ts +60 -0
  149. package/dist/types/core/manifest.d.ts +17 -0
  150. package/dist/types/core/meta.d.ts +38 -0
  151. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  152. package/dist/types/core/navigation.d.ts +6 -0
  153. package/dist/types/core/node-require.d.ts +19 -0
  154. package/dist/types/core/package-json.d.ts +13 -0
  155. package/dist/types/core/probe.d.ts +42 -0
  156. package/dist/types/core/project-graph.d.ts +51 -0
  157. package/dist/types/core/project.d.ts +2 -0
  158. package/dist/types/core/safe-href.d.ts +2 -0
  159. package/dist/types/core/safe-links.d.ts +26 -0
  160. package/dist/types/core/schema.d.ts +2291 -441
  161. package/dist/types/core/site-url.d.ts +16 -0
  162. package/dist/types/core/sources/assets.d.ts +36 -0
  163. package/dist/types/core/sources/cache.d.ts +37 -0
  164. package/dist/types/core/sources/collection.d.ts +28 -0
  165. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  166. package/dist/types/core/sources/contentful.d.ts +40 -0
  167. package/dist/types/core/sources/filesystem.d.ts +24 -0
  168. package/dist/types/core/sources/github-releases.d.ts +31 -0
  169. package/dist/types/core/sources/json.d.ts +30 -0
  170. package/dist/types/core/sources/lexical.d.ts +19 -0
  171. package/dist/types/core/sources/lower.d.ts +75 -0
  172. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  173. package/dist/types/core/sources/normalize.d.ts +147 -0
  174. package/dist/types/core/sources/notion.d.ts +131 -0
  175. package/dist/types/core/sources/obsidian.d.ts +46 -0
  176. package/dist/types/core/sources/payload.d.ts +39 -0
  177. package/dist/types/core/sources/portable-text.d.ts +42 -0
  178. package/dist/types/core/sources/read.d.ts +23 -0
  179. package/dist/types/core/sources/remote.d.ts +74 -0
  180. package/dist/types/core/sources/resolve.d.ts +19 -0
  181. package/dist/types/core/sources/sanity.d.ts +43 -0
  182. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  183. package/dist/types/core/sources/strapi.d.ts +33 -0
  184. package/dist/types/core/sources/types.d.ts +7 -0
  185. package/dist/types/core/sources/watch.d.ts +45 -0
  186. package/dist/types/core/text-width.d.ts +11 -0
  187. package/dist/types/core/types.d.ts +20 -1
  188. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  189. package/dist/types/core/versions.d.ts +72 -0
  190. package/dist/types/core/yaml.d.ts +9 -0
  191. package/dist/types/deploy/adapter-output.d.ts +45 -0
  192. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  193. package/dist/types/deploy/adapters/index.d.ts +29 -0
  194. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  195. package/dist/types/deploy/adapters/node.d.ts +37 -0
  196. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  197. package/dist/types/deploy/adapters/types.d.ts +71 -0
  198. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  199. package/dist/types/deploy/artifacts.d.ts +65 -0
  200. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  201. package/dist/types/deploy/function-bundle.d.ts +80 -0
  202. package/dist/types/deploy/headers.d.ts +50 -0
  203. package/dist/types/deploy/node-headers.d.ts +42 -0
  204. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  205. package/dist/types/deploy/platforms/index.d.ts +18 -0
  206. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  207. package/dist/types/deploy/platforms/node.d.ts +11 -0
  208. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  209. package/dist/types/deploy/platforms/static.d.ts +10 -0
  210. package/dist/types/deploy/platforms/types.d.ts +104 -0
  211. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  212. package/dist/types/deploy/redirects.d.ts +53 -0
  213. package/dist/types/deploy/robots.d.ts +8 -0
  214. package/dist/types/deploy/rss.d.ts +31 -0
  215. package/dist/types/deploy/sitemap.d.ts +21 -0
  216. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  217. package/dist/types/markdown/code-title.d.ts +32 -0
  218. package/dist/types/markdown/fence-meta.d.ts +23 -0
  219. package/dist/types/markdown/themes.d.ts +3 -3
  220. package/dist/types/openapi/asyncapi.d.ts +129 -0
  221. package/dist/types/openapi/graphql-build.d.ts +8 -0
  222. package/dist/types/openapi/graphql.d.ts +122 -0
  223. package/dist/types/openapi/model.d.ts +158 -0
  224. package/dist/types/openapi/parse.d.ts +57 -0
  225. package/dist/types/openapi/references.d.ts +37 -25
  226. package/dist/types/openapi/render-mdx.d.ts +33 -0
  227. package/dist/types/openapi/sentence.d.ts +7 -0
  228. package/dist/types/openapi/signature.d.ts +10 -0
  229. package/dist/types/openapi/source.d.ts +22 -0
  230. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  231. package/dist/types/reference/asyncapi.d.ts +166 -0
  232. package/dist/types/reference/graphql.d.ts +181 -0
  233. package/dist/types/reference/index.d.ts +32 -0
  234. package/dist/types/reference/openapi.d.ts +165 -0
  235. package/dist/types/reference/options.d.ts +157 -0
  236. package/dist/types/reference/scalar.d.ts +136 -0
  237. package/dist/types/reference/schema.d.ts +630 -0
  238. package/dist/types/search/adapters/algolia.d.ts +32 -0
  239. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  240. package/dist/types/search/adapters/index.d.ts +31 -0
  241. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  242. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  243. package/dist/types/search/adapters/orama.d.ts +13 -0
  244. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  245. package/dist/types/search/adapters/registry.d.ts +228 -0
  246. package/dist/types/search/adapters/types.d.ts +34 -0
  247. package/dist/types/search/adapters/typesense.d.ts +42 -0
  248. package/dist/types/search/build.d.ts +23 -0
  249. package/dist/types/search/documents.d.ts +90 -0
  250. package/dist/types/search/facets.d.ts +3 -0
  251. package/dist/types/search/sync/algolia.d.ts +14 -0
  252. package/dist/types/search/sync/index.d.ts +14 -0
  253. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  254. package/dist/types/search/sync/typesense.d.ts +14 -0
  255. package/dist/types/sources/contentful.d.ts +68 -0
  256. package/dist/types/sources/custom.d.ts +20 -0
  257. package/dist/types/sources/filesystem.d.ts +42 -0
  258. package/dist/types/sources/github-releases.d.ts +46 -0
  259. package/dist/types/sources/index.d.ts +48 -0
  260. package/dist/types/sources/mdx-remote.d.ts +63 -0
  261. package/dist/types/sources/notion.d.ts +65 -0
  262. package/dist/types/sources/obsidian.d.ts +34 -0
  263. package/dist/types/sources/payload.d.ts +68 -0
  264. package/dist/types/sources/registry.d.ts +1414 -0
  265. package/dist/types/sources/sanity.d.ts +69 -0
  266. package/dist/types/sources/shared.d.ts +46 -0
  267. package/dist/types/sources/strapi.d.ts +66 -0
  268. package/dist/types/theme/icon-kind.d.ts +11 -0
  269. package/dist/types/theme/icons.d.ts +20 -0
  270. package/docs/01-quickstart.mdx +18 -18
  271. package/docs/02-deployment.mdx +50 -26
  272. package/docs/03-upgrading.mdx +351 -0
  273. package/docs/04-migrating.mdx +58 -0
  274. package/docs/08-faq.mdx +3 -3
  275. package/docs/advanced/blog.mdx +13 -6
  276. package/docs/advanced/changelog.mdx +23 -35
  277. package/docs/advanced/custom-pages.mdx +20 -8
  278. package/docs/advanced/meta.ts +1 -8
  279. package/docs/advanced/skills.mdx +8 -0
  280. package/docs/cli/audit.mdx +646 -0
  281. package/docs/cli/doctor.mdx +29 -0
  282. package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
  283. package/docs/cli/index.mdx +105 -0
  284. package/docs/cli/meta.ts +7 -0
  285. package/docs/{reference → cli}/translate.mdx +1 -1
  286. package/docs/cli/validate.mdx +41 -0
  287. package/docs/cli/version.mdx +40 -0
  288. package/docs/configuration/analytics.mdx +350 -59
  289. package/docs/configuration/ask-ai.mdx +176 -61
  290. package/docs/configuration/customization.mdx +15 -9
  291. package/docs/configuration/index.mdx +52 -31
  292. package/docs/configuration/search.mdx +75 -54
  293. package/docs/configuration/theming.mdx +24 -15
  294. package/docs/content/components.mdx +21 -5
  295. package/docs/{reference → content}/frontmatter.mdx +37 -1
  296. package/docs/content/i18n.mdx +8 -6
  297. package/docs/content/includes.mdx +2 -4
  298. package/docs/content/index.mdx +1 -1
  299. package/docs/content/islands.mdx +10 -5
  300. package/docs/content/meta.mdx +1 -1
  301. package/docs/content/meta.ts +1 -0
  302. package/docs/content/navigation.mdx +12 -7
  303. package/docs/content/sources.mdx +145 -50
  304. package/docs/content/syntax.mdx +26 -12
  305. package/docs/content/versioning.mdx +3 -3
  306. package/docs/discoverability/agent-discovery.mdx +91 -10
  307. package/docs/discoverability/index.mdx +5 -5
  308. package/docs/discoverability/json-api.mdx +4 -4
  309. package/docs/discoverability/llms-txt.mdx +6 -6
  310. package/docs/discoverability/markdown.mdx +4 -4
  311. package/docs/discoverability/mcp.mdx +11 -11
  312. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  313. package/docs/index.mdx +2 -2
  314. package/docs/references/asyncapi.mdx +59 -0
  315. package/docs/{advanced → references}/graphql.mdx +45 -32
  316. package/docs/{reference → references}/meta.ts +2 -2
  317. package/docs/references/openapi.mdx +171 -0
  318. package/docs/references/scalar.mdx +64 -0
  319. package/package.json +42 -8
  320. package/skills/blume/SKILL.md +21 -8
  321. package/skills/blume-migrate/SKILL.md +22 -21
  322. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  323. package/skills/blume-migrate/references/docusaurus.md +5 -4
  324. package/skills/blume-migrate/references/fumadocs.md +4 -4
  325. package/skills/blume-migrate/references/mintlify.md +23 -8
  326. package/skills/blume-migrate/references/monorepo.md +6 -6
  327. package/skills/blume-migrate/references/starlight.md +4 -4
  328. package/src/ai/agent-readability.ts +26 -22
  329. package/src/ai/ai-catalog.ts +259 -0
  330. package/src/ai/api/handlers.ts +46 -11
  331. package/src/ai/api-catalog.ts +8 -8
  332. package/src/ai/ask-data.ts +1 -1
  333. package/src/ai/ask.ts +624 -100
  334. package/src/ai/changelog-markdown.ts +91 -0
  335. package/src/ai/component-markdown.ts +328 -12
  336. package/src/ai/index.ts +45 -0
  337. package/src/ai/link-headers.ts +19 -6
  338. package/src/ai/llms.ts +26 -15
  339. package/src/ai/markdown.ts +35 -5
  340. package/src/ai/mcp/data.ts +9 -5
  341. package/src/ai/mcp/discovery.ts +1 -1
  342. package/src/ai/openapi-components.ts +4 -1
  343. package/src/ai/relative-links.ts +170 -0
  344. package/src/ai/serializers.ts +2 -2
  345. package/src/ai/skills.ts +1 -1
  346. package/src/ai/web-bot-auth.ts +2 -2
  347. package/src/analytics/adobe.ts +46 -0
  348. package/src/analytics/amplitude.ts +79 -0
  349. package/src/analytics/clarity.ts +46 -0
  350. package/src/analytics/clearbit.ts +47 -0
  351. package/src/analytics/cloudflare.ts +67 -0
  352. package/src/analytics/fathom.ts +64 -0
  353. package/src/analytics/google-analytics.ts +84 -0
  354. package/src/analytics/google-tag-manager.ts +61 -0
  355. package/src/analytics/head.ts +130 -0
  356. package/src/analytics/heap.ts +65 -0
  357. package/src/analytics/hightouch.ts +77 -0
  358. package/src/analytics/hotjar.ts +47 -0
  359. package/src/analytics/index.ts +71 -0
  360. package/src/analytics/inline.ts +21 -0
  361. package/src/analytics/logrocket.ts +71 -0
  362. package/src/analytics/mixpanel.ts +92 -0
  363. package/src/analytics/pirsch.ts +66 -0
  364. package/src/analytics/plausible.ts +83 -0
  365. package/src/analytics/posthog.ts +78 -0
  366. package/src/analytics/schema.ts +60 -0
  367. package/src/analytics/script.ts +60 -0
  368. package/src/analytics/segment.ts +85 -0
  369. package/src/analytics/vercel.ts +50 -0
  370. package/src/astro/adapter-root.ts +7 -9
  371. package/src/astro/component-slots.ts +131 -91
  372. package/src/astro/generate.ts +114 -345
  373. package/src/astro/integration.ts +2 -6
  374. package/src/astro/pages.ts +13 -101
  375. package/src/astro/render-deps.ts +379 -0
  376. package/src/astro/runtime-deps.ts +201 -0
  377. package/src/astro/templates.ts +554 -541
  378. package/src/audit/agent.ts +24 -0
  379. package/src/audit/catalog.ts +2 -2
  380. package/src/audit/checks/assets.ts +2 -2
  381. package/src/audit/checks/dns-aid.ts +1 -1
  382. package/src/audit/checks/duplicates.ts +3 -1
  383. package/src/audit/checks/i18n.ts +1 -1
  384. package/src/audit/checks/indexability.ts +7 -7
  385. package/src/audit/checks/links.ts +2 -2
  386. package/src/audit/checks/llms.ts +6 -6
  387. package/src/audit/checks/network.ts +3 -3
  388. package/src/audit/checks/og-image.ts +2 -2
  389. package/src/audit/checks/robots.ts +1 -1
  390. package/src/audit/checks/sitemap.ts +2 -2
  391. package/src/audit/checks/social.ts +1 -1
  392. package/src/audit/run.ts +4 -3
  393. package/src/audit/terms.ts +31 -0
  394. package/src/audit/url.ts +13 -13
  395. package/src/cli/command-meta.ts +10 -0
  396. package/src/cli/commands/audit.ts +39 -20
  397. package/src/cli/commands/build.ts +71 -314
  398. package/src/cli/commands/check.ts +1 -0
  399. package/src/cli/commands/dev.ts +40 -1
  400. package/src/cli/commands/doctor.ts +90 -14
  401. package/src/cli/commands/eject.ts +44 -7
  402. package/src/cli/commands/eval.ts +2 -2
  403. package/src/cli/commands/init.ts +161 -41
  404. package/src/cli/commands/migrate.ts +121 -0
  405. package/src/cli/commands/preview.ts +7 -1
  406. package/src/cli/commands/translate.ts +2 -2
  407. package/src/cli/commands/upgrade.ts +141 -0
  408. package/src/cli/commands/version.ts +57 -44
  409. package/src/cli/eject-scripts.ts +121 -6
  410. package/src/cli/index.ts +11 -1
  411. package/src/cli/init/install.ts +70 -0
  412. package/src/cli/init/questions.ts +7 -0
  413. package/src/cli/init/scaffold.ts +459 -75
  414. package/src/cli/lazy-command.ts +37 -1
  415. package/src/cli/prepare.ts +40 -6
  416. package/src/cli/required-secrets.ts +38 -11
  417. package/src/cli/unknown-flags.ts +266 -0
  418. package/src/cli/yarn-pnp.ts +52 -0
  419. package/src/components/content/AccordionItem.astro +7 -1
  420. package/src/components/content/Card.astro +4 -3
  421. package/src/components/content/ColorItem.astro +22 -4
  422. package/src/components/content/GithubInfo.astro +2 -2
  423. package/src/components/content/Prompt.astro +25 -25
  424. package/src/components/content/Tabs.astro +3 -1
  425. package/src/components/content/Tile.astro +2 -3
  426. package/src/components/content/Tooltip.astro +57 -9
  427. package/src/components/content/content-strings.ts +34 -0
  428. package/src/components/content/diff.ts +1 -1
  429. package/src/components/content/mermaid-element.ts +13 -2
  430. package/src/components/content/prompt-markdown.ts +292 -0
  431. package/src/components/content/tooltip-id.ts +41 -0
  432. package/src/components/islands/hooks.ts +75 -3
  433. package/src/components/layout/Analytics.astro +21 -79
  434. package/src/components/layout/Banner.astro +3 -1
  435. package/src/components/layout/DiscoveryLinks.astro +69 -0
  436. package/src/components/layout/Header.astro +83 -20
  437. package/src/components/layout/LanguageSwitcher.astro +4 -1
  438. package/src/components/layout/Logo.astro +23 -2
  439. package/src/components/layout/NavSelector.astro +13 -2
  440. package/src/components/layout/NavTree.astro +12 -3
  441. package/src/components/layout/NavTreeScript.astro +17 -3
  442. package/src/components/layout/PageActions.astro +3 -3
  443. package/src/components/layout/PageFeedback.astro +11 -1
  444. package/src/components/layout/PageLayout.astro +52 -5
  445. package/src/components/layout/ReferenceLayout.astro +21 -12
  446. package/src/components/layout/RootLayout.astro +69 -43
  447. package/src/components/layout/Search.astro +30 -6
  448. package/src/components/layout/WebMcp.astro +1 -1
  449. package/src/components/layout/analytics-client.ts +101 -15
  450. package/src/components/layout/drawer-inert.ts +113 -15
  451. package/src/components/layout/dropdown-clamp.ts +105 -0
  452. package/src/components/layout/head-scripts.ts +15 -6
  453. package/src/components/layout/nav-utils.ts +17 -0
  454. package/src/components/layout/search/algolia.ts +8 -8
  455. package/src/components/layout/search/orama-cloud.ts +9 -7
  456. package/src/components/layout/search/typesense.ts +11 -17
  457. package/src/components/openapi/MessageComposer.astro +2 -2
  458. package/src/components/openapi/Playground.astro +2 -2
  459. package/src/components/openapi/playground-client.ts +79 -10
  460. package/src/core/changelog-index.ts +24 -0
  461. package/src/core/component-overrides.ts +399 -154
  462. package/src/core/config-input.ts +212 -543
  463. package/src/core/config.ts +130 -41
  464. package/src/core/custom-pages.ts +105 -0
  465. package/src/core/data.ts +32 -11
  466. package/src/core/define-components.ts +12 -9
  467. package/src/core/deployment-env.ts +18 -74
  468. package/src/core/diagnostics.ts +14 -7
  469. package/src/core/graph.ts +69 -25
  470. package/src/core/i18n-ui.ts +6 -2
  471. package/src/core/i18n.ts +17 -0
  472. package/src/core/includes.ts +156 -38
  473. package/src/core/last-modified.ts +6 -11
  474. package/src/core/links.ts +166 -2
  475. package/src/core/manifest.ts +10 -3
  476. package/src/core/navigation.ts +137 -19
  477. package/src/core/new-tab.ts +35 -0
  478. package/src/core/node-require.ts +21 -0
  479. package/src/core/project-graph.ts +42 -26
  480. package/src/core/project.ts +9 -4
  481. package/src/core/request-body.ts +61 -0
  482. package/src/core/safe-href.ts +28 -0
  483. package/src/core/safe-links.ts +68 -0
  484. package/src/core/schema.ts +531 -721
  485. package/src/core/server-features.ts +8 -9
  486. package/src/core/sources/assets.ts +47 -11
  487. package/src/core/sources/collection.ts +67 -0
  488. package/src/core/sources/contentful-rich-text.ts +285 -0
  489. package/src/core/sources/contentful.ts +173 -0
  490. package/src/core/sources/github-releases.ts +51 -1
  491. package/src/core/sources/json.ts +71 -0
  492. package/src/core/sources/lexical.ts +195 -0
  493. package/src/core/sources/lower.ts +226 -0
  494. package/src/core/sources/normalize.ts +52 -2
  495. package/src/core/sources/notion.ts +39 -28
  496. package/src/core/sources/payload.ts +135 -0
  497. package/src/core/sources/portable-text.ts +11 -16
  498. package/src/core/sources/remote.ts +226 -0
  499. package/src/core/sources/resolve.ts +104 -166
  500. package/src/core/sources/sanity.ts +16 -49
  501. package/src/core/sources/strapi-blocks.ts +124 -0
  502. package/src/core/sources/strapi.ts +191 -0
  503. package/src/core/sources/types.ts +12 -1
  504. package/src/core/types.ts +20 -1
  505. package/src/core/ui-packs/ar.ts +6 -2
  506. package/src/core/ui-packs/bg.ts +6 -2
  507. package/src/core/ui-packs/bn.ts +6 -2
  508. package/src/core/ui-packs/ca.ts +3 -1
  509. package/src/core/ui-packs/cs.ts +6 -2
  510. package/src/core/ui-packs/da.ts +6 -2
  511. package/src/core/ui-packs/de.ts +6 -2
  512. package/src/core/ui-packs/el.ts +3 -1
  513. package/src/core/ui-packs/es.ts +3 -1
  514. package/src/core/ui-packs/fa.ts +6 -2
  515. package/src/core/ui-packs/fi.ts +6 -2
  516. package/src/core/ui-packs/fr.ts +3 -1
  517. package/src/core/ui-packs/he.ts +6 -2
  518. package/src/core/ui-packs/hi.ts +6 -2
  519. package/src/core/ui-packs/hr.ts +6 -2
  520. package/src/core/ui-packs/hu.ts +6 -2
  521. package/src/core/ui-packs/id.ts +6 -2
  522. package/src/core/ui-packs/it.ts +3 -1
  523. package/src/core/ui-packs/ja.ts +3 -1
  524. package/src/core/ui-packs/ko.ts +3 -1
  525. package/src/core/ui-packs/nl.ts +6 -2
  526. package/src/core/ui-packs/no.ts +6 -2
  527. package/src/core/ui-packs/pl.ts +6 -2
  528. package/src/core/ui-packs/pt-br.ts +3 -1
  529. package/src/core/ui-packs/pt.ts +3 -1
  530. package/src/core/ui-packs/ro.ts +6 -2
  531. package/src/core/ui-packs/ru.ts +6 -2
  532. package/src/core/ui-packs/sk.ts +6 -2
  533. package/src/core/ui-packs/sr.ts +6 -2
  534. package/src/core/ui-packs/sv.ts +6 -2
  535. package/src/core/ui-packs/th.ts +3 -1
  536. package/src/core/ui-packs/tr.ts +6 -2
  537. package/src/core/ui-packs/uk.ts +6 -2
  538. package/src/core/ui-packs/vi.ts +3 -1
  539. package/src/core/ui-packs/zh-tw.ts +3 -1
  540. package/src/core/ui-packs/zh.ts +3 -1
  541. package/src/core/unrecognized-keys.ts +10 -0
  542. package/src/core/version-cut.ts +116 -8
  543. package/src/deploy/adapter-output.ts +57 -97
  544. package/src/deploy/adapters/cloudflare.ts +39 -0
  545. package/src/deploy/adapters/index.ts +41 -0
  546. package/src/deploy/adapters/netlify.ts +34 -0
  547. package/src/deploy/adapters/node.ts +34 -0
  548. package/src/deploy/adapters/registry.ts +127 -0
  549. package/src/deploy/adapters/types.ts +92 -0
  550. package/src/deploy/adapters/vercel.ts +35 -0
  551. package/src/deploy/artifacts.ts +67 -28
  552. package/src/deploy/cloudflare-negotiation.ts +179 -100
  553. package/src/deploy/function-bundle.ts +18 -3
  554. package/src/deploy/headers.ts +129 -22
  555. package/src/deploy/node-headers.ts +198 -0
  556. package/src/deploy/platforms/cloudflare.ts +312 -0
  557. package/src/deploy/platforms/index.ts +67 -0
  558. package/src/deploy/platforms/netlify.ts +52 -0
  559. package/src/deploy/platforms/node.ts +40 -0
  560. package/src/deploy/platforms/paths.ts +42 -0
  561. package/src/deploy/platforms/static.ts +29 -0
  562. package/src/deploy/platforms/types.ts +112 -0
  563. package/src/deploy/platforms/vercel.ts +193 -0
  564. package/src/deploy/redirects.ts +30 -18
  565. package/src/deploy/robots.ts +3 -3
  566. package/src/deploy/rss.ts +2 -2
  567. package/src/deploy/sitemap.ts +2 -2
  568. package/src/deploy/vercel-negotiation.ts +27 -4
  569. package/src/eval/agents.ts +32 -1
  570. package/src/eval/findings.ts +19 -11
  571. package/src/eval/report.ts +10 -2
  572. package/src/markdown/external-links.ts +65 -0
  573. package/src/markdown/include.ts +45 -27
  574. package/src/markdown/index.ts +34 -9
  575. package/src/markdown/inline-code.ts +12 -6
  576. package/src/markdown/relative-links.ts +324 -0
  577. package/src/markdown/themes.ts +3 -3
  578. package/src/migrate/migrate.ts +149 -0
  579. package/src/openapi/parse.ts +64 -16
  580. package/src/openapi/proxy.ts +62 -10
  581. package/src/openapi/references.ts +147 -147
  582. package/src/openapi/render-mdx.ts +32 -10
  583. package/src/openapi/scalar.ts +15 -13
  584. package/src/openapi/sentence.ts +14 -0
  585. package/src/openapi/source.ts +37 -21
  586. package/src/openapi/spec-dependency-error.ts +15 -0
  587. package/src/reference/asyncapi.ts +83 -0
  588. package/src/reference/graphql.ts +89 -0
  589. package/src/reference/index.ts +40 -0
  590. package/src/reference/openapi.ts +83 -0
  591. package/src/reference/options.ts +201 -0
  592. package/src/reference/scalar.ts +136 -0
  593. package/src/reference/schema.ts +88 -0
  594. package/src/registry/eject.ts +97 -42
  595. package/src/search/adapters/algolia.ts +46 -0
  596. package/src/search/adapters/flexsearch.ts +29 -0
  597. package/src/search/adapters/index.ts +39 -0
  598. package/src/search/adapters/mixedbread.ts +39 -0
  599. package/src/search/adapters/orama-cloud.ts +51 -0
  600. package/src/search/adapters/orama.ts +24 -0
  601. package/src/search/adapters/pagefind.ts +27 -0
  602. package/src/search/adapters/registry.ts +131 -0
  603. package/src/search/adapters/types.ts +46 -0
  604. package/src/search/adapters/typesense.ts +57 -0
  605. package/src/search/build.ts +33 -7
  606. package/src/search/documents.ts +6 -0
  607. package/src/search/sync/algolia.ts +12 -11
  608. package/src/search/sync/index.ts +35 -20
  609. package/src/search/sync/orama-cloud.ts +12 -9
  610. package/src/search/sync/typesense.ts +15 -13
  611. package/src/sources/contentful.ts +63 -0
  612. package/src/sources/custom.ts +38 -0
  613. package/src/sources/filesystem.ts +51 -0
  614. package/src/sources/github-releases.ts +52 -0
  615. package/src/sources/index.ts +60 -0
  616. package/src/sources/mdx-remote.ts +76 -0
  617. package/src/sources/notion.ts +63 -0
  618. package/src/sources/obsidian.ts +38 -0
  619. package/src/sources/payload.ts +60 -0
  620. package/src/sources/registry.ts +182 -0
  621. package/src/sources/sanity.ts +66 -0
  622. package/src/sources/shared.ts +52 -0
  623. package/src/sources/strapi.ts +58 -0
  624. package/src/theme/entry.ts +47 -2
  625. package/src/translate/report.ts +40 -7
  626. package/src/upgrade/upgrade.ts +499 -0
  627. package/dist/cli/chunk-12dxjqk7.js.map +0 -10
  628. package/dist/cli/chunk-196vjxp9.js.map +0 -13
  629. package/dist/cli/chunk-2mzebbbz.js +0 -69
  630. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  631. package/dist/cli/chunk-30e87n55.js +0 -108
  632. package/dist/cli/chunk-30e87n55.js.map +0 -10
  633. package/dist/cli/chunk-450a7rcr.js +0 -185
  634. package/dist/cli/chunk-450a7rcr.js.map +0 -11
  635. package/dist/cli/chunk-5n7t497w.js.map +0 -40
  636. package/dist/cli/chunk-61j18dwk.js +0 -5342
  637. package/dist/cli/chunk-61j18dwk.js.map +0 -58
  638. package/dist/cli/chunk-88by27n5.js +0 -17
  639. package/dist/cli/chunk-88by27n5.js.map +0 -10
  640. package/dist/cli/chunk-8cd8tj54.js.map +0 -34
  641. package/dist/cli/chunk-aztttvb3.js +0 -381
  642. package/dist/cli/chunk-aztttvb3.js.map +0 -12
  643. package/dist/cli/chunk-cvky9gb2.js.map +0 -11
  644. package/dist/cli/chunk-ejjx8znq.js.map +0 -15
  645. package/dist/cli/chunk-fmceyezb.js +0 -1007
  646. package/dist/cli/chunk-fmceyezb.js.map +0 -13
  647. package/dist/cli/chunk-hdm2dkd2.js.map +0 -48
  648. package/dist/cli/chunk-hs3gbh8p.js.map +0 -10
  649. package/dist/cli/chunk-jbj4qhfw.js +0 -30
  650. package/dist/cli/chunk-jbj4qhfw.js.map +0 -10
  651. package/dist/cli/chunk-mqb2ka8m.js +0 -68
  652. package/dist/cli/chunk-mqb2ka8m.js.map +0 -10
  653. package/dist/cli/chunk-mt76t7dj.js.map +0 -11
  654. package/dist/cli/chunk-q4rae3bg.js +0 -60
  655. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  656. package/dist/cli/chunk-ra1v2nc2.js +0 -35
  657. package/dist/cli/chunk-ra1v2nc2.js.map +0 -10
  658. package/dist/cli/chunk-t3tj0dgr.js.map +0 -15
  659. package/dist/cli/chunk-tqa1s0k8.js +0 -69
  660. package/dist/cli/chunk-tqa1s0k8.js.map +0 -11
  661. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  662. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  663. package/dist/cli/chunk-vkrsvbr5.js +0 -107
  664. package/dist/cli/chunk-vkrsvbr5.js.map +0 -11
  665. package/dist/cli/chunk-vrfp10qk.js +0 -81
  666. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  667. package/dist/cli/chunk-wjt80jps.js +0 -1049
  668. package/dist/cli/chunk-wjt80jps.js.map +0 -24
  669. package/docs/advanced/api-reference.mdx +0 -240
  670. package/docs/reference/cli.mdx +0 -197
  671. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  672. package/src/components/content/changelog-element.ts +0 -69
  673. package/src/search/providers.ts +0 -91
  674. /package/dist/cli/{chunk-3w7b2vcx.js.map → chunk-7ez8ny0t.js.map} +0 -0
  675. /package/dist/cli/{chunk-688e0dde.js.map → chunk-88cpgt6h.js.map} +0 -0
  676. /package/dist/cli/{chunk-exeeb35e.js.map → chunk-f7t03s3g.js.map} +0 -0
  677. /package/dist/cli/{chunk-ppfvdcd4.js.map → chunk-zxccj738.js.map} +0 -0
@@ -0,0 +1,136 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import { hasSources, missingSourcesIssue } from "./options.ts";
6
+
7
+ /**
8
+ * What the generated Scalar page imports. Declared on every `scalar()`
9
+ * descriptor so the generated project lists it, which is what lets Astro's
10
+ * framework-package crawl bundle the embed.
11
+ */
12
+ export const SCALAR_RUNTIME_DEPS: readonly string[] = ["@scalar/astro"];
13
+
14
+ /**
15
+ * A single document rendered by a `scalar()` reference. Scalar reads OpenAPI
16
+ * and AsyncAPI documents and detects which it was given, so there is one
17
+ * source shape for both. The embed sits outside Blume's search and llms.txt,
18
+ * so of the native per-source controls only `noindex` applies here.
19
+ */
20
+ export const scalarSourceSchema = z.strictObject({
21
+ /** Nav/section label for this source. */
22
+ label: z.string().optional(),
23
+ /** Emit noindex metadata and omit the page from the sitemap. */
24
+ noindex: z.boolean().default(false),
25
+ /** Per-source route; defaults to the adapter's `route` (or a derived path). */
26
+ route: z.string().optional(),
27
+ /** Local path or `http(s)` URL to the OpenAPI or AsyncAPI document. */
28
+ spec: z.string(),
29
+ });
30
+
31
+ /** One document source, as `scalar()` accepts it. */
32
+ export interface ScalarSourceOptions {
33
+ /** Nav/section label for this source. */
34
+ label?: string;
35
+ /** Emit noindex metadata and omit the page from the sitemap. Defaults to `false`. */
36
+ noindex?: boolean;
37
+ /** Per-source route; defaults to the adapter's `route` (or a derived path). */
38
+ route?: string;
39
+ /** Local path or `http(s)` URL to the OpenAPI or AsyncAPI document. */
40
+ spec: string;
41
+ }
42
+
43
+ /** A source with every default applied. */
44
+ export type ResolvedScalarSource = z.output<typeof scalarSourceSchema>;
45
+
46
+ /**
47
+ * `scalar()` options with every default applied and `spec` folded into
48
+ * `sources`; every key beyond the named ones is forwarded Scalar config.
49
+ */
50
+ export type ResolvedScalarOptions = {
51
+ route: string;
52
+ sources: ResolvedScalarSource[];
53
+ theme?: string;
54
+ } & { [option: string]: JsonValue };
55
+
56
+ /** The options {@link scalar} maps itself. */
57
+ export interface ScalarNamedOptions {
58
+ /** Where the reference mounts. Defaults to `/reference`. */
59
+ route?: string;
60
+ /** One or more documents; each renders on its own route by default. */
61
+ sources?: ScalarSourceOptions[];
62
+ /** Shorthand for a single source: `sources: [{ spec }]`. */
63
+ spec?: string;
64
+ /** A Scalar theme name (`purple`, `moon`, …). Unset keeps Scalar's default theme with Blume's accent and radius layered on top. */
65
+ theme?: string;
66
+ }
67
+
68
+ /**
69
+ * Options for {@link scalar}: the source, route, and `theme` Blume maps, plus
70
+ * any other [Scalar configuration](https://github.com/scalar/scalar/blob/main/documentation/configuration.md)
71
+ * key, forwarded verbatim to the embedded `<ScalarComponent>` (`localization`,
72
+ * `agent`, `hideTestRequestButton`, `orderSchemaPropertiesBy`, …). Blume
73
+ * doesn't mirror Scalar's config surface, so this is a full escape hatch: a
74
+ * forwarded key wins over Blume's own derived spec/theme config. JSON values
75
+ * only — the configuration is inlined into the generated page. `sources` is
76
+ * Blume's (one page per document); Scalar's own multi-document `sources`
77
+ * can't be forwarded.
78
+ */
79
+ export type ScalarOptions = ScalarNamedOptions & {
80
+ [option: string]: JsonValue;
81
+ };
82
+
83
+ /**
84
+ * `spec` is the single-source shorthand and folds into `sources` at parse
85
+ * (through the source schema, so the two can never drift); every key beyond
86
+ * the named ones is Scalar configuration and passes through untouched.
87
+ */
88
+ export const scalarOptionsSchema = z
89
+ .object({
90
+ /** Where the reference mounts. */
91
+ route: z.string().default("/reference"),
92
+ /** One or more documents; each renders on its own route by default. */
93
+ sources: z.array(scalarSourceSchema).default([]),
94
+ /** Shorthand for a single source: `sources: [{ spec }]`. */
95
+ spec: z.string().optional(),
96
+ /** A Scalar theme name; unset layers Blume's accent and radius on Scalar's default theme. */
97
+ theme: z.string().optional(),
98
+ })
99
+ .catchall(z.json())
100
+ .transform(({ spec, sources, ...options }): ResolvedScalarOptions => ({
101
+ ...options,
102
+ sources:
103
+ spec === undefined
104
+ ? sources
105
+ : [scalarSourceSchema.parse({ spec }), ...sources],
106
+ }))
107
+ .refine(hasSources, missingSourcesIssue("scalar"));
108
+
109
+ export type ScalarAdapter = AdapterDescriptor<"scalar", ScalarOptions>;
110
+
111
+ /** A `scalar()` descriptor as the config schema resolves it. */
112
+ export type ResolvedScalarAdapter = AdapterDescriptor<
113
+ "scalar",
114
+ ResolvedScalarOptions
115
+ >;
116
+
117
+ export const scalarAdapterSchema = adapterDescriptorSchema(
118
+ "scalar",
119
+ scalarOptionsSchema
120
+ );
121
+
122
+ /**
123
+ * An API reference rendered by [Scalar](https://scalar.com)'s self-contained
124
+ * UI — its own sidebar, search, theme, and request client on a single route —
125
+ * instead of Blume's native operation pages. Takes an OpenAPI or AsyncAPI
126
+ * document (Scalar detects which); a GraphQL schema has no Scalar embed.
127
+ * Blume's per-page controls don't apply: the embed doesn't weave into the
128
+ * sidebar, search, or llms.txt, and it brings its own request client in place
129
+ * of the Try it playground.
130
+ */
131
+ export const scalar = (options: ScalarOptions): ScalarAdapter => ({
132
+ kind: "scalar",
133
+ options,
134
+ requiredSecrets: [],
135
+ runtimeDeps: [...SCALAR_RUNTIME_DEPS],
136
+ });
@@ -0,0 +1,88 @@
1
+ import { z } from "zod";
2
+
3
+ import { unrecognizedKeysMessage } from "../core/unrecognized-keys.ts";
4
+ import { asyncapiAdapterSchema } from "./asyncapi.ts";
5
+ import type { AsyncApiAdapter, ResolvedAsyncApiAdapter } from "./asyncapi.ts";
6
+ import { graphqlAdapterSchema } from "./graphql.ts";
7
+ import type { GraphqlAdapter, ResolvedGraphqlAdapter } from "./graphql.ts";
8
+ import { openapiAdapterSchema } from "./openapi.ts";
9
+ import type { OpenApiAdapter, ResolvedOpenApiAdapter } from "./openapi.ts";
10
+ import { SCALAR_RUNTIME_DEPS, scalarAdapterSchema } from "./scalar.ts";
11
+ import type { ResolvedScalarAdapter, ScalarAdapter } from "./scalar.ts";
12
+
13
+ /** Every descriptor a `blume/reference` factory can return. */
14
+ export type ReferenceAdapter =
15
+ | AsyncApiAdapter
16
+ | GraphqlAdapter
17
+ | OpenApiAdapter
18
+ | ScalarAdapter;
19
+
20
+ /** What `config.reference` holds: each descriptor with its options resolved. */
21
+ export type ResolvedReferenceAdapter =
22
+ | ResolvedAsyncApiAdapter
23
+ | ResolvedGraphqlAdapter
24
+ | ResolvedOpenApiAdapter
25
+ | ResolvedScalarAdapter;
26
+
27
+ /**
28
+ * One configured reference adapter, as its factory returned it. Only `kind`
29
+ * and `options` carry information — the metadata lists are validated for
30
+ * shape, then re-derived from the resolved options so a descriptor that went
31
+ * through JSON resolves to the same canonical metadata the factory ships.
32
+ */
33
+ export const referenceAdapterSchema = z
34
+ .discriminatedUnion("kind", [
35
+ asyncapiAdapterSchema,
36
+ graphqlAdapterSchema,
37
+ openapiAdapterSchema,
38
+ scalarAdapterSchema,
39
+ ])
40
+ .transform((value): ResolvedReferenceAdapter => ({
41
+ ...value,
42
+ requiredSecrets: [],
43
+ // Blume's own renderer parses at generate time and needs nothing; the
44
+ // Scalar embed is imported by its generated page.
45
+ runtimeDeps: value.kind === "scalar" ? [...SCALAR_RUNTIME_DEPS] : [],
46
+ }));
47
+
48
+ const LIST_HINT =
49
+ 'reference is a list of adapters — e.g. `reference: [openapi({ spec }), asyncapi({ spec }), graphql({ spec, endpoint }), scalar({ spec })]`, imported from "blume/reference".';
50
+
51
+ /**
52
+ * `blume.config.reference`: the API references to render, in order. Unset
53
+ * means none. A non-array fails with the list hint; element errors keep their
54
+ * own messages.
55
+ */
56
+ export const referenceConfigSchema = z
57
+ .array(referenceAdapterSchema, {
58
+ error: (issue) => (issue.code === "invalid_type" ? LIST_HINT : undefined),
59
+ })
60
+ .default([]);
61
+
62
+ /** The top-level keys the `reference` list replaced. */
63
+ const REMOVED_KEYS: readonly string[] = ["asyncapi", "graphql", "openapi"];
64
+
65
+ /**
66
+ * The hint for a config still carrying the 1.x `openapi`/`asyncapi`/`graphql`
67
+ * blocks, or `undefined` when none of the unrecognized keys is one of them
68
+ * (so the default "unrecognized key" message applies). Wired into the root
69
+ * config object's error hook: the keys are gone from the schema, so without
70
+ * this a migrating site would see only "Unrecognized key". Any other unknown
71
+ * key keeps Zod's wording beside the hint, and the rest of the config is
72
+ * still validated in the same run.
73
+ */
74
+ export const removedReferenceKeysHint = (
75
+ keys: string[]
76
+ ): string | undefined => {
77
+ const removed = REMOVED_KEYS.filter((key) => keys.includes(key));
78
+ if (removed.length === 0) {
79
+ return undefined;
80
+ }
81
+ const list = removed.map((key) => `\`${key}\``).join(", ");
82
+ const factories = removed.map((key) => `${key}({ … })`).join(", ");
83
+ const hint = `The top-level ${list} config was replaced by \`reference\`, a list of adapters imported from "blume/reference": \`reference: [${factories}]\`. Each block's options move onto its factory unchanged (\`enabled\` is gone — an adapter in the list is enabled), and a block with \`renderer: "scalar"\` becomes its own \`scalar({ spec, theme, …scalar })\` adapter in the list.`;
84
+ const others = keys.filter((key) => !REMOVED_KEYS.includes(key));
85
+ return others.length > 0
86
+ ? `${hint} ${unrecognizedKeysMessage(others)}`
87
+ : hint;
88
+ };
@@ -16,6 +16,7 @@ import {
16
16
  exampleScanRoots,
17
17
  } from "../astro/examples.ts";
18
18
  import {
19
+ analyzeComponentsFile,
19
20
  buildRuntimeData,
20
21
  clientFeaturesFor,
21
22
  collectStaged,
@@ -37,8 +38,6 @@ import {
37
38
  examplesPageTemplate,
38
39
  exampleWrapperTemplate,
39
40
  featuresTemplate,
40
- islandMapTemplate,
41
- islandWrapperTemplate,
42
41
  mcpEndpointTemplate,
43
42
  mcpPageFile,
44
43
  mixedbreadSearchEndpointTemplate,
@@ -46,6 +45,7 @@ import {
46
45
  ogEndpointTemplate,
47
46
  rawMarkdownEndpointTemplate,
48
47
  rssEndpointTemplate,
48
+ runtimeDependencies,
49
49
  runtimeTsconfigTemplate,
50
50
  searchClientTemplate,
51
51
  searchEndpointTemplate,
@@ -55,6 +55,10 @@ import { buildIncludeGraph } from "../core/includes.ts";
55
55
  import { packageRoot } from "../core/package-root.ts";
56
56
  import { scanProject } from "../core/project-graph.ts";
57
57
  import type { BlumeProject } from "../core/project-graph.ts";
58
+ import {
59
+ resolveDocsCollection,
60
+ sourcesOfKind,
61
+ } from "../core/sources/collection.ts";
58
62
  import type { ProjectContext } from "../core/types.ts";
59
63
  import { buildRssFeeds, renderRssFeed } from "../deploy/rss.ts";
60
64
  import type { OpenApiData } from "../openapi/model.ts";
@@ -62,7 +66,6 @@ import { hasScalarReferences } from "../openapi/references.ts";
62
66
  import { buildReferenceFiles } from "../openapi/scalar.ts";
63
67
  import { isOpenApiSource } from "../openapi/source.ts";
64
68
  import { buildSearchDocuments } from "../search/documents.ts";
65
- import { servesStaticIndex } from "../search/providers.ts";
66
69
  import {
67
70
  examplesEntryTemplate,
68
71
  tailwindEntryTemplate,
@@ -133,19 +136,18 @@ const askFiles = async (
133
136
  await rm(join(genDir, "ask-data.json"), { force: true });
134
137
  return [];
135
138
  }
136
- const grounded = ask.provider !== "inkeep";
139
+ const backend = resolveAskBackend(ask.provider);
137
140
  const files = [
138
141
  {
139
- content: askEndpointTemplate(resolveAskBackend(ask), grounded, {
142
+ content: askEndpointTemplate(backend, {
140
143
  cors: ask.cors,
141
144
  instructions: ask.instructions,
142
- reasoning: ask.reasoning,
143
145
  retrieval: ask.retrieval,
144
146
  }),
145
147
  path: join(srcDir, "pages", "api", "ask.ts"),
146
148
  },
147
149
  ];
148
- if (grounded) {
150
+ if (backend.grounded) {
149
151
  files.push({
150
152
  content: `${JSON.stringify(await buildAskData(project))}\n`,
151
153
  path: join(genDir, "ask-data.json"),
@@ -159,8 +161,12 @@ const hostsMcp = (
159
161
  project: BlumeProject,
160
162
  userPages: { pattern: string }[]
161
163
  ): boolean =>
162
- project.config.ai.mcp.enabled &&
163
- !routeIsTaken(userPages, project.graph.pages, project.config.ai.mcp.route);
164
+ project.config.agents.mcp.enabled &&
165
+ !routeIsTaken(
166
+ userPages,
167
+ project.graph.pages,
168
+ project.config.agents.mcp.route
169
+ );
164
170
 
165
171
  /**
166
172
  * The `.well-known` MCP discovery routes, injected as prerendered pages
@@ -198,7 +204,7 @@ const mcpFiles = async (
198
204
  if (!hostsMcp(project, userPages)) {
199
205
  return [];
200
206
  }
201
- const { route } = project.config.ai.mcp;
207
+ const { route } = project.config.agents.mcp;
202
208
  const data = await buildMcpData(project);
203
209
  const discoveryInput = {
204
210
  base: data.base,
@@ -243,9 +249,8 @@ const changelogFiles = (
243
249
  page.contentType === "changelog" &&
244
250
  !(page.meta.draft || page.meta.sidebar.hidden)
245
251
  );
246
- const hasChangelogSource = (project.config.content.sources ?? []).some(
247
- (source) => source.type === "github-releases"
248
- );
252
+ const hasChangelogSource =
253
+ sourcesOfKind(project.config, "github-releases").length > 0;
249
254
  if (
250
255
  !(hasChangelog || hasChangelogSource) ||
251
256
  routeIsTaken(userPages, project.graph.pages, "/changelog")
@@ -302,6 +307,36 @@ const examplesPreviewFiles = (
302
307
  ]
303
308
  : [];
304
309
 
310
+ /**
311
+ * The packages the ejected app imports by bare name: Astro, Tailwind's Vite
312
+ * plugin, `blume` itself, the integrations the config wires in, whatever the
313
+ * configured adapters declare, and React when islands, examples, or Ask AI
314
+ * render with it (Blume ships React, so projects rarely list it). They have
315
+ * to be the project's own dependencies after eject — under a strict linker
316
+ * such as pnpm nothing else makes them resolvable, and `astro build` fails.
317
+ * The hidden runtime reaches the same packages through its `node_modules`
318
+ * junction into Blume's own, so only eject declares the ones its generated
319
+ * files import directly: the AI SDK the Ask AI route streams through (unless
320
+ * `ai.ask.endpoint` points elsewhere, when no route is written) and the EPUB
321
+ * generator's browser bundle `features.ts` loads.
322
+ */
323
+ const ejectDependencies = (
324
+ options: Parameters<typeof runtimeDependencies>[0]
325
+ ): string[] => {
326
+ const { ask } = options.config.ai;
327
+ return [
328
+ ...new Set([
329
+ "astro",
330
+ "@tailwindcss/vite",
331
+ "blume",
332
+ ...runtimeDependencies(options),
333
+ ...(options.needsReact ? ["react", "react-dom"] : []),
334
+ ...(ask?.enabled && !ask.endpoint ? ["ai"] : []),
335
+ ...(options.config.export.epub ? ["epub-gen-memory"] : []),
336
+ ]),
337
+ ];
338
+ };
339
+
305
340
  const ejectIntegrationBridge = (
306
341
  config: BlumeProject["config"],
307
342
  root: string,
@@ -318,11 +353,12 @@ const ejectIntegrationBridge = (
318
353
  *
319
354
  * Returns the written files plus non-fatal warnings, mirroring the generated
320
355
  * runtime (e.g. a Scalar reference spec that wasn't found, or a reference
321
- * route colliding with a content page).
356
+ * route colliding with a content page), and the packages the ejected app
357
+ * imports by bare name, for the caller to add to package.json.
322
358
  */
323
359
  export const eject = async (
324
360
  root: string
325
- ): Promise<{ files: string[]; warnings: string[] }> => {
361
+ ): Promise<{ dependencies: string[]; files: string[]; warnings: string[] }> => {
326
362
  const project = await scanProject(root, { mode: "build" });
327
363
  const { context, config } = project;
328
364
 
@@ -345,6 +381,7 @@ export const eject = async (
345
381
  userExamplesCss,
346
382
  rawMarkdown,
347
383
  islands,
384
+ overrideAnalysis,
348
385
  ] = await Promise.all([
349
386
  context.pagesRoot ? discoverPages(context.pagesRoot) : Promise.resolve([]),
350
387
  detectNeedsReact(root),
@@ -356,12 +393,20 @@ export const eject = async (
356
393
  ),
357
394
  buildRawMarkdown(project),
358
395
  discoverIslands(root),
396
+ analyzeComponentsFile(context.componentsFile),
359
397
  ]);
360
- // Island/example frameworks drive which Astro renderers the ejected config
361
- // wires in; React also switches on for project `.tsx`/`.jsx` and Ask AI.
398
+ // The `islands/` convention and `components.ts` share the same static plan
399
+ // the CLI uses, with every import written relative to its generated file so
400
+ // the ejected app builds from any checkout (like the example wrappers below).
401
+ const slotPlan = planComponentSlots(islands.islands, overrideAnalysis, {
402
+ relativeTo: genDir,
403
+ });
404
+ // Island/example/override frameworks drive which Astro renderers the ejected
405
+ // config wires in; React also switches on for project `.tsx`/`.jsx` and Ask AI.
362
406
  const frameworks = new Set<string>([
363
407
  ...islands.islands.map((island) => island.framework),
364
408
  ...examples.examples.map((example) => example.framework),
409
+ ...slotPlan.frameworks,
365
410
  ]);
366
411
  const needsReact = needsReactRaw || askEnabled || frameworks.has("react");
367
412
  const needsVue = frameworks.has("vue");
@@ -371,13 +416,22 @@ export const eject = async (
371
416
  const relContext: ProjectContext = {
372
417
  ...context,
373
418
  contentRoot: toPosix(relative(root, context.contentRoot)),
419
+ distDir: "./dist",
374
420
  outDir: ".",
421
+ pagesRoot: context.pagesRoot
422
+ ? `./${toPosix(relative(root, context.pagesRoot))}`
423
+ : null,
375
424
  root: ".",
376
425
  };
426
+ // The `docs` collection resolves its base against the real project root and
427
+ // is then relativized like everything else, so the ejected content config
428
+ // never bakes in the absolute path `eject` happened to run from.
429
+ const docsCollection = resolveDocsCollection(config, root);
430
+ const relCollection = {
431
+ ...docsCollection,
432
+ base: toPosix(relative(root, docsCollection.base)),
433
+ };
377
434
 
378
- const componentsImport = context.componentsFile
379
- ? `../../${toPosix(relative(root, context.componentsFile))}`
380
- : null;
381
435
  const relPages = [
382
436
  ...pages.map((page) => ({
383
437
  entrypoint: toPosix(relative(root, page.entrypoint)),
@@ -437,6 +491,7 @@ export const eject = async (
437
491
  },
438
492
  {
439
493
  content: contentConfigTemplate({
494
+ collection: relCollection,
440
495
  config,
441
496
  context: relContext,
442
497
  staged: hasStaged,
@@ -454,18 +509,11 @@ export const eject = async (
454
509
  path: join(srcDir, "pages", "[...slug].astro"),
455
510
  },
456
511
  {
457
- // Eject keeps the portable re-export form (relative import to the user's
458
- // components file); hydration/island wrappers would need machine-specific
459
- // absolute paths, so the ejected app owns and wires those itself.
460
- content: planComponentSlots(componentsImport, null).module,
512
+ content: slotPlan.module,
461
513
  path: join(genDir, "components.ts"),
462
514
  },
463
- // Island/example maps the catch-all imports; written even when empty so the
464
- // relative import and the `blume:examples` alias always resolve.
465
- {
466
- content: islandMapTemplate(islands.islands),
467
- path: join(genDir, "islands.ts"),
468
- },
515
+ // The example map the catch-all imports; written even when empty so the
516
+ // `blume:examples` alias always resolves.
469
517
  {
470
518
  content: exampleMapTemplate(examples.examples, config.basePath),
471
519
  path: join(genDir, "examples.ts"),
@@ -553,7 +601,6 @@ export const eject = async (
553
601
  ...changelogFiles(project, pages, srcDir, {
554
602
  exportEpub,
555
603
  exportPdf,
556
- mathEnabled: usesMath,
557
604
  needsReact,
558
605
  staged: hasStaged,
559
606
  })
@@ -582,7 +629,8 @@ export const eject = async (
582
629
  }
583
630
  );
584
631
 
585
- if (servesStaticIndex(config.search.provider)) {
632
+ const searchAdapter = config.search.provider;
633
+ if (searchAdapter.mode === "static") {
586
634
  const documents = await buildSearchDocuments(project);
587
635
  files.push(
588
636
  {
@@ -596,11 +644,9 @@ export const eject = async (
596
644
  );
597
645
  }
598
646
 
599
- if (config.search.provider === "mixedbread") {
647
+ if (searchAdapter.kind === "mixedbread") {
600
648
  files.push({
601
- content: mixedbreadSearchEndpointTemplate(
602
- config.search.mixedbread?.storeId ?? ""
603
- ),
649
+ content: mixedbreadSearchEndpointTemplate(searchAdapter.options),
604
650
  path: join(srcDir, "pages", "api", "search.ts"),
605
651
  });
606
652
  }
@@ -642,14 +688,14 @@ export const eject = async (
642
688
  }
643
689
  }
644
690
 
645
- // Per-island and per-example live wrappers referenced by the maps above.
691
+ // Per-override and per-example live wrappers referenced by the maps above.
646
692
  files.push(
647
- ...islands.islands.map((island) => ({
648
- content: islandWrapperTemplate(island),
649
- path: join(genDir, "islands", `${island.name}.astro`),
693
+ ...slotPlan.wrappers.map((wrapper) => ({
694
+ content: wrapper.content,
695
+ path: join(genDir, "component-slots", `${wrapper.name}.astro`),
650
696
  })),
651
697
  ...examples.examples.map((example) => ({
652
- content: exampleWrapperTemplate(example),
698
+ content: exampleWrapperTemplate(example, join(genDir, "examples")),
653
699
  path: join(genDir, "examples", `${exampleSlug(example.path)}.astro`),
654
700
  })),
655
701
  ...examplesPreviewFiles(
@@ -688,5 +734,14 @@ export const eject = async (
688
734
  // The hidden runtime is no longer the source of truth.
689
735
  await rm(context.outDir, { force: true, recursive: true });
690
736
 
691
- return { files: written.map((file) => file.path), warnings };
737
+ return {
738
+ dependencies: ejectDependencies({
739
+ config,
740
+ needsReact,
741
+ needsSvelte,
742
+ needsVue,
743
+ }),
744
+ files: written.map((file) => file.path),
745
+ warnings,
746
+ };
692
747
  };
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+
3
+ import type { JsonValue } from "../../core/adapter.ts";
4
+ import type { SearchAdapter } from "./types.ts";
5
+
6
+ /**
7
+ * Public Algolia credentials. The browser queries the index with the
8
+ * search-only `apiKey`; the build-time sync replaces the index with the admin
9
+ * key from `ALGOLIA_ADMIN_API_KEY`, which never enters the config.
10
+ */
11
+ export interface AlgoliaNamedOptions {
12
+ appId: string;
13
+ /** The search-only API key (public — it ships to the browser). */
14
+ apiKey: string;
15
+ indexName: string;
16
+ }
17
+
18
+ /**
19
+ * Options for {@link algolia}: the named options plus any other client
20
+ * option, forwarded to the browser verbatim. JSON values only.
21
+ */
22
+ export type AlgoliaOptions = AlgoliaNamedOptions & {
23
+ [option: string]: JsonValue;
24
+ };
25
+
26
+ export type AlgoliaAdapter = SearchAdapter<"algolia", "hosted", AlgoliaOptions>;
27
+
28
+ export const algoliaOptionsSchema = z
29
+ .object({
30
+ apiKey: z.string(),
31
+ appId: z.string(),
32
+ indexName: z.string(),
33
+ })
34
+ .catchall(z.json());
35
+
36
+ /**
37
+ * Hosted search on Algolia. Each `blume build` replaces the whole index with
38
+ * the current records, so deleted or renamed pages don't linger as stale hits.
39
+ */
40
+ export const algolia = (options: AlgoliaOptions): AlgoliaAdapter => ({
41
+ kind: "algolia",
42
+ mode: "hosted",
43
+ options,
44
+ requiredSecrets: [],
45
+ runtimeDeps: ["algoliasearch"],
46
+ });
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+
3
+ import type { KeylessSearchOptions, SearchAdapter } from "./types.ts";
4
+
5
+ /** FlexSearch takes no options; unknown keys fail config validation. */
6
+ export type FlexsearchOptions = KeylessSearchOptions;
7
+
8
+ export type FlexsearchAdapter = SearchAdapter<
9
+ "flexsearch",
10
+ "static",
11
+ FlexsearchOptions
12
+ >;
13
+
14
+ export const flexsearchOptionsSchema = z.strictObject({});
15
+
16
+ /**
17
+ * A second keyless, client-side engine. It loads the same `/blume-search.json`
18
+ * index Orama ships and builds a FlexSearch document index in the browser.
19
+ * No locale-aware tokenizer, so prefer Orama for non-Latin scripts.
20
+ */
21
+ export const flexsearch = (
22
+ options: FlexsearchOptions = {}
23
+ ): FlexsearchAdapter => ({
24
+ kind: "flexsearch",
25
+ mode: "static",
26
+ options,
27
+ requiredSecrets: [],
28
+ runtimeDeps: ["flexsearch"],
29
+ });
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Search adapters for `blume.config.ts`:
3
+ *
4
+ * ```ts
5
+ * import { defineConfig } from "blume";
6
+ * import { algolia } from "blume/search";
7
+ *
8
+ * export default defineConfig({
9
+ * search: algolia({ appId: "…", apiKey: "…", indexName: "docs" }),
10
+ * });
11
+ * ```
12
+ *
13
+ * Each factory returns a plain, JSON-serializable descriptor — never a live
14
+ * client — that the generated runtime inlines as a literal.
15
+ */
16
+ export { algolia } from "./algolia.ts";
17
+ export type { AlgoliaAdapter, AlgoliaOptions } from "./algolia.ts";
18
+ export { flexsearch } from "./flexsearch.ts";
19
+ export type { FlexsearchAdapter, FlexsearchOptions } from "./flexsearch.ts";
20
+ export { mixedbread } from "./mixedbread.ts";
21
+ export type { MixedbreadAdapter, MixedbreadOptions } from "./mixedbread.ts";
22
+ export { orama } from "./orama.ts";
23
+ export type { OramaAdapter, OramaOptions } from "./orama.ts";
24
+ export { oramaCloud } from "./orama-cloud.ts";
25
+ export type { OramaCloudAdapter, OramaCloudOptions } from "./orama-cloud.ts";
26
+ export { pagefind } from "./pagefind.ts";
27
+ export type { PagefindAdapter, PagefindOptions } from "./pagefind.ts";
28
+ export type {
29
+ AnySearchAdapter,
30
+ ResolvedSearchAdapter,
31
+ SearchAdapterKind,
32
+ } from "./registry.ts";
33
+ export type {
34
+ KeylessSearchOptions,
35
+ SearchAdapter,
36
+ SearchAdapterMode,
37
+ } from "./types.ts";
38
+ export { typesense } from "./typesense.ts";
39
+ export type { TypesenseAdapter, TypesenseOptions } from "./typesense.ts";
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+
3
+ import type { JsonValue } from "../../core/adapter.ts";
4
+ import type { SearchAdapter } from "./types.ts";
5
+
6
+ /**
7
+ * The Mixedbread store the generated `/api/search` endpoint queries, plus any
8
+ * other option, forwarded to the endpoint verbatim. JSON values only.
9
+ */
10
+ export interface MixedbreadOptions {
11
+ storeId: string;
12
+ [option: string]: JsonValue;
13
+ }
14
+
15
+ export type MixedbreadAdapter = SearchAdapter<
16
+ "mixedbread",
17
+ "server",
18
+ MixedbreadOptions
19
+ >;
20
+
21
+ export const mixedbreadOptionsSchema = z
22
+ .object({
23
+ storeId: z.string(),
24
+ })
25
+ .catchall(z.json());
26
+
27
+ /**
28
+ * Semantic search on Mixedbread. Queries go through a generated `/api/search`
29
+ * endpoint that holds `MIXEDBREAD_API_KEY`, so the adapter requires server
30
+ * output. Content is synced to the store out-of-band with the `mxbai` CLI,
31
+ * not by the build.
32
+ */
33
+ export const mixedbread = (options: MixedbreadOptions): MixedbreadAdapter => ({
34
+ kind: "mixedbread",
35
+ mode: "server",
36
+ options,
37
+ requiredSecrets: ["MIXEDBREAD_API_KEY"],
38
+ runtimeDeps: ["@mixedbread/sdk"],
39
+ });