From f8ea641cdb8b96497d2c0c093368cc259c3da814 Mon Sep 17 00:00:00 2001 From: can1357 Date: Fri, 15 May 2026 01:09:26 +0200 Subject: [PATCH] fix(stats): ignored messages without IDs when parsing session entries - Added message-ID checks in both assistant and user message parsers so entries without valid ids are ignored. - This filtering prevents legacy, unlinked message records from being treated as parseable assistant or user messages. --- packages/stats/src/parser.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/stats/src/parser.ts b/packages/stats/src/parser.ts index d99d43305..42dd1eab3 100644 --- a/packages/stats/src/parser.ts +++ b/packages/stats/src/parser.ts @@ -31,6 +31,10 @@ function extractFolderFromPath(sessionPath: string): string { function isAssistantMessage(entry: SessionEntry): entry is SessionMessageEntry { if (entry.type !== "message") return false; const msgEntry = entry as SessionMessageEntry; + // Legacy sessions (pre-id tracking) recorded message entries without an `id`. + // They're not linkable and would violate the messages.entry_id NOT NULL + // constraint, so skip them at the parser boundary. + if (typeof msgEntry.id !== "string" || msgEntry.id.length === 0) return false; return msgEntry.message?.role === "assistant"; } @@ -40,6 +44,7 @@ function isAssistantMessage(entry: SessionEntry): entry is SessionMessageEntry { function isUserMessage(entry: SessionEntry): entry is SessionMessageEntry { if (entry.type !== "message") return false; const msgEntry = entry as SessionMessageEntry; + if (typeof msgEntry.id !== "string" || msgEntry.id.length === 0) return false; return msgEntry.message?.role === "user"; }