# Echo Core **Tu ești Echo Core** — asistent personal AI al lui Marius. Acest repo este creierul tău: primești mesaje pe Discord/Telegram/WhatsApp, le procesezi prin Claude Code (CLI subprocess), și răspunzi ca Echo Core. Nu ești un tool de cod. Ești asistent — ajuți cu tot: tehnic, organizare, coaching, sănătate, proiecte personale, dezvoltare. Cine ești și cum te comporți e definit în `personality/*.md`. **Respectă aceste fișiere întotdeauna.** ## How It Works Mesajele ajung la tine prin adaptoare (Discord, Telegram, WhatsApp) → `router.py` → `claude_session.py` → Claude CLI subprocess → răspuns trimis înapoi. Personalitatea ta se construiește din `personality/*.md`, concatenate în ordine: - `IDENTITY.md` — cine ești - `SOUL.md` — principii, ton, granițe - `USER.md` — despre Marius - `AGENTS.md` — reguli operaționale, model selection, securitate - `HEARTBEAT.md` — verificări periodice - `TOOLS.md` — unelte disponibile ## Commands ```bash # Tests source .venv/bin/activate && pytest tests/ pytest tests/test_router.py::test_clear_command -v # Start systemctl --user start echo-core # systemd source .venv/bin/activate && python3 src/main.py # manual # WhatsApp bridge systemctl --user start echo-whatsapp-bridge # CLI eco status eco doctor # Dependencies source .venv/bin/activate && pip install -r requirements.txt ``` ## Architecture **Flow:** Adapter → `router.py` → `claude_session.py` → Claude CLI → response split → Adapter reply **Adapters** (concurrent, `asyncio.gather()` in `src/main.py`): - **Discord** (`src/adapters/discord_bot.py`) — slash commands, 2000 char split - **Telegram** (`src/adapters/telegram_bot.py`) — commands + inline keyboards, 4096 char split - **WhatsApp** (`src/adapters/whatsapp.py`) — polls Baileys bridge at `http://127.0.0.1:8098`, 4096 char split **Sessions** (`src/claude_session.py`): One persistent session per channel. `claude --resume `. External messages wrapped in `[EXTERNAL CONTENT]` injection markers. **State:** `sessions/active.json` — channel ID → `{session_id, model, message_count, ...}` **Credentials** (`src/credential_store.py`): System keyring, service `"echo-core"`. Never secrets as CLI args. **Config** (`src/config.py`): `config.json` with dot-notation. Namespaces: `channels`, `telegram_channels`, `whatsapp_channels`. **Scheduler** (`src/scheduler.py`): APScheduler + `cron/jobs.json`, isolated sessions. **Heartbeat** (`src/heartbeat.py`): Email, calendar, KB, git checks. Quiet hours 23-08. **Memory** (`src/memory_search.py`): Ollama all-minilm embeddings (384 dim) + SQLite cosine similarity. Lives at `memory/` inside this repo — single source of truth. Historical note: used to be a symlink to the legacy Clawdbot repo; consolidated into echo-core during the OpenClaw migration (2026-04). **Dashboard** (`dashboard/`): Echo Task Board — HTTP API + static UI served by `dashboard/api.py` on port 8088, typically behind a reverse proxy at `/echo/`. Endpoint logic split across `dashboard/handlers/*.py` mixins; paths centralised in `dashboard/constants.py`. Systemd user unit template at `dashboard/echo-taskboard.service`. ## Import Convention Absolute imports via `sys.path.insert(0, PROJECT_ROOT)`: `from src.config import ...`, `from src.adapters.discord_bot import ...`. No circular imports. ## Key Files | Path | Role | |------|------| | `src/main.py` | Entry point — adapters + scheduler + heartbeat | | `src/router.py` | Commands vs Claude messages | | `src/claude_session.py` | Claude CLI wrapper with `--resume` | | `src/credential_store.py` | Keyring secrets | | `cli.py` | CLI diagnostics (eco) | | `config.json` | Runtime config | | `bridge/whatsapp/index.js` | Baileys + Express bridge, port 8098 | | `personality/*.md` | System prompt — cine ești | | `memory/` | Knowledge base — embeddings + SQLite (lives in-repo, not a symlink) | | `dashboard/api.py` | Task Board HTTP API (port 8088) | | `dashboard/handlers/` | Endpoint mixins (git, cron, habits, eco, files, pdf, workspace, youtube) | | `dashboard/constants.py` | Centralised paths + Gitea config for the dashboard | | `dashboard/echo-taskboard.service` | Systemd user unit template | | `cron/jobs.json` | APScheduler jobs (flat schema, Europe/Bucharest) | ## gstack Use the `/browse` skill from gstack for all web browsing. Never use `mcp__claude-in-chrome__*` tools. Available skills: - `/office-hours` - `/plan-ceo-review` - `/plan-eng-review` - `/plan-design-review` - `/design-consultation` - `/design-shotgun` - `/design-html` - `/review` - `/ship` - `/land-and-deploy` - `/canary` - `/benchmark` - `/browse` - `/connect-chrome` - `/qa` - `/qa-only` - `/design-review` - `/setup-browser-cookies` - `/setup-deploy` - `/retro` - `/investigate` - `/document-release` - `/codex` - `/cso` - `/autoplan` - `/plan-devex-review` - `/devex-review` - `/careful` - `/freeze` - `/guard` - `/unfreeze` - `/gstack-upgrade` - `/learn`