Skip to content

Commit 1b538c2

Browse files
committed
fix: pass session start timestamp to recordSession
Preserves the actual session start time instead of using Date.now() at recording time, so session duration and leaderboard timestamps are accurate.
1 parent bbd7ad6 commit 1b538c2

5 files changed

Lines changed: 8 additions & 8 deletions

File tree

‎src/main/ipc-handlers.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@ export function registerIpcHandlers(mainWindow: BrowserWindow): void {
138138
return stats.getAllSessions();
139139
});
140140

141-
ipcMain.handle('stats:recordSession', (_event, sessionStats: SessionStats) => {
142-
stats.recordSession(sessionStats);
141+
ipcMain.handle('stats:recordSession', (_event, sessionStats: SessionStats, timestamp?: number) => {
142+
stats.recordSession(sessionStats, timestamp);
143143
});
144144

145145
ipcMain.handle('stats:getLifetimeStats', () => {

‎src/main/stats-service.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ const store = new Store<StoreSchema>({
112112
});
113113

114114
export class StatsService {
115-
recordSession(stats: SessionStats): void {
115+
recordSession(stats: SessionStats, timestamp?: number): void {
116116
const sessions = store.get('sessions');
117-
sessions.push({ ...stats, timestamp: Date.now(), cwd: store.get('currentCwd') || undefined });
117+
sessions.push({ ...stats, timestamp: timestamp ?? Date.now(), cwd: store.get('currentCwd') || undefined });
118118
store.set('sessions', sessions);
119119

120120
// Update all-time bests

‎src/preload/preload.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ contextBridge.exposeInMainWorld('statsAPI', {
7474
getAllTimeBests(): Promise<Record<string, number>> {
7575
return ipcRenderer.invoke('stats:getAllTimeBests');
7676
},
77-
recordSession(stats: unknown): Promise<void> {
78-
return ipcRenderer.invoke('stats:recordSession', stats);
77+
recordSession(stats: unknown, timestamp?: number): Promise<void> {
78+
return ipcRenderer.invoke('stats:recordSession', stats, timestamp);
7979
},
8080
getLifetimeStats(): Promise<{ lifetimeTokens: number; totalSessions: number; longestStreak: number; currentStreak: number; fastestResponse: number }> {
8181
return ipcRenderer.invoke('stats:getLifetimeStats');

‎src/renderer/App.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ export default function App() {
325325
linesRemoved: stats.linesRemoved,
326326
toolCalls: stats.toolCalls,
327327
durationMs,
328-
});
328+
}, start);
329329
// Save session replay events
330330
sessionRecorder.save();
331331

‎src/renderer/types/global.d.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ interface StatsAPI {
2323
getAllSessions(): Promise<(SessionStats & { timestamp: number; cwd?: string })[]>;
2424
getTopSessions(limit: number): Promise<unknown[]>;
2525
getAllTimeBests(): Promise<Partial<Record<keyof SessionStats, number>>>;
26-
recordSession(stats: SessionStats): Promise<void>;
26+
recordSession(stats: SessionStats, timestamp?: number): Promise<void>;
2727
getLifetimeStats(): Promise<LifetimeStats>;
2828
getCurrentSessionRank(totalTokens: number): Promise<number>;
2929
getAchievements(): Promise<Achievement[]>;

0 commit comments

Comments
 (0)