blume 2.0.3 → 2.1.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 +1 -0
- package/CHANGELOG.md +142 -0
- package/README.md +1 -1
- package/dist/cli/{chunk-5f86nr5m.js → chunk-073rdvgb.js} +21 -48
- package/dist/cli/{chunk-5f86nr5m.js.map → chunk-073rdvgb.js.map} +4 -5
- package/dist/cli/{chunk-ga0pf4aj.js → chunk-0n9xkp3d.js} +12 -3
- package/dist/cli/{chunk-ga0pf4aj.js.map → chunk-0n9xkp3d.js.map} +3 -3
- package/dist/cli/chunk-150jk7km.js +52 -0
- package/dist/cli/chunk-150jk7km.js.map +10 -0
- package/dist/cli/{chunk-9t7a85s3.js → chunk-313vnn40.js} +30 -19
- package/dist/cli/chunk-313vnn40.js.map +10 -0
- package/dist/cli/{chunk-tkacnehg.js → chunk-3v3ffbrj.js} +2 -2
- package/dist/cli/{chunk-q58y5e6a.js → chunk-3x6x3pph.js} +46 -24
- package/dist/cli/chunk-3x6x3pph.js.map +10 -0
- package/dist/cli/{chunk-1d7ve1dm.js → chunk-42t4jxdx.js} +37 -5
- package/dist/cli/chunk-42t4jxdx.js.map +12 -0
- package/dist/cli/{chunk-8ktnccpt.js → chunk-54ztw1nj.js} +21 -2
- package/dist/cli/chunk-54ztw1nj.js.map +10 -0
- package/dist/cli/{chunk-hm3vjy5s.js → chunk-5vjtgs6e.js} +28 -10
- package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-5vjtgs6e.js.map} +4 -4
- package/dist/cli/chunk-66w9j7p6.js +322 -0
- package/dist/cli/chunk-66w9j7p6.js.map +14 -0
- package/dist/cli/{chunk-2hsdwb9n.js → chunk-7ppf1rva.js} +34 -18
- package/dist/cli/chunk-7ppf1rva.js.map +10 -0
- package/dist/cli/{chunk-r9rcc4w7.js → chunk-8y2kmjv8.js} +7 -7
- package/dist/cli/{chunk-r20tn01b.js → chunk-c1y538kd.js} +8 -2
- package/dist/cli/{chunk-r20tn01b.js.map → chunk-c1y538kd.js.map} +3 -3
- package/dist/cli/{chunk-2eytanqx.js → chunk-c887fj0s.js} +2 -2
- package/dist/cli/{chunk-p3v96n38.js → chunk-cfyg47zg.js} +16 -6
- package/dist/cli/chunk-cfyg47zg.js.map +10 -0
- package/dist/cli/chunk-cm89scdv.js +443 -0
- package/dist/cli/chunk-cm89scdv.js.map +11 -0
- package/dist/cli/{chunk-akbpwfxc.js → chunk-dzwehpy7.js} +2 -2
- package/dist/cli/{chunk-wrr3j9w9.js → chunk-e6atmn4h.js} +299 -72
- package/dist/cli/chunk-e6atmn4h.js.map +36 -0
- package/dist/cli/{chunk-tzmab476.js → chunk-e8xw9qkh.js} +8 -6
- package/dist/cli/{chunk-tzmab476.js.map → chunk-e8xw9qkh.js.map} +3 -3
- package/dist/cli/{chunk-6dsbexzp.js → chunk-e9q7a2ak.js} +17 -15
- package/dist/cli/{chunk-6dsbexzp.js.map → chunk-e9q7a2ak.js.map} +2 -2
- package/dist/cli/{chunk-pv29h0wf.js → chunk-ehweg4fr.js} +5155 -1249
- package/dist/cli/chunk-ehweg4fr.js.map +218 -0
- package/dist/cli/{chunk-c8chx29p.js → chunk-ep6nd0rn.js} +390 -318
- package/dist/cli/chunk-ep6nd0rn.js.map +36 -0
- package/dist/cli/{chunk-p73c0m7w.js → chunk-fdrkhpjy.js} +18 -15
- package/dist/cli/{chunk-p73c0m7w.js.map → chunk-fdrkhpjy.js.map} +3 -3
- package/dist/cli/{chunk-2z928egk.js → chunk-ft9vfys6.js} +5 -5
- package/dist/cli/{chunk-5m5nmvyq.js → chunk-gb420vvz.js} +316 -79
- package/dist/cli/chunk-gb420vvz.js.map +17 -0
- package/dist/cli/{chunk-vg9r4eb9.js → chunk-hebn0tpx.js} +86 -13
- package/dist/cli/chunk-hebn0tpx.js.map +14 -0
- package/dist/cli/{chunk-35d4wj9f.js → chunk-htrwgabr.js} +41 -23
- package/dist/cli/chunk-htrwgabr.js.map +15 -0
- package/dist/cli/{chunk-g4hq16wv.js → chunk-hx3xqnk9.js} +16 -14
- package/dist/cli/{chunk-g4hq16wv.js.map → chunk-hx3xqnk9.js.map} +2 -2
- package/dist/cli/chunk-j134vrp2.js +65 -0
- package/dist/cli/chunk-j134vrp2.js.map +10 -0
- package/dist/cli/{chunk-a58773jm.js → chunk-kma9f6sf.js} +2 -2
- package/dist/cli/chunk-kwrg63tm.js +31 -0
- package/dist/cli/chunk-kwrg63tm.js.map +10 -0
- package/dist/cli/{chunk-ey84smr6.js → chunk-mrcccgnh.js} +6 -6
- package/dist/cli/{chunk-ey84smr6.js.map → chunk-mrcccgnh.js.map} +1 -1
- package/dist/cli/{chunk-yfyb25rh.js → chunk-n0v7m8ry.js} +24 -8
- package/dist/cli/chunk-n0v7m8ry.js.map +14 -0
- package/dist/cli/{chunk-j85vccga.js → chunk-ncj7w596.js} +576 -367
- package/dist/cli/chunk-ncj7w596.js.map +35 -0
- package/dist/cli/{chunk-5xvm6tfj.js → chunk-nq1d20w2.js} +17 -15
- package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-nq1d20w2.js.map} +2 -2
- package/dist/cli/{chunk-pehfxfta.js → chunk-nrns10mj.js} +6 -98
- package/dist/cli/chunk-nrns10mj.js.map +10 -0
- package/dist/cli/{chunk-crgn1q09.js → chunk-sds923fa.js} +4 -4
- package/dist/cli/chunk-t2m5j4pr.js +104 -0
- package/dist/cli/chunk-t2m5j4pr.js.map +11 -0
- package/dist/cli/{chunk-acanzt5p.js → chunk-tdqhyxfz.js} +6 -6
- package/dist/cli/chunk-tphac74f.js +126 -0
- package/dist/cli/chunk-tphac74f.js.map +11 -0
- package/dist/cli/chunk-w1r4vase.js +18 -0
- package/dist/cli/chunk-w1r4vase.js.map +10 -0
- 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/index.js +31 -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 +26 -0
- package/dist/types/ai/ask.d.ts +271 -58
- package/dist/types/ai/component-markdown.d.ts +2 -0
- package/dist/types/ai/index.d.ts +2 -2
- package/dist/types/ai/openapi-components.d.ts +4 -1
- 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 +9 -0
- package/dist/types/astro/markdown-negotiation.d.ts +3 -0
- package/dist/types/astro/pages.d.ts +10 -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/cli/init/scaffold.d.ts +1 -1
- package/dist/types/components/content/api-field.d.ts +62 -0
- package/dist/types/components/content/api-page.d.ts +100 -0
- package/dist/types/components/layout/nav-utils.d.ts +26 -0
- package/dist/types/components/openapi/code-samples.d.ts +29 -0
- package/dist/types/components/openapi/helpers.d.ts +158 -0
- package/dist/types/components/openapi/security.d.ts +95 -0
- package/dist/types/components/openapi/snippets.d.ts +60 -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/changelog-index.d.ts +8 -0
- package/dist/types/core/config-input.d.ts +217 -23
- package/dist/types/core/data.d.ts +53 -4
- package/dist/types/core/footer.d.ts +8 -0
- package/dist/types/core/i18n-ui.d.ts +88 -0
- package/dist/types/core/includes.d.ts +8 -2
- package/dist/types/core/links.d.ts +8 -0
- package/dist/types/core/localizable.d.ts +7 -0
- package/dist/types/core/page-modes.d.ts +29 -0
- package/dist/types/core/probe.d.ts +2 -0
- package/dist/types/core/project-graph.d.ts +6 -0
- package/dist/types/core/redirect-patterns.d.ts +152 -0
- package/dist/types/core/related.d.ts +40 -0
- package/dist/types/core/schema.d.ts +670 -56
- package/dist/types/core/sources/cache.d.ts +3 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +11 -2
- package/dist/types/core/sources/contentful.d.ts +17 -1
- package/dist/types/core/sources/lexical.d.ts +5 -0
- package/dist/types/core/sources/normalize.d.ts +20 -1
- package/dist/types/core/sources/read.d.ts +5 -0
- package/dist/types/core/sources/remote.d.ts +37 -10
- package/dist/types/core/sources/sanity.d.ts +1 -1
- package/dist/types/core/types.d.ts +18 -1
- package/dist/types/core/variables.d.ts +42 -0
- package/dist/types/deploy/adapter-output.d.ts +2 -1
- package/dist/types/deploy/adapters/cloudflare.d.ts +7 -5
- package/dist/types/deploy/adapters/node.d.ts +58 -23
- package/dist/types/deploy/adapters/registry.d.ts +10 -0
- package/dist/types/deploy/adapters/types.d.ts +3 -2
- package/dist/types/deploy/node-headers.d.ts +13 -2
- package/dist/types/deploy/platforms/cloudflare.d.ts +15 -7
- package/dist/types/deploy/platforms/netlify.d.ts +7 -0
- package/dist/types/deploy/platforms/node.d.ts +3 -1
- package/dist/types/deploy/platforms/types.d.ts +18 -7
- package/dist/types/deploy/platforms/vercel.d.ts +26 -1
- package/dist/types/deploy/redirects.d.ts +55 -11
- package/dist/types/deploy/sitemap.d.ts +2 -1
- package/dist/types/deploy/vercel-negotiation.d.ts +51 -21
- 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/checks.d.ts +27 -0
- package/dist/types/openapi/graphql.d.ts +6 -0
- package/dist/types/openapi/model.d.ts +27 -10
- package/dist/types/openapi/overlay.d.ts +54 -0
- package/dist/types/openapi/parse.d.ts +16 -0
- package/dist/types/openapi/references.d.ts +30 -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 +119 -0
- package/dist/types/ratelimit/upstash.d.ts +46 -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 +89 -11
- package/dist/types/reference/index.d.ts +1 -1
- package/dist/types/reference/openapi.d.ts +33 -12
- package/dist/types/reference/options.d.ts +82 -6
- package/dist/types/reference/scalar.d.ts +13 -0
- package/dist/types/reference/schema.d.ts +144 -36
- package/dist/types/search/adapters/registry.d.ts +3 -0
- package/dist/types/search/adapters/typesense.d.ts +14 -4
- package/dist/types/search/build.d.ts +3 -1
- package/dist/types/search/documents.d.ts +12 -1
- package/dist/types/search/orama-index.d.ts +13 -9
- package/dist/types/search/sync/algolia.d.ts +5 -2
- package/dist/types/search/sync/index.d.ts +3 -1
- package/dist/types/search/sync/typesense.d.ts +11 -7
- package/dist/types/seo/metatags.d.ts +20 -0
- package/dist/types/sources/contentful.d.ts +16 -0
- package/dist/types/sources/github-releases.d.ts +8 -1
- package/dist/types/sources/payload.d.ts +2 -0
- package/dist/types/sources/registry.d.ts +54 -0
- package/dist/types/sources/shared.d.ts +3 -0
- package/dist/types/sources/strapi.d.ts +2 -0
- package/docs/01-quickstart.mdx +4 -2
- package/docs/02-deployment.mdx +71 -17
- package/docs/03-upgrading.mdx +4 -4
- package/docs/04-migrating.mdx +1 -1
- package/docs/advanced/changelog.mdx +13 -2
- package/docs/advanced/skills.mdx +15 -1
- package/docs/cli/audit.mdx +51 -8
- package/docs/cli/doctor.mdx +5 -1
- package/docs/cli/evals.mdx +4 -4
- package/docs/cli/index.mdx +1 -0
- package/docs/cli/translate.mdx +1 -0
- package/docs/cli/validate.mdx +4 -3
- package/docs/configuration/analytics.mdx +3 -1
- package/docs/configuration/assistant.mdx +194 -38
- package/docs/configuration/consent.mdx +100 -0
- package/docs/configuration/customization.mdx +8 -6
- package/docs/configuration/export.mdx +5 -3
- package/docs/configuration/index.mdx +64 -5
- package/docs/configuration/meta.ts +3 -0
- package/docs/configuration/narration.mdx +119 -0
- package/docs/configuration/rate-limiting.mdx +90 -0
- package/docs/configuration/search.mdx +63 -12
- package/docs/configuration/theming.mdx +3 -1
- package/docs/content/components.mdx +108 -2
- package/docs/content/frontmatter.mdx +80 -2
- package/docs/content/i18n.mdx +39 -4
- 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 +32 -10
- package/docs/content/sources/contentful.mdx +35 -0
- package/docs/content/sources/custom.mdx +43 -0
- package/docs/content/sources/github-releases.mdx +39 -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 +31 -0
- package/docs/content/sources/remote-mdx.mdx +44 -0
- package/docs/content/sources/sanity.mdx +29 -0
- package/docs/content/sources/strapi.mdx +32 -0
- package/docs/content/syntax.mdx +69 -4
- package/docs/content/variables.mdx +41 -0
- package/docs/discoverability/agent-discovery.mdx +29 -2
- package/docs/discoverability/index.mdx +2 -2
- package/docs/discoverability/json-api.mdx +2 -0
- package/docs/discoverability/llms-txt.mdx +2 -2
- package/docs/discoverability/markdown.mdx +3 -1
- package/docs/discoverability/mcp.mdx +4 -0
- package/docs/discoverability/metadata.mdx +17 -0
- package/docs/discoverability/sitemap-and-robots.mdx +1 -1
- package/docs/references/api-pages.mdx +74 -0
- package/docs/references/asyncapi.mdx +4 -2
- package/docs/references/graphql.mdx +14 -2
- package/docs/references/meta.ts +1 -1
- package/docs/references/openapi.mdx +148 -7
- package/docs/references/scalar.mdx +3 -1
- package/package.json +43 -8
- package/skills/blume/SKILL.md +3 -0
- package/skills/blume-migrate/SKILL.md +6 -6
- package/skills/blume-migrate/references/docusaurus.md +7 -7
- package/skills/blume-migrate/references/fumadocs.md +17 -13
- package/skills/blume-migrate/references/mintlify.md +37 -19
- package/skills/blume-migrate/references/nextra.md +10 -7
- package/skills/blume-migrate/references/starlight.md +11 -8
- 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 +103 -20
- package/src/ai/ask-data.ts +6 -0
- package/src/ai/ask-limits.ts +13 -0
- package/src/ai/ask-tools.ts +142 -0
- package/src/ai/ask.ts +354 -76
- package/src/ai/changelog-markdown.ts +11 -6
- package/src/ai/component-markdown.ts +76 -1
- package/src/ai/cors.ts +14 -3
- 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/mcp/query.ts +14 -6
- package/src/ai/openapi-components.ts +36 -6
- package/src/ai/relative-links.ts +4 -38
- 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 +210 -66
- package/src/astro/index.ts +1 -0
- package/src/astro/integration.ts +42 -4
- package/src/astro/markdown-negotiation.ts +3 -0
- package/src/astro/module-types.ts +9 -1
- package/src/astro/pages.ts +23 -0
- package/src/astro/templates.ts +406 -108
- package/src/astro/variables.ts +31 -0
- package/src/audit/catalog.ts +38 -3
- 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 +19 -13
- package/src/audit/checks/network.ts +110 -6
- package/src/audit/checks/redirects.ts +6 -4
- package/src/audit/checks/robots.ts +58 -2
- package/src/audit/checks/sitemap.ts +2 -3
- package/src/audit/redirects.ts +46 -15
- package/src/audit/run.ts +5 -0
- package/src/audit/types.ts +4 -1
- package/src/audit/url.ts +14 -5
- package/src/blume-modules.d.ts +12 -1
- 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/args.ts +51 -0
- package/src/cli/build-failure.ts +23 -0
- package/src/cli/command-meta.ts +5 -0
- package/src/cli/commands/audit.ts +10 -1
- package/src/cli/commands/dev.ts +18 -2
- package/src/cli/commands/doctor.ts +67 -28
- package/src/cli/commands/eval.ts +36 -4
- package/src/cli/commands/init.ts +6 -4
- package/src/cli/commands/skill.ts +96 -0
- package/src/cli/commands/validate.ts +10 -1
- package/src/cli/index.ts +5 -0
- package/src/cli/init/scaffold.ts +3 -3
- package/src/cli/prepare.ts +6 -3
- package/src/cli/required-secrets.ts +72 -30
- 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 +66 -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 +103 -0
- package/src/components/content/api-page.ts +248 -0
- package/src/components/content/mermaid-element.ts +15 -1
- 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 +136 -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/PageActions.astro +139 -24
- 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 +318 -47
- package/src/components/layout/Search.astro +47 -19
- package/src/components/layout/SiteFooter.astro +124 -0
- package/src/components/layout/SiteMetatags.astro +16 -0
- package/src/components/layout/TableOfContents.astro +24 -17
- 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/head-scripts.ts +6 -1
- 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/algolia.ts +10 -1
- package/src/components/layout/search/analytics.ts +126 -0
- package/src/components/layout/search/endpoint.ts +48 -5
- package/src/components/layout/search/flexsearch.ts +17 -5
- package/src/components/layout/search/orama-cloud.ts +26 -14
- package/src/components/layout/search/pagefind.ts +114 -5
- package/src/components/layout/search/types.ts +32 -0
- package/src/components/layout/search/typesense.ts +19 -3
- package/src/components/openapi/AsyncApiOperation.astro +14 -7
- package/src/components/openapi/Authorization.astro +10 -0
- package/src/components/openapi/GraphqlOperation.astro +5 -0
- package/src/components/openapi/Operation.astro +184 -13
- package/src/components/openapi/ParametersTable.astro +8 -4
- package/src/components/openapi/Playground.astro +7 -1
- package/src/components/openapi/RequestBody.astro +24 -5
- package/src/components/openapi/RequestPanel.astro +59 -7
- package/src/components/openapi/Responses.astro +7 -4
- package/src/components/openapi/SchemaTable.astro +15 -3
- package/src/components/openapi/async-snippets.ts +65 -9
- package/src/components/openapi/async.ts +123 -29
- package/src/components/openapi/code-samples.ts +97 -0
- package/src/components/openapi/graphql-helpers.ts +35 -12
- package/src/components/openapi/helpers.ts +36 -2
- package/src/components/openapi/message-model.ts +54 -11
- package/src/components/openapi/message.ts +14 -4
- package/src/components/openapi/operation-model.ts +16 -7
- package/src/components/openapi/playground-client.ts +24 -5
- package/src/components/openapi/playground-schema.ts +1 -1
- package/src/components/openapi/schema-tree.ts +44 -14
- package/src/components/openapi/security.ts +16 -3
- package/src/components/openapi/snippets.ts +873 -10
- package/src/components/openapi/validate-json.ts +4 -3
- 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/changelog-index.ts +31 -1
- package/src/core/client-address.ts +19 -0
- package/src/core/component-diagnostics.ts +53 -0
- package/src/core/component-overrides.ts +32 -0
- package/src/core/config-input.ts +225 -23
- package/src/core/data.ts +46 -4
- package/src/core/diagnostics.ts +8 -2
- package/src/core/footer.ts +26 -0
- package/src/core/graph.ts +39 -36
- package/src/core/i18n-ui.ts +84 -2
- package/src/core/includes.ts +21 -4
- package/src/core/links.ts +63 -19
- 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/probe.ts +26 -6
- package/src/core/project-graph.ts +163 -16
- package/src/core/redirect-patterns.ts +520 -0
- package/src/core/related.ts +131 -0
- package/src/core/schema.ts +339 -66
- package/src/core/sources/cache.ts +6 -0
- package/src/core/sources/contentful-rich-text.ts +29 -6
- package/src/core/sources/contentful.ts +135 -25
- package/src/core/sources/filesystem.ts +26 -4
- package/src/core/sources/github-releases.ts +12 -1
- package/src/core/sources/lexical.ts +15 -10
- package/src/core/sources/mdx-remote.ts +62 -10
- package/src/core/sources/normalize.ts +228 -41
- package/src/core/sources/notion.ts +7 -1
- package/src/core/sources/obsidian.ts +16 -3
- package/src/core/sources/payload.ts +38 -15
- package/src/core/sources/read.ts +8 -3
- package/src/core/sources/remote.ts +72 -15
- package/src/core/sources/resolve.ts +11 -1
- package/src/core/sources/sanity.ts +43 -25
- package/src/core/sources/strapi.ts +2 -2
- package/src/core/types.ts +19 -1
- package/src/core/ui-packs/ar.ts +44 -0
- package/src/core/ui-packs/bg.ts +46 -0
- package/src/core/ui-packs/bn.ts +44 -0
- package/src/core/ui-packs/ca.ts +47 -0
- package/src/core/ui-packs/cs.ts +45 -0
- package/src/core/ui-packs/da.ts +46 -0
- package/src/core/ui-packs/de.ts +47 -0
- package/src/core/ui-packs/el.ts +46 -0
- package/src/core/ui-packs/es.ts +47 -0
- package/src/core/ui-packs/fa.ts +46 -0
- package/src/core/ui-packs/fi.ts +46 -0
- package/src/core/ui-packs/fr.ts +47 -0
- package/src/core/ui-packs/he.ts +44 -0
- package/src/core/ui-packs/hi.ts +45 -0
- package/src/core/ui-packs/hr.ts +46 -0
- package/src/core/ui-packs/hu.ts +45 -0
- package/src/core/ui-packs/id.ts +46 -0
- package/src/core/ui-packs/it.ts +46 -0
- package/src/core/ui-packs/ja.ts +46 -0
- package/src/core/ui-packs/ko.ts +45 -0
- package/src/core/ui-packs/nl.ts +47 -0
- package/src/core/ui-packs/no.ts +45 -0
- package/src/core/ui-packs/pl.ts +46 -0
- package/src/core/ui-packs/pt-br.ts +47 -0
- package/src/core/ui-packs/pt.ts +46 -0
- package/src/core/ui-packs/ro.ts +46 -0
- package/src/core/ui-packs/ru.ts +46 -0
- package/src/core/ui-packs/sk.ts +45 -0
- package/src/core/ui-packs/sr.ts +46 -0
- package/src/core/ui-packs/sv.ts +45 -0
- package/src/core/ui-packs/th.ts +44 -0
- package/src/core/ui-packs/tr.ts +46 -0
- package/src/core/ui-packs/uk.ts +46 -0
- package/src/core/ui-packs/vi.ts +46 -0
- package/src/core/ui-packs/zh-tw.ts +44 -0
- package/src/core/ui-packs/zh.ts +44 -0
- package/src/core/variables.ts +103 -0
- package/src/deploy/adapter-output.ts +7 -2
- package/src/deploy/adapters/cloudflare.ts +7 -5
- package/src/deploy/adapters/node.ts +47 -9
- package/src/deploy/adapters/types.ts +7 -3
- package/src/deploy/artifacts.ts +79 -9
- 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 +45 -9
- package/src/deploy/platforms/netlify.ts +35 -2
- package/src/deploy/platforms/node.ts +12 -2
- package/src/deploy/platforms/types.ts +21 -7
- package/src/deploy/platforms/vercel.ts +149 -17
- package/src/deploy/redirects.ts +151 -24
- package/src/deploy/rss.ts +3 -1
- package/src/deploy/sitemap.ts +39 -5
- package/src/deploy/vercel-negotiation.ts +326 -102
- package/src/eval/agents.ts +18 -1
- package/src/eval/prompts.ts +6 -3
- package/src/eval/report.ts +34 -13
- package/src/eval/run.ts +5 -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/relative-links.ts +3 -2
- 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/checks.ts +273 -0
- package/src/openapi/graphql-build.ts +21 -0
- package/src/openapi/graphql.ts +11 -0
- package/src/openapi/model.ts +72 -27
- package/src/openapi/overlay.ts +256 -0
- package/src/openapi/parse.ts +182 -4
- package/src/openapi/references.ts +64 -8
- package/src/openapi/render-mdx.ts +5 -1
- package/src/openapi/scalar.ts +40 -6
- package/src/openapi/source.ts +40 -15
- 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 +247 -0
- package/src/ratelimit/schema.ts +28 -0
- package/src/ratelimit/upstash.ts +60 -0
- package/src/ratelimit/wrangler.ts +70 -0
- package/src/reference/asyncapi.ts +2 -2
- package/src/reference/graphql.ts +20 -3
- package/src/reference/index.ts +1 -0
- package/src/reference/openapi.ts +21 -7
- package/src/reference/options.ts +80 -8
- package/src/reference/scalar.ts +33 -8
- package/src/registry/eject.ts +23 -5
- package/src/registry/registry.ts +7 -0
- package/src/search/adapters/locale-scope.ts +30 -0
- package/src/search/adapters/typesense.ts +14 -4
- package/src/search/build.ts +21 -3
- package/src/search/documents.ts +26 -2
- package/src/search/orama-index.ts +191 -34
- package/src/search/pagefind-ranking.ts +39 -0
- package/src/search/source-pages.ts +29 -0
- package/src/search/sync/algolia.ts +111 -10
- package/src/search/sync/index.ts +52 -13
- package/src/search/sync/orama-cloud.ts +3 -0
- package/src/search/sync/typesense.ts +76 -26
- package/src/seo/metatags.ts +67 -0
- package/src/sources/contentful.ts +12 -0
- package/src/sources/github-releases.ts +7 -1
- package/src/sources/shared.ts +3 -0
- package/src/theme/chrome-icons.ts +1 -0
- package/src/theme/color.ts +500 -0
- package/src/theme/entry.ts +85 -6
- package/src/theme/palette.ts +121 -45
- package/src/translate/prompts.ts +1 -0
- package/src/translate/validate.ts +31 -3
- package/src/upgrade/upgrade.ts +4 -171
- package/dist/cli/chunk-1d7ve1dm.js.map +0 -12
- package/dist/cli/chunk-2hsdwb9n.js.map +0 -10
- package/dist/cli/chunk-35d4wj9f.js.map +0 -15
- 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-8ktnccpt.js.map +0 -10
- package/dist/cli/chunk-9t7a85s3.js.map +0 -10
- package/dist/cli/chunk-b07cmahc.js +0 -145
- package/dist/cli/chunk-b07cmahc.js.map +0 -11
- package/dist/cli/chunk-c8chx29p.js.map +0 -36
- package/dist/cli/chunk-e04dxsz1.js +0 -39
- package/dist/cli/chunk-e04dxsz1.js.map +0 -10
- package/dist/cli/chunk-j85vccga.js.map +0 -36
- package/dist/cli/chunk-p3v96n38.js.map +0 -10
- 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-vg9r4eb9.js.map +0 -14
- 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-tkacnehg.js.map → chunk-3v3ffbrj.js.map} +0 -0
- /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-8y2kmjv8.js.map} +0 -0
- /package/dist/cli/{chunk-2eytanqx.js.map → chunk-c887fj0s.js.map} +0 -0
- /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-dzwehpy7.js.map} +0 -0
- /package/dist/cli/{chunk-2z928egk.js.map → chunk-ft9vfys6.js.map} +0 -0
- /package/dist/cli/{chunk-a58773jm.js.map → chunk-kma9f6sf.js.map} +0 -0
- /package/dist/cli/{chunk-crgn1q09.js.map → chunk-sds923fa.js.map} +0 -0
- /package/dist/cli/{chunk-acanzt5p.js.map → chunk-tdqhyxfz.js.map} +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { markdownTable } from "markdown-table";
|
|
2
2
|
import { mdxToMdast } from "satteri";
|
|
3
3
|
|
|
4
|
+
import { PARAM_LOCATIONS } from "../components/content/api-field.ts";
|
|
4
5
|
import { parseYouTubeId } from "../components/content/youtube.ts";
|
|
5
6
|
import type { ExampleLookup } from "../core/types.ts";
|
|
6
7
|
import { MDX_FEATURES } from "../markdown/features.ts";
|
|
@@ -398,6 +399,18 @@ const tabs: ComponentMarkdown = ({ childComponents, children }) => {
|
|
|
398
399
|
.join("\n\n");
|
|
399
400
|
};
|
|
400
401
|
|
|
402
|
+
/**
|
|
403
|
+
* A `<View>` block: its content under its view's name, so an agent reading
|
|
404
|
+
* the Markdown sees every view and which one each part belongs to.
|
|
405
|
+
*/
|
|
406
|
+
const view: ComponentMarkdown = ({ children, props }) => {
|
|
407
|
+
const title = isString(props.title) && props.title !== "" ? props.title : "";
|
|
408
|
+
if (!title) {
|
|
409
|
+
return children;
|
|
410
|
+
}
|
|
411
|
+
return children ? `**${title}**\n\n${children}` : `**${title}**`;
|
|
412
|
+
};
|
|
413
|
+
|
|
401
414
|
/** Escape the brackets that would end a link's text early. */
|
|
402
415
|
const linkText = (value: string): string =>
|
|
403
416
|
value.replaceAll(/[[\]]/gu, String.raw`\$&`);
|
|
@@ -420,6 +433,63 @@ const textProp = (value: EvaluatedValue): string => {
|
|
|
420
433
|
return isNumber(value) ? String(value) : "";
|
|
421
434
|
};
|
|
422
435
|
|
|
436
|
+
/** Whether a flag prop is on: shorthand `true`, or the string `"true"`. */
|
|
437
|
+
const flagOn = (value: EvaluatedValue): boolean =>
|
|
438
|
+
value === true || value === "true";
|
|
439
|
+
|
|
440
|
+
/** A prop that holds one label or several. */
|
|
441
|
+
const labelList = (value: EvaluatedValue): string[] =>
|
|
442
|
+
(Array.isArray(value) ? value : [value]).map(textProp).filter(Boolean);
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* One `<ParamField>` or `<ResponseField>` as a list item: its labels, name,
|
|
446
|
+
* location, type, flags, and default on the first line, joined with middle
|
|
447
|
+
* dots, and its description indented under it, nested fields included. A
|
|
448
|
+
* field with no name, or a prop that wouldn't evaluate, declines.
|
|
449
|
+
*/
|
|
450
|
+
const apiField = (
|
|
451
|
+
{ children, lossy, props }: ComponentMarkdownContext,
|
|
452
|
+
name: string,
|
|
453
|
+
location?: string
|
|
454
|
+
): string | null => {
|
|
455
|
+
if (lossy || name === "") {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
const value = props.default;
|
|
459
|
+
const head = [
|
|
460
|
+
...labelList(props.pre),
|
|
461
|
+
`**${cellCode(name)}**`,
|
|
462
|
+
...labelList(props.post),
|
|
463
|
+
location,
|
|
464
|
+
textProp(props.type) && cellCode(props.type),
|
|
465
|
+
flagOn(props.required) ? "required" : "",
|
|
466
|
+
flagOn(props.deprecated) ? "deprecated" : "",
|
|
467
|
+
value === undefined || value === null || value === ""
|
|
468
|
+
? ""
|
|
469
|
+
: `default ${cellCode(isString(value) ? value : JSON.stringify(value))}`,
|
|
470
|
+
].filter(Boolean);
|
|
471
|
+
const item = `- ${head.join(" · ")}`;
|
|
472
|
+
if (!children) {
|
|
473
|
+
return item;
|
|
474
|
+
}
|
|
475
|
+
const body = children
|
|
476
|
+
.split("\n")
|
|
477
|
+
.map((line) => (line === "" ? "" : ` ${line}`))
|
|
478
|
+
.join("\n");
|
|
479
|
+
return `${item}\n\n${body}`;
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
/** `<ParamField query="limit">`: named by its location attribute, else `name`. */
|
|
483
|
+
const paramFieldMarkdown: ComponentMarkdown = (context) => {
|
|
484
|
+
const location = PARAM_LOCATIONS.find((key) => isString(context.props[key]));
|
|
485
|
+
return location
|
|
486
|
+
? apiField(context, textProp(context.props[location]), location)
|
|
487
|
+
: apiField(context, textProp(context.props.name));
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
const responseFieldMarkdown: ComponentMarkdown = (context) =>
|
|
491
|
+
apiField(context, textProp(context.props.name));
|
|
492
|
+
|
|
423
493
|
/**
|
|
424
494
|
* A card is a link with a blurb, so that is what it becomes: the title as the
|
|
425
495
|
* link text, the body under it, and the call to action last — the order the
|
|
@@ -514,7 +584,7 @@ export const inlineCode = (text: string): string => {
|
|
|
514
584
|
};
|
|
515
585
|
|
|
516
586
|
/** Fence `code` so its opening/closing run outlengths any backticks inside. */
|
|
517
|
-
const fencedBlock = (lang: string, code: string): string => {
|
|
587
|
+
export const fencedBlock = (lang: string, code: string): string => {
|
|
518
588
|
const trimmed = code.replace(/(?<!\n)\n+$/u, "");
|
|
519
589
|
const runs = trimmed.match(/`+/gu);
|
|
520
590
|
const longest = runs ? Math.max(...runs.map((run) => run.length)) : 0;
|
|
@@ -822,7 +892,11 @@ const SERIALIZERS = {
|
|
|
822
892
|
Icon: icon,
|
|
823
893
|
Math: math,
|
|
824
894
|
Panel: panel,
|
|
895
|
+
ParamField: paramFieldMarkdown,
|
|
825
896
|
Prompt: prompt,
|
|
897
|
+
RequestExample: cardGroup,
|
|
898
|
+
ResponseExample: cardGroup,
|
|
899
|
+
ResponseField: responseFieldMarkdown,
|
|
826
900
|
Steps: steps,
|
|
827
901
|
Tabs: tabs,
|
|
828
902
|
Tile: tile,
|
|
@@ -832,6 +906,7 @@ const SERIALIZERS = {
|
|
|
832
906
|
"Tree.Folder": treeFolder,
|
|
833
907
|
TypeTable: typeTable,
|
|
834
908
|
Update: update,
|
|
909
|
+
View: view,
|
|
835
910
|
YouTube: youtube,
|
|
836
911
|
} satisfies Record<string, ComponentMarkdown>;
|
|
837
912
|
|
package/src/ai/cors.ts
CHANGED
|
@@ -61,9 +61,18 @@ export const preflightResponse = (
|
|
|
61
61
|
|
|
62
62
|
/** The slice of Astro's `APIContext` the wrapped handler reads. */
|
|
63
63
|
interface RequestContext {
|
|
64
|
+
/** The reader's address, which the route's rate limit keys on. */
|
|
65
|
+
readonly clientAddress?: string;
|
|
64
66
|
request: Request;
|
|
65
67
|
}
|
|
66
68
|
|
|
69
|
+
/**
|
|
70
|
+
* The response headers a cross-origin caller may read beyond the safelisted
|
|
71
|
+
* ones: the rate limit's `Retry-After`, so a caller can tell a reader how
|
|
72
|
+
* long to wait after a `429`.
|
|
73
|
+
*/
|
|
74
|
+
const EXPOSED_HEADERS = "retry-after";
|
|
75
|
+
|
|
67
76
|
/** Stamp the CORS headers on every response `handler` returns. */
|
|
68
77
|
export const withCors =
|
|
69
78
|
(
|
|
@@ -72,9 +81,8 @@ export const withCors =
|
|
|
72
81
|
): ((context: RequestContext) => Promise<Response>) =>
|
|
73
82
|
async (context) => {
|
|
74
83
|
const response = await handler(context);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
)) {
|
|
84
|
+
const headers = corsHeaders(context.request, allowed);
|
|
85
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
78
86
|
// `Vary` accumulates (the handler may already vary on something), the
|
|
79
87
|
// rest replace.
|
|
80
88
|
if (key === "vary") {
|
|
@@ -83,5 +91,8 @@ export const withCors =
|
|
|
83
91
|
response.headers.set(key, value);
|
|
84
92
|
}
|
|
85
93
|
}
|
|
94
|
+
if (headers["access-control-allow-origin"]) {
|
|
95
|
+
response.headers.set("access-control-expose-headers", EXPOSED_HEADERS);
|
|
96
|
+
}
|
|
86
97
|
return response;
|
|
87
98
|
};
|
package/src/ai/index.ts
CHANGED
|
@@ -20,23 +20,35 @@
|
|
|
20
20
|
* nothing here runs at request time.
|
|
21
21
|
*/
|
|
22
22
|
export {
|
|
23
|
+
anthropic,
|
|
23
24
|
gateway,
|
|
25
|
+
gemini,
|
|
26
|
+
grok,
|
|
24
27
|
inkeep,
|
|
25
28
|
llmgateway,
|
|
29
|
+
openai,
|
|
26
30
|
openaiCompatible,
|
|
27
31
|
openrouter,
|
|
28
32
|
} from "./ask.ts";
|
|
29
33
|
export type {
|
|
30
34
|
AssistantAdapter,
|
|
31
35
|
AssistantAdapterOptions,
|
|
36
|
+
AssistantAnthropicAdapter,
|
|
37
|
+
AssistantAnthropicOptions,
|
|
32
38
|
AssistantGatewayAdapter,
|
|
33
39
|
AssistantGatewayOptions,
|
|
40
|
+
AssistantGeminiAdapter,
|
|
41
|
+
AssistantGeminiOptions,
|
|
42
|
+
AssistantGrokAdapter,
|
|
43
|
+
AssistantGrokOptions,
|
|
34
44
|
AssistantInkeepAdapter,
|
|
35
45
|
AssistantInkeepOptions,
|
|
36
46
|
AssistantLlmGatewayAdapter,
|
|
37
47
|
AssistantLlmGatewayOptions,
|
|
48
|
+
AssistantOpenAIAdapter,
|
|
38
49
|
AssistantOpenAICompatibleAdapter,
|
|
39
50
|
AssistantOpenAICompatibleOptions,
|
|
51
|
+
AssistantOpenAIOptions,
|
|
40
52
|
AssistantOpenRouterAdapter,
|
|
41
53
|
AssistantOpenRouterOptions,
|
|
42
54
|
AssistantProviderOptions,
|
package/src/ai/llms.ts
CHANGED
|
@@ -12,7 +12,11 @@ import { API_PAGES_PATH, OPENAPI_PATH } from "./api/paths.ts";
|
|
|
12
12
|
import { downlevelComponents } from "./component-markdown.ts";
|
|
13
13
|
import { relativeLinkRewriter } from "./relative-links.ts";
|
|
14
14
|
import { projectComponentSerializers } from "./serializers.ts";
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
AGENT_SKILLS_DIR,
|
|
17
|
+
AGENT_SKILLS_INDEX_PATH,
|
|
18
|
+
servesSkillsIndex,
|
|
19
|
+
} from "./skills.ts";
|
|
16
20
|
import type { SkillArtifact } from "./skills.ts";
|
|
17
21
|
import { applyAgentVisibility } from "./visibility.ts";
|
|
18
22
|
|
|
@@ -75,7 +79,7 @@ const agentResourceLines = (project: BlumeProject): string[] => {
|
|
|
75
79
|
`- [MCP server](${url(config.agents.mcp.route)}): Streamable HTTP Model Context Protocol server with search_docs, get_page, list_pages, and get_navigation tools, plus every page as a resource. Discovery document: ${url("/.well-known/mcp.json")}`
|
|
76
80
|
);
|
|
77
81
|
}
|
|
78
|
-
if (config
|
|
82
|
+
if (servesSkillsIndex(config)) {
|
|
79
83
|
lines.push(
|
|
80
84
|
`- [Agent skills](${url(AGENT_SKILLS_INDEX_PATH)}): Agent Skills discovery index of the skills this site publishes.`
|
|
81
85
|
);
|
package/src/ai/markdown.ts
CHANGED
|
@@ -14,6 +14,7 @@ import { downlevelComponents } from "./component-markdown.ts";
|
|
|
14
14
|
import { buildLlmsIndex } from "./llms.ts";
|
|
15
15
|
import { relativeLinkRewriter } from "./relative-links.ts";
|
|
16
16
|
import { projectComponentSerializers } from "./serializers.ts";
|
|
17
|
+
import { servesSkillsIndex } from "./skills.ts";
|
|
17
18
|
import { applyAgentVisibility } from "./visibility.ts";
|
|
18
19
|
|
|
19
20
|
/** One route's raw-Markdown variants. */
|
|
@@ -115,7 +116,7 @@ export const buildRawMarkdown = async (
|
|
|
115
116
|
config: advertisedConfig(project.config, {
|
|
116
117
|
mcp: servesMcp(project, userPages),
|
|
117
118
|
// Skills are collected at the end of the build, after this runs.
|
|
118
|
-
skills:
|
|
119
|
+
skills: servesSkillsIndex(project.config),
|
|
119
120
|
}),
|
|
120
121
|
}),
|
|
121
122
|
};
|
package/src/ai/mcp/data.ts
CHANGED
|
@@ -130,6 +130,12 @@ export const buildMcpData = async (project: BlumeProject): Promise<McpData> => {
|
|
|
130
130
|
if (doc.facets) {
|
|
131
131
|
document.facets = doc.facets;
|
|
132
132
|
}
|
|
133
|
+
if (doc.boost !== undefined) {
|
|
134
|
+
document.boost = doc.boost;
|
|
135
|
+
}
|
|
136
|
+
if (doc.keywords) {
|
|
137
|
+
document.keywords = doc.keywords;
|
|
138
|
+
}
|
|
133
139
|
return document;
|
|
134
140
|
}),
|
|
135
141
|
instructions: config.agents.mcp.instructions,
|
package/src/ai/mcp/query.ts
CHANGED
|
@@ -53,20 +53,28 @@ const contentTypesField = z.preprocess((value) => {
|
|
|
53
53
|
}, z.array(z.string()).optional().describe('Only include pages of these content types (frontmatter `type`, e.g. `["doc", "rfc"]`). `list_pages` shows each page\'s type. Omit to include every type.'));
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
|
-
* The optional facet filter `search_docs` and `list_pages` share.
|
|
57
|
-
*
|
|
56
|
+
* The optional facet filter `search_docs` and `list_pages` share. A value
|
|
57
|
+
* is read the way `pageFacets` stores one: a string as-is, a number or
|
|
58
|
+
* boolean stringified (`{"priority": 1}` matches the facet `"1"`). Entries of
|
|
59
|
+
* any other shape are dropped; an empty `{}` means "no filter".
|
|
58
60
|
*/
|
|
59
|
-
/** Accepts any plain object, so the
|
|
61
|
+
/** Accepts any plain object, so the usable entries can be sifted out. */
|
|
60
62
|
const looseFacetObject = z.record(z.string(), z.unknown());
|
|
61
63
|
|
|
64
|
+
/** A filter value a facet can hold, stringified like `pageFacets` does. */
|
|
65
|
+
const facetFilterValue = z
|
|
66
|
+
.union([z.string(), z.number(), z.boolean()])
|
|
67
|
+
.transform(String);
|
|
68
|
+
|
|
62
69
|
const filtersField = z.preprocess((value) => {
|
|
63
70
|
const candidate = looseFacetObject.safeParse(value);
|
|
64
71
|
if (!candidate.success) {
|
|
65
72
|
return;
|
|
66
73
|
}
|
|
67
|
-
const entries = Object.entries(candidate.data).
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
const entries = Object.entries(candidate.data).flatMap(([key, entry]) => {
|
|
75
|
+
const parsed = facetFilterValue.safeParse(entry);
|
|
76
|
+
return parsed.success ? [[key, parsed.data] as const] : [];
|
|
77
|
+
});
|
|
70
78
|
return entries.length > 0 ? Object.fromEntries(entries) : undefined;
|
|
71
79
|
}, z.record(z.string(), z.string()).optional().describe('Only include pages matching every facet, key → required value (e.g. `{"status": "enforced"}`). Facets are metadata the site declares per content type; `list_pages` shows each page\'s facet values. Omit for no facet filtering.'));
|
|
72
80
|
|
|
@@ -1,13 +1,24 @@
|
|
|
1
|
+
import { customCodeSamples } from "../components/openapi/code-samples.ts";
|
|
1
2
|
import { mountBasePath, normalizeBasePath } from "../core/base-path.ts";
|
|
2
3
|
import type { ApiOperationRef, OpenApiData } from "../openapi/model.ts";
|
|
3
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
operationObject,
|
|
6
|
+
operationOf,
|
|
7
|
+
specAddresses,
|
|
8
|
+
specOf,
|
|
9
|
+
} from "../openapi/model.ts";
|
|
4
10
|
import { asSentence } from "../openapi/sentence.ts";
|
|
5
11
|
import { operationSignature } from "../openapi/signature.ts";
|
|
6
12
|
import type {
|
|
7
13
|
ComponentMarkdown,
|
|
8
14
|
EvaluatedValue,
|
|
9
15
|
} from "./component-markdown.ts";
|
|
10
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
fencedBlock,
|
|
18
|
+
inlineCode,
|
|
19
|
+
isString,
|
|
20
|
+
linkDestination,
|
|
21
|
+
} from "./component-markdown.ts";
|
|
11
22
|
|
|
12
23
|
/**
|
|
13
24
|
* Spec-authored prose as one line of inline Markdown. Unlike the props the
|
|
@@ -62,7 +73,10 @@ const listItem = (
|
|
|
62
73
|
* section shows. Parameters, schemas and responses are deliberately left out:
|
|
63
74
|
* those are `operation-model.ts` plus each component's own preparation, and a
|
|
64
75
|
* second implementation here would be free to disagree with the page. The
|
|
65
|
-
* endpoint and what it does is the part that was missing altogether.
|
|
76
|
+
* endpoint and what it does is the part that was missing altogether. The
|
|
77
|
+
* spec's own `x-codeSamples` do come along, as fenced code: they're text the
|
|
78
|
+
* spec wrote out (often an SDK call no agent could derive from the
|
|
79
|
+
* endpoint), read through the same `customCodeSamples` the page renders.
|
|
66
80
|
*
|
|
67
81
|
* `specs` is the parsed `blume:openapi` data — empty when the project has no
|
|
68
82
|
* API reference, in which case every serializer declines. `deployBase` is the
|
|
@@ -134,9 +148,25 @@ export const openapiComponentSerializers = (
|
|
|
134
148
|
return null;
|
|
135
149
|
}
|
|
136
150
|
const signature = inlineCode(operationSignature(data, operation));
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
151
|
+
const notes = [
|
|
152
|
+
// An agent reading the page must not take a webhook for an endpoint
|
|
153
|
+
// it can call.
|
|
154
|
+
operation.webhook
|
|
155
|
+
? "**Webhook.** The API sends this request to your endpoint."
|
|
156
|
+
: "",
|
|
157
|
+
operation.deprecated ? "**Deprecated.**" : "",
|
|
158
|
+
].filter(Boolean);
|
|
159
|
+
// The spec's own `x-codeSamples`, labeled as their tabs are.
|
|
160
|
+
const object =
|
|
161
|
+
data.kind === "openapi" ? operationObject(data, operation) : undefined;
|
|
162
|
+
const samples = customCodeSamples({
|
|
163
|
+
"x-code-samples": object?.["x-code-samples"],
|
|
164
|
+
"x-codeSamples": object?.["x-codeSamples"],
|
|
165
|
+
}).map(
|
|
166
|
+
(sample) =>
|
|
167
|
+
`**${inlineText(sample.label)}**\n\n${fencedBlock(sample.lang, sample.source)}`
|
|
168
|
+
);
|
|
169
|
+
return [signature, ...notes, ...samples].join("\n\n");
|
|
140
170
|
},
|
|
141
171
|
} satisfies Record<string, ComponentMarkdown>;
|
|
142
172
|
};
|
package/src/ai/relative-links.ts
CHANGED
|
@@ -7,8 +7,6 @@ import {
|
|
|
7
7
|
withAuthoredBasePath,
|
|
8
8
|
withBasePath,
|
|
9
9
|
} from "../core/base-path.ts";
|
|
10
|
-
import { nextFenceState } from "../core/code-fences.ts";
|
|
11
|
-
import type { FenceState } from "../core/code-fences.ts";
|
|
12
10
|
import { localePrefix } from "../core/i18n.ts";
|
|
13
11
|
import {
|
|
14
12
|
buildFileRouteIndex,
|
|
@@ -49,10 +47,6 @@ export interface LinkedPage {
|
|
|
49
47
|
/** Rewrite a page's relative page links to the routes they mean. */
|
|
50
48
|
export type RelativeLinkRewriter = (text: string, page: LinkedPage) => string;
|
|
51
49
|
|
|
52
|
-
/** A reference definition's target: `[label]: ./install` or `<./install>`. */
|
|
53
|
-
const DEFINITION =
|
|
54
|
-
/^(?<lead> {0,3}\[(?:[^\]\\]|\\.)+\]:[\t ]*)(?:<(?<angled>[^>]*)>|(?<bare>\S+))/u;
|
|
55
|
-
|
|
56
50
|
/**
|
|
57
51
|
* Whether a text could hold a relative page link at all: an inline link, a
|
|
58
52
|
* reference definition, or a component `href` whose target isn't a URL with
|
|
@@ -88,31 +82,13 @@ const spliceLine = (line: string, splices: readonly Splice[]): string => {
|
|
|
88
82
|
return out;
|
|
89
83
|
};
|
|
90
84
|
|
|
91
|
-
/** One line's reference-definition splice, when it defines a routed target. */
|
|
92
|
-
const definitionSplice = (
|
|
93
|
-
line: string,
|
|
94
|
-
routed: (target: string) => string | undefined
|
|
95
|
-
): Splice | undefined => {
|
|
96
|
-
const groups = DEFINITION.exec(line)?.groups;
|
|
97
|
-
const lead = groups?.lead;
|
|
98
|
-
const target = groups?.angled ?? groups?.bare;
|
|
99
|
-
const route = target === undefined ? undefined : routed(target);
|
|
100
|
-
if (lead === undefined || target === undefined || route === undefined) {
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
|
103
|
-
// An angle-bracketed target starts one past its `<`.
|
|
104
|
-
const angled = groups?.angled === undefined ? 0 : 1;
|
|
105
|
-
return { column: lead.length + angled, length: target.length, text: route };
|
|
106
|
-
};
|
|
107
|
-
|
|
108
85
|
/**
|
|
109
|
-
* Every routed splice in `text`, by 0-based line: links
|
|
110
|
-
* definitions. An image target goes
|
|
111
|
-
* `routed`.
|
|
86
|
+
* Every routed splice in `text`, by 0-based line: links, images, and
|
|
87
|
+
* reference definitions, as `extractLinks` finds them. An image target goes
|
|
88
|
+
* through `imaged`, everything else through `routed`.
|
|
112
89
|
*/
|
|
113
90
|
const collectSplices = (
|
|
114
91
|
text: string,
|
|
115
|
-
lines: readonly string[],
|
|
116
92
|
routed: (target: string) => string | undefined,
|
|
117
93
|
imaged: (target: string) => string | undefined
|
|
118
94
|
): Map<number, Splice[]> => {
|
|
@@ -130,16 +106,6 @@ const collectSplices = (
|
|
|
130
106
|
});
|
|
131
107
|
}
|
|
132
108
|
}
|
|
133
|
-
let fence: FenceState = null;
|
|
134
|
-
for (const [index, line] of lines.entries()) {
|
|
135
|
-
const next = nextFenceState(line, fence);
|
|
136
|
-
const inFence = fence !== null || next !== null;
|
|
137
|
-
fence = next;
|
|
138
|
-
const splice = inFence ? undefined : definitionSplice(line, routed);
|
|
139
|
-
if (splice !== undefined) {
|
|
140
|
-
add(index, splice);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
109
|
return splices;
|
|
144
110
|
};
|
|
145
111
|
|
|
@@ -242,7 +208,7 @@ export const relativeLinkRewriter = (
|
|
|
242
208
|
};
|
|
243
209
|
|
|
244
210
|
const lines = text.split("\n");
|
|
245
|
-
const splices = collectSplices(text,
|
|
211
|
+
const splices = collectSplices(text, routed, imaged);
|
|
246
212
|
|
|
247
213
|
return lines
|
|
248
214
|
.map((line, index) => {
|