#pragma once #include #include // Registro estatico de enrichers (issue 0026). // // Al arrancar la app se escanea `/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 applies_to; // tipos validos (case-insensitive) std::string run_path; // path absoluto al ejecutable/script // Lenguaje del enricher (issue 0033 fase A). Determina como // jobs.cpp construye el argv del subprocess. Valores soportados: // "python" (default si no se especifica) -> python // "go" -> directo // "bash" -> bash std::string lang; // Basename del ejecutable o script (sin extension). El loader // resuelve /{.py|.sh} o, para go, // /{.exe} segun la plataforma. Default "run". std::string exec_basename; // True si lang != "" y no se pudo resolver el ejecutable // correspondiente (ej: enricher Go sin compilar). El loader deja // el spec en el registro pero marcado como deshabilitado para // que la UI pueda mostrar un warning. bool disabled = false; std::string disabled_reason; }; // 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& 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 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