Commits

ai-usage, día 2: las tres filas funcionales y el repositorio listo para abrir

Codex, MiniMax y z.ai de punta a punta con datos reales, diseño adaptable, JSON normalizado, modo --watch y auditoría de secretos antes de publicar.

Ayer fue el día de construir: ocho entradas en el registro, y el widget pasó de ser una especificación a tener las tres filas de los proveedores funcionales con datos reales. Cerré el día con el repositorio listo para abrir al público.

Purga del código heredado

El repositorio arrastraba el código semilla de Claude, Gemini y Antigravity del proyecto original, además de la maquinaria de i18n que el widget nuevo no utiliza. Corte limpio: sin funciones sin usar, sin alias ni reexportaciones. La lista queda en Codex, MiniMax y z.ai, y el linaje con fuelcheck queda documentado en el README y en la nota de arquitectura, no en código muerto.

Las tres filas, de punta a punta

Primera fila visible: el traductor de Codex convierte su respuesta en ventanas canónicas (corta y semanal) y el renderizador la pinta con semáforo, consumo, cuenta atrás y burbujas. La prueba es de cadena exacta contra el renderizador, la costura principal de la especificación, y se comprobó con las credenciales reales de la máquina.

MiniMax y z.ai entraron por la misma costura. MiniMax entrega el porcentaje restante por modelo: se normaliza al valor consumido y se colapsa en la ventana de peor consumo con el reinicio más próximo. z.ai codifica ventanas con pares unit/number y la clave sin el prefijo Bearer; los reinicios llegan en milisegundos y se guardan como instantes UTC. Con esto, las tres filas del widget se leen con el mismo idioma.

Diseño, JSON y configuración

La línea horizontal de tres proveedores ronda los 96 caracteres: en un panel estrecho no cabe. El diseño ahora elige la orientación vertical cuando la línea completa no cabe en el ancho real del terminal — para que encaje, no por proporciones — y una opción permite forzar cualquiera de las dos variantes. El JSON también cambió de filosofía: antes devolvía las cargas útiles crudas de cada API y un script tenía que aprender tres esquemas; ahora hay un modelo de dominio con ok, windows y error, y de paso se cerraron dos fugas (mensajes de error que arrastraban datos de la respuesta, y un reinicio del año 10000 que rompía la serialización). Y la configuración: solo se consultan los proveedores declarados en ~/.config/ai-usage/config.json, con prioridad de la clave escrita sobre la autodetectada.

Modo watch y los revisores caídos

--watch deja el widget fijo en un panel de tmux con intervalo configurable, y sale limpiamente con Ctrl-C: espera que termine la consulta en curso para no cortar una renovación de credenciales a medio escribir. Añadí la prueba del semáforo gris (error, sin cuota e ilimitado, código 90) y aquí ocurrió la anécdota del día: los dos revisores subagentes cayeron al instante con usage_limit_reached. La herramienta que vigila las cuotas, derribada por una cuota. Hice yo la revisión en línea, y valió la pena: de la revisión salió renombrar la prueba, que decía "ErrorAndNoQuota" pero también cubría la fila ilimitada.

Antes de abrir al público

Cerré el día con una auditoría de secretos sobre el árbol y los 28 commits: las credenciales viven fuera del repositorio y el único literal con forma de token es un JWT falso de prueba. Sí que había un artefacto inapropiado: un binario compilado de 11 MB versionado en la raíz, que retiré del control de versiones y añadí al .gitignore. El binario sigue siendo accesible en commits antiguos; si se quiere una historia completamente limpia, habría que reescribirla con git filter-repo antes de hacer público el repositorio.