fix: index only the user-selected file/dir from @ autocomplete (#1388)
Co-authored-by: Letta Code <noreply@letta.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
|
import { addEntriesToCache } from "../helpers/fileIndex";
|
||||||
import { searchFiles } from "../helpers/fileSearch";
|
import { searchFiles } from "../helpers/fileSearch";
|
||||||
import { useAutocompleteNavigation } from "../hooks/useAutocompleteNavigation";
|
import { useAutocompleteNavigation } from "../hooks/useAutocompleteNavigation";
|
||||||
import { AutocompleteBox, AutocompleteItem } from "./Autocomplete";
|
import { AutocompleteBox, AutocompleteItem } from "./Autocomplete";
|
||||||
@@ -66,7 +67,15 @@ export function FileAutocomplete({
|
|||||||
const { selectedIndex } = useAutocompleteNavigation({
|
const { selectedIndex } = useAutocompleteNavigation({
|
||||||
matches,
|
matches,
|
||||||
maxVisible: 10,
|
maxVisible: 10,
|
||||||
onSelect: onSelect ? (item) => onSelect(item.path) : undefined,
|
onSelect: onSelect
|
||||||
|
? (item) => {
|
||||||
|
// Index only the selected item, not all search results
|
||||||
|
if (item.type === "file" || item.type === "dir") {
|
||||||
|
addEntriesToCache([{ path: item.path, type: item.type }]);
|
||||||
|
}
|
||||||
|
onSelect(item.path);
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
manageActiveState: false, // We manage active state manually due to async loading
|
manageActiveState: false, // We manage active state manually due to async loading
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
import { readdirSync, statSync } from "node:fs";
|
import { readdirSync, statSync } from "node:fs";
|
||||||
import { join, relative, resolve } from "node:path";
|
import { join, relative, resolve } from "node:path";
|
||||||
import { debugLog } from "../../utils/debug";
|
import { debugLog } from "../../utils/debug";
|
||||||
import {
|
import { ensureFileIndex, type FileMatch, searchFileIndex } from "./fileIndex";
|
||||||
addEntriesToCache,
|
|
||||||
ensureFileIndex,
|
|
||||||
type FileMatch,
|
|
||||||
searchFileIndex,
|
|
||||||
} from "./fileIndex";
|
|
||||||
import { shouldHardExcludeEntry } from "./fileSearchConfig";
|
import { shouldHardExcludeEntry } from "./fileSearchConfig";
|
||||||
|
|
||||||
export function debounce<T extends (...args: never[]) => unknown>(
|
export function debounce<T extends (...args: never[]) => unknown>(
|
||||||
@@ -171,8 +166,6 @@ export async function searchFiles(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!indexSearchSucceeded || results.length === 0) {
|
if (!indexSearchSucceeded || results.length === 0) {
|
||||||
const diskResultsBefore = results.length;
|
|
||||||
|
|
||||||
if (effectiveDeep) {
|
if (effectiveDeep) {
|
||||||
// Deep search: recursively search subdirectories.
|
// Deep search: recursively search subdirectories.
|
||||||
// Use a shallower depth limit when searching outside the project directory
|
// Use a shallower depth limit when searching outside the project directory
|
||||||
@@ -225,13 +218,6 @@ export async function searchFiles(
|
|||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the index was working but just didn't have these files (created
|
|
||||||
// externally), add the newly found entries so future searches hit the
|
|
||||||
// cache instead of falling back to disk again.
|
|
||||||
if (indexSearchSucceeded && results.length > diskResultsBefore) {
|
|
||||||
addEntriesToCache(results.slice(diskResultsBefore));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only sort when the disk scan ran — its results come in arbitrary readdir
|
// Only sort when the disk scan ran — its results come in arbitrary readdir
|
||||||
|
|||||||
Reference in New Issue
Block a user