refactor(background-agent): split manager.ts into focused modules

Extract 30+ single-responsibility modules from manager.ts (1556 LOC):
- task lifecycle: task-starter, task-completer, task-canceller, task-resumer
- task queries: task-queries, task-poller, task-queue-processor
- notifications: notification-builder, notification-tracker, parent-session-notifier
- session handling: session-validator, session-output-validator, session-todo-checker
- spawner: spawner/ directory with focused spawn modules
- utilities: duration-formatter, error-classifier, message-storage-locator
- result handling: result-handler-context, background-task-completer
- shutdown: background-manager-shutdown, process-signal
This commit is contained in:
YeonGyu-Kim
2026-02-08 16:20:52 +09:00
parent 3ec0a4f5a4
commit fdcee08460
43 changed files with 2753 additions and 2071 deletions
@@ -0,0 +1,56 @@
import type { BackgroundTask } from "./types"
export function getTasksByParentSession(
tasks: Iterable<BackgroundTask>,
sessionID: string
): BackgroundTask[] {
const result: BackgroundTask[] = []
for (const task of tasks) {
if (task.parentSessionID === sessionID) {
result.push(task)
}
}
return result
}
export function getAllDescendantTasks(
tasksByParent: (sessionID: string) => BackgroundTask[],
sessionID: string
): BackgroundTask[] {
const result: BackgroundTask[] = []
const directChildren = tasksByParent(sessionID)
for (const child of directChildren) {
result.push(child)
if (child.sessionID) {
result.push(...getAllDescendantTasks(tasksByParent, child.sessionID))
}
}
return result
}
export function findTaskBySession(
tasks: Iterable<BackgroundTask>,
sessionID: string
): BackgroundTask | undefined {
for (const task of tasks) {
if (task.sessionID === sessionID) return task
}
return undefined
}
export function getRunningTasks(tasks: Iterable<BackgroundTask>): BackgroundTask[] {
return Array.from(tasks).filter((t) => t.status === "running")
}
export function getCompletedTasks(tasks: Iterable<BackgroundTask>): BackgroundTask[] {
return Array.from(tasks).filter((t) => t.status !== "running")
}
export function hasRunningTasks(tasks: Iterable<BackgroundTask>): boolean {
for (const task of tasks) {
if (task.status === "running") return true
}
return false
}