/**
 * StuckSignatureClassifier — honest turn-receipts.
 *
 * The problem (2026-06-05, three incidents in two days, same symptom): a
 * session is ALIVE and still emitting output, but every turn fails — it is
 * rate-limited, policy-wedged, context-wedged, or out of context. Because the
 * process is alive, PresenceProxy's tier-3 assessment sees "active child
 * processes" and reports "🔭 actively working" — a lie. The user stares at
 * delivery receipts while the session is dead, and finds out by screenshot.
 *
 * This classifier answers the honest question: "is this live session actually
 * able to reply, or is it failing every turn for a known reason?" When it
 * matches, PresenceProxy surfaces the REAL reason instead of "working."
 *
 * Two design rules carried from the ContextWedgeSentinel work:
 *
 *  1. TAIL-GATED. The signature must be in the LIVE TAIL of the capture, not
 *     merely somewhere in scrollback. A session that hit "conversation too
 *     long" an hour ago, recovered, and kept working has that phrase scrolled
 *     far up — matching it anywhere is exactly the false-positive noise the
 *     user flagged ("these messages come up often but the conversation
 *     continues fine"). The live tail is the discriminator between a real
 *     current block and a stale mention.
 *
 *  2. SIGNAL-ONLY. This returns a classification + an honest user-facing
 *     message. It never kills, blocks, or recovers — the caller decides what
 *     to do with the honest answer. Recovery stays with the sentinels.
 *
 * Reuses the wedge detectors (classifyWedgeTail) shipped for the AUP-rejection
 * incident, and adds tail-gated rate-limit + context-too-long detection.
 */
export type StuckKind = 'rate-limited' | 'policy-wedge' | 'context-wedge' | 'context-too-long';
export interface StuckClassification {
    kind: StuckKind;
    /** Honest, plain-language one-liner for the user (no jargon, no localhost). */
    message: string;
    /** Optional extracted detail (e.g. a reset time), for logs/audit. */
    detail?: string;
}
/** Extract a human reset hint ("resets 10:30pm", "resets in 5m") if present. */
export declare function extractResetHint(text: string): string | undefined;
/**
 * Classify a LIVE session from its tmux capture. Returns the honest stuck
 * reason when the live tail shows a known "alive but failing every turn"
 * signature, else null (the session is genuinely working/idle/normal).
 *
 * Precedence reflects recoverability: a wedge (needs a fresh session) and a
 * usage limit (clears on its own) are both more specific/actionable than a
 * generic context-too-long, so they win when co-present in the tail.
 */
export declare function classifyStuckSignature(capture: string, tailLines?: number): StuckClassification | null;
//# sourceMappingURL=StuckSignatureClassifier.d.ts.map