Skip to content

Commit 6662d20

Browse files
authored
Search scope refactor (#405)
* new demo card ui * rename search context to search scope * rename everything to use search scope * add changelog entry
1 parent be9979f commit 6662d20

File tree

19 files changed

+394
-463
lines changed

19 files changed

+394
-463
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Added
1111
- Add search context to ask sourcebot context selector. [#397](https://github.com/sourcebot-dev/sourcebot/pull/397)
1212
- Add ability to include/exclude connection in search context. [#399](https://github.com/sourcebot-dev/sourcebot/pull/399)
13+
- Search context refactor to search scope and demo card UI changes. [#405](https://github.com/sourcebot-dev/sourcebot/pull/405)
1314

1415
### Fixed
1516
- Fixed multiple writes race condition on config file watcher. [#398](https://github.com/sourcebot-dev/sourcebot/pull/398)

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

Lines changed: 9 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22

33
import { ResizablePanel } from '@/components/ui/resizable';
44
import { ChatThread } from '@/features/chat/components/chatThread';
5-
import { LanguageModelInfo, SBChatMessage, SET_CHAT_STATE_QUERY_PARAM, SetChatStatePayload } from '@/features/chat/types';
5+
import { LanguageModelInfo, SBChatMessage, SearchScope, SET_CHAT_STATE_QUERY_PARAM, SetChatStatePayload } from '@/features/chat/types';
66
import { RepositoryQuery, SearchContextQuery } from '@/lib/types';
77
import { CreateUIMessage } from 'ai';
88
import { useRouter, useSearchParams } from 'next/navigation';
99
import { useEffect, useState } from 'react';
1010
import { useChatId } from '../../useChatId';
11-
import { ContextItem } from '@/features/chat/components/chatBox/contextSelector';
1211

1312
interface ChatThreadPanelProps {
1413
languageModels: LanguageModelInfo[];
@@ -33,62 +32,22 @@ export const ChatThreadPanel = ({
3332
const router = useRouter();
3433
const searchParams = useSearchParams();
3534
const [inputMessage, setInputMessage] = useState<CreateUIMessage<SBChatMessage> | undefined>(undefined);
36-
35+
3736
// Use the last user's last message to determine what repos and contexts we should select by default.
3837
const lastUserMessage = messages.findLast((message) => message.role === "user");
39-
const defaultSelectedRepos = lastUserMessage?.metadata?.selectedRepos ?? [];
40-
const defaultSelectedContexts = lastUserMessage?.metadata?.selectedContexts ?? [];
38+
const defaultSelectedSearchScopes = lastUserMessage?.metadata?.selectedSearchScopes ?? [];
39+
const [selectedSearchScopes, setSelectedSearchScopes] = useState<SearchScope[]>(defaultSelectedSearchScopes);
4140

42-
const [selectedItems, setSelectedItems] = useState<ContextItem[]>([
43-
...defaultSelectedRepos.map(repoName => {
44-
const repoInfo = repos.find(r => r.repoName === repoName);
45-
return {
46-
type: 'repo' as const,
47-
value: repoName,
48-
name: repoInfo?.repoDisplayName || repoName.split('/').pop() || repoName,
49-
codeHostType: repoInfo?.codeHostType || ''
50-
};
51-
}),
52-
...defaultSelectedContexts.map(contextName => {
53-
const context = searchContexts.find(c => c.name === contextName);
54-
return {
55-
type: 'context' as const,
56-
value: contextName,
57-
name: contextName,
58-
repoCount: context?.repoNames.length || 0
59-
};
60-
})
61-
]);
62-
6341
useEffect(() => {
6442
const setChatState = searchParams.get(SET_CHAT_STATE_QUERY_PARAM);
6543
if (!setChatState) {
6644
return;
6745
}
6846

6947
try {
70-
const { inputMessage, selectedRepos, selectedContexts } = JSON.parse(setChatState) as SetChatStatePayload;
48+
const { inputMessage, selectedSearchScopes } = JSON.parse(setChatState) as SetChatStatePayload;
7149
setInputMessage(inputMessage);
72-
setSelectedItems([
73-
...selectedRepos.map(repoName => {
74-
const repoInfo = repos.find(r => r.repoName === repoName);
75-
return {
76-
type: 'repo' as const,
77-
value: repoName,
78-
name: repoInfo?.repoDisplayName || repoName.split('/').pop() || repoName,
79-
codeHostType: repoInfo?.codeHostType || ''
80-
};
81-
}),
82-
...selectedContexts.map(contextName => {
83-
const context = searchContexts.find(c => c.name === contextName);
84-
return {
85-
type: 'context' as const,
86-
value: contextName,
87-
name: contextName,
88-
repoCount: context?.repoNames.length || 0
89-
};
90-
})
91-
]);
50+
setSelectedSearchScopes(selectedSearchScopes);
9251
} catch {
9352
console.error('Invalid message in URL');
9453
}
@@ -97,7 +56,7 @@ export const ChatThreadPanel = ({
9756
const newSearchParams = new URLSearchParams(searchParams.toString());
9857
newSearchParams.delete(SET_CHAT_STATE_QUERY_PARAM);
9958
router.replace(`?${newSearchParams.toString()}`, { scroll: false });
100-
}, [searchParams, router, repos, searchContexts]);
59+
}, [searchParams, router]);
10160

10261
return (
10362
<ResizablePanel
@@ -113,8 +72,8 @@ export const ChatThreadPanel = ({
11372
languageModels={languageModels}
11473
repos={repos}
11574
searchContexts={searchContexts}
116-
selectedItems={selectedItems}
117-
onSelectedItemsChange={setSelectedItems}
75+
selectedSearchScopes={selectedSearchScopes}
76+
onSelectedSearchScopesChange={setSelectedSearchScopes}
11877
isChatReadonly={isChatReadonly}
11978
/>
12079
</div>

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ import { ChatBox } from "@/features/chat/components/chatBox";
55
import { ChatBoxToolbar } from "@/features/chat/components/chatBox/chatBoxToolbar";
66
import { CustomSlateEditor } from "@/features/chat/customSlateEditor";
77
import { useCreateNewChatThread } from "@/features/chat/useCreateNewChatThread";
8-
import { LanguageModelInfo } from "@/features/chat/types";
8+
import { LanguageModelInfo, SearchScope } from "@/features/chat/types";
99
import { RepositoryQuery, SearchContextQuery } from "@/lib/types";
1010
import { useCallback, useState } from "react";
1111
import { Descendant } from "slate";
1212
import { useLocalStorage } from "usehooks-ts";
13-
import { ContextItem } from "@/features/chat/components/chatBox/contextSelector";
1413

1514
interface NewChatPanelProps {
1615
languageModels: LanguageModelInfo[];
@@ -25,13 +24,13 @@ export const NewChatPanel = ({
2524
searchContexts,
2625
order,
2726
}: NewChatPanelProps) => {
28-
const [selectedItems, setSelectedItems] = useLocalStorage<ContextItem[]>("selectedContextItems", [], { initializeWithValue: false });
27+
const [selectedSearchScopes, setSelectedSearchScopes] = useLocalStorage<SearchScope[]>("selectedSearchScopes", [], { initializeWithValue: false });
2928
const { createNewChatThread, isLoading } = useCreateNewChatThread();
3029
const [isContextSelectorOpen, setIsContextSelectorOpen] = useState(false);
3130

3231
const onSubmit = useCallback((children: Descendant[]) => {
33-
createNewChatThread(children, selectedItems);
34-
}, [createNewChatThread, selectedItems]);
32+
createNewChatThread(children, selectedSearchScopes);
33+
}, [createNewChatThread, selectedSearchScopes]);
3534

3635

3736
return (
@@ -50,7 +49,7 @@ export const NewChatPanel = ({
5049
preferredSuggestionsBoxPlacement="bottom-start"
5150
isRedirecting={isLoading}
5251
languageModels={languageModels}
53-
selectedItems={selectedItems}
52+
selectedSearchScopes={selectedSearchScopes}
5453
searchContexts={searchContexts}
5554
onContextSelectorOpenChanged={setIsContextSelectorOpen}
5655
/>
@@ -59,8 +58,8 @@ export const NewChatPanel = ({
5958
languageModels={languageModels}
6059
repos={repos}
6160
searchContexts={searchContexts}
62-
selectedItems={selectedItems}
63-
onSelectedItemsChange={setSelectedItems}
61+
selectedSearchScopes={selectedSearchScopes}
62+
onSelectedSearchScopesChange={setSelectedSearchScopes}
6463
isContextSelectorOpen={isContextSelectorOpen}
6564
onContextSelectorOpenChanged={setIsContextSelectorOpen}
6665
/>

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

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33
import { Separator } from "@/components/ui/separator";
44
import { ChatBox } from "@/features/chat/components/chatBox";
55
import { ChatBoxToolbar } from "@/features/chat/components/chatBox/chatBoxToolbar";
6-
import { LanguageModelInfo } from "@/features/chat/types";
6+
import { LanguageModelInfo, SearchScope } from "@/features/chat/types";
77
import { useCreateNewChatThread } from "@/features/chat/useCreateNewChatThread";
88
import { RepositoryQuery, SearchContextQuery } from "@/lib/types";
99
import { useState } from "react";
1010
import { SearchModeSelector, SearchModeSelectorProps } from "./toolbar";
1111
import { useLocalStorage } from "usehooks-ts";
12-
import { ContextItem } from "@/features/chat/components/chatBox/contextSelector";
1312
import { DemoExamples } from "@/types";
1413
import { AskSourcebotDemoCards } from "./askSourcebotDemoCards";
1514

@@ -34,20 +33,20 @@ export const AgenticSearch = ({
3433
demoExamples,
3534
}: AgenticSearchProps) => {
3635
const { createNewChatThread, isLoading } = useCreateNewChatThread();
37-
const [selectedItems, setSelectedItems] = useLocalStorage<ContextItem[]>("selectedContextItems", [], { initializeWithValue: false });
36+
const [selectedSearchScopes, setSelectedSearchScopes] = useLocalStorage<SearchScope[]>("selectedSearchScopes", [], { initializeWithValue: false });
3837
const [isContextSelectorOpen, setIsContextSelectorOpen] = useState(false);
3938

4039
return (
4140
<div className="flex flex-col items-center w-full">
4241
<div className="mt-4 w-full border rounded-md shadow-sm max-w-[800px]">
4342
<ChatBox
4443
onSubmit={(children) => {
45-
createNewChatThread(children, selectedItems);
44+
createNewChatThread(children, selectedSearchScopes);
4645
}}
4746
className="min-h-[50px]"
4847
isRedirecting={isLoading}
4948
languageModels={languageModels}
50-
selectedItems={selectedItems}
49+
selectedSearchScopes={selectedSearchScopes}
5150
searchContexts={searchContexts}
5251
onContextSelectorOpenChanged={setIsContextSelectorOpen}
5352
/>
@@ -58,8 +57,8 @@ export const AgenticSearch = ({
5857
languageModels={languageModels}
5958
repos={repos}
6059
searchContexts={searchContexts}
61-
selectedItems={selectedItems}
62-
onSelectedItemsChange={setSelectedItems}
60+
selectedSearchScopes={selectedSearchScopes}
61+
onSelectedSearchScopesChange={setSelectedSearchScopes}
6362
isContextSelectorOpen={isContextSelectorOpen}
6463
onContextSelectorOpenChanged={setIsContextSelectorOpen}
6564
/>
@@ -74,10 +73,6 @@ export const AgenticSearch = ({
7473
{demoExamples && (
7574
<AskSourcebotDemoCards
7675
demoExamples={demoExamples}
77-
selectedItems={selectedItems}
78-
setSelectedItems={setSelectedItems}
79-
searchContexts={searchContexts}
80-
repos={repos}
8176
/>
8277
)}
8378
</div >

0 commit comments

Comments
 (0)