@@ -34,6 +34,7 @@ export class HeartbeatManager {
3434 private lastActivity : number = Date . now ( ) ;
3535 private todayLocalTotalSeconds : number = 0 ;
3636 private isWindowFocused : boolean = true ;
37+ private unsyncedLocalSeconds : number = 0 ;
3738
3839 constructor (
3940 private context : vscode . ExtensionContext ,
@@ -170,7 +171,14 @@ export class HeartbeatManager {
170171 } ;
171172
172173 private updateActivity ( ) : void {
173- this . lastActivity = Date . now ( ) ;
174+ const now = Date . now ( ) ;
175+ if ( this . isUserActive ( ) && this . lastActivity > 0 ) {
176+ const elapsedSeconds = Math . floor ( ( now - this . lastActivity ) / 1000 ) ;
177+ if ( elapsedSeconds > 0 ) {
178+ this . unsyncedLocalSeconds += elapsedSeconds ;
179+ }
180+ }
181+ this . lastActivity = now ;
174182 }
175183
176184 private scheduleHeartbeat ( ) : void {
@@ -180,6 +188,7 @@ export class HeartbeatManager {
180188
181189 setInterval ( ( ) => {
182190 if ( this . activeDocumentInfo && this . isUserActive ( ) ) {
191+ this . updateActivity ( ) ;
183192 this . sendHeartbeat ( ) ;
184193 } else {
185194 log ( "User inactive or no active document, skipping heartbeat" ) ;
@@ -202,6 +211,8 @@ export class HeartbeatManager {
202211 }
203212
204213 public async fetchDailySummary ( ) : Promise < void > {
214+ this . updateActivity ( ) ;
215+
205216 const apiKey = await getApiKey ( ) ;
206217 const baseUrl = await getBaseUrl ( ) ;
207218 if ( ! apiKey || ! baseUrl ) {
@@ -256,15 +267,20 @@ export class HeartbeatManager {
256267 const todaySummary = apiResponse . summaries [ 0 ] ;
257268 this . todayLocalTotalSeconds = todaySummary . totalSeconds ;
258269
270+ const totalSeconds =
271+ this . todayLocalTotalSeconds + this . unsyncedLocalSeconds ;
272+
259273 if ( this . statusBar ) {
260- const hours = Math . floor ( this . todayLocalTotalSeconds / 3600 ) ;
261- const minutes = Math . floor ( ( this . todayLocalTotalSeconds % 3600 ) / 60 ) ;
274+ const hours = Math . floor ( totalSeconds / 3600 ) ;
275+ const minutes = Math . floor ( ( totalSeconds % 3600 ) / 60 ) ;
262276 this . statusBar . updateTime ( hours , minutes ) ;
263277 }
264278 } else {
265- this . todayLocalTotalSeconds = 0 ;
279+ const totalSeconds = this . unsyncedLocalSeconds ;
266280 if ( this . statusBar ) {
267- this . statusBar . updateTime ( 0 , 0 ) ;
281+ const hours = Math . floor ( totalSeconds / 3600 ) ;
282+ const minutes = Math . floor ( ( totalSeconds % 3600 ) / 60 ) ;
283+ this . statusBar . updateTime ( hours , minutes ) ;
268284 }
269285 }
270286 } catch ( error ) {
@@ -275,6 +291,14 @@ export class HeartbeatManager {
275291 this . setOnlineStatus ( false ) ;
276292 log ( `Error fetching daily summary: ${ error } ` ) ;
277293 }
294+
295+ if ( this . statusBar && this . unsyncedLocalSeconds > 0 ) {
296+ const totalSeconds =
297+ this . todayLocalTotalSeconds + this . unsyncedLocalSeconds ;
298+ const hours = Math . floor ( totalSeconds / 3600 ) ;
299+ const minutes = Math . floor ( ( totalSeconds % 3600 ) / 60 ) ;
300+ this . statusBar . updateTime ( hours , minutes ) ;
301+ }
278302 }
279303 }
280304
@@ -347,6 +371,8 @@ export class HeartbeatManager {
347371 this . setOnlineStatus ( true ) ;
348372 this . setApiKeyStatus ( true ) ;
349373 this . saveOfflineHeartbeats ( ) ;
374+
375+ this . unsyncedLocalSeconds = 0 ;
350376 } catch ( error ) {
351377 log (
352378 `Error syncing offline heartbeats batch: ${
@@ -463,6 +489,9 @@ export class HeartbeatManager {
463489 this . successCount ++ ;
464490 this . setOnlineStatus ( true ) ;
465491 this . setApiKeyStatus ( true ) ;
492+
493+ this . unsyncedLocalSeconds = 0 ;
494+
466495 resolve ( ) ;
467496 } else if ( res . statusCode === 401 ) {
468497 this . setApiKeyStatus ( false ) ;
0 commit comments