# Tipos: Memory System (MemoryField, MemoryTypeSchema, MemoryData)

Fuente conceptual: OpenViking `openviking/session/memory/dataclass.py` (AGPL-3.0)
Reimplementar desde cero. No copiar codigo.

## Tipos a implementar

### 1. FieldType (enum/sum)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** sum
- **Definicion:**
  ```python
  class FieldType(str, Enum):
      STRING = "string"
      INTEGER = "integer"
      FLOAT = "float"
      BOOLEAN = "boolean"
      LIST = "list"
      DICT = "dict"
      DATETIME = "datetime"
  ```

### 2. MergeOp (enum/sum)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** sum
- **Definicion:**
  ```python
  class MergeOp(str, Enum):
      PATCH = "patch"             # SEARCH/REPLACE para strings, replace directo para otros
      SUM = "sum"                 # suma numerica (contadores)
      IMMUTABLE = "immutable"     # no se puede modificar despues de crear
  ```
- **Descripcion:** Estrategia de merge cuando se actualiza un campo de memoria existente. PATCH aplica cambios parciales (search/replace en strings), SUM acumula valores numericos, IMMUTABLE protege contra modificacion.

### 3. MemoryField (product)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** product
- **Definicion:**
  ```python
  @dataclass
  class MemoryField:
      name: str                   # nombre del campo
      field_type: FieldType       # tipo de dato
      description: str = ""       # descripcion para el LLM
      merge_op: MergeOp = MergeOp.PATCH  # estrategia de merge
  ```
- **Descripcion:** Definicion de un campo dentro de un tipo de memoria. El merge_op determina como se actualizan valores existentes.

### 4. MemoryTypeSchema (product)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** product
- **Definicion:**
  ```python
  @dataclass
  class MemoryTypeSchema:
      memory_type: str                    # nombre del tipo (ej: "profile", "preferences")
      description: str = ""              # descripcion del tipo
      fields: list[MemoryField] = field(default_factory=list)
      filename_template: str = ""        # template para nombre de archivo
      directory: str = ""                # directorio donde se almacenan
      enabled: bool = True
      operation_mode: str = "upsert"     # "upsert" | "add_only" | "update_only"
  ```
- **Descripcion:** Schema de un tipo de memoria. Define la estructura de los datos, la estrategia de merge por campo, y como se organizan en el filesystem. Soporta 3 modos de operacion:
  - `upsert`: crear o actualizar (default)
  - `add_only`: solo crear, nunca actualizar existentes
  - `update_only`: solo actualizar existentes, nunca crear nuevos

### 5. MemoryData (product)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** product
- **Definicion:**
  ```python
  @dataclass
  class MemoryData:
      memory_type: str                    # tipo de memoria
      uri: str | None = None              # URI para updates
      fields: dict[str, Any] = field(default_factory=dict)   # datos dinamicos
      abstract: str | None = None         # L0 resumen corto
      overview: str | None = None         # L1 resumen medio
      content: str | None = None          # L2 contenido completo
      name: str | None = None
      tags: list[str] = field(default_factory=list)
      created_at: datetime | None = None
      updated_at: datetime | None = None
  ```
- **Metodos:**
  - `get_field(field_name: str) -> Any`
  - `set_field(field_name: str, value: Any) -> None`
- **Descripcion:** Instancia concreta de un dato de memoria. Los campos son dinamicos (dict) y se validan contra el MemoryTypeSchema correspondiente. Soporta 3 niveles de contenido (L0 abstract, L1 overview, L2 detail) para retrieval jerarquico.

### 6. Categorias de memoria predefinidas

Categorias estandar que un sistema de memoria de agente deberia soportar:

| Categoria | Descripcion | Ejemplo |
|-----------|-------------|---------|
| profile | Informacion del usuario | nombre, rol, expertise |
| preferences | Preferencias | idioma, estilo de respuesta |
| entities | Entidades conocidas | personas, proyectos, tools |
| events | Eventos ocurridos | reuniones, deployments, incidentes |
| cases | Casos/precedentes | bugs resueltos, decisiones |
| patterns | Patrones observados | workflows, preferencias recurrentes |
| tools | Herramientas conocidas | comandos, APIs, shortcuts |
| skills | Habilidades/capacidades | del agente o del usuario |
