From 5a43e269a7c6d6303dd753bc8b4e5bd9d3e94799 Mon Sep 17 00:00:00 2001 From: Pamod Madubashana Date: Sun, 20 Sep 2026 10:38:37 +0000 Subject: [PATCH 1/2] Fix #5537: Fix capCodePoints returning nearly the full string when maxCodePoints is zero or negative --- fork-error.txt | 0 fork-view-error.txt | 0 packages/core/src/thread-search.ts | 1 + 3 files changed, 1 insertion(+) create mode 100644 fork-error.txt create mode 100644 fork-view-error.txt diff --git a/fork-error.txt b/fork-error.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fork-view-error.txt b/fork-view-error.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/core/src/thread-search.ts b/packages/core/src/thread-search.ts index 7e6086e8d5..2821281311 100644 --- a/packages/core/src/thread-search.ts +++ b/packages/core/src/thread-search.ts @@ -599,5 +599,6 @@ export function buildSnippet(text: string, matchIndex: number, halfWindow: numbe export function capCodePoints(value: string, maxCodePoints: number): string { const codePoints = Array.from(value); if (codePoints.length <= maxCodePoints) return value; + if (maxCodePoints <= 0) return codePoints.length === 0 ? value : '…'; return codePoints.slice(0, maxCodePoints - 1).join('') + '…'; } From a2fa940622a927153a624efb41ebe6c3e59132c0 Mon Sep 17 00:00:00 2001 From: pamod-madubashana Date: Sun, 20 Sep 2026 23:08:29 +0530 Subject: [PATCH 2/2] fix: capCodePoints returns '' for zero/negative cap, drop accidental files, add regression tests - capCodePoints now returns '' when maxCodePoints <= 0, matching the contract 'at most maxCodePoints code points' and sibling helpers truncateUtf16Safe/sanitizeUnicodeText (#5537) - Remove empty fork-error.txt and fork-view-error.txt (accidental commits) - Add regression tests for cap 0, -2, and empty string input --- apps/desktop/src/main/__tests__/thread-search.test.ts | 6 ++++++ fork-error.txt | 0 fork-view-error.txt | 0 packages/core/src/thread-search.ts | 2 +- 4 files changed, 7 insertions(+), 1 deletion(-) delete mode 100644 fork-error.txt delete mode 100644 fork-view-error.txt diff --git a/apps/desktop/src/main/__tests__/thread-search.test.ts b/apps/desktop/src/main/__tests__/thread-search.test.ts index dc36bbcb28..4f1efd1213 100644 --- a/apps/desktop/src/main/__tests__/thread-search.test.ts +++ b/apps/desktop/src/main/__tests__/thread-search.test.ts @@ -520,6 +520,12 @@ describe('thread search text projection', () => { assert.ok(capped.endsWith('…')); }); + it('returns empty string for zero or negative cap (regression #5537)', () => { + assert.equal(capCodePoints('hello', 0), ''); + assert.equal(capCodePoints('hello', -2), ''); + assert.equal(capCodePoints('', 0), ''); + }); + it('bounds and classifies serialized tool results', async () => { assert.equal(collectSearchableText(toolResult({ result: 'short' })), '{"result":"short"}'); const extracted = collectSearchableText(toolResult({ data: 'X'.repeat(100_000) })); diff --git a/fork-error.txt b/fork-error.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/fork-view-error.txt b/fork-view-error.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/core/src/thread-search.ts b/packages/core/src/thread-search.ts index 2821281311..c51dafc77b 100644 --- a/packages/core/src/thread-search.ts +++ b/packages/core/src/thread-search.ts @@ -599,6 +599,6 @@ export function buildSnippet(text: string, matchIndex: number, halfWindow: numbe export function capCodePoints(value: string, maxCodePoints: number): string { const codePoints = Array.from(value); if (codePoints.length <= maxCodePoints) return value; - if (maxCodePoints <= 0) return codePoints.length === 0 ? value : '…'; + if (maxCodePoints <= 0) return ''; return codePoints.slice(0, maxCodePoints - 1).join('') + '…'; }