npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

glm-tanque

v0.2.0

Published

Painel no terminal com o uso do plano GLM Coding (z.ai): janelas 5h/semanal, tokens e assinatura.

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á 5s

Requisitos

  • 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/node são dev

Instalar

npm i -g glm-tanque

Configurar a chave

O app busca sua chave ZAI_API_KEY (a mesma do dashboard/Client da z.ai) nesta ordem — a primeira encontrada vence:

  1. Variável de ambiente:
    export ZAI_API_KEY="sua-chave"
  2. .env no diretório atual (conveniente rodando do clone):
    cp .env.example .env   # e cole a chave
  3. ~/.config/glm-tanque/.env — o lugar natural pra instalação global (respeita XDG_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 --once

No 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/80 e 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>.tgz

Na 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 GitHub

Como 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.md e docs/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 typecheck

Mapa dos docs

  • CONTEXT.md — vocabulário do domínio (tanque, janela, reset, assinatura…)
  • docs/achados-glm-api.md — levantamento da API + revalidação
  • docs/adr/0001 — usar endpoint não-oficial como fonte de dados
  • docs/adr/0002 — TUI zero-dependency com repintura ANSI, sem build