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,7 +1,7 @@
1
1
  ---
2
2
  import type { UIStrings } from "../../core/i18n-ui.ts";
3
3
  import { resolveIcon } from "../../theme/icons.ts";
4
- import AskAI from "./ask-ai.tsx";
4
+ import Assistant from "./assistant.tsx";
5
5
 
6
6
  interface Suggestion {
7
7
  icon?: string;
@@ -10,7 +10,7 @@ interface Suggestion {
10
10
 
11
11
  interface Props {
12
12
  endpoint?: string;
13
- strings?: UIStrings["ask"];
13
+ strings?: UIStrings["assistant"];
14
14
  suggestions?: Suggestion[];
15
15
  }
16
16
 
@@ -48,19 +48,19 @@ const icons = {
48
48
  the draft input, and the open panel — across client-router navigations
49
49
  instead of remounting it empty on every page. The island re-portals its
50
50
  panel and re-stamps the body push attribute itself on astro:after-swap
51
- (see ask-ai.tsx), since the swap replaces <body> wholesale. */}
52
- <AskAI
51
+ (see assistant.tsx), since the swap replaces <body> wholesale. */}
52
+ <Assistant
53
53
  client:load
54
54
  endpoint={endpoint}
55
55
  icons={icons}
56
56
  strings={strings}
57
57
  suggestions={items}
58
- transition:persist="blume-ask"
58
+ transition:persist="blume-assistant"
59
59
  />
60
60
 
61
61
  <style is:global>
62
62
  :root {
63
- --blume-ask-width: min(30rem, 100vw);
63
+ --blume-assistant-width: min(30rem, 100vw);
64
64
  }
65
65
 
66
66
  /* Desktop docks the panel and shrinks the page to fit, like vercel.com/docs.
@@ -70,8 +70,8 @@ const icons = {
70
70
  transition: padding-inline-end 0.2s ease-out;
71
71
  }
72
72
 
73
- body[data-blume-ask="open"] {
74
- padding-inline-end: var(--blume-ask-width);
73
+ body[data-blume-assistant="open"] {
74
+ padding-inline-end: var(--blume-assistant-width);
75
75
  }
76
76
  }
77
77
 
@@ -81,11 +81,11 @@ const icons = {
81
81
  changelog index) is single-column, and forcing the sidebar tracks onto it
82
82
  would squeeze its only item — <main> — into the 17.5rem track. */
83
83
  @media (min-width: 1280px) {
84
- body[data-blume-ask="open"] [data-blume-toc] {
84
+ body[data-blume-assistant="open"] [data-blume-toc] {
85
85
  display: none;
86
86
  }
87
87
 
88
- body[data-blume-ask="open"] [data-blume-doc-grid]:has([data-blume-toc]) {
88
+ body[data-blume-assistant="open"] [data-blume-doc-grid]:has([data-blume-toc]) {
89
89
  grid-template-columns: 17.5rem minmax(0, 1fr);
90
90
  }
91
91
  }
@@ -7,7 +7,7 @@ import { createPortal } from "react-dom";
7
7
  import type { UIStrings } from "../../core/i18n-ui.ts";
8
8
  import { copyText } from "../copy-feedback.ts";
9
9
  import { joinBase, prefixBase } from "./base-path.ts";
10
- import { useAskAI } from "./hooks.ts";
10
+ import { useAssistant } from "./hooks.ts";
11
11
 
12
12
  /** A resolved empty-state prompt; `icon` is ready-to-inline SVG (or null). */
13
13
  interface Suggestion {
@@ -16,10 +16,10 @@ interface Suggestion {
16
16
  }
17
17
 
18
18
  /**
19
- * The panel's chrome glyphs, resolved server-side in `AskAI.astro` and passed in
19
+ * The panel's chrome glyphs, resolved server-side in `Assistant.astro` and passed in
20
20
  * as ready-to-inline Lucide bodies so this client island ships no icon data.
21
21
  */
22
- interface AskIcons {
22
+ interface AssistantIcons {
23
23
  arrowUp: string;
24
24
  chat: string;
25
25
  clear: string;
@@ -29,7 +29,7 @@ interface AskIcons {
29
29
 
30
30
  // Empty bodies so the island still renders (iconless) if instantiated without
31
31
  // the Astro wrapper that resolves the real Lucide glyphs.
32
- const EMPTY_ICONS: AskIcons = {
32
+ const EMPTY_ICONS: AssistantIcons = {
33
33
  arrowUp: "",
34
34
  chat: "",
35
35
  clear: "",
@@ -38,7 +38,7 @@ const EMPTY_ICONS: AskIcons = {
38
38
  };
39
39
 
40
40
  // English fallback so the island renders even if no dictionary is passed.
41
- const DEFAULT_ASK: UIStrings["ask"] = {
41
+ const DEFAULT_ASK: UIStrings["assistant"] = {
42
42
  ai: "AI",
43
43
  clear: "Clear conversation",
44
44
  close: "Close",
@@ -49,7 +49,7 @@ const DEFAULT_ASK: UIStrings["ask"] = {
49
49
  placeholder: "Ask a question…",
50
50
  send: "Send",
51
51
  tip: "Tip: You can open and close chat with",
52
- title: "Ask AI",
52
+ title: "Assistant",
53
53
  you: "You",
54
54
  };
55
55
 
@@ -130,15 +130,15 @@ const ICON_BUTTON_CLASS =
130
130
  const ANSWER_CLASS =
131
131
  "prose prose-sm max-w-none text-foreground [&_a]:inline-flex [&_a]:items-center [&_a]:gap-1 [&_a]:rounded-full [&_a]:bg-muted [&_a]:px-2 [&_a]:py-1 [&_a]:align-middle [&_a]:font-medium [&_a]:text-[0.7rem] [&_a]:leading-none [&_a]:text-muted-foreground! [&_a]:no-underline! [&_a:hover]:text-foreground!";
132
132
 
133
- const AskAI = ({
133
+ const Assistant = ({
134
134
  endpoint = DEFAULT_ASK_ENDPOINT,
135
135
  icons = EMPTY_ICONS,
136
136
  strings,
137
137
  suggestions = EMPTY_SUGGESTIONS,
138
138
  }: {
139
139
  endpoint?: string;
140
- icons?: AskIcons;
141
- strings?: UIStrings["ask"];
140
+ icons?: AssistantIcons;
141
+ strings?: UIStrings["assistant"];
142
142
  suggestions?: Suggestion[];
143
143
  }) => {
144
144
  // Merge per key (not `strings ?? …`) so a dictionary from a stale snapshot
@@ -147,14 +147,14 @@ const AskAI = ({
147
147
  const [open, setOpen] = useState(false);
148
148
  const [input, setInput] = useState("");
149
149
  // The streaming client — request shaping, optimistic assistant bubble,
150
- // stale-stream/abort guards, error-body handling — is the public useAskAI
150
+ // stale-stream/abort guards, error-body handling — is the public useAssistant
151
151
  // hook, so the built-in panel and custom UIs share one implementation.
152
152
  const {
153
153
  ask,
154
154
  loading: busy,
155
155
  messages,
156
156
  reset,
157
- } = useAskAI({ endpoint, errorMessage: t.error });
157
+ } = useAssistant({ endpoint, errorMessage: t.error });
158
158
  const inputRef = useRef<HTMLTextAreaElement>(null);
159
159
  const scrollRef = useRef<HTMLDivElement>(null);
160
160
  const triggerRef = useRef<HTMLButtonElement>(null);
@@ -167,7 +167,7 @@ const AskAI = ({
167
167
  // Null until mount (guards SSR), then refreshed on every client-router swap:
168
168
  // the island rides across navigations via transition:persist, but each swap
169
169
  // installs a NEW <body>, discarding the portaled panel with the old one and
170
- // resetting the `data-blume-ask` push attribute to the incoming page's
170
+ // resetting the `data-blume-assistant` push attribute to the incoming page's
171
171
  // server-rendered set. Reading document.body inline in render would NOT
172
172
  // recover from that — it isn't a reactive value, so the memoized portal
173
173
  // keeps its stale (detached) container. State identity is what re-anchors
@@ -183,10 +183,10 @@ const AskAI = ({
183
183
  return () => document.removeEventListener("astro:after-swap", onSwap);
184
184
  }, []);
185
185
 
186
- // The search modal forwards its query so "Ask AI: <query>" carries straight in.
186
+ // The search modal forwards its query so "Assistant: <query>" carries straight in.
187
187
  useEffect(() => {
188
188
  const handler = (event: Event) => {
189
- // SAFETY: `blume:open-ask-ai` is only ever dispatched as a CustomEvent
189
+ // SAFETY: `blume:open-assistant` is only ever dispatched as a CustomEvent
190
190
  // whose optional detail carries the search query.
191
191
  const query = (event as CustomEvent<{ query?: string }>).detail?.query;
192
192
  if (query) {
@@ -194,8 +194,8 @@ const AskAI = ({
194
194
  }
195
195
  setOpen(true);
196
196
  };
197
- window.addEventListener("blume:open-ask-ai", handler);
198
- return () => window.removeEventListener("blume:open-ask-ai", handler);
197
+ window.addEventListener("blume:open-assistant", handler);
198
+ return () => window.removeEventListener("blume:open-assistant", handler);
199
199
  }, []);
200
200
 
201
201
  // ⌘I / Ctrl+I toggles the panel; Escape closes it. Shift/Alt chords are
@@ -226,17 +226,17 @@ const AskAI = ({
226
226
  return () => window.removeEventListener("keydown", onKey);
227
227
  }, [open]);
228
228
 
229
- // Drive the desktop content push from a body attribute (see AskAI.astro CSS).
229
+ // Drive the desktop content push from a body attribute (see Assistant.astro CSS).
230
230
  useEffect(() => {
231
231
  if (open) {
232
232
  returnFocusRef.current =
233
233
  document.activeElement instanceof HTMLElement
234
234
  ? document.activeElement
235
235
  : null;
236
- document.body.dataset.blumeAsk = "open";
236
+ document.body.dataset.blumeAssistant = "open";
237
237
  inputRef.current?.focus();
238
238
  } else {
239
- delete document.body.dataset.blumeAsk;
239
+ delete document.body.dataset.blumeAssistant;
240
240
  // Return focus to the element that opened the panel (or the trigger when
241
241
  // it's gone), so closing doesn't strand keyboard focus in an inert tree.
242
242
  // `returnFocusRef` is only set on open, so initial mount is a no-op.
@@ -249,7 +249,7 @@ const AskAI = ({
249
249
  }
250
250
  }
251
251
  return () => {
252
- delete document.body.dataset.blumeAsk;
252
+ delete document.body.dataset.blumeAssistant;
253
253
  };
254
254
  }, [open]);
255
255
 
@@ -261,7 +261,7 @@ const AskAI = ({
261
261
  // document.body (not portalTarget) so the compiler doesn't flag a state
262
262
  // mutation; by the time this runs for a swap, they are the same element.
263
263
  if (open && portalTarget) {
264
- document.body.dataset.blumeAsk = "open";
264
+ document.body.dataset.blumeAssistant = "open";
265
265
  }
266
266
  // oxlint-disable-next-line react/exhaustive-effect-dependencies -- see above
267
267
  }, [open, portalTarget]);
@@ -387,7 +387,7 @@ const AskAI = ({
387
387
  // The closed panel is only translated off-screen; `inert` drops its
388
388
  // buttons/textarea from the tab order and the accessibility tree.
389
389
  inert={!open}
390
- className={`border-border bg-background fixed inset-y-0 end-0 z-[60] flex w-[var(--blume-ask-width)] flex-col border-s shadow-2xl transition-transform duration-200 ease-out ${
390
+ className={`border-border bg-background fixed inset-y-0 end-0 z-[60] flex w-[var(--blume-assistant-width)] flex-col border-s shadow-2xl transition-transform duration-200 ease-out ${
391
391
  open ? "translate-x-0" : "translate-x-full rtl:-translate-x-full"
392
392
  }`}
393
393
  >
@@ -539,4 +539,4 @@ const AskAI = ({
539
539
  );
540
540
  };
541
541
 
542
- export default AskAI;
542
+ export default Assistant;
@@ -12,7 +12,7 @@ import { joinBase, stripBase } from "./base-path.ts";
12
12
  * project data can't come through context. Instead the layout serializes a small
13
13
  * snapshot into a `<script type="application/json" id="blume-client-data">` tag,
14
14
  * and {@link useBlume}/{@link usePage} read it after mount. {@link useSearch} and
15
- * {@link useAskAI} wrap the generated search client and the Ask AI endpoint.
15
+ * {@link useAssistant} wrap the generated search client and the assistant endpoint.
16
16
  *
17
17
  * Import them from `blume/hooks`:
18
18
  *
@@ -131,14 +131,14 @@ export const useSearch = (): UseSearch => {
131
131
  return { loading, results, search };
132
132
  };
133
133
 
134
- /** A single Ask AI chat message. */
134
+ /** A single assistant chat message. */
135
135
  export interface AskMessage {
136
136
  content: string;
137
137
  role: "assistant" | "user";
138
138
  }
139
139
 
140
- /** State + actions returned by {@link useAskAI}. */
141
- export interface UseAskAI {
140
+ /** State + actions returned by {@link useAssistant}. */
141
+ export interface UseAssistant {
142
142
  ask: (question: string) => Promise<void>;
143
143
  loading: boolean;
144
144
  messages: AskMessage[];
@@ -147,8 +147,8 @@ export interface UseAskAI {
147
147
 
148
148
  const DEFAULT_ASK_ENDPOINT = joinBase(import.meta.env.BASE_URL, "api/ask");
149
149
 
150
- export interface UseAskAIOptions {
151
- /** Existing Ask AI endpoint; defaults to Blume's generated `/api/ask`. */
150
+ export interface UseAssistantOptions {
151
+ /** Existing assistant endpoint; defaults to Blume's generated `/api/ask`. */
152
152
  endpoint?: string;
153
153
  /**
154
154
  * Shown as the assistant's answer when the request fails or throws.
@@ -161,15 +161,39 @@ export interface UseAskAIOptions {
161
161
  /** Shown as the assistant's answer when the request fails or throws. */
162
162
  const ASK_ERROR = "Something went wrong answering that. Please try again.";
163
163
 
164
+ /** How the assistant's generated route opens its missing-credential notice. */
165
+ const NOT_CONFIGURED = /^The assistant is not configured/u;
166
+
167
+ /**
168
+ * The route's own explanation of a 503 — the generated route's "The assistant is not
169
+ * configured: set AI_GATEWAY_API_KEY." — when the response is that notice, or
170
+ * null. It names only the variable to set, never a value, so it's safe to
171
+ * show, and it tells a site owner trying a fresh deploy what's missing instead
172
+ * of the generic failure; any other error body (an HTML error page, a proxy's
173
+ * message) still gets the generic notice.
174
+ */
175
+ const unavailableNotice = async (
176
+ response: Response
177
+ ): Promise<string | null> => {
178
+ if (response.status !== 503) {
179
+ return null;
180
+ }
181
+ const body = await response.text();
182
+ const text = body.trim();
183
+ return NOT_CONFIGURED.test(text) && text.length <= 200 ? text : null;
184
+ };
185
+
164
186
  /** The current route with the deployment base stripped, for page grounding. */
165
187
  const currentPath = (): string =>
166
188
  stripBase(import.meta.env.BASE_URL, window.location.pathname);
167
189
 
168
190
  /**
169
- * Stream answers from the Ask AI endpoint. Mirrors the built-in Ask AI island so
191
+ * Stream answers from the assistant endpoint. Mirrors the built-in assistant island so
170
192
  * a custom chat UI shares the same grounded, page-aware backend.
171
193
  */
172
- export const useAskAI = (options: UseAskAIOptions = {}): UseAskAI => {
194
+ export const useAssistant = (
195
+ options: UseAssistantOptions = {}
196
+ ): UseAssistant => {
173
197
  const endpoint = options.endpoint ?? DEFAULT_ASK_ENDPOINT;
174
198
  const errorMessage = options.errorMessage ?? ASK_ERROR;
175
199
  const [messages, setMessages] = useState<AskMessage[]>([]);
@@ -186,7 +210,7 @@ export const useAskAI = (options: UseAskAIOptions = {}): UseAskAI => {
186
210
  // preserves a stable `ask` identity for consumers that depend on it. With the
187
211
  // compiler on it's redundant but inert.
188
212
  // oxlint-disable-next-line react-doctor/react-compiler-no-manual-memoization -- see above
189
- const ask = useCallback<UseAskAI["ask"]>(
213
+ const ask = useCallback<UseAssistant["ask"]>(
190
214
  async (question) => {
191
215
  const trimmed = question.trim();
192
216
  if (!trimmed || loading) {
@@ -253,10 +277,11 @@ export const useAskAI = (options: UseAskAIOptions = {}): UseAskAI => {
253
277
  ({ status } = response);
254
278
  if (!response.ok) {
255
279
  // An error body (JSON, HTML error page) must not stream in as the
256
- // assistant's answer.
280
+ // assistant's answer — only the route's own not-configured notice.
281
+ const notice = await unavailableNotice(response).catch(() => null);
257
282
  if (live()) {
258
283
  outcome("ask_error", { status });
259
- assistant.content = errorMessage;
284
+ assistant.content = notice ?? errorMessage;
260
285
  setMessages([...history, { ...assistant }]);
261
286
  }
262
287
  return;
@@ -1,90 +1,32 @@
1
1
  ---
2
2
  import VercelAnalytics from "@vercel/analytics/astro";
3
3
 
4
- // Analytics scripts injected into <head>. PostHog and custom providers use the
5
- // inline-snippet house style (banner/theme/JSON-LD); Vercel uses its official
6
- // Astro component; Cloudflare is its beacon script tag. Loads ONLY in production builds so `blume dev` stays clean
7
- // and local traffic never reaches your analytics.
8
- interface AnalyticsScript {
9
- attributes?: Record<string, string>;
10
- content?: string;
11
- src?: string;
12
- strategy?: "async" | "defer";
13
- }
14
-
4
+ import { analyticsHead } from "../../analytics/head.ts";
5
+ import type { BlumeDataConfig } from "../../core/data.ts";
6
+
7
+ // The analytics adapters' <head> output. Each adapter in `analytics` owns the
8
+ // snippet it emits (src/analytics/*); `analyticsHead` collects them into one
9
+ // list in declared order and this component renders it: the official Vercel
10
+ // component for `vercel()`, one <script> for every other adapter. Loads ONLY
11
+ // in production builds so `blume dev` stays clean and local traffic never
12
+ // reaches your analytics.
15
13
  interface Props {
16
- analytics?: {
17
- cloudflare?: { token: string };
18
- posthog?: { host?: string; key: string };
19
- scripts?: AnalyticsScript[];
20
- vercel?: boolean;
21
- } | null;
14
+ analytics?: BlumeDataConfig["analytics"] | null;
22
15
  }
23
16
 
24
17
  const { analytics } = Astro.props;
25
- const enabled = import.meta.env.PROD && Boolean(analytics);
26
-
27
- // Vercel Web Analytics: rendered via the official @vercel/analytics/astro
28
- // component, which injects the first-party script Vercel serves at
29
- // /_vercel/insights once Web Analytics is enabled for the project.
30
- const vercelEnabled = enabled && analytics?.vercel === true;
31
-
32
- // PostHog: the official array.js loader snippet, keyed off config. The host
33
- // defaults to PostHog Cloud US; EU/self-hosted users override `posthog.host`.
34
- const POSTHOG_LOADER =
35
- '!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug getPageViewId captureTraceFeedback captureTraceMetric".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);';
36
- const posthog = enabled ? analytics?.posthog : undefined;
37
- // PostHog's loader only captures a pageview per real page load, but the client
38
- // router turns link clicks into in-place swaps — capture those too, keyed off
39
- // `astro:page-load` with a pathname guard so the initial load (which the
40
- // loader already counted) and same-page hash moves aren't double-counted.
41
- // Vercel Web Analytics and GA4's enhanced measurement track history changes
42
- // on their own.
43
- const POSTHOG_SPA_PAGEVIEWS =
44
- 'document.addEventListener("astro:page-load",function(){var p=window.__blumePhPath;window.__blumePhPath=location.pathname;if(p!==undefined&&p!==location.pathname){posthog.capture("$pageview");}});';
45
- const posthogSnippet = posthog
46
- ? `${POSTHOG_LOADER}posthog.init(${JSON.stringify(posthog.key)},{api_host:${JSON.stringify(posthog.host ?? "https://us.i.posthog.com")}});${POSTHOG_SPA_PAGEVIEWS}`
47
- : null;
48
-
49
- // Cloudflare Web Analytics (manual setup): the beacon script keyed by the
50
- // site token, exactly as the dashboard's snippet renders it. It tracks
51
- // history changes itself, so client-router navigations need no extra hook.
52
- const cloudflareBeacon =
53
- enabled && analytics?.cloudflare
54
- ? JSON.stringify({ token: analytics.cloudflare.token })
55
- : null;
56
-
57
- // Custom scripts: any other provider. Each is either external (`src`) or inline
58
- // (`content`). Explicit fields win over spread `attributes`.
59
- const customScripts = enabled ? (analytics?.scripts ?? []) : [];
60
- const externalScripts = customScripts
61
- .filter((script) => script.src)
62
- .map((script) => ({
63
- ...script.attributes,
64
- ...(script.strategy === "async" ? { async: true } : {}),
65
- ...(script.strategy === "defer" ? { defer: true } : {}),
66
- src: script.src,
67
- }));
68
- const inlineScripts = customScripts
69
- .filter((script) => script.content)
70
- .map((script) => ({ attributes: script.attributes ?? {}, content: script.content }));
18
+ const nodes = analyticsHead(import.meta.env.PROD ? (analytics ?? []) : []);
71
19
  ---
72
20
 
73
- {vercelEnabled && <VercelAnalytics />}
74
- {
75
- cloudflareBeacon && (
76
- <script
77
- is:inline
78
- defer
79
- src="https://static.cloudflareinsights.com/beacon.min.js"
80
- data-cf-beacon={cloudflareBeacon}
81
- />
82
- )
83
- }
84
- {posthogSnippet && <script is:inline set:html={posthogSnippet} />}
85
- {externalScripts.map((attrs) => <script is:inline {...attrs} />)}
86
21
  {
87
- inlineScripts.map((script) => (
88
- <script is:inline set:html={script.content} {...script.attributes} />
89
- ))
22
+ nodes.map((node) => {
23
+ if (node.type === "vercel") {
24
+ return <VercelAnalytics {...node.props} />;
25
+ }
26
+ return node.content === null ? (
27
+ <script is:inline {...node.attributes} />
28
+ ) : (
29
+ <script is:inline set:html={node.content} {...node.attributes} />
30
+ );
31
+ })
90
32
  }
@@ -34,7 +34,9 @@ const b = { ...EN_UI.banner, ...strings };
34
34
  data-banner-key={banner.key}
35
35
  data-blume-banner
36
36
  >
37
- <span>{banner.content}</span>
37
+ {/* The message is authored in one language, whatever the page's
38
+ direction: `dir="auto"` keeps its punctuation where it was typed. */}
39
+ <span dir="auto">{banner.content}</span>
38
40
  {banner.link && (
39
41
  <a
40
42
  class="inline-flex items-center gap-1 font-medium underline underline-offset-2"
@@ -0,0 +1,69 @@
1
+ ---
2
+ import type { DiscoveryHeadLinks } from "../../core/data.ts";
3
+ import { withBase } from "../islands/base-path.ts";
4
+ // Emits the agent-discovery <link>s for the document <head>, on every page and
5
+ // not just the root: an agent that enters on a deep page (a search result, a
6
+ // shared link) never sees the homepage HTTP `Link` header (see
7
+ // `ai/link-headers.ts`), so the head carries the same `describedby` resources,
8
+ // the AI Catalog / ARD manifest pair, and — when the page has one — its own
9
+ // raw-Markdown mirror as an `alternate`. This also reaches hosts where Blume
10
+ // can't set response headers. Every shell (RootLayout, PageLayout,
11
+ // ReferenceLayout) renders this one partial, so the "every page's head"
12
+ // promise has a single definition. Both `describedby` and `alternate` are
13
+ // IANA-registered relations.
14
+ interface Props {
15
+ /**
16
+ * Which resources exist, from the `blume:data` snapshot; `null` drops every
17
+ * link this partial renders, the Markdown alternate included (a page opting
18
+ * out of the agent-facing surface).
19
+ */
20
+ discovery?: DiscoveryHeadLinks | null;
21
+ /**
22
+ * This page's raw-Markdown mirror (already under the deployment base), or
23
+ * `null` when the route has none — only content routes and the homepage do
24
+ * (see `markdownRoutePaths`). Advertised only while `discovery` is set.
25
+ */
26
+ markdownMirror?: string | null;
27
+ }
28
+
29
+ const { discovery, markdownMirror } = Astro.props;
30
+ ---
31
+
32
+ {
33
+ discovery?.agentReadability && (
34
+ <link
35
+ href={withBase("/agent-readability.json")}
36
+ rel="describedby"
37
+ type="application/json"
38
+ />
39
+ )
40
+ }
41
+ {
42
+ discovery?.llmsTxt && (
43
+ <link href={withBase("/llms.txt")} rel="describedby" type="text/plain" />
44
+ )
45
+ }
46
+ {/* The AI Catalog / ARD manifest under both relations its two specs define:
47
+ `ai-catalog` (ai-catalog spec) and `ard` (ARD v0.91), each pointing at that
48
+ spec's own well-known path. */}
49
+ {
50
+ discovery?.aiCatalog && (
51
+ <>
52
+ <link
53
+ href={withBase("/.well-known/ai-catalog.json")}
54
+ rel="ai-catalog"
55
+ type="application/ai-catalog+json"
56
+ />
57
+ <link
58
+ href={withBase("/.well-known/ard.json")}
59
+ rel="ard"
60
+ type="application/json"
61
+ />
62
+ </>
63
+ )
64
+ }
65
+ {
66
+ discovery && markdownMirror && (
67
+ <link href={markdownMirror} rel="alternate" type="text/markdown" />
68
+ )
69
+ }