feat(KB-150): kill active agent sessions on global pause

- Add settings:updated event to TaskStore with previous/new settings payload
- Kill all active executor agent sessions when globalPause transitions false→true
- Kill all active triage specification sessions on global pause with clean status reset
- Track and dispose active merger session on global pause via onSession callback
- Add JSDoc documenting global pause behavior on executor and triage constructors
This commit is contained in:
Dustin Byrne
2026-03-28 02:16:30 -04:00
parent 72a8953e4e
commit d32c9c031f
9 changed files with 443 additions and 5 deletions

View File

@@ -164,6 +164,17 @@ export class TaskExecutor {
/** Tasks that had a dependency added mid-execution (abort + discard worktree). */
private depAborted = new Set<string>();
/**
* @param store — Task store instance (also used to listen for events)
* @param rootDir — Project root directory
* @param options — Executor configuration
*
* Listens for `task:moved` to auto-execute tasks moved to `in-progress`,
* `task:updated` to terminate agent sessions when individual tasks are paused,
* and `settings:updated` to terminate **all** active agent sessions when
* `globalPause` transitions from `false` to `true` (emergency stop).
* Paused tasks are moved back to `todo` rather than marked as `failed`.
*/
constructor(
private store: TaskStore,
private rootDir: string,
@@ -186,6 +197,17 @@ export class TaskExecutor {
session?.dispose();
}
});
// When globalPause transitions from false → true, terminate all active agent sessions.
store.on("settings:updated", ({ settings, previous }) => {
if (settings.globalPause && !previous.globalPause) {
for (const [taskId, session] of this.activeSessions) {
executorLog.log(`Global pause — terminating agent session for ${taskId}`);
this.pausedAborted.add(taskId);
session.dispose();
}
}
});
}
/**