# Plan: Memoria para los bots ## Objetivo Que cada bot recuerde conversaciones anteriores, hechos importantes sobre usuarios y contexto de salas. Memoria a corto plazo (ventana de conversación) y largo plazo (SQLite persistente). ## Estado: completado ✓ --- ## Tipos de memoria ### 1. Memoria de conversación (corto plazo) - Ventana deslizante de `N` mensajes por room - Se pasa como historial al LLM en cada llamada - Vive en RAM; se pierde al reiniciar (aceptable) ### 2. Memoria episódica (largo plazo) - Hechos extraídos de conversaciones: nombre del usuario, preferencias, eventos - Guardados en SQLite (`agents//data/memory.db`) - El LLM puede leer y escribir hechos mediante herramientas (`remember`, `recall`) --- ## Diseño capa pura (`pkg/memory/`) ```go // Tipos puros — sin I/O type Message struct { Role string // "user" | "assistant" Content string At time.Time } type Fact struct { Subject string Key string Value string At time.Time } // Ventana de conversación type Window struct { RoomID string Messages []Message MaxSize int } func (w Window) Append(m Message) Window { ... } // pura func (w Window) ToLLMMessages() []llm.Message { ... } // pura ``` ## Diseño capa shell (`shell/memory/`) ```go // Acceso a SQLite — impuro type Store interface { SaveFact(ctx, agentID, fact) error GetFacts(ctx, agentID, subject) ([]Fact, error) GetHistory(ctx, agentID, roomID, limit) ([]Message, error) AppendMessage(ctx, agentID, roomID, msg) error } ``` --- ## Herramientas LLM para memoria - `remember(subject, key, value)` — guardar un hecho - `recall(subject, key)` — recuperar hechos sobre alguien/algo - `forget(subject, key)` — borrar un hecho --- ## Integración con el flujo actual 1. `agents/runtime.go` mantiene un `map[roomID]memory.Window` en RAM 2. Antes de llamar al LLM, inyectar historial de la ventana al request 3. Después de la respuesta, hacer `Append` con el mensaje del bot 4. Las herramientas `remember`/`recall` van al `Store` SQLite --- ## Archivos a crear/modificar - `pkg/memory/types.go` — Message, Fact, Window (puros) - `pkg/memory/window.go` — operaciones sobre Window (puras) - `shell/memory/sqlite_store.go` — Store SQLite - `shell/memory/migrations/001_init.sql` — schema - `agents/runtime.go` — inyectar historial antes del LLM call - `agents//agent.go` — registrar herramientas remember/recall ## Notas - Schema SQLite: tabla `facts(agent_id, subject, key, value, updated_at)`, tabla `messages(agent_id, room_id, role, content, created_at)` - El tamaño de la ventana se configura en `storage.max_context_messages` (añadir al schema de config)