Repository navigation
feat(providers): proveedor Antigravity con cuota por modelo del IDE - #207
Conversation
Antigravity no deja una sesión reutilizable en disco y su cuota es un
grupo propio, distinto del de Gemini CLI. El proveedor consulta el
servidor de lenguaje local que arranca el IDE (GetUserStatus, no
oficial): token CSRF desde la línea de comandos del proceso lanzado con
--app_data_dir antigravity y puerto HTTP desde language_server.log del
arranque actual (mismo pid). La petición va solo a 127.0.0.1 y el token
no se guarda.
Un medidor por modelo agrupando las variantes de esfuerzo (High/Medium/
Low), el más gastado primero; plan desde userTier.description. La
ventana (5 h o semanal) se deduce del tiempo hasta el reinicio. Con el
IDE cerrado el informe queda en Warning con instrucciones.
Config AntigravityConfig { enabled } (sin cuentas adicionales), pestaña
en Ajustes, tipos TS, visibilidad, dataKey, i18n, monograma AG y filas
en los README.
|
@eichhorn-micaela muchas gracias por la contribución. El proveedor está bien planteado: viene desactivado por defecto, la consulta va solo a Antes de activar la revisión y los workflows de CI necesitamos estos cambios: 1. Ventana mal deducida cerca del reinicio (
|
…instante Una cuota semanal a la que le quedan menos de 5 h para el reinicio se clasificaba como ventana de 5 h, con ventana y ritmo incorrectos en sus últimas horas. Ahora la ventana sale de señales fiables: más de 5 h hasta el reinicio solo puede ser semanal; un reinicio ya visto conserva la ventana deducida entonces (memoria en proceso por medidor); un reinicio que cambió y cae dentro de 5 h es una ventana de 5 h; y los modelos con el mismo resetTime exacto comparten ventana. Sin ninguna señal, window_seconds queda en None. Tests del borde semanal con menos de 5 h, del aprendizaje de 5 h por reinicio cambiado, del grupo y de reinicios lejanos o pasados. Refs: feedback de review en egdev6#207
… documentado Indica en los README y en la pestaña de Ajustes que por ahora solo se verificó en Windows, y añade Antigravity (GetUserStatus interno) al aviso de endpoints no documentados. Refs: feedback de review en egdev6#207
Conflicto en Settings.tsx: main movió los paneles de suscripción a componentes con catálogos ES/EN; la sección de Antigravity pasa a AntigravityPanel con sus claves en es.ts/en.ts. docs/i18n-inventory.md se toma de main y se regenera aparte.
|
Gracias por la revisión. Apliqué los tres puntos:
El inventario i18n está regenerado en 78392f4. Además integré Verificación local tras el merge: |
…aneles Mismo patrón que el resto de paneles migrados en C1b (egdev6#217): español verbatim con locale es e inglés sin restos de español con locale en. Refs: coordinación C1b / egdev6#207
|
Sobre la coordinación con C1b: como #217 entró antes, el panel de Antigravity ya está migrado a los catálogos ES/EN ( Para completar el patrón, en 8ff9070 añadí sus casos a
El panel no usa Verificación: |
|
@eichhorn-micaela gracias por los cambios. Los avisos de Windows y del endpoint interno están resueltos, y la migración de Por ejemplo, todo en UTC: el 27 de octubre a las 15:37 se observa un reinicio semanal del 29 de octubre a las 18:37 y se aprende ¿Puedes añadir ese caso de salto semanal tras una pausa y hacer la inferencia conservadora cuando falte evidencia? En una transición ambigua es preferible |
…nsultas Un reinicio que cambia y cae dentro de 5 h solo demuestra una ventana de 5 h si la consulta anterior es reciente. Si el reinicio cambió, la ventana nueva empezó después de esa consulta; una semanal acabaría al menos 7 días después de ella y no podría quedarle ≤ 5 h antes de 7 días − 5 h. Ahora se guarda cuándo se vio cada reinicio y, tras una pausa mayor (Antigravity cerrado), la transición es ambigua y queda en None en vez de aprender 5 h. Tests: el salto semanal tras una pausa (27 oct → 5 nov) del review y la cota del intervalo a ambos lados del límite. Refs: feedback de review en egdev6#207
|
Hola @eichhorn-micaela, gracias por la contribución. He revisado el commit
Validación: las 13 pruebas del proveedor y 3 del modelo pasan en un harness aislado. Las tres pruebas adicionales que exigen aislamiento del proxy, coincidencia exacta del PID y delimitación del bloque fallan y reproducen los problemas anteriores. No ejecuté la suite completa ni hice una prueba con el IDE real. ¿Puedes añadir estas regresiones junto con las correcciones? |
…del log de otros procesos P1: la consulta usaba el cliente HTTP compartido, que respeta HTTP_PROXY/ALL_PROXY; sin un NO_PROXY que excluya loopback, el token X-Codeium-Csrf-Token llegaba al proxy aunque la URL fuese 127.0.0.1. Ahora va con un cliente dedicado (local_client) con no_proxy(), sin seguir redirecciones y con timeout propio. P2: http_port buscaba «pid N» como subcadena (pid 123 coincidía con pid 1234) y, si el bloque de ese pid no tenía puerto HTTP, seguía por los arranques posteriores. Ahora compara el pid completo del marcador de arranque y solo mira su bloque, hasta el siguiente «Starting…». Regresiones (RED observado antes del arreglo): pid exacto, bloque delimitado, proxy configurado que no recibe la consulta y redirección que no se sigue, con servidores de prueba en loopback. Refs: feedback de review en egdev6#207
|
Hola @eichhorn-micaela, he revisado el head En la comprobación local pasan los 17 tests de Antigravity, los 788 tests del frontend, TypeScript y el inventario i18n. No he probado el IDE real en Windows ni ejecutado la suite Rust completa; tampoco pude comprobar el formato porque el entorno no tiene ¡Muchas gracias por aportar el proveedor Antigravity y por atender las revisiones con sus pruebas de regresión! |
|
Gracias por la revisión. Los dos puntos eran correctos y están corregidos en 1d7c4c8, con sus regresiones. Antes de arreglarlos vi fallar cada test por el motivo que describiste. P1 · Proxy. La consulta ya no usa el cliente compartido. Va con un cliente dedicado (
Probé el proxy configurándolo en el builder, no con variables de entorno, para no mutar el entorno global en tests que corren en paralelo. P2 · Puerto.
Verificación
|
…nes) en feat/wsl-adapter Trae a la rama de la PR el main vigente de egdev6/quorb (f3897bc, incluye egdev6#207 y egdev6#219). docs/i18n-inventory.md se regenera desde el árbol fusionado en un commit aparte para que el header refleje el head real. Co-Authored-By: Claude Code <noreply@anthropic.com>
1. shell_strategy no confunde error WSL con ausencia de Bash: `control_raw` devuelve el output crudo, así que se clasifica con `errors::classify`: si la salida contiene un token WSL reconocido (p. ej. WSL_E_DISTRO_NOT_FOUND porque la distro desapareció entre la enumeración y la sonda), se propaga el error real en vez de caer a `ShPosix` como estrategia válida. El fallback a `ShPosix` queda solo para el caso normal `command -v` sin bash (salida vacía, sin token). Regresión: shell_strategy_propagates_wsl_distro_loss_not_sh_posix. 2. kill_remote_process no escala tras observar la muerte: si una sonda `kill -0` ve el PID muerto, se rompe y NO se vuelve a comprobar ni se envía KILL (un `kill -0` posterior podría devolver 0 porque el PID fue reutilizado por otro proceso — señalizar al proceso equivocado). La identidad de la instancia se protege observando la desaparición, no volviendo a preguntar por el número. Test determinista case_disappears_then_reappears: PID que desaparece y reaparece con otra identidad → no recibe KILL. 3. session_path usa semántica del GUEST (POSIX), no del host Windows: `Path::is_absolute()` en Windows devuelve false para `/home/u/...` y true para `C:\...`, justo al revés del guest. Nuevo helper `is_guest_absolute` (empieza por `/`) y tests: una ruta Windows explícita se rechaza en modo WSL, y `/etc/passwd` como relativa del proveedor se rechaza aunque en Windows no sea "absoluta". docs/i18n-inventory.md regenerado tras integrar main del upstream (incluye egdev6#207 y egdev6#219) y los cambios de este commit. Co-Authored-By: Claude Code <noreply@anthropic.com>
Issue relacionada
Issue: no hay issue previa (contribución de un proveedor nuevo).
ODD: no aplica.
Alcance
Nuevo proveedor Antigravity (IDE de Google): cuota del agente por modelo, la misma que muestra el panel de cuotas del IDE.
oauth_creds.jsoncomo en Gemini CLI) y su cuota es un grupo propio, distinto del de Gemini CLI. Por eso no sirve reutilizar el proveedor Gemini.POST http://127.0.0.1:<puerto>/exa.language_server_pb.LanguageServerService/GetUserStatus(endpoint no oficial).--csrf_tokendel procesolanguage_serverlanzado con--app_data_dir antigravity. Así se descartan Windsurf y otros IDEs que usan el mismo binario. Sin el token, el servidor responde 401.listening on random port at N for HTTPdelanguage_server.log, solo si pertenece al arranque del mismo pid.127.0.0.1y el token no se persiste.userTier.description(p. ej. «Google AI Pro»). La ventana (5 h o semanal) se deduce del tiempo que falta para el reinicio, porque la respuesta no la incluye.Warningcon instrucciones, sin error.AntigravityConfig { enabled }, pestaña en Ajustes, tipos TS, visibilidad,dataKey, i18n, monogramaAG,OFFICIAL_USAGE_URLy filas en los README.Exclusiones: sin cuentas adicionales (en la máquina hay una sola sesión del IDE, así que no se añade a
ACCOUNT_PROVIDERS). En Windows, el proceso se descubre conGet-CimInstance, sin ventana. Linux/macOS usanpsy la carpeta de configuración del SO, pero solo se probó en Windows.Coordinación
Contribuidor: @eichhorn-micaela
Evidencia de asignación o acuerdo: N/A
Aceptación y validación
fetchreal devolvióOk, plan «Google AI Pro» y 5 medidores (Claude Opus 5.5, Claude Sonnet 5.5, GPT-OSS 120B, Gemini 3.8 Flash con ventana de 5 h; Gemini 4 Argon con ventana semanal).cargo test --locked: 335 OK (7 nuevos enproviders::antigravity; base 328), 1 ignorado preexistente.cargo fmt --all -- --check: limpio.cargo clippy --all-targets: sin avisos en el código nuevo.npm run typecheck: limpio.vitest run --dir src: 731 OK.node scripts/i18n-inventory.mjs --check: OK (inventario regenerado en un commit aparte).npm run app:build: OK, generaQuorb_0.8.0_x64-setup.exey el.msi.scripts/setup-signing.test.mjsfallan en local conEPERMal crear symlinks (Windows sin modo desarrollador). Son ajenos a este cambio. No se probó en Linux/macOS.