Configuração
O OpenLimiter mantém tudo num único diretório de estado sob sua própria conta de usuário: um arquivo de configuração, um cache, um lock, e o documento manual opcional. Esta página diz onde isso fica e o que cada arquivo faz.
O diretório de estado
| plataforma | caminho |
|---|---|
| Windows | %LOCALAPPDATA%\openlimiter |
| macOS | ~/Library/Application Support/openlimiter |
| Linux | ${XDG_STATE_HOME:-~/.local/state}/openlimiter |
O diretório é criado com permissões restritivas onde a plataforma suporta isso. Um caminho que se revela um link simbólico é rejeitado, em vez de seguido.
O que existe dentro dele
| arquivo | papel |
|---|---|
openlimiter-config.json | Escrito por openlimiter init. Registra a lista de connectors, se cada um foi detectado, e o layout do statusline. |
openlimiter-cache.json | O único cache que todo comando lê e todo escritor funde. |
openlimiter.lock | Mantido só por escritores. Leitores nunca o tomam. |
manual.json | Opcional. Quota que você mantém à mão. Veja ingestão para o formato. |
Como o cache se comporta
- Um schema, um arquivo, um lock. Não há arquivos de estado concorrentes para reconciliar.
- Leitores nunca tomam o lock. Um leitor abre o arquivo, valida esse descritor aberto, e lê por meio dele, então um caminho trocado depois da checagem não consegue redirecionar os bytes.
- Escritores tomam o lock, e a leitura, a fusão, e a escrita acontecem todas dentro dele. Um lock com mais de cinco segundos é tratado como abandonado e retomado.
- Toda substituição é gravada em armazenamento estável antes da renomeação, então um leitor observa o conteúdo anterior ou o conteúdo novo, e nunca um arquivo parcial.
A saúde do cache fica visível a qualquer momento por openlimiter doctor, que imprime o status do cache e quantas linhas foram descartadas por falhar na validação.
O layout do statusline
O statusline desenha uma célula compacta por provedor: um nome, uma barra de cinco blocos, e a porcentagem, com o código de motivo geral e a recomendação de roteamento à frente da linha. Seis chaves no arquivo de configuração decidem como essa linha é montada, e openlimiter config é como elas são lidas e alteradas.
NO_COLOR=1 node packages/cli/dist/bin.js statusline
OpenLimiter NEAR_CAP PREFER ANTIGRAVITY CLAUDE ###.. 64.0% CODEX ####. 84.0% ANTIGRAVITY #.... 28.0% OPENCODE ####. 92.0%
MANUAL #.... 35.0% OPENROUTER ###.. 62.3%Cada chave
| chave | aceita | significado |
|---|---|---|
order | ids de provedor, separados por vírgula, ou NONE | A ordem em que as células aparecem. O que você lista vem primeiro; todo provedor que você deixa de fora segue a ordem embutida atrás dele, que é os planos de assinatura, e depois os meters de crédito e API. NONE é o caminho de volta para essa ordem embutida. Padrão NONE. |
meters | worst ou all | Um provedor com vários meters mostra o mais próximo do limite dele, ou todos como células separadas nomeadas PROVIDER:METER. Meters seguem a ordem sessão, diário, semanal, mensal, créditos. Padrão worst. |
width | um número inteiro de 40 a 400 | As colunas que uma linha pode gastar antes de a linha empilhar. Nada mede seu terminal: um host de statusline roda o comando sem nenhum terminal anexado, então o número aqui é o número respeitado. Padrão 140. |
rows | 1 ou 2 | Quantas linhas o layout pode usar. Padrão 2. |
bars | true ou false | False restaura a linha única e simples da 0.1.0, byte por byte. Padrão true. |
color | auto, always, ou never | auto segue o terminal, o que para um host de statusline geralmente significa sem cor, porque o host captura a saída em vez de entregar um terminal de verdade ao comando. always é como você diz que o host entende códigos de escape. Padrão auto. |
Lendo e escrevendo elas
openlimiter config get statusline
statusline.order=NONE
statusline.meters=worst
statusline.width=140
statusline.rows=2
statusline.bars=true
statusline.color=autoUma chave por vez, validada antes de ser escrita. Um valor que a chave não pode usar sai com 2 e nomeia o que ela esperava, e nada parcial é escrito, porque o documento inteiro é substituído atomicamente. Chaves de statusline são a única coisa que este comando altera: a lista de connectors pertence a openlimiter init, e qualquer outra chave sai com 2.
openlimiter config set statusline.order codex,claude
statusline.order=codex,claude
openlimiter config set statusline.meters all
statusline.meters=all
openlimiter config set statusline.width 12
openlimiter config: statusline.width must be a whole number from 40 to 400.
openlimiter config set statusline.theme dark
openlimiter config: unknown statusline key. Known keys: order, meters, width, rows, bars, color.Rodar openlimiter init de novo mantém o que já está configurado aqui e só redetecta os connectors. Uma chave de statusline que esta versão não consegue ler recorre ao próprio padrão em vez de parar o desenho, então um erro de digitação num campo nunca custa os outros cinco.
Quando a linha fica sem espaço
A linha empilha em vez de truncar. Uma quebra acontece entre duas células e nunca dentro de uma, e duas linhas é o teto. Além disso, os provedores mais perto do limite deles são os mantidos, e a última linha termina dizendo quantos ela não conseguiu mostrar.
openlimiter config set statusline.rows 1 && NO_COLOR=1 node packages/cli/dist/bin.js statusline
OpenLimiter NEAR_CAP PREFER ANTIGRAVITY CODEX ####. 84.0% OPENCODE ####. 92.0% +4 moreA linha da 0.1.0, sob pedido
O formato antes deste layout era uma linha única e simples, sem barras. Se você escreveu um script contra ele, bars false a devolve exatamente, e um teste fixa essa string exata para ela não conseguir desviar.
openlimiter config set statusline.bars false && node packages/cli/dist/bin.js statusline
OpenLimiter NEAR_CAP CLAUDE 64.0% OPENROUTER 62.3% CODEX 84.0% ANTIGRAVITY 28.0% OPENCODE 92.0% MANUAL 35.0% PREFER ANTIGRAVITYConfigurações do Claude Code
Use o caminho absoluto do seu clone. Barras normais funcionam em qualquer plataforma, incluindo Windows.
{
"statusLine": {
"type": "command",
"command": "node /absolute/path/to/openlimiter/packages/cli/dist/bin.js statusline"
},
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "node /absolute/path/to/openlimiter/packages/cli/dist/bin.js hook"
}
]
}
]
}
}Qual dos dois escreve
Só o statusline. É o caminho que recebe o payload da sessão, então é o caminho que atualiza o cache. O hook lê e nunca escreve.
Credenciais
A chamada da biblioteca de credenciais fica atrás de uma interface, e o adaptador é stubado nesta versão, então openlimiter init não consegue guardar uma chave até um driver ser fornecido. Mais nada na sua máquina é tocado.
Detecção de connector
A detecção é uma função pura do ambiente que a CLI entrega a um connector. Fatos que só a CLI consegue observar, como um documento manual sentado no diretório de estado, chegam como marcadores explícitos, por isso openlimiter doctor nunca afirma que um connector está pronto quando ele não conseguiria receber dados.
openlimiter doctor
CONNECTOR DETECTED FRESHNESS DRIFT
claude no unknown UNVERIFIED
openrouter no unknown UNVERIFIED
codex no unknown UNVERIFIED
antigravity no unknown UNVERIFIED
opencode no unknown UNVERIFIED
manual yes fresh UNVERIFIED
CACHE ok DROPPED 0Um cache que não consegue ser interpretado, ou um que foi interpretado com linhas descartadas, adiciona mais uma linha em vermelho dizendo isso. Ele reporta contra o cache, não contra um provedor, porque um arquivo corrompido não pode ser confiável para dizer de quem era a leitura que guardava.