import type { DatabaseSyncLike } from '../../db.js';
/**
 * Thrown by the ingest afterWrite hook when a concurrent worker has already
 * inserted slack_event_log for the same event_id. The throw propagates out of
 * writeEntry's SAVEPOINT, rolling back the duplicate memory write so exactly
 * one memory row exists per Slack event_id even under two-worker races.
 *
 * Caller maps to `{status: 'skipped_duplicate'}` at the public API boundary.
 */
export declare class DuplicateEventError extends Error {
    readonly eventId: string;
    constructor(eventId: string);
}
export declare function hasSeenEvent(db: DatabaseSyncLike, eventId: string): boolean;
export declare function markEventSeen(db: DatabaseSyncLike, eventId: string, memoryId: string | null): void;
export declare function lookupMemoryByEvent(db: DatabaseSyncLike, eventId: string): string | null;
//# sourceMappingURL=idempotency.d.ts.map