/** * JSONL-backed retain queue for buffering failed HTTP retains. * * When the remote Hindsight API is unreachable, retain requests are stashed * in a local JSONL file and flushed later. Only used in external API mode — * the local daemon handles its own persistence. * * Zero runtime dependencies; uses only Node built-ins. */ /** The subset of a retain payload the queue needs to persist and replay. */ export interface QueuedRetainPayload { content: string; documentId?: string; metadata?: Record; tags?: string[]; updateMode?: "replace" | "append"; } export interface QueuedRetain { id: string; bankId: string; content: string; documentId: string; metadata: Record; tags?: string[]; updateMode?: "replace" | "append"; createdAt: string; } export interface RetainQueueOptions { /** Path to the JSONL queue file. The parent directory must already exist. */ filePath: string; /** Max age in ms for queued items. `-1` (default) keeps items forever. */ maxAgeMs?: number; } export declare class RetainQueue { private readonly filePath; private readonly maxAgeMs; private cachedSize; constructor(opts: RetainQueueOptions); /** Append a failed retain for later delivery. */ enqueue(bankId: string, request: QueuedRetainPayload, metadata?: Record): void; /** Get up to `limit` oldest pending items (FIFO). */ peek(limit?: number): QueuedRetain[]; /** Remove a single item by id. */ remove(id: string): void; /** Remove multiple items by id in a single file rewrite. */ removeMany(ids: string[]): void; /** Number of items waiting (cached, O(1)). */ size(): number; /** Drop items older than `maxAgeMs`. No-op when `maxAgeMs < 0`. */ cleanup(): number; /** No-op — kept for API symmetry with DB-backed queues. */ close(): void; private readAll; /** Atomically rewrite the file with the given items. */ private writeAll; }