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": "Iniciar sesión",
"Logout": "Cerrar sesión",
"Register": "Registrarse",
"Dashboard": "Panel",
"Email": "Correo electrónico",
"Password": "Contraseña",
"Password Confirmation": "Confirmar contraseña",
"Remember Me": "Recuérdame",
"Name": "Nombre",
"Save": "Guardar",
"Cancel": "Cancelar",
"Delete": "Eliminar",
"Edit": "Editar",
"Create": "Crear",
"Search": "Buscar",
"Back": "Volver",
"Welcome": "Bienvenido a City10",
"auth.failed": "Las credenciales proporcionadas no coinciden con nuestros registros.",
"auth.disabled": "Esta cuenta ha sido desactivada. Contacte al administrador.",
"auth.forbidden": "No tiene permiso para acceder a este recurso.",
"auth.logged_out": "Sesión cerrada exitosamente.",
"auth.throttle": "Demasiados intentos. Intente de nuevo en :seconds segundos.",
"legal.accept_required": "Debe aceptar los Términos de Uso y la Política de Privacidad antes de continuar.",
"legal.accepted": "Términos aceptados exitosamente.",
"legal.must_accept_terms": "Debe aceptar los Términos de Uso.",
"legal.must_accept_privacy": "Debe aceptar la Política de Privacidad.",
"legal.must_accept_cookies": "Debe aceptar la Política de Cookies.",
"validation.captcha_required": "Resuelva la verificación matemática.",
"validation.captcha_failed": "La respuesta de la verificación matemática es incorrecta.",
"validation.model_not_allowed": "El modelo de IA seleccionado no está en la lista de permitidos.",
"users.cannot_deactivate_self": "No puede desactivar su propia cuenta.",
"users.deactivated": "Cuenta desactivada exitosamente.",
"stores.deleted": "Tienda eliminada exitosamente.",
"agents.deleted": "Agente eliminado exitosamente.",
"welcome.tagline": "Una ciudad 3D viva en tu navegador, con agentes de IA autónomos — Alcalde, peatones, comerciantes y vehículos — decidiendo en tiempo real a través de OpenRouter.ai.",
"welcome.card1.title": "🌐 Ciudad 3D en Tiempo Real",
"welcome.card1.desc": "Explora calles, avenidas, puentes, ríos, plazas y edificios renderizados con Three.js directamente en tu navegador.",
"welcome.card2.title": "🤖 Agentes de IA",
"welcome.card2.desc": "El alcalde, los peatones y los comerciantes toman decisiones estratégicas usando modelos gratuitos de OpenRouter.ai.",
"welcome.card3.title": "🔒 Seguro y LGPD",
"welcome.card3.desc": "Autenticación diferenciada (Admin/User), CAPTCHA matemático y consentimiento auditado de términos conforme la legislación brasileña.",
"welcome.city.title": "🗺️ Elementos de la Ciudad (Fase 1)",
"welcome.city.desc": "La base de datos ya modela casas, edificios, escuelas, parques, plazas, semáforos, calles, avenidas, puentes, aeropuertos, ríos, industrias, tiendas y comerciantes — todos con coordenadas 3D (X, Y, Z) listas para el motor de renderizado.",
"welcome.no_account": "¿No tienes cuenta?",
"welcome.has_account": "¿Ya tienes cuenta?",
"nav.city": "Ciudad 3D",
"nav.admin": "Administración",
"dashboard.open_viewer": "Abrir visor 3D",
"dashboard.viewer_desc": "Explora el suelo de la ciudad, tiendas y agentes con cámara controlable.",
"dashboard.stores_title": "Tiendas",
"dashboard.stores_desc": "Tiendas registradas en la ciudad 3D.",
"dashboard.legal_title": "Consentimientos",
"dashboard.consent_history": "Ver historial de aceptaciones",
"legal.terms_label": "Términos",
"legal.privacy_label": "Privacidad",
"legal.cookies_label": "Cookies",
"admin.stores.title": "Gestionar Tiendas",
"admin.stores.manage": "Gestionar tiendas",
"admin.stores.admin_desc": "Crea tiendas y define su posición 3D en la ciudad.",
"admin.stores.new": "Nueva tienda",
"admin.stores.created": "Tienda creada exitosamente.",
"admin.stores.updated": "Tienda actualizada exitosamente.",
"admin.stores.edit_title": "Editar tienda",
"admin.stores.create_title": "Nueva tienda",
"admin.stores.empty": "Aún no hay tiendas registradas.",
"admin.stores.position": "Posición 3D en la ciudad",
"admin.stores.position_hint": "Haz clic en el suelo para fijar X/Z o escribe las coordenadas. Usa los controles para rotar/zoom.",
"admin.stores.pos_x": "Posición X",
"admin.stores.pos_y": "Altura Y (suelo = 0)",
"admin.stores.pos_z": "Posición Z",
"admin.stores.dimensions": "Dimensiones del edificio",
"admin.stores.width": "Ancho",
"admin.stores.height": "Alto",
"admin.stores.depth": "Profundidad",
"admin.stores.type": "Tipo de tienda",
"admin.stores.description": "Descripción",
"admin.stores.owner": "Dueño (usuario)",
"admin.stores.agent": "Agente de IA (comerciante)",
"admin.stores.is_open": "Tienda abierta",
"admin.stores.no_owner": "Sin dueño",
"admin.stores.no_agent": "Sin agente",
"admin.stores.actions": "Acciones",
"admin.stores.coords": "Coordenadas",
"admin.stores.confirm_delete": "¿Eliminar esta tienda de la ciudad?",
"city.title": "Visor 3D de la Ciudad",
"city.loading": "Cargando ciudad…",
"city.error": "Error al cargar los datos de la ciudad.",
"city.stores_count": "tiendas",
"city.agents_count": "agentes",
"city.hint": "Haz clic en la escena para controlar · WASD para caminar · Ratón para mirar · Esc para salir",
"city.refresh": "Recargar",
"city.selected": "Seleccionada",
"city.open": "Abierta",
"city.closed": "Cerrada",
"city.hint_fps": "WASD para caminar · Ratón para mirar · Esc para salir · Clic en un NPC para chatear",
"city.position": "POSICIÓN",
"city.on_ground": "en el suelo",
"city.triangles": "tris de colisión",
"city.chat_placeholder": "Escribe tu mensaje…",
"city.chat_thinking": "pensando…",
"city.chat_responding": "respondiendo…",
"city.chat_accepted": "Mensaje enviado al agente.",
"city.chat_error": "Lo siento, no puedo responder ahora. Inténtalo de nuevo.",
"city.chat_send": "Enviar",
"city.chat_with": "Chateando con"
}