@@ -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 ;
@@ -690,3 +690,102 @@ suite('Inline Summarization Prompt', () => {
690690 expect ( inlineMeta ) . toBeDefined ( ) ;
691691 } ) ;
692692} ) ;
693+
694+ suite ( 'stripToolSearchMessages' , ( ) => {
695+ function makeAssistantMessage ( toolCalls : { id : string ; name : string } [ ] , text = 'response' ) : Raw . ChatMessage {
696+ return {
697+ role : Raw . ChatRole . Assistant ,
698+ content : [ { type : Raw . ChatCompletionContentPartKind . Text , text } ] ,
699+ toolCalls : toolCalls . map ( tc => ( {
700+ type : 'function' as const ,
701+ id : tc . id ,
702+ function : { name : tc . name , arguments : '{}' } ,
703+ } ) ) ,
704+ } ;
705+ }
706+
707+ function makeToolResult ( toolCallId : string , text = 'result' ) : Raw . ChatMessage {
708+ return {
709+ role : Raw . ChatRole . Tool ,
710+ content : [ { type : Raw . ChatCompletionContentPartKind . Text , text } ] ,
711+ toolCallId,
712+ } ;
713+ }
714+
715+ function makeUserMessage ( text = 'hello' ) : Raw . ChatMessage {
716+ return {
717+ role : Raw . ChatRole . User ,
718+ content : [ { type : Raw . ChatCompletionContentPartKind . Text , text } ] ,
719+ } ;
720+ }
721+
722+ test ( 'returns messages unchanged when no tool_search calls present' , ( ) => {
723+ const messages = [
724+ makeUserMessage ( ) ,
725+ makeAssistantMessage ( [ { id : 'tc1' , name : 'read_file' } ] ) ,
726+ makeToolResult ( 'tc1' ) ,
727+ ] ;
728+ const result = stripToolSearchMessages ( messages ) ;
729+ expect ( result ) . toBe ( messages ) ;
730+ } ) ;
731+
732+ test ( 'strips custom tool_search tool_use and tool_result' , ( ) => {
733+ const messages = [
734+ makeUserMessage ( ) ,
735+ makeAssistantMessage ( [
736+ { id : 'tc1' , name : 'read_file' } ,
737+ { id : 'tc2' , name : 'tool_search' } ,
738+ ] ) ,
739+ makeToolResult ( 'tc1' ) ,
740+ makeToolResult ( 'tc2' , '["read_file", "edit_file"]' ) ,
741+ ] ;
742+ const result = stripToolSearchMessages ( messages ) ;
743+ expect ( result ) . toHaveLength ( 3 ) ;
744+ const assistant = result [ 1 ] ;
745+ expect ( assistant . role ) . toBe ( Raw . ChatRole . Assistant ) ;
746+ if ( assistant . role === Raw . ChatRole . Assistant ) {
747+ expect ( assistant . toolCalls ) . toHaveLength ( 1 ) ;
748+ expect ( assistant . toolCalls ! [ 0 ] . id ) . toBe ( 'tc1' ) ;
749+ }
750+ expect ( result . find ( m => m . role === Raw . ChatRole . Tool && m . toolCallId === 'tc2' ) ) . toBeUndefined ( ) ;
751+ } ) ;
752+
753+ test ( 'removes toolCalls property when all tool calls are tool_search' , ( ) => {
754+ const messages = [
755+ makeUserMessage ( ) ,
756+ makeAssistantMessage ( [ { id : 'tc1' , name : 'tool_search' } ] ) ,
757+ makeToolResult ( 'tc1' ) ,
758+ ] ;
759+ const result = stripToolSearchMessages ( messages ) ;
760+ expect ( result ) . toHaveLength ( 2 ) ;
761+ const assistant = result [ 1 ] ;
762+ if ( assistant . role === Raw . ChatRole . Assistant ) {
763+ expect ( assistant . toolCalls ) . toBeUndefined ( ) ;
764+ }
765+ } ) ;
766+
767+ test ( 'does not strip server-side tool_search_tool_regex' , ( ) => {
768+ const messages = [
769+ makeUserMessage ( ) ,
770+ makeAssistantMessage ( [ { id : 'tc1' , name : 'tool_search_tool_regex' } ] ) ,
771+ makeToolResult ( 'tc1' ) ,
772+ ] ;
773+ const result = stripToolSearchMessages ( messages ) ;
774+ expect ( result ) . toBe ( messages ) ;
775+ } ) ;
776+
777+ test ( 'preserves non-tool messages' , ( ) => {
778+ const messages = [
779+ makeUserMessage ( 'first' ) ,
780+ makeAssistantMessage ( [ { id : 'tc1' , name : 'tool_search' } ] ) ,
781+ makeToolResult ( 'tc1' ) ,
782+ makeUserMessage ( 'second' ) ,
783+ makeAssistantMessage ( [ { id : 'tc2' , name : 'edit_file' } ] ) ,
784+ makeToolResult ( 'tc2' ) ,
785+ ] ;
786+ const result = stripToolSearchMessages ( messages ) ;
787+ expect ( result ) . toHaveLength ( 5 ) ;
788+ expect ( result [ 0 ] . content [ 0 ] ) . toEqual ( { type : Raw . ChatCompletionContentPartKind . Text , text : 'first' } ) ;
789+ expect ( result [ 2 ] . content [ 0 ] ) . toEqual ( { type : Raw . ChatCompletionContentPartKind . Text , text : 'second' } ) ;
790+ } ) ;
791+ } ) ;
0 commit comments