diff --git a/src/features/background-agent/spawner/task-factory.ts b/src/features/background-agent/spawner/task-factory.ts deleted file mode 100644 index e7788be7..00000000 --- a/src/features/background-agent/spawner/task-factory.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { randomUUID } from "crypto" -import type { BackgroundTask, LaunchInput } from "../types" - -export function createTask(input: LaunchInput): BackgroundTask { - return { - id: `bg_${randomUUID().slice(0, 8)}`, - status: "pending", - queuedAt: new Date(), - description: input.description, - prompt: input.prompt, - agent: input.agent, - parentSessionID: input.parentSessionID, - parentMessageID: input.parentMessageID, - parentModel: input.parentModel, - parentAgent: input.parentAgent, - parentTools: input.parentTools, - model: input.model, - } -} diff --git a/src/features/background-agent/spawner/task-resumer.ts b/src/features/background-agent/spawner/task-resumer.ts deleted file mode 100644 index 7c7d5d2a..00000000 --- a/src/features/background-agent/spawner/task-resumer.ts +++ /dev/null @@ -1,99 +0,0 @@ -import type { BackgroundTask, ResumeInput } from "../types" -import { log, getAgentToolRestrictions } from "../../../shared" -import { setSessionTools } from "../../../shared/session-tools-store" -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 -): Promise { - 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 - if (input.parentTools) { - task.parentTools = input.parentTools - } - 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: (() => { - const tools = { - ...getAgentToolRestrictions(task.agent), - task: false, - call_omo_agent: true, - question: false, - } - setSessionTools(task.sessionID!, tools) - return tools - })(), - 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))) - }) -} diff --git a/src/features/background-agent/spawner/task-starter.ts b/src/features/background-agent/spawner/task-starter.ts deleted file mode 100644 index a904a20b..00000000 --- a/src/features/background-agent/spawner/task-starter.ts +++ /dev/null @@ -1,99 +0,0 @@ -import type { QueueItem } from "../constants" -import { log, getAgentToolRestrictions, promptWithModelSuggestionRetry } from "../../../shared" -import { setSessionTools } from "../../../shared/session-tools-store" -import { subagentSessions } from "../../claude-code-session-state" -import { getTaskToastManager } from "../../task-toast-manager" -import { createBackgroundSession } from "./background-session-creator" -import { getConcurrencyKeyFromLaunchInput } from "./concurrency-key-from-launch-input" -import { resolveParentDirectory } from "./parent-directory-resolver" -import type { SpawnerContext } from "./spawner-context" -import { maybeInvokeTmuxCallback } from "./tmux-callback-invoker" - -export async function startTask(item: QueueItem, ctx: SpawnerContext): Promise { - const { task, input } = item - const { client, directory, concurrencyManager, tmuxEnabled, onSubagentSessionCreated, onTaskError } = ctx - - log("[background-agent] Starting task:", { - taskId: task.id, - agent: input.agent, - model: input.model, - }) - - const concurrencyKey = getConcurrencyKeyFromLaunchInput(input) - const parentDirectory = await resolveParentDirectory({ - client, - parentSessionID: input.parentSessionID, - defaultDirectory: directory, - }) - - const sessionID = await createBackgroundSession({ - client, - input, - parentDirectory, - concurrencyManager, - concurrencyKey, - }) - subagentSessions.add(sessionID) - - await maybeInvokeTmuxCallback({ - onSubagentSessionCreated, - tmuxEnabled, - sessionID, - parentID: input.parentSessionID, - title: input.description, - }) - - task.status = "running" - task.startedAt = new Date() - task.sessionID = sessionID - task.progress = { - toolCalls: 0, - lastUpdate: new Date(), - } - task.concurrencyKey = concurrencyKey - task.concurrencyGroup = concurrencyKey - - log("[background-agent] Launching task:", { taskId: task.id, sessionID, agent: input.agent }) - - const toastManager = getTaskToastManager() - if (toastManager) { - toastManager.updateTask(task.id, "running") - } - - log("[background-agent] Calling prompt (fire-and-forget) for launch with:", { - sessionID, - agent: input.agent, - model: input.model, - hasSkillContent: !!input.skillContent, - promptLength: input.prompt.length, - }) - - const launchModel = input.model - ? { providerID: input.model.providerID, modelID: input.model.modelID } - : undefined - const launchVariant = input.model?.variant - - promptWithModelSuggestionRetry(client, { - path: { id: sessionID }, - body: { - agent: input.agent, - ...(launchModel ? { model: launchModel } : {}), - ...(launchVariant ? { variant: launchVariant } : {}), - system: input.skillContent, - tools: (() => { - const tools = { - ...getAgentToolRestrictions(input.agent), - task: false, - call_omo_agent: true, - question: false, - } - setSessionTools(sessionID, tools) - return tools - })(), - parts: [{ type: "text", text: input.prompt }], - }, - }).catch((error: unknown) => { - log("[background-agent] promptAsync error:", error) - onTaskError(task, error instanceof Error ? error : new Error(String(error))) - }) -}