# Echo Core — Architecture & Decisions ## Development History | Stage | Commit | Description | |-------|--------|-------------| | 1 | f2973aa | Project Bootstrap — structura, git, venv | | 2 | 010580b | Secrets Manager — keyring, CLI `eco secrets set/list/test` | | 3 | 339866b | Claude CLI Wrapper — start/resume/clear sessions cu `claude --resume` | | 4 | 6cd155b | Discord Bot Minimal — online, /ping, /channel add, /admin add, /setup | | 5 | a1a6ca9 | Discord + Claude Chat — conversatii complete, typing indicator, message split | | 6 | 5bdceff | Model Selection — /model opus/sonnet/haiku, default per canal | | 7 | 09d3de0 | CLI Tool — eco status/doctor/restart/logs/sessions/channel/send | | 8 | 24a4d87 | Cron Scheduler — APScheduler, /cron add/list/run/enable/disable | | 9 | 0bc4b8c | Heartbeat — verificari periodice (email, calendar, kb index, git) | | 10 | 0ecfa63 | Memory Search — Ollama all-minilm embeddings + SQLite semantic search | | 10.5 | 85c72e4 | Rename secrets.py, enhanced /status, usage tracking | | 11 | d1bb67a | Security Hardening — prompt injection, invocation/security logging, extended doctor | | 12 | 2d8e56d | Telegram Bot — python-telegram-bot, commands, inline keyboards | | 13 | 80502b7 + 624eb09 | WhatsApp Bridge — Baileys Node.js bridge + Python adapter | | Systemd | 6454f0f | Echo Core + WhatsApp bridge as systemd user services | | Setup | setup.sh | Interactive 10-step onboarding wizard | ## Architectural Decisions - **Claude invocation**: Claude Code CLI cu `--resume` pentru sesiuni persistente - **Credentials**: keyring (nu plain text pe disk), subprocess isolation - **Discord**: slash commands (`/`), canale asociate dinamic - **Telegram**: commands + inline keyboards, @mention/reply in groups - **WhatsApp**: Baileys Node.js bridge + Python polling adapter, separate auth namespace - **Cron**: APScheduler, sesiuni izolate per job, `--allowedTools` per job - **Heartbeat**: verificari periodice, quiet hours (23-08), state tracking - **Memory Search**: Ollama all-minilm (384 dim), SQLite, cosine similarity - **Security**: prompt injection markers, separate security.log, extended doctor - **Concurrency**: Discord + Telegram + WhatsApp in same asyncio event loop via gather ## Infrastructure - **Ollama:** http://10.0.20.161:11434 (all-minilm, llama3.2, nomic-embed-text) - **Services:** systemd user services (`echo-core`, `echo-whatsapp-bridge`) - **CLI:** `eco` (installed at `~/.local/bin/eco` by setup.sh) ## Key Files | File | Description | |------|-------------| | `src/main.py` | Entry point — Discord + Telegram + WhatsApp + scheduler + heartbeat | | `src/claude_session.py` | Claude Code CLI wrapper cu --resume, injection protection | | `src/router.py` | Message routing (command vs Claude) | | `src/scheduler.py` | APScheduler cron jobs | | `src/heartbeat.py` | Verificari periodice | | `src/memory_search.py` | Semantic search — Ollama embeddings + SQLite | | `src/credential_store.py` | Credential broker (keyring) | | `src/config.py` | Config loader (config.json) | | `src/adapters/discord_bot.py` | Discord bot cu slash commands | | `src/adapters/telegram_bot.py` | Telegram bot cu commands + inline keyboards | | `src/adapters/whatsapp.py` | WhatsApp adapter — polls Node.js bridge | | `bridge/whatsapp/index.js` | Node.js WhatsApp bridge — Baileys + Express | | `cli.py` | CLI tool (installed as `eco`) | | `setup.sh` | Interactive setup wizard — 10-step onboarding | | `config.json` | Runtime config (channels, telegram_channels, whatsapp, admins, models) |