diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts index ac2d9fa0812..74aabd7598a 100644 --- a/packages/opencode/src/tool/task.ts +++ b/packages/opencode/src/tool/task.ts @@ -211,8 +211,12 @@ export const TaskTool = Tool.define( parts, }) if (result.info.role === "assistant" && result.info.error) { + const message = + "message" in result.info.error.data && typeof result.info.error.data.message === "string" + ? result.info.error.data.message + : result.info.error.name return yield* Effect.fail( - new Error(`Subagent failed (task_id: ${nextSession.id}): ${result.info.error.data.message}`), + new Error(`Subagent failed (task_id: ${nextSession.id}): ${message}`), ) } return result.parts.findLast((item) => item.type === "text")?.text ?? "" diff --git a/packages/opencode/test/tool/task.test.ts b/packages/opencode/test/tool/task.test.ts index d82b7aa33ca..967dd046a42 100644 --- a/packages/opencode/test/tool/task.test.ts +++ b/packages/opencode/test/tool/task.test.ts @@ -300,9 +300,10 @@ describe("tool.task", () => { if (Exit.isSuccess(exit)) throw new Error("expected task failure") const child = (yield* sessions.children(chat.id))[0] expect(child).toBeDefined() - expect(Cause.squash(exit.cause).message).toBe( - `Subagent failed (task_id: ${child?.id}): Network connection lost`, - ) + const failure = Cause.squash(exit.cause) + expect(failure).toBeInstanceOf(Error) + if (!(failure instanceof Error)) throw new Error("expected Error defect") + expect(failure.message).toBe(`Subagent failed (task_id: ${child?.id}): Network connection lost`) }), )