- Backend: 7 endpoints admin (CRUD usuarios, roles, proyectos por usuario)
- AdminClaims extractor con validación de rol admin (403)
- Frontend admin: página de usuarios con filtros, modal crear/editar
- QR con deep link a PWA para compartir credenciales en campo
- PWA: prefill de email desde query params del QR
- Fix: Redis restart loop (command como array en docker-compose)
- Fix: crash ProjectDetailsPage por stage undefined
- Fix: migración audit_trail compatible con schema existente
- Cleanup: eliminado RegisterPage y ruta /register del admin
Los structs EdgeProject y EdgeAsset fueron ampliados con campos ANH
(operador, contrato, localización, calibración) pero los tests no se
actualizaron. También se corrige la aserción de nodos modbus-read
que esperaba 2 en vez de 1 por variable.
Copiar layouts, UI components, rutas admin, dashboard, projects, tanks,
auth y estilos del admin al PWA. Se preservan movements, sync worker
y archivos exclusivos del PWA.
- Backend: login retorna projects[] consultando user_project_access
- Auth store (admin + pwa): projects[], activeProjectId, setActiveProject(), version 1
- LoginPage (admin + pwa): pasa projects al store tras login
- AdminLayout: header con selector de proyecto activo
- useTanks: elimina UUID hardcodeado, usa activeProjectId del store
- projects-api: BuildTriggerResponse y BuildMetadata interfaces, sin any
- wells-api: EdgeAssetType union type
- DashboardPage: elimina datos quemados (KPIs, charts, sensores, usuario)
- TanksPage y TankDetailPage con chart de historial
- useTanks y useTankTelemetry hooks
- Rutas /hf/tanks y /hf/tanks/:id registradas
- Sidebar: Netilion renombrado a Edge Agent (HF)
- GET /api/tanks con filtro por project_id
- PUT update_asset implementado (era stub)
- UpdateAssetRequest struct con campos mutables
- Puerto 8000 expuesto en docker-compose
- MeasurementPage con flujo offline-first via Dexie sync_queue
- MeasurementForm con validacion y submit a cola de sincronizacion
- AssetSelector para pozos y tanques
- PozoFields y TanqueFields con campos especificos por tipo
- SyncStatusBadge con estado de conexion y pendientes
- AdminLayout con sidebar jerárquico, tokens oklch emerald
- DashboardPage con KPIs y estructura base
- LoginPage rediseñada en ambos frontends
- FieldLayout alineado al design system del admin
- Integración shadcn/ui en frontend-admin
- index.css unificado con variables oklch