glm-tanque
v0.2.0
Published
Painel no terminal com o uso do plano GLM Coding (z.ai): janelas 5h/semanal, tokens e assinatura.
Maintainers
Readme
glm-tanque
Painel no terminal com o uso do plano GLM Coding (z.ai): janela de 5h, janela semanal, tokens absolutos e assinatura. Responde "quanto resta no tanque antes do reset?" sem abrir o site da z.ai.
⚠️ Os dados vêm de endpoints não-oficiais da z.ai (engenharia reversa do dashboard deles). Funciona hoje, mas pode quebrar sem aviso — ver docs/adr/0001.
GLM Coding Lite · lite 2026-08-23 15:56 UTC
────────────────────────────────────────────────────────────────────────────────
Janela 5h ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░ 85% reset em 3h45
Semanal ▓▓▓░░░░░░░░░░░░░░░░░░ 14% reset em 6d 22h
cota dia 1/7: 14.3% · ✓ dentro da cota · ≈ 4.3 janelas 5h restam
Tokens 7d 89.4M tok · 24h 19.5M · 2108 chamadas · GLM-5.3 89.3M
────────────────────────────────────────────────────────────────────────────────
Assinatura VALID · trimestral · $43.20 · renova 2026-11-16 (auto)
r = atualizar agora · q = sair a cada 60s · última há 5sRequisitos
- Instalado via npm: Node ≥ 20 (o pacote publica um bundle pronto, sem build na instalação)
- Rodando do código-fonte (clone): Node ≥ 23.6 (executa TypeScript nativo)
- Zero dependências de runtime;
vitest/typescript/@types/nodesão dev
Instalar
npm i -g glm-tanqueConfigurar a chave
O app busca sua chave ZAI_API_KEY (a mesma do dashboard/Client da z.ai)
nesta ordem — a primeira encontrada vence:
- Variável de ambiente:
export ZAI_API_KEY="sua-chave" .envno diretório atual (conveniente rodando do clone):cp .env.example .env # e cole a chave~/.config/glm-tanque/.env— o lugar natural pra instalação global (respeitaXDG_CONFIG_HOME):mkdir -p ~/.config/glm-tanque echo 'ZAI_API_KEY=sua-chave' > ~/.config/glm-tanque/.env chmod 600 ~/.config/glm-tanque/.env
Sem chave, o app sai com erro mostrando essas opções. Rodando do clone,
npm install antes só instala devDependencies (vitest etc.).
Nunca commitar o .env — ver docs/achados-glm-api.md §5.
Uso
glm-tanque # dashboard com auto-refresh (60s)
glm-tanque --once # imprime uma vez e sai (script/cron)
glm-tanque --interval 30 # refresh a cada 30s (mínimo 10)
glm-tanque -h # ajuda
npm start # do clone: equivale a glm-tanque
npm run once # do clone: equivale a --onceNo dashboard, o rodapé deixa a cadência explícita:
a cada 60s · última há 5s. O painel se atualiza sozinho (intervalo do
--interval, mínimo 10s); r só antecipa a próxima leitura e q/Ctrl-C
sai. As duas barras falam a mesma língua: ▓ consumo, ░ trilho, cores
por limiar (verde <50% · amarelo ≥50% · vermelho ≥80%).
Cota diária da semanal (pacing)
A janela semanal é grade fixa (o reset dispara no mesmo horário toda semana — 14:36 UTC — e a janela nova já nasce com reset agendado; observado 2026-08-23). Isso permite fatiá-la em 7 dias e responder "estou gastando a cota de quem?" — sem uma segunda barra pra isso:
- Uma barra só, idêntica à da 5h (
▓consumo,░trilho; 21 células = 3 por dia exatas). O pacing aparece como ponta vermelha no trecho além da cota do dia — gastei a cota de dias futuros. - Nota sob a barra dá o veredito em palavras:
cota dia 3/7: 42.9% · ✓ dentro da cota(ou⚠ Npp além da cota, a partir de 1pp — abaixo disso é ruído do percentual inteiro da API). - Override: consumo ≥80% pinta a barra toda de vermelho — tanque quase vazio é alarme absoluto, independente de pacing.
- Se o reset semanal vier ausente (janela sem uso), não existe dia N: a
nota vira
⚠ cota sem âncora (reset semanal ausente) · cores por 50/80e a barra volta aos limiares normais.
Escala em janelas 5h
Na mesma nota da cota, a cauda ≈ 4.3 janelas 5h restam traduz a semanal
pra unidade da janela 5h: 1 janela 5h cheia ≈ 20% da semanal → a semana
cabe em ≈ 5 janelas cheias. A razão foi medida no histórico (2026-08-23):
numa geração em que os dois buckets nasceram 0% juntos, o MESMO uso
absoluto rendeu 65pp na 5h e 13pp na semanal (razão 5.0; leituras vizinhas
dão 5.3 — os percentuais inteiros da API não separam mais que isso; 5 é o
modelo redondo).
Histórico
Cada leitura (watch ou --once) é persistida em data/history.jsonl
(só quando algo muda; sobrescreva o caminho com GLM_TANQUE_HISTORY).
O uso atual do histórico é detectar a queda anômala da semanal: o
contador cumulativo não pode cair sem trocar o reset — se cair, o ⚠ ganha
linha própria no dashboard (a nota de janelas segue embaixo). Leituras de
tokens também entram
no arquivo (tok7d/calls7d, opcionais para compatibilidade com linhas
antigas). Detalhes do contrato medido: docs/achados-glm-api.md.
Tokens absolutos
A linha Tokens soma o endpoint model-usage (janela de 7d): total do
período, últimas 24h, chamadas e por modelo. Dois avisos honestos: a
atribuição atrasa horas em relação ao % ao vivo das barras (fontes
diferentes — ver docs/achados-glm-api.md, addendum 2026-08-23), e os
timestamps dessa API são no fuso do servidor (UTC+8), convertidos
internamente. Leituras de tokens entram no history.jsonl (tok7d/
calls7d, opcionais para compatibilidade com linhas antigas).
Compartilhar sem publicar
O app não tem dependências de runtime — o pacote npm é só o código. Pra passar o tarball na mão:
npm pack # gera glm-tanque-<versão>.tgz
npm i -g ./glm-tanque-<versão>.tgzNa máquina de destino, configure a chave conforme Configurar a chave lá em cima.
Um binário único (Node SEA /
bun compile) dispensaria o Node na máquina alvo, mas custa ~100MB e uma etapa de build — fora do escopo por ora (ADR-0002).
Publicar no npm
Com npm whoami respondendo seu usuário, o fluxo de atualização é:
npm test && npm run typecheck # portão antes de tudo
git commit -m "..." # árvore limpa (npm version exige)
npm version patch # 0.1.1; minor/major conforme a mudança
npm publish # prepack roda o esbuild e gera dist/tanque.js
git push --follow-tags # no host — o container não tem credencial GitHubComo funciona
- Os dados vêm de dois endpoints não-oficiais da z.ai (descobertos por
engenharia reversa do dashboard deles) — detalhes e riscos em
docs/achados-glm-api.mdedocs/adr/0001. - A API só expõe percentual das janelas de token (sem total absoluto) — o app não promete o que a API não dá.
- Arquitetura:
env.ts(chave) →api.ts(2 GETs finos) →parse.ts(parser puro) →format.ts(frame puro) →tanque.ts(loop/teclas). Testes cobrem parser e formatador contra fixtures reais (fixtures/).
Testes / typecheck
npm test && npm run typecheckMapa dos docs
CONTEXT.md— vocabulário do domínio (tanque, janela, reset, assinatura…)docs/achados-glm-api.md— levantamento da API + revalidaçãodocs/adr/0001— usar endpoint não-oficial como fonte de dadosdocs/adr/0002— TUI zero-dependency com repintura ANSI, sem build
