@blaaiz/docs-core 0.7.1 → 0.7.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/ai/models.ts","../src/core/ai/config.ts","../src/core/rate-limit.ts","../src/core/search.ts","../src/core/ai/prompt.ts","../src/core/ai/providers/error.ts","../src/core/ai/providers/sse.ts","../src/core/ai/providers/anthropic.ts","../src/core/ai/providers/openai.ts","../src/core/ai/retrieval.ts","../src/core/ai/route.ts","../src/core/config.ts","../src/core/theme.ts","../src/core/redirects.ts","../src/core/llms-txt.ts","../src/core/code-samples.ts","../src/core/seo.ts","../src/core/docs-tree.ts","../src/core/openapi-markdown.ts","../src/core/markdown.ts","../src/core/auth/domains.ts","../src/core/auth/session.ts","../src/core/auth/email-provider.ts","../src/core/auth/google-provider.ts","../src/core/auth/gate.ts","../src/core/auth/secret-provider.ts","../src/core/auth/signout.ts","../src/core/auth/site-auth.ts","../src/core/proxy.ts","../src/adapters/docs-json/parse-navigation.ts","../src/adapters/openapi/merge-documents.ts"],"names":["decoder","PROVIDER_LABEL","requestBody","textDelta","errorMessage","encoder","describe","cookie","DEFAULT_TTL_SECONDS","readCookie","safeRedirectPath","headers","DEFAULT_RATE_LIMIT_PER_MINUTE","jsonResponse","isRecord","HTTP_METHODS"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * The curated model registry.\n *\n * A docs site names a provider, and optionally a model. The framework — not the\n * site — owns which models are known good for grounded documentation answers,\n * which one is the default, and which environment variable holds the key. A\n * short allow-list is deliberate: an unknown or retired model id must fail with\n * a readable error at startup, not with a provider `404` on a reader's first\n * question.\n *\n * The lists grow as providers ship models. Adding one is a one-line change here.\n *\n * @packageDocumentation\n */\n\n/**\n * The AI providers `docs-core` speaks to.\n *\n * @public\n */\nexport type AiProviderName = 'anthropic' | 'openai';\n\n/**\n * What the framework knows about one provider: the models it accepts, the model\n * it picks when a site names none, and the environment variable it reads the API\n * key from by default.\n *\n * @public\n */\nexport interface AiProviderModels {\n /** Model used when `ai.model` is omitted. */\n readonly defaultModel: string;\n /** Exhaustive list of accepted model ids, best-first for documentation. */\n readonly models: readonly string[];\n /** Env var read when `ai.apiKeyEnv` is omitted. */\n readonly defaultApiKeyEnv: string;\n}\n\n/**\n * Every provider name, in a stable order — for error messages and docs tables.\n *\n * @public\n */\nexport const AI_PROVIDER_NAMES: readonly AiProviderName[] = Object.freeze([\n 'anthropic',\n 'openai',\n] as const);\n\n/**\n * The curated registry, keyed by provider.\n *\n * @public\n */\nexport const AI_PROVIDER_MODELS: Readonly<Record<AiProviderName, AiProviderModels>> = Object.freeze(\n {\n anthropic: Object.freeze({\n defaultModel: 'claude-sonnet-5',\n models: Object.freeze([\n 'claude-sonnet-5',\n 'claude-haiku-4-5',\n 'claude-opus-5',\n 'claude-opus-4-8',\n 'claude-sonnet-4-6',\n ] as const),\n defaultApiKeyEnv: 'ANTHROPIC_API_KEY',\n }),\n openai: Object.freeze({\n defaultModel: 'gpt-5-mini',\n models: Object.freeze([\n 'gpt-5-mini',\n 'gpt-5',\n 'gpt-5.2',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4.1-mini',\n 'gpt-4o',\n 'gpt-4o-mini',\n ] as const),\n defaultApiKeyEnv: 'OPENAI_API_KEY',\n }),\n },\n);\n\n/**\n * Narrow an unvalidated value to a known provider name.\n *\n * @param value - a value from site configuration\n * @returns `true` when the value names a provider the framework supports\n */\nexport function isAiProviderName(value: unknown): value is AiProviderName {\n return typeof value === 'string' && AI_PROVIDER_NAMES.includes(value as AiProviderName);\n}\n\n/**\n * Test a model id against a provider's allow-list.\n *\n * @param provider - the provider the model belongs to\n * @param model - the model id from site configuration\n * @returns `true` when the provider accepts the model\n */\nexport function isAllowedAiModel(provider: AiProviderName, model: string): boolean {\n return AI_PROVIDER_MODELS[provider].models.includes(model);\n}\n","/**\n * The Ask AI configuration boundary.\n *\n * A site declares `ai: { provider: 'anthropic' }` and is done: every other\n * field has a framework default. That convenience only works if the boundary is\n * strict, so this module validates each field and fails with a message that\n * names the field, the value it received, and the accepted values. Nothing\n * downstream re-checks: {@link resolveAiConfig} is the single gate, and it runs\n * when the route is built, not when a reader asks a question.\n *\n * Secrets never appear here. Config names the environment variable; the server\n * reads the value at request time.\n *\n * @packageDocumentation\n */\n\nimport {\n AI_PROVIDER_MODELS,\n AI_PROVIDER_NAMES,\n type AiProviderName,\n isAiProviderName,\n isAllowedAiModel,\n} from './models.js';\n\nconst DEFAULT_RATE_LIMIT_PER_MINUTE = 10;\nconst DEFAULT_MAX_CONTEXT_PAGES = 6;\n\nconst MIN_RATE_LIMIT_PER_MINUTE = 1;\nconst MAX_RATE_LIMIT_PER_MINUTE = 600;\nconst MIN_MAX_CONTEXT_PAGES = 1;\nconst MAX_MAX_CONTEXT_PAGES = 20;\nconst MAX_SYSTEM_PROMPT_CHARS = 4000;\n\n/**\n * The Ask AI settings a site supplies. Only `provider` is required.\n *\n * @public\n */\nexport interface AiConfig {\n /** Which provider answers questions. */\n readonly provider: AiProviderName;\n /** Model id, validated against the provider's allow-list. Provider default when omitted. */\n readonly model?: string;\n /** Env var holding the API key. Provider default when omitted (e.g. `ANTHROPIC_API_KEY`). */\n readonly apiKeyEnv?: string;\n /** Questions per minute per client IP. Default 10. Always enforced. */\n readonly rateLimitPerMinute?: number;\n /** How many documentation pages are retrieved per question. Default 6. */\n readonly maxContextPages?: number;\n /** Extra instructions appended to the framework's grounded system prompt. */\n readonly systemPrompt?: string;\n}\n\n/**\n * An {@link AiConfig} with every default filled in and every value checked.\n * Frozen, so a caller cannot mutate a validated configuration.\n *\n * @public\n */\nexport interface ResolvedAiConfig {\n readonly provider: AiProviderName;\n readonly model: string;\n /** The env var the server reads the key from. */\n readonly apiKeyEnv: string;\n /** The provider's default env var, for error messages and documentation. */\n readonly defaultApiKeyEnv: string;\n readonly rateLimitPerMinute: number;\n readonly maxContextPages: number;\n /** Present only when the site supplied extra instructions. */\n readonly systemPrompt?: string;\n}\n\n/**\n * Thrown when `ai` configuration is missing, malformed, or out of range. The\n * message names the exact field and the accepted values.\n *\n * @public\n */\nexport class AiConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'AiConfigError';\n }\n}\n\n/** Render an untrusted value for an error message: quoted when it is a string. */\nfunction describe(value: unknown): string {\n if (typeof value === 'string') {\n return `'${value}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || value === null) {\n return String(value);\n }\n if (value === undefined) {\n return 'undefined';\n }\n return Array.isArray(value) ? 'an array' : `a ${typeof value}`;\n}\n\nfunction quoteList(values: readonly string[]): string {\n return values.map((value) => `'${value}'`).join(', ');\n}\n\nfunction requireOptionalString(value: unknown, field: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'string' || value.trim() === '') {\n throw new AiConfigError(\n `${field} must be a non-empty string, got ${describe(value)}. Remove the field to use the default.`,\n );\n }\n return value.trim();\n}\n\nfunction requireOptionalIntegerInRange(\n value: unknown,\n field: string,\n min: number,\n max: number,\n fallback: number,\n): number {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== 'number' || !Number.isInteger(value) || value < min || value > max) {\n throw new AiConfigError(\n `${field} must be an integer between ${String(min)} and ${String(max)}, got ${describe(value)}.`,\n );\n }\n return value;\n}\n\n/**\n * Validate a site's `ai` configuration and fill in the framework defaults.\n *\n * Call it once, when the route is built. It throws rather than returning an\n * error object so a misconfigured site fails at startup — a reader must never\n * discover a typo in `docs.config.ts` by asking a question.\n *\n * @param config - the raw `ai` block from a site's configuration\n * @returns the frozen, fully defaulted configuration\n * @throws {@link AiConfigError} when any field is missing, malformed, or out of range\n * @public\n */\nexport function resolveAiConfig(config: AiConfig): ResolvedAiConfig {\n // Typed as `AiConfig`, but a site's config file may be JavaScript, or built\n // from JSON, so treat the input as unknown and check it properly.\n const candidate: unknown = config;\n if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)) {\n throw new AiConfigError(\n `ai must be an object, got ${describe(candidate)}. Example: ai: { provider: 'anthropic' }.`,\n );\n }\n\n const raw = candidate as Record<string, unknown>;\n\n const provider: unknown = raw['provider'];\n if (!isAiProviderName(provider)) {\n throw new AiConfigError(\n `ai.provider must be one of ${quoteList(AI_PROVIDER_NAMES)}, got ${describe(provider)}.`,\n );\n }\n\n const registry = AI_PROVIDER_MODELS[provider];\n\n const model = requireOptionalString(raw['model'], 'ai.model') ?? registry.defaultModel;\n if (!isAllowedAiModel(provider, model)) {\n throw new AiConfigError(\n `ai.model must be one of ${quoteList(registry.models)} for provider '${provider}', got ${describe(model)}.`,\n );\n }\n\n const apiKeyEnv =\n requireOptionalString(raw['apiKeyEnv'], 'ai.apiKeyEnv') ?? registry.defaultApiKeyEnv;\n\n const rateLimitPerMinute = requireOptionalIntegerInRange(\n raw['rateLimitPerMinute'],\n 'ai.rateLimitPerMinute',\n MIN_RATE_LIMIT_PER_MINUTE,\n MAX_RATE_LIMIT_PER_MINUTE,\n DEFAULT_RATE_LIMIT_PER_MINUTE,\n );\n\n const maxContextPages = requireOptionalIntegerInRange(\n raw['maxContextPages'],\n 'ai.maxContextPages',\n MIN_MAX_CONTEXT_PAGES,\n MAX_MAX_CONTEXT_PAGES,\n DEFAULT_MAX_CONTEXT_PAGES,\n );\n\n const systemPrompt: unknown = raw['systemPrompt'];\n if (systemPrompt !== undefined) {\n if (typeof systemPrompt !== 'string') {\n throw new AiConfigError(`ai.systemPrompt must be a string, got ${describe(systemPrompt)}.`);\n }\n if (systemPrompt.length > MAX_SYSTEM_PROMPT_CHARS) {\n throw new AiConfigError(\n `ai.systemPrompt must be ${String(MAX_SYSTEM_PROMPT_CHARS)} characters or fewer, got ${String(systemPrompt.length)}.`,\n );\n }\n }\n const trimmedPrompt = typeof systemPrompt === 'string' ? systemPrompt.trim() : '';\n\n return Object.freeze({\n provider,\n model,\n apiKeyEnv,\n defaultApiKeyEnv: registry.defaultApiKeyEnv,\n rateLimitPerMinute,\n maxContextPages,\n ...(trimmedPrompt === '' ? {} : { systemPrompt: trimmedPrompt }),\n });\n}\n","/**\n * A sliding-window rate limiter, shared by every route the framework builds.\n *\n * Two routes cost a site real money at somebody else's server: an Ask AI\n * question at a model provider, and a try-it request at the site's own API. Both\n * are limited by this module, with the same window, the same client key, and the\n * same `429` shape, so a reader gets one consistent answer wherever the limit\n * bites.\n *\n * The window slides — it holds the timestamps of recent requests rather than\n * counting into fixed buckets — so a caller cannot get double the allowance by\n * straddling a bucket edge.\n *\n * State is in memory, per instance. On one long-lived server that is exactly\n * right. Across several instances or a serverless fleet each instance keeps its\n * own window, so the effective limit multiplies by the instance count; a site\n * that needs a shared limit should put one in front of the route.\n *\n * @packageDocumentation\n */\n\n/** Sweep stale keys once the map grows past this, so it cannot leak memory. */\nconst SWEEP_THRESHOLD = 5000;\n\n/** One minute — the window every framework route limits over. */\nexport const RATE_LIMIT_WINDOW_MS = 60_000;\n\n/**\n * The rate-limit key for one request: the client IP as the edge reported it.\n *\n * `x-forwarded-for` is the standard header and holds a chain, so the first\n * entry — the original client — is the one that identifies the caller. Some\n * proxies send only `x-real-ip`, so that is the fallback. With neither header\n * every caller shares the key `'unknown'`, which is correct behind a\n * header-less proxy and on a local dev server: one shared bucket is a limit,\n * not a bypass.\n *\n * @param request - the incoming request\n * @returns the client key, never empty\n */\nexport function clientRateLimitKey(request: Request): string {\n const forwarded = request.headers.get('x-forwarded-for');\n const first = forwarded?.split(',')[0]?.trim() ?? '';\n if (first !== '') {\n return first;\n }\n const realIp = request.headers.get('x-real-ip')?.trim() ?? '';\n return realIp === '' ? 'unknown' : realIp;\n}\n\n/**\n * The verdict for one request.\n */\nexport interface RateLimitDecision {\n readonly allowed: boolean;\n /** Whole seconds until the caller may retry. Present only when refused. */\n readonly retryAfterSeconds?: number;\n}\n\n/**\n * A keyed rate limiter.\n */\nexport interface RateLimiter {\n /**\n * Record an attempt for `key` and decide it. An allowed attempt is counted; a\n * refused one is not, so a caller cannot extend their own penalty by retrying.\n */\n allow(key: string): RateLimitDecision;\n}\n\n/**\n * Options for {@link createRateLimiter}.\n */\nexport interface CreateRateLimiterOptions {\n /** Attempts allowed per key per window. Must be a positive integer. */\n readonly limit: number;\n /** Window length in milliseconds. */\n readonly windowMs: number;\n /** Clock, for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\n/**\n * Build an in-memory sliding-window limiter.\n *\n * @param options - the limit, the window, and an optional clock\n * @returns the limiter\n */\nexport function createRateLimiter(options: CreateRateLimiterOptions): RateLimiter {\n const now = options.now ?? (() => Date.now());\n const hits = new Map<string, number[]>();\n\n /** Drop timestamps that have left the window. */\n function prune(timestamps: readonly number[], cutoff: number): number[] {\n return timestamps.filter((at) => at > cutoff);\n }\n\n function sweep(cutoff: number): void {\n for (const [key, timestamps] of hits) {\n const fresh = prune(timestamps, cutoff);\n if (fresh.length === 0) {\n hits.delete(key);\n } else {\n hits.set(key, fresh);\n }\n }\n }\n\n return {\n allow(key: string): RateLimitDecision {\n const at = now();\n const cutoff = at - options.windowMs;\n\n if (hits.size > SWEEP_THRESHOLD) {\n sweep(cutoff);\n }\n\n const timestamps = prune(hits.get(key) ?? [], cutoff);\n\n if (timestamps.length >= options.limit) {\n hits.set(key, timestamps);\n const oldest = timestamps[0] ?? at;\n const waitMs = oldest + options.windowMs - at;\n return { allowed: false, retryAfterSeconds: Math.max(1, Math.ceil(waitMs / 1000)) };\n }\n\n timestamps.push(at);\n hits.set(key, timestamps);\n return { allowed: true };\n },\n };\n}\n","/**\n * Lightweight client-shippable search.\n *\n * The framework builds a compact term index from a site's pages and scores\n * queries against it with BM25: term frequency, inverse document frequency,\n * and document-length normalization. IDF is what keeps ranking honest — a\n * word that appears in every page (\"how\", \"the\", \"a\") carries almost no\n * weight, so a query like \"how do I deploy\" is decided by \"deploy\", not by\n * its stopwords. A light, symmetric stemmer is applied to both the index and\n * the query, so \"wallets\" finds \"wallet\" and \"authentication\" finds\n * \"authenticate\".\n *\n * It is intentionally simple — good for the hundreds-to-low-thousands of\n * pages a docs site has — and ships to the browser as plain JSON, so search\n * needs no server round-trip. A site provides the input UI.\n *\n * @packageDocumentation\n */\n\n/**\n * A page to index.\n *\n * @public\n */\nexport interface SearchDocument {\n readonly id: string;\n readonly title: string;\n readonly path: string;\n /** Optional grouping label, e.g. the section or tab name. */\n readonly section?: string;\n /** Free text to index (body, description). Not retained in the index. */\n readonly body?: string;\n}\n\n/**\n * One indexed page. Part of the serialized {@link SearchIndex} wire format.\n *\n * @public\n */\nexport interface IndexedDocument {\n readonly id: string;\n readonly title: string;\n readonly path: string;\n readonly section?: string;\n /** Stemmed term → occurrence count across title, section, and body. */\n readonly terms: Readonly<Record<string, number>>;\n /** Total token count, for length normalization. */\n readonly length: number;\n /** The title's stemmed terms, precomputed for the per-query title bonus. */\n readonly titleTerms: readonly string[];\n /** The section label's stemmed terms, when a section is set. */\n readonly sectionTerms?: readonly string[];\n}\n\n/**\n * A built, serializable search index.\n *\n * @public\n */\nexport interface SearchIndex {\n readonly documents: readonly IndexedDocument[];\n /** Stemmed term → number of documents containing it. */\n readonly documentFrequency: Readonly<Record<string, number>>;\n /** Every indexed term, sorted, for binary-searched prefix matching. */\n readonly vocabulary: readonly string[];\n /** Mean token count per document, for length normalization. */\n readonly averageLength: number;\n}\n\n/**\n * A ranked search hit.\n *\n * @public\n */\nexport interface SearchResult {\n readonly id: string;\n readonly title: string;\n readonly path: string;\n readonly section?: string;\n readonly score: number;\n}\n\n/** BM25 term-frequency saturation. */\nconst K1 = 1.2;\n/** BM25 length-normalization strength. */\nconst B = 0.75;\n/** Extra weight for a query term that appears in the title, as a whole token. */\nconst TITLE_BONUS = 1.0;\n/** Extra weight for a query term that appears in the section label. */\nconst SECTION_BONUS = 0.5;\n/** A prefix match is worth this fraction of an exact term match. */\nconst PREFIX_WEIGHT = 0.4;\n\n/**\n * Query words that carry no topical signal. They stay in the index (IDF\n * already attenuates them) but are dropped from queries — unless the whole\n * query is stopwords, in which case they are kept so short conversational\n * queries still return something.\n */\nconst STOPWORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'are',\n 'as',\n 'at',\n 'be',\n 'but',\n 'by',\n 'can',\n 'do',\n 'does',\n 'for',\n 'from',\n 'get',\n 'has',\n 'have',\n 'how',\n 'i',\n 'if',\n 'in',\n 'is',\n 'it',\n 'its',\n 'me',\n 'my',\n 'need',\n 'no',\n 'not',\n 'of',\n 'on',\n 'or',\n 'our',\n 'should',\n 'so',\n 'that',\n 'the',\n 'their',\n 'then',\n 'there',\n 'these',\n 'they',\n 'this',\n 'to',\n 'up',\n 'us',\n 'want',\n 'was',\n 'we',\n 'what',\n 'when',\n 'where',\n 'which',\n 'who',\n 'why',\n 'will',\n 'with',\n 'would',\n 'you',\n 'your',\n]);\n\n/** A doubled final consonant left by an -ing/-ed strip: `runn`, `sett`. */\nconst DOUBLED_CONSONANT = /([bcdfghjklmnpqrstvz])\\1$/;\n\n/**\n * A light, symmetric stemmer — deliberately not a full Porter stemmer. Its\n * rules, in order: plural folding (`-ies`, `-es` after a sibilant, `-s`),\n * `-ing`/`-ed` with doubled-consonant repair, `-ation` → `-ate`, a full\n * `-ate` strip on long stems, and a final `-e` strip on words of five letters\n * or more (which is what folds `response`/`responses` and `create`/\n * `creating`). It over-stems occasionally (`operate` and `operation` meet at\n * `oper`); that trades a little precision for recall, and because the same\n * function runs at index time and query time, symmetry — not linguistic\n * perfection — is what correctness rests on.\n */\nfunction stem(token: string): string {\n let word = token;\n if (word.length >= 5 && word.endsWith('ies')) {\n word = `${word.slice(0, -3)}y`;\n } else if (word.length >= 5 && /(?:ss|sh|ch|x|z)es$/.test(word)) {\n word = word.slice(0, -2);\n } else if (\n word.length >= 4 &&\n word.endsWith('s') &&\n !word.endsWith('ss') &&\n !word.endsWith('us') &&\n // Protect -is singulars (analysis, basis), but only long ones: a short\n // word ending in -is is far more likely a plural like `apis` or `uris`.\n !(word.endsWith('is') && word.length >= 6)\n ) {\n word = word.slice(0, -1);\n }\n if (word.length >= 6 && word.endsWith('ing')) {\n word = word.slice(0, -3).replace(DOUBLED_CONSONANT, '$1');\n } else if (word.length >= 5 && word.endsWith('ed')) {\n word = word.slice(0, -2).replace(DOUBLED_CONSONANT, '$1');\n }\n if (word.length >= 7 && word.endsWith('ation')) {\n word = `${word.slice(0, -5)}ate`;\n }\n if (word.length >= 7 && word.endsWith('ate')) {\n word = word.slice(0, -3);\n }\n if (word.length >= 5 && word.endsWith('e')) {\n word = word.slice(0, -1);\n }\n return word;\n}\n\nfunction tokenize(text: string): string[] {\n return text.toLowerCase().match(/[a-z0-9]+/g) ?? [];\n}\n\nfunction stemmedTokens(text: string): string[] {\n return tokenize(text).map(stem);\n}\n\n/**\n * Build a search index from a list of documents.\n *\n * @public\n */\nexport function buildSearchIndex(documents: readonly SearchDocument[]): SearchIndex {\n const documentFrequency: Record<string, number> = {};\n let totalLength = 0;\n\n const indexed = documents.map((doc) => {\n const tokens = stemmedTokens(`${doc.title} ${doc.section ?? ''} ${doc.body ?? ''}`);\n const terms: Record<string, number> = {};\n for (const token of tokens) {\n terms[token] = (terms[token] ?? 0) + 1;\n }\n for (const term of Object.keys(terms)) {\n documentFrequency[term] = (documentFrequency[term] ?? 0) + 1;\n }\n totalLength += tokens.length;\n return {\n id: doc.id,\n title: doc.title,\n path: doc.path,\n terms,\n length: tokens.length,\n titleTerms: [...new Set(stemmedTokens(doc.title))],\n ...(doc.section !== undefined\n ? { section: doc.section, sectionTerms: [...new Set(stemmedTokens(doc.section))] }\n : {}),\n };\n });\n\n return {\n documents: indexed,\n documentFrequency,\n vocabulary: Object.keys(documentFrequency).sort(),\n averageLength: indexed.length > 0 ? totalLength / indexed.length : 0,\n };\n}\n\n/** Robertson–Sparck Jones IDF, floored at a small positive value. */\nfunction inverseDocumentFrequency(documentCount: number, withTerm: number): number {\n return Math.max(0.05, Math.log(1 + (documentCount - withTerm + 0.5) / (withTerm + 0.5)));\n}\n\n/** Query terms after stopword removal — all of them when nothing survives. */\nfunction queryTerms(query: string): string[] {\n const tokens = tokenize(query);\n const meaningful = tokens.filter((token) => !STOPWORDS.has(token) && token.length > 1);\n return (meaningful.length > 0 ? meaningful : tokens).map(stem);\n}\n\n/** Per-document term frequency and document frequency for one prefix term. */\ninterface PrefixStats {\n readonly frequencyByDocument: Map<number, number>;\n documentsWithPrefix: number;\n}\n\n/** The index of the first vocabulary entry >= `prefix` (binary search). */\nfunction lowerBound(vocabulary: readonly string[], prefix: string): number {\n let low = 0;\n let high = vocabulary.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n if ((vocabulary[mid] ?? '') < prefix) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n}\n\n/** Every indexed term starting with `prefix` — one contiguous, sorted range. */\nfunction termsWithPrefix(vocabulary: readonly string[], prefix: string): string[] {\n const matches: string[] = [];\n for (let at = lowerBound(vocabulary, prefix); at < vocabulary.length; at++) {\n const term = vocabulary[at] ?? '';\n if (!term.startsWith(prefix)) {\n break;\n }\n matches.push(term);\n }\n return matches;\n}\n\n/**\n * Term frequency and document frequency for every query term that matched no\n * indexed term exactly. The sorted vocabulary makes finding a prefix's terms\n * a binary search, so the cost per unmatched term is the handful of terms it\n * actually matches — not a scan of every term in every document.\n */\nfunction collectPrefixStats(\n index: SearchIndex,\n unmatchedTerms: readonly string[],\n): Map<string, PrefixStats> {\n const stats = new Map<string, PrefixStats>();\n for (const term of unmatchedTerms) {\n const matching = termsWithPrefix(index.vocabulary, term);\n const frequencyByDocument = new Map<number, number>();\n if (matching.length > 0) {\n index.documents.forEach((doc, position) => {\n let frequency = 0;\n for (const match of matching) {\n frequency += doc.terms[match] ?? 0;\n }\n if (frequency > 0) {\n frequencyByDocument.set(position, frequency);\n }\n });\n }\n stats.set(term, { frequencyByDocument, documentsWithPrefix: frequencyByDocument.size });\n }\n return stats;\n}\n\n/** Deterministic, locale-independent string order for tie-breaking. */\nfunction compareStrings(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * Search an index with BM25 scoring. Rare words dominate common ones, term\n * repetition saturates, long pages get no volume advantage, and a term that\n * also appears in the title (as a whole token, never a substring) or the\n * section label earns a bonus. A stemmed term that matches nothing exactly\n * falls back to prefix matching at reduced weight — including the title and\n * section bonuses, so a half-typed word still ranks the page it names first.\n * Ties break deterministically by title, then path, independent of locale.\n *\n * Returns up to `limit` results, best first.\n *\n * @public\n */\nexport function searchIndex(index: SearchIndex, query: string, limit = 8): SearchResult[] {\n const terms = queryTerms(query);\n if (terms.length === 0 || index.documents.length === 0) {\n return [];\n }\n const documentCount = index.documents.length;\n // A single character is exact-match only: as a prefix it matches a huge\n // slice of the vocabulary, which costs real time and carries no ranking\n // signal a keystroke later won't improve on.\n const unmatched = terms.filter(\n (term) => term.length >= 2 && (index.documentFrequency[term] ?? 0) === 0,\n );\n const prefixStats = unmatched.length > 0 ? collectPrefixStats(index, unmatched) : undefined;\n\n const results: SearchResult[] = [];\n index.documents.forEach((doc, position) => {\n const lengthNorm = 1 - B + B * (index.averageLength > 0 ? doc.length / index.averageLength : 1);\n\n let score = 0;\n for (const term of terms) {\n const exactDocuments = index.documentFrequency[term] ?? 0;\n let frequency: number;\n let idf: number;\n let weight: number;\n let inTitle: boolean;\n let inSection: boolean;\n if (exactDocuments > 0) {\n frequency = doc.terms[term] ?? 0;\n idf = inverseDocumentFrequency(documentCount, exactDocuments);\n weight = 1;\n inTitle = doc.titleTerms.includes(term);\n inSection = doc.sectionTerms?.includes(term) ?? false;\n } else {\n const stats = prefixStats?.get(term);\n if (stats === undefined || stats.documentsWithPrefix === 0) {\n continue;\n }\n frequency = stats.frequencyByDocument.get(position) ?? 0;\n idf = inverseDocumentFrequency(documentCount, stats.documentsWithPrefix);\n weight = PREFIX_WEIGHT;\n inTitle = doc.titleTerms.some((titleTerm) => titleTerm.startsWith(term));\n inSection = doc.sectionTerms?.some((sectionTerm) => sectionTerm.startsWith(term)) ?? false;\n }\n if (frequency > 0) {\n score += weight * idf * ((frequency * (K1 + 1)) / (frequency + K1 * lengthNorm));\n }\n if (inTitle) {\n score += weight * idf * TITLE_BONUS;\n }\n if (inSection) {\n score += weight * idf * SECTION_BONUS;\n }\n }\n if (score > 0) {\n results.push({\n id: doc.id,\n title: doc.title,\n path: doc.path,\n score,\n ...(doc.section !== undefined ? { section: doc.section } : {}),\n });\n }\n });\n\n results.sort(\n (a, b) =>\n b.score - a.score || compareStrings(a.title, b.title) || compareStrings(a.path, b.path),\n );\n return results.slice(0, limit);\n}\n","/**\n * The grounded system prompt.\n *\n * The prompt is the whole safety story of Ask AI: the model may answer only\n * from the pages the framework retrieved, and it must say so plainly when those\n * pages do not cover the question. A docs assistant that guesses an endpoint\n * name is worse than one that admits it does not know.\n *\n * Output is deterministic — the same site, pages, and instructions always build\n * the same string, in the same order, with nothing time-dependent — so the\n * prompt is safe to cache and simple to test.\n *\n * @packageDocumentation\n */\n\nimport type { ContextPage } from './retrieval.js';\n\n/**\n * Options for {@link buildSystemPrompt}.\n */\nexport interface BuildSystemPromptOptions {\n /** The site's display name, from `theme.name`. */\n readonly siteName: string;\n /** The retrieved pages, best first. May be empty. */\n readonly pages: readonly ContextPage[];\n /** Extra instructions from `ai.systemPrompt`, appended verbatim. */\n readonly extraInstructions?: string;\n}\n\nconst RULES: readonly string[] = [\n 'Answer only from the documentation below. Never use outside knowledge, and never guess.',\n 'When the documentation does not answer the question, say so plainly and name what is missing. Do not invent an answer.',\n 'Never invent a URL, an endpoint, a parameter, a field name, or a value. Copy them exactly from the documentation.',\n 'The pages are ordered best-match first. Prefer the most relevant page, but combine pages when the answer spans them — for example an endpoint page and its related guide.',\n 'The pages are re-retrieved for every question, so earlier turns in this conversation may have used pages that are not shown now. Never call an earlier answer wrong just because its page is absent here.',\n 'A page ending in [content truncated] has more on the site. If the answer may sit in the missing part, say so and point the reader to that page.',\n 'Be concise. Answer the question first, then add only the detail that matters.',\n 'Use Markdown: short paragraphs, lists where they help, and fenced code blocks for code.',\n 'Refer to a page by its title, in the sentence, where it helps the reader go deeper.',\n 'Reply in the language the reader used.',\n];\n\nfunction renderPage(page: ContextPage, position: number): string {\n return [\n `=== PAGE ${String(position)}: ${page.title} (${page.url}) ===`,\n page.markdown,\n `=== END PAGE ${String(position)} ===`,\n ].join('\\n');\n}\n\n/**\n * Build the system prompt for one question.\n *\n * @param options - the site name, the retrieved pages, and any extra instructions\n * @returns the complete system prompt\n */\nexport function buildSystemPrompt(options: BuildSystemPromptOptions): string {\n const sections: string[] = [\n `You are the documentation assistant for ${options.siteName}. You answer questions about ${options.siteName} using its documentation.`,\n RULES.map((rule) => `- ${rule}`).join('\\n'),\n ];\n\n if (options.pages.length === 0) {\n sections.push(\n 'DOCUMENTATION\\n\\nNo documentation page matched this question. Tell the reader you cannot find it in the documentation, and suggest they rephrase the question or use the search box.',\n );\n } else {\n sections.push(\n [\n 'DOCUMENTATION',\n `The following ${String(options.pages.length)} ${options.pages.length === 1 ? 'page is' : 'pages are'} the only source you may use.`,\n options.pages.map((page, position) => renderPage(page, position + 1)).join('\\n\\n'),\n ].join('\\n\\n'),\n );\n }\n\n const extra = options.extraInstructions?.trim() ?? '';\n if (extra !== '') {\n sections.push(`ADDITIONAL INSTRUCTIONS FROM THIS SITE\\n\\n${extra}`);\n }\n\n return sections.join('\\n\\n');\n}\n","/**\n * Turning a provider failure into one readable line.\n *\n * A refused provider request can answer with a tidy JSON error, an HTML gateway\n * page, or a wall of text. The Ask AI panel has room for one sentence, so this\n * module extracts the useful message and falls back to the status line when the\n * body is HTML or oversized — the same fix applied to the OAuth dialog in\n * `patches/fumadocs-openapi.patch`.\n *\n * It also redacts anything that looks like an API key. OpenAI, for one, echoes\n * the rejected key back in its `401` message, and that message is on its way to\n * a browser.\n *\n * @packageDocumentation\n */\n\nconst MAX_MESSAGE_CHARS = 300;\n\n/**\n * Key shapes both providers issue, plus a generic bearer token. The `*` in the\n * first class catches a partly masked key: OpenAI echoes the rejected key as\n * `sk-abc1*****wxyz`, which is still more of it than a docs panel should show.\n */\nconst SECRET_PATTERNS: readonly RegExp[] = [\n /sk-[A-Za-z0-9_*-]{6,}/g,\n /\\bBearer\\s+[A-Za-z0-9._-]{8,}/gi,\n];\n\n/**\n * Mask anything that looks like a credential.\n *\n * @param text - untrusted text on its way to a browser or a log\n * @returns the text with credential-shaped substrings replaced\n */\nexport function redactSecrets(text: string): string {\n return SECRET_PATTERNS.reduce((masked, pattern) => masked.replace(pattern, '[redacted]'), text);\n}\n\n/** Pull the human-readable message out of a provider's error JSON. */\nfunction messageFromJson(payload: unknown): string | undefined {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n const record = payload as Record<string, unknown>;\n const error: unknown = record['error'];\n if (typeof error === 'string' && error.trim() !== '') {\n return error;\n }\n if (typeof error === 'object' && error !== null) {\n const errorRecord = error as Record<string, unknown>;\n for (const key of ['message', 'type', 'code']) {\n const value: unknown = errorRecord[key];\n if (typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n }\n const message: unknown = record['message'];\n return typeof message === 'string' && message.trim() !== '' ? message : undefined;\n}\n\nfunction shorten(text: string): string {\n return text.length > MAX_MESSAGE_CHARS ? `${text.slice(0, MAX_MESSAGE_CHARS - 1)}…` : text;\n}\n\n/**\n * Read a non-OK provider response and reduce it to one line.\n *\n * @param response - the refused response\n * @param providerLabel - display name, e.g. `Anthropic`\n * @returns a single-line message, redacted and length-capped\n */\nexport async function readProviderError(\n response: Response,\n providerLabel: string,\n): Promise<string> {\n const statusLine = `${providerLabel} refused the request: ${String(response.status)} ${\n response.statusText === '' ? 'error' : response.statusText\n }.`;\n\n let raw: string;\n try {\n raw = (await response.text()).trim();\n } catch {\n return statusLine;\n }\n\n if (raw === '' || raw.startsWith('<') || raw.length > 4000) {\n return statusLine;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n parsed = undefined;\n }\n\n const message = messageFromJson(parsed);\n if (message === undefined) {\n return raw.length > MAX_MESSAGE_CHARS\n ? statusLine\n : `${providerLabel} refused the request: ${redactSecrets(shorten(raw.replace(/\\s+/g, ' ')))}`;\n }\n\n return `${providerLabel} refused the request: ${redactSecrets(shorten(message.replace(/\\s+/g, ' ')))}`;\n}\n","/**\n * An incremental Server-Sent Events reader.\n *\n * Both providers stream `text/event-stream`, and neither guarantees that a\n * network chunk ends on an event boundary: a chunk can split a line in half,\n * split a `\\r\\n` pair, or carry six events at once. This reader owns that\n * problem so the provider adapters can think in whole frames.\n *\n * It follows the SSE line rules — `\\r\\n`, `\\n`, or a lone `\\r` ends a line, a\n * blank line dispatches, a leading `:` is a comment, one leading space after\n * the field colon is dropped, and repeated `data:` lines join with `\\n`. It is\n * deliberately lenient in one place: a frame still buffered when the body ends\n * is dispatched rather than discarded, so a stream whose final blank line is\n * lost in transit still delivers its last event.\n *\n * @packageDocumentation\n */\n\n/**\n * One dispatched SSE frame. `event` is `undefined` when the stream omitted the\n * field (the SSE default of `message`); `data` is the joined data lines with no\n * trailing newline.\n */\nexport interface SseFrame {\n readonly event: string | undefined;\n readonly data: string;\n}\n\n/** Split off the first complete line, or `null` when none is complete yet. */\nfunction takeLine(buffer: string): { line: string; rest: string } | null {\n const match = /\\r\\n|\\n|\\r/.exec(buffer);\n if (match === null) {\n return null;\n }\n // A trailing lone `\\r` may be the first half of a `\\r\\n` still in flight.\n if (match[0] === '\\r' && match.index + 1 === buffer.length) {\n return null;\n }\n return {\n line: buffer.slice(0, match.index),\n rest: buffer.slice(match.index + match[0].length),\n };\n}\n\n/** Accumulates the fields of one frame until a blank line dispatches it. */\nclass FrameBuilder {\n private event: string | undefined;\n private data: string[] = [];\n\n /** Apply one non-blank line. */\n add(line: string): void {\n if (line.startsWith(':')) {\n return; // Comment / keep-alive.\n }\n const colon = line.indexOf(':');\n const field = colon === -1 ? line : line.slice(0, colon);\n const rawValue = colon === -1 ? '' : line.slice(colon + 1);\n const value = rawValue.startsWith(' ') ? rawValue.slice(1) : rawValue;\n\n if (field === 'event') {\n this.event = value;\n } else if (field === 'data') {\n this.data.push(value);\n }\n // `id` and `retry` carry no meaning for a one-shot completion stream.\n }\n\n /** Take the pending frame, or `null` when nothing has accumulated. */\n take(): SseFrame | null {\n if (this.event === undefined && this.data.length === 0) {\n return null;\n }\n const frame: SseFrame = { event: this.event, data: this.data.join('\\n') };\n this.event = undefined;\n this.data = [];\n return frame;\n }\n}\n\n/**\n * Read a `text/event-stream` body as a sequence of frames.\n *\n * @param body - the response body; `null` yields nothing\n * @returns an async generator of dispatched frames, in order\n */\nexport async function* readSseFrames(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<SseFrame> {\n if (body === null) {\n return;\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const builder = new FrameBuilder();\n let buffer = '';\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n\n for (;;) {\n const taken = takeLine(buffer);\n if (taken === null) {\n break;\n }\n buffer = taken.rest;\n if (taken.line === '') {\n const frame = builder.take();\n if (frame !== null) {\n yield frame;\n }\n } else {\n builder.add(taken.line);\n }\n }\n }\n\n buffer += decoder.decode();\n if (buffer !== '') {\n builder.add(buffer);\n }\n const last = builder.take();\n if (last !== null) {\n yield last;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse a frame's `data` payload as JSON.\n *\n * A provider mixes in frames this adapter does not model (`ping`, per-token\n * bookkeeping), and a truncated final frame is possible. Neither is worth\n * failing a stream over, so an unparsable payload becomes `undefined` and the\n * caller skips the frame.\n *\n * @param data - the raw `data` payload\n * @returns the parsed value, or `undefined` when it is not JSON\n */\nexport function parseFrameData(data: string): unknown {\n if (data === '') {\n return undefined;\n }\n try {\n return JSON.parse(data) as unknown;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Decide what kind of frame this is.\n *\n * Both providers name the event twice — in the SSE `event:` field and in the\n * payload's `type` — so the payload serves as the fallback for a producer or\n * proxy that drops the `event:` line.\n *\n * @param frame - the dispatched frame\n * @param payload - the frame's parsed data, from {@link parseFrameData}\n * @returns the event name, or `undefined` when neither source names one\n */\nexport function frameEventType(frame: SseFrame, payload: unknown): string | undefined {\n if (frame.event !== undefined && frame.event !== '') {\n return frame.event;\n }\n if (typeof payload === 'object' && payload !== null) {\n const type: unknown = (payload as Record<string, unknown>)['type'];\n if (typeof type === 'string' && type !== '') {\n return type;\n }\n }\n return undefined;\n}\n","/**\n * The Anthropic provider adapter.\n *\n * Hand-rolled against the Messages API — `POST /v1/messages` with\n * `anthropic-version: 2023-06-01` — over `fetch`, `ReadableStream`, and\n * `TextDecoder` only. No SDK, so the package keeps zero runtime dependencies\n * and the adapter runs unchanged on Node and on an edge runtime.\n *\n * Stream shape, verified against the live API: `content_block_delta` frames\n * carry `delta.text` for `delta.type === 'text_delta'`, `message_stop` ends the\n * stream, an `error` event carries `error.message`, and `ping` frames are\n * filler. Anything else is bookkeeping and ignored.\n *\n * @packageDocumentation\n */\n\nimport type { FetchLike } from '../../proxy.js';\n\nimport { readProviderError } from './error.js';\nimport { frameEventType, parseFrameData, readSseFrames } from './sse.js';\nimport type { AiProvider, AiProviderOptions, AiProviderRequest, AiStreamEvent } from './types.js';\n\nconst MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\nconst API_VERSION = '2023-06-01';\nconst PROVIDER_LABEL = 'Anthropic';\n\n/**\n * Options for {@link createAnthropicProvider}.\n */\nexport type CreateAnthropicProviderOptions = AiProviderOptions;\n\nfunction requestBody(request: AiProviderRequest, model: string): string {\n return JSON.stringify({\n model,\n max_tokens: request.maxOutputTokens,\n system: request.system,\n messages: request.messages.map((message) => ({\n role: message.role,\n content: message.content,\n })),\n stream: true,\n });\n}\n\n/** Extract the text of a `content_block_delta` frame, if it carries any. */\nfunction textDelta(payload: unknown): string | undefined {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n const delta: unknown = (payload as Record<string, unknown>)['delta'];\n if (typeof delta !== 'object' || delta === null) {\n return undefined;\n }\n const record = delta as Record<string, unknown>;\n if (record['type'] !== 'text_delta') {\n return undefined;\n }\n const text: unknown = record['text'];\n return typeof text === 'string' ? text : undefined;\n}\n\n/** Extract the message of an `error` frame. */\nfunction errorMessage(payload: unknown): string {\n if (typeof payload === 'object' && payload !== null) {\n const error: unknown = (payload as Record<string, unknown>)['error'];\n if (typeof error === 'object' && error !== null) {\n const message: unknown = (error as Record<string, unknown>)['message'];\n if (typeof message === 'string' && message.trim() !== '') {\n return message;\n }\n }\n }\n return 'The Anthropic stream failed.';\n}\n\n/**\n * Build an Anthropic-backed {@link AiProvider}.\n *\n * The API key is a value, resolved from the environment by the server — this\n * module never reads an environment variable and never logs the key.\n *\n * @param options - the API key, an allow-listed model, and an optional fetch\n * @returns a provider that streams unified events\n */\nexport function createAnthropicProvider(options: CreateAnthropicProviderOptions): AiProvider {\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n\n return {\n async *stream(request: AiProviderRequest): AsyncGenerator<AiStreamEvent> {\n let response: Response;\n try {\n response = await doFetch(MESSAGES_URL, {\n method: 'POST',\n headers: {\n 'x-api-key': options.apiKey,\n 'anthropic-version': API_VERSION,\n 'content-type': 'application/json',\n },\n body: requestBody(request, options.model),\n ...(request.signal ? { signal: request.signal } : {}),\n });\n } catch {\n yield { type: 'error', message: `Could not reach ${PROVIDER_LABEL}.` };\n return;\n }\n\n if (!response.ok) {\n yield { type: 'error', message: await readProviderError(response, PROVIDER_LABEL) };\n return;\n }\n\n for await (const frame of readSseFrames(response.body)) {\n const payload = parseFrameData(frame.data);\n const type = frameEventType(frame, payload);\n\n if (type === 'error') {\n yield { type: 'error', message: errorMessage(payload) };\n return;\n }\n if (type === 'message_stop') {\n yield { type: 'done' };\n return;\n }\n if (type === 'content_block_delta') {\n const text = textDelta(payload);\n if (text !== undefined && text !== '') {\n yield { type: 'text', text };\n }\n }\n }\n\n // The body ended without `message_stop`. The answer so far stands, so\n // close cleanly rather than reporting a failure the reader cannot act on.\n yield { type: 'done' };\n },\n };\n}\n","/**\n * The OpenAI provider adapter.\n *\n * Hand-rolled against the Responses API — `POST /v1/responses` with a bearer\n * key — over `fetch`, `ReadableStream`, and `TextDecoder` only. Same contract\n * as the Anthropic adapter, so the route cannot tell them apart.\n *\n * Stream shape, verified against the live API: `response.output_text.delta`\n * frames carry `delta` as a plain string, `response.completed` ends a finished\n * answer, and `response.incomplete` ends a truncated one — a reasoning model\n * such as `gpt-5-mini` spends part of its output budget on reasoning, so a\n * small budget can end the stream with no text at all. Both are reported as\n * `done`: whatever streamed is a real answer, and there is nothing the reader\n * can act on. `response.failed` and a bare `error` frame become `error`.\n *\n * @packageDocumentation\n */\n\nimport type { FetchLike } from '../../proxy.js';\n\nimport { readProviderError } from './error.js';\nimport { frameEventType, parseFrameData, readSseFrames } from './sse.js';\nimport type { AiProvider, AiProviderOptions, AiProviderRequest, AiStreamEvent } from './types.js';\n\nconst RESPONSES_URL = 'https://api.openai.com/v1/responses';\nconst PROVIDER_LABEL = 'OpenAI';\n\n/**\n * Options for {@link createOpenAiProvider}.\n */\nexport type CreateOpenAiProviderOptions = AiProviderOptions;\n\nfunction requestBody(request: AiProviderRequest, model: string): string {\n return JSON.stringify({\n model,\n instructions: request.system,\n input: request.messages.map((message) => ({\n role: message.role,\n content: message.content,\n })),\n stream: true,\n max_output_tokens: request.maxOutputTokens,\n });\n}\n\n/** Extract the text of a `response.output_text.delta` frame. */\nfunction textDelta(payload: unknown): string | undefined {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n const delta: unknown = (payload as Record<string, unknown>)['delta'];\n return typeof delta === 'string' ? delta : undefined;\n}\n\n/**\n * Extract the message of a failure frame. The Responses API puts it on\n * `response.error.message` for `response.failed`, and at the top level for a\n * bare `error` frame.\n */\nfunction errorMessage(payload: unknown): string {\n if (typeof payload === 'object' && payload !== null) {\n const record = payload as Record<string, unknown>;\n\n const response: unknown = record['response'];\n if (typeof response === 'object' && response !== null) {\n const error: unknown = (response as Record<string, unknown>)['error'];\n if (typeof error === 'object' && error !== null) {\n const message: unknown = (error as Record<string, unknown>)['message'];\n if (typeof message === 'string' && message.trim() !== '') {\n return message;\n }\n }\n }\n\n for (const key of ['message', 'code']) {\n const value: unknown = record[key];\n if (typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n }\n return 'The OpenAI stream failed.';\n}\n\n/**\n * Build an OpenAI-backed {@link AiProvider}.\n *\n * The API key is a value, resolved from the environment by the server — this\n * module never reads an environment variable and never logs the key.\n *\n * @param options - the API key, an allow-listed model, and an optional fetch\n * @returns a provider that streams unified events\n */\nexport function createOpenAiProvider(options: CreateOpenAiProviderOptions): AiProvider {\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n\n return {\n async *stream(request: AiProviderRequest): AsyncGenerator<AiStreamEvent> {\n let response: Response;\n try {\n response = await doFetch(RESPONSES_URL, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n 'content-type': 'application/json',\n },\n body: requestBody(request, options.model),\n ...(request.signal ? { signal: request.signal } : {}),\n });\n } catch {\n yield { type: 'error', message: `Could not reach ${PROVIDER_LABEL}.` };\n return;\n }\n\n if (!response.ok) {\n yield { type: 'error', message: await readProviderError(response, PROVIDER_LABEL) };\n return;\n }\n\n for await (const frame of readSseFrames(response.body)) {\n const payload = parseFrameData(frame.data);\n const type = frameEventType(frame, payload);\n\n if (type === 'error' || type === 'response.failed') {\n yield { type: 'error', message: errorMessage(payload) };\n return;\n }\n if (type === 'response.completed' || type === 'response.incomplete') {\n yield { type: 'done' };\n return;\n }\n if (type === 'response.output_text.delta') {\n const text = textDelta(payload);\n if (text !== undefined && text !== '') {\n yield { type: 'text', text };\n }\n }\n }\n\n // The body ended without a terminal frame; close cleanly.\n yield { type: 'done' };\n },\n };\n}\n","/**\n * Retrieval: which pages the model is allowed to read.\n *\n * An answer is only as trustworthy as its context, so context is chosen by the\n * framework and never by the model. This module reuses the site's existing\n * weighted search index — the same scoring the search box uses — takes the best\n * pages, loads their Markdown, and enforces a character budget so a long page\n * cannot crowd out the rest or blow the model's context window.\n *\n * The pages it returns are also the citations the route sends to the browser.\n * They are facts about the site, not model output, so a source chip can never\n * point at a page that does not exist.\n *\n * @packageDocumentation\n */\n\nimport { type SearchDocument, type SearchIndex, searchIndex } from '../search.js';\n\n/** Most characters of Markdown taken from any single page. */\nconst PAGE_CHAR_BUDGET = 8000;\n/** Below this, a page's remaining slice is too small to be worth including. */\nconst MIN_USEFUL_CHARS = 400;\n\nconst TRUNCATION_MARKER = '\\n\\n[content truncated]';\n\n/**\n * One page of retrieved context, and one citation.\n */\nexport interface ContextPage {\n /** The page's site-relative URL, from the search index. */\n readonly url: string;\n readonly title: string;\n /** The page's Markdown, truncated to the per-page budget. */\n readonly markdown: string;\n}\n\n/**\n * Options for {@link selectContext}.\n */\nexport interface SelectContextOptions {\n /** The site's search index, built with `buildSearchIndex`. */\n readonly index: SearchIndex;\n /** The documents the index was built from, used as a Markdown fallback. */\n readonly documents: readonly SearchDocument[];\n /** The reader's question. */\n readonly query: string;\n /** Most pages to return. */\n readonly maxPages: number;\n /** Loads a page's Markdown by URL. Returns `null` when there is none. */\n readonly loadMarkdown: (url: string) => Promise<string | null>;\n}\n\n/** How many earlier user turns join the newest one in the retrieval query. */\nconst PRIOR_TURNS_IN_QUERY = 2;\n/** Most characters an earlier turn may add, so it cannot drown the newest. */\nconst PRIOR_TURN_CHAR_CAP = 300;\n\n/**\n * Build the retrieval query from a conversation. A follow-up like \"and how do\n * I fund it?\" carries none of its own topic — the topic lives in the earlier\n * turns. The newest user message is taken in full and the previous user turns\n * (capped, oldest first) are prepended, so retrieval sees the thread's\n * subject, not just its last sentence.\n */\nexport function buildRetrievalQuery(\n messages: readonly { readonly role: string; readonly content: string }[],\n): string {\n const userTurns = messages.filter((message) => message.role === 'user');\n const newest = userTurns.at(-1)?.content ?? '';\n const prior = userTurns\n .slice(0, -1)\n .slice(-PRIOR_TURNS_IN_QUERY)\n .map((turn) => turn.content.slice(0, PRIOR_TURN_CHAR_CAP));\n return [...prior, newest].join('\\n').trim();\n}\n\n/**\n * Cut text to `budget` characters, preferring a line boundary.\n *\n * A mid-sentence cut reads as corrupt to a model, and a mid-fence cut can make\n * the rest of the page look like code. Falling back to a hard cut keeps the\n * budget absolute: the marker is counted inside it, so the result never exceeds\n * `budget`.\n */\nfunction truncate(text: string, budget: number): string {\n if (text.length <= budget) {\n return text;\n }\n const room = budget - TRUNCATION_MARKER.length;\n const slice = text.slice(0, room);\n const lastBreak = slice.lastIndexOf('\\n');\n const cut = lastBreak >= Math.floor(room / 2) ? slice.slice(0, lastBreak) : slice;\n return `${cut}${TRUNCATION_MARKER}`;\n}\n\n/**\n * Choose the pages that ground one answer.\n *\n * Pages come back best-first, de-duplicated by URL, each within the per-page\n * budget and the whole set within the total budget. A question that matches\n * nothing returns an empty array — the caller must then tell the model it has\n * no documentation to answer from.\n *\n * @param options - the index, the documents, the question, and the loader\n * @returns the retrieved pages, best first\n */\nexport async function selectContext(options: SelectContextOptions): Promise<ContextPage[]> {\n const hits = searchIndex(options.index, options.query, options.maxPages);\n if (hits.length === 0) {\n return [];\n }\n\n const bodyByPath = new Map<string, string>();\n for (const document of options.documents) {\n if (document.body !== undefined && document.body !== '') {\n bodyByPath.set(document.path, document.body);\n }\n }\n\n const pages: ContextPage[] = [];\n const seen = new Set<string>();\n let used = 0;\n // The total budget is derived, not fixed: every retrieved page must fit at\n // full size, whatever maxPages the site configured. A fixed total below\n // maxPages × PAGE_CHAR_BUDGET would silently drop retrieved pages.\n const totalBudget = options.maxPages * PAGE_CHAR_BUDGET;\n\n for (const hit of hits) {\n if (seen.has(hit.path)) {\n continue;\n }\n seen.add(hit.path);\n\n const remaining = totalBudget - used;\n if (remaining < MIN_USEFUL_CHARS) {\n break;\n }\n\n // A page with no Markdown on disk still has its indexed body text.\n const loaded = await options.loadMarkdown(hit.path);\n const source = loaded !== null && loaded.trim() !== '' ? loaded : bodyByPath.get(hit.path);\n if (source === undefined || source.trim() === '') {\n continue;\n }\n\n const markdown = truncate(source.trim(), Math.min(PAGE_CHAR_BUDGET, remaining));\n used += markdown.length;\n pages.push({ url: hit.path, title: hit.title, markdown });\n }\n\n return pages;\n}\n","/**\n * The Ask AI route.\n *\n * One handler, framework-agnostic, built on the Web `Request`/`Response` types\n * so it drops into a Next.js route file, an edge function, or any Fetch-based\n * runtime. It runs the whole question pipeline: validate the body, rate-limit\n * the caller, retrieve the grounding pages, build the prompt, stream the\n * provider, and re-emit a provider-agnostic SSE stream to the browser.\n *\n * Two deliberate choices:\n *\n * - **Configuration is resolved eagerly.** {@link createAskAiRoute} validates\n * the `ai` block when the route is built, so a typo in `docs.config.ts` fails\n * the build. Deferring it to the first request would turn a site's typo into a\n * reader's error message. A site with no `ai` block at all is different from\n * a typo: the route mounts dormant and answers `404`, so a scaffold ships the\n * file and enabling Ask AI is a config change, not a code change.\n * - **The API key is read lazily, per request.** An edge runtime binds its\n * environment per invocation, not at module load, so the key is looked up when\n * it is needed. It is never logged; a missing key is reported by env var name.\n *\n * The browser protocol is three event names — `sources`, `text`, `done` — with\n * `error` replacing the tail of the stream on failure. See\n * {@link createAskAiRoute} for the exact payloads.\n *\n * @packageDocumentation\n */\n\nimport type { FetchLike } from '../proxy.js';\nimport { RATE_LIMIT_WINDOW_MS, clientRateLimitKey, createRateLimiter } from '../rate-limit.js';\nimport { type SearchDocument, type SearchIndex, buildSearchIndex } from '../search.js';\n\nimport { type AiConfig, AiConfigError, type ResolvedAiConfig, resolveAiConfig } from './config.js';\nimport { buildSystemPrompt } from './prompt.js';\nimport { createAnthropicProvider } from './providers/anthropic.js';\nimport { createOpenAiProvider } from './providers/openai.js';\nimport type { AiMessage, AiProvider } from './providers/types.js';\nimport { type ContextPage, buildRetrievalQuery, selectContext } from './retrieval.js';\n\n/** Upper bound on one answer. Generous: a reasoning model spends part of it thinking. */\nconst DEFAULT_MAX_OUTPUT_TOKENS = 2048;\n\nconst MAX_MESSAGES = 20;\nconst MAX_CONTENT_CHARS = 4000;\n\n/**\n * Where the route gets the site's pages: the array itself, or a loader for a\n * site that builds it at runtime. Either way it is read once and treated as\n * immutable build-time content.\n *\n * @public\n */\nexport type AskAiDocumentsSource =\n readonly SearchDocument[] | (() => Promise<readonly SearchDocument[]>);\n\n/**\n * Options for {@link createAskAiRoute}.\n *\n * @public\n */\nexport interface AskAiRouteOptions {\n /**\n * The site's raw `ai` block. Validated when the route is built. `undefined`\n * (the config declares no `ai` block) mounts the route dormant: every\n * request answers `404`.\n */\n readonly config: AiConfig | undefined;\n /** Display name used in the system prompt, normally `theme.name`. */\n readonly siteName: string;\n /**\n * The API key value. Supply it only when the server resolves the key itself;\n * otherwise leave it out and the route reads `ai.apiKeyEnv` per request.\n */\n readonly apiKey?: string;\n /** Reads an environment variable. Defaults to `process.env`, looked up per request. */\n readonly env?: (name: string) => string | undefined;\n /** The site's pages, for retrieval. */\n readonly documents: AskAiDocumentsSource;\n /** Loads a page's Markdown by its URL. Returns `null` when there is none. */\n readonly loadPageMarkdown: (url: string) => Promise<string | null>;\n /** Fetch implementation passed to the provider. Defaults to the global `fetch`. */\n readonly fetch?: FetchLike;\n /** Clock for the rate limiter, for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n /** Upper bound on one answer, in tokens. Default 2048. */\n readonly maxOutputTokens?: number;\n}\n\n/**\n * A citation sent to the browser before the answer streams.\n *\n * @public\n */\nexport interface AskAiSource {\n readonly url: string;\n readonly title: string;\n}\n\n/**\n * The Ask AI route's handlers, ready to re-export from a framework route file.\n *\n * @public\n */\nexport interface AskAiRoute {\n readonly POST: (request: Request) => Promise<Response>;\n}\n\n/** Read `process.env` without importing a Node module, so edge builds work. */\nfunction readProcessEnv(name: string): string | undefined {\n const runtime = globalThis as { process?: { env?: Record<string, string | undefined> } };\n return runtime.process?.env?.[name];\n}\n\nfunction jsonResponse(\n status: number,\n payload: unknown,\n headers: Record<string, string> = {},\n): Response {\n return new Response(JSON.stringify(payload), {\n status,\n headers: { 'content-type': 'application/json', 'cache-control': 'no-store', ...headers },\n });\n}\n\n/**\n * Validate the request body. Returns the messages, or the exact reason it is\n * unacceptable — the caller turns that into a `400`.\n */\nfunction parseMessages(value: unknown): { messages: AiMessage[] } | { error: string } {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return { error: 'Request body must be a JSON object.' };\n }\n const raw: unknown = (value as Record<string, unknown>)['messages'];\n if (!Array.isArray(raw)) {\n return { error: 'Request body must include a \"messages\" array.' };\n }\n if (raw.length === 0) {\n return { error: 'messages must contain at least one message.' };\n }\n if (raw.length > MAX_MESSAGES) {\n return {\n error: `messages must contain ${String(MAX_MESSAGES)} messages or fewer, got ${String(raw.length)}.`,\n };\n }\n\n const messages: AiMessage[] = [];\n for (const [position, entry] of (raw as unknown[]).entries()) {\n const at = `messages[${String(position)}]`;\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {\n return { error: `${at} must be an object with \"role\" and \"content\".` };\n }\n const record = entry as Record<string, unknown>;\n const role: unknown = record['role'];\n if (role !== 'user' && role !== 'assistant') {\n return { error: `${at}.role must be 'user' or 'assistant'.` };\n }\n const content: unknown = record['content'];\n if (typeof content !== 'string') {\n return { error: `${at}.content must be a string.` };\n }\n if (content.trim() === '') {\n return { error: `${at}.content must not be empty.` };\n }\n if (content.length > MAX_CONTENT_CHARS) {\n return {\n error: `${at}.content must be ${String(MAX_CONTENT_CHARS)} characters or fewer, got ${String(content.length)}.`,\n };\n }\n messages.push({ role, content });\n }\n\n if (messages.at(-1)?.role !== 'user') {\n return { error: `The last message must have role 'user'.` };\n }\n\n return { messages };\n}\n\nfunction createProvider(\n resolved: ResolvedAiConfig,\n apiKey: string,\n doFetch: FetchLike | undefined,\n): AiProvider {\n const providerOptions = {\n apiKey,\n model: resolved.model,\n ...(doFetch ? { fetch: doFetch } : {}),\n };\n return resolved.provider === 'anthropic'\n ? createAnthropicProvider(providerOptions)\n : createOpenAiProvider(providerOptions);\n}\n\n/**\n * Build the Ask AI route.\n *\n * The route answers `POST` with `{ \"messages\": [{ \"role\": \"user\", \"content\": \"…\" }] }`\n * and streams `text/event-stream`:\n *\n * | Event | Payload | When |\n * | --------- | -------------------------- | ------------------------------------- |\n * | `sources` | `[{ url, title }]` | Once, first — the retrieved pages. |\n * | `text` | `{ text }` | Per delta, appended in order. |\n * | `done` | `{}` | Last event of a successful answer. |\n * | `error` | `{ message }` | Replaces the tail; one readable line. |\n *\n * Failures before the stream starts are plain JSON, not SSE: `400` for a bad\n * body (the message names the offending field), `429` with `Retry-After` when\n * the caller is over the limit, and `500` when the API key is not set on the\n * server.\n *\n * @example\n * ```ts\n * // app/api/ask-ai/route.ts\n * export const { POST } = createAskAiRoute({\n * config: docsConfig.ai!,\n * siteName: docsConfig.theme.name,\n * documents: searchDocuments,\n * loadPageMarkdown: readPageMarkdown,\n * });\n * ```\n *\n * @param options - the site's `ai` block, its pages, and the Markdown loader\n * @returns the route's `POST` handler\n * @throws {@link AiConfigError} when the `ai` block or the wiring is invalid\n * @public\n */\nexport function createAskAiRoute(options: AskAiRouteOptions): AskAiRoute {\n // No `ai` block is a declared state, not a typo: the route mounts dormant,\n // so a scaffold ships this file and enabling Ask AI is one config change.\n if (options.config === undefined) {\n return {\n POST: () =>\n Promise.resolve(\n jsonResponse(404, {\n error: 'Ask AI is not enabled: docs.config.ts declares no ai block.',\n }),\n ),\n };\n }\n\n // Eager, so a misconfigured site fails at build time rather than at a reader.\n const resolved = resolveAiConfig(options.config);\n\n if (typeof options.siteName !== 'string' || options.siteName.trim() === '') {\n throw new AiConfigError('siteName must be a non-empty string, e.g. theme.name.');\n }\n if (typeof options.loadPageMarkdown !== 'function') {\n throw new AiConfigError(\n \"loadPageMarkdown must be a function that returns a page's Markdown, or null.\",\n );\n }\n const documentsSource = options.documents;\n if (!Array.isArray(documentsSource) && typeof documentsSource !== 'function') {\n throw new AiConfigError(\n 'documents must be an array of SearchDocument, or a function returning one.',\n );\n }\n\n const readEnv = options.env ?? readProcessEnv;\n const maxOutputTokens = options.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS;\n const limiter = createRateLimiter({\n limit: resolved.rateLimitPerMinute,\n windowMs: RATE_LIMIT_WINDOW_MS,\n ...(options.now ? { now: options.now } : {}),\n });\n\n // The corpus is build-time content, so load and index it once. A failed load\n // is not cached, so a transient failure does not disable Ask AI for good.\n let corpus: Promise<{ documents: readonly SearchDocument[]; index: SearchIndex }> | undefined;\n function loadCorpus(): Promise<{ documents: readonly SearchDocument[]; index: SearchIndex }> {\n if (corpus === undefined) {\n const pending = (async () => {\n const documents =\n typeof documentsSource === 'function' ? await documentsSource() : documentsSource;\n return { documents, index: buildSearchIndex(documents) };\n })();\n void pending.catch(() => {\n if (corpus === pending) {\n corpus = undefined;\n }\n });\n corpus = pending;\n }\n return corpus;\n }\n\n const encoder = new TextEncoder();\n\n function streamAnswer(\n provider: AiProvider,\n system: string,\n messages: readonly AiMessage[],\n sources: readonly AskAiSource[],\n upstream: AbortController,\n ): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n let open = true;\n const send = (event: string, data: unknown): void => {\n if (!open) {\n return;\n }\n try {\n controller.enqueue(\n encoder.encode(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch {\n // The reader is gone; stop writing.\n open = false;\n }\n };\n\n send('sources', sources);\n\n let closed = false;\n try {\n for await (const event of provider.stream({\n system,\n messages,\n maxOutputTokens,\n signal: upstream.signal,\n })) {\n if (event.type === 'text') {\n send('text', { text: event.text });\n continue;\n }\n if (event.type === 'error') {\n send('error', { message: event.message });\n } else {\n send('done', {});\n }\n closed = true;\n break;\n }\n if (!closed) {\n send('done', {});\n }\n } catch {\n // The provider generator threw — a dropped socket, or an abort.\n send('error', { message: 'The answer stream stopped unexpectedly.' });\n }\n\n open = false;\n try {\n controller.close();\n } catch {\n // Already closed by a cancelling reader.\n }\n },\n cancel() {\n upstream.abort();\n },\n });\n }\n\n return {\n async POST(request: Request): Promise<Response> {\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n return jsonResponse(400, { error: 'Request body must be JSON.' });\n }\n\n const parsed = parseMessages(body);\n if ('error' in parsed) {\n return jsonResponse(400, { error: parsed.error });\n }\n\n const decision = limiter.allow(clientRateLimitKey(request));\n if (!decision.allowed) {\n const retryAfter = decision.retryAfterSeconds ?? 60;\n return jsonResponse(\n 429,\n {\n error: `Too many questions. Try again in ${String(retryAfter)} seconds.`,\n retryAfterSeconds: retryAfter,\n },\n { 'retry-after': String(retryAfter) },\n );\n }\n\n const apiKey = (options.apiKey ?? readEnv(resolved.apiKeyEnv) ?? '').trim();\n if (apiKey === '') {\n return jsonResponse(500, {\n error: `Ask AI is not configured: set the ${resolved.apiKeyEnv} environment variable on the server.`,\n });\n }\n\n let pages: ContextPage[];\n try {\n const { documents, index } = await loadCorpus();\n pages = await selectContext({\n index,\n documents,\n query: buildRetrievalQuery(parsed.messages),\n maxPages: resolved.maxContextPages,\n loadMarkdown: options.loadPageMarkdown,\n });\n } catch {\n return jsonResponse(500, {\n error: 'Ask AI could not read the documentation for this site.',\n });\n }\n\n const system = buildSystemPrompt({\n siteName: options.siteName,\n pages,\n ...(resolved.systemPrompt === undefined\n ? {}\n : { extraInstructions: resolved.systemPrompt }),\n });\n const sources: AskAiSource[] = pages.map((page) => ({ url: page.url, title: page.title }));\n\n const upstream = new AbortController();\n const clientSignal = (request as { signal?: AbortSignal }).signal;\n if (clientSignal !== undefined) {\n if (clientSignal.aborted) {\n upstream.abort();\n } else {\n clientSignal.addEventListener(\n 'abort',\n () => {\n upstream.abort();\n },\n { once: true },\n );\n }\n }\n\n const provider = createProvider(resolved, apiKey, options.fetch);\n\n return new Response(streamAnswer(provider, system, parsed.messages, sources, upstream), {\n headers: {\n 'content-type': 'text/event-stream; charset=utf-8',\n 'cache-control': 'no-store',\n connection: 'keep-alive',\n // Tell a buffering reverse proxy to pass the stream straight through.\n 'x-accel-buffering': 'no',\n },\n });\n },\n };\n}\n","/**\n * The configuration seam.\n *\n * A consuming docs site supplies exactly one {@link DocsConfig}. It carries the\n * per-site values that must never live in the framework: branding, the auth\n * mode, and — critically — the allow-list of API origins the try-it proxy may\n * forward to. `docs-core` owns the behaviour; the site owns these values.\n *\n * The boundary is guarded: {@link defineDocsConfig} runs\n * {@link validateDocsConfig} on every value it is given, so a typo fails when\n * the site builds rather than when a reader loads a page. A site's config file\n * may be JavaScript, or built from JSON, so nothing here trusts the static\n * types — every field is checked at runtime.\n *\n * @packageDocumentation\n */\n\nimport { type AiConfig, resolveAiConfig } from './ai/config.js';\n\n/**\n * Google OAuth provider settings. Secrets never live in config: these name the\n * environment variables the framework reads at runtime.\n *\n * @public\n */\nexport interface GoogleProviderConfig {\n /** Env var holding the OAuth client id. Default `GOOGLE_CLIENT_ID`. */\n readonly clientIdEnv?: string;\n /** Env var holding the OAuth client secret. Default `GOOGLE_CLIENT_SECRET`. */\n readonly clientSecretEnv?: string;\n /** OAuth callback path. Default `/api/auth/google/callback`. */\n readonly redirectPath?: string;\n}\n\n/**\n * Shared-secret provider settings. The secret is one value for the whole site,\n * read from the environment at runtime — config only names the variable.\n *\n * @public\n */\nexport interface SecretProviderConfig {\n /** Env var holding the shared access secret. Default `DOCS_ACCESS_SECRET`. */\n readonly secretEnv?: string;\n}\n\n/**\n * The sign-in providers a workspace site offers. Enable any combination.\n *\n * @public\n */\nexport interface WorkspaceProviders {\n /** Email sign-in: a verified email in an allowed domain gets a session. */\n readonly email?: boolean;\n /**\n * Shared-secret sign-in: an allowed-domain email plus one site-wide secret.\n * Stronger than email alone, so when enabled it supersedes the email provider\n * (offering email-only too would let a reader skip the secret).\n */\n readonly secret?: SecretProviderConfig;\n /** Google OAuth sign-in, restricted to the allowed domains. */\n readonly google?: GoogleProviderConfig;\n}\n\n/**\n * Gate the docs to signed-in members of the allowed email domains.\n *\n * @public\n */\nexport interface WorkspaceAuthConfig {\n readonly mode: 'workspace';\n /** Email domains permitted to sign in, e.g. `['blaaiz.com']`. */\n readonly allowedDomains: readonly string[];\n /** Which identity providers are offered. */\n readonly providers: WorkspaceProviders;\n /** Where unauthenticated requests are redirected. Default `/signin`. */\n readonly signInPath?: string;\n /** Env var holding the session-signing secret. Default `DOCS_SESSION_SECRET`. */\n readonly sessionSecretEnv?: string;\n /** Session lifetime in seconds. Default 8 hours. */\n readonly sessionTtlSeconds?: number;\n /** Set the `Secure` cookie flag. Default `true`; set `false` for local http. */\n readonly secureCookies?: boolean;\n}\n\n/**\n * How a docs site gates access.\n *\n * - `'public'` — anyone may read the docs and use the playground.\n * - {@link WorkspaceAuthConfig} — only signed-in members of the allowed domains.\n *\n * @public\n */\nexport type AuthConfig = 'public' | WorkspaceAuthConfig;\n\n/**\n * A colour palette a site declares. Every token is optional; the framework\n * falls back to its defaults for anything omitted. The site owns the values;\n * the framework maps them to its CSS variables (see `buildThemeCss`).\n *\n * @public\n */\nexport interface ThemePalette {\n /** Primary accent — active nav, links, buttons, focus rings. */\n readonly primary?: string;\n /** Page background. */\n readonly background?: string;\n /** Body text. */\n readonly foreground?: string;\n /** Panel/card surfaces. */\n readonly card?: string;\n /** Hairline borders and dividers. */\n readonly border?: string;\n /** Secondary/muted text. */\n readonly muted?: string;\n}\n\n/**\n * Light and dark logo image paths, resolved by the consuming site.\n *\n * @public\n */\nexport interface ThemeLogo {\n readonly light: string;\n readonly dark: string;\n}\n\n/**\n * Brand configuration a site supplies. Colours and the logo live here — in the\n * site — not in the framework.\n *\n * @public\n */\nexport interface ThemeConfig {\n /** Display name. */\n readonly name: string;\n /** Light + dark logo paths (served by the site). */\n readonly logo?: ThemeLogo;\n /** Absolute or site-relative path to the favicon. */\n readonly favicon?: string;\n /** Palette applied to the light theme (and as the base for dark). */\n readonly colors?: ThemePalette;\n /** Palette overrides applied to the dark theme. */\n readonly darkColors?: ThemePalette;\n}\n\n/**\n * Security-critical: the exhaustive set of upstream API origins the try-it\n * proxy is permitted to forward requests to. Any target outside this list is\n * rejected with `403`. This is what keeps the proxy from becoming an open\n * relay — see {@link https://github.com/blaaiz/docs-core | the proxy design}.\n *\n * @public\n */\nexport interface ProxyConfig {\n /** Allowed upstream origins, e.g. `[\"https://api-dev.example.com\"]`. */\n readonly allowedOrigins: readonly string[];\n /**\n * Forwards per minute per client IP. Default 60. Enforced by both\n * `createTryItProxy` and `createTryItProxyRoute`; pass the value through when\n * you mount the route.\n */\n readonly rateLimitPerMinute?: number;\n}\n\n/**\n * Search-engine and social-sharing metadata a site supplies. Everything is\n * optional; the framework fills sensible defaults from {@link ThemeConfig.name}.\n * The site owns these values — the canonical origin, the sharing image — because\n * they are deployment facts, not framework behaviour.\n *\n * @public\n */\nexport interface SeoConfig {\n /**\n * The canonical public origin, e.g. `https://docs.example.com`. Enables\n * absolute canonical URLs, the sitemap, and Open Graph URLs. Without it those\n * fall back to relative URLs, which is correct but weaker for SEO.\n */\n readonly siteUrl?: string;\n /**\n * Title template for inner pages, with `%s` standing in for the page title,\n * e.g. `'%s | Example Docs'`. Default `'%s · <theme.name>'`. The home title is\n * {@link ThemeConfig.name} verbatim.\n */\n readonly titleTemplate?: string;\n /** Default meta description, used where a page declares none. */\n readonly description?: string;\n /** Site-relative or absolute path to the default Open Graph / Twitter image. */\n readonly ogImage?: string;\n /** `@handle` for Twitter card attribution. */\n readonly twitter?: string;\n /** Default keywords applied site-wide. Pages may add their own. */\n readonly keywords?: readonly string[];\n /**\n * Ask crawlers not to index the site (a private or pre-launch docs site).\n * Default `false`. Auth-gated sites usually want `true`.\n */\n readonly noindex?: boolean;\n}\n\n/**\n * Optional features a site opts into. Every flag defaults to `false`, so a site\n * gets a feature only by asking for it. The framework ships the behaviour; the\n * site decides whether to switch it on.\n *\n * @public\n */\nexport interface FeaturesConfig {\n /**\n * Show the \"Copy page / View as Markdown\" control on each doc page, and serve\n * the plain-Markdown route it links to. Lets a reader hand the page to an LLM.\n * Default `false`.\n */\n readonly copyPage?: boolean;\n}\n\n/**\n * The complete, validated configuration for one docs site.\n *\n * @public\n */\n/**\n * One top-bar action: a call to action rendered in the site header.\n *\n * @public\n */\nexport interface NavbarAction {\n readonly text: string;\n readonly href: string;\n}\n\n/**\n * Top-bar calls to action. The primary renders as a button in the theme's\n * primary colour; the secondary as a quiet link beside it.\n *\n * @public\n */\nexport interface NavbarConfig {\n readonly primary?: NavbarAction;\n readonly secondary?: NavbarAction;\n}\n\nexport interface DocsConfig {\n readonly theme: ThemeConfig;\n readonly auth: AuthConfig;\n readonly proxy: ProxyConfig;\n /** Top-bar calls to action (a Dashboard button, a Support link). */\n readonly navbar?: NavbarConfig;\n /** Opt-in features. Omit it entirely and every feature stays off. */\n readonly features?: FeaturesConfig;\n /** Search-engine and social-sharing metadata. Omit for name-only defaults. */\n readonly seo?: SeoConfig;\n /**\n * Ask AI settings. Omit the block and the feature stays off. Naming a\n * provider is a complete setup, because every other field has a framework\n * default. The API key never lives here — config names the environment\n * variable, and the server reads it at runtime.\n */\n readonly ai?: AiConfig;\n}\n\n/**\n * Thrown when a site's {@link DocsConfig} is malformed. The message names the\n * exact field, the value it received, and the accepted values.\n *\n * The `ai` block is the one exception: {@link validateDocsConfig} delegates it\n * to `resolveAiConfig`, which raises an `AiConfigError` instead. Both extend\n * `Error`, so a site's build fails the same way either way.\n *\n * @public\n */\nexport class DocsConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DocsConfigError';\n }\n}\n\n/** Proxy requests per minute per client IP — the accepted range. */\nconst MIN_PROXY_RATE_LIMIT = 1;\nconst MAX_PROXY_RATE_LIMIT = 6000;\n\n/** Session lifetime bounds: one minute to thirty days. */\nconst MIN_SESSION_TTL_SECONDS = 60;\nconst MAX_SESSION_TTL_SECONDS = 2_592_000;\n\nconst PALETTE_KEYS = [\n 'primary',\n 'background',\n 'foreground',\n 'card',\n 'border',\n 'muted',\n] as const satisfies readonly (keyof ThemePalette)[];\n\n/** Render an untrusted value for an error message: quoted when it is a string. */\nfunction describe(value: unknown): string {\n if (typeof value === 'string') {\n return `'${value}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || value === null) {\n return String(value);\n }\n if (value === undefined) {\n return 'undefined';\n }\n return Array.isArray(value) ? 'an array' : `a ${typeof value}`;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requireObject(value: unknown, field: string, example: string): Record<string, unknown> {\n if (!isPlainObject(value)) {\n throw new DocsConfigError(`${field} must be an object, got ${describe(value)}. ${example}`);\n }\n return value;\n}\n\nfunction optionalObject(value: unknown, field: string): Record<string, unknown> | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!isPlainObject(value)) {\n throw new DocsConfigError(\n `${field} must be an object, got ${describe(value)}. Remove the field to leave it unset.`,\n );\n }\n return value;\n}\n\nfunction requireString(value: unknown, field: string, example: string): string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new DocsConfigError(\n `${field} must be a non-empty string, got ${describe(value)}. ${example}`,\n );\n }\n return value;\n}\n\nfunction optionalString(value: unknown, field: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'string' || value.trim() === '') {\n throw new DocsConfigError(\n `${field} must be a non-empty string, got ${describe(value)}. Remove the field to use the default.`,\n );\n }\n return value;\n}\n\nfunction optionalBoolean(value: unknown, field: string): void {\n if (value !== undefined && typeof value !== 'boolean') {\n throw new DocsConfigError(`${field} must be true or false, got ${describe(value)}.`);\n }\n}\n\nfunction optionalIntegerInRange(value: unknown, field: string, min: number, max: number): void {\n if (value === undefined) {\n return;\n }\n if (typeof value !== 'number' || !Number.isInteger(value) || value < min || value > max) {\n throw new DocsConfigError(\n `${field} must be an integer between ${String(min)} and ${String(max)}, got ${describe(value)}.`,\n );\n }\n}\n\n/** A site-relative path, e.g. `/signin`. */\nfunction optionalPath(value: unknown, field: string): void {\n const path = optionalString(value, field);\n if (path !== undefined && !path.startsWith('/')) {\n throw new DocsConfigError(\n `${field} must start with '/', got ${describe(path)}. Example: '/signin'.`,\n );\n }\n}\n\n/** An array of non-empty strings. `minLength` guards a list that must not be empty. */\nfunction requireStringArray(\n value: unknown,\n field: string,\n options: { readonly minLength: number; readonly example: string },\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new DocsConfigError(\n `${field} must be an array, got ${describe(value)}. ${options.example}`,\n );\n }\n if (value.length < options.minLength) {\n throw new DocsConfigError(\n `${field} must contain at least ${String(options.minLength)} entry, got an empty array. ${options.example}`,\n );\n }\n return (value as unknown[]).map((entry, index) =>\n requireString(entry, `${field}[${String(index)}]`, options.example),\n );\n}\n\nfunction validatePalette(value: unknown, field: string): void {\n const palette = optionalObject(value, field);\n if (palette === undefined) {\n return;\n }\n for (const key of PALETTE_KEYS) {\n optionalString(palette[key], `${field}.${key}`);\n }\n}\n\nfunction validateTheme(value: unknown): void {\n const theme = requireObject(value, 'theme', \"Example: theme: { name: 'Example Docs' }.\");\n requireString(theme['name'], 'theme.name', \"Example: theme: { name: 'Example Docs' }.\");\n\n const logo = optionalObject(theme['logo'], 'theme.logo');\n if (logo !== undefined) {\n requireString(logo['light'], 'theme.logo.light', \"Example: '/logo-light.png'.\");\n requireString(logo['dark'], 'theme.logo.dark', \"Example: '/logo-dark.png'.\");\n }\n\n optionalString(theme['favicon'], 'theme.favicon');\n validatePalette(theme['colors'], 'theme.colors');\n validatePalette(theme['darkColors'], 'theme.darkColors');\n}\n\nfunction validateWorkspaceProviders(value: unknown): void {\n const providers = requireObject(value, 'auth.providers', 'Example: providers: { email: true }.');\n\n optionalBoolean(providers['email'], 'auth.providers.email');\n\n const secret = optionalObject(providers['secret'], 'auth.providers.secret');\n if (secret !== undefined) {\n optionalString(secret['secretEnv'], 'auth.providers.secret.secretEnv');\n }\n\n const google = optionalObject(providers['google'], 'auth.providers.google');\n if (google !== undefined) {\n optionalString(google['clientIdEnv'], 'auth.providers.google.clientIdEnv');\n optionalString(google['clientSecretEnv'], 'auth.providers.google.clientSecretEnv');\n optionalPath(google['redirectPath'], 'auth.providers.google.redirectPath');\n }\n\n // A workspace site with no provider offers no way in. That is a misconfigured\n // site, not a locked-down one, so it fails here rather than at the sign-in page.\n if (providers['email'] !== true && secret === undefined && google === undefined) {\n throw new DocsConfigError(\n \"auth.providers must enable at least one provider: 'email', 'secret', or 'google'. \" +\n 'Example: providers: { email: true }.',\n );\n }\n}\n\nfunction validateAuth(value: unknown): void {\n if (value === 'public') {\n return;\n }\n if (!isPlainObject(value)) {\n throw new DocsConfigError(\n `auth must be 'public' or a workspace configuration object, got ${describe(value)}. ` +\n \"Example: auth: 'public'.\",\n );\n }\n\n const mode: unknown = value['mode'];\n if (mode !== 'workspace') {\n throw new DocsConfigError(`auth.mode must be 'workspace', got ${describe(mode)}.`);\n }\n\n const domains = requireStringArray(value['allowedDomains'], 'auth.allowedDomains', {\n minLength: 1,\n example: \"Example: allowedDomains: ['example.com'].\",\n });\n for (const [index, domain] of domains.entries()) {\n if (domain.includes('@') || !domain.includes('.') || /\\s/.test(domain)) {\n throw new DocsConfigError(\n `auth.allowedDomains[${String(index)}] must be a bare domain like 'example.com', got ${describe(domain)}.`,\n );\n }\n }\n\n validateWorkspaceProviders(value['providers']);\n\n optionalPath(value['signInPath'], 'auth.signInPath');\n optionalString(value['sessionSecretEnv'], 'auth.sessionSecretEnv');\n optionalIntegerInRange(\n value['sessionTtlSeconds'],\n 'auth.sessionTtlSeconds',\n MIN_SESSION_TTL_SECONDS,\n MAX_SESSION_TTL_SECONDS,\n );\n optionalBoolean(value['secureCookies'], 'auth.secureCookies');\n}\n\nfunction validateProxy(value: unknown): void {\n const proxy = requireObject(value, 'proxy', 'Example: proxy: { allowedOrigins: [] }.');\n\n // An empty list is valid: a site that publishes no API reference mounts no\n // proxy route, so it has no upstream to allow.\n const origins = requireStringArray(proxy['allowedOrigins'], 'proxy.allowedOrigins', {\n minLength: 0,\n example: \"Example: allowedOrigins: ['https://api.example.com'].\",\n });\n for (const [index, origin] of origins.entries()) {\n const field = `proxy.allowedOrigins[${String(index)}]`;\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n throw new DocsConfigError(\n `${field} must be an absolute origin like 'https://api.example.com', got ${describe(origin)}.`,\n );\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new DocsConfigError(`${field} must use http or https, got ${describe(origin)}.`);\n }\n }\n\n optionalIntegerInRange(\n proxy['rateLimitPerMinute'],\n 'proxy.rateLimitPerMinute',\n MIN_PROXY_RATE_LIMIT,\n MAX_PROXY_RATE_LIMIT,\n );\n}\n\nfunction validateFeatures(value: unknown): void {\n const features = optionalObject(value, 'features');\n if (features === undefined) {\n return;\n }\n optionalBoolean(features['copyPage'], 'features.copyPage');\n}\n\nfunction validateNavbarAction(value: unknown, field: string): void {\n const action = optionalObject(value, field);\n if (action === undefined) {\n return;\n }\n requireString(action['text'], `${field}.text`, \"Example: 'Dashboard'.\");\n requireString(action['href'], `${field}.href`, \"Example: 'https://app.example.com'.\");\n}\n\nfunction validateNavbar(value: unknown): void {\n const navbar = optionalObject(value, 'navbar');\n if (navbar === undefined) {\n return;\n }\n validateNavbarAction(navbar['primary'], 'navbar.primary');\n validateNavbarAction(navbar['secondary'], 'navbar.secondary');\n}\n\nfunction validateSeo(value: unknown): void {\n const seo = optionalObject(value, 'seo');\n if (seo === undefined) {\n return;\n }\n\n const siteUrl = optionalString(seo['siteUrl'], 'seo.siteUrl');\n if (siteUrl !== undefined) {\n let parsed: URL;\n try {\n parsed = new URL(siteUrl);\n } catch {\n throw new DocsConfigError(\n `seo.siteUrl must be an absolute URL like 'https://docs.example.com', got ${describe(siteUrl)}.`,\n );\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new DocsConfigError(`seo.siteUrl must use http or https, got ${describe(siteUrl)}.`);\n }\n }\n\n const template = optionalString(seo['titleTemplate'], 'seo.titleTemplate');\n if (template !== undefined && !template.includes('%s')) {\n throw new DocsConfigError(\n `seo.titleTemplate must contain '%s' for the page title, got ${describe(template)}. Example: '%s | Example Docs'.`,\n );\n }\n\n optionalString(seo['description'], 'seo.description');\n optionalString(seo['ogImage'], 'seo.ogImage');\n\n const twitter = optionalString(seo['twitter'], 'seo.twitter');\n if (twitter !== undefined && !twitter.startsWith('@')) {\n throw new DocsConfigError(\n `seo.twitter must start with '@', got ${describe(twitter)}. Example: '@example'.`,\n );\n }\n\n if (seo['keywords'] !== undefined) {\n requireStringArray(seo['keywords'], 'seo.keywords', {\n minLength: 0,\n example: \"Example: keywords: ['payments', 'api'].\",\n });\n }\n\n optionalBoolean(seo['noindex'], 'seo.noindex');\n}\n\n/**\n * Validate a site's configuration and return it.\n *\n * {@link defineDocsConfig} calls it, so a site rarely calls it directly. It is\n * exported for a site that loads its configuration from somewhere else — JSON,\n * a remote source, a JavaScript file with no type-checking — and needs the same\n * guarantee.\n *\n * Every field is checked at runtime, and the message names the exact field:\n * `auth.mode must be 'workspace', got 'workspase'.` The `ai` block is delegated\n * to `resolveAiConfig`, the single gate for Ask AI settings, so its messages are\n * identical to the ones the Ask AI route raises.\n *\n * @param config - the site configuration, from any source\n * @returns the same object, typed as {@link DocsConfig}\n * @throws {@link DocsConfigError} when any field outside `ai` is missing or malformed\n * @public\n */\nexport function validateDocsConfig(config: unknown): DocsConfig {\n if (!isPlainObject(config)) {\n throw new DocsConfigError(\n `The docs configuration must be an object, got ${describe(config)}. ` +\n 'Export one object from docs.config.ts.',\n );\n }\n\n validateTheme(config['theme']);\n validateAuth(config['auth']);\n validateProxy(config['proxy']);\n validateNavbar(config['navbar']);\n validateFeatures(config['features']);\n validateSeo(config['seo']);\n\n // Delegate, rather than re-check: resolveAiConfig owns the ai messages, and a\n // second opinion here would eventually contradict it.\n if (config['ai'] !== undefined) {\n resolveAiConfig(config['ai'] as AiConfig);\n }\n\n return config as unknown as DocsConfig;\n}\n\n/**\n * Identity helper that gives a site's `docs.config.ts` full type-checking and\n * editor completion without importing types by hand.\n *\n * It also validates: every field is checked at runtime by\n * {@link validateDocsConfig}, so a malformed value fails when the site builds,\n * with a message that names the field. A JavaScript config file gets the same\n * protection as a TypeScript one.\n *\n * @example\n * ```ts\n * import { defineDocsConfig } from '@blaaiz/docs-core';\n *\n * export default defineDocsConfig({\n * theme: {\n * name: 'Blaaiz',\n * logo: { light: '/logo-light.png', dark: '/logo-dark.png' },\n * colors: { primary: '#4c63f5' },\n * darkColors: { background: '#0a0a0b', card: '#141416' },\n * },\n * auth: {\n * mode: 'workspace',\n * allowedDomains: ['blaaiz.com'],\n * providers: { email: true, google: {} },\n * },\n * proxy: { allowedOrigins: ['https://api-dev.blaaiz.com'] },\n * });\n * ```\n *\n * @param config - the site configuration\n * @returns the same configuration, typed as {@link DocsConfig}\n * @throws {@link DocsConfigError} when any field outside `ai` is missing or malformed\n * @public\n */\nexport function defineDocsConfig(config: DocsConfig): DocsConfig {\n return validateDocsConfig(config);\n}\n","/**\n * Theme → CSS.\n *\n * A site declares its palette in config; the framework turns it into CSS custom\n * properties. This is the seam that lets each organization brand its docs\n * without touching the framework: the values live in the site, the mapping\n * lives here.\n *\n * @packageDocumentation\n */\n\nimport { type ThemeConfig, type ThemePalette } from './config.js';\n\n// Site palette token -> the framework's CSS variable.\nconst TOKEN_TO_VAR: Readonly<Record<keyof ThemePalette, string>> = {\n primary: '--color-fd-primary',\n background: '--color-fd-background',\n foreground: '--color-fd-foreground',\n card: '--color-fd-card',\n border: '--color-fd-border',\n muted: '--color-fd-muted-foreground',\n};\n\nfunction paletteToDeclarations(palette: ThemePalette): string {\n const parts: string[] = [];\n for (const key of Object.keys(TOKEN_TO_VAR) as (keyof ThemePalette)[]) {\n const value = palette[key];\n if (typeof value === 'string' && value.length > 0) {\n parts.push(`${TOKEN_TO_VAR[key]}: ${value};`);\n }\n }\n return parts.join(' ');\n}\n\n/**\n * Build the CSS that applies a site's theme colours. Inject the returned string\n * into a `<style>` tag so it overrides the framework defaults.\n *\n * @param theme - the site's theme configuration\n * @returns a CSS string (empty when no colours are declared)\n * @public\n */\nexport function buildThemeCss(theme: ThemeConfig): string {\n const blocks: string[] = [];\n if (theme.colors) {\n const light = paletteToDeclarations(theme.colors);\n if (light.length > 0) {\n blocks.push(`:root { ${light} }`);\n }\n }\n if (theme.darkColors) {\n const dark = paletteToDeclarations(theme.darkColors);\n if (dark.length > 0) {\n blocks.push(`:root.dark, .dark { ${dark} }`);\n }\n }\n return blocks.join('\\n');\n}\n","/**\n * Permanent redirects for renamed pages. The generator writes\n * `content/redirects.json` (old page URL to current) whenever an operation's\n * URL changes; the site's middleware serves `308`s from it, so an edited\n * summary is a rename with a forwarding address, never a dead link.\n *\n * @packageDocumentation\n */\n\n/**\n * The URL a renamed page's request should be redirected to, or `null` when\n * the request matches no entry. The `.md` form of a renamed page redirects to\n * the `.md` form of its new address.\n *\n * @example\n * ```ts\n * const redirected = redirectTarget(request.nextUrl, redirects);\n * if (redirected) {\n * return NextResponse.redirect(redirected, 308);\n * }\n * ```\n *\n * @param url - the request URL\n * @param redirects - the parsed `content/redirects.json`\n * @returns the redirect target, or `null`\n * @public\n */\nexport function redirectTarget(url: URL, redirects: Readonly<Record<string, string>>): URL | null {\n const { pathname } = url;\n const markdown = pathname.endsWith('.md');\n const page = markdown ? pathname.slice(0, -3) : pathname;\n const destination = redirects[page];\n if (destination === undefined) {\n return null;\n }\n const target = new URL(url);\n target.pathname = markdown ? `${destination}.md` : destination;\n return target;\n}\n","/**\n * The site's `/llms.txt`: a Markdown index of every page, the entry point\n * agents fetch first. Each entry links the page's `.md` address.\n *\n * @packageDocumentation\n */\n\n/**\n * One page of the documentation index.\n *\n * @public\n */\nexport interface LlmsTxtPage {\n readonly title: string;\n /** The page URL (e.g. `/docs/guides/webhooks`); `.md` is appended. */\n readonly url: string;\n readonly description?: string;\n}\n\n/**\n * Options for {@link buildLlmsTxt}.\n *\n * @public\n */\nexport interface BuildLlmsTxtOptions {\n /** The site name, the index's `#` heading. */\n readonly name: string;\n /** One sentence on what the site documents. */\n readonly description?: string;\n /** Absolute origin to prefix every link with (e.g. `https://docs.example.com`). */\n readonly origin?: string;\n}\n\n/**\n * Build the `/llms.txt` document from the site's pages.\n *\n * @example\n * ```ts\n * // app/llms.txt/route.ts\n * export function GET() {\n * const body = buildLlmsTxt(pages, { name: config.theme.name });\n * return new Response(body, { headers: { 'content-type': 'text/plain; charset=utf-8' } });\n * }\n * ```\n *\n * @param pages - the site's pages, in navigation order\n * @param options - the site name, description, and link origin\n * @returns the document text\n * @public\n */\nexport function buildLlmsTxt(pages: readonly LlmsTxtPage[], options: BuildLlmsTxtOptions): string {\n const origin = options.origin?.replace(/\\/$/, '') ?? '';\n const lines = [`# ${options.name}`];\n if (options.description !== undefined && options.description !== '') {\n lines.push('', `> ${options.description}`);\n }\n lines.push('', '## Docs', '');\n for (const page of pages) {\n const link = `[${page.title}](${origin}${page.url}.md)`;\n lines.push(\n page.description === undefined || page.description === ''\n ? `- ${link}`\n : `- ${link}: ${page.description}`,\n );\n }\n lines.push('');\n return lines.join('\\n');\n}\n","/**\n * Code-sample generators for the API reference's usage panel.\n *\n * `fumadocs-openapi` renders one sample per registered generator; a site\n * replaces a built-in one by adding a generator under the same id. The shapes\n * here are structural, so this module needs no fumadocs types.\n *\n * @packageDocumentation\n */\n\n/**\n * One resolved request parameter, as the usage panel passes it.\n *\n * @public\n */\nexport interface CodeUsageValue {\n /** The parameter's example value. */\n readonly value: string;\n}\n\n/**\n * The resolved example request a code-sample generator receives.\n *\n * @public\n */\nexport interface CodeUsageRequest {\n /** The HTTP method. */\n readonly method: string;\n /** The full request URL, path and query resolved. */\n readonly url: string;\n /** Header name to example value. */\n readonly header?: Readonly<Record<string, CodeUsageValue>>;\n /** Cookie name to example value. */\n readonly cookie?: Readonly<Record<string, CodeUsageValue>>;\n /** The example request body, when the operation takes one. */\n readonly body?: unknown;\n /** The body's media type, when the operation takes a body. */\n readonly bodyMediaType?: string;\n}\n\n/**\n * A code-sample generator, shaped for fumadocs-openapi's code-usage registry.\n *\n * @public\n */\nexport interface CodeUsageGenerator {\n /** The tab label readers see. */\n readonly label: string;\n /** The sample's syntax-highlighting language. */\n readonly lang: string;\n /** Render the sample for one resolved example request. */\n generate(data: CodeUsageRequest): string;\n}\n\n/**\n * Wrap in POSIX single quotes. Nothing is escaped inside single quotes, so an\n * embedded quote is written as `'\\''`: close, escaped quote, reopen.\n */\nfunction singleQuote(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * The example body as a string. JSON, url-encoded, and ndjson bodies encode\n * natively; any other media type falls back to pretty-printed JSON.\n */\nfunction bodyToString(body: unknown, mediaType: string): string {\n if (typeof body === 'string') {\n return body;\n }\n if (mediaType === 'application/x-www-form-urlencoded' && isRecord(body)) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(body)) {\n if (value === undefined || value === null) {\n continue;\n }\n const encoded =\n typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'\n ? String(value)\n : JSON.stringify(value);\n params.set(key, encoded);\n }\n return params.toString();\n }\n if (mediaType === 'application/x-ndjson' && Array.isArray(body)) {\n return body.map((entry) => JSON.stringify(entry)).join('\\n');\n }\n return JSON.stringify(body, null, 2);\n}\n\n/**\n * A cURL sample in long-form flags: `--request`, `--url`, `--header`,\n * `--data`. Register it over the built-in `curl` entry:\n *\n * @example\n * ```ts\n * import { curlCodeUsage } from '@blaaiz/docs-core';\n * import { createCodeUsageGeneratorRegistry } from 'fumadocs-openapi/requests/generators';\n * import { registerDefault } from 'fumadocs-openapi/requests/generators/all';\n *\n * const codeUsages = registerDefault(createCodeUsageGeneratorRegistry());\n * codeUsages.add('curl', curlCodeUsage);\n * createOpenAPI({ input, codeUsages });\n * ```\n *\n * @public\n */\nexport const curlCodeUsage: CodeUsageGenerator = {\n label: 'cURL',\n lang: 'bash',\n generate(data: CodeUsageRequest): string {\n const lines = [`curl --request ${data.method.toUpperCase()}`, `--url ${singleQuote(data.url)}`];\n for (const [name, param] of Object.entries(data.header ?? {})) {\n lines.push(`--header ${singleQuote(`${name}: ${param.value}`)}`);\n }\n for (const [name, param] of Object.entries(data.cookie ?? {})) {\n lines.push(`--cookie ${singleQuote(`${name}=${param.value}`)}`);\n }\n if (isRecord(data.body) && data.bodyMediaType === 'multipart/form-data') {\n for (const [key, value] of Object.entries(data.body)) {\n lines.push(\n `--form ${singleQuote(`${key}=${typeof value === 'string' ? value : JSON.stringify(value)}`)}`,\n );\n }\n } else if (data.body !== undefined && data.body !== null && data.bodyMediaType !== undefined) {\n lines.push(`--header ${singleQuote(`Content-Type: ${data.bodyMediaType}`)}`);\n lines.push(`--data ${singleQuote(bodyToString(data.body, data.bodyMediaType))}`);\n }\n return lines.map((line, i) => (i === 0 ? line : ` ${line}`)).join(' \\\\\\n');\n },\n};\n","/**\n * SEO metadata, derived from {@link DocsConfig}.\n *\n * The framework owns *how* metadata is shaped — the title template, the\n * canonical URL, the Open Graph and Twitter cards, the robots policy — so every\n * site gets correct, consistent tags from its config alone. A site owns only\n * the facts: its public origin, its sharing image, its description.\n *\n * These functions return plain objects that are structurally assignable to\n * Next's `Metadata` and `MetadataRoute.*` types, so the framework needs no\n * dependency on `next`. A site uses them directly:\n *\n * ```ts\n * export const metadata: Metadata = buildMetadata(config);\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { DocsConfig } from './config.js';\n\n/**\n * The subset of Next's `Metadata` the framework produces. Literal types are\n * used where Next expects them (`openGraph.type`, `twitter.card`) so the result\n * assigns to `Metadata` without a cast.\n *\n * @public\n */\nexport interface DocsMetadata {\n readonly metadataBase?: URL;\n readonly title: string | { readonly default: string; readonly template: string };\n readonly description?: string;\n // Arrays are mutable so the result assigns to Next's `Metadata` without a cast\n // (Next types these as mutable). Each is a fresh array, so this is safe.\n readonly keywords?: string[];\n readonly alternates?: { readonly canonical?: string };\n /**\n * The site icon, from {@link ThemeConfig.favicon}. Shaped as Next's `Icons`\n * object so the result assigns to `Metadata` without a cast.\n */\n readonly icons?: { readonly icon: string };\n readonly robots?: { readonly index: boolean; readonly follow: boolean };\n readonly openGraph?: {\n readonly type: 'website';\n readonly siteName: string;\n readonly title: string;\n readonly description?: string;\n readonly url?: string;\n readonly images?: { readonly url: string }[];\n };\n readonly twitter?: {\n readonly card: 'summary' | 'summary_large_image';\n readonly title: string;\n readonly description?: string;\n readonly site?: string;\n readonly images?: string[];\n };\n}\n\n/**\n * Per-page metadata inputs. Omit everything for the site-wide default (the home\n * document): the title is then {@link ThemeConfig.name} verbatim and the\n * template is exposed for inner pages.\n *\n * @public\n */\nexport interface PageSeo {\n /** The page title, before the template is applied. */\n readonly title?: string;\n /** The page description; falls back to {@link SeoConfig.description}. */\n readonly description?: string;\n /** The page path for the canonical URL, e.g. `/docs/guides/refunds`. */\n readonly path?: string;\n /** Override the sharing image for this page. */\n readonly ogImage?: string;\n /** Extra keywords for this page, merged with the site-wide set. */\n readonly keywords?: readonly string[];\n /** Keep this page out of the index while the rest stays indexable. */\n readonly noindex?: boolean;\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\n/**\n * Build a page's (or the site's) metadata from config.\n *\n * Call it with no page for the root layout — you get the default title plus the\n * template inner pages inherit. Call it with a {@link PageSeo} in a page's\n * `generateMetadata` for that page's title, canonical URL, and cards.\n *\n * {@link ThemeConfig.favicon} becomes the `icons` field, so declaring the\n * favicon in config is all a site does — no `<link rel=\"icon\">` by hand.\n *\n * @param config - the site configuration\n * @param page - the page's metadata inputs; omit for the site default\n * @returns metadata assignable to Next's `Metadata`\n * @public\n */\nexport function buildMetadata(config: DocsConfig, page: PageSeo = {}): DocsMetadata {\n const name = config.theme.name;\n const seo = config.seo ?? {};\n const template = seo.titleTemplate ?? `%s · ${name}`;\n const siteUrl = seo.siteUrl ? trimTrailingSlash(seo.siteUrl) : undefined;\n\n const isDefault = page.title === undefined;\n const displayTitle = isDefault ? name : template.replace('%s', page.title);\n const description = page.description ?? seo.description;\n const path = page.path ?? '/';\n const ogImage = page.ogImage ?? seo.ogImage;\n const favicon = config.theme.favicon;\n const indexable = !(page.noindex ?? seo.noindex ?? false);\n const keywords = [...(seo.keywords ?? []), ...(page.keywords ?? [])];\n\n return {\n ...(siteUrl ? { metadataBase: new URL(siteUrl) } : {}),\n title: isDefault ? { default: name, template } : page.title,\n ...(description ? { description } : {}),\n ...(keywords.length ? { keywords } : {}),\n alternates: { canonical: path },\n ...(favicon ? { icons: { icon: favicon } } : {}),\n robots: { index: indexable, follow: indexable },\n openGraph: {\n type: 'website',\n siteName: name,\n title: displayTitle,\n ...(description ? { description } : {}),\n url: path,\n ...(ogImage ? { images: [{ url: ogImage }] } : {}),\n },\n twitter: {\n card: ogImage ? 'summary_large_image' : 'summary',\n title: displayTitle,\n ...(description ? { description } : {}),\n ...(seo.twitter ? { site: seo.twitter } : {}),\n ...(ogImage ? { images: [ogImage] } : {}),\n },\n };\n}\n\n/**\n * A robots policy, assignable to Next's `MetadataRoute.Robots`.\n *\n * @public\n */\nexport interface DocsRobots {\n readonly rules: {\n readonly userAgent: string;\n readonly allow?: string;\n readonly disallow?: string | string[];\n };\n readonly sitemap?: string;\n readonly host?: string;\n}\n\n/**\n * Build the robots policy. A `noindex` (or auth-gated) site disallows crawling\n * entirely; a public site allows everything except the sign-in and API routes,\n * which carry no indexable content. Points crawlers at the sitemap when a\n * `siteUrl` is set.\n *\n * @param config - the site configuration\n * @returns robots rules for `app/robots.ts`\n * @public\n */\nexport function buildRobots(config: DocsConfig): DocsRobots {\n const seo = config.seo ?? {};\n const siteUrl = seo.siteUrl ? trimTrailingSlash(seo.siteUrl) : undefined;\n const blocked = seo.noindex ?? false;\n\n return {\n rules: blocked\n ? { userAgent: '*', disallow: '/' }\n : { userAgent: '*', allow: '/', disallow: ['/signin', '/api/'] },\n ...(siteUrl && !blocked ? { sitemap: `${siteUrl}/sitemap.xml`, host: siteUrl } : {}),\n };\n}\n\n/**\n * One sitemap entry a site supplies (typically from the page tree).\n *\n * @public\n */\nexport interface SitemapEntry {\n /** Site-relative path, e.g. `/docs/guides/refunds`. */\n readonly path: string;\n /** Last-modified date, if known. */\n readonly lastModified?: Date | string;\n}\n\n/**\n * How often a crawler should revisit a page. The values Google documents for\n * `<changefreq>`.\n *\n * @public\n */\nexport type SitemapChangeFrequency =\n 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';\n\n/**\n * A resolved sitemap row, assignable to Next's `MetadataRoute.Sitemap[number]`.\n *\n * @public\n */\nexport interface DocsSitemapEntry {\n readonly url: string;\n readonly lastModified?: Date | string;\n readonly changeFrequency: SitemapChangeFrequency;\n readonly priority: number;\n}\n\n/**\n * Overrides for {@link buildSitemap}. Every field is optional, and the defaults\n * suit a documentation site that publishes continuously.\n *\n * @public\n */\nexport interface BuildSitemapOptions {\n /** Revisit hint for every row. Default `'weekly'`. */\n readonly changeFrequency?: SitemapChangeFrequency;\n /** Priority for every page except the home path. Default `0.7`. */\n readonly priority?: number;\n /** Priority for the home path (`/`). Default `1`. */\n readonly homePriority?: number;\n}\n\n/**\n * Build sitemap rows from the site's pages. The home path gets top priority;\n * everything else a shade lower. Absolute URLs need a `siteUrl` in config;\n * without one the paths are emitted relative, which most crawlers still accept.\n *\n * A site that publishes on a slower cycle, or that wants its guides to outrank\n * its generated reference pages, overrides the defaults:\n *\n * @example\n * ```ts\n * buildSitemap(entries, config, { changeFrequency: 'monthly', priority: 0.5 });\n * ```\n *\n * @param entries - the site's page paths (and optional modified dates)\n * @param config - the site configuration, for the origin\n * @param options - override the revisit hint and the priorities\n * @returns sitemap rows for `app/sitemap.ts`\n * @public\n */\nexport function buildSitemap(\n entries: readonly SitemapEntry[],\n config: DocsConfig,\n options: BuildSitemapOptions = {},\n): DocsSitemapEntry[] {\n const seo = config.seo ?? {};\n const siteUrl = seo.siteUrl ? trimTrailingSlash(seo.siteUrl) : '';\n const changeFrequency = options.changeFrequency ?? 'weekly';\n const pagePriority = options.priority ?? 0.7;\n const homePriority = options.homePriority ?? 1;\n\n return entries.map((entry) => {\n const path = entry.path.startsWith('/') ? entry.path : `/${entry.path}`;\n return {\n url: `${siteUrl}${path}`,\n ...(entry.lastModified ? { lastModified: entry.lastModified } : {}),\n changeFrequency,\n priority: path === '/' ? homePriority : pagePriority,\n };\n });\n}\n","/**\n * Turns the normalized navigation into a content-tree plan: which folders and\n * `meta.json` files encode the navigation, and where each API page belongs.\n * The site's `docs.json` stays the single source of truth — authors reorganize\n * routes and groups by editing one file, never by moving generated files.\n *\n * The planner is pure; `@blaaiz/docs-core/generator` executes the plan.\n *\n * @packageDocumentation\n */\n\nimport type { NavGroup, NavItem, NavTab, Navigation } from './navigation.js';\n\n/**\n * A planned API reference page: one operation and the folder it belongs to.\n *\n * @public\n */\nexport interface PlannedApiPage {\n /** Spec file reference from `docs.json`, relative to the content directory. */\n readonly file: string;\n /** The operation's HTTP method. */\n readonly method: string;\n /** The operation's API route. */\n readonly apiPath: string;\n /** Output folder, relative to the docs output directory (e.g. `api/authentication`). */\n readonly dir: string;\n /** Position within the group. */\n readonly order: number;\n}\n\n/**\n * A child folder of a planned API group, at its position among the group's\n * pages. The generator merges these with the resolved page slugs to write the\n * group's `meta.json` in declared order.\n *\n * @public\n */\nexport interface PlannedGroupChild {\n readonly order: number;\n /** The child folder's name within the group directory. */\n readonly folder: string;\n /** The child group's title, for the heading the `headings` style renders. */\n readonly title: string;\n}\n\n/**\n * A planned API group folder. The generator fills its page order once the\n * operation slugs are known, interleaving {@link PlannedGroupChild} folders at\n * their declared positions. A group with `root: true` is an API tab's folder.\n *\n * @public\n */\nexport interface PlannedApiGroup {\n readonly dir: string;\n readonly title: string;\n readonly children: readonly PlannedGroupChild[];\n /** Set on an API tab's own folder, so the sidebar scopes to the tab. */\n readonly root?: boolean;\n /** The tab's icon, on a `root` group. */\n readonly icon?: string;\n}\n\n/**\n * A doc page declared inside an API tab, at its position among the group's\n * operations. The generator links it into the group's `meta.json`: the page\n * keeps living in its own folder, outside the generated tree.\n *\n * @public\n */\nexport interface PlannedApiDocLink {\n /** Page path relative to the docs output directory, without extension. */\n readonly file: string;\n /** The generated group folder whose meta lists the link. */\n readonly dir: string;\n /** Position within the group. */\n readonly order: number;\n}\n\n/**\n * A `meta.json` file the plan wants written.\n *\n * @public\n */\nexport interface PlannedMeta {\n /** Path relative to the docs output directory, e.g. `guides/meta.json`. */\n readonly path: string;\n readonly content: Record<string, unknown>;\n}\n\n/**\n * The complete content-tree plan for one navigation.\n *\n * @public\n */\nexport interface DocsTreePlan {\n /** Unique spec files referenced by the navigation, in order of appearance. */\n readonly specs: readonly string[];\n readonly apiPages: readonly PlannedApiPage[];\n readonly apiGroups: readonly PlannedApiGroup[];\n /** Fully-known meta files: the root, doc tab folders, and doc groups. */\n readonly metas: readonly PlannedMeta[];\n /**\n * Doc pages declared inside API tabs, each linked into its group's meta at\n * its declared position.\n */\n readonly apiDocLinks: readonly PlannedApiDocLink[];\n}\n\n/**\n * How the sidebar presents a tab's top-level groups.\n *\n * - `collapsible`: every group is a collapsible folder (the fumadocs default).\n * - `headings`: a top-level group is a flat, always-open section heading with\n * its pages listed beneath it; only nested groups collapse, and they start\n * closed. The Mintlify presentation.\n *\n * @public\n */\nexport type SidebarStyle = 'collapsible' | 'headings';\n\n/**\n * Options for {@link planDocsTree}.\n *\n * @public\n */\nexport interface PlanDocsTreeOptions {\n /** Folder for generated API pages when one tab publishes them. Default `api`. */\n readonly apiDir?: string;\n /** The sidebar's group presentation. Default `collapsible`. */\n readonly sidebar?: SidebarStyle;\n}\n\n/** Kebab-case a title into a folder name. */\nfunction slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction isOpenApi(item: NavItem): boolean {\n return item.kind === 'openapi';\n}\n\n/** Whether any item in the run, at any depth, references an OpenAPI file. */\nexport function hasOpenApi(items: readonly NavItem[]): boolean {\n return items.some((item) => (item.kind === 'group' ? hasOpenApi(item.items) : isOpenApi(item)));\n}\n\n/** The basename of a doc page path (its file name in the folder). */\nfunction basename(file: string): string {\n const i = file.lastIndexOf('/');\n return i === -1 ? file : file.slice(i + 1);\n}\n\n/** The directory of a doc page path, or '' for a root page. */\nfunction dirname(file: string): string {\n const i = file.lastIndexOf('/');\n return i === -1 ? '' : file.slice(0, i);\n}\n\n/** The first doc page in a group, descending nested groups in order. */\nfunction firstDocFile(items: readonly NavItem[]): string | undefined {\n for (const item of items) {\n if (item.kind === 'doc') {\n return item.file;\n }\n if (item.kind === 'group') {\n const found = firstDocFile(item.items);\n if (found !== undefined) {\n return found;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Plan the content tree for a navigation.\n *\n * Conventions (Mintlify-shaped):\n * - A tab whose items reference OpenAPI files becomes an API tab. With one API\n * tab its folder is `apiDir`; with several, each tab's folder is its\n * slugified title, so tabs never collide. Groups become nested folders named\n * by slugified group title, to any depth.\n * - A tab of doc pages becomes the folder its pages share (their first path\n * segment); a doc group's pages must share one directory. Doc groups nest.\n * - Root-level doc pages (no `/` in the path) are listed in the root meta.\n * - Tab folders get `root: true`, so the sidebar scopes to the active tab.\n * - Sidebar order is declaration order, pages and groups interleaved.\n * - With `sidebar: 'headings'`, a tab-level group renders as a flat heading\n * with its pages extracted beneath it, and nested groups start closed.\n *\n * @param navigation - the parsed navigation\n * @param options - the API folder name and the sidebar style\n * @returns the plan the generator executes\n * @throws when two sibling groups slugify to the same folder\n * @public\n */\nexport function planDocsTree(\n navigation: Navigation,\n options: PlanDocsTreeOptions = {},\n): DocsTreePlan {\n const apiDir = options.apiDir ?? 'api';\n const headings = (options.sidebar ?? 'collapsible') === 'headings';\n\n const specs: string[] = [];\n const apiPages: PlannedApiPage[] = [];\n const apiGroups: PlannedApiGroup[] = [];\n const metas: PlannedMeta[] = [];\n const rootPages: string[] = [];\n const apiDocLinks: PlannedApiDocLink[] = [];\n\n const apiTabs = navigation.filter((tab) => hasOpenApi(tab.items));\n const soleApiTab = apiTabs.length === 1;\n\n for (const tab of navigation) {\n if (hasOpenApi(tab.items)) {\n planApiTab(tab);\n continue;\n }\n planDocTab(tab);\n }\n\n metas.unshift({ path: 'meta.json', content: { pages: rootPages } });\n\n return { specs, apiPages, apiGroups, metas, apiDocLinks };\n\n function planApiTab(tab: NavTab): void {\n const tabDir = soleApiTab ? apiDir : slugify(tab.title);\n rootPages.push(tabDir);\n const at = apiGroups.length;\n const children = planApiItems(tab.items, tabDir);\n apiGroups.splice(at, 0, {\n dir: tabDir,\n title: tab.title,\n root: true,\n ...(tab.icon ? { icon: tab.icon } : {}),\n children,\n });\n }\n\n /**\n * Plan a run of API-tab items into `dir`: operations become planned pages,\n * nested groups become child folders, and doc pages become links into the\n * group's meta. Returns the child folders at their declared positions.\n */\n function planApiItems(items: readonly NavItem[], dir: string): PlannedGroupChild[] {\n const children: PlannedGroupChild[] = [];\n const takenFolders = new Set<string>();\n let order = 0;\n for (const item of items) {\n if (item.kind === 'group') {\n const folder = slugify(item.title);\n if (takenFolders.has(folder)) {\n throw new Error(\n `[docs-core] Two sibling groups under '${dir}' share the folder name '${folder}'. ` +\n 'Rename one of the groups in docs.json.',\n );\n }\n takenFolders.add(folder);\n const childDir = `${dir}/${folder}`;\n const at = apiGroups.length;\n const sub = planApiItems(item.items, childDir);\n apiGroups.splice(at, 0, { dir: childDir, title: item.title, children: sub });\n children.push({ order, folder, title: item.title });\n order += 1;\n continue;\n }\n if (item.kind === 'openapi') {\n if (!specs.includes(item.file)) {\n specs.push(item.file);\n }\n apiPages.push({ file: item.file, method: item.method, apiPath: item.apiPath, dir, order });\n order += 1;\n continue;\n }\n apiDocLinks.push({ file: item.file, dir, order });\n order += 1;\n }\n return children;\n }\n\n function planDocTab(tab: NavTab): void {\n const directPages = tab.items.filter((item) => item.kind === 'doc');\n const groups = tab.items.filter((item) => item.kind === 'group');\n\n // A tab of root-level pages (e.g. Home -> index) lists them at the root.\n if (groups.length === 0 && directPages.every((page) => !page.file.includes('/'))) {\n for (const page of directPages) {\n rootPages.push(page.file);\n }\n return;\n }\n\n // The tab folder is the first path segment its pages share.\n const firstFile = firstDocFile(tab.items);\n if (firstFile === undefined) {\n return;\n }\n const tabDir = firstFile.split('/')[0] ?? '';\n rootPages.push(tabDir);\n\n metas.push({\n path: `${tabDir}/meta.json`,\n content: {\n title: tab.title,\n root: true,\n ...(tab.icon ? { icon: tab.icon } : {}),\n pages: planDocItems(tab.items, tabDir, true),\n },\n });\n }\n\n /**\n * Plan a run of doc-tab items belonging to the folder `dir`: pages are\n * listed by basename, nested groups get their own `meta.json` and are\n * listed by their folder path relative to `dir`. A nested group whose pages\n * live directly in `dir` is flattened into it. In the `headings` style a\n * tab-level group lists as a separator heading plus its extracted children,\n * and a flattened group keeps its title as a separator. Returns the meta\n * entries in declared order.\n */\n function planDocItems(items: readonly NavItem[], dir: string, tabLevel: boolean): string[] {\n const entries: string[] = [];\n for (const item of items) {\n if (item.kind === 'doc') {\n entries.push(basename(item.file));\n continue;\n }\n if (item.kind !== 'group') {\n continue;\n }\n const groupDir = planDocGroup(item, dir);\n if (groupDir === null) {\n continue;\n }\n if (groupDir === dir) {\n // The group's pages live directly in this folder.\n if (headings) {\n entries.push(`---${item.title}---`);\n }\n entries.push(...planDocItems(item.items, dir, false));\n continue;\n }\n const folder = groupDir.slice(dir.length + 1);\n if (headings && tabLevel) {\n entries.push(`---${item.title}---`, `...${folder}`);\n continue;\n }\n entries.push(folder);\n }\n return entries;\n }\n\n /**\n * Plan one doc group. Returns the group's directory, `dir` itself when the\n * group flattens into its parent folder, or `null` for an empty group.\n */\n function planDocGroup(group: NavGroup, dir: string): string | null {\n const firstFile = firstDocFile(group.items);\n if (firstFile === undefined) {\n return null;\n }\n const groupDir = dirname(firstFile);\n if (groupDir === dir || groupDir === '') {\n return dir;\n }\n metas.push({\n path: `${groupDir}/meta.json`,\n content: {\n title: group.title,\n // A nested group starts closed in the headings style, whatever the\n // site's defaultOpenLevel. On a tab-level group the flag is inert:\n // that folder is extracted, so no folder node renders it.\n ...(headings ? { defaultOpen: false } : {}),\n pages: planDocItems(group.items, groupDir, false),\n },\n });\n return groupDir;\n }\n}\n","/**\n * OpenAPI-to-Markdown rendering for LLM corpora.\n *\n * A generated API reference page renders its parameters, schemas, and\n * responses at runtime from the OpenAPI document — none of that text exists in\n * the page's MDX. Ask AI and the `/md` route need it as text, so this module\n * renders one operation from the document into compact, deterministic\n * Markdown: auth requirements, parameters, request-body fields with types,\n * required markers, enums and defaults, and response shapes.\n *\n * The input document is site content and is never trusted: every lookup is\n * type-checked and malformed fragments are skipped rather than thrown on.\n * Recursion is bounded twice — a `seen` set of open `$ref` targets stops\n * self-referencing schemas, and a depth cap bounds legitimately deep nesting\n * with an explicit elision marker.\n *\n * @packageDocumentation\n */\n\nimport type { OpenApiDocument } from './openapi-types.js';\n\n/**\n * Addresses one operation inside an OpenAPI document.\n *\n * @public\n */\nexport interface OpenApiOperationRef {\n /** The path key, exactly as it appears under `paths`. */\n readonly path: string;\n /** The HTTP method, case-insensitive. */\n readonly method: string;\n}\n\ntype JsonObject = Record<string, unknown>;\n\n/** How deep nested request/response fields are rendered before being elided. */\nconst MAX_FIELD_DEPTH = 3;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/** Resolve a local (`#/…`) JSON pointer against the document. */\nfunction resolvePointer(document: OpenApiDocument, pointer: string): unknown {\n if (!pointer.startsWith('#/')) {\n return undefined;\n }\n let node: unknown = document;\n for (const rawSegment of pointer.slice(2).split('/')) {\n const segment = rawSegment.replaceAll('~1', '/').replaceAll('~0', '~');\n if (!isObject(node)) {\n return undefined;\n }\n node = node[segment];\n }\n return node;\n}\n\n/**\n * The set of `$ref` targets already being rendered on the current recursion\n * path, extended with `schema`'s own ref when it has one. Passing the result\n * down keeps a self-referencing schema from re-entering itself.\n */\nfunction withRef(schema: unknown, seen: ReadonlySet<string>): ReadonlySet<string> {\n const ref = isObject(schema) ? asString(schema['$ref']) : undefined;\n return ref === undefined || seen.has(ref) ? seen : new Set([...seen, ref]);\n}\n\n/**\n * Resolve one node to a plain object: follow `$ref` chains (cycle-guarded via\n * `seen`) and flatten `allOf` compositions into one object by merging\n * properties and unioning `required`. Used for schemas, parameters, request\n * bodies, and responses alike — they all resolve the same way.\n */\nfunction derefNode(\n document: OpenApiDocument,\n schema: unknown,\n seen: ReadonlySet<string>,\n): JsonObject | undefined {\n if (!isObject(schema)) {\n return undefined;\n }\n const ref = asString(schema['$ref']);\n if (ref !== undefined) {\n if (seen.has(ref)) {\n return undefined;\n }\n return derefNode(document, resolvePointer(document, ref), new Set([...seen, ref]));\n }\n const allOf = schema['allOf'];\n if (Array.isArray(allOf)) {\n const merged: JsonObject = { ...schema };\n delete merged['allOf'];\n const properties: JsonObject = {};\n const required: string[] = [];\n for (const member of allOf) {\n const resolved = derefNode(document, member, seen);\n if (resolved === undefined) {\n continue;\n }\n for (const [key, value] of Object.entries(resolved)) {\n if (key === 'properties' && isObject(value)) {\n Object.assign(properties, value);\n } else if (key === 'required' && Array.isArray(value)) {\n required.push(...value.filter((entry): entry is string => typeof entry === 'string'));\n } else if (!(key in merged)) {\n merged[key] = value;\n }\n }\n }\n if (Object.keys(properties).length > 0) {\n merged['properties'] = {\n ...properties,\n ...(isObject(merged['properties']) ? merged['properties'] : {}),\n };\n }\n if (required.length > 0) {\n const own = Array.isArray(merged['required'])\n ? merged['required'].filter((entry): entry is string => typeof entry === 'string')\n : [];\n merged['required'] = [...new Set([...required, ...own])];\n }\n if (merged['type'] === undefined && isObject(merged['properties'])) {\n merged['type'] = 'object';\n }\n return merged;\n }\n return schema;\n}\n\n/** A short human label for a schema's type: `string (email)`, `array of Recipient`, … */\nfunction typeLabel(document: OpenApiDocument, schema: unknown, seen: ReadonlySet<string>): string {\n if (!isObject(schema)) {\n return 'unknown';\n }\n const ref = asString(schema['$ref']);\n const refName = ref?.split('/').at(-1);\n const resolved = derefNode(document, schema, seen);\n if (resolved === undefined) {\n return refName ?? 'unknown';\n }\n const type = asString(resolved['type']);\n if (refName !== undefined && (type === 'object' || isObject(resolved['properties']))) {\n return refName;\n }\n if (type === 'array') {\n return `array of ${typeLabel(document, resolved['items'], seen)}`;\n }\n if (Array.isArray(resolved['oneOf']) || Array.isArray(resolved['anyOf'])) {\n const variants = (resolved['oneOf'] ?? resolved['anyOf']) as unknown[];\n return `one of ${String(variants.length)} shapes`;\n }\n if (type === undefined) {\n return isObject(resolved['properties']) ? 'object' : (ref?.split('/').at(-1) ?? 'unknown');\n }\n const format = asString(resolved['format']);\n return format === undefined ? type : `${type} (${format})`;\n}\n\n/**\n * Renders one `- \\`name\\` (type, required) — description…` field line. The\n * parenthetical is built here and only here; `location` (a parameter's `in`)\n * joins it as `(in: query, string, required)`.\n */\nfunction fieldLine(\n document: OpenApiDocument,\n name: string,\n schema: JsonObject,\n required: boolean,\n indent: string,\n seen: ReadonlySet<string>,\n location?: string,\n): string {\n const label = typeLabel(document, schema, seen);\n const resolved = derefNode(document, schema, seen) ?? schema;\n const notes: string[] = [];\n const description = asString(resolved['description']);\n if (description !== undefined && description !== '') {\n notes.push(description.replaceAll(/\\s*\\n\\s*/g, ' ').trim());\n }\n const enumValues = resolved['enum'];\n if (Array.isArray(enumValues) && enumValues.length > 0) {\n notes.push(`One of: ${enumValues.map((value) => `\\`${String(value)}\\``).join(', ')}.`);\n }\n const defaultValue = resolved['default'];\n if (\n typeof defaultValue === 'string' ||\n typeof defaultValue === 'number' ||\n typeof defaultValue === 'boolean'\n ) {\n notes.push(`Default: \\`${String(defaultValue)}\\`.`);\n }\n const example = resolved['example'];\n if (\n (typeof example === 'string' || typeof example === 'number' || typeof example === 'boolean') &&\n String(example).length <= 60\n ) {\n notes.push(`Example: \\`${String(example)}\\`.`);\n }\n if (resolved['deprecated'] === true) {\n notes.push('Deprecated.');\n }\n const detail = notes.length > 0 ? ` — ${notes.join(' ')}` : '';\n const parenthetical = [\n ...(location === undefined ? [] : [`in: ${location}`]),\n label,\n ...(required ? ['required'] : []),\n ].join(', ');\n return `${indent}- \\`${name}\\` (${parenthetical})${detail}`;\n}\n\n/**\n * Render an object schema's properties as nested field lines. Two guards\n * bound the recursion, and both are enforced here at the single entry point:\n * the depth cap emits an explicit elision marker, and the `seen` set of open\n * `$ref` targets stops a self-referencing schema from re-entering itself —\n * whichever path it recurses through (properties, arrays, or variants).\n */\nfunction schemaFieldLines(\n document: OpenApiDocument,\n schema: unknown,\n depth: number,\n seen: ReadonlySet<string>,\n): string[] {\n if (depth >= MAX_FIELD_DEPTH) {\n return [`${' '.repeat(depth)}- (nested fields omitted at this depth)`];\n }\n const scope = withRef(schema, seen);\n const resolved = derefNode(document, schema, seen);\n if (resolved === undefined) {\n return [];\n }\n if (asString(resolved['type']) === 'array') {\n return schemaFieldLines(document, resolved['items'], depth, withRef(resolved['items'], scope));\n }\n const properties = resolved['properties'];\n const variants = resolved['oneOf'] ?? resolved['anyOf'];\n // A schema may carry both: its own properties plus alternative shapes. A\n // variant with no renderable fields is often a titled example — its title\n // alone is still worth a line; a variant with neither is skipped.\n const variantLines = Array.isArray(variants)\n ? variants.flatMap((variant, index) => {\n const inner = schemaFieldLines(document, variant, depth + 1, scope);\n const title = asString(derefNode(document, variant, scope)?.['title']);\n if (inner.length === 0 && title === undefined) {\n return [];\n }\n const label = title ?? typeLabel(document, variant, scope);\n const head = `${' '.repeat(depth)}- Shape ${String(index + 1)} (${label})${inner.length > 0 ? ':' : ''}`;\n return [head, ...inner];\n })\n : [];\n if (!isObject(properties)) {\n return variantLines;\n }\n const required = new Set(\n Array.isArray(resolved['required'])\n ? resolved['required'].filter((entry): entry is string => typeof entry === 'string')\n : [],\n );\n const indent = ' '.repeat(depth);\n const lines: string[] = [];\n for (const [name, property] of Object.entries(properties)) {\n if (!isObject(property)) {\n continue;\n }\n lines.push(fieldLine(document, name, property, required.has(name), indent, scope));\n const propertyScope = withRef(property, scope);\n const child = derefNode(document, property, scope);\n if (child === undefined) {\n continue;\n }\n const items = asString(child['type']) === 'array' ? child['items'] : undefined;\n const nestedScope = items === undefined ? propertyScope : withRef(items, propertyScope);\n const nested = items === undefined ? child : derefNode(document, items, propertyScope);\n const hasNestedFields =\n nested !== undefined &&\n (isObject(nested['properties']) ||\n Array.isArray(nested['oneOf']) ||\n Array.isArray(nested['anyOf']));\n if (!hasNestedFields) {\n continue;\n }\n lines.push(...schemaFieldLines(document, nested, depth + 1, nestedScope));\n }\n return lines;\n}\n\n/** `Auth: oauth2ClientCredentials (scopes: payout:create)` from a security array. */\nfunction securityLine(document: OpenApiDocument, operation: JsonObject): string | undefined {\n const security = operation['security'] ?? document.security;\n if (!Array.isArray(security) || security.length === 0) {\n return undefined;\n }\n const requirements = security\n .filter(isObject)\n .map((entry) =>\n Object.entries(entry)\n .map(([scheme, scopes]) => {\n const scopeList = Array.isArray(scopes)\n ? scopes.filter((scope): scope is string => typeof scope === 'string')\n : [];\n return scopeList.length > 0 ? `${scheme} (scopes: ${scopeList.join(', ')})` : scheme;\n })\n .join(' + '),\n )\n .filter((entry) => entry !== '');\n return requirements.length > 0 ? `Auth: ${requirements.join(' or ')}` : undefined;\n}\n\n/** The JSON media type's schema if present, else the first media type's. */\nfunction bodySchema(content: unknown): { mediaType: string; schema: unknown } | undefined {\n if (!isObject(content)) {\n return undefined;\n }\n const mediaType = 'application/json' in content ? 'application/json' : Object.keys(content)[0];\n if (mediaType === undefined) {\n return undefined;\n }\n const media = content[mediaType];\n return isObject(media) ? { mediaType, schema: media['schema'] } : undefined;\n}\n\n/**\n * Render one operation from an OpenAPI document as compact Markdown: auth,\n * parameters, request-body fields, and response shapes. The page-level title\n * and description are deliberately not rendered — the caller already has them\n * from the page frontmatter.\n *\n * Returns `null` when the document has no such operation.\n *\n * @param document - the (merged) OpenAPI document\n * @param ref - the operation's path and method\n * @returns Markdown for the operation, or `null` when it is not found\n * @public\n */\nexport function openApiOperationToMarkdown(\n document: OpenApiDocument,\n ref: OpenApiOperationRef,\n): string | null {\n const pathItem: unknown = isObject(document.paths) ? document.paths[ref.path] : undefined;\n if (!isObject(pathItem)) {\n return null;\n }\n const operation = pathItem[ref.method.toLowerCase()];\n if (!isObject(operation)) {\n return null;\n }\n const seen: ReadonlySet<string> = new Set();\n const sections: string[] = [];\n\n if (operation['deprecated'] === true) {\n sections.push('**Deprecated.**');\n }\n const auth = securityLine(document, operation);\n if (auth !== undefined) {\n sections.push(auth);\n }\n\n const parameters = operation['parameters'];\n if (Array.isArray(parameters)) {\n const lines = parameters\n .map((parameter: unknown) => derefNode(document, parameter, seen) ?? parameter)\n .filter(isObject)\n .flatMap((parameter) => {\n const name = asString(parameter['name']);\n if (name === undefined) {\n return [];\n }\n const where = asString(parameter['in']) ?? 'query';\n const schema = isObject(parameter['schema']) ? parameter['schema'] : {};\n return [fieldLine(document, name, schema, parameter['required'] === true, '', seen, where)];\n });\n if (lines.length > 0) {\n sections.push(`## Parameters\\n\\n${lines.join('\\n')}`);\n }\n }\n\n const requestBody = derefNode(document, operation['requestBody'], seen);\n if (requestBody !== undefined) {\n const body = bodySchema(requestBody['content']);\n if (body !== undefined) {\n const lines = schemaFieldLines(document, body.schema, 0, seen);\n const requiredNote = requestBody['required'] === true ? ', required' : '';\n const heading = `## Request body (${body.mediaType}${requiredNote})`;\n sections.push(lines.length > 0 ? `${heading}\\n\\n${lines.join('\\n')}` : heading);\n }\n }\n\n const responses = operation['responses'];\n if (isObject(responses)) {\n const lines: string[] = [];\n for (const [status, rawResponse] of Object.entries(responses)) {\n const response = derefNode(document, rawResponse, seen) ?? rawResponse;\n if (!isObject(response)) {\n continue;\n }\n const description = asString(response['description'])\n ?.replaceAll(/\\s*\\n\\s*/g, ' ')\n .trim();\n lines.push(\n `- \\`${status}\\`${description !== undefined && description !== '' ? ` — ${description}` : ''}`,\n );\n const body = bodySchema(response['content']);\n if (body !== undefined) {\n lines.push(...schemaFieldLines(document, body.schema, 1, seen));\n }\n }\n if (lines.length > 0) {\n sections.push(`## Responses\\n\\n${lines.join('\\n')}`);\n }\n }\n\n return sections.length > 0 ? sections.join('\\n\\n') : null;\n}\n","/**\n * Page-to-Markdown conversion for the \"Copy page / View as Markdown\" feature.\n *\n * A docs page is authored in MDX: frontmatter, prose, and JSX components. An\n * LLM wants none of that machinery — it wants clean Markdown. This module turns\n * a raw MDX source into readable Markdown, and builds a runtime-agnostic route\n * that serves it as `text/plain`.\n *\n * The transform is pure (string in, string out) and the route takes the content\n * reader as an injected function, so `core` never touches a filesystem or a\n * framework: the consuming site decides where its MDX lives.\n *\n * @packageDocumentation\n */\n\nimport { openApiOperationToMarkdown } from './openapi-markdown.js';\nimport type { OpenApiDocument } from './openapi-types.js';\n\n/**\n * Reads the raw MDX source for a page, addressed by its route slug segments\n * (`undefined` or `[]` for the index). Returns `null` when no such page exists.\n *\n * The site owns this: it knows where its content directory is.\n *\n * @public\n */\nexport type MdxReader = (slug: readonly string[] | undefined) => Promise<string | null>;\n\n/**\n * Options for {@link mdxToMarkdown}.\n *\n * @public\n */\nexport interface MdxToMarkdownOptions {\n /** Heading used when the source declares no `title` in frontmatter. */\n readonly fallbackTitle?: string;\n /**\n * Named OpenAPI documents, keyed by the document name the generated page\n * references (`document=\"…\"`). When the page's document is present, its\n * operations are rendered in full — auth, parameters, request-body fields,\n * and responses — instead of the bare `METHOD /path` line. When a page\n * names no document and exactly one is supplied, that one is used.\n */\n readonly openApiDocuments?: Readonly<Record<string, OpenApiDocument>>;\n}\n\n/** The two halves of an MDX file: the inner frontmatter text and the body. */\ninterface FrontmatterSplit {\n /** Text between the `---` delimiters, without them. Empty when absent. */\n readonly frontmatter: string;\n readonly body: string;\n}\n\n/**\n * Split a raw MDX source into its frontmatter block and body. The block must\n * open on the very first line and close on a later line holding only `---`\n * (no indentation — an indented `---` inside a block scalar does not close\n * it). A file with no block, or an unterminated one, is all body.\n */\nfunction splitFrontmatter(raw: string): FrontmatterSplit {\n const lines = raw.split('\\n');\n if (!/^---\\s*$/.test(lines[0] ?? '')) {\n return { frontmatter: '', body: raw };\n }\n for (let i = 1; i < lines.length; i++) {\n if (/^---\\s*$/.test(lines[i] ?? '')) {\n return { frontmatter: lines.slice(1, i).join('\\n'), body: lines.slice(i + 1).join('\\n') };\n }\n }\n return { frontmatter: '', body: raw };\n}\n\n/** Strip one matching pair of surrounding quotes, if present. */\nfunction stripQuotes(value: string): string {\n const quote = value[0];\n if ((quote === '\"' || quote === \"'\") && value.length >= 2 && value.endsWith(quote)) {\n return value.slice(1, -1);\n }\n return value;\n}\n\n/**\n * Join block-scalar lines the way YAML folding does: adjacent text lines merge\n * with a space, blank lines become newlines, and more-indented lines keep\n * their line breaks (they are literal in a folded scalar).\n */\nfunction foldLines(lines: readonly string[]): string {\n let out = '';\n let previous: 'start' | 'text' | 'blank' | 'literal' = 'start';\n for (const line of lines) {\n if (line === '') {\n out += '\\n';\n previous = 'blank';\n continue;\n }\n const literal = /^[ \\t]/.test(line);\n if (previous === 'text') {\n out += literal ? '\\n' : ' ';\n } else if (previous === 'literal') {\n out += '\\n';\n }\n out += line;\n previous = literal ? 'literal' : 'text';\n }\n return out;\n}\n\n/**\n * Read a YAML block scalar (`|` literal or `>` folded) that starts on the line\n * after its header. The block is every following line that is blank or\n * indented; its indent is set by the first non-blank line.\n */\nfunction readBlockScalar(\n lines: readonly string[],\n start: number,\n style: '|' | '>',\n): string | undefined {\n const collected: string[] = [];\n for (let i = start; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (line.trim() !== '' && !/^[ \\t]/.test(line)) {\n break;\n }\n collected.push(line);\n }\n const firstText = collected.find((line) => line.trim() !== '');\n if (firstText === undefined) {\n return undefined;\n }\n const indent = firstText.length - firstText.trimStart().length;\n const content = collected.map((line) => (line.trim() === '' ? '' : line.slice(indent)));\n return (style === '|' ? content.join('\\n') : foldLines(content)).trim();\n}\n\n/** Cut a YAML end-of-line comment (` # …`) from an unquoted scalar line. */\nfunction stripLineComment(value: string): string {\n return value.replace(/\\s+#.*$/, '');\n}\n\n/**\n * Extract a top-level string value from the frontmatter block. Handles the\n * shapes YAML writers actually emit for `title`/`description`: plain scalars\n * (end-of-line comments stripped), quoted scalars, plain scalars folded\n * across indented continuation lines, and `|`/`>` block scalars. Chomping and\n * explicit-indent indicators on a block header are tolerated but not\n * honoured — the value is trimmed and the indent comes from the first content\n * line, which matches what generated frontmatter needs. Indented keys nested\n * under another mapping never match.\n */\nfunction frontmatterValue(frontmatter: string, key: string): string | undefined {\n const lines = frontmatter.split('\\n');\n const keyPattern = new RegExp(`^${key}:(.*)$`);\n for (let i = 0; i < lines.length; i++) {\n const match = keyPattern.exec(lines[i] ?? '');\n if (!match) {\n continue;\n }\n const inline = (match[1] ?? '').trim();\n const blockHeader = /^([>|])[0-9+-]*$/.exec(inline);\n if (blockHeader) {\n return readBlockScalar(lines, i + 1, blockHeader[1] as '|' | '>');\n }\n if (inline === '') {\n return undefined;\n }\n const quoted = inline.startsWith('\"') || inline.startsWith(\"'\");\n const parts = [quoted ? inline : stripLineComment(inline)];\n for (let j = i + 1; j < lines.length; j++) {\n const continuation = lines[j] ?? '';\n if (continuation.trim() === '' || !/^[ \\t]/.test(continuation)) {\n break;\n }\n parts.push(quoted ? continuation.trim() : stripLineComment(continuation.trim()));\n }\n return stripQuotes(parts.join(' ')).trim();\n }\n return undefined;\n}\n\n/**\n * A page generated by `fumadocs-openapi` declares an `_openapi` key in its\n * frontmatter. That key is the only reliable marker: matching on body text\n * false-fires on any prose or code sample that mentions the generated layout.\n */\nfunction isGeneratedApiPage(frontmatter: string): boolean {\n return /^_openapi\\s*:/m.test(frontmatter);\n}\n\n/**\n * Strip MDX machinery from a prose body, leaving readable Markdown. Fenced code\n * blocks are preserved verbatim; everything else has its `import`/`export`\n * statements, JSX/HTML tags, and MDX comments removed.\n */\nfunction cleanBody(body: string): string {\n const segments = body.split(/(```[\\s\\S]*?```)/g);\n const cleaned = segments.map((segment) =>\n segment.startsWith('```')\n ? segment\n : segment\n .replace(/^\\s*(import|export)\\s.*$/gm, '')\n .replace(/\\{\\/\\*[\\s\\S]*?\\*\\/\\}/g, '')\n .replace(/<\\/?[A-Za-z][^>]*>/g, ''),\n );\n return cleaned\n .join('')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\n/**\n * A page generated by `fumadocs-openapi` is a component, not prose. Summarise\n * it from its title, description, and the operations it renders. When the\n * OpenAPI document the page references is supplied, each operation is rendered\n * in full (parameters, request-body fields, responses); otherwise only the\n * `METHOD /path` line is emitted.\n */\nfunction summariseApiPage(\n title: string,\n description: string | undefined,\n body: string,\n documents: Readonly<Record<string, OpenApiDocument>> | undefined,\n): string {\n const opMatch = /operations=\\{(\\[[\\s\\S]*?\\])\\}/.exec(body);\n let ops: { path: string; method: string }[] = [];\n if (opMatch?.[1]) {\n try {\n const parsed: unknown = JSON.parse(opMatch[1]);\n // JSON that parses can still have the wrong shape; keep only real entries.\n ops = (Array.isArray(parsed) ? parsed : []).filter(\n (op): op is { path: string; method: string } =>\n typeof op === 'object' &&\n op !== null &&\n typeof (op as { path?: unknown }).path === 'string' &&\n typeof (op as { method?: unknown }).method === 'string',\n );\n } catch {\n ops = [];\n }\n }\n const documentName = /document=\"([^\"]+)\"/.exec(body)?.[1];\n const onlyName =\n Object.keys(documents ?? {}).length === 1 ? Object.keys(documents ?? {})[0] : undefined;\n const lookupName = documentName ?? onlyName;\n const document = lookupName === undefined ? undefined : documents?.[lookupName];\n const operationSections = ops.map((op) => {\n const endpoint = `\\`${op.method.toUpperCase()} ${op.path}\\``;\n const detail = document === undefined ? null : openApiOperationToMarkdown(document, op);\n return detail === null ? endpoint : `${endpoint}\\n\\n${detail}`;\n });\n return `${[`# ${title}`, description ?? '', ...operationSections].filter(Boolean).join('\\n\\n')}\\n`;\n}\n\n/**\n * Convert a raw MDX source into clean, LLM-friendly Markdown.\n *\n * Guide pages return their prose (frontmatter title + description prepended,\n * JSX stripped, code fences intact). Generated OpenAPI pages return a compact\n * summary of the endpoint. Returns `null` for empty input.\n *\n * @param raw - the MDX file source\n * @param options - optional fallback title\n * @returns the Markdown rendering, or `null` when `raw` is empty\n * @public\n */\nexport function mdxToMarkdown(raw: string, options: MdxToMarkdownOptions = {}): string | null {\n if (raw.trim() === '') {\n return null;\n }\n\n const { frontmatter, body } = splitFrontmatter(raw);\n const title = frontmatterValue(frontmatter, 'title') ?? options.fallbackTitle ?? 'Untitled';\n const description = frontmatterValue(frontmatter, 'description');\n const trimmedBody = body.trim();\n\n if (isGeneratedApiPage(frontmatter)) {\n return summariseApiPage(title, description, trimmedBody, options.openApiDocuments);\n }\n\n return `# ${title}\\n\\n${description ? `${description}\\n\\n` : ''}${cleanBody(trimmedBody)}\\n`;\n}\n\n/**\n * A Markdown route ready to re-export from a framework route file.\n *\n * @public\n */\nexport interface MarkdownRoute {\n readonly GET: (\n request: Request,\n context: { params: Promise<{ slug?: string[] }> },\n ) => Promise<Response>;\n}\n\n/**\n * Options for {@link createMarkdownRoute}.\n *\n * @public\n */\nexport interface CreateMarkdownRouteOptions {\n /** Reads the raw MDX for a page slug. Supplied by the site. */\n readonly read: MdxReader;\n /**\n * Loads the site's named OpenAPI documents so generated API pages render\n * their operations in full. Called per request — cache inside the loader\n * when the document is expensive to build.\n */\n readonly loadOpenApiDocuments?: () =>\n Readonly<Record<string, OpenApiDocument>> | Promise<Readonly<Record<string, OpenApiDocument>>>;\n /**\n * Loads a generated API page's original operation source: the spec file\n * path, the method and route, and the file's raw contents. When it returns\n * one, the page's Markdown is the operation spec in full under an\n * `## OpenAPI` heading, the shape agents get from the major docs platforms;\n * pages it returns `null` for fall through to the MDX conversion. Wire it\n * from the generator's `api-sources.json`.\n */\n readonly loadOperationSource?: (\n slug: readonly string[] | undefined,\n ) => Promise<OperationSource | null>;\n /**\n * The site's documentation index path (`/llms.txt`). When set, every\n * response opens with a blockquote pointing agents at it, on the origin the\n * request came in on — correct on localhost, a preview deploy, and\n * production alike.\n */\n readonly llmsTxtPath?: string;\n}\n\n/**\n * A generated API page's original operation source, as\n * {@link CreateMarkdownRouteOptions.loadOperationSource} returns it.\n *\n * @public\n */\nexport interface OperationSource {\n /** The spec file, relative to the content directory. */\n readonly file: string;\n /** The operation's HTTP method. */\n readonly method: string;\n /** The operation's API route. */\n readonly route: string;\n /** The spec file's raw contents. */\n readonly source: string;\n}\n\n/** The `# title` and `> description` head of an operation's Markdown. */\nfunction operationHead(operation: OperationSource): string {\n let title: string | undefined;\n let description: string | undefined;\n try {\n const parsed = JSON.parse(operation.source) as {\n info?: { title?: string; description?: string };\n paths?: Record<string, Record<string, { summary?: string; description?: string }>>;\n };\n const exact = parsed.paths?.[operation.route]?.[operation.method.toLowerCase()];\n const first = Object.values(parsed.paths ?? {}).flatMap((item) => Object.values(item))[0];\n const named = exact ?? first;\n title = named?.summary ?? parsed.info?.title;\n description = named?.description ?? parsed.info?.description;\n } catch {\n // A file that does not parse still ships verbatim below.\n }\n const head = [`# ${title ?? 'API operation'}`];\n if (description !== undefined && description !== '') {\n head.push('', `> ${description.replace(/\\n/g, '\\n> ')}`);\n }\n return head.join('\\n');\n}\n\n/** A fence longer than any backtick run in the body it wraps (four or more). */\nfunction fenceFor(source: string): string {\n const longest = source.match(/`+/g)?.reduce((max, run) => Math.max(max, run.length), 0) ?? 0;\n return '`'.repeat(Math.max(4, longest + 1));\n}\n\n/**\n * Build a drop-in route that serves a page as plain Markdown. It reads the raw\n * MDX for the requested slug, converts it with {@link mdxToMarkdown}, and\n * returns `text/plain` (or `404` when the page does not exist).\n *\n * @example\n * ```ts\n * // app/md/[[...slug]]/route.ts\n * export const { GET } = createMarkdownRoute({ read: readDocMdx });\n * ```\n *\n * @param options - the content reader\n * @returns the route's `GET` handler\n * @public\n */\nexport function createMarkdownRoute(options: CreateMarkdownRouteOptions): MarkdownRoute {\n const requestOrigin = (request: Request): string => {\n const url = new URL(request.url);\n const proto = request.headers.get('x-forwarded-proto') ?? url.protocol.replace(/:$/, '');\n const host = request.headers.get('x-forwarded-host') ?? request.headers.get('host') ?? url.host;\n return `${proto}://${host}`;\n };\n const respond = (request: Request, markdown: string) => {\n const preamble =\n options.llmsTxtPath === undefined\n ? ''\n : [\n '> ## Documentation Index',\n `> Fetch the complete documentation index at: ${requestOrigin(request)}${options.llmsTxtPath}`,\n '> Use this file to discover all available pages before exploring further.',\n '',\n '',\n ].join('\\n');\n return new Response(`${preamble}${markdown}`, {\n headers: { 'content-type': 'text/plain; charset=utf-8' },\n });\n };\n return {\n async GET(request, context) {\n const { slug } = await context.params;\n const operation = await options.loadOperationSource?.(slug);\n if (operation) {\n const fence = fenceFor(operation.source);\n return respond(\n request,\n [\n operationHead(operation),\n '',\n '## OpenAPI',\n '',\n `${fence}json ${operation.file} ${operation.method.toLowerCase()} ${operation.route}`,\n operation.source.trimEnd(),\n fence,\n '',\n ].join('\\n'),\n );\n }\n const raw = await options.read(slug);\n if (raw === null) {\n return new Response('Not found', { status: 404 });\n }\n const fallbackTitle = slug?.at(-1);\n const openApiDocuments = await options.loadOpenApiDocuments?.();\n const markdown = mdxToMarkdown(raw, {\n ...(fallbackTitle === undefined ? {} : { fallbackTitle }),\n ...(openApiDocuments === undefined ? {} : { openApiDocuments }),\n });\n if (markdown === null) {\n return new Response('Not found', { status: 404 });\n }\n return respond(request, markdown);\n },\n };\n}\n\n/**\n * Options for {@link markdownRewriteTarget}.\n *\n * @public\n */\nexport interface MarkdownRewriteOptions {\n /** The docs base URL. Default `/docs`. */\n readonly baseUrl?: string;\n /** Where the Markdown route is mounted. Default `/md`. */\n readonly markdownBase?: string;\n}\n\n/**\n * The internal URL serving a docs page's Markdown, for a request whose path is\n * the page URL plus `.md` — the convention agents and other tools expect\n * (`/docs/guides/webhooks.md`). Returns `null` for every other request. A\n * site's middleware rewrites to the returned URL:\n *\n * @example\n * ```ts\n * const markdown = markdownRewriteTarget(request.nextUrl);\n * if (markdown) {\n * return NextResponse.rewrite(markdown);\n * }\n * ```\n *\n * @param url - the request URL\n * @param options - the docs base and the Markdown route's mount point\n * @returns the rewrite target, or `null` when the request is not a `.md` path\n * @public\n */\nexport function markdownRewriteTarget(url: URL, options: MarkdownRewriteOptions = {}): URL | null {\n const baseUrl = (options.baseUrl ?? '/docs').replace(/\\/+$/, '');\n const markdownBase = (options.markdownBase ?? '/md').replace(/\\/+$/, '');\n const { pathname } = url;\n // The slug reaches the site's file reader: refuse anything percent-encoded\n // (an encoded slash survives into the slug) and any empty segment.\n if (!pathname.endsWith('.md') || pathname.includes('%')) {\n return null;\n }\n const page = pathname.slice(0, -3);\n if (page !== baseUrl && !page.startsWith(`${baseUrl}/`)) {\n return null;\n }\n if (page.endsWith('/') || page.includes('//')) {\n return null;\n }\n const target = new URL(url);\n target.pathname = `${markdownBase}${page.slice(baseUrl.length)}`;\n return target;\n}\n\n/**\n * Whether a request addresses the Markdown route's internal mount directly.\n * The route exists as the rewrite target for the page-URL-plus-`.md`\n * convention; a direct request to it gets `404` from the site's middleware,\n * so every page's Markdown has one public address.\n *\n * @example\n * ```ts\n * if (isMarkdownRouteRequest(request.nextUrl)) {\n * return new NextResponse('Not found', { status: 404 });\n * }\n * ```\n *\n * @param url - the request URL\n * @param options - the Markdown route's mount point\n * @returns whether the request must be refused\n * @public\n */\nexport function isMarkdownRouteRequest(\n url: URL,\n options: Pick<MarkdownRewriteOptions, 'markdownBase'> = {},\n): boolean {\n const markdownBase = options.markdownBase ?? '/md';\n return url.pathname === markdownBase || url.pathname.startsWith(`${markdownBase}/`);\n}\n","/**\n * Allowed-domain checks.\n *\n * @packageDocumentation\n */\n\n/**\n * Return whether an email address belongs to one of the allowed domains.\n * Matching is case-insensitive and exact on the domain part.\n *\n * @param email - the email address to test\n * @param allowedDomains - permitted domains, e.g. `['blaaiz.com']`\n * @public\n */\nexport function isAllowedEmail(email: string, allowedDomains: readonly string[]): boolean {\n const at = email.lastIndexOf('@');\n if (at < 1 || at === email.length - 1) {\n return false;\n }\n const domain = email.slice(at + 1).toLowerCase();\n return allowedDomains.some((allowed) => allowed.toLowerCase() === domain);\n}\n","/**\n * Signed session tokens.\n *\n * A session is a small JSON payload (the verified email and an expiry) encoded\n * and signed with HMAC-SHA256 via the Web Crypto API — so it works in Node, in\n * an edge runtime, and in a Next.js middleware without any Node-only imports.\n * The secret never leaves the server; the browser only holds the signed token.\n *\n * @packageDocumentation\n */\n\n/** The name of the session cookie. @public */\nexport const SESSION_COOKIE = 'docs_session';\n\n/**\n * The decoded session payload.\n *\n * @public\n */\nexport interface SessionPayload {\n /** The verified email address. */\n readonly email: string;\n /** Expiry, as a Unix time in seconds. */\n readonly exp: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nfunction base64UrlDecode(value: string): Uint8Array<ArrayBuffer> {\n const normalized = value.replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nasync function hmacKey(secret: string): Promise<CryptoKey> {\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify'],\n );\n}\n\n/**\n * Sign a session payload into a `data.signature` token.\n *\n * @public\n */\nexport async function signSession(payload: SessionPayload, secret: string): Promise<string> {\n const data = base64UrlEncode(encoder.encode(JSON.stringify(payload)));\n const key = await hmacKey(secret);\n const signature = new Uint8Array(await crypto.subtle.sign('HMAC', key, encoder.encode(data)));\n return `${data}.${base64UrlEncode(signature)}`;\n}\n\n/**\n * Verify a session token and return its payload, or `null` when the signature\n * is invalid or the session has expired.\n *\n * @param token - the signed token\n * @param secret - the signing secret\n * @param nowSeconds - current Unix time; defaults to the real clock\n * @public\n */\nexport async function verifySession(\n token: string,\n secret: string,\n nowSeconds: number = Math.floor(Date.now() / 1000),\n): Promise<SessionPayload | null> {\n const dot = token.indexOf('.');\n if (dot <= 0) {\n return null;\n }\n const data = token.slice(0, dot);\n const signature = token.slice(dot + 1);\n\n const key = await hmacKey(secret);\n let valid: boolean;\n try {\n valid = await crypto.subtle.verify(\n 'HMAC',\n key,\n base64UrlDecode(signature),\n encoder.encode(data),\n );\n } catch {\n return null;\n }\n if (!valid) {\n return null;\n }\n\n let payload: SessionPayload;\n try {\n payload = JSON.parse(decoder.decode(base64UrlDecode(data))) as SessionPayload;\n } catch {\n return null;\n }\n if (typeof payload.email !== 'string' || typeof payload.exp !== 'number') {\n return null;\n }\n if (payload.exp < nowSeconds) {\n return null;\n }\n return payload;\n}\n\n/**\n * Read a cookie value from a `Cookie` header string.\n *\n * @public\n */\nexport function readCookie(cookieHeader: string | null, name: string): string | null {\n if (cookieHeader === null) {\n return null;\n }\n for (const part of cookieHeader.split(';')) {\n const [key, ...rest] = part.trim().split('=');\n if (key === name) {\n return rest.join('=');\n }\n }\n return null;\n}\n\n/**\n * Build a `Set-Cookie` header value carrying the session token.\n *\n * @public\n */\nexport function buildSessionCookie(\n token: string,\n options: { maxAgeSeconds: number; secure?: boolean },\n): string {\n const flags = ['Path=/', 'HttpOnly', 'SameSite=Lax', `Max-Age=${String(options.maxAgeSeconds)}`];\n if (options.secure !== false) {\n flags.push('Secure');\n }\n return `${SESSION_COOKIE}=${token}; ${flags.join('; ')}`;\n}\n\n/**\n * Build a `Set-Cookie` header value that clears the session.\n *\n * @public\n */\nexport function clearSessionCookie(options: { secure?: boolean } = {}): string {\n const flags = ['Path=/', 'HttpOnly', 'SameSite=Lax', 'Max-Age=0'];\n if (options.secure !== false) {\n flags.push('Secure');\n }\n return `${SESSION_COOKIE}=; ${flags.join('; ')}`;\n}\n","/**\n * The email identity provider.\n *\n * The simplest provider: a form posts an email; if it belongs to an allowed\n * domain, a session is issued. It needs no external credentials, so it is ideal\n * for local development and for organizations that gate by email domain alone.\n *\n * @packageDocumentation\n */\n\nimport { isAllowedEmail } from './domains.js';\nimport { buildSessionCookie, signSession } from './session.js';\n\nconst DEFAULT_TTL_SECONDS = 8 * 60 * 60;\n\n/**\n * Options for {@link createEmailSignIn}.\n *\n * @public\n */\nexport interface EmailSignInOptions {\n readonly secret: string;\n readonly allowedDomains: readonly string[];\n /** Session lifetime in seconds. Default 8 hours. */\n readonly ttlSeconds?: number;\n /** Set the `Secure` cookie flag. Default `true`. */\n readonly secureCookies?: boolean;\n /** Fallback redirect after sign-in when no `from` is supplied. Default `/`. */\n readonly defaultRedirect?: string;\n /**\n * Where a browser (form) submission with a disallowed domain is sent back to,\n * carrying `?error=forbidden`. Default `/signin`. JSON clients still get a\n * `403` instead of a redirect.\n */\n readonly signInPath?: string;\n}\n\nasync function readEmailAndFrom(request: Request): Promise<{ email: string; from: string | null }> {\n const contentType = request.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n const body = (await request.json()) as Record<string, unknown>;\n return {\n email: typeof body['email'] === 'string' ? body['email'] : '',\n from: typeof body['from'] === 'string' ? body['from'] : null,\n };\n }\n const form = await request.formData();\n const email = form.get('email');\n const from = form.get('from');\n return {\n email: typeof email === 'string' ? email : '',\n from: typeof from === 'string' ? from : null,\n };\n}\n\nfunction safeRedirectPath(from: string | null, fallback: string): string {\n // Only allow same-site absolute paths, never an open redirect.\n if (from !== null && from.startsWith('/') && !from.startsWith('//')) {\n return from;\n }\n return fallback;\n}\n\n/**\n * Build the email sign-in POST handler.\n *\n * @param options - secret, allowed domains, and session settings\n * @returns a request handler that issues a session; a browser submission with a\n * disallowed domain is redirected back to the sign-in page with\n * `?error=forbidden`, while a JSON request gets a `403`\n * @public\n */\nexport function createEmailSignIn(\n options: EmailSignInOptions,\n): (request: Request) => Promise<Response> {\n const ttl = options.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n const fallback = options.defaultRedirect ?? '/';\n const signInPath = options.signInPath ?? '/signin';\n\n return async function handle(request: Request): Promise<Response> {\n const isJson = (request.headers.get('content-type') ?? '').includes('application/json');\n const { email, from } = await readEmailAndFrom(request);\n\n if (!isAllowedEmail(email, options.allowedDomains)) {\n if (isJson) {\n return new Response(JSON.stringify({ error: 'This email domain is not allowed.' }), {\n status: 403,\n headers: { 'content-type': 'application/json' },\n });\n }\n // Browser: bounce back to the sign-in page with an inline error, keeping\n // the return path so the reader can retry without losing their place.\n const params = new URLSearchParams({ error: 'forbidden' });\n const safeFrom = safeRedirectPath(from, '');\n if (safeFrom) {\n params.set('from', safeFrom);\n }\n return new Response(null, {\n status: 303,\n headers: { location: `${signInPath}?${params.toString()}` },\n });\n }\n\n const exp = Math.floor(Date.now() / 1000) + ttl;\n const token = await signSession({ email, exp }, options.secret);\n const cookie = buildSessionCookie(token, {\n maxAgeSeconds: ttl,\n ...(options.secureCookies !== undefined ? { secure: options.secureCookies } : {}),\n });\n\n const target = safeRedirectPath(from, fallback);\n return new Response(null, {\n status: 303,\n headers: { location: target, 'set-cookie': cookie },\n });\n };\n}\n","/**\n * The Google OAuth identity provider.\n *\n * Implements the OAuth 2.0 authorization-code flow against Google, restricted\n * to the allowed email domains. Credentials are passed in by the caller (which\n * reads them from environment variables named in config), never hard-coded.\n *\n * @packageDocumentation\n */\n\nimport type { FetchLike } from '../proxy.js';\nimport { isAllowedEmail } from './domains.js';\nimport { buildSessionCookie, signSession } from './session.js';\n\nconst AUTHORIZE_URL = 'https://accounts.google.com/o/oauth2/v2/auth';\nconst TOKEN_URL = 'https://oauth2.googleapis.com/token';\nconst STATE_COOKIE = 'docs_oauth_state';\nconst FROM_COOKIE = 'docs_oauth_from';\nconst DEFAULT_TTL_SECONDS = 8 * 60 * 60;\n\n/**\n * Options for {@link createGoogleAuth}. `clientId` and `clientSecret` come from\n * the environment; the config only names the variables.\n *\n * @public\n */\nexport interface GoogleAuthOptions {\n readonly clientId: string;\n readonly clientSecret: string;\n /** The full callback URL registered with Google. */\n readonly redirectUri: string;\n /** The session-signing secret. */\n readonly secret: string;\n readonly allowedDomains: readonly string[];\n readonly ttlSeconds?: number;\n readonly secureCookies?: boolean;\n readonly defaultRedirect?: string;\n /**\n * Where a failed callback (bad state, token error, disallowed account) is\n * sent, carrying an `?error=` code. Default `/signin`.\n */\n readonly signInPath?: string;\n /** Fetch implementation for the token exchange (injectable for tests). */\n readonly fetch?: FetchLike;\n}\n\n/**\n * The two Google OAuth route handlers.\n *\n * @public\n */\nexport interface GoogleAuthHandlers {\n /** Redirects the browser to Google's consent screen. */\n readonly start: (request: Request) => Response;\n /** Handles Google's redirect back, issues a session, and redirects on. */\n readonly callback: (request: Request) => Promise<Response>;\n}\n\nfunction cookie(name: string, value: string, secure: boolean, maxAge: number): string {\n const flags = ['Path=/', 'HttpOnly', 'SameSite=Lax', `Max-Age=${String(maxAge)}`];\n if (secure) {\n flags.push('Secure');\n }\n return `${name}=${value}; ${flags.join('; ')}`;\n}\n\nfunction readCookie(header: string | null, name: string): string | null {\n if (header === null) {\n return null;\n }\n for (const part of header.split(';')) {\n const [key, ...rest] = part.trim().split('=');\n if (key === name) {\n return rest.join('=');\n }\n }\n return null;\n}\n\nfunction safeRedirectPath(from: string | null, fallback: string): string {\n if (from !== null && from.startsWith('/') && !from.startsWith('//')) {\n return from;\n }\n return fallback;\n}\n\nfunction decodeIdTokenEmail(idToken: string): string | null {\n const parts = idToken.split('.');\n if (parts.length < 2 || parts[1] === undefined) {\n return null;\n }\n try {\n const normalized = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');\n const claims = JSON.parse(atob(padded)) as { email?: unknown };\n return typeof claims.email === 'string' ? claims.email : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Build the Google OAuth handlers.\n *\n * @param options - client credentials, callback URL, and session settings\n * @returns the `start` and `callback` route handlers\n * @public\n */\nexport function createGoogleAuth(options: GoogleAuthOptions): GoogleAuthHandlers {\n const ttl = options.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n const secure = options.secureCookies !== false;\n const fallback = options.defaultRedirect ?? '/';\n const signInPath = options.signInPath ?? '/signin';\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n\n // A failed callback goes back to the sign-in page with an inline error, not a\n // dead-end plain-text response. State cookies are cleared on the way out.\n function bounce(code: string, from: string | null): Response {\n const params = new URLSearchParams({ error: code });\n const safeFrom = safeRedirectPath(from, '');\n if (safeFrom) {\n params.set('from', safeFrom);\n }\n const headers = new Headers({ location: `${signInPath}?${params.toString()}` });\n headers.append('set-cookie', cookie(STATE_COOKIE, '', secure, 0));\n headers.append('set-cookie', cookie(FROM_COOKIE, '', secure, 0));\n return new Response(null, { status: 303, headers });\n }\n\n function start(request: Request): Response {\n const url = new URL(request.url);\n const from = url.searchParams.get('from');\n const state = crypto.randomUUID();\n\n const authorize = new URL(AUTHORIZE_URL);\n authorize.searchParams.set('client_id', options.clientId);\n authorize.searchParams.set('redirect_uri', options.redirectUri);\n authorize.searchParams.set('response_type', 'code');\n authorize.searchParams.set('scope', 'openid email');\n authorize.searchParams.set('state', state);\n // Always show Google's account picker. Without it, Google silently uses\n // the browser's active account; someone whose active account is outside\n // the workspace would be bounced with no way to switch.\n authorize.searchParams.set('prompt', 'select_account');\n if (options.allowedDomains.length === 1 && options.allowedDomains[0] !== undefined) {\n authorize.searchParams.set('hd', options.allowedDomains[0]);\n }\n\n const headers = new Headers({ location: authorize.toString() });\n headers.append('set-cookie', cookie(STATE_COOKIE, state, secure, 600));\n headers.append('set-cookie', cookie(FROM_COOKIE, from ?? fallback, secure, 600));\n return new Response(null, { status: 302, headers });\n }\n\n async function callback(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const code = url.searchParams.get('code');\n const returnedState = url.searchParams.get('state');\n const cookieHeader = request.headers.get('cookie');\n const expectedState = readCookie(cookieHeader, STATE_COOKIE);\n\n if (\n code === null ||\n returnedState === null ||\n expectedState === null ||\n returnedState !== expectedState\n ) {\n return bounce('state', readCookie(cookieHeader, FROM_COOKIE));\n }\n\n const tokenResponse = await doFetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: options.clientId,\n client_secret: options.clientSecret,\n code,\n grant_type: 'authorization_code',\n redirect_uri: options.redirectUri,\n }).toString(),\n });\n if (!tokenResponse.ok) {\n return bounce('oauth', readCookie(cookieHeader, FROM_COOKIE));\n }\n const tokens = (await tokenResponse.json()) as { id_token?: unknown };\n const email = typeof tokens.id_token === 'string' ? decodeIdTokenEmail(tokens.id_token) : null;\n\n if (email === null || !isAllowedEmail(email, options.allowedDomains)) {\n return bounce('forbidden', readCookie(cookieHeader, FROM_COOKIE));\n }\n\n const exp = Math.floor(Date.now() / 1000) + ttl;\n const token = await signSession({ email, exp }, options.secret);\n const target = safeRedirectPath(readCookie(cookieHeader, FROM_COOKIE), fallback);\n\n const headers = new Headers({ location: target });\n headers.append('set-cookie', buildSessionCookie(token, { maxAgeSeconds: ttl, secure }));\n headers.append('set-cookie', cookie(STATE_COOKIE, '', secure, 0));\n headers.append('set-cookie', cookie(FROM_COOKIE, '', secure, 0));\n return new Response(null, { status: 303, headers });\n }\n\n return { start, callback };\n}\n","/**\n * The auth gate — the enforcement half of authentication.\n *\n * Given a request, it decides: is there a valid session for an allowed email?\n * If so the request passes (`null`); otherwise it returns a redirect to the\n * sign-in page. The gate is identity-provider-agnostic — it does not care how\n * the session was established, only that it is valid.\n *\n * @packageDocumentation\n */\n\nimport { isAllowedEmail } from './domains.js';\nimport { SESSION_COOKIE, readCookie, verifySession } from './session.js';\n\n/**\n * Options for {@link createAuthGate}.\n *\n * @public\n */\nexport interface AuthGateOptions {\n /** The session-signing secret. */\n readonly secret: string;\n /** Email domains permitted access. */\n readonly allowedDomains: readonly string[];\n /** Where to send unauthenticated requests. Default `/signin`. */\n readonly signInPath?: string;\n /** Extra path prefixes that never require a session. */\n readonly publicPaths?: readonly string[];\n}\n\nconst ALWAYS_PUBLIC = ['/_next/', '/favicon', '/api/auth/'];\n\n/**\n * Build an auth gate for a Next.js middleware (or any Fetch runtime).\n *\n * @param options - secret, allowed domains, and sign-in path\n * @returns a function returning `null` to allow, or a redirect `Response` to block\n * @public\n */\nexport function createAuthGate(\n options: AuthGateOptions,\n): (request: Request) => Promise<Response | null> {\n const signInPath = options.signInPath ?? '/signin';\n const publicPaths = [...ALWAYS_PUBLIC, ...(options.publicPaths ?? [])];\n\n return async function gate(request: Request): Promise<Response | null> {\n const url = new URL(request.url);\n const path = url.pathname;\n\n if (path === signInPath || publicPaths.some((prefix) => path.startsWith(prefix))) {\n return null;\n }\n\n const token = readCookie(request.headers.get('cookie'), SESSION_COOKIE);\n if (token !== null) {\n const session = await verifySession(token, options.secret);\n if (session !== null && isAllowedEmail(session.email, options.allowedDomains)) {\n return null;\n }\n }\n\n const redirectUrl = new URL(signInPath, url.origin);\n redirectUrl.searchParams.set('from', path);\n return Response.redirect(redirectUrl.toString(), 302);\n };\n}\n","/**\n * The shared-secret identity provider.\n *\n * A two-step gate: an allowed-domain email, then one site-wide secret. Security\n * lives entirely in the second step — the domain is re-checked and the secret\n * compared in constant time — so the first step is only progressive disclosure\n * and cannot be used to bypass anything. No client JavaScript: each step is a\n * native form POST, the way an email → password flow works.\n *\n * @packageDocumentation\n */\n\nimport { isAllowedEmail } from './domains.js';\nimport { buildSessionCookie, readCookie, signSession } from './session.js';\n\nconst DEFAULT_TTL_SECONDS = 8 * 60 * 60;\nconst DEFAULT_PENDING_TTL_SECONDS = 15 * 60;\n\n/** Cookie carrying the domain-checked email between step one and step two. */\nconst PENDING_COOKIE = 'docs_secret_email';\n\n/**\n * Options for {@link createSecretSignIn}.\n *\n * @public\n */\nexport interface SecretSignInOptions {\n /** The session-signing secret (HMAC key), as for the other providers. */\n readonly secret: string;\n /** The shared access secret a reader must supply. Resolved from the env. */\n readonly accessSecret: string;\n readonly allowedDomains: readonly string[];\n /** Session lifetime in seconds. Default 8 hours. */\n readonly ttlSeconds?: number;\n /** Set the `Secure` cookie flag. Default `true`. */\n readonly secureCookies?: boolean;\n /** Fallback redirect after sign-in when no `from` is supplied. Default `/`. */\n readonly defaultRedirect?: string;\n /** The sign-in page path, where each step and any error is shown. Default `/signin`. */\n readonly signInPath?: string;\n /** How long the between-steps email cookie lives. Default 15 minutes. */\n readonly pendingTtlSeconds?: number;\n}\n\n/**\n * Constant-time string comparison. The length difference is folded into the\n * accumulator so a wrong secret takes the same work regardless of where it\n * first differs — no early exit for an attacker to time.\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n const encoder = new TextEncoder();\n const ea = encoder.encode(a);\n const eb = encoder.encode(b);\n let diff = ea.length ^ eb.length;\n const len = Math.max(ea.length, eb.length);\n for (let i = 0; i < len; i += 1) {\n diff |= (ea[i] ?? 0) ^ (eb[i] ?? 0);\n }\n return diff === 0;\n}\n\nfunction safeRedirectPath(from: string | null, fallback: string): string {\n if (from !== null && from.startsWith('/') && !from.startsWith('//')) {\n return from;\n }\n return fallback;\n}\n\nasync function readForm(\n request: Request,\n): Promise<{ email: string; secret: string | null; from: string | null }> {\n const contentType = request.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n const body = (await request.json()) as Record<string, unknown>;\n return {\n email: typeof body['email'] === 'string' ? body['email'] : '',\n secret: typeof body['secret'] === 'string' ? body['secret'] : null,\n from: typeof body['from'] === 'string' ? body['from'] : null,\n };\n }\n const form = await request.formData();\n const email = form.get('email');\n const secret = form.get('secret');\n const from = form.get('from');\n return {\n email: typeof email === 'string' ? email : '',\n secret: typeof secret === 'string' ? secret : null,\n from: typeof from === 'string' ? from : null,\n };\n}\n\n/** Build the query string for a sign-in redirect, dropping empty values. */\nfunction signInQuery(parts: Record<string, string | undefined>): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(parts)) {\n if (value) {\n params.set(key, value);\n }\n }\n const query = params.toString();\n return query ? `?${query}` : '';\n}\n\nfunction pendingCookie(email: string, secure: boolean, maxAge: number): string {\n const flags = ['Path=/', 'HttpOnly', 'SameSite=Lax', `Max-Age=${String(maxAge)}`];\n if (secure) {\n flags.push('Secure');\n }\n return `${PENDING_COOKIE}=${encodeURIComponent(email)}; ${flags.join('; ')}`;\n}\n\nfunction clearPendingCookie(secure: boolean): string {\n return pendingCookie('', secure, 0);\n}\n\n/**\n * Build the shared-secret sign-in POST handler. It serves both steps of the\n * flow, told apart by whether the request carries a `secret` field:\n *\n * - **Email step** (no `secret`): validate the domain. On success, remember the\n * email in a short-lived cookie and advance to the secret step; on failure,\n * bounce back with `?error=forbidden`.\n * - **Secret step** (`secret` present): read the remembered email, re-check its\n * domain, and compare the secret in constant time. On success, issue the\n * session; on failure, stay on the secret step with `?error=badsecret`.\n *\n * @param options - the two secrets, allowed domains, and session settings\n * @returns a request handler for `/api/auth/secret`\n * @public\n */\nexport function createSecretSignIn(\n options: SecretSignInOptions,\n): (request: Request) => Promise<Response> {\n const ttl = options.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n const pendingTtl = options.pendingTtlSeconds ?? DEFAULT_PENDING_TTL_SECONDS;\n const secure = options.secureCookies !== false;\n const fallback = options.defaultRedirect ?? '/';\n const signInPath = options.signInPath ?? '/signin';\n\n return async function handle(request: Request): Promise<Response> {\n const { email, secret, from } = await readForm(request);\n const safeFrom = safeRedirectPath(from, '') || undefined;\n\n // Step one: no secret yet — validate the email domain and advance.\n if (secret === null) {\n if (!isAllowedEmail(email, options.allowedDomains)) {\n return new Response(null, {\n status: 303,\n headers: {\n location: `${signInPath}${signInQuery({ error: 'forbidden', from: safeFrom })}`,\n },\n });\n }\n const headers = new Headers({\n location: `${signInPath}${signInQuery({ step: 'secret', from: safeFrom })}`,\n });\n headers.append('set-cookie', pendingCookie(email, secure, pendingTtl));\n return new Response(null, { status: 303, headers });\n }\n\n // Step two: recover the domain-checked email; without it, restart.\n const pending = readCookie(request.headers.get('cookie'), PENDING_COOKIE);\n const pendingEmail = pending ? decodeURIComponent(pending) : '';\n if (!isAllowedEmail(pendingEmail, options.allowedDomains)) {\n return new Response(null, {\n status: 303,\n headers: { location: `${signInPath}${signInQuery({ from: safeFrom })}` },\n });\n }\n\n // The secret must be configured and match, compared in constant time.\n if (options.accessSecret === '' || !timingSafeEqual(secret, options.accessSecret)) {\n return new Response(null, {\n status: 303,\n headers: {\n location: `${signInPath}${signInQuery({ step: 'secret', error: 'badsecret', from: safeFrom })}`,\n },\n });\n }\n\n const exp = Math.floor(Date.now() / 1000) + ttl;\n const token = await signSession({ email: pendingEmail, exp }, options.secret);\n const headers = new Headers({ location: safeRedirectPath(from, fallback) });\n headers.append('set-cookie', buildSessionCookie(token, { maxAgeSeconds: ttl, secure }));\n headers.append('set-cookie', clearPendingCookie(secure));\n return new Response(null, { status: 303, headers });\n };\n}\n","/**\n * Sign-out handler.\n *\n * @packageDocumentation\n */\n\nimport { clearSessionCookie } from './session.js';\n\n/**\n * Options for {@link createSignOut}.\n *\n * @public\n */\nexport interface SignOutOptions {\n readonly secureCookies?: boolean;\n /** Where to send the browser after signing out. Default `/signin`. */\n readonly redirectTo?: string;\n}\n\n/**\n * Build a sign-out handler that clears the session cookie and redirects.\n *\n * @public\n */\nexport function createSignOut(options: SignOutOptions = {}): () => Response {\n return function handle(): Response {\n return new Response(null, {\n status: 303,\n headers: {\n location: options.redirectTo ?? '/signin',\n 'set-cookie': clearSessionCookie(\n options.secureCookies !== undefined ? { secure: options.secureCookies } : {},\n ),\n },\n });\n };\n}\n","/**\n * The whole of a site's auth, assembled from `docs.config.ts`.\n *\n * A site mounts the same five files whatever its access mode — middleware,\n * the sign-in page, and the provider routes — and `createSiteAuth` decides\n * what they do. On a public site the gate passes everything and the handlers\n * answer `501`, so the files cost nothing; switching to workspace mode is a\n * config edit and two environment variables, never new files.\n *\n * @packageDocumentation\n */\n\nimport type { DocsConfig, WorkspaceAuthConfig } from '../config.js';\nimport { DocsConfigError } from '../config.js';\n\nimport { createAuthGate } from './gate.js';\nimport { createEmailSignIn } from './email-provider.js';\nimport { type GoogleAuthHandlers, createGoogleAuth } from './google-provider.js';\nimport { createSecretSignIn } from './secret-provider.js';\nimport { createSignOut } from './signout.js';\n\n/**\n * Options for {@link createSiteAuth}.\n *\n * @public\n */\nexport interface SiteAuthOptions {\n /**\n * Path prefixes the gate never blocks, besides the built-in ones. Defaults\n * to `['/api/proxy']`: the try-it proxy is allow-list-bounded and injects\n * no secrets, so it needs no session.\n */\n readonly publicPaths?: readonly string[];\n /** Reads an environment variable. Defaults to `process.env`. */\n readonly env?: (name: string) => string | undefined;\n}\n\n/**\n * Everything a site's auth files mount, in both access modes.\n *\n * @public\n */\nexport interface SiteAuth {\n /** Whether the site is in workspace mode. */\n readonly enabled: boolean;\n /** Where the gate sends blocked requests. */\n readonly signInPath: string;\n /** Whether the shared-secret form should be offered. */\n readonly secretEnabled: boolean;\n /** Whether the Google button should be offered. */\n readonly googleEnabled: boolean;\n /** `null` to allow a request, a redirect `Response` to block it. */\n readonly gate: (request: Request) => Promise<Response | null>;\n /** The email provider's endpoint. `501` when not offered. */\n readonly emailSignIn: (request: Request) => Promise<Response>;\n /** The shared-secret provider's endpoint. `501` when not offered. */\n readonly secretSignIn: (request: Request) => Promise<Response>;\n /** The Google OAuth endpoints. `501` when not offered. */\n readonly google: {\n readonly start: (request: Request) => Response;\n readonly callback: (request: Request) => Promise<Response>;\n };\n /** Clears the session and redirects to the sign-in path. */\n readonly signOut: () => Response;\n}\n\nconst notConfigured = () =>\n new Response('This sign-in method is not configured for this site.', { status: 501 });\n\nconst PUBLIC_SITE: Omit<SiteAuth, 'gate' | 'signOut'> = {\n enabled: false,\n signInPath: '/signin',\n secretEnabled: false,\n googleEnabled: false,\n emailSignIn: () => Promise.resolve(notConfigured()),\n secretSignIn: () => Promise.resolve(notConfigured()),\n google: {\n start: () => notConfigured(),\n callback: () => Promise.resolve(notConfigured()),\n },\n};\n\n/**\n * Assemble a site's gate, sign-in handlers, and sign-out from its `auth`\n * config. Accepts both access modes, so the mounting files never change:\n * `'public'` yields a pass-everything gate and `501` handlers, a workspace\n * block yields the live flows for exactly the providers it declares.\n *\n * In workspace mode the session-signing secret is required and read from the\n * environment variable named by `sessionSecretEnv` (default\n * `DOCS_SESSION_SECRET`); a missing value fails at startup with the variable's\n * name rather than signing sessions with a guessable fallback.\n *\n * @param auth - the `auth` field of `docs.config.ts`\n * @param options - extra public paths and the environment reader\n * @returns the assembled handlers\n * @public\n */\nexport function createSiteAuth(auth: DocsConfig['auth'], options: SiteAuthOptions = {}): SiteAuth {\n if (auth === 'public') {\n return {\n ...PUBLIC_SITE,\n gate: () => Promise.resolve(null),\n signOut: createSignOut(),\n };\n }\n return workspaceSiteAuth(auth, options);\n}\n\nfunction workspaceSiteAuth(auth: WorkspaceAuthConfig, options: SiteAuthOptions): SiteAuth {\n const env = options.env ?? ((name: string) => process.env[name]);\n const signInPath = auth.signInPath ?? '/signin';\n const secure = auth.secureCookies ?? true;\n const ttlSeconds = auth.sessionTtlSeconds;\n\n const sessionSecretEnv = auth.sessionSecretEnv ?? 'DOCS_SESSION_SECRET';\n const secret = env(sessionSecretEnv) ?? '';\n if (secret === '') {\n throw new DocsConfigError(\n `auth.mode is 'workspace': set the ${sessionSecretEnv} environment variable to a long random value (for example: openssl rand -hex 32).`,\n );\n }\n\n const shared = {\n secret,\n allowedDomains: auth.allowedDomains,\n secureCookies: secure,\n signInPath,\n ...(ttlSeconds === undefined ? {} : { ttlSeconds }),\n };\n\n const emailEnabled = auth.providers.email === true;\n const accessSecret = auth.providers.secret\n ? (env(auth.providers.secret.secretEnv ?? 'DOCS_ACCESS_SECRET') ?? '')\n : '';\n const secretEnabled = accessSecret !== '';\n\n const googleConfig = auth.providers.google;\n const clientId = googleConfig ? env(googleConfig.clientIdEnv ?? 'GOOGLE_CLIENT_ID') : undefined;\n const clientSecret = googleConfig\n ? env(googleConfig.clientSecretEnv ?? 'GOOGLE_CLIENT_SECRET')\n : undefined;\n const googleEnabled = Boolean(googleConfig && clientId && clientSecret);\n\n const emailSignIn = emailEnabled ? createEmailSignIn(shared) : null;\n const secretSignIn = secretEnabled ? createSecretSignIn({ ...shared, accessSecret }) : null;\n\n const googleFor = (request: Request): GoogleAuthHandlers | null => {\n if (!googleEnabled || !googleConfig || !clientId || !clientSecret) {\n return null;\n }\n const origin = new URL(request.url).origin;\n const redirectPath = googleConfig.redirectPath ?? '/api/auth/google/callback';\n return createGoogleAuth({\n ...shared,\n clientId,\n clientSecret,\n redirectUri: `${origin}${redirectPath}`,\n });\n };\n\n return {\n enabled: true,\n signInPath,\n secretEnabled,\n googleEnabled,\n gate: createAuthGate({\n secret,\n allowedDomains: auth.allowedDomains,\n signInPath,\n publicPaths: [...(options.publicPaths ?? ['/api/proxy'])],\n }),\n emailSignIn: (request) => emailSignIn?.(request) ?? Promise.resolve(notConfigured()),\n secretSignIn: (request) => secretSignIn?.(request) ?? Promise.resolve(notConfigured()),\n google: {\n start: (request) => googleFor(request)?.start(request) ?? notConfigured(),\n callback: (request) =>\n googleFor(request)?.callback(request) ?? Promise.resolve(notConfigured()),\n },\n signOut: createSignOut({ secureCookies: secure, redirectTo: signInPath }),\n };\n}\n","/**\n * The try-it proxy.\n *\n * The interactive playground cannot call an API directly from the browser\n * (cross-origin). Instead it posts an envelope to a same-origin route, which\n * forwards the request server-side. This module builds that forwarder in a\n * framework-agnostic way, using the Web `Request`/`Response` types so it drops\n * into a Next.js route handler, an edge function, or any Fetch-based runtime.\n *\n * Security model: the proxy forwards the caller's own credentials and injects\n * none of its own. It only reaches an origin the site has allow-listed, and it\n * refuses private, loopback, and link-local hosts so it cannot be turned into\n * an SSRF relay. Every forward is rate-limited per client IP, so a public\n * playground cannot be used to hammer the site's own API.\n *\n * @packageDocumentation\n */\n\nimport {\n RATE_LIMIT_WINDOW_MS,\n type RateLimiter,\n clientRateLimitKey,\n createRateLimiter,\n} from './rate-limit.js';\n\n/** Forwards per minute per client IP when a site names no limit. */\nconst DEFAULT_RATE_LIMIT_PER_MINUTE = 60;\n\n/**\n * A minimal fetch signature, so a test can inject a fake upstream.\n *\n * @public\n */\nexport type FetchLike = (url: string, init: RequestInit) => Promise<Response>;\n\n/**\n * Options for {@link createTryItProxy}.\n *\n * @public\n */\nexport interface CreateTryItProxyOptions {\n /** Exhaustive list of upstream origins the proxy may forward to. */\n readonly allowedOrigins: readonly string[];\n /**\n * Forwards per minute per client IP. Default 60 — pass\n * `config.proxy.rateLimitPerMinute` to let the site set it.\n */\n readonly rateLimitPerMinute?: number;\n /** Fetch implementation. Defaults to the global `fetch`. */\n readonly fetch?: FetchLike;\n /** Clock for the rate limiter, for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\n/**\n * Thrown when a forward target is missing, malformed, blocked, or not allow-listed.\n *\n * @public\n */\nexport class ProxyTargetError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ProxyTargetError';\n }\n}\n\nconst BLOCKED_HOST_PATTERNS: readonly RegExp[] = [\n /^localhost$/i,\n /\\.localhost$/i,\n /^0\\.0\\.0\\.0$/,\n /^127\\./,\n /^10\\./,\n /^192\\.168\\./,\n /^169\\.254\\./,\n /^172\\.(1[6-9]|2\\d|3[01])\\./,\n /^\\[?::1\\]?$/,\n /^\\[?fe80:/i,\n /^\\[?fc00:/i,\n /^\\[?fd[0-9a-f]{2}:/i,\n];\n\nfunction isBlockedHost(hostname: string): boolean {\n return BLOCKED_HOST_PATTERNS.some((pattern) => pattern.test(hostname));\n}\n\nfunction normalizeOrigins(origins: readonly string[]): ReadonlySet<string> {\n const set = new Set<string>();\n for (const origin of origins) {\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n throw new ProxyTargetError(`Invalid allow-listed origin: ${origin}`);\n }\n set.add(parsed.origin);\n }\n return set;\n}\n\n/**\n * Validate a forward target against the allow-list and the host block rules.\n *\n * @param target - the requested upstream URL\n * @param allowedOrigins - allow-listed origins\n * @returns the parsed, approved URL\n * @throws {@link ProxyTargetError} when the target is invalid, blocked, or not allow-listed\n * @public\n */\nexport function assertAllowedTarget(target: string, allowedOrigins: readonly string[]): URL {\n const allowed = normalizeOrigins(allowedOrigins);\n\n let url: URL;\n try {\n url = new URL(target);\n } catch {\n throw new ProxyTargetError(`Invalid target URL: ${target}`);\n }\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new ProxyTargetError(`Unsupported protocol: ${url.protocol}`);\n }\n if (isBlockedHost(url.hostname)) {\n throw new ProxyTargetError(`Blocked host: ${url.hostname}`);\n }\n if (!allowed.has(url.origin)) {\n throw new ProxyTargetError(`Target origin is not allow-listed: ${url.origin}`);\n }\n\n return url;\n}\n\n/**\n * The request envelope the playground posts to the proxy route.\n *\n * @public\n */\nexport interface TryItEnvelope {\n readonly url: string;\n readonly method?: string;\n readonly headers?: Record<string, string>;\n readonly body?: string | null;\n}\n\n// Headers that must not be forwarded from the browser to the upstream.\nconst STRIPPED_REQUEST_HEADERS: ReadonlySet<string> = new Set([\n 'host',\n 'connection',\n 'content-length',\n]);\n\nfunction jsonResponse(\n status: number,\n payload: unknown,\n headers: Record<string, string> = {},\n): Response {\n return new Response(JSON.stringify(payload), {\n status,\n headers: { 'content-type': 'application/json', ...headers },\n });\n}\n\n/**\n * Build the limiter both proxy factories share, from the site's configuration.\n */\nfunction proxyLimiter(options: CreateTryItProxyOptions): RateLimiter {\n const limit = options.rateLimitPerMinute ?? DEFAULT_RATE_LIMIT_PER_MINUTE;\n if (!Number.isInteger(limit) || limit < 1) {\n throw new ProxyTargetError(\n `proxy.rateLimitPerMinute must be an integer of 1 or more, got ${String(limit)}.`,\n );\n }\n return createRateLimiter({\n limit,\n windowMs: RATE_LIMIT_WINDOW_MS,\n ...(options.now ? { now: options.now } : {}),\n });\n}\n\n/**\n * The `429` a refused forward gets. Identical in shape to the Ask AI route's,\n * so a site handles one response body, not two.\n */\nfunction tooManyRequests(retryAfterSeconds: number | undefined): Response {\n const retryAfter = retryAfterSeconds ?? 60;\n return jsonResponse(\n 429,\n {\n error: `Too many requests. Try again in ${String(retryAfter)} seconds.`,\n retryAfterSeconds: retryAfter,\n },\n { 'retry-after': String(retryAfter) },\n );\n}\n\nfunction parseEnvelope(value: unknown): TryItEnvelope {\n if (typeof value !== 'object' || value === null) {\n throw new ProxyTargetError('Request body must be a JSON object.');\n }\n const record = value as Record<string, unknown>;\n if (typeof record['url'] !== 'string') {\n throw new ProxyTargetError('Request body must include a string \"url\".');\n }\n const headers: Record<string, string> = {};\n if (typeof record['headers'] === 'object' && record['headers'] !== null) {\n for (const [key, header] of Object.entries(record['headers'])) {\n if (typeof header === 'string' && !STRIPPED_REQUEST_HEADERS.has(key.toLowerCase())) {\n headers[key] = header;\n }\n }\n }\n return {\n url: record['url'],\n method: typeof record['method'] === 'string' ? record['method'] : 'GET',\n headers,\n body: typeof record['body'] === 'string' ? record['body'] : null,\n };\n}\n\n/**\n * Build a same-origin try-it proxy handler.\n *\n * Every request is rate-limited per client IP before anything is forwarded. A\n * caller over the limit gets `429` with a `Retry-After` header and the same JSON\n * body the Ask AI route returns.\n *\n * @param options - the allow-list, the rate limit, and an optional fetch implementation\n * @returns a handler mapping an incoming `Request` to a forwarded `Response`\n * @public\n */\nexport function createTryItProxy(\n options: CreateTryItProxyOptions,\n): (request: Request) => Promise<Response> {\n // Validate the allow-list eagerly so misconfiguration fails at startup.\n normalizeOrigins(options.allowedOrigins);\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n const limiter = proxyLimiter(options);\n\n return async function handle(request: Request): Promise<Response> {\n // Limit first: a refused caller must cost neither a body read nor an\n // upstream request.\n const decision = limiter.allow(clientRateLimitKey(request));\n if (!decision.allowed) {\n return tooManyRequests(decision.retryAfterSeconds);\n }\n\n let envelope: TryItEnvelope;\n try {\n const parsed: unknown = await request.json();\n envelope = parseEnvelope(parsed);\n } catch (error) {\n const message = error instanceof ProxyTargetError ? error.message : 'Invalid JSON body.';\n return jsonResponse(400, { error: message });\n }\n\n let target: URL;\n try {\n target = assertAllowedTarget(envelope.url, options.allowedOrigins);\n } catch (error) {\n const message = error instanceof ProxyTargetError ? error.message : 'Blocked target.';\n return jsonResponse(403, { error: message });\n }\n\n const init: RequestInit = {\n method: envelope.method ?? 'GET',\n headers: envelope.headers ?? {},\n };\n if (envelope.body !== null && envelope.body !== undefined) {\n init.body = envelope.body;\n }\n\n const upstream = await doFetch(target.toString(), init);\n return new Response(upstream.body, {\n status: upstream.status,\n headers: upstream.headers,\n });\n };\n}\n\n// Inbound infra headers that must never be forwarded upstream. Forwarding a\n// spoofed x-forwarded-* set is wrong and trips upstream WAFs.\nconst STRIPPED_FORWARD_HEADERS: readonly string[] = [\n 'host',\n 'connection',\n 'content-length',\n 'origin',\n 'referer',\n 'x-forwarded-for',\n 'x-forwarded-host',\n 'x-forwarded-proto',\n 'x-forwarded-port',\n 'x-real-ip',\n];\n\n/**\n * A set of HTTP method handlers for a try-it proxy route, ready to re-export\n * from a framework route file (e.g. a Next.js `route.ts`).\n *\n * @public\n */\nexport interface TryItProxyRoute {\n readonly GET: (request: Request) => Promise<Response>;\n readonly POST: (request: Request) => Promise<Response>;\n readonly PUT: (request: Request) => Promise<Response>;\n readonly PATCH: (request: Request) => Promise<Response>;\n readonly DELETE: (request: Request) => Promise<Response>;\n readonly OPTIONS: () => Response;\n}\n\n/**\n * The query parameters the route reads the target from, in order of preference.\n * `url` is the framework's own name — the one {@link unwrapProxyTarget} decodes;\n * `scalar_url` is the name the Scalar playground sends.\n */\nconst TARGET_PARAMS = ['url', 'scalar_url'] as const;\n\n/**\n * Build a drop-in try-it proxy route that speaks the query-parameter protocol\n * API playgrounds use: the target URL arrives in a query parameter, with the\n * caller's own method, headers, and body.\n *\n * Two parameter names are accepted, because two playgrounds disagree. `url` is\n * preferred and is the name {@link unwrapProxyTarget} decodes for display;\n * `scalar_url` is what the Scalar playground sends. Passing both uses `url`.\n *\n * The route validates the target with {@link assertAllowedTarget} (allow-list +\n * SSRF guard), rate-limits per client IP, strips inbound infra headers, and\n * forwards server-side. Export its handlers directly from a route file:\n *\n * @example\n * ```ts\n * export const { GET, POST, PUT, PATCH, DELETE, OPTIONS } = createTryItProxyRoute({\n * allowedOrigins: config.proxy.allowedOrigins,\n * rateLimitPerMinute: config.proxy.rateLimitPerMinute,\n * });\n * ```\n *\n * @param options - the allow-list, the rate limit, and an optional fetch implementation\n * @returns the method handlers for the route\n * @public\n */\nexport function createTryItProxyRoute(options: CreateTryItProxyOptions): TryItProxyRoute {\n normalizeOrigins(options.allowedOrigins);\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n const limiter = proxyLimiter(options);\n\n async function handle(request: Request): Promise<Response> {\n // Limit first, so a refused caller reaches neither the allow-list check nor\n // the upstream. `OPTIONS` is exempt: a preflight forwards nothing.\n const decision = limiter.allow(clientRateLimitKey(request));\n if (!decision.allowed) {\n return tooManyRequests(decision.retryAfterSeconds);\n }\n\n const requestUrl = new URL(request.url);\n const rawTarget = TARGET_PARAMS.map((name) => requestUrl.searchParams.get(name) ?? '').find(\n (value) => value !== '',\n );\n if (rawTarget === undefined) {\n return jsonResponse(400, {\n error: 'Missing target. Pass the upstream URL in the \"url\" query parameter.',\n });\n }\n\n let target: URL;\n try {\n target = assertAllowedTarget(rawTarget, options.allowedOrigins);\n } catch (error) {\n const message = error instanceof ProxyTargetError ? error.message : 'Blocked target.';\n return jsonResponse(403, { error: message });\n }\n\n const headers = new Headers(request.headers);\n for (const name of STRIPPED_FORWARD_HEADERS) {\n headers.delete(name);\n }\n\n const init: RequestInit = { method: request.method, headers, redirect: 'manual' };\n if (request.method !== 'GET' && request.method !== 'HEAD') {\n init.body = await request.arrayBuffer();\n }\n\n const upstream = await doFetch(target.toString(), init);\n const responseHeaders = new Headers(upstream.headers);\n responseHeaders.set('access-control-allow-origin', '*');\n return new Response(upstream.body, { status: upstream.status, headers: responseHeaders });\n }\n\n return {\n GET: handle,\n POST: handle,\n PUT: handle,\n PATCH: handle,\n DELETE: handle,\n OPTIONS: () =>\n new Response(null, {\n status: 204,\n headers: {\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': 'GET,POST,PUT,PATCH,DELETE,OPTIONS',\n 'access-control-allow-headers': '*',\n },\n }),\n };\n}\n\n/**\n * Recover the real target URL from a try-it proxy URL, for display.\n *\n * The playground fetches through the same-origin proxy, so a response's URL is\n * the proxy URL (`.../api/proxy?url=<encoded target>&...`). This returns the\n * decoded target so the response panel shows the real endpoint, not the proxy.\n * Any URL that is not a proxy URL is returned unchanged.\n *\n * It reads the same two parameter names {@link createTryItProxyRoute} accepts,\n * `url` first and `scalar_url` second, so a Scalar-shaped proxy URL is decoded\n * too.\n *\n * @param url - a proxy URL, or any URL\n * @returns the decoded target URL, or the input unchanged\n * @public\n */\nexport function unwrapProxyTarget(url: string): string {\n try {\n const parsed = new URL(url, 'http://localhost');\n if (!/\\/proxy\\/?$/.test(parsed.pathname)) {\n return url;\n }\n for (const name of TARGET_PARAMS) {\n const target = parsed.searchParams.get(name);\n if (target !== null && target !== '') {\n return target;\n }\n }\n return url;\n } catch {\n return url;\n }\n}\n","/**\n * `docs.json` navigation adapter.\n *\n * Translates a Mintlify `docs.json` navigation block into the framework's\n * normalized {@link Navigation} tree. It understands the two page-string forms\n * Mintlify uses — a plain content path, and an OpenAPI entry of the form\n * `\"<file> <METHOD> <route>\"` — and it recurses through arbitrarily nested\n * groups.\n *\n * @packageDocumentation\n */\n\nimport {\n type NavGroup,\n type NavItem,\n type NavMethod,\n type NavPage,\n type NavTab,\n type Navigation,\n} from '../../core/index.js';\n\nconst HTTP_METHODS: ReadonlySet<string> = new Set([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'HEAD',\n 'OPTIONS',\n 'TRACE',\n]);\n\n/**\n * Thrown when a `docs.json` navigation block does not match the expected shape.\n *\n * @public\n */\nexport class InvalidNavigationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidNavigationError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Parse a single page string into a normalized page node.\n *\n * A string shaped `\"<file> <METHOD> <route>\"` (where `<METHOD>` is a known HTTP\n * method) becomes an {@link OpenApiPage}; anything else becomes a {@link DocPage}.\n */\nfunction parsePageString(entry: string): NavPage {\n const parts = entry.trim().split(/\\s+/);\n const [file, maybeMethod, ...rest] = parts;\n\n if (file === undefined || file === '') {\n throw new InvalidNavigationError('Encountered an empty navigation page entry.');\n }\n\n if (maybeMethod !== undefined && rest.length > 0 && HTTP_METHODS.has(maybeMethod.toUpperCase())) {\n return {\n kind: 'openapi',\n file,\n method: maybeMethod.toUpperCase() as NavMethod,\n apiPath: rest.join(' '),\n };\n }\n\n return { kind: 'doc', file: entry.trim() };\n}\n\nfunction parseItem(entry: unknown, path: string): NavItem {\n if (typeof entry === 'string') {\n return parsePageString(entry);\n }\n\n if (isRecord(entry) && typeof entry['group'] === 'string') {\n return parseGroup(entry, path);\n }\n\n throw new InvalidNavigationError(\n `Navigation entry at ${path} must be a page string or a group object.`,\n );\n}\n\nfunction parseItems(pages: unknown, path: string): NavItem[] {\n if (!Array.isArray(pages)) {\n throw new InvalidNavigationError(`Expected an array of pages at ${path}.`);\n }\n return pages.map((entry, index) => parseItem(entry, `${path}[${String(index)}]`));\n}\n\nfunction parseGroup(group: Record<string, unknown>, path: string): NavGroup {\n const title = group['group'];\n if (typeof title !== 'string') {\n throw new InvalidNavigationError(`Group at ${path} is missing a string \"group\" title.`);\n }\n return {\n kind: 'group',\n title,\n items: parseItems(group['pages'], `${path}.pages`),\n };\n}\n\nfunction parseTab(tab: unknown, path: string): NavTab {\n if (!isRecord(tab) || typeof tab['tab'] !== 'string') {\n throw new InvalidNavigationError(`Tab at ${path} is missing a string \"tab\" title.`);\n }\n\n // A tab holds either `groups` or `pages`; normalize both into `items`.\n const items: NavItem[] =\n tab['groups'] !== undefined\n ? parseGroups(tab['groups'], `${path}.groups`)\n : parseItems(tab['pages'], `${path}.pages`);\n\n const icon = tab['icon'];\n return {\n kind: 'tab',\n title: tab['tab'],\n items,\n ...(typeof icon === 'string' ? { icon } : {}),\n };\n}\n\nfunction parseGroups(groups: unknown, path: string): NavGroup[] {\n if (!Array.isArray(groups)) {\n throw new InvalidNavigationError(`Expected an array of groups at ${path}.`);\n }\n return groups.map((group, index) => {\n const groupPath = `${path}[${String(index)}]`;\n if (!isRecord(group)) {\n throw new InvalidNavigationError(`Group at ${groupPath} must be an object.`);\n }\n return parseGroup(group, groupPath);\n });\n}\n\n/**\n * Parse a Mintlify `docs.json` object into the normalized {@link Navigation} tree.\n *\n * @param docsJson - the parsed contents of a `docs.json` file\n * @returns the normalized, ordered list of tabs\n * @throws {@link InvalidNavigationError} when the navigation shape is invalid\n * @public\n */\nexport function parseNavigation(docsJson: unknown): Navigation {\n if (!isRecord(docsJson)) {\n throw new InvalidNavigationError('docs.json must be an object.');\n }\n\n const navigation = docsJson['navigation'];\n if (!isRecord(navigation)) {\n throw new InvalidNavigationError('docs.json must have a \"navigation\" object.');\n }\n\n const tabs = navigation['tabs'];\n if (!Array.isArray(tabs)) {\n throw new InvalidNavigationError('docs.json navigation must have a \"tabs\" array.');\n }\n\n return tabs.map((tab, index) => parseTab(tab, `navigation.tabs[${String(index)}]`));\n}\n","/**\n * OpenAPI merge adapter.\n *\n * A Mintlify-style API reference stores one OpenAPI file per endpoint. Renderers\n * (Scalar, fumadocs-openapi) want a single document. `mergeOpenApiDocuments`\n * combines many single-operation OpenAPI files into one document: it unions\n * servers, tags, and components, and assembles the paths. A genuine conflict —\n * the same method on the same route defined twice — is an error, not a\n * silent overwrite.\n *\n * @packageDocumentation\n */\n\nimport {\n type OpenApiComponents,\n type OpenApiDocument,\n type OpenApiInfo,\n type OpenApiPathItem,\n type OpenApiServer,\n type OpenApiTag,\n} from '../../core/index.js';\n\n/**\n * Options controlling the merge.\n *\n * @public\n */\nexport interface MergeOpenApiOptions {\n /** The `info` block of the merged document. */\n readonly info: OpenApiInfo;\n /**\n * Servers for the merged document. When omitted, servers are unioned from\n * the input documents (deduplicated by `url`).\n */\n readonly servers?: readonly OpenApiServer[];\n /** The OpenAPI version string of the merged document. Defaults to `3.1.0`. */\n readonly openapi?: string;\n}\n\n/**\n * Thrown when an input is not a usable OpenAPI document, or when two inputs\n * define the same operation (method + route).\n *\n * @public\n */\nexport class OpenApiMergeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OpenApiMergeError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction collectServers(\n inputs: readonly Record<string, unknown>[],\n override: readonly OpenApiServer[] | undefined,\n): OpenApiServer[] {\n if (override !== undefined) {\n return [...override];\n }\n const byUrl = new Map<string, OpenApiServer>();\n for (const doc of inputs) {\n const servers = doc['servers'];\n if (!Array.isArray(servers)) {\n continue;\n }\n for (const server of servers) {\n if (isRecord(server) && typeof server['url'] === 'string' && !byUrl.has(server['url'])) {\n byUrl.set(server['url'], server as unknown as OpenApiServer);\n }\n }\n }\n return [...byUrl.values()];\n}\n\nfunction collectTags(inputs: readonly Record<string, unknown>[]): OpenApiTag[] {\n const byName = new Map<string, OpenApiTag>();\n for (const doc of inputs) {\n const tags = doc['tags'];\n if (!Array.isArray(tags)) {\n continue;\n }\n for (const tag of tags) {\n if (isRecord(tag) && typeof tag['name'] === 'string' && !byName.has(tag['name'])) {\n byName.set(tag['name'], tag as unknown as OpenApiTag);\n }\n }\n }\n return [...byName.values()];\n}\n\nfunction mergeComponents(inputs: readonly Record<string, unknown>[]): OpenApiComponents {\n const merged: Record<string, Record<string, unknown>> = {};\n for (const doc of inputs) {\n const components = doc['components'];\n if (!isRecord(components)) {\n continue;\n }\n for (const [section, value] of Object.entries(components)) {\n if (!isRecord(value)) {\n continue;\n }\n const target = merged[section] ?? (merged[section] = {});\n for (const [key, definition] of Object.entries(value)) {\n // First definition wins; later identical re-declarations are ignored.\n if (!(key in target)) {\n target[key] = definition;\n }\n }\n }\n }\n return merged;\n}\n\nconst HTTP_METHODS = new Set(['get', 'put', 'post', 'delete', 'patch', 'options', 'head', 'trace']);\n\nfunction assemblePaths(\n inputs: readonly Record<string, unknown>[],\n): Record<string, OpenApiPathItem> {\n const paths: Record<string, OpenApiPathItem> = {};\n for (const doc of inputs) {\n const docPaths = doc['paths'];\n if (!isRecord(docPaths)) {\n throw new OpenApiMergeError('Each OpenAPI input must have a \"paths\" object.');\n }\n // Each file's top-level security applies to all its operations. The merged\n // document can't carry one shared security, so push it onto the operations.\n const docSecurity = doc['security'];\n for (const [route, pathItem] of Object.entries(docPaths)) {\n if (!isRecord(pathItem)) {\n throw new OpenApiMergeError(`Path item for \"${route}\" must be an object.`);\n }\n const target = paths[route] ?? (paths[route] = {});\n for (const [method, operation] of Object.entries(pathItem)) {\n if (method in target) {\n throw new OpenApiMergeError(\n `Duplicate operation ${method.toUpperCase()} ${route} across inputs.`,\n );\n }\n let resolved = operation;\n if (\n HTTP_METHODS.has(method.toLowerCase()) &&\n isRecord(operation) &&\n !('security' in operation) &&\n Array.isArray(docSecurity)\n ) {\n resolved = { ...operation, security: docSecurity };\n }\n target[method] = resolved as OpenApiPathItem[string];\n }\n }\n }\n return paths;\n}\n\n/**\n * Merge many single-operation OpenAPI documents into one document.\n *\n * @param inputs - parsed OpenAPI documents, each typically holding one operation\n * @param options - the merged document's `info`, and optional server/version overrides\n * @returns the merged {@link OpenApiDocument}\n * @throws {@link OpenApiMergeError} on an invalid input or a duplicate operation\n * @public\n */\nexport function mergeOpenApiDocuments(\n inputs: readonly unknown[],\n options: MergeOpenApiOptions,\n): OpenApiDocument {\n const records: Record<string, unknown>[] = inputs.map((input, index) => {\n if (!isRecord(input)) {\n throw new OpenApiMergeError(`OpenAPI input at index ${String(index)} must be an object.`);\n }\n return input;\n });\n\n return {\n openapi: options.openapi ?? '3.1.0',\n info: options.info,\n servers: collectServers(records, options.servers),\n tags: collectTags(records),\n paths: assemblePaths(records),\n components: mergeComponents(records),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/ai/models.ts","../src/core/ai/config.ts","../src/core/rate-limit.ts","../src/core/search.ts","../src/core/ai/prompt.ts","../src/core/ai/providers/error.ts","../src/core/ai/providers/sse.ts","../src/core/ai/providers/anthropic.ts","../src/core/ai/providers/openai.ts","../src/core/ai/retrieval.ts","../src/core/ai/route.ts","../src/core/config.ts","../src/core/theme.ts","../src/core/redirects.ts","../src/core/llms-txt.ts","../src/core/code-samples.ts","../src/core/seo.ts","../src/core/docs-tree.ts","../src/core/openapi-markdown.ts","../src/core/markdown.ts","../src/core/auth/domains.ts","../src/core/auth/session.ts","../src/core/auth/email-provider.ts","../src/core/auth/google-provider.ts","../src/core/auth/gate.ts","../src/core/auth/secret-provider.ts","../src/core/auth/signout.ts","../src/core/auth/site-auth.ts","../src/core/proxy.ts","../src/adapters/docs-json/parse-navigation.ts","../src/adapters/openapi/merge-documents.ts"],"names":["decoder","PROVIDER_LABEL","requestBody","textDelta","errorMessage","encoder","describe","cookie","DEFAULT_TTL_SECONDS","readCookie","safeRedirectPath","headers","DEFAULT_RATE_LIMIT_PER_MINUTE","jsonResponse","isRecord","HTTP_METHODS"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * The curated model registry.\n *\n * A docs site names a provider, and optionally a model. The framework — not the\n * site — owns which models are known good for grounded documentation answers,\n * which one is the default, and which environment variable holds the key. A\n * short allow-list is deliberate: an unknown or retired model id must fail with\n * a readable error at startup, not with a provider `404` on a reader's first\n * question.\n *\n * The lists grow as providers ship models. Adding one is a one-line change here.\n *\n * @packageDocumentation\n */\n\n/**\n * The AI providers `docs-core` speaks to.\n *\n * @public\n */\nexport type AiProviderName = 'anthropic' | 'openai';\n\n/**\n * What the framework knows about one provider: the models it accepts, the model\n * it picks when a site names none, and the environment variable it reads the API\n * key from by default.\n *\n * @public\n */\nexport interface AiProviderModels {\n /** Model used when `ai.model` is omitted. */\n readonly defaultModel: string;\n /** Exhaustive list of accepted model ids, best-first for documentation. */\n readonly models: readonly string[];\n /** Env var read when `ai.apiKeyEnv` is omitted. */\n readonly defaultApiKeyEnv: string;\n}\n\n/**\n * Every provider name, in a stable order — for error messages and docs tables.\n *\n * @public\n */\nexport const AI_PROVIDER_NAMES: readonly AiProviderName[] = Object.freeze([\n 'anthropic',\n 'openai',\n] as const);\n\n/**\n * The curated registry, keyed by provider.\n *\n * @public\n */\nexport const AI_PROVIDER_MODELS: Readonly<Record<AiProviderName, AiProviderModels>> = Object.freeze(\n {\n anthropic: Object.freeze({\n defaultModel: 'claude-sonnet-5',\n models: Object.freeze([\n 'claude-sonnet-5',\n 'claude-haiku-4-5',\n 'claude-opus-5',\n 'claude-opus-4-8',\n 'claude-sonnet-4-6',\n ] as const),\n defaultApiKeyEnv: 'ANTHROPIC_API_KEY',\n }),\n openai: Object.freeze({\n defaultModel: 'gpt-5-mini',\n models: Object.freeze([\n 'gpt-5-mini',\n 'gpt-5',\n 'gpt-5.2',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4.1-mini',\n 'gpt-4o',\n 'gpt-4o-mini',\n ] as const),\n defaultApiKeyEnv: 'OPENAI_API_KEY',\n }),\n },\n);\n\n/**\n * Narrow an unvalidated value to a known provider name.\n *\n * @param value - a value from site configuration\n * @returns `true` when the value names a provider the framework supports\n */\nexport function isAiProviderName(value: unknown): value is AiProviderName {\n return typeof value === 'string' && AI_PROVIDER_NAMES.includes(value as AiProviderName);\n}\n\n/**\n * Test a model id against a provider's allow-list.\n *\n * @param provider - the provider the model belongs to\n * @param model - the model id from site configuration\n * @returns `true` when the provider accepts the model\n */\nexport function isAllowedAiModel(provider: AiProviderName, model: string): boolean {\n return AI_PROVIDER_MODELS[provider].models.includes(model);\n}\n","/**\n * The Ask AI configuration boundary.\n *\n * A site declares `ai: { provider: 'anthropic' }` and is done: every other\n * field has a framework default. That convenience only works if the boundary is\n * strict, so this module validates each field and fails with a message that\n * names the field, the value it received, and the accepted values. Nothing\n * downstream re-checks: {@link resolveAiConfig} is the single gate, and it runs\n * when the route is built, not when a reader asks a question.\n *\n * Secrets never appear here. Config names the environment variable; the server\n * reads the value at request time.\n *\n * @packageDocumentation\n */\n\nimport {\n AI_PROVIDER_MODELS,\n AI_PROVIDER_NAMES,\n type AiProviderName,\n isAiProviderName,\n isAllowedAiModel,\n} from './models.js';\n\nconst DEFAULT_RATE_LIMIT_PER_MINUTE = 10;\nconst DEFAULT_MAX_CONTEXT_PAGES = 6;\n\nconst MIN_RATE_LIMIT_PER_MINUTE = 1;\nconst MAX_RATE_LIMIT_PER_MINUTE = 600;\nconst MIN_MAX_CONTEXT_PAGES = 1;\nconst MAX_MAX_CONTEXT_PAGES = 20;\nconst MAX_SYSTEM_PROMPT_CHARS = 4000;\n\n/**\n * The Ask AI settings a site supplies. Only `provider` is required.\n *\n * @public\n */\nexport interface AiConfig {\n /** Which provider answers questions. */\n readonly provider: AiProviderName;\n /** Model id, validated against the provider's allow-list. Provider default when omitted. */\n readonly model?: string;\n /** Env var holding the API key. Provider default when omitted (e.g. `ANTHROPIC_API_KEY`). */\n readonly apiKeyEnv?: string;\n /** Questions per minute per client IP. Default 10. Always enforced. */\n readonly rateLimitPerMinute?: number;\n /** How many documentation pages are retrieved per question. Default 6. */\n readonly maxContextPages?: number;\n /** Extra instructions appended to the framework's grounded system prompt. */\n readonly systemPrompt?: string;\n}\n\n/**\n * An {@link AiConfig} with every default filled in and every value checked.\n * Frozen, so a caller cannot mutate a validated configuration.\n *\n * @public\n */\nexport interface ResolvedAiConfig {\n readonly provider: AiProviderName;\n readonly model: string;\n /** The env var the server reads the key from. */\n readonly apiKeyEnv: string;\n /** The provider's default env var, for error messages and documentation. */\n readonly defaultApiKeyEnv: string;\n readonly rateLimitPerMinute: number;\n readonly maxContextPages: number;\n /** Present only when the site supplied extra instructions. */\n readonly systemPrompt?: string;\n}\n\n/**\n * Thrown when `ai` configuration is missing, malformed, or out of range. The\n * message names the exact field and the accepted values.\n *\n * @public\n */\nexport class AiConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'AiConfigError';\n }\n}\n\n/** Render an untrusted value for an error message: quoted when it is a string. */\nfunction describe(value: unknown): string {\n if (typeof value === 'string') {\n return `'${value}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || value === null) {\n return String(value);\n }\n if (value === undefined) {\n return 'undefined';\n }\n return Array.isArray(value) ? 'an array' : `a ${typeof value}`;\n}\n\nfunction quoteList(values: readonly string[]): string {\n return values.map((value) => `'${value}'`).join(', ');\n}\n\nfunction requireOptionalString(value: unknown, field: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'string' || value.trim() === '') {\n throw new AiConfigError(\n `${field} must be a non-empty string, got ${describe(value)}. Remove the field to use the default.`,\n );\n }\n return value.trim();\n}\n\nfunction requireOptionalIntegerInRange(\n value: unknown,\n field: string,\n min: number,\n max: number,\n fallback: number,\n): number {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== 'number' || !Number.isInteger(value) || value < min || value > max) {\n throw new AiConfigError(\n `${field} must be an integer between ${String(min)} and ${String(max)}, got ${describe(value)}.`,\n );\n }\n return value;\n}\n\n/**\n * Validate a site's `ai` configuration and fill in the framework defaults.\n *\n * Call it once, when the route is built. It throws rather than returning an\n * error object so a misconfigured site fails at startup — a reader must never\n * discover a typo in `docs.config.ts` by asking a question.\n *\n * @param config - the raw `ai` block from a site's configuration\n * @returns the frozen, fully defaulted configuration\n * @throws {@link AiConfigError} when any field is missing, malformed, or out of range\n * @public\n */\nexport function resolveAiConfig(config: AiConfig): ResolvedAiConfig {\n // Typed as `AiConfig`, but a site's config file may be JavaScript, or built\n // from JSON, so treat the input as unknown and check it properly.\n const candidate: unknown = config;\n if (typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)) {\n throw new AiConfigError(\n `ai must be an object, got ${describe(candidate)}. Example: ai: { provider: 'anthropic' }.`,\n );\n }\n\n const raw = candidate as Record<string, unknown>;\n\n const provider: unknown = raw['provider'];\n if (!isAiProviderName(provider)) {\n throw new AiConfigError(\n `ai.provider must be one of ${quoteList(AI_PROVIDER_NAMES)}, got ${describe(provider)}.`,\n );\n }\n\n const registry = AI_PROVIDER_MODELS[provider];\n\n const model = requireOptionalString(raw['model'], 'ai.model') ?? registry.defaultModel;\n if (!isAllowedAiModel(provider, model)) {\n throw new AiConfigError(\n `ai.model must be one of ${quoteList(registry.models)} for provider '${provider}', got ${describe(model)}.`,\n );\n }\n\n const apiKeyEnv =\n requireOptionalString(raw['apiKeyEnv'], 'ai.apiKeyEnv') ?? registry.defaultApiKeyEnv;\n\n const rateLimitPerMinute = requireOptionalIntegerInRange(\n raw['rateLimitPerMinute'],\n 'ai.rateLimitPerMinute',\n MIN_RATE_LIMIT_PER_MINUTE,\n MAX_RATE_LIMIT_PER_MINUTE,\n DEFAULT_RATE_LIMIT_PER_MINUTE,\n );\n\n const maxContextPages = requireOptionalIntegerInRange(\n raw['maxContextPages'],\n 'ai.maxContextPages',\n MIN_MAX_CONTEXT_PAGES,\n MAX_MAX_CONTEXT_PAGES,\n DEFAULT_MAX_CONTEXT_PAGES,\n );\n\n const systemPrompt: unknown = raw['systemPrompt'];\n if (systemPrompt !== undefined) {\n if (typeof systemPrompt !== 'string') {\n throw new AiConfigError(`ai.systemPrompt must be a string, got ${describe(systemPrompt)}.`);\n }\n if (systemPrompt.length > MAX_SYSTEM_PROMPT_CHARS) {\n throw new AiConfigError(\n `ai.systemPrompt must be ${String(MAX_SYSTEM_PROMPT_CHARS)} characters or fewer, got ${String(systemPrompt.length)}.`,\n );\n }\n }\n const trimmedPrompt = typeof systemPrompt === 'string' ? systemPrompt.trim() : '';\n\n return Object.freeze({\n provider,\n model,\n apiKeyEnv,\n defaultApiKeyEnv: registry.defaultApiKeyEnv,\n rateLimitPerMinute,\n maxContextPages,\n ...(trimmedPrompt === '' ? {} : { systemPrompt: trimmedPrompt }),\n });\n}\n","/**\n * A sliding-window rate limiter, shared by every route the framework builds.\n *\n * Two routes cost a site real money at somebody else's server: an Ask AI\n * question at a model provider, and a try-it request at the site's own API. Both\n * are limited by this module, with the same window, the same client key, and the\n * same `429` shape, so a reader gets one consistent answer wherever the limit\n * bites.\n *\n * The window slides — it holds the timestamps of recent requests rather than\n * counting into fixed buckets — so a caller cannot get double the allowance by\n * straddling a bucket edge.\n *\n * State is in memory, per instance. On one long-lived server that is exactly\n * right. Across several instances or a serverless fleet each instance keeps its\n * own window, so the effective limit multiplies by the instance count; a site\n * that needs a shared limit should put one in front of the route.\n *\n * @packageDocumentation\n */\n\n/** Sweep stale keys once the map grows past this, so it cannot leak memory. */\nconst SWEEP_THRESHOLD = 5000;\n\n/** One minute — the window every framework route limits over. */\nexport const RATE_LIMIT_WINDOW_MS = 60_000;\n\n/**\n * The rate-limit key for one request: the client IP as the edge reported it.\n *\n * `x-forwarded-for` is the standard header and holds a chain, so the first\n * entry — the original client — is the one that identifies the caller. Some\n * proxies send only `x-real-ip`, so that is the fallback. With neither header\n * every caller shares the key `'unknown'`, which is correct behind a\n * header-less proxy and on a local dev server: one shared bucket is a limit,\n * not a bypass.\n *\n * @param request - the incoming request\n * @returns the client key, never empty\n */\nexport function clientRateLimitKey(request: Request): string {\n const forwarded = request.headers.get('x-forwarded-for');\n const first = forwarded?.split(',')[0]?.trim() ?? '';\n if (first !== '') {\n return first;\n }\n const realIp = request.headers.get('x-real-ip')?.trim() ?? '';\n return realIp === '' ? 'unknown' : realIp;\n}\n\n/**\n * The verdict for one request.\n */\nexport interface RateLimitDecision {\n readonly allowed: boolean;\n /** Whole seconds until the caller may retry. Present only when refused. */\n readonly retryAfterSeconds?: number;\n}\n\n/**\n * A keyed rate limiter.\n */\nexport interface RateLimiter {\n /**\n * Record an attempt for `key` and decide it. An allowed attempt is counted; a\n * refused one is not, so a caller cannot extend their own penalty by retrying.\n */\n allow(key: string): RateLimitDecision;\n}\n\n/**\n * Options for {@link createRateLimiter}.\n */\nexport interface CreateRateLimiterOptions {\n /** Attempts allowed per key per window. Must be a positive integer. */\n readonly limit: number;\n /** Window length in milliseconds. */\n readonly windowMs: number;\n /** Clock, for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\n/**\n * Build an in-memory sliding-window limiter.\n *\n * @param options - the limit, the window, and an optional clock\n * @returns the limiter\n */\nexport function createRateLimiter(options: CreateRateLimiterOptions): RateLimiter {\n const now = options.now ?? (() => Date.now());\n const hits = new Map<string, number[]>();\n\n /** Drop timestamps that have left the window. */\n function prune(timestamps: readonly number[], cutoff: number): number[] {\n return timestamps.filter((at) => at > cutoff);\n }\n\n function sweep(cutoff: number): void {\n for (const [key, timestamps] of hits) {\n const fresh = prune(timestamps, cutoff);\n if (fresh.length === 0) {\n hits.delete(key);\n } else {\n hits.set(key, fresh);\n }\n }\n }\n\n return {\n allow(key: string): RateLimitDecision {\n const at = now();\n const cutoff = at - options.windowMs;\n\n if (hits.size > SWEEP_THRESHOLD) {\n sweep(cutoff);\n }\n\n const timestamps = prune(hits.get(key) ?? [], cutoff);\n\n if (timestamps.length >= options.limit) {\n hits.set(key, timestamps);\n const oldest = timestamps[0] ?? at;\n const waitMs = oldest + options.windowMs - at;\n return { allowed: false, retryAfterSeconds: Math.max(1, Math.ceil(waitMs / 1000)) };\n }\n\n timestamps.push(at);\n hits.set(key, timestamps);\n return { allowed: true };\n },\n };\n}\n","/**\n * Lightweight client-shippable search.\n *\n * The framework builds a compact term index from a site's pages and scores\n * queries against it with BM25: term frequency, inverse document frequency,\n * and document-length normalization. IDF is what keeps ranking honest — a\n * word that appears in every page (\"how\", \"the\", \"a\") carries almost no\n * weight, so a query like \"how do I deploy\" is decided by \"deploy\", not by\n * its stopwords. A light, symmetric stemmer is applied to both the index and\n * the query, so \"wallets\" finds \"wallet\" and \"authentication\" finds\n * \"authenticate\".\n *\n * It is intentionally simple — good for the hundreds-to-low-thousands of\n * pages a docs site has — and ships to the browser as plain JSON, so search\n * needs no server round-trip. A site provides the input UI.\n *\n * @packageDocumentation\n */\n\n/**\n * A page to index.\n *\n * @public\n */\nexport interface SearchDocument {\n readonly id: string;\n readonly title: string;\n readonly path: string;\n /** Optional grouping label, e.g. the section or tab name. */\n readonly section?: string;\n /** Free text to index (body, description). Not retained in the index. */\n readonly body?: string;\n}\n\n/**\n * One indexed page. Part of the serialized {@link SearchIndex} wire format.\n *\n * @public\n */\nexport interface IndexedDocument {\n readonly id: string;\n readonly title: string;\n readonly path: string;\n readonly section?: string;\n /** Stemmed term → occurrence count across title, section, and body. */\n readonly terms: Readonly<Record<string, number>>;\n /** Total token count, for length normalization. */\n readonly length: number;\n /** The title's stemmed terms, precomputed for the per-query title bonus. */\n readonly titleTerms: readonly string[];\n /** The section label's stemmed terms, when a section is set. */\n readonly sectionTerms?: readonly string[];\n}\n\n/**\n * A built, serializable search index.\n *\n * @public\n */\nexport interface SearchIndex {\n readonly documents: readonly IndexedDocument[];\n /** Stemmed term → number of documents containing it. */\n readonly documentFrequency: Readonly<Record<string, number>>;\n /** Every indexed term, sorted, for binary-searched prefix matching. */\n readonly vocabulary: readonly string[];\n /** Mean token count per document, for length normalization. */\n readonly averageLength: number;\n}\n\n/**\n * A ranked search hit.\n *\n * @public\n */\nexport interface SearchResult {\n readonly id: string;\n readonly title: string;\n readonly path: string;\n readonly section?: string;\n readonly score: number;\n}\n\n/** BM25 term-frequency saturation. */\nconst K1 = 1.2;\n/** BM25 length-normalization strength. */\nconst B = 0.75;\n/** Extra weight for a query term that appears in the title, as a whole token. */\nconst TITLE_BONUS = 1.0;\n/** Extra weight for a query term that appears in the section label. */\nconst SECTION_BONUS = 0.5;\n/** A prefix match is worth this fraction of an exact term match. */\nconst PREFIX_WEIGHT = 0.4;\n\n/**\n * Query words that carry no topical signal. They stay in the index (IDF\n * already attenuates them) but are dropped from queries — unless the whole\n * query is stopwords, in which case they are kept so short conversational\n * queries still return something.\n */\nconst STOPWORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'are',\n 'as',\n 'at',\n 'be',\n 'but',\n 'by',\n 'can',\n 'do',\n 'does',\n 'for',\n 'from',\n 'get',\n 'has',\n 'have',\n 'how',\n 'i',\n 'if',\n 'in',\n 'is',\n 'it',\n 'its',\n 'me',\n 'my',\n 'need',\n 'no',\n 'not',\n 'of',\n 'on',\n 'or',\n 'our',\n 'should',\n 'so',\n 'that',\n 'the',\n 'their',\n 'then',\n 'there',\n 'these',\n 'they',\n 'this',\n 'to',\n 'up',\n 'us',\n 'want',\n 'was',\n 'we',\n 'what',\n 'when',\n 'where',\n 'which',\n 'who',\n 'why',\n 'will',\n 'with',\n 'would',\n 'you',\n 'your',\n]);\n\n/** A doubled final consonant left by an -ing/-ed strip: `runn`, `sett`. */\nconst DOUBLED_CONSONANT = /([bcdfghjklmnpqrstvz])\\1$/;\n\n/**\n * A light, symmetric stemmer — deliberately not a full Porter stemmer. Its\n * rules, in order: plural folding (`-ies`, `-es` after a sibilant, `-s`),\n * `-ing`/`-ed` with doubled-consonant repair, `-ation` → `-ate`, a full\n * `-ate` strip on long stems, and a final `-e` strip on words of five letters\n * or more (which is what folds `response`/`responses` and `create`/\n * `creating`). It over-stems occasionally (`operate` and `operation` meet at\n * `oper`); that trades a little precision for recall, and because the same\n * function runs at index time and query time, symmetry — not linguistic\n * perfection — is what correctness rests on.\n */\nfunction stem(token: string): string {\n let word = token;\n if (word.length >= 5 && word.endsWith('ies')) {\n word = `${word.slice(0, -3)}y`;\n } else if (word.length >= 5 && /(?:ss|sh|ch|x|z)es$/.test(word)) {\n word = word.slice(0, -2);\n } else if (\n word.length >= 4 &&\n word.endsWith('s') &&\n !word.endsWith('ss') &&\n !word.endsWith('us') &&\n // Protect -is singulars (analysis, basis), but only long ones: a short\n // word ending in -is is far more likely a plural like `apis` or `uris`.\n !(word.endsWith('is') && word.length >= 6)\n ) {\n word = word.slice(0, -1);\n }\n if (word.length >= 6 && word.endsWith('ing')) {\n word = word.slice(0, -3).replace(DOUBLED_CONSONANT, '$1');\n } else if (word.length >= 5 && word.endsWith('ed')) {\n word = word.slice(0, -2).replace(DOUBLED_CONSONANT, '$1');\n }\n if (word.length >= 7 && word.endsWith('ation')) {\n word = `${word.slice(0, -5)}ate`;\n }\n if (word.length >= 7 && word.endsWith('ate')) {\n word = word.slice(0, -3);\n }\n if (word.length >= 5 && word.endsWith('e')) {\n word = word.slice(0, -1);\n }\n return word;\n}\n\nfunction tokenize(text: string): string[] {\n return text.toLowerCase().match(/[a-z0-9]+/g) ?? [];\n}\n\nfunction stemmedTokens(text: string): string[] {\n return tokenize(text).map(stem);\n}\n\n/**\n * Build a search index from a list of documents.\n *\n * @public\n */\nexport function buildSearchIndex(documents: readonly SearchDocument[]): SearchIndex {\n const documentFrequency: Record<string, number> = {};\n let totalLength = 0;\n\n const indexed = documents.map((doc) => {\n const tokens = stemmedTokens(`${doc.title} ${doc.section ?? ''} ${doc.body ?? ''}`);\n const terms: Record<string, number> = {};\n for (const token of tokens) {\n terms[token] = (terms[token] ?? 0) + 1;\n }\n for (const term of Object.keys(terms)) {\n documentFrequency[term] = (documentFrequency[term] ?? 0) + 1;\n }\n totalLength += tokens.length;\n return {\n id: doc.id,\n title: doc.title,\n path: doc.path,\n terms,\n length: tokens.length,\n titleTerms: [...new Set(stemmedTokens(doc.title))],\n ...(doc.section !== undefined\n ? { section: doc.section, sectionTerms: [...new Set(stemmedTokens(doc.section))] }\n : {}),\n };\n });\n\n return {\n documents: indexed,\n documentFrequency,\n vocabulary: Object.keys(documentFrequency).sort(),\n averageLength: indexed.length > 0 ? totalLength / indexed.length : 0,\n };\n}\n\n/** Robertson–Sparck Jones IDF, floored at a small positive value. */\nfunction inverseDocumentFrequency(documentCount: number, withTerm: number): number {\n return Math.max(0.05, Math.log(1 + (documentCount - withTerm + 0.5) / (withTerm + 0.5)));\n}\n\n/** Query terms after stopword removal — all of them when nothing survives. */\nfunction queryTerms(query: string): string[] {\n const tokens = tokenize(query);\n const meaningful = tokens.filter((token) => !STOPWORDS.has(token) && token.length > 1);\n return (meaningful.length > 0 ? meaningful : tokens).map(stem);\n}\n\n/** Per-document term frequency and document frequency for one prefix term. */\ninterface PrefixStats {\n readonly frequencyByDocument: Map<number, number>;\n documentsWithPrefix: number;\n}\n\n/** The index of the first vocabulary entry >= `prefix` (binary search). */\nfunction lowerBound(vocabulary: readonly string[], prefix: string): number {\n let low = 0;\n let high = vocabulary.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n if ((vocabulary[mid] ?? '') < prefix) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n}\n\n/** Every indexed term starting with `prefix` — one contiguous, sorted range. */\nfunction termsWithPrefix(vocabulary: readonly string[], prefix: string): string[] {\n const matches: string[] = [];\n for (let at = lowerBound(vocabulary, prefix); at < vocabulary.length; at++) {\n const term = vocabulary[at] ?? '';\n if (!term.startsWith(prefix)) {\n break;\n }\n matches.push(term);\n }\n return matches;\n}\n\n/**\n * Term frequency and document frequency for every query term that matched no\n * indexed term exactly. The sorted vocabulary makes finding a prefix's terms\n * a binary search, so the cost per unmatched term is the handful of terms it\n * actually matches — not a scan of every term in every document.\n */\nfunction collectPrefixStats(\n index: SearchIndex,\n unmatchedTerms: readonly string[],\n): Map<string, PrefixStats> {\n const stats = new Map<string, PrefixStats>();\n for (const term of unmatchedTerms) {\n const matching = termsWithPrefix(index.vocabulary, term);\n const frequencyByDocument = new Map<number, number>();\n if (matching.length > 0) {\n index.documents.forEach((doc, position) => {\n let frequency = 0;\n for (const match of matching) {\n frequency += doc.terms[match] ?? 0;\n }\n if (frequency > 0) {\n frequencyByDocument.set(position, frequency);\n }\n });\n }\n stats.set(term, { frequencyByDocument, documentsWithPrefix: frequencyByDocument.size });\n }\n return stats;\n}\n\n/** Deterministic, locale-independent string order for tie-breaking. */\nfunction compareStrings(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * Search an index with BM25 scoring. Rare words dominate common ones, term\n * repetition saturates, long pages get no volume advantage, and a term that\n * also appears in the title (as a whole token, never a substring) or the\n * section label earns a bonus. A stemmed term that matches nothing exactly\n * falls back to prefix matching at reduced weight — including the title and\n * section bonuses, so a half-typed word still ranks the page it names first.\n * Ties break deterministically by title, then path, independent of locale.\n *\n * Returns up to `limit` results, best first.\n *\n * @public\n */\nexport function searchIndex(index: SearchIndex, query: string, limit = 8): SearchResult[] {\n const terms = queryTerms(query);\n if (terms.length === 0 || index.documents.length === 0) {\n return [];\n }\n const documentCount = index.documents.length;\n // A single character is exact-match only: as a prefix it matches a huge\n // slice of the vocabulary, which costs real time and carries no ranking\n // signal a keystroke later won't improve on.\n const unmatched = terms.filter(\n (term) => term.length >= 2 && (index.documentFrequency[term] ?? 0) === 0,\n );\n const prefixStats = unmatched.length > 0 ? collectPrefixStats(index, unmatched) : undefined;\n\n const results: SearchResult[] = [];\n index.documents.forEach((doc, position) => {\n const lengthNorm = 1 - B + B * (index.averageLength > 0 ? doc.length / index.averageLength : 1);\n\n let score = 0;\n for (const term of terms) {\n const exactDocuments = index.documentFrequency[term] ?? 0;\n let frequency: number;\n let idf: number;\n let weight: number;\n let inTitle: boolean;\n let inSection: boolean;\n if (exactDocuments > 0) {\n frequency = doc.terms[term] ?? 0;\n idf = inverseDocumentFrequency(documentCount, exactDocuments);\n weight = 1;\n inTitle = doc.titleTerms.includes(term);\n inSection = doc.sectionTerms?.includes(term) ?? false;\n } else {\n const stats = prefixStats?.get(term);\n if (stats === undefined || stats.documentsWithPrefix === 0) {\n continue;\n }\n frequency = stats.frequencyByDocument.get(position) ?? 0;\n idf = inverseDocumentFrequency(documentCount, stats.documentsWithPrefix);\n weight = PREFIX_WEIGHT;\n inTitle = doc.titleTerms.some((titleTerm) => titleTerm.startsWith(term));\n inSection = doc.sectionTerms?.some((sectionTerm) => sectionTerm.startsWith(term)) ?? false;\n }\n if (frequency > 0) {\n score += weight * idf * ((frequency * (K1 + 1)) / (frequency + K1 * lengthNorm));\n }\n if (inTitle) {\n score += weight * idf * TITLE_BONUS;\n }\n if (inSection) {\n score += weight * idf * SECTION_BONUS;\n }\n }\n if (score > 0) {\n results.push({\n id: doc.id,\n title: doc.title,\n path: doc.path,\n score,\n ...(doc.section !== undefined ? { section: doc.section } : {}),\n });\n }\n });\n\n results.sort(\n (a, b) =>\n b.score - a.score || compareStrings(a.title, b.title) || compareStrings(a.path, b.path),\n );\n return results.slice(0, limit);\n}\n","/**\n * The grounded system prompt.\n *\n * The prompt is the whole safety story of Ask AI: the model may answer only\n * from the pages the framework retrieved, and it must say so plainly when those\n * pages do not cover the question. A docs assistant that guesses an endpoint\n * name is worse than one that admits it does not know.\n *\n * Output is deterministic — the same site, pages, and instructions always build\n * the same string, in the same order, with nothing time-dependent — so the\n * prompt is safe to cache and simple to test.\n *\n * @packageDocumentation\n */\n\nimport type { ContextPage } from './retrieval.js';\n\n/**\n * Options for {@link buildSystemPrompt}.\n */\nexport interface BuildSystemPromptOptions {\n /** The site's display name, from `theme.name`. */\n readonly siteName: string;\n /** The retrieved pages, best first. May be empty. */\n readonly pages: readonly ContextPage[];\n /** Extra instructions from `ai.systemPrompt`, appended verbatim. */\n readonly extraInstructions?: string;\n}\n\nconst RULES: readonly string[] = [\n 'Answer only from the documentation below. Never use outside knowledge, and never guess.',\n 'When the documentation does not answer the question, say so plainly and name what is missing. Do not invent an answer.',\n 'Never invent a URL, an endpoint, a parameter, a field name, or a value. Copy them exactly from the documentation.',\n 'The pages are ordered best-match first. Prefer the most relevant page, but combine pages when the answer spans them — for example an endpoint page and its related guide.',\n 'The pages are re-retrieved for every question, so earlier turns in this conversation may have used pages that are not shown now. Never call an earlier answer wrong just because its page is absent here.',\n 'A page ending in [content truncated] has more on the site. If the answer may sit in the missing part, say so and point the reader to that page.',\n 'Be concise. Answer the question first, then add only the detail that matters.',\n 'Use Markdown: short paragraphs, lists where they help, and fenced code blocks for code.',\n 'Refer to a page by its title, in the sentence, where it helps the reader go deeper.',\n 'Reply in the language the reader used.',\n];\n\nfunction renderPage(page: ContextPage, position: number): string {\n return [\n `=== PAGE ${String(position)}: ${page.title} (${page.url}) ===`,\n page.markdown,\n `=== END PAGE ${String(position)} ===`,\n ].join('\\n');\n}\n\n/**\n * Build the system prompt for one question.\n *\n * @param options - the site name, the retrieved pages, and any extra instructions\n * @returns the complete system prompt\n */\nexport function buildSystemPrompt(options: BuildSystemPromptOptions): string {\n const sections: string[] = [\n `You are the documentation assistant for ${options.siteName}. You answer questions about ${options.siteName} using its documentation.`,\n RULES.map((rule) => `- ${rule}`).join('\\n'),\n ];\n\n if (options.pages.length === 0) {\n sections.push(\n 'DOCUMENTATION\\n\\nNo documentation page matched this question. Tell the reader you cannot find it in the documentation, and suggest they rephrase the question or use the search box.',\n );\n } else {\n sections.push(\n [\n 'DOCUMENTATION',\n `The following ${String(options.pages.length)} ${options.pages.length === 1 ? 'page is' : 'pages are'} the only source you may use.`,\n options.pages.map((page, position) => renderPage(page, position + 1)).join('\\n\\n'),\n ].join('\\n\\n'),\n );\n }\n\n const extra = options.extraInstructions?.trim() ?? '';\n if (extra !== '') {\n sections.push(`ADDITIONAL INSTRUCTIONS FROM THIS SITE\\n\\n${extra}`);\n }\n\n return sections.join('\\n\\n');\n}\n","/**\n * Turning a provider failure into one readable line.\n *\n * A refused provider request can answer with a tidy JSON error, an HTML gateway\n * page, or a wall of text. The Ask AI panel has room for one sentence, so this\n * module extracts the useful message and falls back to the status line when the\n * body is HTML or oversized — the same fix applied to the OAuth dialog in\n * `patches/fumadocs-openapi.patch`.\n *\n * It also redacts anything that looks like an API key. OpenAI, for one, echoes\n * the rejected key back in its `401` message, and that message is on its way to\n * a browser.\n *\n * @packageDocumentation\n */\n\nconst MAX_MESSAGE_CHARS = 300;\n\n/**\n * Key shapes both providers issue, plus a generic bearer token. The `*` in the\n * first class catches a partly masked key: OpenAI echoes the rejected key as\n * `sk-abc1*****wxyz`, which is still more of it than a docs panel should show.\n */\nconst SECRET_PATTERNS: readonly RegExp[] = [\n /sk-[A-Za-z0-9_*-]{6,}/g,\n /\\bBearer\\s+[A-Za-z0-9._-]{8,}/gi,\n];\n\n/**\n * Mask anything that looks like a credential.\n *\n * @param text - untrusted text on its way to a browser or a log\n * @returns the text with credential-shaped substrings replaced\n */\nexport function redactSecrets(text: string): string {\n return SECRET_PATTERNS.reduce((masked, pattern) => masked.replace(pattern, '[redacted]'), text);\n}\n\n/** Pull the human-readable message out of a provider's error JSON. */\nfunction messageFromJson(payload: unknown): string | undefined {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n const record = payload as Record<string, unknown>;\n const error: unknown = record['error'];\n if (typeof error === 'string' && error.trim() !== '') {\n return error;\n }\n if (typeof error === 'object' && error !== null) {\n const errorRecord = error as Record<string, unknown>;\n for (const key of ['message', 'type', 'code']) {\n const value: unknown = errorRecord[key];\n if (typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n }\n const message: unknown = record['message'];\n return typeof message === 'string' && message.trim() !== '' ? message : undefined;\n}\n\nfunction shorten(text: string): string {\n return text.length > MAX_MESSAGE_CHARS ? `${text.slice(0, MAX_MESSAGE_CHARS - 1)}…` : text;\n}\n\n/**\n * Read a non-OK provider response and reduce it to one line.\n *\n * @param response - the refused response\n * @param providerLabel - display name, e.g. `Anthropic`\n * @returns a single-line message, redacted and length-capped\n */\nexport async function readProviderError(\n response: Response,\n providerLabel: string,\n): Promise<string> {\n const statusLine = `${providerLabel} refused the request: ${String(response.status)} ${\n response.statusText === '' ? 'error' : response.statusText\n }.`;\n\n let raw: string;\n try {\n raw = (await response.text()).trim();\n } catch {\n return statusLine;\n }\n\n if (raw === '' || raw.startsWith('<') || raw.length > 4000) {\n return statusLine;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n parsed = undefined;\n }\n\n const message = messageFromJson(parsed);\n if (message === undefined) {\n return raw.length > MAX_MESSAGE_CHARS\n ? statusLine\n : `${providerLabel} refused the request: ${redactSecrets(shorten(raw.replace(/\\s+/g, ' ')))}`;\n }\n\n return `${providerLabel} refused the request: ${redactSecrets(shorten(message.replace(/\\s+/g, ' ')))}`;\n}\n","/**\n * An incremental Server-Sent Events reader.\n *\n * Both providers stream `text/event-stream`, and neither guarantees that a\n * network chunk ends on an event boundary: a chunk can split a line in half,\n * split a `\\r\\n` pair, or carry six events at once. This reader owns that\n * problem so the provider adapters can think in whole frames.\n *\n * It follows the SSE line rules — `\\r\\n`, `\\n`, or a lone `\\r` ends a line, a\n * blank line dispatches, a leading `:` is a comment, one leading space after\n * the field colon is dropped, and repeated `data:` lines join with `\\n`. It is\n * deliberately lenient in one place: a frame still buffered when the body ends\n * is dispatched rather than discarded, so a stream whose final blank line is\n * lost in transit still delivers its last event.\n *\n * @packageDocumentation\n */\n\n/**\n * One dispatched SSE frame. `event` is `undefined` when the stream omitted the\n * field (the SSE default of `message`); `data` is the joined data lines with no\n * trailing newline.\n */\nexport interface SseFrame {\n readonly event: string | undefined;\n readonly data: string;\n}\n\n/** Split off the first complete line, or `null` when none is complete yet. */\nfunction takeLine(buffer: string): { line: string; rest: string } | null {\n const match = /\\r\\n|\\n|\\r/.exec(buffer);\n if (match === null) {\n return null;\n }\n // A trailing lone `\\r` may be the first half of a `\\r\\n` still in flight.\n if (match[0] === '\\r' && match.index + 1 === buffer.length) {\n return null;\n }\n return {\n line: buffer.slice(0, match.index),\n rest: buffer.slice(match.index + match[0].length),\n };\n}\n\n/** Accumulates the fields of one frame until a blank line dispatches it. */\nclass FrameBuilder {\n private event: string | undefined;\n private data: string[] = [];\n\n /** Apply one non-blank line. */\n add(line: string): void {\n if (line.startsWith(':')) {\n return; // Comment / keep-alive.\n }\n const colon = line.indexOf(':');\n const field = colon === -1 ? line : line.slice(0, colon);\n const rawValue = colon === -1 ? '' : line.slice(colon + 1);\n const value = rawValue.startsWith(' ') ? rawValue.slice(1) : rawValue;\n\n if (field === 'event') {\n this.event = value;\n } else if (field === 'data') {\n this.data.push(value);\n }\n // `id` and `retry` carry no meaning for a one-shot completion stream.\n }\n\n /** Take the pending frame, or `null` when nothing has accumulated. */\n take(): SseFrame | null {\n if (this.event === undefined && this.data.length === 0) {\n return null;\n }\n const frame: SseFrame = { event: this.event, data: this.data.join('\\n') };\n this.event = undefined;\n this.data = [];\n return frame;\n }\n}\n\n/**\n * Read a `text/event-stream` body as a sequence of frames.\n *\n * @param body - the response body; `null` yields nothing\n * @returns an async generator of dispatched frames, in order\n */\nexport async function* readSseFrames(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<SseFrame> {\n if (body === null) {\n return;\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const builder = new FrameBuilder();\n let buffer = '';\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n\n for (;;) {\n const taken = takeLine(buffer);\n if (taken === null) {\n break;\n }\n buffer = taken.rest;\n if (taken.line === '') {\n const frame = builder.take();\n if (frame !== null) {\n yield frame;\n }\n } else {\n builder.add(taken.line);\n }\n }\n }\n\n buffer += decoder.decode();\n if (buffer !== '') {\n builder.add(buffer);\n }\n const last = builder.take();\n if (last !== null) {\n yield last;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse a frame's `data` payload as JSON.\n *\n * A provider mixes in frames this adapter does not model (`ping`, per-token\n * bookkeeping), and a truncated final frame is possible. Neither is worth\n * failing a stream over, so an unparsable payload becomes `undefined` and the\n * caller skips the frame.\n *\n * @param data - the raw `data` payload\n * @returns the parsed value, or `undefined` when it is not JSON\n */\nexport function parseFrameData(data: string): unknown {\n if (data === '') {\n return undefined;\n }\n try {\n return JSON.parse(data) as unknown;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Decide what kind of frame this is.\n *\n * Both providers name the event twice — in the SSE `event:` field and in the\n * payload's `type` — so the payload serves as the fallback for a producer or\n * proxy that drops the `event:` line.\n *\n * @param frame - the dispatched frame\n * @param payload - the frame's parsed data, from {@link parseFrameData}\n * @returns the event name, or `undefined` when neither source names one\n */\nexport function frameEventType(frame: SseFrame, payload: unknown): string | undefined {\n if (frame.event !== undefined && frame.event !== '') {\n return frame.event;\n }\n if (typeof payload === 'object' && payload !== null) {\n const type: unknown = (payload as Record<string, unknown>)['type'];\n if (typeof type === 'string' && type !== '') {\n return type;\n }\n }\n return undefined;\n}\n","/**\n * The Anthropic provider adapter.\n *\n * Hand-rolled against the Messages API — `POST /v1/messages` with\n * `anthropic-version: 2023-06-01` — over `fetch`, `ReadableStream`, and\n * `TextDecoder` only. No SDK, so the package keeps zero runtime dependencies\n * and the adapter runs unchanged on Node and on an edge runtime.\n *\n * Stream shape, verified against the live API: `content_block_delta` frames\n * carry `delta.text` for `delta.type === 'text_delta'`, `message_stop` ends the\n * stream, an `error` event carries `error.message`, and `ping` frames are\n * filler. Anything else is bookkeeping and ignored.\n *\n * @packageDocumentation\n */\n\nimport type { FetchLike } from '../../proxy.js';\n\nimport { readProviderError } from './error.js';\nimport { frameEventType, parseFrameData, readSseFrames } from './sse.js';\nimport type { AiProvider, AiProviderOptions, AiProviderRequest, AiStreamEvent } from './types.js';\n\nconst MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\nconst API_VERSION = '2023-06-01';\nconst PROVIDER_LABEL = 'Anthropic';\n\n/**\n * Options for {@link createAnthropicProvider}.\n */\nexport type CreateAnthropicProviderOptions = AiProviderOptions;\n\nfunction requestBody(request: AiProviderRequest, model: string): string {\n return JSON.stringify({\n model,\n max_tokens: request.maxOutputTokens,\n system: request.system,\n messages: request.messages.map((message) => ({\n role: message.role,\n content: message.content,\n })),\n stream: true,\n });\n}\n\n/** Extract the text of a `content_block_delta` frame, if it carries any. */\nfunction textDelta(payload: unknown): string | undefined {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n const delta: unknown = (payload as Record<string, unknown>)['delta'];\n if (typeof delta !== 'object' || delta === null) {\n return undefined;\n }\n const record = delta as Record<string, unknown>;\n if (record['type'] !== 'text_delta') {\n return undefined;\n }\n const text: unknown = record['text'];\n return typeof text === 'string' ? text : undefined;\n}\n\n/** Extract the message of an `error` frame. */\nfunction errorMessage(payload: unknown): string {\n if (typeof payload === 'object' && payload !== null) {\n const error: unknown = (payload as Record<string, unknown>)['error'];\n if (typeof error === 'object' && error !== null) {\n const message: unknown = (error as Record<string, unknown>)['message'];\n if (typeof message === 'string' && message.trim() !== '') {\n return message;\n }\n }\n }\n return 'The Anthropic stream failed.';\n}\n\n/**\n * Build an Anthropic-backed {@link AiProvider}.\n *\n * The API key is a value, resolved from the environment by the server — this\n * module never reads an environment variable and never logs the key.\n *\n * @param options - the API key, an allow-listed model, and an optional fetch\n * @returns a provider that streams unified events\n */\nexport function createAnthropicProvider(options: CreateAnthropicProviderOptions): AiProvider {\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n\n return {\n async *stream(request: AiProviderRequest): AsyncGenerator<AiStreamEvent> {\n let response: Response;\n try {\n response = await doFetch(MESSAGES_URL, {\n method: 'POST',\n headers: {\n 'x-api-key': options.apiKey,\n 'anthropic-version': API_VERSION,\n 'content-type': 'application/json',\n },\n body: requestBody(request, options.model),\n ...(request.signal ? { signal: request.signal } : {}),\n });\n } catch {\n yield { type: 'error', message: `Could not reach ${PROVIDER_LABEL}.` };\n return;\n }\n\n if (!response.ok) {\n yield { type: 'error', message: await readProviderError(response, PROVIDER_LABEL) };\n return;\n }\n\n for await (const frame of readSseFrames(response.body)) {\n const payload = parseFrameData(frame.data);\n const type = frameEventType(frame, payload);\n\n if (type === 'error') {\n yield { type: 'error', message: errorMessage(payload) };\n return;\n }\n if (type === 'message_stop') {\n yield { type: 'done' };\n return;\n }\n if (type === 'content_block_delta') {\n const text = textDelta(payload);\n if (text !== undefined && text !== '') {\n yield { type: 'text', text };\n }\n }\n }\n\n // The body ended without `message_stop`. The answer so far stands, so\n // close cleanly rather than reporting a failure the reader cannot act on.\n yield { type: 'done' };\n },\n };\n}\n","/**\n * The OpenAI provider adapter.\n *\n * Hand-rolled against the Responses API — `POST /v1/responses` with a bearer\n * key — over `fetch`, `ReadableStream`, and `TextDecoder` only. Same contract\n * as the Anthropic adapter, so the route cannot tell them apart.\n *\n * Stream shape, verified against the live API: `response.output_text.delta`\n * frames carry `delta` as a plain string, `response.completed` ends a finished\n * answer, and `response.incomplete` ends a truncated one — a reasoning model\n * such as `gpt-5-mini` spends part of its output budget on reasoning, so a\n * small budget can end the stream with no text at all. Both are reported as\n * `done`: whatever streamed is a real answer, and there is nothing the reader\n * can act on. `response.failed` and a bare `error` frame become `error`.\n *\n * @packageDocumentation\n */\n\nimport type { FetchLike } from '../../proxy.js';\n\nimport { readProviderError } from './error.js';\nimport { frameEventType, parseFrameData, readSseFrames } from './sse.js';\nimport type { AiProvider, AiProviderOptions, AiProviderRequest, AiStreamEvent } from './types.js';\n\nconst RESPONSES_URL = 'https://api.openai.com/v1/responses';\nconst PROVIDER_LABEL = 'OpenAI';\n\n/**\n * Options for {@link createOpenAiProvider}.\n */\nexport type CreateOpenAiProviderOptions = AiProviderOptions;\n\nfunction requestBody(request: AiProviderRequest, model: string): string {\n return JSON.stringify({\n model,\n instructions: request.system,\n input: request.messages.map((message) => ({\n role: message.role,\n content: message.content,\n })),\n stream: true,\n max_output_tokens: request.maxOutputTokens,\n });\n}\n\n/** Extract the text of a `response.output_text.delta` frame. */\nfunction textDelta(payload: unknown): string | undefined {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n const delta: unknown = (payload as Record<string, unknown>)['delta'];\n return typeof delta === 'string' ? delta : undefined;\n}\n\n/**\n * Extract the message of a failure frame. The Responses API puts it on\n * `response.error.message` for `response.failed`, and at the top level for a\n * bare `error` frame.\n */\nfunction errorMessage(payload: unknown): string {\n if (typeof payload === 'object' && payload !== null) {\n const record = payload as Record<string, unknown>;\n\n const response: unknown = record['response'];\n if (typeof response === 'object' && response !== null) {\n const error: unknown = (response as Record<string, unknown>)['error'];\n if (typeof error === 'object' && error !== null) {\n const message: unknown = (error as Record<string, unknown>)['message'];\n if (typeof message === 'string' && message.trim() !== '') {\n return message;\n }\n }\n }\n\n for (const key of ['message', 'code']) {\n const value: unknown = record[key];\n if (typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n }\n return 'The OpenAI stream failed.';\n}\n\n/**\n * Build an OpenAI-backed {@link AiProvider}.\n *\n * The API key is a value, resolved from the environment by the server — this\n * module never reads an environment variable and never logs the key.\n *\n * @param options - the API key, an allow-listed model, and an optional fetch\n * @returns a provider that streams unified events\n */\nexport function createOpenAiProvider(options: CreateOpenAiProviderOptions): AiProvider {\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n\n return {\n async *stream(request: AiProviderRequest): AsyncGenerator<AiStreamEvent> {\n let response: Response;\n try {\n response = await doFetch(RESPONSES_URL, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n 'content-type': 'application/json',\n },\n body: requestBody(request, options.model),\n ...(request.signal ? { signal: request.signal } : {}),\n });\n } catch {\n yield { type: 'error', message: `Could not reach ${PROVIDER_LABEL}.` };\n return;\n }\n\n if (!response.ok) {\n yield { type: 'error', message: await readProviderError(response, PROVIDER_LABEL) };\n return;\n }\n\n for await (const frame of readSseFrames(response.body)) {\n const payload = parseFrameData(frame.data);\n const type = frameEventType(frame, payload);\n\n if (type === 'error' || type === 'response.failed') {\n yield { type: 'error', message: errorMessage(payload) };\n return;\n }\n if (type === 'response.completed' || type === 'response.incomplete') {\n yield { type: 'done' };\n return;\n }\n if (type === 'response.output_text.delta') {\n const text = textDelta(payload);\n if (text !== undefined && text !== '') {\n yield { type: 'text', text };\n }\n }\n }\n\n // The body ended without a terminal frame; close cleanly.\n yield { type: 'done' };\n },\n };\n}\n","/**\n * Retrieval: which pages the model is allowed to read.\n *\n * An answer is only as trustworthy as its context, so context is chosen by the\n * framework and never by the model. This module reuses the site's existing\n * weighted search index — the same scoring the search box uses — takes the best\n * pages, loads their Markdown, and enforces a character budget so a long page\n * cannot crowd out the rest or blow the model's context window.\n *\n * The pages it returns are also the citations the route sends to the browser.\n * They are facts about the site, not model output, so a source chip can never\n * point at a page that does not exist.\n *\n * @packageDocumentation\n */\n\nimport { type SearchDocument, type SearchIndex, searchIndex } from '../search.js';\n\n/** Most characters of Markdown taken from any single page. */\nconst PAGE_CHAR_BUDGET = 8000;\n/** Below this, a page's remaining slice is too small to be worth including. */\nconst MIN_USEFUL_CHARS = 400;\n\nconst TRUNCATION_MARKER = '\\n\\n[content truncated]';\n\n/**\n * One page of retrieved context, and one citation.\n */\nexport interface ContextPage {\n /** The page's site-relative URL, from the search index. */\n readonly url: string;\n readonly title: string;\n /** The page's Markdown, truncated to the per-page budget. */\n readonly markdown: string;\n}\n\n/**\n * Options for {@link selectContext}.\n */\nexport interface SelectContextOptions {\n /** The site's search index, built with `buildSearchIndex`. */\n readonly index: SearchIndex;\n /** The documents the index was built from, used as a Markdown fallback. */\n readonly documents: readonly SearchDocument[];\n /** The reader's question. */\n readonly query: string;\n /** Most pages to return. */\n readonly maxPages: number;\n /** Loads a page's Markdown by URL. Returns `null` when there is none. */\n readonly loadMarkdown: (url: string) => Promise<string | null>;\n}\n\n/** How many earlier user turns join the newest one in the retrieval query. */\nconst PRIOR_TURNS_IN_QUERY = 2;\n/** Most characters an earlier turn may add, so it cannot drown the newest. */\nconst PRIOR_TURN_CHAR_CAP = 300;\n\n/**\n * Build the retrieval query from a conversation. A follow-up like \"and how do\n * I fund it?\" carries none of its own topic — the topic lives in the earlier\n * turns. The newest user message is taken in full and the previous user turns\n * (capped, oldest first) are prepended, so retrieval sees the thread's\n * subject, not just its last sentence.\n */\nexport function buildRetrievalQuery(\n messages: readonly { readonly role: string; readonly content: string }[],\n): string {\n const userTurns = messages.filter((message) => message.role === 'user');\n const newest = userTurns.at(-1)?.content ?? '';\n const prior = userTurns\n .slice(0, -1)\n .slice(-PRIOR_TURNS_IN_QUERY)\n .map((turn) => turn.content.slice(0, PRIOR_TURN_CHAR_CAP));\n return [...prior, newest].join('\\n').trim();\n}\n\n/**\n * Cut text to `budget` characters, preferring a line boundary.\n *\n * A mid-sentence cut reads as corrupt to a model, and a mid-fence cut can make\n * the rest of the page look like code. Falling back to a hard cut keeps the\n * budget absolute: the marker is counted inside it, so the result never exceeds\n * `budget`.\n */\nfunction truncate(text: string, budget: number): string {\n if (text.length <= budget) {\n return text;\n }\n const room = budget - TRUNCATION_MARKER.length;\n const slice = text.slice(0, room);\n const lastBreak = slice.lastIndexOf('\\n');\n const cut = lastBreak >= Math.floor(room / 2) ? slice.slice(0, lastBreak) : slice;\n return `${cut}${TRUNCATION_MARKER}`;\n}\n\n/**\n * Choose the pages that ground one answer.\n *\n * Pages come back best-first, de-duplicated by URL, each within the per-page\n * budget and the whole set within the total budget. A question that matches\n * nothing returns an empty array — the caller must then tell the model it has\n * no documentation to answer from.\n *\n * @param options - the index, the documents, the question, and the loader\n * @returns the retrieved pages, best first\n */\nexport async function selectContext(options: SelectContextOptions): Promise<ContextPage[]> {\n const hits = searchIndex(options.index, options.query, options.maxPages);\n if (hits.length === 0) {\n return [];\n }\n\n const bodyByPath = new Map<string, string>();\n for (const document of options.documents) {\n if (document.body !== undefined && document.body !== '') {\n bodyByPath.set(document.path, document.body);\n }\n }\n\n const pages: ContextPage[] = [];\n const seen = new Set<string>();\n let used = 0;\n // The total budget is derived, not fixed: every retrieved page must fit at\n // full size, whatever maxPages the site configured. A fixed total below\n // maxPages × PAGE_CHAR_BUDGET would silently drop retrieved pages.\n const totalBudget = options.maxPages * PAGE_CHAR_BUDGET;\n\n for (const hit of hits) {\n if (seen.has(hit.path)) {\n continue;\n }\n seen.add(hit.path);\n\n const remaining = totalBudget - used;\n if (remaining < MIN_USEFUL_CHARS) {\n break;\n }\n\n // A page with no Markdown on disk still has its indexed body text.\n const loaded = await options.loadMarkdown(hit.path);\n const source = loaded !== null && loaded.trim() !== '' ? loaded : bodyByPath.get(hit.path);\n if (source === undefined || source.trim() === '') {\n continue;\n }\n\n const markdown = truncate(source.trim(), Math.min(PAGE_CHAR_BUDGET, remaining));\n used += markdown.length;\n pages.push({ url: hit.path, title: hit.title, markdown });\n }\n\n return pages;\n}\n","/**\n * The Ask AI route.\n *\n * One handler, framework-agnostic, built on the Web `Request`/`Response` types\n * so it drops into a Next.js route file, an edge function, or any Fetch-based\n * runtime. It runs the whole question pipeline: validate the body, rate-limit\n * the caller, retrieve the grounding pages, build the prompt, stream the\n * provider, and re-emit a provider-agnostic SSE stream to the browser.\n *\n * Two deliberate choices:\n *\n * - **Configuration is resolved eagerly.** {@link createAskAiRoute} validates\n * the `ai` block when the route is built, so a typo in `docs.config.ts` fails\n * the build. Deferring it to the first request would turn a site's typo into a\n * reader's error message. A site with no `ai` block at all is different from\n * a typo: the route mounts dormant and answers `404`, so a scaffold ships the\n * file and enabling Ask AI is a config change, not a code change.\n * - **The API key is read lazily, per request.** An edge runtime binds its\n * environment per invocation, not at module load, so the key is looked up when\n * it is needed. It is never logged; a missing key is reported by env var name.\n *\n * The browser protocol is three event names — `sources`, `text`, `done` — with\n * `error` replacing the tail of the stream on failure. See\n * {@link createAskAiRoute} for the exact payloads.\n *\n * @packageDocumentation\n */\n\nimport type { FetchLike } from '../proxy.js';\nimport { RATE_LIMIT_WINDOW_MS, clientRateLimitKey, createRateLimiter } from '../rate-limit.js';\nimport { type SearchDocument, type SearchIndex, buildSearchIndex } from '../search.js';\n\nimport { type AiConfig, AiConfigError, type ResolvedAiConfig, resolveAiConfig } from './config.js';\nimport { buildSystemPrompt } from './prompt.js';\nimport { createAnthropicProvider } from './providers/anthropic.js';\nimport { createOpenAiProvider } from './providers/openai.js';\nimport type { AiMessage, AiProvider } from './providers/types.js';\nimport { type ContextPage, buildRetrievalQuery, selectContext } from './retrieval.js';\n\n/** Upper bound on one answer. Generous: a reasoning model spends part of it thinking. */\nconst DEFAULT_MAX_OUTPUT_TOKENS = 2048;\n\nconst MAX_MESSAGES = 20;\nconst MAX_CONTENT_CHARS = 4000;\n\n/**\n * Where the route gets the site's pages: the array itself, or a loader for a\n * site that builds it at runtime. Either way it is read once and treated as\n * immutable build-time content.\n *\n * @public\n */\nexport type AskAiDocumentsSource =\n readonly SearchDocument[] | (() => Promise<readonly SearchDocument[]>);\n\n/**\n * Options for {@link createAskAiRoute}.\n *\n * @public\n */\nexport interface AskAiRouteOptions {\n /**\n * The site's raw `ai` block. Validated when the route is built. `undefined`\n * (the config declares no `ai` block) mounts the route dormant: every\n * request answers `404`.\n */\n readonly config: AiConfig | undefined;\n /** Display name used in the system prompt, normally `theme.name`. */\n readonly siteName: string;\n /**\n * The API key value. Supply it only when the server resolves the key itself;\n * otherwise leave it out and the route reads `ai.apiKeyEnv` per request.\n */\n readonly apiKey?: string;\n /** Reads an environment variable. Defaults to `process.env`, looked up per request. */\n readonly env?: (name: string) => string | undefined;\n /** The site's pages, for retrieval. */\n readonly documents: AskAiDocumentsSource;\n /** Loads a page's Markdown by its URL. Returns `null` when there is none. */\n readonly loadPageMarkdown: (url: string) => Promise<string | null>;\n /** Fetch implementation passed to the provider. Defaults to the global `fetch`. */\n readonly fetch?: FetchLike;\n /** Clock for the rate limiter, for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n /** Upper bound on one answer, in tokens. Default 2048. */\n readonly maxOutputTokens?: number;\n}\n\n/**\n * A citation sent to the browser before the answer streams.\n *\n * @public\n */\nexport interface AskAiSource {\n readonly url: string;\n readonly title: string;\n}\n\n/**\n * The Ask AI route's handlers, ready to re-export from a framework route file.\n *\n * @public\n */\nexport interface AskAiRoute {\n readonly POST: (request: Request) => Promise<Response>;\n}\n\n/** Read `process.env` without importing a Node module, so edge builds work. */\nfunction readProcessEnv(name: string): string | undefined {\n const runtime = globalThis as { process?: { env?: Record<string, string | undefined> } };\n return runtime.process?.env?.[name];\n}\n\nfunction jsonResponse(\n status: number,\n payload: unknown,\n headers: Record<string, string> = {},\n): Response {\n return new Response(JSON.stringify(payload), {\n status,\n headers: { 'content-type': 'application/json', 'cache-control': 'no-store', ...headers },\n });\n}\n\n/**\n * Validate the request body. Returns the messages, or the exact reason it is\n * unacceptable — the caller turns that into a `400`.\n */\nfunction parseMessages(value: unknown): { messages: AiMessage[] } | { error: string } {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return { error: 'Request body must be a JSON object.' };\n }\n const raw: unknown = (value as Record<string, unknown>)['messages'];\n if (!Array.isArray(raw)) {\n return { error: 'Request body must include a \"messages\" array.' };\n }\n if (raw.length === 0) {\n return { error: 'messages must contain at least one message.' };\n }\n if (raw.length > MAX_MESSAGES) {\n return {\n error: `messages must contain ${String(MAX_MESSAGES)} messages or fewer, got ${String(raw.length)}.`,\n };\n }\n\n const messages: AiMessage[] = [];\n for (const [position, entry] of (raw as unknown[]).entries()) {\n const at = `messages[${String(position)}]`;\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {\n return { error: `${at} must be an object with \"role\" and \"content\".` };\n }\n const record = entry as Record<string, unknown>;\n const role: unknown = record['role'];\n if (role !== 'user' && role !== 'assistant') {\n return { error: `${at}.role must be 'user' or 'assistant'.` };\n }\n const content: unknown = record['content'];\n if (typeof content !== 'string') {\n return { error: `${at}.content must be a string.` };\n }\n if (content.trim() === '') {\n return { error: `${at}.content must not be empty.` };\n }\n if (content.length > MAX_CONTENT_CHARS) {\n return {\n error: `${at}.content must be ${String(MAX_CONTENT_CHARS)} characters or fewer, got ${String(content.length)}.`,\n };\n }\n messages.push({ role, content });\n }\n\n if (messages.at(-1)?.role !== 'user') {\n return { error: `The last message must have role 'user'.` };\n }\n\n return { messages };\n}\n\nfunction createProvider(\n resolved: ResolvedAiConfig,\n apiKey: string,\n doFetch: FetchLike | undefined,\n): AiProvider {\n const providerOptions = {\n apiKey,\n model: resolved.model,\n ...(doFetch ? { fetch: doFetch } : {}),\n };\n return resolved.provider === 'anthropic'\n ? createAnthropicProvider(providerOptions)\n : createOpenAiProvider(providerOptions);\n}\n\n/**\n * Build the Ask AI route.\n *\n * The route answers `POST` with `{ \"messages\": [{ \"role\": \"user\", \"content\": \"…\" }] }`\n * and streams `text/event-stream`:\n *\n * | Event | Payload | When |\n * | --------- | -------------------------- | ------------------------------------- |\n * | `sources` | `[{ url, title }]` | Once, first — the retrieved pages. |\n * | `text` | `{ text }` | Per delta, appended in order. |\n * | `done` | `{}` | Last event of a successful answer. |\n * | `error` | `{ message }` | Replaces the tail; one readable line. |\n *\n * Failures before the stream starts are plain JSON, not SSE: `400` for a bad\n * body (the message names the offending field), `429` with `Retry-After` when\n * the caller is over the limit, and `500` when the API key is not set on the\n * server.\n *\n * @example\n * ```ts\n * // app/api/ask-ai/route.ts\n * export const { POST } = createAskAiRoute({\n * config: docsConfig.ai!,\n * siteName: docsConfig.theme.name,\n * documents: searchDocuments,\n * loadPageMarkdown: readPageMarkdown,\n * });\n * ```\n *\n * @param options - the site's `ai` block, its pages, and the Markdown loader\n * @returns the route's `POST` handler\n * @throws {@link AiConfigError} when the `ai` block or the wiring is invalid\n * @public\n */\nexport function createAskAiRoute(options: AskAiRouteOptions): AskAiRoute {\n // No `ai` block is a declared state, not a typo: the route mounts dormant,\n // so a scaffold ships this file and enabling Ask AI is one config change.\n if (options.config === undefined) {\n return {\n POST: () =>\n Promise.resolve(\n jsonResponse(404, {\n error: 'Ask AI is not enabled: docs.config.ts declares no ai block.',\n }),\n ),\n };\n }\n\n // Eager, so a misconfigured site fails at build time rather than at a reader.\n const resolved = resolveAiConfig(options.config);\n\n if (typeof options.siteName !== 'string' || options.siteName.trim() === '') {\n throw new AiConfigError('siteName must be a non-empty string, e.g. theme.name.');\n }\n if (typeof options.loadPageMarkdown !== 'function') {\n throw new AiConfigError(\n \"loadPageMarkdown must be a function that returns a page's Markdown, or null.\",\n );\n }\n const documentsSource = options.documents;\n if (!Array.isArray(documentsSource) && typeof documentsSource !== 'function') {\n throw new AiConfigError(\n 'documents must be an array of SearchDocument, or a function returning one.',\n );\n }\n\n const readEnv = options.env ?? readProcessEnv;\n const maxOutputTokens = options.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS;\n const limiter = createRateLimiter({\n limit: resolved.rateLimitPerMinute,\n windowMs: RATE_LIMIT_WINDOW_MS,\n ...(options.now ? { now: options.now } : {}),\n });\n\n // The corpus is build-time content, so load and index it once. A failed load\n // is not cached, so a transient failure does not disable Ask AI for good.\n let corpus: Promise<{ documents: readonly SearchDocument[]; index: SearchIndex }> | undefined;\n function loadCorpus(): Promise<{ documents: readonly SearchDocument[]; index: SearchIndex }> {\n if (corpus === undefined) {\n const pending = (async () => {\n const documents =\n typeof documentsSource === 'function' ? await documentsSource() : documentsSource;\n return { documents, index: buildSearchIndex(documents) };\n })();\n void pending.catch(() => {\n if (corpus === pending) {\n corpus = undefined;\n }\n });\n corpus = pending;\n }\n return corpus;\n }\n\n const encoder = new TextEncoder();\n\n function streamAnswer(\n provider: AiProvider,\n system: string,\n messages: readonly AiMessage[],\n sources: readonly AskAiSource[],\n upstream: AbortController,\n ): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n let open = true;\n const send = (event: string, data: unknown): void => {\n if (!open) {\n return;\n }\n try {\n controller.enqueue(\n encoder.encode(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch {\n // The reader is gone; stop writing.\n open = false;\n }\n };\n\n send('sources', sources);\n\n let closed = false;\n try {\n for await (const event of provider.stream({\n system,\n messages,\n maxOutputTokens,\n signal: upstream.signal,\n })) {\n if (event.type === 'text') {\n send('text', { text: event.text });\n continue;\n }\n if (event.type === 'error') {\n send('error', { message: event.message });\n } else {\n send('done', {});\n }\n closed = true;\n break;\n }\n if (!closed) {\n send('done', {});\n }\n } catch {\n // The provider generator threw — a dropped socket, or an abort.\n send('error', { message: 'The answer stream stopped unexpectedly.' });\n }\n\n open = false;\n try {\n controller.close();\n } catch {\n // Already closed by a cancelling reader.\n }\n },\n cancel() {\n upstream.abort();\n },\n });\n }\n\n return {\n async POST(request: Request): Promise<Response> {\n let body: unknown;\n try {\n body = await request.json();\n } catch {\n return jsonResponse(400, { error: 'Request body must be JSON.' });\n }\n\n const parsed = parseMessages(body);\n if ('error' in parsed) {\n return jsonResponse(400, { error: parsed.error });\n }\n\n const decision = limiter.allow(clientRateLimitKey(request));\n if (!decision.allowed) {\n const retryAfter = decision.retryAfterSeconds ?? 60;\n return jsonResponse(\n 429,\n {\n error: `Too many questions. Try again in ${String(retryAfter)} seconds.`,\n retryAfterSeconds: retryAfter,\n },\n { 'retry-after': String(retryAfter) },\n );\n }\n\n const apiKey = (options.apiKey ?? readEnv(resolved.apiKeyEnv) ?? '').trim();\n if (apiKey === '') {\n return jsonResponse(500, {\n error: `Ask AI is not configured: set the ${resolved.apiKeyEnv} environment variable on the server.`,\n });\n }\n\n let pages: ContextPage[];\n try {\n const { documents, index } = await loadCorpus();\n pages = await selectContext({\n index,\n documents,\n query: buildRetrievalQuery(parsed.messages),\n maxPages: resolved.maxContextPages,\n loadMarkdown: options.loadPageMarkdown,\n });\n } catch {\n return jsonResponse(500, {\n error: 'Ask AI could not read the documentation for this site.',\n });\n }\n\n const system = buildSystemPrompt({\n siteName: options.siteName,\n pages,\n ...(resolved.systemPrompt === undefined\n ? {}\n : { extraInstructions: resolved.systemPrompt }),\n });\n const sources: AskAiSource[] = pages.map((page) => ({ url: page.url, title: page.title }));\n\n const upstream = new AbortController();\n const clientSignal = (request as { signal?: AbortSignal }).signal;\n if (clientSignal !== undefined) {\n if (clientSignal.aborted) {\n upstream.abort();\n } else {\n clientSignal.addEventListener(\n 'abort',\n () => {\n upstream.abort();\n },\n { once: true },\n );\n }\n }\n\n const provider = createProvider(resolved, apiKey, options.fetch);\n\n return new Response(streamAnswer(provider, system, parsed.messages, sources, upstream), {\n headers: {\n 'content-type': 'text/event-stream; charset=utf-8',\n 'cache-control': 'no-store',\n connection: 'keep-alive',\n // Tell a buffering reverse proxy to pass the stream straight through.\n 'x-accel-buffering': 'no',\n },\n });\n },\n };\n}\n","/**\n * The configuration seam.\n *\n * A consuming docs site supplies exactly one {@link DocsConfig}. It carries the\n * per-site values that must never live in the framework: branding, the auth\n * mode, and — critically — the allow-list of API origins the try-it proxy may\n * forward to. `docs-core` owns the behaviour; the site owns these values.\n *\n * The boundary is guarded: {@link defineDocsConfig} runs\n * {@link validateDocsConfig} on every value it is given, so a typo fails when\n * the site builds rather than when a reader loads a page. A site's config file\n * may be JavaScript, or built from JSON, so nothing here trusts the static\n * types — every field is checked at runtime.\n *\n * @packageDocumentation\n */\n\nimport { type AiConfig, resolveAiConfig } from './ai/config.js';\n\n/**\n * Google OAuth provider settings. Secrets never live in config: these name the\n * environment variables the framework reads at runtime.\n *\n * @public\n */\nexport interface GoogleProviderConfig {\n /** Env var holding the OAuth client id. Default `GOOGLE_CLIENT_ID`. */\n readonly clientIdEnv?: string;\n /** Env var holding the OAuth client secret. Default `GOOGLE_CLIENT_SECRET`. */\n readonly clientSecretEnv?: string;\n /** OAuth callback path. Default `/api/auth/google/callback`. */\n readonly redirectPath?: string;\n}\n\n/**\n * Shared-secret provider settings. The secret is one value for the whole site,\n * read from the environment at runtime — config only names the variable.\n *\n * @public\n */\nexport interface SecretProviderConfig {\n /** Env var holding the shared access secret. Default `DOCS_ACCESS_SECRET`. */\n readonly secretEnv?: string;\n}\n\n/**\n * The sign-in providers a workspace site offers. Enable any combination.\n *\n * @public\n */\nexport interface WorkspaceProviders {\n /** Email sign-in: a verified email in an allowed domain gets a session. */\n readonly email?: boolean;\n /**\n * Shared-secret sign-in: an allowed-domain email plus one site-wide secret.\n * Stronger than email alone, so when enabled it supersedes the email provider\n * (offering email-only too would let a reader skip the secret).\n */\n readonly secret?: SecretProviderConfig;\n /** Google OAuth sign-in, restricted to the allowed domains. */\n readonly google?: GoogleProviderConfig;\n}\n\n/**\n * Gate the docs to signed-in members of the allowed email domains.\n *\n * @public\n */\nexport interface WorkspaceAuthConfig {\n readonly mode: 'workspace';\n /** Email domains permitted to sign in, e.g. `['blaaiz.com']`. */\n readonly allowedDomains: readonly string[];\n /** Which identity providers are offered. */\n readonly providers: WorkspaceProviders;\n /** Where unauthenticated requests are redirected. Default `/signin`. */\n readonly signInPath?: string;\n /** Env var holding the session-signing secret. Default `DOCS_SESSION_SECRET`. */\n readonly sessionSecretEnv?: string;\n /** Session lifetime in seconds. Default 8 hours. */\n readonly sessionTtlSeconds?: number;\n /** Set the `Secure` cookie flag. Default `true`; set `false` for local http. */\n readonly secureCookies?: boolean;\n}\n\n/**\n * How a docs site gates access.\n *\n * - `'public'` — anyone may read the docs and use the playground.\n * - {@link WorkspaceAuthConfig} — only signed-in members of the allowed domains.\n *\n * @public\n */\nexport type AuthConfig = 'public' | WorkspaceAuthConfig;\n\n/**\n * A colour palette a site declares. Every token is optional; the framework\n * falls back to its defaults for anything omitted. The site owns the values;\n * the framework maps them to its CSS variables (see `buildThemeCss`).\n *\n * @public\n */\nexport interface ThemePalette {\n /** Primary accent — active nav, links, buttons, focus rings. */\n readonly primary?: string;\n /** Page background. */\n readonly background?: string;\n /** Body text. */\n readonly foreground?: string;\n /** Panel/card surfaces. */\n readonly card?: string;\n /** Hairline borders and dividers. */\n readonly border?: string;\n /** Secondary/muted text. */\n readonly muted?: string;\n}\n\n/**\n * Light and dark logo image paths, resolved by the consuming site.\n *\n * @public\n */\nexport interface ThemeLogo {\n readonly light: string;\n readonly dark: string;\n}\n\n/**\n * Brand configuration a site supplies. Colours and the logo live here — in the\n * site — not in the framework.\n *\n * @public\n */\nexport interface ThemeConfig {\n /** Display name. */\n readonly name: string;\n /** Light + dark logo paths (served by the site). */\n readonly logo?: ThemeLogo;\n /** Absolute or site-relative path to the favicon. */\n readonly favicon?: string;\n /** Palette applied to the light theme (and as the base for dark). */\n readonly colors?: ThemePalette;\n /** Palette overrides applied to the dark theme. */\n readonly darkColors?: ThemePalette;\n}\n\n/**\n * Security-critical: the exhaustive set of upstream API origins the try-it\n * proxy is permitted to forward requests to. Any target outside this list is\n * rejected with `403`. This is what keeps the proxy from becoming an open\n * relay — see {@link https://github.com/blaaiz/docs-core | the proxy design}.\n *\n * @public\n */\nexport interface ProxyConfig {\n /** Allowed upstream origins, e.g. `[\"https://api-dev.example.com\"]`. */\n readonly allowedOrigins: readonly string[];\n /**\n * Forwards per minute per client IP. Default 60. Enforced by both\n * `createTryItProxy` and `createTryItProxyRoute`; pass the value through when\n * you mount the route.\n */\n readonly rateLimitPerMinute?: number;\n}\n\n/**\n * Search-engine and social-sharing metadata a site supplies. Everything is\n * optional; the framework fills sensible defaults from {@link ThemeConfig.name}.\n * The site owns these values — the canonical origin, the sharing image — because\n * they are deployment facts, not framework behaviour.\n *\n * @public\n */\nexport interface SeoConfig {\n /**\n * The canonical public origin, e.g. `https://docs.example.com`. Enables\n * absolute canonical URLs, the sitemap, and Open Graph URLs. Without it those\n * fall back to relative URLs, which is correct but weaker for SEO.\n */\n readonly siteUrl?: string;\n /**\n * Title template for inner pages, with `%s` standing in for the page title,\n * e.g. `'%s | Example Docs'`. Default `'%s · <theme.name>'`. The home title is\n * {@link ThemeConfig.name} verbatim.\n */\n readonly titleTemplate?: string;\n /** Default meta description, used where a page declares none. */\n readonly description?: string;\n /** Site-relative or absolute path to the default Open Graph / Twitter image. */\n readonly ogImage?: string;\n /** `@handle` for Twitter card attribution. */\n readonly twitter?: string;\n /** Default keywords applied site-wide. Pages may add their own. */\n readonly keywords?: readonly string[];\n /**\n * Ask crawlers not to index the site (a private or pre-launch docs site).\n * Default `false`. Auth-gated sites usually want `true`.\n */\n readonly noindex?: boolean;\n}\n\n/**\n * Optional features a site opts into. Every flag defaults to `false`, so a site\n * gets a feature only by asking for it. The framework ships the behaviour; the\n * site decides whether to switch it on.\n *\n * @public\n */\nexport interface FeaturesConfig {\n /**\n * Show the \"Copy page / View as Markdown\" control on each doc page, and serve\n * the plain-Markdown route it links to. Lets a reader hand the page to an LLM.\n * Default `false`.\n */\n readonly copyPage?: boolean;\n}\n\n/**\n * The complete, validated configuration for one docs site.\n *\n * @public\n */\n/**\n * One top-bar action: a call to action rendered in the site header.\n *\n * @public\n */\nexport interface NavbarAction {\n readonly text: string;\n readonly href: string;\n}\n\n/**\n * Top-bar calls to action. The primary renders as a button in the theme's\n * primary colour; the secondary as a quiet link beside it.\n *\n * @public\n */\nexport interface NavbarConfig {\n readonly primary?: NavbarAction;\n readonly secondary?: NavbarAction;\n}\n\nexport interface DocsConfig {\n readonly theme: ThemeConfig;\n readonly auth: AuthConfig;\n readonly proxy: ProxyConfig;\n /** Top-bar calls to action (a Dashboard button, a Support link). */\n readonly navbar?: NavbarConfig;\n /** Opt-in features. Omit it entirely and every feature stays off. */\n readonly features?: FeaturesConfig;\n /** Search-engine and social-sharing metadata. Omit for name-only defaults. */\n readonly seo?: SeoConfig;\n /**\n * Ask AI settings. Omit the block and the feature stays off. Naming a\n * provider is a complete setup, because every other field has a framework\n * default. The API key never lives here — config names the environment\n * variable, and the server reads it at runtime.\n */\n readonly ai?: AiConfig;\n}\n\n/**\n * Thrown when a site's {@link DocsConfig} is malformed. The message names the\n * exact field, the value it received, and the accepted values.\n *\n * The `ai` block is the one exception: {@link validateDocsConfig} delegates it\n * to `resolveAiConfig`, which raises an `AiConfigError` instead. Both extend\n * `Error`, so a site's build fails the same way either way.\n *\n * @public\n */\nexport class DocsConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DocsConfigError';\n }\n}\n\n/** Proxy requests per minute per client IP — the accepted range. */\nconst MIN_PROXY_RATE_LIMIT = 1;\nconst MAX_PROXY_RATE_LIMIT = 6000;\n\n/** Session lifetime bounds: one minute to thirty days. */\nconst MIN_SESSION_TTL_SECONDS = 60;\nconst MAX_SESSION_TTL_SECONDS = 2_592_000;\n\nconst PALETTE_KEYS = [\n 'primary',\n 'background',\n 'foreground',\n 'card',\n 'border',\n 'muted',\n] as const satisfies readonly (keyof ThemePalette)[];\n\n/** Render an untrusted value for an error message: quoted when it is a string. */\nfunction describe(value: unknown): string {\n if (typeof value === 'string') {\n return `'${value}'`;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || value === null) {\n return String(value);\n }\n if (value === undefined) {\n return 'undefined';\n }\n return Array.isArray(value) ? 'an array' : `a ${typeof value}`;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requireObject(value: unknown, field: string, example: string): Record<string, unknown> {\n if (!isPlainObject(value)) {\n throw new DocsConfigError(`${field} must be an object, got ${describe(value)}. ${example}`);\n }\n return value;\n}\n\nfunction optionalObject(value: unknown, field: string): Record<string, unknown> | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!isPlainObject(value)) {\n throw new DocsConfigError(\n `${field} must be an object, got ${describe(value)}. Remove the field to leave it unset.`,\n );\n }\n return value;\n}\n\nfunction requireString(value: unknown, field: string, example: string): string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new DocsConfigError(\n `${field} must be a non-empty string, got ${describe(value)}. ${example}`,\n );\n }\n return value;\n}\n\nfunction optionalString(value: unknown, field: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'string' || value.trim() === '') {\n throw new DocsConfigError(\n `${field} must be a non-empty string, got ${describe(value)}. Remove the field to use the default.`,\n );\n }\n return value;\n}\n\nfunction optionalBoolean(value: unknown, field: string): void {\n if (value !== undefined && typeof value !== 'boolean') {\n throw new DocsConfigError(`${field} must be true or false, got ${describe(value)}.`);\n }\n}\n\nfunction optionalIntegerInRange(value: unknown, field: string, min: number, max: number): void {\n if (value === undefined) {\n return;\n }\n if (typeof value !== 'number' || !Number.isInteger(value) || value < min || value > max) {\n throw new DocsConfigError(\n `${field} must be an integer between ${String(min)} and ${String(max)}, got ${describe(value)}.`,\n );\n }\n}\n\n/** A site-relative path, e.g. `/signin`. */\nfunction optionalPath(value: unknown, field: string): void {\n const path = optionalString(value, field);\n if (path !== undefined && !path.startsWith('/')) {\n throw new DocsConfigError(\n `${field} must start with '/', got ${describe(path)}. Example: '/signin'.`,\n );\n }\n}\n\n/** An array of non-empty strings. `minLength` guards a list that must not be empty. */\nfunction requireStringArray(\n value: unknown,\n field: string,\n options: { readonly minLength: number; readonly example: string },\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new DocsConfigError(\n `${field} must be an array, got ${describe(value)}. ${options.example}`,\n );\n }\n if (value.length < options.minLength) {\n throw new DocsConfigError(\n `${field} must contain at least ${String(options.minLength)} entry, got an empty array. ${options.example}`,\n );\n }\n return (value as unknown[]).map((entry, index) =>\n requireString(entry, `${field}[${String(index)}]`, options.example),\n );\n}\n\nfunction validatePalette(value: unknown, field: string): void {\n const palette = optionalObject(value, field);\n if (palette === undefined) {\n return;\n }\n for (const key of PALETTE_KEYS) {\n optionalString(palette[key], `${field}.${key}`);\n }\n}\n\nfunction validateTheme(value: unknown): void {\n const theme = requireObject(value, 'theme', \"Example: theme: { name: 'Example Docs' }.\");\n requireString(theme['name'], 'theme.name', \"Example: theme: { name: 'Example Docs' }.\");\n\n const logo = optionalObject(theme['logo'], 'theme.logo');\n if (logo !== undefined) {\n requireString(logo['light'], 'theme.logo.light', \"Example: '/logo-light.png'.\");\n requireString(logo['dark'], 'theme.logo.dark', \"Example: '/logo-dark.png'.\");\n }\n\n optionalString(theme['favicon'], 'theme.favicon');\n validatePalette(theme['colors'], 'theme.colors');\n validatePalette(theme['darkColors'], 'theme.darkColors');\n}\n\nfunction validateWorkspaceProviders(value: unknown): void {\n const providers = requireObject(value, 'auth.providers', 'Example: providers: { email: true }.');\n\n optionalBoolean(providers['email'], 'auth.providers.email');\n\n const secret = optionalObject(providers['secret'], 'auth.providers.secret');\n if (secret !== undefined) {\n optionalString(secret['secretEnv'], 'auth.providers.secret.secretEnv');\n }\n\n const google = optionalObject(providers['google'], 'auth.providers.google');\n if (google !== undefined) {\n optionalString(google['clientIdEnv'], 'auth.providers.google.clientIdEnv');\n optionalString(google['clientSecretEnv'], 'auth.providers.google.clientSecretEnv');\n optionalPath(google['redirectPath'], 'auth.providers.google.redirectPath');\n }\n\n // A workspace site with no provider offers no way in. That is a misconfigured\n // site, not a locked-down one, so it fails here rather than at the sign-in page.\n if (providers['email'] !== true && secret === undefined && google === undefined) {\n throw new DocsConfigError(\n \"auth.providers must enable at least one provider: 'email', 'secret', or 'google'. \" +\n 'Example: providers: { email: true }.',\n );\n }\n}\n\nfunction validateAuth(value: unknown): void {\n if (value === 'public') {\n return;\n }\n if (!isPlainObject(value)) {\n throw new DocsConfigError(\n `auth must be 'public' or a workspace configuration object, got ${describe(value)}. ` +\n \"Example: auth: 'public'.\",\n );\n }\n\n const mode: unknown = value['mode'];\n if (mode !== 'workspace') {\n throw new DocsConfigError(`auth.mode must be 'workspace', got ${describe(mode)}.`);\n }\n\n const domains = requireStringArray(value['allowedDomains'], 'auth.allowedDomains', {\n minLength: 1,\n example: \"Example: allowedDomains: ['example.com'].\",\n });\n for (const [index, domain] of domains.entries()) {\n if (domain.includes('@') || !domain.includes('.') || /\\s/.test(domain)) {\n throw new DocsConfigError(\n `auth.allowedDomains[${String(index)}] must be a bare domain like 'example.com', got ${describe(domain)}.`,\n );\n }\n }\n\n validateWorkspaceProviders(value['providers']);\n\n optionalPath(value['signInPath'], 'auth.signInPath');\n optionalString(value['sessionSecretEnv'], 'auth.sessionSecretEnv');\n optionalIntegerInRange(\n value['sessionTtlSeconds'],\n 'auth.sessionTtlSeconds',\n MIN_SESSION_TTL_SECONDS,\n MAX_SESSION_TTL_SECONDS,\n );\n optionalBoolean(value['secureCookies'], 'auth.secureCookies');\n}\n\nfunction validateProxy(value: unknown): void {\n const proxy = requireObject(value, 'proxy', 'Example: proxy: { allowedOrigins: [] }.');\n\n // An empty list is valid: a site that publishes no API reference mounts no\n // proxy route, so it has no upstream to allow.\n const origins = requireStringArray(proxy['allowedOrigins'], 'proxy.allowedOrigins', {\n minLength: 0,\n example: \"Example: allowedOrigins: ['https://api.example.com'].\",\n });\n for (const [index, origin] of origins.entries()) {\n const field = `proxy.allowedOrigins[${String(index)}]`;\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n throw new DocsConfigError(\n `${field} must be an absolute origin like 'https://api.example.com', got ${describe(origin)}.`,\n );\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new DocsConfigError(`${field} must use http or https, got ${describe(origin)}.`);\n }\n }\n\n optionalIntegerInRange(\n proxy['rateLimitPerMinute'],\n 'proxy.rateLimitPerMinute',\n MIN_PROXY_RATE_LIMIT,\n MAX_PROXY_RATE_LIMIT,\n );\n}\n\nfunction validateFeatures(value: unknown): void {\n const features = optionalObject(value, 'features');\n if (features === undefined) {\n return;\n }\n optionalBoolean(features['copyPage'], 'features.copyPage');\n}\n\nfunction validateNavbarAction(value: unknown, field: string): void {\n const action = optionalObject(value, field);\n if (action === undefined) {\n return;\n }\n requireString(action['text'], `${field}.text`, \"Example: 'Dashboard'.\");\n requireString(action['href'], `${field}.href`, \"Example: 'https://app.example.com'.\");\n}\n\nfunction validateNavbar(value: unknown): void {\n const navbar = optionalObject(value, 'navbar');\n if (navbar === undefined) {\n return;\n }\n validateNavbarAction(navbar['primary'], 'navbar.primary');\n validateNavbarAction(navbar['secondary'], 'navbar.secondary');\n}\n\nfunction validateSeo(value: unknown): void {\n const seo = optionalObject(value, 'seo');\n if (seo === undefined) {\n return;\n }\n\n const siteUrl = optionalString(seo['siteUrl'], 'seo.siteUrl');\n if (siteUrl !== undefined) {\n let parsed: URL;\n try {\n parsed = new URL(siteUrl);\n } catch {\n throw new DocsConfigError(\n `seo.siteUrl must be an absolute URL like 'https://docs.example.com', got ${describe(siteUrl)}.`,\n );\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new DocsConfigError(`seo.siteUrl must use http or https, got ${describe(siteUrl)}.`);\n }\n }\n\n const template = optionalString(seo['titleTemplate'], 'seo.titleTemplate');\n if (template !== undefined && !template.includes('%s')) {\n throw new DocsConfigError(\n `seo.titleTemplate must contain '%s' for the page title, got ${describe(template)}. Example: '%s | Example Docs'.`,\n );\n }\n\n optionalString(seo['description'], 'seo.description');\n optionalString(seo['ogImage'], 'seo.ogImage');\n\n const twitter = optionalString(seo['twitter'], 'seo.twitter');\n if (twitter !== undefined && !twitter.startsWith('@')) {\n throw new DocsConfigError(\n `seo.twitter must start with '@', got ${describe(twitter)}. Example: '@example'.`,\n );\n }\n\n if (seo['keywords'] !== undefined) {\n requireStringArray(seo['keywords'], 'seo.keywords', {\n minLength: 0,\n example: \"Example: keywords: ['payments', 'api'].\",\n });\n }\n\n optionalBoolean(seo['noindex'], 'seo.noindex');\n}\n\n/**\n * Validate a site's configuration and return it.\n *\n * {@link defineDocsConfig} calls it, so a site rarely calls it directly. It is\n * exported for a site that loads its configuration from somewhere else — JSON,\n * a remote source, a JavaScript file with no type-checking — and needs the same\n * guarantee.\n *\n * Every field is checked at runtime, and the message names the exact field:\n * `auth.mode must be 'workspace', got 'workspase'.` The `ai` block is delegated\n * to `resolveAiConfig`, the single gate for Ask AI settings, so its messages are\n * identical to the ones the Ask AI route raises.\n *\n * @param config - the site configuration, from any source\n * @returns the same object, typed as {@link DocsConfig}\n * @throws {@link DocsConfigError} when any field outside `ai` is missing or malformed\n * @public\n */\nexport function validateDocsConfig(config: unknown): DocsConfig {\n if (!isPlainObject(config)) {\n throw new DocsConfigError(\n `The docs configuration must be an object, got ${describe(config)}. ` +\n 'Export one object from docs.config.ts.',\n );\n }\n\n validateTheme(config['theme']);\n validateAuth(config['auth']);\n validateProxy(config['proxy']);\n validateNavbar(config['navbar']);\n validateFeatures(config['features']);\n validateSeo(config['seo']);\n\n // Delegate, rather than re-check: resolveAiConfig owns the ai messages, and a\n // second opinion here would eventually contradict it.\n if (config['ai'] !== undefined) {\n resolveAiConfig(config['ai'] as AiConfig);\n }\n\n return config as unknown as DocsConfig;\n}\n\n/**\n * Identity helper that gives a site's `docs.config.ts` full type-checking and\n * editor completion without importing types by hand.\n *\n * It also validates: every field is checked at runtime by\n * {@link validateDocsConfig}, so a malformed value fails when the site builds,\n * with a message that names the field. A JavaScript config file gets the same\n * protection as a TypeScript one.\n *\n * @example\n * ```ts\n * import { defineDocsConfig } from '@blaaiz/docs-core';\n *\n * export default defineDocsConfig({\n * theme: {\n * name: 'Blaaiz',\n * logo: { light: '/logo-light.png', dark: '/logo-dark.png' },\n * colors: { primary: '#4c63f5' },\n * darkColors: { background: '#0a0a0b', card: '#141416' },\n * },\n * auth: {\n * mode: 'workspace',\n * allowedDomains: ['blaaiz.com'],\n * providers: { email: true, google: {} },\n * },\n * proxy: { allowedOrigins: ['https://api-dev.blaaiz.com'] },\n * });\n * ```\n *\n * @param config - the site configuration\n * @returns the same configuration, typed as {@link DocsConfig}\n * @throws {@link DocsConfigError} when any field outside `ai` is missing or malformed\n * @public\n */\nexport function defineDocsConfig(config: DocsConfig): DocsConfig {\n return validateDocsConfig(config);\n}\n","/**\n * Theme → CSS.\n *\n * A site declares its palette in config; the framework turns it into CSS custom\n * properties. This is the seam that lets each organization brand its docs\n * without touching the framework: the values live in the site, the mapping\n * lives here.\n *\n * @packageDocumentation\n */\n\nimport { type ThemeConfig, type ThemePalette } from './config.js';\n\n// Site palette token -> the framework's CSS variable.\nconst TOKEN_TO_VAR: Readonly<Record<keyof ThemePalette, string>> = {\n primary: '--color-fd-primary',\n background: '--color-fd-background',\n foreground: '--color-fd-foreground',\n card: '--color-fd-card',\n border: '--color-fd-border',\n muted: '--color-fd-muted-foreground',\n};\n\nfunction paletteToDeclarations(palette: ThemePalette): string {\n const parts: string[] = [];\n for (const key of Object.keys(TOKEN_TO_VAR) as (keyof ThemePalette)[]) {\n const value = palette[key];\n if (typeof value === 'string' && value.length > 0) {\n parts.push(`${TOKEN_TO_VAR[key]}: ${value};`);\n }\n }\n return parts.join(' ');\n}\n\n/**\n * Build the CSS that applies a site's theme colours. Inject the returned string\n * into a `<style>` tag so it overrides the framework defaults.\n *\n * @param theme - the site's theme configuration\n * @returns a CSS string (empty when no colours are declared)\n * @public\n */\nexport function buildThemeCss(theme: ThemeConfig): string {\n const blocks: string[] = [];\n if (theme.colors) {\n const light = paletteToDeclarations(theme.colors);\n if (light.length > 0) {\n blocks.push(`:root { ${light} }`);\n }\n }\n if (theme.darkColors) {\n const dark = paletteToDeclarations(theme.darkColors);\n if (dark.length > 0) {\n blocks.push(`:root.dark, .dark { ${dark} }`);\n }\n }\n return blocks.join('\\n');\n}\n","/**\n * Permanent redirects for renamed pages. The generator writes\n * `content/redirects.json` (old page URL to current) whenever an operation's\n * URL changes; the site's middleware serves `308`s from it, so an edited\n * summary is a rename with a forwarding address, never a dead link.\n *\n * @packageDocumentation\n */\n\n/**\n * The URL a renamed page's request should be redirected to, or `null` when\n * the request matches no entry. The `.md` form of a renamed page redirects to\n * the `.md` form of its new address.\n *\n * @example\n * ```ts\n * const redirected = redirectTarget(request.nextUrl, redirects);\n * if (redirected) {\n * return NextResponse.redirect(redirected, 308);\n * }\n * ```\n *\n * @param url - the request URL\n * @param redirects - the parsed `content/redirects.json`\n * @returns the redirect target, or `null`\n * @public\n */\nexport function redirectTarget(url: URL, redirects: Readonly<Record<string, string>>): URL | null {\n const { pathname } = url;\n const markdown = pathname.endsWith('.md');\n const page = markdown ? pathname.slice(0, -3) : pathname;\n const destination = redirects[page];\n if (destination === undefined) {\n return null;\n }\n const target = new URL(url);\n target.pathname = markdown ? `${destination}.md` : destination;\n return target;\n}\n","/**\n * The site's `/llms.txt`: a Markdown index of every page, the entry point\n * agents fetch first. Each entry links the page's `.md` address.\n *\n * @packageDocumentation\n */\n\n/**\n * One page of the documentation index.\n *\n * @public\n */\nexport interface LlmsTxtPage {\n readonly title: string;\n /** The page URL (e.g. `/docs/guides/webhooks`); `.md` is appended. */\n readonly url: string;\n readonly description?: string;\n}\n\n/**\n * Options for {@link buildLlmsTxt}.\n *\n * @public\n */\nexport interface BuildLlmsTxtOptions {\n /** The site name, the index's `#` heading. */\n readonly name: string;\n /** One sentence on what the site documents. */\n readonly description?: string;\n /** Absolute origin to prefix every link with (e.g. `https://docs.example.com`). */\n readonly origin?: string;\n}\n\n/**\n * Build the `/llms.txt` document from the site's pages.\n *\n * @example\n * ```ts\n * // app/llms.txt/route.ts\n * export function GET() {\n * const body = buildLlmsTxt(pages, { name: config.theme.name });\n * return new Response(body, { headers: { 'content-type': 'text/plain; charset=utf-8' } });\n * }\n * ```\n *\n * @param pages - the site's pages, in navigation order\n * @param options - the site name, description, and link origin\n * @returns the document text\n * @public\n */\nexport function buildLlmsTxt(pages: readonly LlmsTxtPage[], options: BuildLlmsTxtOptions): string {\n const origin = options.origin?.replace(/\\/$/, '') ?? '';\n const lines = [`# ${options.name}`];\n if (options.description !== undefined && options.description !== '') {\n lines.push('', `> ${options.description}`);\n }\n lines.push('', '## Docs', '');\n for (const page of pages) {\n const link = `[${page.title}](${origin}${page.url}.md)`;\n lines.push(\n page.description === undefined || page.description === ''\n ? `- ${link}`\n : `- ${link}: ${page.description}`,\n );\n }\n lines.push('');\n return lines.join('\\n');\n}\n","/**\n * Code-sample generators for the API reference's usage panel.\n *\n * `fumadocs-openapi` renders one sample per registered generator; a site\n * replaces a built-in one by adding a generator under the same id. The shapes\n * here are structural, so this module needs no fumadocs types.\n *\n * @packageDocumentation\n */\n\n/**\n * One resolved request parameter, as the usage panel passes it.\n *\n * @public\n */\nexport interface CodeUsageValue {\n /** The parameter's example value. */\n readonly value: string;\n}\n\n/**\n * The resolved example request a code-sample generator receives.\n *\n * @public\n */\nexport interface CodeUsageRequest {\n /** The HTTP method. */\n readonly method: string;\n /** The full request URL, path and query resolved. */\n readonly url: string;\n /** Header name to example value. */\n readonly header?: Readonly<Record<string, CodeUsageValue>>;\n /** Cookie name to example value. */\n readonly cookie?: Readonly<Record<string, CodeUsageValue>>;\n /** The example request body, when the operation takes one. */\n readonly body?: unknown;\n /** The body's media type, when the operation takes a body. */\n readonly bodyMediaType?: string;\n}\n\n/**\n * A code-sample generator, shaped for fumadocs-openapi's code-usage registry.\n *\n * @public\n */\nexport interface CodeUsageGenerator {\n /** The tab label readers see. */\n readonly label: string;\n /** The sample's syntax-highlighting language. */\n readonly lang: string;\n /** Render the sample for one resolved example request. */\n generate(data: CodeUsageRequest): string;\n}\n\n/**\n * Wrap in POSIX single quotes. Nothing is escaped inside single quotes, so an\n * embedded quote is written as `'\\''`: close, escaped quote, reopen.\n */\nfunction singleQuote(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * The example body as a string. JSON, url-encoded, and ndjson bodies encode\n * natively; any other media type falls back to pretty-printed JSON.\n */\nfunction bodyToString(body: unknown, mediaType: string): string {\n if (typeof body === 'string') {\n return body;\n }\n if (mediaType === 'application/x-www-form-urlencoded' && isRecord(body)) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(body)) {\n if (value === undefined || value === null) {\n continue;\n }\n const encoded =\n typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'\n ? String(value)\n : JSON.stringify(value);\n params.set(key, encoded);\n }\n return params.toString();\n }\n if (mediaType === 'application/x-ndjson' && Array.isArray(body)) {\n return body.map((entry) => JSON.stringify(entry)).join('\\n');\n }\n return JSON.stringify(body, null, 2);\n}\n\n/**\n * A cURL sample in long-form flags: `--request`, `--url`, `--header`,\n * `--data`. Register it over the built-in `curl` entry:\n *\n * @example\n * ```ts\n * import { curlCodeUsage } from '@blaaiz/docs-core';\n * import { createCodeUsageGeneratorRegistry } from 'fumadocs-openapi/requests/generators';\n * import { registerDefault } from 'fumadocs-openapi/requests/generators/all';\n *\n * const codeUsages = registerDefault(createCodeUsageGeneratorRegistry());\n * codeUsages.add('curl', curlCodeUsage);\n * createOpenAPI({ input, codeUsages });\n * ```\n *\n * @public\n */\nexport const curlCodeUsage: CodeUsageGenerator = {\n label: 'cURL',\n lang: 'bash',\n generate(data: CodeUsageRequest): string {\n const lines = [`curl --request ${data.method.toUpperCase()}`, `--url ${singleQuote(data.url)}`];\n for (const [name, param] of Object.entries(data.header ?? {})) {\n lines.push(`--header ${singleQuote(`${name}: ${param.value}`)}`);\n }\n for (const [name, param] of Object.entries(data.cookie ?? {})) {\n lines.push(`--cookie ${singleQuote(`${name}=${param.value}`)}`);\n }\n if (isRecord(data.body) && data.bodyMediaType === 'multipart/form-data') {\n for (const [key, value] of Object.entries(data.body)) {\n lines.push(\n `--form ${singleQuote(`${key}=${typeof value === 'string' ? value : JSON.stringify(value)}`)}`,\n );\n }\n } else if (data.body !== undefined && data.body !== null && data.bodyMediaType !== undefined) {\n lines.push(`--header ${singleQuote(`Content-Type: ${data.bodyMediaType}`)}`);\n lines.push(`--data ${singleQuote(bodyToString(data.body, data.bodyMediaType))}`);\n }\n return lines.map((line, i) => (i === 0 ? line : ` ${line}`)).join(' \\\\\\n');\n },\n};\n","/**\n * SEO metadata, derived from {@link DocsConfig}.\n *\n * The framework owns *how* metadata is shaped — the title template, the\n * canonical URL, the Open Graph and Twitter cards, the robots policy — so every\n * site gets correct, consistent tags from its config alone. A site owns only\n * the facts: its public origin, its sharing image, its description.\n *\n * These functions return plain objects that are structurally assignable to\n * Next's `Metadata` and `MetadataRoute.*` types, so the framework needs no\n * dependency on `next`. A site uses them directly:\n *\n * ```ts\n * export const metadata: Metadata = buildMetadata(config);\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { DocsConfig } from './config.js';\n\n/**\n * The subset of Next's `Metadata` the framework produces. Literal types are\n * used where Next expects them (`openGraph.type`, `twitter.card`) so the result\n * assigns to `Metadata` without a cast.\n *\n * @public\n */\nexport interface DocsMetadata {\n readonly metadataBase?: URL;\n readonly title: string | { readonly default: string; readonly template: string };\n readonly description?: string;\n // Arrays are mutable so the result assigns to Next's `Metadata` without a cast\n // (Next types these as mutable). Each is a fresh array, so this is safe.\n readonly keywords?: string[];\n readonly alternates?: { readonly canonical?: string };\n /**\n * The site icon, from {@link ThemeConfig.favicon}. Shaped as Next's `Icons`\n * object so the result assigns to `Metadata` without a cast.\n */\n readonly icons?: { readonly icon: string };\n readonly robots?: { readonly index: boolean; readonly follow: boolean };\n readonly openGraph?: {\n readonly type: 'website';\n readonly siteName: string;\n readonly title: string;\n readonly description?: string;\n readonly url?: string;\n readonly images?: { readonly url: string }[];\n };\n readonly twitter?: {\n readonly card: 'summary' | 'summary_large_image';\n readonly title: string;\n readonly description?: string;\n readonly site?: string;\n readonly images?: string[];\n };\n}\n\n/**\n * Per-page metadata inputs. Omit everything for the site-wide default (the home\n * document): the title is then {@link ThemeConfig.name} verbatim and the\n * template is exposed for inner pages.\n *\n * @public\n */\nexport interface PageSeo {\n /** The page title, before the template is applied. */\n readonly title?: string;\n /** The page description; falls back to {@link SeoConfig.description}. */\n readonly description?: string;\n /** The page path for the canonical URL, e.g. `/docs/guides/refunds`. */\n readonly path?: string;\n /** Override the sharing image for this page. */\n readonly ogImage?: string;\n /** Extra keywords for this page, merged with the site-wide set. */\n readonly keywords?: readonly string[];\n /** Keep this page out of the index while the rest stays indexable. */\n readonly noindex?: boolean;\n}\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\n/**\n * Build a page's (or the site's) metadata from config.\n *\n * Call it with no page for the root layout — you get the default title plus the\n * template inner pages inherit. Call it with a {@link PageSeo} in a page's\n * `generateMetadata` for that page's title, canonical URL, and cards.\n *\n * {@link ThemeConfig.favicon} becomes the `icons` field, so declaring the\n * favicon in config is all a site does — no `<link rel=\"icon\">` by hand.\n *\n * @param config - the site configuration\n * @param page - the page's metadata inputs; omit for the site default\n * @returns metadata assignable to Next's `Metadata`\n * @public\n */\nexport function buildMetadata(config: DocsConfig, page: PageSeo = {}): DocsMetadata {\n const name = config.theme.name;\n const seo = config.seo ?? {};\n const template = seo.titleTemplate ?? `%s · ${name}`;\n const siteUrl = seo.siteUrl ? trimTrailingSlash(seo.siteUrl) : undefined;\n\n const isDefault = page.title === undefined;\n const displayTitle = isDefault ? name : template.replace('%s', page.title);\n const description = page.description ?? seo.description;\n const path = page.path ?? '/';\n const ogImage = page.ogImage ?? seo.ogImage;\n const favicon = config.theme.favicon;\n const indexable = !(page.noindex ?? seo.noindex ?? false);\n const keywords = [...(seo.keywords ?? []), ...(page.keywords ?? [])];\n\n return {\n ...(siteUrl ? { metadataBase: new URL(siteUrl) } : {}),\n title: isDefault ? { default: name, template } : page.title,\n ...(description ? { description } : {}),\n ...(keywords.length ? { keywords } : {}),\n alternates: { canonical: path },\n ...(favicon ? { icons: { icon: favicon } } : {}),\n robots: { index: indexable, follow: indexable },\n openGraph: {\n type: 'website',\n siteName: name,\n title: displayTitle,\n ...(description ? { description } : {}),\n url: path,\n ...(ogImage ? { images: [{ url: ogImage }] } : {}),\n },\n twitter: {\n card: ogImage ? 'summary_large_image' : 'summary',\n title: displayTitle,\n ...(description ? { description } : {}),\n ...(seo.twitter ? { site: seo.twitter } : {}),\n ...(ogImage ? { images: [ogImage] } : {}),\n },\n };\n}\n\n/**\n * A robots policy, assignable to Next's `MetadataRoute.Robots`.\n *\n * @public\n */\nexport interface DocsRobots {\n readonly rules: {\n readonly userAgent: string;\n readonly allow?: string;\n readonly disallow?: string | string[];\n };\n readonly sitemap?: string;\n readonly host?: string;\n}\n\n/**\n * Build the robots policy. A `noindex` (or auth-gated) site disallows crawling\n * entirely; a public site allows everything except the sign-in and API routes,\n * which carry no indexable content. Points crawlers at the sitemap when a\n * `siteUrl` is set.\n *\n * @param config - the site configuration\n * @returns robots rules for `app/robots.ts`\n * @public\n */\nexport function buildRobots(config: DocsConfig): DocsRobots {\n const seo = config.seo ?? {};\n const siteUrl = seo.siteUrl ? trimTrailingSlash(seo.siteUrl) : undefined;\n const blocked = seo.noindex ?? false;\n\n return {\n rules: blocked\n ? { userAgent: '*', disallow: '/' }\n : { userAgent: '*', allow: '/', disallow: ['/signin', '/api/'] },\n ...(siteUrl && !blocked ? { sitemap: `${siteUrl}/sitemap.xml`, host: siteUrl } : {}),\n };\n}\n\n/**\n * One sitemap entry a site supplies (typically from the page tree).\n *\n * @public\n */\nexport interface SitemapEntry {\n /** Site-relative path, e.g. `/docs/guides/refunds`. */\n readonly path: string;\n /** Last-modified date, if known. */\n readonly lastModified?: Date | string;\n}\n\n/**\n * How often a crawler should revisit a page. The values Google documents for\n * `<changefreq>`.\n *\n * @public\n */\nexport type SitemapChangeFrequency =\n 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';\n\n/**\n * A resolved sitemap row, assignable to Next's `MetadataRoute.Sitemap[number]`.\n *\n * @public\n */\nexport interface DocsSitemapEntry {\n readonly url: string;\n readonly lastModified?: Date | string;\n readonly changeFrequency: SitemapChangeFrequency;\n readonly priority: number;\n}\n\n/**\n * Overrides for {@link buildSitemap}. Every field is optional, and the defaults\n * suit a documentation site that publishes continuously.\n *\n * @public\n */\nexport interface BuildSitemapOptions {\n /** Revisit hint for every row. Default `'weekly'`. */\n readonly changeFrequency?: SitemapChangeFrequency;\n /** Priority for every page except the home path. Default `0.7`. */\n readonly priority?: number;\n /** Priority for the home path (`/`). Default `1`. */\n readonly homePriority?: number;\n}\n\n/**\n * Build sitemap rows from the site's pages. The home path gets top priority;\n * everything else a shade lower. Absolute URLs need a `siteUrl` in config;\n * without one the paths are emitted relative, which most crawlers still accept.\n *\n * A site that publishes on a slower cycle, or that wants its guides to outrank\n * its generated reference pages, overrides the defaults:\n *\n * @example\n * ```ts\n * buildSitemap(entries, config, { changeFrequency: 'monthly', priority: 0.5 });\n * ```\n *\n * @param entries - the site's page paths (and optional modified dates)\n * @param config - the site configuration, for the origin\n * @param options - override the revisit hint and the priorities\n * @returns sitemap rows for `app/sitemap.ts`\n * @public\n */\nexport function buildSitemap(\n entries: readonly SitemapEntry[],\n config: DocsConfig,\n options: BuildSitemapOptions = {},\n): DocsSitemapEntry[] {\n const seo = config.seo ?? {};\n const siteUrl = seo.siteUrl ? trimTrailingSlash(seo.siteUrl) : '';\n const changeFrequency = options.changeFrequency ?? 'weekly';\n const pagePriority = options.priority ?? 0.7;\n const homePriority = options.homePriority ?? 1;\n\n return entries.map((entry) => {\n const path = entry.path.startsWith('/') ? entry.path : `/${entry.path}`;\n return {\n url: `${siteUrl}${path}`,\n ...(entry.lastModified ? { lastModified: entry.lastModified } : {}),\n changeFrequency,\n priority: path === '/' ? homePriority : pagePriority,\n };\n });\n}\n","/**\n * Turns the normalized navigation into a content-tree plan: which folders and\n * `meta.json` files encode the navigation, and where each API page belongs.\n * The site's `docs.json` stays the single source of truth — authors reorganize\n * routes and groups by editing one file, never by moving generated files.\n *\n * The planner is pure; `@blaaiz/docs-core/generator` executes the plan.\n *\n * @packageDocumentation\n */\n\nimport type { NavGroup, NavItem, NavTab, Navigation } from './navigation.js';\n\n/**\n * A planned API reference page: one operation and the folder it belongs to.\n *\n * @public\n */\nexport interface PlannedApiPage {\n /** Spec file reference from `docs.json`, relative to the content directory. */\n readonly file: string;\n /** The operation's HTTP method. */\n readonly method: string;\n /** The operation's API route. */\n readonly apiPath: string;\n /** Output folder, relative to the docs output directory (e.g. `api/authentication`). */\n readonly dir: string;\n /** Position within the group. */\n readonly order: number;\n}\n\n/**\n * A child folder of a planned API group, at its position among the group's\n * pages. The generator merges these with the resolved page slugs to write the\n * group's `meta.json` in declared order.\n *\n * @public\n */\nexport interface PlannedGroupChild {\n readonly order: number;\n /** The child folder's name within the group directory. */\n readonly folder: string;\n /** The child group's title, for the heading the `headings` style renders. */\n readonly title: string;\n}\n\n/**\n * A planned API group folder. The generator fills its page order once the\n * operation slugs are known, interleaving {@link PlannedGroupChild} folders at\n * their declared positions. A group with `root: true` is an API tab's folder.\n *\n * @public\n */\nexport interface PlannedApiGroup {\n readonly dir: string;\n readonly title: string;\n readonly children: readonly PlannedGroupChild[];\n /** Set on an API tab's own folder, so the sidebar scopes to the tab. */\n readonly root?: boolean;\n /** The tab's icon, on a `root` group. */\n readonly icon?: string;\n}\n\n/**\n * A doc page declared inside an API tab, at its position among the group's\n * operations. The generator links it into the group's `meta.json`: the page\n * keeps living in its own folder, outside the generated tree.\n *\n * @public\n */\nexport interface PlannedApiDocLink {\n /** Page path relative to the docs output directory, without extension. */\n readonly file: string;\n /** The generated group folder whose meta lists the link. */\n readonly dir: string;\n /** Position within the group. */\n readonly order: number;\n}\n\n/**\n * A `meta.json` file the plan wants written.\n *\n * @public\n */\nexport interface PlannedMeta {\n /** Path relative to the docs output directory, e.g. `guides/meta.json`. */\n readonly path: string;\n readonly content: Record<string, unknown>;\n}\n\n/**\n * The complete content-tree plan for one navigation.\n *\n * @public\n */\nexport interface DocsTreePlan {\n /** Unique spec files referenced by the navigation, in order of appearance. */\n readonly specs: readonly string[];\n readonly apiPages: readonly PlannedApiPage[];\n readonly apiGroups: readonly PlannedApiGroup[];\n /** Fully-known meta files: the root, doc tab folders, and doc groups. */\n readonly metas: readonly PlannedMeta[];\n /**\n * Doc pages declared inside API tabs, each linked into its group's meta at\n * its declared position.\n */\n readonly apiDocLinks: readonly PlannedApiDocLink[];\n}\n\n/**\n * How the sidebar presents a tab's top-level groups.\n *\n * - `collapsible`: every group is a collapsible folder (the fumadocs default).\n * - `headings`: a top-level group is a flat, always-open section heading with\n * its pages listed beneath it; only nested groups collapse, and they start\n * closed. The Mintlify presentation.\n *\n * @public\n */\nexport type SidebarStyle = 'collapsible' | 'headings';\n\n/**\n * Options for {@link planDocsTree}.\n *\n * @public\n */\nexport interface PlanDocsTreeOptions {\n /** Folder for generated API pages when one tab publishes them. Default `api`. */\n readonly apiDir?: string;\n /** The sidebar's group presentation. Default `collapsible`. */\n readonly sidebar?: SidebarStyle;\n}\n\n/** Kebab-case a title into a folder name. */\nfunction slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction isOpenApi(item: NavItem): boolean {\n return item.kind === 'openapi';\n}\n\n/** Whether any item in the run, at any depth, references an OpenAPI file. */\nexport function hasOpenApi(items: readonly NavItem[]): boolean {\n return items.some((item) => (item.kind === 'group' ? hasOpenApi(item.items) : isOpenApi(item)));\n}\n\n/** The basename of a doc page path (its file name in the folder). */\nfunction basename(file: string): string {\n const i = file.lastIndexOf('/');\n return i === -1 ? file : file.slice(i + 1);\n}\n\n/** The directory of a doc page path, or '' for a root page. */\nfunction dirname(file: string): string {\n const i = file.lastIndexOf('/');\n return i === -1 ? '' : file.slice(0, i);\n}\n\n/** The first doc page in a group, descending nested groups in order. */\nfunction firstDocFile(items: readonly NavItem[]): string | undefined {\n for (const item of items) {\n if (item.kind === 'doc') {\n return item.file;\n }\n if (item.kind === 'group') {\n const found = firstDocFile(item.items);\n if (found !== undefined) {\n return found;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Plan the content tree for a navigation.\n *\n * Conventions (Mintlify-shaped):\n * - A tab whose items reference OpenAPI files becomes an API tab. With one API\n * tab its folder is `apiDir`; with several, each tab's folder is its\n * slugified title, so tabs never collide. Groups become nested folders named\n * by slugified group title, to any depth.\n * - A tab of doc pages becomes the folder its pages share (their first path\n * segment); a doc group's pages must share one directory. Doc groups nest.\n * - Root-level doc pages (no `/` in the path) are listed in the root meta.\n * - Tab folders get `root: true`, so the sidebar scopes to the active tab.\n * - Sidebar order is declaration order, pages and groups interleaved.\n * - With `sidebar: 'headings'`, a tab-level group renders as a flat heading\n * with its pages extracted beneath it, and nested groups start closed.\n *\n * @param navigation - the parsed navigation\n * @param options - the API folder name and the sidebar style\n * @returns the plan the generator executes\n * @throws when two sibling groups slugify to the same folder\n * @public\n */\nexport function planDocsTree(\n navigation: Navigation,\n options: PlanDocsTreeOptions = {},\n): DocsTreePlan {\n const apiDir = options.apiDir ?? 'api';\n const headings = (options.sidebar ?? 'collapsible') === 'headings';\n\n const specs: string[] = [];\n const apiPages: PlannedApiPage[] = [];\n const apiGroups: PlannedApiGroup[] = [];\n const metas: PlannedMeta[] = [];\n const rootPages: string[] = [];\n const apiDocLinks: PlannedApiDocLink[] = [];\n\n const apiTabs = navigation.filter((tab) => hasOpenApi(tab.items));\n const soleApiTab = apiTabs.length === 1;\n\n for (const tab of navigation) {\n if (hasOpenApi(tab.items)) {\n planApiTab(tab);\n continue;\n }\n planDocTab(tab);\n }\n\n metas.unshift({ path: 'meta.json', content: { pages: rootPages } });\n\n return { specs, apiPages, apiGroups, metas, apiDocLinks };\n\n function planApiTab(tab: NavTab): void {\n const tabDir = soleApiTab ? apiDir : slugify(tab.title);\n rootPages.push(tabDir);\n const at = apiGroups.length;\n const children = planApiItems(tab.items, tabDir);\n apiGroups.splice(at, 0, {\n dir: tabDir,\n title: tab.title,\n root: true,\n ...(tab.icon ? { icon: tab.icon } : {}),\n children,\n });\n }\n\n /**\n * Plan a run of API-tab items into `dir`: operations become planned pages,\n * nested groups become child folders, and doc pages become links into the\n * group's meta. Returns the child folders at their declared positions.\n */\n function planApiItems(items: readonly NavItem[], dir: string): PlannedGroupChild[] {\n const children: PlannedGroupChild[] = [];\n const takenFolders = new Set<string>();\n let order = 0;\n for (const item of items) {\n if (item.kind === 'group') {\n const folder = slugify(item.title);\n if (takenFolders.has(folder)) {\n throw new Error(\n `[docs-core] Two sibling groups under '${dir}' share the folder name '${folder}'. ` +\n 'Rename one of the groups in docs.json.',\n );\n }\n takenFolders.add(folder);\n const childDir = `${dir}/${folder}`;\n const at = apiGroups.length;\n const sub = planApiItems(item.items, childDir);\n apiGroups.splice(at, 0, { dir: childDir, title: item.title, children: sub });\n children.push({ order, folder, title: item.title });\n order += 1;\n continue;\n }\n if (item.kind === 'openapi') {\n if (!specs.includes(item.file)) {\n specs.push(item.file);\n }\n apiPages.push({ file: item.file, method: item.method, apiPath: item.apiPath, dir, order });\n order += 1;\n continue;\n }\n apiDocLinks.push({ file: item.file, dir, order });\n order += 1;\n }\n return children;\n }\n\n function planDocTab(tab: NavTab): void {\n const directPages = tab.items.filter((item) => item.kind === 'doc');\n const groups = tab.items.filter((item) => item.kind === 'group');\n\n // A tab of root-level pages (e.g. Home -> index) lists them at the root.\n if (groups.length === 0 && directPages.every((page) => !page.file.includes('/'))) {\n for (const page of directPages) {\n rootPages.push(page.file);\n }\n return;\n }\n\n // The tab folder is the first path segment its pages share.\n const firstFile = firstDocFile(tab.items);\n if (firstFile === undefined) {\n return;\n }\n const tabDir = firstFile.split('/')[0] ?? '';\n rootPages.push(tabDir);\n\n metas.push({\n path: `${tabDir}/meta.json`,\n content: {\n title: tab.title,\n root: true,\n ...(tab.icon ? { icon: tab.icon } : {}),\n pages: planDocItems(tab.items, tabDir, true),\n },\n });\n }\n\n /**\n * Plan a run of doc-tab items belonging to the folder `dir`: pages are\n * listed by basename, nested groups get their own `meta.json` and are\n * listed by their folder path relative to `dir`. A nested group whose pages\n * live directly in `dir` is flattened into it. In the `headings` style a\n * tab-level group lists as a separator heading plus its extracted children,\n * and a flattened group keeps its title as a separator. Returns the meta\n * entries in declared order.\n */\n function planDocItems(items: readonly NavItem[], dir: string, tabLevel: boolean): string[] {\n const entries: string[] = [];\n for (const item of items) {\n if (item.kind === 'doc') {\n entries.push(basename(item.file));\n continue;\n }\n if (item.kind !== 'group') {\n continue;\n }\n const groupDir = planDocGroup(item, dir);\n if (groupDir === null) {\n continue;\n }\n if (groupDir === dir) {\n // The group's pages live directly in this folder.\n if (headings) {\n entries.push(`---${item.title}---`);\n }\n entries.push(...planDocItems(item.items, dir, false));\n continue;\n }\n const folder = groupDir.slice(dir.length + 1);\n if (headings && tabLevel) {\n entries.push(`---${item.title}---`, `...${folder}`);\n continue;\n }\n entries.push(folder);\n }\n return entries;\n }\n\n /**\n * Plan one doc group. Returns the group's directory, `dir` itself when the\n * group flattens into its parent folder, or `null` for an empty group.\n */\n function planDocGroup(group: NavGroup, dir: string): string | null {\n const firstFile = firstDocFile(group.items);\n if (firstFile === undefined) {\n return null;\n }\n const groupDir = dirname(firstFile);\n if (groupDir === dir || groupDir === '') {\n return dir;\n }\n metas.push({\n path: `${groupDir}/meta.json`,\n content: {\n title: group.title,\n // A nested group starts closed in the headings style, whatever the\n // site's defaultOpenLevel. On a tab-level group the flag is inert:\n // that folder is extracted, so no folder node renders it.\n ...(headings ? { defaultOpen: false } : {}),\n pages: planDocItems(group.items, groupDir, false),\n },\n });\n return groupDir;\n }\n}\n","/**\n * OpenAPI-to-Markdown rendering for LLM corpora.\n *\n * A generated API reference page renders its parameters, schemas, and\n * responses at runtime from the OpenAPI document — none of that text exists in\n * the page's MDX. Ask AI and the `/md` route need it as text, so this module\n * renders one operation from the document into compact, deterministic\n * Markdown: auth requirements, parameters, request-body fields with types,\n * required markers, enums and defaults, and response shapes.\n *\n * The input document is site content and is never trusted: every lookup is\n * type-checked and malformed fragments are skipped rather than thrown on.\n * Recursion is bounded twice — a `seen` set of open `$ref` targets stops\n * self-referencing schemas, and a depth cap bounds legitimately deep nesting\n * with an explicit elision marker.\n *\n * @packageDocumentation\n */\n\nimport type { OpenApiDocument } from './openapi-types.js';\n\n/**\n * Addresses one operation inside an OpenAPI document.\n *\n * @public\n */\nexport interface OpenApiOperationRef {\n /** The path key, exactly as it appears under `paths`. */\n readonly path: string;\n /** The HTTP method, case-insensitive. */\n readonly method: string;\n}\n\ntype JsonObject = Record<string, unknown>;\n\n/** How deep nested request/response fields are rendered before being elided. */\nconst MAX_FIELD_DEPTH = 3;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/** Resolve a local (`#/…`) JSON pointer against the document. */\nfunction resolvePointer(document: OpenApiDocument, pointer: string): unknown {\n if (!pointer.startsWith('#/')) {\n return undefined;\n }\n let node: unknown = document;\n for (const rawSegment of pointer.slice(2).split('/')) {\n const segment = rawSegment.replaceAll('~1', '/').replaceAll('~0', '~');\n if (!isObject(node)) {\n return undefined;\n }\n node = node[segment];\n }\n return node;\n}\n\n/**\n * The set of `$ref` targets already being rendered on the current recursion\n * path, extended with `schema`'s own ref when it has one. Passing the result\n * down keeps a self-referencing schema from re-entering itself.\n */\nfunction withRef(schema: unknown, seen: ReadonlySet<string>): ReadonlySet<string> {\n const ref = isObject(schema) ? asString(schema['$ref']) : undefined;\n return ref === undefined || seen.has(ref) ? seen : new Set([...seen, ref]);\n}\n\n/**\n * Resolve one node to a plain object: follow `$ref` chains (cycle-guarded via\n * `seen`) and flatten `allOf` compositions into one object by merging\n * properties and unioning `required`. Used for schemas, parameters, request\n * bodies, and responses alike — they all resolve the same way.\n */\nfunction derefNode(\n document: OpenApiDocument,\n schema: unknown,\n seen: ReadonlySet<string>,\n): JsonObject | undefined {\n if (!isObject(schema)) {\n return undefined;\n }\n const ref = asString(schema['$ref']);\n if (ref !== undefined) {\n if (seen.has(ref)) {\n return undefined;\n }\n return derefNode(document, resolvePointer(document, ref), new Set([...seen, ref]));\n }\n const allOf = schema['allOf'];\n if (Array.isArray(allOf)) {\n const merged: JsonObject = { ...schema };\n delete merged['allOf'];\n const properties: JsonObject = {};\n const required: string[] = [];\n for (const member of allOf) {\n const resolved = derefNode(document, member, seen);\n if (resolved === undefined) {\n continue;\n }\n for (const [key, value] of Object.entries(resolved)) {\n if (key === 'properties' && isObject(value)) {\n Object.assign(properties, value);\n } else if (key === 'required' && Array.isArray(value)) {\n required.push(...value.filter((entry): entry is string => typeof entry === 'string'));\n } else if (!(key in merged)) {\n merged[key] = value;\n }\n }\n }\n if (Object.keys(properties).length > 0) {\n merged['properties'] = {\n ...properties,\n ...(isObject(merged['properties']) ? merged['properties'] : {}),\n };\n }\n if (required.length > 0) {\n const own = Array.isArray(merged['required'])\n ? merged['required'].filter((entry): entry is string => typeof entry === 'string')\n : [];\n merged['required'] = [...new Set([...required, ...own])];\n }\n if (merged['type'] === undefined && isObject(merged['properties'])) {\n merged['type'] = 'object';\n }\n return merged;\n }\n return schema;\n}\n\n/** A short human label for a schema's type: `string (email)`, `array of Recipient`, … */\nfunction typeLabel(document: OpenApiDocument, schema: unknown, seen: ReadonlySet<string>): string {\n if (!isObject(schema)) {\n return 'unknown';\n }\n const ref = asString(schema['$ref']);\n const refName = ref?.split('/').at(-1);\n const resolved = derefNode(document, schema, seen);\n if (resolved === undefined) {\n return refName ?? 'unknown';\n }\n const type = asString(resolved['type']);\n if (refName !== undefined && (type === 'object' || isObject(resolved['properties']))) {\n return refName;\n }\n if (type === 'array') {\n return `array of ${typeLabel(document, resolved['items'], seen)}`;\n }\n if (Array.isArray(resolved['oneOf']) || Array.isArray(resolved['anyOf'])) {\n const variants = (resolved['oneOf'] ?? resolved['anyOf']) as unknown[];\n return `one of ${String(variants.length)} shapes`;\n }\n if (type === undefined) {\n return isObject(resolved['properties']) ? 'object' : (ref?.split('/').at(-1) ?? 'unknown');\n }\n const format = asString(resolved['format']);\n return format === undefined ? type : `${type} (${format})`;\n}\n\n/**\n * Renders one `- \\`name\\` (type, required) — description…` field line. The\n * parenthetical is built here and only here; `location` (a parameter's `in`)\n * joins it as `(in: query, string, required)`.\n */\nfunction fieldLine(\n document: OpenApiDocument,\n name: string,\n schema: JsonObject,\n required: boolean,\n indent: string,\n seen: ReadonlySet<string>,\n location?: string,\n): string {\n const label = typeLabel(document, schema, seen);\n const resolved = derefNode(document, schema, seen) ?? schema;\n const notes: string[] = [];\n const description = asString(resolved['description']);\n if (description !== undefined && description !== '') {\n notes.push(description.replaceAll(/\\s*\\n\\s*/g, ' ').trim());\n }\n const enumValues = resolved['enum'];\n if (Array.isArray(enumValues) && enumValues.length > 0) {\n notes.push(`One of: ${enumValues.map((value) => `\\`${String(value)}\\``).join(', ')}.`);\n }\n const defaultValue = resolved['default'];\n if (\n typeof defaultValue === 'string' ||\n typeof defaultValue === 'number' ||\n typeof defaultValue === 'boolean'\n ) {\n notes.push(`Default: \\`${String(defaultValue)}\\`.`);\n }\n const example = resolved['example'];\n if (\n (typeof example === 'string' || typeof example === 'number' || typeof example === 'boolean') &&\n String(example).length <= 60\n ) {\n notes.push(`Example: \\`${String(example)}\\`.`);\n }\n if (resolved['deprecated'] === true) {\n notes.push('Deprecated.');\n }\n const detail = notes.length > 0 ? ` — ${notes.join(' ')}` : '';\n const parenthetical = [\n ...(location === undefined ? [] : [`in: ${location}`]),\n label,\n ...(required ? ['required'] : []),\n ].join(', ');\n return `${indent}- \\`${name}\\` (${parenthetical})${detail}`;\n}\n\n/**\n * Render an object schema's properties as nested field lines. Two guards\n * bound the recursion, and both are enforced here at the single entry point:\n * the depth cap emits an explicit elision marker, and the `seen` set of open\n * `$ref` targets stops a self-referencing schema from re-entering itself —\n * whichever path it recurses through (properties, arrays, or variants).\n */\nfunction schemaFieldLines(\n document: OpenApiDocument,\n schema: unknown,\n depth: number,\n seen: ReadonlySet<string>,\n): string[] {\n if (depth >= MAX_FIELD_DEPTH) {\n return [`${' '.repeat(depth)}- (nested fields omitted at this depth)`];\n }\n const scope = withRef(schema, seen);\n const resolved = derefNode(document, schema, seen);\n if (resolved === undefined) {\n return [];\n }\n if (asString(resolved['type']) === 'array') {\n return schemaFieldLines(document, resolved['items'], depth, withRef(resolved['items'], scope));\n }\n const properties = resolved['properties'];\n const variants = resolved['oneOf'] ?? resolved['anyOf'];\n // A schema may carry both: its own properties plus alternative shapes. A\n // variant with no renderable fields is often a titled example — its title\n // alone is still worth a line; a variant with neither is skipped.\n const variantLines = Array.isArray(variants)\n ? variants.flatMap((variant, index) => {\n const inner = schemaFieldLines(document, variant, depth + 1, scope);\n const title = asString(derefNode(document, variant, scope)?.['title']);\n if (inner.length === 0 && title === undefined) {\n return [];\n }\n const label = title ?? typeLabel(document, variant, scope);\n const head = `${' '.repeat(depth)}- Shape ${String(index + 1)} (${label})${inner.length > 0 ? ':' : ''}`;\n return [head, ...inner];\n })\n : [];\n if (!isObject(properties)) {\n return variantLines;\n }\n const required = new Set(\n Array.isArray(resolved['required'])\n ? resolved['required'].filter((entry): entry is string => typeof entry === 'string')\n : [],\n );\n const indent = ' '.repeat(depth);\n const lines: string[] = [];\n for (const [name, property] of Object.entries(properties)) {\n if (!isObject(property)) {\n continue;\n }\n lines.push(fieldLine(document, name, property, required.has(name), indent, scope));\n const propertyScope = withRef(property, scope);\n const child = derefNode(document, property, scope);\n if (child === undefined) {\n continue;\n }\n const items = asString(child['type']) === 'array' ? child['items'] : undefined;\n const nestedScope = items === undefined ? propertyScope : withRef(items, propertyScope);\n const nested = items === undefined ? child : derefNode(document, items, propertyScope);\n const hasNestedFields =\n nested !== undefined &&\n (isObject(nested['properties']) ||\n Array.isArray(nested['oneOf']) ||\n Array.isArray(nested['anyOf']));\n if (!hasNestedFields) {\n continue;\n }\n lines.push(...schemaFieldLines(document, nested, depth + 1, nestedScope));\n }\n return lines;\n}\n\n/** `Auth: oauth2ClientCredentials (scopes: payout:create)` from a security array. */\nfunction securityLine(document: OpenApiDocument, operation: JsonObject): string | undefined {\n const security = operation['security'] ?? document.security;\n if (!Array.isArray(security) || security.length === 0) {\n return undefined;\n }\n const requirements = security\n .filter(isObject)\n .map((entry) =>\n Object.entries(entry)\n .map(([scheme, scopes]) => {\n const scopeList = Array.isArray(scopes)\n ? scopes.filter((scope): scope is string => typeof scope === 'string')\n : [];\n return scopeList.length > 0 ? `${scheme} (scopes: ${scopeList.join(', ')})` : scheme;\n })\n .join(' + '),\n )\n .filter((entry) => entry !== '');\n return requirements.length > 0 ? `Auth: ${requirements.join(' or ')}` : undefined;\n}\n\n/** The JSON media type's schema if present, else the first media type's. */\nfunction bodySchema(content: unknown): { mediaType: string; schema: unknown } | undefined {\n if (!isObject(content)) {\n return undefined;\n }\n const mediaType = 'application/json' in content ? 'application/json' : Object.keys(content)[0];\n if (mediaType === undefined) {\n return undefined;\n }\n const media = content[mediaType];\n return isObject(media) ? { mediaType, schema: media['schema'] } : undefined;\n}\n\n/**\n * Render one operation from an OpenAPI document as compact Markdown: auth,\n * parameters, request-body fields, and response shapes. The page-level title\n * and description are deliberately not rendered — the caller already has them\n * from the page frontmatter.\n *\n * Returns `null` when the document has no such operation.\n *\n * @param document - the (merged) OpenAPI document\n * @param ref - the operation's path and method\n * @returns Markdown for the operation, or `null` when it is not found\n * @public\n */\nexport function openApiOperationToMarkdown(\n document: OpenApiDocument,\n ref: OpenApiOperationRef,\n): string | null {\n const pathItem: unknown = isObject(document.paths) ? document.paths[ref.path] : undefined;\n if (!isObject(pathItem)) {\n return null;\n }\n const operation = pathItem[ref.method.toLowerCase()];\n if (!isObject(operation)) {\n return null;\n }\n const seen: ReadonlySet<string> = new Set();\n const sections: string[] = [];\n\n if (operation['deprecated'] === true) {\n sections.push('**Deprecated.**');\n }\n const auth = securityLine(document, operation);\n if (auth !== undefined) {\n sections.push(auth);\n }\n\n const parameters = operation['parameters'];\n if (Array.isArray(parameters)) {\n const lines = parameters\n .map((parameter: unknown) => derefNode(document, parameter, seen) ?? parameter)\n .filter(isObject)\n .flatMap((parameter) => {\n const name = asString(parameter['name']);\n if (name === undefined) {\n return [];\n }\n const where = asString(parameter['in']) ?? 'query';\n const schema = isObject(parameter['schema']) ? parameter['schema'] : {};\n return [fieldLine(document, name, schema, parameter['required'] === true, '', seen, where)];\n });\n if (lines.length > 0) {\n sections.push(`## Parameters\\n\\n${lines.join('\\n')}`);\n }\n }\n\n const requestBody = derefNode(document, operation['requestBody'], seen);\n if (requestBody !== undefined) {\n const body = bodySchema(requestBody['content']);\n if (body !== undefined) {\n const lines = schemaFieldLines(document, body.schema, 0, seen);\n const requiredNote = requestBody['required'] === true ? ', required' : '';\n const heading = `## Request body (${body.mediaType}${requiredNote})`;\n sections.push(lines.length > 0 ? `${heading}\\n\\n${lines.join('\\n')}` : heading);\n }\n }\n\n const responses = operation['responses'];\n if (isObject(responses)) {\n const lines: string[] = [];\n for (const [status, rawResponse] of Object.entries(responses)) {\n const response = derefNode(document, rawResponse, seen) ?? rawResponse;\n if (!isObject(response)) {\n continue;\n }\n const description = asString(response['description'])\n ?.replaceAll(/\\s*\\n\\s*/g, ' ')\n .trim();\n lines.push(\n `- \\`${status}\\`${description !== undefined && description !== '' ? ` — ${description}` : ''}`,\n );\n const body = bodySchema(response['content']);\n if (body !== undefined) {\n lines.push(...schemaFieldLines(document, body.schema, 1, seen));\n }\n }\n if (lines.length > 0) {\n sections.push(`## Responses\\n\\n${lines.join('\\n')}`);\n }\n }\n\n return sections.length > 0 ? sections.join('\\n\\n') : null;\n}\n","/**\n * Page-to-Markdown conversion for the \"Copy page / View as Markdown\" feature.\n *\n * A docs page is authored in MDX: frontmatter, prose, and JSX components. An\n * LLM wants none of that machinery — it wants clean Markdown. This module turns\n * a raw MDX source into readable Markdown, and builds a runtime-agnostic route\n * that serves it as `text/plain`.\n *\n * The transform is pure (string in, string out) and the route takes the content\n * reader as an injected function, so `core` never touches a filesystem or a\n * framework: the consuming site decides where its MDX lives.\n *\n * @packageDocumentation\n */\n\nimport { openApiOperationToMarkdown } from './openapi-markdown.js';\nimport type { OpenApiDocument } from './openapi-types.js';\n\n/**\n * Reads the raw MDX source for a page, addressed by its route slug segments\n * (`undefined` or `[]` for the index). Returns `null` when no such page exists.\n *\n * The site owns this: it knows where its content directory is.\n *\n * @public\n */\nexport type MdxReader = (slug: readonly string[] | undefined) => Promise<string | null>;\n\n/**\n * Options for {@link mdxToMarkdown}.\n *\n * @public\n */\nexport interface MdxToMarkdownOptions {\n /** Heading used when the source declares no `title` in frontmatter. */\n readonly fallbackTitle?: string;\n /**\n * Named OpenAPI documents, keyed by the document name the generated page\n * references (`document=\"…\"`). When the page's document is present, its\n * operations are rendered in full — auth, parameters, request-body fields,\n * and responses — instead of the bare `METHOD /path` line. When a page\n * names no document and exactly one is supplied, that one is used.\n */\n readonly openApiDocuments?: Readonly<Record<string, OpenApiDocument>>;\n}\n\n/** The two halves of an MDX file: the inner frontmatter text and the body. */\ninterface FrontmatterSplit {\n /** Text between the `---` delimiters, without them. Empty when absent. */\n readonly frontmatter: string;\n readonly body: string;\n}\n\n/**\n * Split a raw MDX source into its frontmatter block and body. The block must\n * open on the very first line and close on a later line holding only `---`\n * (no indentation — an indented `---` inside a block scalar does not close\n * it). A file with no block, or an unterminated one, is all body.\n */\nfunction splitFrontmatter(raw: string): FrontmatterSplit {\n const lines = raw.split('\\n');\n if (!/^---\\s*$/.test(lines[0] ?? '')) {\n return { frontmatter: '', body: raw };\n }\n for (let i = 1; i < lines.length; i++) {\n if (/^---\\s*$/.test(lines[i] ?? '')) {\n return { frontmatter: lines.slice(1, i).join('\\n'), body: lines.slice(i + 1).join('\\n') };\n }\n }\n return { frontmatter: '', body: raw };\n}\n\n/** Strip one matching pair of surrounding quotes, if present. */\nfunction stripQuotes(value: string): string {\n const quote = value[0];\n if ((quote === '\"' || quote === \"'\") && value.length >= 2 && value.endsWith(quote)) {\n return value.slice(1, -1);\n }\n return value;\n}\n\n/**\n * Join block-scalar lines the way YAML folding does: adjacent text lines merge\n * with a space, blank lines become newlines, and more-indented lines keep\n * their line breaks (they are literal in a folded scalar).\n */\nfunction foldLines(lines: readonly string[]): string {\n let out = '';\n let previous: 'start' | 'text' | 'blank' | 'literal' = 'start';\n for (const line of lines) {\n if (line === '') {\n out += '\\n';\n previous = 'blank';\n continue;\n }\n const literal = /^[ \\t]/.test(line);\n if (previous === 'text') {\n out += literal ? '\\n' : ' ';\n } else if (previous === 'literal') {\n out += '\\n';\n }\n out += line;\n previous = literal ? 'literal' : 'text';\n }\n return out;\n}\n\n/**\n * Read a YAML block scalar (`|` literal or `>` folded) that starts on the line\n * after its header. The block is every following line that is blank or\n * indented; its indent is set by the first non-blank line.\n */\nfunction readBlockScalar(\n lines: readonly string[],\n start: number,\n style: '|' | '>',\n): string | undefined {\n const collected: string[] = [];\n for (let i = start; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (line.trim() !== '' && !/^[ \\t]/.test(line)) {\n break;\n }\n collected.push(line);\n }\n const firstText = collected.find((line) => line.trim() !== '');\n if (firstText === undefined) {\n return undefined;\n }\n const indent = firstText.length - firstText.trimStart().length;\n const content = collected.map((line) => (line.trim() === '' ? '' : line.slice(indent)));\n return (style === '|' ? content.join('\\n') : foldLines(content)).trim();\n}\n\n/** Cut a YAML end-of-line comment (` # …`) from an unquoted scalar line. */\nfunction stripLineComment(value: string): string {\n return value.replace(/\\s+#.*$/, '');\n}\n\n/**\n * Extract a top-level string value from the frontmatter block. Handles the\n * shapes YAML writers actually emit for `title`/`description`: plain scalars\n * (end-of-line comments stripped), quoted scalars, plain scalars folded\n * across indented continuation lines, and `|`/`>` block scalars. Chomping and\n * explicit-indent indicators on a block header are tolerated but not\n * honoured — the value is trimmed and the indent comes from the first content\n * line, which matches what generated frontmatter needs. Indented keys nested\n * under another mapping never match.\n */\nfunction frontmatterValue(frontmatter: string, key: string): string | undefined {\n const lines = frontmatter.split('\\n');\n const keyPattern = new RegExp(`^${key}:(.*)$`);\n for (let i = 0; i < lines.length; i++) {\n const match = keyPattern.exec(lines[i] ?? '');\n if (!match) {\n continue;\n }\n const inline = (match[1] ?? '').trim();\n const blockHeader = /^([>|])[0-9+-]*$/.exec(inline);\n if (blockHeader) {\n return readBlockScalar(lines, i + 1, blockHeader[1] as '|' | '>');\n }\n if (inline === '') {\n return undefined;\n }\n const quoted = inline.startsWith('\"') || inline.startsWith(\"'\");\n const parts = [quoted ? inline : stripLineComment(inline)];\n for (let j = i + 1; j < lines.length; j++) {\n const continuation = lines[j] ?? '';\n if (continuation.trim() === '' || !/^[ \\t]/.test(continuation)) {\n break;\n }\n parts.push(quoted ? continuation.trim() : stripLineComment(continuation.trim()));\n }\n return stripQuotes(parts.join(' ')).trim();\n }\n return undefined;\n}\n\n/**\n * A page generated by `fumadocs-openapi` declares an `_openapi` key in its\n * frontmatter. That key is the only reliable marker: matching on body text\n * false-fires on any prose or code sample that mentions the generated layout.\n */\nfunction isGeneratedApiPage(frontmatter: string): boolean {\n return /^_openapi\\s*:/m.test(frontmatter);\n}\n\n/**\n * Strip MDX machinery from a prose body, leaving readable Markdown. Fenced\n * code blocks and inline code spans are preserved verbatim — `<p>` inside\n * backticks is code, not markup. Everything else has its `import`/`export`\n * statements, JSX/HTML tags, and MDX comments removed; a stripped tag that\n * carries a `title` leaves it behind (see {@link keepTagTitle}), so a Step,\n * Card, or Accordion keeps its heading.\n */\nfunction cleanBody(body: string): string {\n const segments = body.split(/(```[\\s\\S]*?```|`[^`\\n]+`)/g);\n const cleaned = segments.map((segment) =>\n segment.startsWith('`')\n ? segment\n : segment\n .replace(/^\\s*(import|export)\\s.*$/gm, '')\n .replace(/\\{\\/\\*[\\s\\S]*?\\*\\/\\}/g, '')\n .replace(/<[A-Za-z][^>]*>/g, keepTagTitle)\n .replace(/<\\/[A-Za-z][^>]*>/g, ''),\n );\n return cleaned\n .join('')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\n/**\n * What a stripped opening tag leaves behind: nothing, unless it carries a\n * `title` attribute — the heading of a Step, Card, or Accordion would vanish\n * with the tag otherwise. A titled tag with an `href` becomes a link.\n */\nfunction keepTagTitle(tag: string): string {\n const title = /\\btitle=\"([^\"]*)\"/.exec(tag)?.[1];\n if (title === undefined || title === '') {\n return '';\n }\n const href = /\\bhref=\"([^\"]*)\"/.exec(tag)?.[1];\n return href === undefined ? `**${title}**` : `[${title}](${href})`;\n}\n\n/**\n * A page generated by `fumadocs-openapi` is a component, not prose. Summarise\n * it from its title, description, and the operations it renders. When the\n * OpenAPI document the page references is supplied, each operation is rendered\n * in full (parameters, request-body fields, responses); otherwise only the\n * `METHOD /path` line is emitted.\n */\nfunction summariseApiPage(\n title: string,\n description: string | undefined,\n body: string,\n documents: Readonly<Record<string, OpenApiDocument>> | undefined,\n): string {\n const opMatch = /operations=\\{(\\[[\\s\\S]*?\\])\\}/.exec(body);\n let ops: { path: string; method: string }[] = [];\n if (opMatch?.[1]) {\n try {\n const parsed: unknown = JSON.parse(opMatch[1]);\n // JSON that parses can still have the wrong shape; keep only real entries.\n ops = (Array.isArray(parsed) ? parsed : []).filter(\n (op): op is { path: string; method: string } =>\n typeof op === 'object' &&\n op !== null &&\n typeof (op as { path?: unknown }).path === 'string' &&\n typeof (op as { method?: unknown }).method === 'string',\n );\n } catch {\n ops = [];\n }\n }\n const documentName = /document=\"([^\"]+)\"/.exec(body)?.[1];\n const onlyName =\n Object.keys(documents ?? {}).length === 1 ? Object.keys(documents ?? {})[0] : undefined;\n const lookupName = documentName ?? onlyName;\n const document = lookupName === undefined ? undefined : documents?.[lookupName];\n const operationSections = ops.map((op) => {\n const endpoint = `\\`${op.method.toUpperCase()} ${op.path}\\``;\n const detail = document === undefined ? null : openApiOperationToMarkdown(document, op);\n return detail === null ? endpoint : `${endpoint}\\n\\n${detail}`;\n });\n return `${[`# ${title}`, description ?? '', ...operationSections].filter(Boolean).join('\\n\\n')}\\n`;\n}\n\n/**\n * Convert a raw MDX source into clean, LLM-friendly Markdown.\n *\n * Guide pages return their prose (frontmatter title + description prepended,\n * JSX stripped, code fences intact). Generated OpenAPI pages return a compact\n * summary of the endpoint. Returns `null` for empty input.\n *\n * @param raw - the MDX file source\n * @param options - optional fallback title\n * @returns the Markdown rendering, or `null` when `raw` is empty\n * @public\n */\nexport function mdxToMarkdown(raw: string, options: MdxToMarkdownOptions = {}): string | null {\n if (raw.trim() === '') {\n return null;\n }\n\n const { frontmatter, body } = splitFrontmatter(raw);\n const title = frontmatterValue(frontmatter, 'title') ?? options.fallbackTitle ?? 'Untitled';\n const description = frontmatterValue(frontmatter, 'description');\n const trimmedBody = body.trim();\n\n if (isGeneratedApiPage(frontmatter)) {\n return summariseApiPage(title, description, trimmedBody, options.openApiDocuments);\n }\n\n return `# ${title}\\n\\n${description ? `${description}\\n\\n` : ''}${cleanBody(trimmedBody)}\\n`;\n}\n\n/**\n * A Markdown route ready to re-export from a framework route file.\n *\n * @public\n */\nexport interface MarkdownRoute {\n readonly GET: (\n request: Request,\n context: { params: Promise<{ slug?: string[] }> },\n ) => Promise<Response>;\n}\n\n/**\n * Options for {@link createMarkdownRoute}.\n *\n * @public\n */\nexport interface CreateMarkdownRouteOptions {\n /** Reads the raw MDX for a page slug. Supplied by the site. */\n readonly read: MdxReader;\n /**\n * Loads the site's named OpenAPI documents so generated API pages render\n * their operations in full. Called per request — cache inside the loader\n * when the document is expensive to build.\n */\n readonly loadOpenApiDocuments?: () =>\n Readonly<Record<string, OpenApiDocument>> | Promise<Readonly<Record<string, OpenApiDocument>>>;\n /**\n * Loads a generated API page's original operation source: the spec file\n * path, the method and route, and the file's raw contents. When it returns\n * one, the page's Markdown is the operation spec in full under an\n * `## OpenAPI` heading, the shape agents get from the major docs platforms;\n * pages it returns `null` for fall through to the MDX conversion. Wire it\n * from the generator's `api-sources.json`.\n */\n readonly loadOperationSource?: (\n slug: readonly string[] | undefined,\n ) => Promise<OperationSource | null>;\n /**\n * The site's documentation index path (`/llms.txt`). When set, every\n * response opens with a blockquote pointing agents at it, on the origin the\n * request came in on — correct on localhost, a preview deploy, and\n * production alike.\n */\n readonly llmsTxtPath?: string;\n}\n\n/**\n * A generated API page's original operation source, as\n * {@link CreateMarkdownRouteOptions.loadOperationSource} returns it.\n *\n * @public\n */\nexport interface OperationSource {\n /** The spec file, relative to the content directory. */\n readonly file: string;\n /** The operation's HTTP method. */\n readonly method: string;\n /** The operation's API route. */\n readonly route: string;\n /** The spec file's raw contents. */\n readonly source: string;\n}\n\n/** The `# title` and `> description` head of an operation's Markdown. */\nfunction operationHead(operation: OperationSource): string {\n let title: string | undefined;\n let description: string | undefined;\n try {\n const parsed = JSON.parse(operation.source) as {\n info?: { title?: string; description?: string };\n paths?: Record<string, Record<string, { summary?: string; description?: string }>>;\n };\n const exact = parsed.paths?.[operation.route]?.[operation.method.toLowerCase()];\n const first = Object.values(parsed.paths ?? {}).flatMap((item) => Object.values(item))[0];\n const named = exact ?? first;\n title = named?.summary ?? parsed.info?.title;\n description = named?.description ?? parsed.info?.description;\n } catch {\n // A file that does not parse still ships verbatim below.\n }\n const head = [`# ${title ?? 'API operation'}`];\n if (description !== undefined && description !== '') {\n head.push('', `> ${description.replace(/\\n/g, '\\n> ')}`);\n }\n return head.join('\\n');\n}\n\n/** A fence longer than any backtick run in the body it wraps (four or more). */\nfunction fenceFor(source: string): string {\n const longest = source.match(/`+/g)?.reduce((max, run) => Math.max(max, run.length), 0) ?? 0;\n return '`'.repeat(Math.max(4, longest + 1));\n}\n\n/**\n * Build a drop-in route that serves a page as plain Markdown. It reads the raw\n * MDX for the requested slug, converts it with {@link mdxToMarkdown}, and\n * returns `text/plain` (or `404` when the page does not exist).\n *\n * @example\n * ```ts\n * // app/md/[[...slug]]/route.ts\n * export const { GET } = createMarkdownRoute({ read: readDocMdx });\n * ```\n *\n * @param options - the content reader\n * @returns the route's `GET` handler\n * @public\n */\nexport function createMarkdownRoute(options: CreateMarkdownRouteOptions): MarkdownRoute {\n const requestOrigin = (request: Request): string => {\n const url = new URL(request.url);\n const proto = request.headers.get('x-forwarded-proto') ?? url.protocol.replace(/:$/, '');\n const host = request.headers.get('x-forwarded-host') ?? request.headers.get('host') ?? url.host;\n return `${proto}://${host}`;\n };\n const respond = (request: Request, markdown: string) => {\n const preamble =\n options.llmsTxtPath === undefined\n ? ''\n : [\n '> ## Documentation Index',\n `> Fetch the complete documentation index at: ${requestOrigin(request)}${options.llmsTxtPath}`,\n '> Use this file to discover all available pages before exploring further.',\n '',\n '',\n ].join('\\n');\n return new Response(`${preamble}${markdown}`, {\n headers: { 'content-type': 'text/plain; charset=utf-8' },\n });\n };\n return {\n async GET(request, context) {\n const { slug } = await context.params;\n const operation = await options.loadOperationSource?.(slug);\n if (operation) {\n const fence = fenceFor(operation.source);\n return respond(\n request,\n [\n operationHead(operation),\n '',\n '## OpenAPI',\n '',\n `${fence}json ${operation.file} ${operation.method.toLowerCase()} ${operation.route}`,\n operation.source.trimEnd(),\n fence,\n '',\n ].join('\\n'),\n );\n }\n const raw = await options.read(slug);\n if (raw === null) {\n return new Response('Not found', { status: 404 });\n }\n const fallbackTitle = slug?.at(-1);\n const openApiDocuments = await options.loadOpenApiDocuments?.();\n const markdown = mdxToMarkdown(raw, {\n ...(fallbackTitle === undefined ? {} : { fallbackTitle }),\n ...(openApiDocuments === undefined ? {} : { openApiDocuments }),\n });\n if (markdown === null) {\n return new Response('Not found', { status: 404 });\n }\n return respond(request, markdown);\n },\n };\n}\n\n/**\n * Options for {@link markdownRewriteTarget}.\n *\n * @public\n */\nexport interface MarkdownRewriteOptions {\n /** The docs base URL. Default `/docs`. */\n readonly baseUrl?: string;\n /** Where the Markdown route is mounted. Default `/md`. */\n readonly markdownBase?: string;\n}\n\n/**\n * The internal URL serving a docs page's Markdown, for a request whose path is\n * the page URL plus `.md` — the convention agents and other tools expect\n * (`/docs/guides/webhooks.md`). Returns `null` for every other request. A\n * site's middleware rewrites to the returned URL:\n *\n * @example\n * ```ts\n * const markdown = markdownRewriteTarget(request.nextUrl);\n * if (markdown) {\n * return NextResponse.rewrite(markdown);\n * }\n * ```\n *\n * @param url - the request URL\n * @param options - the docs base and the Markdown route's mount point\n * @returns the rewrite target, or `null` when the request is not a `.md` path\n * @public\n */\nexport function markdownRewriteTarget(url: URL, options: MarkdownRewriteOptions = {}): URL | null {\n const baseUrl = (options.baseUrl ?? '/docs').replace(/\\/+$/, '');\n const markdownBase = (options.markdownBase ?? '/md').replace(/\\/+$/, '');\n const { pathname } = url;\n // The slug reaches the site's file reader: refuse anything percent-encoded\n // (an encoded slash survives into the slug) and any empty segment.\n if (!pathname.endsWith('.md') || pathname.includes('%')) {\n return null;\n }\n const page = pathname.slice(0, -3);\n if (page !== baseUrl && !page.startsWith(`${baseUrl}/`)) {\n return null;\n }\n if (page.endsWith('/') || page.includes('//')) {\n return null;\n }\n const target = new URL(url);\n target.pathname = `${markdownBase}${page.slice(baseUrl.length)}`;\n return target;\n}\n\n/**\n * Whether a request addresses the Markdown route's internal mount directly.\n * The route exists as the rewrite target for the page-URL-plus-`.md`\n * convention; a direct request to it gets `404` from the site's middleware,\n * so every page's Markdown has one public address.\n *\n * @example\n * ```ts\n * if (isMarkdownRouteRequest(request.nextUrl)) {\n * return new NextResponse('Not found', { status: 404 });\n * }\n * ```\n *\n * @param url - the request URL\n * @param options - the Markdown route's mount point\n * @returns whether the request must be refused\n * @public\n */\nexport function isMarkdownRouteRequest(\n url: URL,\n options: Pick<MarkdownRewriteOptions, 'markdownBase'> = {},\n): boolean {\n const markdownBase = options.markdownBase ?? '/md';\n return url.pathname === markdownBase || url.pathname.startsWith(`${markdownBase}/`);\n}\n","/**\n * Allowed-domain checks.\n *\n * @packageDocumentation\n */\n\n/**\n * Return whether an email address belongs to one of the allowed domains.\n * Matching is case-insensitive and exact on the domain part.\n *\n * @param email - the email address to test\n * @param allowedDomains - permitted domains, e.g. `['blaaiz.com']`\n * @public\n */\nexport function isAllowedEmail(email: string, allowedDomains: readonly string[]): boolean {\n const at = email.lastIndexOf('@');\n if (at < 1 || at === email.length - 1) {\n return false;\n }\n const domain = email.slice(at + 1).toLowerCase();\n return allowedDomains.some((allowed) => allowed.toLowerCase() === domain);\n}\n","/**\n * Signed session tokens.\n *\n * A session is a small JSON payload (the verified email and an expiry) encoded\n * and signed with HMAC-SHA256 via the Web Crypto API — so it works in Node, in\n * an edge runtime, and in a Next.js middleware without any Node-only imports.\n * The secret never leaves the server; the browser only holds the signed token.\n *\n * @packageDocumentation\n */\n\n/** The name of the session cookie. @public */\nexport const SESSION_COOKIE = 'docs_session';\n\n/**\n * The decoded session payload.\n *\n * @public\n */\nexport interface SessionPayload {\n /** The verified email address. */\n readonly email: string;\n /** Expiry, as a Unix time in seconds. */\n readonly exp: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nfunction base64UrlDecode(value: string): Uint8Array<ArrayBuffer> {\n const normalized = value.replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nasync function hmacKey(secret: string): Promise<CryptoKey> {\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify'],\n );\n}\n\n/**\n * Sign a session payload into a `data.signature` token.\n *\n * @public\n */\nexport async function signSession(payload: SessionPayload, secret: string): Promise<string> {\n const data = base64UrlEncode(encoder.encode(JSON.stringify(payload)));\n const key = await hmacKey(secret);\n const signature = new Uint8Array(await crypto.subtle.sign('HMAC', key, encoder.encode(data)));\n return `${data}.${base64UrlEncode(signature)}`;\n}\n\n/**\n * Verify a session token and return its payload, or `null` when the signature\n * is invalid or the session has expired.\n *\n * @param token - the signed token\n * @param secret - the signing secret\n * @param nowSeconds - current Unix time; defaults to the real clock\n * @public\n */\nexport async function verifySession(\n token: string,\n secret: string,\n nowSeconds: number = Math.floor(Date.now() / 1000),\n): Promise<SessionPayload | null> {\n const dot = token.indexOf('.');\n if (dot <= 0) {\n return null;\n }\n const data = token.slice(0, dot);\n const signature = token.slice(dot + 1);\n\n const key = await hmacKey(secret);\n let valid: boolean;\n try {\n valid = await crypto.subtle.verify(\n 'HMAC',\n key,\n base64UrlDecode(signature),\n encoder.encode(data),\n );\n } catch {\n return null;\n }\n if (!valid) {\n return null;\n }\n\n let payload: SessionPayload;\n try {\n payload = JSON.parse(decoder.decode(base64UrlDecode(data))) as SessionPayload;\n } catch {\n return null;\n }\n if (typeof payload.email !== 'string' || typeof payload.exp !== 'number') {\n return null;\n }\n if (payload.exp < nowSeconds) {\n return null;\n }\n return payload;\n}\n\n/**\n * Read a cookie value from a `Cookie` header string.\n *\n * @public\n */\nexport function readCookie(cookieHeader: string | null, name: string): string | null {\n if (cookieHeader === null) {\n return null;\n }\n for (const part of cookieHeader.split(';')) {\n const [key, ...rest] = part.trim().split('=');\n if (key === name) {\n return rest.join('=');\n }\n }\n return null;\n}\n\n/**\n * Build a `Set-Cookie` header value carrying the session token.\n *\n * @public\n */\nexport function buildSessionCookie(\n token: string,\n options: { maxAgeSeconds: number; secure?: boolean },\n): string {\n const flags = ['Path=/', 'HttpOnly', 'SameSite=Lax', `Max-Age=${String(options.maxAgeSeconds)}`];\n if (options.secure !== false) {\n flags.push('Secure');\n }\n return `${SESSION_COOKIE}=${token}; ${flags.join('; ')}`;\n}\n\n/**\n * Build a `Set-Cookie` header value that clears the session.\n *\n * @public\n */\nexport function clearSessionCookie(options: { secure?: boolean } = {}): string {\n const flags = ['Path=/', 'HttpOnly', 'SameSite=Lax', 'Max-Age=0'];\n if (options.secure !== false) {\n flags.push('Secure');\n }\n return `${SESSION_COOKIE}=; ${flags.join('; ')}`;\n}\n","/**\n * The email identity provider.\n *\n * The simplest provider: a form posts an email; if it belongs to an allowed\n * domain, a session is issued. It needs no external credentials, so it is ideal\n * for local development and for organizations that gate by email domain alone.\n *\n * @packageDocumentation\n */\n\nimport { isAllowedEmail } from './domains.js';\nimport { buildSessionCookie, signSession } from './session.js';\n\nconst DEFAULT_TTL_SECONDS = 8 * 60 * 60;\n\n/**\n * Options for {@link createEmailSignIn}.\n *\n * @public\n */\nexport interface EmailSignInOptions {\n readonly secret: string;\n readonly allowedDomains: readonly string[];\n /** Session lifetime in seconds. Default 8 hours. */\n readonly ttlSeconds?: number;\n /** Set the `Secure` cookie flag. Default `true`. */\n readonly secureCookies?: boolean;\n /** Fallback redirect after sign-in when no `from` is supplied. Default `/`. */\n readonly defaultRedirect?: string;\n /**\n * Where a browser (form) submission with a disallowed domain is sent back to,\n * carrying `?error=forbidden`. Default `/signin`. JSON clients still get a\n * `403` instead of a redirect.\n */\n readonly signInPath?: string;\n}\n\nasync function readEmailAndFrom(request: Request): Promise<{ email: string; from: string | null }> {\n const contentType = request.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n const body = (await request.json()) as Record<string, unknown>;\n return {\n email: typeof body['email'] === 'string' ? body['email'] : '',\n from: typeof body['from'] === 'string' ? body['from'] : null,\n };\n }\n const form = await request.formData();\n const email = form.get('email');\n const from = form.get('from');\n return {\n email: typeof email === 'string' ? email : '',\n from: typeof from === 'string' ? from : null,\n };\n}\n\nfunction safeRedirectPath(from: string | null, fallback: string): string {\n // Only allow same-site absolute paths, never an open redirect.\n if (from !== null && from.startsWith('/') && !from.startsWith('//')) {\n return from;\n }\n return fallback;\n}\n\n/**\n * Build the email sign-in POST handler.\n *\n * @param options - secret, allowed domains, and session settings\n * @returns a request handler that issues a session; a browser submission with a\n * disallowed domain is redirected back to the sign-in page with\n * `?error=forbidden`, while a JSON request gets a `403`\n * @public\n */\nexport function createEmailSignIn(\n options: EmailSignInOptions,\n): (request: Request) => Promise<Response> {\n const ttl = options.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n const fallback = options.defaultRedirect ?? '/';\n const signInPath = options.signInPath ?? '/signin';\n\n return async function handle(request: Request): Promise<Response> {\n const isJson = (request.headers.get('content-type') ?? '').includes('application/json');\n const { email, from } = await readEmailAndFrom(request);\n\n if (!isAllowedEmail(email, options.allowedDomains)) {\n if (isJson) {\n return new Response(JSON.stringify({ error: 'This email domain is not allowed.' }), {\n status: 403,\n headers: { 'content-type': 'application/json' },\n });\n }\n // Browser: bounce back to the sign-in page with an inline error, keeping\n // the return path so the reader can retry without losing their place.\n const params = new URLSearchParams({ error: 'forbidden' });\n const safeFrom = safeRedirectPath(from, '');\n if (safeFrom) {\n params.set('from', safeFrom);\n }\n return new Response(null, {\n status: 303,\n headers: { location: `${signInPath}?${params.toString()}` },\n });\n }\n\n const exp = Math.floor(Date.now() / 1000) + ttl;\n const token = await signSession({ email, exp }, options.secret);\n const cookie = buildSessionCookie(token, {\n maxAgeSeconds: ttl,\n ...(options.secureCookies !== undefined ? { secure: options.secureCookies } : {}),\n });\n\n const target = safeRedirectPath(from, fallback);\n return new Response(null, {\n status: 303,\n headers: { location: target, 'set-cookie': cookie },\n });\n };\n}\n","/**\n * The Google OAuth identity provider.\n *\n * Implements the OAuth 2.0 authorization-code flow against Google, restricted\n * to the allowed email domains. Credentials are passed in by the caller (which\n * reads them from environment variables named in config), never hard-coded.\n *\n * @packageDocumentation\n */\n\nimport type { FetchLike } from '../proxy.js';\nimport { isAllowedEmail } from './domains.js';\nimport { buildSessionCookie, signSession } from './session.js';\n\nconst AUTHORIZE_URL = 'https://accounts.google.com/o/oauth2/v2/auth';\nconst TOKEN_URL = 'https://oauth2.googleapis.com/token';\nconst STATE_COOKIE = 'docs_oauth_state';\nconst FROM_COOKIE = 'docs_oauth_from';\nconst DEFAULT_TTL_SECONDS = 8 * 60 * 60;\n\n/**\n * Options for {@link createGoogleAuth}. `clientId` and `clientSecret` come from\n * the environment; the config only names the variables.\n *\n * @public\n */\nexport interface GoogleAuthOptions {\n readonly clientId: string;\n readonly clientSecret: string;\n /** The full callback URL registered with Google. */\n readonly redirectUri: string;\n /** The session-signing secret. */\n readonly secret: string;\n readonly allowedDomains: readonly string[];\n readonly ttlSeconds?: number;\n readonly secureCookies?: boolean;\n readonly defaultRedirect?: string;\n /**\n * Where a failed callback (bad state, token error, disallowed account) is\n * sent, carrying an `?error=` code. Default `/signin`.\n */\n readonly signInPath?: string;\n /** Fetch implementation for the token exchange (injectable for tests). */\n readonly fetch?: FetchLike;\n}\n\n/**\n * The two Google OAuth route handlers.\n *\n * @public\n */\nexport interface GoogleAuthHandlers {\n /** Redirects the browser to Google's consent screen. */\n readonly start: (request: Request) => Response;\n /** Handles Google's redirect back, issues a session, and redirects on. */\n readonly callback: (request: Request) => Promise<Response>;\n}\n\nfunction cookie(name: string, value: string, secure: boolean, maxAge: number): string {\n const flags = ['Path=/', 'HttpOnly', 'SameSite=Lax', `Max-Age=${String(maxAge)}`];\n if (secure) {\n flags.push('Secure');\n }\n return `${name}=${value}; ${flags.join('; ')}`;\n}\n\nfunction readCookie(header: string | null, name: string): string | null {\n if (header === null) {\n return null;\n }\n for (const part of header.split(';')) {\n const [key, ...rest] = part.trim().split('=');\n if (key === name) {\n return rest.join('=');\n }\n }\n return null;\n}\n\nfunction safeRedirectPath(from: string | null, fallback: string): string {\n if (from !== null && from.startsWith('/') && !from.startsWith('//')) {\n return from;\n }\n return fallback;\n}\n\nfunction decodeIdTokenEmail(idToken: string): string | null {\n const parts = idToken.split('.');\n if (parts.length < 2 || parts[1] === undefined) {\n return null;\n }\n try {\n const normalized = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');\n const claims = JSON.parse(atob(padded)) as { email?: unknown };\n return typeof claims.email === 'string' ? claims.email : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Build the Google OAuth handlers.\n *\n * @param options - client credentials, callback URL, and session settings\n * @returns the `start` and `callback` route handlers\n * @public\n */\nexport function createGoogleAuth(options: GoogleAuthOptions): GoogleAuthHandlers {\n const ttl = options.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n const secure = options.secureCookies !== false;\n const fallback = options.defaultRedirect ?? '/';\n const signInPath = options.signInPath ?? '/signin';\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n\n // A failed callback goes back to the sign-in page with an inline error, not a\n // dead-end plain-text response. State cookies are cleared on the way out.\n function bounce(code: string, from: string | null): Response {\n const params = new URLSearchParams({ error: code });\n const safeFrom = safeRedirectPath(from, '');\n if (safeFrom) {\n params.set('from', safeFrom);\n }\n const headers = new Headers({ location: `${signInPath}?${params.toString()}` });\n headers.append('set-cookie', cookie(STATE_COOKIE, '', secure, 0));\n headers.append('set-cookie', cookie(FROM_COOKIE, '', secure, 0));\n return new Response(null, { status: 303, headers });\n }\n\n function start(request: Request): Response {\n const url = new URL(request.url);\n const from = url.searchParams.get('from');\n const state = crypto.randomUUID();\n\n const authorize = new URL(AUTHORIZE_URL);\n authorize.searchParams.set('client_id', options.clientId);\n authorize.searchParams.set('redirect_uri', options.redirectUri);\n authorize.searchParams.set('response_type', 'code');\n authorize.searchParams.set('scope', 'openid email');\n authorize.searchParams.set('state', state);\n // Always show Google's account picker. Without it, Google silently uses\n // the browser's active account; someone whose active account is outside\n // the workspace would be bounced with no way to switch.\n authorize.searchParams.set('prompt', 'select_account');\n if (options.allowedDomains.length === 1 && options.allowedDomains[0] !== undefined) {\n authorize.searchParams.set('hd', options.allowedDomains[0]);\n }\n\n const headers = new Headers({ location: authorize.toString() });\n headers.append('set-cookie', cookie(STATE_COOKIE, state, secure, 600));\n headers.append('set-cookie', cookie(FROM_COOKIE, from ?? fallback, secure, 600));\n return new Response(null, { status: 302, headers });\n }\n\n async function callback(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const code = url.searchParams.get('code');\n const returnedState = url.searchParams.get('state');\n const cookieHeader = request.headers.get('cookie');\n const expectedState = readCookie(cookieHeader, STATE_COOKIE);\n\n if (\n code === null ||\n returnedState === null ||\n expectedState === null ||\n returnedState !== expectedState\n ) {\n return bounce('state', readCookie(cookieHeader, FROM_COOKIE));\n }\n\n const tokenResponse = await doFetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: options.clientId,\n client_secret: options.clientSecret,\n code,\n grant_type: 'authorization_code',\n redirect_uri: options.redirectUri,\n }).toString(),\n });\n if (!tokenResponse.ok) {\n return bounce('oauth', readCookie(cookieHeader, FROM_COOKIE));\n }\n const tokens = (await tokenResponse.json()) as { id_token?: unknown };\n const email = typeof tokens.id_token === 'string' ? decodeIdTokenEmail(tokens.id_token) : null;\n\n if (email === null || !isAllowedEmail(email, options.allowedDomains)) {\n return bounce('forbidden', readCookie(cookieHeader, FROM_COOKIE));\n }\n\n const exp = Math.floor(Date.now() / 1000) + ttl;\n const token = await signSession({ email, exp }, options.secret);\n const target = safeRedirectPath(readCookie(cookieHeader, FROM_COOKIE), fallback);\n\n const headers = new Headers({ location: target });\n headers.append('set-cookie', buildSessionCookie(token, { maxAgeSeconds: ttl, secure }));\n headers.append('set-cookie', cookie(STATE_COOKIE, '', secure, 0));\n headers.append('set-cookie', cookie(FROM_COOKIE, '', secure, 0));\n return new Response(null, { status: 303, headers });\n }\n\n return { start, callback };\n}\n","/**\n * The auth gate — the enforcement half of authentication.\n *\n * Given a request, it decides: is there a valid session for an allowed email?\n * If so the request passes (`null`); otherwise it returns a redirect to the\n * sign-in page. The gate is identity-provider-agnostic — it does not care how\n * the session was established, only that it is valid.\n *\n * @packageDocumentation\n */\n\nimport { isAllowedEmail } from './domains.js';\nimport { SESSION_COOKIE, readCookie, verifySession } from './session.js';\n\n/**\n * Options for {@link createAuthGate}.\n *\n * @public\n */\nexport interface AuthGateOptions {\n /** The session-signing secret. */\n readonly secret: string;\n /** Email domains permitted access. */\n readonly allowedDomains: readonly string[];\n /** Where to send unauthenticated requests. Default `/signin`. */\n readonly signInPath?: string;\n /** Extra path prefixes that never require a session. */\n readonly publicPaths?: readonly string[];\n}\n\nconst ALWAYS_PUBLIC = ['/_next/', '/favicon', '/api/auth/'];\n\n/**\n * Build an auth gate for a Next.js middleware (or any Fetch runtime).\n *\n * @param options - secret, allowed domains, and sign-in path\n * @returns a function returning `null` to allow, or a redirect `Response` to block\n * @public\n */\nexport function createAuthGate(\n options: AuthGateOptions,\n): (request: Request) => Promise<Response | null> {\n const signInPath = options.signInPath ?? '/signin';\n const publicPaths = [...ALWAYS_PUBLIC, ...(options.publicPaths ?? [])];\n\n return async function gate(request: Request): Promise<Response | null> {\n const url = new URL(request.url);\n const path = url.pathname;\n\n if (path === signInPath || publicPaths.some((prefix) => path.startsWith(prefix))) {\n return null;\n }\n\n const token = readCookie(request.headers.get('cookie'), SESSION_COOKIE);\n if (token !== null) {\n const session = await verifySession(token, options.secret);\n if (session !== null && isAllowedEmail(session.email, options.allowedDomains)) {\n return null;\n }\n }\n\n const redirectUrl = new URL(signInPath, url.origin);\n redirectUrl.searchParams.set('from', path);\n return Response.redirect(redirectUrl.toString(), 302);\n };\n}\n","/**\n * The shared-secret identity provider.\n *\n * A two-step gate: an allowed-domain email, then one site-wide secret. Security\n * lives entirely in the second step — the domain is re-checked and the secret\n * compared in constant time — so the first step is only progressive disclosure\n * and cannot be used to bypass anything. No client JavaScript: each step is a\n * native form POST, the way an email → password flow works.\n *\n * @packageDocumentation\n */\n\nimport { isAllowedEmail } from './domains.js';\nimport { buildSessionCookie, readCookie, signSession } from './session.js';\n\nconst DEFAULT_TTL_SECONDS = 8 * 60 * 60;\nconst DEFAULT_PENDING_TTL_SECONDS = 15 * 60;\n\n/** Cookie carrying the domain-checked email between step one and step two. */\nconst PENDING_COOKIE = 'docs_secret_email';\n\n/**\n * Options for {@link createSecretSignIn}.\n *\n * @public\n */\nexport interface SecretSignInOptions {\n /** The session-signing secret (HMAC key), as for the other providers. */\n readonly secret: string;\n /** The shared access secret a reader must supply. Resolved from the env. */\n readonly accessSecret: string;\n readonly allowedDomains: readonly string[];\n /** Session lifetime in seconds. Default 8 hours. */\n readonly ttlSeconds?: number;\n /** Set the `Secure` cookie flag. Default `true`. */\n readonly secureCookies?: boolean;\n /** Fallback redirect after sign-in when no `from` is supplied. Default `/`. */\n readonly defaultRedirect?: string;\n /** The sign-in page path, where each step and any error is shown. Default `/signin`. */\n readonly signInPath?: string;\n /** How long the between-steps email cookie lives. Default 15 minutes. */\n readonly pendingTtlSeconds?: number;\n}\n\n/**\n * Constant-time string comparison. The length difference is folded into the\n * accumulator so a wrong secret takes the same work regardless of where it\n * first differs — no early exit for an attacker to time.\n */\nfunction timingSafeEqual(a: string, b: string): boolean {\n const encoder = new TextEncoder();\n const ea = encoder.encode(a);\n const eb = encoder.encode(b);\n let diff = ea.length ^ eb.length;\n const len = Math.max(ea.length, eb.length);\n for (let i = 0; i < len; i += 1) {\n diff |= (ea[i] ?? 0) ^ (eb[i] ?? 0);\n }\n return diff === 0;\n}\n\nfunction safeRedirectPath(from: string | null, fallback: string): string {\n if (from !== null && from.startsWith('/') && !from.startsWith('//')) {\n return from;\n }\n return fallback;\n}\n\nasync function readForm(\n request: Request,\n): Promise<{ email: string; secret: string | null; from: string | null }> {\n const contentType = request.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n const body = (await request.json()) as Record<string, unknown>;\n return {\n email: typeof body['email'] === 'string' ? body['email'] : '',\n secret: typeof body['secret'] === 'string' ? body['secret'] : null,\n from: typeof body['from'] === 'string' ? body['from'] : null,\n };\n }\n const form = await request.formData();\n const email = form.get('email');\n const secret = form.get('secret');\n const from = form.get('from');\n return {\n email: typeof email === 'string' ? email : '',\n secret: typeof secret === 'string' ? secret : null,\n from: typeof from === 'string' ? from : null,\n };\n}\n\n/** Build the query string for a sign-in redirect, dropping empty values. */\nfunction signInQuery(parts: Record<string, string | undefined>): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(parts)) {\n if (value) {\n params.set(key, value);\n }\n }\n const query = params.toString();\n return query ? `?${query}` : '';\n}\n\nfunction pendingCookie(email: string, secure: boolean, maxAge: number): string {\n const flags = ['Path=/', 'HttpOnly', 'SameSite=Lax', `Max-Age=${String(maxAge)}`];\n if (secure) {\n flags.push('Secure');\n }\n return `${PENDING_COOKIE}=${encodeURIComponent(email)}; ${flags.join('; ')}`;\n}\n\nfunction clearPendingCookie(secure: boolean): string {\n return pendingCookie('', secure, 0);\n}\n\n/**\n * Build the shared-secret sign-in POST handler. It serves both steps of the\n * flow, told apart by whether the request carries a `secret` field:\n *\n * - **Email step** (no `secret`): validate the domain. On success, remember the\n * email in a short-lived cookie and advance to the secret step; on failure,\n * bounce back with `?error=forbidden`.\n * - **Secret step** (`secret` present): read the remembered email, re-check its\n * domain, and compare the secret in constant time. On success, issue the\n * session; on failure, stay on the secret step with `?error=badsecret`.\n *\n * @param options - the two secrets, allowed domains, and session settings\n * @returns a request handler for `/api/auth/secret`\n * @public\n */\nexport function createSecretSignIn(\n options: SecretSignInOptions,\n): (request: Request) => Promise<Response> {\n const ttl = options.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n const pendingTtl = options.pendingTtlSeconds ?? DEFAULT_PENDING_TTL_SECONDS;\n const secure = options.secureCookies !== false;\n const fallback = options.defaultRedirect ?? '/';\n const signInPath = options.signInPath ?? '/signin';\n\n return async function handle(request: Request): Promise<Response> {\n const { email, secret, from } = await readForm(request);\n const safeFrom = safeRedirectPath(from, '') || undefined;\n\n // Step one: no secret yet — validate the email domain and advance.\n if (secret === null) {\n if (!isAllowedEmail(email, options.allowedDomains)) {\n return new Response(null, {\n status: 303,\n headers: {\n location: `${signInPath}${signInQuery({ error: 'forbidden', from: safeFrom })}`,\n },\n });\n }\n const headers = new Headers({\n location: `${signInPath}${signInQuery({ step: 'secret', from: safeFrom })}`,\n });\n headers.append('set-cookie', pendingCookie(email, secure, pendingTtl));\n return new Response(null, { status: 303, headers });\n }\n\n // Step two: recover the domain-checked email; without it, restart.\n const pending = readCookie(request.headers.get('cookie'), PENDING_COOKIE);\n const pendingEmail = pending ? decodeURIComponent(pending) : '';\n if (!isAllowedEmail(pendingEmail, options.allowedDomains)) {\n return new Response(null, {\n status: 303,\n headers: { location: `${signInPath}${signInQuery({ from: safeFrom })}` },\n });\n }\n\n // The secret must be configured and match, compared in constant time.\n if (options.accessSecret === '' || !timingSafeEqual(secret, options.accessSecret)) {\n return new Response(null, {\n status: 303,\n headers: {\n location: `${signInPath}${signInQuery({ step: 'secret', error: 'badsecret', from: safeFrom })}`,\n },\n });\n }\n\n const exp = Math.floor(Date.now() / 1000) + ttl;\n const token = await signSession({ email: pendingEmail, exp }, options.secret);\n const headers = new Headers({ location: safeRedirectPath(from, fallback) });\n headers.append('set-cookie', buildSessionCookie(token, { maxAgeSeconds: ttl, secure }));\n headers.append('set-cookie', clearPendingCookie(secure));\n return new Response(null, { status: 303, headers });\n };\n}\n","/**\n * Sign-out handler.\n *\n * @packageDocumentation\n */\n\nimport { clearSessionCookie } from './session.js';\n\n/**\n * Options for {@link createSignOut}.\n *\n * @public\n */\nexport interface SignOutOptions {\n readonly secureCookies?: boolean;\n /** Where to send the browser after signing out. Default `/signin`. */\n readonly redirectTo?: string;\n}\n\n/**\n * Build a sign-out handler that clears the session cookie and redirects.\n *\n * @public\n */\nexport function createSignOut(options: SignOutOptions = {}): () => Response {\n return function handle(): Response {\n return new Response(null, {\n status: 303,\n headers: {\n location: options.redirectTo ?? '/signin',\n 'set-cookie': clearSessionCookie(\n options.secureCookies !== undefined ? { secure: options.secureCookies } : {},\n ),\n },\n });\n };\n}\n","/**\n * The whole of a site's auth, assembled from `docs.config.ts`.\n *\n * A site mounts the same five files whatever its access mode — middleware,\n * the sign-in page, and the provider routes — and `createSiteAuth` decides\n * what they do. On a public site the gate passes everything and the handlers\n * answer `501`, so the files cost nothing; switching to workspace mode is a\n * config edit and two environment variables, never new files.\n *\n * @packageDocumentation\n */\n\nimport type { DocsConfig, WorkspaceAuthConfig } from '../config.js';\nimport { DocsConfigError } from '../config.js';\n\nimport { createAuthGate } from './gate.js';\nimport { createEmailSignIn } from './email-provider.js';\nimport { type GoogleAuthHandlers, createGoogleAuth } from './google-provider.js';\nimport { createSecretSignIn } from './secret-provider.js';\nimport { createSignOut } from './signout.js';\n\n/**\n * Options for {@link createSiteAuth}.\n *\n * @public\n */\nexport interface SiteAuthOptions {\n /**\n * Path prefixes the gate never blocks, besides the built-in ones. Defaults\n * to `['/api/proxy']`: the try-it proxy is allow-list-bounded and injects\n * no secrets, so it needs no session.\n */\n readonly publicPaths?: readonly string[];\n /** Reads an environment variable. Defaults to `process.env`. */\n readonly env?: (name: string) => string | undefined;\n}\n\n/**\n * Everything a site's auth files mount, in both access modes.\n *\n * @public\n */\nexport interface SiteAuth {\n /** Whether the site is in workspace mode. */\n readonly enabled: boolean;\n /** Where the gate sends blocked requests. */\n readonly signInPath: string;\n /** Whether the shared-secret form should be offered. */\n readonly secretEnabled: boolean;\n /** Whether the Google button should be offered. */\n readonly googleEnabled: boolean;\n /** `null` to allow a request, a redirect `Response` to block it. */\n readonly gate: (request: Request) => Promise<Response | null>;\n /** The email provider's endpoint. `501` when not offered. */\n readonly emailSignIn: (request: Request) => Promise<Response>;\n /** The shared-secret provider's endpoint. `501` when not offered. */\n readonly secretSignIn: (request: Request) => Promise<Response>;\n /** The Google OAuth endpoints. `501` when not offered. */\n readonly google: {\n readonly start: (request: Request) => Response;\n readonly callback: (request: Request) => Promise<Response>;\n };\n /** Clears the session and redirects to the sign-in path. */\n readonly signOut: () => Response;\n}\n\nconst notConfigured = () =>\n new Response('This sign-in method is not configured for this site.', { status: 501 });\n\nconst PUBLIC_SITE: Omit<SiteAuth, 'gate' | 'signOut'> = {\n enabled: false,\n signInPath: '/signin',\n secretEnabled: false,\n googleEnabled: false,\n emailSignIn: () => Promise.resolve(notConfigured()),\n secretSignIn: () => Promise.resolve(notConfigured()),\n google: {\n start: () => notConfigured(),\n callback: () => Promise.resolve(notConfigured()),\n },\n};\n\n/**\n * Assemble a site's gate, sign-in handlers, and sign-out from its `auth`\n * config. Accepts both access modes, so the mounting files never change:\n * `'public'` yields a pass-everything gate and `501` handlers, a workspace\n * block yields the live flows for exactly the providers it declares.\n *\n * In workspace mode the session-signing secret is required and read from the\n * environment variable named by `sessionSecretEnv` (default\n * `DOCS_SESSION_SECRET`); a missing value fails at startup with the variable's\n * name rather than signing sessions with a guessable fallback.\n *\n * @param auth - the `auth` field of `docs.config.ts`\n * @param options - extra public paths and the environment reader\n * @returns the assembled handlers\n * @public\n */\nexport function createSiteAuth(auth: DocsConfig['auth'], options: SiteAuthOptions = {}): SiteAuth {\n if (auth === 'public') {\n return {\n ...PUBLIC_SITE,\n gate: () => Promise.resolve(null),\n signOut: createSignOut(),\n };\n }\n return workspaceSiteAuth(auth, options);\n}\n\nfunction workspaceSiteAuth(auth: WorkspaceAuthConfig, options: SiteAuthOptions): SiteAuth {\n const env = options.env ?? ((name: string) => process.env[name]);\n const signInPath = auth.signInPath ?? '/signin';\n const secure = auth.secureCookies ?? true;\n const ttlSeconds = auth.sessionTtlSeconds;\n\n const sessionSecretEnv = auth.sessionSecretEnv ?? 'DOCS_SESSION_SECRET';\n const secret = env(sessionSecretEnv) ?? '';\n if (secret === '') {\n throw new DocsConfigError(\n `auth.mode is 'workspace': set the ${sessionSecretEnv} environment variable to a long random value (for example: openssl rand -hex 32).`,\n );\n }\n\n const shared = {\n secret,\n allowedDomains: auth.allowedDomains,\n secureCookies: secure,\n signInPath,\n ...(ttlSeconds === undefined ? {} : { ttlSeconds }),\n };\n\n const emailEnabled = auth.providers.email === true;\n const accessSecret = auth.providers.secret\n ? (env(auth.providers.secret.secretEnv ?? 'DOCS_ACCESS_SECRET') ?? '')\n : '';\n const secretEnabled = accessSecret !== '';\n\n const googleConfig = auth.providers.google;\n const clientId = googleConfig ? env(googleConfig.clientIdEnv ?? 'GOOGLE_CLIENT_ID') : undefined;\n const clientSecret = googleConfig\n ? env(googleConfig.clientSecretEnv ?? 'GOOGLE_CLIENT_SECRET')\n : undefined;\n const googleEnabled = Boolean(googleConfig && clientId && clientSecret);\n\n const emailSignIn = emailEnabled ? createEmailSignIn(shared) : null;\n const secretSignIn = secretEnabled ? createSecretSignIn({ ...shared, accessSecret }) : null;\n\n const googleFor = (request: Request): GoogleAuthHandlers | null => {\n if (!googleEnabled || !googleConfig || !clientId || !clientSecret) {\n return null;\n }\n const origin = new URL(request.url).origin;\n const redirectPath = googleConfig.redirectPath ?? '/api/auth/google/callback';\n return createGoogleAuth({\n ...shared,\n clientId,\n clientSecret,\n redirectUri: `${origin}${redirectPath}`,\n });\n };\n\n return {\n enabled: true,\n signInPath,\n secretEnabled,\n googleEnabled,\n gate: createAuthGate({\n secret,\n allowedDomains: auth.allowedDomains,\n signInPath,\n publicPaths: [...(options.publicPaths ?? ['/api/proxy'])],\n }),\n emailSignIn: (request) => emailSignIn?.(request) ?? Promise.resolve(notConfigured()),\n secretSignIn: (request) => secretSignIn?.(request) ?? Promise.resolve(notConfigured()),\n google: {\n start: (request) => googleFor(request)?.start(request) ?? notConfigured(),\n callback: (request) =>\n googleFor(request)?.callback(request) ?? Promise.resolve(notConfigured()),\n },\n signOut: createSignOut({ secureCookies: secure, redirectTo: signInPath }),\n };\n}\n","/**\n * The try-it proxy.\n *\n * The interactive playground cannot call an API directly from the browser\n * (cross-origin). Instead it posts an envelope to a same-origin route, which\n * forwards the request server-side. This module builds that forwarder in a\n * framework-agnostic way, using the Web `Request`/`Response` types so it drops\n * into a Next.js route handler, an edge function, or any Fetch-based runtime.\n *\n * Security model: the proxy forwards the caller's own credentials and injects\n * none of its own. It only reaches an origin the site has allow-listed, and it\n * refuses private, loopback, and link-local hosts so it cannot be turned into\n * an SSRF relay. Every forward is rate-limited per client IP, so a public\n * playground cannot be used to hammer the site's own API.\n *\n * @packageDocumentation\n */\n\nimport {\n RATE_LIMIT_WINDOW_MS,\n type RateLimiter,\n clientRateLimitKey,\n createRateLimiter,\n} from './rate-limit.js';\n\n/** Forwards per minute per client IP when a site names no limit. */\nconst DEFAULT_RATE_LIMIT_PER_MINUTE = 60;\n\n/**\n * A minimal fetch signature, so a test can inject a fake upstream.\n *\n * @public\n */\nexport type FetchLike = (url: string, init: RequestInit) => Promise<Response>;\n\n/**\n * Options for {@link createTryItProxy}.\n *\n * @public\n */\nexport interface CreateTryItProxyOptions {\n /** Exhaustive list of upstream origins the proxy may forward to. */\n readonly allowedOrigins: readonly string[];\n /**\n * Forwards per minute per client IP. Default 60 — pass\n * `config.proxy.rateLimitPerMinute` to let the site set it.\n */\n readonly rateLimitPerMinute?: number;\n /** Fetch implementation. Defaults to the global `fetch`. */\n readonly fetch?: FetchLike;\n /** Clock for the rate limiter, for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\n/**\n * Thrown when a forward target is missing, malformed, blocked, or not allow-listed.\n *\n * @public\n */\nexport class ProxyTargetError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ProxyTargetError';\n }\n}\n\nconst BLOCKED_HOST_PATTERNS: readonly RegExp[] = [\n /^localhost$/i,\n /\\.localhost$/i,\n /^0\\.0\\.0\\.0$/,\n /^127\\./,\n /^10\\./,\n /^192\\.168\\./,\n /^169\\.254\\./,\n /^172\\.(1[6-9]|2\\d|3[01])\\./,\n /^\\[?::1\\]?$/,\n /^\\[?fe80:/i,\n /^\\[?fc00:/i,\n /^\\[?fd[0-9a-f]{2}:/i,\n];\n\nfunction isBlockedHost(hostname: string): boolean {\n return BLOCKED_HOST_PATTERNS.some((pattern) => pattern.test(hostname));\n}\n\nfunction normalizeOrigins(origins: readonly string[]): ReadonlySet<string> {\n const set = new Set<string>();\n for (const origin of origins) {\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n throw new ProxyTargetError(`Invalid allow-listed origin: ${origin}`);\n }\n set.add(parsed.origin);\n }\n return set;\n}\n\n/**\n * Validate a forward target against the allow-list and the host block rules.\n *\n * @param target - the requested upstream URL\n * @param allowedOrigins - allow-listed origins\n * @returns the parsed, approved URL\n * @throws {@link ProxyTargetError} when the target is invalid, blocked, or not allow-listed\n * @public\n */\nexport function assertAllowedTarget(target: string, allowedOrigins: readonly string[]): URL {\n const allowed = normalizeOrigins(allowedOrigins);\n\n let url: URL;\n try {\n url = new URL(target);\n } catch {\n throw new ProxyTargetError(`Invalid target URL: ${target}`);\n }\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new ProxyTargetError(`Unsupported protocol: ${url.protocol}`);\n }\n if (isBlockedHost(url.hostname)) {\n throw new ProxyTargetError(`Blocked host: ${url.hostname}`);\n }\n if (!allowed.has(url.origin)) {\n throw new ProxyTargetError(`Target origin is not allow-listed: ${url.origin}`);\n }\n\n return url;\n}\n\n/**\n * The request envelope the playground posts to the proxy route.\n *\n * @public\n */\nexport interface TryItEnvelope {\n readonly url: string;\n readonly method?: string;\n readonly headers?: Record<string, string>;\n readonly body?: string | null;\n}\n\n// Headers that must not be forwarded from the browser to the upstream.\nconst STRIPPED_REQUEST_HEADERS: ReadonlySet<string> = new Set([\n 'host',\n 'connection',\n 'content-length',\n]);\n\nfunction jsonResponse(\n status: number,\n payload: unknown,\n headers: Record<string, string> = {},\n): Response {\n return new Response(JSON.stringify(payload), {\n status,\n headers: { 'content-type': 'application/json', ...headers },\n });\n}\n\n/**\n * Build the limiter both proxy factories share, from the site's configuration.\n */\nfunction proxyLimiter(options: CreateTryItProxyOptions): RateLimiter {\n const limit = options.rateLimitPerMinute ?? DEFAULT_RATE_LIMIT_PER_MINUTE;\n if (!Number.isInteger(limit) || limit < 1) {\n throw new ProxyTargetError(\n `proxy.rateLimitPerMinute must be an integer of 1 or more, got ${String(limit)}.`,\n );\n }\n return createRateLimiter({\n limit,\n windowMs: RATE_LIMIT_WINDOW_MS,\n ...(options.now ? { now: options.now } : {}),\n });\n}\n\n/**\n * The `429` a refused forward gets. Identical in shape to the Ask AI route's,\n * so a site handles one response body, not two.\n */\nfunction tooManyRequests(retryAfterSeconds: number | undefined): Response {\n const retryAfter = retryAfterSeconds ?? 60;\n return jsonResponse(\n 429,\n {\n error: `Too many requests. Try again in ${String(retryAfter)} seconds.`,\n retryAfterSeconds: retryAfter,\n },\n { 'retry-after': String(retryAfter) },\n );\n}\n\nfunction parseEnvelope(value: unknown): TryItEnvelope {\n if (typeof value !== 'object' || value === null) {\n throw new ProxyTargetError('Request body must be a JSON object.');\n }\n const record = value as Record<string, unknown>;\n if (typeof record['url'] !== 'string') {\n throw new ProxyTargetError('Request body must include a string \"url\".');\n }\n const headers: Record<string, string> = {};\n if (typeof record['headers'] === 'object' && record['headers'] !== null) {\n for (const [key, header] of Object.entries(record['headers'])) {\n if (typeof header === 'string' && !STRIPPED_REQUEST_HEADERS.has(key.toLowerCase())) {\n headers[key] = header;\n }\n }\n }\n return {\n url: record['url'],\n method: typeof record['method'] === 'string' ? record['method'] : 'GET',\n headers,\n body: typeof record['body'] === 'string' ? record['body'] : null,\n };\n}\n\n/**\n * Build a same-origin try-it proxy handler.\n *\n * Every request is rate-limited per client IP before anything is forwarded. A\n * caller over the limit gets `429` with a `Retry-After` header and the same JSON\n * body the Ask AI route returns.\n *\n * @param options - the allow-list, the rate limit, and an optional fetch implementation\n * @returns a handler mapping an incoming `Request` to a forwarded `Response`\n * @public\n */\nexport function createTryItProxy(\n options: CreateTryItProxyOptions,\n): (request: Request) => Promise<Response> {\n // Validate the allow-list eagerly so misconfiguration fails at startup.\n normalizeOrigins(options.allowedOrigins);\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n const limiter = proxyLimiter(options);\n\n return async function handle(request: Request): Promise<Response> {\n // Limit first: a refused caller must cost neither a body read nor an\n // upstream request.\n const decision = limiter.allow(clientRateLimitKey(request));\n if (!decision.allowed) {\n return tooManyRequests(decision.retryAfterSeconds);\n }\n\n let envelope: TryItEnvelope;\n try {\n const parsed: unknown = await request.json();\n envelope = parseEnvelope(parsed);\n } catch (error) {\n const message = error instanceof ProxyTargetError ? error.message : 'Invalid JSON body.';\n return jsonResponse(400, { error: message });\n }\n\n let target: URL;\n try {\n target = assertAllowedTarget(envelope.url, options.allowedOrigins);\n } catch (error) {\n const message = error instanceof ProxyTargetError ? error.message : 'Blocked target.';\n return jsonResponse(403, { error: message });\n }\n\n const init: RequestInit = {\n method: envelope.method ?? 'GET',\n headers: envelope.headers ?? {},\n };\n if (envelope.body !== null && envelope.body !== undefined) {\n init.body = envelope.body;\n }\n\n const upstream = await doFetch(target.toString(), init);\n return new Response(upstream.body, {\n status: upstream.status,\n headers: upstream.headers,\n });\n };\n}\n\n// Inbound infra headers that must never be forwarded upstream. Forwarding a\n// spoofed x-forwarded-* set is wrong and trips upstream WAFs.\nconst STRIPPED_FORWARD_HEADERS: readonly string[] = [\n 'host',\n 'connection',\n 'content-length',\n 'origin',\n 'referer',\n 'x-forwarded-for',\n 'x-forwarded-host',\n 'x-forwarded-proto',\n 'x-forwarded-port',\n 'x-real-ip',\n];\n\n/**\n * A set of HTTP method handlers for a try-it proxy route, ready to re-export\n * from a framework route file (e.g. a Next.js `route.ts`).\n *\n * @public\n */\nexport interface TryItProxyRoute {\n readonly GET: (request: Request) => Promise<Response>;\n readonly POST: (request: Request) => Promise<Response>;\n readonly PUT: (request: Request) => Promise<Response>;\n readonly PATCH: (request: Request) => Promise<Response>;\n readonly DELETE: (request: Request) => Promise<Response>;\n readonly OPTIONS: () => Response;\n}\n\n/**\n * The query parameters the route reads the target from, in order of preference.\n * `url` is the framework's own name — the one {@link unwrapProxyTarget} decodes;\n * `scalar_url` is the name the Scalar playground sends.\n */\nconst TARGET_PARAMS = ['url', 'scalar_url'] as const;\n\n/**\n * Build a drop-in try-it proxy route that speaks the query-parameter protocol\n * API playgrounds use: the target URL arrives in a query parameter, with the\n * caller's own method, headers, and body.\n *\n * Two parameter names are accepted, because two playgrounds disagree. `url` is\n * preferred and is the name {@link unwrapProxyTarget} decodes for display;\n * `scalar_url` is what the Scalar playground sends. Passing both uses `url`.\n *\n * The route validates the target with {@link assertAllowedTarget} (allow-list +\n * SSRF guard), rate-limits per client IP, strips inbound infra headers, and\n * forwards server-side. Export its handlers directly from a route file:\n *\n * @example\n * ```ts\n * export const { GET, POST, PUT, PATCH, DELETE, OPTIONS } = createTryItProxyRoute({\n * allowedOrigins: config.proxy.allowedOrigins,\n * rateLimitPerMinute: config.proxy.rateLimitPerMinute,\n * });\n * ```\n *\n * @param options - the allow-list, the rate limit, and an optional fetch implementation\n * @returns the method handlers for the route\n * @public\n */\nexport function createTryItProxyRoute(options: CreateTryItProxyOptions): TryItProxyRoute {\n normalizeOrigins(options.allowedOrigins);\n const doFetch: FetchLike = options.fetch ?? ((url, init) => fetch(url, init));\n const limiter = proxyLimiter(options);\n\n async function handle(request: Request): Promise<Response> {\n // Limit first, so a refused caller reaches neither the allow-list check nor\n // the upstream. `OPTIONS` is exempt: a preflight forwards nothing.\n const decision = limiter.allow(clientRateLimitKey(request));\n if (!decision.allowed) {\n return tooManyRequests(decision.retryAfterSeconds);\n }\n\n const requestUrl = new URL(request.url);\n const rawTarget = TARGET_PARAMS.map((name) => requestUrl.searchParams.get(name) ?? '').find(\n (value) => value !== '',\n );\n if (rawTarget === undefined) {\n return jsonResponse(400, {\n error: 'Missing target. Pass the upstream URL in the \"url\" query parameter.',\n });\n }\n\n let target: URL;\n try {\n target = assertAllowedTarget(rawTarget, options.allowedOrigins);\n } catch (error) {\n const message = error instanceof ProxyTargetError ? error.message : 'Blocked target.';\n return jsonResponse(403, { error: message });\n }\n\n const headers = new Headers(request.headers);\n for (const name of STRIPPED_FORWARD_HEADERS) {\n headers.delete(name);\n }\n\n const init: RequestInit = { method: request.method, headers, redirect: 'manual' };\n if (request.method !== 'GET' && request.method !== 'HEAD') {\n init.body = await request.arrayBuffer();\n }\n\n const upstream = await doFetch(target.toString(), init);\n const responseHeaders = new Headers(upstream.headers);\n responseHeaders.set('access-control-allow-origin', '*');\n return new Response(upstream.body, { status: upstream.status, headers: responseHeaders });\n }\n\n return {\n GET: handle,\n POST: handle,\n PUT: handle,\n PATCH: handle,\n DELETE: handle,\n OPTIONS: () =>\n new Response(null, {\n status: 204,\n headers: {\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': 'GET,POST,PUT,PATCH,DELETE,OPTIONS',\n 'access-control-allow-headers': '*',\n },\n }),\n };\n}\n\n/**\n * Recover the real target URL from a try-it proxy URL, for display.\n *\n * The playground fetches through the same-origin proxy, so a response's URL is\n * the proxy URL (`.../api/proxy?url=<encoded target>&...`). This returns the\n * decoded target so the response panel shows the real endpoint, not the proxy.\n * Any URL that is not a proxy URL is returned unchanged.\n *\n * It reads the same two parameter names {@link createTryItProxyRoute} accepts,\n * `url` first and `scalar_url` second, so a Scalar-shaped proxy URL is decoded\n * too.\n *\n * @param url - a proxy URL, or any URL\n * @returns the decoded target URL, or the input unchanged\n * @public\n */\nexport function unwrapProxyTarget(url: string): string {\n try {\n const parsed = new URL(url, 'http://localhost');\n if (!/\\/proxy\\/?$/.test(parsed.pathname)) {\n return url;\n }\n for (const name of TARGET_PARAMS) {\n const target = parsed.searchParams.get(name);\n if (target !== null && target !== '') {\n return target;\n }\n }\n return url;\n } catch {\n return url;\n }\n}\n","/**\n * `docs.json` navigation adapter.\n *\n * Translates a Mintlify `docs.json` navigation block into the framework's\n * normalized {@link Navigation} tree. It understands the two page-string forms\n * Mintlify uses — a plain content path, and an OpenAPI entry of the form\n * `\"<file> <METHOD> <route>\"` — and it recurses through arbitrarily nested\n * groups.\n *\n * @packageDocumentation\n */\n\nimport {\n type NavGroup,\n type NavItem,\n type NavMethod,\n type NavPage,\n type NavTab,\n type Navigation,\n} from '../../core/index.js';\n\nconst HTTP_METHODS: ReadonlySet<string> = new Set([\n 'GET',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'HEAD',\n 'OPTIONS',\n 'TRACE',\n]);\n\n/**\n * Thrown when a `docs.json` navigation block does not match the expected shape.\n *\n * @public\n */\nexport class InvalidNavigationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidNavigationError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Parse a single page string into a normalized page node.\n *\n * A string shaped `\"<file> <METHOD> <route>\"` (where `<METHOD>` is a known HTTP\n * method) becomes an {@link OpenApiPage}; anything else becomes a {@link DocPage}.\n */\nfunction parsePageString(entry: string): NavPage {\n const parts = entry.trim().split(/\\s+/);\n const [file, maybeMethod, ...rest] = parts;\n\n if (file === undefined || file === '') {\n throw new InvalidNavigationError('Encountered an empty navigation page entry.');\n }\n\n if (maybeMethod !== undefined && rest.length > 0 && HTTP_METHODS.has(maybeMethod.toUpperCase())) {\n return {\n kind: 'openapi',\n file,\n method: maybeMethod.toUpperCase() as NavMethod,\n apiPath: rest.join(' '),\n };\n }\n\n return { kind: 'doc', file: entry.trim() };\n}\n\nfunction parseItem(entry: unknown, path: string): NavItem {\n if (typeof entry === 'string') {\n return parsePageString(entry);\n }\n\n if (isRecord(entry) && typeof entry['group'] === 'string') {\n return parseGroup(entry, path);\n }\n\n throw new InvalidNavigationError(\n `Navigation entry at ${path} must be a page string or a group object.`,\n );\n}\n\nfunction parseItems(pages: unknown, path: string): NavItem[] {\n if (!Array.isArray(pages)) {\n throw new InvalidNavigationError(`Expected an array of pages at ${path}.`);\n }\n return pages.map((entry, index) => parseItem(entry, `${path}[${String(index)}]`));\n}\n\nfunction parseGroup(group: Record<string, unknown>, path: string): NavGroup {\n const title = group['group'];\n if (typeof title !== 'string') {\n throw new InvalidNavigationError(`Group at ${path} is missing a string \"group\" title.`);\n }\n return {\n kind: 'group',\n title,\n items: parseItems(group['pages'], `${path}.pages`),\n };\n}\n\nfunction parseTab(tab: unknown, path: string): NavTab {\n if (!isRecord(tab) || typeof tab['tab'] !== 'string') {\n throw new InvalidNavigationError(`Tab at ${path} is missing a string \"tab\" title.`);\n }\n\n // A tab holds either `groups` or `pages`; normalize both into `items`.\n const items: NavItem[] =\n tab['groups'] !== undefined\n ? parseGroups(tab['groups'], `${path}.groups`)\n : parseItems(tab['pages'], `${path}.pages`);\n\n const icon = tab['icon'];\n return {\n kind: 'tab',\n title: tab['tab'],\n items,\n ...(typeof icon === 'string' ? { icon } : {}),\n };\n}\n\nfunction parseGroups(groups: unknown, path: string): NavGroup[] {\n if (!Array.isArray(groups)) {\n throw new InvalidNavigationError(`Expected an array of groups at ${path}.`);\n }\n return groups.map((group, index) => {\n const groupPath = `${path}[${String(index)}]`;\n if (!isRecord(group)) {\n throw new InvalidNavigationError(`Group at ${groupPath} must be an object.`);\n }\n return parseGroup(group, groupPath);\n });\n}\n\n/**\n * Parse a Mintlify `docs.json` object into the normalized {@link Navigation} tree.\n *\n * @param docsJson - the parsed contents of a `docs.json` file\n * @returns the normalized, ordered list of tabs\n * @throws {@link InvalidNavigationError} when the navigation shape is invalid\n * @public\n */\nexport function parseNavigation(docsJson: unknown): Navigation {\n if (!isRecord(docsJson)) {\n throw new InvalidNavigationError('docs.json must be an object.');\n }\n\n const navigation = docsJson['navigation'];\n if (!isRecord(navigation)) {\n throw new InvalidNavigationError('docs.json must have a \"navigation\" object.');\n }\n\n const tabs = navigation['tabs'];\n if (!Array.isArray(tabs)) {\n throw new InvalidNavigationError('docs.json navigation must have a \"tabs\" array.');\n }\n\n return tabs.map((tab, index) => parseTab(tab, `navigation.tabs[${String(index)}]`));\n}\n","/**\n * OpenAPI merge adapter.\n *\n * A Mintlify-style API reference stores one OpenAPI file per endpoint. Renderers\n * (Scalar, fumadocs-openapi) want a single document. `mergeOpenApiDocuments`\n * combines many single-operation OpenAPI files into one document: it unions\n * servers, tags, and components, and assembles the paths. A genuine conflict —\n * the same method on the same route defined twice — is an error, not a\n * silent overwrite.\n *\n * @packageDocumentation\n */\n\nimport {\n type OpenApiComponents,\n type OpenApiDocument,\n type OpenApiInfo,\n type OpenApiPathItem,\n type OpenApiServer,\n type OpenApiTag,\n} from '../../core/index.js';\n\n/**\n * Options controlling the merge.\n *\n * @public\n */\nexport interface MergeOpenApiOptions {\n /** The `info` block of the merged document. */\n readonly info: OpenApiInfo;\n /**\n * Servers for the merged document. When omitted, servers are unioned from\n * the input documents (deduplicated by `url`).\n */\n readonly servers?: readonly OpenApiServer[];\n /** The OpenAPI version string of the merged document. Defaults to `3.1.0`. */\n readonly openapi?: string;\n}\n\n/**\n * Thrown when an input is not a usable OpenAPI document, or when two inputs\n * define the same operation (method + route).\n *\n * @public\n */\nexport class OpenApiMergeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OpenApiMergeError';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction collectServers(\n inputs: readonly Record<string, unknown>[],\n override: readonly OpenApiServer[] | undefined,\n): OpenApiServer[] {\n if (override !== undefined) {\n return [...override];\n }\n const byUrl = new Map<string, OpenApiServer>();\n for (const doc of inputs) {\n const servers = doc['servers'];\n if (!Array.isArray(servers)) {\n continue;\n }\n for (const server of servers) {\n if (isRecord(server) && typeof server['url'] === 'string' && !byUrl.has(server['url'])) {\n byUrl.set(server['url'], server as unknown as OpenApiServer);\n }\n }\n }\n return [...byUrl.values()];\n}\n\nfunction collectTags(inputs: readonly Record<string, unknown>[]): OpenApiTag[] {\n const byName = new Map<string, OpenApiTag>();\n for (const doc of inputs) {\n const tags = doc['tags'];\n if (!Array.isArray(tags)) {\n continue;\n }\n for (const tag of tags) {\n if (isRecord(tag) && typeof tag['name'] === 'string' && !byName.has(tag['name'])) {\n byName.set(tag['name'], tag as unknown as OpenApiTag);\n }\n }\n }\n return [...byName.values()];\n}\n\nfunction mergeComponents(inputs: readonly Record<string, unknown>[]): OpenApiComponents {\n const merged: Record<string, Record<string, unknown>> = {};\n for (const doc of inputs) {\n const components = doc['components'];\n if (!isRecord(components)) {\n continue;\n }\n for (const [section, value] of Object.entries(components)) {\n if (!isRecord(value)) {\n continue;\n }\n const target = merged[section] ?? (merged[section] = {});\n for (const [key, definition] of Object.entries(value)) {\n // First definition wins; later identical re-declarations are ignored.\n if (!(key in target)) {\n target[key] = definition;\n }\n }\n }\n }\n return merged;\n}\n\nconst HTTP_METHODS = new Set(['get', 'put', 'post', 'delete', 'patch', 'options', 'head', 'trace']);\n\nfunction assemblePaths(\n inputs: readonly Record<string, unknown>[],\n): Record<string, OpenApiPathItem> {\n const paths: Record<string, OpenApiPathItem> = {};\n for (const doc of inputs) {\n const docPaths = doc['paths'];\n if (!isRecord(docPaths)) {\n throw new OpenApiMergeError('Each OpenAPI input must have a \"paths\" object.');\n }\n // Each file's top-level security applies to all its operations. The merged\n // document can't carry one shared security, so push it onto the operations.\n const docSecurity = doc['security'];\n for (const [route, pathItem] of Object.entries(docPaths)) {\n if (!isRecord(pathItem)) {\n throw new OpenApiMergeError(`Path item for \"${route}\" must be an object.`);\n }\n const target = paths[route] ?? (paths[route] = {});\n for (const [method, operation] of Object.entries(pathItem)) {\n if (method in target) {\n throw new OpenApiMergeError(\n `Duplicate operation ${method.toUpperCase()} ${route} across inputs.`,\n );\n }\n let resolved = operation;\n if (\n HTTP_METHODS.has(method.toLowerCase()) &&\n isRecord(operation) &&\n !('security' in operation) &&\n Array.isArray(docSecurity)\n ) {\n resolved = { ...operation, security: docSecurity };\n }\n target[method] = resolved as OpenApiPathItem[string];\n }\n }\n }\n return paths;\n}\n\n/**\n * Merge many single-operation OpenAPI documents into one document.\n *\n * @param inputs - parsed OpenAPI documents, each typically holding one operation\n * @param options - the merged document's `info`, and optional server/version overrides\n * @returns the merged {@link OpenApiDocument}\n * @throws {@link OpenApiMergeError} on an invalid input or a duplicate operation\n * @public\n */\nexport function mergeOpenApiDocuments(\n inputs: readonly unknown[],\n options: MergeOpenApiOptions,\n): OpenApiDocument {\n const records: Record<string, unknown>[] = inputs.map((input, index) => {\n if (!isRecord(input)) {\n throw new OpenApiMergeError(`OpenAPI input at index ${String(index)} must be an object.`);\n }\n return input;\n });\n\n return {\n openapi: options.openapi ?? '3.1.0',\n info: options.info,\n servers: collectServers(records, options.servers),\n tags: collectTags(records),\n paths: assemblePaths(records),\n components: mergeComponents(records),\n };\n}\n"]}