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 <noreply@anthropic.com>
This commit is contained in:
@@ -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[] {
|
export function parseOpenCodeStdoutLine(line: string, ts: string): TranscriptEntry[] {
|
||||||
const parsed = asRecord(safeJsonParse(line));
|
const parsed = asRecord(safeJsonParse(line));
|
||||||
if (!parsed) {
|
if (!parsed) {
|
||||||
@@ -87,7 +99,15 @@ export function parseOpenCodeStdoutLine(line: string, ts: string): TranscriptEnt
|
|||||||
if (Number.isFinite(exitCode)) lines.push(`exit: ${exitCode}`);
|
if (Number.isFinite(exitCode)) lines.push(`exit: ${exitCode}`);
|
||||||
if (output) {
|
if (output) {
|
||||||
if (lines.length > 0) lines.push("");
|
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({
|
entries.push({
|
||||||
kind: "tool_result",
|
kind: "tool_result",
|
||||||
|
|||||||
Reference in New Issue
Block a user