blume 2.0.3 → 2.1.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 (607) hide show
  1. package/AGENTS.md +1 -0
  2. package/CHANGELOG.md +142 -0
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-5f86nr5m.js → chunk-073rdvgb.js} +21 -48
  5. package/dist/cli/{chunk-5f86nr5m.js.map → chunk-073rdvgb.js.map} +4 -5
  6. package/dist/cli/{chunk-ga0pf4aj.js → chunk-0n9xkp3d.js} +12 -3
  7. package/dist/cli/{chunk-ga0pf4aj.js.map → chunk-0n9xkp3d.js.map} +3 -3
  8. package/dist/cli/chunk-150jk7km.js +52 -0
  9. package/dist/cli/chunk-150jk7km.js.map +10 -0
  10. package/dist/cli/{chunk-9t7a85s3.js → chunk-313vnn40.js} +30 -19
  11. package/dist/cli/chunk-313vnn40.js.map +10 -0
  12. package/dist/cli/{chunk-tkacnehg.js → chunk-3v3ffbrj.js} +2 -2
  13. package/dist/cli/{chunk-q58y5e6a.js → chunk-3x6x3pph.js} +46 -24
  14. package/dist/cli/chunk-3x6x3pph.js.map +10 -0
  15. package/dist/cli/{chunk-1d7ve1dm.js → chunk-42t4jxdx.js} +37 -5
  16. package/dist/cli/chunk-42t4jxdx.js.map +12 -0
  17. package/dist/cli/{chunk-8ktnccpt.js → chunk-54ztw1nj.js} +21 -2
  18. package/dist/cli/chunk-54ztw1nj.js.map +10 -0
  19. package/dist/cli/{chunk-hm3vjy5s.js → chunk-5vjtgs6e.js} +28 -10
  20. package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-5vjtgs6e.js.map} +4 -4
  21. package/dist/cli/chunk-66w9j7p6.js +322 -0
  22. package/dist/cli/chunk-66w9j7p6.js.map +14 -0
  23. package/dist/cli/{chunk-2hsdwb9n.js → chunk-7ppf1rva.js} +34 -18
  24. package/dist/cli/chunk-7ppf1rva.js.map +10 -0
  25. package/dist/cli/{chunk-r9rcc4w7.js → chunk-8y2kmjv8.js} +7 -7
  26. package/dist/cli/{chunk-r20tn01b.js → chunk-c1y538kd.js} +8 -2
  27. package/dist/cli/{chunk-r20tn01b.js.map → chunk-c1y538kd.js.map} +3 -3
  28. package/dist/cli/{chunk-2eytanqx.js → chunk-c887fj0s.js} +2 -2
  29. package/dist/cli/{chunk-p3v96n38.js → chunk-cfyg47zg.js} +16 -6
  30. package/dist/cli/chunk-cfyg47zg.js.map +10 -0
  31. package/dist/cli/chunk-cm89scdv.js +443 -0
  32. package/dist/cli/chunk-cm89scdv.js.map +11 -0
  33. package/dist/cli/{chunk-akbpwfxc.js → chunk-dzwehpy7.js} +2 -2
  34. package/dist/cli/{chunk-wrr3j9w9.js → chunk-e6atmn4h.js} +299 -72
  35. package/dist/cli/chunk-e6atmn4h.js.map +36 -0
  36. package/dist/cli/{chunk-tzmab476.js → chunk-e8xw9qkh.js} +8 -6
  37. package/dist/cli/{chunk-tzmab476.js.map → chunk-e8xw9qkh.js.map} +3 -3
  38. package/dist/cli/{chunk-6dsbexzp.js → chunk-e9q7a2ak.js} +17 -15
  39. package/dist/cli/{chunk-6dsbexzp.js.map → chunk-e9q7a2ak.js.map} +2 -2
  40. package/dist/cli/{chunk-pv29h0wf.js → chunk-ehweg4fr.js} +5155 -1249
  41. package/dist/cli/chunk-ehweg4fr.js.map +218 -0
  42. package/dist/cli/{chunk-c8chx29p.js → chunk-ep6nd0rn.js} +390 -318
  43. package/dist/cli/chunk-ep6nd0rn.js.map +36 -0
  44. package/dist/cli/{chunk-p73c0m7w.js → chunk-fdrkhpjy.js} +18 -15
  45. package/dist/cli/{chunk-p73c0m7w.js.map → chunk-fdrkhpjy.js.map} +3 -3
  46. package/dist/cli/{chunk-2z928egk.js → chunk-ft9vfys6.js} +5 -5
  47. package/dist/cli/{chunk-5m5nmvyq.js → chunk-gb420vvz.js} +316 -79
  48. package/dist/cli/chunk-gb420vvz.js.map +17 -0
  49. package/dist/cli/{chunk-vg9r4eb9.js → chunk-hebn0tpx.js} +86 -13
  50. package/dist/cli/chunk-hebn0tpx.js.map +14 -0
  51. package/dist/cli/{chunk-35d4wj9f.js → chunk-htrwgabr.js} +41 -23
  52. package/dist/cli/chunk-htrwgabr.js.map +15 -0
  53. package/dist/cli/{chunk-g4hq16wv.js → chunk-hx3xqnk9.js} +16 -14
  54. package/dist/cli/{chunk-g4hq16wv.js.map → chunk-hx3xqnk9.js.map} +2 -2
  55. package/dist/cli/chunk-j134vrp2.js +65 -0
  56. package/dist/cli/chunk-j134vrp2.js.map +10 -0
  57. package/dist/cli/{chunk-a58773jm.js → chunk-kma9f6sf.js} +2 -2
  58. package/dist/cli/chunk-kwrg63tm.js +31 -0
  59. package/dist/cli/chunk-kwrg63tm.js.map +10 -0
  60. package/dist/cli/{chunk-ey84smr6.js → chunk-mrcccgnh.js} +6 -6
  61. package/dist/cli/{chunk-ey84smr6.js.map → chunk-mrcccgnh.js.map} +1 -1
  62. package/dist/cli/{chunk-yfyb25rh.js → chunk-n0v7m8ry.js} +24 -8
  63. package/dist/cli/chunk-n0v7m8ry.js.map +14 -0
  64. package/dist/cli/{chunk-j85vccga.js → chunk-ncj7w596.js} +576 -367
  65. package/dist/cli/chunk-ncj7w596.js.map +35 -0
  66. package/dist/cli/{chunk-5xvm6tfj.js → chunk-nq1d20w2.js} +17 -15
  67. package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-nq1d20w2.js.map} +2 -2
  68. package/dist/cli/{chunk-pehfxfta.js → chunk-nrns10mj.js} +6 -98
  69. package/dist/cli/chunk-nrns10mj.js.map +10 -0
  70. package/dist/cli/{chunk-crgn1q09.js → chunk-sds923fa.js} +4 -4
  71. package/dist/cli/chunk-t2m5j4pr.js +104 -0
  72. package/dist/cli/chunk-t2m5j4pr.js.map +11 -0
  73. package/dist/cli/{chunk-acanzt5p.js → chunk-tdqhyxfz.js} +6 -6
  74. package/dist/cli/chunk-tphac74f.js +126 -0
  75. package/dist/cli/chunk-tphac74f.js.map +11 -0
  76. package/dist/cli/chunk-w1r4vase.js +18 -0
  77. package/dist/cli/chunk-w1r4vase.js.map +10 -0
  78. package/dist/cli/{chunk-3em5wd2y.js → chunk-zccbjcj0.js} +4 -3
  79. package/dist/cli/{chunk-3em5wd2y.js.map → chunk-zccbjcj0.js.map} +2 -2
  80. package/dist/cli/index.js +31 -20
  81. package/dist/cli/index.js.map +5 -5
  82. package/dist/types/ai/agent-surface.d.ts +8 -7
  83. package/dist/types/ai/ai-catalog.d.ts +7 -0
  84. package/dist/types/ai/ask-context.d.ts +26 -0
  85. package/dist/types/ai/ask.d.ts +271 -58
  86. package/dist/types/ai/component-markdown.d.ts +2 -0
  87. package/dist/types/ai/index.d.ts +2 -2
  88. package/dist/types/ai/openapi-components.d.ts +4 -1
  89. package/dist/types/ai/site-skill.d.ts +26 -0
  90. package/dist/types/ai/skills.d.ts +16 -0
  91. package/dist/types/astro/integration.d.ts +9 -0
  92. package/dist/types/astro/markdown-negotiation.d.ts +3 -0
  93. package/dist/types/astro/pages.d.ts +10 -0
  94. package/dist/types/captcha/hcaptcha.d.ts +27 -0
  95. package/dist/types/captcha/index.d.ts +28 -0
  96. package/dist/types/captcha/schema.d.ts +29 -0
  97. package/dist/types/captcha/turnstile.d.ts +28 -0
  98. package/dist/types/cli/init/scaffold.d.ts +1 -1
  99. package/dist/types/components/content/api-field.d.ts +62 -0
  100. package/dist/types/components/content/api-page.d.ts +100 -0
  101. package/dist/types/components/layout/nav-utils.d.ts +26 -0
  102. package/dist/types/components/openapi/code-samples.d.ts +29 -0
  103. package/dist/types/components/openapi/helpers.d.ts +158 -0
  104. package/dist/types/components/openapi/security.d.ts +95 -0
  105. package/dist/types/components/openapi/snippets.d.ts +60 -0
  106. package/dist/types/consent/ethyca.d.ts +48 -0
  107. package/dist/types/consent/index.d.ts +37 -0
  108. package/dist/types/consent/native.d.ts +28 -0
  109. package/dist/types/consent/osano.d.ts +42 -0
  110. package/dist/types/consent/schema.d.ts +110 -0
  111. package/dist/types/core/changelog-index.d.ts +8 -0
  112. package/dist/types/core/config-input.d.ts +217 -23
  113. package/dist/types/core/data.d.ts +53 -4
  114. package/dist/types/core/footer.d.ts +8 -0
  115. package/dist/types/core/i18n-ui.d.ts +88 -0
  116. package/dist/types/core/includes.d.ts +8 -2
  117. package/dist/types/core/links.d.ts +8 -0
  118. package/dist/types/core/localizable.d.ts +7 -0
  119. package/dist/types/core/page-modes.d.ts +29 -0
  120. package/dist/types/core/probe.d.ts +2 -0
  121. package/dist/types/core/project-graph.d.ts +6 -0
  122. package/dist/types/core/redirect-patterns.d.ts +152 -0
  123. package/dist/types/core/related.d.ts +40 -0
  124. package/dist/types/core/schema.d.ts +670 -56
  125. package/dist/types/core/sources/cache.d.ts +3 -0
  126. package/dist/types/core/sources/contentful-rich-text.d.ts +11 -2
  127. package/dist/types/core/sources/contentful.d.ts +17 -1
  128. package/dist/types/core/sources/lexical.d.ts +5 -0
  129. package/dist/types/core/sources/normalize.d.ts +20 -1
  130. package/dist/types/core/sources/read.d.ts +5 -0
  131. package/dist/types/core/sources/remote.d.ts +37 -10
  132. package/dist/types/core/sources/sanity.d.ts +1 -1
  133. package/dist/types/core/types.d.ts +18 -1
  134. package/dist/types/core/variables.d.ts +42 -0
  135. package/dist/types/deploy/adapter-output.d.ts +2 -1
  136. package/dist/types/deploy/adapters/cloudflare.d.ts +7 -5
  137. package/dist/types/deploy/adapters/node.d.ts +58 -23
  138. package/dist/types/deploy/adapters/registry.d.ts +10 -0
  139. package/dist/types/deploy/adapters/types.d.ts +3 -2
  140. package/dist/types/deploy/node-headers.d.ts +13 -2
  141. package/dist/types/deploy/platforms/cloudflare.d.ts +15 -7
  142. package/dist/types/deploy/platforms/netlify.d.ts +7 -0
  143. package/dist/types/deploy/platforms/node.d.ts +3 -1
  144. package/dist/types/deploy/platforms/types.d.ts +18 -7
  145. package/dist/types/deploy/platforms/vercel.d.ts +26 -1
  146. package/dist/types/deploy/redirects.d.ts +55 -11
  147. package/dist/types/deploy/sitemap.d.ts +2 -1
  148. package/dist/types/deploy/vercel-negotiation.d.ts +51 -21
  149. package/dist/types/markdown/code-title.d.ts +17 -0
  150. package/dist/types/markdown/features.d.ts +3 -2
  151. package/dist/types/narration/build.d.ts +70 -0
  152. package/dist/types/narration/provider.d.ts +26 -0
  153. package/dist/types/narration/script.d.ts +154 -0
  154. package/dist/types/openapi/checks.d.ts +27 -0
  155. package/dist/types/openapi/graphql.d.ts +6 -0
  156. package/dist/types/openapi/model.d.ts +27 -10
  157. package/dist/types/openapi/overlay.d.ts +54 -0
  158. package/dist/types/openapi/parse.d.ts +16 -0
  159. package/dist/types/openapi/references.d.ts +30 -4
  160. package/dist/types/ratelimit/cloudflare.d.ts +39 -0
  161. package/dist/types/ratelimit/index.d.ts +27 -0
  162. package/dist/types/ratelimit/memory.d.ts +36 -0
  163. package/dist/types/ratelimit/schema.d.ts +119 -0
  164. package/dist/types/ratelimit/upstash.d.ts +46 -0
  165. package/dist/types/ratelimit/wrangler.d.ts +23 -0
  166. package/dist/types/reference/asyncapi.d.ts +10 -10
  167. package/dist/types/reference/graphql.d.ts +89 -11
  168. package/dist/types/reference/index.d.ts +1 -1
  169. package/dist/types/reference/openapi.d.ts +33 -12
  170. package/dist/types/reference/options.d.ts +82 -6
  171. package/dist/types/reference/scalar.d.ts +13 -0
  172. package/dist/types/reference/schema.d.ts +144 -36
  173. package/dist/types/search/adapters/registry.d.ts +3 -0
  174. package/dist/types/search/adapters/typesense.d.ts +14 -4
  175. package/dist/types/search/build.d.ts +3 -1
  176. package/dist/types/search/documents.d.ts +12 -1
  177. package/dist/types/search/orama-index.d.ts +13 -9
  178. package/dist/types/search/sync/algolia.d.ts +5 -2
  179. package/dist/types/search/sync/index.d.ts +3 -1
  180. package/dist/types/search/sync/typesense.d.ts +11 -7
  181. package/dist/types/seo/metatags.d.ts +20 -0
  182. package/dist/types/sources/contentful.d.ts +16 -0
  183. package/dist/types/sources/github-releases.d.ts +8 -1
  184. package/dist/types/sources/payload.d.ts +2 -0
  185. package/dist/types/sources/registry.d.ts +54 -0
  186. package/dist/types/sources/shared.d.ts +3 -0
  187. package/dist/types/sources/strapi.d.ts +2 -0
  188. package/docs/01-quickstart.mdx +4 -2
  189. package/docs/02-deployment.mdx +71 -17
  190. package/docs/03-upgrading.mdx +4 -4
  191. package/docs/04-migrating.mdx +1 -1
  192. package/docs/advanced/changelog.mdx +13 -2
  193. package/docs/advanced/skills.mdx +15 -1
  194. package/docs/cli/audit.mdx +51 -8
  195. package/docs/cli/doctor.mdx +5 -1
  196. package/docs/cli/evals.mdx +4 -4
  197. package/docs/cli/index.mdx +1 -0
  198. package/docs/cli/translate.mdx +1 -0
  199. package/docs/cli/validate.mdx +4 -3
  200. package/docs/configuration/analytics.mdx +3 -1
  201. package/docs/configuration/assistant.mdx +194 -38
  202. package/docs/configuration/consent.mdx +100 -0
  203. package/docs/configuration/customization.mdx +8 -6
  204. package/docs/configuration/export.mdx +5 -3
  205. package/docs/configuration/index.mdx +64 -5
  206. package/docs/configuration/meta.ts +3 -0
  207. package/docs/configuration/narration.mdx +119 -0
  208. package/docs/configuration/rate-limiting.mdx +90 -0
  209. package/docs/configuration/search.mdx +63 -12
  210. package/docs/configuration/theming.mdx +3 -1
  211. package/docs/content/components.mdx +108 -2
  212. package/docs/content/frontmatter.mdx +80 -2
  213. package/docs/content/i18n.mdx +39 -4
  214. package/docs/content/includes.mdx +16 -0
  215. package/docs/content/meta.mdx +1 -0
  216. package/docs/content/meta.ts +1 -0
  217. package/docs/content/navigation.mdx +32 -10
  218. package/docs/content/sources/contentful.mdx +35 -0
  219. package/docs/content/sources/custom.mdx +43 -0
  220. package/docs/content/sources/github-releases.mdx +39 -0
  221. package/docs/content/sources/index.mdx +91 -0
  222. package/docs/content/sources/meta.ts +16 -0
  223. package/docs/content/sources/notion.mdx +32 -0
  224. package/docs/content/sources/obsidian.mdx +37 -0
  225. package/docs/content/sources/payload.mdx +31 -0
  226. package/docs/content/sources/remote-mdx.mdx +44 -0
  227. package/docs/content/sources/sanity.mdx +29 -0
  228. package/docs/content/sources/strapi.mdx +32 -0
  229. package/docs/content/syntax.mdx +69 -4
  230. package/docs/content/variables.mdx +41 -0
  231. package/docs/discoverability/agent-discovery.mdx +29 -2
  232. package/docs/discoverability/index.mdx +2 -2
  233. package/docs/discoverability/json-api.mdx +2 -0
  234. package/docs/discoverability/llms-txt.mdx +2 -2
  235. package/docs/discoverability/markdown.mdx +3 -1
  236. package/docs/discoverability/mcp.mdx +4 -0
  237. package/docs/discoverability/metadata.mdx +17 -0
  238. package/docs/discoverability/sitemap-and-robots.mdx +1 -1
  239. package/docs/references/api-pages.mdx +74 -0
  240. package/docs/references/asyncapi.mdx +4 -2
  241. package/docs/references/graphql.mdx +14 -2
  242. package/docs/references/meta.ts +1 -1
  243. package/docs/references/openapi.mdx +148 -7
  244. package/docs/references/scalar.mdx +3 -1
  245. package/package.json +43 -8
  246. package/skills/blume/SKILL.md +3 -0
  247. package/skills/blume-migrate/SKILL.md +6 -6
  248. package/skills/blume-migrate/references/docusaurus.md +7 -7
  249. package/skills/blume-migrate/references/fumadocs.md +17 -13
  250. package/skills/blume-migrate/references/mintlify.md +37 -19
  251. package/skills/blume-migrate/references/nextra.md +10 -7
  252. package/skills/blume-migrate/references/starlight.md +11 -8
  253. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +60 -14
  254. package/skills/blume-write-skill/SKILL.md +82 -0
  255. package/src/ai/agent-readability.ts +2 -1
  256. package/src/ai/agent-surface.ts +9 -7
  257. package/src/ai/ai-catalog.ts +6 -3
  258. package/src/ai/ask-context.ts +103 -20
  259. package/src/ai/ask-data.ts +6 -0
  260. package/src/ai/ask-limits.ts +13 -0
  261. package/src/ai/ask-tools.ts +142 -0
  262. package/src/ai/ask.ts +354 -76
  263. package/src/ai/changelog-markdown.ts +11 -6
  264. package/src/ai/component-markdown.ts +76 -1
  265. package/src/ai/cors.ts +14 -3
  266. package/src/ai/index.ts +12 -0
  267. package/src/ai/llms.ts +6 -2
  268. package/src/ai/markdown.ts +2 -1
  269. package/src/ai/mcp/data.ts +6 -0
  270. package/src/ai/mcp/query.ts +14 -6
  271. package/src/ai/openapi-components.ts +36 -6
  272. package/src/ai/relative-links.ts +4 -38
  273. package/src/ai/site-skill.ts +274 -0
  274. package/src/ai/skills.ts +35 -2
  275. package/src/ai/write-skill.ts +97 -0
  276. package/src/astro/generate.ts +210 -66
  277. package/src/astro/index.ts +1 -0
  278. package/src/astro/integration.ts +42 -4
  279. package/src/astro/markdown-negotiation.ts +3 -0
  280. package/src/astro/module-types.ts +9 -1
  281. package/src/astro/pages.ts +23 -0
  282. package/src/astro/templates.ts +406 -108
  283. package/src/astro/variables.ts +31 -0
  284. package/src/audit/catalog.ts +38 -3
  285. package/src/audit/checks/contrast.ts +183 -0
  286. package/src/audit/checks/i18n.ts +2 -3
  287. package/src/audit/checks/indexability.ts +2 -3
  288. package/src/audit/checks/links.ts +19 -13
  289. package/src/audit/checks/network.ts +110 -6
  290. package/src/audit/checks/redirects.ts +6 -4
  291. package/src/audit/checks/robots.ts +58 -2
  292. package/src/audit/checks/sitemap.ts +2 -3
  293. package/src/audit/redirects.ts +46 -15
  294. package/src/audit/run.ts +5 -0
  295. package/src/audit/types.ts +4 -1
  296. package/src/audit/url.ts +14 -5
  297. package/src/blume-modules.d.ts +12 -1
  298. package/src/captcha/client.ts +152 -0
  299. package/src/captcha/hcaptcha.ts +36 -0
  300. package/src/captcha/index.ts +28 -0
  301. package/src/captcha/schema.ts +32 -0
  302. package/src/captcha/turnstile.ts +38 -0
  303. package/src/captcha/verify.ts +71 -0
  304. package/src/cli/args.ts +51 -0
  305. package/src/cli/build-failure.ts +23 -0
  306. package/src/cli/command-meta.ts +5 -0
  307. package/src/cli/commands/audit.ts +10 -1
  308. package/src/cli/commands/dev.ts +18 -2
  309. package/src/cli/commands/doctor.ts +67 -28
  310. package/src/cli/commands/eval.ts +36 -4
  311. package/src/cli/commands/init.ts +6 -4
  312. package/src/cli/commands/skill.ts +96 -0
  313. package/src/cli/commands/validate.ts +10 -1
  314. package/src/cli/index.ts +5 -0
  315. package/src/cli/init/scaffold.ts +3 -3
  316. package/src/cli/prepare.ts +6 -3
  317. package/src/cli/required-secrets.ts +72 -30
  318. package/src/components/BlumePage.astro +2 -0
  319. package/src/components/content/ApiEndpoint.astro +18 -0
  320. package/src/components/content/ApiField.astro +79 -0
  321. package/src/components/content/ApiPlayground.astro +66 -0
  322. package/src/components/content/ApiRail.astro +19 -0
  323. package/src/components/content/Color.astro +1 -0
  324. package/src/components/content/FileTree.astro +1 -0
  325. package/src/components/content/GithubInfo.astro +1 -0
  326. package/src/components/content/Panel.astro +1 -0
  327. package/src/components/content/ParamField.astro +25 -0
  328. package/src/components/content/RequestExample.astro +17 -0
  329. package/src/components/content/ResponseExample.astro +17 -0
  330. package/src/components/content/ResponseField.astro +32 -0
  331. package/src/components/content/Step.astro +1 -0
  332. package/src/components/content/Tile.astro +1 -0
  333. package/src/components/content/Tooltip.astro +1 -0
  334. package/src/components/content/Tree.astro +1 -0
  335. package/src/components/content/TypeTable.astro +4 -1
  336. package/src/components/content/View.astro +21 -0
  337. package/src/components/content/ViewSwitcher.astro +168 -0
  338. package/src/components/content/api-field.ts +103 -0
  339. package/src/components/content/api-page.ts +248 -0
  340. package/src/components/content/mermaid-element.ts +15 -1
  341. package/src/components/content/view-switcher.ts +71 -0
  342. package/src/components/index.ts +2 -0
  343. package/src/components/islands/Assistant.astro +10 -1
  344. package/src/components/islands/assistant.tsx +104 -14
  345. package/src/components/islands/code-question.ts +62 -0
  346. package/src/components/islands/hooks.ts +136 -21
  347. package/src/components/islands/support-link.ts +68 -0
  348. package/src/components/layout/Analytics.astro +11 -2
  349. package/src/components/layout/Banner.astro +14 -10
  350. package/src/components/layout/Breadcrumbs.astro +6 -2
  351. package/src/components/layout/ConsentBanner.astro +62 -0
  352. package/src/components/layout/ConsentHead.astro +38 -0
  353. package/src/components/layout/Directory.astro +94 -0
  354. package/src/components/layout/DrawerSwitchers.astro +51 -0
  355. package/src/components/layout/Empty.astro +2 -2
  356. package/src/components/layout/Header.astro +122 -80
  357. package/src/components/layout/LanguageSwitcher.astro +48 -15
  358. package/src/components/layout/NarrationPlayer.astro +1085 -0
  359. package/src/components/layout/NavSelector.astro +33 -7
  360. package/src/components/layout/PageActions.astro +139 -24
  361. package/src/components/layout/PageFeedback.astro +54 -49
  362. package/src/components/layout/PageLayout.astro +71 -3
  363. package/src/components/layout/ReferenceLayout.astro +17 -6
  364. package/src/components/layout/RelatedPages.astro +42 -0
  365. package/src/components/layout/RootLayout.astro +318 -47
  366. package/src/components/layout/Search.astro +47 -19
  367. package/src/components/layout/SiteFooter.astro +124 -0
  368. package/src/components/layout/SiteMetatags.astro +16 -0
  369. package/src/components/layout/TableOfContents.astro +24 -17
  370. package/src/components/layout/consent/native.ts +79 -0
  371. package/src/components/layout/consent/types.ts +37 -0
  372. package/src/components/layout/footer-links.ts +53 -0
  373. package/src/components/layout/footer-socials.ts +87 -0
  374. package/src/components/layout/head-scripts.ts +6 -1
  375. package/src/components/layout/locale-redirect.ts +107 -0
  376. package/src/components/layout/nav-utils.ts +83 -0
  377. package/src/components/layout/page-feedback.ts +96 -0
  378. package/src/components/layout/search/algolia.ts +10 -1
  379. package/src/components/layout/search/analytics.ts +126 -0
  380. package/src/components/layout/search/endpoint.ts +48 -5
  381. package/src/components/layout/search/flexsearch.ts +17 -5
  382. package/src/components/layout/search/orama-cloud.ts +26 -14
  383. package/src/components/layout/search/pagefind.ts +114 -5
  384. package/src/components/layout/search/types.ts +32 -0
  385. package/src/components/layout/search/typesense.ts +19 -3
  386. package/src/components/openapi/AsyncApiOperation.astro +14 -7
  387. package/src/components/openapi/Authorization.astro +10 -0
  388. package/src/components/openapi/GraphqlOperation.astro +5 -0
  389. package/src/components/openapi/Operation.astro +184 -13
  390. package/src/components/openapi/ParametersTable.astro +8 -4
  391. package/src/components/openapi/Playground.astro +7 -1
  392. package/src/components/openapi/RequestBody.astro +24 -5
  393. package/src/components/openapi/RequestPanel.astro +59 -7
  394. package/src/components/openapi/Responses.astro +7 -4
  395. package/src/components/openapi/SchemaTable.astro +15 -3
  396. package/src/components/openapi/async-snippets.ts +65 -9
  397. package/src/components/openapi/async.ts +123 -29
  398. package/src/components/openapi/code-samples.ts +97 -0
  399. package/src/components/openapi/graphql-helpers.ts +35 -12
  400. package/src/components/openapi/helpers.ts +36 -2
  401. package/src/components/openapi/message-model.ts +54 -11
  402. package/src/components/openapi/message.ts +14 -4
  403. package/src/components/openapi/operation-model.ts +16 -7
  404. package/src/components/openapi/playground-client.ts +24 -5
  405. package/src/components/openapi/playground-schema.ts +1 -1
  406. package/src/components/openapi/schema-tree.ts +44 -14
  407. package/src/components/openapi/security.ts +16 -3
  408. package/src/components/openapi/snippets.ts +873 -10
  409. package/src/components/openapi/validate-json.ts +4 -3
  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/builtin-tags.ts +5 -0
  421. package/src/core/changelog-index.ts +31 -1
  422. package/src/core/client-address.ts +19 -0
  423. package/src/core/component-diagnostics.ts +53 -0
  424. package/src/core/component-overrides.ts +32 -0
  425. package/src/core/config-input.ts +225 -23
  426. package/src/core/data.ts +46 -4
  427. package/src/core/diagnostics.ts +8 -2
  428. package/src/core/footer.ts +26 -0
  429. package/src/core/graph.ts +39 -36
  430. package/src/core/i18n-ui.ts +84 -2
  431. package/src/core/includes.ts +21 -4
  432. package/src/core/links.ts +63 -19
  433. package/src/core/localizable.ts +26 -0
  434. package/src/core/navigation.ts +43 -12
  435. package/src/core/page-modes.ts +56 -0
  436. package/src/core/probe.ts +26 -6
  437. package/src/core/project-graph.ts +163 -16
  438. package/src/core/redirect-patterns.ts +520 -0
  439. package/src/core/related.ts +131 -0
  440. package/src/core/schema.ts +339 -66
  441. package/src/core/sources/cache.ts +6 -0
  442. package/src/core/sources/contentful-rich-text.ts +29 -6
  443. package/src/core/sources/contentful.ts +135 -25
  444. package/src/core/sources/filesystem.ts +26 -4
  445. package/src/core/sources/github-releases.ts +12 -1
  446. package/src/core/sources/lexical.ts +15 -10
  447. package/src/core/sources/mdx-remote.ts +62 -10
  448. package/src/core/sources/normalize.ts +228 -41
  449. package/src/core/sources/notion.ts +7 -1
  450. package/src/core/sources/obsidian.ts +16 -3
  451. package/src/core/sources/payload.ts +38 -15
  452. package/src/core/sources/read.ts +8 -3
  453. package/src/core/sources/remote.ts +72 -15
  454. package/src/core/sources/resolve.ts +11 -1
  455. package/src/core/sources/sanity.ts +43 -25
  456. package/src/core/sources/strapi.ts +2 -2
  457. package/src/core/types.ts +19 -1
  458. package/src/core/ui-packs/ar.ts +44 -0
  459. package/src/core/ui-packs/bg.ts +46 -0
  460. package/src/core/ui-packs/bn.ts +44 -0
  461. package/src/core/ui-packs/ca.ts +47 -0
  462. package/src/core/ui-packs/cs.ts +45 -0
  463. package/src/core/ui-packs/da.ts +46 -0
  464. package/src/core/ui-packs/de.ts +47 -0
  465. package/src/core/ui-packs/el.ts +46 -0
  466. package/src/core/ui-packs/es.ts +47 -0
  467. package/src/core/ui-packs/fa.ts +46 -0
  468. package/src/core/ui-packs/fi.ts +46 -0
  469. package/src/core/ui-packs/fr.ts +47 -0
  470. package/src/core/ui-packs/he.ts +44 -0
  471. package/src/core/ui-packs/hi.ts +45 -0
  472. package/src/core/ui-packs/hr.ts +46 -0
  473. package/src/core/ui-packs/hu.ts +45 -0
  474. package/src/core/ui-packs/id.ts +46 -0
  475. package/src/core/ui-packs/it.ts +46 -0
  476. package/src/core/ui-packs/ja.ts +46 -0
  477. package/src/core/ui-packs/ko.ts +45 -0
  478. package/src/core/ui-packs/nl.ts +47 -0
  479. package/src/core/ui-packs/no.ts +45 -0
  480. package/src/core/ui-packs/pl.ts +46 -0
  481. package/src/core/ui-packs/pt-br.ts +47 -0
  482. package/src/core/ui-packs/pt.ts +46 -0
  483. package/src/core/ui-packs/ro.ts +46 -0
  484. package/src/core/ui-packs/ru.ts +46 -0
  485. package/src/core/ui-packs/sk.ts +45 -0
  486. package/src/core/ui-packs/sr.ts +46 -0
  487. package/src/core/ui-packs/sv.ts +45 -0
  488. package/src/core/ui-packs/th.ts +44 -0
  489. package/src/core/ui-packs/tr.ts +46 -0
  490. package/src/core/ui-packs/uk.ts +46 -0
  491. package/src/core/ui-packs/vi.ts +46 -0
  492. package/src/core/ui-packs/zh-tw.ts +44 -0
  493. package/src/core/ui-packs/zh.ts +44 -0
  494. package/src/core/variables.ts +103 -0
  495. package/src/deploy/adapter-output.ts +7 -2
  496. package/src/deploy/adapters/cloudflare.ts +7 -5
  497. package/src/deploy/adapters/node.ts +47 -9
  498. package/src/deploy/adapters/types.ts +7 -3
  499. package/src/deploy/artifacts.ts +79 -9
  500. package/src/deploy/cloudflare-negotiation.ts +35 -5
  501. package/src/deploy/headers.ts +2 -1
  502. package/src/deploy/node-headers.ts +63 -9
  503. package/src/deploy/platforms/cloudflare.ts +45 -9
  504. package/src/deploy/platforms/netlify.ts +35 -2
  505. package/src/deploy/platforms/node.ts +12 -2
  506. package/src/deploy/platforms/types.ts +21 -7
  507. package/src/deploy/platforms/vercel.ts +149 -17
  508. package/src/deploy/redirects.ts +151 -24
  509. package/src/deploy/rss.ts +3 -1
  510. package/src/deploy/sitemap.ts +39 -5
  511. package/src/deploy/vercel-negotiation.ts +326 -102
  512. package/src/eval/agents.ts +18 -1
  513. package/src/eval/prompts.ts +6 -3
  514. package/src/eval/report.ts +34 -13
  515. package/src/eval/run.ts +5 -0
  516. package/src/markdown/api-rail.ts +259 -0
  517. package/src/markdown/code-title.ts +35 -9
  518. package/src/markdown/features.ts +3 -2
  519. package/src/markdown/fence-meta.ts +2 -0
  520. package/src/markdown/include.ts +11 -1
  521. package/src/markdown/index.ts +28 -5
  522. package/src/markdown/math.ts +4 -4
  523. package/src/markdown/relative-links.ts +3 -2
  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 +7 -6
  531. package/src/openapi/checks.ts +273 -0
  532. package/src/openapi/graphql-build.ts +21 -0
  533. package/src/openapi/graphql.ts +11 -0
  534. package/src/openapi/model.ts +72 -27
  535. package/src/openapi/overlay.ts +256 -0
  536. package/src/openapi/parse.ts +182 -4
  537. package/src/openapi/references.ts +64 -8
  538. package/src/openapi/render-mdx.ts +5 -1
  539. package/src/openapi/scalar.ts +40 -6
  540. package/src/openapi/source.ts +40 -15
  541. package/src/ratelimit/cloudflare.ts +54 -0
  542. package/src/ratelimit/index.ts +30 -0
  543. package/src/ratelimit/memory.ts +45 -0
  544. package/src/ratelimit/runtime.ts +247 -0
  545. package/src/ratelimit/schema.ts +28 -0
  546. package/src/ratelimit/upstash.ts +60 -0
  547. package/src/ratelimit/wrangler.ts +70 -0
  548. package/src/reference/asyncapi.ts +2 -2
  549. package/src/reference/graphql.ts +20 -3
  550. package/src/reference/index.ts +1 -0
  551. package/src/reference/openapi.ts +21 -7
  552. package/src/reference/options.ts +80 -8
  553. package/src/reference/scalar.ts +33 -8
  554. package/src/registry/eject.ts +23 -5
  555. package/src/registry/registry.ts +7 -0
  556. package/src/search/adapters/locale-scope.ts +30 -0
  557. package/src/search/adapters/typesense.ts +14 -4
  558. package/src/search/build.ts +21 -3
  559. package/src/search/documents.ts +26 -2
  560. package/src/search/orama-index.ts +191 -34
  561. package/src/search/pagefind-ranking.ts +39 -0
  562. package/src/search/source-pages.ts +29 -0
  563. package/src/search/sync/algolia.ts +111 -10
  564. package/src/search/sync/index.ts +52 -13
  565. package/src/search/sync/orama-cloud.ts +3 -0
  566. package/src/search/sync/typesense.ts +76 -26
  567. package/src/seo/metatags.ts +67 -0
  568. package/src/sources/contentful.ts +12 -0
  569. package/src/sources/github-releases.ts +7 -1
  570. package/src/sources/shared.ts +3 -0
  571. package/src/theme/chrome-icons.ts +1 -0
  572. package/src/theme/color.ts +500 -0
  573. package/src/theme/entry.ts +85 -6
  574. package/src/theme/palette.ts +121 -45
  575. package/src/translate/prompts.ts +1 -0
  576. package/src/translate/validate.ts +31 -3
  577. package/src/upgrade/upgrade.ts +4 -171
  578. package/dist/cli/chunk-1d7ve1dm.js.map +0 -12
  579. package/dist/cli/chunk-2hsdwb9n.js.map +0 -10
  580. package/dist/cli/chunk-35d4wj9f.js.map +0 -15
  581. package/dist/cli/chunk-364znk6q.js +0 -75
  582. package/dist/cli/chunk-364znk6q.js.map +0 -11
  583. package/dist/cli/chunk-5m5nmvyq.js.map +0 -13
  584. package/dist/cli/chunk-8ktnccpt.js.map +0 -10
  585. package/dist/cli/chunk-9t7a85s3.js.map +0 -10
  586. package/dist/cli/chunk-b07cmahc.js +0 -145
  587. package/dist/cli/chunk-b07cmahc.js.map +0 -11
  588. package/dist/cli/chunk-c8chx29p.js.map +0 -36
  589. package/dist/cli/chunk-e04dxsz1.js +0 -39
  590. package/dist/cli/chunk-e04dxsz1.js.map +0 -10
  591. package/dist/cli/chunk-j85vccga.js.map +0 -36
  592. package/dist/cli/chunk-p3v96n38.js.map +0 -10
  593. package/dist/cli/chunk-pehfxfta.js.map +0 -10
  594. package/dist/cli/chunk-pv29h0wf.js.map +0 -190
  595. package/dist/cli/chunk-q58y5e6a.js.map +0 -10
  596. package/dist/cli/chunk-vg9r4eb9.js.map +0 -14
  597. package/dist/cli/chunk-wrr3j9w9.js.map +0 -35
  598. package/dist/cli/chunk-yfyb25rh.js.map +0 -14
  599. package/docs/content/sources.mdx +0 -334
  600. /package/dist/cli/{chunk-tkacnehg.js.map → chunk-3v3ffbrj.js.map} +0 -0
  601. /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-8y2kmjv8.js.map} +0 -0
  602. /package/dist/cli/{chunk-2eytanqx.js.map → chunk-c887fj0s.js.map} +0 -0
  603. /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-dzwehpy7.js.map} +0 -0
  604. /package/dist/cli/{chunk-2z928egk.js.map → chunk-ft9vfys6.js.map} +0 -0
  605. /package/dist/cli/{chunk-a58773jm.js.map → chunk-kma9f6sf.js.map} +0 -0
  606. /package/dist/cli/{chunk-crgn1q09.js.map → chunk-sds923fa.js.map} +0 -0
  607. /package/dist/cli/{chunk-acanzt5p.js.map → chunk-tdqhyxfz.js.map} +0 -0
@@ -1,6 +1,7 @@
1
1
  import { markdownTable } from "markdown-table";
2
2
  import { mdxToMdast } from "satteri";
3
3
 
4
+ import { PARAM_LOCATIONS } from "../components/content/api-field.ts";
4
5
  import { parseYouTubeId } from "../components/content/youtube.ts";
5
6
  import type { ExampleLookup } from "../core/types.ts";
6
7
  import { MDX_FEATURES } from "../markdown/features.ts";
@@ -398,6 +399,18 @@ const tabs: ComponentMarkdown = ({ childComponents, children }) => {
398
399
  .join("\n\n");
399
400
  };
400
401
 
402
+ /**
403
+ * A `<View>` block: its content under its view's name, so an agent reading
404
+ * the Markdown sees every view and which one each part belongs to.
405
+ */
406
+ const view: ComponentMarkdown = ({ children, props }) => {
407
+ const title = isString(props.title) && props.title !== "" ? props.title : "";
408
+ if (!title) {
409
+ return children;
410
+ }
411
+ return children ? `**${title}**\n\n${children}` : `**${title}**`;
412
+ };
413
+
401
414
  /** Escape the brackets that would end a link's text early. */
402
415
  const linkText = (value: string): string =>
403
416
  value.replaceAll(/[[\]]/gu, String.raw`\$&`);
@@ -420,6 +433,63 @@ const textProp = (value: EvaluatedValue): string => {
420
433
  return isNumber(value) ? String(value) : "";
421
434
  };
422
435
 
436
+ /** Whether a flag prop is on: shorthand `true`, or the string `"true"`. */
437
+ const flagOn = (value: EvaluatedValue): boolean =>
438
+ value === true || value === "true";
439
+
440
+ /** A prop that holds one label or several. */
441
+ const labelList = (value: EvaluatedValue): string[] =>
442
+ (Array.isArray(value) ? value : [value]).map(textProp).filter(Boolean);
443
+
444
+ /**
445
+ * One `<ParamField>` or `<ResponseField>` as a list item: its labels, name,
446
+ * location, type, flags, and default on the first line, joined with middle
447
+ * dots, and its description indented under it, nested fields included. A
448
+ * field with no name, or a prop that wouldn't evaluate, declines.
449
+ */
450
+ const apiField = (
451
+ { children, lossy, props }: ComponentMarkdownContext,
452
+ name: string,
453
+ location?: string
454
+ ): string | null => {
455
+ if (lossy || name === "") {
456
+ return null;
457
+ }
458
+ const value = props.default;
459
+ const head = [
460
+ ...labelList(props.pre),
461
+ `**${cellCode(name)}**`,
462
+ ...labelList(props.post),
463
+ location,
464
+ textProp(props.type) && cellCode(props.type),
465
+ flagOn(props.required) ? "required" : "",
466
+ flagOn(props.deprecated) ? "deprecated" : "",
467
+ value === undefined || value === null || value === ""
468
+ ? ""
469
+ : `default ${cellCode(isString(value) ? value : JSON.stringify(value))}`,
470
+ ].filter(Boolean);
471
+ const item = `- ${head.join(" · ")}`;
472
+ if (!children) {
473
+ return item;
474
+ }
475
+ const body = children
476
+ .split("\n")
477
+ .map((line) => (line === "" ? "" : ` ${line}`))
478
+ .join("\n");
479
+ return `${item}\n\n${body}`;
480
+ };
481
+
482
+ /** `<ParamField query="limit">`: named by its location attribute, else `name`. */
483
+ const paramFieldMarkdown: ComponentMarkdown = (context) => {
484
+ const location = PARAM_LOCATIONS.find((key) => isString(context.props[key]));
485
+ return location
486
+ ? apiField(context, textProp(context.props[location]), location)
487
+ : apiField(context, textProp(context.props.name));
488
+ };
489
+
490
+ const responseFieldMarkdown: ComponentMarkdown = (context) =>
491
+ apiField(context, textProp(context.props.name));
492
+
423
493
  /**
424
494
  * A card is a link with a blurb, so that is what it becomes: the title as the
425
495
  * link text, the body under it, and the call to action last — the order the
@@ -514,7 +584,7 @@ export const inlineCode = (text: string): string => {
514
584
  };
515
585
 
516
586
  /** Fence `code` so its opening/closing run outlengths any backticks inside. */
517
- const fencedBlock = (lang: string, code: string): string => {
587
+ export const fencedBlock = (lang: string, code: string): string => {
518
588
  const trimmed = code.replace(/(?<!\n)\n+$/u, "");
519
589
  const runs = trimmed.match(/`+/gu);
520
590
  const longest = runs ? Math.max(...runs.map((run) => run.length)) : 0;
@@ -822,7 +892,11 @@ const SERIALIZERS = {
822
892
  Icon: icon,
823
893
  Math: math,
824
894
  Panel: panel,
895
+ ParamField: paramFieldMarkdown,
825
896
  Prompt: prompt,
897
+ RequestExample: cardGroup,
898
+ ResponseExample: cardGroup,
899
+ ResponseField: responseFieldMarkdown,
826
900
  Steps: steps,
827
901
  Tabs: tabs,
828
902
  Tile: tile,
@@ -832,6 +906,7 @@ const SERIALIZERS = {
832
906
  "Tree.Folder": treeFolder,
833
907
  TypeTable: typeTable,
834
908
  Update: update,
909
+ View: view,
835
910
  YouTube: youtube,
836
911
  } satisfies Record<string, ComponentMarkdown>;
837
912
 
package/src/ai/cors.ts CHANGED
@@ -61,9 +61,18 @@ export const preflightResponse = (
61
61
 
62
62
  /** The slice of Astro's `APIContext` the wrapped handler reads. */
63
63
  interface RequestContext {
64
+ /** The reader's address, which the route's rate limit keys on. */
65
+ readonly clientAddress?: string;
64
66
  request: Request;
65
67
  }
66
68
 
69
+ /**
70
+ * The response headers a cross-origin caller may read beyond the safelisted
71
+ * ones: the rate limit's `Retry-After`, so a caller can tell a reader how
72
+ * long to wait after a `429`.
73
+ */
74
+ const EXPOSED_HEADERS = "retry-after";
75
+
67
76
  /** Stamp the CORS headers on every response `handler` returns. */
68
77
  export const withCors =
69
78
  (
@@ -72,9 +81,8 @@ export const withCors =
72
81
  ): ((context: RequestContext) => Promise<Response>) =>
73
82
  async (context) => {
74
83
  const response = await handler(context);
75
- for (const [key, value] of Object.entries(
76
- corsHeaders(context.request, allowed)
77
- )) {
84
+ const headers = corsHeaders(context.request, allowed);
85
+ for (const [key, value] of Object.entries(headers)) {
78
86
  // `Vary` accumulates (the handler may already vary on something), the
79
87
  // rest replace.
80
88
  if (key === "vary") {
@@ -83,5 +91,8 @@ export const withCors =
83
91
  response.headers.set(key, value);
84
92
  }
85
93
  }
94
+ if (headers["access-control-allow-origin"]) {
95
+ response.headers.set("access-control-expose-headers", EXPOSED_HEADERS);
96
+ }
86
97
  return response;
87
98
  };
package/src/ai/index.ts CHANGED
@@ -20,23 +20,35 @@
20
20
  * nothing here runs at request time.
21
21
  */
22
22
  export {
23
+ anthropic,
23
24
  gateway,
25
+ gemini,
26
+ grok,
24
27
  inkeep,
25
28
  llmgateway,
29
+ openai,
26
30
  openaiCompatible,
27
31
  openrouter,
28
32
  } from "./ask.ts";
29
33
  export type {
30
34
  AssistantAdapter,
31
35
  AssistantAdapterOptions,
36
+ AssistantAnthropicAdapter,
37
+ AssistantAnthropicOptions,
32
38
  AssistantGatewayAdapter,
33
39
  AssistantGatewayOptions,
40
+ AssistantGeminiAdapter,
41
+ AssistantGeminiOptions,
42
+ AssistantGrokAdapter,
43
+ AssistantGrokOptions,
34
44
  AssistantInkeepAdapter,
35
45
  AssistantInkeepOptions,
36
46
  AssistantLlmGatewayAdapter,
37
47
  AssistantLlmGatewayOptions,
48
+ AssistantOpenAIAdapter,
38
49
  AssistantOpenAICompatibleAdapter,
39
50
  AssistantOpenAICompatibleOptions,
51
+ AssistantOpenAIOptions,
40
52
  AssistantOpenRouterAdapter,
41
53
  AssistantOpenRouterOptions,
42
54
  AssistantProviderOptions,
package/src/ai/llms.ts CHANGED
@@ -12,7 +12,11 @@ import { API_PAGES_PATH, OPENAPI_PATH } from "./api/paths.ts";
12
12
  import { downlevelComponents } from "./component-markdown.ts";
13
13
  import { relativeLinkRewriter } from "./relative-links.ts";
14
14
  import { projectComponentSerializers } from "./serializers.ts";
15
- import { AGENT_SKILLS_DIR, AGENT_SKILLS_INDEX_PATH } from "./skills.ts";
15
+ import {
16
+ AGENT_SKILLS_DIR,
17
+ AGENT_SKILLS_INDEX_PATH,
18
+ servesSkillsIndex,
19
+ } from "./skills.ts";
16
20
  import type { SkillArtifact } from "./skills.ts";
17
21
  import { applyAgentVisibility } from "./visibility.ts";
18
22
 
@@ -75,7 +79,7 @@ const agentResourceLines = (project: BlumeProject): string[] => {
75
79
  `- [MCP server](${url(config.agents.mcp.route)}): Streamable HTTP Model Context Protocol server with search_docs, get_page, list_pages, and get_navigation tools, plus every page as a resource. Discovery document: ${url("/.well-known/mcp.json")}`
76
80
  );
77
81
  }
78
- if (config.agents.skills) {
82
+ if (servesSkillsIndex(config)) {
79
83
  lines.push(
80
84
  `- [Agent skills](${url(AGENT_SKILLS_INDEX_PATH)}): Agent Skills discovery index of the skills this site publishes.`
81
85
  );
@@ -14,6 +14,7 @@ import { downlevelComponents } from "./component-markdown.ts";
14
14
  import { buildLlmsIndex } from "./llms.ts";
15
15
  import { relativeLinkRewriter } from "./relative-links.ts";
16
16
  import { projectComponentSerializers } from "./serializers.ts";
17
+ import { servesSkillsIndex } from "./skills.ts";
17
18
  import { applyAgentVisibility } from "./visibility.ts";
18
19
 
19
20
  /** One route's raw-Markdown variants. */
@@ -115,7 +116,7 @@ export const buildRawMarkdown = async (
115
116
  config: advertisedConfig(project.config, {
116
117
  mcp: servesMcp(project, userPages),
117
118
  // Skills are collected at the end of the build, after this runs.
118
- skills: Boolean(project.config.agents.skills),
119
+ skills: servesSkillsIndex(project.config),
119
120
  }),
120
121
  }),
121
122
  };
@@ -130,6 +130,12 @@ export const buildMcpData = async (project: BlumeProject): Promise<McpData> => {
130
130
  if (doc.facets) {
131
131
  document.facets = doc.facets;
132
132
  }
133
+ if (doc.boost !== undefined) {
134
+ document.boost = doc.boost;
135
+ }
136
+ if (doc.keywords) {
137
+ document.keywords = doc.keywords;
138
+ }
133
139
  return document;
134
140
  }),
135
141
  instructions: config.agents.mcp.instructions,
@@ -53,20 +53,28 @@ const contentTypesField = z.preprocess((value) => {
53
53
  }, z.array(z.string()).optional().describe('Only include pages of these content types (frontmatter `type`, e.g. `["doc", "rfc"]`). `list_pages` shows each page\'s type. Omit to include every type.'));
54
54
 
55
55
  /**
56
- * The optional facet filter `search_docs` and `list_pages` share. Only
57
- * string-valued entries survive; an empty `{}` means "no filter".
56
+ * The optional facet filter `search_docs` and `list_pages` share. A value
57
+ * is read the way `pageFacets` stores one: a string as-is, a number or
58
+ * boolean stringified (`{"priority": 1}` matches the facet `"1"`). Entries of
59
+ * any other shape are dropped; an empty `{}` means "no filter".
58
60
  */
59
- /** Accepts any plain object, so the string-valued entries can be sifted out. */
61
+ /** Accepts any plain object, so the usable entries can be sifted out. */
60
62
  const looseFacetObject = z.record(z.string(), z.unknown());
61
63
 
64
+ /** A filter value a facet can hold, stringified like `pageFacets` does. */
65
+ const facetFilterValue = z
66
+ .union([z.string(), z.number(), z.boolean()])
67
+ .transform(String);
68
+
62
69
  const filtersField = z.preprocess((value) => {
63
70
  const candidate = looseFacetObject.safeParse(value);
64
71
  if (!candidate.success) {
65
72
  return;
66
73
  }
67
- const entries = Object.entries(candidate.data).filter(
68
- (entry): entry is [string, string] => typeof entry[1] === "string"
69
- );
74
+ const entries = Object.entries(candidate.data).flatMap(([key, entry]) => {
75
+ const parsed = facetFilterValue.safeParse(entry);
76
+ return parsed.success ? [[key, parsed.data] as const] : [];
77
+ });
70
78
  return entries.length > 0 ? Object.fromEntries(entries) : undefined;
71
79
  }, z.record(z.string(), z.string()).optional().describe('Only include pages matching every facet, key → required value (e.g. `{"status": "enforced"}`). Facets are metadata the site declares per content type; `list_pages` shows each page\'s facet values. Omit for no facet filtering.'));
72
80
 
@@ -1,13 +1,24 @@
1
+ import { customCodeSamples } from "../components/openapi/code-samples.ts";
1
2
  import { mountBasePath, normalizeBasePath } from "../core/base-path.ts";
2
3
  import type { ApiOperationRef, OpenApiData } from "../openapi/model.ts";
3
- import { operationOf, specAddresses, specOf } from "../openapi/model.ts";
4
+ import {
5
+ operationObject,
6
+ operationOf,
7
+ specAddresses,
8
+ specOf,
9
+ } from "../openapi/model.ts";
4
10
  import { asSentence } from "../openapi/sentence.ts";
5
11
  import { operationSignature } from "../openapi/signature.ts";
6
12
  import type {
7
13
  ComponentMarkdown,
8
14
  EvaluatedValue,
9
15
  } from "./component-markdown.ts";
10
- import { inlineCode, isString, linkDestination } from "./component-markdown.ts";
16
+ import {
17
+ fencedBlock,
18
+ inlineCode,
19
+ isString,
20
+ linkDestination,
21
+ } from "./component-markdown.ts";
11
22
 
12
23
  /**
13
24
  * Spec-authored prose as one line of inline Markdown. Unlike the props the
@@ -62,7 +73,10 @@ const listItem = (
62
73
  * section shows. Parameters, schemas and responses are deliberately left out:
63
74
  * those are `operation-model.ts` plus each component's own preparation, and a
64
75
  * second implementation here would be free to disagree with the page. The
65
- * endpoint and what it does is the part that was missing altogether.
76
+ * endpoint and what it does is the part that was missing altogether. The
77
+ * spec's own `x-codeSamples` do come along, as fenced code: they're text the
78
+ * spec wrote out (often an SDK call no agent could derive from the
79
+ * endpoint), read through the same `customCodeSamples` the page renders.
66
80
  *
67
81
  * `specs` is the parsed `blume:openapi` data — empty when the project has no
68
82
  * API reference, in which case every serializer declines. `deployBase` is the
@@ -134,9 +148,25 @@ export const openapiComponentSerializers = (
134
148
  return null;
135
149
  }
136
150
  const signature = inlineCode(operationSignature(data, operation));
137
- return operation.deprecated
138
- ? `${signature}\n\n**Deprecated.**`
139
- : signature;
151
+ const notes = [
152
+ // An agent reading the page must not take a webhook for an endpoint
153
+ // it can call.
154
+ operation.webhook
155
+ ? "**Webhook.** The API sends this request to your endpoint."
156
+ : "",
157
+ operation.deprecated ? "**Deprecated.**" : "",
158
+ ].filter(Boolean);
159
+ // The spec's own `x-codeSamples`, labeled as their tabs are.
160
+ const object =
161
+ data.kind === "openapi" ? operationObject(data, operation) : undefined;
162
+ const samples = customCodeSamples({
163
+ "x-code-samples": object?.["x-code-samples"],
164
+ "x-codeSamples": object?.["x-codeSamples"],
165
+ }).map(
166
+ (sample) =>
167
+ `**${inlineText(sample.label)}**\n\n${fencedBlock(sample.lang, sample.source)}`
168
+ );
169
+ return [signature, ...notes, ...samples].join("\n\n");
140
170
  },
141
171
  } satisfies Record<string, ComponentMarkdown>;
142
172
  };
@@ -7,8 +7,6 @@ import {
7
7
  withAuthoredBasePath,
8
8
  withBasePath,
9
9
  } from "../core/base-path.ts";
10
- import { nextFenceState } from "../core/code-fences.ts";
11
- import type { FenceState } from "../core/code-fences.ts";
12
10
  import { localePrefix } from "../core/i18n.ts";
13
11
  import {
14
12
  buildFileRouteIndex,
@@ -49,10 +47,6 @@ export interface LinkedPage {
49
47
  /** Rewrite a page's relative page links to the routes they mean. */
50
48
  export type RelativeLinkRewriter = (text: string, page: LinkedPage) => string;
51
49
 
52
- /** A reference definition's target: `[label]: ./install` or `<./install>`. */
53
- const DEFINITION =
54
- /^(?<lead> {0,3}\[(?:[^\]\\]|\\.)+\]:[\t ]*)(?:<(?<angled>[^>]*)>|(?<bare>\S+))/u;
55
-
56
50
  /**
57
51
  * Whether a text could hold a relative page link at all: an inline link, a
58
52
  * reference definition, or a component `href` whose target isn't a URL with
@@ -88,31 +82,13 @@ const spliceLine = (line: string, splices: readonly Splice[]): string => {
88
82
  return out;
89
83
  };
90
84
 
91
- /** One line's reference-definition splice, when it defines a routed target. */
92
- const definitionSplice = (
93
- line: string,
94
- routed: (target: string) => string | undefined
95
- ): Splice | undefined => {
96
- const groups = DEFINITION.exec(line)?.groups;
97
- const lead = groups?.lead;
98
- const target = groups?.angled ?? groups?.bare;
99
- const route = target === undefined ? undefined : routed(target);
100
- if (lead === undefined || target === undefined || route === undefined) {
101
- return undefined;
102
- }
103
- // An angle-bracketed target starts one past its `<`.
104
- const angled = groups?.angled === undefined ? 0 : 1;
105
- return { column: lead.length + angled, length: target.length, text: route };
106
- };
107
-
108
85
  /**
109
- * Every routed splice in `text`, by 0-based line: links and images, then
110
- * definitions. An image target goes through `imaged`, everything else through
111
- * `routed`.
86
+ * Every routed splice in `text`, by 0-based line: links, images, and
87
+ * reference definitions, as `extractLinks` finds them. An image target goes
88
+ * through `imaged`, everything else through `routed`.
112
89
  */
113
90
  const collectSplices = (
114
91
  text: string,
115
- lines: readonly string[],
116
92
  routed: (target: string) => string | undefined,
117
93
  imaged: (target: string) => string | undefined
118
94
  ): Map<number, Splice[]> => {
@@ -130,16 +106,6 @@ const collectSplices = (
130
106
  });
131
107
  }
132
108
  }
133
- let fence: FenceState = null;
134
- for (const [index, line] of lines.entries()) {
135
- const next = nextFenceState(line, fence);
136
- const inFence = fence !== null || next !== null;
137
- fence = next;
138
- const splice = inFence ? undefined : definitionSplice(line, routed);
139
- if (splice !== undefined) {
140
- add(index, splice);
141
- }
142
- }
143
109
  return splices;
144
110
  };
145
111
 
@@ -242,7 +208,7 @@ export const relativeLinkRewriter = (
242
208
  };
243
209
 
244
210
  const lines = text.split("\n");
245
- const splices = collectSplices(text, lines, routed, imaged);
211
+ const splices = collectSplices(text, routed, imaged);
246
212
 
247
213
  return lines
248
214
  .map((line, index) => {