diff --git a/src/data/monitor.ts b/src/data/monitor.ts index 79ae150..6039253 100644 --- a/src/data/monitor.ts +++ b/src/data/monitor.ts @@ -267,14 +267,17 @@ export interface IdleSessionInfo { } export function getIdleSessions(projects: Project[]): IdleSessionInfo[] { - const idle: IdleSessionInfo[] = [] + // Deduplicate by project+sessionFile — multiple processes in same CWD share one sessionFile + const seen = new Map() for (const project of projects) { const sessions = sessionsByPath.get(project.path) if (!sessions) continue for (const s of sessions) { if (s.busy) continue if (!s.lastActivityMs) continue - // Find matching session info for title/prompt + const dedupeKey = `${project.path}:${s.sessionFile || s.pid}` + const existing = seen.get(dedupeKey) + if (existing && existing.idleSinceMs >= s.lastActivityMs) continue let title = "" let lastPrompt = "" let lastResponse = "" @@ -288,7 +291,7 @@ export function getIdleSessions(projects: Project[]): IdleSessionInfo[] { lastResponse = match.lastAssistantMsg } } - idle.push({ + seen.set(dedupeKey, { projectPath: project.path, projectName: project.name, tty: s.tty, @@ -299,6 +302,7 @@ export function getIdleSessions(projects: Project[]): IdleSessionInfo[] { }) } } + const idle = Array.from(seen.values()) idle.sort((a, b) => b.idleSinceMs - a.idleSinceMs) return idle } diff --git a/src/index.ts b/src/index.ts index 2d5b0e9..4e5a0c3 100755 --- a/src/index.ts +++ b/src/index.ts @@ -812,14 +812,14 @@ async function main() { } else { const sessions = await detectActiveSessions() const changed = updateProjectSessions(projects, sessions) - // Eagerly load session data for active projects (needed for idle panel) + const transitioned = checkTransitions(projects, prevBusySnapshot) + // Eagerly load/refresh session data for active projects (needed for idle panel) for (const p of projects) { - if (p.activeSessions > 0 && !p.sessions) { + if (p.activeSessions > 0 && (!p.sessions || transitioned.length > 0)) { p.sessions = await loadSessions(p.path) p.sessionCount = p.sessions.length } } - const transitioned = checkTransitions(projects, prevBusySnapshot) prevBusySnapshot = snapshotBusy(projects) if (transitioned.length > 0) { playDoneSound()