summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2026-02-01 20:52:17 -0500
committerDax Raad <[email protected]>2026-02-01 20:52:17 -0500
commit83d0e48e3854a4a9f8c28ec17398a8554c988d39 (patch)
tree76076df8fa7ef67e93667179282c52e6e97b8257
parent6c9b2c37a5e12f0e79ce5a18af33073c9e646cc1 (diff)
downloadopencode-83d0e48e3854a4a9f8c28ec17398a8554c988d39.tar.gz
opencode-83d0e48e3854a4a9f8c28ec17398a8554c988d39.zip
tui: fix task status to show current tool state from message store
-rw-r--r--AGENTS.md1
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx28
-rw-r--r--packages/opencode/src/tool/task.ts1
3 files changed, 22 insertions, 8 deletions
diff --git a/AGENTS.md b/AGENTS.md
index 8cfe768da..3df71f641 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -12,6 +12,7 @@
- Prefer single word variable names where possible
- Use Bun APIs when possible, like `Bun.file()`
- Rely on type inference when possible; avoid explicit type annotations or interfaces unless necessary for exports or clarity
+- Prefer functional array methods (flatMap, filter, map) over for loops; use type guards on filter to maintain type inference downstream
### Avoid let statements
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 ada84e487..209469bad 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -1799,9 +1799,19 @@ function Task(props: ToolProps<typeof TaskTool>) {
const keybind = useKeybind()
const { navigate } = useRoute()
const local = useLocal()
+ const sync = useSync()
+
+ const tools = createMemo(() => {
+ const sessionID = props.metadata.sessionId
+ const msgs = sync.data.message[sessionID ?? ""] ?? []
+ return msgs.flatMap((msg) =>
+ (sync.data.part[msg.id] ?? [])
+ .filter((part): part is ToolPart => part.type === "tool")
+ .map((part) => ({ tool: part.tool, state: part.state })),
+ )
+ })
- const current = createMemo(() => props.metadata.summary?.findLast((x) => x.state.status !== "pending"))
- const color = createMemo(() => local.agent.color(props.input.subagent_type ?? "unknown"))
+ const current = createMemo(() => tools().findLast((x) => x.state.status !== "pending"))
return (
<Switch>
@@ -1817,13 +1827,17 @@ function Task(props: ToolProps<typeof TaskTool>) {
>
<box>
<text style={{ fg: theme.textMuted }}>
- {props.input.description} ({props.metadata.summary?.length ?? 0} toolcalls)
+ {props.input.description} ({tools().length} toolcalls)
</text>
<Show when={current()}>
- <text style={{ fg: current()!.state.status === "error" ? theme.error : theme.textMuted }}>
- └ {Locale.titlecase(current()!.tool)}{" "}
- {current()!.state.status === "completed" ? current()!.state.title : ""}
- </text>
+ {(item) => {
+ const title = item().state.status === "completed" ? (item().state as any).title : ""
+ return (
+ <text style={{ fg: item().state.status === "error" ? theme.error : theme.textMuted }}>
+ └ {Locale.titlecase(item().tool)} {title}
+ </text>
+ )
+ }}
</Show>
</box>
<Show when={props.metadata.sessionId}>
diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts
index ad4268b7b..ac28d9f32 100644
--- a/packages/opencode/src/tool/task.ts
+++ b/packages/opencode/src/tool/task.ts
@@ -130,7 +130,6 @@ export const TaskTool = Tool.define("task", async (ctx) => {
ctx.metadata({
title: params.description,
metadata: {
- summary: Object.values(parts).sort((a, b) => a.id.localeCompare(b.id)),
sessionId: session.id,
model,
},