/**
 * v1.15.0 — Lightweight URL validation for read-only HTML extraction.
 *
 * Distinct from SecurityDownloadGuard.validateUrl (which whitelists a
 * tight set of trusted package sources). The extractor only reads HTML
 * + CSS — no code execution, no file writes from the network. So we
 * accept any well-formed public https:// URL but block private IPs
 * and known SSRF vectors.
 */
declare function validateExtractUrl(url: string): {
    ok: boolean;
    reason?: string;
};
export interface ExtractOptions {
    /** Force a specific extraction provider. Defaults: router-resolved. */
    provider?: 'claude-cli' | 'openrouter';
    /** Model id for openrouter. Ignored for claude-cli. */
    model?: string;
    /** Override output dir. Defaults to ~/.openlife/design-extract/<slug>/ */
    out?: string;
    /** When true, copies the artifacts into design/profiles/<slug>/ */
    catalog?: boolean;
    /** Compare against an existing DESIGN.md and emit drift report. */
    comparePath?: string;
    /** Bypass cache (ignore last 24h). */
    noCache?: boolean;
    /** Forward to skill — abort if HTML looks empty/bot-blocked. */
    contentGate?: boolean;
    /** Cap total runtime (ms). Default 180s. */
    timeoutMs?: number;
}
export interface ExtractResult {
    ok: boolean;
    slug: string;
    outDir: string;
    exitCode: number;
    provider: string;
    cached: boolean;
    catalogged: boolean;
    designPath?: string;
    tokensPath?: string;
    previewPath?: string;
    qualityScorePath?: string;
    errors?: string[];
}
/** Resolve `~/.openlife/design-extract` honoring OPENLIFE_STATE_DIR. */
declare function defaultExtractDir(): string;
/** Slugify URL into a filesystem-safe directory name. */
declare function slugFromUrl(url: string): string;
/** Locate the bundled skill regardless of install layout. */
declare function resolveSkillRoot(): string | null;
/**
 * Pick a provider for the extraction step. Strategy:
 *   1. Caller override wins.
 *   2. If anthropic CLI is router-preferred AND `claude` is on PATH → claude-cli.
 *   3. Else if OPENROUTER_API_KEY is set → openrouter.
 *   4. Else return null (caller surfaces actionable error).
 */
declare function resolveProvider(opts: ExtractOptions): {
    provider: 'claude-cli' | 'openrouter';
    reason: string;
} | null;
export declare class DesignMdExtractor {
    private rootDir;
    constructor(rootDir?: string);
    extract(url: string, opts?: ExtractOptions): Promise<ExtractResult>;
}
/** Exposed for tests. */
export declare const _internals: {
    slugFromUrl: typeof slugFromUrl;
    resolveProvider: typeof resolveProvider;
    defaultExtractDir: typeof defaultExtractDir;
    resolveSkillRoot: typeof resolveSkillRoot;
    validateExtractUrl: typeof validateExtractUrl;
};
export {};
