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" ;
64import { 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