/**
 * Training-store — single source of truth for the locally collected training
 * dataset (~/.owlcoda/training/collected.jsonl + manifest.json).
 *
 * CLI, REPL slash command, and HTTP API all read through here so that
 * "what `owlcoda training status` shows" and "what `/training` shows" and
 * "what `GET /v1/training/status` returns" can never drift apart again.
 *
 * Reads are streaming where it matters — collected.jsonl can be hundreds of
 * MB. Sample/limit paths use line-by-line readline; full export streams via
 * the consumer (e.g. `pipe(createReadStream(...))`).
 */
export declare function getTrainingDir(): string;
export declare function getCollectedPath(): string;
export declare function getManifestPath(): string;
export interface TrainingStatus {
    /** From manifest.json — sessions accepted by the collector. */
    totalCollected: number;
    /** From manifest.json — sessions evaluated and rejected by quality gate. */
    totalSkipped: number;
    /** From manifest.json — running average of accepted-session quality (0-100). */
    averageQuality: number;
    /** From manifest.json — ISO timestamp of last successful collection, or null. */
    lastCollectedAt: string | null;
    /** Resolved path to collected.jsonl on this machine. */
    path: string;
    /** Bytes on disk (0 if file is missing). */
    fileSize: number;
    /** Non-empty JSONL line count (0 if file is missing). */
    lineCount: number;
    /** True iff manifest.json was found; lets callers distinguish "no data" from "manifest read error". */
    manifestPresent: boolean;
}
export declare function readCollectedStatus(): Promise<TrainingStatus>;
export interface ReadLinesOptions {
    /** Max lines to yield (default: unlimited). */
    limit?: number;
    /** Run each line through PII sanitizer before yielding. */
    sanitize?: boolean;
}
/**
 * Async iterable over collected.jsonl lines. Empty if file is missing.
 * Caller is responsible for terminating early — readline closes when the
 * iterator returns or breaks.
 */
export declare function readCollectedLines(opts?: ReadLinesOptions): AsyncIterable<string>;
export interface SampleOptions {
    /** Number of entries to sample (default: 1). */
    limit?: number;
    /** Per-entry display cap to avoid dumping a 50KB JSONL line into the REPL. */
    maxChars?: number;
    /** Run each line through PII sanitizer (default: true — REPL surface). */
    sanitize?: boolean;
}
export interface SampleEntry {
    raw: string;
    truncated: boolean;
}
/**
 * Read first N lines and truncate each to maxChars. Designed for REPL
 * `/training sample` and similar surfaces — never returns more than
 * limit*maxChars characters total.
 */
export declare function readCollectedSample(opts?: SampleOptions): Promise<SampleEntry[]>;
