blume 1.7.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +217 -0
  3. package/README.md +34 -21
  4. package/dist/cli/chunk-11j0384y.js +148 -0
  5. package/dist/cli/chunk-11j0384y.js.map +10 -0
  6. package/dist/cli/{chunk-rqy0s5wh.js → chunk-1w8dp3qb.js} +17 -16
  7. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-1w8dp3qb.js.map} +3 -3
  8. package/dist/cli/chunk-2q1dwty4.js +75 -0
  9. package/dist/cli/chunk-2q1dwty4.js.map +11 -0
  10. package/dist/cli/chunk-41za066z.js +122 -0
  11. package/dist/cli/chunk-41za066z.js.map +11 -0
  12. package/dist/cli/chunk-5a2z0198.js +133 -0
  13. package/dist/cli/chunk-5a2z0198.js.map +10 -0
  14. package/dist/cli/{chunk-5g0w1e2c.js → chunk-6k8vp3ta.js} +25 -13
  15. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-6k8vp3ta.js.map} +4 -4
  16. package/dist/cli/{chunk-5qk08vmp.js → chunk-79njf86q.js} +133 -54
  17. package/dist/cli/chunk-79njf86q.js.map +11 -0
  18. package/dist/cli/{chunk-e7f42gdj.js → chunk-7ez8ny0t.js} +2 -2
  19. package/dist/cli/{chunk-nn13znc2.js → chunk-88cpgt6h.js} +1 -1
  20. package/dist/cli/chunk-a9kptbw5.js +361 -0
  21. package/dist/cli/chunk-a9kptbw5.js.map +14 -0
  22. package/dist/cli/chunk-abh8yjkn.js +31 -0
  23. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  24. package/dist/cli/chunk-b5aj94ah.js +91 -0
  25. package/dist/cli/chunk-b5aj94ah.js.map +10 -0
  26. package/dist/cli/{chunk-b27xqwn9.js → chunk-bctazmbk.js} +9 -5
  27. package/dist/cli/chunk-bctazmbk.js.map +10 -0
  28. package/dist/cli/chunk-beat36xx.js +279 -0
  29. package/dist/cli/chunk-beat36xx.js.map +10 -0
  30. package/dist/cli/chunk-bnbmcwfb.js +145 -0
  31. package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
  32. package/dist/cli/{chunk-0xjyb285.js → chunk-bw22s759.js} +15 -5
  33. package/dist/cli/{chunk-0xjyb285.js.map → chunk-bw22s759.js.map} +4 -4
  34. package/dist/cli/chunk-by2290sx.js +39 -0
  35. package/dist/cli/chunk-by2290sx.js.map +10 -0
  36. package/dist/cli/chunk-d1tadaw7.js +79 -0
  37. package/dist/cli/chunk-d1tadaw7.js.map +10 -0
  38. package/dist/cli/{chunk-ahnw3kxw.js → chunk-d80hr03s.js} +24 -19
  39. package/dist/cli/chunk-d80hr03s.js.map +15 -0
  40. package/dist/cli/chunk-ernrthtr.js +97 -0
  41. package/dist/cli/chunk-ernrthtr.js.map +10 -0
  42. package/dist/cli/chunk-f2972sbt.js +374 -0
  43. package/dist/cli/chunk-f2972sbt.js.map +10 -0
  44. package/dist/cli/{chunk-vacwm2hv.js → chunk-f7t03s3g.js} +2 -2
  45. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  46. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  47. package/dist/cli/{chunk-cjtn640a.js → chunk-fh5hj5jt.js} +43 -20
  48. package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
  49. package/dist/cli/{chunk-yg63d42r.js → chunk-j8mw0za6.js} +86 -57
  50. package/dist/cli/chunk-j8mw0za6.js.map +35 -0
  51. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  52. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  53. package/dist/cli/{chunk-ps4m1xh4.js → chunk-mnqj32sj.js} +505 -542
  54. package/dist/cli/chunk-mnqj32sj.js.map +12 -0
  55. package/dist/cli/{chunk-8cjtbafj.js → chunk-mwt1k8n7.js} +100 -374
  56. package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
  57. package/dist/cli/chunk-nk3ts2xk.js +51 -0
  58. package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
  59. package/dist/cli/{chunk-3r45185y.js → chunk-pat2zzwc.js} +9 -11
  60. package/dist/cli/{chunk-3r45185y.js.map → chunk-pat2zzwc.js.map} +2 -2
  61. package/dist/cli/chunk-pnnvybbk.js +176 -0
  62. package/dist/cli/chunk-pnnvybbk.js.map +11 -0
  63. package/dist/cli/{chunk-4x36ddpw.js → chunk-sqn5t4q0.js} +81 -87
  64. package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
  65. package/dist/cli/{chunk-bvwwhd84.js → chunk-tzne8qfq.js} +15 -15
  66. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-tzne8qfq.js.map} +1 -1
  67. package/dist/cli/chunk-xaz13gwg.js +12449 -0
  68. package/dist/cli/chunk-xaz13gwg.js.map +182 -0
  69. package/dist/cli/chunk-y3e45rc8.js +102 -0
  70. package/dist/cli/chunk-y3e45rc8.js.map +10 -0
  71. package/dist/cli/chunk-z01ze5c1.js +261 -0
  72. package/dist/cli/chunk-z01ze5c1.js.map +10 -0
  73. package/dist/cli/{chunk-k79xp7av.js → chunk-z1f5arsg.js} +219 -689
  74. package/dist/cli/chunk-z1f5arsg.js.map +36 -0
  75. package/dist/cli/{chunk-1jefwnfs.js → chunk-zg2gtj10.js} +1076 -2592
  76. package/dist/cli/chunk-zg2gtj10.js.map +35 -0
  77. package/dist/cli/{chunk-dwgcp5sm.js → chunk-zxccj738.js} +1 -1
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask.d.ts +368 -0
  85. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  86. package/dist/types/ai/component-markdown.d.ts +2 -2
  87. package/dist/types/ai/index.d.ts +24 -0
  88. package/dist/types/ai/link-headers.d.ts +24 -0
  89. package/dist/types/ai/llms.d.ts +25 -0
  90. package/dist/types/ai/markdown.d.ts +45 -0
  91. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  92. package/dist/types/ai/mcp/tools.d.ts +16 -0
  93. package/dist/types/ai/openapi-components.d.ts +43 -0
  94. package/dist/types/ai/relative-links.d.ts +26 -0
  95. package/dist/types/ai/serializers.d.ts +15 -0
  96. package/dist/types/ai/skills.d.ts +42 -0
  97. package/dist/types/ai/tar.d.ts +25 -0
  98. package/dist/types/ai/visibility.d.ts +17 -0
  99. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  100. package/dist/types/analytics/adobe.d.ts +35 -0
  101. package/dist/types/analytics/amplitude.d.ts +50 -0
  102. package/dist/types/analytics/clarity.d.ts +31 -0
  103. package/dist/types/analytics/clearbit.d.ts +29 -0
  104. package/dist/types/analytics/cloudflare.d.ts +41 -0
  105. package/dist/types/analytics/fathom.d.ts +41 -0
  106. package/dist/types/analytics/google-analytics.d.ts +44 -0
  107. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  108. package/dist/types/analytics/head.d.ts +30 -0
  109. package/dist/types/analytics/heap.d.ts +40 -0
  110. package/dist/types/analytics/hightouch.d.ts +44 -0
  111. package/dist/types/analytics/hotjar.d.ts +33 -0
  112. package/dist/types/analytics/index.d.ts +61 -0
  113. package/dist/types/analytics/inline.d.ts +17 -0
  114. package/dist/types/analytics/logrocket.d.ts +44 -0
  115. package/dist/types/analytics/mixpanel.d.ts +67 -0
  116. package/dist/types/analytics/pirsch.d.ts +42 -0
  117. package/dist/types/analytics/plausible.d.ts +56 -0
  118. package/dist/types/analytics/posthog.d.ts +45 -0
  119. package/dist/types/analytics/schema.d.ts +320 -0
  120. package/dist/types/analytics/script.d.ts +46 -0
  121. package/dist/types/analytics/segment.d.ts +50 -0
  122. package/dist/types/analytics/vercel.d.ts +48 -0
  123. package/dist/types/astro/integration.d.ts +76 -0
  124. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  125. package/dist/types/astro/module-types.d.ts +14 -0
  126. package/dist/types/astro/pages.d.ts +44 -0
  127. package/dist/types/cli/env.d.ts +12 -0
  128. package/dist/types/cli/init/scaffold.d.ts +154 -0
  129. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  130. package/dist/types/core/adapter.d.ts +47 -0
  131. package/dist/types/core/api-name.d.ts +7 -0
  132. package/dist/types/core/changelog-index.d.ts +13 -0
  133. package/dist/types/core/config-input.d.ts +186 -515
  134. package/dist/types/core/config.d.ts +60 -34
  135. package/dist/types/core/content-assets.d.ts +76 -0
  136. package/dist/types/core/custom-pages.d.ts +33 -0
  137. package/dist/types/core/data.d.ts +27 -12
  138. package/dist/types/core/define-components.d.ts +12 -9
  139. package/dist/types/core/deployment-env.d.ts +6 -11
  140. package/dist/types/core/frontmatter.d.ts +10 -0
  141. package/dist/types/core/graph.d.ts +18 -0
  142. package/dist/types/core/heading-markers.d.ts +54 -0
  143. package/dist/types/core/i18n-ui.d.ts +6 -2
  144. package/dist/types/core/i18n.d.ts +87 -0
  145. package/dist/types/core/includes.d.ts +138 -0
  146. package/dist/types/core/last-modified.d.ts +47 -0
  147. package/dist/types/core/links.d.ts +95 -0
  148. package/dist/types/core/locale-links.d.ts +60 -0
  149. package/dist/types/core/manifest.d.ts +17 -0
  150. package/dist/types/core/meta.d.ts +38 -0
  151. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  152. package/dist/types/core/navigation.d.ts +6 -0
  153. package/dist/types/core/node-require.d.ts +19 -0
  154. package/dist/types/core/package-json.d.ts +13 -0
  155. package/dist/types/core/probe.d.ts +42 -0
  156. package/dist/types/core/project-graph.d.ts +51 -0
  157. package/dist/types/core/project.d.ts +2 -0
  158. package/dist/types/core/safe-href.d.ts +2 -0
  159. package/dist/types/core/safe-links.d.ts +26 -0
  160. package/dist/types/core/schema.d.ts +2282 -452
  161. package/dist/types/core/site-url.d.ts +16 -0
  162. package/dist/types/core/sources/assets.d.ts +36 -0
  163. package/dist/types/core/sources/cache.d.ts +37 -0
  164. package/dist/types/core/sources/collection.d.ts +28 -0
  165. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  166. package/dist/types/core/sources/contentful.d.ts +40 -0
  167. package/dist/types/core/sources/filesystem.d.ts +24 -0
  168. package/dist/types/core/sources/github-releases.d.ts +31 -0
  169. package/dist/types/core/sources/json.d.ts +30 -0
  170. package/dist/types/core/sources/lexical.d.ts +19 -0
  171. package/dist/types/core/sources/lower.d.ts +75 -0
  172. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  173. package/dist/types/core/sources/normalize.d.ts +147 -0
  174. package/dist/types/core/sources/notion.d.ts +131 -0
  175. package/dist/types/core/sources/obsidian.d.ts +46 -0
  176. package/dist/types/core/sources/payload.d.ts +39 -0
  177. package/dist/types/core/sources/portable-text.d.ts +42 -0
  178. package/dist/types/core/sources/read.d.ts +23 -0
  179. package/dist/types/core/sources/remote.d.ts +74 -0
  180. package/dist/types/core/sources/resolve.d.ts +19 -0
  181. package/dist/types/core/sources/sanity.d.ts +43 -0
  182. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  183. package/dist/types/core/sources/strapi.d.ts +33 -0
  184. package/dist/types/core/sources/types.d.ts +7 -0
  185. package/dist/types/core/sources/watch.d.ts +45 -0
  186. package/dist/types/core/text-width.d.ts +11 -0
  187. package/dist/types/core/types.d.ts +15 -1
  188. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  189. package/dist/types/core/versions.d.ts +72 -0
  190. package/dist/types/core/yaml.d.ts +9 -0
  191. package/dist/types/deploy/adapter-output.d.ts +45 -0
  192. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  193. package/dist/types/deploy/adapters/index.d.ts +29 -0
  194. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  195. package/dist/types/deploy/adapters/node.d.ts +37 -0
  196. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  197. package/dist/types/deploy/adapters/types.d.ts +71 -0
  198. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  199. package/dist/types/deploy/artifacts.d.ts +65 -0
  200. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  201. package/dist/types/deploy/function-bundle.d.ts +80 -0
  202. package/dist/types/deploy/headers.d.ts +50 -0
  203. package/dist/types/deploy/node-headers.d.ts +42 -0
  204. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  205. package/dist/types/deploy/platforms/index.d.ts +18 -0
  206. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  207. package/dist/types/deploy/platforms/node.d.ts +11 -0
  208. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  209. package/dist/types/deploy/platforms/static.d.ts +10 -0
  210. package/dist/types/deploy/platforms/types.d.ts +104 -0
  211. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  212. package/dist/types/deploy/redirects.d.ts +53 -0
  213. package/dist/types/deploy/robots.d.ts +8 -0
  214. package/dist/types/deploy/rss.d.ts +31 -0
  215. package/dist/types/deploy/sitemap.d.ts +21 -0
  216. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  217. package/dist/types/markdown/code-title.d.ts +32 -0
  218. package/dist/types/markdown/fence-meta.d.ts +23 -0
  219. package/dist/types/markdown/themes.d.ts +3 -3
  220. package/dist/types/openapi/asyncapi.d.ts +129 -0
  221. package/dist/types/openapi/graphql-build.d.ts +8 -0
  222. package/dist/types/openapi/graphql.d.ts +122 -0
  223. package/dist/types/openapi/model.d.ts +158 -0
  224. package/dist/types/openapi/parse.d.ts +57 -0
  225. package/dist/types/openapi/references.d.ts +37 -25
  226. package/dist/types/openapi/render-mdx.d.ts +33 -0
  227. package/dist/types/openapi/sentence.d.ts +7 -0
  228. package/dist/types/openapi/signature.d.ts +10 -0
  229. package/dist/types/openapi/source.d.ts +22 -0
  230. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  231. package/dist/types/reference/asyncapi.d.ts +166 -0
  232. package/dist/types/reference/graphql.d.ts +181 -0
  233. package/dist/types/reference/index.d.ts +32 -0
  234. package/dist/types/reference/openapi.d.ts +165 -0
  235. package/dist/types/reference/options.d.ts +157 -0
  236. package/dist/types/reference/scalar.d.ts +136 -0
  237. package/dist/types/reference/schema.d.ts +630 -0
  238. package/dist/types/search/adapters/algolia.d.ts +32 -0
  239. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  240. package/dist/types/search/adapters/index.d.ts +31 -0
  241. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  242. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  243. package/dist/types/search/adapters/orama.d.ts +13 -0
  244. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  245. package/dist/types/search/adapters/registry.d.ts +228 -0
  246. package/dist/types/search/adapters/types.d.ts +34 -0
  247. package/dist/types/search/adapters/typesense.d.ts +42 -0
  248. package/dist/types/search/build.d.ts +23 -0
  249. package/dist/types/search/documents.d.ts +90 -0
  250. package/dist/types/search/facets.d.ts +3 -0
  251. package/dist/types/search/sync/algolia.d.ts +14 -0
  252. package/dist/types/search/sync/index.d.ts +14 -0
  253. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  254. package/dist/types/search/sync/typesense.d.ts +14 -0
  255. package/dist/types/sources/contentful.d.ts +68 -0
  256. package/dist/types/sources/custom.d.ts +20 -0
  257. package/dist/types/sources/filesystem.d.ts +42 -0
  258. package/dist/types/sources/github-releases.d.ts +46 -0
  259. package/dist/types/sources/index.d.ts +48 -0
  260. package/dist/types/sources/mdx-remote.d.ts +63 -0
  261. package/dist/types/sources/notion.d.ts +65 -0
  262. package/dist/types/sources/obsidian.d.ts +34 -0
  263. package/dist/types/sources/payload.d.ts +68 -0
  264. package/dist/types/sources/registry.d.ts +1414 -0
  265. package/dist/types/sources/sanity.d.ts +69 -0
  266. package/dist/types/sources/shared.d.ts +46 -0
  267. package/dist/types/sources/strapi.d.ts +66 -0
  268. package/dist/types/theme/icon-kind.d.ts +11 -0
  269. package/dist/types/theme/icons.d.ts +20 -0
  270. package/docs/01-quickstart.mdx +18 -18
  271. package/docs/02-deployment.mdx +50 -26
  272. package/docs/03-upgrading.mdx +351 -0
  273. package/docs/04-migrating.mdx +58 -0
  274. package/docs/08-faq.mdx +3 -3
  275. package/docs/advanced/blog.mdx +13 -6
  276. package/docs/advanced/changelog.mdx +23 -35
  277. package/docs/advanced/custom-pages.mdx +20 -8
  278. package/docs/advanced/meta.ts +1 -8
  279. package/docs/advanced/skills.mdx +8 -0
  280. package/docs/cli/audit.mdx +646 -0
  281. package/docs/cli/doctor.mdx +29 -0
  282. package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
  283. package/docs/cli/index.mdx +105 -0
  284. package/docs/cli/meta.ts +7 -0
  285. package/docs/{reference → cli}/translate.mdx +1 -1
  286. package/docs/cli/validate.mdx +41 -0
  287. package/docs/cli/version.mdx +40 -0
  288. package/docs/configuration/analytics.mdx +350 -59
  289. package/docs/configuration/ask-ai.mdx +162 -61
  290. package/docs/configuration/customization.mdx +15 -9
  291. package/docs/configuration/index.mdx +50 -31
  292. package/docs/configuration/search.mdx +75 -54
  293. package/docs/configuration/theming.mdx +24 -15
  294. package/docs/content/components.mdx +21 -5
  295. package/docs/{reference → content}/frontmatter.mdx +35 -1
  296. package/docs/content/i18n.mdx +8 -6
  297. package/docs/content/includes.mdx +2 -4
  298. package/docs/content/index.mdx +1 -1
  299. package/docs/content/islands.mdx +10 -5
  300. package/docs/content/meta.mdx +1 -1
  301. package/docs/content/meta.ts +1 -0
  302. package/docs/content/navigation.mdx +9 -7
  303. package/docs/content/sources.mdx +145 -50
  304. package/docs/content/syntax.mdx +16 -12
  305. package/docs/content/versioning.mdx +3 -3
  306. package/docs/discoverability/agent-discovery.mdx +11 -11
  307. package/docs/discoverability/index.mdx +4 -4
  308. package/docs/discoverability/json-api.mdx +4 -4
  309. package/docs/discoverability/llms-txt.mdx +6 -6
  310. package/docs/discoverability/markdown.mdx +4 -4
  311. package/docs/discoverability/mcp.mdx +11 -11
  312. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  313. package/docs/index.mdx +2 -2
  314. package/docs/references/asyncapi.mdx +59 -0
  315. package/docs/{advanced → references}/graphql.mdx +45 -32
  316. package/docs/{reference → references}/meta.ts +2 -2
  317. package/docs/references/openapi.mdx +171 -0
  318. package/docs/references/scalar.mdx +64 -0
  319. package/package.json +42 -8
  320. package/skills/blume/SKILL.md +21 -8
  321. package/skills/blume-migrate/SKILL.md +22 -21
  322. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  323. package/skills/blume-migrate/references/docusaurus.md +5 -4
  324. package/skills/blume-migrate/references/fumadocs.md +4 -4
  325. package/skills/blume-migrate/references/mintlify.md +23 -8
  326. package/skills/blume-migrate/references/monorepo.md +6 -6
  327. package/skills/blume-migrate/references/starlight.md +4 -4
  328. package/src/ai/agent-readability.ts +21 -22
  329. package/src/ai/ai-catalog.ts +50 -32
  330. package/src/ai/api/handlers.ts +46 -11
  331. package/src/ai/api-catalog.ts +8 -8
  332. package/src/ai/ask-data.ts +1 -1
  333. package/src/ai/ask.ts +624 -100
  334. package/src/ai/changelog-markdown.ts +91 -0
  335. package/src/ai/component-markdown.ts +328 -12
  336. package/src/ai/index.ts +45 -0
  337. package/src/ai/link-headers.ts +7 -6
  338. package/src/ai/llms.ts +20 -15
  339. package/src/ai/markdown.ts +35 -5
  340. package/src/ai/mcp/data.ts +9 -5
  341. package/src/ai/openapi-components.ts +4 -1
  342. package/src/ai/relative-links.ts +170 -0
  343. package/src/ai/serializers.ts +2 -2
  344. package/src/ai/skills.ts +1 -1
  345. package/src/ai/web-bot-auth.ts +2 -2
  346. package/src/analytics/adobe.ts +46 -0
  347. package/src/analytics/amplitude.ts +79 -0
  348. package/src/analytics/clarity.ts +46 -0
  349. package/src/analytics/clearbit.ts +47 -0
  350. package/src/analytics/cloudflare.ts +67 -0
  351. package/src/analytics/fathom.ts +64 -0
  352. package/src/analytics/google-analytics.ts +84 -0
  353. package/src/analytics/google-tag-manager.ts +61 -0
  354. package/src/analytics/head.ts +130 -0
  355. package/src/analytics/heap.ts +65 -0
  356. package/src/analytics/hightouch.ts +77 -0
  357. package/src/analytics/hotjar.ts +47 -0
  358. package/src/analytics/index.ts +71 -0
  359. package/src/analytics/inline.ts +21 -0
  360. package/src/analytics/logrocket.ts +71 -0
  361. package/src/analytics/mixpanel.ts +92 -0
  362. package/src/analytics/pirsch.ts +66 -0
  363. package/src/analytics/plausible.ts +83 -0
  364. package/src/analytics/posthog.ts +78 -0
  365. package/src/analytics/schema.ts +60 -0
  366. package/src/analytics/script.ts +60 -0
  367. package/src/analytics/segment.ts +85 -0
  368. package/src/analytics/vercel.ts +50 -0
  369. package/src/astro/adapter-root.ts +7 -9
  370. package/src/astro/component-slots.ts +131 -91
  371. package/src/astro/generate.ts +112 -345
  372. package/src/astro/integration.ts +2 -6
  373. package/src/astro/pages.ts +13 -101
  374. package/src/astro/render-deps.ts +379 -0
  375. package/src/astro/runtime-deps.ts +201 -0
  376. package/src/astro/templates.ts +554 -541
  377. package/src/audit/agent.ts +24 -0
  378. package/src/audit/catalog.ts +2 -2
  379. package/src/audit/checks/assets.ts +2 -2
  380. package/src/audit/checks/dns-aid.ts +1 -1
  381. package/src/audit/checks/duplicates.ts +3 -1
  382. package/src/audit/checks/i18n.ts +1 -1
  383. package/src/audit/checks/indexability.ts +7 -7
  384. package/src/audit/checks/links.ts +2 -2
  385. package/src/audit/checks/llms.ts +6 -6
  386. package/src/audit/checks/network.ts +3 -3
  387. package/src/audit/checks/og-image.ts +2 -2
  388. package/src/audit/checks/robots.ts +1 -1
  389. package/src/audit/checks/sitemap.ts +2 -2
  390. package/src/audit/checks/social.ts +1 -1
  391. package/src/audit/run.ts +4 -3
  392. package/src/audit/terms.ts +31 -0
  393. package/src/audit/url.ts +13 -13
  394. package/src/cli/command-meta.ts +10 -0
  395. package/src/cli/commands/audit.ts +39 -20
  396. package/src/cli/commands/build.ts +71 -316
  397. package/src/cli/commands/check.ts +1 -0
  398. package/src/cli/commands/dev.ts +40 -1
  399. package/src/cli/commands/doctor.ts +90 -14
  400. package/src/cli/commands/eject.ts +44 -7
  401. package/src/cli/commands/eval.ts +2 -2
  402. package/src/cli/commands/init.ts +161 -41
  403. package/src/cli/commands/migrate.ts +121 -0
  404. package/src/cli/commands/preview.ts +7 -1
  405. package/src/cli/commands/translate.ts +2 -2
  406. package/src/cli/commands/upgrade.ts +141 -0
  407. package/src/cli/commands/version.ts +57 -44
  408. package/src/cli/eject-scripts.ts +121 -6
  409. package/src/cli/index.ts +11 -1
  410. package/src/cli/init/install.ts +70 -0
  411. package/src/cli/init/questions.ts +7 -0
  412. package/src/cli/init/scaffold.ts +459 -75
  413. package/src/cli/lazy-command.ts +37 -1
  414. package/src/cli/prepare.ts +40 -6
  415. package/src/cli/required-secrets.ts +38 -11
  416. package/src/cli/unknown-flags.ts +266 -0
  417. package/src/cli/yarn-pnp.ts +52 -0
  418. package/src/components/content/AccordionItem.astro +7 -1
  419. package/src/components/content/Card.astro +4 -3
  420. package/src/components/content/ColorItem.astro +22 -4
  421. package/src/components/content/GithubInfo.astro +2 -2
  422. package/src/components/content/Prompt.astro +25 -25
  423. package/src/components/content/Tabs.astro +3 -1
  424. package/src/components/content/Tile.astro +2 -3
  425. package/src/components/content/Tooltip.astro +57 -9
  426. package/src/components/content/content-strings.ts +34 -0
  427. package/src/components/content/diff.ts +1 -1
  428. package/src/components/content/mermaid-element.ts +13 -2
  429. package/src/components/content/prompt-markdown.ts +292 -0
  430. package/src/components/content/tooltip-id.ts +41 -0
  431. package/src/components/islands/hooks.ts +25 -2
  432. package/src/components/layout/Analytics.astro +21 -79
  433. package/src/components/layout/Banner.astro +3 -1
  434. package/src/components/layout/DiscoveryLinks.astro +69 -0
  435. package/src/components/layout/Header.astro +83 -20
  436. package/src/components/layout/LanguageSwitcher.astro +4 -1
  437. package/src/components/layout/Logo.astro +23 -2
  438. package/src/components/layout/NavSelector.astro +13 -2
  439. package/src/components/layout/NavTree.astro +12 -3
  440. package/src/components/layout/NavTreeScript.astro +17 -3
  441. package/src/components/layout/PageActions.astro +3 -3
  442. package/src/components/layout/PageFeedback.astro +11 -1
  443. package/src/components/layout/PageLayout.astro +52 -5
  444. package/src/components/layout/ReferenceLayout.astro +21 -12
  445. package/src/components/layout/RootLayout.astro +69 -66
  446. package/src/components/layout/Search.astro +30 -6
  447. package/src/components/layout/WebMcp.astro +1 -1
  448. package/src/components/layout/analytics-client.ts +72 -15
  449. package/src/components/layout/drawer-inert.ts +113 -15
  450. package/src/components/layout/dropdown-clamp.ts +105 -0
  451. package/src/components/layout/head-scripts.ts +15 -6
  452. package/src/components/layout/nav-utils.ts +17 -0
  453. package/src/components/layout/search/algolia.ts +8 -8
  454. package/src/components/layout/search/orama-cloud.ts +9 -7
  455. package/src/components/layout/search/typesense.ts +11 -17
  456. package/src/components/openapi/MessageComposer.astro +2 -2
  457. package/src/components/openapi/Playground.astro +2 -2
  458. package/src/components/openapi/playground-client.ts +79 -10
  459. package/src/core/changelog-index.ts +24 -0
  460. package/src/core/component-overrides.ts +399 -154
  461. package/src/core/config-input.ts +188 -553
  462. package/src/core/config.ts +130 -41
  463. package/src/core/custom-pages.ts +105 -0
  464. package/src/core/data.ts +31 -12
  465. package/src/core/define-components.ts +12 -9
  466. package/src/core/deployment-env.ts +18 -74
  467. package/src/core/diagnostics.ts +14 -7
  468. package/src/core/graph.ts +69 -25
  469. package/src/core/i18n-ui.ts +6 -2
  470. package/src/core/i18n.ts +17 -0
  471. package/src/core/includes.ts +156 -38
  472. package/src/core/last-modified.ts +6 -11
  473. package/src/core/links.ts +166 -2
  474. package/src/core/manifest.ts +10 -3
  475. package/src/core/navigation.ts +115 -16
  476. package/src/core/new-tab.ts +35 -0
  477. package/src/core/node-require.ts +21 -0
  478. package/src/core/project-graph.ts +42 -26
  479. package/src/core/project.ts +9 -4
  480. package/src/core/request-body.ts +61 -0
  481. package/src/core/safe-href.ts +28 -0
  482. package/src/core/safe-links.ts +68 -0
  483. package/src/core/schema.ts +517 -739
  484. package/src/core/server-features.ts +8 -9
  485. package/src/core/sources/assets.ts +47 -11
  486. package/src/core/sources/collection.ts +67 -0
  487. package/src/core/sources/contentful-rich-text.ts +285 -0
  488. package/src/core/sources/contentful.ts +173 -0
  489. package/src/core/sources/github-releases.ts +51 -1
  490. package/src/core/sources/json.ts +71 -0
  491. package/src/core/sources/lexical.ts +195 -0
  492. package/src/core/sources/lower.ts +226 -0
  493. package/src/core/sources/normalize.ts +52 -2
  494. package/src/core/sources/notion.ts +39 -28
  495. package/src/core/sources/payload.ts +135 -0
  496. package/src/core/sources/portable-text.ts +11 -16
  497. package/src/core/sources/remote.ts +226 -0
  498. package/src/core/sources/resolve.ts +104 -166
  499. package/src/core/sources/sanity.ts +16 -49
  500. package/src/core/sources/strapi-blocks.ts +124 -0
  501. package/src/core/sources/strapi.ts +191 -0
  502. package/src/core/sources/types.ts +12 -1
  503. package/src/core/types.ts +15 -1
  504. package/src/core/ui-packs/ar.ts +6 -2
  505. package/src/core/ui-packs/bg.ts +6 -2
  506. package/src/core/ui-packs/bn.ts +6 -2
  507. package/src/core/ui-packs/ca.ts +3 -1
  508. package/src/core/ui-packs/cs.ts +6 -2
  509. package/src/core/ui-packs/da.ts +6 -2
  510. package/src/core/ui-packs/de.ts +6 -2
  511. package/src/core/ui-packs/el.ts +3 -1
  512. package/src/core/ui-packs/es.ts +3 -1
  513. package/src/core/ui-packs/fa.ts +6 -2
  514. package/src/core/ui-packs/fi.ts +6 -2
  515. package/src/core/ui-packs/fr.ts +3 -1
  516. package/src/core/ui-packs/he.ts +6 -2
  517. package/src/core/ui-packs/hi.ts +6 -2
  518. package/src/core/ui-packs/hr.ts +6 -2
  519. package/src/core/ui-packs/hu.ts +6 -2
  520. package/src/core/ui-packs/id.ts +6 -2
  521. package/src/core/ui-packs/it.ts +3 -1
  522. package/src/core/ui-packs/ja.ts +3 -1
  523. package/src/core/ui-packs/ko.ts +3 -1
  524. package/src/core/ui-packs/nl.ts +6 -2
  525. package/src/core/ui-packs/no.ts +6 -2
  526. package/src/core/ui-packs/pl.ts +6 -2
  527. package/src/core/ui-packs/pt-br.ts +3 -1
  528. package/src/core/ui-packs/pt.ts +3 -1
  529. package/src/core/ui-packs/ro.ts +6 -2
  530. package/src/core/ui-packs/ru.ts +6 -2
  531. package/src/core/ui-packs/sk.ts +6 -2
  532. package/src/core/ui-packs/sr.ts +6 -2
  533. package/src/core/ui-packs/sv.ts +6 -2
  534. package/src/core/ui-packs/th.ts +3 -1
  535. package/src/core/ui-packs/tr.ts +6 -2
  536. package/src/core/ui-packs/uk.ts +6 -2
  537. package/src/core/ui-packs/vi.ts +3 -1
  538. package/src/core/ui-packs/zh-tw.ts +3 -1
  539. package/src/core/ui-packs/zh.ts +3 -1
  540. package/src/core/unrecognized-keys.ts +10 -0
  541. package/src/core/version-cut.ts +116 -8
  542. package/src/deploy/adapter-output.ts +57 -97
  543. package/src/deploy/adapters/cloudflare.ts +39 -0
  544. package/src/deploy/adapters/index.ts +41 -0
  545. package/src/deploy/adapters/netlify.ts +34 -0
  546. package/src/deploy/adapters/node.ts +34 -0
  547. package/src/deploy/adapters/registry.ts +127 -0
  548. package/src/deploy/adapters/types.ts +92 -0
  549. package/src/deploy/adapters/vercel.ts +35 -0
  550. package/src/deploy/artifacts.ts +55 -27
  551. package/src/deploy/cloudflare-negotiation.ts +179 -100
  552. package/src/deploy/function-bundle.ts +18 -3
  553. package/src/deploy/headers.ts +124 -23
  554. package/src/deploy/node-headers.ts +198 -0
  555. package/src/deploy/platforms/cloudflare.ts +312 -0
  556. package/src/deploy/platforms/index.ts +67 -0
  557. package/src/deploy/platforms/netlify.ts +52 -0
  558. package/src/deploy/platforms/node.ts +40 -0
  559. package/src/deploy/platforms/paths.ts +42 -0
  560. package/src/deploy/platforms/static.ts +29 -0
  561. package/src/deploy/platforms/types.ts +112 -0
  562. package/src/deploy/platforms/vercel.ts +193 -0
  563. package/src/deploy/redirects.ts +30 -18
  564. package/src/deploy/robots.ts +3 -3
  565. package/src/deploy/rss.ts +2 -2
  566. package/src/deploy/sitemap.ts +2 -2
  567. package/src/deploy/vercel-negotiation.ts +2 -2
  568. package/src/eval/agents.ts +32 -1
  569. package/src/eval/findings.ts +19 -11
  570. package/src/eval/report.ts +10 -2
  571. package/src/markdown/external-links.ts +65 -0
  572. package/src/markdown/include.ts +45 -27
  573. package/src/markdown/index.ts +34 -9
  574. package/src/markdown/inline-code.ts +12 -6
  575. package/src/markdown/relative-links.ts +324 -0
  576. package/src/markdown/themes.ts +3 -3
  577. package/src/migrate/migrate.ts +149 -0
  578. package/src/openapi/parse.ts +64 -16
  579. package/src/openapi/proxy.ts +62 -10
  580. package/src/openapi/references.ts +147 -147
  581. package/src/openapi/render-mdx.ts +32 -10
  582. package/src/openapi/scalar.ts +15 -13
  583. package/src/openapi/sentence.ts +14 -0
  584. package/src/openapi/source.ts +37 -21
  585. package/src/openapi/spec-dependency-error.ts +15 -0
  586. package/src/reference/asyncapi.ts +83 -0
  587. package/src/reference/graphql.ts +89 -0
  588. package/src/reference/index.ts +40 -0
  589. package/src/reference/openapi.ts +83 -0
  590. package/src/reference/options.ts +201 -0
  591. package/src/reference/scalar.ts +136 -0
  592. package/src/reference/schema.ts +88 -0
  593. package/src/registry/eject.ts +97 -42
  594. package/src/search/adapters/algolia.ts +46 -0
  595. package/src/search/adapters/flexsearch.ts +29 -0
  596. package/src/search/adapters/index.ts +39 -0
  597. package/src/search/adapters/mixedbread.ts +39 -0
  598. package/src/search/adapters/orama-cloud.ts +51 -0
  599. package/src/search/adapters/orama.ts +24 -0
  600. package/src/search/adapters/pagefind.ts +27 -0
  601. package/src/search/adapters/registry.ts +131 -0
  602. package/src/search/adapters/types.ts +46 -0
  603. package/src/search/adapters/typesense.ts +57 -0
  604. package/src/search/build.ts +8 -4
  605. package/src/search/documents.ts +6 -0
  606. package/src/search/sync/algolia.ts +12 -11
  607. package/src/search/sync/index.ts +35 -20
  608. package/src/search/sync/orama-cloud.ts +12 -9
  609. package/src/search/sync/typesense.ts +15 -13
  610. package/src/sources/contentful.ts +63 -0
  611. package/src/sources/custom.ts +38 -0
  612. package/src/sources/filesystem.ts +51 -0
  613. package/src/sources/github-releases.ts +52 -0
  614. package/src/sources/index.ts +60 -0
  615. package/src/sources/mdx-remote.ts +76 -0
  616. package/src/sources/notion.ts +63 -0
  617. package/src/sources/obsidian.ts +38 -0
  618. package/src/sources/payload.ts +60 -0
  619. package/src/sources/registry.ts +182 -0
  620. package/src/sources/sanity.ts +66 -0
  621. package/src/sources/shared.ts +52 -0
  622. package/src/sources/strapi.ts +58 -0
  623. package/src/theme/entry.ts +24 -2
  624. package/src/translate/report.ts +40 -7
  625. package/src/upgrade/upgrade.ts +499 -0
  626. package/dist/cli/chunk-0qymqwzz.js +0 -164
  627. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  628. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  629. package/dist/cli/chunk-2mzebbbz.js +0 -69
  630. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  631. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  632. package/dist/cli/chunk-5093q3n7.js +0 -68
  633. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  634. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  635. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  636. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  637. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  638. package/dist/cli/chunk-97r59kpr.js +0 -381
  639. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  640. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  641. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  642. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  643. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  644. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  645. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  646. package/dist/cli/chunk-esphfr8p.js +0 -107
  647. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  648. package/dist/cli/chunk-ex56aa81.js +0 -1016
  649. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  650. package/dist/cli/chunk-garjf5z9.js +0 -30
  651. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  652. package/dist/cli/chunk-js7saxwm.js +0 -1045
  653. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  654. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  655. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  656. package/dist/cli/chunk-q4rae3bg.js +0 -60
  657. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  658. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  659. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  660. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  661. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  662. package/dist/cli/chunk-vrfp10qk.js +0 -81
  663. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  664. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  665. package/docs/advanced/api-reference.mdx +0 -240
  666. package/docs/reference/cli.mdx +0 -197
  667. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  668. package/src/components/content/changelog-element.ts +0 -69
  669. package/src/search/providers.ts +0 -91
  670. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-7ez8ny0t.js.map} +0 -0
  671. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-88cpgt6h.js.map} +0 -0
  672. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-f7t03s3g.js.map} +0 -0
  673. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-zxccj738.js.map} +0 -0
@@ -1,1045 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- frontmatter_default,
4
- parseHeadingMarkers,
5
- HTML_COMMENT,
6
- contentIndexable,
7
- specOf,
8
- operationOf,
9
- specAddresses,
10
- operationSignature,
11
- isOpenApiSource,
12
- parseYouTubeId
13
- } from "./chunk-1jefwnfs.js";
14
- import {
15
- readExpandedEntryText,
16
- rewriteRelativeImages
17
- } from "./chunk-bf6bt1xt.js";
18
- import {
19
- siteRoot,
20
- absoluteUrl
21
- } from "./chunk-ct47dqpx.js";
22
- import {
23
- OPENAPI_PATH,
24
- API_PAGES_PATH,
25
- API_CATALOG_PATH,
26
- hasApiCatalog,
27
- AGENT_SKILLS_DIR,
28
- AGENT_SKILLS_INDEX_PATH,
29
- AI_CATALOG_PATH,
30
- hasAiCatalog
31
- } from "./chunk-0qymqwzz.js";
32
- import {
33
- normalizeBasePath,
34
- withBasePath
35
- } from "./chunk-2mzebbbz.js";
36
-
37
- // src/ai/markdown.ts
38
- import { readFile } from "node:fs/promises";
39
-
40
- // src/ai/component-markdown.ts
41
- import { markdownTable } from "markdown-table";
42
- import { mdxToMdast } from "satteri";
43
-
44
- // src/markdown/features.ts
45
- var MARKDOWN_FEATURES = {
46
- subscript: true,
47
- superscript: true
48
- };
49
- var MDX_FEATURES = {
50
- ...MARKDOWN_FEATURES,
51
- directive: true,
52
- math: { singleDollarTextMath: false }
53
- };
54
-
55
- // src/ai/component-markdown.ts
56
- var isString = (value) => typeof value === "string";
57
- var isNumber = (value) => typeof value === "number";
58
- var evaluateExpression = (raw, frontmatter) => {
59
- try {
60
- const value = new Function("frontmatter", `"use strict"; return (${raw});`)(frontmatter);
61
- return { ok: true, value };
62
- } catch {
63
- return { ok: false, value: undefined };
64
- }
65
- };
66
- var readProps = (node, frontmatter) => {
67
- const props = {};
68
- let lossy = false;
69
- for (const attribute of node.attributes ?? []) {
70
- if (attribute.type !== "mdxJsxAttribute" || !attribute.name) {
71
- lossy = true;
72
- continue;
73
- }
74
- if (attribute.value === null || attribute.value === undefined) {
75
- props[attribute.name] = true;
76
- } else if (isString(attribute.value)) {
77
- props[attribute.name] = attribute.value;
78
- } else {
79
- const result = evaluateExpression(attribute.value.value, frontmatter);
80
- if (result.ok) {
81
- props[attribute.name] = result.value;
82
- } else {
83
- lossy = true;
84
- }
85
- }
86
- }
87
- return { lossy, props };
88
- };
89
- var hasOffsets = (node) => typeof node.position?.start?.offset === "number" && typeof node.position?.end?.offset === "number";
90
- var applySplices = (text, splices) => {
91
- let result = text;
92
- for (const splice of [...splices].toSorted((a, b) => b.start - a.start)) {
93
- const lineStart = result.lastIndexOf(`
94
- `, splice.start - 1) + 1;
95
- const prefix = result.slice(lineStart, splice.start);
96
- const indent = /^[\t ]+$/u.test(prefix) ? prefix : "";
97
- const replacement = indent ? splice.text.split(`
98
- `).map((line, index) => index === 0 || line === "" ? line : `${indent}${line}`).join(`
99
- `) : splice.text;
100
- result = result.slice(0, splice.start) + replacement + result.slice(splice.end);
101
- }
102
- return result;
103
- };
104
- var dedent = (text) => {
105
- const lines = text.split(`
106
- `);
107
- const rest = lines.slice(1).filter((line) => line.trim() !== "");
108
- if (rest.length === 0) {
109
- return text;
110
- }
111
- const indent = Math.min(...rest.map((line) => line.length - line.trimStart().length));
112
- if (indent === 0) {
113
- return text;
114
- }
115
- return [
116
- lines[0],
117
- ...lines.slice(1).map((line) => line.trim() === "" ? "" : line.slice(indent))
118
- ].join(`
119
- `);
120
- };
121
- var isJsxElement = (node) => node.type === "mdxJsxFlowElement" || node.type === "mdxJsxTextElement";
122
- var cellText = (value) => String(value ?? "").replaceAll(/\s*\n\s*/gu, " ").replaceAll("|", "\\|").trim();
123
- var cellCode = (value) => {
124
- const text = cellText(value);
125
- return text && !text.includes("`") ? `\`${text}\`` : text;
126
- };
127
- var isTypeEntryMap = (value) => typeof value === "object" && value !== null;
128
- var typeTable = ({ children, props }) => {
129
- const { type } = props;
130
- if (!isTypeEntryMap(type)) {
131
- return null;
132
- }
133
- const entries = Object.entries(type);
134
- const rows = entries.map(([name, info]) => {
135
- const prop = cellCode(`${name}${info.required ? "" : "?"}`);
136
- const typeCell = info.typeDescriptionLink ? `[${cellCode(info.type)}](${cellText(info.typeDescriptionLink)})` : cellCode(info.type);
137
- const defaultCell = info.default === undefined ? "-" : cellCode(info.default);
138
- const description = cellText([info.description, info.typeDescription].filter((part) => isString(part) && part !== "").join(" "));
139
- return [prop, typeCell, defaultCell, description];
140
- });
141
- const table = rows.length > 0 ? markdownTable([["Prop", "Type", "Default", "Description"], ...rows], {
142
- alignDelimiters: false
143
- }) : "";
144
- return [table, children].filter(Boolean).join(`
145
-
146
- `);
147
- };
148
- var callout = ({ children, props }) => {
149
- const type = isString(props.type) ? props.type : "info";
150
- const label = isString(props.title) && props.title !== "" ? props.title : type.charAt(0).toUpperCase() + type.slice(1);
151
- if (!children) {
152
- return `> **${label}**`;
153
- }
154
- const body = children.split(`
155
- `).map((line) => line.trim() === "" ? ">" : `> ${line}`).join(`
156
- `);
157
- return `> **${label}**
158
- >
159
- ${body}`;
160
- };
161
- var listItem = (index, content) => {
162
- const marker = `${index}. `;
163
- return content.split(`
164
- `).map((line, lineIndex) => {
165
- if (lineIndex === 0) {
166
- return `${marker}${line}`;
167
- }
168
- return line === "" ? "" : ` ${line}`;
169
- }).join(`
170
- `);
171
- };
172
- var steps = ({ childComponents, children }) => {
173
- const items = childComponents("Step");
174
- if (items.length === 0) {
175
- return children;
176
- }
177
- return items.map((step, index) => {
178
- const title = isString(step.props.title) && step.props.title !== "" ? `**${step.props.title}**` : "";
179
- const content = [title, step.children].filter(Boolean).join(`
180
-
181
- `);
182
- return listItem(index + 1, content);
183
- }).join(`
184
-
185
- `);
186
- };
187
- var tabs = ({ childComponents, children }) => {
188
- const items = childComponents("Tab");
189
- if (items.length === 0) {
190
- return children;
191
- }
192
- return items.map((tab, index) => {
193
- const title = isString(tab.props.title) && tab.props.title !== "" ? tab.props.title : `Tab ${index + 1}`;
194
- return tab.children ? `**${title}**
195
-
196
- ${tab.children}` : `**${title}**`;
197
- }).join(`
198
-
199
- `);
200
- };
201
- var linkText = (value) => value.replaceAll(/[[\]]/gu, String.raw`\$&`);
202
- var linkDestination = (href) => /[\s()<>]/u.test(href) ? `<${href.replaceAll(/[<>]/gu, String.raw`\$&`)}>` : href;
203
- var textProp = (value) => {
204
- if (isString(value)) {
205
- return value.trim();
206
- }
207
- return isNumber(value) ? String(value) : "";
208
- };
209
- var card = ({ children, lossy, props }) => {
210
- if (lossy) {
211
- return null;
212
- }
213
- const title = textProp(props.title);
214
- const href = isString(props.href) ? props.href.trim() : "";
215
- const body = children.trim();
216
- const cta = textProp(props.cta);
217
- const label = title || href;
218
- if (label === "") {
219
- const rest = [body, cta].filter(Boolean).join(`
220
-
221
- `);
222
- return rest === "" ? null : rest;
223
- }
224
- const head = href === "" ? `**${label}**` : `**[${linkText(label)}](${linkDestination(href)})**`;
225
- return [head, body, cta].filter(Boolean).join(`
226
-
227
- `);
228
- };
229
- var cardGroup = ({ childBlocks }) => childBlocks().map((block) => block.markdown).join(`
230
-
231
- `);
232
- var youtube = ({ props }) => {
233
- let input = "";
234
- if (isString(props.id)) {
235
- input = props.id;
236
- } else if (isString(props.url)) {
237
- input = props.url;
238
- }
239
- const videoId = parseYouTubeId(input);
240
- if (!videoId) {
241
- return null;
242
- }
243
- const start = isNumber(props.start) && props.start > 0 ? `&t=${Math.floor(props.start)}s` : "";
244
- const title = isString(props.title) && props.title !== "" ? props.title : "Watch on YouTube";
245
- return `[${title}](https://www.youtube.com/watch?v=${videoId}${start})`;
246
- };
247
- var inlineCode = (text) => {
248
- const runs = text.match(/`+/gu);
249
- const longest = runs ? Math.max(...runs.map((run) => run.length)) : 0;
250
- const delimiter = "`".repeat(longest + 1);
251
- const padded = text.startsWith("`") || text.endsWith("`") ? ` ${text} ` : text;
252
- return `${delimiter}${padded}${delimiter}`;
253
- };
254
- var fencedBlock = (lang, code) => {
255
- const trimmed = code.replace(/(?<!\n)\n+$/u, "");
256
- const runs = trimmed.match(/`+/gu);
257
- const longest = runs ? Math.max(...runs.map((run) => run.length)) : 0;
258
- const fence = "`".repeat(Math.max(3, longest + 1));
259
- return `${fence}${lang}
260
- ${trimmed}
261
- ${fence}`;
262
- };
263
- var exampleComponentSerializers = (examples) => ({
264
- Component: ({ props }) => {
265
- const path = isString(props.path) ? props.path : undefined;
266
- const example = path === undefined ? undefined : examples[path];
267
- return example ? fencedBlock(example.lang, example.source) : null;
268
- }
269
- });
270
- var SERIALIZERS = {
271
- Callout: callout,
272
- Card: card,
273
- CardGroup: cardGroup,
274
- Steps: steps,
275
- Tabs: tabs,
276
- TypeTable: typeTable,
277
- YouTube: youtube
278
- };
279
- var escapeRegExp = (value) => value.replaceAll(/[$()*+.?[\\\]^{|}]/gu, String.raw`\$&`);
280
- var componentHint = (registry) => new RegExp(`<(?:${Object.keys(registry).map(escapeRegExp).join("|")})[\\s/>]`, "u");
281
- var BUILT_IN_HINT = componentHint(SERIALIZERS);
282
- var componentRegistry = (components) => components && Object.keys(components).length > 0 ? { ...SERIALIZERS, ...components } : SERIALIZERS;
283
- var renderSlice = (walk, start, end, nodes) => {
284
- const splices = [];
285
- collectSplices(walk, nodes, splices);
286
- const spliced = applySplices(walk.source.slice(start, end), splices.map((splice) => ({
287
- ...splice,
288
- end: splice.end - start,
289
- start: splice.start - start
290
- })));
291
- return dedent(spliced).trim();
292
- };
293
- var renderChildren = (walk, node) => {
294
- const children = (node.children ?? []).filter(hasOffsets);
295
- const [first] = children;
296
- if (!first) {
297
- return "";
298
- }
299
- const start = first.position.start.offset;
300
- return renderSlice(walk, start, children.at(-1)?.position.end.offset ?? start, children);
301
- };
302
- var renderBlock = (walk, node) => {
303
- const serializer = isJsxElement(node) && node.name ? walk.registry[node.name] : undefined;
304
- const text = serializer ? serializeElement(serializer, walk, node) : null;
305
- return text ?? renderSlice(walk, node.position.start.offset, node.position.end.offset, node.children ?? []);
306
- };
307
- var serializeElement = (serializer, walk, node) => serializer({
308
- ...readProps(node, walk.frontmatter),
309
- childBlocks: () => (node.children ?? []).filter(hasOffsets).map((child) => ({
310
- markdown: renderBlock(walk, child),
311
- name: isJsxElement(child) ? child.name : undefined
312
- })),
313
- childComponents: (name) => (node.children ?? []).filter((child) => isJsxElement(child) && child.name === name).map((child) => ({
314
- ...readProps(child, walk.frontmatter),
315
- children: renderChildren(walk, child)
316
- })),
317
- children: renderChildren(walk, node),
318
- frontmatter: walk.frontmatter ?? {}
319
- });
320
- var downlevelComponentNode = (node, walk) => {
321
- const serializer = node.type === "mdxJsxFlowElement" && node.name ? walk.registry[node.name] : undefined;
322
- return serializer && hasOffsets(node) ? serializeElement(serializer, walk, node) : null;
323
- };
324
- var collectSplices = (walk, nodes, out) => {
325
- for (const node of nodes) {
326
- const text = hasOffsets(node) ? downlevelComponentNode(node, walk) : null;
327
- if (text !== null && hasOffsets(node)) {
328
- out.push({
329
- end: node.position.end.offset,
330
- start: node.position.start.offset,
331
- text
332
- });
333
- continue;
334
- }
335
- collectSplices(walk, node.children ?? [], out);
336
- }
337
- };
338
- var downlevelComponents = (source, components, frontmatter) => {
339
- const registry = componentRegistry(components);
340
- const hint = registry === SERIALIZERS ? BUILT_IN_HINT : componentHint(registry);
341
- if (!hint.test(source)) {
342
- return source;
343
- }
344
- let tree;
345
- try {
346
- tree = mdxToMdast(source, { features: MDX_FEATURES });
347
- } catch {
348
- return source;
349
- }
350
- const splices = [];
351
- collectSplices({ frontmatter, registry, source }, tree.children ?? [], splices);
352
- return splices.length > 0 ? applySplices(source, splices) : source;
353
- };
354
-
355
- // src/deploy/rss.ts
356
- import { escape as escapeXml } from "html-escaper";
357
- var capitalize = (value) => value.charAt(0).toUpperCase() + value.slice(1);
358
- var pageDate = (page) => {
359
- const raw = page.meta.date ?? page.meta.changelog?.date;
360
- if (!raw) {
361
- return;
362
- }
363
- const date = new Date(raw);
364
- return Number.isNaN(date.getTime()) ? undefined : date;
365
- };
366
- var buildRssFeeds = (project) => {
367
- const { config } = project;
368
- const { rss } = config.seo;
369
- const { site } = config.deployment;
370
- if (!(rss.enabled && site)) {
371
- return [];
372
- }
373
- const base = siteRoot(site);
374
- const deployBase = normalizeBasePath(config.deployment.base);
375
- const rootLink = `${base}${deployBase}`;
376
- const feeds = [];
377
- for (const type of rss.types) {
378
- const pages = project.graph.pages.filter((page) => page.contentType === type && !(page.meta.draft || page.meta.sidebar.hidden));
379
- if (pages.length === 0) {
380
- continue;
381
- }
382
- const items = pages.map((page) => ({
383
- date: pageDate(page),
384
- description: page.description,
385
- link: encodeURI(`${base}${withBasePath(deployBase, page.route)}`),
386
- title: page.title
387
- })).toSorted((a, b) => (b.date?.getTime() ?? 0) - (a.date?.getTime() ?? 0)).slice(0, rss.limit);
388
- feeds.push({
389
- description: config.description,
390
- items,
391
- link: rootLink,
392
- path: `/${type}/rss.xml`,
393
- title: `${config.title} — ${capitalize(type)}`,
394
- type
395
- });
396
- }
397
- return feeds;
398
- };
399
- var renderItem = (item) => {
400
- const parts = [
401
- ` <title>${escapeXml(item.title)}</title>`,
402
- ` <link>${escapeXml(item.link)}</link>`,
403
- ` <guid isPermaLink="true">${escapeXml(item.link)}</guid>`
404
- ];
405
- if (item.description) {
406
- parts.push(` <description>${escapeXml(item.description)}</description>`);
407
- }
408
- if (item.date) {
409
- parts.push(` <pubDate>${item.date.toUTCString()}</pubDate>`);
410
- }
411
- return ` <item>
412
- ${parts.join(`
413
- `)}
414
- </item>`;
415
- };
416
- var renderRssFeed = (feed) => {
417
- const feedSelfHref = `${feed.link}${feed.path}`;
418
- const channel = [
419
- ` <title>${escapeXml(feed.title)}</title>`,
420
- ` <link>${escapeXml(feed.link)}</link>`,
421
- ` <description>${escapeXml(feed.description ?? feed.title)}</description>`,
422
- ` <atom:link href="${escapeXml(feedSelfHref)}" rel="self" type="application/rss+xml" />`
423
- ];
424
- const items = feed.items.map(renderItem).join(`
425
- `);
426
- return `<?xml version="1.0" encoding="UTF-8"?>
427
- <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
428
- <channel>
429
- ${channel.join(`
430
- `)}
431
- ${items}
432
- </channel>
433
- </rss>
434
- `;
435
- };
436
-
437
- // src/ai/openapi-components.ts
438
- var inlineText = (text) => text.trim().replaceAll(/\s+/gu, " ").replaceAll(/[\\`*_[\]<>~]/gu, String.raw`\$&`);
439
- var listItem2 = (signature, operation) => {
440
- const tail = [
441
- inlineText(operation.summary),
442
- operation.deprecated ? "Deprecated." : ""
443
- ].filter(Boolean).join(" ");
444
- return `- [${inlineCode(signature)}](${linkDestination(operation.route)})${tail ? ` — ${tail}` : ""}`;
445
- };
446
- var openapiComponentSerializers = (specs) => {
447
- const spec = (source) => isString(source) ? specOf(specs, source) : undefined;
448
- return {
449
- ApiOverview: ({ props }) => {
450
- const data = spec(props.source);
451
- if (!data) {
452
- return null;
453
- }
454
- const { addresses, label } = specAddresses(data);
455
- const lines = [
456
- data.version ? `Version ${inlineText(data.version)}` : "",
457
- addresses.length > 0 ? `${label}: ${addresses.map(inlineCode).join(", ")}` : ""
458
- ].filter(Boolean);
459
- return lines.length > 0 ? lines.join(`
460
-
461
- `) : null;
462
- },
463
- ApiTagOperations: ({ props }) => {
464
- const { tag } = props;
465
- const data = spec(props.source);
466
- if (!(data && isString(tag))) {
467
- return null;
468
- }
469
- const items = Object.values(data.operations).filter((operation) => operation.tagSlug === tag).map((operation) => listItem2(operationSignature(data, operation), operation));
470
- return items.length > 0 ? items.join(`
471
- `) : null;
472
- },
473
- Operation: ({ props }) => {
474
- const { id } = props;
475
- const data = spec(props.source);
476
- if (!(data && isString(id))) {
477
- return null;
478
- }
479
- const operation = operationOf(data, id);
480
- if (!operation) {
481
- return null;
482
- }
483
- const signature = inlineCode(operationSignature(data, operation));
484
- return operation.deprecated ? `${signature}
485
-
486
- **Deprecated.**` : signature;
487
- }
488
- };
489
- };
490
-
491
- // src/ai/serializers.ts
492
- var projectComponentSerializers = (project) => ({
493
- ...exampleComponentSerializers(project.examples ?? {}),
494
- ...openapiComponentSerializers(project.sources.find(isOpenApiSource)?.openApiData() ?? {}),
495
- ...project.config.ai.markdownComponents
496
- });
497
-
498
- // src/ai/visibility.ts
499
- var CODE_FENCE_BLOCK = /^(?<fence>`{3,}|~{3,})[^\n]*\n[\s\S]*?^\k<fence>[^\n]*(?=\n|$)/gmu;
500
- var FENCE_TOKEN = /\u0000blume-fence-(?<index>\d+)\u0000/gu;
501
- var visibilityBlock = (audience) => new RegExp(`<Visibility\\s+for\\s*=\\s*(?:"${audience}"|'${audience}')\\s*>(?<inner>[\\s\\S]*?)</Visibility\\s*>`, "gu");
502
- var BLOCKS = {
503
- agents: visibilityBlock("agents"),
504
- web: visibilityBlock("web")
505
- };
506
- var applyAudienceVisibility = (markdown, audience) => {
507
- const fences = [];
508
- const masked = markdown.replace(CODE_FENCE_BLOCK, (block) => {
509
- fences.push(block);
510
- return `\x00blume-fence-${fences.length - 1}\x00`;
511
- });
512
- let touched = false;
513
- const filtered = masked.replaceAll(BLOCKS[audience === "agents" ? "web" : "agents"], () => {
514
- touched = true;
515
- return "";
516
- }).replaceAll(BLOCKS[audience], (_match, inner) => {
517
- touched = true;
518
- return inner;
519
- });
520
- const tidied = touched ? filtered.replaceAll(/\n{3,}/gu, `
521
-
522
- `) : filtered;
523
- return tidied.replaceAll(FENCE_TOKEN, (token, index) => fences[Number(index)] ?? token);
524
- };
525
- var applyAgentVisibility = (markdown) => applyAudienceVisibility(markdown, "agents");
526
-
527
- // src/ai/llms.ts
528
- var pageUrl = (route, site, base = "") => {
529
- const path = withBasePath(base, route);
530
- return encodeURI(site ? absoluteUrl(site, path) : path);
531
- };
532
- var oneLine = (text) => text.replaceAll(/\s+/gu, " ").trim();
533
- var agentResourceLines = (project) => {
534
- const { config } = project;
535
- const { site } = config.deployment;
536
- const url = (path) => pageUrl(path, site, normalizeBasePath(config.deployment.base));
537
- const lines = [
538
- `- [llms-full.txt](${url("/llms-full.txt")}): The full Markdown of every page in one file.`,
539
- `- [Page Markdown](${url("/index.md")}): Append \`.md\` to any page URL to fetch that page as raw Markdown.`
540
- ];
541
- if (config.ai.api) {
542
- lines.push(`- [JSON API](${url(API_PAGES_PATH)}): Page index of the JSON docs API; each entry links the page's JSON and Markdown forms. Described by the OpenAPI document at ${url(OPENAPI_PATH)}.`);
543
- }
544
- if (config.ai.mcp.enabled) {
545
- lines.push(`- [MCP server](${url(config.ai.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")}`);
546
- }
547
- if (config.ai.skills) {
548
- lines.push(`- [Agent skills](${url(AGENT_SKILLS_INDEX_PATH)}): Agent Skills discovery index of the skills this site publishes.`);
549
- }
550
- if (hasApiCatalog(config)) {
551
- lines.push(`- [API catalog](${url(API_CATALOG_PATH)}): RFC 9727 linkset of the APIs documented here.`);
552
- }
553
- if (hasAiCatalog(config)) {
554
- lines.push(`- [AI catalog](${url(AI_CATALOG_PATH)}): ARD manifest of the agent-facing resources on this site (MCP server, skills, APIs).`);
555
- }
556
- if (config.seo.agentReadability) {
557
- lines.push(`- [agent-readability.json](${url("/agent-readability.json")}): Manifest of every agent-facing artifact on this site.`);
558
- }
559
- if (site && config.seo.sitemap) {
560
- lines.push(`- [Sitemap](${url("/sitemap.xml")}): Every indexable page URL with its last-modified date.`);
561
- }
562
- return lines;
563
- };
564
- var eligiblePages = (project, options = {}) => project.graph.pages.filter((page) => !(page.meta.ai.exclude || page.meta.draft || page.meta.sidebar.hidden || page.meta.seo.noindex && page.source.name !== "openapi" || options.versions === "current" && page.version !== "") && (project.config.ai.llmsTxt.openapi || page.source.name !== "openapi"));
565
- var indexedNavigations = (project) => {
566
- const { i18n, versions } = project.config;
567
- const current = i18n ? i18n.locales.flatMap(({ code, label }) => {
568
- const nav = project.graph.navigationByLocale[code];
569
- if (!nav) {
570
- return [];
571
- }
572
- return [
573
- { label: code === i18n.defaultLocale ? undefined : label, nav }
574
- ];
575
- }) : [{ nav: project.graph.navigation }];
576
- const archived = (versions?.archived ?? []).flatMap((version) => {
577
- const byLocale = project.graph.navigationByVersion[version.id] ?? {};
578
- const versionLabel = `${version.label ?? version.id} (archived)`;
579
- return Object.entries(byLocale).flatMap(([code, nav]) => {
580
- const locale = i18n?.locales.find((entry) => entry.code === code);
581
- const label = locale && code !== i18n?.defaultLocale ? `${locale.label} — ${versionLabel}` : versionLabel;
582
- return [{ label, nav }];
583
- });
584
- });
585
- return [...current, ...archived];
586
- };
587
- var buildLlmsIndex = (project, options = {}) => {
588
- const { config } = project;
589
- const { site } = config.deployment;
590
- const base = normalizeBasePath(config.deployment.base);
591
- const eligible = eligiblePages(project);
592
- const byRoute = new Map(eligible.map((page) => [page.route, page]));
593
- const seen = new Set;
594
- const line = (page) => {
595
- seen.add(page.route);
596
- const summary = page.description ? `: ${page.description}` : "";
597
- return `- [${page.title}](${pageUrl(page.route, site, base)})${summary}`;
598
- };
599
- const renderLevel = (nodes, depth) => {
600
- const list = [];
601
- const groupBlocks = [];
602
- for (const node of nodes) {
603
- if (node.kind === "page") {
604
- const page = byRoute.get(node.route);
605
- if (page && !seen.has(page.route)) {
606
- list.push(line(page));
607
- }
608
- continue;
609
- }
610
- const rootPage = node.route ? byRoute.get(node.route) : undefined;
611
- const blocks = renderLevel(node.children, depth + 1);
612
- if (rootPage && !seen.has(rootPage.route)) {
613
- blocks.unshift(line(rootPage));
614
- }
615
- if (blocks.length > 0) {
616
- groupBlocks.push(`${"#".repeat(Math.min(depth, 6))} ${node.label}`, ...blocks);
617
- }
618
- }
619
- return list.length > 0 ? [list.join(`
620
- `), ...groupBlocks] : groupBlocks;
621
- };
622
- const renderNav = (nav, depth) => {
623
- const loose = nav.sidebar.filter((node) => node.kind === "page");
624
- const groups = nav.sidebar.filter((node) => node.kind === "group");
625
- const looseBlocks = renderLevel(loose, depth + 1);
626
- return [
627
- ...looseBlocks.length > 0 ? [`${"#".repeat(depth)} Docs`, ...looseBlocks] : [],
628
- ...renderLevel(groups, depth)
629
- ];
630
- };
631
- const blocks = [];
632
- for (const { label, nav } of indexedNavigations(project)) {
633
- if (label) {
634
- const localized = renderNav(nav, 3);
635
- if (localized.length > 0) {
636
- blocks.push(`## ${label}`, ...localized);
637
- }
638
- continue;
639
- }
640
- blocks.push(...renderNav(nav, 2));
641
- }
642
- const leftover = eligible.filter((page) => !seen.has(page.route)).toSorted((a, b) => a.route.localeCompare(b.route));
643
- if (leftover.length > 0) {
644
- blocks.push(blocks.length > 0 ? "## Other" : "## Docs", leftover.map(line).join(`
645
- `));
646
- }
647
- const feeds = buildRssFeeds(project);
648
- if (feeds.length > 0) {
649
- blocks.push("## RSS Feeds", feeds.map((feed) => `- [${feed.title}](${pageUrl(feed.path, site, base)})`).join(`
650
- `));
651
- }
652
- const skills = options.skills ?? [];
653
- if (skills.length > 0) {
654
- blocks.push("## Agent skills", skills.map((skill) => `- [${skill.name}](${pageUrl(`${AGENT_SKILLS_DIR}/${skill.path}`, site, base)}): ${oneLine(skill.description)}`).join(`
655
- `));
656
- }
657
- blocks.push("## Agent resources", agentResourceLines(project).join(`
658
- `));
659
- const header = config.description ? `# ${config.title}
660
-
661
- > ${config.description}` : `# ${config.title}`;
662
- const { details } = config.ai.llmsTxt;
663
- const lead = details ? `${header}
664
-
665
- ${details}` : header;
666
- return `${[lead, ...blocks].join(`
667
-
668
- `)}
669
- `;
670
- };
671
-
672
- // src/ai/markdown.ts
673
- var agentMarkdown = (entry) => entry.md ?? entry.mdx;
674
- var markdownTokenCount = (text) => Math.ceil(text.length / 4);
675
- var buildRawMarkdown = async (project) => {
676
- const pageById = new Map(project.graph.pages.map((page) => [page.id, page]));
677
- const components = projectComponentSerializers(project);
678
- const readRoute = async (route) => {
679
- const page = pageById.get(route.id);
680
- if (page) {
681
- return await readExpandedEntryText(project, page);
682
- }
683
- return route.sourcePath ? await readFile(route.sourcePath, "utf-8") : "";
684
- };
685
- const entries = await Promise.all(project.manifest.routes.map(async (route) => {
686
- let text = await readRoute(route);
687
- if (route.sourcePath) {
688
- text = rewriteRelativeImages({
689
- deployBase: project.config.deployment.base,
690
- projectRoot: project.context.root,
691
- source: text,
692
- sourcePath: route.sourcePath
693
- });
694
- }
695
- const source = applyAgentVisibility(text);
696
- const md = downlevelComponents(source, components, frontmatter_default(source).data);
697
- const entry = md === source ? { mdx: source } : { md, mdx: source };
698
- return [route.path, entry];
699
- }));
700
- const map = Object.fromEntries(entries);
701
- if (!map["/"]) {
702
- map["/"] = { mdx: buildLlmsIndex(project) };
703
- }
704
- return map;
705
- };
706
- var markdownRoutePaths = (project) => {
707
- const paths = project.manifest.routes.map((route) => route.path);
708
- return paths.includes("/") ? paths : [...paths, "/"];
709
- };
710
-
711
- // src/search/documents.ts
712
- import { markdownToMdast, mdxToMdast as mdxToMdast2 } from "satteri";
713
-
714
- // src/markdown/fence-meta.ts
715
- var QUOTED_ATTR = /[\w-]+=(?:"[^"]*"|'[^']*')/gu;
716
- var LINE_RANGE = /\{[^}]*\}/u;
717
- var META_TOKEN = new RegExp(`${QUOTED_ATTR.source}|${LINE_RANGE.source}|\\S+`, "gu");
718
- var metaTokens = (meta) => meta?.match(META_TOKEN) ?? [];
719
- var RESERVED_META_KEYWORDS = new Set([
720
- "lineNumbers",
721
- "ts2js",
722
- "twoslash"
723
- ]);
724
- var isLineRange = (token) => token.startsWith("{");
725
-
726
- // src/markdown/code-title.ts
727
- var TITLE_ATTR = /(?:^|\s)title=(?:"(?<dq>[^"]*)"|'(?<sq>[^']*)')/u;
728
- var isTitleToken = (token) => token.length > 0 && !isLineRange(token) && !token.includes("=") && !RESERVED_META_KEYWORDS.has(token);
729
- var parseCodeTitle = (raw) => {
730
- if (!raw) {
731
- return;
732
- }
733
- const scrubbed = raw.replace(QUOTED_ATTR, (attr) => attr.startsWith("title=") ? attr : " ");
734
- const explicit = scrubbed.match(TITLE_ATTR);
735
- const attrTitle = explicit?.groups?.dq ?? explicit?.groups?.sq;
736
- if (attrTitle) {
737
- return attrTitle;
738
- }
739
- return metaTokens(raw).find(isTitleToken);
740
- };
741
-
742
- // src/search/facets.ts
743
- var isFacetValue = (value) => typeof value === "string" || typeof value === "number" || typeof value === "boolean";
744
- var pageFacets = (page, config) => {
745
- const declared = config.content.types[page.contentType]?.facets;
746
- if (!declared || declared.length === 0 || !page.custom) {
747
- return;
748
- }
749
- const facets = {};
750
- for (const key of declared) {
751
- const value = page.custom[key];
752
- if (isFacetValue(value)) {
753
- facets[key] = String(value);
754
- }
755
- }
756
- return Object.keys(facets).length > 0 ? facets : undefined;
757
- };
758
-
759
- // src/search/documents.ts
760
- var HTML_OR_JSX = /<\/?[a-zA-Z][^\n<>]*>|<\/?>/gu;
761
- var WHITESPACE = /\s+/gu;
762
- var INLINE_PARENTS = new Set([
763
- "delete",
764
- "emphasis",
765
- "footnoteReference",
766
- "link",
767
- "linkReference",
768
- "mdxJsxTextElement",
769
- "strong",
770
- "subscript",
771
- "superscript",
772
- "textDirective"
773
- ]);
774
- var NON_PROSE = new Set([
775
- "image",
776
- "imageReference",
777
- "inlineMath",
778
- "math",
779
- "mdxFlowExpression",
780
- "mdxTextExpression",
781
- "mdxjsEsm"
782
- ]);
783
- var MD_PARSE = { features: { ...MARKDOWN_FEATURES, frontmatter: false } };
784
- var MDX_PARSE = { features: { ...MDX_FEATURES, frontmatter: false } };
785
- var parseMdx = (markdown) => {
786
- try {
787
- return mdxToMdast2(markdown, MDX_PARSE);
788
- } catch {
789
- return;
790
- }
791
- };
792
- var parseMarkdown = (markdown, format) => format === "mdx" ? parseMdx(markdown) : markdownToMdast(markdown, MD_PARSE);
793
- var collectCode = (node, out, walk) => {
794
- if (!walk.includeCodeBlocks) {
795
- return;
796
- }
797
- const title = parseCodeTitle(node.meta ?? undefined);
798
- if (title) {
799
- out.push(title, " ");
800
- }
801
- out.push(node.value, " ");
802
- };
803
- var separatesWords = (node) => !INLINE_PARENTS.has(node.type) || node.children.length === 0;
804
- var collectText = (node, out, walk) => {
805
- if (NON_PROSE.has(node.type)) {
806
- return;
807
- }
808
- switch (node.type) {
809
- case "code": {
810
- collectCode(node, out, walk);
811
- return;
812
- }
813
- case "mdxJsxFlowElement": {
814
- const text = downlevelComponentNode(node, walk.downlevel);
815
- if (text !== null) {
816
- collectText(markdownToMdast(text, MD_PARSE), out, walk);
817
- return;
818
- }
819
- break;
820
- }
821
- case "inlineCode": {
822
- out.push(node.value);
823
- return;
824
- }
825
- case "html": {
826
- out.push(node.value.replaceAll(HTML_COMMENT, " ").replaceAll(HTML_OR_JSX, " "), " ");
827
- return;
828
- }
829
- case "break": {
830
- out.push(" ");
831
- return;
832
- }
833
- case "heading": {
834
- const last = node.children.at(-1);
835
- const trailing = last?.type === "text" ? last : undefined;
836
- const inner = [];
837
- const kept = trailing ? node.children.slice(0, -1) : node.children;
838
- for (const child of kept) {
839
- collectText(child, inner, walk);
840
- }
841
- if (trailing) {
842
- const stripped = parseHeadingMarkers(trailing.value).text;
843
- const literal = stripped === "" && node.children.length === 1;
844
- inner.push(literal ? trailing.value : stripped);
845
- }
846
- out.push(inner.join("").trimEnd(), " ");
847
- return;
848
- }
849
- default: {
850
- break;
851
- }
852
- }
853
- if ("value" in node) {
854
- out.push(node.value);
855
- return;
856
- }
857
- if ("children" in node) {
858
- for (const child of node.children) {
859
- collectText(child, out, walk);
860
- }
861
- if (separatesWords(node)) {
862
- out.push(" ");
863
- }
864
- }
865
- };
866
- var toPlainText = (markdown, format, walk) => {
867
- const tree = parseMarkdown(markdown, format);
868
- if (!tree) {
869
- return "";
870
- }
871
- const out = [];
872
- collectText(tree, out, walk);
873
- return out.join("").replaceAll(WHITESPACE, " ").trim();
874
- };
875
- var buildCrumbIndex = (sidebar) => {
876
- const index = new Map;
877
- const groupRoutes = new Map;
878
- const walk = (nodes, trail) => {
879
- for (const node of nodes) {
880
- if (node.kind === "group") {
881
- if (node.route && !groupRoutes.has(node.route)) {
882
- groupRoutes.set(node.route, {
883
- breadcrumb: [...trail, node.label],
884
- section: node.label
885
- });
886
- }
887
- walk(node.children, [...trail, node.label]);
888
- } else if (node.route) {
889
- index.set(node.route, {
890
- breadcrumb: trail,
891
- section: trail.at(-1) ?? ""
892
- });
893
- }
894
- }
895
- };
896
- walk(sidebar, []);
897
- for (const [route, crumbs] of groupRoutes) {
898
- if (!index.has(route)) {
899
- index.set(route, crumbs);
900
- }
901
- }
902
- return index;
903
- };
904
- var pageBody = async (project, page, options, components) => {
905
- if (!page) {
906
- return "";
907
- }
908
- const parsed = frontmatter_default(await readExpandedEntryText(project, page));
909
- const visible = applyAudienceVisibility(parsed.content, options?.audience ?? "web");
910
- if (options?.content === "markdown") {
911
- return downlevelComponents(visible.trim(), components, parsed.data);
912
- }
913
- return toPlainText(visible, page.format, {
914
- downlevel: {
915
- frontmatter: parsed.data,
916
- registry: componentRegistry(components),
917
- source: visible
918
- },
919
- includeCodeBlocks: project.config.search.indexing.includeCodeBlocks
920
- });
921
- };
922
- var buildSearchDocuments = async (project, options) => {
923
- const pageById = new Map(project.graph.pages.map((page) => [page.id, page]));
924
- const byLocale = Object.values(project.graph.navigationByLocale ?? {});
925
- const byVersion = Object.values(project.graph.navigationByVersion ?? {}).flatMap((locales) => Object.values(locales)).map((nav) => nav.sidebar);
926
- const sidebars = [
927
- ...byLocale.length > 0 ? byLocale.map((nav) => nav.sidebar) : [project.graph.navigation?.sidebar ?? []],
928
- ...byVersion
929
- ];
930
- const crumbs = new Map;
931
- for (const sidebar of sidebars) {
932
- for (const [route, crumb] of buildCrumbIndex(sidebar)) {
933
- crumbs.set(route, crumb);
934
- }
935
- }
936
- const indexable = project.manifest.routes.filter((route) => {
937
- if (!options?.includeWhenDisabled) {
938
- return route.indexable;
939
- }
940
- const page = pageById.get(route.id);
941
- return page ? contentIndexable(page, project.config) : false;
942
- });
943
- const components = projectComponentSerializers(project);
944
- return await Promise.all(indexable.map(async (route) => {
945
- const page = pageById.get(route.id);
946
- const body = await pageBody(project, page, options, components);
947
- const tags = page?.meta?.search?.tags;
948
- const crumb = crumbs.get(route.path);
949
- const facets = page ? pageFacets(page, project.config) : undefined;
950
- const document = {
951
- breadcrumb: crumb?.breadcrumb ?? [],
952
- content: body,
953
- contentType: route.contentType,
954
- description: page?.description ?? "",
955
- locale: route.locale,
956
- route: route.path,
957
- section: crumb?.section || "Docs",
958
- tags: tags && tags.length > 0 ? tags : undefined,
959
- title: route.title,
960
- version: route.version
961
- };
962
- if (facets) {
963
- document.facets = facets;
964
- }
965
- return document;
966
- }));
967
- };
968
-
969
- // src/ai/mcp/data.ts
970
- var buildMcpData = async (project) => {
971
- const { config, graph, manifest } = project;
972
- const [documents, rawMarkdown] = await Promise.all([
973
- buildSearchDocuments(project, {
974
- audience: "agents",
975
- includeWhenDisabled: true
976
- }),
977
- buildRawMarkdown(project)
978
- ]);
979
- const pages = Object.fromEntries(Object.entries(rawMarkdown).map(([route, entry]) => [
980
- route,
981
- agentMarkdown(entry)
982
- ]));
983
- const pageById = new Map(graph.pages.map((page) => [page.id, page]));
984
- const routes = [];
985
- for (const route of manifest.routes) {
986
- if (route.hidden) {
987
- continue;
988
- }
989
- const page = pageById.get(route.id);
990
- const facets = page ? pageFacets(page, config) : undefined;
991
- const entry = {
992
- contentType: route.contentType,
993
- description: page?.description,
994
- indexable: route.indexable,
995
- lastModified: route.lastModified ?? null,
996
- locale: route.locale,
997
- route: route.path,
998
- title: route.title,
999
- version: route.version
1000
- };
1001
- if (facets) {
1002
- entry.facets = facets;
1003
- }
1004
- routes.push(entry);
1005
- }
1006
- const data = {
1007
- base: normalizeBasePath(config.deployment.base),
1008
- defaultLocale: config.i18n?.defaultLocale,
1009
- documents: documents.map((doc) => {
1010
- const document = {
1011
- content: doc.content,
1012
- contentType: doc.contentType,
1013
- description: doc.description,
1014
- locale: doc.locale,
1015
- route: doc.route,
1016
- title: doc.title,
1017
- version: doc.version
1018
- };
1019
- if (doc.facets) {
1020
- document.facets = doc.facets;
1021
- }
1022
- return document;
1023
- }),
1024
- instructions: config.ai.mcp.instructions,
1025
- name: config.ai.mcp.name ?? config.title,
1026
- navigation: graph.navigation,
1027
- pages,
1028
- routes,
1029
- site: config.deployment.site ?? null,
1030
- version: manifest.blumeVersion
1031
- };
1032
- if (config.versions) {
1033
- data.archivedVersions = config.versions.archived.map((version) => version.id);
1034
- data.navigationByVersion = graph.navigationByVersion;
1035
- }
1036
- if (config.i18n) {
1037
- data.navigationByLocale = graph.navigationByLocale;
1038
- }
1039
- return data;
1040
- };
1041
-
1042
- export { buildRssFeeds, renderRssFeed, agentMarkdown, markdownTokenCount, buildRawMarkdown, markdownRoutePaths, buildSearchDocuments, buildMcpData };
1043
-
1044
- //# debugId=C4FFCCF7AB670FCD64756E2164756E21
1045
- //# sourceMappingURL=chunk-js7saxwm.js.map