/**
 * One session-summarizer pass (PHNX-3939) — the work the background
 * SessionSummarizerService does per tick, factored out so it is testable with an
 * injected model stub and no daemon scaffolding.
 *
 * Off the request path by construction: it reads THIS box's already-published
 * live sessions (the warm cache the session-state service writes — never a fresh
 * gather) and, per session, reuses the transcript-keyed `session_summaries` row
 * until the transcript bytes change, so an unchanged session costs one indexed
 * read and zero model calls. When the summarizer is disabled or has no endpoint,
 * the pass does nothing at all.
 */
import type { ActiveSession } from '../session/active.js';
import { type SummarizerConfig } from './config.js';
import { summarize as defaultSummarize } from './summarize.js';
/** Max sessions summarized per tick — a debounce ceiling on local-model calls. */
export declare const SUMMARIZER_MAX_PER_TICK = 8;
export interface SummarizerPassOptions {
    now?: number;
    config?: SummarizerConfig;
    /** Live sessions to consider; default = this box's warm local-session cache. */
    sessions?: ActiveSession[];
    /** Injectable model call (tests stub the endpoint here). */
    summarizeImpl?: typeof defaultSummarize;
    signal?: AbortSignal;
    maxPerTick?: number;
    /** Injectable stat for tests; defaults to fs.statSync. */
    statFile?: (p: string) => {
        mtimeMs: number;
        size: number;
    };
    /** Skip the reader-recency gate (tests pass sessions directly). */
    requireReader?: boolean;
}
export interface SummarizerPassResult {
    disabled: boolean;
    computed: number;
    reused: number;
    skipped: number;
}
/**
 * Run one pass. Returns per-outcome counts. Never throws — a per-session failure
 * is isolated so one bad transcript can't stall the whole tick.
 */
export declare function runSummarizerPass(opts?: SummarizerPassOptions): Promise<SummarizerPassResult>;
