diff --git a/src/features/background-agent/manager.ts b/src/features/background-agent/manager.ts index feb233b..3836067 100644 --- a/src/features/background-agent/manager.ts +++ b/src/features/background-agent/manager.ts @@ -99,6 +99,7 @@ export class BackgroundManager { toolCalls: 0, lastUpdate: new Date(), }, + parentModel: input.parentModel, } this.tasks.set(task.id, task) @@ -322,10 +323,16 @@ export class BackgroundManager { const messageDir = getMessageDir(task.parentSessionID) const prevMessage = messageDir ? findNearestMessageWithFields(messageDir) : null + const modelContext = task.parentModel ?? prevMessage?.model + const modelField = modelContext?.providerID && modelContext?.modelID + ? { providerID: modelContext.providerID, modelID: modelContext.modelID } + : undefined + await this.client.session.prompt({ path: { id: task.parentSessionID }, body: { agent: prevMessage?.agent, + model: modelField, parts: [{ type: "text", text: message }], }, query: { directory: this.directory }, diff --git a/src/features/background-agent/types.ts b/src/features/background-agent/types.ts index 1d5356a..7ba29ec 100644 --- a/src/features/background-agent/types.ts +++ b/src/features/background-agent/types.ts @@ -26,6 +26,7 @@ export interface BackgroundTask { result?: string error?: string progress?: TaskProgress + parentModel?: { providerID: string; modelID: string } } export interface LaunchInput { @@ -34,4 +35,5 @@ export interface LaunchInput { agent: string parentSessionID: string parentMessageID: string + parentModel?: { providerID: string; modelID: string } } diff --git a/src/tools/background-task/tools.ts b/src/tools/background-task/tools.ts index b66d833..802caff 100644 --- a/src/tools/background-task/tools.ts +++ b/src/tools/background-task/tools.ts @@ -1,10 +1,27 @@ import { tool, type PluginInput } from "@opencode-ai/plugin" +import { existsSync, readdirSync } from "node:fs" +import { join } from "node:path" import type { BackgroundManager, BackgroundTask } from "../../features/background-agent" import type { BackgroundTaskArgs, BackgroundOutputArgs, BackgroundCancelArgs } from "./types" import { BACKGROUND_TASK_DESCRIPTION, BACKGROUND_OUTPUT_DESCRIPTION, BACKGROUND_CANCEL_DESCRIPTION } from "./constants" +import { findNearestMessageWithFields, MESSAGE_STORAGE } from "../../features/hook-message-injector" type OpencodeClient = PluginInput["client"] +function getMessageDir(sessionID: string): string | null { + if (!existsSync(MESSAGE_STORAGE)) return null + + const directPath = join(MESSAGE_STORAGE, sessionID) + if (existsSync(directPath)) return directPath + + for (const dir of readdirSync(MESSAGE_STORAGE)) { + const sessionPath = join(MESSAGE_STORAGE, dir, sessionID) + if (existsSync(sessionPath)) return sessionPath + } + + return null +} + function formatDuration(start: Date, end?: Date): string { const duration = (end ?? new Date()).getTime() - start.getTime() const seconds = Math.floor(duration / 1000) @@ -34,12 +51,19 @@ export function createBackgroundTask(manager: BackgroundManager) { } try { + const messageDir = getMessageDir(toolContext.sessionID) + const prevMessage = messageDir ? findNearestMessageWithFields(messageDir) : null + const parentModel = prevMessage?.model?.providerID && prevMessage?.model?.modelID + ? { providerID: prevMessage.model.providerID, modelID: prevMessage.model.modelID } + : undefined + const task = await manager.launch({ description: args.description, prompt: args.prompt, agent: args.agent.trim(), parentSessionID: toolContext.sessionID, parentMessageID: toolContext.messageID, + parentModel, }) return `Background task launched successfully.