feat(jobs): sistema de jobs asincronos + panel UI (issue 0026)
Infra para correr enrichers en background mientras la app sigue interactiva.
C++:
- jobs.{h,cpp}: tabla jobs en graph_explorer.db, JobRunner con N=2 std::thread
workers, fork+exec POSIX con pipes, parser de PROGRESS:<float> <stage> en
stderr, captura de stdout JSON, persistencia + dirty_counter.
- enrichers.{h,cpp}: scanner de enrichers/<id>/manifest.yaml, parser YAML
minimo (id/name/description/applies_to), filtro por tipo de nodo.
- views_jobs.cpp: panel "Jobs" dockeable con tabla (status/enricher/target/
progress/time), filtro all/active/done/errors, cancelar/borrar inline.
Wiring:
- main.cpp: resolve_registry_root() (FN_REGISTRY_ROOT env o subir desde cwd
buscando registry.db), jobs_init/enrichers_load antes de fn::run_app,
jobs_shutdown al cerrar, dirty_counter -> want_reload, jobs_set_ops_db al
cambiar de proyecto.
- main.cpp:render_context_menu: menu "Run enricher" sustituye placeholder
con submenu filtrado por type_ref via enrichers_for_type. Submit abre
panel Jobs auto.
- views.h: AppState::panel_jobs flag + decl views_jobs().
- CMakeLists.txt: anade jobs.cpp + enrichers.cpp + views_jobs.cpp y enlaza
Threads::Threads.
Wire protocol enricher (subprocess Python):
- stdin: JSON con node_id, metadata, ops_db_path, app_dir, cache_dir,
registry_root, params.
- stderr: PROGRESS:<float> <stage> + LOG lineas libres.
- stdout: JSON resumen al final.
- exit 0 = ok, !=0 = error con stderr capturado en panel Jobs.
El run.py escribe directamente al operations.db (sqlite3 stdlib) — C++ solo
orquesta, no parsea entities/relations.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -55,6 +55,7 @@ struct AppState {
|
||||
bool panel_stats = true;
|
||||
bool panel_viewport = true;
|
||||
bool panel_note = false;
|
||||
bool panel_jobs = false; // issue 0026
|
||||
bool show_filters_modal = false;
|
||||
bool show_open_modal = false;
|
||||
|
||||
@@ -353,6 +354,14 @@ void views_type_editor(AppState& app);
|
||||
// te_delete_use_count via consulta a operations.db antes de mostrarlo.
|
||||
bool views_type_editor_delete_modal(AppState& app);
|
||||
|
||||
// ---- Jobs panel (issue 0026) ---------------------------------------------
|
||||
|
||||
// Renderiza el panel "Jobs" — tabla con todos los jobs (queued/running/done/
|
||||
// error/cancelled). Botones por fila para cancelar / reintentar / borrar.
|
||||
// Click en target_node centra el viewport sobre ese nodo (futuro). Polling
|
||||
// cada N frames para no spammear la BD.
|
||||
void views_jobs(AppState& app);
|
||||
|
||||
// ---- Filter helpers (issue 0009) -----------------------------------------
|
||||
|
||||
// True si el filtro tiene query no vacia o al menos un tag activo.
|
||||
|
||||
Reference in New Issue
Block a user