/**
 * AI crawler taxonomy + robots.txt policy.
 *
 * Not all "AI bots" are equal, and blocking them all is usually the wrong call
 * for visibility:
 *
 *   - TRAINING crawlers ingest your content into model weights and never send a
 *     user or a citation back. Blocking these has little downside for traffic
 *     and is what most "block AI" intentions actually mean.
 *   - RETRIEVAL / answer-engine crawlers fetch a page to answer a user's live
 *     query and typically cite + link the source (ChatGPT browsing, Perplexity,
 *     etc.). Blocking these removes you from AI answers — usually undesirable.
 *
 * So we model the two independently. Lists are curated for 2026 and grouped by
 * vendor for maintainability; keep them conservative (only well-attested UA
 * tokens) to avoid accidentally blocking a general search crawler.
 */
/** Crawlers that ingest content for model TRAINING (no citation, no referral). */
export declare const AI_TRAINING_BOTS: readonly string[];
/** Answer-engine / live-retrieval crawlers (cite + refer users back). */
export declare const AI_RETRIEVAL_BOTS: readonly string[];
export type AiBotCategory = 'training' | 'retrieval';
export interface DetectedAiBot {
    /** The canonical UA token that matched (e.g. `GPTBot`). */
    token: string;
    category: AiBotCategory;
}
/**
 * Identify a known AI crawler from a `User-Agent` string. Substring match
 * (case-insensitive) against the curated taxonomy. TRAINING tokens are checked
 * first so the more specific `*-Extended` variants win over their search-crawler
 * namesakes (e.g. `Applebot-Extended` → training, plain `Applebot` → retrieval).
 * Returns `null` for humans and unknown bots — never guesses.
 */
export declare function detectAiBot(userAgent: string | null | undefined): DetectedAiBot | null;
export type AiBotStance = 'allow' | 'block';
export interface AiBotPolicy {
    /** Stance toward TRAINING crawlers. Default `allow`. */
    training?: AiBotStance;
    /** Stance toward RETRIEVAL / answer-engine crawlers. Default `allow`. */
    retrieval?: AiBotStance;
}
/**
 * Build the robots.txt User-agent/Disallow line groups for blocked AI bots.
 *
 * Precedence:
 *   1. An explicit `policy` (nuanced training vs retrieval) wins.
 *   2. Otherwise the legacy `blockAIBots` boolean blocks BOTH groups (preserves
 *      pre-nuance behavior for sites that set it).
 *   3. Otherwise nothing is emitted.
 *
 * Returns a flat array of robots.txt lines (each blocked bot gets its own
 * `User-agent` + `Disallow: /` + blank-line group). Pure + deterministic.
 */
export declare function buildAiBotRobotsLines(policy: AiBotPolicy | undefined, legacyBlockAIBots: boolean | undefined): string[];
//# sourceMappingURL=ai-bots.d.ts.map