# GRAFO D V44 SQLite/API Patch Notes

## Objetivo técnico

Esta versión mantiene `DATABASE/GRAFO_D_DATABASE.sqlite` como única base persistente canónica y elimina el patrón anterior de guardado JSON directo.

## Cambios implementados

1. Escritura persistente SQLite:
   - `POST /api/events`
   - `POST /api/ingest`
   - `PATCH /api/events/{id}`
   - `DELETE /api/events/{id}`
   - `POST /api/ui-state`

2. Estado de interfaz dentro de la misma base SQLite:
   - Se crea `ui_state` mediante extensión idempotente de esquema.
   - No se crea una segunda base de datos.
   - El adaptador lee `ui_state` y lo fusiona con el runtime.

3. Registro y sincronización de APIs:
   - `GET /api/apis`
   - `POST /api/apis`
   - `PATCH /api/apis/{id}`
   - `DELETE /api/apis/{id}`
   - `POST /api/apis/{id}/sync`

4. Ingesta determinista desde endpoint:
   - El endpoint debe devolver JSON.
   - Se aceptan contenedores `events`, `items`, `data` o `results`.
   - Cada elemento se normaliza a evento de grafo.
   - El identificador externo se convierte en `api_id:event_id`.
   - Si el evento ya existe, se actualiza; si no existe, se inserta.

5. Polling automático:
   - Al ejecutar `grafo_d_server.py`, un hilo daemon revisa APIs habilitadas.
   - Si la API está online, sincroniza y llena el grafo mediante transacciones SQLite.
   - Si la API falla, se actualiza estado a `offline` sin crear persistencia externa.

## Ejemplo de registro de centro de APIs

```bash
curl -X POST http://127.0.0.1:8780/api/apis \
  -H "Content-Type: application/json" \
  -d '{
    "id": "API_CENTER_EVENTS",
    "name": "API Center Events",
    "enabled": true,
    "target_graph": "API_CENTER",
    "method": "GET",
    "endpoint": "https://example.internal/api/events",
    "interval_seconds": 120
  }'
```

## Ejemplo de sincronización manual

```bash
curl -X POST http://127.0.0.1:8780/api/apis/API_CENTER_EVENTS/sync
```

## Contrato mínimo esperado del endpoint

```json
{
  "events": [
    {
      "id": "external-event-id",
      "title": "Event title",
      "date": "2026-06-04",
      "place": "Location",
      "who": "Source or actor",
      "description": "Event description",
      "url": "https://source.example/item"
    }
  ]
}
```

## Garantía de persistencia

Todas las mutaciones persistentes pasan por `DATABASE/GRAFO_D_DATABASE.sqlite`.
No se usan bases paralelas, `localStorage`, `indexedDB` ni JSON persistente como fuente de verdad.
