# TOOLS.md - Echo ## Reguli utilizare unelte - **Ai folosit un tool cu succes în conversația curentă → e disponibil în continuare.** Nu spune niciodată "nu am acces" la un tool tocmai folosit. - **Un tool eșuează → oferă imediat o alternativă practică**, nu cere utilizatorului să configureze ceva. Ex: emailul nu merge → formatează textul frumos și spune "copiază de aici". - **Verifică întâi, vorbește pe urmă.** Înainte să spui "nu pot", încearcă tool-ul. Ai calendar_check.py → rulează-l, nu presupune că nu funcționează. - **Git = execută direct**, e pre-aprobat (vezi § Git). ## Unelte principale ### Email - **Trimitere:** `python3 tools/email_send.py "dest" "subiect" "corp"` - **Procesare:** `python3 tools/email_process.py [--save|--all]` - **From:** Echo Core | **Reply-To:** echo@romfast.ro - **Format rapoarte:** 16px text, 18px titluri, albastru (#2563eb) DONE, gri (#f3f4f6) PROGRAMAT ### Dashboard - **URL:** https://moltbot.tailf7372d.ts.net/echo/ - **Issues:** editez direct `dashboard/issues.json` - **Pagini:** /echo/notes.html | /echo/files.html | /echo/habits.html ### Git - **Repo:** gitea.romfast.ro/romfast/echo-core | `python3 tools/git_commit.py --push` - **⚠️ Git e PRE-APROBAT** via `--allowedTools` (add, commit, push, status, diff, log). Execut DIRECT, fără a cere confirmare — NU spun "am nevoie de aprobare". ### Calendar - **Credentials:** credentials/google-calendar.json + google-calendar-token.json - **Moduri:** `python3 tools/calendar_check.py [today|week|travel|busy|soon|all]` - **Travel detection:** keywords nlp/bucuresti, alertă bilete 7-11 zile înainte ### KB - **Folder:** memory/kb/ (youtube/, coaching/, insights/, projects/) - **Update:** `python3 tools/update_notes_index.py` (după orice salvare în kb/) - **Tags domeniu:** @work, @health, @growth, @sprijin, @scout | **Tags tip:** @project, @fisa, @exercitiu, @meditatie, @reflectie - **Web:** https://moltbot.tailf7372d.ts.net/echo/notes.html ### Memory Search - `memory_search query="text"` → caută semantic în memory/ | `memory_get path="..." from=N lines=M` → snippet - **Index:** memory/echo.sqlite (Ollama all-minilm embeddings) ### ANAF Monitor - **Script:** `python3 tools/anaf-monitor/monitor_v2.py` (v2.2) — hash detection, version extraction, diff, snapshots - **Job:** 10:00 și 16:00 București, luni-vineri ### Procesare Bonuri - **Script:** `python3 tools/process_bon.py [--save]` | **Flux:** dry run → confirmare → --save (Oracle + SQLite) ### YouTube Subtitles - **Script:** `python3 tools/youtube_subs.py URL [lang]` → titlu + transcript clean - **Flux după procesare:** 1. Salvează nota în `memory/kb/youtube/YYYY-MM-DD_slug.md` 2. `python3 tools/update_notes_index.py` → actualizează notes.html 3. Include în răspuns link-ul Tailscale la notă: `https://moltbot.tailf7372d.ts.net/echo/notes.html#notes-data/youtube/YYYY-MM-DD_slug` ### Whisper - **Venv:** ~/echo-core/.venv/ | **Model:** base - `whisper.load_model('base').transcribe(path, language='ro')` ### Discord Voice - **Ce este:** bot în voice channel Discord — ascultă microfonul, transcrie cu faster-whisper (`small` int8, RO), rutează prin router, răspunde rostit prin TTS. - **Cum sunt "în voce":** slash `/voice join`; `/voice leave` sau auto-leave după 5 minute fără voce. - **Latență:** ~5s end-to-end (STT p50 2.25s + LLM + TTS first chunk). Peste 3s pornesc filler audio ("Stai să-mi adun gândurile"). - **Streaming TTS:** răspunsul iese pe clauze — primul sunet pleacă imediat ce am o propoziție scurtă. - **Limitări:** 1-3 propoziții max (vezi VOICE_MODE.md / AGENTS.md § Voice mode). Cuvinte rare, nume proprii, acronime pot apărea greșit în STT → cer reformulare în loc să ghicesc. #### TTS: engine pocket-tts + Supertonic - **Motoare:** `supertonic` (voci predefinite M1-M5/F1-F5, server local `:7788`) și `pockettts` (Kyutai pocket-tts, voice cloning din sample WAV, server local `:7789`, config `tts.pockettts_url`). - **Rutare (`tools/tts.py::synthesize`):** engine-ul se decide din catalogul `tts_voices.json` — fiecare voce are un `engine`. Voce necatalogată → cade pe `tts.default_engine` din `config.json`. Pocket-tts indisponibil tehnic (connect error / 5xx) → fallback automat pe Supertonic pentru cererea curentă; erorile de conținut (voce inexistentă, `.safetensors` lipsă) NU declanșează fallback, se raportează direct. - **pocket-tts e engleză-only:** modelul nu suportă română. `tools/tts.py::_synthesize_pockettts` respinge direct (fără request la server) orice text cu diacritice RO (ă/â/î/ș/ț); în voice mode, `src/voice/tts_stream.py` transliterează diacriticele scăpate la ASCII ca vocea configurată să continue. Text pentru o voce pockettts (Marius 1-4, Paula 1-3, alba) → scris în engleză de la bun început. Pe turnurile voice, router-ul injectează automat markerul `[tts-lang:en ...]` în prefix când vocea activă e pockettts — vezi regula de limbă din VOICE_MODE.md. - **Catalog voci:** `tts_voices.json` — sursă live pentru autocomplete pe `/audio` și `/voice setvoice` (voce nouă apare imediat, fără redeploy). pocket-tts: `{"engine": "pockettts", "state_path": "models/voices/.safetensors"}`. supertonic: `{"engine": "supertonic"}`. - **`/voice engine `:** schimbă `tts.default_engine` în config.json (persistă, aplicat de la următoarea sinteză fără voce catalogată explicit). - **`/voice setvoice `:** schimbă vocea implicită (autocomplete din `tts_voices.json`); dacă sunt deja în voice channel, swap live pe sesiunea curentă. - **`/voice addvoice `:** clonează voce nouă din sample WAV (min 3s). Oprește temporar `pocket-tts.service`, rulează `tools/pocket_tts_add_voice.py` în `.venv-pockettts/` (niciodată `.venv` principal) care exportă `.safetensors` și scrie catalogul prin `src.jsonlock`, repornește serviciul, trimite preview audio. - **`/voice doctor`:** health-check — libopus, eroare încărcare voce, `hf_token` în keyring, ping `GET /health` pe serverul pocket-tts (config-driven URL, timeout 3s). - **`/audio [voce]`:** TTS ad-hoc în afara unui voice channel — text sau URL → voice note pe canal; autocomplete voce din același catalog. ### Discord — trimite fișier direct (audio, imagini) - **Script:** `python3 tools/discord_send_file.py --channel --file /path --text "mesaj opțional"` - **De ce nu merge `__AUDIO__:`:** convenția aia (din `fast_commands.py`) e interceptată de `discord_bot.py` doar când niciun bloc de text n-a fost deja trimis pe canal în turul curent. Într-un răspuns conversațional normal fiecare bloc de text e streamat live → `__AUDIO__:` ajunge trimis ca text brut, nu attachment. Nu folosi trucul pentru fișiere din conversație normală. - **Channel ID:** dacă nu-l ai din context, citește `sessions/active.json` (cheia `channel_id`; de regulă o singură sesiune activă). - **Modul Python:** `from tools.discord_send_file import send_file` → `send_file(channel_id, path, content="text opțional")` ### Pauze respirație - **Script:** `python3 tools/pauza_random.py` | **Bancă:** memory/kb/tehnici-pauza.md - **Format:** **Nume** → pași → 📊 Rezultat → 📚 Sursă | **Actualizare:** automat via insights-extract job ### Ralph Workflow (Autonomous Code Generation) - **Generator PRD:** `python3 tools/ralph_prd_generator.py` (PRD + prd.json) - **Wrapper:** `python3 tools/ralph_workflow.py` (lansare completă PRD + Ralph) - **Loop autonom:** `ralph.sh` — copiat în fiecare proiect, apelează Claude Code (Sonnet) - **Workspace:** `~/workspace/` - **Comenzi Python:** `create_prd_and_json(name, description, workspace)` → PRD + prd.json | `run_ralph(prd_json, max_iter, bg)` → loop autonom | `check_status(project_dir)` → progres stories - **Model:** Opus (PRD/stories) → Sonnet (implementare) | **Doc:** `memory/kb/tools/ralph-workflow.md` ## Cron Jobs - **Principale:** morning-report (08:30), morning-coaching (09:00), respiratie-orar (09-19), anaf-monitor (10:00,16:00), evening-report (20:00), evening-coaching (21:00), night-execute (23:00) - **Secundare:** content-discovery (02:00), security-audit (07:00), insights-extract (08:00,19:00), archive-tasks (05:00), project-checkin (17:00 mar,joi), night-execute-late (03:00), weekly-planning (21:00 dum) - **Lista completă:** memory/kb/tools/cron-jobs.md | **Comenzi:** `cron action=list|run|update jobId=X` ## Infrastructură - **Proxmox:** 3 noduri (pveelite .202, pvemini .201, pve1 .200) | **User:** echo - **Docker:** LXC 100 — 10.0.20.170:9443 (portainer) - **Ollama:** LXC 104 — 10.0.20.161:11434 (all-minilm embeddings) - **Detalii:** memory/kb/tools/infrastructure.md ## Unelte per domeniu - **Sprijin (grup joi):** proiect `memory/kb/projects/grup-sprijin/`; `biblioteca.json` | fișe `fise/` - **Self:** ritual coaching 08:00 și 23:00; tehnici CNV, NLP, Sleight of Mouth