From aa6f8333ee5326a1131073ca0a27bd07cdc0a3a9 Mon Sep 17 00:00:00 2001 From: dbpolito Date: Sat, 10 Jan 2026 15:08:30 -0300 Subject: [PATCH 1/4] chore(opencode): Change /review to plan agent + Stop changing mode for subtasks --- packages/opencode/src/command/index.ts | 1 + packages/opencode/src/session/prompt.ts | 30 +++++++++++++------------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/packages/opencode/src/command/index.ts b/packages/opencode/src/command/index.ts index 976f1cd51e9..4451523713b 100644 --- a/packages/opencode/src/command/index.ts +++ b/packages/opencode/src/command/index.ts @@ -75,6 +75,7 @@ export namespace Command { }, subtask: true, hints: hints(PROMPT_REVIEW), + agent: "plan" }, } diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index f891612272c..156b27091a0 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -1545,25 +1545,27 @@ export namespace SessionPrompt { } const templateParts = await resolvePromptParts(template) - const parts = - (agent.mode === "subagent" && command.subtask !== false) || command.subtask === true - ? [ - { - type: "subtask" as const, - agent: agent.name, - description: command.description ?? "", - command: input.command, - // TODO: how can we make task tool accept a more complex input? - prompt: templateParts.find((y) => y.type === "text")?.text ?? "", - }, - ] - : [...templateParts, ...(input.parts ?? [])] + const isSubtask = (agent.mode === "subagent" && command.subtask !== false) || command.subtask === true + const parts = isSubtask + ? [ + { + type: "subtask" as const, + agent: agent.name, + description: command.description ?? "", + command: input.command, + // TODO: how can we make task tool accept a more complex input? + prompt: templateParts.find((y) => y.type === "text")?.text ?? "", + }, + ] + : [...templateParts, ...(input.parts ?? [])] + + const userAgent = isSubtask ? (input.agent ?? (await Agent.defaultAgent())) : agentName const result = (await prompt({ sessionID: input.sessionID, messageID: input.messageID, model, - agent: agentName, + agent: userAgent, parts, variant: input.variant, })) as MessageV2.WithParts From 35c8a9de116aeb6050a3197370e24170e6d2ef26 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Sat, 10 Jan 2026 21:58:26 -0600 Subject: [PATCH 2/4] rm --- packages/opencode/src/command/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/opencode/src/command/index.ts b/packages/opencode/src/command/index.ts index 4451523713b..976f1cd51e9 100644 --- a/packages/opencode/src/command/index.ts +++ b/packages/opencode/src/command/index.ts @@ -75,7 +75,6 @@ export namespace Command { }, subtask: true, hints: hints(PROMPT_REVIEW), - agent: "plan" }, } From a3fe714a8ed4113d6481f6cd04d77ab222dc66db Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Sun, 11 Jan 2026 22:45:15 -0600 Subject: [PATCH 3/4] wip --- packages/opencode/src/session/message-v2.ts | 6 ++++++ packages/opencode/src/session/prompt.ts | 18 +++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index 2dff17a5efa..d2c2bd8ed24 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -168,6 +168,12 @@ export namespace MessageV2 { prompt: z.string(), description: z.string(), agent: z.string(), + model: z + .object({ + providerID: z.string(), + modelID: z.string(), + }) + .optional(), command: z.string().optional(), }) export type SubtaskPart = z.infer diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 156b27091a0..c0622d65c7f 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -316,6 +316,9 @@ export namespace SessionPrompt { // TODO: centralize "invoke tool" logic if (task?.type === "subtask") { const taskTool = await TaskTool.init() + const taskModel = task.model + ? await Provider.getModel(task.model.providerID, task.model.modelID) + : model const assistantMessage = (await Session.updateMessage({ id: Identifier.ascending("message"), role: "assistant", @@ -334,8 +337,8 @@ export namespace SessionPrompt { reasoning: 0, cache: { read: 0, write: 0 }, }, - modelID: model.id, - providerID: model.providerID, + modelID: taskModel.id, + providerID: taskModel.providerID, time: { created: Date.now(), }, @@ -1505,7 +1508,7 @@ export namespace SessionPrompt { } template = template.trim() - const model = await (async () => { + const taskModel = await (async () => { if (command.model) { return Provider.parseModel(command.model) } @@ -1520,7 +1523,7 @@ export namespace SessionPrompt { })() try { - await Provider.getModel(model.providerID, model.modelID) + await Provider.getModel(taskModel.providerID, taskModel.modelID) } catch (e) { if (Provider.ModelNotFoundError.isInstance(e)) { const { providerID, modelID, suggestions } = e.data @@ -1553,6 +1556,10 @@ export namespace SessionPrompt { agent: agent.name, description: command.description ?? "", command: input.command, + model: { + providerID: taskModel.providerID, + modelID: taskModel.modelID, + }, // TODO: how can we make task tool accept a more complex input? prompt: templateParts.find((y) => y.type === "text")?.text ?? "", }, @@ -1560,11 +1567,12 @@ export namespace SessionPrompt { : [...templateParts, ...(input.parts ?? [])] const userAgent = isSubtask ? (input.agent ?? (await Agent.defaultAgent())) : agentName + const userModel = isSubtask ? await lastModel(input.sessionID) : taskModel const result = (await prompt({ sessionID: input.sessionID, messageID: input.messageID, - model, + model: userModel, agent: userAgent, parts, variant: input.variant, From d264c5c2c8bedc2f9ab117222bde94ed42db6b32 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Sun, 11 Jan 2026 23:25:12 -0600 Subject: [PATCH 4/4] tweak --- packages/opencode/src/session/prompt.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index c0622d65c7f..ee7f86403f1 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -316,9 +316,7 @@ export namespace SessionPrompt { // TODO: centralize "invoke tool" logic if (task?.type === "subtask") { const taskTool = await TaskTool.init() - const taskModel = task.model - ? await Provider.getModel(task.model.providerID, task.model.modelID) - : model + const taskModel = task.model ? await Provider.getModel(task.model.providerID, task.model.modelID) : model const assistantMessage = (await Session.updateMessage({ id: Identifier.ascending("message"), role: "assistant", @@ -1567,7 +1565,11 @@ export namespace SessionPrompt { : [...templateParts, ...(input.parts ?? [])] const userAgent = isSubtask ? (input.agent ?? (await Agent.defaultAgent())) : agentName - const userModel = isSubtask ? await lastModel(input.sessionID) : taskModel + const userModel = isSubtask + ? input.model + ? Provider.parseModel(input.model) + : await lastModel(input.sessionID) + : taskModel const result = (await prompt({ sessionID: input.sessionID,