{"record":{"id":"31ddb4c165c10c51","repo":"earendil-works/pi","slug":"storage-31ddb4","errorCode":"storage","errorMessage":"Missing stats row for session ${sessionId}","messagePattern":"Missing stats row for session (.+?)","errorType":"exception","errorClass":"SessionError","httpStatus":null,"severity":"error","filePath":"packages/session-backends/sqlite-node/src/sqlite/storage/session-stats.ts","lineNumber":25,"sourceCode":"\tsession_id: string;\n\tmessage_count: number;\n\tcached_tokens: number;\n\tuncached_tokens: number;\n\ttotal_tokens: number;\n\tcost_total: number;\n}\n\nexport function createStats(db: SqliteDatabase, sessionId: string, messageCount = 0): void {\n\tsql`INSERT INTO session_stats\n\t\t\t(session_id, message_count, cached_tokens, uncached_tokens, total_tokens, cost_total)\n\t\t\tVALUES (${sessionId}, ${messageCount}, 0, 0, 0, 0)`.run(db);\n}\n\nexport function readStats(db: SqliteDatabase, sessionId: string): SessionStats {\n\tconst row = sql`SELECT session_id, message_count, cached_tokens, uncached_tokens, total_tokens, cost_total\n\t\tFROM session_stats\n\t\tWHERE session_id = ${sessionId}`.get<SessionStatsRow>(db);\n\tif (!row) throw new SessionError(\"storage\", `Missing stats row for session ${sessionId}`);\n\treturn {\n\t\tmessageCount: row.message_count,\n\t\tcachedTokens: row.cached_tokens,\n\t\tuncachedTokens: row.uncached_tokens,\n\t\ttotalTokens: row.total_tokens,\n\t\tcostTotal: row.cost_total,\n\t};\n}\n\nexport function incrementMessageCount(db: SqliteDatabase, sessionId: string): void {\n\tconst result = sql`UPDATE session_stats SET message_count = message_count + 1 WHERE session_id = ${sessionId}`.run(\n\t\tdb,\n\t);\n\tif (result.changes !== 1) throw new SessionError(\"storage\", `Missing stats row for session ${sessionId}`);\n}\n\nexport function addUsageToStats(db: SqliteDatabase, sessionId: string, usage: Usage): void {\n\tconst result = sql`UPDATE session_stats","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/earendil-works/pi/blob/4af9d21d3b4d664e4a29fcabfec85171077248e3/packages/session-backends/sqlite-node/src/sqlite/storage/session-stats.ts#L7-L43","documentation":"Error \"Missing stats row for session ${sessionId}\" thrown in earendil-works/pi.","triggerScenarios":"Thrown at packages/session-backends/sqlite-node/src/sqlite/storage/session-stats.ts:25 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["The session's stats row is missing; recreate the session record."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"4af9d21d3b4d664e4a29fcabfec85171077248e3","analyzedAt":"2026-08-24T13:07:14.692Z","schemaVersion":2},"datasetVersion":"2026-08-24T17:17:21.512Z"}