blume 2.0.3 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -0
- package/CHANGELOG.md +48 -0
- package/README.md +1 -1
- package/dist/cli/{chunk-1d7ve1dm.js → chunk-0gz36akr.js} +18 -2
- package/dist/cli/{chunk-1d7ve1dm.js.map → chunk-0gz36akr.js.map} +3 -3
- package/dist/cli/{chunk-2eytanqx.js → chunk-1n228xqb.js} +2 -2
- package/dist/cli/{chunk-yfyb25rh.js → chunk-2f3ndkpw.js} +24 -8
- package/dist/cli/chunk-2f3ndkpw.js.map +14 -0
- package/dist/cli/{chunk-r20tn01b.js → chunk-2f7n4qzt.js} +8 -2
- package/dist/cli/{chunk-r20tn01b.js.map → chunk-2f7n4qzt.js.map} +3 -3
- package/dist/cli/{chunk-35d4wj9f.js → chunk-2n4ps1b3.js} +7 -7
- package/dist/cli/{chunk-j85vccga.js → chunk-43zcf4gz.js} +97 -57
- package/dist/cli/{chunk-j85vccga.js.map → chunk-43zcf4gz.js.map} +6 -6
- package/dist/cli/{chunk-e04dxsz1.js → chunk-4ejxbzee.js} +1 -1
- package/dist/cli/{chunk-5m5nmvyq.js → chunk-4h8z9vv5.js} +233 -39
- package/dist/cli/chunk-4h8z9vv5.js.map +16 -0
- package/dist/cli/{chunk-5f86nr5m.js → chunk-5cg2rzgf.js} +18 -16
- package/dist/cli/{chunk-5f86nr5m.js.map → chunk-5cg2rzgf.js.map} +2 -2
- package/dist/cli/{chunk-tzmab476.js → chunk-5ffywsmb.js} +4 -4
- package/dist/cli/{chunk-2z928egk.js → chunk-5wj2qwn2.js} +5 -5
- package/dist/cli/chunk-6bm0xpgd.js +18 -0
- package/dist/cli/chunk-6bm0xpgd.js.map +10 -0
- package/dist/cli/{chunk-vg9r4eb9.js → chunk-713mngdq.js} +12 -5
- package/dist/cli/{chunk-vg9r4eb9.js.map → chunk-713mngdq.js.map} +3 -3
- package/dist/cli/{chunk-5xvm6tfj.js → chunk-9geymqns.js} +17 -15
- package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-9geymqns.js.map} +2 -2
- package/dist/cli/{chunk-q58y5e6a.js → chunk-9xr4dgee.js} +26 -17
- package/dist/cli/chunk-9xr4dgee.js.map +10 -0
- package/dist/cli/{chunk-b07cmahc.js → chunk-amrb6hgh.js} +2 -2
- package/dist/cli/chunk-cm89scdv.js +443 -0
- package/dist/cli/chunk-cm89scdv.js.map +11 -0
- package/dist/cli/{chunk-akbpwfxc.js → chunk-cmtcnh9f.js} +2 -2
- package/dist/cli/chunk-cy5bm0j0.js +104 -0
- package/dist/cli/chunk-cy5bm0j0.js.map +11 -0
- package/dist/cli/{chunk-crgn1q09.js → chunk-e7vvk5ya.js} +4 -4
- package/dist/cli/{chunk-pehfxfta.js → chunk-g2z9x01v.js} +6 -98
- package/dist/cli/chunk-g2z9x01v.js.map +10 -0
- package/dist/cli/{chunk-tkacnehg.js → chunk-gp84za0h.js} +2 -2
- package/dist/cli/{chunk-wrr3j9w9.js → chunk-h2a48yhd.js} +186 -63
- package/dist/cli/chunk-h2a48yhd.js.map +36 -0
- package/dist/cli/{chunk-hm3vjy5s.js → chunk-jnwj5kjj.js} +14 -9
- package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-jnwj5kjj.js.map} +4 -4
- package/dist/cli/chunk-kwrg63tm.js +31 -0
- package/dist/cli/chunk-kwrg63tm.js.map +10 -0
- package/dist/cli/{chunk-2hsdwb9n.js → chunk-nd1821sk.js} +18 -16
- package/dist/cli/{chunk-2hsdwb9n.js.map → chunk-nd1821sk.js.map} +2 -2
- package/dist/cli/{chunk-6dsbexzp.js → chunk-ntv4qrt7.js} +17 -15
- package/dist/cli/{chunk-6dsbexzp.js.map → chunk-ntv4qrt7.js.map} +2 -2
- package/dist/cli/{chunk-r9rcc4w7.js → chunk-p804f3pe.js} +7 -7
- package/dist/cli/{chunk-ey84smr6.js → chunk-py62fewh.js} +6 -6
- package/dist/cli/{chunk-ey84smr6.js.map → chunk-py62fewh.js.map} +1 -1
- package/dist/cli/chunk-q3wxxq39.js +126 -0
- package/dist/cli/chunk-q3wxxq39.js.map +11 -0
- package/dist/cli/{chunk-9t7a85s3.js → chunk-rekqz4qg.js} +23 -13
- package/dist/cli/chunk-rekqz4qg.js.map +10 -0
- package/dist/cli/{chunk-8ktnccpt.js → chunk-ta27feev.js} +1 -1
- package/dist/cli/{chunk-pv29h0wf.js → chunk-xkz5xbtv.js} +3476 -822
- package/dist/cli/chunk-xkz5xbtv.js.map +213 -0
- package/dist/cli/{chunk-a58773jm.js → chunk-y4ykbark.js} +2 -2
- package/dist/cli/{chunk-p3v96n38.js → chunk-y5h4r2y0.js} +4 -4
- package/dist/cli/{chunk-acanzt5p.js → chunk-yj17vs39.js} +6 -6
- package/dist/cli/{chunk-p73c0m7w.js → chunk-yxmk4pec.js} +16 -14
- package/dist/cli/{chunk-p73c0m7w.js.map → chunk-yxmk4pec.js.map} +2 -2
- package/dist/cli/{chunk-3em5wd2y.js → chunk-zccbjcj0.js} +4 -3
- package/dist/cli/{chunk-3em5wd2y.js.map → chunk-zccbjcj0.js.map} +2 -2
- package/dist/cli/{chunk-c8chx29p.js → chunk-zf748avv.js} +384 -207
- package/dist/cli/chunk-zf748avv.js.map +37 -0
- package/dist/cli/{chunk-g4hq16wv.js → chunk-zhvd6adm.js} +16 -14
- package/dist/cli/{chunk-g4hq16wv.js.map → chunk-zhvd6adm.js.map} +2 -2
- package/dist/cli/index.js +26 -20
- package/dist/cli/index.js.map +5 -5
- package/dist/types/ai/agent-surface.d.ts +8 -7
- package/dist/types/ai/ai-catalog.d.ts +7 -0
- package/dist/types/ai/ask-context.d.ts +22 -0
- package/dist/types/ai/ask.d.ts +271 -58
- package/dist/types/ai/index.d.ts +2 -2
- package/dist/types/ai/site-skill.d.ts +26 -0
- package/dist/types/ai/skills.d.ts +16 -0
- package/dist/types/astro/integration.d.ts +8 -0
- package/dist/types/captcha/hcaptcha.d.ts +27 -0
- package/dist/types/captcha/index.d.ts +28 -0
- package/dist/types/captcha/schema.d.ts +29 -0
- package/dist/types/captcha/turnstile.d.ts +28 -0
- package/dist/types/components/content/api-field.d.ts +59 -0
- package/dist/types/components/content/api-page.d.ts +95 -0
- package/dist/types/components/layout/nav-utils.d.ts +26 -0
- package/dist/types/components/openapi/helpers.d.ts +137 -0
- package/dist/types/components/openapi/security.d.ts +85 -0
- package/dist/types/consent/ethyca.d.ts +48 -0
- package/dist/types/consent/index.d.ts +37 -0
- package/dist/types/consent/native.d.ts +28 -0
- package/dist/types/consent/osano.d.ts +42 -0
- package/dist/types/consent/schema.d.ts +110 -0
- package/dist/types/core/config-input.d.ts +187 -20
- package/dist/types/core/data.d.ts +49 -4
- package/dist/types/core/footer.d.ts +8 -0
- package/dist/types/core/i18n-ui.d.ts +86 -0
- package/dist/types/core/includes.d.ts +8 -2
- package/dist/types/core/localizable.d.ts +7 -0
- package/dist/types/core/page-modes.d.ts +29 -0
- package/dist/types/core/redirect-patterns.d.ts +144 -0
- package/dist/types/core/related.d.ts +40 -0
- package/dist/types/core/schema.d.ts +551 -56
- package/dist/types/core/sources/read.d.ts +5 -0
- package/dist/types/core/types.d.ts +1 -1
- package/dist/types/core/variables.d.ts +42 -0
- package/dist/types/deploy/node-headers.d.ts +13 -2
- package/dist/types/deploy/platforms/cloudflare.d.ts +5 -0
- package/dist/types/deploy/platforms/netlify.d.ts +7 -0
- package/dist/types/deploy/platforms/vercel.d.ts +6 -0
- package/dist/types/deploy/redirects.d.ts +39 -11
- package/dist/types/deploy/vercel-negotiation.d.ts +9 -0
- package/dist/types/markdown/code-title.d.ts +17 -0
- package/dist/types/markdown/features.d.ts +3 -2
- package/dist/types/narration/build.d.ts +70 -0
- package/dist/types/narration/provider.d.ts +26 -0
- package/dist/types/narration/script.d.ts +154 -0
- package/dist/types/openapi/model.d.ts +12 -6
- package/dist/types/openapi/overlay.d.ts +54 -0
- package/dist/types/openapi/parse.d.ts +13 -0
- package/dist/types/openapi/references.d.ts +14 -4
- package/dist/types/ratelimit/cloudflare.d.ts +39 -0
- package/dist/types/ratelimit/index.d.ts +27 -0
- package/dist/types/ratelimit/memory.d.ts +36 -0
- package/dist/types/ratelimit/schema.d.ts +111 -0
- package/dist/types/ratelimit/upstash.d.ts +21 -0
- package/dist/types/ratelimit/wrangler.d.ts +23 -0
- package/dist/types/reference/asyncapi.d.ts +10 -10
- package/dist/types/reference/graphql.d.ts +13 -10
- package/dist/types/reference/openapi.d.ts +33 -12
- package/dist/types/reference/options.d.ts +45 -5
- package/dist/types/reference/scalar.d.ts +13 -0
- package/dist/types/reference/schema.d.ts +60 -36
- package/dist/types/search/documents.d.ts +12 -1
- package/dist/types/search/orama-index.d.ts +4 -0
- package/dist/types/seo/metatags.d.ts +20 -0
- package/docs/02-deployment.mdx +41 -5
- package/docs/03-upgrading.mdx +4 -4
- package/docs/04-migrating.mdx +1 -1
- package/docs/advanced/changelog.mdx +2 -2
- package/docs/advanced/skills.mdx +14 -0
- package/docs/cli/audit.mdx +21 -1
- package/docs/cli/index.mdx +1 -0
- package/docs/configuration/analytics.mdx +3 -1
- package/docs/configuration/assistant.mdx +188 -36
- package/docs/configuration/consent.mdx +100 -0
- package/docs/configuration/customization.mdx +4 -4
- package/docs/configuration/index.mdx +63 -5
- package/docs/configuration/meta.ts +3 -0
- package/docs/configuration/narration.mdx +119 -0
- package/docs/configuration/rate-limiting.mdx +69 -0
- package/docs/configuration/search.mdx +29 -1
- package/docs/configuration/theming.mdx +3 -1
- package/docs/content/components.mdx +106 -0
- package/docs/content/frontmatter.mdx +76 -0
- package/docs/content/i18n.mdx +38 -3
- package/docs/content/includes.mdx +16 -0
- package/docs/content/meta.mdx +1 -0
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +28 -6
- package/docs/content/sources/contentful.mdx +32 -0
- package/docs/content/sources/custom.mdx +39 -0
- package/docs/content/sources/github-releases.mdx +31 -0
- package/docs/content/sources/index.mdx +91 -0
- package/docs/content/sources/meta.ts +16 -0
- package/docs/content/sources/notion.mdx +32 -0
- package/docs/content/sources/obsidian.mdx +37 -0
- package/docs/content/sources/payload.mdx +30 -0
- package/docs/content/sources/remote-mdx.mdx +40 -0
- package/docs/content/sources/sanity.mdx +29 -0
- package/docs/content/sources/strapi.mdx +31 -0
- package/docs/content/syntax.mdx +67 -2
- package/docs/content/variables.mdx +41 -0
- package/docs/discoverability/agent-discovery.mdx +29 -2
- package/docs/discoverability/index.mdx +1 -1
- package/docs/discoverability/llms-txt.mdx +1 -1
- package/docs/discoverability/metadata.mdx +17 -0
- package/docs/references/api-pages.mdx +74 -0
- package/docs/references/asyncapi.mdx +1 -1
- package/docs/references/graphql.mdx +2 -2
- package/docs/references/meta.ts +1 -1
- package/docs/references/openapi.mdx +102 -3
- package/docs/references/scalar.mdx +3 -1
- package/package.json +36 -1
- package/skills/blume/SKILL.md +3 -0
- package/skills/blume-migrate/SKILL.md +5 -5
- package/skills/blume-migrate/references/docusaurus.md +3 -3
- package/skills/blume-migrate/references/mintlify.md +37 -19
- package/skills/blume-migrate/references/nextra.md +2 -2
- package/skills/blume-migrate/references/starlight.md +2 -1
- package/skills/blume-migrate/scripts/mintlify-codemod.mjs +60 -14
- package/skills/blume-write-skill/SKILL.md +82 -0
- package/src/ai/agent-readability.ts +2 -1
- package/src/ai/agent-surface.ts +9 -7
- package/src/ai/ai-catalog.ts +6 -3
- package/src/ai/ask-context.ts +73 -20
- package/src/ai/ask-data.ts +6 -0
- package/src/ai/ask-tools.ts +142 -0
- package/src/ai/ask.ts +354 -76
- package/src/ai/component-markdown.ts +75 -0
- package/src/ai/cors.ts +2 -0
- package/src/ai/index.ts +12 -0
- package/src/ai/llms.ts +6 -2
- package/src/ai/markdown.ts +2 -1
- package/src/ai/mcp/data.ts +6 -0
- package/src/ai/openapi-components.ts +9 -3
- package/src/ai/site-skill.ts +274 -0
- package/src/ai/skills.ts +35 -2
- package/src/ai/write-skill.ts +97 -0
- package/src/astro/generate.ts +132 -18
- package/src/astro/index.ts +1 -0
- package/src/astro/integration.ts +35 -0
- package/src/astro/module-types.ts +6 -0
- package/src/astro/templates.ts +283 -30
- package/src/astro/variables.ts +31 -0
- package/src/audit/catalog.ts +19 -0
- package/src/audit/checks/contrast.ts +183 -0
- package/src/audit/checks/i18n.ts +2 -3
- package/src/audit/checks/indexability.ts +2 -3
- package/src/audit/checks/links.ts +5 -12
- package/src/audit/checks/sitemap.ts +2 -3
- package/src/audit/redirects.ts +46 -15
- package/src/audit/run.ts +2 -0
- package/src/audit/types.ts +2 -1
- package/src/blume-modules.d.ts +7 -0
- package/src/captcha/client.ts +152 -0
- package/src/captcha/hcaptcha.ts +36 -0
- package/src/captcha/index.ts +28 -0
- package/src/captcha/schema.ts +32 -0
- package/src/captcha/turnstile.ts +38 -0
- package/src/captcha/verify.ts +71 -0
- package/src/cli/command-meta.ts +5 -0
- package/src/cli/commands/doctor.ts +22 -16
- package/src/cli/commands/skill.ts +96 -0
- package/src/cli/index.ts +5 -0
- package/src/cli/required-secrets.ts +71 -29
- package/src/components/BlumePage.astro +2 -0
- package/src/components/content/ApiEndpoint.astro +18 -0
- package/src/components/content/ApiField.astro +79 -0
- package/src/components/content/ApiPlayground.astro +62 -0
- package/src/components/content/ApiRail.astro +19 -0
- package/src/components/content/Color.astro +1 -0
- package/src/components/content/FileTree.astro +1 -0
- package/src/components/content/GithubInfo.astro +1 -0
- package/src/components/content/Panel.astro +1 -0
- package/src/components/content/ParamField.astro +25 -0
- package/src/components/content/RequestExample.astro +17 -0
- package/src/components/content/ResponseExample.astro +17 -0
- package/src/components/content/ResponseField.astro +32 -0
- package/src/components/content/Step.astro +1 -0
- package/src/components/content/Tile.astro +1 -0
- package/src/components/content/Tooltip.astro +1 -0
- package/src/components/content/Tree.astro +1 -0
- package/src/components/content/TypeTable.astro +4 -1
- package/src/components/content/View.astro +21 -0
- package/src/components/content/ViewSwitcher.astro +168 -0
- package/src/components/content/api-field.ts +100 -0
- package/src/components/content/api-page.ts +224 -0
- package/src/components/content/view-switcher.ts +71 -0
- package/src/components/index.ts +2 -0
- package/src/components/islands/Assistant.astro +10 -1
- package/src/components/islands/assistant.tsx +104 -14
- package/src/components/islands/code-question.ts +62 -0
- package/src/components/islands/hooks.ts +110 -21
- package/src/components/islands/support-link.ts +68 -0
- package/src/components/layout/Analytics.astro +11 -2
- package/src/components/layout/Banner.astro +14 -10
- package/src/components/layout/Breadcrumbs.astro +6 -2
- package/src/components/layout/ConsentBanner.astro +62 -0
- package/src/components/layout/ConsentHead.astro +38 -0
- package/src/components/layout/Directory.astro +94 -0
- package/src/components/layout/DrawerSwitchers.astro +51 -0
- package/src/components/layout/Empty.astro +2 -2
- package/src/components/layout/Header.astro +122 -80
- package/src/components/layout/LanguageSwitcher.astro +48 -15
- package/src/components/layout/NarrationPlayer.astro +1085 -0
- package/src/components/layout/NavSelector.astro +33 -7
- package/src/components/layout/PageFeedback.astro +54 -49
- package/src/components/layout/PageLayout.astro +71 -3
- package/src/components/layout/ReferenceLayout.astro +17 -6
- package/src/components/layout/RelatedPages.astro +42 -0
- package/src/components/layout/RootLayout.astro +308 -45
- package/src/components/layout/Search.astro +31 -17
- package/src/components/layout/SiteFooter.astro +124 -0
- package/src/components/layout/SiteMetatags.astro +16 -0
- package/src/components/layout/consent/native.ts +79 -0
- package/src/components/layout/consent/types.ts +37 -0
- package/src/components/layout/footer-links.ts +53 -0
- package/src/components/layout/footer-socials.ts +87 -0
- package/src/components/layout/locale-redirect.ts +107 -0
- package/src/components/layout/nav-utils.ts +83 -0
- package/src/components/layout/page-feedback.ts +96 -0
- package/src/components/layout/search/analytics.ts +98 -0
- package/src/components/layout/search/flexsearch.ts +17 -5
- package/src/components/layout/search/orama-cloud.ts +26 -14
- package/src/components/layout/search/types.ts +20 -0
- package/src/components/layout/search/typesense.ts +5 -1
- package/src/components/openapi/Operation.astro +161 -13
- package/src/components/openapi/RequestBody.astro +6 -4
- package/src/components/openapi/RequestPanel.astro +59 -7
- package/src/components/openapi/Responses.astro +6 -4
- package/src/components/openapi/async-snippets.ts +4 -4
- package/src/components/openapi/code-samples.ts +97 -0
- package/src/components/openapi/security.ts +6 -3
- package/src/components/openapi/snippets.ts +869 -8
- package/src/components/props.ts +6 -0
- package/src/consent/client.ts +95 -0
- package/src/consent/clients.ts +19 -0
- package/src/consent/ethyca.ts +71 -0
- package/src/consent/head.ts +24 -0
- package/src/consent/index.ts +37 -0
- package/src/consent/init.ts +29 -0
- package/src/consent/native.ts +36 -0
- package/src/consent/osano.ts +59 -0
- package/src/consent/schema.ts +30 -0
- package/src/core/builtin-tags.ts +5 -0
- package/src/core/client-address.ts +19 -0
- package/src/core/config-input.ts +194 -20
- package/src/core/data.ts +44 -4
- package/src/core/diagnostics.ts +3 -2
- package/src/core/footer.ts +26 -0
- package/src/core/graph.ts +39 -36
- package/src/core/i18n-ui.ts +82 -2
- package/src/core/includes.ts +20 -3
- package/src/core/links.ts +16 -2
- package/src/core/localizable.ts +26 -0
- package/src/core/navigation.ts +43 -12
- package/src/core/page-modes.ts +56 -0
- package/src/core/project-graph.ts +111 -5
- package/src/core/redirect-patterns.ts +491 -0
- package/src/core/related.ts +131 -0
- package/src/core/schema.ts +318 -64
- package/src/core/sources/normalize.ts +2 -1
- package/src/core/sources/read.ts +8 -3
- package/src/core/types.ts +1 -1
- package/src/core/ui-packs/ar.ts +43 -0
- package/src/core/ui-packs/bg.ts +45 -0
- package/src/core/ui-packs/bn.ts +43 -0
- package/src/core/ui-packs/ca.ts +46 -0
- package/src/core/ui-packs/cs.ts +44 -0
- package/src/core/ui-packs/da.ts +45 -0
- package/src/core/ui-packs/de.ts +46 -0
- package/src/core/ui-packs/el.ts +45 -0
- package/src/core/ui-packs/es.ts +46 -0
- package/src/core/ui-packs/fa.ts +45 -0
- package/src/core/ui-packs/fi.ts +45 -0
- package/src/core/ui-packs/fr.ts +46 -0
- package/src/core/ui-packs/he.ts +43 -0
- package/src/core/ui-packs/hi.ts +44 -0
- package/src/core/ui-packs/hr.ts +45 -0
- package/src/core/ui-packs/hu.ts +44 -0
- package/src/core/ui-packs/id.ts +45 -0
- package/src/core/ui-packs/it.ts +45 -0
- package/src/core/ui-packs/ja.ts +45 -0
- package/src/core/ui-packs/ko.ts +44 -0
- package/src/core/ui-packs/nl.ts +46 -0
- package/src/core/ui-packs/no.ts +44 -0
- package/src/core/ui-packs/pl.ts +45 -0
- package/src/core/ui-packs/pt-br.ts +46 -0
- package/src/core/ui-packs/pt.ts +45 -0
- package/src/core/ui-packs/ro.ts +45 -0
- package/src/core/ui-packs/ru.ts +45 -0
- package/src/core/ui-packs/sk.ts +44 -0
- package/src/core/ui-packs/sr.ts +45 -0
- package/src/core/ui-packs/sv.ts +44 -0
- package/src/core/ui-packs/th.ts +43 -0
- package/src/core/ui-packs/tr.ts +45 -0
- package/src/core/ui-packs/uk.ts +45 -0
- package/src/core/ui-packs/vi.ts +45 -0
- package/src/core/ui-packs/zh-tw.ts +43 -0
- package/src/core/ui-packs/zh.ts +43 -0
- package/src/core/variables.ts +103 -0
- package/src/deploy/artifacts.ts +77 -8
- package/src/deploy/cloudflare-negotiation.ts +35 -5
- package/src/deploy/headers.ts +2 -1
- package/src/deploy/node-headers.ts +63 -9
- package/src/deploy/platforms/cloudflare.ts +32 -0
- package/src/deploy/platforms/netlify.ts +33 -1
- package/src/deploy/platforms/vercel.ts +37 -2
- package/src/deploy/redirects.ts +91 -24
- package/src/deploy/vercel-negotiation.ts +36 -0
- package/src/markdown/api-rail.ts +259 -0
- package/src/markdown/code-title.ts +35 -9
- package/src/markdown/features.ts +3 -2
- package/src/markdown/fence-meta.ts +2 -0
- package/src/markdown/include.ts +11 -1
- package/src/markdown/index.ts +28 -5
- package/src/markdown/math.ts +4 -4
- package/src/markdown/variables.ts +56 -0
- package/src/markdown/views.ts +82 -0
- package/src/narration/build.ts +412 -0
- package/src/narration/player.ts +249 -0
- package/src/narration/provider.ts +29 -0
- package/src/narration/script.ts +592 -0
- package/src/og/card.ts +7 -6
- package/src/openapi/model.ts +57 -24
- package/src/openapi/overlay.ts +256 -0
- package/src/openapi/parse.ts +55 -2
- package/src/openapi/references.ts +21 -5
- package/src/openapi/render-mdx.ts +5 -1
- package/src/openapi/scalar.ts +40 -6
- package/src/openapi/source.ts +1 -1
- package/src/ratelimit/cloudflare.ts +54 -0
- package/src/ratelimit/index.ts +30 -0
- package/src/ratelimit/memory.ts +45 -0
- package/src/ratelimit/runtime.ts +229 -0
- package/src/ratelimit/schema.ts +28 -0
- package/src/ratelimit/upstash.ts +30 -0
- package/src/ratelimit/wrangler.ts +70 -0
- package/src/reference/asyncapi.ts +2 -2
- package/src/reference/graphql.ts +5 -2
- package/src/reference/openapi.ts +21 -7
- package/src/reference/options.ts +51 -7
- package/src/reference/scalar.ts +33 -8
- package/src/registry/eject.ts +20 -4
- package/src/registry/registry.ts +7 -0
- package/src/search/documents.ts +26 -2
- package/src/search/orama-index.ts +28 -3
- package/src/search/pagefind-ranking.ts +39 -0
- package/src/search/sync/algolia.ts +15 -4
- package/src/search/sync/orama-cloud.ts +3 -0
- package/src/search/sync/typesense.ts +5 -0
- package/src/seo/metatags.ts +67 -0
- package/src/theme/chrome-icons.ts +1 -0
- package/src/theme/color.ts +500 -0
- package/src/theme/entry.ts +56 -3
- package/src/theme/palette.ts +121 -45
- package/src/translate/prompts.ts +1 -0
- package/src/translate/validate.ts +8 -2
- package/src/upgrade/upgrade.ts +4 -171
- package/dist/cli/chunk-364znk6q.js +0 -75
- package/dist/cli/chunk-364znk6q.js.map +0 -11
- package/dist/cli/chunk-5m5nmvyq.js.map +0 -13
- package/dist/cli/chunk-9t7a85s3.js.map +0 -10
- package/dist/cli/chunk-c8chx29p.js.map +0 -36
- package/dist/cli/chunk-pehfxfta.js.map +0 -10
- package/dist/cli/chunk-pv29h0wf.js.map +0 -190
- package/dist/cli/chunk-q58y5e6a.js.map +0 -10
- package/dist/cli/chunk-wrr3j9w9.js.map +0 -35
- package/dist/cli/chunk-yfyb25rh.js.map +0 -14
- package/docs/content/sources.mdx +0 -334
- /package/dist/cli/{chunk-2eytanqx.js.map → chunk-1n228xqb.js.map} +0 -0
- /package/dist/cli/{chunk-35d4wj9f.js.map → chunk-2n4ps1b3.js.map} +0 -0
- /package/dist/cli/{chunk-e04dxsz1.js.map → chunk-4ejxbzee.js.map} +0 -0
- /package/dist/cli/{chunk-tzmab476.js.map → chunk-5ffywsmb.js.map} +0 -0
- /package/dist/cli/{chunk-2z928egk.js.map → chunk-5wj2qwn2.js.map} +0 -0
- /package/dist/cli/{chunk-b07cmahc.js.map → chunk-amrb6hgh.js.map} +0 -0
- /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-cmtcnh9f.js.map} +0 -0
- /package/dist/cli/{chunk-crgn1q09.js.map → chunk-e7vvk5ya.js.map} +0 -0
- /package/dist/cli/{chunk-tkacnehg.js.map → chunk-gp84za0h.js.map} +0 -0
- /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-p804f3pe.js.map} +0 -0
- /package/dist/cli/{chunk-8ktnccpt.js.map → chunk-ta27feev.js.map} +0 -0
- /package/dist/cli/{chunk-a58773jm.js.map → chunk-y4ykbark.js.map} +0 -0
- /package/dist/cli/{chunk-p3v96n38.js.map → chunk-y5h4r2y0.js.map} +0 -0
- /package/dist/cli/{chunk-acanzt5p.js.map → chunk-yj17vs39.js.map} +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The configured consent adapter, as its factory returned it. Anything that
|
|
4
|
+
* isn't one (`true`, a list, an unknown `kind`) fails with the adapter hint;
|
|
5
|
+
* an adapter's own option errors keep their messages.
|
|
6
|
+
*/
|
|
7
|
+
export declare const consentAdapterSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
8
|
+
kind: z.ZodLiteral<"ethyca">;
|
|
9
|
+
options: z.ZodObject<{
|
|
10
|
+
notice: z.ZodOptional<z.ZodString>;
|
|
11
|
+
privacyCenter: z.ZodURL;
|
|
12
|
+
propertyId: z.ZodOptional<z.ZodString>;
|
|
13
|
+
}, z.core.$strict>;
|
|
14
|
+
requiredSecrets: z.ZodArray<z.ZodString>;
|
|
15
|
+
runtimeDeps: z.ZodArray<z.ZodString>;
|
|
16
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
17
|
+
kind: z.ZodLiteral<"native">;
|
|
18
|
+
options: z.ZodObject<{
|
|
19
|
+
policy: z.ZodOptional<z.ZodString>;
|
|
20
|
+
}, z.core.$strict>;
|
|
21
|
+
requiredSecrets: z.ZodArray<z.ZodString>;
|
|
22
|
+
runtimeDeps: z.ZodArray<z.ZodString>;
|
|
23
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
24
|
+
kind: z.ZodLiteral<"osano">;
|
|
25
|
+
options: z.ZodObject<{
|
|
26
|
+
configId: z.ZodString;
|
|
27
|
+
customerId: z.ZodString;
|
|
28
|
+
}, z.core.$strict>;
|
|
29
|
+
requiredSecrets: z.ZodArray<z.ZodString>;
|
|
30
|
+
runtimeDeps: z.ZodArray<z.ZodString>;
|
|
31
|
+
}, z.core.$strict>], "kind">;
|
|
32
|
+
export type ConsentAdapter = z.output<typeof consentAdapterSchema>;
|
|
33
|
+
/**
|
|
34
|
+
* `blume.config.consent`: the adapter that asks readers before analytics
|
|
35
|
+
* runs. Unset (`null` once resolved) means no consent layer, and analytics
|
|
36
|
+
* runs as it loads.
|
|
37
|
+
*/
|
|
38
|
+
export declare const consentConfigSchema: z.ZodPipe<z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
39
|
+
kind: z.ZodLiteral<"ethyca">;
|
|
40
|
+
options: z.ZodObject<{
|
|
41
|
+
notice: z.ZodOptional<z.ZodString>;
|
|
42
|
+
privacyCenter: z.ZodURL;
|
|
43
|
+
propertyId: z.ZodOptional<z.ZodString>;
|
|
44
|
+
}, z.core.$strict>;
|
|
45
|
+
requiredSecrets: z.ZodArray<z.ZodString>;
|
|
46
|
+
runtimeDeps: z.ZodArray<z.ZodString>;
|
|
47
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
48
|
+
kind: z.ZodLiteral<"native">;
|
|
49
|
+
options: z.ZodObject<{
|
|
50
|
+
policy: z.ZodOptional<z.ZodString>;
|
|
51
|
+
}, z.core.$strict>;
|
|
52
|
+
requiredSecrets: z.ZodArray<z.ZodString>;
|
|
53
|
+
runtimeDeps: z.ZodArray<z.ZodString>;
|
|
54
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
55
|
+
kind: z.ZodLiteral<"osano">;
|
|
56
|
+
options: z.ZodObject<{
|
|
57
|
+
configId: z.ZodString;
|
|
58
|
+
customerId: z.ZodString;
|
|
59
|
+
}, z.core.$strict>;
|
|
60
|
+
requiredSecrets: z.ZodArray<z.ZodString>;
|
|
61
|
+
runtimeDeps: z.ZodArray<z.ZodString>;
|
|
62
|
+
}, z.core.$strict>], "kind">>, z.ZodTransform<{
|
|
63
|
+
kind: "ethyca";
|
|
64
|
+
options: {
|
|
65
|
+
privacyCenter: string;
|
|
66
|
+
notice?: string | undefined;
|
|
67
|
+
propertyId?: string | undefined;
|
|
68
|
+
};
|
|
69
|
+
requiredSecrets: string[];
|
|
70
|
+
runtimeDeps: string[];
|
|
71
|
+
} | {
|
|
72
|
+
kind: "native";
|
|
73
|
+
options: {
|
|
74
|
+
policy?: string | undefined;
|
|
75
|
+
};
|
|
76
|
+
requiredSecrets: string[];
|
|
77
|
+
runtimeDeps: string[];
|
|
78
|
+
} | {
|
|
79
|
+
kind: "osano";
|
|
80
|
+
options: {
|
|
81
|
+
configId: string;
|
|
82
|
+
customerId: string;
|
|
83
|
+
};
|
|
84
|
+
requiredSecrets: string[];
|
|
85
|
+
runtimeDeps: string[];
|
|
86
|
+
} | null, {
|
|
87
|
+
kind: "ethyca";
|
|
88
|
+
options: {
|
|
89
|
+
privacyCenter: string;
|
|
90
|
+
notice?: string | undefined;
|
|
91
|
+
propertyId?: string | undefined;
|
|
92
|
+
};
|
|
93
|
+
requiredSecrets: string[];
|
|
94
|
+
runtimeDeps: string[];
|
|
95
|
+
} | {
|
|
96
|
+
kind: "native";
|
|
97
|
+
options: {
|
|
98
|
+
policy?: string | undefined;
|
|
99
|
+
};
|
|
100
|
+
requiredSecrets: string[];
|
|
101
|
+
runtimeDeps: string[];
|
|
102
|
+
} | {
|
|
103
|
+
kind: "osano";
|
|
104
|
+
options: {
|
|
105
|
+
configId: string;
|
|
106
|
+
customerId: string;
|
|
107
|
+
};
|
|
108
|
+
requiredSecrets: string[];
|
|
109
|
+
runtimeDeps: string[];
|
|
110
|
+
} | undefined>>;
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import type { AstroIntegration } from "astro";
|
|
2
|
-
import type { AssistantAdapter } from "../ai/ask.ts";
|
|
2
|
+
import type { AssistantAdapter, AssistantGatewayAdapter } from "../ai/ask.ts";
|
|
3
3
|
import type { ComponentMarkdown } from "../ai/component-markdown.ts";
|
|
4
4
|
import type { AnalyticsAdapter } from "../analytics/schema.ts";
|
|
5
|
+
import type { CaptchaAdapter } from "../captcha/schema.ts";
|
|
6
|
+
import type { ConsentAdapter } from "../consent/schema.ts";
|
|
5
7
|
import type { DeploymentInput } from "../deploy/adapters/registry.ts";
|
|
6
8
|
import type { CodeTheme } from "../markdown/themes.ts";
|
|
9
|
+
import type { RateLimitAdapter } from "../ratelimit/schema.ts";
|
|
10
|
+
import type { PlaygroundOptions } from "../reference/options.ts";
|
|
7
11
|
import type { ReferenceAdapter } from "../reference/schema.ts";
|
|
8
12
|
import type { AnySearchAdapter } from "../search/adapters/registry.ts";
|
|
9
13
|
import type { SourceAdapterInput } from "../sources/registry.ts";
|
|
10
14
|
import type { FontSlug } from "../theme/fonts.ts";
|
|
15
|
+
import type { FooterSocial } from "./footer.ts";
|
|
11
16
|
import type { OpenInChatProvider, SidebarDisplay, SidebarItemConfig } from "./schema.ts";
|
|
12
17
|
import type { StandardSchema } from "./standard-schema.ts";
|
|
13
18
|
/**
|
|
@@ -67,20 +72,60 @@ export type LogoConfig = string | {
|
|
|
67
72
|
* dismiss behavior.
|
|
68
73
|
*/
|
|
69
74
|
export type BannerConfig = string | {
|
|
70
|
-
/** The banner message. */
|
|
71
|
-
content:
|
|
75
|
+
/** The banner message, or a map of locale code to message. */
|
|
76
|
+
content: LocalizableLabel;
|
|
72
77
|
/** Show a dismiss button; the choice is remembered per visitor. */
|
|
73
78
|
dismissible?: boolean;
|
|
74
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Stable key for remembering dismissal; defaults to the content (the
|
|
81
|
+
* default locale's, for a per-locale map).
|
|
82
|
+
*/
|
|
75
83
|
id?: string;
|
|
76
84
|
/** An optional call-to-action link. */
|
|
77
85
|
link?: {
|
|
78
86
|
/** Link target (internal route or external URL). */
|
|
79
87
|
href: string;
|
|
80
|
-
/** Link text. */
|
|
81
|
-
text:
|
|
88
|
+
/** Link text, or a map of locale code to text. */
|
|
89
|
+
text: LocalizableLabel;
|
|
82
90
|
};
|
|
83
91
|
};
|
|
92
|
+
/** Defaults for hand-written endpoint pages, the ones with `api` frontmatter. */
|
|
93
|
+
export interface ApiConfig {
|
|
94
|
+
/** How requests authenticate, unless a page sets `authMethod`. Defaults to none. */
|
|
95
|
+
auth?: {
|
|
96
|
+
method: "bearer" | "basic" | "key" | "none";
|
|
97
|
+
/** The header an API key goes in. Defaults to `x-api-key`. */
|
|
98
|
+
name?: string;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* The Try it panel: `false` hides it, and `{ proxy }` sends requests through
|
|
102
|
+
* a CORS proxy, a URL or `true` for the built-in `/_api-proxy` route (server
|
|
103
|
+
* output only). Defaults to `true`, sending directly.
|
|
104
|
+
*/
|
|
105
|
+
playground?: PlaygroundOptions;
|
|
106
|
+
/** The base URL an `api` path joins, like `https://api.acme.com/v1`. */
|
|
107
|
+
server?: string;
|
|
108
|
+
}
|
|
109
|
+
/** A link in the footer's row. */
|
|
110
|
+
export interface FooterLink {
|
|
111
|
+
/** Link target (internal route or external URL). An external href opens in a new tab. */
|
|
112
|
+
href: string;
|
|
113
|
+
/** Link text, or a map of locale code to text. */
|
|
114
|
+
label: LocalizableLabel;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The site footer, below the content on every page: a row of links on one
|
|
118
|
+
* side, and social profile icons on the other.
|
|
119
|
+
*/
|
|
120
|
+
export interface FooterConfig {
|
|
121
|
+
/** Links in one row, left to right. */
|
|
122
|
+
links?: FooterLink[];
|
|
123
|
+
/**
|
|
124
|
+
* Social profiles, platform to URL, shown as icons in the order written:
|
|
125
|
+
* `{ github: "https://github.com/acme", x: "https://x.com/acme" }`.
|
|
126
|
+
*/
|
|
127
|
+
socials?: Partial<Record<FooterSocial, string>>;
|
|
128
|
+
}
|
|
84
129
|
/**
|
|
85
130
|
* Where content lives and how it's discovered. `root`/`include`/`exclude` are
|
|
86
131
|
* zero-config shorthand for a single `filesystem()` source; set `sources` to
|
|
@@ -171,7 +216,8 @@ export interface ContentTypeConfig {
|
|
|
171
216
|
frontmatter?: Record<string, StandardSchema>;
|
|
172
217
|
}
|
|
173
218
|
/**
|
|
174
|
-
* A
|
|
219
|
+
* A label, optionally per locale (header tabs and links, the banner, the
|
|
220
|
+
* footer): a plain string, or a map of locale
|
|
175
221
|
* code to label (`{ en: "Docs", ja: "ドキュメント" }`). The active locale's
|
|
176
222
|
* entry wins, then the default locale's, then the map's first entry.
|
|
177
223
|
*/
|
|
@@ -248,8 +294,8 @@ export interface FeaturedLink {
|
|
|
248
294
|
href: string;
|
|
249
295
|
/** Lucide icon name shown beside the label. */
|
|
250
296
|
icon?: string;
|
|
251
|
-
/** Link label. */
|
|
252
|
-
label:
|
|
297
|
+
/** Link label, or a map of locale code to label. */
|
|
298
|
+
label: LocalizableLabel;
|
|
253
299
|
}
|
|
254
300
|
/**
|
|
255
301
|
* The sidebar. Omit `items` to generate the sidebar from the content tree;
|
|
@@ -270,8 +316,8 @@ export type SidebarConfig = SidebarItemConfig[] | {
|
|
|
270
316
|
export interface HeaderAction {
|
|
271
317
|
/** Link target. An external href opens in a new tab. */
|
|
272
318
|
href: string;
|
|
273
|
-
/** Link label. */
|
|
274
|
-
label:
|
|
319
|
+
/** Link label, or a map of locale code to label. */
|
|
320
|
+
label: LocalizableLabel;
|
|
275
321
|
}
|
|
276
322
|
/** Header, sidebar, tabs, and switcher configuration. */
|
|
277
323
|
export interface NavigationConfig {
|
|
@@ -282,7 +328,7 @@ export interface NavigationConfig {
|
|
|
282
328
|
/** Pinned links shown above the generated sidebar sections. */
|
|
283
329
|
featured?: FeaturedLink[];
|
|
284
330
|
/**
|
|
285
|
-
* The GitHub link in the
|
|
331
|
+
* The GitHub link in the footer. `true` derives it from `github` (the
|
|
286
332
|
* default), `false` hides it, and an absolute URL points it anywhere on
|
|
287
333
|
* GitHub — an organization, say, when the docs repo itself is private.
|
|
288
334
|
*/
|
|
@@ -450,6 +496,13 @@ export interface AssistantRetrievalConfig {
|
|
|
450
496
|
}
|
|
451
497
|
/** The chat assistant. */
|
|
452
498
|
export interface AssistantConfig {
|
|
499
|
+
/**
|
|
500
|
+
* A bot check from `blume/captcha` — `turnstile({ siteKey })` or
|
|
501
|
+
* `hcaptcha({ siteKey })`. The panel sends a token with each question and
|
|
502
|
+
* the generated route verifies it (with `TURNSTILE_SECRET_KEY` or
|
|
503
|
+
* `HCAPTCHA_SECRET_KEY`) before the model runs.
|
|
504
|
+
*/
|
|
505
|
+
captcha?: CaptchaAdapter;
|
|
453
506
|
/**
|
|
454
507
|
* Origins allowed to call the generated endpoint from another site — a
|
|
455
508
|
* marketing page that embeds an ask box, for example — or `"*"` to allow
|
|
@@ -478,10 +531,10 @@ export interface AssistantConfig {
|
|
|
478
531
|
instructions?: string;
|
|
479
532
|
/**
|
|
480
533
|
* Which backend answers: the descriptor an adapter factory returns —
|
|
481
|
-
* `
|
|
482
|
-
* `
|
|
483
|
-
* `
|
|
484
|
-
* from `blume/ai`. Each adapter owns its model, key env var, reasoning
|
|
534
|
+
* `openai({ model, baseUrl })`, `anthropic({ model })`,
|
|
535
|
+
* `gemini({ model })`, `grok({ model })`, `gateway({ model })`,
|
|
536
|
+
* `openrouter({ model, reasoning })`, `llmgateway({ model })`, or
|
|
537
|
+
* `inkeep({ model })`, all exported from `blume/ai`. Each adapter owns its model, key env var, reasoning
|
|
485
538
|
* mapping, and `providerOptions` passthrough. Defaults to
|
|
486
539
|
* `gateway({ model: "openai/gpt-5.5" })`.
|
|
487
540
|
*/
|
|
@@ -492,8 +545,23 @@ export interface AssistantConfig {
|
|
|
492
545
|
* backend — at the cost of recall. Defaults keep the built-in behavior.
|
|
493
546
|
*/
|
|
494
547
|
retrieval?: AssistantRetrievalConfig;
|
|
548
|
+
/**
|
|
549
|
+
* A Contact support link in the panel once there's a conversation: a
|
|
550
|
+
* `mailto:` address starts an email with the conversation as its body; a
|
|
551
|
+
* URL or root-relative path gets the conversation's `thread` id, which the
|
|
552
|
+
* assistant's analytics events carry too.
|
|
553
|
+
*/
|
|
554
|
+
support?: string;
|
|
495
555
|
/** Starter prompts shown before the first question. */
|
|
496
556
|
suggestions?: AssistantSuggestion[];
|
|
557
|
+
/**
|
|
558
|
+
* Let the model search the docs and read whole pages itself, over several
|
|
559
|
+
* steps, instead of answering only from the excerpts retrieved up front.
|
|
560
|
+
* Defaults to `true`, except for `openai()` with a `baseUrl`, whose model
|
|
561
|
+
* may not support tool calling. `inkeep()` does its own retrieval and
|
|
562
|
+
* ignores it.
|
|
563
|
+
*/
|
|
564
|
+
tools?: boolean;
|
|
497
565
|
}
|
|
498
566
|
/** What the AI Catalog (ARD) manifest carries. */
|
|
499
567
|
export interface AiCatalogConfig {
|
|
@@ -611,6 +679,12 @@ export interface I18nConfig {
|
|
|
611
679
|
locales: LocaleConfigInput[];
|
|
612
680
|
/** `dir`: locale directories (`fr/page.mdx`). `dot`: filename suffix (`page.fr.mdx`). */
|
|
613
681
|
parser?: "dir" | "dot";
|
|
682
|
+
/**
|
|
683
|
+
* Send a visitor who lands on the default language's home page to the home
|
|
684
|
+
* page in their browser's preferred language, until they pick a language
|
|
685
|
+
* with the switcher. Defaults to `false`.
|
|
686
|
+
*/
|
|
687
|
+
routeByBrowserLanguage?: boolean;
|
|
614
688
|
/**
|
|
615
689
|
* Per-locale UI string overrides, e.g.
|
|
616
690
|
* `{ fr: { search: { button: "Rechercher" } } }`.
|
|
@@ -705,11 +779,19 @@ type RedirectStatusTemporary = 302 | 307;
|
|
|
705
779
|
type RedirectStatus = RedirectStatusPermanent | RedirectStatusTemporary;
|
|
706
780
|
/** A URL redirect rule. */
|
|
707
781
|
export interface RedirectConfig {
|
|
708
|
-
/**
|
|
782
|
+
/**
|
|
783
|
+
* Path to redirect from: an exact path, or a pattern. `:name` matches one
|
|
784
|
+
* segment, `:name*` as the last segment the rest of the path
|
|
785
|
+
* (`/beta/:slug*`), and `*` ending a segment the rest from there
|
|
786
|
+
* (`/old/article-*`).
|
|
787
|
+
*/
|
|
709
788
|
from: string;
|
|
710
789
|
/** HTTP status. Defaults to `301`. */
|
|
711
790
|
status?: RedirectStatus;
|
|
712
|
-
/**
|
|
791
|
+
/**
|
|
792
|
+
* Path or URL to redirect to. Reads `from`'s captures as `/:name` (or `*`
|
|
793
|
+
* for what `*` matched): `/v2/:slug*`.
|
|
794
|
+
*/
|
|
713
795
|
to: string;
|
|
714
796
|
}
|
|
715
797
|
/**
|
|
@@ -785,6 +867,13 @@ export interface AgentsConfig {
|
|
|
785
867
|
markdownComponents?: Record<string, ComponentMarkdown>;
|
|
786
868
|
/** Expose the docs as an MCP server for agents. */
|
|
787
869
|
mcp?: McpConfig;
|
|
870
|
+
/**
|
|
871
|
+
* Generate the site's own agent skill: a `SKILL.md` named after the site,
|
|
872
|
+
* built from its navigation and page descriptions, served at `/skill.md`
|
|
873
|
+
* and in the skills discovery index. Needs `deployment.site`. A skill in
|
|
874
|
+
* `agents.skills` with the same name replaces it. Defaults to `true`.
|
|
875
|
+
*/
|
|
876
|
+
skillMd?: boolean;
|
|
788
877
|
/**
|
|
789
878
|
* Publish Agent Skills for discovery: a directory (resolved against the
|
|
790
879
|
* project root) whose subdirectories each hold a `SKILL.md`. Skills are
|
|
@@ -954,6 +1043,23 @@ export interface SoftwareConfig {
|
|
|
954
1043
|
}
|
|
955
1044
|
/** Discoverability: OG images, feeds, sitemap, robots, and structured data. */
|
|
956
1045
|
export interface SeoConfig {
|
|
1046
|
+
/**
|
|
1047
|
+
* Meta tags written into every page's head, name to content: site
|
|
1048
|
+
* verification tokens, `theme-color`, an app banner, and anything else
|
|
1049
|
+
* Blume has no setting for. `og:*`, `fb:*`, and `article:*` tags render
|
|
1050
|
+
* with `property`, the rest with `name`. A tag Blume writes itself
|
|
1051
|
+
* (`description`, `robots`, `og:image`, `twitter:card`, …) is refused.
|
|
1052
|
+
*
|
|
1053
|
+
* ```ts
|
|
1054
|
+
* seo: {
|
|
1055
|
+
* metatags: {
|
|
1056
|
+
* "google-site-verification": "abc123",
|
|
1057
|
+
* "theme-color": "#0b5fff",
|
|
1058
|
+
* },
|
|
1059
|
+
* }
|
|
1060
|
+
* ```
|
|
1061
|
+
*/
|
|
1062
|
+
metatags?: Record<string, string>;
|
|
957
1063
|
/** Per-page Open Graph image generation. */
|
|
958
1064
|
og?: OgConfig;
|
|
959
1065
|
/**
|
|
@@ -1104,6 +1210,33 @@ export type ExportConfig = boolean | {
|
|
|
1104
1210
|
/** Offer PDF export (via print). Defaults to `false`. */
|
|
1105
1211
|
pdf?: boolean;
|
|
1106
1212
|
};
|
|
1213
|
+
/** Page feedback: the rating, and an optional written comment after it. */
|
|
1214
|
+
export interface FeedbackConfig {
|
|
1215
|
+
/**
|
|
1216
|
+
* After the rating, offer a box to say more. The comment is sent as a
|
|
1217
|
+
* `feedback_comment` event through every analytics adapter with an event
|
|
1218
|
+
* API. Defaults to `false`.
|
|
1219
|
+
*/
|
|
1220
|
+
comments?: boolean;
|
|
1221
|
+
/** Show the rating. Defaults to `true`. */
|
|
1222
|
+
enabled?: boolean;
|
|
1223
|
+
}
|
|
1224
|
+
/**
|
|
1225
|
+
* "Listen to this page". `true` reads pages aloud with the reader's browser
|
|
1226
|
+
* voices (no key, any host). The object form's `provider` generates neural
|
|
1227
|
+
* audio at build instead, one cached clip per sentence, and falls back to
|
|
1228
|
+
* browser voices where no clips exist. Defaults to `false`.
|
|
1229
|
+
*/
|
|
1230
|
+
export type NarrationConfig = boolean | {
|
|
1231
|
+
/** Show the player. Defaults to `true` in the object form. */
|
|
1232
|
+
enabled?: boolean;
|
|
1233
|
+
/**
|
|
1234
|
+
* Generate audio at build with a speech model:
|
|
1235
|
+
* `gateway({ model: "openai/tts-1-hd", voice: "alloy" })` from
|
|
1236
|
+
* `blume/ai`. Without it, pages are read with browser voices.
|
|
1237
|
+
*/
|
|
1238
|
+
provider?: AssistantGatewayAdapter;
|
|
1239
|
+
};
|
|
1107
1240
|
/**
|
|
1108
1241
|
* Opt-in custom frontmatter keys. Page frontmatter is strictly validated —
|
|
1109
1242
|
* an unknown key fails the build so typos are caught — and `extend` carves
|
|
@@ -1188,6 +1321,8 @@ export interface BlumeConfig {
|
|
|
1188
1321
|
agents?: AgentsConfig;
|
|
1189
1322
|
/** Model-facing features: the assistant and the "Open in chat" action. */
|
|
1190
1323
|
ai?: AiConfig;
|
|
1324
|
+
/** Defaults for hand-written endpoint pages (`api` frontmatter). */
|
|
1325
|
+
api?: ApiConfig;
|
|
1191
1326
|
/**
|
|
1192
1327
|
* Analytics adapters from `blume/analytics`, emitted into `<head>` of every
|
|
1193
1328
|
* production page in this order: `[posthog({ key }), vercel(),
|
|
@@ -1206,6 +1341,14 @@ export interface BlumeConfig {
|
|
|
1206
1341
|
* compose: with both set, a page lands at `{deployment.base}/{basePath}/page`.
|
|
1207
1342
|
*/
|
|
1208
1343
|
basePath?: string;
|
|
1344
|
+
/**
|
|
1345
|
+
* Ask readers before analytics runs, with an adapter from `blume/consent`:
|
|
1346
|
+
* `native()` for Blume's own banner, or a hosted consent manager
|
|
1347
|
+
* (`osano({ customerId, configId })`, `ethyca({ privacyCenter })`). Every
|
|
1348
|
+
* `analytics` adapter waits until the reader allows analytics. Unset runs
|
|
1349
|
+
* analytics as it loads.
|
|
1350
|
+
*/
|
|
1351
|
+
consent?: ConsentAdapter;
|
|
1209
1352
|
/** Where content lives and how it's discovered. */
|
|
1210
1353
|
content?: ContentConfig;
|
|
1211
1354
|
/**
|
|
@@ -1229,8 +1372,17 @@ export interface BlumeConfig {
|
|
|
1229
1372
|
examples?: string | ExamplesConfig;
|
|
1230
1373
|
/** Reader-facing PDF/EPUB export actions. Defaults to `false`. */
|
|
1231
1374
|
export?: ExportConfig;
|
|
1232
|
-
/**
|
|
1233
|
-
|
|
1375
|
+
/**
|
|
1376
|
+
* The "Was this page helpful?" rating at the foot of each page. On by
|
|
1377
|
+
* default; `false` hides it. `{ comments: true }` also asks for a written
|
|
1378
|
+
* comment after the rating, sent through your analytics adapters.
|
|
1379
|
+
*/
|
|
1380
|
+
feedback?: boolean | FeedbackConfig;
|
|
1381
|
+
/**
|
|
1382
|
+
* The site footer: social profile icons and up to four link columns. Unset,
|
|
1383
|
+
* the site has no footer.
|
|
1384
|
+
*/
|
|
1385
|
+
footer?: FooterConfig;
|
|
1234
1386
|
/** Opt-in custom frontmatter keys, validated by schemas you supply. */
|
|
1235
1387
|
frontmatter?: FrontmatterConfig;
|
|
1236
1388
|
/** Source repository (Edit-this-page links and the header repo link). */
|
|
@@ -1247,8 +1399,17 @@ export interface BlumeConfig {
|
|
|
1247
1399
|
logo?: LogoConfig;
|
|
1248
1400
|
/** Markdown / MDX rendering behavior. */
|
|
1249
1401
|
markdown?: MarkdownConfig;
|
|
1402
|
+
/** "Listen to this page" narration. Defaults to `false`. */
|
|
1403
|
+
narration?: NarrationConfig;
|
|
1250
1404
|
/** Header, sidebar, tabs, and switchers. */
|
|
1251
1405
|
navigation?: NavigationConfig;
|
|
1406
|
+
/**
|
|
1407
|
+
* Limit how often one reader (by IP address) can call the server routes —
|
|
1408
|
+
* the assistant, the API playground proxy, server-side search — with an
|
|
1409
|
+
* adapter from `blume/ratelimit`: `memory()` (the default, 30 requests per
|
|
1410
|
+
* 10 minutes), `upstash()`, or `cloudflare()`. `false` turns it off.
|
|
1411
|
+
*/
|
|
1412
|
+
rateLimit?: false | RateLimitAdapter;
|
|
1252
1413
|
/** React island behavior (compiler auto-memoization). */
|
|
1253
1414
|
react?: ReactConfig;
|
|
1254
1415
|
/** URL redirect rules. */
|
|
@@ -1269,6 +1430,12 @@ export interface BlumeConfig {
|
|
|
1269
1430
|
title?: string;
|
|
1270
1431
|
/** On-page table of contents. Defaults to on (H2–H3). */
|
|
1271
1432
|
toc?: TocConfig;
|
|
1433
|
+
/**
|
|
1434
|
+
* Content variables: `{{name}}` in a page reads the value, in prose, code,
|
|
1435
|
+
* and links alike. Names take letters, digits, `_`, and `-`; an undefined
|
|
1436
|
+
* name in prose fails the build. Defaults to none.
|
|
1437
|
+
*/
|
|
1438
|
+
variables?: Record<string, string>;
|
|
1272
1439
|
/** Docs versioning (opt-in frozen snapshots with a version switcher). */
|
|
1273
1440
|
versions?: VersionsConfig;
|
|
1274
1441
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import type { CaptchaSettings } from "../captcha/schema.ts";
|
|
2
|
+
import type { EndpointAuth } from "../components/content/api-page.ts";
|
|
1
3
|
import type { SearchAdapterKind } from "../search/adapters/registry.ts";
|
|
2
4
|
import type { StructuredDataIdentity } from "../seo/jsonld.ts";
|
|
3
5
|
import type { FontHead } from "../theme/fonts.ts";
|
|
4
6
|
import type { UIStrings } from "./i18n-ui.ts";
|
|
5
|
-
import type { ResolvedConfig } from "./schema.ts";
|
|
7
|
+
import type { LocalizableLabel, ResolvedConfig } from "./schema.ts";
|
|
6
8
|
import type { Navigation, RouteAlternate, VersionAlternate } from "./types.ts";
|
|
7
9
|
/**
|
|
8
10
|
* The shape of the `blume:data` virtual module — the resolved, serializable
|
|
@@ -47,12 +49,16 @@ export interface BlumeFavicon {
|
|
|
47
49
|
type?: string;
|
|
48
50
|
};
|
|
49
51
|
}
|
|
50
|
-
/**
|
|
52
|
+
/**
|
|
53
|
+
* Announcement banner, normalized from its config (string shorthand or
|
|
54
|
+
* object). `content` and the link's `text` may be per-locale maps, resolved
|
|
55
|
+
* when the banner renders (see `core/localizable.ts`).
|
|
56
|
+
*/
|
|
51
57
|
export interface BlumeBanner {
|
|
52
|
-
content:
|
|
58
|
+
content: LocalizableLabel;
|
|
53
59
|
link?: {
|
|
54
60
|
href: string;
|
|
55
|
-
text:
|
|
61
|
+
text: LocalizableLabel;
|
|
56
62
|
};
|
|
57
63
|
dismissible: boolean;
|
|
58
64
|
/** Dismissal key: the configured id, else the content itself. */
|
|
@@ -76,6 +82,8 @@ export interface BlumeDataI18n {
|
|
|
76
82
|
fallbackLocale: string | null;
|
|
77
83
|
hideDefaultLocalePrefix: boolean;
|
|
78
84
|
locales: BlumeDataLocale[];
|
|
85
|
+
/** Send visitors from the default home page to their browser's language. */
|
|
86
|
+
routeByBrowserLanguage: boolean;
|
|
79
87
|
}
|
|
80
88
|
/** A single content route, with the metadata custom pages can read. */
|
|
81
89
|
export interface BlumeRoute {
|
|
@@ -127,9 +135,26 @@ export interface BlumeDataConfig {
|
|
|
127
135
|
appleIcon: BlumeFavicon | null;
|
|
128
136
|
/** The assistant's empty-state suggestions, or `null` when the assistant is off. */
|
|
129
137
|
assistant: {
|
|
138
|
+
/** The bot check's public settings, or `null` without one. */
|
|
139
|
+
captcha: CaptchaSettings | null;
|
|
130
140
|
endpoint: string | null;
|
|
131
141
|
suggestions: NonNullable<ResolvedConfig["ai"]["assistant"]>["suggestions"];
|
|
142
|
+
/** The Contact support link (`ai.assistant.support`), or `null`. */
|
|
143
|
+
support: string | null;
|
|
132
144
|
} | null;
|
|
145
|
+
/**
|
|
146
|
+
* Defaults for hand-written endpoint pages (`api` frontmatter): the server a
|
|
147
|
+
* path joins, the default auth, and the playground, its `proxy` resolved to
|
|
148
|
+
* the URL sends go through (the built-in route under `basePath`) or `false`.
|
|
149
|
+
*/
|
|
150
|
+
api: {
|
|
151
|
+
auth?: EndpointAuth;
|
|
152
|
+
playground: {
|
|
153
|
+
enabled: boolean;
|
|
154
|
+
proxy: string | false;
|
|
155
|
+
};
|
|
156
|
+
server?: string;
|
|
157
|
+
};
|
|
133
158
|
banner: BlumeBanner | null;
|
|
134
159
|
/** Site-wide route mount point, normalized to `""` or `/seg` (see config). */
|
|
135
160
|
basePath: string;
|
|
@@ -137,6 +162,11 @@ export interface BlumeDataConfig {
|
|
|
137
162
|
codeThemes: ResolvedConfig["markdown"]["code"]["theme"];
|
|
138
163
|
/** `markdown.code.wrap`: wrap long code lines instead of scrolling. */
|
|
139
164
|
codeWrap: boolean;
|
|
165
|
+
/**
|
|
166
|
+
* The consent adapter's descriptor, or `null` without one. When set, the
|
|
167
|
+
* layouts hold analytics until the reader allows it.
|
|
168
|
+
*/
|
|
169
|
+
consent: ResolvedConfig["consent"];
|
|
140
170
|
/** `dateFormat`: `Intl.DateTimeFormat` options for the date stamps. */
|
|
141
171
|
dateFormat: ResolvedConfig["dateFormat"];
|
|
142
172
|
description: string | undefined;
|
|
@@ -159,7 +189,12 @@ export interface BlumeDataConfig {
|
|
|
159
189
|
sitemap: boolean;
|
|
160
190
|
};
|
|
161
191
|
favicon: BlumeFavicon;
|
|
192
|
+
/** Whether pages end with the "Was this page helpful?" rating. */
|
|
162
193
|
feedback: boolean;
|
|
194
|
+
/** Whether the rating asks for a written comment after it (`feedback.comments`). */
|
|
195
|
+
feedbackComments: boolean;
|
|
196
|
+
/** `footer`: social profile icons and link columns, or `null` when unset. */
|
|
197
|
+
footer: ResolvedConfig["footer"] | null;
|
|
163
198
|
/**
|
|
164
199
|
* Repo coordinates for content components that address the API or build
|
|
165
200
|
* their own repo links (`<GithubInfo>`, the OG card's footer slug), carrying
|
|
@@ -187,6 +222,16 @@ export interface BlumeDataConfig {
|
|
|
187
222
|
name: string;
|
|
188
223
|
route: string;
|
|
189
224
|
} | null;
|
|
225
|
+
/** `seo.metatags`: the site's own tags for every page's head, or `null`. */
|
|
226
|
+
metatags: Record<string, string> | null;
|
|
227
|
+
/**
|
|
228
|
+
* "Listen to this page": `generated` when a `narration.provider` makes
|
|
229
|
+
* `blume build` write audio clips the player should look for, else the
|
|
230
|
+
* player reads with browser voices. `null` when narration is off.
|
|
231
|
+
*/
|
|
232
|
+
narration: {
|
|
233
|
+
generated: boolean;
|
|
234
|
+
} | null;
|
|
190
235
|
/**
|
|
191
236
|
* Open Graph image generation. Card fonts are baked into the generated OG
|
|
192
237
|
* endpoint (they can carry absolute build-machine paths) and deliberately
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The social platforms `footer.socials` links to, each shown by its brand
|
|
3
|
+
* icon: Mintlify's set, without its aliases (`twitter` and `x-twitter` are
|
|
4
|
+
* `x`, `earth-americas` is `website`).
|
|
5
|
+
*/
|
|
6
|
+
export declare const FOOTER_SOCIALS: readonly ["bluesky", "discord", "facebook", "github", "hacker-news", "instagram", "linkedin", "medium", "podcast", "reddit", "slack", "telegram", "threads", "website", "x", "youtube"];
|
|
7
|
+
/** A platform `footer.socials` links to. */
|
|
8
|
+
export type FooterSocial = (typeof FOOTER_SOCIALS)[number];
|