/**
 * frameworkActivitySignals — per-framework patterns for spotting tool
 * calls, spinners, shell exits, and "press X to interrupt" hints in
 * tmux output.
 *
 * Provider-portability v1.0.0: before this module, StallTriageNurse
 * hardcoded Claude-Code's tool names and Braille spinner characters
 * directly in its heuristicDiagnose path. That made the nurse blind to
 * Codex sessions — their activity signature is different.
 *
 * Each signal carries the regexes the nurse needs to answer three
 * yes/no questions about a captured tmux pane:
 *   1. Is the framework actively doing something? (toolCallOrSpinner)
 *   2. Did the framework wrapper exit, leaving a bare shell? (shellExited)
 *   3. Is the framework prompting the user to interrupt a long op?
 *      (escapeToInterrupt)
 *
 * Adding a new framework is a one-line union extension plus a new entry
 * in `ACTIVITY_SIGNALS`. The exhaustiveness check in `getActivitySignal`
 * forces a compile error if a case is missed.
 */
import type { IntelligenceFramework } from '../core/intelligenceProviderFactory.js';
export interface FrameworkActivitySignal {
    /** Human-readable framework name for prompts and logs. */
    readonly displayName: string;
    /**
     * Matches when the framework is actively processing — tool calls,
     * spinners, "thinking" indicators. If this matches and a shell prompt
     * is ALSO visible, the shell-prompt heuristic should not fire (the
     * framework is still alive, the prompt is from an embedded command).
     */
    readonly toolCallOrSpinner: RegExp;
    /**
     * LIVE-generation markers ONLY — the subset of activity signals that appear
     * exclusively WHILE a turn is generating and vanish the instant it ends (the
     * animated braille spinner, the "Working (Ns" status line, "generating"). It
     * deliberately EXCLUDES the scrollback-persistent markers in toolCallOrSpinner —
     * tool-call names (Read(/Write(/Bash(/exec(/…) and the bare framework word
     * (e.g. "claude") — which linger in an IDLE session's visible history long after
     * the turn finished. The SessionReaper's positive-idle proof must use THIS, not
     * toolCallOrSpinner: a 200-line capture of an idle Claude session is full of past
     * tool-names + "claude", so toolCallOrSpinner mis-read every idle session as
     * "working" and the reaper could never reap (2026-06-07 grounding; same class as
     * the codex "do not match bare 'codex'" lesson). Other consumers that genuinely
     * want "is this a tool-using framework" keep using toolCallOrSpinner.
     */
    readonly liveActivity: RegExp;
    /**
     * Matches text the framework shows when it wants the user to interrupt
     * a long-running tool call (e.g., Claude's "esc to interrupt").
     */
    readonly escapeToInterrupt: RegExp;
    /**
     * Matches the framework's "(running)" or equivalent indicator that
     * appears next to long-running Bash/shell tool calls.
     */
    readonly runningIndicator: RegExp;
    /**
     * One-line description of typical signatures, used to inject
     * framework-specific guidance into the diagnose system prompt.
     */
    readonly promptSignaturesLine: string;
}
/**
 * Look up the activity signal for a framework. Defaults to claude-code
 * when called with an unknown value, which preserves v0.x behavior.
 */
export declare function getActivitySignal(framework: IntelligenceFramework | undefined | null): FrameworkActivitySignal;
/**
 * Exposed for tests that want to enumerate every signal without
 * importing each constant individually.
 */
export declare function listActivitySignals(): ReadonlyArray<{
    framework: IntelligenceFramework;
    signal: FrameworkActivitySignal;
}>;
//# sourceMappingURL=frameworkActivitySignals.d.ts.map