@@ -10,6 +10,7 @@ import { AgentTool, Component, ToolConfig } from "@/types/datamodel";
10
10
import ProviderFilter from "./ProviderFilter" ;
11
11
import ToolItem from "./ToolItem" ;
12
12
import { findComponentForAgentTool } from "@/lib/toolUtils" ;
13
+ import { getToolDisplayName , getToolDescription , getToolIdentifier } from "@/lib/data" ;
13
14
14
15
// Maximum number of tools that can be selected
15
16
const MAX_TOOLS_LIMIT = 10 ;
@@ -37,7 +38,6 @@ export const SelectToolsDialog: React.FC<SelectToolsDialogProps> = ({ open, onOp
37
38
const [ searchTerm , setSearchTerm ] = useState ( "" ) ;
38
39
const [ activeTab , setActiveTab ] = useState ( "all" ) ;
39
40
const [ localSelectedComponents , setLocalSelectedComponents ] = useState < Component < ToolConfig > [ ] > ( [ ] ) ;
40
- const [ newlyDiscoveredTools , setNewlyDiscoveredTools ] = useState < Component < ToolConfig > [ ] > ( [ ] ) ;
41
41
const [ providers , setProviders ] = useState < Set < string > > ( new Set ( ) ) ;
42
42
const [ selectedProviders , setSelectedProviders ] = useState < Set < string > > ( new Set ( ) ) ;
43
43
const [ showFilters , setShowFilters ] = useState ( false ) ;
@@ -51,7 +51,6 @@ export const SelectToolsDialog: React.FC<SelectToolsDialogProps> = ({ open, onOp
51
51
. map ( ( agentTool ) => findComponentForAgentTool ( agentTool , availableTools ) )
52
52
. filter ( ( tool ) : tool is Component < ToolConfig > => tool !== undefined ) ;
53
53
54
- setNewlyDiscoveredTools ( [ ] ) ;
55
54
setLocalSelectedComponents ( initialComponents ) ;
56
55
setSearchTerm ( "" ) ;
57
56
@@ -82,37 +81,29 @@ export const SelectToolsDialog: React.FC<SelectToolsDialogProps> = ({ open, onOp
82
81
const searchLower = searchTerm . toLowerCase ( ) ;
83
82
84
83
return availableTools . filter ( ( tool ) => {
85
- // Search matching
86
- const matchesSearch = tool . provider . toLowerCase ( ) . includes ( searchLower ) || ( tool . description ?. toLowerCase ( ) . includes ( searchLower ) ?? false ) ;
84
+ // Search matching - use getToolDisplayName and getToolDescription
85
+ const toolName = getToolDisplayName ( tool ) . toLowerCase ( ) ;
86
+ const toolDescription = getToolDescription ( tool ) ?. toLowerCase ( ) ?? "" ;
87
+ const matchesSearch = toolName . includes ( searchLower ) || toolDescription . includes ( searchLower ) || tool . provider . toLowerCase ( ) . includes ( searchLower ) ;
87
88
88
89
// Tab matching
89
- const isSelected = localSelectedComponents . some ( ( t ) => t . provider === tool . provider ) ;
90
- const isNew = newlyDiscoveredTools . some ( ( t ) => t . provider === tool . provider ) ;
91
-
92
- const matchesTab = activeTab === "all" || ( activeTab === "selected" && isSelected ) || ( activeTab === "new" && isNew ) ;
90
+ const isSelected = localSelectedComponents . some ( ( t ) => getToolIdentifier ( t ) === getToolIdentifier ( tool ) ) ;
91
+ const matchesTab = activeTab === "all" || ( activeTab === "selected" && isSelected ) ;
93
92
94
93
// Provider matching
95
94
const matchesProvider = selectedProviders . size === 0 || selectedProviders . has ( tool . provider ) ;
96
95
97
96
return matchesSearch && matchesTab && matchesProvider ;
98
97
} ) ;
99
- } , [ availableTools , searchTerm , activeTab , localSelectedComponents , newlyDiscoveredTools , selectedProviders ] ) ;
98
+ } , [ availableTools , searchTerm , activeTab , localSelectedComponents , selectedProviders ] ) ;
100
99
101
100
// Group tools by category
102
101
const groupedTools = useMemo ( ( ) => {
103
102
const groups : { [ key : string ] : Component < ToolConfig > [ ] } = { } ;
104
103
105
104
// Sort tools first - new tools at the top within each category
106
105
const sortedTools = [ ...filteredTools ] . sort ( ( a , b ) => {
107
- const aIsNew = newlyDiscoveredTools . some ( ( t ) => t . provider === a . provider ) ;
108
- const bIsNew = newlyDiscoveredTools . some ( ( t ) => t . provider === b . provider ) ;
109
-
110
- // Primary sort: new tools first
111
- if ( aIsNew && ! bIsNew ) return - 1 ;
112
- if ( ! aIsNew && bIsNew ) return 1 ;
113
-
114
- // Secondary sort: alphabetical by name
115
- return ( a . provider || "" ) . localeCompare ( b . provider || "" ) ;
106
+ return getToolDisplayName ( a ) . localeCompare ( getToolDisplayName ( b ) ) ;
116
107
} ) ;
117
108
118
109
// Group by categories
@@ -125,13 +116,13 @@ export const SelectToolsDialog: React.FC<SelectToolsDialogProps> = ({ open, onOp
125
116
} ) ;
126
117
127
118
return groups ;
128
- } , [ filteredTools , newlyDiscoveredTools ] ) ;
119
+ } , [ filteredTools ] ) ;
129
120
130
121
// Check if selection limit is reached
131
122
const isLimitReached = localSelectedComponents . length >= MAX_TOOLS_LIMIT ;
132
123
133
124
// Helper functions for tool state
134
- const isToolSelected = ( tool : Component < ToolConfig > ) => localSelectedComponents . some ( ( t ) => t . provider === tool . provider ) ;
125
+ const isToolSelected = ( tool : Component < ToolConfig > ) => localSelectedComponents . some ( ( t ) => getToolIdentifier ( t ) === getToolIdentifier ( tool ) ) ;
135
126
136
127
// Event handlers
137
128
const handleToggleTool = ( tool : Component < ToolConfig > ) => {
@@ -142,7 +133,13 @@ export const SelectToolsDialog: React.FC<SelectToolsDialogProps> = ({ open, onOp
142
133
return ;
143
134
}
144
135
145
- setLocalSelectedComponents ( ( prev ) => ( isCurrentlySelected ? prev . filter ( ( t ) => t . provider !== tool . provider ) : [ ...prev , tool ] ) ) ;
136
+ setLocalSelectedComponents ( ( prev ) => {
137
+ if ( isCurrentlySelected ) {
138
+ return prev . filter ( ( t ) => getToolIdentifier ( t ) !== getToolIdentifier ( tool ) ) ;
139
+ } else {
140
+ return [ ...prev , tool ] ;
141
+ }
142
+ } ) ;
146
143
} ;
147
144
148
145
const handleSave = ( ) => {
@@ -188,22 +185,21 @@ export const SelectToolsDialog: React.FC<SelectToolsDialogProps> = ({ open, onOp
188
185
// Stats
189
186
const totalTools = availableTools . length ;
190
187
const selectedCount = localSelectedComponents . length ;
191
- const newToolsCount = newlyDiscoveredTools . length ;
192
188
193
189
return (
194
190
< Dialog
195
191
open = { open }
196
192
onOpenChange = { ( isOpen ) => {
197
193
// Auto-save if closing with newly discovered tools
198
- if ( ! isOpen && newToolsCount > 0 ) {
194
+ if ( ! isOpen ) {
199
195
onToolsSelected ( localSelectedComponents ) ;
200
196
}
201
197
onOpenChange ( isOpen ) ;
202
198
} }
203
199
>
204
200
< DialogContent className = "max-w-4xl max-h-[85vh] h-auto" >
205
201
< DialogHeader >
206
- < DialogTitle className = "text-xl" > { newToolsCount > 0 ? " Select Discovered Tools" : "Select Tools" } </ DialogTitle >
202
+ < DialogTitle className = "text-xl" > Select Tools</ DialogTitle >
207
203
</ DialogHeader >
208
204
209
205
{ /* Tool limit warning */ }
@@ -250,14 +246,6 @@ export const SelectToolsDialog: React.FC<SelectToolsDialogProps> = ({ open, onOp
250
246
{ selectedCount }
251
247
</ Badge >
252
248
</ TabsTrigger >
253
- { newToolsCount > 0 && (
254
- < TabsTrigger value = "new" >
255
- New
256
- < Badge variant = "outline" className = "ml-1 bg-background" >
257
- { newToolsCount }
258
- </ Badge >
259
- </ TabsTrigger >
260
- ) }
261
249
</ TabsList >
262
250
</ Tabs >
263
251
@@ -293,7 +281,15 @@ export const SelectToolsDialog: React.FC<SelectToolsDialogProps> = ({ open, onOp
293
281
{ expandedCategories [ category ] && (
294
282
< div className = "divide-y" >
295
283
{ tools . map ( ( tool ) => (
296
- < ToolItem key = { tool . provider } tool = { tool } isSelected = { isToolSelected ( tool ) } onToggle = { handleToggleTool } disabled = { ! isToolSelected ( tool ) && isLimitReached } />
284
+ < ToolItem
285
+ key = { getToolIdentifier ( tool ) }
286
+ tool = { tool }
287
+ isSelected = { isToolSelected ( tool ) }
288
+ onToggle = { handleToggleTool }
289
+ disabled = { ! isToolSelected ( tool ) && isLimitReached }
290
+ displayName = { getToolDisplayName ( tool ) }
291
+ description = { getToolDescription ( tool ) }
292
+ />
297
293
) ) }
298
294
</ div >
299
295
) }
@@ -319,13 +315,8 @@ export const SelectToolsDialog: React.FC<SelectToolsDialogProps> = ({ open, onOp
319
315
< span className = "text-muted-foreground" > (Maximum: { MAX_TOOLS_LIMIT } )</ span >
320
316
</ div >
321
317
< div className = "flex gap-2" >
322
- { newToolsCount === 0 && (
323
- < Button variant = "outline" onClick = { ( ) => onOpenChange ( false ) } >
324
- Cancel
325
- </ Button >
326
- ) }
327
318
< Button className = "bg-violet-500 hover:bg-violet-600 text-white" onClick = { handleSave } >
328
- { newToolsCount > 0 ? "Add Selected Tools" : " Save Selection" }
319
+ Save Selection
329
320
</ Button >
330
321
</ div >
331
322
</ div >
0 commit comments