Skip to content

fix(stats): record requests on the v2 path and persist immediately (2.4.3) - #73

Merged
JoshRob297 merged 1 commit into
mainfrom
fix/stats-v2-recording
Oct 31, 2026
Merged

JoshRob297 merged 1 commit into
mainfrom
fix/stats-v2-recording

Conversation

@JoshRob297

Copy link
Copy Markdown
Owner

antigravity_stats y /antigravity-stats mostraban Sin actividad registrada aun con cualquier volumen de trafico. Verificado: no era falta de datos, era que nadie los escribia.

Causa (tres fallos encadenados)

  1. La ruta v2 nunca tocaba EngineStatsManager. Solo actualizaba el AccountManager. Los unicos que escribian eran plugin.ts (interceptor v1) y rotation.ts (seleccion v1).
  2. El debounce de 1.5 s tiraba las sesiones cortas. opencode run termina antes de que dispare el timer, asi que esas peticiones no dejaban rastro.
  3. El servidor de fondo se quedaba con la foto del arranque. getData() y formatStatsReport() leian memoria; si otro proceso escribia el archivo, no lo veia.

Cambios

  • Registro en el hook http.response antes del return temprano cuando la cola de pendientes esta vacia: despues de una rotacion por 429, la peticion que finalmente responde 200 es justo la que hay que contar, y antes se perdia.
  • Se cuenta con el ultimo intento de la sesion (lastAttemptBySession), no con la cola: el hook de retry tambien hace dequeue, lo que desalineaba la atribucion.
  • 429/403 se cuentan como rate limit; un 404 de entitlement no se cuenta como error (es falta de capacidad, no salud de la cuenta); el error de transporte solo se cuenta cuando no hubo respuesta HTTP, para no duplicar.
  • Guardado sincrono en cada evento; refreshFromDisk() recarga el archivo si otro proceso lo escribio y respeta incrementos sin guardar.

Verificacion

Prueba real con las tres cuentas del pool (dos Free con la semana en 0%, una con grant):

ACCOUNT                   HEALTH    REQS (OK/429/ERR)   STATUS
hrjoces22                 100%      0/2/0               STANDBY
joshuaadair.hr            100%      1/0/0               ACTIVE

Antes de esta prueba el archivo no existia. Coincide con la cuota medida: las dos Free devuelven 429 y la que tiene cuota sirve la peticion.

  • npx tsc --noEmit limpio.
  • npx vitest run: 43 archivos, 1154 tests, 25 todo (+4 nuevos sobre conteo, persistencia, recuperacion entre procesos y formato del reporte).
  • npm run build y dist/ regenerado en el mismo commit.
  • Docs EN/ES: que se cuenta, por que un 404 no es error, y que el archivo no contiene prompts.

The report always said "sin actividad" because nothing on the v2 path wrote to
EngineStatsManager, the 1.5s save debounce dropped one-shot runs, and a
long-lived server never re-read the file.

- Count each response where it happens, before the pending-queue early return
  that swallowed the success after a rotation: success on the serving account,
  429/403 as a rate limit, other failures as errors, 404 entitlement misses
  excluded from health.
- Write counters synchronously so `opencode run` leaves a trace.
- Reload the file when another process wrote it, keeping unsaved increments.
@github-actions

Copy link
Copy Markdown

Automated verification

Check Result
typecheck success
tests success
build + dist success
branch clean
typecheck

> opencode-antigravity-auth@2.4.3 typecheck
> tsc --noEmit

tests

> opencode-antigravity-auth@2.4.3 test
> vitest run


�[1m�[30m�[46m RUN �[49m�[39m�[22m �[36mv5.0.5 �[39m�[90m/home/runner/work/opencode-antigravity-auth/opencode-antigravity-auth�[39m

 �[32m✓�[39m src/plugin/transform/gemini.test.ts �[2m(�[22m�[2m130 tests�[22m�[2m)�[22m�[32m 49�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/request-helpers.test.ts �[2m(�[22m�[2m152 tests�[22m�[2m)�[22m�[32m 97�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/accounts.test.ts �[2m(�[22m�[2m110 tests�[22m�[2m)�[22m�[32m 104�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/transform/claude.test.ts �[2m(�[22m�[2m67 tests�[22m�[2m)�[22m�[32m 34�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/quota.test.ts �[2m(�[22m�[2m23 tests�[22m�[2m)�[22m�[32m 104�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/request.test.ts �[2m(�[22m�[2m110 tests�[22m�[2m)�[22m�[32m 136�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/rotation.test.ts �[2m(�[22m�[2m59 tests�[22m�[2m)�[22m�[32m 76�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/transform/cross-model-sanitizer.test.ts �[2m(�[22m�[2m28 tests�[22m�[2m)�[22m�[32m 16�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/transform/model-resolver.test.ts �[2m(�[22m�[2m55 tests�[22m�[2m)�[22m�[32m 26�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/storage.test.ts �[2m(�[22m�[2m22 tests�[22m�[2m)�[22m�[32m 29�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/config/updater.test.ts �[2m(�[22m�[2m18 tests�[22m�[2m)�[22m�[32m 42�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/cross-model-integration.test.ts �[2m(�[22m�[2m14 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/persist-account-pool.test.ts �[2m(�[22m�[2m38 tests�[22m�[2m | �[22m�[90m25 todo�[39m�[2m)�[22m�[32m 24�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/stores/signature-store.test.ts �[2m(�[22m�[2m30 tests�[22m�[2m)�[22m�[32m 21�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/thinking-recovery.test.ts �[2m(�[22m�[2m29 tests�[22m�[2m)�[22m�[32m 16�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/config/model-discovery.test.ts �[2m(�[22m�[2m44 tests�[22m�[2m)�[22m�[32m 26�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/cache.test.ts �[2m(�[22m�[2m25 tests�[22m�[2m)�[22m�[32m 23�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/auto-update-checker/index.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[32m 28�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/antigravity-first-fallback.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 23�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/version.test.ts �[2m(�[22m�[2m15 tests�[22m�[2m)�[22m�[32m 60�[2mms�[22m�[39m
 �[32m✓�[39m src/v2/adapter.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 41�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/recovery.test.ts �[2m(�[22m�[2m30 tests�[22m�[2m)�[22m�[32m 24�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/auth.test.ts �[2m(�[22m�[2m19 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/model-entitlements.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/auto-update-checker/checker.test.ts �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[32m 38�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/refresh-queue.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/debug.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 25�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/search.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 14�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/quota-fallback.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 260�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/errors.test.ts �[2m(�[22m�[2m16 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/safety.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 30�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/stats.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 63�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/ui/auth-menu.test.ts �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[32m 34�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/logging-utils.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 28�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/model-specific-quota.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/core/streaming/safety-shield.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/token.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 38�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/historical-pruning.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/ui/ansi.test.ts �[2m(�[22m�[2m13 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/config/models.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/logger.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 17�[2mms�[22m�[39m
 �[32m✓�[39m src/plugin/config/schema.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/constants.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m43 passed�[39m�[22m�[90m (43)�[39m
�[2m      Tests �[22m �[1m�[32m1154 passed�[39m�[22m�[2m | �[22m�[90m25 todo�[39m�[90m (1179)�[39m
�[2m   Start at �[22m 14:24:10
�[2m   Duration �[22m 4.73s�[2m (transform 37%, import 34%, tests 23%, worker 6%)�[22m

�[2m    Isolate �[22m �[33m43 workers spawned�[39m�[2m · ~140ms startup each (spawn + environment, per file)�[22m
�[2m            �[22m �[2mat least ~1.86s faster with �[22m�[33misolate: false�[39m�[2m — reuses workers across files instead of one per file�[22m

build

> opencode-antigravity-auth@2.4.3 build
> tsc -p tsconfig.build.json

@JoshRob297
JoshRob297 marked this pull request as ready for review October 31, 2026 16:47
@JoshRob297
JoshRob297 merged commit 852b6f1 into main Oct 31, 2026
1 check passed
@JoshRob297
JoshRob297 deleted the fix/stats-v2-recording branch October 31, 2026 16:47
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