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
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { normalizeBasePath, withBasePath } from "../core/base-path.ts";
|
|
2
|
+
import { EN_UI, resolveUIStrings } from "../core/i18n-ui.ts";
|
|
3
|
+
import type { BlumeProject } from "../core/project-graph.ts";
|
|
4
|
+
import { absoluteUrl } from "../core/site-url.ts";
|
|
5
|
+
import type { PageRecord } from "../core/types.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The generated `/changelog` index as Markdown, for its `/changelog.md`
|
|
9
|
+
* mirror and MCP `get_page`: the timeline an agent would otherwise have to
|
|
10
|
+
* scrape out of the rendered page. Lists what the index page lists — every
|
|
11
|
+
* visible changelog entry of the current docs in the default locale, newest
|
|
12
|
+
* first, grouped by year — one line each, with its date and category and a
|
|
13
|
+
* link to the entry's own page.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
interface IndexRow {
|
|
17
|
+
date: Date | null;
|
|
18
|
+
page: PageRecord;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const parseDate = (value: string | undefined): Date | null => {
|
|
22
|
+
if (value === undefined) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const date = new Date(value);
|
|
26
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** A row's link: absolute under a configured site, like llms.txt. */
|
|
30
|
+
const entryUrl = (project: BlumeProject, route: string): string => {
|
|
31
|
+
const { base, site } = project.config.deployment.options;
|
|
32
|
+
const path = withBasePath(normalizeBasePath(base), route);
|
|
33
|
+
return encodeURI(site ? absoluteUrl(site, path) : path);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const rowLine = (project: BlumeProject, { date, page }: IndexRow): string => {
|
|
37
|
+
const details = [
|
|
38
|
+
date ? date.toISOString().slice(0, 10) : "",
|
|
39
|
+
page.meta.changelog?.category ?? "",
|
|
40
|
+
].filter(Boolean);
|
|
41
|
+
const title = page.title.replaceAll(/[[\]]/gu, String.raw`\$&`);
|
|
42
|
+
const tail = details.length > 0 ? ` — ${details.join(", ")}` : "";
|
|
43
|
+
return `- [${title}](${entryUrl(project, page.route)})${tail}`;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const buildChangelogIndexMarkdown = (project: BlumeProject): string => {
|
|
47
|
+
const { i18n } = project.config;
|
|
48
|
+
const ui = i18n
|
|
49
|
+
? resolveUIStrings(i18n.defaultLocale, {
|
|
50
|
+
defaultLocale: i18n.defaultLocale,
|
|
51
|
+
overrides: i18n.ui,
|
|
52
|
+
})
|
|
53
|
+
: EN_UI;
|
|
54
|
+
const rows: IndexRow[] = project.graph.pages
|
|
55
|
+
.filter(
|
|
56
|
+
(page) =>
|
|
57
|
+
page.contentType === "changelog" &&
|
|
58
|
+
!page.meta.draft &&
|
|
59
|
+
!page.meta.sidebar.hidden &&
|
|
60
|
+
!page.fallback &&
|
|
61
|
+
page.version === "" &&
|
|
62
|
+
(!i18n || page.locale === i18n.defaultLocale)
|
|
63
|
+
)
|
|
64
|
+
.map((page) => ({
|
|
65
|
+
date: parseDate(page.meta.date ?? page.meta.changelog?.date),
|
|
66
|
+
page,
|
|
67
|
+
}))
|
|
68
|
+
.toSorted((a, b) => (b.date?.getTime() ?? 0) - (a.date?.getTime() ?? 0));
|
|
69
|
+
|
|
70
|
+
const blocks = [`# ${ui.changelog.title}`, ui.changelog.description];
|
|
71
|
+
let year: number | null | undefined;
|
|
72
|
+
let lines: string[] = [];
|
|
73
|
+
const flush = (): void => {
|
|
74
|
+
if (lines.length > 0) {
|
|
75
|
+
blocks.push(lines.join("\n"));
|
|
76
|
+
lines = [];
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
for (const row of rows) {
|
|
80
|
+
const rowYear = row.date ? row.date.getUTCFullYear() : null;
|
|
81
|
+
if (rowYear !== year) {
|
|
82
|
+
flush();
|
|
83
|
+
year = rowYear;
|
|
84
|
+
// Undated entries sort last, under a heading of their own.
|
|
85
|
+
blocks.push(rowYear === null ? "## Undated" : `## ${rowYear}`);
|
|
86
|
+
}
|
|
87
|
+
lines.push(rowLine(project, row));
|
|
88
|
+
}
|
|
89
|
+
flush();
|
|
90
|
+
return `${blocks.join("\n\n")}\n`;
|
|
91
|
+
};
|
|
@@ -70,6 +70,15 @@ export const isString = <Value>(value: Value): value is Value & string =>
|
|
|
70
70
|
const isNumber = <Value>(value: Value): value is Value & number =>
|
|
71
71
|
typeof value === "number";
|
|
72
72
|
|
|
73
|
+
/** A nested map of evaluated values — an object literal prop, not a date or a list. */
|
|
74
|
+
const isValueMap = (
|
|
75
|
+
value: EvaluatedValue
|
|
76
|
+
): value is { [key: string]: EvaluatedValue } =>
|
|
77
|
+
typeof value === "object" &&
|
|
78
|
+
value !== null &&
|
|
79
|
+
!Array.isArray(value) &&
|
|
80
|
+
!(value instanceof Date);
|
|
81
|
+
|
|
73
82
|
/** Evaluated props plus whether any attribute resisted static evaluation. */
|
|
74
83
|
interface EvaluatedProps {
|
|
75
84
|
lossy: boolean;
|
|
@@ -216,17 +225,22 @@ const applySplices = (text: string, splices: Splice[]): string => {
|
|
|
216
225
|
/**
|
|
217
226
|
* Strip the common indentation JSX children carry in source (`<Step>` bodies
|
|
218
227
|
* are typically indented two spaces under their tag). The first line starts
|
|
219
|
-
* mid-line at the slice boundary,
|
|
220
|
-
*
|
|
228
|
+
* mid-line at the slice boundary, already past its own indent, so that indent
|
|
229
|
+
* is passed in as `firstIndent` when it is known — the whitespace before the
|
|
230
|
+
* slice — and counts toward the common prefix. Without it a nested list
|
|
231
|
+
* (`- a` then ` - b`) would lose its nesting: the deeper following lines
|
|
232
|
+
* alone would set the prefix. When the slice starts after other text on its
|
|
233
|
+
* line (`<Step>Body…`), only the following lines are measured.
|
|
221
234
|
*/
|
|
222
|
-
const dedent = (text: string): string => {
|
|
235
|
+
const dedent = (text: string, firstIndent?: number): string => {
|
|
223
236
|
const lines = text.split("\n");
|
|
224
237
|
const rest = lines.slice(1).filter((line) => line.trim() !== "");
|
|
225
238
|
if (rest.length === 0) {
|
|
226
239
|
return text;
|
|
227
240
|
}
|
|
228
241
|
const indent = Math.min(
|
|
229
|
-
...rest.map((line) => line.length - line.trimStart().length)
|
|
242
|
+
...rest.map((line) => line.length - line.trimStart().length),
|
|
243
|
+
...(firstIndent === undefined ? [] : [firstIndent])
|
|
230
244
|
);
|
|
231
245
|
if (indent === 0) {
|
|
232
246
|
return text;
|
|
@@ -239,6 +253,16 @@ const dedent = (text: string): string => {
|
|
|
239
253
|
].join("\n");
|
|
240
254
|
};
|
|
241
255
|
|
|
256
|
+
/**
|
|
257
|
+
* The indent of the line `offset` sits on, when everything before `offset` on
|
|
258
|
+
* that line is whitespace; `undefined` when the offset follows other text.
|
|
259
|
+
*/
|
|
260
|
+
const indentAt = (source: string, offset: number): number | undefined => {
|
|
261
|
+
const lineStart = source.lastIndexOf("\n", offset - 1) + 1;
|
|
262
|
+
const prefix = source.slice(lineStart, offset);
|
|
263
|
+
return /^[\t ]*$/u.test(prefix) ? prefix.length : undefined;
|
|
264
|
+
};
|
|
265
|
+
|
|
242
266
|
const isJsxElement = (node: MdastNode): boolean =>
|
|
243
267
|
node.type === "mdxJsxFlowElement" || node.type === "mdxJsxTextElement";
|
|
244
268
|
|
|
@@ -442,11 +466,15 @@ const card: ComponentMarkdown = ({ children, lossy, props }) => {
|
|
|
442
466
|
* JSX as a block of its own instead of vanishing beside a rendered sibling.
|
|
443
467
|
* Passing the body slice through instead would leave each card's source
|
|
444
468
|
* indentation in the output and run one card's title straight on from the
|
|
445
|
-
* previous card's body as the same paragraph.
|
|
469
|
+
* previous card's body as the same paragraph. The other containers that are
|
|
470
|
+
* only layout — `Accordion`, `Columns`, `CodeGroup`, the `Color` palette —
|
|
471
|
+
* serialize the same way; a child that renders to nothing (an unlabeled
|
|
472
|
+
* `Icon`) leaves no gap.
|
|
446
473
|
*/
|
|
447
474
|
const cardGroup: ComponentMarkdown = ({ childBlocks }) =>
|
|
448
475
|
childBlocks()
|
|
449
476
|
.map((block) => block.markdown)
|
|
477
|
+
.filter(Boolean)
|
|
450
478
|
.join("\n\n");
|
|
451
479
|
|
|
452
480
|
const youtube: ComponentMarkdown = ({ props }) => {
|
|
@@ -512,21 +540,308 @@ export const exampleComponentSerializers = (examples: ExampleLookup) =>
|
|
|
512
540
|
},
|
|
513
541
|
}) satisfies Record<string, ComponentMarkdown>;
|
|
514
542
|
|
|
543
|
+
/** A bold label over a body — the shape {@link tabs} and {@link card} use. */
|
|
544
|
+
const labeled = (label: string, ...parts: string[]): string =>
|
|
545
|
+
[label === "" ? "" : `**${label}**`, ...parts]
|
|
546
|
+
.map((part) => part.trim())
|
|
547
|
+
.filter(Boolean)
|
|
548
|
+
.join("\n\n");
|
|
549
|
+
|
|
550
|
+
/**
|
|
551
|
+
* A disclosure — `AccordionItem`, and `Expandable` with its "Show more"
|
|
552
|
+
* default — is its title over its body, open: an agent reads what a reader
|
|
553
|
+
* would have to click for. A title that wouldn't evaluate declines.
|
|
554
|
+
*/
|
|
555
|
+
const disclosure = (
|
|
556
|
+
{ children, lossy, props }: ComponentMarkdownContext,
|
|
557
|
+
fallbackTitle: string
|
|
558
|
+
): string | null =>
|
|
559
|
+
lossy
|
|
560
|
+
? null
|
|
561
|
+
: labeled(
|
|
562
|
+
textProp(props.title) || fallbackTitle,
|
|
563
|
+
textProp(props.description),
|
|
564
|
+
children
|
|
565
|
+
);
|
|
566
|
+
|
|
567
|
+
const accordionItem: ComponentMarkdown = (context) => disclosure(context, "");
|
|
568
|
+
|
|
569
|
+
const expandable: ComponentMarkdown = (context) =>
|
|
570
|
+
disclosure(context, "Show more");
|
|
571
|
+
|
|
572
|
+
/** `Frame` is its slot, with the hint above and the caption below as text. */
|
|
573
|
+
const frame: ComponentMarkdown = ({ children, props }) =>
|
|
574
|
+
[textProp(props.hint), children, textProp(props.caption)]
|
|
575
|
+
.filter(Boolean)
|
|
576
|
+
.join("\n\n");
|
|
577
|
+
|
|
578
|
+
/** A layout wrapper whose body is the whole of its meaning. */
|
|
579
|
+
const body: ComponentMarkdown = ({ children }) => children;
|
|
580
|
+
|
|
581
|
+
/** `Panel` is a titled aside: its title over its body. */
|
|
582
|
+
const panel: ComponentMarkdown = ({ children, props }) =>
|
|
583
|
+
labeled(textProp(props.title), children);
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* `Tile` is a card with a preview, so it takes {@link card}'s shape: the
|
|
587
|
+
* title as the link, then the description and the slot.
|
|
588
|
+
*/
|
|
589
|
+
const tile: ComponentMarkdown = ({ children, lossy, props }) => {
|
|
590
|
+
if (lossy) {
|
|
591
|
+
return null;
|
|
592
|
+
}
|
|
593
|
+
const title = textProp(props.title);
|
|
594
|
+
const href = isString(props.href) ? props.href.trim() : "";
|
|
595
|
+
const label = title || href;
|
|
596
|
+
const head =
|
|
597
|
+
href === ""
|
|
598
|
+
? labeled(label)
|
|
599
|
+
: `**[${linkText(label)}](${linkDestination(href)})**`;
|
|
600
|
+
const text = [head, textProp(props.description), children]
|
|
601
|
+
.filter(Boolean)
|
|
602
|
+
.join("\n\n");
|
|
603
|
+
return text === "" ? null : text;
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* `Update` is one changelog entry: its label (or title) as the head, linked
|
|
608
|
+
* when it has its own page, then the description, tags, and notes.
|
|
609
|
+
*/
|
|
610
|
+
const update: ComponentMarkdown = ({ children, lossy, props }) => {
|
|
611
|
+
if (lossy) {
|
|
612
|
+
return null;
|
|
613
|
+
}
|
|
614
|
+
const label = textProp(props.label) || textProp(props.title) || "Update";
|
|
615
|
+
const href = isString(props.href) ? props.href.trim() : "";
|
|
616
|
+
const head =
|
|
617
|
+
href === ""
|
|
618
|
+
? `**${label}**`
|
|
619
|
+
: `**[${linkText(label)}](${linkDestination(href)})**`;
|
|
620
|
+
const tags = (Array.isArray(props.tags) ? props.tags : [props.tags])
|
|
621
|
+
.map(textProp)
|
|
622
|
+
.filter(Boolean);
|
|
623
|
+
return [
|
|
624
|
+
head,
|
|
625
|
+
textProp(props.description),
|
|
626
|
+
tags.length > 0 ? `Tags: ${tags.join(", ")}` : "",
|
|
627
|
+
children,
|
|
628
|
+
]
|
|
629
|
+
.filter(Boolean)
|
|
630
|
+
.join("\n\n");
|
|
631
|
+
};
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* `Prompt` is a prompt to copy: its description as the label, and the prompt
|
|
635
|
+
* itself quoted, the way a {@link callout} quotes its body.
|
|
636
|
+
*/
|
|
637
|
+
const prompt: ComponentMarkdown = ({ children, props }) => {
|
|
638
|
+
const quoted = children
|
|
639
|
+
.split("\n")
|
|
640
|
+
.map((line) => (line.trim() === "" ? ">" : `> ${line}`))
|
|
641
|
+
.join("\n");
|
|
642
|
+
return labeled(
|
|
643
|
+
textProp(props.description) || "Prompt",
|
|
644
|
+
children ? quoted : ""
|
|
645
|
+
);
|
|
646
|
+
};
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* `GithubInfo` is a card for one repository, so it becomes a link to it. The
|
|
650
|
+
* site-wide repo the component falls back to isn't in reach here, so a card
|
|
651
|
+
* without `owner` and `repo` declines.
|
|
652
|
+
*/
|
|
653
|
+
const githubInfo: ComponentMarkdown = ({ lossy, props }) => {
|
|
654
|
+
const owner = textProp(props.owner);
|
|
655
|
+
const repo = textProp(props.repo);
|
|
656
|
+
if (lossy || owner === "" || repo === "") {
|
|
657
|
+
return null;
|
|
658
|
+
}
|
|
659
|
+
const host = (textProp(props.host) || "https://github.com").replace(
|
|
660
|
+
/\/+$/u,
|
|
661
|
+
""
|
|
662
|
+
);
|
|
663
|
+
return `[${linkText(`${owner}/${repo}`)}](${linkDestination(`${host}/${owner}/${repo}`)})`;
|
|
664
|
+
};
|
|
665
|
+
|
|
666
|
+
/** `CodeBlock` is a fenced block, its title kept in the fence's meta. */
|
|
667
|
+
const codeBlock: ComponentMarkdown = ({ lossy, props }) => {
|
|
668
|
+
if (lossy || !isString(props.code)) {
|
|
669
|
+
return null;
|
|
670
|
+
}
|
|
671
|
+
const lang = textProp(props.lang) || "txt";
|
|
672
|
+
const title = textProp(props.title);
|
|
673
|
+
return fencedBlock(
|
|
674
|
+
title === "" ? lang : `${lang} title=${JSON.stringify(title)}`,
|
|
675
|
+
props.code
|
|
676
|
+
);
|
|
677
|
+
};
|
|
678
|
+
|
|
679
|
+
/**
|
|
680
|
+
* `Diff` from an inline patch is that patch, fenced as `diff`; from `old` and
|
|
681
|
+
* `new` strings, both sides fenced in turn. A diff read from files (`src`,
|
|
682
|
+
* `before`/`after`) needs the file system, so it declines.
|
|
683
|
+
*/
|
|
684
|
+
const diff: ComponentMarkdown = ({ lossy, props }) => {
|
|
685
|
+
if (lossy) {
|
|
686
|
+
return null;
|
|
687
|
+
}
|
|
688
|
+
if (isString(props.patch)) {
|
|
689
|
+
return fencedBlock("diff", props.patch);
|
|
690
|
+
}
|
|
691
|
+
if (isString(props.old) && isString(props.new)) {
|
|
692
|
+
const lang = textProp(props.lang);
|
|
693
|
+
return [
|
|
694
|
+
labeled("Before", fencedBlock(lang, props.old)),
|
|
695
|
+
labeled("After", fencedBlock(lang, props.new)),
|
|
696
|
+
].join("\n\n");
|
|
697
|
+
}
|
|
698
|
+
return null;
|
|
699
|
+
};
|
|
700
|
+
|
|
701
|
+
/** `Math` is its TeX source, as a display block or inline span. */
|
|
702
|
+
const math: ComponentMarkdown = ({ lossy, props }) => {
|
|
703
|
+
if (lossy || !isString(props.code)) {
|
|
704
|
+
return null;
|
|
705
|
+
}
|
|
706
|
+
return props.display === true ? `$$\n${props.code}\n$$` : `$${props.code}$`;
|
|
707
|
+
};
|
|
708
|
+
|
|
709
|
+
/** An `Icon` is decoration; one with an accessible label keeps the label. */
|
|
710
|
+
const icon: ComponentMarkdown = ({ props }) => textProp(props.label);
|
|
711
|
+
|
|
712
|
+
/** A `Badge` is its text. */
|
|
713
|
+
const badge: ComponentMarkdown = ({ children }) => children;
|
|
714
|
+
|
|
715
|
+
/**
|
|
716
|
+
* A `Tooltip` is its trigger text followed by the tip, which is otherwise
|
|
717
|
+
* only on hover: `term (tip)`, with the headline leading the tip.
|
|
718
|
+
*/
|
|
719
|
+
const tooltip: ComponentMarkdown = ({ children, lossy, props }) => {
|
|
720
|
+
const tip = [textProp(props.headline), textProp(props.tip)]
|
|
721
|
+
.filter(Boolean)
|
|
722
|
+
.join(": ");
|
|
723
|
+
if (lossy || tip === "") {
|
|
724
|
+
return null;
|
|
725
|
+
}
|
|
726
|
+
return children ? `${children} (${tip})` : tip;
|
|
727
|
+
};
|
|
728
|
+
|
|
729
|
+
/** Indent a list block's lines under its parent item. */
|
|
730
|
+
const nested = (block: string): string =>
|
|
731
|
+
block
|
|
732
|
+
.split("\n")
|
|
733
|
+
.map((line) => (line === "" ? line : ` ${line}`))
|
|
734
|
+
.join("\n");
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* `Tree` is the nested list it draws: each folder an item with a trailing
|
|
738
|
+
* slash and its entries indented under it, each file an item.
|
|
739
|
+
*/
|
|
740
|
+
const treeList: ComponentMarkdown = ({ childBlocks }) =>
|
|
741
|
+
childBlocks()
|
|
742
|
+
.map((block) => block.markdown)
|
|
743
|
+
.join("\n");
|
|
744
|
+
|
|
745
|
+
const treeFolder: ComponentMarkdown = ({ childBlocks, lossy, props }) => {
|
|
746
|
+
const name = textProp(props.name);
|
|
747
|
+
if (lossy || name === "") {
|
|
748
|
+
return null;
|
|
749
|
+
}
|
|
750
|
+
const entries = childBlocks()
|
|
751
|
+
.map((block) => nested(block.markdown))
|
|
752
|
+
.join("\n");
|
|
753
|
+
return entries === "" ? `- ${name}/` : `- ${name}/\n${entries}`;
|
|
754
|
+
};
|
|
755
|
+
|
|
756
|
+
const treeFile: ComponentMarkdown = ({ lossy, props }) => {
|
|
757
|
+
const name = textProp(props.name);
|
|
758
|
+
return lossy || name === "" ? null : `- ${name}`;
|
|
759
|
+
};
|
|
760
|
+
|
|
761
|
+
/**
|
|
762
|
+
* A `Color.Item` is its name and value — both values when the light and dark
|
|
763
|
+
* themes differ — and a `Color.Row` its title over its items.
|
|
764
|
+
*/
|
|
765
|
+
const colorItem: ComponentMarkdown = ({ lossy, props }) => {
|
|
766
|
+
const name = textProp(props.name);
|
|
767
|
+
const { value } = props;
|
|
768
|
+
if (lossy || name === "") {
|
|
769
|
+
return null;
|
|
770
|
+
}
|
|
771
|
+
if (isString(value)) {
|
|
772
|
+
return `- **${name}**: ${inlineCode(value)}`;
|
|
773
|
+
}
|
|
774
|
+
if (!isValueMap(value)) {
|
|
775
|
+
return null;
|
|
776
|
+
}
|
|
777
|
+
const light = textProp(value.light);
|
|
778
|
+
const dark = textProp(value.dark);
|
|
779
|
+
if (light === "" && dark === "") {
|
|
780
|
+
return null;
|
|
781
|
+
}
|
|
782
|
+
const shown =
|
|
783
|
+
light && dark && light !== dark
|
|
784
|
+
? `${inlineCode(light)} (light), ${inlineCode(dark)} (dark)`
|
|
785
|
+
: inlineCode(light || dark);
|
|
786
|
+
return `- **${name}**: ${shown}`;
|
|
787
|
+
};
|
|
788
|
+
|
|
789
|
+
const colorRow: ComponentMarkdown = ({ childBlocks, props }) =>
|
|
790
|
+
labeled(
|
|
791
|
+
textProp(props.title),
|
|
792
|
+
childBlocks()
|
|
793
|
+
.map((block) => block.markdown)
|
|
794
|
+
.join("\n")
|
|
795
|
+
);
|
|
796
|
+
|
|
515
797
|
/**
|
|
516
798
|
* The built-in serializer registry, keyed by JSX name. `Step` and `Tab` are
|
|
517
799
|
* intentionally absent: they only carry meaning inside their containers,
|
|
518
800
|
* which extract them via `childComponents`; a stray one stays verbatim.
|
|
801
|
+
* `AutoTypeTable` is absent too: its table comes from type-checking a source
|
|
802
|
+
* file, which a serializer can't do synchronously, so it stays as JSX.
|
|
519
803
|
*/
|
|
520
804
|
const SERIALIZERS = {
|
|
805
|
+
Accordion: cardGroup,
|
|
806
|
+
AccordionItem: accordionItem,
|
|
807
|
+
Badge: badge,
|
|
521
808
|
Callout: callout,
|
|
522
809
|
Card: card,
|
|
523
810
|
CardGroup: cardGroup,
|
|
811
|
+
CodeBlock: codeBlock,
|
|
812
|
+
CodeGroup: cardGroup,
|
|
813
|
+
Color: cardGroup,
|
|
814
|
+
"Color.Item": colorItem,
|
|
815
|
+
"Color.Row": colorRow,
|
|
816
|
+
Column: body,
|
|
817
|
+
Columns: cardGroup,
|
|
818
|
+
Diff: diff,
|
|
819
|
+
Expandable: expandable,
|
|
820
|
+
FileTree: body,
|
|
821
|
+
Frame: frame,
|
|
822
|
+
GithubInfo: githubInfo,
|
|
823
|
+
Icon: icon,
|
|
824
|
+
Math: math,
|
|
825
|
+
Panel: panel,
|
|
826
|
+
Prompt: prompt,
|
|
524
827
|
Steps: steps,
|
|
525
828
|
Tabs: tabs,
|
|
829
|
+
Tile: tile,
|
|
830
|
+
Tooltip: tooltip,
|
|
831
|
+
Tree: treeList,
|
|
832
|
+
"Tree.File": treeFile,
|
|
833
|
+
"Tree.Folder": treeFolder,
|
|
526
834
|
TypeTable: typeTable,
|
|
835
|
+
Update: update,
|
|
527
836
|
YouTube: youtube,
|
|
528
837
|
} satisfies Record<string, ComponentMarkdown>;
|
|
529
838
|
|
|
839
|
+
/**
|
|
840
|
+
* The built-ins that sit inside a line of prose, and so are downleveled as
|
|
841
|
+
* text elements too: each renders to a single line.
|
|
842
|
+
*/
|
|
843
|
+
const INLINE_COMPONENTS = new Set(["Badge", "Icon", "Math", "Tooltip"]);
|
|
844
|
+
|
|
530
845
|
const escapeRegExp = (value: string): string =>
|
|
531
846
|
value.replaceAll(/[$()*+.?[\\\]^{|}]/gu, String.raw`\$&`);
|
|
532
847
|
|
|
@@ -550,7 +865,7 @@ export interface DownlevelWalk {
|
|
|
550
865
|
}
|
|
551
866
|
type Walk = DownlevelWalk;
|
|
552
867
|
|
|
553
|
-
/** The serializer registry for a site: built-ins under a user's `
|
|
868
|
+
/** The serializer registry for a site: built-ins under a user's `agents.markdownComponents`. */
|
|
554
869
|
export const componentRegistry = (
|
|
555
870
|
components?: Record<string, ComponentMarkdown>
|
|
556
871
|
): Record<string, ComponentMarkdown> =>
|
|
@@ -581,7 +896,7 @@ const renderSlice = (
|
|
|
581
896
|
start: splice.start - start,
|
|
582
897
|
}))
|
|
583
898
|
);
|
|
584
|
-
return dedent(spliced).trim();
|
|
899
|
+
return dedent(spliced, indentAt(walk.source, start)).trim();
|
|
585
900
|
};
|
|
586
901
|
|
|
587
902
|
/** The element's body as Markdown: the slice covering all of its children. */
|
|
@@ -662,10 +977,11 @@ export const downlevelComponentNode = (
|
|
|
662
977
|
node: MdastNode,
|
|
663
978
|
walk: DownlevelWalk
|
|
664
979
|
): string | null => {
|
|
665
|
-
const
|
|
666
|
-
node.type === "mdxJsxFlowElement"
|
|
667
|
-
|
|
668
|
-
|
|
980
|
+
const block =
|
|
981
|
+
node.type === "mdxJsxFlowElement" ||
|
|
982
|
+
(node.type === "mdxJsxTextElement" &&
|
|
983
|
+
INLINE_COMPONENTS.has(node.name ?? ""));
|
|
984
|
+
const serializer = block && node.name ? walk.registry[node.name] : undefined;
|
|
669
985
|
return serializer && hasOffsets(node)
|
|
670
986
|
? serializeElement(serializer, walk, node)
|
|
671
987
|
: null;
|
|
@@ -695,7 +1011,7 @@ const collectSplices = (
|
|
|
695
1011
|
* with no supported components — and sources Satteri can't parse as MDX, e.g.
|
|
696
1012
|
* plain `.md` with literal `<`/`{` — are returned byte-identical.
|
|
697
1013
|
*
|
|
698
|
-
* `components` adds user serializers from `
|
|
1014
|
+
* `components` adds user serializers from `agents.markdownComponents`, layered
|
|
699
1015
|
* over the built-ins: a same-name entry replaces the built-in serializer, and
|
|
700
1016
|
* one that always returns `null` effectively opts that component out.
|
|
701
1017
|
*
|
package/src/ai/cors.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CORS for the generated
|
|
2
|
+
* CORS for the assistant's generated route (`ai.assistant.cors`).
|
|
3
3
|
*
|
|
4
4
|
* A browser only lets a page on another origin read a response that names
|
|
5
5
|
* that origin, and a JSON `POST` preflights first. `preflightResponse` answers
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
* rather than stamping each `return`, keeps the next return site added to the
|
|
9
9
|
* handler from shipping an opaque failure for that one status.
|
|
10
10
|
*
|
|
11
|
-
* `allowed` is the `ai.
|
|
11
|
+
* `allowed` is the `ai.assistant.cors` list: origins already reduced to their
|
|
12
12
|
* `scheme://host[:port]` form by the config schema, or the single entry `"*"`
|
|
13
13
|
* to admit every origin.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
/** The `ai.
|
|
16
|
+
/** The `ai.assistant.cors` entry that admits every origin. */
|
|
17
17
|
export const ANY_ORIGIN = "*";
|
|
18
18
|
|
|
19
19
|
/** The headers a response carries for a cross-origin caller. */
|
package/src/ai/index.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assistant provider adapters for `blume.config.ts`:
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* import { defineConfig } from "blume";
|
|
6
|
+
* import { openrouter } from "blume/ai";
|
|
7
|
+
*
|
|
8
|
+
* export default defineConfig({
|
|
9
|
+
* ai: {
|
|
10
|
+
* assistant: {
|
|
11
|
+
* enabled: true,
|
|
12
|
+
* provider: openrouter({ model: "anthropic/claude-sonnet-4-5" }),
|
|
13
|
+
* },
|
|
14
|
+
* },
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Each factory returns a plain descriptor (see `core/adapter.ts`) that the
|
|
19
|
+
* schema validates and the generated `/api/ask` route inlines as literals;
|
|
20
|
+
* nothing here runs at request time.
|
|
21
|
+
*/
|
|
22
|
+
export {
|
|
23
|
+
gateway,
|
|
24
|
+
inkeep,
|
|
25
|
+
llmgateway,
|
|
26
|
+
openaiCompatible,
|
|
27
|
+
openrouter,
|
|
28
|
+
} from "./ask.ts";
|
|
29
|
+
export type {
|
|
30
|
+
AssistantAdapter,
|
|
31
|
+
AssistantAdapterOptions,
|
|
32
|
+
AssistantGatewayAdapter,
|
|
33
|
+
AssistantGatewayOptions,
|
|
34
|
+
AssistantInkeepAdapter,
|
|
35
|
+
AssistantInkeepOptions,
|
|
36
|
+
AssistantLlmGatewayAdapter,
|
|
37
|
+
AssistantLlmGatewayOptions,
|
|
38
|
+
AssistantOpenAICompatibleAdapter,
|
|
39
|
+
AssistantOpenAICompatibleOptions,
|
|
40
|
+
AssistantOpenRouterAdapter,
|
|
41
|
+
AssistantOpenRouterOptions,
|
|
42
|
+
AssistantProviderOptions,
|
|
43
|
+
AssistantReasoning,
|
|
44
|
+
} from "./ask.ts";
|
|
45
|
+
export type { AdapterDescriptor } from "../core/adapter.ts";
|
package/src/ai/link-headers.ts
CHANGED
|
@@ -24,8 +24,9 @@ import { OPENAPI_PATH } from "./api/paths.ts";
|
|
|
24
24
|
* could. An agent that enters on a deep page (a search result, a shared link)
|
|
25
25
|
* never sees this header at all — that path is covered in the HTML instead:
|
|
26
26
|
* every page's `<head>` carries the same `describedby` links plus its own
|
|
27
|
-
* Markdown mirror as an `alternate` (
|
|
28
|
-
* reaches hosts where Blume can't set response
|
|
27
|
+
* Markdown mirror as an `alternate` (the `DiscoveryLinks.astro` partial every
|
|
28
|
+
* layout renders), which also reaches hosts where Blume can't set response
|
|
29
|
+
* headers. Targets are
|
|
29
30
|
* root-relative under `deployment.base` — RFC 8288 resolves them against the
|
|
30
31
|
* request URL. Returns null when nothing is advertisable.
|
|
31
32
|
*/
|
|
@@ -33,7 +34,7 @@ export const buildHomeLinkHeader = (
|
|
|
33
34
|
config: ResolvedConfig,
|
|
34
35
|
routePaths: readonly string[]
|
|
35
36
|
): string | null => {
|
|
36
|
-
const deployBase = normalizeBasePath(config.deployment.base);
|
|
37
|
+
const deployBase = normalizeBasePath(config.deployment.options.base);
|
|
37
38
|
const links: string[] = [];
|
|
38
39
|
// RFC 9727 §3: the api-catalog relation is how a homepage advertises the
|
|
39
40
|
// well-known catalog.
|
|
@@ -51,17 +52,17 @@ export const buildHomeLinkHeader = (
|
|
|
51
52
|
}
|
|
52
53
|
// RFC 8631: `service-desc` is the relation for a machine-readable
|
|
53
54
|
// description of the service — the JSON docs API's OpenAPI document.
|
|
54
|
-
if (config.
|
|
55
|
+
if (config.agents.api) {
|
|
55
56
|
links.push(
|
|
56
57
|
`<${deployBase}${OPENAPI_PATH}>; rel="service-desc"; type="application/json"`
|
|
57
58
|
);
|
|
58
59
|
}
|
|
59
|
-
if (config.
|
|
60
|
+
if (config.agents.agentReadability) {
|
|
60
61
|
links.push(
|
|
61
62
|
`<${deployBase}/agent-readability.json>; rel="describedby"; type="application/json"`
|
|
62
63
|
);
|
|
63
64
|
}
|
|
64
|
-
if (config.
|
|
65
|
+
if (config.agents.llmsTxt.enabled) {
|
|
65
66
|
links.push(
|
|
66
67
|
`<${deployBase}/llms.txt>; rel="describedby"; type="text/plain"`
|
|
67
68
|
);
|