feat(celular): rosto e app usam SSE e token; remove telas legadas

- carinha.html assina /eventos (expressao, app_config, conversa, reacao,
  recarregar) e volta ao polling de /fila sozinho se o SSE cair; foto dos
  ajustes a cada (re)conexao; token (?t=) vai em todo fetch ao servidor
- APK 0.8-token: token nas preferencias e no menu de toque longo, enviado
  na pagina, no HTTP do Java e ao llama-server (--api-key); trocar servidor
  por Intent exige o token salvo; camera/microfone so para o servidor
  configurado ou a copia local
- cerebro/conversa mandam a chave ao llama-server do S10
- servidor: evento SSE 'recarregar'; remove /camera/frame e /app/connect;
  enderecos antigos redirecionam para a secao do painel novo
- remove dashboard, painel, conversa, emojis, treinamento, braco, servos,
  api, scripts e CSS antigos, audio-robot.js e servir-local.bat
- logica pura do painel em web/src/lib/nucleo.ts com testes node --test
  (substitui test_movimentos.js e test_rastreamento.js)
- testes de navegador portados para o painel novo (rtc, rosto, rastreamento)
- README, docs/PAINEL.md e docs/SEGURANCA.md reescritos; versao 0.8.0;
  carinha-pc.service le /etc/carinha.env

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
julio
2026-10-05 20:11:58 -03:00
co-authored by Claude Opus 5.5
parent 673dea62e8
commit c5fd54c1d9
67 changed files with 626 additions and 5904 deletions
+4 -12
View File
@@ -86,21 +86,13 @@ class ControleTest(unittest.TestCase):
self.assertTrue(json.loads(body)['online'])
self.assertEqual(json.loads(body)['estado']['rosto'], 'miudo')
def test_frame_is_hidden_when_disabled_and_after_expiry(self):
jpeg = b'\xff\xd8fixture\xff\xd9'
self.assertEqual(self.request('/camera/frame', jpeg, 'image/jpeg')[0], 409)
def test_legacy_camera_and_adb_routes_are_gone(self):
self.request('/app/config', {'preview': True})
self.assertEqual(self.request('/camera/frame', jpeg, 'image/jpeg')[0], 200)
self.assertEqual(self.request('/camera/frame'), (200, jpeg))
self.server.controle.frame_at -= 4
self.assertEqual(self.request('/camera/frame')[0], 204)
self.request('/camera/frame', jpeg, 'image/jpeg')
self.request('/app/config', {'preview': False})
self.assertEqual(self.request('/camera/frame')[0], 204)
self.assertEqual(self.request('/camera/frame', b'\xff\xd8x\xff\xd9', 'image/jpeg')[0], 404)
self.assertEqual(self.request('/camera/frame')[0], 404)
self.assertEqual(self.request('/app/connect', {'ip': '127.0.0.1'})[0], 404)
def test_rejects_non_jpeg_and_unknown_settings(self):
self.request('/app/config', {'preview': True})
self.assertEqual(self.request('/camera/frame', b'hello', 'image/jpeg')[0], 400)
self.assertEqual(self.request('/app/config', {'preview': 'false'})[0], 400)
self.assertEqual(self.request('/app/config', {'extra': 1})[0], 400)