Skip to content

feat(sidebar): indicador de recursos do PC (CPU, memória, disco, swap) e consumo por projeto - #22

Merged
gianlukamoraes merged 7 commits into
mainfrom
feat/indicador-recursos-maquina
Oct 21, 2026
Merged

gianlukamoraes merged 7 commits into
mainfrom
feat/indicador-recursos-maquina

Conversation

@gianlukamoraes

@gianlukamoraes gianlukamoraes commented Oct 20, 2026 •

Copy link
Copy Markdown

Chamado GLPI devswha#269: "mostrar os indicadores de recursos de máquina, como CPU, Memória, Disco, SWAP. Pois às vezes a máquina trava e o usuário não sabe o motivo".

Implementa a opção 3 do mockup aprovado pelo Gianluka: https://vm-gianluka.tailce96ef.ts.net/shared/devda-recursos-mockup.html
Prints da implementação (demo, números fictícios): https://vm-gianluka.tailce96ef.ts.net/shared/devda-recursos-implementado.html

O que muda

  • Linha do PC logo abaixo do nome de cada PC na barra lateral: CPU · RAM · Disco · Swap, com uma barrinha sob cada valor. Fica vermelha a partir de 90%, e o title mostra o usado e o total em GB.
  • Quem está consumindo: clicar na linha abre a lista dos projetos que mais consomem (CPU como fatia do PC e memória), mais o que está fora deles (navegador, sistema…). Clicar num projeto abre o painel mais pesado dele.
  • Aviso no projeto: quando um projeto passa de metade da CPU do PC ou de um quarto da memória, a linha dele mostra ⚠ + o valor em vermelho. No modo de duas linhas o aviso fica antes da pasta, para caber no celular; no de uma linha, depois do nome.
  • Atualiza a cada 5 s, só com a página visível e o PC conectado.

Server: GET /api/system/resources[?panes=a,b]

  • Rota da ponte: passa pelo mesmo gate de autenticação (bridge token ou acesso completo), funciona por /api/machines/<id>/ (proxy allowlist) e por /api/machines/local/. Responde só números e os pane IDs pedidos; os IDs são validados ([\w.:-], no máximo 200).
  • PC: a CPU vem do delta de os.cpus(). Memória e swap vêm de /proc/meminfo no Linux (MemAvailable) e de os.totalmem/freemem nas outras plataformas. Disco é o statfs da home.
  • Painéis: pane.process_info (com pane_id) dá o shell_pid, guardado em cache por painel; o herdr é consultado de novo só quando o pid some da tabela. Por painel soma-se a árvore de processos: CPU (delta de utime+stime) e RSS. Linux: /proc/*/stat e VmRSS. Windows: um único PowerShell (Win32_PageFileUsage + Win32_Process, só números), com cache de 10 s, uma execução por vez e timeout de 10 s com SIGKILL. A primeira leitura depois do start espera o PowerShell (no máximo 10 s); daí em diante o valor antigo é servido enquanto renova. macOS: sem swap nem painéis.
  • Uma leitura serve todos os clientes por 2 s, então dois dispositivos não estragam o delta de CPU um do outro.
  • Uma ponte antiga responde 404 e a linha não aparece.

Testes

  • server/resources.test.ts: os parsers (meminfo, /proc/stat com parênteses no nome, saída do Windows), CPU por processo, árvore de processos, soma real da árvore deste processo no Linux, cache de 2 s, IDs inválidos e limite de 200, um PowerShell por vez (3 chamadas → 1 spawn), timeout (um comando travado volta em < 3 s), 401 sem token (também por /api/machines/local/), resposta sem nenhuma string além dos pane IDs, 405 para POST.
  • src/lib/resources.test.ts: agrupamento por projeto, ordenação, limiar de "pesado", "fora dos projetos", formatação.
  • bun run check fast: ok (typecheck, build, 2191 testes).
  • Modo de uma linha da barra lateral conferido em print.
  • Rodado contra um herdr real: os números por painel batem (ex.: o painel do Claude ~1,1 GB).

Também no PR

  • site/demo/transport.ts responde a rota com números fictícios, para a demo não dar 404.
  • Traduções ko/ja/zh/pt. "CPU" não passa por t(), por ser sigla; "Swap" entrou na lista de termos iguais de propósito do i18n.test.ts.
  • design-system/: componente novo MachineResources (README + preview + bundle.css) e RosterRow atualizado.
  • CHANGELOG em Unreleased → Added.

Limites conhecidos

  • Um processo que nasce e morre entre duas leituras não aparece na CPU do projeto (comentário ponytail: em processCpu).
  • O RSS conta páginas compartilhadas mais de uma vez, então "fora dos projetos" nunca fica abaixo de 0.
  • O Windows não foi testado em máquina real: só os parsers e o controle do processo (single-flight e timeout).

🤖 Generated with Claude Code

gianlukamoraes and others added 7 commits October 19, 2026 21:45
…isco do PC e dos painéis

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o no projeto pesado

Linha com CPU, memória, disco e swap de cada PC (vermelho a partir de 90%),
lista dos projetos que mais consomem ao clicar e aviso na linha do projeto
que passa de metade da CPU ou um quarto da memória do PC. GLPI devswha#269.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… cache e PID reutilizado

- PC remoto com ponte anterior responde 401/403 (a rota não é de ponte lá):
  vale como sem suporte; volta a perguntar quando o PC reconecta.
- Painel sem shell_pid não repete pane.process_info a cada leitura (10 s).
- O shell em cache confere também a hora de início, e um filho mais velho
  que o pai não entra na árvore (órfão do Windows com PID reaproveitado).
- CPU depois de mais de 20 s sem leitura sai como desconhecida.
- system/resources na lista de rotas aceitas do teste do proxy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…afastadas

As tabelas do PowerShell ficam 10–25 s uma da outra (cache, execução lenta,
poll do cliente); com o corte de 20 s a CPU alternava para — justo com o PC
pesado. Comentário ponytail sobre o 401 passageiro que deixa a linha parada.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ndarem

Na CI as duas leituras ficavam a 4 ms reais uma da outra (o relógio do teste
é falso) e a CPU do PC saía null.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@gianlukamoraes
gianlukamoraes marked this pull request as ready for review October 21, 2026 23:19
@gianlukamoraes
gianlukamoraes merged commit 7a4f2e2 into main Oct 21, 2026
11 checks passed
@gianlukamoraes
gianlukamoraes deleted the feat/indicador-recursos-maquina branch October 22, 2026 14:26
gianlukamoraes added a commit that referenced this pull request Oct 22, 2026
* feat(sidebar): memória e CPU de cada agente na lista Agentes

Cada linha da lista Agentes abre a segunda linha com a memória do painel
do agente (o shell e tudo abaixo dele, já medido pela rota de recursos do
#22). Passando dos limites do projeto pesado (50% da CPU do PC ou um
quarto da memória), ganha o triângulo, a CPU e o vermelho. A dica mostra
CPU e memória sempre. GLPI devswha#280.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(changelog): memória e CPU por agente

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(changelog): link do PR #23

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(sidebar): CPU do agente limitada a 100%, número lido por leitor de tela e CSS sem desfazer regra

- A soma dos processos do painel pode passar de 100%; o projeto já limitava.
- O número desenhado fica aria-hidden e a frase "Este agente: CPU … · memória …"
  vai como texto oculto, para o leitor de tela não ler "1,2 GB" solto.
- .resource-agent deixa de herdar a regra do .resource-heavy só para desfazê-la.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(sidebar): linha do agente mostra a CPU sempre, não só quando pesa

Escolha do Gianluka (opção b): "3% · 1,2 GB" em toda linha; o vermelho e o
triângulo continuam só para o agente pesado.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant