diff --git a/CMakeLists.txt b/CMakeLists.txt index 2205c01..26d27fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/app.md b/app.md index d530d7b..89d321c 100644 --- a/app.md +++ b/app.md @@ -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" diff --git a/main.cpp b/main.cpp index 5d52226..2531fc3 100644 --- a/main.cpp +++ b/main.cpp @@ -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);