diff --git a/packages/server/src/utils/directory-suggestions.test.ts b/packages/server/src/utils/directory-suggestions.test.ts index 8424bd4f9..329d69ed7 100644 --- a/packages/server/src/utils/directory-suggestions.test.ts +++ b/packages/server/src/utils/directory-suggestions.test.ts @@ -129,6 +129,17 @@ describe("searchHomeDirectories", () => { expect(results).toContain(path.join(homeDir, "projects")); expect(results).toContain(path.join(homeDir, "documents")); + expect(results).not.toContain(path.join(homeDir, ".hidden")); + }); + + it("does not return hidden directories during tree search", async () => { + const results = await searchHomeDirectories({ + homeDir, + query: "cache", + limit: 20, + }); + + expect(results).not.toContain(path.join(homeDir, ".hidden", "cache")); }); it("does not return paths that escape home through symlinks", async () => { diff --git a/packages/server/src/utils/directory-suggestions.ts b/packages/server/src/utils/directory-suggestions.ts index f3ea554ad..c2630ebfe 100644 --- a/packages/server/src/utils/directory-suggestions.ts +++ b/packages/server/src/utils/directory-suggestions.ts @@ -386,6 +386,9 @@ async function listChildDirectories(input: { ); const entries: ChildDirectoryEntry[] = []; for (const dirent of dirents) { + if (isHiddenDirectoryName(dirent.name)) { + continue; + } if (!dirent.isDirectory() && !dirent.isSymbolicLink()) { continue; } @@ -429,6 +432,10 @@ async function resolveDirectoryCandidate(input: { return resolved; } +function isHiddenDirectoryName(name: string): boolean { + return name.startsWith("."); +} + function setDirectoryListCache(cacheKey: string, entry: DirectoryListCacheEntry): void { directoryListCache.set(cacheKey, entry); pruneDirectoryListCache();