From b48f0314e75638bb8b91c7e7c1f8cd838767fa4e Mon Sep 17 00:00:00 2001 From: Dotta Date: Thu, 5 Mar 2026 08:36:04 -0600 Subject: [PATCH] fix(opencode): pretty-print JSON tool output in run transcript Detect JSON-like tool output and format it with indentation instead of displaying it as a single compressed line. Co-Authored-By: Claude Opus 4.6 --- .../opencode-local/src/ui/parse-stdout.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/adapters/opencode-local/src/ui/parse-stdout.ts b/packages/adapters/opencode-local/src/ui/parse-stdout.ts index 7acc1ff9..5be02f7b 100644 --- a/packages/adapters/opencode-local/src/ui/parse-stdout.ts +++ b/packages/adapters/opencode-local/src/ui/parse-stdout.ts @@ -31,6 +31,18 @@ function stringifyUnknown(value: unknown): string { } } +function isJsonLike(text: string): boolean { + const trimmed = text.trim(); + if (!trimmed) return false; + if (!(trimmed.startsWith("{") || trimmed.startsWith("["))) return false; + try { + JSON.parse(trimmed); + return true; + } catch { + return false; + } +} + export function parseOpenCodeStdoutLine(line: string, ts: string): TranscriptEntry[] { const parsed = asRecord(safeJsonParse(line)); if (!parsed) { @@ -87,7 +99,15 @@ export function parseOpenCodeStdoutLine(line: string, ts: string): TranscriptEnt if (Number.isFinite(exitCode)) lines.push(`exit: ${exitCode}`); if (output) { if (lines.length > 0) lines.push(""); - lines.push(output); + if (isJsonLike(output)) { + try { + lines.push(JSON.stringify(JSON.parse(output), null, 2)); + } catch { + lines.push(output); + } + } else { + lines.push(output); + } } entries.push({ kind: "tool_result",