Gargalos Arquiteturais em Emuladores de Terminal Baseados em Blocos: Complexidade de Memória e Mapeamento Espacial
Projeto: Singularity
Data: Março de 2026
O projeto Singularity implementou com sucesso uma arquitetura multi-sessão e não-bloqueante utilizando winit, wgpu e glyphon. No entanto, antes de implementar a interface de usuário visual estilo Warp (Fase 4), restam duas vulnerabilidades estruturais críticas. Este documento descreve o crescimento ilimitado de memória inerente à atual implementação do BlockStore e a falta de um sistema de mapeamento espacial bidirecional necessário para a interatividade. O objetivo da próxima fase de desenvolvimento é resolver esses gargalos.
O motor atual processa a saída padrão (stdout) do pseudo-terminal (PTY) em blocos isolados por meio de uma máquina de estados finitos (vte). Embora essa arquitetura garanta alternância de contexto em
Atualmente, o BlockStore anexa cada comando executado e sua respectiva saída (StyledSpan) em um vetor contínuo (Vec<Block>). Isso cria uma Complexidade de Espaço ilimitada de
Em cenários do mundo real (por exemplo, leitura contínua de logs de servidor ou compilação de binários grandes em Rust), temos BufferCache inevitavelmente esgotará a memória disponível ao tentar reter dados de glifos para todo o histórico.
- Estrutura de Dados Limitada: Transicionar o armazenamento histórico de um vetor estritamente ilimitado para um Buffer Circular (Ring Buffer) ou uma lista virtualizada com uma capacidade máxima de linhas (ex: 10.000 linhas).
- Estratégia de Despejo (Eviction): Implementar um mecanismo de despejo altamente eficiente que descarte os blocos (ou blocos parciais) mais antigos quando o limite de capacidade for atingido, garantindo que o uso de memória atinja um platô em vez de crescer linearmente.
O segundo déficit arquitetural é a desconexão entre o estado lógico e os pixels renderizados. O glyphon envia texto para o pipeline da GPU, mas o estado da aplicação não tem consciência espacial.
Para suportar recursos futuros, como seleção de texto, copiar/colar e retração de blocos, o motor requer uma função de mapeamento que traduza coordenadas 2D da tela de volta para o estado lógico da aplicação:
Onde uma coordenada de tela
-
Indexação Espacial: Criar um mecanismo (provavelmente dentro do
BufferCacheou em um novoLayoutManager) que rastreie a caixa delimitadora (bounding box) de coordenadas$(X_0, Y_0, X_1, Y_1)$ de cada bloco renderizado e seus respectivos trechos de texto internos. -
API de Hit-Testing: Expor uma função que aceite coordenadas de mouse do
winite retorne o índice exato do caractere sob o cursor em tempo$\mathcal{O}(\log k)$ ou$\mathcal{O}(1)$ , onde$k$ é o número de blocos visíveis.
Como Engenheiro de Sistemas Sênior, sua tarefa é refatorar as estruturas de dados centrais para resolver o Problema I e o Problema II. Você mantém total liberdade técnica em relação aos algoritmos subjacentes e às crates Rust utilizadas. Foco estritamente na performance, minimizando alocações de heap durante o processo de despejo de memória e garantindo que a lógica de hit-testing não introduza latência no loop de eventos principal.
Por favor, forneça as implementações atualizadas para os módulos afetados (ex: block_store.rs, session.rs, main.rs), juntamente com uma breve justificativa técnica de suas escolhas algorítmicas.