feat(city): add airports, ATC agent, luminous signs, and AI model fallback chain

- Add two airports (north/south) with full geometry: runways, taxiways,
  aprons, terminals, hangars, stands, and helipads; walkable airport
  grounds extend beyond city bounds.
- Introduce ATC AI agent ("Torre de Controle City10") using AI_ATC_MODEL
  to generate takeoff clearances; includes dispatch endpoint with
  30-second cooldown and deterministic fallback on failure.
- Implement AI model fallback chain: preferred model → AI_FALLBACK_MODEL
  before failing, applied in ChatController and PersonTalkController.
- Add luminous sign labels (letreiros) for plazas, beach, food, hospital,
  school, city hall, and airports with day/night glow.
- Fix city presence cache: compute is_me per viewer instead of baking
  into shared per-second cache to prevent cross-user flag leakage.
- Add tests: AirportTest, CityPresenceTest, SignLabelsTest, and
  PersonTalkTest fallback model retry scenario.
This commit is contained in:
2026-10-31 22:06:18 -03:00
parent a12807492f
commit e7498e1566
26 changed files with 2226 additions and 108 deletions
+7 -3
View File
@@ -35,9 +35,13 @@ ao trabalhar neste repositório.
## 2. Regras para Modelos de IA (Agentes do City10)
2.1. **Somente modelos gratuitos allow-listed.** Agentes só podem usar
modelos definidos em `config/ai.php` (`allowed_models`). A validação
acontece no backend (`AiAgentRequest`) — não contorne.
2.1. **Somente modelos allow-listed.** Agentes só podem usar modelos
definidos em `config/ai.php` (`allowed_models`). A validação
acontece no backend (`AiAgentRequest`) — não contorne. Por padrão a
lista contém modelos gratuitos; **exceção aprovada pelo responsável**:
`xiaomi/mimo-v2.6-flash` (pago, custo mínimo ~1,4e-7/token,
verificado ao vivo) — atua como **modelo de fallback** das cadeias
de chamada (`AI_FALLBACK_MODEL`): preferido → default → fallback.
2.2. **Nunca envie dados pessoais ao modelo.** Ao chamar o OpenRouter, envie
apenas contexto simulado da cidade (posições, metas, estado de lojas).