import type { DatabaseSync } from "node:sqlite"; export declare const LEDGER_DEFAULT_PATH: string; export interface LedgerUtterance { ts: number; source: string; text: string; sessionKey?: string | null; speakerKey?: string | null; speakerName?: string | null; audioPath?: string | null; meta?: Record | null; } export interface Voiceprint { audioPath: string; ts: number; speakerName: string | null; wearer: boolean; anon: boolean; score: number | null; /** unit-normalized voice embedding — enables retroactive re-attribution */ embedding?: number[] | Float32Array | null; } export interface LedgerRow { id: number; ts: number; when: string; source: string; sessionKey: string | null; episodeId: number | null; speaker: string; text: string; } export interface LedgerSearchOpts { query?: string; speaker?: string; source?: string; sessionKey?: string; fromTs?: number; toTs?: number; limit?: number; } /** FTS5 query hardening: each whitespace token becomes a quoted term (AND). */ export declare function toFtsQuery(raw: string): string; export declare class Ledger { private db; /** episode cursor per (source|sessionKey) — survives via episodes table. */ private cursors; constructor(path?: string); private migrate; /** Escape hatch for the identity module (ledger-identity.ts). */ get database(): DatabaseSync; /** Persist a clip's voice resolution + embedding (upsert; latest wins). */ recordVoiceprint(vp: Voiceprint): void; /** Stamp utterances from voiceprints (voiceprint is authoritative). */ reconcileVoiceprints(): number; /** Assign (or extend) the episode for a new utterance. */ private episodeFor; /** Append one utterance. Returns the row id, or null when deduplicated. */ append(u: LedgerUtterance): number | null; appendMany(items: LedgerUtterance[]): number; private toRow; /** Hybrid search: FTS5 when a query is given, pure SQL filters otherwise. */ search(opts: LedgerSearchOpts): LedgerRow[]; /** Everything said in the episode around one utterance — the conversation. */ expand(utteranceId: number, cap?: number): LedgerRow[]; getIngestOffset(file: string): number; setIngestOffset(file: string, offset: number): void; stats(): { utterances: number; episodes: number; firstTs: number | null; lastTs: number | null; }; close(): void; } /** Process-wide shared handle (gateway ingest + recall tool use the same DB). */ export declare function getLedger(path?: string): Ledger;