Files

2.3 KiB

Development

Prerequisites

  • Node.js ≥ 20 (LTS)
  • Docker + Docker Compose
  • Access to the DSM mem0_net network (for mem0-postgres and litellm)

Environment setup

cd bot
cp .env.example .env

Fill in at minimum:

Var Value Source
BOT_TOKEN Telegram bot token @BotFather
LLM_API_KEY LiteLLM master key ../SECRETS.md (mem0 LiteLLM)
POSTGRES_PASSWORD mem0 postgres password ../SECRETS.md
N8N_API_KEY n8n API key (Phase 2 tools) ../SECRETS.md

Local development (long-polling, no public URL)

npm install
npm run dev

With no TELEGRAM_WEBHOOK_URL set, the bot falls back to long-polling — you can chat with it immediately without any public endpoint or tunnel.

Docker development mode (bind mount + hot reload)

docker compose -f docker-compose.dev.yml up -d --build

./src, ./package.json, ./tsconfig.json are bind-mounted; npm run dev runs tsx watch, so editing a source file restarts the Node process without rebuilding the image.

Webhook (production-style)

  1. Set TELEGRAM_WEBHOOK_URL=https://bot.digikedai.com/<secret>/webhook and TELEGRAM_WEBHOOK_SECRET=<secret>.
  2. Ensure the public route reaches the container (Traefik label or reverse proxy).
  3. On startup the bot calls setWebhook automatically.

For local webhook testing without a public DNS, use a temporary tunnel (e.g. Cloudflare cloudflared tunnel --url http://localhost:8080) and set the URL to the tunnel's https://… address. Document the tunnel choice and its security scope before relying on it in production.

Tests

npm test            # vitest run
npm run test:watch  # watch mode
npm run typecheck   # tsc --noEmit

Test coverage:

  • tests/normalize.test.ts — Telegram → normalized message contract
  • tests/config.test.ts — env validation and user allowlist
  • tests/prompt.test.ts — system/business prompt assembly + no-info-leak
  • tests/agent.test.ts — agent orchestration with a mock LLM
  • tests/commands.test.ts — /start & /help tri-lingual routing

Manual smoke test

  1. Start the bot (dev or docker dev).
  2. Open the bot in Telegram, send /start → expect the tri-lingual greeting.
  3. Send a normal question → expect an AI reply.
  4. curl http://localhost:8080/health{"status":"ok"}.