fix: refresh tasks snapshot immediately after IPC task mutations

Previously, current_tasks.json was only written at container-start time,
so tasks created (or paused/cancelled/updated) during a session were
invisible to list_tasks until the next invocation.

Add an onTasksChanged callback to IpcDeps, called after every successful
mutation in processTaskIpc (schedule_task, pause_task, resume_task,
cancel_task, update_task). index.ts wires it up to write fresh snapshots
for all registered groups immediately, keeping no new coupling between
ipc.ts and the container layer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Michael Bravo
2026-03-10 15:58:24 +02:00
parent d572bab5c6
commit 5ca0633c27
3 changed files with 22 additions and 0 deletions

View File

@@ -575,6 +575,21 @@ async function main(): Promise<void> {
getAvailableGroups, getAvailableGroups,
writeGroupsSnapshot: (gf, im, ag, rj) => writeGroupsSnapshot: (gf, im, ag, rj) =>
writeGroupsSnapshot(gf, im, ag, rj), writeGroupsSnapshot(gf, im, ag, rj),
onTasksChanged: () => {
const tasks = getAllTasks();
const taskRows = tasks.map((t) => ({
id: t.id,
groupFolder: t.group_folder,
prompt: t.prompt,
schedule_type: t.schedule_type,
schedule_value: t.schedule_value,
status: t.status,
next_run: t.next_run,
}));
for (const group of Object.values(registeredGroups)) {
writeTasksSnapshot(group.folder, group.isMain === true, taskRows);
}
},
}); });
queue.setProcessMessagesFn(processGroupMessages); queue.setProcessMessagesFn(processGroupMessages);
recoverPendingMessages(); recoverPendingMessages();

View File

@@ -62,6 +62,7 @@ beforeEach(() => {
syncGroups: async () => {}, syncGroups: async () => {},
getAvailableGroups: () => [], getAvailableGroups: () => [],
writeGroupsSnapshot: () => {}, writeGroupsSnapshot: () => {},
onTasksChanged: () => {},
}; };
}); });

View File

@@ -22,6 +22,7 @@ export interface IpcDeps {
availableGroups: AvailableGroup[], availableGroups: AvailableGroup[],
registeredJids: Set<string>, registeredJids: Set<string>,
) => void; ) => void;
onTasksChanged: () => void;
} }
let ipcWatcherRunning = false; let ipcWatcherRunning = false;
@@ -270,6 +271,7 @@ export async function processTaskIpc(
{ taskId, sourceGroup, targetFolder, contextMode }, { taskId, sourceGroup, targetFolder, contextMode },
'Task created via IPC', 'Task created via IPC',
); );
deps.onTasksChanged();
} }
break; break;
@@ -282,6 +284,7 @@ export async function processTaskIpc(
{ taskId: data.taskId, sourceGroup }, { taskId: data.taskId, sourceGroup },
'Task paused via IPC', 'Task paused via IPC',
); );
deps.onTasksChanged();
} else { } else {
logger.warn( logger.warn(
{ taskId: data.taskId, sourceGroup }, { taskId: data.taskId, sourceGroup },
@@ -300,6 +303,7 @@ export async function processTaskIpc(
{ taskId: data.taskId, sourceGroup }, { taskId: data.taskId, sourceGroup },
'Task resumed via IPC', 'Task resumed via IPC',
); );
deps.onTasksChanged();
} else { } else {
logger.warn( logger.warn(
{ taskId: data.taskId, sourceGroup }, { taskId: data.taskId, sourceGroup },
@@ -318,6 +322,7 @@ export async function processTaskIpc(
{ taskId: data.taskId, sourceGroup }, { taskId: data.taskId, sourceGroup },
'Task cancelled via IPC', 'Task cancelled via IPC',
); );
deps.onTasksChanged();
} else { } else {
logger.warn( logger.warn(
{ taskId: data.taskId, sourceGroup }, { taskId: data.taskId, sourceGroup },
@@ -388,6 +393,7 @@ export async function processTaskIpc(
{ taskId: data.taskId, sourceGroup, updates }, { taskId: data.taskId, sourceGroup, updates },
'Task updated via IPC', 'Task updated via IPC',
); );
deps.onTasksChanged();
} }
break; break;