WhatsApp chatbot that works with an Evolution API server to provide task management to a WhatsApp Community.
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
brobert b4f2f9be92 actualizo algunos mensajes del bot para que tengan un estilo más razonable en whatsapp 11 months ago
apps/web feat: bloquear is_community/isCommunityAnnounce y filtrar consultas 11 months ago
data feat: mover base de datos a carpeta data 1 year ago
docs actualiza los estados completados del último plan previsto 11 months ago
src actualizo algunos mensajes del bot para que tengan un estilo más razonable en whatsapp 11 months ago
tests feat: impedir soltar tarea personal sin asignatarios; backend+UI 11 months ago
.env.example feat: alinea copy A3/A4 a activar y añade tests; actualiza env y docs 11 months ago
.gitignore añade carpetas temporales a gitignore 11 months ago
Dockerfile build: evita instalar dependencias opcionales y usa bun:sqlite 11 months ago
README.md docs: actualiza documentación para edición web y completar tareas 11 months ago
README.old.md se cepilla el README que ya no sirve 12 months ago
STATUS.md docs: reflejar multicomunidad, gating de grupos y /admin 12 months ago
bun.lock añade bun lock y package.json 1 year ago
bunfig.toml feat: añadir DATA_DIR para DB compartida y configurar Bun workspaces 11 months ago
captain-definition feat: add CapRover deployment files and env var validation 1 year ago
index.ts fix: Pasa instancia de db correctamente a initializeDatabase 1 year ago
package.json añade bun lock y package.json 1 year ago
proxy.ts chore: desactiva precompress y desactiva compresión en proxy 11 months ago
startup.sh fix: normalizar DB_PATH y DATA_DIR a rutas absolutas y esperar tablas 11 months ago
tsconfig.json Initial commit 1 year ago

README.md

Taskbot

Bot de tareas para WhatsApp con sincronización de grupos, recordatorios y control de acceso.

Taskbot ayuda a coordinar grupos en WhatsApp: crea y asigna tareas, recuerda pendientes y aplica gobierno de acceso por grupo. Está pensado para equipos y comunidades que ya operan en WhatsApp y quieren visibilidad ligera sin salir de la app.

Qué problema resuelve

  • Tareas que se pierden en el chat y falta de responsables o fechas.
  • Falta de visibilidad de pendientes por grupo o persona.
  • Necesidad de limitar en qué grupos opera el bot (descubrir y aprobar).

Características

  • Gestión de tareas: crear, asignar, reclamar/soltar, fechas límite y código corto de referencia.
  • Edición desde la web: reclamar/soltar, editar descripción y actualizar fecha de vencimiento desde /app; completar tareas y ver “Completadas (24 h)”.
  • Recordatorios configurables por usuario (frecuencia y hora, respetando zona horaria).
  • Control de acceso por grupos: modos off, discover y enforce; aprobación y bloqueo por admins.
  • Sincronización de grupos y miembros con cachés y schedulers configurables.
  • Alias de identidad con normalización de IDs.
  • Acceso web por token mágico (/t web) con página intermedia anti-preview y sesión por cookie (idle 2h); tokens de 10 min de un solo uso.
  • Métricas listas para Prometheus en el endpoint /metrics.
  • Rate limiting por usuario para evitar abuso.
  • Persistencia simple con SQLite, migraciones automáticas y PRAGMAs seguros (WAL, FK, etc.).

Qué no es (limitaciones)

  • No es un framework general de bots ni un CRM.
  • No conecta directamente con WhatsApp: requiere Evolution API.
  • No gestiona flujos conversacionales complejos ni multimedia avanzada.
  • Panel web: login operativo, lista de tareas con acciones básicas (reclamar/soltar, editar texto y fecha, completar; sección “Completadas (24 h)”), vista de grupos (contadores "abiertas" y "sin responsable" con lista sin límite y botón “Reclamar”; tarjetas ordenadas por cantidad de “sin responsable”) y página de preferencias de recordatorios; la interacción principal sigue siendo WhatsApp.
  • Está optimizado para un despliegue por comunidad/instancia (no multi-tenant masivo).

Cómo funciona (alto nivel)

  1. Evolution API envía eventos al webhook de Taskbot.
  2. El servidor normaliza el mensaje, aplica control de acceso por grupo y rate limit.
  3. Los servicios de dominio (tareas, recordatorios, alias, colas) operan sobre SQLite.
  4. Las respuestas se encolan y envían a través de Evolution API.
  5. Schedulers ejecutan sincronización de grupos/miembros, recordatorios y tareas de mantenimiento.
  6. Las métricas se exponen en /metrics (Prometheus o JSON).
  7. Un proxy interno en Bun sirve web y bot bajo el mismo dominio: /webhook y /metrics → bot; el resto → web. Actualmente, la compresión HTTP está desactivada temporalmente (sin Content-Encoding).

Uso básico

  • Los usuarios interactúan con comandos sencillos en WhatsApp para crear tareas, ver pendientes, asignarse o soltar.
  • Los administradores pueden aprobar o bloquear grupos cuando el modo de acceso está en discover/enforce.
  • Los recordatorios se configuran por usuario (frecuencia y hora) y respetan la zona horaria.
  • Formato de fechas en comandos: se aceptan YYYY-MM-DD y YY-MM-DD (YY → 20YY). También se admiten los tokens "hoy" y "mañana". Las fechas se almacenan normalizadas como YYYY-MM-DD y se muestran como dd/MM en los listados.

Instalación rápida

Requisitos:

  • Node.js LTS.
  • Acceso a una instancia de Evolution API.
  • URL pública para recibir el webhook.
  • Almacenamiento local para SQLite (directorio data/).

Pasos:

  • Clonar el repositorio e instalar dependencias.
  • Configurar variables de entorno.
  • Arrancar el servidor; la base de datos (data/tasks.db) y migraciones se gestionan automáticamente.

Recomendación: planificar copias de seguridad periódicas del directorio data/.

Configuración esencial

Variables clave:

  • EVOLUTION_API_URL, EVOLUTION_API_INSTANCE, EVOLUTION_API_KEY.
  • ADMIN_USERS (lista de IDs/JIDs autorizados).
  • GROUP_GATING_MODE: off | discover | enforce.
  • WHATSAPP_COMMUNITY_ID (para sincronización de grupos).
  • TZ (por defecto Europe/Madrid).
  • REMINDERS_GRACE_MINUTES (ventana de gracia tras la hora; por defecto 60).
  • ALLOWED_GROUPS (semilla inicial), NOTIFY_ADMINS_ON_DISCOVERY.
  • METRICS_ENABLED, PORT.
  • WEB_BASE_URL (host público de la web para generar enlaces absolutos; usado por /t web).
  • Rate limit: RATE_LIMIT_PER_MIN, RATE_LIMIT_BURST.
  • Intervalos y retención: GROUP_SYNC_INTERVAL_MS, GROUP_MEMBERS_SYNC_INTERVAL_MS, GROUP_MEMBERS_INACTIVE_RETENTION_DAYS.
  • DB_PATH: ruta al archivo SQLite. Tiene prioridad sobre DATA_DIR y permite aislar BD por rama/entorno. Ej.: DB_PATH='./data/tasks.db'
  • DATA_DIR: directorio raíz para la base de datos SQLite compartida (por defecto ./data).

Consulta:

  • docs/operations.md para operación, endpoints y variables de entorno.
  • docs/architecture.md para una visión técnica y responsabilidades por módulo.

Operación y mantenimiento

  • /metrics expone contadores y gauges; puede deshabilitarse por configuración.
  • Schedulers configurables; se evitan en entornos de test.
  • Migraciones up-only al arranque; logging de eventos de migración.
  • Copias de seguridad: respaldar el directorio data/ y planificar retención.

Pruebas (bun:test)

  • Suite web implementada con build programático: los tests construyen apps/web (adapter-node) una única vez, arrancan el servidor en un puerto efímero y hacen peticiones HTTP reales.
  • Sin dependencias externas: bun:test, bun:sqlite y helpers propios.
  • Cobertura actual: endpoints /api/me/tasks (gating, orden, búsqueda con ESCAPE, soonDays y paginación), /api/me/preferences (GET y POST) y página /app/preferences; además de helpers de servidor para build/arranque.
  • Ejecución: bun test tests/web

Estado y licencia

  • Nombre provisional: “Taskbot”.
  • Licencia por definir (software libre; se evaluará GPLv3/AGPL/MIT/Apache-2.0).
  • Etapa 1 (autenticación web): completada. /login (GET intermedio + POST), sesión con idle 2h, logout y ruta /app protegida; desplegado con proxy interno en Bun.
  • Etapa 2 (lectura de datos - MVP): completada. GET /api/me/tasks (orden por due_date asc con NULL al final, búsqueda con ESCAPE, filtros soonDays/dueBefore, paginación page/limit), GET /api/me/groups (contadores open/unassigned) y GET /api/groups/:id/tasks (unassignedFirst, onlyUnassigned, limit). UI: /app (Mis tareas, filtros/búsqueda/paginación) y /app/groups (bloque “sin responsable” con prefetch).
  • Etapa 3 (preferencias): completada. GET/POST /api/me/preferences y página /app/preferences con cálculo de “próximo recordatorio” coherente con la TZ y semántica del bot.
  • Edición de tareas en web: completada. Reclamar/soltar, editar fecha y descripción desde /app; completar tareas y mostrar “Completadas (24 h)”; reclamar desde /app/groups; lista "sin responsable" sin límite y fichas ordenadas por cantidad de "sin responsable" (con gating y validación).
  • Roadmap y contribuciones: pendientes de publicación.

Enlaces

  • Documentación de arquitectura: docs/architecture.md
  • Operación y configuración: docs/operations.md