Skip to content

Commit cb17945

Browse files
refs / defs improvements
1 parent 717b6de commit cb17945

File tree

8 files changed

+163
-269
lines changed

8 files changed

+163
-269
lines changed

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,15 +237,21 @@ export const StepPartRenderer = ({ part }: { part: SBChatMessagePart }) => {
237237
)
238238
case 'tool-find_symbol_definitions':
239239
return (
240-
<FindSymbolDefinitionsToolComponent
240+
<ToolLoadingGuard
241241
part={part}
242-
/>
242+
loadingText="Resolving definitions..."
243+
>
244+
{(output) => <FindSymbolDefinitionsToolComponent {...output} />}
245+
</ToolLoadingGuard>
243246
)
244247
case 'tool-find_symbol_references':
245248
return (
246-
<FindSymbolReferencesToolComponent
249+
<ToolLoadingGuard
247250
part={part}
248-
/>
251+
loadingText="Resolving references..."
252+
>
253+
{(output) => <FindSymbolReferencesToolComponent {...output} />}
254+
</ToolLoadingGuard>
249255
)
250256
case 'tool-list_repos':
251257
return (
Lines changed: 15 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,22 @@
11
'use client';
22

3-
import { FindSymbolDefinitionsToolUIPart } from "@/features/chat/tools";
4-
import { useMemo, useState } from "react";
5-
import { FileListItem, ToolHeader, TreeList } from "./shared";
6-
import { CodeSnippet } from "@/app/components/codeSnippet";
3+
import { FindSymbolDefinitionsMetadata, ToolResult } from "@/features/tools";
74
import { Separator } from "@/components/ui/separator";
8-
import { BookOpenIcon } from "lucide-react";
5+
import { VscSymbolMisc } from "react-icons/vsc";
6+
import { RepoBadge } from "./repoBadge";
97

10-
11-
export const FindSymbolDefinitionsToolComponent = ({ part }: { part: FindSymbolDefinitionsToolUIPart }) => {
12-
const [isExpanded, setIsExpanded] = useState(false);
13-
14-
const label = useMemo(() => {
15-
switch (part.state) {
16-
case 'input-streaming':
17-
return 'Resolving definition...';
18-
case 'input-available':
19-
return <span>Resolving definition for <CodeSnippet>{part.input.symbol}</CodeSnippet></span>;
20-
case 'output-error':
21-
return '"Find symbol definitions" tool call failed';
22-
case 'output-available':
23-
return <span>Resolved definition for <CodeSnippet>{part.input.symbol}</CodeSnippet></span>;
24-
}
25-
}, [part]);
8+
export const FindSymbolDefinitionsToolComponent = ({ metadata }: ToolResult<FindSymbolDefinitionsMetadata>) => {
9+
const label = `${metadata.matchCount} ${metadata.matchCount === 1 ? 'definition' : 'definitions'}`;
2610

2711
return (
28-
<div>
29-
<ToolHeader
30-
isLoading={part.state !== 'output-available' && part.state !== 'output-error'}
31-
isError={part.state === 'output-error'}
32-
isExpanded={isExpanded}
33-
label={label}
34-
Icon={BookOpenIcon}
35-
onExpand={setIsExpanded}
36-
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
37-
output={part.state === 'output-available' ? part.output.output : undefined}
38-
/>
39-
{part.state === 'output-available' && isExpanded && (
40-
<>
41-
{part.output.metadata.files.length === 0 ? (
42-
<span className="text-sm text-muted-foreground ml-[25px]">No matches found</span>
43-
) : (
44-
<TreeList>
45-
{part.output.metadata.files.map((file) => {
46-
return (
47-
<FileListItem
48-
key={file.fileName}
49-
path={file.fileName}
50-
repoName={file.repo}
51-
/>
52-
)
53-
})}
54-
</TreeList>
55-
)}
56-
<Separator className='ml-[7px] my-2' />
57-
</>
58-
)}
12+
<div className="flex items-center gap-2 select-none cursor-default text-sm text-muted-foreground">
13+
<span className="flex-shrink-0">Resolved</span>
14+
<code className="inline-flex items-center gap-1 text-xs bg-muted px-1 py-0.5 rounded truncate text-foreground"><VscSymbolMisc className="flex-shrink-0" />{metadata.symbol}</code>
15+
<span className="flex-shrink-0">in</span>
16+
<RepoBadge repo={metadata.repoInfo} />
17+
<span className="flex-1" />
18+
<span className="text-xs flex-shrink-0">{label}</span>
19+
<Separator orientation="vertical" className="h-3 flex-shrink-0" />
5920
</div>
60-
)
61-
}
21+
);
22+
};
Lines changed: 15 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,22 @@
11
'use client';
22

3-
import { FindSymbolReferencesToolUIPart } from "@/features/chat/tools";
4-
import { useMemo, useState } from "react";
5-
import { FileListItem, ToolHeader, TreeList } from "./shared";
6-
import { CodeSnippet } from "@/app/components/codeSnippet";
3+
import { FindSymbolReferencesMetadata, ToolResult } from "@/features/tools";
74
import { Separator } from "@/components/ui/separator";
8-
import { BookOpenIcon } from "lucide-react";
5+
import { VscSymbolMisc } from "react-icons/vsc";
6+
import { RepoBadge } from "./repoBadge";
97

10-
11-
export const FindSymbolReferencesToolComponent = ({ part }: { part: FindSymbolReferencesToolUIPart }) => {
12-
const [isExpanded, setIsExpanded] = useState(false);
13-
14-
const label = useMemo(() => {
15-
switch (part.state) {
16-
case 'input-streaming':
17-
return 'Resolving references...';
18-
case 'input-available':
19-
return <span>Resolving references for <CodeSnippet>{part.input.symbol}</CodeSnippet></span>;
20-
case 'output-error':
21-
return '"Find symbol references" tool call failed';
22-
case 'output-available':
23-
return <span>Resolved references for <CodeSnippet>{part.input.symbol}</CodeSnippet></span>;
24-
}
25-
}, [part]);
8+
export const FindSymbolReferencesToolComponent = ({ metadata }: ToolResult<FindSymbolReferencesMetadata>) => {
9+
const label = `${metadata.matchCount} ${metadata.matchCount === 1 ? 'reference' : 'references'}`;
2610

2711
return (
28-
<div>
29-
<ToolHeader
30-
isLoading={part.state !== 'output-available' && part.state !== 'output-error'}
31-
isError={part.state === 'output-error'}
32-
isExpanded={isExpanded}
33-
label={label}
34-
Icon={BookOpenIcon}
35-
onExpand={setIsExpanded}
36-
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
37-
output={part.state === 'output-available' ? part.output.output : undefined}
38-
/>
39-
{part.state === 'output-available' && isExpanded && (
40-
<>
41-
{part.output.metadata.files.length === 0 ? (
42-
<span className="text-sm text-muted-foreground ml-[25px]">No matches found</span>
43-
) : (
44-
<TreeList>
45-
{part.output.metadata.files.map((file) => {
46-
return (
47-
<FileListItem
48-
key={file.fileName}
49-
path={file.fileName}
50-
repoName={file.repo}
51-
/>
52-
)
53-
})}
54-
</TreeList>
55-
)}
56-
<Separator className='ml-[7px] my-2' />
57-
</>
58-
)}
12+
<div className="flex items-center gap-2 select-none cursor-default text-sm text-muted-foreground">
13+
<span className="flex-shrink-0">Resolved</span>
14+
<code className="inline-flex items-center gap-1 text-xs bg-muted px-1 py-0.5 rounded truncate text-foreground"><VscSymbolMisc className="flex-shrink-0" />{metadata.symbol}</code>
15+
<span className="flex-shrink-0">in</span>
16+
<RepoBadge repo={metadata.repoInfo} />
17+
<span className="flex-1" />
18+
<span className="text-xs flex-shrink-0">{label}</span>
19+
<Separator orientation="vertical" className="h-3 flex-shrink-0" />
5920
</div>
60-
)
61-
}
21+
);
22+
};

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

Lines changed: 0 additions & 121 deletions
This file was deleted.

packages/web/src/features/codeNav/api.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ export const findSearchBasedSymbolReferences = async (props: FindRelatedSymbolsR
2222
repoName,
2323
} = props;
2424

25-
const languageFilter = getExpandedLanguageFilter(language);
26-
2725
const query: QueryIR = {
2826
and: {
2927
children: [
@@ -41,7 +39,7 @@ export const findSearchBasedSymbolReferences = async (props: FindRelatedSymbolsR
4139
exact: true,
4240
}
4341
},
44-
languageFilter,
42+
...(language ? [getExpandedLanguageFilter(language)] : []),
4543
...(repoName ? [{
4644
repo: {
4745
regexp: `^${escapeStringRegexp(repoName)}$`,
@@ -78,8 +76,6 @@ export const findSearchBasedSymbolDefinitions = async (props: FindRelatedSymbols
7876
repoName
7977
} = props;
8078

81-
const languageFilter = getExpandedLanguageFilter(language);
82-
8379
const query: QueryIR = {
8480
and: {
8581
children: [
@@ -101,7 +97,7 @@ export const findSearchBasedSymbolDefinitions = async (props: FindRelatedSymbols
10197
exact: true,
10298
}
10399
},
104-
languageFilter,
100+
...(language ? [getExpandedLanguageFilter(language)] : []),
105101
...(repoName ? [{
106102
repo: {
107103
regexp: `^${escapeStringRegexp(repoName)}$`,

packages/web/src/features/codeNav/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { rangeSchema, repositoryInfoSchema } from "../search/types";
33

44
export const findRelatedSymbolsRequestSchema = z.object({
55
symbolName: z.string(),
6-
language: z.string(),
6+
language: z.string().optional(),
77
/**
88
* Optional revision name to scope search to.
99
* If not provided, the search will be scoped to HEAD.

0 commit comments

Comments
 (0)