blume 2.1.3 → 2.2.1

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 (397) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +134 -0
  3. package/README.md +4 -4
  4. package/dist/cli/{chunk-y4msrwm9.js → chunk-080mfch6.js} +15 -15
  5. package/dist/cli/{chunk-gfc5fqvf.js → chunk-1ch3ct3r.js} +18 -18
  6. package/dist/cli/{chunk-gfc5fqvf.js.map → chunk-1ch3ct3r.js.map} +1 -1
  7. package/dist/cli/{chunk-32khwcb6.js → chunk-2ssh60qh.js} +42 -69
  8. package/dist/cli/{chunk-32khwcb6.js.map → chunk-2ssh60qh.js.map} +9 -10
  9. package/dist/cli/{chunk-9qzgg6mj.js → chunk-34wap3ed.js} +3 -3
  10. package/dist/cli/{chunk-k3gr1nm9.js → chunk-40vk8kgf.js} +13 -16
  11. package/dist/cli/{chunk-k3gr1nm9.js.map → chunk-40vk8kgf.js.map} +3 -3
  12. package/dist/cli/chunk-487b95qy.js +329 -0
  13. package/dist/cli/chunk-487b95qy.js.map +13 -0
  14. package/dist/cli/chunk-4zxh25hc.js +157 -0
  15. package/dist/cli/chunk-4zxh25hc.js.map +10 -0
  16. package/dist/cli/chunk-69rjf786.js +146 -0
  17. package/dist/cli/chunk-69rjf786.js.map +11 -0
  18. package/dist/cli/{chunk-dqhg54mr.js → chunk-9h8mh2tk.js} +3 -3
  19. package/dist/cli/{chunk-dqhg54mr.js.map → chunk-9h8mh2tk.js.map} +2 -2
  20. package/dist/cli/{chunk-bqxaqn5p.js → chunk-9jqmq5hv.js} +8 -8
  21. package/dist/cli/{chunk-bqxaqn5p.js.map → chunk-9jqmq5hv.js.map} +1 -1
  22. package/dist/cli/{chunk-dv2z0rzf.js → chunk-aafhwx74.js} +38 -13
  23. package/dist/cli/{chunk-dv2z0rzf.js.map → chunk-aafhwx74.js.map} +5 -4
  24. package/dist/cli/{chunk-desvm72z.js → chunk-b680sv30.js} +22 -26
  25. package/dist/cli/chunk-b680sv30.js.map +13 -0
  26. package/dist/cli/{chunk-0w6hs479.js → chunk-beb0z983.js} +30 -18
  27. package/dist/cli/chunk-beb0z983.js.map +10 -0
  28. package/dist/cli/{chunk-1f882900.js → chunk-c5bjxq8v.js} +2 -2
  29. package/dist/cli/chunk-e1n41w9m.js +155 -0
  30. package/dist/cli/chunk-e1n41w9m.js.map +11 -0
  31. package/dist/cli/{chunk-sc93apfs.js → chunk-etckvbrh.js} +17 -17
  32. package/dist/cli/{chunk-sc93apfs.js.map → chunk-etckvbrh.js.map} +2 -2
  33. package/dist/cli/{chunk-bxwhtvw8.js → chunk-f260jdrn.js} +5 -5
  34. package/dist/cli/{chunk-74wfhv79.js → chunk-fnxgtjeq.js} +1 -1
  35. package/dist/cli/{chunk-ms9z66nz.js → chunk-gwy55cx3.js} +2 -2
  36. package/dist/cli/{chunk-ms9z66nz.js.map → chunk-gwy55cx3.js.map} +2 -2
  37. package/dist/cli/{chunk-dhwtqnnd.js → chunk-gxhcf2hs.js} +2 -2
  38. package/dist/cli/{chunk-tfycddbt.js → chunk-h0qwdbem.js} +2 -2
  39. package/dist/cli/{chunk-nbyvgnnm.js → chunk-hktq4j5r.js} +109 -49
  40. package/dist/cli/chunk-hktq4j5r.js.map +36 -0
  41. package/dist/cli/{chunk-twy7psdz.js → chunk-hn3g2b89.js} +14 -10
  42. package/dist/cli/chunk-hn3g2b89.js.map +10 -0
  43. package/dist/cli/{chunk-j1x92mx9.js → chunk-j4nfgn2j.js} +1 -1
  44. package/dist/cli/{chunk-dpy8qdjf.js → chunk-k45sq16q.js} +74 -183
  45. package/dist/cli/chunk-k45sq16q.js.map +18 -0
  46. package/dist/cli/{chunk-5cmts6dv.js → chunk-kmswjxj9.js} +7 -7
  47. package/dist/cli/{chunk-5cmts6dv.js.map → chunk-kmswjxj9.js.map} +1 -1
  48. package/dist/cli/{chunk-36bxs9c7.js → chunk-nqna8dzp.js} +27 -23
  49. package/dist/cli/chunk-nqna8dzp.js.map +10 -0
  50. package/dist/cli/{chunk-a57yh0h9.js → chunk-p834rkcn.js} +7 -7
  51. package/dist/cli/{chunk-a57yh0h9.js.map → chunk-p834rkcn.js.map} +1 -1
  52. package/dist/cli/{chunk-60hz265r.js → chunk-ppa6mg4d.js} +24 -11
  53. package/dist/cli/chunk-ppa6mg4d.js.map +10 -0
  54. package/dist/cli/{chunk-s0bdnc7v.js → chunk-q1wwrxzw.js} +5 -4
  55. package/dist/cli/chunk-q1wwrxzw.js.map +10 -0
  56. package/dist/cli/{chunk-ave1wcbr.js → chunk-qcyxkj44.js} +1 -1
  57. package/dist/cli/{chunk-124fvmzq.js → chunk-r5nm9w0c.js} +11183 -8806
  58. package/dist/cli/{chunk-124fvmzq.js.map → chunk-r5nm9w0c.js.map} +82 -66
  59. package/dist/cli/{chunk-ckrcm08h.js → chunk-rtvgmg2j.js} +48 -62
  60. package/dist/cli/{chunk-ckrcm08h.js.map → chunk-rtvgmg2j.js.map} +4 -5
  61. package/dist/cli/{chunk-297ajdcv.js → chunk-t2h8pwy1.js} +6 -6
  62. package/dist/cli/{chunk-297ajdcv.js.map → chunk-t2h8pwy1.js.map} +3 -3
  63. package/dist/cli/{chunk-gxtg6ed2.js → chunk-x60e15st.js} +21 -21
  64. package/dist/cli/{chunk-gxtg6ed2.js.map → chunk-x60e15st.js.map} +3 -3
  65. package/dist/cli/{chunk-58bt3hag.js → chunk-x7bh6d9j.js} +4 -4
  66. package/dist/cli/{chunk-hvcxng5f.js → chunk-ydqzkhjn.js} +6 -6
  67. package/dist/cli/{chunk-kdpzw38a.js → chunk-yg8ckc3g.js} +95 -7
  68. package/dist/cli/chunk-yg8ckc3g.js.map +11 -0
  69. package/dist/cli/{chunk-0pmb4tr4.js → chunk-zxd5jrgx.js} +1205 -222
  70. package/dist/cli/chunk-zxd5jrgx.js.map +44 -0
  71. package/dist/cli/index.js +78 -42
  72. package/dist/cli/index.js.map +7 -6
  73. package/dist/types/ai/changelog-components.d.ts +18 -0
  74. package/dist/types/ai/changelog-markdown.d.ts +12 -0
  75. package/dist/types/ai/openapi-components.d.ts +7 -7
  76. package/dist/types/ai/operation-details.d.ts +39 -0
  77. package/dist/types/ai/relative-links.d.ts +3 -1
  78. package/dist/types/ai/serializers.d.ts +6 -4
  79. package/dist/types/analytics/head.d.ts +4 -2
  80. package/dist/types/analytics/script.d.ts +8 -2
  81. package/dist/types/components/content/youtube.d.ts +20 -0
  82. package/dist/types/components/layout/nav-utils.d.ts +8 -0
  83. package/dist/types/components/openapi/example-panels.d.ts +33 -0
  84. package/dist/types/components/openapi/helpers.d.ts +53 -11
  85. package/dist/types/components/openapi/snippets.d.ts +7 -1
  86. package/dist/types/core/alert-diagnostics.d.ts +10 -0
  87. package/dist/types/core/builtin-tags.d.ts +16 -0
  88. package/dist/types/core/changelog-list.d.ts +48 -0
  89. package/dist/types/core/closest-match.d.ts +6 -0
  90. package/dist/types/core/code-fence-diagnostics.d.ts +18 -0
  91. package/dist/types/core/code-fences.d.ts +8 -1
  92. package/dist/types/core/config-input.d.ts +38 -6
  93. package/dist/types/core/content-assets.d.ts +16 -18
  94. package/dist/types/core/data.d.ts +6 -2
  95. package/dist/types/core/diagnostics.d.ts +14 -0
  96. package/dist/types/core/directive-diagnostics.d.ts +22 -8
  97. package/dist/types/core/former-routes.d.ts +14 -0
  98. package/dist/types/core/github.d.ts +5 -4
  99. package/dist/types/core/heading-markers.d.ts +65 -2
  100. package/dist/types/core/hidden-pages.d.ts +3 -0
  101. package/dist/types/core/includes.d.ts +23 -0
  102. package/dist/types/core/last-modified.d.ts +18 -6
  103. package/dist/types/core/links.d.ts +42 -2
  104. package/dist/types/core/load-module.d.ts +19 -4
  105. package/dist/types/core/manifest.d.ts +14 -1
  106. package/dist/types/core/markdown-mirrors.d.ts +22 -0
  107. package/dist/types/core/mcp-clients.d.ts +47 -0
  108. package/dist/types/core/mdx-elements.d.ts +32 -0
  109. package/dist/types/core/mdx-syntax.d.ts +100 -0
  110. package/dist/types/core/meta-diagnostics.d.ts +7 -0
  111. package/dist/types/core/meta.d.ts +32 -5
  112. package/dist/types/core/nav-diagnostics.d.ts +16 -2
  113. package/dist/types/core/navigation.d.ts +13 -0
  114. package/dist/types/core/ordering-prefix.d.ts +6 -0
  115. package/dist/types/core/pinned-ids.d.ts +23 -0
  116. package/dist/types/core/project-graph.d.ts +9 -1
  117. package/dist/types/core/redirect-patterns.d.ts +18 -0
  118. package/dist/types/core/relative-files.d.ts +31 -0
  119. package/dist/types/core/schema.d.ts +322 -11
  120. package/dist/types/core/sources/normalize.d.ts +101 -9
  121. package/dist/types/core/sources/types.d.ts +16 -0
  122. package/dist/types/core/static-files.d.ts +10 -0
  123. package/dist/types/core/static-host.d.ts +42 -0
  124. package/dist/types/core/svg-images.d.ts +26 -0
  125. package/dist/types/core/syntax-diagnostics.d.ts +14 -0
  126. package/dist/types/core/types.d.ts +42 -1
  127. package/dist/types/deploy/generated-files.d.ts +41 -0
  128. package/dist/types/deploy/redirects.d.ts +21 -7
  129. package/dist/types/markdown/code-title.d.ts +9 -5
  130. package/dist/types/markdown/directives.d.ts +8 -0
  131. package/dist/types/markdown/fence-language.d.ts +51 -0
  132. package/dist/types/markdown/fence-meta.d.ts +5 -0
  133. package/dist/types/markdown/github-alerts.d.ts +35 -0
  134. package/dist/types/openapi/asyncapi.d.ts +6 -5
  135. package/dist/types/openapi/checks.d.ts +10 -5
  136. package/dist/types/openapi/model.d.ts +55 -8
  137. package/dist/types/openapi/parse.d.ts +4 -1
  138. package/dist/types/ratelimit/index.d.ts +2 -0
  139. package/dist/types/ratelimit/memory.d.ts +1 -1
  140. package/dist/types/ratelimit/schema.d.ts +40 -0
  141. package/dist/types/ratelimit/unkey.d.ts +48 -0
  142. package/dist/types/sources/filesystem.d.ts +14 -4
  143. package/dist/types/sources/mdx-remote.d.ts +6 -3
  144. package/dist/types/sources/registry.d.ts +3 -3
  145. package/dist/types/theme/color.d.ts +33 -0
  146. package/dist/types/theme/palette.d.ts +122 -0
  147. package/docs/01-quickstart.mdx +1 -1
  148. package/docs/02-deployment.mdx +24 -8
  149. package/docs/04-migrating.mdx +16 -4
  150. package/docs/advanced/changelog.mdx +27 -1
  151. package/docs/advanced/skills.mdx +1 -1
  152. package/docs/cli/audit.mdx +1 -1
  153. package/docs/cli/doctor.mdx +2 -2
  154. package/docs/cli/evals.mdx +1 -1
  155. package/docs/cli/index.mdx +4 -2
  156. package/docs/cli/validate.mdx +10 -7
  157. package/docs/configuration/analytics.mdx +2 -0
  158. package/docs/configuration/customization.mdx +3 -1
  159. package/docs/configuration/index.mdx +7 -6
  160. package/docs/configuration/rate-limiting.mdx +20 -1
  161. package/docs/configuration/theming.mdx +5 -1
  162. package/docs/content/components.mdx +26 -6
  163. package/docs/content/frontmatter.mdx +1 -1
  164. package/docs/content/i18n.mdx +1 -1
  165. package/docs/content/includes.mdx +6 -2
  166. package/docs/content/index.mdx +11 -1
  167. package/docs/content/islands.mdx +2 -0
  168. package/docs/content/meta.mdx +9 -3
  169. package/docs/content/navigation.mdx +14 -6
  170. package/docs/content/sources/obsidian.mdx +1 -1
  171. package/docs/content/sources/remote-mdx.mdx +3 -1
  172. package/docs/content/syntax.mdx +76 -8
  173. package/docs/content/variables.mdx +3 -1
  174. package/docs/discoverability/agent-discovery.mdx +1 -1
  175. package/docs/discoverability/json-api.mdx +1 -1
  176. package/docs/discoverability/llms-txt.mdx +1 -1
  177. package/docs/discoverability/markdown.mdx +2 -2
  178. package/docs/discoverability/mcp.mdx +40 -8
  179. package/docs/discoverability/open-graph.mdx +1 -1
  180. package/docs/discoverability/sitemap-and-robots.mdx +1 -1
  181. package/docs/references/graphql.mdx +2 -0
  182. package/docs/references/openapi.mdx +45 -7
  183. package/package.json +4 -4
  184. package/skills/blume/SKILL.md +2 -2
  185. package/skills/blume-migrate/SKILL.md +51 -29
  186. package/skills/blume-migrate/references/docsify.md +262 -0
  187. package/skills/blume-migrate/references/docus.md +298 -0
  188. package/skills/blume-migrate/references/docusaurus.md +5 -5
  189. package/skills/blume-migrate/references/fern.md +327 -0
  190. package/skills/blume-migrate/references/fumadocs.md +1 -1
  191. package/skills/blume-migrate/references/gitbook.md +267 -0
  192. package/skills/blume-migrate/references/github-wiki.md +259 -0
  193. package/skills/blume-migrate/references/jekyll.md +253 -0
  194. package/skills/blume-migrate/references/mdbook.md +256 -0
  195. package/skills/blume-migrate/references/mintlify.md +5 -5
  196. package/skills/blume-migrate/references/mkdocs.md +236 -0
  197. package/skills/blume-migrate/references/monorepo.md +20 -8
  198. package/skills/blume-migrate/references/nextra.md +5 -5
  199. package/skills/blume-migrate/references/readme.md +257 -0
  200. package/skills/blume-migrate/references/redocly.md +198 -0
  201. package/skills/blume-migrate/references/starlight.md +3 -3
  202. package/skills/blume-migrate/references/vitepress.md +204 -0
  203. package/skills/blume-migrate/references/vuepress.md +271 -0
  204. package/skills/blume-migrate/scripts/docsify-codemod.mjs +2387 -0
  205. package/skills/blume-migrate/scripts/docus-codemod.mjs +2542 -0
  206. package/skills/blume-migrate/scripts/fern-codemod.mjs +2633 -0
  207. package/skills/blume-migrate/scripts/github-wiki-codemod.mjs +2808 -0
  208. package/skills/blume-migrate/scripts/include-excerpts.mjs +649 -0
  209. package/skills/blume-migrate/scripts/jekyll-codemod.mjs +3649 -0
  210. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +17 -13
  211. package/skills/blume-migrate/scripts/mkdocs-codemod.mjs +2526 -0
  212. package/skills/blume-migrate/scripts/operation-routes.mjs +508 -0
  213. package/skills/blume-migrate/scripts/pin-heading-ids.mjs +1049 -0
  214. package/skills/blume-migrate/scripts/readme-codemod.mjs +4139 -0
  215. package/skills/blume-migrate/scripts/vitepress-codemod.mjs +1511 -0
  216. package/src/ai/changelog-components.ts +24 -0
  217. package/src/ai/changelog-markdown.ts +45 -41
  218. package/src/ai/component-markdown.ts +22 -9
  219. package/src/ai/llms.ts +36 -5
  220. package/src/ai/markdown.ts +2 -2
  221. package/src/ai/openapi-components.ts +25 -9
  222. package/src/ai/operation-details.ts +208 -0
  223. package/src/ai/relative-links.ts +48 -8
  224. package/src/ai/serializers.ts +7 -6
  225. package/src/ai/site-skill.ts +6 -2
  226. package/src/analytics/head.ts +11 -5
  227. package/src/analytics/script.ts +13 -3
  228. package/src/astro/generate.ts +47 -11
  229. package/src/astro/index.ts +1 -0
  230. package/src/astro/integration.ts +27 -1
  231. package/src/astro/mdx-source-errors.ts +46 -0
  232. package/src/astro/templates.ts +93 -189
  233. package/src/audit/checks/redirects.ts +5 -1
  234. package/src/audit/redirects.ts +36 -19
  235. package/src/audit/report.ts +22 -9
  236. package/src/audit/run.ts +12 -28
  237. package/src/audit/terms.ts +23 -0
  238. package/src/audit/url.ts +2 -2
  239. package/src/cli/build-failure.ts +256 -7
  240. package/src/cli/command-meta.ts +1 -1
  241. package/src/cli/commands/audit.ts +1 -1
  242. package/src/cli/commands/build.ts +12 -3
  243. package/src/cli/commands/check.ts +13 -2
  244. package/src/cli/commands/dev.ts +1 -1
  245. package/src/cli/commands/doctor.ts +4 -2
  246. package/src/cli/commands/init.ts +3 -3
  247. package/src/cli/commands/preview.ts +17 -1
  248. package/src/cli/commands/validate.ts +22 -10
  249. package/src/cli/prepare.ts +1 -1
  250. package/src/cli/preview-pages.ts +161 -0
  251. package/src/cli/required-secrets.ts +0 -1
  252. package/src/cli/unknown-flags.ts +1 -42
  253. package/src/components/code-copy.ts +51 -0
  254. package/src/components/code-language.ts +75 -0
  255. package/src/components/content/AccordionItem.astro +16 -1
  256. package/src/components/content/Callout.astro +11 -1
  257. package/src/components/content/Changelog.astro +189 -0
  258. package/src/components/content/CodeBlock.astro +8 -11
  259. package/src/components/content/Tabs.astro +16 -2
  260. package/src/components/content/YouTube.astro +6 -4
  261. package/src/components/content/code-block.ts +33 -0
  262. package/src/components/content/content-strings.ts +5 -1
  263. package/src/components/content/inline-markdown.ts +35 -8
  264. package/src/components/content/youtube.ts +49 -7
  265. package/src/components/layout/Analytics.astro +5 -1
  266. package/src/components/layout/NavTree.astro +8 -3
  267. package/src/components/layout/PageActions.astro +81 -23
  268. package/src/components/layout/RootLayout.astro +35 -32
  269. package/src/components/layout/SiteFooter.astro +31 -8
  270. package/src/components/layout/nav-utils.ts +14 -0
  271. package/src/components/layout/search/pagefind.ts +2 -1
  272. package/src/components/openapi/Operation.astro +4 -0
  273. package/src/components/openapi/PanelTabs.astro +9 -3
  274. package/src/components/openapi/RequestBody.astro +42 -8
  275. package/src/components/openapi/RequestPanel.astro +34 -53
  276. package/src/components/openapi/example-panels.ts +110 -0
  277. package/src/components/openapi/helpers.ts +195 -20
  278. package/src/components/openapi/operation-model.ts +63 -26
  279. package/src/components/openapi/request.ts +13 -0
  280. package/src/components/openapi/snippets.ts +14 -2
  281. package/src/core/alert-diagnostics.ts +89 -0
  282. package/src/core/builtin-tags.ts +76 -0
  283. package/src/core/changelog-list.ts +87 -0
  284. package/src/core/closest-match.ts +41 -0
  285. package/src/core/code-fence-diagnostics.ts +267 -0
  286. package/src/core/code-fences.ts +43 -7
  287. package/src/core/component-diagnostics.ts +65 -12
  288. package/src/core/config-input.ts +39 -5
  289. package/src/core/config.ts +46 -1
  290. package/src/core/content-assets.ts +64 -144
  291. package/src/core/data.ts +10 -3
  292. package/src/core/diagnostics.ts +36 -3
  293. package/src/core/directive-diagnostics.ts +265 -47
  294. package/src/core/former-routes.ts +46 -0
  295. package/src/core/git-ignored.ts +53 -0
  296. package/src/core/github.ts +5 -4
  297. package/src/core/heading-markers.ts +156 -2
  298. package/src/core/hidden-pages.ts +64 -0
  299. package/src/core/includes.ts +181 -41
  300. package/src/core/last-modified.ts +47 -10
  301. package/src/core/links.ts +438 -83
  302. package/src/core/load-module.ts +98 -9
  303. package/src/core/manifest.ts +12 -9
  304. package/src/core/markdown-mirrors.ts +52 -0
  305. package/src/core/mcp-clients.ts +87 -0
  306. package/src/core/mdx-elements.ts +153 -0
  307. package/src/core/mdx-syntax.ts +377 -0
  308. package/src/core/meta-diagnostics.ts +134 -0
  309. package/src/core/meta.ts +154 -55
  310. package/src/core/nav-diagnostics.ts +41 -4
  311. package/src/core/navigation.ts +70 -10
  312. package/src/core/ordering-prefix.ts +22 -2
  313. package/src/core/pinned-ids.ts +141 -0
  314. package/src/core/project-graph.ts +221 -29
  315. package/src/core/redirect-patterns.ts +41 -0
  316. package/src/core/relative-files.ts +145 -0
  317. package/src/core/schema.ts +110 -6
  318. package/src/core/sources/mdx-remote.ts +75 -14
  319. package/src/core/sources/normalize.ts +885 -179
  320. package/src/core/sources/notion.ts +5 -4
  321. package/src/core/sources/obsidian.ts +2 -5
  322. package/src/core/sources/types.ts +17 -0
  323. package/src/core/static-files.ts +40 -0
  324. package/src/core/static-host.ts +125 -0
  325. package/src/core/svg-images.ts +98 -0
  326. package/src/core/syntax-diagnostics.ts +491 -0
  327. package/src/core/types.ts +43 -1
  328. package/src/deploy/artifacts.ts +2 -28
  329. package/src/deploy/generated-files.ts +128 -0
  330. package/src/deploy/platforms/vercel.ts +25 -1
  331. package/src/deploy/redirects.ts +43 -16
  332. package/src/deploy/sitemap.ts +2 -1
  333. package/src/markdown/base-links.ts +87 -6
  334. package/src/markdown/code-title.ts +29 -13
  335. package/src/markdown/content-assets.ts +210 -0
  336. package/src/markdown/directives.ts +69 -5
  337. package/src/markdown/fence-language.ts +106 -0
  338. package/src/markdown/fence-meta.ts +42 -0
  339. package/src/markdown/github-alerts.ts +172 -0
  340. package/src/markdown/heading-anchors.ts +265 -56
  341. package/src/markdown/include.ts +30 -3
  342. package/src/markdown/index.ts +145 -40
  343. package/src/markdown/prompt-text.ts +95 -0
  344. package/src/markdown/relative-links.ts +37 -2
  345. package/src/markdown/route-snapshot.ts +22 -12
  346. package/src/markdown/svg-fallback.ts +51 -0
  347. package/src/markdown/title-heading.ts +134 -0
  348. package/src/migrate/migrate.ts +127 -2
  349. package/src/og/card.ts +14 -4
  350. package/src/openapi/asyncapi.ts +14 -6
  351. package/src/openapi/checks.ts +160 -15
  352. package/src/openapi/model.ts +172 -33
  353. package/src/openapi/parse.ts +13 -4
  354. package/src/openapi/render-mdx.ts +55 -9
  355. package/src/openapi/source.ts +87 -6
  356. package/src/ratelimit/index.ts +2 -0
  357. package/src/ratelimit/memory.ts +1 -1
  358. package/src/ratelimit/runtime.ts +81 -0
  359. package/src/ratelimit/schema.ts +2 -0
  360. package/src/ratelimit/unkey.ts +61 -0
  361. package/src/registry/eject.ts +0 -1
  362. package/src/registry/registry.ts +1 -1
  363. package/src/search/documents.ts +10 -2
  364. package/src/sources/filesystem.ts +28 -3
  365. package/src/sources/mdx-remote.ts +7 -15
  366. package/src/theme/color.ts +14 -0
  367. package/src/theme/entry.ts +22 -1
  368. package/src/theme/palette.ts +74 -1
  369. package/dist/cli/chunk-0pmb4tr4.js.map +0 -35
  370. package/dist/cli/chunk-0w6hs479.js.map +0 -10
  371. package/dist/cli/chunk-150jk7km.js +0 -52
  372. package/dist/cli/chunk-150jk7km.js.map +0 -10
  373. package/dist/cli/chunk-36bxs9c7.js.map +0 -10
  374. package/dist/cli/chunk-53jqw8z0.js +0 -89
  375. package/dist/cli/chunk-53jqw8z0.js.map +0 -10
  376. package/dist/cli/chunk-60hz265r.js.map +0 -10
  377. package/dist/cli/chunk-desvm72z.js.map +0 -14
  378. package/dist/cli/chunk-dpy8qdjf.js.map +0 -17
  379. package/dist/cli/chunk-es8h0v3j.js +0 -441
  380. package/dist/cli/chunk-es8h0v3j.js.map +0 -11
  381. package/dist/cli/chunk-kdpzw38a.js.map +0 -11
  382. package/dist/cli/chunk-nbyvgnnm.js.map +0 -36
  383. package/dist/cli/chunk-s0bdnc7v.js.map +0 -10
  384. package/dist/cli/chunk-twy7psdz.js.map +0 -10
  385. package/dist/cli/chunk-ydp3065p.js +0 -64
  386. package/dist/cli/chunk-ydp3065p.js.map +0 -10
  387. /package/dist/cli/{chunk-y4msrwm9.js.map → chunk-080mfch6.js.map} +0 -0
  388. /package/dist/cli/{chunk-9qzgg6mj.js.map → chunk-34wap3ed.js.map} +0 -0
  389. /package/dist/cli/{chunk-1f882900.js.map → chunk-c5bjxq8v.js.map} +0 -0
  390. /package/dist/cli/{chunk-bxwhtvw8.js.map → chunk-f260jdrn.js.map} +0 -0
  391. /package/dist/cli/{chunk-74wfhv79.js.map → chunk-fnxgtjeq.js.map} +0 -0
  392. /package/dist/cli/{chunk-dhwtqnnd.js.map → chunk-gxhcf2hs.js.map} +0 -0
  393. /package/dist/cli/{chunk-tfycddbt.js.map → chunk-h0qwdbem.js.map} +0 -0
  394. /package/dist/cli/{chunk-j1x92mx9.js.map → chunk-j4nfgn2j.js.map} +0 -0
  395. /package/dist/cli/{chunk-ave1wcbr.js.map → chunk-qcyxkj44.js.map} +0 -0
  396. /package/dist/cli/{chunk-58bt3hag.js.map → chunk-x7bh6d9j.js.map} +0 -0
  397. /package/dist/cli/{chunk-hvcxng5f.js.map → chunk-ydqzkhjn.js.map} +0 -0
@@ -1,3 +1,4 @@
1
+ import type { McpClientEntry } from "./mcp-clients.ts";
1
2
  import type { SidebarItemConfig } from "./schema.ts";
2
3
  import type { Diagnostic, Navigation, PageRecord } from "./types.ts";
3
4
  /** Warn about icon names that aren't in Blume's set (skipping image/SVG icons). */
@@ -10,13 +11,26 @@ export declare const validateSearchPopularIcons: (popular: {
10
11
  icon?: string;
11
12
  label: string;
12
13
  }[]) => Diagnostic[];
14
+ /**
15
+ * Warn about unknown icons on custom "Connect to MCP" clients
16
+ * (`agents.mcp.clients`), which live outside the navigation model too. A
17
+ * per-locale label is named in the default locale.
18
+ */
19
+ export declare const validateMcpClientIcons: (clients: readonly McpClientEntry[], defaultLocale?: string) => Diagnostic[];
13
20
  /**
14
21
  * Warn when a config-linked tab/selector target has no matching page. `routes`
15
22
  * must be the full set of servable routes — content, custom `.astro` pages, and
16
23
  * generated routes — so this runs where all three are known (`generateRuntime`),
17
- * not in the content-only graph build.
24
+ * not in the content-only graph build. `servesFile` answers for the files the
25
+ * site serves beside its pages — `public/` and the generated ones (see
26
+ * `staticFileResolver`) — so a featured link to `/spec.pdf` or `/llms.txt`
27
+ * resolves too.
28
+ *
29
+ * A tab is checked where it links: its `href` — the author's, or the
30
+ * section's first page that navigation resolved for a `path` with no page of
31
+ * its own — and its `path` only when it links there.
18
32
  */
19
- export declare const validateNavTargets: (navigation: Navigation, routes: Set<string>) => Diagnostic[];
33
+ export declare const validateNavTargets: (navigation: Navigation, routes: Set<string>, servesFile?: (path: string) => boolean) => Diagnostic[];
20
34
  /**
21
35
  * Warn about explicit `navigation.sidebar` items that can't render as written,
22
36
  * instead of dropping them without a word: a page ref that matches no page
@@ -25,6 +25,19 @@ export declare const isRootTab: (tab: NavTab, root: string) => boolean;
25
25
  * named alike read alike.
26
26
  */
27
27
  export declare const titleWord: (word: string) => string;
28
+ /**
29
+ * A page's key in its folder meta `pages` list: its file name without the
30
+ * extension, ordering prefix, or parentheses (`01-quickstart.mdx` is
31
+ * `quickstart`).
32
+ */
33
+ export declare const pageKey: (filename: string) => string;
34
+ /**
35
+ * The keys a folder meta `pages` list can name, by group path: each folder's
36
+ * pages and subfolders, keyed as `buildFileSystemSidebar` keys its nodes (the
37
+ * name without its extension, ordering prefix, or parentheses). Read off nav
38
+ * paths, so it covers pages the sidebar leaves out, like hidden ones.
39
+ */
40
+ export declare const folderChildKeys: (navPaths: Iterable<string>) => Map<string, Set<string>>;
28
41
  /**
29
42
  * An explicit-sidebar ref (`"guides/"`, `"/guides/index"`, `"index"`) in the
30
43
  * slashless route form pages are keyed by (`/guides`, `/`).
@@ -2,3 +2,9 @@
2
2
  export declare const orderingPrefix: (name: string) => string | undefined;
3
3
  /** `name` without its ordering prefix (`01-intro` -> `intro`). */
4
4
  export declare const stripOrderingPrefix: (name: string) => string;
5
+ /**
6
+ * The name an earlier Blume routed `name` as, when it differs from today's:
7
+ * a {@link DATE_NAME} lost its first number as an ordering prefix
8
+ * (`12-05-2022` routed as `05-2022`, `2024-01` as `01`).
9
+ */
10
+ export declare const formerRouteName: (name: string) => string | undefined;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * A pinned heading id (`## Heading [#a--b]`, `{#a--b}`) is used verbatim, but
3
+ * the parse that reads it applies smart punctuation (Astro's `smartypants`,
4
+ * on by default) to the whole heading first: `--` became `–`, `...` became
5
+ * `…`, and quotes curled, so the id rendered as `a–b` while every link
6
+ * written to it says `#a--b`. Smart punctuation leaves a backslash-escaped
7
+ * character alone, so before a source is parsed, the punctuation in each
8
+ * heading's trailing markers is escaped where the author wrote it, and the
9
+ * parse reads the id as typed. An id with a typed `–` keeps it.
10
+ *
11
+ * The page render, each `<include>` splice, and the scan-time heading reader
12
+ * all escape their source this way, so the rendered id and the anchor index
13
+ * `blume validate` checks against agree.
14
+ */
15
+ import type { SourceFormat } from "satteri";
16
+ /**
17
+ * `source` with the smart-punctuation characters in each heading's pinned id
18
+ * backslash-escaped, so a parse with smart punctuation reads the id as
19
+ * written. `source` must be the whole text the parse will read, link
20
+ * definitions included: they decide which brackets are links. A source
21
+ * without such a pin is returned as is, unparsed.
22
+ */
23
+ export declare const escapePinnedIds: (source: string, format: SourceFormat) => string;
@@ -21,8 +21,16 @@ export interface BlumeProject {
21
21
  graph: ContentGraph;
22
22
  manifest: BlumeManifest;
23
23
  diagnostics: Diagnostic[];
24
- /** Entries excluded from the graph because their frontmatter failed validation. */
24
+ /**
25
+ * Entries excluded from the graph because their frontmatter failed
26
+ * validation, or (in a build) their MDX doesn't parse.
27
+ */
25
28
  droppedPages: number;
29
+ /**
30
+ * The local `.mdx` files a build dropped because they don't parse, which
31
+ * the docs collection leaves out so Astro never compiles them.
32
+ */
33
+ unparsable: string[];
26
34
  /** The instantiated content sources, for lazy entry reads (search/AI/raw). */
27
35
  sources: ContentSource[];
28
36
  /**
@@ -61,6 +61,13 @@ export interface RedirectRule {
61
61
  status: number;
62
62
  to: string;
63
63
  }
64
+ /**
65
+ * The literal start of a `to` that reads a capture, up to its first
66
+ * reference: `/guides/` for `/guides/:slug*`, `/new/article-` for
67
+ * `/new/article-*`. `undefined` for a `to` that reads none, which is one
68
+ * exact path.
69
+ */
70
+ export declare const destinationPrefix: (to: string) => string | undefined;
64
71
  /** Whether a path is a pattern, rather than one exact path. */
65
72
  export declare const isPatternPath: (path: string) => boolean;
66
73
  /** Why a redirect's ends can't work, and which end to fix. */
@@ -80,6 +87,17 @@ export declare const redirectPatternError: (from: string, to: string) => Redirec
80
87
  * rules; an exact redirect gets none.
81
88
  */
82
89
  export declare const expandRedirect: (redirect: RedirectEnds) => RedirectRule[];
90
+ /**
91
+ * The bare path a pattern ending in a rest also matches, as the exact
92
+ * redirect every host is given for it: `/beta/:slug*` (or `/beta/*`) to
93
+ * `/v2/:slug*` sends `/beta` itself to `/v2`. Null for an exact redirect,
94
+ * a pattern with no rest, and one whose bare path still holds a capture
95
+ * (`/:lang/*`), which names no single path.
96
+ */
97
+ export declare const bareRedirect: (redirect: RedirectEnds) => {
98
+ from: string;
99
+ to: string;
100
+ } | null;
83
101
  /** Put exact redirects ahead of patterns, which hosts try in order. */
84
102
  export declare const exactFirst: <Redirect extends {
85
103
  from: string;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Whether a target is *shaped* like a colocated image reference: a relative
3
+ * filesystem path with an image extension. Exported so link validation can
4
+ * tell "not a colocated candidate" apart from "a candidate that resolves
5
+ * nowhere" — the former falls through to the public-dir probe, the latter is
6
+ * a broken reference beside the page source.
7
+ */
8
+ export declare const isRelativeImageTarget: (target: string) => boolean;
9
+ /**
10
+ * Resolve one image target against its page's directory. Returns the absolute
11
+ * file path when the target is relative, is an image, and exists on disk —
12
+ * anything else (remote URLs, `public/` absolutes, broken refs, code-block
13
+ * examples that happen to look like paths) is null and left untouched. Shared
14
+ * with link validation, so what counts as a colocated image is decided once.
15
+ */
16
+ export declare const resolveRelativeImage: (sourceDir: string, target: string) => string | null;
17
+ /** A file a link names beside its page, and the link's `?query#fragment`. */
18
+ export interface RelativeFile {
19
+ path: string;
20
+ suffix: string;
21
+ }
22
+ /**
23
+ * Resolve the file a link, an element's `src`, or an `href` names beside its
24
+ * page (`./spec.pdf`, `../files/data.csv#L2`): a relative path whose name
25
+ * carries an extension other than a page's (`.md`, `.mdx`), on disk as
26
+ * written (see `existsAsWritten`). Its `?query` or `#fragment` is set aside,
27
+ * so `./spec.pdf#page=2` opens the served file at that page. Anything else is
28
+ * null: a page link, a URL, a root path, a missing file. Shared with link
29
+ * validation, which accepts what this resolves.
30
+ */
31
+ export declare const resolveRelativeFile: (sourceDir: string, target: string) => RelativeFile | null;
@@ -121,7 +121,9 @@ declare const pageMetaBaseSchema: z.ZodObject<{
121
121
  title: z.ZodOptional<z.ZodString>;
122
122
  type: z.ZodOptional<z.ZodString>;
123
123
  }, z.core.$strict>;
124
- export declare const pageMetaSchema: z.ZodObject<{
124
+ export type PageMeta = z.infer<typeof pageMetaBaseSchema>;
125
+ export type PageMetaInput = z.input<typeof pageMetaBaseSchema>;
126
+ export declare const pageMetaSchema: z.ZodPipe<z.ZodObject<{
125
127
  ai: z.ZodPrefault<z.ZodObject<{
126
128
  exclude: z.ZodDefault<z.ZodBoolean>;
127
129
  }, z.core.$strict>>;
@@ -202,9 +204,135 @@ export declare const pageMetaSchema: z.ZodObject<{
202
204
  slug: z.ZodOptional<z.ZodString>;
203
205
  title: z.ZodOptional<z.ZodString>;
204
206
  type: z.ZodOptional<z.ZodString>;
205
- }, z.core.$strict>;
206
- export type PageMeta = z.infer<typeof pageMetaBaseSchema>;
207
- export type PageMetaInput = z.input<typeof pageMetaBaseSchema>;
207
+ }, z.core.$strict>, z.ZodTransform<{
208
+ ai: {
209
+ exclude: boolean;
210
+ };
211
+ deprecated: boolean;
212
+ draft: boolean;
213
+ hidden: boolean;
214
+ narration: boolean;
215
+ noindex: boolean;
216
+ pagination: boolean;
217
+ search: {
218
+ exclude: boolean;
219
+ boost?: number | undefined;
220
+ keywords?: string[] | undefined;
221
+ tags?: string[] | undefined;
222
+ };
223
+ seo: {
224
+ noindex: boolean;
225
+ canonical?: string | undefined;
226
+ description?: string | undefined;
227
+ image?: string | undefined;
228
+ title?: string | undefined;
229
+ x?: {
230
+ creator?: string | undefined;
231
+ } | undefined;
232
+ };
233
+ sidebar: {
234
+ hidden: boolean;
235
+ badge?: string | undefined;
236
+ display?: "flat" | "group" | "page" | undefined;
237
+ icon?: string | undefined;
238
+ label?: string | undefined;
239
+ order?: number | undefined;
240
+ };
241
+ api?: string | undefined;
242
+ authMethod?: "none" | "key" | "bearer" | "basic" | undefined;
243
+ authors?: string | {
244
+ [x: string]: unknown;
245
+ name: string;
246
+ avatar?: string | undefined;
247
+ image?: string | undefined;
248
+ url?: string | undefined;
249
+ } | (string | {
250
+ [x: string]: unknown;
251
+ name: string;
252
+ avatar?: string | undefined;
253
+ image?: string | undefined;
254
+ url?: string | undefined;
255
+ })[] | undefined;
256
+ changelog?: {
257
+ category?: string | undefined;
258
+ date?: string | undefined;
259
+ version?: string | undefined;
260
+ } | undefined;
261
+ date?: string | undefined;
262
+ description?: string | undefined;
263
+ icon?: string | undefined;
264
+ lastModified?: string | undefined;
265
+ mode?: "default" | "custom" | "wide" | "center" | "frame" | undefined;
266
+ playground?: "none" | "interactive" | "simple" | undefined;
267
+ related?: false | (string | Record<string, string>)[] | undefined;
268
+ slug?: string | undefined;
269
+ title?: string | undefined;
270
+ type?: string | undefined;
271
+ }, {
272
+ ai: {
273
+ exclude: boolean;
274
+ };
275
+ deprecated: boolean;
276
+ draft: boolean;
277
+ hidden: boolean;
278
+ narration: boolean;
279
+ noindex: boolean;
280
+ pagination: boolean;
281
+ search: {
282
+ exclude: boolean;
283
+ boost?: number | undefined;
284
+ keywords?: string[] | undefined;
285
+ tags?: string[] | undefined;
286
+ };
287
+ seo: {
288
+ noindex: boolean;
289
+ canonical?: string | undefined;
290
+ description?: string | undefined;
291
+ image?: string | undefined;
292
+ title?: string | undefined;
293
+ x?: {
294
+ creator?: string | undefined;
295
+ } | undefined;
296
+ };
297
+ sidebar: {
298
+ hidden: boolean;
299
+ badge?: string | undefined;
300
+ display?: "flat" | "group" | "page" | undefined;
301
+ icon?: string | undefined;
302
+ label?: string | undefined;
303
+ order?: number | undefined;
304
+ };
305
+ api?: string | undefined;
306
+ authMethod?: "none" | "key" | "bearer" | "basic" | undefined;
307
+ authors?: string | {
308
+ [x: string]: unknown;
309
+ name: string;
310
+ avatar?: string | undefined;
311
+ image?: string | undefined;
312
+ url?: string | undefined;
313
+ } | (string | {
314
+ [x: string]: unknown;
315
+ name: string;
316
+ avatar?: string | undefined;
317
+ image?: string | undefined;
318
+ url?: string | undefined;
319
+ })[] | undefined;
320
+ changelog?: {
321
+ category?: string | undefined;
322
+ date?: string | undefined;
323
+ version?: string | undefined;
324
+ } | undefined;
325
+ date?: string | undefined;
326
+ description?: string | undefined;
327
+ icon?: string | undefined;
328
+ lastModified?: string | undefined;
329
+ mode?: "default" | "custom" | "wide" | "center" | "frame" | undefined;
330
+ playground?: "none" | "interactive" | "simple" | undefined;
331
+ related?: false | (string | Record<string, string>)[] | undefined;
332
+ slug?: string | undefined;
333
+ title?: string | undefined;
334
+ type?: string | undefined;
335
+ }>>;
208
336
  /**
209
337
  * The page schema as the generated content collections declare it, so
210
338
  * `entry.data` is typed and normalized (dates as ISO strings, X handles with
@@ -216,7 +344,7 @@ export type PageMetaInput = z.input<typeof pageMetaBaseSchema>;
216
344
  * diagnostic — Blume continues without it unless `--strict` — so the
217
345
  * collection must not turn that dropped page into a failed content sync.
218
346
  */
219
- export declare const pageCollectionSchema: z.ZodCatch<z.ZodObject<{
347
+ export declare const pageCollectionSchema: z.ZodCatch<z.ZodPipe<z.ZodObject<{
220
348
  ai: z.ZodPrefault<z.ZodObject<{
221
349
  exclude: z.ZodDefault<z.ZodBoolean>;
222
350
  }, z.core.$strict>>;
@@ -297,7 +425,139 @@ export declare const pageCollectionSchema: z.ZodCatch<z.ZodObject<{
297
425
  slug: z.ZodOptional<z.ZodString>;
298
426
  title: z.ZodOptional<z.ZodString>;
299
427
  type: z.ZodOptional<z.ZodString>;
300
- }, z.core.$loose>>;
428
+ }, z.core.$loose>, z.ZodTransform<{
429
+ [x: string]: unknown;
430
+ ai: {
431
+ exclude: boolean;
432
+ };
433
+ deprecated: boolean;
434
+ draft: boolean;
435
+ hidden: boolean;
436
+ narration: boolean;
437
+ noindex: boolean;
438
+ pagination: boolean;
439
+ search: {
440
+ exclude: boolean;
441
+ boost?: number | undefined;
442
+ keywords?: string[] | undefined;
443
+ tags?: string[] | undefined;
444
+ };
445
+ seo: {
446
+ noindex: boolean;
447
+ canonical?: string | undefined;
448
+ description?: string | undefined;
449
+ image?: string | undefined;
450
+ title?: string | undefined;
451
+ x?: {
452
+ creator?: string | undefined;
453
+ } | undefined;
454
+ };
455
+ sidebar: {
456
+ hidden: boolean;
457
+ badge?: string | undefined;
458
+ display?: "flat" | "group" | "page" | undefined;
459
+ icon?: string | undefined;
460
+ label?: string | undefined;
461
+ order?: number | undefined;
462
+ };
463
+ api?: string | undefined;
464
+ authMethod?: "none" | "key" | "bearer" | "basic" | undefined;
465
+ authors?: string | {
466
+ [x: string]: unknown;
467
+ name: string;
468
+ avatar?: string | undefined;
469
+ image?: string | undefined;
470
+ url?: string | undefined;
471
+ } | (string | {
472
+ [x: string]: unknown;
473
+ name: string;
474
+ avatar?: string | undefined;
475
+ image?: string | undefined;
476
+ url?: string | undefined;
477
+ })[] | undefined;
478
+ changelog?: {
479
+ category?: string | undefined;
480
+ date?: string | undefined;
481
+ version?: string | undefined;
482
+ } | undefined;
483
+ date?: string | undefined;
484
+ description?: string | undefined;
485
+ icon?: string | undefined;
486
+ lastModified?: string | undefined;
487
+ mode?: "default" | "custom" | "wide" | "center" | "frame" | undefined;
488
+ playground?: "none" | "interactive" | "simple" | undefined;
489
+ related?: false | (string | Record<string, string>)[] | undefined;
490
+ slug?: string | undefined;
491
+ title?: string | undefined;
492
+ type?: string | undefined;
493
+ }, {
494
+ [x: string]: unknown;
495
+ ai: {
496
+ exclude: boolean;
497
+ };
498
+ deprecated: boolean;
499
+ draft: boolean;
500
+ hidden: boolean;
501
+ narration: boolean;
502
+ noindex: boolean;
503
+ pagination: boolean;
504
+ search: {
505
+ exclude: boolean;
506
+ boost?: number | undefined;
507
+ keywords?: string[] | undefined;
508
+ tags?: string[] | undefined;
509
+ };
510
+ seo: {
511
+ noindex: boolean;
512
+ canonical?: string | undefined;
513
+ description?: string | undefined;
514
+ image?: string | undefined;
515
+ title?: string | undefined;
516
+ x?: {
517
+ creator?: string | undefined;
518
+ } | undefined;
519
+ };
520
+ sidebar: {
521
+ hidden: boolean;
522
+ badge?: string | undefined;
523
+ display?: "flat" | "group" | "page" | undefined;
524
+ icon?: string | undefined;
525
+ label?: string | undefined;
526
+ order?: number | undefined;
527
+ };
528
+ api?: string | undefined;
529
+ authMethod?: "none" | "key" | "bearer" | "basic" | undefined;
530
+ authors?: string | {
531
+ [x: string]: unknown;
532
+ name: string;
533
+ avatar?: string | undefined;
534
+ image?: string | undefined;
535
+ url?: string | undefined;
536
+ } | (string | {
537
+ [x: string]: unknown;
538
+ name: string;
539
+ avatar?: string | undefined;
540
+ image?: string | undefined;
541
+ url?: string | undefined;
542
+ })[] | undefined;
543
+ changelog?: {
544
+ category?: string | undefined;
545
+ date?: string | undefined;
546
+ version?: string | undefined;
547
+ } | undefined;
548
+ date?: string | undefined;
549
+ description?: string | undefined;
550
+ icon?: string | undefined;
551
+ lastModified?: string | undefined;
552
+ mode?: "default" | "custom" | "wide" | "center" | "frame" | undefined;
553
+ playground?: "none" | "interactive" | "simple" | undefined;
554
+ related?: false | (string | Record<string, string>)[] | undefined;
555
+ slug?: string | undefined;
556
+ title?: string | undefined;
557
+ type?: string | undefined;
558
+ }>>>;
559
+ /** Built-in page frontmatter keys; custom keys must never redeclare one. */
560
+ export declare const BUILT_IN_PAGE_META_KEYS: ReadonlySet<string>;
301
561
  export declare const folderMetaSchema: z.ZodObject<{
302
562
  collapsed: z.ZodOptional<z.ZodBoolean>;
303
563
  directory: z.ZodOptional<z.ZodEnum<{
@@ -734,19 +994,21 @@ declare const aiConfigSchema: z.ZodObject<{
734
994
  tools: z.ZodOptional<z.ZodBoolean>;
735
995
  }, z.core.$strict>>;
736
996
  openInChat: z.ZodPipe<z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodEnum<{
997
+ cursor: "cursor";
737
998
  v0: "v0";
738
999
  chatgpt: "chatgpt";
739
1000
  claude: "claude";
740
1001
  t3: "t3";
741
1002
  scira: "scira";
742
- cursor: "cursor";
743
- }>>]>>, z.ZodTransform<("v0" | "chatgpt" | "claude" | "t3" | "scira" | "cursor")[], boolean | ("v0" | "chatgpt" | "claude" | "t3" | "scira" | "cursor")[]>>;
1003
+ }>>]>>, z.ZodTransform<("cursor" | "v0" | "chatgpt" | "claude" | "t3" | "scira")[], boolean | ("cursor" | "v0" | "chatgpt" | "claude" | "t3" | "scira")[]>>;
744
1004
  }, z.core.$strict>;
745
1005
  export { assistantReasoningLevels } from "../ai/ask.ts";
746
1006
  export type { AssistantReasoning } from "../ai/ask.ts";
747
1007
  export type AssistantConfig = NonNullable<z.infer<typeof aiConfigSchema>["assistant"]>;
748
1008
  export { openInChatProviders } from "./open-in-chat.ts";
749
1009
  export type { OpenInChatProvider } from "./open-in-chat.ts";
1010
+ export { mcpClients } from "./mcp-clients.ts";
1011
+ export type { McpClient, McpCustomClient } from "./mcp-clients.ts";
750
1012
  /** A configured locale: ISO-ish code plus display metadata for the switcher. */
751
1013
  declare const localeSchema: z.ZodObject<{
752
1014
  code: z.ZodString;
@@ -946,6 +1208,24 @@ export declare const blumeConfigSchema: z.ZodObject<{
946
1208
  }>>;
947
1209
  markdownComponents: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodCustom<ComponentMarkdown, ComponentMarkdown>>>;
948
1210
  mcp: z.ZodPrefault<z.ZodObject<{
1211
+ clients: z.ZodPipe<z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodUnion<readonly [z.ZodEnum<{
1212
+ "claude-code": "claude-code";
1213
+ codex: "codex";
1214
+ cursor: "cursor";
1215
+ vscode: "vscode";
1216
+ }>, z.ZodObject<{
1217
+ command: z.ZodString;
1218
+ icon: z.ZodOptional<z.ZodString>;
1219
+ label: z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>;
1220
+ }, z.core.$strict>]>>]>>, z.ZodTransform<("claude-code" | "codex" | "cursor" | "vscode" | {
1221
+ command: string;
1222
+ label: string | Record<string, string>;
1223
+ icon?: string | undefined;
1224
+ })[], boolean | ("claude-code" | "codex" | "cursor" | "vscode" | {
1225
+ command: string;
1226
+ label: string | Record<string, string>;
1227
+ icon?: string | undefined;
1228
+ })[]>>;
949
1229
  enabled: z.ZodDefault<z.ZodBoolean>;
950
1230
  instructions: z.ZodOptional<z.ZodString>;
951
1231
  name: z.ZodOptional<z.ZodString>;
@@ -1133,13 +1413,13 @@ export declare const blumeConfigSchema: z.ZodObject<{
1133
1413
  tools: z.ZodOptional<z.ZodBoolean>;
1134
1414
  }, z.core.$strict>>;
1135
1415
  openInChat: z.ZodPipe<z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodArray<z.ZodEnum<{
1416
+ cursor: "cursor";
1136
1417
  v0: "v0";
1137
1418
  chatgpt: "chatgpt";
1138
1419
  claude: "claude";
1139
1420
  t3: "t3";
1140
1421
  scira: "scira";
1141
- cursor: "cursor";
1142
- }>>]>>, z.ZodTransform<("v0" | "chatgpt" | "claude" | "t3" | "scira" | "cursor")[], boolean | ("v0" | "chatgpt" | "claude" | "t3" | "scira" | "cursor")[]>>;
1422
+ }>>]>>, z.ZodTransform<("cursor" | "v0" | "chatgpt" | "claude" | "t3" | "scira")[], boolean | ("cursor" | "v0" | "chatgpt" | "claude" | "t3" | "scira")[]>>;
1143
1423
  }, z.core.$strict>>;
1144
1424
  analytics: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
1145
1425
  kind: z.ZodLiteral<"adobe">;
@@ -1760,7 +2040,7 @@ export declare const blumeConfigSchema: z.ZodObject<{
1760
2040
  options: z.ZodObject<{
1761
2041
  pollInterval: z.ZodOptional<z.ZodNumber>;
1762
2042
  prefix: z.ZodOptional<z.ZodString>;
1763
- exclude: z.ZodDefault<z.ZodArray<z.ZodString>>;
2043
+ exclude: z.ZodPipe<z.ZodDefault<z.ZodArray<z.ZodString>>, z.ZodTransform<string[], string[]>>;
1764
2044
  include: z.ZodDefault<z.ZodArray<z.ZodString>>;
1765
2045
  root: z.ZodDefault<z.ZodString>;
1766
2046
  }, z.core.$strict>;
@@ -2778,6 +3058,7 @@ export declare const blumeConfigSchema: z.ZodObject<{
2778
3058
  enabled: boolean;
2779
3059
  }>>>;
2780
3060
  footer: z.ZodOptional<z.ZodObject<{
3061
+ copyright: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
2781
3062
  links: z.ZodDefault<z.ZodArray<z.ZodObject<{
2782
3063
  href: z.ZodString;
2783
3064
  label: z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>;
@@ -3090,6 +3371,16 @@ export declare const blumeConfigSchema: z.ZodObject<{
3090
3371
  }, z.core.$strict>;
3091
3372
  requiredSecrets: z.ZodArray<z.ZodString>;
3092
3373
  runtimeDeps: z.ZodArray<z.ZodString>;
3374
+ }, z.core.$strict>, z.ZodObject<{
3375
+ kind: z.ZodLiteral<"unkey">;
3376
+ options: z.ZodObject<{
3377
+ requests: z.ZodOptional<z.ZodNumber>;
3378
+ namespace: z.ZodOptional<z.ZodString>;
3379
+ rootKeyEnv: z.ZodOptional<z.ZodString>;
3380
+ window: z.ZodOptional<z.ZodNumber>;
3381
+ }, z.core.$strict>;
3382
+ requiredSecrets: z.ZodArray<z.ZodString>;
3383
+ runtimeDeps: z.ZodArray<z.ZodString>;
3093
3384
  }, z.core.$strict>], "kind">]>>, z.ZodTransform<{
3094
3385
  kind: "cloudflare";
3095
3386
  options: {
@@ -3117,6 +3408,16 @@ export declare const blumeConfigSchema: z.ZodObject<{
3117
3408
  };
3118
3409
  requiredSecrets: string[];
3119
3410
  runtimeDeps: string[];
3411
+ } | {
3412
+ kind: "unkey";
3413
+ options: {
3414
+ requests?: number | undefined;
3415
+ namespace?: string | undefined;
3416
+ rootKeyEnv?: string | undefined;
3417
+ window?: number | undefined;
3418
+ };
3419
+ requiredSecrets: string[];
3420
+ runtimeDeps: string[];
3120
3421
  } | null, false | {
3121
3422
  kind: "cloudflare";
3122
3423
  options: {
@@ -3144,6 +3445,16 @@ export declare const blumeConfigSchema: z.ZodObject<{
3144
3445
  };
3145
3446
  requiredSecrets: string[];
3146
3447
  runtimeDeps: string[];
3448
+ } | {
3449
+ kind: "unkey";
3450
+ options: {
3451
+ requests?: number | undefined;
3452
+ namespace?: string | undefined;
3453
+ rootKeyEnv?: string | undefined;
3454
+ window?: number | undefined;
3455
+ };
3456
+ requiredSecrets: string[];
3457
+ runtimeDeps: string[];
3147
3458
  } | undefined>>;
3148
3459
  react: z.ZodPrefault<z.ZodObject<{
3149
3460
  compiler: z.ZodDefault<z.ZodBoolean>;