11import { publisher } from './constants'
22
3- import type {
4- AgentDefinition ,
5- Message ,
6- ToolCall ,
7- } from './types/agent-definition'
3+ import type { AgentDefinition , ToolCall } from './types/agent-definition'
4+ import type { Message , ToolMessage } from './types/codebuff-message'
5+ import type { CodebuffToolMessage } from '@codebuff/common/tools/list'
86
97const definition : AgentDefinition = {
108 id : 'context-pruner' ,
@@ -43,31 +41,13 @@ const definition: AgentDefinition = {
4341
4442 let currentMessages = [ ...messages ]
4543
46- // Find and remove context-pruner spawn_agent_inline call and following messages
47- const lastAssistantMessageIndex = currentMessages . findLastIndex (
48- ( message ) => message . role === 'assistant' ,
49- )
50- const lastAssistantMessage = currentMessages [ lastAssistantMessageIndex ]
51- const lastAssistantMessageIsToolCall =
52- typeof lastAssistantMessage ?. content === 'string' &&
53- lastAssistantMessage . content . includes ( 'spawn_agent_inline' ) &&
54- lastAssistantMessage . content . includes ( 'context-pruner' )
55-
56- if ( lastAssistantMessageIsToolCall && lastAssistantMessageIndex >= 0 ) {
57- // Remove tool call and any following messages.
58- const messagesToRemove =
59- currentMessages . length - lastAssistantMessageIndex
60- currentMessages . splice ( lastAssistantMessageIndex , messagesToRemove )
61- }
62-
63- // Initial check - if already under limit, return (with inline agent tool call removed)
44+ // Initial check - if already under limit, return
6445 const initialTokens = countTokensJson ( currentMessages )
6546 if ( initialTokens < maxMessageTokens ) {
6647 yield {
6748 toolName : 'set_messages' ,
68- input : {
69- messages : currentMessages ,
70- } ,
49+ input : { messages : currentMessages } ,
50+ includeToolCall : false ,
7151 }
7252 return
7353 }
@@ -78,25 +58,41 @@ const definition: AgentDefinition = {
7858
7959 for ( let i = currentMessages . length - 1 ; i >= 0 ; i -- ) {
8060 const message = currentMessages [ i ]
81- let processedContent =
82- typeof message . content === 'string'
83- ? message . content
84- : JSON . stringify ( message . content )
8561
86- if ( processedContent . includes ( '<tool>run_terminal_command</tool>' ) ) {
62+ // Handle tool messages with new object format
63+ if (
64+ message . role === 'tool' &&
65+ message . content . toolName === 'run_terminal_command'
66+ ) {
67+ const toolMessage =
68+ message as CodebuffToolMessage < 'run_terminal_command' >
69+
8770 if ( numKeptTerminalCommands < numTerminalCommandsToKeep ) {
8871 numKeptTerminalCommands ++
89- afterTerminalPass . unshift ( { ... message , content : processedContent } )
72+ afterTerminalPass . unshift ( message )
9073 } else {
91- // Simplify terminal command result
92- processedContent = processedContent . replace (
93- / < t o o l _ r e s u l t > \s * < t o o l > r u n _ t e r m i n a l _ c o m m a n d < \/ t o o l > \s * < r e s u l t > [ \s \S ] * ?< \/ r e s u l t > \s * < \/ t o o l _ r e s u l t > / g,
94- '<tool_result><tool>run_terminal_command</tool><result>[Output omitted]</result></tool_result>' ,
95- )
96- afterTerminalPass . unshift ( { ...message , content : processedContent } )
74+ // Simplify terminal command result by replacing output
75+ const simplifiedMessage : CodebuffToolMessage < 'run_terminal_command' > =
76+ {
77+ ...toolMessage ,
78+ content : {
79+ ...toolMessage . content ,
80+ output : [
81+ {
82+ type : 'json' ,
83+ value : {
84+ command :
85+ toolMessage . content . output [ 0 ] ?. value ?. command || '' ,
86+ stdoutOmittedForLength : true ,
87+ } ,
88+ } ,
89+ ] ,
90+ } ,
91+ }
92+ afterTerminalPass . unshift ( simplifiedMessage )
9793 }
9894 } else {
99- afterTerminalPass . unshift ( { ... message , content : processedContent } )
95+ afterTerminalPass . unshift ( message )
10096 }
10197 }
10298
@@ -108,28 +104,37 @@ const definition: AgentDefinition = {
108104 input : {
109105 messages : afterTerminalPass ,
110106 } ,
107+ includeToolCall : false ,
111108 }
112109 return
113110 }
114111
115- // PASS 2: Remove large tool results (any tool result > 1000 chars)
112+ // PASS 2: Remove large tool results (any tool result output > 1000 chars when stringified )
116113 const afterToolResultsPass = afterTerminalPass . map ( ( message ) => {
117- let processedContent =
118- typeof message . content === 'string'
119- ? message . content
120- : JSON . stringify ( message . content )
121-
122- if (
123- processedContent . includes ( '<tool_result>' ) &&
124- processedContent . length > 1000
125- ) {
126- processedContent = processedContent . replace (
127- / < r e s u l t > [ \s \S ] * ?< \/ r e s u l t > / g,
128- '<result>[Large tool result omitted]</result>' ,
129- )
114+ if ( message . role === 'tool' ) {
115+ const outputSize = JSON . stringify ( message . content . output ) . length
116+
117+ if ( outputSize > 1000 ) {
118+ // Replace with simplified output
119+ const simplifiedMessage : ToolMessage = {
120+ ...message ,
121+ content : {
122+ ...message . content ,
123+ output : [
124+ {
125+ type : 'json' ,
126+ value : {
127+ message : '[LARGE_TOOL_RESULT_OMITTED]' ,
128+ originalSize : outputSize ,
129+ } ,
130+ } ,
131+ ] ,
132+ } ,
133+ }
134+ return simplifiedMessage
135+ }
130136 }
131-
132- return { ...message , content : processedContent }
137+ return message
133138 } )
134139
135140 // Check if tool results pass was enough
@@ -140,7 +145,8 @@ const definition: AgentDefinition = {
140145 input : {
141146 messages : afterToolResultsPass ,
142147 } ,
143- } satisfies ToolCall
148+ includeToolCall : false ,
149+ } satisfies ToolCall < 'set_messages' >
144150 return
145151 }
146152
@@ -162,10 +168,7 @@ const definition: AgentDefinition = {
162168 const filteredMessages : any [ ] = [ ]
163169
164170 for ( const message of afterToolResultsPass ) {
165- if (
166- removedTokens >= tokensToRemove ||
167- ( message as any ) . keepDuringTruncation
168- ) {
171+ if ( removedTokens >= tokensToRemove || message . keepDuringTruncation ) {
169172 filteredMessages . push ( message )
170173 continue
171174 }
@@ -190,7 +193,8 @@ const definition: AgentDefinition = {
190193 input : {
191194 messages : finalMessages ,
192195 } ,
193- } satisfies ToolCall
196+ includeToolCall : false ,
197+ } satisfies ToolCall < 'set_messages' >
194198 } ,
195199}
196200
0 commit comments