Saved logs move from a JSONL directory tree to one SQLite database per log directory (<dir>/logs.db) in WAL mode. Entries are queued and written one transaction per batch, and a worker thread per store copies the WAL into the database and writes snapshots, so a commit never waits for a disk sync on the thread that logs. An agent installation held 1,684,962 files taking 6.5 GB for 974 MB of data; the same logs are now one file.
getLogsForDir, getAllLogs and getAllLogsAcrossPartitions are replaced by queryLogs and log.queryLogs: partition, level, minLevel, group prefix, since, until, search, cursor or offset paging, and an opt-in exact count. listGroups, exportLogs and snapshotStore are new. Queries that span several levels, a group prefix or every partition fan out into indexed per-value queries and merge, so they never scan a partition by time.
Partitions are labels on stored entries instead of folders: setPartition, finalizePartition({ ifExists }), renamePartition and deletePartitions. promotePartition, createPartition, copyPartition, movePartition, mergePartition, deleteLogs, marker files and the temporary-name heuristics are gone. Retention is on by default at 14 days and a 256 MB cap, deleting in chunks that yield between them.
The Rust addon, its CI matrix and the fflate and tar-stream dependencies are removed. Saving logs requires Bun; a logger without a directory still runs on Node.js. Adds scripts/verify/store.mjs and scripts/verify/perf.mjs.