@@ -228,8 +228,23 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
228 if err == nil {
228 if err == nil {
229 model := a.app.CoderAgent.Model()
229 model := a.app.CoderAgent.Model()
230 contextWindow := model.ContextWindow
230 contextWindow := model.ContextWindow
231− tokens := session.CompletionTokens + session.PromptTokens
231+ usedTokens := session.CompletionTokens + session.PromptTokens
232+ remainingTokens := contextWindow - usedTokens
234+ // Get effective max tokens for this agent (considering overrides)
235+ maxTokens := a.app.CoderAgent.EffectiveMaxTokens()
237+ // Apply 10% margin to max tokens
238+ maxTokensWithMargin := int64(float64(maxTokens) * 1.1)
240+ // Trigger auto-summarize if remaining tokens < max tokens + 10% margin
241+ // Also ensure we have a reasonable minimum threshold to avoid too-frequent summaries
242+ minThreshold := int64(1000) // Minimum 1000 tokens remaining before triggering
243+ if maxTokensWithMargin < minThreshold {
244+ maxTokensWithMargin = minThreshold
232− if (tokens >= int64(float64(contextWindow)*0.95)) && !config.Get().Options.DisableAutoSummarize {
247+ if remainingTokens < maxTokensWithMargin && !config.Get().Options.DisableAutoSummarize {
233 // Show compact confirmation dialog
248 // Show compact confirmation dialog
234 cmds = append(cmds, util.CmdHandler(dialogs.OpenDialogMsg{
249 cmds = append(cmds, util.CmdHandler(dialogs.OpenDialogMsg{
235 Model: compact.NewCompactDialogCmp(a.app.CoderAgent, a.selectedSessionID, false),
250 Model: compact.NewCompactDialogCmp(a.app.CoderAgent, a.selectedSessionID, false),