/**
 * OutboundDedupStore — durable backing for OutboundContentDedup so an identical
 * reply is suppressed even ACROSS a server restart or across overlapping server
 * processes.
 *
 * Earned 2026-06-07 (topic 21816, finding_cross_restart_duplicate_replies): during
 * the "server temporarily down" restart instability a byte-identical refusal went
 * out 5× to the same topic within 19s. The in-memory OutboundContentDedup couldn't
 * catch it because its Map is per-process and resets on restart — exactly the
 * window the restart churn opened. A durable fingerprint store closes that window.
 *
 * FAIL-OPEN BY CONSTRUCTION. Every method swallows errors and degrades to "no
 * durable signal" (the caller then behaves exactly as the in-memory-only path did).
 * A dedup store must NEVER drop a legitimate message because its backing storage
 * hiccuped — suppressing a real reply is strictly worse than the duplicate it
 * prevents. So a missing/locked/corrupt/native-binding-broken db ⇒ silently no-op,
 * never throw. (better-sqlite3 binding fragility was itself a factor in this
 * incident, so the construct path is guarded too.)
 */
export interface OutboundDedupStore {
    /** True if `fingerprint` was recorded for `topicId` at or after `sinceMs`. */
    wasSentSince(topicId: number, fingerprint: string, sinceMs: number): boolean;
    /** Record that `fingerprint` was sent to `topicId` at `atMs`. Call after a successful send. */
    record(topicId: number, fingerprint: string, atMs: number): void;
}
/** A no-op store — the explicit "no durable layer" fallback. */
export declare const NULL_OUTBOUND_DEDUP_STORE: OutboundDedupStore;
export declare class SqliteOutboundDedupStore implements OutboundDedupStore {
    private db;
    private lastPruneAt;
    /** @param dbPath absolute path, or ':memory:' for tests. */
    constructor(dbPath: string);
    wasSentSince(topicId: number, fingerprint: string, sinceMs: number): boolean;
    record(topicId: number, fingerprint: string, atMs: number): void;
    /** Resolve the default db path for an agent's state dir. */
    static defaultPath(stateDir: string): string;
}
//# sourceMappingURL=OutboundDedupStore.d.ts.map