Skip to content

Capacidades del sistema: Multilingüe/Tema/Actualizaciones/Inicio automático/HTTP API Server

Cambias el tema a dark pero la interfaz sigue en claro; cierras la ventana pero el proceso sigue en segundo plano; quieres que herramientas externas cambien la cuenta actual pero no quieres exponer el proxy inverso a la red local.

Esta lección se centra en las "capacidades del sistema" de Antigravity Tools: idioma, tema, actualizaciones, bandeja/inicio automático, y el HTTP API Server para que lo llamen programas externos.

¿Qué son las capacidades del sistema?

Capacidades del sistema se refiere a las "capacidades de producto" de Antigravity Tools como aplicación de escritorio: cambio de idioma y tema de la interfaz, verificación y actualización de actualizaciones, permanencia en la bandeja tras cerrar la ventana e inicio automático, y proporcionar un HTTP API Server que solo se vincula a 127.0.0.1 para que lo llamen programas externos.

Lo que podrás hacer al finalizar

  • Cambiar idioma/tema y entender cuáles tienen "efecto inmediato"
  • Entender la diferencia entre "cerrar ventana" y "salir del programa", y qué puede hacer el menú de la bandeja
  • Saber las condiciones de activación, el intervalo y el archivo de persistencia de la verificación automática de actualizaciones
  • Habilitar el HTTP API Server y usar curl para verificar estado y cambio de cuenta

🎒 Preparativos previos

Enfoque central

Divide estas capacidades en dos categorías, será más fácil de recordar:

  1. Capacidades "impulsadas por configuración": idioma y tema se escriben en gui_config.json (el frontend llama a save_config).
  2. Capacidades con "persistencia independiente": configuración de actualizaciones y configuración de HTTP API cada una tiene su propio archivo JSON; la bandeja y el comportamiento de cierre son controlados por el lado de Tauri.

Sigue mis pasos

Paso 1: Cambiar idioma (efecto inmediato + persistencia automática)

Por qué El cambio de idioma es lo que más fácilmente hace pensar que "necesita reinicio". La implementación aquí es: la UI cambia inmediatamente, y al mismo tiempo escribe language en la configuración.

Acción: abre Settings -> General, en el menú desplegable de idioma selecciona un idioma.

Deberías ver que dos cosas casi simultáneamente ocurren:

  • La UI cambia inmediatamente al nuevo idioma (el frontend llama directamente a i18n.changeLanguage(newLang)).
  • La configuración se persiste (el frontend llama a updateLanguage(newLang), internamente activa save_config).

¿De dónde vienen los paquetes de idioma?

El frontend inicializó recursos multilingües con i18next y estableció fallbackLng: "en". Es decir: cuando una key falta de traducción, volverá al inglés.

Paso 2: Cambiar tema (light/dark/system)

Por qué El tema no solo afecta CSS, también afecta el color de fondo de la ventana de Tauri, el data-theme de DaisyUI y la clase dark de Tailwind.

Acción: en Settings -> General, cambia el tema a light / dark / system.

Deberías ver:

  • El tema surte efecto inmediatamente (ThemeManager lee la configuración y la aplica a document.documentElement).
  • Cuando el tema es system, los cambios de oscuro/claro del sistema se sincronizan en tiempo real a la aplicación (escucha prefers-color-scheme).

Una excepción de Linux

ThemeManager intentará llamar a getCurrentWindow().setBackgroundColor(...) para establecer el color de fondo de la ventana, pero en la plataforma Linux omitirá este paso (en el código fuente hay comentarios explicando: ventanas transparentes + softbuffer pueden causar bloqueos).

Paso 3: Inicio automático (y por qué viene con --minimized)

Por qué El inicio automático no es un "campo de configuración", es un elemento de registro del nivel del sistema (plugin de autostart de Tauri).

Acción: en Settings -> General, configura "Inicio automático al arrancar" como habilitado/deshabilitado.

Deberías ver:

  • Al cambiar, llama directamente al backend toggle_auto_launch(enable).
  • Al inicializar la página, llama a is_auto_launch_enabled(), mostrando el estado real (no depende del caché local).

Complemento: al inicializar el plugin autostart en la aplicación, se pasó el parámetro --minimized, por lo que "iniciar con el sistema" generalmente iniciará en forma minimizada/en segundo plano (el comportamiento específico depende de cómo el frontend maneje ese parámetro).

Paso 4: Entender "cerrar ventana" y "salir del programa"

Por qué Muchas aplicaciones de escritorio son "cerrar = salir", pero el comportamiento predeterminado de Antigravity Tools es "cerrar = ocultar en la bandeja".

Deberías saber:

  • Después de hacer clic en el botón de cerrar de la ventana, Tauri interceptará el evento de cierre y llamará a hide(), en lugar de salir del proceso.
  • El menú de la bandeja tiene Show/Quit: para salir completamente, deberías usar Quit.
  • El texto de la bandeja sigue config.language (al crear la bandeja, se lee el idioma de configuración y se toma el texto traducido; después de actualizar la configuración, escuchará el evento config://updated para actualizar el menú de la bandeja).

Paso 5: Verificación de actualizaciones (activación automática + verificación manual)

Por qué En actualizaciones se usan simultáneamente dos cosas:

  • Lógica personalizada de "verificación de versión": obtiene la última versión de GitHub Releases y juzga si hay actualización.
  • Tauri Updater: es responsable de descargar e instalar, luego relaunch().

Puedes usarlo así:

  1. Verificación automática: después de que la aplicación inicia, llamará a should_check_updates, si necesita verificar mostrará UpdateNotification, e inmediatamente actualizará last_check_time.
  2. Verificación manual: en la página Settings, haz clic en "Verificar actualizaciones" (llama a check_for_updates, y muestra el resultado en la UI).

¿De dónde viene el intervalo de actualización?

El backend persiste la configuración de actualización en update_settings.json en el directorio de datos, por defecto auto_check=true, check_interval_hours=24.

Paso 6: Habilitar HTTP API Server (solo vincula a la máquina local)

Por qué Si quieres que programas externos (como plugin de VS Code) "cambien cuenta/actualicen cuota/lean registros", el HTTP API Server es más adecuado que el puerto de proxy inverso: se vincula fijamente a 127.0.0.1, solo abierto a la máquina local.

Acción: en Settings -> Advanced, en el área "HTTP API":

  1. Activa el interruptor de habilitación.
  2. Establece el puerto y haz clic en guardar.

Deberías ver: la UI mostrará "necesita reiniciar" (porque el backend solo lee http_api_settings.json e inicia el servicio al arrancar).

Paso 7: Verificar HTTP API con curl (estado/cuenta/cambio/registros)

Por qué Necesitas un ciclo de verificación repetible: poder pasar health, poder listar cuentas, poder activar cambio/actualización y entender que son tareas asíncronas.

El puerto predeterminado es 19527. Si cambiaste el puerto, reemplaza 19527 con tu valor real abajo.

bash
 # Verificar estado
curl -sS "http://127.0.0.1:19527/health" && echo

 # Listar cuentas (incluyendo resumen de cuota)
curl -sS "http://127.0.0.1:19527/accounts" | head -n 5

 # Obtener cuenta actual
curl -sS "http://127.0.0.1:19527/accounts/current" | head -n 5

 # Activar cambio de cuenta (nota: devuelve 202, ejecución asíncrona en segundo plano)
curl -sS -i \
  -H 'Content-Type: application/json' \
  -d '{"account_id":"<account_id>"}' \
  "http://127.0.0.1:19527/accounts/switch"

 # Activar actualización de todas las cuotas (también 202, ejecución asíncrona)
curl -sS -i -X POST "http://127.0.0.1:19527/accounts/refresh"

 # Leer registros de proxy (limit/offset/filter/errors_only)
curl -sS "http://127.0.0.1:19527/logs?limit=50&offset=0&filter=&errors_only=false" | head -n 5
powershell
 # Verificar estado
Invoke-RestMethod "http://127.0.0.1:19527/health"

 # Listar cuentas
Invoke-RestMethod "http://127.0.0.1:19527/accounts" | ConvertTo-Json -Depth 5

 # Obtener cuenta actual
Invoke-RestMethod "http://127.0.0.1:19527/accounts/current" | ConvertTo-Json -Depth 5

 # Activar cambio de cuenta (devuelve 202)
$body = @{ account_id = "<account_id>" } | ConvertTo-Json
Invoke-WebRequest -Method Post -ContentType "application/json" -Body $body "http://127.0.0.1:19527/accounts/switch" | Select-Object -ExpandProperty StatusCode

 # Activar actualización de todas las cuotas (devuelve 202)
Invoke-WebRequest -Method Post "http://127.0.0.1:19527/accounts/refresh" | Select-Object -ExpandProperty StatusCode

 # Leer registros de proxy
Invoke-RestMethod "http://127.0.0.1:19527/logs?limit=50&offset=0&filter=&errors_only=false" | ConvertTo-Json -Depth 5

Deberías ver:

  • /health devuelve JSON en estilo {"status":"ok","version":"..."}.
  • /accounts/switch devuelve 202 (Accepted), y indica "task started". El cambio real se ejecuta en segundo plano.

Punto de verificación ✅

  • Puedes explicar: por qué idioma/tema "surtan efecto inmediatamente al cambiar", pero el puerto de HTTP API necesita reinicio
  • Puedes explicar: por qué cerrar la ventana no sale, y dónde realmente salir
  • Puedes usar curl para pasar /health y /accounts, y entender que /accounts/switch es asíncrono

Advertencias de trampas

  1. El HTTP API Server se vincula fijamente a 127.0.0.1, es diferente de proxy.allow_lan_access.
  2. La lógica de "si verificar" de la verificación de actualizaciones se decide al inicio de la App; una vez activada, primero actualizará last_check_time, incluso si la verificación posterior falla, no volverá a mostrar ventana en poco tiempo.
  3. "Cerrar ventana sin salir" es por diseño: para liberar recursos del proceso, usa Quit de la bandeja.

Resumen de esta lección

  • Idioma: UI cambia inmediatamente + escribe de vuelta a configuración (i18n.changeLanguage + save_config)
  • Tema: por ThemeManager unifica a data-theme, clase dark y color de fondo de ventana (Linux tiene excepción)
  • Actualizaciones: al inicio decide si mostrar ventana según update_settings.json, instalación es responsabilidad de Tauri Updater
  • HTTP API: habilitado por defecto, solo accesible por máquina local, configuración persiste http_api_settings.json, cambiar puerto necesita reinicio

Vista previa de la próxima lección

La próxima lección entrará en Despliegue de servidor: Docker noVNC vs Headless Xvfb (advanced-deployment), moviendo el escritorio a NAS/servidor.


Apéndice: Referencia de código fuente

Haz clic para expandir ubicaciones de código fuente

Hora de actualización: 2026-01-23

TemaRuta de archivoLíneas
Inicialización de i18n y fallbacksrc/i18n.ts1-67
Settings: idioma/tema/inicio automático/configuración de actualizaciones/configuración de HTTP APIsrc/pages/Settings.tsx16-730
App: sincronizar idioma + activar verificación de actualizaciones al iniciosrc/App.tsx52-124
ThemeManager: aplicar tema, escuchar tema del sistema, escribir localStoragesrc/components/common/ThemeManager.tsx1-82
UpdateNotification: verificar actualizaciones, descargar automáticamente e instalar y relaunchsrc/components/UpdateNotification.tsx1-217
Verificación de actualizaciones: GitHub Releases + check intervalsrc-tauri/src/modules/update_checker.rs1-187
Bandeja: generar menú por idioma + escuchar config://updated para actualizarsrc-tauri/src/modules/tray.rs1-255
Guardar configuración: emitir config://updated + recarga en caliente de proxy inverso en ejecuciónsrc-tauri/src/commands/mod.rs296-334
Comando de inicio automático: toggle/is_enabled (compatibilidad disable de Windows)src-tauri/src/commands/autostart.rs1-39
Tauri: inicializar autostart/updater + cerrar ventana a hide + iniciar HTTP APIsrc-tauri/src/lib.rs50-160
HTTP API: configuración persistente + rutas (health/accounts/switch/refresh/logs) + solo vincular 127.0.0.1src-tauri/src/modules/http_api.rs1-95
HTTP API: Server bind y registro de rutassrc-tauri/src/modules/http_api.rs51-94
Comandos de configuración de HTTP API: get/savesrc-tauri/src/commands/mod.rs773-789