fce3f97d53
Extiende el sistema de enrichers para soportar varios lenguajes en el
mismo registro. El manifest gana dos campos opcionales:
lang: python|go|bash (default: python — retrocompat con los 5
enrichers existentes que no lo declaran)
exec: run (basename del script o binario; default "run")
EnricherSpec ahora lleva `lang`, `exec_basename`, `disabled` y
`disabled_reason`. parse_manifest lee los nuevos campos y aplica
defaults; resolve_run_path busca <dir>/<exec>{.py|.sh|.exe|<vacio>}
segun lang + plataforma. Si el ejecutable no existe (binario Go sin
compilar, script ausente), el spec queda en el registro pero
disabled — enrichers_for_type lo oculta del menu y jobs.cpp aborta
con mensaje claro si llega un job para uno disabled.
run_subprocess (POSIX y Windows) ramifica argv segun lang:
- go -> execv del binario directamente, sin python ni wsl.exe
- bash -> /bin/bash <run_path> (en Windows: wsl.exe -- bash ...)
- python -> python3 <run_path> (default)
El call site en jobs.cpp resuelve run_path y lang via
ge::enricher_by_id() en lugar del hardcode "run.py". Los 5 enrichers
existentes siguen funcionando sin cambios — heredan lang: python por
default.
Tests pytest (22/22 verde):
- 16 regresion: los 5 enrichers actuales siguen pasando.
- 6 nuevos en test_dispatcher_lang.py: parser default a python,
parser lee lang: bash, wire protocol identico para python y
bash, enricher Go sin binario queda disabled, enricher real
sigue funcionando tras el cambio.
NO incluye: runtime Python embebido (fase B) ni badges de lang en
la UI (fase C). El issue 0033 sigue abierto hasta cerrar las dos
fases restantes.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
60 lines
2.3 KiB
C++
60 lines
2.3 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 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 <run_path>
|
|
// "go" -> <run_path> directo
|
|
// "bash" -> bash <run_path>
|
|
std::string lang;
|
|
|
|
// Basename del ejecutable o script (sin extension). El loader
|
|
// resuelve <dir>/<exec_basename>{.py|.sh} o, para go,
|
|
// <dir>/<exec_basename>{.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<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
|