@@ -30,6 +30,7 @@ import { OAuthRequestAccessClientTool } from '@/lib/copilot/tools/client/other/o
3030import { PlanClientTool } from '@/lib/copilot/tools/client/other/plan'
3131import { SearchDocumentationClientTool } from '@/lib/copilot/tools/client/other/search-documentation'
3232import { SearchOnlineClientTool } from '@/lib/copilot/tools/client/other/search-online'
33+ import { SearchPatternsClientTool } from '@/lib/copilot/tools/client/other/search-patterns'
3334import { createExecutionContext , getTool } from '@/lib/copilot/tools/client/registry'
3435import { GetEnvironmentVariablesClientTool } from '@/lib/copilot/tools/client/user/get-environment-variables'
3536import { GetOAuthCredentialsClientTool } from '@/lib/copilot/tools/client/user/get-oauth-credentials'
@@ -73,6 +74,7 @@ const CLIENT_TOOL_INSTANTIATORS: Record<string, (id: string) => any> = {
7374 get_trigger_blocks : ( id ) => new GetTriggerBlocksClientTool ( id ) ,
7475 search_online : ( id ) => new SearchOnlineClientTool ( id ) ,
7576 search_documentation : ( id ) => new SearchDocumentationClientTool ( id ) ,
77+ search_patterns : ( id ) => new SearchPatternsClientTool ( id ) ,
7678 get_environment_variables : ( id ) => new GetEnvironmentVariablesClientTool ( id ) ,
7779 set_environment_variables : ( id ) => new SetEnvironmentVariablesClientTool ( id ) ,
7880 list_gdrive_files : ( id ) => new ListGDriveFilesClientTool ( id ) ,
@@ -105,6 +107,7 @@ export const CLASS_TOOL_METADATA: Record<string, BaseClientToolMetadata | undefi
105107 get_trigger_blocks : ( GetTriggerBlocksClientTool as any ) ?. metadata ,
106108 search_online : ( SearchOnlineClientTool as any ) ?. metadata ,
107109 search_documentation : ( SearchDocumentationClientTool as any ) ?. metadata ,
110+ search_patterns : ( SearchPatternsClientTool as any ) ?. metadata ,
108111 get_environment_variables : ( GetEnvironmentVariablesClientTool as any ) ?. metadata ,
109112 set_environment_variables : ( SetEnvironmentVariablesClientTool as any ) ?. metadata ,
110113 list_gdrive_files : ( ListGDriveFilesClientTool as any ) ?. metadata ,
@@ -159,7 +162,30 @@ function resolveToolDisplay(
159162 const meta = def ?. metadata ?. displayNames || CLASS_TOOL_METADATA [ toolName ] ?. displayNames || { }
160163 // Exact state first
161164 const ds = meta ?. [ state ]
162- if ( ds ?. text || ds ?. icon ) return { text : ds . text , icon : ds . icon }
165+ if ( ds ?. text || ds ?. icon ) {
166+ // Special handling for search_patterns to show the first query
167+ if ( toolName === 'search_patterns' && params ?. queries && Array . isArray ( params . queries ) ) {
168+ const firstQuery = params . queries [ 0 ]
169+ if ( firstQuery && typeof firstQuery === 'string' ) {
170+ const truncatedQuery = firstQuery . length > 50 ? `${ firstQuery . slice ( 0 , 50 ) } ...` : firstQuery
171+ const capitalizedQuery = truncatedQuery . charAt ( 0 ) . toUpperCase ( ) + truncatedQuery . slice ( 1 )
172+ let dynamicText = ds . text
173+ if ( state === ClientToolCallState . success ) {
174+ dynamicText = `Searched ${ capitalizedQuery } `
175+ } else if ( state === ClientToolCallState . executing || state === ClientToolCallState . generating || state === ClientToolCallState . pending ) {
176+ dynamicText = `Searching ${ capitalizedQuery } `
177+ } else if ( state === ClientToolCallState . error ) {
178+ dynamicText = `Failed to search ${ capitalizedQuery } `
179+ } else if ( state === ClientToolCallState . aborted ) {
180+ dynamicText = `Aborted searching ${ capitalizedQuery } `
181+ } else if ( state === ClientToolCallState . rejected ) {
182+ dynamicText = `Skipped searching ${ capitalizedQuery } `
183+ }
184+ return { text : dynamicText , icon : ds . icon }
185+ }
186+ }
187+ return { text : ds . text , icon : ds . icon }
188+ }
163189 // Fallback order (prefer pre-execution states for unknown states like pending)
164190 const fallbackOrder : ClientToolCallState [ ] = [
165191 ( ClientToolCallState as any ) . generating ,
0 commit comments