621e8895c9
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
93 lines
3.1 KiB
Markdown
93 lines
3.1 KiB
Markdown
---
|
|
id: "0132"
|
|
title: "Modulo C++ terminal_panel — emulador TTY ImGui embebible"
|
|
status: pendiente
|
|
type: app
|
|
domain:
|
|
- cpp-stack
|
|
- dev-ux
|
|
- apps-infra
|
|
scope: cross-stack
|
|
priority: alta
|
|
depends: []
|
|
blocks: []
|
|
related:
|
|
- "0130"
|
|
- "0131"
|
|
created: 2026-05-22
|
|
updated: 2026-05-22
|
|
tags: [cpp, imgui, terminal, pty, module]
|
|
flow: ""
|
|
---
|
|
|
|
# 0132 — Modulo C++ terminal_panel
|
|
|
|
**Status:** pendiente
|
|
|
|
## Por que
|
|
|
|
Apps del ecosistema (kanban_cpp, services_monitor, agents_dashboard) necesitan ver output crudo de comandos shell sin abrir un terminal externo. Tipico: tail de un log, watch de un curl, ejecutar `git status` rapido. Solucion estandar: modulo `terminal_panel` reusable que arranca un shell hijo via PTY y lo renderiza en ImGui.
|
|
|
|
## Que entrega
|
|
|
|
Modulo `cpp/functions/viz/terminal_panel/`:
|
|
|
|
```cpp
|
|
namespace fn_term {
|
|
struct TerminalPanel {
|
|
std::string shell; // "/bin/bash" linux, "powershell.exe" windows; default auto
|
|
std::string cwd; // working dir; default = current
|
|
std::vector<std::string> env; // KEY=VAL extras
|
|
int scrollback_lines = 5000;
|
|
bool readonly = false; // true = no input forwarding (tail-only)
|
|
};
|
|
void open(TerminalPanel& panel); // crea proceso hijo + PTY
|
|
void render(TerminalPanel& panel);
|
|
void send(TerminalPanel& panel, const std::string& text); // stdin
|
|
void close(TerminalPanel& panel);
|
|
}
|
|
```
|
|
|
|
Implementacion:
|
|
- Linux: `forkpty` + `read/write` non-blocking en background thread.
|
|
- Windows: ConPTY (CreatePseudoConsole) + ReadFile en thread.
|
|
- Buffer circular `scrollback_lines` filas; render con `ImGui::TextUnformatted` por chunk para minimizar costo.
|
|
- Soporte minimo de ANSI: cursor pos, color FG/BG basico (16 colores), clear screen. NO soporte completo (no Vim, no top, no curses pesado).
|
|
- Toolbar: clear, copy selection, reset shell, scroll-to-bottom.
|
|
|
|
## Estructura
|
|
|
|
```
|
|
cpp/functions/viz/terminal_panel/
|
|
terminal_panel.h
|
|
terminal_panel.cpp
|
|
terminal_panel.md
|
|
terminal_panel_linux.cpp // forkpty path
|
|
terminal_panel_windows.cpp // ConPTY path
|
|
terminal_panel_test.cpp
|
|
```
|
|
|
|
## Reusa del registry
|
|
|
|
- `logger_cpp_core` (fn_log) — log errores spawn/io.
|
|
- `ansi_parser_cpp_core` — si existe, parsear secuencias ANSI. Si no, delegar a `fn-constructor` para crearlo dentro de este issue (sub-deliverable).
|
|
|
|
## DoD
|
|
|
|
- Compila Linux + Windows.
|
|
- Demo: `primitives_gallery` muestra terminal corriendo `bash -i` (linux) / `cmd.exe` (windows).
|
|
- Smoke test: spawn `echo hello && exit 0` → buffer contiene "hello".
|
|
- Integracion en kanban_cpp v2: panel "Logs" que toma `run_id` de issue activa y arranca `tail -f /tmp/wt-<slug>-<runid>/agent.log` (readonly=true).
|
|
- FPS sin caida bajo carga de `yes "x"` (saturado): 60fps target con scrollback truncado.
|
|
|
|
## Anti-scope (v1)
|
|
|
|
- Sin soporte completo ANSI (no italics, no 256 colores, no Unicode wide).
|
|
- Sin Vim / programas curses-pesados (cursor visible solo).
|
|
- Sin SSH remoto (solo shell local).
|
|
- Sin tabs multiples en un panel (un panel = un proceso).
|
|
|
|
## Notas
|
|
|
|
ConPTY requiere Windows 10 v1809+. Si target inferior, fallback a CreatePipe sin PTY (sin redimensionado).
|