define maximum number of messages to keep in context

Raphael Amorim created

Change summary

internal/config/config.go   | 1 +
internal/config/load.go     | 3 +++
internal/llm/agent/agent.go | 7 +++++++
3 files changed, 11 insertions(+)

Detailed changes

internal/config/config.go 🔗

@@ -140,6 +140,7 @@ type Options struct {
 	DebugLSP             bool        `json:"debug_lsp,omitempty" jsonschema:"description=Enable debug logging for LSP servers,default=false"`
 	DisableAutoSummarize bool        `json:"disable_auto_summarize,omitempty" jsonschema:"description=Disable automatic conversation summarization,default=false"`
 	DataDirectory        string      `json:"data_directory,omitempty" jsonschema:"description=Directory for storing application data (relative to working directory),default=.crush,example=.crush"` // Relative to the cwd
+	MaxMessagesInContext int         `json:"max_messages_in_context,omitempty" jsonschema:"description=Maximum number of messages to keep in context (sliding window),default=50,minimum=10,maximum=200"`
 }
 
 type MCPs map[string]MCPConfig

internal/config/load.go 🔗

@@ -282,6 +282,9 @@ func (c *Config) setDefaults(workingDir string) {
 	if c.Options.DataDirectory == "" {
 		c.Options.DataDirectory = filepath.Join(workingDir, defaultDataDirectory)
 	}
+	if c.Options.MaxMessagesInContext == 0 {
+		c.Options.MaxMessagesInContext = 50 // Default sliding window size
+	}
 	if c.Providers == nil {
 		c.Providers = csync.NewMap[string, ProviderConfig]()
 	}

internal/llm/agent/agent.go 🔗

@@ -362,6 +362,13 @@ func (a *agent) processGeneration(ctx context.Context, sessionID, content string
 	if err != nil {
 		return a.err(fmt.Errorf("failed to list messages: %w", err))
 	}
+	
+	// Implement sliding window to limit message history
+	maxMessages := cfg.Options.MaxMessagesInContext
+	if maxMessages > 0 && len(msgs) > maxMessages {
+		// Keep the first message (usually system/context) and the last N-1 messages
+		msgs = append(msgs[:1], msgs[len(msgs)-maxMessages+1:]...)
+	}
 	if len(msgs) == 0 {
 		go func() {
 			defer log.RecoverPanic("agent.Run", func() {