export interface SessionLogCaptureSummary { copied: number; /** Of `copied`, the files that only grew and had just their new bytes added. */ appended: number; unchanged: number; metadataOnly: number; deferred: number; warnings: string[]; /** The pass was skipped because the last completed pass was too recent. */ throttled: boolean; } export interface SessionLogCaptureOptions { /** * Skip the pass when the last completed pass for this root finished less * than this many milliseconds ago. Unset or 0 copies every change. */ minIntervalMs?: number; /** Do not copy a source until its mtime has stayed quiet for this long. */ quietForMs?: number; /** Permit a still-active source to be copied after this much time without a committed copy. */ maxStalenessMs?: number; /** Clock, for tests. */ now?: () => number; } type CaptureTestPhase = "after-copy" | "after-prepare" | "after-prepare-batch" | "after-rename" | "before-commit" | "after-commit-batch"; /** Test-only crash seam for recovery coverage. */ export declare function setSessionLogCaptureTestHook(hook: ((phase: CaptureTestPhase, source: string) => void) | undefined): void; /** Test-only seam for forcing the append/compaction crash window. */ export declare function setSessionLogCaptureMaxRecordsBeforeCompactionForTest(maxRecordsBeforeCompaction: number | undefined): void; /** * Capture supported harness logs for one HQ root. This operation is deliberately * best-effort to retain reindex's historic contract, except a corrupt capture * store refuses the pass rather than silently re-copying every transcript. * * A live transcript grows on every tool call and each change rewrites its whole * copy, so frequent callers (the watch-mode sync runner) pass `minIntervalMs`. */ export declare function captureSessionLogs(root: string, options?: SessionLogCaptureOptions): SessionLogCaptureSummary; export {}; //# sourceMappingURL=session-log-capture.d.ts.map