feat(0013): wire extract_panel into main + CMakeLists + app.md

- main.cpp: registra panel_extract en g_panels[], llama
  extract_panel_init tras jobs_init y extract_panel_shutdown en el
  cleanup, anade extract_panel_render(g_app) al render.
- CMakeLists.txt: anade extract_panel.cpp al target.
- app.md: declara extract_iocs_py_cybersecurity y
  extract_graph_hybrid_py_pipelines en uses_functions (regla
  uses_functions.md).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-04 14:24:32 +02:00
parent fdc6b91f4d
commit 992e8fa06c
3 changed files with 20 additions and 0 deletions
+1
View File
@@ -27,6 +27,7 @@ add_imgui_app(graph_explorer
jobs.cpp
enrichers.cpp
chat.cpp
extract_panel.cpp
# --- viz ---
${FN_CPP_ROOT_DIR}/functions/viz/graph_renderer.cpp
${FN_CPP_ROOT_DIR}/functions/viz/graph_force_layout.cpp
+4
View File
@@ -30,6 +30,10 @@ uses_functions:
- fullscreen_window_cpp_core
- badge_cpp_core
- empty_state_cpp_core
# paste & extract panel (issue 0013) — invoca enrichers/paste_extract/run.py
# via subprocess directo (no via jobs); uses extract_iocs + opcional hybrid.
- extract_iocs_py_cybersecurity
- extract_graph_hybrid_py_pipelines
uses_types: []
framework: "imgui"
entry_point: "main.cpp"
+15
View File
@@ -30,6 +30,7 @@
#include "jobs.h"
#include "enrichers.h"
#include "chat.h"
#include "extract_panel.h"
#include "../../../../cpp/vendor/sqlite3/sqlite3.h"
@@ -1233,6 +1234,7 @@ static fn_ui::PanelToggle g_panels[] = {
{"Table", nullptr, &g_app.panel_table},
{"Jobs", nullptr, &g_app.panel_jobs},
{"Echo", nullptr, &g_app.panel_chat},
{"Extract", nullptr, &g_app.panel_extract},
};
static void render() {
@@ -2176,6 +2178,12 @@ static void render() {
ImGui::SetNextWindowSize(ImVec2(520.0f, 720.0f), ImGuiCond_FirstUseEver);
ge::chat_render(&g_app.panel_chat);
// Extract panel (issue 0013) — flotante, dockeable.
ImGui::SetNextWindowPos (ImVec2(vp->WorkPos.x + W * 0.30f, top + 50.0f),
ImGuiCond_FirstUseEver);
ImGui::SetNextWindowSize(ImVec2(720.0f, 640.0f), ImGuiCond_FirstUseEver);
ge::extract_panel_render(g_app);
// Enricher config window (abierto desde context menu Run enricher).
render_enricher_config_window();
@@ -2482,6 +2490,12 @@ int main(int argc, char** argv) {
(int)ge::enrichers_all().size());
}
// Extract panel (issue 0013) — invoca enrichers/paste_extract/run.py
// directamente en su propio hilo, sin pasar por el sistema de jobs.
ge::extract_panel_init(enrichers_dir.c_str(),
app_dir.c_str(),
registry_root.c_str());
// Chat panel (claude -p) — el agente invoca gx-cli para mutar
// operations.db. agent_mutations counter en graph_explorer.db dispara
// reload del viewport en cada cambio.
@@ -2571,6 +2585,7 @@ int main(int argc, char** argv) {
// Cleanup
ge::chat_shutdown();
ge::extract_panel_shutdown();
ge::jobs_shutdown();
if (g_layout_storage) {
fn_ui::layout_storage_close(g_layout_storage);