Monorepo con Next.js, Supabase, LangGraph y OpenRouter. Incluye chat web, onboarding, ajustes y bot de Telegram (opcional).
- Node.js 20 o superior (recomendado LTS).
- npm 10+ (incluido con Node.js 20+).
- Cuenta en Supabase (gratis).
- Cuenta en OpenRouter para la API del modelo (clave de API).
- (Opcional) Bot de Telegram creado con @BotFather y una URL HTTPS pública para el webhook (en local suele usarse ngrok o similar).
cd agents
npm install- Entra en el dashboard de Supabase y crea un nuevo proyecto.
- Espera a que termine el aprovisionamiento.
- En Project Settings → API anota:
- Project URL → será
NEXT_PUBLIC_SUPABASE_URL anonpublic → seráNEXT_PUBLIC_SUPABASE_ANON_KEYservice_rolesecret → seráSUPABASE_SERVICE_ROLE_KEY(no la expongas al cliente ni la subas a repositorios públicos).
- Project URL → será
-
En Supabase, abre SQL Editor.
-
Abre el archivo del repo:
packages/db/supabase/migrations/00001_initial_schema.sql -
Copia todo el contenido y pégalo en el editor.
-
Ejecuta el script (Run).
Si algo falla (por ejemplo, el trigger on_auth_user_created en un proyecto ya modificado), revisa el mensaje de error; en la mayoría de proyectos nuevos el script aplica de una vez.
- En Supabase: Authentication → Providers → habilita Email (por defecto suele estar activo).
- Authentication → URL configuration:
- Site URL: para desarrollo local usa
http://localhost:3000 - Redirect URLs: añade al menos:
http://localhost:3000/auth/callbackhttp://localhost:3000/**(o la variante que permita tu versión del dashboard para desarrollo)
- Site URL: para desarrollo local usa
Así el flujo de login/signup y el intercambio de código en /auth/callback funcionan en local.
Next.js carga .env* desde el directorio de la app apps/web, no desde la raíz del monorepo.
-
Copia el ejemplo:
cp .env.example apps/web/.env.local
(Si ya tienes
.env.localen la raíz, mueve o copia ese archivo aapps/web/.env.local.) -
Edita
apps/web/.env.localy completa:Variable Descripción NEXT_PUBLIC_SUPABASE_URLURL del proyecto Supabase NEXT_PUBLIC_SUPABASE_ANON_KEYClave anonSUPABASE_SERVICE_ROLE_KEYClave service_role(solo servidor; la usa la API del agente y Telegram contra Postgres)OPENROUTER_API_KEYClave de OpenRouter TELEGRAM_BOT_TOKEN(Opcional) Token del bot TELEGRAM_WEBHOOK_SECRET(Opcional) Secreto que Telegram enviará en cabecera; debe coincidir con el configurado al registrar el webhook OAUTH_ENCRYPTION_KEYReservado para cifrado de tokens OAuth en el futuro; puedes dejar un placeholder hasta integrar proveedores
Referencia de nombres: .env.example.
Desde la raíz del repo:
npm run devPor defecto Turbo ejecuta el dev de cada paquete; la app suele quedar en http://localhost:3000.
Flujo esperado:
- Registro en
/signupo login en/login. - Onboarding (perfil, agente, herramientas, revisión).
- Chat en
/chaty ajustes en/settings.
- Confirma que
OPENROUTER_API_KEYestá enapps/web/.env.local. - En el onboarding, activa al menos las herramientas básicas (
get_user_preferences,list_enabled_tools) si quieres probar tool calling. - Escribe un mensaje en
/chat. Si la clave o el modelo fallan, revisa la consola del servidor (terminal donde correnpm run dev).
El modelo por defecto está definido en packages/agent/src/model.ts (OpenRouter, openai/gpt-4o-mini). Puedes cambiarlo ahí si lo necesitas.
Telegram exige HTTPS para webhooks. En local:
-
Crea el bot con BotFather y copia el token →
TELEGRAM_BOT_TOKENenapps/web/.env.local. -
Elige un secreto aleatorio →
TELEGRAM_WEBHOOK_SECRET(mismo valor usarás al registrar el webhook). -
Expón tu app local con un túnel HTTPS, por ejemplo:
ngrok http 3000
Usa la URL HTTPS que te dé ngrok (p. ej.
https://abc123.ngrok-free.app). -
Con la app en marcha, visita en el navegador (sustituye la URL base):
https://TU_URL_NGROK/api/telegram/setupEso llama a
setWebhookde Telegram apuntando a/api/telegram/webhooky, si definiste secreto, lo asocia al webhook. -
En la web, entra a Ajustes → Telegram → Generar código de vinculación.
-
En Telegram, envía al bot:
/link TU_CODIGO(el código que te muestra la web).
Después de vincular, los mensajes al bot usan el mismo pipeline que el chat web.
| Comando | Descripción |
|---|---|
npm run dev |
Desarrollo (monorepo) |
npm run build |
Build de todos los paquetes que definan build |
npm run lint |
Lint |
cd apps/web && npx next build |
Build solo de la app Next (útil para comprobar tipos antes de desplegar) |
- docs/brief.md — visión y brief original.
- docs/architecture.md — arquitectura técnica del MVP.
- docs/plan.md — fases y decisiones de implementación.
- Redirecciones infinitas o “no auth”: revisa
Site URLyRedirect URLsen Supabase y que.env.localesté enapps/web. - Errores al guardar perfil o mensajes: confirma que ejecutaste la migración SQL y que RLS no bloquea por falta de sesión (debes estar logueado con el mismo usuario).
- Chat sin respuesta / 500 en
/api/chat:OPENROUTER_API_KEY, cuota en OpenRouter o modelo enmodel.ts. - Telegram no responde: webhook debe ser HTTPS; token y secreto correctos; visita de nuevo
/api/telegram/setupsi cambias la URL pública.
Si quieres, el siguiente paso natural es desplegar Vercel (o similar) para apps/web, definir las mismas variables de entorno en el panel del proveedor y usar la URL de producción en Supabase y en el webhook de Telegram.