From 345e228a91b2cda8c407cfb407ead45e1588de6e Mon Sep 17 00:00:00 2001 From: lzt404 <2596933790@qq.com> Date: Wed, 23 Sep 2026 19:37:00 +0800 Subject: [PATCH] fix(usage): use unique database row IDs for event list keys Fixes #298 --- src-tauri/src/usage.rs | 22 +++++++++++++++++++++- src/pages/UsageRecordsPage.tsx | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/usage.rs b/src-tauri/src/usage.rs index 21ea7ca..2a9f8cd 100644 --- a/src-tauri/src/usage.rs +++ b/src-tauri/src/usage.rs @@ -185,6 +185,8 @@ struct UsageTokenStats { #[derive(Clone, Serialize, Deserialize)] pub(crate) struct UsageRecord { id: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + row_id: Option, timestamp: String, #[serde(default)] latency_ms: u64, @@ -2714,6 +2716,7 @@ fn normalize_usage_record(value: Value, config: &GuiConfigFile) -> Result) -> rusqlite::Result { Ok(UsageRecord { id: row.get(0)?, + row_id: Some(row.get::<_, i64>(36)?.to_string()), timestamp: row.get(1)?, latency_ms: from_sql_i64(row.get(2)?), ttft_ms: row.get::<_, Option>(3)?.map(from_sql_i64), @@ -4676,6 +4680,7 @@ mod tests { fn sample_record(id: &str, timestamp: &str, model: &str) -> UsageRecord { UsageRecord { id: id.to_string(), + row_id: None, timestamp: timestamp.to_string(), latency_ms: 100, ttft_ms: Some(20), @@ -5819,6 +5824,21 @@ mod tests { .unwrap(); assert_eq!(count, 2); + let events = load_usage_events( + &connection, + &UsageQuery::default(), + &GuiConfigFile::default(), + ) + .unwrap(); + assert_eq!(events.items.len(), 2); + assert_eq!(events.items[0].id, events.items[1].id); + assert_ne!(events.items[0].row_id, events.items[1].row_id); + let serialized = serde_json::to_value(&events).unwrap(); + assert!(serialized["items"][0]["row_id"].as_str().is_some()); + assert_ne!( + serialized["items"][0]["row_id"], + serialized["items"][1]["row_id"] + ); drop(connection); fs::remove_dir_all(root).unwrap(); } diff --git a/src/pages/UsageRecordsPage.tsx b/src/pages/UsageRecordsPage.tsx index cb5ffa3..65c0b7a 100644 --- a/src/pages/UsageRecordsPage.tsx +++ b/src/pages/UsageRecordsPage.tsx @@ -95,6 +95,7 @@ type UsageAnalysis = { type UsageRecord = { id: string; + row_id: string; timestamp: string; latency_ms: number; ttft_ms: number | null; @@ -2157,7 +2158,7 @@ function EventsView({ {events.items.map((record) => ( - + {visibleColumns.map((column) => (