adde3026ea
Bug fixes - ImGui ID conflict en menu Change type: dedup tipos del grafo + defaults; PushID/PopID por entrada. - Dockspace ya no tapa la toolbar: se posiciona 44 px por debajo, asi las ventanas dockeadas al borde superior quedan bajo la barra de filtros, no detras. - Hover radius proporcional al tamaño visual del nodo: query espacial amplio (24/zoom) + filtro fino por (radio_visual + 2 px) / zoom. El tooltip solo se dispara si el raton esta efectivamente sobre el nodo. Layout - Default layout = grid (en vez de force) para que los grafos cargados se distribuyan ordenadamente al abrir. - Boton "Reset layout" en la toolbar: limpia NF_PINNED en todos los nodos, resetea velocidades y reaplica el layout activo. - Nodos recien creados (add_node, duplicate) caen en un anillo poisson alrededor del centro de la vista, no en el origen. Posicion determinista por user_data para que el mismo nodo no salte entre reloads. Notes (markdown) - Panel "Note" (dockeable) abierto con doble click sobre un nodo. - entity_get_notes / entity_set_notes en entity_ops sobre la columna `notes` de operations.db (ya existente en el schema). - Ctrl+S guarda. Cabecera muestra entity, type, id.
74 lines
2.6 KiB
C++
74 lines
2.6 KiB
C++
#pragma once
|
|
#include <cstdint>
|
|
#include <cstddef>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
|
|
// Operaciones CRUD sobre operations.db (entities + relations) y deteccion
|
|
// heuristica de tipo a partir de texto libre. Pensado para que la toolbar y
|
|
// el menu contextual del viewport puedan modificar el grafo y luego pedir
|
|
// reload (issue 0049g flow).
|
|
//
|
|
// Convencion edge labels: si el caller no pasa nombre de relacion, se usa
|
|
// k_default_relation_name = "RELATED_TO". Los enrichers deben pasar siempre
|
|
// un nombre semantico (ej: "EXTRACTED_FROM", "RESOLVES_TO", ...).
|
|
|
|
namespace ge {
|
|
|
|
constexpr const char* k_default_relation_name = "RELATED_TO";
|
|
|
|
enum DetectedType {
|
|
DT_TEXT = 0,
|
|
DT_EMAIL,
|
|
DT_IP_ADDRESS,
|
|
DT_URL,
|
|
DT_DOMAIN,
|
|
DT_PHONE,
|
|
};
|
|
|
|
DetectedType detect_type(const char* text);
|
|
const char* detected_type_name(DetectedType dt);
|
|
|
|
// Inserta una entidad nueva. Si type_ref es NULL/vacio se infiere via
|
|
// detect_type(name). Genera un id unico ("<type>_<unix_ms>"). Devuelve el id
|
|
// en out_id (caller-owned buffer >= 64). Retorna false si SQLite falla.
|
|
bool entity_insert(const char* db_path,
|
|
const char* name,
|
|
const char* type_ref,
|
|
char* out_id, size_t out_id_n);
|
|
|
|
bool entity_delete(const char* db_path, const char* id);
|
|
|
|
bool entity_update_type(const char* db_path, const char* id, const char* new_type);
|
|
|
|
// Duplica una entidad existente. Mismo type/metadata, sufijo "_copy" en id
|
|
// y "(copia)" en name. Devuelve el nuevo id en out_id.
|
|
bool entity_duplicate(const char* db_path, const char* id,
|
|
char* out_id, size_t out_id_n);
|
|
|
|
// Inserta una relacion. Si name es NULL/vacio usa k_default_relation_name.
|
|
bool relation_insert(const char* db_path,
|
|
const char* from_id, const char* to_id,
|
|
const char* name);
|
|
|
|
// Lee la columna `notes` (markdown) de una entidad. out se reasigna; vacio si
|
|
// no existe la entidad.
|
|
bool entity_get_notes(const char* db_path, const char* id, std::string* out);
|
|
|
|
// Sobrescribe `notes` con el contenido proporcionado. Toca `updated_at`.
|
|
bool entity_set_notes(const char* db_path, const char* id, const char* notes);
|
|
|
|
// Mapa user_data (FNV1a hash) -> sql id. Se reconstruye despues de cada
|
|
// carga del grafo (graph_sources usa FNV1a sobre id como user_data).
|
|
struct EntityIndex {
|
|
std::unordered_map<uint64_t, std::string> by_hash;
|
|
};
|
|
|
|
// Escanea operations.db y rellena el indice. Reentrante (clear+repoblar).
|
|
bool entity_index_build(const char* db_path, EntityIndex* idx);
|
|
|
|
// Resuelve user_data a sql id. NULL si no existe.
|
|
const char* entity_index_lookup(const EntityIndex& idx, uint64_t user_data);
|
|
|
|
} // namespace ge
|