Skip to content

Commit 9a3ea1c

Browse files
list repos tool
1 parent 7044321 commit 9a3ea1c

File tree

2 files changed

+16
-53
lines changed

2 files changed

+16
-53
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,9 +249,12 @@ export const StepPartRenderer = ({ part }: { part: SBChatMessagePart }) => {
249249
)
250250
case 'tool-list_repos':
251251
return (
252-
<ListReposToolComponent
252+
<ToolLoadingGuard
253253
part={part}
254-
/>
254+
loadingText="Listing repositories..."
255+
>
256+
{(output) => <ListReposToolComponent {...output} />}
257+
</ToolLoadingGuard>
255258
)
256259
case 'tool-list_commits':
257260
return (
Lines changed: 11 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,18 @@
11
'use client';
22

3-
import { ListReposToolUIPart } from "@/features/chat/tools";
4-
import { useMemo, useState } from "react";
5-
import { ToolHeader, TreeList } from "./shared";
3+
import { ListReposMetadata, ToolResult } from "@/features/tools";
64
import { Separator } from "@/components/ui/separator";
7-
import { FolderOpenIcon } from "lucide-react";
85

9-
export const ListReposToolComponent = ({ part }: { part: ListReposToolUIPart }) => {
10-
const [isExpanded, setIsExpanded] = useState(false);
11-
12-
const label = useMemo(() => {
13-
switch (part.state) {
14-
case 'input-streaming':
15-
return 'Listing repositories...';
16-
case 'output-error':
17-
return '"List repositories" tool call failed';
18-
case 'input-available':
19-
case 'output-available':
20-
return 'Listed repositories';
21-
}
22-
}, [part]);
6+
export const ListReposToolComponent = ({ metadata }: ToolResult<ListReposMetadata>) => {
7+
const count = metadata.repos.length;
8+
const label = `${count}${metadata.totalCount > count ? ` of ${metadata.totalCount}` : ''} ${count === 1 ? 'repo' : 'repos'}`;
239

2410
return (
25-
<div>
26-
<ToolHeader
27-
isLoading={part.state !== 'output-available' && part.state !== 'output-error'}
28-
isError={part.state === 'output-error'}
29-
isExpanded={isExpanded}
30-
label={label}
31-
Icon={FolderOpenIcon}
32-
onExpand={setIsExpanded}
33-
input={part.state !== 'input-streaming' ? JSON.stringify(part.input) : undefined}
34-
output={part.state === 'output-available' ? part.output.output : undefined}
35-
/>
36-
{part.state === 'output-available' && isExpanded && (
37-
<>
38-
{part.output.metadata.repos.length === 0 ? (
39-
<span className="text-sm text-muted-foreground ml-[25px]">No repositories found</span>
40-
) : (
41-
<TreeList>
42-
<div className="text-sm text-muted-foreground mb-2">
43-
Found {part.output.metadata.repos.length} of {part.output.metadata.totalCount} repositories:
44-
</div>
45-
{part.output.metadata.repos.map((repo, index) => (
46-
<div key={index} className="flex items-center gap-2 text-sm">
47-
<FolderOpenIcon className="h-4 w-4 text-muted-foreground" />
48-
<span className="truncate">{repo.name}</span>
49-
</div>
50-
))}
51-
</TreeList>
52-
)}
53-
<Separator className='ml-[7px] my-2' />
54-
</>
55-
)}
11+
<div className="flex items-center gap-2 select-none cursor-default text-sm text-muted-foreground">
12+
<span className="flex-shrink-0">Listed repositories</span>
13+
<span className="flex-1" />
14+
<span className="text-xs flex-shrink-0">{label}</span>
15+
<Separator orientation="vertical" className="h-3 flex-shrink-0" />
5616
</div>
57-
)
58-
}
17+
);
18+
};

0 commit comments

Comments
 (0)