Skip to content

Commit 98adfc5

Browse files
grimmerkclaude
andcommitted
fix: review — toggle OFF returns empty, persist scanned statuses to files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent a68b6a9 commit 98adfc5

3 files changed

Lines changed: 25 additions & 3 deletions

File tree

src/main.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
readAllStatuses,
3434
watchStatusDir,
3535
scanInitialStatuses,
36+
writeStatusFile,
3637
SessionStatus,
3738
} from './session-status-hooks';
3839
import {
@@ -1836,6 +1837,10 @@ ipcMain.on('set-session-status-hooks-enabled', async (_event, enabled: boolean)
18361837
});
18371838

18381839
ipcMain.handle('get-session-statuses', async () => {
1840+
// Return empty when hooks disabled — all dots revert to purple
1841+
const enabled = (await settings.get('session-status-hooks')) !== false;
1842+
if (!enabled) return {};
1843+
18391844
const fileStatuses = readAllStatuses();
18401845
const obj: Record<string, SessionStatus> = {};
18411846
fileStatuses.forEach((v, k) => { obj[k] = v; });
@@ -1854,7 +1859,11 @@ ipcMain.handle('get-session-statuses', async () => {
18541859

18551860
if (sessionsWithoutStatus.length > 0) {
18561861
const scanned = await scanInitialStatuses(sessionsWithoutStatus);
1857-
scanned.forEach((v, k) => { obj[k] = v; });
1862+
scanned.forEach((v, k) => {
1863+
obj[k] = v;
1864+
// Persist scanned status to file so fs.watch treats all statuses uniformly
1865+
writeStatusFile(k, v as string);
1866+
});
18581867
}
18591868
} catch {}
18601869

src/session-status-hooks.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,4 +296,17 @@ export const scanInitialStatuses = async (
296296
return statuses;
297297
};
298298

299+
/**
300+
* Write a status file for a session (used to persist JSONL-scanned statuses).
301+
*/
302+
export const writeStatusFile = (sessionId: string, status: string): void => {
303+
try {
304+
fs.mkdirSync(STATUS_DIR, { recursive: true });
305+
const tmpFile = path.join(STATUS_DIR, `.${sessionId}.tmp`);
306+
const targetFile = path.join(STATUS_DIR, `${sessionId}.json`);
307+
fs.writeFileSync(tmpFile, JSON.stringify({ status, timestamp: Math.floor(Date.now() / 1000), cwd: '' }));
308+
fs.renameSync(tmpFile, targetFile);
309+
} catch {}
310+
};
311+
299312
export { STATUS_DIR, HOOK_SCRIPT_PATH };

src/switcher-ui.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,8 @@ function SwitcherApp() {
512512
if (statuses) setSessionStatuses(statuses);
513513
});
514514
window.electronAPI.onSessionStatusesUpdated((_event: any, statuses: Record<string, string>) => {
515-
// Merge instead of replace — preserve JSONL-scanned statuses for sessions without status files
516-
setSessionStatuses((prev) => ({ ...prev, ...statuses }));
515+
// Use disk snapshot as source of truth — clears removed sessions
516+
setSessionStatuses(statuses);
517517
});
518518

519519
window.electronAPI.onCheckTerminalAndHide(() => {

0 commit comments

Comments
 (0)