From 65dfd3172889d4bb38bca6443d51c5a98d062151 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Sun, 16 Nov 2025 19:00:54 -0500 Subject: [PATCH] core: fix subtask message handling and tool execution flow --- packages/opencode/src/session/prompt.ts | 50 +++++++++++++++++-------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 1eb54a3c5..e8967aac3 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -326,7 +326,7 @@ export namespace SessionPrompt { // pending subtask if (task?.type === "subtask") { const taskTool = await TaskTool.init() - const assistantMessage: MessageV2.Assistant = await Session.updateMessage({ + const assistantMessage = (await Session.updateMessage({ id: Identifier.ascending("message"), role: "assistant", parentID: lastUser.id, @@ -348,8 +348,8 @@ export namespace SessionPrompt { time: { created: Date.now(), }, - }) - let part = await Session.updatePart({ + })) as MessageV2.Assistant + let part = (await Session.updatePart({ id: Identifier.ascending("part"), messageID: assistantMessage.id, sessionID: assistantMessage.sessionID, @@ -367,7 +367,7 @@ export namespace SessionPrompt { start: Date.now(), }, }, - }) + })) as MessageV2.ToolPart const result = await taskTool .execute( { @@ -381,26 +381,18 @@ export namespace SessionPrompt { sessionID: sessionID, abort, async metadata(input) { - part = await Session.updatePart({ + ;(await Session.updatePart({ ...part, type: "tool", state: { - ...(part as any).state, + ...part.state, ...input, - } as any, - } as any) + }, + })) as MessageV2.ToolPart }, }, ) .catch(() => {}) - await Session.updatePart({ - ...part, - state: { - ...(part as any).state, - type: "completed", - ...result, - }, - } as any) await Session.updateMessage({ ...assistantMessage, role: "assistant", @@ -408,7 +400,33 @@ export namespace SessionPrompt { ...assistantMessage.time, completed: Date.now(), }, + finish: "tool-calls", }) + if (result) { + await Session.updatePart({ + ...part, + state: { + ...(part as any).state, + type: "completed", + ...result, + }, + } as any) + } + if (!result) { + await Session.updatePart({ + ...part, + state: { + status: "error", + error: "Tool execution failed", + time: { + start: part.state.status === "running" ? part.state.time.start : Date.now(), + end: Date.now(), + }, + metadata: part.metadata, + input: part.state.input, + }, + } satisfies MessageV2.ToolPart) + } continue }