blume 1.7.3 → 2.0.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 (690) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +34 -21
  4. package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
  5. package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
  6. package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
  7. package/dist/cli/chunk-5shv93fd.js +39 -0
  8. package/dist/cli/chunk-5shv93fd.js.map +10 -0
  9. package/dist/cli/chunk-6crbhc3x.js +361 -0
  10. package/dist/cli/chunk-6crbhc3x.js.map +14 -0
  11. package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
  12. package/dist/cli/chunk-6hsn950k.js.map +10 -0
  13. package/dist/cli/chunk-6vm74dry.js +148 -0
  14. package/dist/cli/chunk-6vm74dry.js.map +10 -0
  15. package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
  16. package/dist/cli/chunk-79jhk4py.js.map +35 -0
  17. package/dist/cli/chunk-82bbrxdn.js +51 -0
  18. package/dist/cli/chunk-82bbrxdn.js.map +10 -0
  19. package/dist/cli/chunk-abh8yjkn.js +31 -0
  20. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  21. package/dist/cli/chunk-ah61y8py.js +75 -0
  22. package/dist/cli/chunk-ah61y8py.js.map +11 -0
  23. package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
  24. package/dist/cli/chunk-ch6g3ar0.js +102 -0
  25. package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
  26. package/dist/cli/chunk-dh8cwk36.js +279 -0
  27. package/dist/cli/chunk-dh8cwk36.js.map +10 -0
  28. package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
  29. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
  30. package/dist/cli/chunk-f2z5v128.js +97 -0
  31. package/dist/cli/chunk-f2z5v128.js.map +10 -0
  32. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  33. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  34. package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
  35. package/dist/cli/chunk-fs23ddbb.js.map +35 -0
  36. package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
  37. package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
  38. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
  39. package/dist/cli/chunk-hdpx1tax.js +91 -0
  40. package/dist/cli/chunk-hdpx1tax.js.map +10 -0
  41. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  42. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  43. package/dist/cli/{chunk-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
  44. package/dist/cli/chunk-jwyddg7y.js.map +15 -0
  45. package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
  46. package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
  47. package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
  48. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
  49. package/dist/cli/chunk-m3vmjgmq.js +133 -0
  50. package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
  51. package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
  52. package/dist/cli/chunk-mb2919y2.js.map +10 -0
  53. package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
  54. package/dist/cli/chunk-q5163e60.js.map +11 -0
  55. package/dist/cli/chunk-qkqwkpte.js +12437 -0
  56. package/dist/cli/chunk-qkqwkpte.js.map +182 -0
  57. package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
  58. package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
  59. package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
  60. package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
  61. package/dist/cli/chunk-s1p84fyh.js +261 -0
  62. package/dist/cli/chunk-s1p84fyh.js.map +10 -0
  63. package/dist/cli/chunk-s6jhgk0q.js +176 -0
  64. package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
  65. package/dist/cli/chunk-vtk4a6dg.js +374 -0
  66. package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
  67. package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
  68. package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
  69. package/dist/cli/chunk-wm7js3j9.js +145 -0
  70. package/dist/cli/chunk-wm7js3j9.js.map +11 -0
  71. package/dist/cli/chunk-yt5n7ppj.js +79 -0
  72. package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
  73. package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
  74. package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
  75. package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
  76. package/dist/cli/chunk-zxh4d9vy.js +122 -0
  77. package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
  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-context.d.ts +7 -7
  85. package/dist/types/ai/ask.d.ts +368 -0
  86. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  87. package/dist/types/ai/component-markdown.d.ts +2 -2
  88. package/dist/types/ai/index.d.ts +24 -0
  89. package/dist/types/ai/link-headers.d.ts +24 -0
  90. package/dist/types/ai/llms.d.ts +25 -0
  91. package/dist/types/ai/markdown.d.ts +45 -0
  92. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  93. package/dist/types/ai/mcp/tools.d.ts +16 -0
  94. package/dist/types/ai/openapi-components.d.ts +43 -0
  95. package/dist/types/ai/relative-links.d.ts +26 -0
  96. package/dist/types/ai/serializers.d.ts +15 -0
  97. package/dist/types/ai/skills.d.ts +42 -0
  98. package/dist/types/ai/tar.d.ts +25 -0
  99. package/dist/types/ai/visibility.d.ts +17 -0
  100. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  101. package/dist/types/analytics/adobe.d.ts +35 -0
  102. package/dist/types/analytics/amplitude.d.ts +50 -0
  103. package/dist/types/analytics/clarity.d.ts +31 -0
  104. package/dist/types/analytics/clearbit.d.ts +29 -0
  105. package/dist/types/analytics/cloudflare.d.ts +41 -0
  106. package/dist/types/analytics/fathom.d.ts +41 -0
  107. package/dist/types/analytics/google-analytics.d.ts +44 -0
  108. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  109. package/dist/types/analytics/head.d.ts +30 -0
  110. package/dist/types/analytics/heap.d.ts +40 -0
  111. package/dist/types/analytics/hightouch.d.ts +44 -0
  112. package/dist/types/analytics/hotjar.d.ts +33 -0
  113. package/dist/types/analytics/index.d.ts +61 -0
  114. package/dist/types/analytics/inline.d.ts +17 -0
  115. package/dist/types/analytics/logrocket.d.ts +44 -0
  116. package/dist/types/analytics/mixpanel.d.ts +67 -0
  117. package/dist/types/analytics/pirsch.d.ts +42 -0
  118. package/dist/types/analytics/plausible.d.ts +56 -0
  119. package/dist/types/analytics/posthog.d.ts +45 -0
  120. package/dist/types/analytics/schema.d.ts +320 -0
  121. package/dist/types/analytics/script.d.ts +46 -0
  122. package/dist/types/analytics/segment.d.ts +50 -0
  123. package/dist/types/analytics/vercel.d.ts +48 -0
  124. package/dist/types/astro/integration.d.ts +76 -0
  125. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  126. package/dist/types/astro/module-types.d.ts +14 -0
  127. package/dist/types/astro/pages.d.ts +44 -0
  128. package/dist/types/cli/env.d.ts +12 -0
  129. package/dist/types/cli/init/scaffold.d.ts +154 -0
  130. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  131. package/dist/types/core/adapter.d.ts +47 -0
  132. package/dist/types/core/api-name.d.ts +7 -0
  133. package/dist/types/core/changelog-index.d.ts +13 -0
  134. package/dist/types/core/config-input.d.ts +197 -526
  135. package/dist/types/core/config.d.ts +61 -35
  136. package/dist/types/core/content-assets.d.ts +76 -0
  137. package/dist/types/core/custom-pages.d.ts +33 -0
  138. package/dist/types/core/data.d.ts +30 -15
  139. package/dist/types/core/define-components.d.ts +12 -9
  140. package/dist/types/core/deployment-env.d.ts +6 -11
  141. package/dist/types/core/frontmatter.d.ts +10 -0
  142. package/dist/types/core/graph.d.ts +18 -0
  143. package/dist/types/core/heading-markers.d.ts +54 -0
  144. package/dist/types/core/i18n-ui.d.ts +12 -10
  145. package/dist/types/core/i18n.d.ts +87 -0
  146. package/dist/types/core/includes.d.ts +138 -0
  147. package/dist/types/core/last-modified.d.ts +47 -0
  148. package/dist/types/core/links.d.ts +95 -0
  149. package/dist/types/core/locale-links.d.ts +60 -0
  150. package/dist/types/core/manifest.d.ts +17 -0
  151. package/dist/types/core/meta.d.ts +38 -0
  152. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  153. package/dist/types/core/navigation.d.ts +6 -0
  154. package/dist/types/core/node-require.d.ts +19 -0
  155. package/dist/types/core/package-json.d.ts +13 -0
  156. package/dist/types/core/probe.d.ts +42 -0
  157. package/dist/types/core/project-graph.d.ts +51 -0
  158. package/dist/types/core/project.d.ts +2 -0
  159. package/dist/types/core/safe-href.d.ts +2 -0
  160. package/dist/types/core/safe-links.d.ts +26 -0
  161. package/dist/types/core/schema.d.ts +2284 -454
  162. package/dist/types/core/site-url.d.ts +16 -0
  163. package/dist/types/core/sources/assets.d.ts +36 -0
  164. package/dist/types/core/sources/cache.d.ts +37 -0
  165. package/dist/types/core/sources/collection.d.ts +28 -0
  166. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  167. package/dist/types/core/sources/contentful.d.ts +40 -0
  168. package/dist/types/core/sources/filesystem.d.ts +24 -0
  169. package/dist/types/core/sources/github-releases.d.ts +31 -0
  170. package/dist/types/core/sources/json.d.ts +30 -0
  171. package/dist/types/core/sources/lexical.d.ts +19 -0
  172. package/dist/types/core/sources/lower.d.ts +75 -0
  173. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  174. package/dist/types/core/sources/normalize.d.ts +147 -0
  175. package/dist/types/core/sources/notion.d.ts +131 -0
  176. package/dist/types/core/sources/obsidian.d.ts +46 -0
  177. package/dist/types/core/sources/payload.d.ts +39 -0
  178. package/dist/types/core/sources/portable-text.d.ts +42 -0
  179. package/dist/types/core/sources/read.d.ts +23 -0
  180. package/dist/types/core/sources/remote.d.ts +74 -0
  181. package/dist/types/core/sources/resolve.d.ts +19 -0
  182. package/dist/types/core/sources/sanity.d.ts +43 -0
  183. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  184. package/dist/types/core/sources/strapi.d.ts +33 -0
  185. package/dist/types/core/sources/types.d.ts +7 -0
  186. package/dist/types/core/sources/watch.d.ts +45 -0
  187. package/dist/types/core/text-width.d.ts +11 -0
  188. package/dist/types/core/types.d.ts +15 -1
  189. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  190. package/dist/types/core/versions.d.ts +72 -0
  191. package/dist/types/core/yaml.d.ts +9 -0
  192. package/dist/types/deploy/adapter-output.d.ts +45 -0
  193. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  194. package/dist/types/deploy/adapters/index.d.ts +29 -0
  195. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  196. package/dist/types/deploy/adapters/node.d.ts +37 -0
  197. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  198. package/dist/types/deploy/adapters/types.d.ts +71 -0
  199. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  200. package/dist/types/deploy/artifacts.d.ts +65 -0
  201. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  202. package/dist/types/deploy/function-bundle.d.ts +80 -0
  203. package/dist/types/deploy/headers.d.ts +50 -0
  204. package/dist/types/deploy/node-headers.d.ts +42 -0
  205. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  206. package/dist/types/deploy/platforms/index.d.ts +18 -0
  207. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  208. package/dist/types/deploy/platforms/node.d.ts +11 -0
  209. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  210. package/dist/types/deploy/platforms/static.d.ts +10 -0
  211. package/dist/types/deploy/platforms/types.d.ts +104 -0
  212. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  213. package/dist/types/deploy/redirects.d.ts +53 -0
  214. package/dist/types/deploy/robots.d.ts +8 -0
  215. package/dist/types/deploy/rss.d.ts +31 -0
  216. package/dist/types/deploy/sitemap.d.ts +21 -0
  217. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  218. package/dist/types/markdown/code-title.d.ts +32 -0
  219. package/dist/types/markdown/fence-meta.d.ts +23 -0
  220. package/dist/types/markdown/themes.d.ts +3 -3
  221. package/dist/types/openapi/asyncapi.d.ts +129 -0
  222. package/dist/types/openapi/graphql-build.d.ts +8 -0
  223. package/dist/types/openapi/graphql.d.ts +122 -0
  224. package/dist/types/openapi/model.d.ts +158 -0
  225. package/dist/types/openapi/parse.d.ts +57 -0
  226. package/dist/types/openapi/references.d.ts +37 -25
  227. package/dist/types/openapi/render-mdx.d.ts +33 -0
  228. package/dist/types/openapi/sentence.d.ts +7 -0
  229. package/dist/types/openapi/signature.d.ts +10 -0
  230. package/dist/types/openapi/source.d.ts +22 -0
  231. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  232. package/dist/types/reference/asyncapi.d.ts +166 -0
  233. package/dist/types/reference/graphql.d.ts +181 -0
  234. package/dist/types/reference/index.d.ts +32 -0
  235. package/dist/types/reference/openapi.d.ts +165 -0
  236. package/dist/types/reference/options.d.ts +157 -0
  237. package/dist/types/reference/scalar.d.ts +136 -0
  238. package/dist/types/reference/schema.d.ts +630 -0
  239. package/dist/types/search/adapters/algolia.d.ts +32 -0
  240. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  241. package/dist/types/search/adapters/index.d.ts +31 -0
  242. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  243. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  244. package/dist/types/search/adapters/orama.d.ts +13 -0
  245. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  246. package/dist/types/search/adapters/registry.d.ts +228 -0
  247. package/dist/types/search/adapters/types.d.ts +34 -0
  248. package/dist/types/search/adapters/typesense.d.ts +42 -0
  249. package/dist/types/search/build.d.ts +23 -0
  250. package/dist/types/search/documents.d.ts +90 -0
  251. package/dist/types/search/facets.d.ts +3 -0
  252. package/dist/types/search/orama-index.d.ts +1 -1
  253. package/dist/types/search/sync/algolia.d.ts +14 -0
  254. package/dist/types/search/sync/index.d.ts +14 -0
  255. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  256. package/dist/types/search/sync/typesense.d.ts +14 -0
  257. package/dist/types/sources/contentful.d.ts +68 -0
  258. package/dist/types/sources/custom.d.ts +20 -0
  259. package/dist/types/sources/filesystem.d.ts +42 -0
  260. package/dist/types/sources/github-releases.d.ts +46 -0
  261. package/dist/types/sources/index.d.ts +48 -0
  262. package/dist/types/sources/mdx-remote.d.ts +63 -0
  263. package/dist/types/sources/notion.d.ts +65 -0
  264. package/dist/types/sources/obsidian.d.ts +34 -0
  265. package/dist/types/sources/payload.d.ts +68 -0
  266. package/dist/types/sources/registry.d.ts +1414 -0
  267. package/dist/types/sources/sanity.d.ts +69 -0
  268. package/dist/types/sources/shared.d.ts +46 -0
  269. package/dist/types/sources/strapi.d.ts +66 -0
  270. package/dist/types/theme/icon-kind.d.ts +11 -0
  271. package/dist/types/theme/icons.d.ts +20 -0
  272. package/docs/01-quickstart.mdx +18 -18
  273. package/docs/02-deployment.mdx +52 -28
  274. package/docs/03-upgrading.mdx +364 -0
  275. package/docs/04-migrating.mdx +58 -0
  276. package/docs/08-faq.mdx +5 -5
  277. package/docs/advanced/blog.mdx +13 -6
  278. package/docs/advanced/changelog.mdx +23 -35
  279. package/docs/advanced/custom-pages.mdx +22 -10
  280. package/docs/advanced/meta.ts +1 -8
  281. package/docs/advanced/skills.mdx +8 -0
  282. package/docs/cli/audit.mdx +646 -0
  283. package/docs/cli/doctor.mdx +29 -0
  284. package/docs/{reference/eval.mdx → cli/evals.mdx} +12 -11
  285. package/docs/cli/index.mdx +105 -0
  286. package/docs/cli/meta.ts +7 -0
  287. package/docs/{reference → cli}/translate.mdx +9 -9
  288. package/docs/cli/validate.mdx +41 -0
  289. package/docs/cli/version.mdx +40 -0
  290. package/docs/configuration/analytics.mdx +350 -59
  291. package/docs/configuration/assistant.mdx +357 -0
  292. package/docs/configuration/customization.mdx +16 -10
  293. package/docs/configuration/index.mdx +50 -31
  294. package/docs/configuration/meta.ts +1 -1
  295. package/docs/configuration/search.mdx +76 -55
  296. package/docs/configuration/theming.mdx +24 -15
  297. package/docs/content/components.mdx +21 -5
  298. package/docs/{reference → content}/frontmatter.mdx +35 -1
  299. package/docs/content/i18n.mdx +9 -7
  300. package/docs/content/includes.mdx +2 -4
  301. package/docs/content/index.mdx +1 -1
  302. package/docs/content/islands.mdx +11 -6
  303. package/docs/content/meta.mdx +1 -1
  304. package/docs/content/meta.ts +1 -0
  305. package/docs/content/navigation.mdx +9 -7
  306. package/docs/content/sources.mdx +145 -50
  307. package/docs/content/syntax.mdx +16 -12
  308. package/docs/content/versioning.mdx +3 -3
  309. package/docs/discoverability/agent-discovery.mdx +12 -12
  310. package/docs/discoverability/index.mdx +4 -4
  311. package/docs/discoverability/json-api.mdx +4 -4
  312. package/docs/discoverability/llms-txt.mdx +6 -6
  313. package/docs/discoverability/markdown.mdx +4 -4
  314. package/docs/discoverability/mcp.mdx +11 -11
  315. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  316. package/docs/index.mdx +4 -4
  317. package/docs/references/asyncapi.mdx +59 -0
  318. package/docs/{advanced → references}/graphql.mdx +45 -32
  319. package/docs/{reference → references}/meta.ts +2 -2
  320. package/docs/references/openapi.mdx +171 -0
  321. package/docs/references/scalar.mdx +64 -0
  322. package/package.json +42 -8
  323. package/skills/blume/SKILL.md +23 -10
  324. package/skills/blume-migrate/SKILL.md +22 -21
  325. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  326. package/skills/blume-migrate/references/docusaurus.md +5 -4
  327. package/skills/blume-migrate/references/fumadocs.md +4 -4
  328. package/skills/blume-migrate/references/mintlify.md +23 -8
  329. package/skills/blume-migrate/references/monorepo.md +6 -6
  330. package/skills/blume-migrate/references/starlight.md +4 -4
  331. package/src/ai/agent-readability.ts +25 -26
  332. package/src/ai/ai-catalog.ts +50 -32
  333. package/src/ai/api/handlers.ts +46 -11
  334. package/src/ai/api/paths.ts +1 -1
  335. package/src/ai/api-catalog.ts +8 -8
  336. package/src/ai/ask-context.ts +7 -7
  337. package/src/ai/ask-data.ts +3 -3
  338. package/src/ai/ask.ts +637 -100
  339. package/src/ai/changelog-markdown.ts +91 -0
  340. package/src/ai/component-markdown.ts +328 -12
  341. package/src/ai/cors.ts +3 -3
  342. package/src/ai/index.ts +45 -0
  343. package/src/ai/link-headers.ts +7 -6
  344. package/src/ai/llms.ts +20 -15
  345. package/src/ai/markdown.ts +35 -5
  346. package/src/ai/mcp/data.ts +9 -5
  347. package/src/ai/openapi-components.ts +5 -2
  348. package/src/ai/relative-links.ts +170 -0
  349. package/src/ai/serializers.ts +3 -3
  350. package/src/ai/skills.ts +1 -1
  351. package/src/ai/visibility.ts +1 -1
  352. package/src/ai/web-bot-auth.ts +2 -2
  353. package/src/analytics/adobe.ts +46 -0
  354. package/src/analytics/amplitude.ts +79 -0
  355. package/src/analytics/clarity.ts +46 -0
  356. package/src/analytics/clearbit.ts +47 -0
  357. package/src/analytics/cloudflare.ts +67 -0
  358. package/src/analytics/fathom.ts +64 -0
  359. package/src/analytics/google-analytics.ts +84 -0
  360. package/src/analytics/google-tag-manager.ts +61 -0
  361. package/src/analytics/head.ts +130 -0
  362. package/src/analytics/heap.ts +65 -0
  363. package/src/analytics/hightouch.ts +77 -0
  364. package/src/analytics/hotjar.ts +47 -0
  365. package/src/analytics/index.ts +71 -0
  366. package/src/analytics/inline.ts +21 -0
  367. package/src/analytics/logrocket.ts +71 -0
  368. package/src/analytics/mixpanel.ts +92 -0
  369. package/src/analytics/pirsch.ts +66 -0
  370. package/src/analytics/plausible.ts +83 -0
  371. package/src/analytics/posthog.ts +78 -0
  372. package/src/analytics/schema.ts +60 -0
  373. package/src/analytics/script.ts +60 -0
  374. package/src/analytics/segment.ts +85 -0
  375. package/src/analytics/vercel.ts +50 -0
  376. package/src/astro/adapter-root.ts +7 -9
  377. package/src/astro/component-slots.ts +131 -91
  378. package/src/astro/generate.ts +129 -361
  379. package/src/astro/integration.ts +2 -6
  380. package/src/astro/module-types.ts +1 -1
  381. package/src/astro/pages.ts +13 -101
  382. package/src/astro/render-deps.ts +379 -0
  383. package/src/astro/runtime-deps.ts +201 -0
  384. package/src/astro/templates.ts +575 -562
  385. package/src/audit/agent.ts +24 -0
  386. package/src/audit/catalog.ts +2 -2
  387. package/src/audit/checks/assets.ts +2 -2
  388. package/src/audit/checks/dns-aid.ts +1 -1
  389. package/src/audit/checks/duplicates.ts +3 -1
  390. package/src/audit/checks/i18n.ts +1 -1
  391. package/src/audit/checks/indexability.ts +7 -7
  392. package/src/audit/checks/links.ts +2 -2
  393. package/src/audit/checks/llms.ts +6 -6
  394. package/src/audit/checks/network.ts +3 -3
  395. package/src/audit/checks/og-image.ts +2 -2
  396. package/src/audit/checks/robots.ts +1 -1
  397. package/src/audit/checks/sitemap.ts +2 -2
  398. package/src/audit/checks/social.ts +1 -1
  399. package/src/audit/run.ts +4 -3
  400. package/src/audit/terms.ts +31 -0
  401. package/src/audit/url.ts +13 -13
  402. package/src/blume-modules.d.ts +2 -2
  403. package/src/cli/command-meta.ts +10 -0
  404. package/src/cli/commands/audit.ts +40 -21
  405. package/src/cli/commands/build.ts +71 -316
  406. package/src/cli/commands/check.ts +1 -0
  407. package/src/cli/commands/dev.ts +40 -1
  408. package/src/cli/commands/doctor.ts +92 -14
  409. package/src/cli/commands/eject.ts +44 -7
  410. package/src/cli/commands/eval.ts +5 -5
  411. package/src/cli/commands/init.ts +161 -41
  412. package/src/cli/commands/migrate.ts +121 -0
  413. package/src/cli/commands/preview.ts +7 -1
  414. package/src/cli/commands/translate.ts +5 -5
  415. package/src/cli/commands/upgrade.ts +141 -0
  416. package/src/cli/commands/version.ts +57 -44
  417. package/src/cli/eject-scripts.ts +121 -6
  418. package/src/cli/index.ts +11 -1
  419. package/src/cli/init/install.ts +70 -0
  420. package/src/cli/init/questions.ts +7 -0
  421. package/src/cli/init/scaffold.ts +459 -75
  422. package/src/cli/lazy-command.ts +37 -1
  423. package/src/cli/prepare.ts +40 -6
  424. package/src/cli/required-secrets.ts +39 -12
  425. package/src/cli/unknown-flags.ts +266 -0
  426. package/src/cli/yarn-pnp.ts +52 -0
  427. package/src/components/content/AccordionItem.astro +7 -1
  428. package/src/components/content/Card.astro +4 -3
  429. package/src/components/content/ColorItem.astro +22 -4
  430. package/src/components/content/GithubInfo.astro +2 -2
  431. package/src/components/content/Prompt.astro +25 -25
  432. package/src/components/content/Tabs.astro +3 -1
  433. package/src/components/content/Tile.astro +2 -3
  434. package/src/components/content/Tooltip.astro +57 -9
  435. package/src/components/content/content-strings.ts +34 -0
  436. package/src/components/content/diff.ts +1 -1
  437. package/src/components/content/mermaid-element.ts +13 -2
  438. package/src/components/content/prompt-markdown.ts +292 -0
  439. package/src/components/content/tooltip-id.ts +41 -0
  440. package/src/components/copy-feedback.ts +1 -1
  441. package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
  442. package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
  443. package/src/components/islands/hooks.ts +36 -11
  444. package/src/components/layout/Analytics.astro +21 -79
  445. package/src/components/layout/Banner.astro +3 -1
  446. package/src/components/layout/DiscoveryLinks.astro +69 -0
  447. package/src/components/layout/Header.astro +93 -30
  448. package/src/components/layout/LanguageSwitcher.astro +4 -1
  449. package/src/components/layout/Logo.astro +23 -2
  450. package/src/components/layout/NavSelector.astro +13 -2
  451. package/src/components/layout/NavTree.astro +12 -3
  452. package/src/components/layout/NavTreeScript.astro +17 -3
  453. package/src/components/layout/PageActions.astro +3 -3
  454. package/src/components/layout/PageFeedback.astro +11 -1
  455. package/src/components/layout/PageLayout.astro +58 -11
  456. package/src/components/layout/Pagination.astro +7 -7
  457. package/src/components/layout/ReferenceLayout.astro +22 -13
  458. package/src/components/layout/RootLayout.astro +75 -72
  459. package/src/components/layout/Search.astro +43 -19
  460. package/src/components/layout/WebMcp.astro +1 -1
  461. package/src/components/layout/analytics-client.ts +73 -16
  462. package/src/components/layout/drawer-inert.ts +113 -15
  463. package/src/components/layout/dropdown-clamp.ts +105 -0
  464. package/src/components/layout/head-scripts.ts +15 -6
  465. package/src/components/layout/nav-utils.ts +17 -0
  466. package/src/components/layout/search/algolia.ts +8 -8
  467. package/src/components/layout/search/orama-cloud.ts +9 -7
  468. package/src/components/layout/search/typesense.ts +11 -17
  469. package/src/components/openapi/MessageComposer.astro +2 -2
  470. package/src/components/openapi/Playground.astro +2 -2
  471. package/src/components/openapi/description.ts +2 -2
  472. package/src/components/openapi/playground-client.ts +79 -10
  473. package/src/core/changelog-index.ts +24 -0
  474. package/src/core/code-fences.ts +1 -1
  475. package/src/core/component-overrides.ts +399 -154
  476. package/src/core/config-input.ts +201 -566
  477. package/src/core/config.ts +131 -42
  478. package/src/core/custom-pages.ts +105 -0
  479. package/src/core/data.ts +34 -15
  480. package/src/core/define-components.ts +12 -9
  481. package/src/core/deployment-env.ts +18 -74
  482. package/src/core/diagnostics.ts +14 -7
  483. package/src/core/graph.ts +69 -25
  484. package/src/core/i18n-ui.ts +41 -11
  485. package/src/core/i18n.ts +17 -0
  486. package/src/core/includes.ts +156 -38
  487. package/src/core/last-modified.ts +6 -11
  488. package/src/core/links.ts +166 -2
  489. package/src/core/manifest.ts +10 -3
  490. package/src/core/navigation.ts +115 -16
  491. package/src/core/new-tab.ts +35 -0
  492. package/src/core/node-require.ts +21 -0
  493. package/src/core/project-graph.ts +42 -26
  494. package/src/core/project.ts +9 -4
  495. package/src/core/request-body.ts +61 -0
  496. package/src/core/safe-href.ts +28 -0
  497. package/src/core/safe-links.ts +68 -0
  498. package/src/core/schema.ts +528 -745
  499. package/src/core/server-features.ts +10 -11
  500. package/src/core/sources/assets.ts +47 -11
  501. package/src/core/sources/collection.ts +67 -0
  502. package/src/core/sources/contentful-rich-text.ts +285 -0
  503. package/src/core/sources/contentful.ts +173 -0
  504. package/src/core/sources/github-releases.ts +51 -1
  505. package/src/core/sources/json.ts +71 -0
  506. package/src/core/sources/lexical.ts +195 -0
  507. package/src/core/sources/lower.ts +226 -0
  508. package/src/core/sources/normalize.ts +52 -2
  509. package/src/core/sources/notion.ts +39 -28
  510. package/src/core/sources/payload.ts +135 -0
  511. package/src/core/sources/portable-text.ts +11 -16
  512. package/src/core/sources/remote.ts +226 -0
  513. package/src/core/sources/resolve.ts +104 -166
  514. package/src/core/sources/sanity.ts +16 -49
  515. package/src/core/sources/strapi-blocks.ts +124 -0
  516. package/src/core/sources/strapi.ts +191 -0
  517. package/src/core/sources/types.ts +12 -1
  518. package/src/core/types.ts +15 -1
  519. package/src/core/ui-packs/ar.ts +10 -7
  520. package/src/core/ui-packs/bg.ts +10 -7
  521. package/src/core/ui-packs/bn.ts +10 -7
  522. package/src/core/ui-packs/ca.ts +7 -6
  523. package/src/core/ui-packs/cs.ts +10 -7
  524. package/src/core/ui-packs/da.ts +10 -7
  525. package/src/core/ui-packs/de.ts +10 -7
  526. package/src/core/ui-packs/el.ts +7 -6
  527. package/src/core/ui-packs/es.ts +7 -6
  528. package/src/core/ui-packs/fa.ts +10 -7
  529. package/src/core/ui-packs/fi.ts +10 -7
  530. package/src/core/ui-packs/fr.ts +7 -6
  531. package/src/core/ui-packs/he.ts +10 -7
  532. package/src/core/ui-packs/hi.ts +10 -7
  533. package/src/core/ui-packs/hr.ts +10 -7
  534. package/src/core/ui-packs/hu.ts +10 -7
  535. package/src/core/ui-packs/id.ts +10 -7
  536. package/src/core/ui-packs/it.ts +7 -6
  537. package/src/core/ui-packs/ja.ts +7 -6
  538. package/src/core/ui-packs/ko.ts +7 -6
  539. package/src/core/ui-packs/nl.ts +10 -7
  540. package/src/core/ui-packs/no.ts +10 -7
  541. package/src/core/ui-packs/pl.ts +10 -7
  542. package/src/core/ui-packs/pt-br.ts +7 -6
  543. package/src/core/ui-packs/pt.ts +7 -6
  544. package/src/core/ui-packs/ro.ts +10 -7
  545. package/src/core/ui-packs/ru.ts +10 -7
  546. package/src/core/ui-packs/sk.ts +10 -7
  547. package/src/core/ui-packs/sr.ts +10 -7
  548. package/src/core/ui-packs/sv.ts +10 -7
  549. package/src/core/ui-packs/th.ts +7 -6
  550. package/src/core/ui-packs/tr.ts +10 -7
  551. package/src/core/ui-packs/uk.ts +10 -7
  552. package/src/core/ui-packs/vi.ts +7 -6
  553. package/src/core/ui-packs/zh-tw.ts +7 -6
  554. package/src/core/ui-packs/zh.ts +7 -6
  555. package/src/core/unrecognized-keys.ts +10 -0
  556. package/src/core/version-cut.ts +116 -8
  557. package/src/deploy/adapter-output.ts +57 -97
  558. package/src/deploy/adapters/cloudflare.ts +39 -0
  559. package/src/deploy/adapters/index.ts +41 -0
  560. package/src/deploy/adapters/netlify.ts +34 -0
  561. package/src/deploy/adapters/node.ts +34 -0
  562. package/src/deploy/adapters/registry.ts +127 -0
  563. package/src/deploy/adapters/types.ts +92 -0
  564. package/src/deploy/adapters/vercel.ts +35 -0
  565. package/src/deploy/artifacts.ts +55 -27
  566. package/src/deploy/cloudflare-negotiation.ts +179 -100
  567. package/src/deploy/function-bundle.ts +18 -3
  568. package/src/deploy/headers.ts +124 -23
  569. package/src/deploy/node-headers.ts +198 -0
  570. package/src/deploy/platforms/cloudflare.ts +312 -0
  571. package/src/deploy/platforms/index.ts +67 -0
  572. package/src/deploy/platforms/netlify.ts +52 -0
  573. package/src/deploy/platforms/node.ts +40 -0
  574. package/src/deploy/platforms/paths.ts +42 -0
  575. package/src/deploy/platforms/static.ts +29 -0
  576. package/src/deploy/platforms/types.ts +112 -0
  577. package/src/deploy/platforms/vercel.ts +193 -0
  578. package/src/deploy/redirects.ts +30 -18
  579. package/src/deploy/robots.ts +3 -3
  580. package/src/deploy/rss.ts +2 -2
  581. package/src/deploy/sitemap.ts +2 -2
  582. package/src/deploy/vercel-negotiation.ts +2 -2
  583. package/src/eval/agents.ts +32 -1
  584. package/src/eval/findings.ts +19 -11
  585. package/src/eval/report.ts +10 -2
  586. package/src/markdown/external-links.ts +65 -0
  587. package/src/markdown/include.ts +45 -27
  588. package/src/markdown/index.ts +34 -9
  589. package/src/markdown/inline-code.ts +12 -6
  590. package/src/markdown/relative-links.ts +324 -0
  591. package/src/markdown/themes.ts +3 -3
  592. package/src/migrate/migrate.ts +149 -0
  593. package/src/openapi/parse.ts +64 -16
  594. package/src/openapi/proxy.ts +62 -10
  595. package/src/openapi/references.ts +147 -147
  596. package/src/openapi/render-mdx.ts +32 -10
  597. package/src/openapi/scalar.ts +15 -13
  598. package/src/openapi/sentence.ts +14 -0
  599. package/src/openapi/source.ts +37 -21
  600. package/src/openapi/spec-dependency-error.ts +15 -0
  601. package/src/reference/asyncapi.ts +83 -0
  602. package/src/reference/graphql.ts +89 -0
  603. package/src/reference/index.ts +40 -0
  604. package/src/reference/openapi.ts +83 -0
  605. package/src/reference/options.ts +201 -0
  606. package/src/reference/scalar.ts +136 -0
  607. package/src/reference/schema.ts +88 -0
  608. package/src/registry/eject.ts +109 -53
  609. package/src/search/adapters/algolia.ts +46 -0
  610. package/src/search/adapters/flexsearch.ts +29 -0
  611. package/src/search/adapters/index.ts +39 -0
  612. package/src/search/adapters/mixedbread.ts +39 -0
  613. package/src/search/adapters/orama-cloud.ts +51 -0
  614. package/src/search/adapters/orama.ts +24 -0
  615. package/src/search/adapters/pagefind.ts +27 -0
  616. package/src/search/adapters/registry.ts +131 -0
  617. package/src/search/adapters/types.ts +46 -0
  618. package/src/search/adapters/typesense.ts +57 -0
  619. package/src/search/build.ts +8 -4
  620. package/src/search/documents.ts +8 -2
  621. package/src/search/orama-index.ts +1 -1
  622. package/src/search/sync/algolia.ts +12 -11
  623. package/src/search/sync/index.ts +35 -20
  624. package/src/search/sync/orama-cloud.ts +12 -9
  625. package/src/search/sync/typesense.ts +15 -13
  626. package/src/sources/contentful.ts +63 -0
  627. package/src/sources/custom.ts +38 -0
  628. package/src/sources/filesystem.ts +51 -0
  629. package/src/sources/github-releases.ts +52 -0
  630. package/src/sources/index.ts +60 -0
  631. package/src/sources/mdx-remote.ts +76 -0
  632. package/src/sources/notion.ts +63 -0
  633. package/src/sources/obsidian.ts +38 -0
  634. package/src/sources/payload.ts +60 -0
  635. package/src/sources/registry.ts +182 -0
  636. package/src/sources/sanity.ts +66 -0
  637. package/src/sources/shared.ts +52 -0
  638. package/src/sources/strapi.ts +58 -0
  639. package/src/theme/entry.ts +24 -2
  640. package/src/translate/report.ts +40 -7
  641. package/src/upgrade/upgrade.ts +499 -0
  642. package/dist/cli/chunk-0qymqwzz.js +0 -164
  643. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  644. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  645. package/dist/cli/chunk-2mzebbbz.js +0 -69
  646. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  647. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  648. package/dist/cli/chunk-5093q3n7.js +0 -68
  649. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  650. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  651. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  652. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  653. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  654. package/dist/cli/chunk-97r59kpr.js +0 -381
  655. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  656. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  657. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  658. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  659. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  660. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  661. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  662. package/dist/cli/chunk-esphfr8p.js +0 -107
  663. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  664. package/dist/cli/chunk-ex56aa81.js +0 -1016
  665. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  666. package/dist/cli/chunk-garjf5z9.js +0 -30
  667. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  668. package/dist/cli/chunk-js7saxwm.js +0 -1045
  669. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  670. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  671. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  672. package/dist/cli/chunk-q4rae3bg.js +0 -60
  673. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  674. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  675. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  676. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  677. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  678. package/dist/cli/chunk-vrfp10qk.js +0 -81
  679. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  680. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  681. package/docs/advanced/api-reference.mdx +0 -240
  682. package/docs/configuration/ask-ai.mdx +0 -256
  683. package/docs/reference/cli.mdx +0 -197
  684. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  685. package/src/components/content/changelog-element.ts +0 -69
  686. package/src/search/providers.ts +0 -91
  687. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
  688. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
  689. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
  690. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-zxcczpyx.js.map} +0 -0
@@ -1,15 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/ai/api/paths.ts", "../src/ai/api-catalog.ts", "../src/ai/mcp/discovery.ts", "../src/ai/skills.ts", "../src/ai/tar.ts", "../src/ai/ai-catalog.ts"],
4
- "sourcesContent": [
5
- "/**\n * Where the JSON docs API and its OpenAPI description are served. Base-less\n * (like every route Blume emits); callers layer `deployment.base` on top.\n * Under `/api/` alongside the Ask AI endpoint (`/api/ask`) so the namespace a\n * Blume site reserves for live endpoints stays one prefix, and under its own\n * `docs` segment so a search provider's proxy at `/api/search` never collides.\n */\n\nexport const OPENAPI_PATH = \"/openapi.json\";\nexport const API_BASE = \"/api/docs\";\nexport const API_PAGES_PATH = `${API_BASE}/pages.json`;\nexport const API_PAGE_PATH = `${API_BASE}/pages/{route}.json`;\nexport const API_NAVIGATION_PATH = `${API_BASE}/navigation.json`;\nexport const API_SEARCH_PATH = `${API_BASE}/search`;\n\n/** The `pages/{route}.json` path segment for a route (`index` for home). */\nexport const pageParam = (route: string): string =>\n route === \"/\" ? \"index\" : route.slice(1);\n\n/** The base-less served path of a route's per-page JSON document. */\nexport const pageJsonPath = (route: string): string =>\n `${API_BASE}/pages/${pageParam(route)}.json`;\n",
6
- "import { normalizeBasePath, withBasePath } from \"../core/base-path.ts\";\nimport type { ResolvedConfig } from \"../core/schema.ts\";\nimport { absoluteUrl } from \"../core/site-url.ts\";\nimport { resolveReferences } from \"../openapi/references.ts\";\nimport { API_BASE, OPENAPI_PATH } from \"./api/paths.ts\";\n\n/**\n * RFC 9727 API catalog: a linkset (RFC 9264) at `/.well-known/api-catalog`\n * enumerating the APIs a publisher offers, so agents can discover them from\n * the domain alone. Blume already knows the site's APIs — the configured\n * OpenAPI/AsyncAPI references and the hosted MCP server — so the catalog is\n * generated, never hand-written: one entry per API, anchored at its docs\n * route (the RFC's own examples anchor on developer-portal pages), with\n * `service-doc` pointing at the rendered reference and `service-desc` at the\n * spec when it lives at a fetchable URL. The site's own JSON docs API is an\n * entry too, described by its generated `/openapi.json`.\n */\n\nexport const API_CATALOG_PATH = \"/.well-known/api-catalog\";\nexport const API_CATALOG_TYPE = \"application/linkset+json\";\n\n/** An RFC 9264 linkset entry, restricted to the relations Blume emits. */\ninterface LinksetEntry {\n anchor: string;\n \"service-desc\"?: { href: string; type?: string }[];\n \"service-doc\"?: { href: string; type: string }[];\n}\n\nconst HTTP_URL = /^https?:\\/\\//u;\n\n/** The catalog's linkset entries; empty when the site publishes no APIs. */\nconst linksetEntries = (config: ResolvedConfig): LinksetEntry[] => {\n const site = config.deployment.site ?? null;\n const deployBase = normalizeBasePath(config.deployment.base);\n const abs = (path: string): string => {\n const based = withBasePath(deployBase, path);\n return site ? absoluteUrl(site, based) : based;\n };\n\n const entries: LinksetEntry[] = [];\n for (const reference of resolveReferences(config)) {\n // Blume-rendered pages mount under `basePath`; Scalar pages stay at the\n // raw route (see `referenceRoutes`).\n const docRoute =\n reference.renderer === \"blume\"\n ? withBasePath(reference.basePath, reference.route)\n : reference.route;\n const entry: LinksetEntry = {\n anchor: abs(docRoute),\n \"service-doc\": [{ href: abs(docRoute), type: \"text/html\" }],\n };\n // A local spec file is parsed into pages, not served, so only a remote\n // spec has a fetchable `service-desc` URL.\n if (HTTP_URL.test(reference.spec)) {\n entry[\"service-desc\"] = [{ href: reference.spec }];\n }\n entries.push(entry);\n }\n\n if (config.ai.api) {\n entries.push({\n anchor: abs(API_BASE),\n \"service-desc\": [{ href: abs(OPENAPI_PATH), type: \"application/json\" }],\n \"service-doc\": [{ href: abs(\"/\"), type: \"text/html\" }],\n });\n }\n\n if (config.ai.mcp.enabled) {\n entries.push({\n anchor: abs(config.ai.mcp.route),\n \"service-desc\": [\n { href: abs(\"/.well-known/mcp.json\"), type: \"application/json\" },\n ],\n \"service-doc\": [{ href: abs(\"/\"), type: \"text/html\" }],\n });\n }\n return entries;\n};\n\n/** Whether the site has anything to catalog — gates every emission surface. */\nexport const hasApiCatalog = (config: ResolvedConfig): boolean =>\n linksetEntries(config).length > 0;\n\n/** The `application/linkset+json` document, or null when there are no APIs. */\nexport const buildApiCatalog = (config: ResolvedConfig): string | null => {\n const linkset = linksetEntries(config);\n if (linkset.length === 0) {\n return null;\n }\n return `${JSON.stringify({ linkset }, null, 2)}\\n`;\n};\n",
7
- "import { withBasePath } from \"../../core/base-path.ts\";\nimport { absoluteUrl, siteRoot } from \"../../core/site-url.ts\";\nimport { trimChar } from \"../../core/trim.ts\";\nimport { MCP_TOOLS } from \"./tools.ts\";\nimport type { McpToolMeta } from \"./tools.ts\";\n\n/** Inputs needed to describe the MCP server in discovery documents. */\nexport interface McpDiscoveryInput {\n /** Normalized `deployment.base` (`\"\"` or `/seg`); the route is base-less. */\n base: string;\n name: string;\n route: string;\n site: string | null;\n version: string;\n}\n\n/** The MCP server's address — absolute when a site is configured. */\nconst serverUrl = (input: McpDiscoveryInput): string => {\n // The endpoint is a generated Astro page, so it's served under\n // `deployment.base` like every other route (the sitemap/llms.txt convention).\n const path = withBasePath(input.base, input.route);\n // Concatenate rather than `new URL(path, site)` — a root-absolute path\n // would drop the base path of a subpath deployment (`acme.com/docs`).\n return input.site ? absoluteUrl(input.site, path) : path;\n};\n\n/**\n * The `/.well-known/mcp.json` discovery document: the minimal pointer agents use\n * to find the server and its transport.\n */\nexport const buildMcpDiscovery = (input: McpDiscoveryInput) => ({\n servers: [\n {\n name: input.name,\n transport: \"streamable-http\",\n url: serverUrl(input),\n },\n ],\n});\n\n/** The published `/v1/` Server Card schema (SEP-2127 extension). */\nconst SERVER_CARD_SCHEMA =\n \"https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json\";\n\n/** The schema caps `description` (and `title`) at 100 characters. */\nconst CARD_TEXT_MAX = 100;\n\nconst truncate = (text: string): string =>\n text.length > CARD_TEXT_MAX ? `${text.slice(0, CARD_TEXT_MAX - 1)}…` : text;\n\n// The server-card schema constrains `name` to `namespace/server` in ASCII\n// (`^[a-zA-Z0-9.-]+/[a-zA-Z0-9._-]+$`), so the display name cannot reuse the\n// route slugifier, which keeps Unicode letters. Decompose (NFKD) and drop\n// combining marks first so an accented name transliterates (`Café` → `cafe`)\n// instead of losing the letter.\nconst NON_ASCII_SLUG = /[^a-z0-9]+/gu;\nconst COMBINING_MARKS = /\\p{M}+/gu;\n\nexport const asciiSlugify = (text: string): string =>\n trimChar(\n text\n .normalize(\"NFKD\")\n .replace(COMBINING_MARKS, \"\")\n .toLowerCase()\n .replace(NON_ASCII_SLUG, \"-\"),\n \"-\"\n );\n\n/**\n * The card's identity in the schema's reverse-DNS `namespace/server` form:\n * the site hostname reversed (`useblume.dev` → `dev.useblume`), or\n * `localhost` when no site is configured, plus the slugged display name (an\n * entirely non-ASCII name falls back to `docs`).\n */\nconst reverseDnsName = (input: McpDiscoveryInput): string => {\n let namespace = \"localhost\";\n if (input.site) {\n try {\n namespace = new URL(input.site).hostname\n .split(\".\")\n .toReversed()\n .join(\".\");\n } catch {\n // Not a parsable URL; the local namespace is honest enough.\n }\n }\n return `${namespace}/${asciiSlugify(input.name) || \"docs\"}`;\n};\n\nconst HTTP_URL = /^https?:\\/\\//u;\n\n/**\n * The `/.well-known/mcp/server-card.json` document. The core follows the\n * SEP-2127 Server Card extension schema (`$schema`, reverse-DNS `name`,\n * `remotes` — which the schema requires to be absolute, so it appears only\n * when a `site` is configured). Alongside it ride initialize-shaped compat\n * fields (`serverInfo`, `capabilities`, `transports`) for scanners built\n * against the SEP's earlier revision, plus Blume's advertised tool set —\n * schema-legal extras (`additionalProperties` is open), and the tool list is\n * genuinely static for a docs server, unlike the dynamic servers the spec\n * excludes primitives for. Full input schemas are served live via\n * `tools/list`.\n */\nexport interface McpServerCard {\n $schema: string;\n capabilities: {\n resources: { listChanged: boolean; subscribe: boolean };\n tools: { listChanged: boolean };\n };\n description: string;\n name: string;\n /** Absolute endpoints only — present when a `site` is configured. */\n remotes?: { type: string; url: string }[];\n serverInfo: { name: string; version: string };\n title: string;\n tools: McpToolMeta[];\n transport: string;\n transports: { endpoint: string; type: string }[];\n url: string;\n version: string;\n websiteUrl?: string;\n}\n\nexport const buildMcpServerCard = (input: McpDiscoveryInput): McpServerCard => {\n const url = serverUrl(input);\n const card: McpServerCard = {\n $schema: SERVER_CARD_SCHEMA,\n // Resources mirror the page list (one `text/markdown` resource per page);\n // a rebuilt site replaces the server wholesale, so nothing changes live.\n capabilities: {\n resources: { listChanged: false, subscribe: false },\n tools: { listChanged: false },\n },\n description: truncate(\n `Model Context Protocol server for the ${input.name} documentation.`\n ),\n name: reverseDnsName(input),\n serverInfo: { name: input.name, version: input.version },\n title: truncate(input.name),\n tools: MCP_TOOLS.map((tool) => ({\n annotations: tool.annotations,\n description: tool.description,\n name: tool.name,\n title: tool.title,\n })),\n transport: \"streamable-http\",\n transports: [{ endpoint: url, type: \"streamable-http\" }],\n url,\n version: input.version,\n };\n if (HTTP_URL.test(url)) {\n card.remotes = [{ type: \"streamable-http\", url }];\n }\n if (input.site) {\n card.websiteUrl = siteRoot(input.site);\n }\n return card;\n};\n",
8
- "import { createHash } from \"node:crypto\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\n\nimport { join } from \"pathe\";\n\nimport { normalizeBasePath } from \"../core/base-path.ts\";\nimport matter from \"../core/frontmatter.ts\";\nimport type { ResolvedConfig } from \"../core/schema.ts\";\nimport { buildTarGz } from \"./tar.ts\";\nimport type { TarEntry } from \"./tar.ts\";\n\n/**\n * Agent Skills discovery (Cloudflare's Agent Skills Discovery RFC v0.2.0):\n * the skills a site publishes are enumerated in an index at\n * `/.well-known/agent-skills/index.json`, each entry pointing at its artifact\n * with a SHA-256 digest. A skill that is only a `SKILL.md` publishes the file\n * verbatim (`type: \"skill-md\"`); a skill with supporting resources (scripts,\n * references, assets) is bundled into a deterministic `.tar.gz`\n * (`type: \"archive\"`) so its relative references resolve after unpacking.\n */\n\nexport const AGENT_SKILLS_DIR = \"/.well-known/agent-skills\";\nexport const AGENT_SKILLS_INDEX_PATH = \"/.well-known/agent-skills/index.json\";\n\nconst AGENT_SKILLS_SCHEMA =\n \"https://schemas.agentskills.io/discovery/0.2.0/schema.json\";\n\n/** Skill naming rule from the Agent Skills spec (1-64 chars enforced apart). */\nconst SKILL_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;\nconst SKILL_NAME_MAX = 64;\n/** The Agent Skills spec caps `description` at 1024 characters. */\nconst DESCRIPTION_MAX = 1024;\n\n/** One publishable skill artifact plus its index entry. */\nexport interface SkillArtifact {\n /** Raw bytes to publish (the digest is computed over exactly these). */\n content: Uint8Array;\n description: string;\n /** `sha256:{hex}` digest of `content`. */\n digest: string;\n name: string;\n /** Path under the agent-skills dir: `{name}/SKILL.md` or `{name}.tar.gz`. */\n path: string;\n type: \"archive\" | \"skill-md\";\n}\n\nexport interface CollectedSkills {\n skills: SkillArtifact[];\n /** Human-readable reasons for anything skipped. */\n warnings: string[];\n}\n\nconst sha256 = (content: Uint8Array): string =>\n `sha256:${createHash(\"sha256\").update(content).digest(\"hex\")}`;\n\n/**\n * Every regular file under a skill directory, as archive entries with\n * `/`-separated relative paths, dotfiles (`.DS_Store`, `.git`) excluded,\n * sorted for deterministic archives. The owner-execute bit is preserved so a\n * skill's scripts stay runnable after unpacking.\n */\nconst collectEntries = async (\n dir: string,\n prefix = \"\"\n): Promise<TarEntry[]> => {\n const entries: TarEntry[] = [];\n const items = await readdir(dir, { withFileTypes: true });\n for (const item of items.toSorted((a, b) => (a.name < b.name ? -1 : 1))) {\n if (item.name.startsWith(\".\")) {\n continue;\n }\n const path = join(dir, item.name);\n const relative = prefix ? `${prefix}/${item.name}` : item.name;\n if (item.isDirectory()) {\n // Sequential recursion keeps ordering deterministic.\n // oxlint-disable-next-line no-await-in-loop\n entries.push(...(await collectEntries(path, relative)));\n } else if (item.isFile()) {\n // oxlint-disable-next-line no-await-in-loop\n const [content, info] = await Promise.all([readFile(path), stat(path)]);\n entries.push({\n content: new Uint8Array(content),\n // oxlint-disable-next-line no-bitwise -- testing the owner-execute mode bit\n executable: (info.mode & 0o100) !== 0,\n path: relative,\n });\n }\n }\n return entries;\n};\n\n/** The two SKILL.md frontmatter fields the discovery index publishes. */\ninterface SkillMeta {\n description: string;\n name: string;\n}\n\ninterface SkillMetaResult {\n meta: SkillMeta | null;\n warning?: string;\n}\n\n/**\n * What js-yaml can put in a SKILL.md frontmatter field. Rich scalars (Dates)\n * ride along as the object arm; only strings are accepted below anyway.\n */\ntype FrontmatterField =\n | string\n | number\n | boolean\n | null\n | undefined\n | FrontmatterField[]\n | { [key: string]: FrontmatterField };\n\nconst isString = (value: FrontmatterField): value is string =>\n typeof value === \"string\";\n\n/** Frontmatter of a SKILL.md, or null with a warning when unusable. */\nconst skillMeta = (raw: string, dirName: string): SkillMetaResult => {\n let data: { description?: FrontmatterField; name?: FrontmatterField };\n try {\n ({ data } = matter(raw));\n } catch {\n return {\n meta: null,\n warning: `Skill \"${dirName}\" has unparsable SKILL.md frontmatter; skipped.`,\n };\n }\n const name = isString(data.name) ? data.name : \"\";\n const description = isString(data.description) ? data.description : \"\";\n if (!(name && description)) {\n return {\n meta: null,\n warning: `Skill \"${dirName}\" is missing the required \"name\"/\"description\" frontmatter; skipped.`,\n };\n }\n if (!SKILL_NAME.test(name) || name.length > SKILL_NAME_MAX) {\n return {\n meta: null,\n warning: `Skill \"${dirName}\" has an invalid name \"${name}\" (lowercase alphanumerics and single hyphens, max 64 chars); skipped.`,\n };\n }\n return {\n meta: { description: description.slice(0, DESCRIPTION_MAX), name },\n };\n};\n\n/**\n * Collect the publishable skills from a directory whose subdirectories each\n * hold a `SKILL.md` (the layout `npx skills add` consumes). Subdirectories\n * without one are ignored silently — the directory may hold other assets —\n * while a present-but-invalid skill earns a warning so it isn't dropped\n * behind the publisher's back.\n */\nexport const collectSkills = async (dir: string): Promise<CollectedSkills> => {\n const skills: SkillArtifact[] = [];\n const warnings: string[] = [];\n const items = await readdir(dir, { withFileTypes: true });\n for (const item of items.toSorted((a, b) => (a.name < b.name ? -1 : 1))) {\n if (!item.isDirectory() || item.name.startsWith(\".\")) {\n continue;\n }\n // oxlint-disable-next-line no-await-in-loop\n const entries = await collectEntries(join(dir, item.name));\n const skillMd = entries.find((entry) => entry.path === \"SKILL.md\");\n if (!skillMd) {\n continue;\n }\n const { meta, warning } = skillMeta(\n new TextDecoder().decode(skillMd.content),\n item.name\n );\n if (!meta) {\n if (warning) {\n warnings.push(warning);\n }\n continue;\n }\n // A lone SKILL.md ships verbatim; supporting resources ship as an\n // archive so the skill's relative references resolve after unpacking.\n const single = entries.length === 1;\n const content = single ? skillMd.content : buildTarGz(entries);\n skills.push({\n content,\n description: meta.description,\n digest: sha256(content),\n name: meta.name,\n path: single ? `${meta.name}/SKILL.md` : `${meta.name}.tar.gz`,\n type: single ? \"skill-md\" : \"archive\",\n });\n }\n return { skills, warnings };\n};\n\n/**\n * The discovery index (v0.2.0 schema). Artifact URLs are path-absolute under\n * `deployment.base` — the RFC resolves them against the index origin.\n */\nexport const buildSkillsIndex = (\n skills: readonly SkillArtifact[],\n config: ResolvedConfig\n): string => {\n const deployBase = normalizeBasePath(config.deployment.base);\n const index = {\n $schema: AGENT_SKILLS_SCHEMA,\n skills: skills.map((skill) => ({\n description: skill.description,\n digest: skill.digest,\n name: skill.name,\n type: skill.type,\n url: `${deployBase}${AGENT_SKILLS_DIR}/${skill.path}`,\n })),\n };\n return `${JSON.stringify(index, null, 2)}\\n`;\n};\n",
9
- "import { gzipSync } from \"node:zlib\";\n\nimport { createTar } from \"nanotar\";\n\n/**\n * `.tar.gz` writer for agent-skill archives, on nanotar's ustar writer.\n * Deterministic by construction — fixed mtime/uid/gid/owner attrs,\n * caller-ordered entries, and Node's gzip header carries no timestamp — so a\n * skill's archive digest only changes when its content does. That holds per\n * machine: the tar bytes are portable, but zlib's compressed stream differs\n * across architectures, so gzip-layer digests are not comparable across\n * platforms.\n */\n\n/** One regular file to archive. Paths are `/`-separated, relative, no `..`. */\nexport interface TarEntry {\n /** Raw file bytes. */\n content: Uint8Array;\n /** Preserve the owner-execute bit (e.g. a skill's scripts). */\n executable?: boolean;\n /** Archive-relative path, e.g. `SKILL.md` or `references/FORMS.md`. */\n path: string;\n}\n\n/** ustar `name` field capacity; skill layouts are shallow, so no `prefix`. */\nconst NAME_MAX = 100;\n\nconst encoder = new TextEncoder();\n\n/**\n * Build a gzipped ustar archive of the given files, in the given order. Paths\n * longer than the ustar `name` field or escaping the archive root throw to\n * surface a programming error — nanotar would silently truncate an oversized\n * name into a corrupt archive, so the validation stays here.\n */\nexport const buildTarGz = (entries: readonly TarEntry[]): Uint8Array => {\n for (const entry of entries) {\n if (encoder.encode(entry.path).byteLength > NAME_MAX) {\n throw new Error(`tar path exceeds ${NAME_MAX} bytes: ${entry.path}`);\n }\n if (entry.path.startsWith(\"/\") || entry.path.split(\"/\").includes(\"..\")) {\n throw new Error(`tar path must be archive-relative: ${entry.path}`);\n }\n }\n const tar = createTar(\n entries.map((entry) => ({\n // Root-owned, epoch-mtime, empty owner names: every field a rebuild\n // could vary is pinned so the archive bytes are a function of content.\n attrs: {\n gid: 0,\n group: \"\",\n mode: entry.executable ? \"755\" : \"644\",\n mtime: 0,\n uid: 0,\n user: \"\",\n },\n data: entry.content,\n name: entry.path,\n }))\n );\n // Sync gzip with a pinned level; Node writes no timestamp into the header.\n return new Uint8Array(gzipSync(tar, { level: 9 }));\n};\n",
10
- "import { normalizeBasePath, withBasePath } from \"../core/base-path.ts\";\nimport type { ResolvedConfig } from \"../core/schema.ts\";\nimport { absoluteUrl } from \"../core/site-url.ts\";\nimport { resolveReferences } from \"../openapi/references.ts\";\nimport { API_CATALOG_PATH, hasApiCatalog } from \"./api-catalog.ts\";\nimport { OPENAPI_PATH } from \"./api/paths.ts\";\nimport { asciiSlugify } from \"./mcp/discovery.ts\";\nimport { AGENT_SKILLS_DIR } from \"./skills.ts\";\nimport type { SkillArtifact } from \"./skills.ts\";\n\n/**\n * The AI Catalog (Agent-Card/ai-catalog data model, `specVersion` 1.0) at\n * `/.well-known/ai-catalog.json`, which is also the Agentic Resource\n * Discovery (ARD) manifest: one entry per agent-facing resource the site\n * publishes, each an `urn:air:<host>:<namespace>:<name>` identifier, a\n * display name, the artifact's media type, a URL, and the\n * `representativeQueries` registries embed for semantic search. Like the\n * RFC 9727 catalog next to it, everything is derived from `blume.config.ts`\n * and the build's published skills — nothing is hand-written.\n *\n * ARD v0.91 moved its manifest to `/.well-known/ard.json` and calls\n * `ai-catalog.json` the predecessor path that consumers only *may* consult,\n * while the ai-catalog spec and today's agent-readiness scanners key on\n * `ai-catalog.json`. The ARD manifest is just an `entries` array (other\n * members are ignored), so the one document is written to both paths.\n *\n * Served as plain `application/json`: the `.json` extension gets it from\n * every static host with no header rule, and the scanners that gate on the\n * file ask for exactly that type. The registered `application/ai-catalog+json`\n * is what the `Link`/`<link>` advertisements declare the document to be.\n */\n\nexport const AI_CATALOG_PATH = \"/.well-known/ai-catalog.json\";\nexport const ARD_MANIFEST_PATH = \"/.well-known/ard.json\";\nexport const AI_CATALOG_TYPE = \"application/ai-catalog+json\";\nconst SPEC_VERSION = \"1.0\";\n\n/** One catalog entry, restricted to the terms Blume emits. */\ninterface CatalogEntry {\n identifier: string;\n displayName: string;\n type: string;\n url: string;\n description?: string;\n capabilities?: string[];\n representativeQueries: string[];\n}\n\n/** An entry before its identifier and queries are resolved against the host. */\ninterface EntrySeed {\n /** `<namespace>:<name>` — the identifier's tail and the `queries` key. */\n key: string;\n displayName: string;\n type: string;\n url: string;\n description?: string;\n capabilities?: string[];\n /** Generated queries, replaced wholesale by a configured `queries[key]`. */\n queries: string[];\n}\n\nconst REFERENCE_KIND_LABEL = {\n asyncapi: \"AsyncAPI\",\n graphql: \"GraphQL\",\n openapi: \"OpenAPI\",\n} as const;\n\n/** The `urn:air` publisher: the configured site's hostname. */\nconst publisherHost = (site: string): string => new URL(site).hostname;\n\n/**\n * Whether the site publishes a catalog: the feature is on, a `deployment.site`\n * anchors the identifiers, and at least one entry exists. Every entry source\n * is a config flag, so the answer needs no build output — the same gate the\n * header rules, the `Link` header, and the head links read.\n */\nexport const hasAiCatalog = (config: ResolvedConfig): boolean =>\n config.ai.catalog.enabled &&\n Boolean(config.deployment.site) &&\n (config.ai.mcp.enabled ||\n config.ai.api ||\n config.ai.llmsTxt.enabled ||\n Boolean(config.ai.skills) ||\n resolveReferences(config).length > 0);\n\n/**\n * The `.well-known` documents agent registries fetch cross-origin (browser\n * agents, hosted registries reading through a page). Each needs\n * `Access-Control-Allow-Origin: *` on the static surface; the MCP endpoint\n * itself already sets it at runtime.\n */\nexport const crossOriginDiscoveryPaths = (config: ResolvedConfig): string[] => {\n const paths: string[] = [];\n if (hasAiCatalog(config)) {\n paths.push(AI_CATALOG_PATH, ARD_MANIFEST_PATH);\n }\n if (hasApiCatalog(config)) {\n paths.push(API_CATALOG_PATH);\n }\n if (config.ai.mcp.enabled) {\n paths.push(\"/.well-known/mcp.json\", \"/.well-known/mcp/server-card.json\");\n }\n return paths;\n};\n\nconst entrySeeds = (\n config: ResolvedConfig,\n skills: readonly SkillArtifact[],\n abs: (path: string) => string\n): EntrySeed[] => {\n const { title } = config;\n const seeds: EntrySeed[] = [];\n\n if (config.ai.mcp.enabled) {\n const name = config.ai.mcp.name ?? title;\n seeds.push({\n capabilities: [\"search_docs\", \"get_page\", \"list_pages\", \"get_navigation\"],\n description:\n config.ai.mcp.instructions ??\n `Model Context Protocol server over the ${title} documentation: full-text search, page Markdown, the page index, and the navigation tree.`,\n displayName: name,\n key: `mcp:${asciiSlugify(name) || \"docs\"}`,\n queries: [\n `search the ${title} documentation`,\n `get a ${title} docs page as Markdown`,\n `list every page in the ${title} docs`,\n ],\n type: \"application/mcp-server-card+json\",\n url: abs(\"/.well-known/mcp/server-card.json\"),\n });\n }\n\n for (const skill of skills) {\n seeds.push({\n description: skill.description,\n displayName: skill.name,\n key: `skill:${skill.name}`,\n queries: [\n `load the ${skill.name} agent skill`,\n `how do I use ${skill.name}`,\n ],\n type:\n skill.type === \"archive\"\n ? \"application/agent-skills+gzip\"\n : \"application/agent-skills+md\",\n url: abs(`${AGENT_SKILLS_DIR}/${skill.path}`),\n });\n }\n\n if (config.ai.api) {\n seeds.push({\n description: `REST API over the ${title} documentation: the page index, each page as JSON or Markdown, and the navigation tree, described by this OpenAPI document.`,\n displayName: `${title} docs API`,\n key: \"api:docs\",\n queries: [\n `fetch a ${title} docs page as JSON`,\n `list the pages in the ${title} docs`,\n `get the ${title} docs navigation tree`,\n ],\n type: \"application/vnd.oai.openapi+json\",\n url: abs(OPENAPI_PATH),\n });\n }\n\n for (const reference of resolveReferences(config)) {\n // Blume-rendered pages mount under `basePath`; Scalar pages stay at the\n // raw route (see `referenceRoutes`). The rendered reference is the\n // resource this publisher owns — the spec itself is catalogued by URL in\n // the RFC 9727 linkset.\n const docRoute =\n reference.renderer === \"blume\"\n ? withBasePath(reference.basePath, reference.route)\n : reference.route;\n seeds.push({\n description: `${reference.label}: rendered ${REFERENCE_KIND_LABEL[reference.kind]} reference in the ${title} documentation.`,\n displayName: reference.label,\n key: `reference:${reference.slug}`,\n queries: [\n `what operations does the ${reference.label} API expose`,\n `how do I call the ${reference.label} API`,\n ],\n type: \"text/html\",\n url: abs(docRoute),\n });\n }\n\n if (config.ai.llmsTxt.enabled) {\n seeds.push({\n description: `llms.txt index of the ${title} documentation: every page with a one-line summary, plus the agent-facing resources on this site.`,\n displayName: `${title} llms.txt`,\n key: \"docs:llms-txt\",\n queries: [`what is ${title}`, `overview of the ${title} documentation`],\n type: \"text/plain\",\n url: abs(\"/llms.txt\"),\n });\n }\n\n return seeds;\n};\n\n/** The catalog document, or null when the site publishes none. */\nexport const buildAiCatalog = (\n config: ResolvedConfig,\n skills: readonly SkillArtifact[]\n): string | null => {\n const site = config.deployment.site ?? null;\n if (!(site && hasAiCatalog(config))) {\n return null;\n }\n const deployBase = normalizeBasePath(config.deployment.base);\n const abs = (path: string): string =>\n absoluteUrl(site, withBasePath(deployBase, path));\n const host = publisherHost(site);\n const entries = entrySeeds(config, skills, abs).map((seed): CatalogEntry => {\n const entry: CatalogEntry = {\n displayName: seed.displayName,\n identifier: `urn:air:${host}:${seed.key}`,\n representativeQueries:\n config.ai.catalog.queries[seed.key] ?? seed.queries,\n type: seed.type,\n url: seed.url,\n };\n if (seed.description) {\n entry.description = seed.description;\n }\n if (seed.capabilities) {\n entry.capabilities = seed.capabilities;\n }\n return entry;\n });\n const catalog = {\n entries,\n host: {\n displayName: config.title,\n documentationUrl: abs(\"/\"),\n identifier: `did:web:${host}`,\n },\n specVersion: SPEC_VERSION,\n };\n return `${JSON.stringify(catalog, null, 2)}\\n`;\n};\n"
11
- ],
12
- "mappings": "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",
13
- "debugId": "26AE621DEDAFCC8A64756E2164756E21",
14
- "names": []
15
- }