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
92 lines
2.7 KiB
TypeScript
92 lines
2.7 KiB
TypeScript
import type { BackgroundTask, ResumeInput } from "../types"
|
|
import { log, getAgentToolRestrictions } from "../../../shared"
|
|
import type { SpawnerContext } from "./spawner-context"
|
|
import { subagentSessions } from "../../claude-code-session-state"
|
|
import { getTaskToastManager } from "../../task-toast-manager"
|
|
|
|
export async function resumeTask(
|
|
task: BackgroundTask,
|
|
input: ResumeInput,
|
|
ctx: Pick<SpawnerContext, "client" | "concurrencyManager" | "onTaskError">
|
|
): Promise<void> {
|
|
const { client, concurrencyManager, onTaskError } = ctx
|
|
|
|
if (!task.sessionID) {
|
|
throw new Error(`Task has no sessionID: ${task.id}`)
|
|
}
|
|
|
|
if (task.status === "running") {
|
|
log("[background-agent] Resume skipped - task already running:", {
|
|
taskId: task.id,
|
|
sessionID: task.sessionID,
|
|
})
|
|
return
|
|
}
|
|
|
|
const concurrencyKey = task.concurrencyGroup ?? task.agent
|
|
await concurrencyManager.acquire(concurrencyKey)
|
|
task.concurrencyKey = concurrencyKey
|
|
task.concurrencyGroup = concurrencyKey
|
|
|
|
task.status = "running"
|
|
task.completedAt = undefined
|
|
task.error = undefined
|
|
task.parentSessionID = input.parentSessionID
|
|
task.parentMessageID = input.parentMessageID
|
|
task.parentModel = input.parentModel
|
|
task.parentAgent = input.parentAgent
|
|
task.startedAt = new Date()
|
|
|
|
task.progress = {
|
|
toolCalls: task.progress?.toolCalls ?? 0,
|
|
lastUpdate: new Date(),
|
|
}
|
|
|
|
subagentSessions.add(task.sessionID)
|
|
|
|
const toastManager = getTaskToastManager()
|
|
if (toastManager) {
|
|
toastManager.addTask({
|
|
id: task.id,
|
|
description: task.description,
|
|
agent: task.agent,
|
|
isBackground: true,
|
|
})
|
|
}
|
|
|
|
log("[background-agent] Resuming task:", { taskId: task.id, sessionID: task.sessionID })
|
|
|
|
log("[background-agent] Resuming task - calling prompt (fire-and-forget) with:", {
|
|
sessionID: task.sessionID,
|
|
agent: task.agent,
|
|
model: task.model,
|
|
promptLength: input.prompt.length,
|
|
})
|
|
|
|
const resumeModel = task.model
|
|
? { providerID: task.model.providerID, modelID: task.model.modelID }
|
|
: undefined
|
|
const resumeVariant = task.model?.variant
|
|
|
|
client.session
|
|
.promptAsync({
|
|
path: { id: task.sessionID },
|
|
body: {
|
|
agent: task.agent,
|
|
...(resumeModel ? { model: resumeModel } : {}),
|
|
...(resumeVariant ? { variant: resumeVariant } : {}),
|
|
tools: {
|
|
...getAgentToolRestrictions(task.agent),
|
|
task: false,
|
|
call_omo_agent: true,
|
|
question: false,
|
|
},
|
|
parts: [{ type: "text", text: input.prompt }],
|
|
},
|
|
})
|
|
.catch((error: unknown) => {
|
|
log("[background-agent] resume prompt error:", error)
|
|
onTaskError(task, error instanceof Error ? error : new Error(String(error)))
|
|
})
|
|
}
|