# 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/<id>/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/<id>/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)
