# TOOLS.md - Echo (Unificat) ## Unelte comune ### Email (SMTP/IMAP) - **Cont principal:** Gmail (mmarius28@gmail.com) - folosit pentru trimitere - **Cont backup:** echo@romfast.ro (blocat MailChannels) - **Credențiale:** în `.env` (GMAIL_USER, GMAIL_PASSWORD) - **Trimitere:** `python3 tools/email_send.py "dest" "subiect" "corp"` - **From:** Echo - **Reply-To:** echo@romfast.ro (răspunsurile ajung aici pentru procesare) **Format email rapoarte:** - Font: 16px text, 18px titluri - Culori: albastru (#2563eb) pentru DONE, gri (#f3f4f6) pentru PROGRAMAT - Puține emoji-uri, link-uri vizibile - Titlu + acțiune combinate (ex: "A0 - Git commit si push") - Subject confirmare: "Re: [subject original]" - **Procesare inbox:** ```bash python3 tools/email_process.py # listează necitite python3 tools/email_process.py --all # listează toate python3 tools/email_process.py --save # salvează ca note în memory/kb/emails/ ``` ### 📧 Email Whitelist **Răspuns automat permis doar pentru:** - mmarius28@gmail.com (Marius - personal) - marius.mutu@romfast.ro (Marius - work) **Pentru orice altă adresă:** Citesc și raportez, aștept aprobare. **Flux email → note → insights:** 1. Marius face forward la `echo@romfast.ro` 2. La heartbeat sau manual: `python3 tools/email_process.py --save` 3. Emailul devine notă în `memory/kb/emails/YYYY-MM-DD_subiect.md` 4. Completez TL;DR și extrag insights în `memory/kb/insights/` 5. `python3 tools/update_notes_index.py` actualizează indexul ### 📧 Email Whitelist **Răspuns automat permis doar pentru:** - mmarius28@gmail.com (Marius - personal) - marius.mutu@romfast.ro (Marius - work) **Pentru orice altă adresă:** Citesc și raportez, aștept aprobare. ### Transcriere Audio/Video (Whisper) - **Model:** OpenAI Whisper (local, CPU) - **Dependințe:** PyTorch CPU, ffmpeg (static binary în ~/bin/) - **Venv:** `~/clawd/venv/` **Utilizare:** ```bash cd ~/clawd && source venv/bin/activate export PATH="$HOME/bin:$PATH" # Transcriere directă python3 -c " import whisper model = whisper.load_model('base') result = model.transcribe('/path/to/audio.mp3', language='ro') print(result['text']) " # Download de pe Google Drive + transcriere gdown 'FILE_ID' -O /tmp/audio.mp3 ``` **Modele disponibile:** - `tiny` - cel mai rapid, mai puțin precis - `base` - echilibru bun (folosit default) - `small`, `medium`, `large` - mai precise, mai lente **Formate suportate:** mp3, mp4, wav, m4a, webm, etc. (orice ffmpeg poate procesa) **Note:** - Pe CPU durează mai mult (~1x real-time pentru base) - Pentru română, base e suficient de precis - Transcrierea poate avea erori minore de recunoaștere ### Dashboard - **URL:** https://moltbot.tailf7372d.ts.net/echo/ - **Task add:** `python3 dashboard/update_task.py add in-progress "titlu"` - **Task done:** `python3 dashboard/update_task.py done ` - **Notes:** https://moltbot.tailf7372d.ts.net/echo/notes.html - **Files:** https://moltbot.tailf7372d.ts.net/echo/files.html - **API:** `dashboard/api.py` **Reguli dashboard:** - Tab Activity afișează task-uri din tasks.json, sortate descrescător după timestamp - Când creez/completez task-uri, să am timestamp complet (ISO format cu oră) ### KB (Knowledge Base) - **Folder:** memory/kb/ (youtube/, coaching/, insights/, projects/) - **Update index:** `python3 tools/update_notes_index.py` - **Pagina web:** https://moltbot.tailf7372d.ts.net/echo/notes.html - **Tags domeniu:** `@work`, `@health`, `@growth`, `@sprijin`, `@scout` - **Tags tip:** `@project`, `@fisa`, `@exercitiu`, `@meditatie`, `@reflectie` **IMPORTANT:** Când salvez orice notă (rețete, youtube, proiecte, etc.), trebuie să: 1. Salvez în subdirectorul potrivit din `memory/kb/` 2. Rulez `python3 tools/update_notes_index.py` pentru a actualiza indexul 3. Dau link-ul către pagina notes.html ### 🔍 Memory Search (Semantic Search) **Ce e:** Căutare semantică în fișierele `.md` din `memory/`. **Cum funcționează:** - Clawdbot indexează automat fișierele (watcher + debounce 1.5s) - Embeddings generate local cu Ollama (all-minilm, 384 dim) - Index stocat în `~/.clawdbot/memory/echo.sqlite` **Ce se indexează:** - ✅ `memory/*.md` - note zilnice, approved-tasks, etc. - ✅ `memory/kb/**/*.md` - toate notele din KB (youtube, coaching, insights, projects, etc.) **Când folosesc memory_search:** - Întrebări despre trecut: "ce am decis despre coaching" - Context recent: "ce s-a întâmplat ieri" **Comenzi:** ``` memory_search query="text" maxResults=5 memory_get path="memory/file.md" from=1 lines=50 ``` **Indexare automată:** La fiecare modificare fișier în memory/, Clawdbot: 1. Detectează schimbarea (watcher) 2. Așteaptă 1.5s (debounce) 3. Re-indexează DOAR fișierul modificat (incremental) 4. Celelalte fișiere rămân neatinse ### Procesare Bonuri Fiscale (PDF → Oracle) - **Script:** `python3 tools/process_bon.py [--save]` - **Comandă:** Când Marius trimite PDF + "procesează bon" sau "bon fiscal" - **Dry run:** fără `--save` - arată ce ar salva - **Salvare:** cu `--save` - salvează efectiv în Oracle **Flux:** 1. Marius trimite PDF pe WhatsApp/Discord 2. Marius scrie: "procesează bon" / "bon" / "adaugă bon" 3. Echo rulează dry run, arată rezultatul 4. Marius confirmă "ok" / "salvează" → Echo rulează cu --save **Ce face scriptul:** - OCR via roa2web API - SQLite: receipt complet - Oracle: partener + note contabile (ID_JTVA, TAXCODE, etc.) ### Git - **Repo:** ~/clawd → gitea.romfast.ro/romfast/clawd - **Commit:** `python3 tools/git_commit.py --push` ### ANAF Monitor - **Script:** `python3 tools/anaf-monitor/monitor_v2.py` - **Monitorizează:** D100, D101, D200, D390, D406, situații financiare, E-Factura ### Google Calendar - **Credentials:** `credentials/google-calendar.json` (OAuth client) - **Token:** `credentials/google-calendar-token.json` (auto-refresh) - **Acces:** Read + Write (`calendar.events`) - **Venv:** `~/clawd/venv/` (activate cu `source venv/bin/activate`) **Script:** `python3 tools/calendar_check.py [mode]` - `today` - evenimente azi + mâine - `week` - evenimente săptămâna curentă - `travel` - reminder-uri pentru NLP/București (bilete + cazare) - `busy` - verifică dacă e ocupat ACUM (pentru "nu deranja") - `soon [ore]` - evenimente în următoarele N ore (default 2) - `all` - toate cele de mai sus **Travel detection:** - Keywords: `nlp`, `bucuresti`, `bucurești`, `bucharest` - 7-11 zile înainte → "Cumpără bilete + asigură cazare" - 3-6 zile înainte → "⚠️ URGENT: Verifică dacă ai bilete!" **Creare evenimente (Python):** ```python from tools.calendar_check import create_event create_event( summary='Titlu', start_datetime='2026-02-05T15:00:00', duration_minutes=60, description='Opțional', reminders=[60, 15], # minute înainte (default: [30]) is_travel=False # True = reminders seara înainte + 2h ) ``` **Reminders automate:** - Evenimente normale: 30 min înainte - Evenimente travel (`is_travel=True`): seara înainte (18:00) + 2h înainte - Custom: `reminders=[120, 30]` = 2h + 30min **Integrat în:** - `morning-report` - azi/mâine/peste 2 zile + travel reminders - `evening-report` - mâine (reminder seară) - `weekly-planning-sun` - săptămâna următoare + travel - `respiratie-orar` - skip dacă busy în calendar - `heartbeat` - alertă dacă eveniment în <2h **Revocă accesul:** ### Pauze Respirație (Pattern Interrupt) - **Bancă tehnici:** `memory/kb/tehnici-pauza.md` - **Script:** `python3 tools/pauza_random.py` - alege random, afișează cu context - **Job:** `respiratie-orar` (09:00-19:00 București, orar) → #echo-self - **Format output:** ``` **Nume Tehnică** Pași de urmat 📊 Rezultat (ce obții) 📚 Sursă (autor/studiu) ``` **Flux actualizare tehnici:** 1. **Sursă:** Insights din video-uri/articole procesate, tehnici din NLP/coaching 2. **Cine:** Echo AUTOMAT prin job `insights-extract` (08:00 și 19:00 București) 3. **Ce caută:** respirație, relaxare, mindfulness, pattern interrupt, mișcare scurtă (1-5 min) 4. **Cum:** Verifică dacă nu există deja → adaugă în secțiunea potrivită (BIROU 09-17 / ACASĂ 18+) 5. **Format:** Nume ### → bullet pași → `- **Rezultat:**` → `- **Sursă:** [autor](link)` **Surse curente:** Tony Robbins, Wim Hof, Jon Kabat-Zinn (MBSR), Dr. Andrew Weil, Amy Cuddy, Cal Newport **Link-uri sursă:** - Notă din KB → `https://moltbot.tailf7372d.ts.net/echo/files.html#memory/kb/...` - Resursă externă → link direct (TED, Healthline, etc.) --- ## Cron Jobs | Oră (UTC) | Oră (București) | Job | Canal | Ce face | |-----------|-----------------|-----|-------|---------| | 00:00 | 02:00 | content-discovery | - | Caută video+articole pe teme recente → memory/kb/ | | 01:00 | 03:00 | night-execute-late | #echo-work | Continuă execuția task-uri (run 2) | | 03:00 | 05:00 | archive-tasks | #echo-work | Arhivează task-uri vechi | | 06:00,17:00 | 08:00,19:00 | insights-extract | - | Extrage insights din memory/kb/ + actualizează tehnici-pauza.md | | 06:30 | 08:30 | morning-report | 📧 EMAIL | Raport dimineață - vezi [FLUX-JOBURI.md](memory/kb/projects/FLUX-JOBURI.md) | | 07:00 | 09:00 | morning-coaching | #echo-self + 📧 | Gând + provocare → memory/kb/coaching/ | | 07-17 | 09-19 | respiratie-orar | #echo-self | Pauze orare (skip dacă busy în calendar) | | 15:00 mar,joi | 17:00 | project-checkin | #echo-work | Check-in Vending Master | | 18:00 | 20:00 | evening-report | 📧 EMAIL | Raport seară - vezi [FLUX-JOBURI.md](memory/kb/projects/FLUX-JOBURI.md) | | 19:00 | 21:00 | evening-coaching | #echo-self + 📧 | Reflecție seară → memory/kb/coaching/ | | 20:00 | 22:00 | seara-merit-reminder | #echo-self | Reminder lista "10 lucruri pentru care merit respect" | | 19:00 dum | 21:00 | weekly-planning | #echo-work | Planning săptămânal | | 21:00 | 23:00 | night-execute | #echo-work | Execută task-uri aprobate (run 1) | **Marcaje insights:** - `[ ]` = disponibil (rapoarte pot propune) - `[x]` = executat/implementat - `[—]` = skip/refuzat **Răspuns la rapoarte email:** Marius răspunde cu: - `1 pentru X,Y` = execută ACUM propunerile X și Y - `2 pentru X,Y` = pune în tasks pentru noaptea asta - `3 pentru X,Y` = NU (skip, marchez [—]) - Text liber = procesez și răspund La heartbeat verific inbox și procesez răspunsurile. **Răspuns la rapoarte email:** Marius răspunde cu: - `1 pentru X,Y` = execută ACUM propunerile X și Y - `2 pentru X,Y` = pune în tasks pentru noaptea asta - `3 pentru X,Y` = NU (skip, marchez [—]) - Text liber = procesez și răspund La heartbeat verific inbox și procesez răspunsurile. **Comenzi:** ```bash cron action=list # vezi toate joburile cron action=run jobId=X # rulează manual cron action=update jobId=X # modifică job ``` **Regulă:** Când modific joburi, actualizez și acest tabel! --- ## Infrastructură ### Servicii LLM/AI locale | LXC | Serviciu | IP:Port | Utilizare | |-----|----------|---------|-----------| | flowise (104) | **Ollama** | 10.0.20.161:11434 | Embeddings (all-minilm), LLM local | | flowise (104) | Flowise | 10.0.20.161:3000 | Flow builder | | dokploy (103) | Dokploy | 10.0.20.? | Deployment platform | **Modele Ollama disponibile:** - `all-minilm` - embeddings rapid (45MB) ← **folosit pentru memory_search** - `nomic-embed-text` - embeddings calitate (274MB) - `llama3.2:3b-instruct-q8_0` - LLM conversație (3.4GB) - `smollm:135m` - LLM mic rapid (91MB) --- ### Docker LXC (portainer) - **Host:** 10.0.20.170 (LXC 100 pe pvemini) - **User:** echo - **SSH:** `ssh echo@10.0.20.170` - **Portainer:** https://10.0.20.170:9443 - **Docker:** v28.3.3 + Compose v2.39.1 - **Resurse:** 1GB RAM, 20GB disk - **Proiecte:** `/opt/docker/` **Containere:** | Container | Port | Status | Descriere | |-----------|------|--------|-----------| | portainer | 9443 | ✅ | Management Docker | | nginx | 443, 8080 | ✅ | Reverse proxy | | roa-efactura | 5003 | ⚠️ | E-Factura ANAF | | pdf-qr-app | 5002 | ✅ | QR facturi | | flask_app | 5001 | ✅ | ROA Flask | | bt-web-automation | 5000, 8081 | ✅ | BT automation | | pulse | 7655 | ✅ | Monitoring Proxmox | | wol-manager | - | ✅ | Wake-on-LAN | | rustdesk (hbbs+hbbr) | 21115-21119 | ✅ | Remote desktop server | **Proiecte docker-compose:** - `/opt/docker/docker-compose.yaml` - stack principal (nginx, flask, efactura, qr) - `/opt/docker/wol/docker-compose.yml` - Wake-on-LAN - `/opt/docker/qrinvoice/docker-compose.yml` - QR Invoice app --- ### Proxmox Cluster (3 noduri) **User:** echo | **Acces:** doar din 10.0.20.173 (moltbot) | **Sudo:** qm, pct, pvesh #### pveelite (10.0.20.202) - **Resurse:** 16GB RAM, 557GB disk - **SSH:** `ssh echo@10.0.20.202` - **Scripturi:** `/opt/scripts/` - `oracle-backup-monitor-proxmox.sh` - zilnic 21:00, verifică backup Oracle - `weekly-dr-test-proxmox.sh` - sâmbătă 06:00, test restore Oracle DR (VM 109) | VMID | Tip | Nume | Status | |------|-----|------|--------| | 109 | VM | oracle-dr-windows | stopped | | 101 | LXC | minecraft | stopped | | 110 | LXC | moltbot | running | | 301 | LXC | docker-portainer-template | stopped | #### pvemini (10.0.20.201) - **Resurse:** 64GB RAM, 1.4TB disk - **SSH:** `ssh echo@10.0.20.201` - **Scripturi monitorizare:** `/opt/scripts/` - `ha-monitor.sh` - status cluster HA - `monitor-ssl-certificates.sh` - verifică SSL-uri zilnic - `ups-shutdown-cluster.sh` - shutdown orchestrat la UPS critic - `ups-monthly-test.sh` - test baterie UPS lunar (1 ale lunii) - `ups-maintenance-shutdown.sh` - shutdown pentru mentenanță UPS - `vm107-monitor.sh` - monitorizează VM 107 - **Emailuri automate:** backup, cluster status, UPS, restore Oracle (sâmbătă) | Cron | Oră | Script/Job | |------|-----|------------| | Zilnic 00:00 | ha-monitor.sh | Status cluster HA | | 1 ale lunii 00:00 | ups-monthly-test.sh | Test baterie UPS | | Zilnic 02:00 | vzdump backup | VM 100,108,104,106,201,171 → storage "backup" | | Zilnic 22:00 | vzdump backup | LXC 101,110 (moltbot) → backup-pvemini-nfs | | VMID | Tip | Nume | Status | |------|-----|------|--------| | 201 | VM | roacentral | running | | 300 | VM | Win11-Template | stopped | | 302 | VM | oracle-test-302 | stopped | | 100 | LXC | portainer | running | | 103 | LXC | dokploy | running | | 104 | LXC | flowise | running | | 105 | LXC | test | stopped | | 106 | LXC | gitea | running | | 108 | LXC | central-oracle | running | | 171 | LXC | claude-agent | running | ##### LXC 171 - claude-agent (Development Environment) - **IP:** 10.0.20.171 - **Resurse:** 4 cores, 16GB RAM, 32GB disk - **OS:** Ubuntu (unprivileged, nesting enabled) - **Tailscale:** Da (acces remote) **Servicii:** - `code-server@claude` — VS Code în browser - `ttyd` — Web Terminal - `ssh` — acces direct **Claude Code:** - Instalat și configurat - Git configurat pentru `gitea.romfast.ro` - Mod interactiv: `claude` (în terminal) - Mod programatic: `claude -p "task description"` — pentru sarcini automatizate **Utilizare:** ```bash # Acces SSH ssh user@10.0.20.171 # Sau prin Proxmox ssh echo@10.0.20.201 "sudo pct exec 171 -- bash" # Claude Code - interactiv claude # Claude Code - task direct claude -p "descrie sarcina aici" ``` #### pve1 (10.0.20.200) - **Resurse:** 32GB RAM, 1.3TB disk - **SSH:** `ssh echo@10.0.20.200` - **Status:** Gol (fără VM/LXC) --- ## Unelte per domeniu ### Self (wellbeing, coaching) - **Ritual zilnic:** 08:00 și 23:00 - citate cu format specific - Tehnici CNV, NLP, Sleight of Mouth - Tracking sănătate (de creat) - Resurse NMG (de adăugat) - Post negru tracker (de creat) ### Sprijin (grup joi) - **Notes:** filtru `@sprijin` pe https://moltbot.tailf7372d.ts.net/echo/notes.html - **Proiect:** `memory/kb/projects/grup-sprijin/` - **Biblioteca activități:** `memory/kb/projects/grup-sprijin/biblioteca.json` - **Fișe:** `memory/kb/projects/grup-sprijin/fise/` - **Template:** `memory/kb/projects/grup-sprijin/template-fisa.md` ### Scout (cercetași) - Template activități scout - Locații Constanța (de completat) - Contacte echipă (de completat) --- ## YouTube Subtitle Download (Rate Limit Protected) **Script:** `python3 tools/yt_download.py URL [URL2] ...` **Setup:** - Cookies: `credentials/youtube-cookies.txt` (export din browser) - Deno: `~/.deno/bin/deno` (pentru JS challenges) **Limite:** - Max 30 video-uri per sesiune - Sleep 20s între downloads - Progressive retry: 2h → 4h → 24h **Rate limit state:** `memory/youtube-rate-limit.json` **Exit codes:** - 0 = success - 1 = some errors - 2 = rate limited (429) - 3 = în cooldown, retry mai târziu **Verificare status:** ```bash python3 tools/yt_download.py # fără args = arată status cat memory/youtube-rate-limit.json ```