--- 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 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--/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).