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.
- package/AGENTS.md +19 -0
- package/CHANGELOG.md +245 -0
- package/README.md +34 -21
- package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
- package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
- package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
- package/dist/cli/chunk-5shv93fd.js +39 -0
- package/dist/cli/chunk-5shv93fd.js.map +10 -0
- package/dist/cli/chunk-6crbhc3x.js +361 -0
- package/dist/cli/chunk-6crbhc3x.js.map +14 -0
- package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
- package/dist/cli/chunk-6hsn950k.js.map +10 -0
- package/dist/cli/chunk-6vm74dry.js +148 -0
- package/dist/cli/chunk-6vm74dry.js.map +10 -0
- package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
- package/dist/cli/chunk-79jhk4py.js.map +35 -0
- package/dist/cli/chunk-82bbrxdn.js +51 -0
- package/dist/cli/chunk-82bbrxdn.js.map +10 -0
- package/dist/cli/chunk-abh8yjkn.js +31 -0
- package/dist/cli/chunk-abh8yjkn.js.map +10 -0
- package/dist/cli/chunk-ah61y8py.js +75 -0
- package/dist/cli/chunk-ah61y8py.js.map +11 -0
- package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
- package/dist/cli/chunk-ch6g3ar0.js +102 -0
- package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
- package/dist/cli/chunk-dh8cwk36.js +279 -0
- package/dist/cli/chunk-dh8cwk36.js.map +10 -0
- package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
- package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
- package/dist/cli/chunk-f2z5v128.js +97 -0
- package/dist/cli/chunk-f2z5v128.js.map +10 -0
- package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
- package/dist/cli/chunk-fa25z98p.js.map +11 -0
- package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
- package/dist/cli/chunk-fs23ddbb.js.map +35 -0
- package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
- package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
- package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
- package/dist/cli/chunk-hdpx1tax.js +91 -0
- package/dist/cli/chunk-hdpx1tax.js.map +10 -0
- package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
- package/dist/cli/chunk-jwyddg7y.js.map +15 -0
- package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
- package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
- package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
- package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
- package/dist/cli/chunk-m3vmjgmq.js +133 -0
- package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
- package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
- package/dist/cli/chunk-mb2919y2.js.map +10 -0
- package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
- package/dist/cli/chunk-q5163e60.js.map +11 -0
- package/dist/cli/chunk-qkqwkpte.js +12437 -0
- package/dist/cli/chunk-qkqwkpte.js.map +182 -0
- package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
- package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
- package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
- package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
- package/dist/cli/chunk-s1p84fyh.js +261 -0
- package/dist/cli/chunk-s1p84fyh.js.map +10 -0
- package/dist/cli/chunk-s6jhgk0q.js +176 -0
- package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
- package/dist/cli/chunk-vtk4a6dg.js +374 -0
- package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
- package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
- package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
- package/dist/cli/chunk-wm7js3j9.js +145 -0
- package/dist/cli/chunk-wm7js3j9.js.map +11 -0
- package/dist/cli/chunk-yt5n7ppj.js +79 -0
- package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
- package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
- package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
- package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
- package/dist/cli/chunk-zxh4d9vy.js +122 -0
- package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
- package/dist/cli/index.js +214 -57
- package/dist/cli/index.js.map +8 -7
- package/dist/types/ai/agent-readability.d.ts +52 -0
- package/dist/types/ai/ai-catalog.d.ts +42 -0
- package/dist/types/ai/api/paths.d.ts +17 -0
- package/dist/types/ai/api-catalog.d.ts +18 -0
- package/dist/types/ai/ask-context.d.ts +7 -7
- package/dist/types/ai/ask.d.ts +368 -0
- package/dist/types/ai/changelog-markdown.d.ts +2 -0
- package/dist/types/ai/component-markdown.d.ts +2 -2
- package/dist/types/ai/index.d.ts +24 -0
- package/dist/types/ai/link-headers.d.ts +24 -0
- package/dist/types/ai/llms.d.ts +25 -0
- package/dist/types/ai/markdown.d.ts +45 -0
- package/dist/types/ai/mcp/discovery.d.ts +68 -0
- package/dist/types/ai/mcp/tools.d.ts +16 -0
- package/dist/types/ai/openapi-components.d.ts +43 -0
- package/dist/types/ai/relative-links.d.ts +26 -0
- package/dist/types/ai/serializers.d.ts +15 -0
- package/dist/types/ai/skills.d.ts +42 -0
- package/dist/types/ai/tar.d.ts +25 -0
- package/dist/types/ai/visibility.d.ts +17 -0
- package/dist/types/ai/web-bot-auth.d.ts +16 -0
- package/dist/types/analytics/adobe.d.ts +35 -0
- package/dist/types/analytics/amplitude.d.ts +50 -0
- package/dist/types/analytics/clarity.d.ts +31 -0
- package/dist/types/analytics/clearbit.d.ts +29 -0
- package/dist/types/analytics/cloudflare.d.ts +41 -0
- package/dist/types/analytics/fathom.d.ts +41 -0
- package/dist/types/analytics/google-analytics.d.ts +44 -0
- package/dist/types/analytics/google-tag-manager.d.ts +40 -0
- package/dist/types/analytics/head.d.ts +30 -0
- package/dist/types/analytics/heap.d.ts +40 -0
- package/dist/types/analytics/hightouch.d.ts +44 -0
- package/dist/types/analytics/hotjar.d.ts +33 -0
- package/dist/types/analytics/index.d.ts +61 -0
- package/dist/types/analytics/inline.d.ts +17 -0
- package/dist/types/analytics/logrocket.d.ts +44 -0
- package/dist/types/analytics/mixpanel.d.ts +67 -0
- package/dist/types/analytics/pirsch.d.ts +42 -0
- package/dist/types/analytics/plausible.d.ts +56 -0
- package/dist/types/analytics/posthog.d.ts +45 -0
- package/dist/types/analytics/schema.d.ts +320 -0
- package/dist/types/analytics/script.d.ts +46 -0
- package/dist/types/analytics/segment.d.ts +50 -0
- package/dist/types/analytics/vercel.d.ts +48 -0
- package/dist/types/astro/integration.d.ts +76 -0
- package/dist/types/astro/markdown-negotiation.d.ts +23 -0
- package/dist/types/astro/module-types.d.ts +14 -0
- package/dist/types/astro/pages.d.ts +44 -0
- package/dist/types/cli/env.d.ts +12 -0
- package/dist/types/cli/init/scaffold.d.ts +154 -0
- package/dist/types/components/layout/nav-utils.d.ts +11 -0
- package/dist/types/core/adapter.d.ts +47 -0
- package/dist/types/core/api-name.d.ts +7 -0
- package/dist/types/core/changelog-index.d.ts +13 -0
- package/dist/types/core/config-input.d.ts +197 -526
- package/dist/types/core/config.d.ts +61 -35
- package/dist/types/core/content-assets.d.ts +76 -0
- package/dist/types/core/custom-pages.d.ts +33 -0
- package/dist/types/core/data.d.ts +30 -15
- package/dist/types/core/define-components.d.ts +12 -9
- package/dist/types/core/deployment-env.d.ts +6 -11
- package/dist/types/core/frontmatter.d.ts +10 -0
- package/dist/types/core/graph.d.ts +18 -0
- package/dist/types/core/heading-markers.d.ts +54 -0
- package/dist/types/core/i18n-ui.d.ts +12 -10
- package/dist/types/core/i18n.d.ts +87 -0
- package/dist/types/core/includes.d.ts +138 -0
- package/dist/types/core/last-modified.d.ts +47 -0
- package/dist/types/core/links.d.ts +95 -0
- package/dist/types/core/locale-links.d.ts +60 -0
- package/dist/types/core/manifest.d.ts +17 -0
- package/dist/types/core/meta.d.ts +38 -0
- package/dist/types/core/nav-diagnostics.d.ts +26 -0
- package/dist/types/core/navigation.d.ts +6 -0
- package/dist/types/core/node-require.d.ts +19 -0
- package/dist/types/core/package-json.d.ts +13 -0
- package/dist/types/core/probe.d.ts +42 -0
- package/dist/types/core/project-graph.d.ts +51 -0
- package/dist/types/core/project.d.ts +2 -0
- package/dist/types/core/safe-href.d.ts +2 -0
- package/dist/types/core/safe-links.d.ts +26 -0
- package/dist/types/core/schema.d.ts +2284 -454
- package/dist/types/core/site-url.d.ts +16 -0
- package/dist/types/core/sources/assets.d.ts +36 -0
- package/dist/types/core/sources/cache.d.ts +37 -0
- package/dist/types/core/sources/collection.d.ts +28 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
- package/dist/types/core/sources/contentful.d.ts +40 -0
- package/dist/types/core/sources/filesystem.d.ts +24 -0
- package/dist/types/core/sources/github-releases.d.ts +31 -0
- package/dist/types/core/sources/json.d.ts +30 -0
- package/dist/types/core/sources/lexical.d.ts +19 -0
- package/dist/types/core/sources/lower.d.ts +75 -0
- package/dist/types/core/sources/mdx-remote.d.ts +28 -0
- package/dist/types/core/sources/normalize.d.ts +147 -0
- package/dist/types/core/sources/notion.d.ts +131 -0
- package/dist/types/core/sources/obsidian.d.ts +46 -0
- package/dist/types/core/sources/payload.d.ts +39 -0
- package/dist/types/core/sources/portable-text.d.ts +42 -0
- package/dist/types/core/sources/read.d.ts +23 -0
- package/dist/types/core/sources/remote.d.ts +74 -0
- package/dist/types/core/sources/resolve.d.ts +19 -0
- package/dist/types/core/sources/sanity.d.ts +43 -0
- package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
- package/dist/types/core/sources/strapi.d.ts +33 -0
- package/dist/types/core/sources/types.d.ts +7 -0
- package/dist/types/core/sources/watch.d.ts +45 -0
- package/dist/types/core/text-width.d.ts +11 -0
- package/dist/types/core/types.d.ts +15 -1
- package/dist/types/core/unrecognized-keys.d.ts +7 -0
- package/dist/types/core/versions.d.ts +72 -0
- package/dist/types/core/yaml.d.ts +9 -0
- package/dist/types/deploy/adapter-output.d.ts +45 -0
- package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
- package/dist/types/deploy/adapters/index.d.ts +29 -0
- package/dist/types/deploy/adapters/netlify.d.ts +37 -0
- package/dist/types/deploy/adapters/node.d.ts +37 -0
- package/dist/types/deploy/adapters/registry.d.ts +133 -0
- package/dist/types/deploy/adapters/types.d.ts +71 -0
- package/dist/types/deploy/adapters/vercel.d.ts +38 -0
- package/dist/types/deploy/artifacts.d.ts +65 -0
- package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
- package/dist/types/deploy/function-bundle.d.ts +80 -0
- package/dist/types/deploy/headers.d.ts +50 -0
- package/dist/types/deploy/node-headers.d.ts +42 -0
- package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
- package/dist/types/deploy/platforms/index.d.ts +18 -0
- package/dist/types/deploy/platforms/netlify.d.ts +13 -0
- package/dist/types/deploy/platforms/node.d.ts +11 -0
- package/dist/types/deploy/platforms/paths.d.ts +27 -0
- package/dist/types/deploy/platforms/static.d.ts +10 -0
- package/dist/types/deploy/platforms/types.d.ts +104 -0
- package/dist/types/deploy/platforms/vercel.d.ts +32 -0
- package/dist/types/deploy/redirects.d.ts +53 -0
- package/dist/types/deploy/robots.d.ts +8 -0
- package/dist/types/deploy/rss.d.ts +31 -0
- package/dist/types/deploy/sitemap.d.ts +21 -0
- package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
- package/dist/types/markdown/code-title.d.ts +32 -0
- package/dist/types/markdown/fence-meta.d.ts +23 -0
- package/dist/types/markdown/themes.d.ts +3 -3
- package/dist/types/openapi/asyncapi.d.ts +129 -0
- package/dist/types/openapi/graphql-build.d.ts +8 -0
- package/dist/types/openapi/graphql.d.ts +122 -0
- package/dist/types/openapi/model.d.ts +158 -0
- package/dist/types/openapi/parse.d.ts +57 -0
- package/dist/types/openapi/references.d.ts +37 -25
- package/dist/types/openapi/render-mdx.d.ts +33 -0
- package/dist/types/openapi/sentence.d.ts +7 -0
- package/dist/types/openapi/signature.d.ts +10 -0
- package/dist/types/openapi/source.d.ts +22 -0
- package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
- package/dist/types/reference/asyncapi.d.ts +166 -0
- package/dist/types/reference/graphql.d.ts +181 -0
- package/dist/types/reference/index.d.ts +32 -0
- package/dist/types/reference/openapi.d.ts +165 -0
- package/dist/types/reference/options.d.ts +157 -0
- package/dist/types/reference/scalar.d.ts +136 -0
- package/dist/types/reference/schema.d.ts +630 -0
- package/dist/types/search/adapters/algolia.d.ts +32 -0
- package/dist/types/search/adapters/flexsearch.d.ts +12 -0
- package/dist/types/search/adapters/index.d.ts +31 -0
- package/dist/types/search/adapters/mixedbread.d.ts +22 -0
- package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
- package/dist/types/search/adapters/orama.d.ts +13 -0
- package/dist/types/search/adapters/pagefind.d.ts +12 -0
- package/dist/types/search/adapters/registry.d.ts +228 -0
- package/dist/types/search/adapters/types.d.ts +34 -0
- package/dist/types/search/adapters/typesense.d.ts +42 -0
- package/dist/types/search/build.d.ts +23 -0
- package/dist/types/search/documents.d.ts +90 -0
- package/dist/types/search/facets.d.ts +3 -0
- package/dist/types/search/orama-index.d.ts +1 -1
- package/dist/types/search/sync/algolia.d.ts +14 -0
- package/dist/types/search/sync/index.d.ts +14 -0
- package/dist/types/search/sync/orama-cloud.d.ts +10 -0
- package/dist/types/search/sync/typesense.d.ts +14 -0
- package/dist/types/sources/contentful.d.ts +68 -0
- package/dist/types/sources/custom.d.ts +20 -0
- package/dist/types/sources/filesystem.d.ts +42 -0
- package/dist/types/sources/github-releases.d.ts +46 -0
- package/dist/types/sources/index.d.ts +48 -0
- package/dist/types/sources/mdx-remote.d.ts +63 -0
- package/dist/types/sources/notion.d.ts +65 -0
- package/dist/types/sources/obsidian.d.ts +34 -0
- package/dist/types/sources/payload.d.ts +68 -0
- package/dist/types/sources/registry.d.ts +1414 -0
- package/dist/types/sources/sanity.d.ts +69 -0
- package/dist/types/sources/shared.d.ts +46 -0
- package/dist/types/sources/strapi.d.ts +66 -0
- package/dist/types/theme/icon-kind.d.ts +11 -0
- package/dist/types/theme/icons.d.ts +20 -0
- package/docs/01-quickstart.mdx +18 -18
- package/docs/02-deployment.mdx +52 -28
- package/docs/03-upgrading.mdx +364 -0
- package/docs/04-migrating.mdx +58 -0
- package/docs/08-faq.mdx +5 -5
- package/docs/advanced/blog.mdx +13 -6
- package/docs/advanced/changelog.mdx +23 -35
- package/docs/advanced/custom-pages.mdx +22 -10
- package/docs/advanced/meta.ts +1 -8
- package/docs/advanced/skills.mdx +8 -0
- package/docs/cli/audit.mdx +646 -0
- package/docs/cli/doctor.mdx +29 -0
- package/docs/{reference/eval.mdx → cli/evals.mdx} +12 -11
- package/docs/cli/index.mdx +105 -0
- package/docs/cli/meta.ts +7 -0
- package/docs/{reference → cli}/translate.mdx +9 -9
- package/docs/cli/validate.mdx +41 -0
- package/docs/cli/version.mdx +40 -0
- package/docs/configuration/analytics.mdx +350 -59
- package/docs/configuration/assistant.mdx +357 -0
- package/docs/configuration/customization.mdx +16 -10
- package/docs/configuration/index.mdx +50 -31
- package/docs/configuration/meta.ts +1 -1
- package/docs/configuration/search.mdx +76 -55
- package/docs/configuration/theming.mdx +24 -15
- package/docs/content/components.mdx +21 -5
- package/docs/{reference → content}/frontmatter.mdx +35 -1
- package/docs/content/i18n.mdx +9 -7
- package/docs/content/includes.mdx +2 -4
- package/docs/content/index.mdx +1 -1
- package/docs/content/islands.mdx +11 -6
- package/docs/content/meta.mdx +1 -1
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +9 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +16 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +12 -12
- package/docs/discoverability/index.mdx +4 -4
- package/docs/discoverability/json-api.mdx +4 -4
- package/docs/discoverability/llms-txt.mdx +6 -6
- package/docs/discoverability/markdown.mdx +4 -4
- package/docs/discoverability/mcp.mdx +11 -11
- package/docs/discoverability/sitemap-and-robots.mdx +3 -3
- package/docs/index.mdx +4 -4
- package/docs/references/asyncapi.mdx +59 -0
- package/docs/{advanced → references}/graphql.mdx +45 -32
- package/docs/{reference → references}/meta.ts +2 -2
- package/docs/references/openapi.mdx +171 -0
- package/docs/references/scalar.mdx +64 -0
- package/package.json +42 -8
- package/skills/blume/SKILL.md +23 -10
- package/skills/blume-migrate/SKILL.md +22 -21
- package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
- package/skills/blume-migrate/references/docusaurus.md +5 -4
- package/skills/blume-migrate/references/fumadocs.md +4 -4
- package/skills/blume-migrate/references/mintlify.md +23 -8
- package/skills/blume-migrate/references/monorepo.md +6 -6
- package/skills/blume-migrate/references/starlight.md +4 -4
- package/src/ai/agent-readability.ts +25 -26
- package/src/ai/ai-catalog.ts +50 -32
- package/src/ai/api/handlers.ts +46 -11
- package/src/ai/api/paths.ts +1 -1
- package/src/ai/api-catalog.ts +8 -8
- package/src/ai/ask-context.ts +7 -7
- package/src/ai/ask-data.ts +3 -3
- package/src/ai/ask.ts +637 -100
- package/src/ai/changelog-markdown.ts +91 -0
- package/src/ai/component-markdown.ts +328 -12
- package/src/ai/cors.ts +3 -3
- package/src/ai/index.ts +45 -0
- package/src/ai/link-headers.ts +7 -6
- package/src/ai/llms.ts +20 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/openapi-components.ts +5 -2
- package/src/ai/relative-links.ts +170 -0
- package/src/ai/serializers.ts +3 -3
- package/src/ai/skills.ts +1 -1
- package/src/ai/visibility.ts +1 -1
- package/src/ai/web-bot-auth.ts +2 -2
- package/src/analytics/adobe.ts +46 -0
- package/src/analytics/amplitude.ts +79 -0
- package/src/analytics/clarity.ts +46 -0
- package/src/analytics/clearbit.ts +47 -0
- package/src/analytics/cloudflare.ts +67 -0
- package/src/analytics/fathom.ts +64 -0
- package/src/analytics/google-analytics.ts +84 -0
- package/src/analytics/google-tag-manager.ts +61 -0
- package/src/analytics/head.ts +130 -0
- package/src/analytics/heap.ts +65 -0
- package/src/analytics/hightouch.ts +77 -0
- package/src/analytics/hotjar.ts +47 -0
- package/src/analytics/index.ts +71 -0
- package/src/analytics/inline.ts +21 -0
- package/src/analytics/logrocket.ts +71 -0
- package/src/analytics/mixpanel.ts +92 -0
- package/src/analytics/pirsch.ts +66 -0
- package/src/analytics/plausible.ts +83 -0
- package/src/analytics/posthog.ts +78 -0
- package/src/analytics/schema.ts +60 -0
- package/src/analytics/script.ts +60 -0
- package/src/analytics/segment.ts +85 -0
- package/src/analytics/vercel.ts +50 -0
- package/src/astro/adapter-root.ts +7 -9
- package/src/astro/component-slots.ts +131 -91
- package/src/astro/generate.ts +129 -361
- package/src/astro/integration.ts +2 -6
- package/src/astro/module-types.ts +1 -1
- package/src/astro/pages.ts +13 -101
- package/src/astro/render-deps.ts +379 -0
- package/src/astro/runtime-deps.ts +201 -0
- package/src/astro/templates.ts +575 -562
- package/src/audit/agent.ts +24 -0
- package/src/audit/catalog.ts +2 -2
- package/src/audit/checks/assets.ts +2 -2
- package/src/audit/checks/dns-aid.ts +1 -1
- package/src/audit/checks/duplicates.ts +3 -1
- package/src/audit/checks/i18n.ts +1 -1
- package/src/audit/checks/indexability.ts +7 -7
- package/src/audit/checks/links.ts +2 -2
- package/src/audit/checks/llms.ts +6 -6
- package/src/audit/checks/network.ts +3 -3
- package/src/audit/checks/og-image.ts +2 -2
- package/src/audit/checks/robots.ts +1 -1
- package/src/audit/checks/sitemap.ts +2 -2
- package/src/audit/checks/social.ts +1 -1
- package/src/audit/run.ts +4 -3
- package/src/audit/terms.ts +31 -0
- package/src/audit/url.ts +13 -13
- package/src/blume-modules.d.ts +2 -2
- package/src/cli/command-meta.ts +10 -0
- package/src/cli/commands/audit.ts +40 -21
- package/src/cli/commands/build.ts +71 -316
- package/src/cli/commands/check.ts +1 -0
- package/src/cli/commands/dev.ts +40 -1
- package/src/cli/commands/doctor.ts +92 -14
- package/src/cli/commands/eject.ts +44 -7
- package/src/cli/commands/eval.ts +5 -5
- package/src/cli/commands/init.ts +161 -41
- package/src/cli/commands/migrate.ts +121 -0
- package/src/cli/commands/preview.ts +7 -1
- package/src/cli/commands/translate.ts +5 -5
- package/src/cli/commands/upgrade.ts +141 -0
- package/src/cli/commands/version.ts +57 -44
- package/src/cli/eject-scripts.ts +121 -6
- package/src/cli/index.ts +11 -1
- package/src/cli/init/install.ts +70 -0
- package/src/cli/init/questions.ts +7 -0
- package/src/cli/init/scaffold.ts +459 -75
- package/src/cli/lazy-command.ts +37 -1
- package/src/cli/prepare.ts +40 -6
- package/src/cli/required-secrets.ts +39 -12
- package/src/cli/unknown-flags.ts +266 -0
- package/src/cli/yarn-pnp.ts +52 -0
- package/src/components/content/AccordionItem.astro +7 -1
- package/src/components/content/Card.astro +4 -3
- package/src/components/content/ColorItem.astro +22 -4
- package/src/components/content/GithubInfo.astro +2 -2
- package/src/components/content/Prompt.astro +25 -25
- package/src/components/content/Tabs.astro +3 -1
- package/src/components/content/Tile.astro +2 -3
- package/src/components/content/Tooltip.astro +57 -9
- package/src/components/content/content-strings.ts +34 -0
- package/src/components/content/diff.ts +1 -1
- package/src/components/content/mermaid-element.ts +13 -2
- package/src/components/content/prompt-markdown.ts +292 -0
- package/src/components/content/tooltip-id.ts +41 -0
- package/src/components/copy-feedback.ts +1 -1
- package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
- package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
- package/src/components/islands/hooks.ts +36 -11
- package/src/components/layout/Analytics.astro +21 -79
- package/src/components/layout/Banner.astro +3 -1
- package/src/components/layout/DiscoveryLinks.astro +69 -0
- package/src/components/layout/Header.astro +93 -30
- package/src/components/layout/LanguageSwitcher.astro +4 -1
- package/src/components/layout/Logo.astro +23 -2
- package/src/components/layout/NavSelector.astro +13 -2
- package/src/components/layout/NavTree.astro +12 -3
- package/src/components/layout/NavTreeScript.astro +17 -3
- package/src/components/layout/PageActions.astro +3 -3
- package/src/components/layout/PageFeedback.astro +11 -1
- package/src/components/layout/PageLayout.astro +58 -11
- package/src/components/layout/Pagination.astro +7 -7
- package/src/components/layout/ReferenceLayout.astro +22 -13
- package/src/components/layout/RootLayout.astro +75 -72
- package/src/components/layout/Search.astro +43 -19
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +73 -16
- package/src/components/layout/drawer-inert.ts +113 -15
- package/src/components/layout/dropdown-clamp.ts +105 -0
- package/src/components/layout/head-scripts.ts +15 -6
- package/src/components/layout/nav-utils.ts +17 -0
- package/src/components/layout/search/algolia.ts +8 -8
- package/src/components/layout/search/orama-cloud.ts +9 -7
- package/src/components/layout/search/typesense.ts +11 -17
- package/src/components/openapi/MessageComposer.astro +2 -2
- package/src/components/openapi/Playground.astro +2 -2
- package/src/components/openapi/description.ts +2 -2
- package/src/components/openapi/playground-client.ts +79 -10
- package/src/core/changelog-index.ts +24 -0
- package/src/core/code-fences.ts +1 -1
- package/src/core/component-overrides.ts +399 -154
- package/src/core/config-input.ts +201 -566
- package/src/core/config.ts +131 -42
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +34 -15
- package/src/core/define-components.ts +12 -9
- package/src/core/deployment-env.ts +18 -74
- package/src/core/diagnostics.ts +14 -7
- package/src/core/graph.ts +69 -25
- package/src/core/i18n-ui.ts +41 -11
- package/src/core/i18n.ts +17 -0
- package/src/core/includes.ts +156 -38
- package/src/core/last-modified.ts +6 -11
- package/src/core/links.ts +166 -2
- package/src/core/manifest.ts +10 -3
- package/src/core/navigation.ts +115 -16
- package/src/core/new-tab.ts +35 -0
- package/src/core/node-require.ts +21 -0
- package/src/core/project-graph.ts +42 -26
- package/src/core/project.ts +9 -4
- package/src/core/request-body.ts +61 -0
- package/src/core/safe-href.ts +28 -0
- package/src/core/safe-links.ts +68 -0
- package/src/core/schema.ts +528 -745
- package/src/core/server-features.ts +10 -11
- package/src/core/sources/assets.ts +47 -11
- package/src/core/sources/collection.ts +67 -0
- package/src/core/sources/contentful-rich-text.ts +285 -0
- package/src/core/sources/contentful.ts +173 -0
- package/src/core/sources/github-releases.ts +51 -1
- package/src/core/sources/json.ts +71 -0
- package/src/core/sources/lexical.ts +195 -0
- package/src/core/sources/lower.ts +226 -0
- package/src/core/sources/normalize.ts +52 -2
- package/src/core/sources/notion.ts +39 -28
- package/src/core/sources/payload.ts +135 -0
- package/src/core/sources/portable-text.ts +11 -16
- package/src/core/sources/remote.ts +226 -0
- package/src/core/sources/resolve.ts +104 -166
- package/src/core/sources/sanity.ts +16 -49
- package/src/core/sources/strapi-blocks.ts +124 -0
- package/src/core/sources/strapi.ts +191 -0
- package/src/core/sources/types.ts +12 -1
- package/src/core/types.ts +15 -1
- package/src/core/ui-packs/ar.ts +10 -7
- package/src/core/ui-packs/bg.ts +10 -7
- package/src/core/ui-packs/bn.ts +10 -7
- package/src/core/ui-packs/ca.ts +7 -6
- package/src/core/ui-packs/cs.ts +10 -7
- package/src/core/ui-packs/da.ts +10 -7
- package/src/core/ui-packs/de.ts +10 -7
- package/src/core/ui-packs/el.ts +7 -6
- package/src/core/ui-packs/es.ts +7 -6
- package/src/core/ui-packs/fa.ts +10 -7
- package/src/core/ui-packs/fi.ts +10 -7
- package/src/core/ui-packs/fr.ts +7 -6
- package/src/core/ui-packs/he.ts +10 -7
- package/src/core/ui-packs/hi.ts +10 -7
- package/src/core/ui-packs/hr.ts +10 -7
- package/src/core/ui-packs/hu.ts +10 -7
- package/src/core/ui-packs/id.ts +10 -7
- package/src/core/ui-packs/it.ts +7 -6
- package/src/core/ui-packs/ja.ts +7 -6
- package/src/core/ui-packs/ko.ts +7 -6
- package/src/core/ui-packs/nl.ts +10 -7
- package/src/core/ui-packs/no.ts +10 -7
- package/src/core/ui-packs/pl.ts +10 -7
- package/src/core/ui-packs/pt-br.ts +7 -6
- package/src/core/ui-packs/pt.ts +7 -6
- package/src/core/ui-packs/ro.ts +10 -7
- package/src/core/ui-packs/ru.ts +10 -7
- package/src/core/ui-packs/sk.ts +10 -7
- package/src/core/ui-packs/sr.ts +10 -7
- package/src/core/ui-packs/sv.ts +10 -7
- package/src/core/ui-packs/th.ts +7 -6
- package/src/core/ui-packs/tr.ts +10 -7
- package/src/core/ui-packs/uk.ts +10 -7
- package/src/core/ui-packs/vi.ts +7 -6
- package/src/core/ui-packs/zh-tw.ts +7 -6
- package/src/core/ui-packs/zh.ts +7 -6
- package/src/core/unrecognized-keys.ts +10 -0
- package/src/core/version-cut.ts +116 -8
- package/src/deploy/adapter-output.ts +57 -97
- package/src/deploy/adapters/cloudflare.ts +39 -0
- package/src/deploy/adapters/index.ts +41 -0
- package/src/deploy/adapters/netlify.ts +34 -0
- package/src/deploy/adapters/node.ts +34 -0
- package/src/deploy/adapters/registry.ts +127 -0
- package/src/deploy/adapters/types.ts +92 -0
- package/src/deploy/adapters/vercel.ts +35 -0
- package/src/deploy/artifacts.ts +55 -27
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +124 -23
- package/src/deploy/node-headers.ts +198 -0
- package/src/deploy/platforms/cloudflare.ts +312 -0
- package/src/deploy/platforms/index.ts +67 -0
- package/src/deploy/platforms/netlify.ts +52 -0
- package/src/deploy/platforms/node.ts +40 -0
- package/src/deploy/platforms/paths.ts +42 -0
- package/src/deploy/platforms/static.ts +29 -0
- package/src/deploy/platforms/types.ts +112 -0
- package/src/deploy/platforms/vercel.ts +193 -0
- package/src/deploy/redirects.ts +30 -18
- package/src/deploy/robots.ts +3 -3
- package/src/deploy/rss.ts +2 -2
- package/src/deploy/sitemap.ts +2 -2
- package/src/deploy/vercel-negotiation.ts +2 -2
- package/src/eval/agents.ts +32 -1
- package/src/eval/findings.ts +19 -11
- package/src/eval/report.ts +10 -2
- package/src/markdown/external-links.ts +65 -0
- package/src/markdown/include.ts +45 -27
- package/src/markdown/index.ts +34 -9
- package/src/markdown/inline-code.ts +12 -6
- package/src/markdown/relative-links.ts +324 -0
- package/src/markdown/themes.ts +3 -3
- package/src/migrate/migrate.ts +149 -0
- package/src/openapi/parse.ts +64 -16
- package/src/openapi/proxy.ts +62 -10
- package/src/openapi/references.ts +147 -147
- package/src/openapi/render-mdx.ts +32 -10
- package/src/openapi/scalar.ts +15 -13
- package/src/openapi/sentence.ts +14 -0
- package/src/openapi/source.ts +37 -21
- package/src/openapi/spec-dependency-error.ts +15 -0
- package/src/reference/asyncapi.ts +83 -0
- package/src/reference/graphql.ts +89 -0
- package/src/reference/index.ts +40 -0
- package/src/reference/openapi.ts +83 -0
- package/src/reference/options.ts +201 -0
- package/src/reference/scalar.ts +136 -0
- package/src/reference/schema.ts +88 -0
- package/src/registry/eject.ts +109 -53
- package/src/search/adapters/algolia.ts +46 -0
- package/src/search/adapters/flexsearch.ts +29 -0
- package/src/search/adapters/index.ts +39 -0
- package/src/search/adapters/mixedbread.ts +39 -0
- package/src/search/adapters/orama-cloud.ts +51 -0
- package/src/search/adapters/orama.ts +24 -0
- package/src/search/adapters/pagefind.ts +27 -0
- package/src/search/adapters/registry.ts +131 -0
- package/src/search/adapters/types.ts +46 -0
- package/src/search/adapters/typesense.ts +57 -0
- package/src/search/build.ts +8 -4
- package/src/search/documents.ts +8 -2
- package/src/search/orama-index.ts +1 -1
- package/src/search/sync/algolia.ts +12 -11
- package/src/search/sync/index.ts +35 -20
- package/src/search/sync/orama-cloud.ts +12 -9
- package/src/search/sync/typesense.ts +15 -13
- package/src/sources/contentful.ts +63 -0
- package/src/sources/custom.ts +38 -0
- package/src/sources/filesystem.ts +51 -0
- package/src/sources/github-releases.ts +52 -0
- package/src/sources/index.ts +60 -0
- package/src/sources/mdx-remote.ts +76 -0
- package/src/sources/notion.ts +63 -0
- package/src/sources/obsidian.ts +38 -0
- package/src/sources/payload.ts +60 -0
- package/src/sources/registry.ts +182 -0
- package/src/sources/sanity.ts +66 -0
- package/src/sources/shared.ts +52 -0
- package/src/sources/strapi.ts +58 -0
- package/src/theme/entry.ts +24 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-0qymqwzz.js +0 -164
- package/dist/cli/chunk-0qymqwzz.js.map +0 -15
- package/dist/cli/chunk-1jefwnfs.js.map +0 -48
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-4x36ddpw.js.map +0 -11
- package/dist/cli/chunk-5093q3n7.js +0 -68
- package/dist/cli/chunk-5093q3n7.js.map +0 -10
- package/dist/cli/chunk-5qk08vmp.js.map +0 -11
- package/dist/cli/chunk-7s8hm3b6.js +0 -5347
- package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
- package/dist/cli/chunk-8cjtbafj.js.map +0 -13
- package/dist/cli/chunk-97r59kpr.js +0 -381
- package/dist/cli/chunk-97r59kpr.js.map +0 -12
- package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
- package/dist/cli/chunk-b27xqwn9.js.map +0 -10
- package/dist/cli/chunk-bf6bt1xt.js +0 -185
- package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
- package/dist/cli/chunk-cjtn640a.js.map +0 -10
- package/dist/cli/chunk-ct47dqpx.js.map +0 -11
- package/dist/cli/chunk-esphfr8p.js +0 -107
- package/dist/cli/chunk-esphfr8p.js.map +0 -11
- package/dist/cli/chunk-ex56aa81.js +0 -1016
- package/dist/cli/chunk-ex56aa81.js.map +0 -13
- package/dist/cli/chunk-garjf5z9.js +0 -30
- package/dist/cli/chunk-garjf5z9.js.map +0 -10
- package/dist/cli/chunk-js7saxwm.js +0 -1045
- package/dist/cli/chunk-js7saxwm.js.map +0 -22
- package/dist/cli/chunk-k79xp7av.js.map +0 -39
- package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-rz9jmfhz.js +0 -108
- package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-yg63d42r.js.map +0 -34
- package/docs/advanced/api-reference.mdx +0 -240
- package/docs/configuration/ask-ai.mdx +0 -256
- package/docs/reference/cli.mdx +0 -197
- package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
- package/src/components/content/changelog-element.ts +0 -69
- package/src/search/providers.ts +0 -91
- /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
- /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
- /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
- /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
|
|
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["
|
|
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
|
|
52
|
-
<
|
|
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-
|
|
58
|
+
transition:persist="blume-assistant"
|
|
59
59
|
/>
|
|
60
60
|
|
|
61
61
|
<style is:global>
|
|
62
62
|
:root {
|
|
63
|
-
--blume-
|
|
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-
|
|
74
|
-
padding-inline-end: var(--blume-
|
|
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-
|
|
84
|
+
body[data-blume-assistant="open"] [data-blume-toc] {
|
|
85
85
|
display: none;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
body[data-blume-
|
|
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 {
|
|
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 `
|
|
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
|
|
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:
|
|
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["
|
|
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: "
|
|
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
|
|
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?:
|
|
141
|
-
strings?: UIStrings["
|
|
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
|
|
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
|
-
} =
|
|
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-
|
|
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 "
|
|
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-
|
|
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-
|
|
198
|
-
return () => window.removeEventListener("blume:open-
|
|
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
|
|
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.
|
|
236
|
+
document.body.dataset.blumeAssistant = "open";
|
|
237
237
|
inputRef.current?.focus();
|
|
238
238
|
} else {
|
|
239
|
-
delete document.body.dataset.
|
|
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.
|
|
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.
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
141
|
-
export interface
|
|
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
|
|
151
|
-
/** Existing
|
|
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
|
|
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
|
|
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<
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
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
|
+
}
|