@@ -167,31 +167,25 @@ export const injectCompressNudges = (
167167
168168 const contextPct = modelContextLimit && currentTokens ? ( currentTokens / modelContextLimit ) * 100 : 0
169169 const minPercent = config . compress ?. minNudgeContextPercent ?? 15
170+ const growthTokens = config . compress ?. nudgeGrowthTokens ?? 6000
171+ const lastNudgeTokens = state . nudges . lastPerMessageNudgeTokens ?? 0
172+ const growthSinceLastNudge = ( currentTokens ?? 0 ) - lastNudgeTokens
173+ const shouldNudge = lastNudgeTokens === 0 || growthSinceLastNudge >= growthTokens
170174
171175 injectContextUsage ( suffixMessage , config , currentTokens , modelContextLimit )
172176
173- // Determine tips tier: light (every turn) vs warning (key nodes only)
174177 let tipsText : string | null = null
175178
176- if ( overMaxLimit || overMinLimit ) {
177- // Warning zone: show at key nodes only (first crossing or 10pp growth)
178- const lastWarnPct = state . nudges . lastPerMessageNudgeTokens && modelContextLimit
179- ? ( state . nudges . lastPerMessageNudgeTokens / modelContextLimit ) * 100
180- : 0
181- const growthSinceWarn = contextPct - lastWarnPct
182- if ( lastWarnPct === 0 || growthSinceWarn >= 10 ) {
183- tipsText = overMaxLimit
184- ? "\n\n⚠️ Context limit reached — compress now. Prioritize consumed tool outputs.\n\n{ \"topic\": \"...\", \"content\": [{ \"startId\": \"<ID>\", \"endId\": \"<ID>\", \"summary\": \"...\" }] }\n\nOnly use IDs from visible messages above. Compress older work first."
185- : "\n\n⚠️ Context is growing — consider compressing older work. Tools: compress, decompress, search_context."
186- state . nudges . lastPerMessageNudgeTokens = currentTokens ?? 0
187- state . nudges . lastPerMessageNudgeTurn = state . currentTurn ?? 0
188- }
189- } else if ( contextPct >= minPercent ) {
190- tipsText = "\n\n💡 Tools: compress, decompress, search_context."
191- // Reset warning tracking when context drops below warning zone
192- if ( state . nudges . lastPerMessageNudgeTokens ) {
193- state . nudges . lastPerMessageNudgeTokens = 0
179+ if ( contextPct >= minPercent && shouldNudge ) {
180+ if ( overMaxLimit ) {
181+ tipsText = "\n\n⚠️ Context limit reached — compress now. Prioritize consumed tool outputs.\n\n{ \"topic\": \"...\", \"content\": [{ \"startId\": \"<ID>\", \"endId\": \"<ID>\", \"summary\": \"...\" }] }\n\nOnly use IDs from visible messages above. Compress older work first."
182+ } else if ( overMinLimit ) {
183+ tipsText = "\n\n⚠️ Context is growing — consider compressing older work. Tools: compress, decompress, search_context."
184+ } else {
185+ tipsText = "\n\n💡 Tools: compress, decompress, search_context."
194186 }
187+ state . nudges . lastPerMessageNudgeTokens = currentTokens ?? 0
188+ state . nudges . lastPerMessageNudgeTurn = state . currentTurn ?? 0
195189 }
196190
197191 if ( config . compress . mode !== "message" ) {
0 commit comments