b5769a4e10
SessionManager.fork() and createBranchedSession() deep-copy a parent's entries into the child JSONL — same entry_id, timestamp, model, responseId, token counts, cost. Stats keyed uniqueness on (session_file, entry_id), so both files contributed to request, token, and cost totals. insertMessageStats and insertUserMessageStats now skip rows whose (entry_id, timestamp) already exists under a different session_file (first-write-wins). A one-shot migration on initDb, gated by the fork_dedupe_v1 meta sentinel, collapses pre-existing duplicate rows in messages and user_messages by keeping the lowest-id row per (entry_id, timestamp) group. Fixes #3370