6df04652d8
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>
41 lines
1.4 KiB
C++
41 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
// Registro estatico de enrichers (issue 0026).
|
|
//
|
|
// Al arrancar la app se escanea `<app_dir>/enrichers/*/manifest.yaml` y se
|
|
// rellena el registro. El context menu del viewport consulta
|
|
// `enrichers_for_type(type_ref)` para mostrar el submenu filtrado por tipo
|
|
// del nodo right-clickado.
|
|
//
|
|
// Para v1 no parseamos `params` con detalle — solo lo necesario para
|
|
// presentar el item de menu y submitear el job con `{}`.
|
|
|
|
namespace ge {
|
|
|
|
struct EnricherSpec {
|
|
std::string id; // ej: "fetch_webpage"
|
|
std::string name; // ej: "Fetch web page"
|
|
std::string description;
|
|
std::vector<std::string> applies_to; // tipos validos (case-insensitive)
|
|
std::string run_path; // path absoluto a run.py
|
|
};
|
|
|
|
// Escanea el directorio. Reentrante (limpia el registro anterior). Devuelve
|
|
// el numero de enrichers cargados, -1 si el dir no existe.
|
|
int enrichers_load(const char* enrichers_dir);
|
|
|
|
// Lista todos los enrichers cargados.
|
|
const std::vector<EnricherSpec>& enrichers_all();
|
|
|
|
// Filtra por tipo. Comparacion case-insensitive. Si applies_to es vacio en el
|
|
// manifest, el enricher se considera global (aplica a cualquier tipo).
|
|
std::vector<EnricherSpec> enrichers_for_type(const char* type_ref);
|
|
|
|
// Resuelve un enricher por id. Devuelve nullptr si no existe.
|
|
const EnricherSpec* enricher_by_id(const char* id);
|
|
|
|
} // namespace ge
|