diff --git a/src/web/public/panels-ui.js b/src/web/public/panels-ui.js
index 0209ba3c..237c09e3 100644
--- a/src/web/public/panels-ui.js
+++ b/src/web/public/panels-ui.js
@@ -3310,7 +3310,6 @@ Object.assign(CodemanApp.prototype, {
${icon}
${escapeHtml(match.name)}
- ${escapeHtml(match.path)}
${sizeStr}
${downloadBtn}
diff --git a/test/file-browser-search.test.ts b/test/file-browser-search.test.ts
index a179428f..b3ffe5b2 100644
--- a/test/file-browser-search.test.ts
+++ b/test/file-browser-search.test.ts
@@ -312,7 +312,8 @@ describe('File Viewer server search', () => {
expect(elements.fileBrowserTree.innerHTML).toContain('class="file-tree-size">1.5 KB');
expect(elements.fileBrowserTree.innerHTML).toContain('📘');
expect(elements.fileBrowserTree.innerHTML).toContain('📁');
- expect(elements.fileBrowserTree.innerHTML).toContain('src/widget.ts');
+ expect(elements.fileBrowserTree.innerHTML).toContain('data-path="src/widget.ts"');
+ expect(elements.fileBrowserTree.innerHTML).not.toContain('class="file-tree-path"');
expect(elements.fileBrowserTree.innerHTML).toContain(
'href="/api/sessions/session%2FA/file-raw?path=src%2Fwidget.ts&download=true"'
);
@@ -409,6 +410,40 @@ describe('File Viewer server search', () => {
}
});
+ it('keeps query B rendered when its response beats an already-launched query A', async () => {
+ const { app, elements, pending } = loadPanel();
+ app.filterFileBrowser('query A');
+ await vi.advanceTimersByTimeAsync(250);
+ app.filterFileBrowser('query B');
+ await vi.advanceTimersByTimeAsync(250);
+ expect(pending).toHaveLength(2);
+
+ pending[1].reply.resolve(
+ response(
+ successfulData({
+ matches: [{ name: 'result-B.ts', path: 'result-B.ts', type: 'file' }],
+ matchCount: 1,
+ })
+ )
+ );
+ await vi.advanceTimersByTimeAsync(0);
+ expect(elements.fileBrowserTree.innerHTML).toContain('result-B.ts');
+
+ pending[0].reply.resolve(
+ response(
+ successfulData({
+ matches: [{ name: 'result-A.ts', path: 'result-A.ts', type: 'file' }],
+ matchCount: 1,
+ })
+ )
+ );
+ await vi.advanceTimersByTimeAsync(0);
+
+ expect(elements.fileBrowserTree.innerHTML).toContain('result-B.ts');
+ expect(elements.fileBrowserTree.innerHTML).not.toContain('result-A.ts');
+ expect(app._fileBrowserState.matches[0].name).toBe('result-B.ts');
+ });
+
it('clears a blank query and restores the compatible cached tree immediately without fetching', () => {
const { app, elements, pending } = loadPanel();
app.fileBrowserData = {