Skip to content

Commit 0b80e02

Browse files
committed
move search context fetch to server
1 parent b6e8961 commit 0b80e02

11 files changed

Lines changed: 54 additions & 28 deletions

File tree

packages/web/src/app/[domain]/chat/[id]/components/chatThreadPanel.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { ResizablePanel } from '@/components/ui/resizable';
44
import { ChatThread } from '@/features/chat/components/chatThread';
55
import { LanguageModelInfo, SBChatMessage, SET_CHAT_STATE_QUERY_PARAM, SetChatStatePayload } from '@/features/chat/types';
6-
import { RepositoryQuery } from '@/lib/types';
6+
import { RepositoryQuery, SearchContextQuery } from '@/lib/types';
77
import { CreateUIMessage } from 'ai';
88
import { useRouter, useSearchParams } from 'next/navigation';
99
import { useEffect, useState } from 'react';
@@ -13,6 +13,7 @@ import { ContextItem } from '@/features/chat/components/chatBox/contextSelector'
1313
interface ChatThreadPanelProps {
1414
languageModels: LanguageModelInfo[];
1515
repos: RepositoryQuery[];
16+
searchContexts: SearchContextQuery[];
1617
order: number;
1718
messages: SBChatMessage[];
1819
isChatReadonly: boolean;
@@ -21,6 +22,7 @@ interface ChatThreadPanelProps {
2122
export const ChatThreadPanel = ({
2223
languageModels,
2324
repos,
25+
searchContexts,
2426
order,
2527
messages,
2628
isChatReadonly,
@@ -94,6 +96,7 @@ export const ChatThreadPanel = ({
9496
inputMessage={inputMessage}
9597
languageModels={languageModels}
9698
repos={repos}
99+
searchContexts={searchContexts}
97100
selectedItems={selectedItems}
98101
onSelectedItemsChange={setSelectedItems}
99102
isChatReadonly={isChatReadonly}

packages/web/src/app/[domain]/chat/[id]/page.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getRepos } from '@/actions';
1+
import { getRepos, getSearchContexts } from '@/actions';
22
import { getUserChatHistory, getConfiguredLanguageModelsInfo, getChatInfo } from '@/features/chat/actions';
33
import { ServiceErrorException } from '@/lib/serviceError';
44
import { isServiceError } from '@/lib/utils';
@@ -22,6 +22,7 @@ interface PageProps {
2222
export default async function Page({ params }: PageProps) {
2323
const languageModels = await getConfiguredLanguageModelsInfo();
2424
const repos = await getRepos(params.domain);
25+
const searchContexts = await getSearchContexts(params.domain);
2526
const chatInfo = await getChatInfo({ chatId: params.id }, params.domain);
2627
const session = await auth();
2728
const chatHistory = session ? await getUserChatHistory(params.domain) : [];
@@ -34,6 +35,10 @@ export default async function Page({ params }: PageProps) {
3435
throw new ServiceErrorException(repos);
3536
}
3637

38+
if (isServiceError(searchContexts)) {
39+
throw new ServiceErrorException(searchContexts);
40+
}
41+
3742
if (isServiceError(chatInfo)) {
3843
if (chatInfo.statusCode === StatusCodes.NOT_FOUND) {
3944
return notFound();
@@ -74,6 +79,7 @@ export default async function Page({ params }: PageProps) {
7479
<ChatThreadPanel
7580
languageModels={languageModels}
7681
repos={indexedRepos}
82+
searchContexts={searchContexts}
7783
messages={messages}
7884
order={2}
7985
isChatReadonly={isReadonly}

packages/web/src/app/[domain]/chat/components/newChatPanel.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { ChatBoxToolbar } from "@/features/chat/components/chatBox/chatBoxToolba
66
import { CustomSlateEditor } from "@/features/chat/customSlateEditor";
77
import { useCreateNewChatThread } from "@/features/chat/useCreateNewChatThread";
88
import { LanguageModelInfo } from "@/features/chat/types";
9-
import { RepositoryQuery } from "@/lib/types";
9+
import { RepositoryQuery, SearchContextQuery } from "@/lib/types";
1010
import { useCallback, useState } from "react";
1111
import { Descendant } from "slate";
1212
import { useLocalStorage } from "usehooks-ts";
@@ -15,12 +15,14 @@ import { ContextItem } from "@/features/chat/components/chatBox/contextSelector"
1515
interface NewChatPanelProps {
1616
languageModels: LanguageModelInfo[];
1717
repos: RepositoryQuery[];
18+
searchContexts: SearchContextQuery[];
1819
order: number;
1920
}
2021

2122
export const NewChatPanel = ({
2223
languageModels,
2324
repos,
25+
searchContexts,
2426
order,
2527
}: NewChatPanelProps) => {
2628
const [selectedItems, setSelectedItems] = useLocalStorage<ContextItem[]>("selectedContextItems", [], { initializeWithValue: false });
@@ -55,6 +57,7 @@ export const NewChatPanel = ({
5557
<ChatBoxToolbar
5658
languageModels={languageModels}
5759
repos={repos}
60+
searchContexts={searchContexts}
5861
selectedItems={selectedItems}
5962
onSelectedItemsChange={setSelectedItems}
6063
isContextSelectorOpen={isContextSelectorOpen}

packages/web/src/app/[domain]/chat/page.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getRepos } from "@/actions";
1+
import { getRepos, getSearchContexts } from "@/actions";
22
import { getUserChatHistory, getConfiguredLanguageModelsInfo } from "@/features/chat/actions";
33
import { ServiceErrorException } from "@/lib/serviceError";
44
import { isServiceError } from "@/lib/utils";
@@ -18,6 +18,7 @@ interface PageProps {
1818
export default async function Page({ params }: PageProps) {
1919
const languageModels = await getConfiguredLanguageModelsInfo();
2020
const repos = await getRepos(params.domain);
21+
const searchContexts = await getSearchContexts(params.domain);
2122
const session = await auth();
2223
const chatHistory = session ? await getUserChatHistory(params.domain) : [];
2324

@@ -29,6 +30,10 @@ export default async function Page({ params }: PageProps) {
2930
throw new ServiceErrorException(repos);
3031
}
3132

33+
if (isServiceError(searchContexts)) {
34+
throw new ServiceErrorException(searchContexts);
35+
}
36+
3237
const indexedRepos = repos.filter((repo) => repo.indexedAt !== undefined);
3338

3439
return (
@@ -48,6 +53,7 @@ export default async function Page({ params }: PageProps) {
4853
<AnimatedResizableHandle />
4954
<NewChatPanel
5055
languageModels={languageModels}
56+
searchContexts={searchContexts}
5157
repos={indexedRepos}
5258
order={2}
5359
/>

packages/web/src/app/[domain]/components/homepage/agenticSearch.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { LanguageModelInfo } from "@/features/chat/types";
88
import { useCreateNewChatThread } from "@/features/chat/useCreateNewChatThread";
99
import { resetEditor } from "@/features/chat/utils";
1010
import { useDomain } from "@/hooks/useDomain";
11-
import { RepositoryQuery } from "@/lib/types";
11+
import { RepositoryQuery, SearchContextQuery } from "@/lib/types";
1212
import { getDisplayTime } from "@/lib/utils";
1313
import { BrainIcon, FileIcon, LucideIcon, SearchIcon } from "lucide-react";
1414
import Link from "next/link";
@@ -110,6 +110,7 @@ interface AgenticSearchProps {
110110
searchModeSelectorProps: SearchModeSelectorProps;
111111
languageModels: LanguageModelInfo[];
112112
repos: RepositoryQuery[];
113+
searchContexts: SearchContextQuery[];
113114
chatHistory: {
114115
id: string;
115116
createdAt: Date;
@@ -121,6 +122,7 @@ export const AgenticSearch = ({
121122
searchModeSelectorProps,
122123
languageModels,
123124
repos,
125+
searchContexts,
124126
chatHistory,
125127
}: AgenticSearchProps) => {
126128
const [selectedSuggestionType, _setSelectedSuggestionType] = useState<SuggestionType | undefined>(undefined);
@@ -173,6 +175,7 @@ export const AgenticSearch = ({
173175
<ChatBoxToolbar
174176
languageModels={languageModels}
175177
repos={repos}
178+
searchContexts={searchContexts}
176179
selectedItems={selectedItems}
177180
onSelectedItemsChange={setSelectedItems}
178181
isContextSelectorOpen={isContextSelectorOpen}

packages/web/src/app/[domain]/components/homepage/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { SourcebotLogo } from "@/app/components/sourcebotLogo";
44
import { LanguageModelInfo } from "@/features/chat/types";
5-
import { RepositoryQuery } from "@/lib/types";
5+
import { RepositoryQuery, SearchContextQuery } from "@/lib/types";
66
import { useHotkeys } from "react-hotkeys-hook";
77
import { AgenticSearch } from "./agenticSearch";
88
import { PreciseSearch } from "./preciseSearch";
@@ -13,6 +13,7 @@ import { useCallback, useState } from "react";
1313

1414
interface HomepageProps {
1515
initialRepos: RepositoryQuery[];
16+
searchContexts: SearchContextQuery[];
1617
languageModels: LanguageModelInfo[];
1718
chatHistory: {
1819
id: string;
@@ -25,6 +26,7 @@ interface HomepageProps {
2526

2627
export const Homepage = ({
2728
initialRepos,
29+
searchContexts,
2830
languageModels,
2931
chatHistory,
3032
initialSearchMode,
@@ -82,6 +84,7 @@ export const Homepage = ({
8284
}}
8385
languageModels={languageModels}
8486
repos={initialRepos}
87+
searchContexts={searchContexts}
8588
chatHistory={chatHistory}
8689
/>
8790
</CustomSlateEditor>

packages/web/src/app/[domain]/page.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getRepos } from "@/actions";
1+
import { getRepos, getSearchContexts } from "@/actions";
22
import { Footer } from "@/app/components/footer";
33
import { getOrgFromDomain } from "@/data/org";
44
import { getConfiguredLanguageModelsInfo, getUserChatHistory } from "@/features/chat/actions";
@@ -22,12 +22,17 @@ export default async function Home({ params: { domain } }: { params: { domain: s
2222

2323
const models = await getConfiguredLanguageModelsInfo();
2424
const repos = await getRepos(domain);
25+
const searchContexts = await getSearchContexts(domain);
2526
const chatHistory = session ? await getUserChatHistory(domain) : [];
2627

2728
if (isServiceError(repos)) {
2829
throw new ServiceErrorException(repos);
2930
}
3031

32+
if (isServiceError(searchContexts)) {
33+
throw new ServiceErrorException(searchContexts);
34+
}
35+
3136
if (isServiceError(chatHistory)) {
3237
throw new ServiceErrorException(chatHistory);
3338
}
@@ -52,6 +57,7 @@ export default async function Home({ params: { domain } }: { params: { domain: s
5257

5358
<Homepage
5459
initialRepos={indexedRepos}
60+
searchContexts={searchContexts}
5561
languageModels={models}
5662
chatHistory={chatHistory}
5763
initialSearchMode={initialSearchMode}

packages/web/src/features/chat/components/chatBox/chatBoxToolbar.tsx

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,19 @@ import { Button } from "@/components/ui/button";
55
import { Separator } from "@/components/ui/separator";
66
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
77
import { LanguageModelInfo } from "@/features/chat/types";
8-
import { RepositoryQuery } from "@/lib/types";
8+
import { RepositoryQuery, SearchContextQuery } from "@/lib/types";
99
import { AtSignIcon } from "lucide-react";
1010
import { useCallback } from "react";
1111
import { useHotkeys } from "react-hotkeys-hook";
1212
import { ReactEditor, useSlate } from "slate-react";
1313
import { useSelectedLanguageModel } from "../../useSelectedLanguageModel";
1414
import { LanguageModelSelector } from "./languageModelSelector";
1515
import { ContextSelector, type ContextItem } from "./contextSelector";
16-
import { useQuery } from "@tanstack/react-query";
17-
import { getSearchContexts } from "@/actions";
18-
import { useDomain } from "@/hooks/useDomain";
19-
import { isServiceError } from "@/lib/utils";
2016

2117
export interface ChatBoxToolbarProps {
2218
languageModels: LanguageModelInfo[];
2319
repos: RepositoryQuery[];
20+
searchContexts: SearchContextQuery[];
2421
selectedItems: ContextItem[];
2522
onSelectedItemsChange: (items: ContextItem[]) => void;
2623
isContextSelectorOpen: boolean;
@@ -30,25 +27,14 @@ export interface ChatBoxToolbarProps {
3027
export const ChatBoxToolbar = ({
3128
languageModels,
3229
repos,
30+
searchContexts,
3331
selectedItems,
3432
onSelectedItemsChange,
3533
isContextSelectorOpen,
3634
onContextSelectorOpenChanged,
3735
}: ChatBoxToolbarProps) => {
3836
const editor = useSlate();
39-
const domain = useDomain();
4037

41-
const { data: searchContexts } = useQuery({
42-
queryKey: ["searchContexts", domain],
43-
queryFn: () => getSearchContexts(domain),
44-
select: (data) => {
45-
if (isServiceError(data)) {
46-
return [];
47-
}
48-
return data;
49-
},
50-
});
51-
5238
const onAddContext = useCallback(() => {
5339
editor.insertText("@");
5440
ReactEditor.focus(editor);
@@ -95,7 +81,7 @@ export const ChatBoxToolbar = ({
9581
<ContextSelector
9682
className="bg-inherit w-fit h-6 min-h-6"
9783
repos={repos}
98-
searchContexts={searchContexts || []}
84+
searchContexts={searchContexts}
9985
selectedItems={selectedItems}
10086
onSelectedItemsChange={onSelectedItemsChange}
10187
isOpen={isContextSelectorOpen}

packages/web/src/features/chat/components/chatThread/chatThread.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { ChatThreadListItem } from './chatThreadListItem';
2222
import { ErrorBanner } from './errorBanner';
2323
import { useRouter } from 'next/navigation';
2424
import { usePrevious } from '@uidotdev/usehooks';
25-
import { RepositoryQuery } from '@/lib/types';
25+
import { RepositoryQuery, SearchContextQuery } from '@/lib/types';
2626
import { ContextItem } from '../chatBox/contextSelector';
2727

2828
type ChatHistoryState = {
@@ -35,6 +35,7 @@ interface ChatThreadProps {
3535
inputMessage?: CreateUIMessage<SBChatMessage>;
3636
languageModels: LanguageModelInfo[];
3737
repos: RepositoryQuery[];
38+
searchContexts: SearchContextQuery[];
3839
selectedItems: ContextItem[];
3940
onSelectedItemsChange: (items: ContextItem[]) => void;
4041
isChatReadonly: boolean;
@@ -46,6 +47,7 @@ export const ChatThread = ({
4647
inputMessage,
4748
languageModels,
4849
repos,
50+
searchContexts,
4951
selectedItems,
5052
onSelectedItemsChange,
5153
isChatReadonly,
@@ -333,6 +335,7 @@ export const ChatThread = ({
333335
<ChatBoxToolbar
334336
languageModels={languageModels}
335337
repos={repos}
338+
searchContexts={searchContexts}
336339
selectedItems={selectedItems}
337340
onSelectedItemsChange={onSelectedItemsChange}
338341
isContextSelectorOpen={isContextSelectorOpen}

packages/web/src/lib/schemas.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ export const repositoryQuerySchema = z.object({
2828
repoIndexingStatus: z.nativeEnum(RepoIndexingStatus),
2929
});
3030

31+
export const searchContextQuerySchema = z.object({
32+
name: z.string(),
33+
description: z.string().optional(),
34+
repoCount: z.number(),
35+
});
36+
3137
export const verifyCredentialsRequestSchema = z.object({
3238
email: z.string().email(),
3339
password: z.string().min(8),

0 commit comments

Comments
 (0)