blume 2.0.3 → 2.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 (455) hide show
  1. package/AGENTS.md +1 -0
  2. package/CHANGELOG.md +48 -0
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-1d7ve1dm.js → chunk-0gz36akr.js} +18 -2
  5. package/dist/cli/{chunk-1d7ve1dm.js.map → chunk-0gz36akr.js.map} +3 -3
  6. package/dist/cli/{chunk-2eytanqx.js → chunk-1n228xqb.js} +2 -2
  7. package/dist/cli/{chunk-yfyb25rh.js → chunk-2f3ndkpw.js} +24 -8
  8. package/dist/cli/chunk-2f3ndkpw.js.map +14 -0
  9. package/dist/cli/{chunk-r20tn01b.js → chunk-2f7n4qzt.js} +8 -2
  10. package/dist/cli/{chunk-r20tn01b.js.map → chunk-2f7n4qzt.js.map} +3 -3
  11. package/dist/cli/{chunk-35d4wj9f.js → chunk-2n4ps1b3.js} +7 -7
  12. package/dist/cli/{chunk-j85vccga.js → chunk-43zcf4gz.js} +97 -57
  13. package/dist/cli/{chunk-j85vccga.js.map → chunk-43zcf4gz.js.map} +6 -6
  14. package/dist/cli/{chunk-e04dxsz1.js → chunk-4ejxbzee.js} +1 -1
  15. package/dist/cli/{chunk-5m5nmvyq.js → chunk-4h8z9vv5.js} +233 -39
  16. package/dist/cli/chunk-4h8z9vv5.js.map +16 -0
  17. package/dist/cli/{chunk-5f86nr5m.js → chunk-5cg2rzgf.js} +18 -16
  18. package/dist/cli/{chunk-5f86nr5m.js.map → chunk-5cg2rzgf.js.map} +2 -2
  19. package/dist/cli/{chunk-tzmab476.js → chunk-5ffywsmb.js} +4 -4
  20. package/dist/cli/{chunk-2z928egk.js → chunk-5wj2qwn2.js} +5 -5
  21. package/dist/cli/chunk-6bm0xpgd.js +18 -0
  22. package/dist/cli/chunk-6bm0xpgd.js.map +10 -0
  23. package/dist/cli/{chunk-vg9r4eb9.js → chunk-713mngdq.js} +12 -5
  24. package/dist/cli/{chunk-vg9r4eb9.js.map → chunk-713mngdq.js.map} +3 -3
  25. package/dist/cli/{chunk-5xvm6tfj.js → chunk-9geymqns.js} +17 -15
  26. package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-9geymqns.js.map} +2 -2
  27. package/dist/cli/{chunk-q58y5e6a.js → chunk-9xr4dgee.js} +26 -17
  28. package/dist/cli/chunk-9xr4dgee.js.map +10 -0
  29. package/dist/cli/{chunk-b07cmahc.js → chunk-amrb6hgh.js} +2 -2
  30. package/dist/cli/chunk-cm89scdv.js +443 -0
  31. package/dist/cli/chunk-cm89scdv.js.map +11 -0
  32. package/dist/cli/{chunk-akbpwfxc.js → chunk-cmtcnh9f.js} +2 -2
  33. package/dist/cli/chunk-cy5bm0j0.js +104 -0
  34. package/dist/cli/chunk-cy5bm0j0.js.map +11 -0
  35. package/dist/cli/{chunk-crgn1q09.js → chunk-e7vvk5ya.js} +4 -4
  36. package/dist/cli/{chunk-pehfxfta.js → chunk-g2z9x01v.js} +6 -98
  37. package/dist/cli/chunk-g2z9x01v.js.map +10 -0
  38. package/dist/cli/{chunk-tkacnehg.js → chunk-gp84za0h.js} +2 -2
  39. package/dist/cli/{chunk-wrr3j9w9.js → chunk-h2a48yhd.js} +186 -63
  40. package/dist/cli/chunk-h2a48yhd.js.map +36 -0
  41. package/dist/cli/{chunk-hm3vjy5s.js → chunk-jnwj5kjj.js} +14 -9
  42. package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-jnwj5kjj.js.map} +4 -4
  43. package/dist/cli/chunk-kwrg63tm.js +31 -0
  44. package/dist/cli/chunk-kwrg63tm.js.map +10 -0
  45. package/dist/cli/{chunk-2hsdwb9n.js → chunk-nd1821sk.js} +18 -16
  46. package/dist/cli/{chunk-2hsdwb9n.js.map → chunk-nd1821sk.js.map} +2 -2
  47. package/dist/cli/{chunk-6dsbexzp.js → chunk-ntv4qrt7.js} +17 -15
  48. package/dist/cli/{chunk-6dsbexzp.js.map → chunk-ntv4qrt7.js.map} +2 -2
  49. package/dist/cli/{chunk-r9rcc4w7.js → chunk-p804f3pe.js} +7 -7
  50. package/dist/cli/{chunk-ey84smr6.js → chunk-py62fewh.js} +6 -6
  51. package/dist/cli/{chunk-ey84smr6.js.map → chunk-py62fewh.js.map} +1 -1
  52. package/dist/cli/chunk-q3wxxq39.js +126 -0
  53. package/dist/cli/chunk-q3wxxq39.js.map +11 -0
  54. package/dist/cli/{chunk-9t7a85s3.js → chunk-rekqz4qg.js} +23 -13
  55. package/dist/cli/chunk-rekqz4qg.js.map +10 -0
  56. package/dist/cli/{chunk-8ktnccpt.js → chunk-ta27feev.js} +1 -1
  57. package/dist/cli/{chunk-pv29h0wf.js → chunk-xkz5xbtv.js} +3476 -822
  58. package/dist/cli/chunk-xkz5xbtv.js.map +213 -0
  59. package/dist/cli/{chunk-a58773jm.js → chunk-y4ykbark.js} +2 -2
  60. package/dist/cli/{chunk-p3v96n38.js → chunk-y5h4r2y0.js} +4 -4
  61. package/dist/cli/{chunk-acanzt5p.js → chunk-yj17vs39.js} +6 -6
  62. package/dist/cli/{chunk-p73c0m7w.js → chunk-yxmk4pec.js} +16 -14
  63. package/dist/cli/{chunk-p73c0m7w.js.map → chunk-yxmk4pec.js.map} +2 -2
  64. package/dist/cli/{chunk-3em5wd2y.js → chunk-zccbjcj0.js} +4 -3
  65. package/dist/cli/{chunk-3em5wd2y.js.map → chunk-zccbjcj0.js.map} +2 -2
  66. package/dist/cli/{chunk-c8chx29p.js → chunk-zf748avv.js} +384 -207
  67. package/dist/cli/chunk-zf748avv.js.map +37 -0
  68. package/dist/cli/{chunk-g4hq16wv.js → chunk-zhvd6adm.js} +16 -14
  69. package/dist/cli/{chunk-g4hq16wv.js.map → chunk-zhvd6adm.js.map} +2 -2
  70. package/dist/cli/index.js +26 -20
  71. package/dist/cli/index.js.map +5 -5
  72. package/dist/types/ai/agent-surface.d.ts +8 -7
  73. package/dist/types/ai/ai-catalog.d.ts +7 -0
  74. package/dist/types/ai/ask-context.d.ts +22 -0
  75. package/dist/types/ai/ask.d.ts +271 -58
  76. package/dist/types/ai/index.d.ts +2 -2
  77. package/dist/types/ai/site-skill.d.ts +26 -0
  78. package/dist/types/ai/skills.d.ts +16 -0
  79. package/dist/types/astro/integration.d.ts +8 -0
  80. package/dist/types/captcha/hcaptcha.d.ts +27 -0
  81. package/dist/types/captcha/index.d.ts +28 -0
  82. package/dist/types/captcha/schema.d.ts +29 -0
  83. package/dist/types/captcha/turnstile.d.ts +28 -0
  84. package/dist/types/components/content/api-field.d.ts +59 -0
  85. package/dist/types/components/content/api-page.d.ts +95 -0
  86. package/dist/types/components/layout/nav-utils.d.ts +26 -0
  87. package/dist/types/components/openapi/helpers.d.ts +137 -0
  88. package/dist/types/components/openapi/security.d.ts +85 -0
  89. package/dist/types/consent/ethyca.d.ts +48 -0
  90. package/dist/types/consent/index.d.ts +37 -0
  91. package/dist/types/consent/native.d.ts +28 -0
  92. package/dist/types/consent/osano.d.ts +42 -0
  93. package/dist/types/consent/schema.d.ts +110 -0
  94. package/dist/types/core/config-input.d.ts +187 -20
  95. package/dist/types/core/data.d.ts +49 -4
  96. package/dist/types/core/footer.d.ts +8 -0
  97. package/dist/types/core/i18n-ui.d.ts +86 -0
  98. package/dist/types/core/includes.d.ts +8 -2
  99. package/dist/types/core/localizable.d.ts +7 -0
  100. package/dist/types/core/page-modes.d.ts +29 -0
  101. package/dist/types/core/redirect-patterns.d.ts +144 -0
  102. package/dist/types/core/related.d.ts +40 -0
  103. package/dist/types/core/schema.d.ts +551 -56
  104. package/dist/types/core/sources/read.d.ts +5 -0
  105. package/dist/types/core/types.d.ts +1 -1
  106. package/dist/types/core/variables.d.ts +42 -0
  107. package/dist/types/deploy/node-headers.d.ts +13 -2
  108. package/dist/types/deploy/platforms/cloudflare.d.ts +5 -0
  109. package/dist/types/deploy/platforms/netlify.d.ts +7 -0
  110. package/dist/types/deploy/platforms/vercel.d.ts +6 -0
  111. package/dist/types/deploy/redirects.d.ts +39 -11
  112. package/dist/types/deploy/vercel-negotiation.d.ts +9 -0
  113. package/dist/types/markdown/code-title.d.ts +17 -0
  114. package/dist/types/markdown/features.d.ts +3 -2
  115. package/dist/types/narration/build.d.ts +70 -0
  116. package/dist/types/narration/provider.d.ts +26 -0
  117. package/dist/types/narration/script.d.ts +154 -0
  118. package/dist/types/openapi/model.d.ts +12 -6
  119. package/dist/types/openapi/overlay.d.ts +54 -0
  120. package/dist/types/openapi/parse.d.ts +13 -0
  121. package/dist/types/openapi/references.d.ts +14 -4
  122. package/dist/types/ratelimit/cloudflare.d.ts +39 -0
  123. package/dist/types/ratelimit/index.d.ts +27 -0
  124. package/dist/types/ratelimit/memory.d.ts +36 -0
  125. package/dist/types/ratelimit/schema.d.ts +111 -0
  126. package/dist/types/ratelimit/upstash.d.ts +21 -0
  127. package/dist/types/ratelimit/wrangler.d.ts +23 -0
  128. package/dist/types/reference/asyncapi.d.ts +10 -10
  129. package/dist/types/reference/graphql.d.ts +13 -10
  130. package/dist/types/reference/openapi.d.ts +33 -12
  131. package/dist/types/reference/options.d.ts +45 -5
  132. package/dist/types/reference/scalar.d.ts +13 -0
  133. package/dist/types/reference/schema.d.ts +60 -36
  134. package/dist/types/search/documents.d.ts +12 -1
  135. package/dist/types/search/orama-index.d.ts +4 -0
  136. package/dist/types/seo/metatags.d.ts +20 -0
  137. package/docs/02-deployment.mdx +41 -5
  138. package/docs/03-upgrading.mdx +4 -4
  139. package/docs/04-migrating.mdx +1 -1
  140. package/docs/advanced/changelog.mdx +2 -2
  141. package/docs/advanced/skills.mdx +14 -0
  142. package/docs/cli/audit.mdx +21 -1
  143. package/docs/cli/index.mdx +1 -0
  144. package/docs/configuration/analytics.mdx +3 -1
  145. package/docs/configuration/assistant.mdx +188 -36
  146. package/docs/configuration/consent.mdx +100 -0
  147. package/docs/configuration/customization.mdx +4 -4
  148. package/docs/configuration/index.mdx +63 -5
  149. package/docs/configuration/meta.ts +3 -0
  150. package/docs/configuration/narration.mdx +119 -0
  151. package/docs/configuration/rate-limiting.mdx +69 -0
  152. package/docs/configuration/search.mdx +29 -1
  153. package/docs/configuration/theming.mdx +3 -1
  154. package/docs/content/components.mdx +106 -0
  155. package/docs/content/frontmatter.mdx +76 -0
  156. package/docs/content/i18n.mdx +38 -3
  157. package/docs/content/includes.mdx +16 -0
  158. package/docs/content/meta.mdx +1 -0
  159. package/docs/content/meta.ts +1 -0
  160. package/docs/content/navigation.mdx +28 -6
  161. package/docs/content/sources/contentful.mdx +32 -0
  162. package/docs/content/sources/custom.mdx +39 -0
  163. package/docs/content/sources/github-releases.mdx +31 -0
  164. package/docs/content/sources/index.mdx +91 -0
  165. package/docs/content/sources/meta.ts +16 -0
  166. package/docs/content/sources/notion.mdx +32 -0
  167. package/docs/content/sources/obsidian.mdx +37 -0
  168. package/docs/content/sources/payload.mdx +30 -0
  169. package/docs/content/sources/remote-mdx.mdx +40 -0
  170. package/docs/content/sources/sanity.mdx +29 -0
  171. package/docs/content/sources/strapi.mdx +31 -0
  172. package/docs/content/syntax.mdx +67 -2
  173. package/docs/content/variables.mdx +41 -0
  174. package/docs/discoverability/agent-discovery.mdx +29 -2
  175. package/docs/discoverability/index.mdx +1 -1
  176. package/docs/discoverability/llms-txt.mdx +1 -1
  177. package/docs/discoverability/metadata.mdx +17 -0
  178. package/docs/references/api-pages.mdx +74 -0
  179. package/docs/references/asyncapi.mdx +1 -1
  180. package/docs/references/graphql.mdx +2 -2
  181. package/docs/references/meta.ts +1 -1
  182. package/docs/references/openapi.mdx +102 -3
  183. package/docs/references/scalar.mdx +3 -1
  184. package/package.json +36 -1
  185. package/skills/blume/SKILL.md +3 -0
  186. package/skills/blume-migrate/SKILL.md +5 -5
  187. package/skills/blume-migrate/references/docusaurus.md +3 -3
  188. package/skills/blume-migrate/references/mintlify.md +37 -19
  189. package/skills/blume-migrate/references/nextra.md +2 -2
  190. package/skills/blume-migrate/references/starlight.md +2 -1
  191. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +60 -14
  192. package/skills/blume-write-skill/SKILL.md +82 -0
  193. package/src/ai/agent-readability.ts +2 -1
  194. package/src/ai/agent-surface.ts +9 -7
  195. package/src/ai/ai-catalog.ts +6 -3
  196. package/src/ai/ask-context.ts +73 -20
  197. package/src/ai/ask-data.ts +6 -0
  198. package/src/ai/ask-tools.ts +142 -0
  199. package/src/ai/ask.ts +354 -76
  200. package/src/ai/component-markdown.ts +75 -0
  201. package/src/ai/cors.ts +2 -0
  202. package/src/ai/index.ts +12 -0
  203. package/src/ai/llms.ts +6 -2
  204. package/src/ai/markdown.ts +2 -1
  205. package/src/ai/mcp/data.ts +6 -0
  206. package/src/ai/openapi-components.ts +9 -3
  207. package/src/ai/site-skill.ts +274 -0
  208. package/src/ai/skills.ts +35 -2
  209. package/src/ai/write-skill.ts +97 -0
  210. package/src/astro/generate.ts +132 -18
  211. package/src/astro/index.ts +1 -0
  212. package/src/astro/integration.ts +35 -0
  213. package/src/astro/module-types.ts +6 -0
  214. package/src/astro/templates.ts +283 -30
  215. package/src/astro/variables.ts +31 -0
  216. package/src/audit/catalog.ts +19 -0
  217. package/src/audit/checks/contrast.ts +183 -0
  218. package/src/audit/checks/i18n.ts +2 -3
  219. package/src/audit/checks/indexability.ts +2 -3
  220. package/src/audit/checks/links.ts +5 -12
  221. package/src/audit/checks/sitemap.ts +2 -3
  222. package/src/audit/redirects.ts +46 -15
  223. package/src/audit/run.ts +2 -0
  224. package/src/audit/types.ts +2 -1
  225. package/src/blume-modules.d.ts +7 -0
  226. package/src/captcha/client.ts +152 -0
  227. package/src/captcha/hcaptcha.ts +36 -0
  228. package/src/captcha/index.ts +28 -0
  229. package/src/captcha/schema.ts +32 -0
  230. package/src/captcha/turnstile.ts +38 -0
  231. package/src/captcha/verify.ts +71 -0
  232. package/src/cli/command-meta.ts +5 -0
  233. package/src/cli/commands/doctor.ts +22 -16
  234. package/src/cli/commands/skill.ts +96 -0
  235. package/src/cli/index.ts +5 -0
  236. package/src/cli/required-secrets.ts +71 -29
  237. package/src/components/BlumePage.astro +2 -0
  238. package/src/components/content/ApiEndpoint.astro +18 -0
  239. package/src/components/content/ApiField.astro +79 -0
  240. package/src/components/content/ApiPlayground.astro +62 -0
  241. package/src/components/content/ApiRail.astro +19 -0
  242. package/src/components/content/Color.astro +1 -0
  243. package/src/components/content/FileTree.astro +1 -0
  244. package/src/components/content/GithubInfo.astro +1 -0
  245. package/src/components/content/Panel.astro +1 -0
  246. package/src/components/content/ParamField.astro +25 -0
  247. package/src/components/content/RequestExample.astro +17 -0
  248. package/src/components/content/ResponseExample.astro +17 -0
  249. package/src/components/content/ResponseField.astro +32 -0
  250. package/src/components/content/Step.astro +1 -0
  251. package/src/components/content/Tile.astro +1 -0
  252. package/src/components/content/Tooltip.astro +1 -0
  253. package/src/components/content/Tree.astro +1 -0
  254. package/src/components/content/TypeTable.astro +4 -1
  255. package/src/components/content/View.astro +21 -0
  256. package/src/components/content/ViewSwitcher.astro +168 -0
  257. package/src/components/content/api-field.ts +100 -0
  258. package/src/components/content/api-page.ts +224 -0
  259. package/src/components/content/view-switcher.ts +71 -0
  260. package/src/components/index.ts +2 -0
  261. package/src/components/islands/Assistant.astro +10 -1
  262. package/src/components/islands/assistant.tsx +104 -14
  263. package/src/components/islands/code-question.ts +62 -0
  264. package/src/components/islands/hooks.ts +110 -21
  265. package/src/components/islands/support-link.ts +68 -0
  266. package/src/components/layout/Analytics.astro +11 -2
  267. package/src/components/layout/Banner.astro +14 -10
  268. package/src/components/layout/Breadcrumbs.astro +6 -2
  269. package/src/components/layout/ConsentBanner.astro +62 -0
  270. package/src/components/layout/ConsentHead.astro +38 -0
  271. package/src/components/layout/Directory.astro +94 -0
  272. package/src/components/layout/DrawerSwitchers.astro +51 -0
  273. package/src/components/layout/Empty.astro +2 -2
  274. package/src/components/layout/Header.astro +122 -80
  275. package/src/components/layout/LanguageSwitcher.astro +48 -15
  276. package/src/components/layout/NarrationPlayer.astro +1085 -0
  277. package/src/components/layout/NavSelector.astro +33 -7
  278. package/src/components/layout/PageFeedback.astro +54 -49
  279. package/src/components/layout/PageLayout.astro +71 -3
  280. package/src/components/layout/ReferenceLayout.astro +17 -6
  281. package/src/components/layout/RelatedPages.astro +42 -0
  282. package/src/components/layout/RootLayout.astro +308 -45
  283. package/src/components/layout/Search.astro +31 -17
  284. package/src/components/layout/SiteFooter.astro +124 -0
  285. package/src/components/layout/SiteMetatags.astro +16 -0
  286. package/src/components/layout/consent/native.ts +79 -0
  287. package/src/components/layout/consent/types.ts +37 -0
  288. package/src/components/layout/footer-links.ts +53 -0
  289. package/src/components/layout/footer-socials.ts +87 -0
  290. package/src/components/layout/locale-redirect.ts +107 -0
  291. package/src/components/layout/nav-utils.ts +83 -0
  292. package/src/components/layout/page-feedback.ts +96 -0
  293. package/src/components/layout/search/analytics.ts +98 -0
  294. package/src/components/layout/search/flexsearch.ts +17 -5
  295. package/src/components/layout/search/orama-cloud.ts +26 -14
  296. package/src/components/layout/search/types.ts +20 -0
  297. package/src/components/layout/search/typesense.ts +5 -1
  298. package/src/components/openapi/Operation.astro +161 -13
  299. package/src/components/openapi/RequestBody.astro +6 -4
  300. package/src/components/openapi/RequestPanel.astro +59 -7
  301. package/src/components/openapi/Responses.astro +6 -4
  302. package/src/components/openapi/async-snippets.ts +4 -4
  303. package/src/components/openapi/code-samples.ts +97 -0
  304. package/src/components/openapi/security.ts +6 -3
  305. package/src/components/openapi/snippets.ts +869 -8
  306. package/src/components/props.ts +6 -0
  307. package/src/consent/client.ts +95 -0
  308. package/src/consent/clients.ts +19 -0
  309. package/src/consent/ethyca.ts +71 -0
  310. package/src/consent/head.ts +24 -0
  311. package/src/consent/index.ts +37 -0
  312. package/src/consent/init.ts +29 -0
  313. package/src/consent/native.ts +36 -0
  314. package/src/consent/osano.ts +59 -0
  315. package/src/consent/schema.ts +30 -0
  316. package/src/core/builtin-tags.ts +5 -0
  317. package/src/core/client-address.ts +19 -0
  318. package/src/core/config-input.ts +194 -20
  319. package/src/core/data.ts +44 -4
  320. package/src/core/diagnostics.ts +3 -2
  321. package/src/core/footer.ts +26 -0
  322. package/src/core/graph.ts +39 -36
  323. package/src/core/i18n-ui.ts +82 -2
  324. package/src/core/includes.ts +20 -3
  325. package/src/core/links.ts +16 -2
  326. package/src/core/localizable.ts +26 -0
  327. package/src/core/navigation.ts +43 -12
  328. package/src/core/page-modes.ts +56 -0
  329. package/src/core/project-graph.ts +111 -5
  330. package/src/core/redirect-patterns.ts +491 -0
  331. package/src/core/related.ts +131 -0
  332. package/src/core/schema.ts +318 -64
  333. package/src/core/sources/normalize.ts +2 -1
  334. package/src/core/sources/read.ts +8 -3
  335. package/src/core/types.ts +1 -1
  336. package/src/core/ui-packs/ar.ts +43 -0
  337. package/src/core/ui-packs/bg.ts +45 -0
  338. package/src/core/ui-packs/bn.ts +43 -0
  339. package/src/core/ui-packs/ca.ts +46 -0
  340. package/src/core/ui-packs/cs.ts +44 -0
  341. package/src/core/ui-packs/da.ts +45 -0
  342. package/src/core/ui-packs/de.ts +46 -0
  343. package/src/core/ui-packs/el.ts +45 -0
  344. package/src/core/ui-packs/es.ts +46 -0
  345. package/src/core/ui-packs/fa.ts +45 -0
  346. package/src/core/ui-packs/fi.ts +45 -0
  347. package/src/core/ui-packs/fr.ts +46 -0
  348. package/src/core/ui-packs/he.ts +43 -0
  349. package/src/core/ui-packs/hi.ts +44 -0
  350. package/src/core/ui-packs/hr.ts +45 -0
  351. package/src/core/ui-packs/hu.ts +44 -0
  352. package/src/core/ui-packs/id.ts +45 -0
  353. package/src/core/ui-packs/it.ts +45 -0
  354. package/src/core/ui-packs/ja.ts +45 -0
  355. package/src/core/ui-packs/ko.ts +44 -0
  356. package/src/core/ui-packs/nl.ts +46 -0
  357. package/src/core/ui-packs/no.ts +44 -0
  358. package/src/core/ui-packs/pl.ts +45 -0
  359. package/src/core/ui-packs/pt-br.ts +46 -0
  360. package/src/core/ui-packs/pt.ts +45 -0
  361. package/src/core/ui-packs/ro.ts +45 -0
  362. package/src/core/ui-packs/ru.ts +45 -0
  363. package/src/core/ui-packs/sk.ts +44 -0
  364. package/src/core/ui-packs/sr.ts +45 -0
  365. package/src/core/ui-packs/sv.ts +44 -0
  366. package/src/core/ui-packs/th.ts +43 -0
  367. package/src/core/ui-packs/tr.ts +45 -0
  368. package/src/core/ui-packs/uk.ts +45 -0
  369. package/src/core/ui-packs/vi.ts +45 -0
  370. package/src/core/ui-packs/zh-tw.ts +43 -0
  371. package/src/core/ui-packs/zh.ts +43 -0
  372. package/src/core/variables.ts +103 -0
  373. package/src/deploy/artifacts.ts +77 -8
  374. package/src/deploy/cloudflare-negotiation.ts +35 -5
  375. package/src/deploy/headers.ts +2 -1
  376. package/src/deploy/node-headers.ts +63 -9
  377. package/src/deploy/platforms/cloudflare.ts +32 -0
  378. package/src/deploy/platforms/netlify.ts +33 -1
  379. package/src/deploy/platforms/vercel.ts +37 -2
  380. package/src/deploy/redirects.ts +91 -24
  381. package/src/deploy/vercel-negotiation.ts +36 -0
  382. package/src/markdown/api-rail.ts +259 -0
  383. package/src/markdown/code-title.ts +35 -9
  384. package/src/markdown/features.ts +3 -2
  385. package/src/markdown/fence-meta.ts +2 -0
  386. package/src/markdown/include.ts +11 -1
  387. package/src/markdown/index.ts +28 -5
  388. package/src/markdown/math.ts +4 -4
  389. package/src/markdown/variables.ts +56 -0
  390. package/src/markdown/views.ts +82 -0
  391. package/src/narration/build.ts +412 -0
  392. package/src/narration/player.ts +249 -0
  393. package/src/narration/provider.ts +29 -0
  394. package/src/narration/script.ts +592 -0
  395. package/src/og/card.ts +7 -6
  396. package/src/openapi/model.ts +57 -24
  397. package/src/openapi/overlay.ts +256 -0
  398. package/src/openapi/parse.ts +55 -2
  399. package/src/openapi/references.ts +21 -5
  400. package/src/openapi/render-mdx.ts +5 -1
  401. package/src/openapi/scalar.ts +40 -6
  402. package/src/openapi/source.ts +1 -1
  403. package/src/ratelimit/cloudflare.ts +54 -0
  404. package/src/ratelimit/index.ts +30 -0
  405. package/src/ratelimit/memory.ts +45 -0
  406. package/src/ratelimit/runtime.ts +229 -0
  407. package/src/ratelimit/schema.ts +28 -0
  408. package/src/ratelimit/upstash.ts +30 -0
  409. package/src/ratelimit/wrangler.ts +70 -0
  410. package/src/reference/asyncapi.ts +2 -2
  411. package/src/reference/graphql.ts +5 -2
  412. package/src/reference/openapi.ts +21 -7
  413. package/src/reference/options.ts +51 -7
  414. package/src/reference/scalar.ts +33 -8
  415. package/src/registry/eject.ts +20 -4
  416. package/src/registry/registry.ts +7 -0
  417. package/src/search/documents.ts +26 -2
  418. package/src/search/orama-index.ts +28 -3
  419. package/src/search/pagefind-ranking.ts +39 -0
  420. package/src/search/sync/algolia.ts +15 -4
  421. package/src/search/sync/orama-cloud.ts +3 -0
  422. package/src/search/sync/typesense.ts +5 -0
  423. package/src/seo/metatags.ts +67 -0
  424. package/src/theme/chrome-icons.ts +1 -0
  425. package/src/theme/color.ts +500 -0
  426. package/src/theme/entry.ts +56 -3
  427. package/src/theme/palette.ts +121 -45
  428. package/src/translate/prompts.ts +1 -0
  429. package/src/translate/validate.ts +8 -2
  430. package/src/upgrade/upgrade.ts +4 -171
  431. package/dist/cli/chunk-364znk6q.js +0 -75
  432. package/dist/cli/chunk-364znk6q.js.map +0 -11
  433. package/dist/cli/chunk-5m5nmvyq.js.map +0 -13
  434. package/dist/cli/chunk-9t7a85s3.js.map +0 -10
  435. package/dist/cli/chunk-c8chx29p.js.map +0 -36
  436. package/dist/cli/chunk-pehfxfta.js.map +0 -10
  437. package/dist/cli/chunk-pv29h0wf.js.map +0 -190
  438. package/dist/cli/chunk-q58y5e6a.js.map +0 -10
  439. package/dist/cli/chunk-wrr3j9w9.js.map +0 -35
  440. package/dist/cli/chunk-yfyb25rh.js.map +0 -14
  441. package/docs/content/sources.mdx +0 -334
  442. /package/dist/cli/{chunk-2eytanqx.js.map → chunk-1n228xqb.js.map} +0 -0
  443. /package/dist/cli/{chunk-35d4wj9f.js.map → chunk-2n4ps1b3.js.map} +0 -0
  444. /package/dist/cli/{chunk-e04dxsz1.js.map → chunk-4ejxbzee.js.map} +0 -0
  445. /package/dist/cli/{chunk-tzmab476.js.map → chunk-5ffywsmb.js.map} +0 -0
  446. /package/dist/cli/{chunk-2z928egk.js.map → chunk-5wj2qwn2.js.map} +0 -0
  447. /package/dist/cli/{chunk-b07cmahc.js.map → chunk-amrb6hgh.js.map} +0 -0
  448. /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-cmtcnh9f.js.map} +0 -0
  449. /package/dist/cli/{chunk-crgn1q09.js.map → chunk-e7vvk5ya.js.map} +0 -0
  450. /package/dist/cli/{chunk-tkacnehg.js.map → chunk-gp84za0h.js.map} +0 -0
  451. /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-p804f3pe.js.map} +0 -0
  452. /package/dist/cli/{chunk-8ktnccpt.js.map → chunk-ta27feev.js.map} +0 -0
  453. /package/dist/cli/{chunk-a58773jm.js.map → chunk-y4ykbark.js.map} +0 -0
  454. /package/dist/cli/{chunk-p3v96n38.js.map → chunk-y5h4r2y0.js.map} +0 -0
  455. /package/dist/cli/{chunk-acanzt5p.js.map → chunk-yj17vs39.js.map} +0 -0
@@ -34,9 +34,24 @@ export interface AssistantAdapterOptions {
34
34
  */
35
35
  providerOptions?: AssistantProviderOptions;
36
36
  }
37
+ /** The shared option schema, with the adapter's own key env var default. */
38
+ export declare const sharedOptions: (apiKeyEnv: string) => {
39
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
40
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
41
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
42
+ };
43
+ export declare const GATEWAY_API_KEY_ENV = "AI_GATEWAY_API_KEY";
37
44
  /** Options for {@link gateway}. */
38
45
  export interface AssistantGatewayOptions extends AssistantAdapterOptions {
39
- /** A `provider/model` id routed by the gateway. Defaults to `openai/gpt-5.5`. */
46
+ /**
47
+ * Narration only: how the voice should sound, for speech models that take
48
+ * instructions ("Read calmly, like a teacher").
49
+ */
50
+ instructions?: string;
51
+ /**
52
+ * A `provider/model` id routed by the gateway. Defaults to `openai/gpt-5.5`
53
+ * for the assistant and `openai/tts-1-hd` for narration.
54
+ */
40
55
  model?: string;
41
56
  /**
42
57
  * How much the model reasons before answering. Sent as the AI SDK's
@@ -45,6 +60,8 @@ export interface AssistantGatewayOptions extends AssistantAdapterOptions {
45
60
  * offer the level you pick. Omitted keeps the model's default.
46
61
  */
47
62
  reasoning?: AssistantReasoning;
63
+ /** Narration only: the speech model's voice. Defaults to `alloy`. */
64
+ voice?: string;
48
65
  }
49
66
  export type AssistantGatewayAdapter = AdapterDescriptor<"gateway", AssistantGatewayOptions>;
50
67
  export declare const gatewayAdapterSchema: z.ZodObject<{
@@ -67,12 +84,193 @@ export declare const gatewayAdapterSchema: z.ZodObject<{
67
84
  runtimeDeps: z.ZodArray<z.ZodString>;
68
85
  }, z.core.$strict>;
69
86
  /**
70
- * Route the assistant through the Vercel AI Gateway (the default). `model` is a
87
+ * Route the assistant through the Vercel AI Gateway (the default), or generate
88
+ * narration audio with one of its speech models. `model` is a
71
89
  * `provider/model` string; the key is `AI_GATEWAY_API_KEY`, or Vercel's OIDC
72
90
  * token when deployed there. Needs no provider SDK beyond the `ai` package
73
91
  * Blume ships.
74
92
  */
75
93
  export declare const gateway: (options?: AssistantGatewayOptions) => AssistantGatewayAdapter;
94
+ /** Options for {@link openai}. */
95
+ export interface AssistantOpenAIOptions extends AssistantAdapterOptions {
96
+ /**
97
+ * An OpenAI-compatible endpoint to call instead of OpenAI
98
+ * (`https://llm.internal.example.com/v1`): a self-hosted model or an
99
+ * internal gateway. The route then talks Chat Completions through
100
+ * `@ai-sdk/openai-compatible`, and the docs tools are off unless
101
+ * `ai.assistant.tools` turns them on, since the model may not call tools.
102
+ */
103
+ baseUrl?: string;
104
+ /** The model id (`gpt-5.5`). */
105
+ model: string;
106
+ /**
107
+ * The provider name the AI SDK reports, which a custom endpoint also reads
108
+ * its `providerOptions` under. Defaults to `openai`, or `openai-compatible`
109
+ * with a `baseUrl`.
110
+ */
111
+ name?: string;
112
+ /**
113
+ * How much the model reasons before answering, sent as `reasoning_effort`;
114
+ * with a `baseUrl`, the endpoint has to accept that parameter. Omitted
115
+ * keeps the model's default.
116
+ */
117
+ reasoning?: AssistantReasoning;
118
+ }
119
+ export type AssistantOpenAIAdapter = AdapterDescriptor<"openai", AssistantOpenAIOptions>;
120
+ export declare const openaiAdapterSchema: z.ZodObject<{
121
+ kind: z.ZodLiteral<"openai">;
122
+ options: z.ZodObject<{
123
+ baseUrl: z.ZodOptional<z.ZodURL>;
124
+ model: z.ZodString;
125
+ name: z.ZodOptional<z.ZodString>;
126
+ reasoning: z.ZodOptional<z.ZodEnum<{
127
+ none: "none";
128
+ minimal: "minimal";
129
+ low: "low";
130
+ medium: "medium";
131
+ high: "high";
132
+ xhigh: "xhigh";
133
+ }>>;
134
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
135
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
136
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
137
+ }, z.core.$strict>;
138
+ requiredSecrets: z.ZodArray<z.ZodString>;
139
+ runtimeDeps: z.ZodArray<z.ZodString>;
140
+ }, z.core.$strict>;
141
+ /**
142
+ * Route the assistant to OpenAI, or to any OpenAI-compatible endpoint with
143
+ * `baseUrl`. Reads `OPENAI_API_KEY` and needs `@ai-sdk/openai` installed; a
144
+ * custom endpoint needs `@ai-sdk/openai-compatible` instead, since most
145
+ * don't serve OpenAI's Responses API.
146
+ */
147
+ export declare const openai: (options: AssistantOpenAIOptions) => AssistantOpenAIAdapter;
148
+ /**
149
+ * Options for the deprecated {@link openaiCompatible}: {@link openai}'s, with
150
+ * the endpoint and its key env var required.
151
+ *
152
+ * @deprecated Use {@link AssistantOpenAIOptions}.
153
+ */
154
+ export interface AssistantOpenAICompatibleOptions extends AssistantOpenAIOptions {
155
+ apiKeyEnv: string;
156
+ baseUrl: string;
157
+ }
158
+ /** @deprecated Use {@link AssistantOpenAIAdapter}. */
159
+ export type AssistantOpenAICompatibleAdapter = AssistantOpenAIAdapter;
160
+ /**
161
+ * Route the assistant through an OpenAI-compatible endpoint.
162
+ *
163
+ * @deprecated Use `openai({ baseUrl, model, apiKeyEnv })`, which this calls.
164
+ */
165
+ export declare const openaiCompatible: (options: AssistantOpenAICompatibleOptions) => AssistantOpenAIAdapter;
166
+ /** Options for {@link anthropic}. */
167
+ export interface AssistantAnthropicOptions extends AssistantAdapterOptions {
168
+ /** The Claude model id (`claude-sonnet-5`). */
169
+ model: string;
170
+ /**
171
+ * How much the model reasons before answering. The Anthropic provider
172
+ * maps the level to the model's thinking: an effort on models with
173
+ * adaptive thinking, a thinking budget on older ones, and thinking off for
174
+ * `"none"`. Omitted keeps the model's default.
175
+ */
176
+ reasoning?: AssistantReasoning;
177
+ }
178
+ export type AssistantAnthropicAdapter = AdapterDescriptor<"anthropic", AssistantAnthropicOptions>;
179
+ export declare const anthropicAdapterSchema: z.ZodObject<{
180
+ kind: z.ZodLiteral<"anthropic">;
181
+ options: z.ZodObject<{
182
+ model: z.ZodString;
183
+ reasoning: z.ZodOptional<z.ZodEnum<{
184
+ none: "none";
185
+ minimal: "minimal";
186
+ low: "low";
187
+ medium: "medium";
188
+ high: "high";
189
+ xhigh: "xhigh";
190
+ }>>;
191
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
192
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
193
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
194
+ }, z.core.$strict>;
195
+ requiredSecrets: z.ZodArray<z.ZodString>;
196
+ runtimeDeps: z.ZodArray<z.ZodString>;
197
+ }, z.core.$strict>;
198
+ /**
199
+ * Route the assistant to Anthropic's Claude API. Reads `ANTHROPIC_API_KEY`
200
+ * and needs `@ai-sdk/anthropic` installed.
201
+ */
202
+ export declare const anthropic: (options: AssistantAnthropicOptions) => AssistantAnthropicAdapter;
203
+ /** Options for {@link gemini}. */
204
+ export interface AssistantGeminiOptions extends AssistantAdapterOptions {
205
+ /** The Gemini model id (`gemini-3.5-flash`). */
206
+ model: string;
207
+ /**
208
+ * How much the model reasons before answering. The Google provider maps
209
+ * the level to the model's thinking level, or to a thinking budget on
210
+ * models that take one. Omitted keeps the model's default.
211
+ */
212
+ reasoning?: AssistantReasoning;
213
+ }
214
+ export type AssistantGeminiAdapter = AdapterDescriptor<"gemini", AssistantGeminiOptions>;
215
+ export declare const geminiAdapterSchema: z.ZodObject<{
216
+ kind: z.ZodLiteral<"gemini">;
217
+ options: z.ZodObject<{
218
+ model: z.ZodString;
219
+ reasoning: z.ZodOptional<z.ZodEnum<{
220
+ none: "none";
221
+ minimal: "minimal";
222
+ low: "low";
223
+ medium: "medium";
224
+ high: "high";
225
+ xhigh: "xhigh";
226
+ }>>;
227
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
228
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
229
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
230
+ }, z.core.$strict>;
231
+ requiredSecrets: z.ZodArray<z.ZodString>;
232
+ runtimeDeps: z.ZodArray<z.ZodString>;
233
+ }, z.core.$strict>;
234
+ /**
235
+ * Route the assistant to Google's Gemini API. Reads `GEMINI_API_KEY` and
236
+ * needs `@ai-sdk/google` installed.
237
+ */
238
+ export declare const gemini: (options: AssistantGeminiOptions) => AssistantGeminiAdapter;
239
+ /** Options for {@link grok}. */
240
+ export interface AssistantGrokOptions extends AssistantAdapterOptions {
241
+ /** The Grok model id (`grok-4.7`). */
242
+ model: string;
243
+ /**
244
+ * How much the model reasons before answering, sent as xAI's reasoning
245
+ * effort on the models that take one. Omitted keeps the model's default.
246
+ */
247
+ reasoning?: AssistantReasoning;
248
+ }
249
+ export type AssistantGrokAdapter = AdapterDescriptor<"grok", AssistantGrokOptions>;
250
+ export declare const grokAdapterSchema: z.ZodObject<{
251
+ kind: z.ZodLiteral<"grok">;
252
+ options: z.ZodObject<{
253
+ model: z.ZodString;
254
+ reasoning: z.ZodOptional<z.ZodEnum<{
255
+ none: "none";
256
+ minimal: "minimal";
257
+ low: "low";
258
+ medium: "medium";
259
+ high: "high";
260
+ xhigh: "xhigh";
261
+ }>>;
262
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
263
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
264
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
265
+ }, z.core.$strict>;
266
+ requiredSecrets: z.ZodArray<z.ZodString>;
267
+ runtimeDeps: z.ZodArray<z.ZodString>;
268
+ }, z.core.$strict>;
269
+ /**
270
+ * Route the assistant to xAI's Grok models. Reads `XAI_API_KEY` and needs
271
+ * `@ai-sdk/xai` installed.
272
+ */
273
+ export declare const grok: (options: AssistantGrokOptions) => AssistantGrokAdapter;
76
274
  /** Options for {@link openrouter}. */
77
275
  export interface AssistantOpenRouterOptions extends AssistantAdapterOptions {
78
276
  /** The OpenRouter model id (`anthropic/claude-sonnet-4-5`). */
@@ -176,53 +374,8 @@ export declare const inkeepAdapterSchema: z.ZodObject<{
176
374
  * Reads `INKEEP_API_KEY` and needs `@ai-sdk/openai-compatible` installed.
177
375
  */
178
376
  export declare const inkeep: (options: AssistantInkeepOptions) => AssistantInkeepAdapter;
179
- /** Options for {@link openaiCompatible}. */
180
- export interface AssistantOpenAICompatibleOptions extends AssistantAdapterOptions {
181
- /** Name of the env var holding the endpoint's API key. */
182
- apiKeyEnv: string;
183
- /** The endpoint's base URL (`https://my-gateway.example.com/v1`). */
184
- baseUrl: string;
185
- /** The model id the endpoint serves. */
186
- model: string;
187
- /** The provider name the AI SDK reports. Defaults to `openai-compatible`. */
188
- name?: string;
189
- /**
190
- * How much the model reasons before answering, sent in the request as
191
- * `reasoning_effort`, so the endpoint has to accept that parameter.
192
- * Omitted keeps the model's default.
193
- */
194
- reasoning?: AssistantReasoning;
195
- }
196
- export type AssistantOpenAICompatibleAdapter = AdapterDescriptor<"openai-compatible", AssistantOpenAICompatibleOptions>;
197
- export declare const openaiCompatibleAdapterSchema: z.ZodObject<{
198
- kind: z.ZodLiteral<"openai-compatible">;
199
- options: z.ZodObject<{
200
- apiKeyEnv: z.ZodString;
201
- baseUrl: z.ZodURL;
202
- model: z.ZodString;
203
- name: z.ZodDefault<z.ZodString>;
204
- reasoning: z.ZodOptional<z.ZodEnum<{
205
- none: "none";
206
- minimal: "minimal";
207
- low: "low";
208
- medium: "medium";
209
- high: "high";
210
- xhigh: "xhigh";
211
- }>>;
212
- headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
213
- providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
214
- }, z.core.$strict>;
215
- requiredSecrets: z.ZodArray<z.ZodString>;
216
- runtimeDeps: z.ZodArray<z.ZodString>;
217
- }, z.core.$strict>;
218
- /**
219
- * Route the assistant through any OpenAI-compatible endpoint: supply its `baseUrl`,
220
- * the `model` it serves, and the env var holding its key. Needs
221
- * `@ai-sdk/openai-compatible` installed.
222
- */
223
- export declare const openaiCompatible: (options: AssistantOpenAICompatibleOptions) => AssistantOpenAICompatibleAdapter;
224
- /** Which backend answers the assistant: the value of `gateway()`, `openrouter()`, … */
225
- export type AssistantAdapter = AssistantGatewayAdapter | AssistantOpenRouterAdapter | AssistantLlmGatewayAdapter | AssistantInkeepAdapter | AssistantOpenAICompatibleAdapter;
377
+ /** Which backend answers the assistant: the value of `gateway()`, `openai()`, … */
378
+ export type AssistantAdapter = AssistantGatewayAdapter | AssistantOpenAIAdapter | AssistantAnthropicAdapter | AssistantGeminiAdapter | AssistantGrokAdapter | AssistantOpenRouterAdapter | AssistantLlmGatewayAdapter | AssistantInkeepAdapter;
226
379
  /**
227
380
  * Error params for `ai.assistant`: a 1.x flat provider field (`model`, `apiKeyEnv`,
228
381
  * `baseUrl`, `headers`, `reasoning`) names the adapter call it moves into —
@@ -256,9 +409,11 @@ export declare const assistantAdapterSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
256
409
  requiredSecrets: z.ZodArray<z.ZodString>;
257
410
  runtimeDeps: z.ZodArray<z.ZodString>;
258
411
  }, z.core.$strict>, z.ZodObject<{
259
- kind: z.ZodLiteral<"openrouter">;
412
+ kind: z.ZodLiteral<"openai">;
260
413
  options: z.ZodObject<{
414
+ baseUrl: z.ZodOptional<z.ZodURL>;
261
415
  model: z.ZodString;
416
+ name: z.ZodOptional<z.ZodString>;
262
417
  reasoning: z.ZodOptional<z.ZodEnum<{
263
418
  none: "none";
264
419
  minimal: "minimal";
@@ -274,9 +429,8 @@ export declare const assistantAdapterSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
274
429
  requiredSecrets: z.ZodArray<z.ZodString>;
275
430
  runtimeDeps: z.ZodArray<z.ZodString>;
276
431
  }, z.core.$strict>, z.ZodObject<{
277
- kind: z.ZodLiteral<"llmgateway">;
432
+ kind: z.ZodLiteral<"anthropic">;
278
433
  options: z.ZodObject<{
279
- baseUrl: z.ZodDefault<z.ZodURL>;
280
434
  model: z.ZodString;
281
435
  reasoning: z.ZodOptional<z.ZodEnum<{
282
436
  none: "none";
@@ -293,10 +447,35 @@ export declare const assistantAdapterSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
293
447
  requiredSecrets: z.ZodArray<z.ZodString>;
294
448
  runtimeDeps: z.ZodArray<z.ZodString>;
295
449
  }, z.core.$strict>, z.ZodObject<{
296
- kind: z.ZodLiteral<"inkeep">;
450
+ kind: z.ZodLiteral<"gemini">;
451
+ options: z.ZodObject<{
452
+ model: z.ZodString;
453
+ reasoning: z.ZodOptional<z.ZodEnum<{
454
+ none: "none";
455
+ minimal: "minimal";
456
+ low: "low";
457
+ medium: "medium";
458
+ high: "high";
459
+ xhigh: "xhigh";
460
+ }>>;
461
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
462
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
463
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
464
+ }, z.core.$strict>;
465
+ requiredSecrets: z.ZodArray<z.ZodString>;
466
+ runtimeDeps: z.ZodArray<z.ZodString>;
467
+ }, z.core.$strict>, z.ZodObject<{
468
+ kind: z.ZodLiteral<"grok">;
297
469
  options: z.ZodObject<{
298
- baseUrl: z.ZodDefault<z.ZodURL>;
299
470
  model: z.ZodString;
471
+ reasoning: z.ZodOptional<z.ZodEnum<{
472
+ none: "none";
473
+ minimal: "minimal";
474
+ low: "low";
475
+ medium: "medium";
476
+ high: "high";
477
+ xhigh: "xhigh";
478
+ }>>;
300
479
  apiKeyEnv: z.ZodDefault<z.ZodString>;
301
480
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
302
481
  providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
@@ -304,12 +483,9 @@ export declare const assistantAdapterSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
304
483
  requiredSecrets: z.ZodArray<z.ZodString>;
305
484
  runtimeDeps: z.ZodArray<z.ZodString>;
306
485
  }, z.core.$strict>, z.ZodObject<{
307
- kind: z.ZodLiteral<"openai-compatible">;
486
+ kind: z.ZodLiteral<"openrouter">;
308
487
  options: z.ZodObject<{
309
- apiKeyEnv: z.ZodString;
310
- baseUrl: z.ZodURL;
311
488
  model: z.ZodString;
312
- name: z.ZodDefault<z.ZodString>;
313
489
  reasoning: z.ZodOptional<z.ZodEnum<{
314
490
  none: "none";
315
491
  minimal: "minimal";
@@ -318,6 +494,37 @@ export declare const assistantAdapterSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
318
494
  high: "high";
319
495
  xhigh: "xhigh";
320
496
  }>>;
497
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
498
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
499
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
500
+ }, z.core.$strict>;
501
+ requiredSecrets: z.ZodArray<z.ZodString>;
502
+ runtimeDeps: z.ZodArray<z.ZodString>;
503
+ }, z.core.$strict>, z.ZodObject<{
504
+ kind: z.ZodLiteral<"llmgateway">;
505
+ options: z.ZodObject<{
506
+ baseUrl: z.ZodDefault<z.ZodURL>;
507
+ model: z.ZodString;
508
+ reasoning: z.ZodOptional<z.ZodEnum<{
509
+ none: "none";
510
+ minimal: "minimal";
511
+ low: "low";
512
+ medium: "medium";
513
+ high: "high";
514
+ xhigh: "xhigh";
515
+ }>>;
516
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
517
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
518
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
519
+ }, z.core.$strict>;
520
+ requiredSecrets: z.ZodArray<z.ZodString>;
521
+ runtimeDeps: z.ZodArray<z.ZodString>;
522
+ }, z.core.$strict>, z.ZodObject<{
523
+ kind: z.ZodLiteral<"inkeep">;
524
+ options: z.ZodObject<{
525
+ baseUrl: z.ZodDefault<z.ZodURL>;
526
+ model: z.ZodString;
527
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
321
528
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
322
529
  providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
323
530
  }, z.core.$strict>;
@@ -357,6 +564,12 @@ export interface AskBackendTemplate {
357
564
  export interface AskBackend {
358
565
  /** Whether Blume grounds answers in the docs (Inkeep retrieves itself). */
359
566
  grounded: boolean;
567
+ /**
568
+ * Whether the docs tools are on when `ai.assistant.tools` is unset: yes for
569
+ * the hosted model catalogs, whose models call tools, and no for an
570
+ * OpenAI-compatible backend, which may be a local model that can't.
571
+ */
572
+ toolsByDefault: boolean;
360
573
  kind: AssistantAdapterKind;
361
574
  /** Human-readable adapter name for diagnostics ("AI Gateway"). */
362
575
  label: string;
@@ -19,6 +19,6 @@
19
19
  * schema validates and the generated `/api/ask` route inlines as literals;
20
20
  * nothing here runs at request time.
21
21
  */
22
- export { gateway, inkeep, llmgateway, openaiCompatible, openrouter, } from "./ask.ts";
23
- export type { AssistantAdapter, AssistantAdapterOptions, AssistantGatewayAdapter, AssistantGatewayOptions, AssistantInkeepAdapter, AssistantInkeepOptions, AssistantLlmGatewayAdapter, AssistantLlmGatewayOptions, AssistantOpenAICompatibleAdapter, AssistantOpenAICompatibleOptions, AssistantOpenRouterAdapter, AssistantOpenRouterOptions, AssistantProviderOptions, AssistantReasoning, } from "./ask.ts";
22
+ export { anthropic, gateway, gemini, grok, inkeep, llmgateway, openai, openaiCompatible, openrouter, } from "./ask.ts";
23
+ export type { AssistantAdapter, AssistantAdapterOptions, AssistantAnthropicAdapter, AssistantAnthropicOptions, AssistantGatewayAdapter, AssistantGatewayOptions, AssistantGeminiAdapter, AssistantGeminiOptions, AssistantGrokAdapter, AssistantGrokOptions, AssistantInkeepAdapter, AssistantInkeepOptions, AssistantLlmGatewayAdapter, AssistantLlmGatewayOptions, AssistantOpenAIAdapter, AssistantOpenAICompatibleAdapter, AssistantOpenAICompatibleOptions, AssistantOpenAIOptions, AssistantOpenRouterAdapter, AssistantOpenRouterOptions, AssistantProviderOptions, AssistantReasoning, } from "./ask.ts";
24
24
  export type { AdapterDescriptor } from "../core/adapter.ts";
@@ -0,0 +1,26 @@
1
+ import type { BlumeProject } from "../core/project-graph.ts";
2
+ import type { SkillArtifact } from "./skills.ts";
3
+ /**
4
+ * The site's own agent skill (`agents.skillMd`): a `SKILL.md` in the Agent
5
+ * Skills format, built from what the build already knows — the site's title
6
+ * and description, how to read any page as Markdown, llms.txt and the MCP
7
+ * server, the API references, and a map of the docs with each page's one-line
8
+ * description. No model writes it, so it costs nothing and is current with
9
+ * every build: a guide to the docs rather than a summary of the product. A
10
+ * hand-written skill of the same name in `agents.skills` replaces it.
11
+ */
12
+ /** The most pages the map lists; llms.txt holds the rest. */
13
+ export declare const MAX_SKILL_PAGES = 200;
14
+ /** Where the site skill is served besides the discovery index. */
15
+ export declare const SKILL_MD_PATH = "/skill.md";
16
+ /**
17
+ * The site skill's name: the title as a skill name (lowercase alphanumerics
18
+ * and single hyphens), else the site's host, for a title with no Latin
19
+ * letters in it.
20
+ */
21
+ export declare const siteSkillName: (project: BlumeProject) => string;
22
+ /**
23
+ * The generated site skill, or `null` when `agents.skillMd` is off or there
24
+ * is no `deployment.site` to make its links absolute.
25
+ */
26
+ export declare const buildSiteSkill: (project: BlumeProject) => SkillArtifact | null;
@@ -10,6 +10,8 @@ import type { ResolvedConfig } from "../core/schema.ts";
10
10
  */
11
11
  export declare const AGENT_SKILLS_DIR = "/.well-known/agent-skills";
12
12
  export declare const AGENT_SKILLS_INDEX_PATH = "/.well-known/agent-skills/index.json";
13
+ /** The Agent Skills spec caps `description` at 1024 characters. */
14
+ export declare const SKILL_DESCRIPTION_MAX = 1024;
13
15
  /** One publishable skill artifact plus its index entry. */
14
16
  export interface SkillArtifact {
15
17
  /** Raw bytes to publish (the digest is computed over exactly these). */
@@ -38,6 +40,20 @@ export interface CollectedSkills {
38
40
  * with a warning naming both.
39
41
  */
40
42
  export declare const collectSkills: (dir: string) => Promise<CollectedSkills>;
43
+ /** A skill that is one `SKILL.md`, published verbatim. */
44
+ export declare const skillMdArtifact: (name: string, description: string, markdown: string) => SkillArtifact;
45
+ /**
46
+ * Whether the build generates the site's own skill (`agents.skillMd`): on,
47
+ * and with a `deployment.site` to make its links absolute, since an installed
48
+ * skill is read away from the site.
49
+ */
50
+ export declare const generatesSiteSkill: (config: ResolvedConfig) => boolean;
51
+ /**
52
+ * Whether a skills discovery index is served: from `agents.skills`, or for
53
+ * the generated site skill alone. On an advertised config (see
54
+ * `advertisedConfig`), both are already switched off when nothing published.
55
+ */
56
+ export declare const servesSkillsIndex: (config: ResolvedConfig) => boolean;
41
57
  /**
42
58
  * The discovery index (v0.2.0 schema). Artifact URLs are path-absolute under
43
59
  * `deployment.base` — the RFC resolves them against the index origin.
@@ -1,6 +1,7 @@
1
1
  import type { AstroIntegration } from "astro";
2
2
  import type { CustomPageRoute } from "../core/custom-pages.ts";
3
3
  import type { BlumeProject } from "../core/project-graph.ts";
4
+ import type { CompiledRedirect } from "../core/redirect-patterns.ts";
4
5
  import type { Diagnostic } from "../core/types.ts";
5
6
  /**
6
7
  * Hand the scanned project to the integration ahead of `build()`, so its
@@ -66,6 +67,13 @@ export interface BlumeIntegrationOptions {
66
67
  * its already-scanned project instead.
67
68
  */
68
69
  buildArtifactsRoot?: string;
70
+ /**
71
+ * The pattern redirects (`/beta/:slug*`), compiled against base-less
72
+ * request paths (see `core/redirect-patterns.ts`). Astro's own `redirects`
73
+ * carry only the exact ones, since it can't prerender a pattern's pages, so
74
+ * the dev server answers these itself.
75
+ */
76
+ redirects?: CompiledRedirect[];
69
77
  }
70
78
  /**
71
79
  * Blume's Astro integration. Mounts user-authored pages from `pages/` into the
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ import type { AdapterDescriptor } from "../core/adapter.ts";
3
+ /** Options for {@link hcaptcha}. */
4
+ export interface HcaptchaOptions {
5
+ /** The site key, from the hCaptcha dashboard. */
6
+ siteKey: string;
7
+ }
8
+ export declare const hcaptchaOptionsSchema: z.ZodObject<{
9
+ siteKey: z.ZodString;
10
+ }, z.core.$strict>;
11
+ export type HcaptchaAdapter = AdapterDescriptor<"hcaptcha", HcaptchaOptions>;
12
+ export declare const hcaptchaAdapterSchema: z.ZodObject<{
13
+ kind: z.ZodLiteral<"hcaptcha">;
14
+ options: z.ZodObject<{
15
+ siteKey: z.ZodString;
16
+ }, z.core.$strict>;
17
+ requiredSecrets: z.ZodArray<z.ZodString>;
18
+ runtimeDeps: z.ZodArray<z.ZodString>;
19
+ }, z.core.$strict>;
20
+ /** Where the assistant's route checks an hCaptcha token. */
21
+ export declare const HCAPTCHA_VERIFY_URL = "https://api.hcaptcha.com/siteverify";
22
+ /**
23
+ * hCaptcha, as an invisible check: most readers never see a challenge. The
24
+ * site key is public and goes to the browser; the secret the route checks
25
+ * tokens with comes from `HCAPTCHA_SECRET_KEY`.
26
+ */
27
+ export declare const hcaptcha: (options: HcaptchaOptions) => HcaptchaAdapter;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Bot checks for the assistant (`ai.assistant.captcha` in `blume.config.ts`).
3
+ * The assistant gets a token from the check before each question and the
4
+ * generated route verifies it before calling the model:
5
+ *
6
+ * ```ts
7
+ * import { defineConfig } from "blume";
8
+ * import { turnstile } from "blume/captcha";
9
+ *
10
+ * export default defineConfig({
11
+ * ai: {
12
+ * assistant: {
13
+ * enabled: true,
14
+ * captcha: turnstile({ siteKey: "0x4AAAAAAA…" }),
15
+ * },
16
+ * },
17
+ * });
18
+ * ```
19
+ *
20
+ * Each factory returns a plain descriptor (see `core/adapter.ts`); the browser
21
+ * half is `client.ts`, the server half `verify.ts`.
22
+ */
23
+ export type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
24
+ export { hcaptcha } from "./hcaptcha.ts";
25
+ export type { HcaptchaAdapter, HcaptchaOptions } from "./hcaptcha.ts";
26
+ export type { CaptchaAdapter, CaptchaSettings } from "./schema.ts";
27
+ export { turnstile } from "./turnstile.ts";
28
+ export type { TurnstileAdapter, TurnstileOptions } from "./turnstile.ts";
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * The configured bot check, as its factory returned it. Anything that isn't
4
+ * one fails with the adapter hint; an adapter's own option errors keep their
5
+ * messages.
6
+ */
7
+ export declare const captchaAdapterSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
8
+ kind: z.ZodLiteral<"hcaptcha">;
9
+ options: z.ZodObject<{
10
+ siteKey: z.ZodString;
11
+ }, z.core.$strict>;
12
+ requiredSecrets: z.ZodArray<z.ZodString>;
13
+ runtimeDeps: z.ZodArray<z.ZodString>;
14
+ }, z.core.$strict>, z.ZodObject<{
15
+ kind: z.ZodLiteral<"turnstile">;
16
+ options: z.ZodObject<{
17
+ siteKey: z.ZodString;
18
+ }, z.core.$strict>;
19
+ requiredSecrets: z.ZodArray<z.ZodString>;
20
+ runtimeDeps: z.ZodArray<z.ZodString>;
21
+ }, z.core.$strict>], "kind">;
22
+ export type CaptchaAdapter = z.output<typeof captchaAdapterSchema>;
23
+ /** What the browser needs to run the check: never the secret. */
24
+ export interface CaptchaSettings {
25
+ kind: CaptchaAdapter["kind"];
26
+ siteKey: string;
27
+ }
28
+ /** The public half of an adapter, for the data snapshot. */
29
+ export declare const captchaSettings: (adapter: CaptchaAdapter) => CaptchaSettings;
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ import type { AdapterDescriptor } from "../core/adapter.ts";
3
+ /** Options for {@link turnstile}. */
4
+ export interface TurnstileOptions {
5
+ /** The widget's site key, from the Cloudflare dashboard. */
6
+ siteKey: string;
7
+ }
8
+ export declare const turnstileOptionsSchema: z.ZodObject<{
9
+ siteKey: z.ZodString;
10
+ }, z.core.$strict>;
11
+ export type TurnstileAdapter = AdapterDescriptor<"turnstile", TurnstileOptions>;
12
+ export declare const turnstileAdapterSchema: z.ZodObject<{
13
+ kind: z.ZodLiteral<"turnstile">;
14
+ options: z.ZodObject<{
15
+ siteKey: z.ZodString;
16
+ }, z.core.$strict>;
17
+ requiredSecrets: z.ZodArray<z.ZodString>;
18
+ runtimeDeps: z.ZodArray<z.ZodString>;
19
+ }, z.core.$strict>;
20
+ /** Where the assistant's route checks a Turnstile token. */
21
+ export declare const TURNSTILE_VERIFY_URL = "https://challenges.cloudflare.com/turnstile/v0/siteverify";
22
+ /**
23
+ * Cloudflare Turnstile. The site key is public and goes to the browser; the
24
+ * secret key the route checks tokens with comes from `TURNSTILE_SECRET_KEY`.
25
+ * Set the widget to Invisible or Managed in the Cloudflare dashboard: most
26
+ * readers never see a challenge.
27
+ */
28
+ export declare const turnstile: (options: TurnstileOptions) => TurnstileAdapter;