--- id: 0012 title: Endpoint HTTP local de ingesta y consulta status: pending priority: medium created: 2026-05-01 --- ## Objetivo Exponer un servidor HTTP local en `graph_explorer` (o como `ingest_server` hermano) que sea el punto de entrada unico para todo flujo externo: extension de navegador, CLI `gx`, watcher de portapapeles, bots, OCR, etc. Sin este endpoint cada cliente externo tendria que abrir `operations.db` directamente — colisiona con el lock del proceso vivo y duplica logica de extraccion. ## Endpoints minimos - `POST /entity` — crea entidad. Body: `{type, name, metadata}`. - `POST /relation` — crea relacion. Body: `{from_id, to_id, kind, metadata}`. - `POST /ingest/text` — texto libre -> `extract_graph_hybrid` -> preview o auto-commit. - `POST /ingest/url` — URL -> fetch + extract -> preview o auto-commit. - `POST /ingest/file` — multipart upload (PDF/CSV/JSON/.eml/imagen) -> router por mime -> extract. - `GET /search?q=` — fuzzy / FTS sobre entidades. - `GET /entity/:id`, `GET /entity/:id/neighbors`. ## Decisiones - Bind a `127.0.0.1` por defecto, puerto fijo (ej. 7878) o aleatorio escrito a `~/.fn_graph_port`. - Auth: token compartido en `~/.fn_graph_token` (header `X-Token`). Generado al primer arranque. - Modo "preview": las rutas de ingesta aceptan `?commit=false` y devuelven entities/relations propuestas para que el cliente las muestre antes de persistir. Cuando es `true`, escribe directo. - Implementacion: httplib o Mongoose embebido en C++ (sin nuevas deps pesadas). Alternativa: lanzar el servidor en Go/Python aparte si la integracion C++ se complica. ## Bloquea Issues 0014, 0017, 0018, 0019, 0020 dependen de este. ## Definicion de hecho - `curl -H "X-Token: ..." -d '{"type":"person","name":"X"}' localhost:7878/entity` crea entidad. - `POST /ingest/text` con texto en castellano devuelve entities/relations detectadas por el pipeline hibrido. - El endpoint corre en background mientras la UI sigue interactiva. - Si `graph_explorer` no esta abierto, un binario `ingest_server` standalone ofrece el mismo API contra la misma `operations.db`.