diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 277e269ca..99c0834c0 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -6,13 +6,11 @@ - Added per-call `model` selection to the `task` tool, including per-item batch selectors, fallback chains, and explicit reasoning suffixes. - Added Firecrawl keyless mode: explicitly selecting `firecrawl` as the web-search provider now works without `FIRECRAWL_API_KEY` by calling the Firecrawl REST API without an `Authorization` header; the automatic provider chain remains credential-gated (#4332). +- Added `mcp.renderMarkdownResults` (enabled by default): non-JSON MCP text results render as Markdown in the terminal transcript; set it to `false` to keep raw text. ### Changed - Adjusted retry fallback handling to recognize discovery-only and runtime extension providers, preventing spurious unknown-provider warnings. -### Added - -- Added an opt-in `mcp.renderMarkdownResults` setting that renders non-JSON MCP text results as Markdown in the terminal transcript. ### Fixed diff --git a/packages/coding-agent/src/config/settings-schema.ts b/packages/coding-agent/src/config/settings-schema.ts index d023bf462..3febaa5b7 100644 --- a/packages/coding-agent/src/config/settings-schema.ts +++ b/packages/coding-agent/src/config/settings-schema.ts @@ -3961,7 +3961,7 @@ export const SETTINGS_SCHEMA = { "mcp.renderMarkdownResults": { type: "boolean", - default: false, + default: true, ui: { tab: "tools", group: "Discovery & MCP", diff --git a/packages/coding-agent/src/modes/components/tool-execution.test.ts b/packages/coding-agent/src/modes/components/tool-execution.test.ts index 160528197..96079e540 100644 --- a/packages/coding-agent/src/modes/components/tool-execution.test.ts +++ b/packages/coding-agent/src/modes/components/tool-execution.test.ts @@ -29,7 +29,7 @@ describe("ToolExecutionComponent custom renderer failures", () => { }); afterEach(() => { - settings.set("mcp.renderMarkdownResults", false); + settings.set("mcp.renderMarkdownResults", true); }); it("falls back to the custom tool label when a renderCall child component throws during render", () => { @@ -120,21 +120,10 @@ describe("MCP result Markdown rendering", () => { }); afterEach(() => { - settings.set("mcp.renderMarkdownResults", false); - }); - - it("keeps Markdown syntax literal by default", () => { - const component = renderMCPResult( - { content: [{ type: "text", text: "**bold result**" }], details }, - { expanded: true, isPartial: false }, - theme, - ); - - expect(visibleText(component.render(80))).toContain("**bold result**"); - }); - - it("renders inline Markdown when the opt-in setting is enabled", () => { settings.set("mcp.renderMarkdownResults", true); + }); + + it("renders inline Markdown by default", () => { const component = renderMCPResult( { content: [{ type: "text", text: "**bold result** and `code`" }], details }, { expanded: true, isPartial: false }, @@ -147,6 +136,17 @@ describe("MCP result Markdown rendering", () => { expect(rendered).not.toContain("`code`"); }); + it("keeps Markdown syntax literal when the setting is disabled", () => { + settings.set("mcp.renderMarkdownResults", false); + const component = renderMCPResult( + { content: [{ type: "text", text: "**bold result**" }], details }, + { expanded: true, isPartial: false }, + theme, + ); + + expect(visibleText(component.render(80))).toContain("**bold result**"); + }); + it("preserves structured JSON rendering when Markdown is enabled", () => { settings.set("mcp.renderMarkdownResults", true); const component = renderMCPResult(