feat: add City10 platform with Laravel 13, AI agents, 3D viewer, and LGPD compliance

Initial commit of the complete City10 virtual city simulation platform.

Backend (Laravel 13):
- REST API with Sanctum tokens and session-based web authentication
- Role-based access control (admin/user) with middleware protection
- AI agent CRUD with OpenRouter.ai integration restricted to free models
- Store management with 3D coordinates and AI shopkeeper assignment
- Versioned legal documents (Terms, Privacy, Cookies) with LGPD audit trail
- Math CAPTCHA on public forms and multi-language support (pt_BR, en, es)

Frontend:
- Responsive Blade templates with Tailwind CSS v4
- Three.js 3D city viewer with SSE chat streaming to AI agents
- Admin panel for store and user administration

Infrastructure:
- MariaDB/MySQL database with comprehensive migrations
- Database seeders for demo content and test accounts
- PHPUnit test suite and Laravel Pint code styling
- Vite build configuration with hot reload
This commit is contained in:
2026-10-17 20:46:15 -03:00
commit 79d12fa2f4
128 changed files with 17053 additions and 0 deletions
+107
View File
@@ -0,0 +1,107 @@
{
"Login": "Entrar",
"Logout": "Sair",
"Register": "Cadastrar",
"Dashboard": "Painel",
"Email": "E-mail",
"Password": "Senha",
"Password Confirmation": "Confirmar Senha",
"Remember Me": "Lembrar de mim",
"Name": "Nome",
"Save": "Salvar",
"Cancel": "Cancelar",
"Delete": "Excluir",
"Edit": "Editar",
"Create": "Criar",
"Search": "Buscar",
"Back": "Voltar",
"Welcome": "Bem-vindo ao City10",
"auth.failed": "As credenciais fornecidas não correspondem aos nossos registros.",
"auth.disabled": "Esta conta foi desativada. Contate o administrador.",
"auth.forbidden": "Você não tem permissão para acessar este recurso.",
"auth.logged_out": "Sessão encerrada com sucesso.",
"auth.throttle": "Muitas tentativas. Tente novamente em :seconds segundos.",
"legal.accept_required": "Você precisa aceitar os Termos de Uso e a Política de Privacidade antes de continuar.",
"legal.accepted": "Termos aceitos com sucesso.",
"legal.must_accept_terms": "Você precisa aceitar os Termos de Uso.",
"legal.must_accept_privacy": "Você precisa aceitar a Política de Privacidade.",
"legal.must_accept_cookies": "Você precisa aceitar a Política de Cookies.",
"validation.captcha_required": "Resolva a verificação matemática.",
"validation.captcha_failed": "Resposta da verificação matemática incorreta.",
"validation.model_not_allowed": "O modelo de IA selecionado não está na lista de permitidos.",
"users.cannot_deactivate_self": "Você não pode desativar sua própria conta.",
"users.deactivated": "Conta desativada com sucesso.",
"stores.deleted": "Loja excluída com sucesso.",
"agents.deleted": "Agente excluído com sucesso.",
"welcome.tagline": "Uma cidade 3D viva no navegador, com agentes de IA autônomos — Prefeito, pedestres, lojistas e veículos — decidindo em tempo real através do OpenRouter.ai.",
"welcome.card1.title": "🌐 Cidade 3D em Tempo Real",
"welcome.card1.desc": "Explore ruas, avenidas, pontes, rios, praças e edifícios renderizados com Three.js direto no navegador.",
"welcome.card2.title": "🤖 Agentes de IA",
"welcome.card2.desc": "Prefeito, pedestres e lojistas tomam decisões estratégicas através de modelos gratuitos do OpenRouter.ai.",
"welcome.card3.title": "🔒 Seguro & LGPD",
"welcome.card3.desc": "Autenticação diferenciada (Admin/User), CAPTCHA matemático e consentimento auditável de termos conforme a legislação brasileira.",
"welcome.city.title": "🗺️ Elementos da Cidade (Fase 1)",
"welcome.city.desc": "A base de dados já modela casas, edifícios, escolas, parques, praças, semáforos, ruas, avenidas, pontes, aeroportos, rios, indústrias, lojas e lojistas — todos com coordenadas 3D (X, Y, Z) prontas para o motor de renderização.",
"welcome.no_account": "Não tem conta?",
"welcome.has_account": "Já tem conta?",
"nav.city": "Cidade 3D",
"nav.admin": "Administração",
"dashboard.open_viewer": "Abrir visualizador 3D",
"dashboard.viewer_desc": "Explore o chão da cidade, lojas e agentes com câmera controlável.",
"dashboard.stores_title": "Lojas",
"dashboard.stores_desc": "Lojas cadastradas na cidade 3D.",
"dashboard.legal_title": "Consentimentos",
"dashboard.consent_history": "Ver histórico de aceites",
"legal.terms_label": "Termos",
"legal.privacy_label": "Privacidade",
"legal.cookies_label": "Cookies",
"admin.stores.title": "Gerenciar Lojas",
"admin.stores.manage": "Gerenciar lojas",
"admin.stores.admin_desc": "Cadastre lojas e defina a posição 3D delas na cidade.",
"admin.stores.new": "Nova loja",
"admin.stores.created": "Loja criada com sucesso.",
"admin.stores.updated": "Loja atualizada com sucesso.",
"admin.stores.edit_title": "Editar loja",
"admin.stores.create_title": "Nova loja",
"admin.stores.empty": "Nenhuma loja cadastrada ainda.",
"admin.stores.position": "Posição 3D na cidade",
"admin.stores.position_hint": "Clique no chão para definir X/Z, ou digite as coordenadas. Use os controles para girar/zoom.",
"admin.stores.pos_x": "Posição X",
"admin.stores.pos_y": "Altura Y (chão = 0)",
"admin.stores.pos_z": "Posição Z",
"admin.stores.dimensions": "Dimensões do prédio",
"admin.stores.width": "Largura",
"admin.stores.height": "Altura",
"admin.stores.depth": "Profundidade",
"admin.stores.type": "Tipo de loja",
"admin.stores.description": "Descrição",
"admin.stores.owner": "Dono (usuário)",
"admin.stores.agent": "Agente de IA (lojista)",
"admin.stores.is_open": "Loja aberta",
"admin.stores.no_owner": "Sem dono",
"admin.stores.no_agent": "Sem agente",
"admin.stores.actions": "Ações",
"admin.stores.coords": "Coordenadas",
"admin.stores.confirm_delete": "Excluir esta loja da cidade?",
"city.title": "Visualizador 3D da Cidade",
"city.loading": "Carregando cidade…",
"city.error": "Falha ao carregar os dados da cidade.",
"city.stores_count": "lojas",
"city.agents_count": "agentes",
"city.hint": "Clique na tela para controlar · WASD para andar · Mouse para olhar · Esc para sair",
"city.refresh": "Recarregar",
"city.selected": "Selecionada",
"city.open": "Aberta",
"city.closed": "Fechada",
"city.hint_fps": "WASD para andar · Mouse para olhar · Esc para sair · Clique no NPC para conversar",
"city.position": "POSIÇÃO",
"city.on_ground": "no chão",
"city.triangles": "tris de colisão",
"city.chat_placeholder": "Digite sua mensagem…",
"city.chat_thinking": "pensando…",
"city.chat_responding": "respondendo…",
"city.chat_accepted": "Mensagem enviada ao agente.",
"city.chat_error": "Desculpe, não consegui responder agora. Tente novamente.",
"city.chat_send": "Enviar",
"city.chat_with": "Conversando com"
}