# Claro Cases β€” Dashboard HITL Dashboard *Human-in-the-Loop* (HITL) para que asesores humanos gestionen peticiones enviadas por un agente virtual durante conversaciones con clientes, y monitoreen la operaciΓ³n en tiempo real. --- ## πŸ—οΈ Arquitectura ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Frontend React (este repo) β”‚ β”‚ β”‚ β”‚ /cases ──▢ GestiΓ³n HITL (formularios dinΓ‘micos)β”‚ β”‚ /monitor ──▢ Monitoreo en tiempo real β”‚ β”‚ β”‚ β”‚ REST (POST) ──▢ Backend Python (canal escritura) β”‚ β”‚ WebSocket ◀── Backend Python (difusiΓ³n/stream) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` - **REST** es el canal autoritativo de escritura (resoluciΓ³n de casos) - **WebSocket** es para difusiΓ³n de eventos y streaming en tiempo real - **MSW** (Mock Service Worker) simula el backend en modo desarrollo ### Stack | Componente | TecnologΓ­a | |-----------|-----------| | Framework | React 19 + TypeScript | | Build | Vite 6 | | Estado global | Zustand | | Ruteo | React Router (`/cases`, `/monitor`) | | Estilos | Tailwind CSS v4 (CSS-first con `@theme`) | | ValidaciΓ³n | Zod | | Iconos | Lucide React | | Mocks | MSW (Mock Service Worker) | --- ## πŸ“‚ Estructura del Proyecto ``` claro-cases/ β”œβ”€β”€ index.html # Vite entry point β”œβ”€β”€ package.json # Dependencias y scripts β”œβ”€β”€ vite.config.ts # ConfiguraciΓ³n Vite + Tailwind + alias @/ β”œβ”€β”€ tsconfig.json # TypeScript config β”œβ”€β”€ .env # Variables de entorno (VITE_*) β”œβ”€β”€ SPECIFICATION.md # BitΓ‘cora de desarrollo β”œβ”€β”€ BACKEND_HANDOFF.md # Contratos para equipo Python β”œβ”€β”€ Consulta de aplicativos... # CSV con 53 tipos de caso β”‚ β”œβ”€β”€ src/ β”‚ β”œβ”€β”€ main.tsx # Entry point React + MSW condicional β”‚ β”œβ”€β”€ App.tsx # Router principal β”‚ β”œβ”€β”€ index.css # Tailwind v4 @theme + @custom-variant dark β”‚ β”‚ β”‚ β”œβ”€β”€ types/ β”‚ β”‚ β”œβ”€β”€ index.ts # Interfaces: CaseRequest, Conversation, Message, etc. β”‚ β”‚ └── wsProtocol.ts # Schemas Zod de eventos WebSocket β”‚ β”‚ β”‚ β”œβ”€β”€ data/ β”‚ β”‚ └── caseTypeDefinitions.ts # 53 tipos de caso con uiPattern y formFields β”‚ β”‚ β”‚ β”œβ”€β”€ services/ β”‚ β”‚ β”œβ”€β”€ api.ts # Cliente REST (fetch nativo) β”‚ β”‚ └── wsClient.ts # Cliente WebSocket con reconexiΓ³n β”‚ β”‚ β”‚ β”œβ”€β”€ store/ β”‚ β”‚ └── useAppStore.ts # Zustand store: cases, conversations, ui β”‚ β”‚ β”‚ β”œβ”€β”€ hooks/ β”‚ β”‚ β”œβ”€β”€ useNotification.ts # Notificaciones escritorio HTML5 β”‚ β”‚ β”œβ”€β”€ useSound.ts # Alerta sonora Web Audio API β”‚ β”‚ β”œβ”€β”€ useTitleFlash.ts # Parpadeo de tΓ­tulo de pestaΓ±a β”‚ β”‚ └── index.ts # Barrel export β”‚ β”‚ β”‚ β”œβ”€β”€ components/ β”‚ β”‚ β”œβ”€β”€ layout/ β”‚ β”‚ β”‚ β”œβ”€β”€ AppShell.tsx # Shell global (WS init, tema oscuro) β”‚ β”‚ β”‚ β”œβ”€β”€ Header.tsx # Logo, badge, indicador WS, toggle tema β”‚ β”‚ β”‚ └── Sidebar.tsx # Nav: Casos / Monitor β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ cases/ β”‚ β”‚ β”‚ β”œβ”€β”€ CaseCard.tsx # Tarjeta de caso (sidebar) β”‚ β”‚ β”‚ β”œβ”€β”€ CaseDetail.tsx # Panel de detalle β”‚ β”‚ β”‚ β”œβ”€β”€ FormRenderer.tsx # Formulario dinΓ‘mico (6 patrones UI) β”‚ β”‚ β”‚ β”œβ”€β”€ TypeBadge.tsx # Badge de tipo de solicitud β”‚ β”‚ β”‚ └── ApplicativeFilter.tsx # Filtro por aplicativo β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ monitor/ β”‚ β”‚ β”‚ β”œβ”€β”€ ConversationCard.tsx # Tarjeta de conversaciΓ³n β”‚ β”‚ β”‚ β”œβ”€β”€ ChatFeed.tsx # Feed de mensajes con auto-scroll β”‚ β”‚ β”‚ β”œβ”€β”€ MessageBubble.tsx # Burbuja por rol (user/agent/system/internal) β”‚ β”‚ β”‚ β”œβ”€β”€ InternalNoteBanner.tsx # InyecciΓ³n de notas internas β”‚ β”‚ β”‚ └── InternalNotesGroup.tsx # AcordeΓ³n de notas agrupadas β”‚ β”‚ β”‚ β”‚ β”‚ └── shared/ β”‚ β”‚ β”œβ”€β”€ StatusBadge.tsx # Badge de estado (PENDING/IN_PROGRESS/RESOLVED/FAILED) β”‚ β”‚ β”œβ”€β”€ SearchBar.tsx # Input con debounce 300ms β”‚ β”‚ β”œβ”€β”€ TabsBar.tsx # PestaΓ±as: Todos/Pendientes/Finalizados β”‚ β”‚ β”œβ”€β”€ EmptyState.tsx # Estado vacΓ­o centrado β”‚ β”‚ β”œβ”€β”€ Modal.tsx # Overlay modal con backdrop blur β”‚ β”‚ └── Timer.tsx # CronΓ³metro independiente (localStorage) β”‚ β”‚ β”‚ β”œβ”€β”€ pages/ β”‚ β”‚ β”œβ”€β”€ CasesPage.tsx # Vista /cases: sidebar + detalle β”‚ β”‚ └── MonitorPage.tsx # Vista /monitor: conversaciones + chat β”‚ β”‚ β”‚ └── mocks/ β”‚ β”œβ”€β”€ browser.ts # MSW setup β”‚ └── handlers.ts # 10 casos mock + 3 conversaciones β”‚ β”œβ”€β”€ public/ β”‚ └── mockServiceWorker.js # MSW service worker β”‚ └── legacy/ # Backend legacy Node.js + SQLite β”œβ”€β”€ server.js β”œβ”€β”€ db.js β”œβ”€β”€ schema.sql β”œβ”€β”€ package.json └── public/ # Frontend vanilla original ``` --- ## πŸš€ EjecuciΓ³n ### Prerrequisitos - Node.js 20+ ### InstalaciΓ³n ```bash npm install ``` ### Desarrollo (con MSW β€” sin backend real) ```bash npm run dev ``` - `http://localhost:5173/cases` β€” GestiΓ³n de casos HITL - `http://localhost:5173/monitor` β€” Monitoreo de conversaciones Con `VITE_ENABLE_MSW=true` en `.env`, el MSW simula el backend automΓ‘ticamente. Para usar un backend real, cambia a `VITE_ENABLE_MSW=false`. ### Build de producciΓ³n ```bash npm run build # Genera dist/ npm run preview # Previsualiza el build ``` --- ## 🎨 Sistema de DiseΓ±o El tema estΓ‘ definido en `src/index.css` mediante la directiva `@theme` de Tailwind v4: | Token | Valor | |-------|-------| | `--color-accent-orange` | `#ff4e00` | | `--color-accent-yellow` | `#ffa600` | | `--color-accent-red` | `#f80018` | | `--color-accent-green` | `#10b981` | | `--color-bg-base` | `#f0f2f5` | | `--color-bg-surface` | `#ffffff` | | `--color-bg-elevated` | `#f8fafc` | | TipografΓ­a | Inter (Google Fonts) | Modo oscuro: toggle vΓ­a `@custom-variant dark` + clase `.dark` en ``. --- ## πŸ“‘ Contratos de IntegraciΓ³n El backend Python debe implementar los contratos documentados en [`BACKEND_HANDOFF.md`](./BACKEND_HANDOFF.md). Resumen rΓ‘pido: ### REST (canal autoritativo) | MΓ©todo | Ruta | DescripciΓ³n | |--------|------|-------------| | `GET` | `/api/v1/cases?status=&applicative=&search=&offset=&limit=` | Listar casos (filtrable, paginado) | | `GET` | `/api/v1/cases/:id` | Obtener caso | | `POST` | `/api/v1/cases/:id/resolve` | Resolver caso (**ΓΊnico canal de escritura**) | | `GET` | `/api/v1/conversations/active` | Conversaciones activas | ### WebSocket (`/ws/dashboard`) - **Server β†’ Client**: `init_state`, `conversation_started`, `agent_stream_started/chunk/completed`, `hitl_request`, `hitl_resolved` - **Client β†’ Server**: `internal_note` (notas internas del asesor) - Envelope: `{ type, eventId, occurredAt, payload }` --- ## πŸ€– Modo Mock (MSW) El proyecto incluye 10 casos de ejemplo y 3 conversaciones simuladas para desarrollo sin backend: ```bash # .env VITE_ENABLE_MSW=true ``` Los mocks cubren los 6 patrones de UI (`SIMPLE_CONFIRMATION`, `CONFIRMATION_WITH_VALUE`, `MULTI_FIELD_FORM`, `DATE_SIMPLE`, `FREE_TEXT`, `READ_ONLY`) y mΓΊltiples aplicativos (AC+, ASCARD, DiMe, Formatos SGCS, Mi asistencia 360, RR). --- ## πŸ” Seguridad - **`advisorId` NUNCA es enviado por el frontend**. El backend deriva la identidad del asesor desde el token de sesiΓ³n (REST) o conexiΓ³n WebSocket autenticada. - La resoluciΓ³n de casos es exclusivamente REST β€” no hay ruta de escritura por WebSocket que pueda ser explotada. --- ## πŸ“š DocumentaciΓ³n Adicional | Archivo | Contenido | |---------|-----------| | [`SPECIFICATION.md`](./SPECIFICATION.md) | BitΓ‘cora completa: fases de diseΓ±o, auditorΓ­a, implementaciΓ³n y QA | | [`BACKEND_HANDOFF.md`](./BACKEND_HANDOFF.md) | Contratos REST/WS detallados para el equipo Python | | [`Consulta de aplicativos - Claro - FacturaciΓ³n.csv`](./Consulta%20de%20aplicativos%20-%20Claro%20-%20Facturaci%C3%B3n.csv) | 53 tipos de caso con pasos, objetivos y formatos de respuesta | | [`legacy/README.md`](./legacy/README.md) | DocumentaciΓ³n del backend legacy (Node.js + SQLite) |