diff --git a/lib/prompt-editor/src/mentions/mentionMenu/MentionMenu.tsx b/lib/prompt-editor/src/mentions/mentionMenu/MentionMenu.tsx index 77ce1a16b1f..c689311e355 100644 --- a/lib/prompt-editor/src/mentions/mentionMenu/MentionMenu.tsx +++ b/lib/prompt-editor/src/mentions/mentionMenu/MentionMenu.tsx @@ -7,6 +7,7 @@ import { type MentionMenuData, type MentionQuery, NO_SYMBOL_MATCHES_HELP_LABEL, + REMOTE_DIRECTORY_PROVIDER_URI, REMOTE_FILE_PROVIDER_URI, SYMBOL_CONTEXT_MENTION_PROVIDER, parseMentionQuery, @@ -137,21 +138,32 @@ export const MentionMenu: FunctionComponent< // return files instead of repos if the repo name is in the query. if (item.provider === 'openctx' && 'providerUri' in item) { if ( - item.providerUri === REMOTE_FILE_PROVIDER_URI && - item.mention?.data?.repoName && - !item.mention?.data?.filePath + (item.providerUri === REMOTE_FILE_PROVIDER_URI && + item.mention?.data?.repoName && + !item.mention?.data?.filePath) || + (item.providerUri === REMOTE_DIRECTORY_PROVIDER_URI && + item.mention?.data?.repoID && + !item.mention?.data?.directoryPath) ) { // Do not set the selected item as mention if it is repo item from the remote file search provider. // Rather keep the provider in place and update the query with repo name so that the provider can // start showing the files instead. updateMentionMenuParams({ - parentItem: { - id: REMOTE_FILE_PROVIDER_URI, - title: 'Remote Files', - queryLabel: 'Enter file path to search', - emptyLabel: `No matching files found in ${item?.mention?.data.repoName} repository`, - }, + parentItem: + item.providerUri === REMOTE_DIRECTORY_PROVIDER_URI + ? { + id: REMOTE_DIRECTORY_PROVIDER_URI, + title: 'Remote Directories', + queryLabel: 'Enter directory path to search', + emptyLabel: `No matching directories found in ${item?.mention?.data.repoName} repository`, + } + : { + id: REMOTE_FILE_PROVIDER_URI, + title: 'Remote Files', + queryLabel: 'Enter file path to search', + emptyLabel: `No matching files found in ${item?.mention?.data.repoName} repository`, + }, }) setEditorQuery(currentText => { diff --git a/lib/prompt-editor/src/mentions/mentionMenu/MentionMenuItem.tsx b/lib/prompt-editor/src/mentions/mentionMenu/MentionMenuItem.tsx index 2cf27439ae0..b86f1bac005 100644 --- a/lib/prompt-editor/src/mentions/mentionMenu/MentionMenuItem.tsx +++ b/lib/prompt-editor/src/mentions/mentionMenu/MentionMenuItem.tsx @@ -1,10 +1,12 @@ import { + CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI, type ContextItem, type ContextMentionProviderMetadata, FILE_CONTEXT_MENTION_PROVIDER, IGNORED_FILE_WARNING_LABEL, LARGE_FILE_WARNING_LABEL, type MentionQuery, + REMOTE_DIRECTORY_PROVIDER_URI, REMOTE_FILE_PROVIDER_URI, REMOTE_REPOSITORY_PROVIDER_URI, SYMBOL_CONTEXT_MENTION_PROVIDER, @@ -142,5 +144,7 @@ export const iconForProvider: Record< 'internal-linear-issues': LinearLogo, // Can't import LinearIssuesProvider due to transitive dep on vscode. [REMOTE_REPOSITORY_PROVIDER_URI]: FolderGitIcon, [REMOTE_FILE_PROVIDER_URI]: FolderGitIcon, + [REMOTE_DIRECTORY_PROVIDER_URI]: FolderGitIcon, + [CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI]: FolderGitIcon, [WEB_PROVIDER_URI]: LinkIcon, } diff --git a/lib/prompt-editor/src/mentions/mentionMenu/useMentionMenuData.ts b/lib/prompt-editor/src/mentions/mentionMenu/useMentionMenuData.ts index 1d923e8dfcf..f5a06ae2d8a 100644 --- a/lib/prompt-editor/src/mentions/mentionMenu/useMentionMenuData.ts +++ b/lib/prompt-editor/src/mentions/mentionMenu/useMentionMenuData.ts @@ -5,7 +5,9 @@ import type { MentionQuery, } from '@sourcegraph/cody-shared' import { + CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI, ContextItemSource, + REMOTE_DIRECTORY_PROVIDER_URI, REMOTE_FILE_PROVIDER_URI, REMOTE_REPOSITORY_PROVIDER_URI, memoizeLastValue, @@ -33,8 +35,12 @@ export function useMentionMenuParams(): { const isRemoteLikeProviderActive = mentionSettings.resolutionMode === 'remote' || - params.parentItem?.id === REMOTE_FILE_PROVIDER_URI || - params.parentItem?.id === REMOTE_REPOSITORY_PROVIDER_URI + [ + REMOTE_FILE_PROVIDER_URI, + REMOTE_DIRECTORY_PROVIDER_URI, + REMOTE_REPOSITORY_PROVIDER_URI, + CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI, + ].includes(params.parentItem?.id || '') // Increase debounce time in case of remote context item resolution (Cody Web case) or // in case of remote-like providers such as remote repositories or remote files diff --git a/lib/shared/src/context/openctx/api.ts b/lib/shared/src/context/openctx/api.ts index f54bbe779ee..2f55738efeb 100644 --- a/lib/shared/src/context/openctx/api.ts +++ b/lib/shared/src/context/openctx/api.ts @@ -28,5 +28,7 @@ export function setOpenCtx({ controller, disposable }: OpenCtx): void { export const REMOTE_REPOSITORY_PROVIDER_URI = 'internal-remote-repository-search' export const REMOTE_FILE_PROVIDER_URI = 'internal-remote-file-search' +export const REMOTE_DIRECTORY_PROVIDER_URI = 'internal-remote-directory-search' +export const CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI = 'internal-current-repository-directory-search' export const WEB_PROVIDER_URI = 'internal-web-provider' export const GIT_OPENCTX_PROVIDER_URI = 'internal-git-openctx-provider' diff --git a/lib/shared/src/index.ts b/lib/shared/src/index.ts index c569d8894a6..ea65faecf67 100644 --- a/lib/shared/src/index.ts +++ b/lib/shared/src/index.ts @@ -304,6 +304,8 @@ export { openCtx, REMOTE_REPOSITORY_PROVIDER_URI, REMOTE_FILE_PROVIDER_URI, + REMOTE_DIRECTORY_PROVIDER_URI, + CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI, WEB_PROVIDER_URI, GIT_OPENCTX_PROVIDER_URI, } from './context/openctx/api' diff --git a/lib/shared/src/sourcegraph-api/graphql/client.ts b/lib/shared/src/sourcegraph-api/graphql/client.ts index a1d0c0e4c3a..440a0d287e2 100644 --- a/lib/shared/src/sourcegraph-api/graphql/client.ts +++ b/lib/shared/src/sourcegraph-api/graphql/client.ts @@ -38,6 +38,7 @@ import { GET_FEATURE_FLAGS_QUERY, GET_REMOTE_FILE_QUERY, GET_URL_CONTENT_QUERY, + LEGACY_CONTEXT_SEARCH_QUERY, LOG_EVENT_MUTATION, LOG_EVENT_MUTATION_DEPRECATED, PACKAGE_LIST_QUERY, @@ -285,6 +286,7 @@ interface FileMatchSearchResponse { results: { __typename: string repository: { + id: string name: string } file: { @@ -980,18 +982,49 @@ export class SourcegraphGraphQLAPIClient { return extractDataOrError(response, data => data) } - public async contextSearch( - repoIDs: string[], - query: string, + /** + * Checks if the current site version is valid based on the given criteria. + * + * @param options - The options for version validation. + * @param options.minimumVersion - The minimum version required. + * @param options.insider - Whether to consider insider builds as valid. Defaults to true. + * @returns A promise that resolves to a boolean indicating if the version is valid. + */ + public async isValidSiteVersion({ + minimumVersion, + insider = true, + }: { minimumVersion: string; insider?: boolean }): Promise { + const version = await this.getSiteVersion() + if (isError(version)) { + return false + } + + const isInsiderBuild = version.length > 12 || version.includes('dev') + + return (insider && isInsiderBuild) || semver.gte(version, minimumVersion) + } + + public async contextSearch({ + repoIDs, + query, + signal, + filePatterns, + }: { + repoIDs: string[] + query: string signal?: AbortSignal - ): Promise { + filePatterns?: string[] + }): Promise { + const isValidVersion = await this.isValidSiteVersion({ minimumVersion: '5.7.0' }) + return this.fetchSourcegraphAPI>( - CONTEXT_SEARCH_QUERY, + isValidVersion ? CONTEXT_SEARCH_QUERY : LEGACY_CONTEXT_SEARCH_QUERY, { repos: repoIDs, query, codeResultsCount: 15, textResultsCount: 5, + ...(isValidVersion ? { filePatterns } : {}), }, signal ).then(response => diff --git a/lib/shared/src/sourcegraph-api/graphql/queries.ts b/lib/shared/src/sourcegraph-api/graphql/queries.ts index d3d20a0f289..588a377e50d 100644 --- a/lib/shared/src/sourcegraph-api/graphql/queries.ts +++ b/lib/shared/src/sourcegraph-api/graphql/queries.ts @@ -161,6 +161,7 @@ query FileMatchSearchQuery($query: String!) { __typename ... on FileMatch { repository { + id name } file { @@ -224,7 +225,7 @@ query RankContext($interactionId: String!, $query: String!, $contextItems: [Inpu } }` -export const CONTEXT_SEARCH_QUERY = ` +export const LEGACY_CONTEXT_SEARCH_QUERY = ` query GetCodyContext($repos: [ID!]!, $query: String!, $codeResultsCount: Int!, $textResultsCount: Int!) { getCodyContext(repos: $repos, query: $query, codeResultsCount: $codeResultsCount, textResultsCount: $textResultsCount) { ...on FileChunkContext { @@ -246,6 +247,28 @@ query GetCodyContext($repos: [ID!]!, $query: String!, $codeResultsCount: Int!, $ } }` +export const CONTEXT_SEARCH_QUERY = ` +query GetCodyContext($repos: [ID!]!, $query: String!, $codeResultsCount: Int!, $textResultsCount: Int!, $filePatterns: [String!]!) { + getCodyContext(repos: $repos, query: $query, codeResultsCount: $codeResultsCount, textResultsCount: $textResultsCount, filePatterns: $filePatterns) { + ...on FileChunkContext { + blob { + path + repository { + id + name + } + commit { + oid + } + url + } + startLine + endLine + chunkContent + } + } +}` + export const CONTEXT_FILTERS_QUERY = ` query ContextFilters { site { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 066e5b9c267..0733d082302 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8092,6 +8092,7 @@ packages: /bare-stream@2.1.3: resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==} + requiresBuild: true dependencies: streamx: 2.18.0 dev: true @@ -15629,6 +15630,7 @@ packages: /streamx@2.18.0: resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + requiresBuild: true dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 @@ -16110,6 +16112,7 @@ packages: /text-decoder@1.1.1: resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + requiresBuild: true dependencies: b4a: 1.6.6 dev: true diff --git a/vscode/src/chat/chat-view/ContextRetriever.ts b/vscode/src/chat/chat-view/ContextRetriever.ts index 75cd33a20f4..3e4d7f6b294 100644 --- a/vscode/src/chat/chat-view/ContextRetriever.ts +++ b/vscode/src/chat/chat-view/ContextRetriever.ts @@ -315,7 +315,7 @@ export class ContextRetriever implements vscode.Disposable { return [] } - const remoteResultPromise = graphqlClient.contextSearch(repoIDs, query, signal) + const remoteResultPromise = graphqlClient.contextSearch({ repoIDs, query, signal }) const remoteResult = await remoteResultPromise if (isError(remoteResult)) { diff --git a/vscode/src/context/openctx.ts b/vscode/src/context/openctx.ts index 418dbbf0738..95dae336a4e 100644 --- a/vscode/src/context/openctx.ts +++ b/vscode/src/context/openctx.ts @@ -1,5 +1,6 @@ import { type AuthStatus, + CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI, CodyIDE, type Configuration, FeatureFlag, @@ -20,8 +21,10 @@ import { Observable } from 'observable-fns' import type { ConfigWatcher } from '../configwatcher' import { logDebug, outputChannel } from '../log' import type { AuthProvider } from '../services/AuthProvider' +import CurrentRepositoryDirectoryProvider from './openctx/currentRepositoryDirectorySearch' import { gitMentionsProvider } from './openctx/git' import LinearIssuesProvider from './openctx/linear-issues' +import RemoteDirectoryProvider, { createRemoteDirectoryProvider } from './openctx/remoteDirectorySearch' import RemoteFileProvider, { createRemoteFileProvider } from './openctx/remoteFileSearch' import RemoteRepositorySearch, { createRemoteRepositoryProvider } from './openctx/remoteRepositorySearch' import { createWebProvider } from './openctx/web' @@ -43,6 +46,8 @@ export async function exposeOpenCtxClient( ? getMergeConfigurationFunction() : undefined + const isValidSiteVersion = await graphqlClient.isValidSiteVersion({ minimumVersion: '5.7.0' }) + const controller = createController({ extensionId: context.extension.id, secrets: context.secrets, @@ -50,7 +55,7 @@ export async function exposeOpenCtxClient( features: isCodyWeb ? {} : { annotations: true, statusBar: true }, providers: isCodyWeb ? Observable.of(getCodyWebOpenCtxProviders()) - : getOpenCtxProviders(config.changes, authProvider.changes), + : getOpenCtxProviders(config.changes, authProvider.changes, isValidSiteVersion), mergeConfiguration, }) setOpenCtx({ @@ -64,57 +69,72 @@ export async function exposeOpenCtxClient( function getOpenCtxProviders( configChanges: Observable, - authStatusChanges: Observable + authStatusChanges: Observable, + isValidSiteVersion: boolean ): Observable { return combineLatest([ configChanges, authStatusChanges, featureFlagProvider.evaluatedFeatureFlag(FeatureFlag.GitMentionProvider), - ]).map(([config, authStatus, gitMentionProvider]) => { - const providers: ImportedProviderConfiguration[] = [ - { - settings: true, - provider: createWebProvider(false), - providerUri: WEB_PROVIDER_URI, - }, - ] - - // Remote repository and remote files should be available only for - // non-dotcom users - if (!authStatus.isDotCom) { - providers.push({ - settings: true, - provider: RemoteRepositorySearch, - providerUri: RemoteRepositorySearch.providerUri, - }) + ]).map( + ([config, authStatus, gitMentionProvider]: [Configuration, AuthStatus, boolean | undefined]) => { + const providers: ImportedProviderConfiguration[] = [ + { + settings: true, + provider: createWebProvider(false), + providerUri: WEB_PROVIDER_URI, + }, + ] + + // Remote repository and remote files should be available only for + // non-dotcom users + if (!authStatus.isDotCom) { + providers.push({ + settings: true, + provider: RemoteRepositorySearch, + providerUri: RemoteRepositorySearch.providerUri, + }) + + if (isValidSiteVersion) { + providers.push({ + settings: true, + provider: RemoteDirectoryProvider, + providerUri: RemoteDirectoryProvider.providerUri, + }) + + providers.push({ + settings: true, + provider: CurrentRepositoryDirectoryProvider, + providerUri: CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI, + }) + } - if (config.experimentalNoodle) { providers.push({ settings: true, provider: RemoteFileProvider, providerUri: RemoteFileProvider.providerUri, }) } - } - if (config.experimentalNoodle) { - providers.push({ - settings: true, - provider: LinearIssuesProvider, - providerUri: LinearIssuesProvider.providerUri, - }) - } + if (config.experimentalNoodle) { + providers.push({ + settings: true, + provider: LinearIssuesProvider, + providerUri: LinearIssuesProvider.providerUri, + }) + } - if (gitMentionProvider) { - providers.push({ - settings: true, - provider: gitMentionsProvider, - providerUri: GIT_OPENCTX_PROVIDER_URI, - }) - } + if (gitMentionProvider) { + providers.push({ + settings: true, + provider: gitMentionsProvider, + providerUri: GIT_OPENCTX_PROVIDER_URI, + }) + } - return providers - }) + return providers + } + ) } function getCodyWebOpenCtxProviders(): ImportedProviderConfiguration[] { @@ -129,6 +149,11 @@ function getCodyWebOpenCtxProviders(): ImportedProviderConfiguration[] { providerUri: RemoteFileProvider.providerUri, provider: createRemoteFileProvider('Files'), }, + { + settings: true, + providerUri: RemoteDirectoryProvider.providerUri, + provider: createRemoteDirectoryProvider('Directories'), + }, { settings: true, providerUri: WEB_PROVIDER_URI, diff --git a/vscode/src/context/openctx/currentRepositoryDirectorySearch.ts b/vscode/src/context/openctx/currentRepositoryDirectorySearch.ts new file mode 100644 index 00000000000..3a782494be5 --- /dev/null +++ b/vscode/src/context/openctx/currentRepositoryDirectorySearch.ts @@ -0,0 +1,130 @@ +import type { Item, Mention } from '@openctx/client' +import { + CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI, + graphqlClient, + isDefined, + isError, +} from '@sourcegraph/cody-shared' +import * as vscode from 'vscode' +import { escapeRegExp } from './remoteFileSearch' + +import { getEditor } from '../../editor/active-editor' +import { repoNameResolver } from '../../repository/repo-name-resolver' +import { WorkspaceRepoMapper } from '../workspace-repo-mapper' +import type { OpenCtxProvider } from './types' + +const CurrentRepositoryDirectoryProvider = createCurrentRepositoryDirectoryProvider() +export function createCurrentRepositoryDirectoryProvider(customTitle?: string): OpenCtxProvider { + return { + providerUri: CURRENT_REPOSITORY_DIRECTORY_PROVIDER_URI, + + meta() { + return { + name: customTitle ?? 'Directories', + mentions: {}, + } + }, + + async mentions({ query }) { + const currentFile = getEditor().active?.document.uri + const workspace = vscode.workspace.workspaceFolders?.[0].uri + + if (currentFile || workspace) { + const remote = ( + await repoNameResolver.getRepoNamesFromWorkspaceUri( + (currentFile || workspace) as vscode.Uri + ) + )[0] + + if (remote) { + const workspaceRepoMapper = new WorkspaceRepoMapper() + const currentRepo = await workspaceRepoMapper.repoForCodebase(remote) + + if (currentRepo) { + return await getDirectoryMentions(currentRepo.name, query?.trim()) + } + } + } + + return [] + }, + + async items({ mention, message }) { + if (!mention?.data?.repoID || !mention?.data?.directoryPath || !message) { + return [] + } + + return await getDirectoryItem( + message, + mention.data.repoID as string, + mention.data.directoryPath as string + ) + }, + } +} + +export async function getDirectoryMentions( + repoName: string, + directoryPath?: string +): Promise { + const repoRe = `^${escapeRegExp(repoName)}$` + const directoryRe = directoryPath ? escapeRegExp(directoryPath) : '' + const query = `repo:${repoRe} file:${directoryRe}.*\/.* select:file.directory count:10` + + const dataOrError = await graphqlClient.searchFileMatches(query) + + if (isError(dataOrError) || dataOrError === null) { + return [] + } + + return dataOrError.search.results.results + .map(result => { + if (result.__typename !== 'FileMatch') { + return null + } + + const url = `${graphqlClient.endpoint.replace(/\/$/, '')}${result.file.url}` + + return { + uri: url, + title: result.file.path, + description: '', + data: { + repoName: result.repository.name, + repoID: result.repository.id, + rev: result.file.commit.oid, + directoryPath: result.file.path, + }, + } satisfies Mention + }) + .filter(isDefined) +} + +export async function getDirectoryItem( + query: string, + repoID: string, + directoryPath: string +): Promise { + const dataOrError = await graphqlClient.contextSearch({ + repoIDs: [repoID], + query, + filePatterns: [directoryPath], + }) + + if (isError(dataOrError) || dataOrError === null) { + return [] + } + + return dataOrError.map( + node => + ({ + url: node.uri.toString(), + title: node.path, + ai: { + content: node.content, + }, + }) as Item + ) +} + +export default CurrentRepositoryDirectoryProvider diff --git a/vscode/src/context/openctx/remoteDirectorySearch.ts b/vscode/src/context/openctx/remoteDirectorySearch.ts new file mode 100644 index 00000000000..e2ee58d4400 --- /dev/null +++ b/vscode/src/context/openctx/remoteDirectorySearch.ts @@ -0,0 +1,44 @@ +import { REMOTE_DIRECTORY_PROVIDER_URI } from '@sourcegraph/cody-shared' +import { getRepoMentions } from './remoteFileSearch' + +import { getDirectoryItem, getDirectoryMentions } from './currentRepositoryDirectorySearch' +import type { OpenCtxProvider } from './types' + +const RemoteDirectoryProvider = createRemoteDirectoryProvider() + +export function createRemoteDirectoryProvider(customTitle?: string): OpenCtxProvider { + return { + providerUri: REMOTE_DIRECTORY_PROVIDER_URI, + + meta() { + return { + name: customTitle ?? 'Remote Directories', + mentions: {}, + } + }, + + async mentions({ query }) { + const [repoName, directoryPath] = query?.split(':') || [] + + if (!query?.includes(':') || !repoName.trim()) { + return await getRepoMentions(query?.trim()) + } + + return await getDirectoryMentions(repoName, directoryPath.trim()) + }, + + async items({ mention, message }) { + if (!mention?.data?.repoID || !mention?.data?.directoryPath || !message) { + return [] + } + + return await getDirectoryItem( + message, + mention.data.repoID as string, + mention.data.directoryPath as string + ) + }, + } +} + +export default RemoteDirectoryProvider diff --git a/vscode/src/context/openctx/remoteFileSearch.ts b/vscode/src/context/openctx/remoteFileSearch.ts index 258adddc785..f9a6cdff4ad 100644 --- a/vscode/src/context/openctx/remoteFileSearch.ts +++ b/vscode/src/context/openctx/remoteFileSearch.ts @@ -48,7 +48,7 @@ export function createRemoteFileProvider(customTitle?: string): OpenCtxProvider } } -async function getRepoMentions(query?: string): Promise { +export async function getRepoMentions(query?: string): Promise { const dataOrError = await graphqlClient.searchRepos(10, undefined, query) if (isError(dataOrError) || dataOrError === null) { @@ -131,7 +131,7 @@ async function getFileItem(repoName: string, filePath: string, rev = 'HEAD'): Pr ] satisfies Item[] } -function escapeRegExp(str: string): string { +export function escapeRegExp(str: string): string { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') } diff --git a/vscode/src/context/openctx/remoteRepositorySearch.ts b/vscode/src/context/openctx/remoteRepositorySearch.ts index aaddf36bb00..eb079d70201 100644 --- a/vscode/src/context/openctx/remoteRepositorySearch.ts +++ b/vscode/src/context/openctx/remoteRepositorySearch.ts @@ -40,10 +40,10 @@ export function createRemoteRepositoryProvider(customTitle?: string): OpenCtxPro return [] } - const dataOrError = await graphqlClient.contextSearch( - [mention?.data?.repoId as string], - message - ) + const dataOrError = await graphqlClient.contextSearch({ + repoIDs: [mention?.data?.repoId as string], + query: message, + }) if (isError(dataOrError) || dataOrError === null) { return [] } diff --git a/vscode/src/context/remote-search.ts b/vscode/src/context/remote-search.ts index 5b59b251a7b..13499ff675b 100644 --- a/vscode/src/context/remote-search.ts +++ b/vscode/src/context/remote-search.ts @@ -130,7 +130,7 @@ export class RemoteSearch implements ContextStatusProvider { return [] } const rewritten = await rewriteKeywordQuery(this.completions, query, signal) - const result = await graphqlClient.contextSearch(repoIDs, rewritten, signal) + const result = await graphqlClient.contextSearch({ repoIDs, query: rewritten, signal }) if (isError(result)) { throw result }