Arquitectura interna de os-console
TopicFrom the PointSav Documentation
os-console aloja múltiples espacios de trabajo TUI independientes — cartuchos — dentro de un chasis unificado de navegación por teclado. Este artículo cubre el rasgo Cartridge, la negociación de capacidades y el protocolo de hipervínculos OSC 8.
os-console es un binario compilado en Rust que aloja múltiples espacios de trabajo TUI
independientes — cartuchos — dentro de un marco unificado de navegación por teclado.
Este artículo describe el diseño interno de ese marco: cómo se definen los cartuchos,
cómo el chasis despacha eventos, cómo se negocian las capacidades del terminal y cómo
los cartuchos comunican la intención de enlace al terminal.
[edit]El rasgo Cartridge
Cada crate app-console-* expone exactamente un tipo que implementa el rasgo
Cartridge, definido en app-console-keys. El rasgo es la única interfaz entre un
cartucho y el chasis — no existen otras API públicas:
trait Cartridge {
fn fkey(&self) -> FKey;
fn title(&self) -> &str;
fn tick(&mut self);
fn render(&mut self, frame, area);
fn handle_event(&mut self, event) -> CartridgeAction;
fn set_graphics_caps(&mut self, kitty, sixel, font_size, truecolor);
fn flush_hyperlinks(&mut self, writer);
}
tick() y render() se invocan en cada iteración del bucle de eventos.
handle_event() se invoca únicamente cuando llega un evento de teclado o ratón.
set_graphics_caps() se invoca una sola vez al iniciar, después de que el chasis
consulta las capacidades del terminal conectado. flush_hyperlinks() se invoca tras
cada llamada a render(), permitiendo a los cartuchos emitir secuencias de hipervínculo
OSC 8 en el flujo de salida del terminal. Tanto set_graphics_caps() como
flush_hyperlinks() tienen implementaciones predeterminadas vacías en el rasgo, de modo
que los cartuchos que no usan gráficos ni hipervínculos no incurren en código adicional.
[edit]Registro de cartuchos
Los cartuchos se registran al inicio mediante chassis.register(Box<dyn Cartridge>).
El registro es independiente del orden con respecto al renderizado, pero el orden
determina la presentación en la barra de pestañas cuando las ranuras de teclas de función
no son únicas. Cada cartucho registrado debe reclamar una ranura FKey distinta.
La compilación predeterminada registra seis cartuchos:
| Tecla F | Cartucho | Se conecta a |
|---|---|---|
| F2 | app-console-people |
service-people |
| F3 | app-console-email |
service-email |
| F4 | app-console-content |
service-content, service-slm |
| F9 | app-console-slm |
Doorman / service-slm |
| F11 | app-console-system |
servidor de emparejamiento |
| F12 | app-console-input |
servicio de ingesta |
El cartucho F12 (app-console-input) es obligatorio en todo despliegue según
sys-adr-10. Es la puerta de ingesta a través de la cual debe pasar todo texto
originado por el operador antes de entrar a la capa de datos de la plataforma. Omitirlo
es una violación de las restricciones de compilación.
[edit]Negociación de capacidades del terminal
Al inicio, el chasis consulta el terminal conectado mediante secuencias de escape estándar e inspección del entorno:
- Protocolo gráfico Kitty: detectado mediante respuesta APC a una secuencia de sondeo.
- Sixel: detectado mediante la variable de entorno
TERMy atributos de dispositivo DA2. - Tamaño de celda de fuente: consultado mediante xtwinops (CSI 16 t) cuando está disponible; recurre a una estimación de 10×20 px.
- Truecolor: detectado mediante
COLORTERM=truecoloroCOLORTERM=24bit.
Las capacidades resueltas se pasan a cada cartucho registrado mediante
set_graphics_caps(kitty, sixel, font_size, truecolor). Los cartuchos las utilizan para
elegir entre colores RGB de 24 bits y la paleta de reserva de ocho colores con nombre.
El chasis nunca vuelve a llamar a set_graphics_caps() tras la negociación inicial —
las capacidades quedan fijas durante la vida útil de la sesión.
[edit]Convenciones de color en truecolor
Cuando truecolor está disponible, los cartuchos utilizan un conjunto de colores coherente:
- Acento (bordes, resaltados):
Rgb(32, 178, 170)— un verde azulado cercano al CSS LightSeaGreen. - Fondo de selección:
Rgb(0, 95, 135)— un azul verdoso oscuro. - Peligro / error:
Rgb(200, 0, 0)— rojo intenso.
Cuando truecolor no está disponible — terminales simples, consolas serie — los cartuchos recurren a colores con nombre: Cyan para acentos, DarkGray para fondos de selección, Red para errores. La jerarquía visual se preserva; solo cambia la precisión.
[edit]Hipervínculos OSC 8
ContentCartridge (F4) implementa flush_hyperlinks(). Durante render(), recopila
destinos de URL de resultados de búsqueda y citas en un búfer interno. Tras completarse
el ciclo de dibujo de ratatui, el chasis llama a flush_hyperlinks(), que emite
secuencias OSC 8:
OSC 8 ; params ; uri ST (abrir enlace)
OSC 8 ; ; ST (cerrar enlace)
Los enlaces solo se emiten cuando el protocolo gráfico Kitty está activo — los terminales
que admiten gráficos Kitty también admiten OSC 8 de forma fiable. El no-op predeterminado
de flush_hyperlinks() en el rasgo significa que los cartuchos que no participan no
incurren en sobrecarga.
[edit]Intención de despliegue soberano
Todos los puntos de acceso de servicio predeterminados en la configuración de la consola
se resuelven a direcciones localhost. El binario es operable sin archivo de configuración
y no tiene dependencia fija de ninguna red externa. La intención es que os-console
arranque y se renderice completamente en una máquina sin acceso saliente a internet,
conectándose solo a servicios que se ejecutan en el mismo nodo o dentro de la misma
malla de PPN.
[edit]Véase también
- sys-adr-10 — la decisión arquitectónica que establece F12 como puerta de ingesta obligatoria
- ppn-small-business-compute — el sustrato de red al que se conecta os-console