package memory import "github.com/enmanuel/agents/pkg/llm" // Window is an immutable sliding window of conversation messages for a single room. type Window struct { messages []llm.Message maxSize int } // NewWindow creates an empty window with the given capacity. func NewWindow(maxSize int) Window { return Window{maxSize: maxSize} } // Append returns a new Window with the message added, dropping the oldest // messages if capacity is exceeded. func (w Window) Append(msg llm.Message) Window { msgs := make([]llm.Message, len(w.messages), len(w.messages)+1) copy(msgs, w.messages) msgs = append(msgs, msg) if len(msgs) > w.maxSize { msgs = msgs[len(msgs)-w.maxSize:] } return Window{messages: msgs, maxSize: w.maxSize} } // ToLLMMessages returns a copy of the window contents as []llm.Message. func (w Window) ToLLMMessages() []llm.Message { out := make([]llm.Message, len(w.messages)) copy(out, w.messages) return out } // Len returns the number of messages in the window. func (w Window) Len() int { return len(w.messages) } // Clear returns an empty window with the same capacity. func (w Window) Clear() Window { return NewWindow(w.maxSize) }