Haz clic en un nodo para enfocarlo y ver de qué depende, usa RUTA para trazar el camino entre dos componentes, LENTE para comparar roles, o las vistas guiadas. Atajos: / buscar · T tema · E exportar.
Arquitectura de alto nivel. Clic en cualquier bloque para detalle técnico.
App Móvil · Capacitor
Build de SvelteKit → contenedor Capacitor (iOS / Android / PWA)
Plugins nativos
@capacitor/biometric
@capacitor/filesystem
@capacitor/preferences
@capacitor/push-notifications
@capacitor/app
Rutas (app)
/login
/home
/patients/[id]
/notes · /meds · /shift
Panel Web · Admin
SvelteKit SSR/SPA · Tailwind · mismo sistema de diseño
Módulos
Dashboard de KPIs · Pacientes · Centros · Personal · Reportes · Config · Auditoría
Rutas (admin)
/admin/dashboard
/admin/patients
/admin/centers
/admin/reports
API / Transporte
- POST /api/auth/*
- POST /api/notes/from-audio
- POST /api/notes/confirm
- GET /api/patients
- POST /api/meds/administer
- POST /api/incidents
- GET /api/dashboard/kpis
Aplicación · CQRS
Comandos (escritura)
- CreateNoteFromAudio
- ConfirmClinicalNote
- AdministerMedication
- ReportIncident
- ConfirmShiftHandover
- UpdateRiskLevel
Consultas (lectura)
- GetPatientsByRisk
- GetPatientTimeline
- GetMedicationSchedule
- GetDashboardKPIs
- GetShiftSummary
- GetAuditLog
Dominio (puro)
Sin dependencias de framework ni de base de datos
PostgreSQL
Prisma / Drizzle
patients, notes, meds
incidents, audit_log
risk_history
Autenticación
Better Auth / Lucia
JWT + sesión
Puente biométrico
Roles RBAC
Object Storage
S3 / R2 compatible
audio/{noteId}.webm
URLs firmadas
Pipeline de IA
TranscriptionService
NoteExtractionService
Esquemas Zod
Plantillas de prompt
Flujo técnico: Voz → Nota clínica
Comando: CreateNoteFromAudio → confirmación humana → ConfirmClinicalNote
Captura de audio (cliente)
MediaRecorder API / Capacitor Voice → Blob (webm/m4a)
Botón flotante inicia/detiene. Forma de onda + temporizador. Sin procesamiento en el dispositivo.
Subida + autenticación
POST /api/notes/from-audio
Content-Type: multipart/form-data
Authorization: Bearer <session>
Cuerpo: audio + centerId + pista opcional de patientId. Límite de tasa + tamaño máximo.
CreateNoteFromAudio.execute()
→ Whisper / Deepgram → texto plano + idioma
→ LLM en modo JSON + prompt de sistema clínico → JSON crudo
→ Zod · reintento si falla · campos de confianza
Respuesta → UI de confirmación
200 OK · { transcript, extraction, requiresReview }
Nota aún no oficial. Estado: draft_ai. Enfermería edita los campos y ve alertas de baja confianza.
ConfirmClinicalNote
Confirma/edita → POST /api/notes/confirm
- Crea ClinicalNote (estado: confirmed)
- Asocia a Patient · actualiza timeline
- Posible UpdateRiskLevel
- Evento de dominio → auditoría / notificaciones
- Audio referenciado en storage
CQRS · Casos de uso
Los comandos modifican estado · las consultas solo leen. Haz clic en cualquiera para ver el detalle.
Comandos
CreateNoteFromAudio
audio, nurseId, centerId → borrador de extracción
ConfirmClinicalNote
extractionId + ediciones → persiste ClinicalNote
AdministerMedication
patientId, medId, dose, time, nurseId, doubleCheck?
ReportIncident
type, severity, description, patientId
ConfirmShiftHandover
Resumen IA del turno + firma de entrega
UpdateRiskLevel
Manual o sugerido por IA · historial
Consultas
GetPatientsByRisk
centerId → lista ordenada + insignias de riesgo
GetPatientTimeline
patientId, desde, hasta → notas + medicación + incidentes
GetMedicationSchedule
Turno actual · pendientes / administradas / omitidas
GetDashboardKPIs
activos, alto riesgo, incidentes, % de cumplimiento
GetShiftSummary
Resumen pre-calculado o con IA para el relevo de turno
GetAuditLog
quién / qué / cuándo · acceso clínico
Modelo de datos
Entidades principales. Las notas se versionan en lugar de sobrescribirse · RiskHistory y AuditLog son inmutables.
Patient
- id · externalId
- fullName · birthDate · sex
- room · bed · centerId
- currentRiskLevel
- status (active|discharged)
- createdAt · updatedAt
ClinicalNote
- id · patientId · authorId
- status (draft_ai|confirmed)
- transcript · structuredJson
- freeText · riskSuggestion
- confidence · audioUrl
- confirmedAt · version
MedicationAdmin
- id · patientId · medCatalogId
- scheduledAt · administeredAt
- status (pending|given|omitted)
- dose · route · nurseId
- doubleCheckBy? · notes
Incident
- id · patientId · reporterId
- type · severity
- description · occurredAt
- relatedNoteId?
- attachments[]
RiskHistory
- id · patientId
- fromLevel · toLevel
- reason · changedBy
- source (manual|ai|rule)
- changedAt
AuditLog
- id · actorId · action
- resourceType · resourceId
- payload · ip · userAgent
- createdAt
Pipeline de IA · Detalle técnico
Pipeline determinista + salida validada + humano en el circuito (human-in-the-loop). No es un agente autónomo.
Paso 1
TranscriptionService
transcribe(audio): Promise<{ text, language, duration }>
Whisper API · Deepgram · AssemblyAI · o Whisper local (GPU).
Paso 2
NoteExtractionService
extract(transcript): Promise<RawExtraction>
LLM en modo JSON / tool calling. Prompt de sistema clínico + ejemplos few-shot de notas reales y desordenadas.
Paso 3
Zod Validation
NoteExtractionSchema.safeParse()
Si falla → reintento “corregir JSON”. Baja confianza → requiere_revision + alertas.
Esquema de salida (contrato)
{
paciente: { nombre_detectado, confianza, alternativas[] }
medicamentos[]: { nombre, dosis?, administrado?, confianza }
incidentes[]: { tipo, descripcion, gravedad?, confianza }
observaciones: string
nivel_riesgo_sugerido: "alto" | "medio" | "bajo" | "estable" | null
confianza_general: number
texto_libre: string // siempre presente
alertas: string[]
requiere_revision: boolean
}
Principio: no perder información. Lo no estructurable va a texto_libre / observaciones.
Stack técnico completo
Frontend / Móvil
- SvelteKit (latest)
- Tailwind CSS + tokens de diseño
- Capacitor 6
- Svelte 5 runes / stores
- Zod (cliente)
Backend
- SvelteKit server routes
- Clean Architecture
- CQRS commands/queries
- PostgreSQL + Prisma/Drizzle
- Better Auth / Lucia
IA / Audio
- Whisper / Deepgram (STT)
- GPT-4o / Claude / Grok
- JSON mode + Zod
- Prompt versionado
- Humano en el circuito
Infra
- PostgreSQL
- S3-compatible storage
- Redis (opcional)
- Vercel / Railway / VPS
Móvil nativo
- Capacitor iOS + Android
- Biometric plugin
- Filesystem / Preferences
- Push notifications
- App Store + Play + AppGallery
Calidad / Operaciones
- TypeScript strict
- Pruebas unitarias (dominio + comandos)
- Registro de auditoría inmutable
- Secretos solo en el servidor