Files
graph_explorer/issues/0003-enricher-web-extract.md
T
egutierrez a36530bb6f feat: docking host + add-node toolbar + node context menu
- Dockspace host (PassthruCentralNode) bajo la toolbar para que las
  ventanas Viewport/Legend/Inspector/Stats puedan dockearse dentro de la
  app principal.
- Toolbar: input "Add node" con auto-deteccion de tipo (text/email/
  ip_address/url/domain/phone). Insert en operations.db + reload.
- Context menu (right-click sobre nodo): Change type, Duplicate, Delete,
  submenu "Run enricher" (placeholder hasta issues 0001-0003).
- Inspector: vecinos ahora muestran etiqueta de relacion ("-> employs",
  "<- owns") usando rel_types[].name como label de arista.
- Default relation label k_default_relation_name="RELATED_TO" para
  relaciones creadas sin nombre semantico explicito.
- Indice EntityIndex (FNV1a hash -> sql id) reconstruido tras cada load
  para resolver mutaciones desde el grafo en memoria.

Issues planteadas para iteraciones siguientes:
- 0001: chat con Claude sobre el grafo (HTTP + tool-use)
- 0002: enricher GLiNER+GLiREL desde nodo texto
- 0003: enricher web (fetch URL/dominio + extract text)
- 0004: vista tabla por tipo de entidad
2026-04-30 22:55:30 +02:00

1.3 KiB

id, title, status, priority, created
id title status priority created
0003 Enricher web — descargar URL/dominio y extraer texto pending medium 2026-04-30

Objetivo

Right-click sobre un nodo url o domain → "Run enricher → Fetch & extract text". Descarga el HTML, extrae el texto principal, crea un nodo text conectado al origen con relacion FETCHED_FROM.

Despues el usuario puede encadenar: sobre ese nodo text, ejecutar el enricher GLiNER+GLiREL (issue 0002) para extraer entidades.

Alcance

  • HTTP GET con timeout (libcurl o sys WinHTTP).
  • Extraccion de texto: regex/strip de tags simple en v1; v2 usa una lib (htmlparser2 / lexbor / boost.url + algo de heuristica).
  • User-agent identificativo, respeto de robots.txt opcional (out-of-scope v1).
  • Limite de tamaño descargable (1 MB) para evitar bloqueos.

Modelo de etiquetado

  • Nodo origen (url/domain) → arista FETCHED_FROM → nodo nuevo (text con metadata={fetched_at, status_code, content_type, length}).
  • Nombre del nodo text: titulo de la pagina (si