Merge claude/2

This commit is contained in:
librelad 2026-05-27 21:17:37 +01:00
commit 5915014c2e

View File

@ -119,13 +119,28 @@ class TaskEventBus {
timestamp: Date.now()
};
const isTerminal = task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled';
const wasTerminal = prevStatus === 'completed' || prevStatus === 'failed' || prevStatus === 'cancelled';
// Bootstrap silently. When this is the first time we've ever seen a task
// AND it's already in a terminal state, we have NO evidence it
// transitioned just now — it might have completed seconds or hours ago.
// The backend re-broadcasts the file's contents on any inode change (e.g.
// the periodic ownership/permission sweep stats every task file), so
// firing taskCompleted here would surface a "ghost" completion
// notification for a task the user already saw finish 28 minutes ago.
// Just record it in our map and move on.
if (isNew && isTerminal) {
return;
}
if (isNew) {
window.dispatchEvent(new CustomEvent('taskCreated', { detail }));
}
const isTerminal = task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled';
const wasTerminal = prevStatus === 'completed' || prevStatus === 'failed' || prevStatus === 'cancelled';
// Genuine transition to terminal: we had a prior non-terminal record and
// the current upsert flips that to terminal. This is what users expect
// to be notified about.
if (isTerminal && !wasTerminal) {
window.dispatchEvent(new CustomEvent('taskCompleted', { detail }));
} else if (!isNew) {