|
|
@@ -1,8 +1,9 @@
|
|
|
-import { searchWorkspaceFiles } from "@services/search/file-search"
|
|
|
+import { Controller } from ".."
|
|
|
import { FileSearchRequest, FileSearchResults, FileSearchType } from "@shared/proto/cline/file"
|
|
|
-import { convertSearchResultsToProtoFileInfos } from "@shared/proto-conversions/file/search-result-conversion"
|
|
|
import { getWorkspacePath } from "@utils/path"
|
|
|
-import { Controller } from ".."
|
|
|
+import { convertSearchResultsToProtoFileInfos } from "@shared/proto-conversions/file/search-result-conversion"
|
|
|
+import { HostProvider } from "@/hosts/host-provider"
|
|
|
+import { SearchWorkspaceItemsRequest_SearchItemType } from "@shared/proto/host/workspace"
|
|
|
|
|
|
/**
|
|
|
* Searches for files in the workspace with fuzzy matching
|
|
|
@@ -23,35 +24,37 @@ export async function searchFiles(_controller: Controller, request: FileSearchRe
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- // Map enum to string for the search service
|
|
|
- let selectedTypeString: "file" | "folder" | undefined
|
|
|
- if (request.selectedType === FileSearchType.FILE) {
|
|
|
- selectedTypeString = "file"
|
|
|
- } else if (request.selectedType === FileSearchType.FOLDER) {
|
|
|
- selectedTypeString = "folder"
|
|
|
- }
|
|
|
+ // Map enum to host SearchItemType (0 = FILE, 1 = FOLDER)
|
|
|
+ const selectedTypeValue: SearchWorkspaceItemsRequest_SearchItemType | undefined =
|
|
|
+ request.selectedType === FileSearchType.FILE
|
|
|
+ ? SearchWorkspaceItemsRequest_SearchItemType.FILE
|
|
|
+ : request.selectedType === FileSearchType.FOLDER
|
|
|
+ ? SearchWorkspaceItemsRequest_SearchItemType.FOLDER
|
|
|
+ : undefined
|
|
|
|
|
|
- // Call file search service with query from request
|
|
|
- const searchResults = await searchWorkspaceFiles(
|
|
|
- request.query || "",
|
|
|
- workspacePath,
|
|
|
- request.limit || 20, // Use default limit of 20 if not specified
|
|
|
- selectedTypeString,
|
|
|
+ // Use host-provided search via hostbridge (no fallback)
|
|
|
+ const hostResponse = await HostProvider.workspace.searchWorkspaceItems({
|
|
|
+ query: request.query || "",
|
|
|
+ limit: request.limit || 20,
|
|
|
+ selectedType: selectedTypeValue,
|
|
|
+ })
|
|
|
+
|
|
|
+ const mapped: { path: string; type: "file" | "folder"; label?: string }[] = (hostResponse.items || []).map(
|
|
|
+ (item: { path?: string; type: SearchWorkspaceItemsRequest_SearchItemType; label?: string }) => ({
|
|
|
+ path: String(item.path || ""),
|
|
|
+ type: item.type === SearchWorkspaceItemsRequest_SearchItemType.FOLDER ? "folder" : "file",
|
|
|
+ label: item.label || undefined,
|
|
|
+ }),
|
|
|
)
|
|
|
|
|
|
- // Convert search results to proto FileInfo objects using the conversion function
|
|
|
- const protoResults = convertSearchResultsToProtoFileInfos(searchResults)
|
|
|
+ const protoResults = convertSearchResultsToProtoFileInfos(mapped)
|
|
|
|
|
|
- // Return successful results
|
|
|
return FileSearchResults.create({
|
|
|
results: protoResults,
|
|
|
mentionsRequestId: request.mentionsRequestId,
|
|
|
})
|
|
|
} catch (error) {
|
|
|
- // Log the error but don't include it in the response, following the pattern in searchCommits
|
|
|
- console.error("Error in searchFiles:", error instanceof Error ? error.message : String(error))
|
|
|
-
|
|
|
- // Return empty results without error message
|
|
|
+ console.error("Error in host searchWorkspaceItems:", error instanceof Error ? error.message : String(error))
|
|
|
return FileSearchResults.create({
|
|
|
results: [],
|
|
|
mentionsRequestId: request.mentionsRequestId,
|