package acp import ( "sync" "time" ) // Message is one entry in the conversation history. type Message struct { Role string `json:"role"` Text string `json:"text"` Time time.Time `json:"time"` } // History accumulates prompt/response messages in memory for a session. type History struct { mu sync.RWMutex messages []Message } // NewHistory creates an empty History. func NewHistory() *History { return &History{} } // Add appends a message with the current time. func (h *History) Add(role, text string) { h.mu.Lock() defer h.mu.Unlock() h.messages = append(h.messages, Message{Role: role, Text: text, Time: time.Now()}) } // List returns a copy of all messages, oldest first. func (h *History) List() []Message { h.mu.RLock() defer h.mu.RUnlock() out := make([]Message, len(h.messages)) copy(out, h.messages) return out } // Len returns the number of stored messages. func (h *History) Len() int { h.mu.RLock() defer h.mu.RUnlock() return len(h.messages) } // Since returns messages starting at index idx. func (h *History) Since(idx int) []Message { h.mu.RLock() defer h.mu.RUnlock() if idx < 0 { idx = 0 } if idx > len(h.messages) { idx = len(h.messages) } out := make([]Message, len(h.messages)-idx) copy(out, h.messages[idx:]) return out } // Clear removes all stored messages. func (h *History) Clear() { h.mu.Lock() defer h.mu.Unlock() h.messages = h.messages[:0] }