From 3e36069f41117df768cc8065f55a0f9518ed77be Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Sat, 6 Dec 2025 16:04:33 -0600 Subject: [PATCH] fix: reduce overhead of task tool metadata --- .../src/cli/cmd/tui/routes/session/index.tsx | 2 +- packages/opencode/src/tool/task.ts | 32 ++++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 95b90df0e..4b1deea29 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -1522,7 +1522,7 @@ ToolRegistry.register({ {(task) => ( - + ∟ {Locale.titlecase(task.tool)} {task.state.status === "completed" ? task.state.title : ""} )} diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts index 35b963124..fdbae41dd 100644 --- a/packages/opencode/src/tool/task.ts +++ b/packages/opencode/src/tool/task.ts @@ -52,16 +52,24 @@ export const TaskTool = Tool.define("task", async () => { }) const messageID = Identifier.ascending("message") - const parts: Record = {} + const parts: Record = {} const unsub = Bus.subscribe(MessageV2.Event.PartUpdated, async (evt) => { if (evt.properties.part.sessionID !== session.id) return if (evt.properties.part.messageID === messageID) return if (evt.properties.part.type !== "tool") return - parts[evt.properties.part.id] = evt.properties.part + const part = evt.properties.part + parts[part.id] = { + id: part.id, + tool: part.tool, + state: { + status: part.state.status, + title: part.state.status === "completed" ? part.state.title : undefined, + }, + } ctx.metadata({ title: params.description, metadata: { - summary: Object.values(parts).sort((a, b) => a.id?.localeCompare(b.id)), + summary: Object.values(parts).sort((a, b) => a.id.localeCompare(b.id)), sessionId: session.id, }, }) @@ -98,10 +106,18 @@ export const TaskTool = Tool.define("task", async () => { parts: promptParts, }) unsub() - let all - all = await Session.messages({ sessionID: session.id }) - all = all.filter((x) => x.info.role === "assistant") - all = all.flatMap((msg) => msg.parts.filter((x: any) => x.type === "tool") as MessageV2.ToolPart[]) + const messages = await Session.messages({ sessionID: session.id }) + const summary = messages + .filter((x) => x.info.role === "assistant") + .flatMap((msg) => msg.parts.filter((x: any) => x.type === "tool") as MessageV2.ToolPart[]) + .map((part) => ({ + id: part.id, + tool: part.tool, + state: { + status: part.state.status, + title: part.state.status === "completed" ? part.state.title : undefined, + }, + })) const text = result.parts.findLast((x) => x.type === "text")?.text ?? "" const output = text + "\n\n" + ["", `session_id: ${session.id}`, ""].join("\n") @@ -109,7 +125,7 @@ export const TaskTool = Tool.define("task", async () => { return { title: params.description, metadata: { - summary: all, + summary, sessionId: session.id, }, output,