summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorzerone0x <[email protected]>2026-02-02 03:11:18 +0800
committerGitHub <[email protected]>2026-02-01 13:11:18 -0600
commitcc1d3732bc610b7dcd9a16ef98be1bd7738b3811 (patch)
tree2259668e770b79e502cc7e9a73dd077c880dd563
parent1798af72b04b82c1a93ceec251e29188f09d5f63 (diff)
downloadopencode-cc1d3732bc610b7dcd9a16ef98be1bd7738b3811.tar.gz
opencode-cc1d3732bc610b7dcd9a16ef98be1bd7738b3811.zip
fix(tui): remove outer backtick wrapper in session transcript tool formatting (#11566)
Co-authored-by: Claude <[email protected]>
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/transcript.ts10
-rw-r--r--packages/opencode/test/cli/tui/transcript.test.ts29
2 files changed, 32 insertions, 7 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/util/transcript.ts b/packages/opencode/src/cli/cmd/tui/util/transcript.ts
index 8f986c337..420c9dde1 100644
--- a/packages/opencode/src/cli/cmd/tui/util/transcript.ts
+++ b/packages/opencode/src/cli/cmd/tui/util/transcript.ts
@@ -80,17 +80,17 @@ export function formatPart(part: Part, options: TranscriptOptions): string {
}
if (part.type === "tool") {
- let result = `\`\`\`\nTool: ${part.tool}\n`
+ let result = `**Tool: ${part.tool}**\n`
if (options.toolDetails && part.state.input) {
- result += `\n**Input:**\n\`\`\`json\n${JSON.stringify(part.state.input, null, 2)}\n\`\`\``
+ result += `\n**Input:**\n\`\`\`json\n${JSON.stringify(part.state.input, null, 2)}\n\`\`\`\n`
}
if (options.toolDetails && part.state.status === "completed" && part.state.output) {
- result += `\n**Output:**\n\`\`\`\n${part.state.output}\n\`\`\``
+ result += `\n**Output:**\n\`\`\`\n${part.state.output}\n\`\`\`\n`
}
if (options.toolDetails && part.state.status === "error" && part.state.error) {
- result += `\n**Error:**\n\`\`\`\n${part.state.error}\n\`\`\``
+ result += `\n**Error:**\n\`\`\`\n${part.state.error}\n\`\`\`\n`
}
- result += `\n\`\`\`\n\n`
+ result += `\n`
return result
}
diff --git a/packages/opencode/test/cli/tui/transcript.test.ts b/packages/opencode/test/cli/tui/transcript.test.ts
index 2cb29e1a8..7a5fa6b8f 100644
--- a/packages/opencode/test/cli/tui/transcript.test.ts
+++ b/packages/opencode/test/cli/tui/transcript.test.ts
@@ -119,13 +119,38 @@ describe("transcript", () => {
},
}
const result = formatPart(part, options)
- expect(result).toContain("Tool: bash")
+ expect(result).toContain("**Tool: bash**")
expect(result).toContain("**Input:**")
expect(result).toContain('"command": "ls"')
expect(result).toContain("**Output:**")
expect(result).toContain("file1.txt")
})
+ test("formats tool output containing triple backticks without breaking markdown", () => {
+ const part: Part = {
+ id: "part_1",
+ sessionID: "ses_123",
+ messageID: "msg_123",
+ type: "tool",
+ callID: "call_1",
+ tool: "bash",
+ state: {
+ status: "completed",
+ input: { command: "echo '```hello```'" },
+ output: "```hello```",
+ title: "Echo backticks",
+ metadata: {},
+ time: { start: 1000, end: 1100 },
+ },
+ }
+ const result = formatPart(part, options)
+ // The tool header should not be inside a code block
+ expect(result).toStartWith("**Tool: bash**\n")
+ // Input and output should each be in their own code blocks
+ expect(result).toContain("**Input:**\n```json")
+ expect(result).toContain("**Output:**\n```\n```hello```\n```")
+ })
+
test("formats tool part without details when disabled", () => {
const part: Part = {
id: "part_1",
@@ -144,7 +169,7 @@ describe("transcript", () => {
},
}
const result = formatPart(part, { ...options, toolDetails: false })
- expect(result).toContain("Tool: bash")
+ expect(result).toContain("**Tool: bash**")
expect(result).not.toContain("**Input:**")
expect(result).not.toContain("**Output:**")
})