summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2025-12-06 16:04:33 -0600
committerAiden Cline <[email protected]>2025-12-06 16:04:33 -0600
commit3e36069f41117df768cc8065f55a0f9518ed77be (patch)
treed3727e757456e1be4f0e28437f2b66ebe2b83238
parent6a4ca92a6cd6e14032b1fd0c753836c15c101b3f (diff)
downloadopencode-3e36069f41117df768cc8065f55a0f9518ed77be.tar.gz
opencode-3e36069f41117df768cc8065f55a0f9518ed77be.zip
fix: reduce overhead of task tool metadata
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx2
-rw-r--r--packages/opencode/src/tool/task.ts32
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<typeof TaskTool>({
<box>
<For each={props.metadata.summary ?? []}>
{(task) => (
- <text style={{ fg: theme.textMuted }}>
+ <text style={{ fg: task.state.status === "error" ? theme.error : theme.textMuted }}>
∟ {Locale.titlecase(task.tool)} {task.state.status === "completed" ? task.state.title : ""}
</text>
)}
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<string, MessageV2.ToolPart> = {}
+ const parts: Record<string, { id: string; tool: string; state: { status: string; title?: string } }> = {}
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" + ["<task_metadata>", `session_id: ${session.id}`, "</task_metadata>"].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,