012e2e97a63758c830fd4a157ff6e2e5efcdb1b1
Antes: cada reload disparado por enrichers (dirty_counter) ejecutaba graph_viewport_fit (recentraba camara), recargaba desde SQL con todos los nodos en (0,0), aplicaba layout_circular si todo estaba en cero, y los huerfanos quedaban apilados sobre el origen. Si physics estaba ON, las fuerzas dispersaban todo el grafo violentamente. Ahora: - Auto-save de posiciones antes de cada reload — preserva lo que el usuario ve en pantalla sin pulsar "Save layout". - No graph_viewport_fit en reloads (solo en primera carga via load_input(first_load=true)). La camara permanece donde estaba. - No layout_circular en reloads (mismo guard via first_load). - Halo placement: nodos huerfanos (en (0,0) tras layout_store_load) se colocan junto a su primer vecino con coordenadas conocidas, buscando slot angular libre en radios crecientes (80,140,200,280,400) con jitter deterministico por user_data. Si no hay vecinos colocados, se aparcan en columna lateral fuera del bbox. - Anti-overlap garantizado a min_dist=60 px entre centros. - Physics siempre OFF tras reload — el usuario las activa explicitamente. - Auto-save tambien al inicio de reload_after_mutation (mutaciones manuales add/delete/duplicate/change_type) por consistencia. - Refresca entity_index tras reload (los nuevos nodos creados por enrichers tienen user_data nuevos que el indice anterior no conoce). Tests visuales: compila limpio, jobs_init continua detectando enrichers, smoke test del binario OK. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Description
OSINT graph viewer — agnostic GPU-accelerated graph explorer for any operations.db
Languages
C++
64.5%
Python
32.1%
Go
1.6%
Shell
1.5%
CMake
0.3%