@@ -30,7 +30,7 @@ import { ToolName } from '../../../../tools/common/toolNames';
3030import { PromptRenderer } from '../../base/promptRenderer' ;
3131import { AgentPrompt , AgentPromptProps } from '../agentPrompt' ;
3232import { PromptRegistry } from '../promptRegistry' ;
33- import { ConversationHistorySummarizationPrompt , extractInlineSummary , InlineSummarizationRequestedMetadata , SummarizedConversationHistory , SummarizedConversationHistoryMetadata , SummarizedConversationHistoryPropsBuilder } from '../summarizedConversationHistory' ;
33+ import { ConversationHistorySummarizationPrompt , extractInlineSummary , InlineSummarizationRequestedMetadata , stripToolSearchMessages , SummarizedConversationHistory , SummarizedConversationHistoryMetadata , SummarizedConversationHistoryPropsBuilder } from '../summarizedConversationHistory' ;
3434
3535suite ( 'Agent Summarization' , ( ) => {
3636 let accessor : ITestingServicesAccessor ;
@@ -737,3 +737,102 @@ suite('Inline Summarization Prompt', () => {
737737 expect ( inlineMeta ) . toBeDefined ( ) ;
738738 } ) ;
739739} ) ;
740+
741+ suite ( 'stripToolSearchMessages' , ( ) => {
742+ function makeAssistantMessage ( toolCalls : { id : string ; name : string } [ ] , text = 'response' ) : Raw . ChatMessage {
743+ return {
744+ role : Raw . ChatRole . Assistant ,
745+ content : [ { type : Raw . ChatCompletionContentPartKind . Text , text } ] ,
746+ toolCalls : toolCalls . map ( tc => ( {
747+ type : 'function' as const ,
748+ id : tc . id ,
749+ function : { name : tc . name , arguments : '{}' } ,
750+ } ) ) ,
751+ } ;
752+ }
753+
754+ function makeToolResult ( toolCallId : string , text = 'result' ) : Raw . ChatMessage {
755+ return {
756+ role : Raw . ChatRole . Tool ,
757+ content : [ { type : Raw . ChatCompletionContentPartKind . Text , text } ] ,
758+ toolCallId,
759+ } ;
760+ }
761+
762+ function makeUserMessage ( text = 'hello' ) : Raw . ChatMessage {
763+ return {
764+ role : Raw . ChatRole . User ,
765+ content : [ { type : Raw . ChatCompletionContentPartKind . Text , text } ] ,
766+ } ;
767+ }
768+
769+ test ( 'returns messages unchanged when no tool_search calls present' , ( ) => {
770+ const messages = [
771+ makeUserMessage ( ) ,
772+ makeAssistantMessage ( [ { id : 'tc1' , name : 'read_file' } ] ) ,
773+ makeToolResult ( 'tc1' ) ,
774+ ] ;
775+ const result = stripToolSearchMessages ( messages ) ;
776+ expect ( result ) . toBe ( messages ) ;
777+ } ) ;
778+
779+ test ( 'strips custom tool_search tool_use and tool_result' , ( ) => {
780+ const messages = [
781+ makeUserMessage ( ) ,
782+ makeAssistantMessage ( [
783+ { id : 'tc1' , name : 'read_file' } ,
784+ { id : 'tc2' , name : 'tool_search' } ,
785+ ] ) ,
786+ makeToolResult ( 'tc1' ) ,
787+ makeToolResult ( 'tc2' , '["read_file", "edit_file"]' ) ,
788+ ] ;
789+ const result = stripToolSearchMessages ( messages ) ;
790+ expect ( result ) . toHaveLength ( 3 ) ;
791+ const assistant = result [ 1 ] ;
792+ expect ( assistant . role ) . toBe ( Raw . ChatRole . Assistant ) ;
793+ if ( assistant . role === Raw . ChatRole . Assistant ) {
794+ expect ( assistant . toolCalls ) . toHaveLength ( 1 ) ;
795+ expect ( assistant . toolCalls ! [ 0 ] . id ) . toBe ( 'tc1' ) ;
796+ }
797+ expect ( result . find ( m => m . role === Raw . ChatRole . Tool && m . toolCallId === 'tc2' ) ) . toBeUndefined ( ) ;
798+ } ) ;
799+
800+ test ( 'removes toolCalls property when all tool calls are tool_search' , ( ) => {
801+ const messages = [
802+ makeUserMessage ( ) ,
803+ makeAssistantMessage ( [ { id : 'tc1' , name : 'tool_search' } ] ) ,
804+ makeToolResult ( 'tc1' ) ,
805+ ] ;
806+ const result = stripToolSearchMessages ( messages ) ;
807+ expect ( result ) . toHaveLength ( 2 ) ;
808+ const assistant = result [ 1 ] ;
809+ if ( assistant . role === Raw . ChatRole . Assistant ) {
810+ expect ( assistant . toolCalls ) . toBeUndefined ( ) ;
811+ }
812+ } ) ;
813+
814+ test ( 'does not strip server-side tool_search_tool_regex' , ( ) => {
815+ const messages = [
816+ makeUserMessage ( ) ,
817+ makeAssistantMessage ( [ { id : 'tc1' , name : 'tool_search_tool_regex' } ] ) ,
818+ makeToolResult ( 'tc1' ) ,
819+ ] ;
820+ const result = stripToolSearchMessages ( messages ) ;
821+ expect ( result ) . toBe ( messages ) ;
822+ } ) ;
823+
824+ test ( 'preserves non-tool messages' , ( ) => {
825+ const messages = [
826+ makeUserMessage ( 'first' ) ,
827+ makeAssistantMessage ( [ { id : 'tc1' , name : 'tool_search' } ] ) ,
828+ makeToolResult ( 'tc1' ) ,
829+ makeUserMessage ( 'second' ) ,
830+ makeAssistantMessage ( [ { id : 'tc2' , name : 'edit_file' } ] ) ,
831+ makeToolResult ( 'tc2' ) ,
832+ ] ;
833+ const result = stripToolSearchMessages ( messages ) ;
834+ expect ( result ) . toHaveLength ( 5 ) ;
835+ expect ( result [ 0 ] . content [ 0 ] ) . toEqual ( { type : Raw . ChatCompletionContentPartKind . Text , text : 'first' } ) ;
836+ expect ( result [ 2 ] . content [ 0 ] ) . toEqual ( { type : Raw . ChatCompletionContentPartKind . Text , text : 'second' } ) ;
837+ } ) ;
838+ } ) ;
0 commit comments