From 4afbdf58b3013fb2638cb5ab6bd019b34a3b9be0 Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Wed, 13 May 2026 19:25:00 -0500 Subject: [PATCH] fix(desktop): drop noisy "returned N items / empty object" stub strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a tool returns nothing useful, the row should be silent — the title ("Search Files", etc.) already tells the user what happened. Counting the fields in an opaque payload is engineer-noise. `formatToolResultSummary` and `minimalValueSummary` now return '' for empty arrays / records / unrecognized values; tool-fallback already hides the detail section when its body is empty. --- .../assistant-ui/tool-fallback-model.ts | 28 ++++--------------- apps/desktop/src/lib/tool-result-summary.ts | 21 +++++--------- 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/apps/desktop/src/components/assistant-ui/tool-fallback-model.ts b/apps/desktop/src/components/assistant-ui/tool-fallback-model.ts index 5615fe8fe20..df0e38103b3 100644 --- a/apps/desktop/src/components/assistant-ui/tool-fallback-model.ts +++ b/apps/desktop/src/components/assistant-ui/tool-fallback-model.ts @@ -833,30 +833,14 @@ export function inlineDiffFromResult(result: unknown): string { return typeof value === 'string' ? stripInlineDiffChrome(value) : '' } +// Falls back to a string only when there's something concrete to render — +// counts of opaque items/fields are noise, not signal. function minimalValueSummary(value: unknown): string { - if (value == null) { - return '' - } + if (value == null) return '' + if (typeof value === 'string') return value + if (typeof value === 'number' || typeof value === 'boolean') return String(value) - if (typeof value === 'string') { - return value - } - - if (typeof value === 'number' || typeof value === 'boolean') { - return String(value) - } - - if (Array.isArray(value)) { - return value.length ? `Returned ${value.length} items.` : 'No items returned.' - } - - if (isRecord(value)) { - const count = Object.keys(value).length - - return count ? `Returned object with ${count} fields.` : 'Returned an empty object.' - } - - return String(value) + return '' } function fallbackDetailText(args: unknown, result: unknown): string { diff --git a/apps/desktop/src/lib/tool-result-summary.ts b/apps/desktop/src/lib/tool-result-summary.ts index 8defcd626e9..615473568c3 100644 --- a/apps/desktop/src/lib/tool-result-summary.ts +++ b/apps/desktop/src/lib/tool-result-summary.ts @@ -185,7 +185,7 @@ function formatFieldValue(value: unknown, depth: number): string { if (Array.isArray(v)) { if (!v.length) { - return '0 items' + return '' } const scalars = v.map(summarizeScalar).filter(Boolean) @@ -204,10 +204,10 @@ function formatFieldValue(value: unknown, depth: number): string { return clipInline(String(v)) } +// "Returned N items" / "0 items" / "Returned an empty object" are all +// noise — better to render nothing and let the title carry the signal. function formatArraySummary(value: unknown[], depth: number): string { - if (!value.length) { - return 'No items returned.' - } + if (!value.length) return '' const max = 6 const lines = value @@ -216,9 +216,7 @@ function formatArraySummary(value: unknown[], depth: number): string { .filter(Boolean) .map(l => `- ${l}`) - if (!lines.length) { - return `Returned ${pluralize(value.length, 'item')}.` - } + if (!lines.length) return '' if (value.length > max) { const remaining = value.length - max @@ -230,10 +228,7 @@ function formatArraySummary(value: unknown[], depth: number): string { function formatRecordSummary(record: Json, depth: number): string { const keys = Object.keys(record) - - if (!keys.length) { - return 'Returned an empty object.' - } + if (!keys.length) return '' if (depth <= 2) { const direct = firstString(record, ['message', 'summary', 'description', 'preview', 'text', 'content']) @@ -261,9 +256,7 @@ function formatRecordSummary(record: Json, depth: number): string { } } - if (!lines.length) { - return `Returned object with ${pluralize(keys.length, 'field')}.` - } + if (!lines.length) return '' if (candidates.length > lines.length) { const remaining = candidates.length - lines.length