Registro de cambios
[0.1.0] - 2026-09-12
Nota de política de versiones: el ecosistema sigue en una fase temprana — todo
está en 0.1.0. Esta entrada registra el trabajo de widgets en tiempo de
ejecución que se incorporó al repo sobre el crate xtop-plugin-samurai
existente.
Hosts de widgets en tiempo de ejecución (opt-in)
- Nuevo crate
xtop-plugin-wasm(xtop-plugin-wasm, featureplugin-wasmen el kernel): carga widgets*.wasmen sandbox en proceso con wasmi. Descubrimiento en<config dir>/wasm/(anular conXTOP_WASM_DIR), recarga en caliente por mtime, acciones de depuraciónstatus/render/reload, y un arnésexamples/inspect.rsque ejecuta un módulo sin el kernel. Límites del sandbox: 100M de fuel por secuencia de llamada host→guest, 64 MiB de memoria lineal, solo el importhost.logenlazado. - Nuevo crate
xtop-plugin-external(xtop-plugin-external, featureplugin-external): un proceso auxiliar por widget sobre JSON delimitado por líneas. Descriptores en<config dir>/external/*.json(anular conXTOP_EXTERNAL_DIR), timeout por respuesta, última lista de dibujo buena ante fallos, apagado limpio. Cualquier lenguaje con un runtime puede implementar un widget. - Nuevos crates compartidos:
xtop-wasm-contract— contrato serializableManifest/State/DrawListmás el protocolo externoRequest/Response(ABI"1").xtop-widget-replay— reproducción en el host de listas de dibujo sobre un frame de ratatui y la conversión de contexto de plugin → contratoState.xtop-wasm-guest— SDK de guest en Rust (macroexport_widget!, exports de ABI, uso dehost.log) para construir widgets parawasm32-unknown-unknown.
- La integración en el kernel es aditiva y opt-in: los dos hosts son features
no por defecto, se registran por la ruta existente de widgets de plugins
(precedencia sobre los packs compilados) y dejan intacto el sistema de
plugins/packs compilados. Ver
docs/decisions.md(ADR-001).
Ejemplos
examples/wasm/— guests de Rustclock,cpu,procsyload-stats(estadística: EMA, z-score), más guests de C autónomosc-tickeryc-cpu-avgcompilados con clang + wasm-ld y sin libc/WASI.examples/external/— widgets auxiliares de Lua (lua-clock,lua-histogram), Python (python-cpu,python-cpu-chart,python-mem-regression) y Node (node-clock), todos sin dependencias.
Herramientas
scripts/build-examples.sh— compila cada guest (Rust wasm32 + C) y puede hacerles una prueba de humo a través del cargador real del host.scripts/test-wasm-e2e.sh,scripts/test-external-e2e.sh— comprobaciones de extremo a extremo de ambas vías (se saltan los runtimes que no están instalados).scripts/ci.sh— nuevas etapas opcionaleswasmyexternal; las etapas por defecto (fmt,clippy,check,test) no cambian.
Documentación
docs/wasm-widgets.md— host WASM: ABI, límites del sandbox, operaciones de la lista de dibujo, recarga en caliente, guía de autoría.docs/external-widgets.md— host externo: descriptores, protocolo, ciclo de vida, timeouts.docs/decisions.md— ADR-001 (hosts de widgets en tiempo de ejecución).examples/wasm/README.md,examples/external/README.md— instrucciones de compilación/ejecución por ejemplo.
Compatibilidad
- Sin cambios disruptivos en
xtop-plugin-samuraini en el contratoxtop-plugin-api. Los nuevos crates son miembros aditivos del workspace. - La ABI de cara al guest está versionada (
"1"); los guests que declaran un valorapidistinto se cargan con una advertencia.