Este documento define el plan para añadir una interfaz web al sistema, manteniendo el bot/webhook existente como proceso independiente y compartiendo la misma base de datos SQLite (WAL). El objetivo es proporcionar al usuario un acceso seguro, rápido y cómodo a sus tareas, configuración y feeds de calendario, con especial atención a la seguridad y a la mínima fricción.
## Estado actual (2025-10-13)
- PR 1 (fundaciones de UI) integrado: tokens.css, base.css, AppShell, layout de /app y gating coherente a /login.
- Problema abierto en producción: los estilos globales no aparecen y el cliente muestra un error al cargar módulos de /_app.
- start.*.js responde 200, pero el fallo puede estar en chunks secundarios (/_app/immutable/chunks/*.js) o en caché desincronizada.
- Acciones inmediatas:
1) Verificar desde fuera: GET /_app/version.json, /_app/immutable/entry/start*.js y, especialmente, los /_app/immutable/chunks/*.js referenciados por start.*.js (deben devolver 200 y Content-Type application/javascript, no HTML).
2) Asegurar despliegue del build completo de SvelteKit (apps/web/build/index.js y apps/web/build/client) y que el proceso web arranca con cwd correcto.
3) Proxy: enrutar y no interceptar /_app/*; evitar catch-all que devuelva HTML; respetar Content-Type; no cachear el HTML de la app (o purgar tras deploy).
4) Mantener imports CSS globales en apps/web/src/routes/+layout.svelte (ya aplicado).
- Seguimiento: cuando /_app/* sirva correctamente los chunks, los estilos deberían aparecer sin cambios adicionales de código.
## 1) Decisiones fijadas
- Arquitectura: dos procesos (apps/bot y apps/web) ejecutándose en la misma app de CapRover, con un proxy interno en Bun (puerto 3000) que enruta /webhook y /metrics al bot (3007) y el resto a la web (3008). SvelteKit para la web (SSR, rutas de API, cookies).
@ -169,6 +180,10 @@ Notas:
- Un solo contenedor con proxy interno en Bun:
- /webhook y /metrics → bot (puerto interno 3007).
- Resto de rutas → web (puerto interno 3008, SvelteKit adapter-node).
- Passthrough explícito de /_app/* hacia la web (sin reescrituras ni catch-all que devuelva HTML).
- Asegurar Content-Type correcto para /_app/**/*.js (application/javascript) y /_app/**/*.css (text/css); no añadir nosniff en assets externos al HTML.
- El build de SvelteKit debe desplegarse completo (build/index.js + build/client) y mantenerse coherente con el HTML servido para evitar hashes huérfanos.
- Evitar cachear el HTML de la app en el proxy/CDN (o purgar tras cada deploy); los assets /_app/immutable pueden cachearse largo con immutable.
- CapRover debe exponer el puerto 3000 del contenedor (PORT).
- WEBHOOK_URL debe apuntar a https://<dominio>/webhook (mismo dominio).