/**
 * ProcessedIdStore — small persistent set of recently-processed a2a marker `id`s, so
 * Telegram retries / adapter restarts can't double-inject the same prompt (spec
 * MENTOR-LIVE-READINESS §Fix 2a "Processed-id ledger" + Codey's round-2 design point).
 *
 * Bounded by `maxEntries` (default 10_000) AND `maxAgeMs` (default 30 days) — whichever
 * evicts first. **Bounded eviction is the same surface adversarial F2 worried about**:
 * an `id` that ages out is no longer "duplicate" and could be re-injected by a replayer
 * who captured it. The marker's `ts` + skew-window (24h default) is the defense at the
 * primitive layer; this store's eviction policy is set generously so legitimate retries
 * within hours/days are still de-duped.
 *
 * Convention note: instar prefers SQLite for durable dedup ledgers (MessageProcessingLedger,
 * CommitmentTracker). This store uses a small JSON file because the working set is small
 * (per-mentee processed-ids over 30d), the file is rewritten atomically on every mark, and
 * there's no concurrent-writer story to need WAL. A future bump to SQLite is a drop-in
 * replacement at the class boundary.
 */
export interface ProcessedIdStoreOptions {
    /** Absolute path to the JSON file backing the store. */
    filePath: string;
    /** Max entries to retain before evicting the oldest (default 10_000). */
    maxEntries?: number;
    /** Max age (ms) before an entry is evicted (default 30 days). */
    maxAgeMs?: number;
    /** Injected for testability. Default: Date.now. */
    now?: () => number;
}
export declare class ProcessedIdStore {
    private readonly filePath;
    private readonly maxEntries;
    private readonly maxAgeMs;
    private readonly now;
    private entries;
    constructor(opts: ProcessedIdStoreOptions);
    /** True if the id has been marked + has not been evicted. */
    hasProcessed(id: string): boolean;
    /** Mark this id processed at now() and persist. Idempotent (re-marking is a no-op
     *  beyond refreshing the persisted snapshot). */
    markProcessed(id: string): void;
    /** Test helper: current entry count. */
    size(): number;
    private load;
    private persist;
    private evictExpired;
    private evictOverflow;
}
//# sourceMappingURL=ProcessedIdStore.d.ts.map