fix: reset completed session on resume to prevent age limit false positives

When Claude Code resumes after mac sleep without proper SessionEnd hook,
createSDKSession was reusing the old completed row with stale started_at_epoch,
causing all observations and summaries to be blocked by the 4h wall-clock limit.

Now detects completed sessions on resume and resets started_at_epoch to now.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
JOUNGWOOK KWON
2026-04-16 19:24:21 +09:00
parent 70a150db74
commit 79170f007a
5 changed files with 327 additions and 296 deletions
+16 -2
View File
@@ -43,10 +43,24 @@ export function createSDKSession(
// Check for existing session
const existing = db.prepare(`
SELECT id, platform_source FROM sdk_sessions WHERE content_session_id = ?
`).get(contentSessionId) as { id: number; platform_source: string | null } | undefined;
SELECT id, platform_source, completed_at_epoch FROM sdk_sessions WHERE content_session_id = ?
`).get(contentSessionId) as { id: number; platform_source: string | null; completed_at_epoch: number | null } | undefined;
if (existing) {
// If the session was previously completed (e.g., mac sleep/resume without proper SessionEnd),
// reset it so the age limit check starts fresh from now.
if (existing.completed_at_epoch) {
logger.info('SESSION', 'Resetting completed session on resume (mac sleep/resume detected)', {
contentSessionId,
previousCompletedAt: new Date(existing.completed_at_epoch).toISOString()
});
db.prepare(`
UPDATE sdk_sessions
SET started_at_epoch = ?, started_at = ?, completed_at_epoch = NULL, completed_at = NULL, status = 'active'
WHERE content_session_id = ?
`).run(nowEpoch, now.toISOString(), contentSessionId);
}
// Backfill project if session was created by another hook with empty project
if (project) {
db.prepare(`