blume 2.0.2 → 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 (601) hide show
  1. package/AGENTS.md +1 -0
  2. package/CHANGELOG.md +113 -0
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-6k4ftwze.js → chunk-0gz36akr.js} +18 -2
  5. package/dist/cli/{chunk-6k4ftwze.js.map → chunk-0gz36akr.js.map} +3 -3
  6. package/dist/cli/{chunk-zp79m0ts.js → chunk-1n228xqb.js} +2 -2
  7. package/dist/cli/{chunk-ddndchfr.js → chunk-2f3ndkpw.js} +57 -29
  8. package/dist/cli/chunk-2f3ndkpw.js.map +14 -0
  9. package/dist/cli/{chunk-fsmrqk8a.js → chunk-2f7n4qzt.js} +8 -2
  10. package/dist/cli/{chunk-fsmrqk8a.js.map → chunk-2f7n4qzt.js.map} +3 -3
  11. package/dist/cli/{chunk-ppzjqwx2.js → chunk-2n4ps1b3.js} +17 -18
  12. package/dist/cli/{chunk-ppzjqwx2.js.map → chunk-2n4ps1b3.js.map} +3 -3
  13. package/dist/cli/{chunk-5r8g91qn.js → chunk-43zcf4gz.js} +398 -159
  14. package/dist/cli/chunk-43zcf4gz.js.map +36 -0
  15. package/dist/cli/chunk-4ejxbzee.js +39 -0
  16. package/dist/cli/chunk-4ejxbzee.js.map +10 -0
  17. package/dist/cli/{chunk-hr8ne106.js → chunk-4h8z9vv5.js} +296 -77
  18. package/dist/cli/chunk-4h8z9vv5.js.map +16 -0
  19. package/dist/cli/{chunk-k7pj68a8.js → chunk-5cg2rzgf.js} +18 -16
  20. package/dist/cli/{chunk-k7pj68a8.js.map → chunk-5cg2rzgf.js.map} +2 -2
  21. package/dist/cli/{chunk-h2ez8dzb.js → chunk-5ffywsmb.js} +4 -4
  22. package/dist/cli/{chunk-g698a744.js → chunk-5wj2qwn2.js} +5 -5
  23. package/dist/cli/chunk-6bm0xpgd.js +18 -0
  24. package/dist/cli/chunk-6bm0xpgd.js.map +10 -0
  25. package/dist/cli/{chunk-3yce002v.js → chunk-713mngdq.js} +15 -8
  26. package/dist/cli/chunk-713mngdq.js.map +14 -0
  27. package/dist/cli/{chunk-91ws1n6j.js → chunk-9geymqns.js} +17 -15
  28. package/dist/cli/{chunk-91ws1n6j.js.map → chunk-9geymqns.js.map} +2 -2
  29. package/dist/cli/{chunk-6dtt0zfn.js → chunk-9xr4dgee.js} +27 -18
  30. package/dist/cli/chunk-9xr4dgee.js.map +10 -0
  31. package/dist/cli/{chunk-sqw4ekg1.js → chunk-amrb6hgh.js} +2 -2
  32. package/dist/cli/chunk-cm89scdv.js +443 -0
  33. package/dist/cli/chunk-cm89scdv.js.map +11 -0
  34. package/dist/cli/{chunk-wdrt2k2v.js → chunk-cmtcnh9f.js} +90 -26
  35. package/dist/cli/chunk-cmtcnh9f.js.map +10 -0
  36. package/dist/cli/chunk-cy5bm0j0.js +104 -0
  37. package/dist/cli/chunk-cy5bm0j0.js.map +11 -0
  38. package/dist/cli/{chunk-7mbqtmgb.js → chunk-e7vvk5ya.js} +21 -12
  39. package/dist/cli/chunk-e7vvk5ya.js.map +10 -0
  40. package/dist/cli/{chunk-qkb5a8sa.js → chunk-g2z9x01v.js} +6 -98
  41. package/dist/cli/chunk-g2z9x01v.js.map +10 -0
  42. package/dist/cli/{chunk-273ygyr4.js → chunk-ga0pf4aj.js} +7 -7
  43. package/dist/cli/{chunk-273ygyr4.js.map → chunk-ga0pf4aj.js.map} +3 -3
  44. package/dist/cli/{chunk-h7k3nq3v.js → chunk-gp84za0h.js} +2 -2
  45. package/dist/cli/{chunk-hqp2ajnh.js → chunk-h2a48yhd.js} +195 -73
  46. package/dist/cli/chunk-h2a48yhd.js.map +36 -0
  47. package/dist/cli/{chunk-pbg5a4s3.js → chunk-jnwj5kjj.js} +71 -47
  48. package/dist/cli/chunk-jnwj5kjj.js.map +19 -0
  49. package/dist/cli/chunk-kwrg63tm.js +31 -0
  50. package/dist/cli/chunk-kwrg63tm.js.map +10 -0
  51. package/dist/cli/{chunk-8g8ytmgx.js → chunk-nd1821sk.js} +21 -19
  52. package/dist/cli/{chunk-8g8ytmgx.js.map → chunk-nd1821sk.js.map} +2 -2
  53. package/dist/cli/{chunk-w4bxdvsa.js → chunk-ntv4qrt7.js} +17 -15
  54. package/dist/cli/{chunk-w4bxdvsa.js.map → chunk-ntv4qrt7.js.map} +2 -2
  55. package/dist/cli/{chunk-bfwp9vp6.js → chunk-p804f3pe.js} +7 -7
  56. package/dist/cli/{chunk-4e9b9ra6.js → chunk-py62fewh.js} +6 -6
  57. package/dist/cli/{chunk-4e9b9ra6.js.map → chunk-py62fewh.js.map} +1 -1
  58. package/dist/cli/chunk-q3wxxq39.js +126 -0
  59. package/dist/cli/chunk-q3wxxq39.js.map +11 -0
  60. package/dist/cli/{chunk-j85scx15.js → chunk-rekqz4qg.js} +142 -46
  61. package/dist/cli/chunk-rekqz4qg.js.map +10 -0
  62. package/dist/cli/{chunk-00gs3wqs.js → chunk-ta27feev.js} +1 -1
  63. package/dist/cli/{chunk-v6ya5kcb.js → chunk-xkz5xbtv.js} +4031 -1132
  64. package/dist/cli/chunk-xkz5xbtv.js.map +213 -0
  65. package/dist/cli/{chunk-bbnwccaz.js → chunk-y4ykbark.js} +2 -2
  66. package/dist/cli/{chunk-n1yg3tj3.js → chunk-y5h4r2y0.js} +6 -6
  67. package/dist/cli/{chunk-n1yg3tj3.js.map → chunk-y5h4r2y0.js.map} +3 -3
  68. package/dist/cli/{chunk-nfcyttvj.js → chunk-yj17vs39.js} +9 -9
  69. package/dist/cli/{chunk-nfcyttvj.js.map → chunk-yj17vs39.js.map} +1 -1
  70. package/dist/cli/{chunk-7vtckvaw.js → chunk-yxmk4pec.js} +16 -14
  71. package/dist/cli/{chunk-7vtckvaw.js.map → chunk-yxmk4pec.js.map} +2 -2
  72. package/dist/cli/{chunk-gs7r695n.js → chunk-zccbjcj0.js} +22 -8
  73. package/dist/cli/{chunk-gs7r695n.js.map → chunk-zccbjcj0.js.map} +3 -3
  74. package/dist/cli/{chunk-xh43dwgw.js → chunk-zf748avv.js} +415 -225
  75. package/dist/cli/chunk-zf748avv.js.map +37 -0
  76. package/dist/cli/{chunk-d1v5rhy0.js → chunk-zhvd6adm.js} +16 -14
  77. package/dist/cli/{chunk-d1v5rhy0.js.map → chunk-zhvd6adm.js.map} +2 -2
  78. package/dist/cli/index.js +28 -20
  79. package/dist/cli/index.js.map +5 -5
  80. package/dist/types/ai/agent-surface.d.ts +8 -7
  81. package/dist/types/ai/ai-catalog.d.ts +7 -0
  82. package/dist/types/ai/ask-context.d.ts +22 -0
  83. package/dist/types/ai/ask.d.ts +271 -58
  84. package/dist/types/ai/index.d.ts +2 -2
  85. package/dist/types/ai/link-headers.d.ts +8 -1
  86. package/dist/types/ai/openapi-components.d.ts +5 -2
  87. package/dist/types/ai/relative-links.d.ts +9 -7
  88. package/dist/types/ai/site-skill.d.ts +26 -0
  89. package/dist/types/ai/skills.d.ts +20 -1
  90. package/dist/types/ai/tar.d.ts +1 -3
  91. package/dist/types/analytics/index.d.ts +2 -0
  92. package/dist/types/analytics/one-dollar-stats.d.ts +48 -0
  93. package/dist/types/analytics/schema.d.ts +14 -0
  94. package/dist/types/astro/integration.d.ts +11 -2
  95. package/dist/types/captcha/hcaptcha.d.ts +27 -0
  96. package/dist/types/captcha/index.d.ts +28 -0
  97. package/dist/types/captcha/schema.d.ts +29 -0
  98. package/dist/types/captcha/turnstile.d.ts +28 -0
  99. package/dist/types/components/content/api-field.d.ts +59 -0
  100. package/dist/types/components/content/api-page.d.ts +95 -0
  101. package/dist/types/components/layout/nav-utils.d.ts +26 -0
  102. package/dist/types/components/openapi/helpers.d.ts +137 -0
  103. package/dist/types/components/openapi/security.d.ts +85 -0
  104. package/dist/types/consent/ethyca.d.ts +48 -0
  105. package/dist/types/consent/index.d.ts +37 -0
  106. package/dist/types/consent/native.d.ts +28 -0
  107. package/dist/types/consent/osano.d.ts +42 -0
  108. package/dist/types/consent/schema.d.ts +110 -0
  109. package/dist/types/core/base-path.d.ts +21 -7
  110. package/dist/types/core/config-input.d.ts +196 -27
  111. package/dist/types/core/data.d.ts +49 -4
  112. package/dist/types/core/directive-diagnostics.d.ts +12 -0
  113. package/dist/types/core/footer.d.ts +8 -0
  114. package/dist/types/core/heading-markers.d.ts +5 -7
  115. package/dist/types/core/i18n-ui.d.ts +86 -0
  116. package/dist/types/core/i18n.d.ts +2 -0
  117. package/dist/types/core/includes.d.ts +8 -2
  118. package/dist/types/core/last-modified.d.ts +10 -0
  119. package/dist/types/core/localizable.d.ts +7 -0
  120. package/dist/types/core/meta.d.ts +8 -0
  121. package/dist/types/core/page-modes.d.ts +29 -0
  122. package/dist/types/core/redirect-patterns.d.ts +144 -0
  123. package/dist/types/core/related.d.ts +40 -0
  124. package/dist/types/core/schema.d.ts +558 -56
  125. package/dist/types/core/sources/lower.d.ts +29 -16
  126. package/dist/types/core/sources/normalize.d.ts +13 -1
  127. package/dist/types/core/sources/read.d.ts +5 -0
  128. package/dist/types/core/sources/watch.d.ts +12 -5
  129. package/dist/types/core/standard-schema.d.ts +5 -0
  130. package/dist/types/core/types.d.ts +1 -1
  131. package/dist/types/core/variables.d.ts +42 -0
  132. package/dist/types/deploy/artifacts.d.ts +6 -4
  133. package/dist/types/deploy/headers.d.ts +5 -0
  134. package/dist/types/deploy/node-headers.d.ts +13 -2
  135. package/dist/types/deploy/platforms/cloudflare.d.ts +5 -0
  136. package/dist/types/deploy/platforms/netlify.d.ts +7 -0
  137. package/dist/types/deploy/platforms/types.d.ts +8 -0
  138. package/dist/types/deploy/platforms/vercel.d.ts +6 -0
  139. package/dist/types/deploy/redirects.d.ts +61 -22
  140. package/dist/types/deploy/vercel-negotiation.d.ts +9 -0
  141. package/dist/types/markdown/code-title.d.ts +17 -0
  142. package/dist/types/markdown/directives.d.ts +62 -0
  143. package/dist/types/markdown/features.d.ts +24 -2
  144. package/dist/types/markdown/mdast.d.ts +63 -0
  145. package/dist/types/narration/build.d.ts +70 -0
  146. package/dist/types/narration/provider.d.ts +26 -0
  147. package/dist/types/narration/script.d.ts +154 -0
  148. package/dist/types/openapi/asyncapi.d.ts +4 -2
  149. package/dist/types/openapi/model.d.ts +12 -6
  150. package/dist/types/openapi/overlay.d.ts +54 -0
  151. package/dist/types/openapi/parse.d.ts +13 -0
  152. package/dist/types/openapi/references.d.ts +14 -4
  153. package/dist/types/ratelimit/cloudflare.d.ts +39 -0
  154. package/dist/types/ratelimit/index.d.ts +27 -0
  155. package/dist/types/ratelimit/memory.d.ts +36 -0
  156. package/dist/types/ratelimit/schema.d.ts +111 -0
  157. package/dist/types/ratelimit/upstash.d.ts +21 -0
  158. package/dist/types/ratelimit/wrangler.d.ts +23 -0
  159. package/dist/types/reference/asyncapi.d.ts +10 -10
  160. package/dist/types/reference/graphql.d.ts +13 -10
  161. package/dist/types/reference/openapi.d.ts +33 -12
  162. package/dist/types/reference/options.d.ts +45 -5
  163. package/dist/types/reference/scalar.d.ts +13 -0
  164. package/dist/types/reference/schema.d.ts +60 -36
  165. package/dist/types/search/documents.d.ts +12 -1
  166. package/dist/types/search/orama-index.d.ts +4 -0
  167. package/dist/types/seo/metatags.d.ts +20 -0
  168. package/docs/02-deployment.mdx +44 -6
  169. package/docs/03-upgrading.mdx +4 -4
  170. package/docs/04-migrating.mdx +1 -1
  171. package/docs/08-faq.mdx +1 -1
  172. package/docs/advanced/changelog.mdx +2 -2
  173. package/docs/advanced/custom-pages.mdx +3 -3
  174. package/docs/advanced/skills.mdx +14 -0
  175. package/docs/cli/audit.mdx +38 -2
  176. package/docs/cli/evals.mdx +3 -3
  177. package/docs/cli/index.mdx +1 -0
  178. package/docs/cli/translate.mdx +3 -3
  179. package/docs/cli/version.mdx +1 -1
  180. package/docs/configuration/analytics.mdx +22 -1
  181. package/docs/configuration/assistant.mdx +188 -36
  182. package/docs/configuration/consent.mdx +100 -0
  183. package/docs/configuration/customization.mdx +6 -4
  184. package/docs/configuration/index.mdx +63 -5
  185. package/docs/configuration/meta.ts +3 -0
  186. package/docs/configuration/narration.mdx +119 -0
  187. package/docs/configuration/rate-limiting.mdx +69 -0
  188. package/docs/configuration/search.mdx +30 -2
  189. package/docs/configuration/theming.mdx +3 -1
  190. package/docs/content/components.mdx +107 -1
  191. package/docs/content/frontmatter.mdx +77 -1
  192. package/docs/content/i18n.mdx +40 -3
  193. package/docs/content/includes.mdx +16 -0
  194. package/docs/content/index.mdx +4 -2
  195. package/docs/content/islands.mdx +1 -1
  196. package/docs/content/meta.mdx +4 -1
  197. package/docs/content/meta.ts +1 -0
  198. package/docs/content/navigation.mdx +28 -6
  199. package/docs/content/sources/contentful.mdx +32 -0
  200. package/docs/content/sources/custom.mdx +39 -0
  201. package/docs/content/sources/github-releases.mdx +31 -0
  202. package/docs/content/sources/index.mdx +91 -0
  203. package/docs/content/sources/meta.ts +16 -0
  204. package/docs/content/sources/notion.mdx +32 -0
  205. package/docs/content/sources/obsidian.mdx +37 -0
  206. package/docs/content/sources/payload.mdx +30 -0
  207. package/docs/content/sources/remote-mdx.mdx +40 -0
  208. package/docs/content/sources/sanity.mdx +29 -0
  209. package/docs/content/sources/strapi.mdx +31 -0
  210. package/docs/content/syntax.mdx +81 -2
  211. package/docs/content/variables.mdx +41 -0
  212. package/docs/content/versioning.mdx +1 -1
  213. package/docs/discoverability/agent-discovery.mdx +30 -3
  214. package/docs/discoverability/index.mdx +3 -2
  215. package/docs/discoverability/llms-txt.mdx +1 -1
  216. package/docs/discoverability/markdown.mdx +2 -2
  217. package/docs/discoverability/metadata.mdx +17 -0
  218. package/docs/discoverability/open-graph.mdx +5 -3
  219. package/docs/discoverability/rss.mdx +1 -1
  220. package/docs/references/api-pages.mdx +74 -0
  221. package/docs/references/asyncapi.mdx +2 -2
  222. package/docs/references/graphql.mdx +3 -3
  223. package/docs/references/meta.ts +1 -1
  224. package/docs/references/openapi.mdx +106 -5
  225. package/docs/references/scalar.mdx +3 -1
  226. package/package.json +36 -1
  227. package/skills/blume/SKILL.md +3 -0
  228. package/skills/blume-migrate/SKILL.md +5 -5
  229. package/skills/blume-migrate/references/docusaurus.md +3 -3
  230. package/skills/blume-migrate/references/fumadocs.md +1 -1
  231. package/skills/blume-migrate/references/mintlify.md +37 -19
  232. package/skills/blume-migrate/references/nextra.md +3 -3
  233. package/skills/blume-migrate/references/starlight.md +2 -1
  234. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +67 -16
  235. package/skills/blume-write-skill/SKILL.md +82 -0
  236. package/src/ai/agent-readability.ts +4 -3
  237. package/src/ai/agent-surface.ts +9 -7
  238. package/src/ai/ai-catalog.ts +12 -5
  239. package/src/ai/api/handlers.ts +2 -2
  240. package/src/ai/api/spec.ts +2 -2
  241. package/src/ai/api-catalog.ts +6 -2
  242. package/src/ai/ask-context.ts +73 -20
  243. package/src/ai/ask-data.ts +6 -0
  244. package/src/ai/ask-tools.ts +142 -0
  245. package/src/ai/ask.ts +354 -76
  246. package/src/ai/changelog-markdown.ts +2 -2
  247. package/src/ai/component-markdown.ts +75 -0
  248. package/src/ai/cors.ts +2 -0
  249. package/src/ai/index.ts +12 -0
  250. package/src/ai/link-headers.ts +14 -5
  251. package/src/ai/llms.ts +24 -9
  252. package/src/ai/markdown.ts +2 -1
  253. package/src/ai/mcp/data.ts +6 -0
  254. package/src/ai/mcp/discovery.ts +2 -2
  255. package/src/ai/mcp/query.ts +2 -2
  256. package/src/ai/mcp/server.ts +2 -2
  257. package/src/ai/openapi-components.ts +31 -9
  258. package/src/ai/relative-links.ts +42 -26
  259. package/src/ai/serializers.ts +2 -1
  260. package/src/ai/site-skill.ts +274 -0
  261. package/src/ai/skills.ts +49 -3
  262. package/src/ai/tar.ts +139 -12
  263. package/src/ai/write-skill.ts +97 -0
  264. package/src/analytics/head.ts +4 -0
  265. package/src/analytics/index.ts +5 -0
  266. package/src/analytics/one-dollar-stats.ts +86 -0
  267. package/src/analytics/schema.ts +2 -0
  268. package/src/astro/generate.ts +133 -19
  269. package/src/astro/include-hmr.ts +31 -12
  270. package/src/astro/include-refresh.ts +19 -8
  271. package/src/astro/index.ts +1 -0
  272. package/src/astro/integration.ts +143 -14
  273. package/src/astro/module-types.ts +6 -0
  274. package/src/astro/runtime-modules.ts +28 -13
  275. package/src/astro/templates.ts +364 -67
  276. package/src/astro/variables.ts +31 -0
  277. package/src/audit/catalog.ts +19 -0
  278. package/src/audit/checks/contrast.ts +183 -0
  279. package/src/audit/checks/i18n.ts +2 -3
  280. package/src/audit/checks/indexability.ts +2 -3
  281. package/src/audit/checks/links.ts +13 -13
  282. package/src/audit/checks/sitemap.ts +2 -3
  283. package/src/audit/graph.ts +3 -1
  284. package/src/audit/redirects.ts +46 -15
  285. package/src/audit/run.ts +14 -9
  286. package/src/audit/snapshot.ts +5 -0
  287. package/src/audit/types.ts +2 -1
  288. package/src/blume-modules.d.ts +7 -0
  289. package/src/captcha/client.ts +152 -0
  290. package/src/captcha/hcaptcha.ts +36 -0
  291. package/src/captcha/index.ts +28 -0
  292. package/src/captcha/schema.ts +32 -0
  293. package/src/captcha/turnstile.ts +38 -0
  294. package/src/captcha/verify.ts +71 -0
  295. package/src/cli/args.ts +32 -0
  296. package/src/cli/command-meta.ts +5 -0
  297. package/src/cli/commands/audit.ts +4 -1
  298. package/src/cli/commands/doctor.ts +25 -17
  299. package/src/cli/commands/eval.ts +19 -11
  300. package/src/cli/commands/skill.ts +96 -0
  301. package/src/cli/commands/translate.ts +9 -12
  302. package/src/cli/commands/validate.ts +3 -1
  303. package/src/cli/dev-lock.ts +157 -37
  304. package/src/cli/index.ts +5 -0
  305. package/src/cli/report-format.ts +11 -6
  306. package/src/cli/required-secrets.ts +71 -29
  307. package/src/components/BlumePage.astro +2 -0
  308. package/src/components/colors.ts +19 -0
  309. package/src/components/content/ApiEndpoint.astro +18 -0
  310. package/src/components/content/ApiField.astro +79 -0
  311. package/src/components/content/ApiPlayground.astro +62 -0
  312. package/src/components/content/ApiRail.astro +19 -0
  313. package/src/components/content/Badge.astro +5 -3
  314. package/src/components/content/Color.astro +1 -0
  315. package/src/components/content/Component.astro +2 -2
  316. package/src/components/content/FileTree.astro +1 -0
  317. package/src/components/content/GithubInfo.astro +1 -0
  318. package/src/components/content/Panel.astro +1 -0
  319. package/src/components/content/ParamField.astro +25 -0
  320. package/src/components/content/RequestExample.astro +17 -0
  321. package/src/components/content/ResponseExample.astro +17 -0
  322. package/src/components/content/ResponseField.astro +32 -0
  323. package/src/components/content/Step.astro +1 -0
  324. package/src/components/content/Tab.astro +0 -1
  325. package/src/components/content/Tabs.astro +4 -0
  326. package/src/components/content/Tile.astro +1 -0
  327. package/src/components/content/Tooltip.astro +1 -0
  328. package/src/components/content/Tree.astro +1 -0
  329. package/src/components/content/TypeTable.astro +4 -1
  330. package/src/components/content/View.astro +21 -0
  331. package/src/components/content/ViewSwitcher.astro +168 -0
  332. package/src/components/content/api-field.ts +100 -0
  333. package/src/components/content/api-page.ts +224 -0
  334. package/src/components/content/badge-color.ts +5 -2
  335. package/src/components/content/base-href.ts +13 -36
  336. package/src/components/content/view-switcher.ts +71 -0
  337. package/src/components/index.ts +2 -0
  338. package/src/components/islands/Assistant.astro +10 -1
  339. package/src/components/islands/assistant.tsx +125 -18
  340. package/src/components/islands/base-path.ts +47 -10
  341. package/src/components/islands/code-question.ts +62 -0
  342. package/src/components/islands/hooks.ts +145 -40
  343. package/src/components/islands/support-link.ts +68 -0
  344. package/src/components/islands/webmcp.ts +4 -2
  345. package/src/components/layout/Analytics.astro +11 -2
  346. package/src/components/layout/Banner.astro +14 -10
  347. package/src/components/layout/Breadcrumbs.astro +11 -4
  348. package/src/components/layout/ConsentBanner.astro +62 -0
  349. package/src/components/layout/ConsentHead.astro +38 -0
  350. package/src/components/layout/Directory.astro +94 -0
  351. package/src/components/layout/DiscoveryLinks.astro +9 -5
  352. package/src/components/layout/DrawerSwitchers.astro +51 -0
  353. package/src/components/layout/Empty.astro +2 -2
  354. package/src/components/layout/Header.astro +124 -82
  355. package/src/components/layout/LanguageSwitcher.astro +50 -17
  356. package/src/components/layout/NarrationPlayer.astro +1085 -0
  357. package/src/components/layout/NavSelector.astro +35 -9
  358. package/src/components/layout/NavTabMenu.astro +3 -3
  359. package/src/components/layout/NavTree.astro +16 -6
  360. package/src/components/layout/PageActions.astro +4 -3
  361. package/src/components/layout/PageFeedback.astro +54 -49
  362. package/src/components/layout/PageLayout.astro +78 -9
  363. package/src/components/layout/Pagination.astro +3 -3
  364. package/src/components/layout/ReferenceLayout.astro +17 -6
  365. package/src/components/layout/RelatedPages.astro +42 -0
  366. package/src/components/layout/RootLayout.astro +313 -50
  367. package/src/components/layout/Search.astro +64 -30
  368. package/src/components/layout/SiteFooter.astro +124 -0
  369. package/src/components/layout/SiteMetatags.astro +16 -0
  370. package/src/components/layout/VersionBanner.astro +2 -2
  371. package/src/components/layout/analytics-client.ts +12 -0
  372. package/src/components/layout/consent/native.ts +79 -0
  373. package/src/components/layout/consent/types.ts +37 -0
  374. package/src/components/layout/footer-links.ts +53 -0
  375. package/src/components/layout/footer-socials.ts +87 -0
  376. package/src/components/layout/locale-redirect.ts +107 -0
  377. package/src/components/layout/nav-utils.ts +83 -0
  378. package/src/components/layout/page-feedback.ts +96 -0
  379. package/src/components/layout/search/analytics.ts +98 -0
  380. package/src/components/layout/search/flexsearch.ts +17 -5
  381. package/src/components/layout/search/orama-cloud.ts +26 -14
  382. package/src/components/layout/search/types.ts +20 -0
  383. package/src/components/layout/search/typesense.ts +5 -1
  384. package/src/components/layout/toc-active.ts +41 -0
  385. package/src/components/layout/toc-element.ts +8 -14
  386. package/src/components/openapi/ApiTagOperations.astro +2 -2
  387. package/src/components/openapi/AsyncApiOperation.astro +7 -4
  388. package/src/components/openapi/GraphqlChip.astro +2 -2
  389. package/src/components/openapi/Operation.astro +163 -13
  390. package/src/components/openapi/Playground.astro +4 -4
  391. package/src/components/openapi/RequestBody.astro +6 -4
  392. package/src/components/openapi/RequestPanel.astro +63 -8
  393. package/src/components/openapi/Responses.astro +6 -4
  394. package/src/components/openapi/SchemaTable.astro +7 -0
  395. package/src/components/openapi/async-snippets.ts +4 -4
  396. package/src/components/openapi/async.ts +38 -6
  397. package/src/components/openapi/code-samples.ts +97 -0
  398. package/src/components/openapi/helpers.ts +19 -9
  399. package/src/components/openapi/message-composer.ts +6 -1
  400. package/src/components/openapi/message.ts +17 -2
  401. package/src/components/openapi/operation-model.ts +81 -11
  402. package/src/components/openapi/panel.ts +4 -2
  403. package/src/components/openapi/param-style.ts +181 -0
  404. package/src/components/openapi/playground-client.ts +73 -16
  405. package/src/components/openapi/request.ts +190 -26
  406. package/src/components/openapi/schema-tree.ts +30 -24
  407. package/src/components/openapi/security.ts +6 -3
  408. package/src/components/openapi/snippets.ts +953 -13
  409. package/src/components/openapi/ws-client.ts +18 -2
  410. package/src/components/props.ts +6 -0
  411. package/src/consent/client.ts +95 -0
  412. package/src/consent/clients.ts +19 -0
  413. package/src/consent/ethyca.ts +71 -0
  414. package/src/consent/head.ts +24 -0
  415. package/src/consent/index.ts +37 -0
  416. package/src/consent/init.ts +29 -0
  417. package/src/consent/native.ts +36 -0
  418. package/src/consent/osano.ts +59 -0
  419. package/src/consent/schema.ts +30 -0
  420. package/src/core/base-path.ts +62 -16
  421. package/src/core/builtin-tags.ts +5 -0
  422. package/src/core/client-address.ts +19 -0
  423. package/src/core/config-input.ts +203 -27
  424. package/src/core/data.ts +44 -4
  425. package/src/core/diagnostics.ts +5 -2
  426. package/src/core/directive-diagnostics.ts +99 -0
  427. package/src/core/footer.ts +26 -0
  428. package/src/core/frontmatter.ts +21 -18
  429. package/src/core/graph.ts +39 -36
  430. package/src/core/heading-markers.ts +5 -18
  431. package/src/core/i18n-ui.ts +82 -2
  432. package/src/core/i18n.ts +31 -3
  433. package/src/core/includes.ts +20 -3
  434. package/src/core/last-modified.ts +25 -3
  435. package/src/core/links.ts +16 -2
  436. package/src/core/locale-links.ts +5 -1
  437. package/src/core/localizable.ts +26 -0
  438. package/src/core/meta.ts +33 -19
  439. package/src/core/navigation.ts +71 -20
  440. package/src/core/page-modes.ts +56 -0
  441. package/src/core/project-graph.ts +138 -10
  442. package/src/core/redirect-patterns.ts +491 -0
  443. package/src/core/related.ts +131 -0
  444. package/src/core/schema.ts +342 -68
  445. package/src/core/sources/contentful-rich-text.ts +27 -20
  446. package/src/core/sources/filesystem.ts +20 -2
  447. package/src/core/sources/github-releases.ts +25 -6
  448. package/src/core/sources/lexical.ts +23 -18
  449. package/src/core/sources/lower.ts +201 -34
  450. package/src/core/sources/mdx-remote.ts +51 -16
  451. package/src/core/sources/normalize.ts +327 -91
  452. package/src/core/sources/notion.ts +52 -25
  453. package/src/core/sources/obsidian.ts +23 -6
  454. package/src/core/sources/portable-text.ts +38 -21
  455. package/src/core/sources/read.ts +8 -3
  456. package/src/core/sources/strapi-blocks.ts +20 -16
  457. package/src/core/sources/watch.ts +20 -7
  458. package/src/core/standard-schema.ts +10 -6
  459. package/src/core/types.ts +1 -1
  460. package/src/core/ui-packs/ar.ts +43 -0
  461. package/src/core/ui-packs/bg.ts +45 -0
  462. package/src/core/ui-packs/bn.ts +43 -0
  463. package/src/core/ui-packs/ca.ts +46 -0
  464. package/src/core/ui-packs/cs.ts +44 -0
  465. package/src/core/ui-packs/da.ts +45 -0
  466. package/src/core/ui-packs/de.ts +46 -0
  467. package/src/core/ui-packs/el.ts +45 -0
  468. package/src/core/ui-packs/es.ts +46 -0
  469. package/src/core/ui-packs/fa.ts +45 -0
  470. package/src/core/ui-packs/fi.ts +45 -0
  471. package/src/core/ui-packs/fr.ts +46 -0
  472. package/src/core/ui-packs/he.ts +43 -0
  473. package/src/core/ui-packs/hi.ts +44 -0
  474. package/src/core/ui-packs/hr.ts +45 -0
  475. package/src/core/ui-packs/hu.ts +44 -0
  476. package/src/core/ui-packs/id.ts +45 -0
  477. package/src/core/ui-packs/it.ts +45 -0
  478. package/src/core/ui-packs/ja.ts +45 -0
  479. package/src/core/ui-packs/ko.ts +44 -0
  480. package/src/core/ui-packs/nl.ts +46 -0
  481. package/src/core/ui-packs/no.ts +44 -0
  482. package/src/core/ui-packs/pl.ts +45 -0
  483. package/src/core/ui-packs/pt-br.ts +46 -0
  484. package/src/core/ui-packs/pt.ts +45 -0
  485. package/src/core/ui-packs/ro.ts +45 -0
  486. package/src/core/ui-packs/ru.ts +45 -0
  487. package/src/core/ui-packs/sk.ts +44 -0
  488. package/src/core/ui-packs/sr.ts +45 -0
  489. package/src/core/ui-packs/sv.ts +44 -0
  490. package/src/core/ui-packs/th.ts +43 -0
  491. package/src/core/ui-packs/tr.ts +45 -0
  492. package/src/core/ui-packs/uk.ts +45 -0
  493. package/src/core/ui-packs/vi.ts +45 -0
  494. package/src/core/ui-packs/zh-tw.ts +43 -0
  495. package/src/core/ui-packs/zh.ts +43 -0
  496. package/src/core/variables.ts +103 -0
  497. package/src/core/version-cut.ts +52 -15
  498. package/src/deploy/artifacts.ts +104 -14
  499. package/src/deploy/cloudflare-negotiation.ts +39 -17
  500. package/src/deploy/headers.ts +10 -5
  501. package/src/deploy/node-headers.ts +64 -10
  502. package/src/deploy/platforms/cloudflare.ts +44 -3
  503. package/src/deploy/platforms/netlify.ts +34 -1
  504. package/src/deploy/platforms/node.ts +1 -0
  505. package/src/deploy/platforms/static.ts +1 -0
  506. package/src/deploy/platforms/types.ts +8 -0
  507. package/src/deploy/platforms/vercel.ts +38 -2
  508. package/src/deploy/redirects.ts +139 -36
  509. package/src/deploy/robots.ts +2 -2
  510. package/src/deploy/rss.ts +4 -3
  511. package/src/deploy/sitemap.ts +7 -5
  512. package/src/deploy/vercel-negotiation.ts +36 -0
  513. package/src/markdown/api-rail.ts +259 -0
  514. package/src/markdown/base-links.ts +34 -36
  515. package/src/markdown/code-title.ts +35 -9
  516. package/src/markdown/directives.ts +242 -36
  517. package/src/markdown/features.ts +20 -2
  518. package/src/markdown/fence-meta.ts +2 -0
  519. package/src/markdown/include.ts +11 -1
  520. package/src/markdown/index.ts +35 -11
  521. package/src/markdown/math.ts +4 -4
  522. package/src/markdown/mdast.ts +5 -2
  523. package/src/markdown/relative-links.ts +12 -4
  524. package/src/markdown/variables.ts +56 -0
  525. package/src/markdown/views.ts +82 -0
  526. package/src/narration/build.ts +412 -0
  527. package/src/narration/player.ts +249 -0
  528. package/src/narration/provider.ts +29 -0
  529. package/src/narration/script.ts +592 -0
  530. package/src/og/card.ts +136 -11
  531. package/src/og/derive.ts +41 -31
  532. package/src/og/index.ts +1 -0
  533. package/src/openapi/asyncapi.ts +4 -2
  534. package/src/openapi/model.ts +77 -36
  535. package/src/openapi/overlay.ts +256 -0
  536. package/src/openapi/parse.ts +55 -2
  537. package/src/openapi/proxy.ts +63 -10
  538. package/src/openapi/references.ts +21 -5
  539. package/src/openapi/render-mdx.ts +46 -3
  540. package/src/openapi/scalar.ts +40 -6
  541. package/src/openapi/source.ts +1 -1
  542. package/src/ratelimit/cloudflare.ts +54 -0
  543. package/src/ratelimit/index.ts +30 -0
  544. package/src/ratelimit/memory.ts +45 -0
  545. package/src/ratelimit/runtime.ts +229 -0
  546. package/src/ratelimit/schema.ts +28 -0
  547. package/src/ratelimit/upstash.ts +30 -0
  548. package/src/ratelimit/wrangler.ts +70 -0
  549. package/src/reference/asyncapi.ts +2 -2
  550. package/src/reference/graphql.ts +5 -2
  551. package/src/reference/openapi.ts +21 -7
  552. package/src/reference/options.ts +51 -7
  553. package/src/reference/scalar.ts +33 -8
  554. package/src/registry/eject.ts +201 -28
  555. package/src/registry/registry.ts +7 -0
  556. package/src/search/adapters/version-scope.ts +30 -0
  557. package/src/search/documents.ts +93 -28
  558. package/src/search/orama-index.ts +28 -3
  559. package/src/search/pagefind-ranking.ts +39 -0
  560. package/src/search/popular.ts +2 -1
  561. package/src/search/sync/algolia.ts +15 -4
  562. package/src/search/sync/orama-cloud.ts +3 -0
  563. package/src/search/sync/typesense.ts +5 -0
  564. package/src/seo/jsonld.ts +7 -3
  565. package/src/seo/metatags.ts +67 -0
  566. package/src/theme/chrome-icons.ts +1 -0
  567. package/src/theme/color.ts +500 -0
  568. package/src/theme/entry.ts +56 -3
  569. package/src/theme/palette.ts +121 -45
  570. package/src/translate/meta.ts +68 -24
  571. package/src/translate/prompts.ts +1 -0
  572. package/src/translate/run.ts +3 -3
  573. package/src/translate/validate.ts +12 -3
  574. package/src/translate/work-list.ts +56 -17
  575. package/src/upgrade/upgrade.ts +4 -171
  576. package/dist/cli/chunk-3yce002v.js.map +0 -14
  577. package/dist/cli/chunk-5r8g91qn.js.map +0 -34
  578. package/dist/cli/chunk-6dtt0zfn.js.map +0 -10
  579. package/dist/cli/chunk-7mbqtmgb.js.map +0 -10
  580. package/dist/cli/chunk-ddndchfr.js.map +0 -14
  581. package/dist/cli/chunk-esh98wmb.js +0 -23
  582. package/dist/cli/chunk-esh98wmb.js.map +0 -10
  583. package/dist/cli/chunk-hqp2ajnh.js.map +0 -35
  584. package/dist/cli/chunk-hr8ne106.js.map +0 -13
  585. package/dist/cli/chunk-j85scx15.js.map +0 -10
  586. package/dist/cli/chunk-mqc662a6.js +0 -75
  587. package/dist/cli/chunk-mqc662a6.js.map +0 -11
  588. package/dist/cli/chunk-pbg5a4s3.js.map +0 -19
  589. package/dist/cli/chunk-qkb5a8sa.js.map +0 -10
  590. package/dist/cli/chunk-v6ya5kcb.js.map +0 -189
  591. package/dist/cli/chunk-wdrt2k2v.js.map +0 -10
  592. package/dist/cli/chunk-xh43dwgw.js.map +0 -36
  593. package/docs/content/sources.mdx +0 -338
  594. /package/dist/cli/{chunk-zp79m0ts.js.map → chunk-1n228xqb.js.map} +0 -0
  595. /package/dist/cli/{chunk-h2ez8dzb.js.map → chunk-5ffywsmb.js.map} +0 -0
  596. /package/dist/cli/{chunk-g698a744.js.map → chunk-5wj2qwn2.js.map} +0 -0
  597. /package/dist/cli/{chunk-sqw4ekg1.js.map → chunk-amrb6hgh.js.map} +0 -0
  598. /package/dist/cli/{chunk-h7k3nq3v.js.map → chunk-gp84za0h.js.map} +0 -0
  599. /package/dist/cli/{chunk-bfwp9vp6.js.map → chunk-p804f3pe.js.map} +0 -0
  600. /package/dist/cli/{chunk-00gs3wqs.js.map → chunk-ta27feev.js.map} +0 -0
  601. /package/dist/cli/{chunk-bbnwccaz.js.map → chunk-y4ykbark.js.map} +0 -0
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Minimal structural types and node builders for the (alpha) Satteri MDAST
3
+ * plugin API. We model only what Blume's plugins read and construct; the full
4
+ * types live in `satteri`, a transitive dependency. Plugins are bridged to
5
+ * Satteri's real `MdastPlugin` type at a single boundary in `index.ts`.
6
+ */
7
+ /**
8
+ * A property value on an MDAST node: primitives, nested nodes, and lists of
9
+ * either. Covers everything Blume's plugins read or build (positions, data
10
+ * flags, attribute lists) without admitting functions or class instances.
11
+ */
12
+ export type MdastValue = string | number | boolean | null | undefined | MdastValue[] | {
13
+ [key: string]: MdastValue;
14
+ };
15
+ /**
16
+ * The visitor context Blume's plugins use to mutate the tree. A list of
17
+ * nodes takes the replaced node's place in order.
18
+ */
19
+ export interface MdastVisitorContext {
20
+ replaceNode: (node: MdastNode, replacement: MdastNode | MdastNode[]) => void;
21
+ }
22
+ /** Any MDAST node, keyed loosely since we build a small subset by hand. */
23
+ export interface MdastNode {
24
+ type: string;
25
+ [key: string]: MdastValue;
26
+ }
27
+ /** Build an MDX JSX attribute. A `null` value renders as a boolean attribute. */
28
+ export declare const jsxAttribute: (name: string, value?: string | null) => {
29
+ name: string;
30
+ type: string;
31
+ value: string | null;
32
+ };
33
+ type JsxAttribute = ReturnType<typeof jsxAttribute>;
34
+ /** Build a block-level MDX JSX element (`<Name>…</Name>`). */
35
+ export declare const jsxFlowElement: (name: string, attributes: JsxAttribute[], children: MdastValue[]) => {
36
+ attributes: {
37
+ name: string;
38
+ type: string;
39
+ value: string | null;
40
+ }[];
41
+ children: MdastValue[];
42
+ name: string;
43
+ type: string;
44
+ };
45
+ /** Build an inline MDX JSX element (phrasing context). */
46
+ export declare const jsxTextElement: (name: string, attributes: JsxAttribute[], children?: MdastValue[]) => {
47
+ attributes: {
48
+ name: string;
49
+ type: string;
50
+ value: string | null;
51
+ }[];
52
+ children: MdastValue[];
53
+ name: string;
54
+ type: string;
55
+ };
56
+ /** Build a fenced code block node, optionally with a fence-meta string. */
57
+ export declare const codeBlock: (lang: string, value: string, meta?: string | null) => {
58
+ lang: string;
59
+ meta: string | null;
60
+ type: string;
61
+ value: string;
62
+ };
63
+ export {};
@@ -0,0 +1,70 @@
1
+ import { HTMLElement } from "node-html-parser";
2
+ import type { Node } from "node-html-parser";
3
+ import type { BlumeProject } from "../core/project-graph.ts";
4
+ import type { ProjectContext } from "../core/types.ts";
5
+ import type { NarrationProvider } from "./provider.ts";
6
+ import type { NarrationCues, NarrationTree } from "./script.ts";
7
+ /**
8
+ * Generated narration: after Astro writes the HTML, read every page that
9
+ * carries the player exactly as the browser will (same walker, same blocks),
10
+ * split it into sentences, and give each sentence a clip from the configured
11
+ * speech model. Clips are cached by what decides their sound (text, language,
12
+ * model, voice, instructions, provider options), so a rebuild only pays for
13
+ * sentences that changed, and one sentence shared by many pages is generated
14
+ * once. Each page gets a manifest listing its clips; the player plays them in
15
+ * order and falls back to browser voices wherever a manifest is missing.
16
+ */
17
+ /** How the build logs: the integration's Astro logger. */
18
+ export interface NarrationLogger {
19
+ info: (message: string) => void;
20
+ warn: (message: string) => void;
21
+ }
22
+ /** Speak `text` in `lang`, returning MP3 bytes. */
23
+ export type Speak = (text: string, lang: string) => Promise<Uint8Array>;
24
+ /** What a narration build did, for the log line and tests. */
25
+ export interface NarrationBuildResult {
26
+ /** Clips that failed to generate; their pages get no manifest. */
27
+ failed: number;
28
+ /** Clips generated by the speech model on this build. */
29
+ generated: number;
30
+ /** Pages that got a manifest. */
31
+ pages: number;
32
+ /** Clips read back from the cache. */
33
+ reused: number;
34
+ }
35
+ /**
36
+ * The clip cache directory: `node_modules/.cache/blume/narration`, next to the
37
+ * OG card cache and restored by the same host build caches (see `ogCacheDir`).
38
+ */
39
+ export declare const narrationCacheDir: (context: Pick<ProjectContext, "outDir" | "root">) => string;
40
+ /** The walker's view of a node-html-parser tree. */
41
+ export declare const htmlTree: NarrationTree<Node>;
42
+ /** The player's settings on a built page, and the article it reads. */
43
+ interface PlayerPage {
44
+ article: HTMLElement;
45
+ audioBase: string;
46
+ cues: NarrationCues;
47
+ lang: string;
48
+ manifest: string;
49
+ }
50
+ /**
51
+ * The generated player on a built page, or `null` when the page has none (or
52
+ * a player without generated audio, which reads with browser voices).
53
+ */
54
+ export declare const readPlayerPage: (html: string) => PlayerPage | null;
55
+ /**
56
+ * A clip's cache key: a digest of everything that decides how it sounds. The
57
+ * Blume version is deliberately left out, unlike the OG card's: an upgrade
58
+ * shouldn't pay to regenerate audio that would sound the same.
59
+ */
60
+ export declare const clipKey: (provider: NarrationProvider, lang: string, text: string) => string;
61
+ /** Speak through the Vercel AI Gateway with the provider's model and voice. */
62
+ export declare const gatewaySpeaker: (provider: NarrationProvider) => Speak;
63
+ /**
64
+ * Generate the narration for a built site in `distDir`: a clip per sentence
65
+ * and a manifest per page. Does nothing unless `narration.provider` is set,
66
+ * and warns instead of generating when the provider's key is missing (the
67
+ * pages then read with browser voices). `speak` replaces the gateway call.
68
+ */
69
+ export declare const buildNarration: (project: BlumeProject, distDir: string, logger: NarrationLogger, speak?: Speak) => Promise<NarrationBuildResult | null>;
70
+ export {};
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ /** The speech model narration uses when `gateway()` names none. */
3
+ export declare const DEFAULT_NARRATION_MODEL = "openai/tts-1-hd";
4
+ /** The voice narration uses when `gateway()` names none. */
5
+ export declare const DEFAULT_NARRATION_VOICE = "alloy";
6
+ /**
7
+ * `narration.provider`: the `gateway()` descriptor from `blume/ai`, read with
8
+ * speech defaults. `reasoning` is an assistant option and is rejected here;
9
+ * `voice` and `instructions` are narration options and are rejected by the
10
+ * assistant.
11
+ */
12
+ export declare const narrationProviderSchema: z.ZodObject<{
13
+ kind: z.ZodLiteral<"gateway">;
14
+ options: z.ZodObject<{
15
+ instructions: z.ZodOptional<z.ZodString>;
16
+ model: z.ZodDefault<z.ZodString>;
17
+ voice: z.ZodDefault<z.ZodString>;
18
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
19
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
20
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodJSONSchema>>>;
21
+ }, z.core.$strict>;
22
+ requiredSecrets: z.ZodArray<z.ZodString>;
23
+ runtimeDeps: z.ZodArray<z.ZodString>;
24
+ }, z.core.$strict>;
25
+ /** A validated narration provider, defaults filled in. */
26
+ export type NarrationProvider = z.output<typeof narrationProviderSchema>;
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Narration's reading script: what "Listen to this page" says, in order, and
3
+ * where each spoken sentence sits in the page's text.
4
+ *
5
+ * One walker serves both sides. `blume build` runs it over the built HTML
6
+ * (parsed with node-html-parser) to generate a clip per sentence, and the
7
+ * player runs it over the live `<article>` to highlight the sentence being
8
+ * read. Both see the same markup and apply the same rules, so they agree on
9
+ * every block's text; the sentence split is only ever computed once per
10
+ * engine (by the build for generated audio, by the browser for its own
11
+ * voices), so an ICU difference between Node and the browser can't move a
12
+ * highlight.
13
+ *
14
+ * The rules follow what reads well aloud: the title, description, headings,
15
+ * and prose are read in order; callouts, steps, tabs, and collapsible
16
+ * sections are announced with a short spoken cue; code, tables, media,
17
+ * diagrams, math, API field tables, and anything marked
18
+ * `data-blume-narration="skip"` are left out.
19
+ */
20
+ /**
21
+ * The slice of a DOM-like tree the walker reads. The browser DOM and
22
+ * node-html-parser both satisfy it through a small adapter, so the walker
23
+ * never touches either API directly.
24
+ */
25
+ export interface NarrationTree<N> {
26
+ /** An element's attribute, or `null` when it is absent. */
27
+ attr: (node: N, name: string) => string | null;
28
+ children: (node: N) => readonly N[];
29
+ /** An element's lowercase tag name; `null` for text and other nodes. */
30
+ tag: (node: N) => string | null;
31
+ /** A text node's decoded text; `null` for elements and other nodes. */
32
+ text: (node: N) => string | null;
33
+ }
34
+ /**
35
+ * The spoken cues, already localized for the page. `{n}` in `step` is the
36
+ * step's number and `{title}` in `tab` is the tab's label. An empty string
37
+ * silences that cue.
38
+ */
39
+ export interface NarrationCues {
40
+ danger: string;
41
+ info: string;
42
+ note: string;
43
+ section: string;
44
+ step: string;
45
+ success: string;
46
+ tab: string;
47
+ tip: string;
48
+ warning: string;
49
+ }
50
+ /**
51
+ * A run of text read as one unit: a paragraph, heading, list item, or any
52
+ * other block. `nodes` are the text nodes it was read from; `nodeOf[i]` and
53
+ * `offsetOf[i]` locate character `i` of `text` in them, so a sentence's
54
+ * `[start, end)` maps back to a DOM range for highlighting.
55
+ */
56
+ export interface NarrationBlock<N> {
57
+ nodeOf: number[];
58
+ nodes: N[];
59
+ offsetOf: number[];
60
+ text: string;
61
+ }
62
+ /** One step of the reading order: a spoken cue, or a block of page text. */
63
+ export type NarrationItem = {
64
+ block: number;
65
+ kind: "block";
66
+ } | {
67
+ kind: "cue";
68
+ text: string;
69
+ };
70
+ /** What {@link extractNarration} reads from a page. */
71
+ export interface NarrationExtract<N> {
72
+ blocks: NarrationBlock<N>[];
73
+ items: NarrationItem[];
74
+ }
75
+ /**
76
+ * One spoken unit. A sentence carries its block and its `[start, end)` in
77
+ * that block's text; a cue carries `block: null`. `text` is what is spoken.
78
+ */
79
+ export interface NarrationSegment {
80
+ block: number | null;
81
+ end: number;
82
+ start: number;
83
+ text: string;
84
+ }
85
+ /**
86
+ * The per-page manifest `blume build` writes for generated narration. The
87
+ * player aligns `blocks` (the build's block texts) with the live page by
88
+ * text, then plays one clip per segment. A sentence names its block and range;
89
+ * a cue carries its spoken `text` instead.
90
+ */
91
+ export interface NarrationManifest {
92
+ blocks: string[];
93
+ segments: NarrationManifestSegment[];
94
+ version: 1;
95
+ }
96
+ /** One clip of a {@link NarrationManifest}: a sentence or a cue. */
97
+ export type NarrationManifestSegment = {
98
+ audio: string;
99
+ block: number;
100
+ end: number;
101
+ start: number;
102
+ } | {
103
+ audio: string;
104
+ text: string;
105
+ };
106
+ /**
107
+ * A page needs at least this many spoken characters (title and description
108
+ * included) to offer narration: roughly 50 English words. Shorter pages, and
109
+ * pages that are mostly code, tables, or API fields, get no player.
110
+ */
111
+ export declare const NARRATION_MIN_CHARS = 280;
112
+ /**
113
+ * Sentences longer than this are split at a clause, then a word boundary.
114
+ * Browser speech engines drop an utterance that runs past about 15 seconds,
115
+ * and shorter clips also keep the highlight moving.
116
+ */
117
+ export declare const NARRATION_MAX_SEGMENT_CHARS = 220;
118
+ /** The attribute that keeps an element (and everything in it) out of narration. */
119
+ export declare const NARRATION_SKIP_ATTRIBUTE = "data-blume-narration";
120
+ /**
121
+ * Walk `root` and return its reading order: each block of text, with the
122
+ * cues that introduce callouts, steps, tabs, and collapsible sections.
123
+ * Whitespace collapses to single spaces, as it renders.
124
+ */
125
+ export declare const extractNarration: <N>(root: N, tree: NarrationTree<N>, cues: NarrationCues) => NarrationExtract<N>;
126
+ /**
127
+ * Split an extract into spoken segments: a cue as it is, and each block into
128
+ * its sentences for `lang` (long ones broken further, see
129
+ * {@link NARRATION_MAX_SEGMENT_CHARS}).
130
+ */
131
+ export declare const segmentNarration: <N>(extract: NarrationExtract<N>, lang: string, max?: number) => NarrationSegment[];
132
+ /** How many characters the page's blocks will speak, cues excluded. */
133
+ export declare const narrationLength: <N>(extract: NarrationExtract<N>) => number;
134
+ /** Whether a page has enough prose to offer narration. */
135
+ export declare const isNarratable: <N>(extract: NarrationExtract<N>) => boolean;
136
+ /**
137
+ * Characters read per second at 1x: about 170 words a minute for
138
+ * space-separated scripts, and a slower character rate where a character is a
139
+ * word or more. Estimates only; neither engine reports durations up front.
140
+ */
141
+ export declare const narrationCharsPerSecond: (lang: string) => number;
142
+ /** The page's estimated listening time at 1x, in whole minutes (at least 1). */
143
+ export declare const narrationMinutes: (chars: number, lang: string) => number;
144
+ /**
145
+ * Map each manifest block onto the live page's blocks by exact text, in
146
+ * order, skipping page blocks the build didn't see (a script may have added
147
+ * some). A manifest block with no match maps to `-1`: its sentences still
148
+ * play, without a highlight.
149
+ */
150
+ export declare const alignBlocks: (manifestBlocks: readonly string[], pageBlocks: readonly string[]) => number[];
151
+ /** Whether a value (the player's `data-cues` JSON) is a full set of cues. */
152
+ export declare const isNarrationCues: (value: unknown) => value is NarrationCues;
153
+ /** Whether a fetched manifest has the shape the player plays. */
154
+ export declare const isNarrationManifest: (value: unknown) => value is NarrationManifest;
@@ -34,7 +34,8 @@ export interface AsyncApiChannelObject {
34
34
  messages?: Record<string, AsyncApiRefLike>;
35
35
  parameters?: Record<string, AsyncApiRefLike>;
36
36
  servers?: AsyncApiRefLike[];
37
- bindings?: Record<string, Record<string, AsyncApiSpecValue>>;
37
+ /** Protocol-keyed binding objects, or a `$ref` to a components entry. */
38
+ bindings?: Record<string, AsyncApiSpecValue>;
38
39
  [key: string]: AsyncApiSpecValue;
39
40
  }
40
41
  /** A permissive view of an AsyncAPI 3.x operation — only the fields we render. */
@@ -51,7 +52,8 @@ export interface AsyncApiOperationObject {
51
52
  }[];
52
53
  security?: AsyncApiRefLike[];
53
54
  messages?: AsyncApiRefLike[];
54
- bindings?: Record<string, Record<string, AsyncApiSpecValue>>;
55
+ /** Protocol-keyed binding objects, or a `$ref` to a components entry. */
56
+ bindings?: Record<string, AsyncApiSpecValue>;
55
57
  [key: string]: AsyncApiSpecValue;
56
58
  }
57
59
  /** A permissive view of an AsyncAPI 3.x server object. */
@@ -45,6 +45,12 @@ export interface ApiOperationRef {
45
45
  deprecated: boolean;
46
46
  /** The channel the operation acts on (AsyncAPI only). */
47
47
  channelId?: string;
48
+ /**
49
+ * An OpenAPI 3.1 webhook: a request the API sends to the reader's endpoint
50
+ * rather than one it serves. `path` then holds the webhook's name, the key
51
+ * it has under the document's `webhooks`.
52
+ */
53
+ webhook?: true;
48
54
  }
49
55
  /**
50
56
  * A tag/section: the spec's declared tags in their declared order, then any
@@ -76,8 +82,8 @@ export interface ApiSpecData {
76
82
  /** Operations keyed by {@link ApiOperationRef.key}. */
77
83
  operations: Record<string, ApiOperationRef>;
78
84
  tags: ApiTagRef[];
79
- /** Code-sample languages to render per operation. */
80
- codeSamples: string[];
85
+ /** Code-sample languages to render per operation; `false` for none. */
86
+ codeSamples: string[] | false;
81
87
  /** Whether nested schema rows start expanded. */
82
88
  expandSchemas: boolean;
83
89
  /**
@@ -162,10 +168,10 @@ export interface ExtractedOperations extends CollectedOperations {
162
168
  export declare const operationCollector: (baseRoute: string, tagMeta: ReadonlyMap<string, string>) => OperationCollector;
163
169
  /**
164
170
  * Flatten a 3.1 document into a route-mapped operation list and its ordered
165
- * tags. Operations inherit the first tag they declare; keys are de-duplicated so
166
- * a repeated `operationId` still yields distinct routes. `warnings` reports
167
- * anything skipped (a `$ref` path item, webhooks), so missing operations
168
- * aren't silent.
171
+ * tags, webhooks included. Operations inherit the first tag they declare; keys
172
+ * are de-duplicated so a repeated `operationId` still yields distinct routes.
173
+ * `warnings` reports anything skipped (a `$ref` path item), so missing
174
+ * operations aren't silent.
169
175
  */
170
176
  export declare const extractOperations: (document: ApiDocument, baseRoute: string) => ExtractedOperations;
171
177
  /** Resolve the operation object for a ref out of its (OpenAPI) document. */
@@ -0,0 +1,54 @@
1
+ import { z } from "zod";
2
+ import type { JsonValue } from "../core/adapter.ts";
3
+ /**
4
+ * OpenAPI Overlays: the OpenAPI Initiative's format for changing an API
5
+ * description without editing it — an ordered list of actions, each an RFC
6
+ * 9535 JSONPath `target` with an `update` to merge in, a `copy` of another
7
+ * node to merge in, or `remove`. A spec generated by another tool or owned by
8
+ * another team can then carry docs-only changes (better descriptions, hidden
9
+ * internal operations, a public server URL) in a file of its own.
10
+ *
11
+ * Implements Overlay Specification 1.0 and 1.1 over `jsonpath-rfc9535`, which
12
+ * passes the JSONPath compliance suite in full, as the spec requires. The
13
+ * documents here are already parsed; `parse.ts` reads the files.
14
+ */
15
+ /** An overlay document or action that doesn't follow the spec. */
16
+ export declare class OverlayError extends Error {
17
+ constructor(message: string);
18
+ }
19
+ /** An object node, the only kind that holds named properties. */
20
+ interface JsonObject {
21
+ [key: string]: JsonValue;
22
+ }
23
+ /**
24
+ * A parsed YAML or JSON mapping, as the document an overlay acts on: the
25
+ * parser's own types say nothing of JSON, but what it parses is JSON.
26
+ */
27
+ export declare const isJsonObject: <Value>(value: Value) => value is Value & JsonObject;
28
+ declare const overlaySchema: z.ZodObject<{
29
+ actions: z.ZodArray<z.ZodObject<{
30
+ copy: z.ZodOptional<z.ZodString>;
31
+ description: z.ZodOptional<z.ZodString>;
32
+ remove: z.ZodDefault<z.ZodBoolean>;
33
+ target: z.ZodString;
34
+ update: z.ZodOptional<z.ZodJSONSchema>;
35
+ }, z.core.$loose>>;
36
+ extends: z.ZodOptional<z.ZodString>;
37
+ info: z.ZodObject<{
38
+ title: z.ZodString;
39
+ version: z.ZodString;
40
+ }, z.core.$loose>;
41
+ overlay: z.ZodString;
42
+ }, z.core.$loose>;
43
+ /** A validated overlay document. */
44
+ export type OverlayDocument = z.output<typeof overlaySchema>;
45
+ /** Validate a parsed overlay document, naming the file in any error. */
46
+ export declare const overlayDocument: <Value>(value: Value, name: string) => OverlayDocument;
47
+ /**
48
+ * Apply an overlay to a parsed document, in place and in action order: each
49
+ * action sees the result of the one before. A target that matches nothing
50
+ * changes nothing. Throws an {@link OverlayError} naming the overlay file and
51
+ * the action that failed.
52
+ */
53
+ export declare const applyOverlay: (document: JsonValue, overlay: OverlayDocument, name: string) => void;
54
+ export {};
@@ -16,6 +16,11 @@ export declare class InvalidSpecError extends Error {
16
16
  }
17
17
  /** Where and whether to cache a remote spec's text between runs. */
18
18
  export interface SpecFetchOptions {
19
+ /**
20
+ * Overlay documents (local paths or `http(s)` URLs) applied in order to
21
+ * the parsed spec, before it's upgraded. See `overlay.ts`.
22
+ */
23
+ overlays?: readonly string[];
19
24
  /** Dir for a last-good on-disk copy of a remote spec (offline fallback). */
20
25
  cacheDir?: string;
21
26
  /**
@@ -24,6 +29,14 @@ export interface SpecFetchOptions {
24
29
  */
25
30
  refresh?: boolean;
26
31
  }
32
+ /**
33
+ * A spec with its overlays applied, as JSON text: what the Scalar embed
34
+ * inlines, since it can't apply overlays itself.
35
+ */
36
+ export declare const readOverlaidSpec: (spec: string, root: string, options: SpecFetchOptions) => Promise<{
37
+ text: string;
38
+ warnings: string[];
39
+ }>;
27
40
  export declare const parseSpec: (spec: string, root: string, options?: SpecFetchOptions) => Promise<ParsedSpec>;
28
41
  export interface ParsedAsyncApiSpec {
29
42
  document: AsyncApiDocument;
@@ -19,8 +19,8 @@ export type ReferenceKind = ResolvedReferenceAdapter["kind"];
19
19
  export type BlumeReferenceKind = Exclude<ReferenceKind, "scalar">;
20
20
  /** Per-adapter display options for the Blume renderer. */
21
21
  export interface ReferenceDisplay {
22
- /** Code-sample languages shown per operation. */
23
- codeSamples: string[];
22
+ /** Code-sample languages shown per operation; `false` for none. */
23
+ codeSamples: string[] | false;
24
24
  /** Whether nested schema rows start expanded. */
25
25
  expandSchemas: boolean;
26
26
  /**
@@ -60,6 +60,11 @@ export interface ReferenceSource {
60
60
  seoDescriptionSuffix: boolean;
61
61
  /** Local path or `http(s)` URL, verbatim from config. */
62
62
  spec: string;
63
+ /**
64
+ * OpenAPI Overlay documents applied to `spec` in order (`openapi()` and
65
+ * `scalar()` only).
66
+ */
67
+ overlays?: string[];
63
68
  /**
64
69
  * URL of the live GraphQL endpoint the playground and code samples target
65
70
  * (GraphQL only — a schema, unlike an OpenAPI document, names no server).
@@ -120,10 +125,15 @@ export declare const hasScalarReferences: (config: ResolvedConfig) => boolean;
120
125
  * definition with {@link needsPlaygroundProxy}.
121
126
  */
122
127
  export declare const builtinProxyReferences: (config: ResolvedConfig) => BlumeReferenceSource[];
128
+ /**
129
+ * Whether hand-written endpoint pages (`api` frontmatter) send their Try it
130
+ * requests through the built-in proxy: `api.playground.proxy: true`.
131
+ */
132
+ export declare const apiPagesUseBuiltinProxy: (config: ResolvedConfig) => boolean;
123
133
  /**
124
134
  * Whether the built-in playground CORS proxy endpoint (`/_api-proxy`) must be
125
135
  * generated: some Blume-rendered reference's playground opted into it with
126
- * `proxy: true`. Shared by the server feature gate and the generator so the
127
- * two can never disagree.
136
+ * `proxy: true`, or the hand-written endpoint pages' did. Shared by the server
137
+ * feature gate and the generator so the two can never disagree.
128
138
  */
129
139
  export declare const needsPlaygroundProxy: (config: ResolvedConfig) => boolean;
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ import type { AdapterDescriptor } from "../core/adapter.ts";
3
+ /** The Worker binding Blume declares for the rate limiter. */
4
+ export declare const RATE_LIMIT_BINDING = "BLUME_RATE_LIMIT";
5
+ /** Options for {@link cloudflare}. */
6
+ export interface CloudflareRateLimitOptions {
7
+ /**
8
+ * The rate limiting namespace, a positive integer unique in your
9
+ * Cloudflare account. Defaults to one derived from the site.
10
+ */
11
+ namespaceId?: string;
12
+ /** Requests each reader may make per window, per route. Defaults to 10. */
13
+ requests?: number;
14
+ /** The window, in seconds: Cloudflare allows 10 or 60. Defaults to 60. */
15
+ window?: 10 | 60;
16
+ }
17
+ export declare const cloudflareRateLimitOptionsSchema: z.ZodObject<{
18
+ namespaceId: z.ZodOptional<z.ZodString>;
19
+ requests: z.ZodOptional<z.ZodNumber>;
20
+ window: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<10>, z.ZodLiteral<60>]>>;
21
+ }, z.core.$strict>;
22
+ export type CloudflareRateLimitAdapter = AdapterDescriptor<"cloudflare", CloudflareRateLimitOptions>;
23
+ export declare const cloudflareRateLimitAdapterSchema: z.ZodObject<{
24
+ kind: z.ZodLiteral<"cloudflare">;
25
+ options: z.ZodObject<{
26
+ namespaceId: z.ZodOptional<z.ZodString>;
27
+ requests: z.ZodOptional<z.ZodNumber>;
28
+ window: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<10>, z.ZodLiteral<60>]>>;
29
+ }, z.core.$strict>;
30
+ requiredSecrets: z.ZodArray<z.ZodString>;
31
+ runtimeDeps: z.ZodArray<z.ZodString>;
32
+ }, z.core.$strict>;
33
+ /**
34
+ * Counts with Cloudflare's Workers rate limiting, for a site deployed with
35
+ * `deployment: cloudflare()`: Blume declares the binding in the Worker's
36
+ * config, so there is nothing to set up. Cloudflare counts per location and
37
+ * allows a window of 10 or 60 seconds.
38
+ */
39
+ export declare const cloudflare: (options?: CloudflareRateLimitOptions) => CloudflareRateLimitAdapter;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Rate limiters for `blume.config.ts`. The server routes a reader can call —
3
+ * the assistant, the API playground proxy, and server-side search — limit
4
+ * each reader (by IP address) to a number of requests per window, answering
5
+ * `429 Too Many Requests` past it:
6
+ *
7
+ * ```ts
8
+ * import { defineConfig } from "blume";
9
+ * import { upstash } from "blume/ratelimit";
10
+ *
11
+ * export default defineConfig({
12
+ * rateLimit: upstash({ requests: 30, window: 600 }),
13
+ * });
14
+ * ```
15
+ *
16
+ * `memory()` is on by default; `rateLimit: false` turns limiting off. Each
17
+ * factory returns a plain descriptor (see `core/adapter.ts`), and the
18
+ * generated routes count with `runtime.ts`.
19
+ */
20
+ export type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
21
+ export { cloudflare } from "./cloudflare.ts";
22
+ export type { CloudflareRateLimitAdapter, CloudflareRateLimitOptions, } from "./cloudflare.ts";
23
+ export { memory } from "./memory.ts";
24
+ export type { MemoryAdapter, RateLimitOptions } from "./memory.ts";
25
+ export type { RateLimitAdapter } from "./schema.ts";
26
+ export { upstash } from "./upstash.ts";
27
+ export type { UpstashAdapter } from "./upstash.ts";
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import type { AdapterDescriptor } from "../core/adapter.ts";
3
+ /** How many requests a reader gets per window, unless set. */
4
+ export declare const DEFAULT_REQUESTS = 30;
5
+ /** The window those requests are counted over, in seconds, unless set. */
6
+ export declare const DEFAULT_WINDOW = 600;
7
+ /** The limit every rate limiter takes: a count of requests per window. */
8
+ export interface RateLimitOptions {
9
+ /** Requests each reader may make per window, per route. */
10
+ requests?: number;
11
+ /** The window, in seconds. */
12
+ window?: number;
13
+ }
14
+ export declare const rateLimitOptionsSchema: z.ZodObject<{
15
+ requests: z.ZodOptional<z.ZodNumber>;
16
+ window: z.ZodOptional<z.ZodNumber>;
17
+ }, z.core.$strict>;
18
+ export type MemoryAdapter = AdapterDescriptor<"memory", RateLimitOptions>;
19
+ export declare const memoryAdapterSchema: z.ZodObject<{
20
+ kind: z.ZodLiteral<"memory">;
21
+ options: z.ZodObject<{
22
+ requests: z.ZodOptional<z.ZodNumber>;
23
+ window: z.ZodOptional<z.ZodNumber>;
24
+ }, z.core.$strict>;
25
+ requiredSecrets: z.ZodArray<z.ZodString>;
26
+ runtimeDeps: z.ZodArray<z.ZodString>;
27
+ }, z.core.$strict>;
28
+ /**
29
+ * Counts each reader's requests in the server's own memory, the default. On
30
+ * a server that runs as one process (`node()`) the count is exact; on a
31
+ * platform that runs many short-lived instances (Vercel, Netlify,
32
+ * Cloudflare) each instance keeps its own, so it stops a burst from one
33
+ * reader rather than enforcing the limit exactly. For that, share the count
34
+ * with `upstash()` or `cloudflare()`.
35
+ */
36
+ export declare const memory: (options?: RateLimitOptions) => MemoryAdapter;