chore(kb): notițe youtube mai, fix email tools, update newsletter/anaf-monitor

Adaugă 4 notițe YouTube (llama.cpp, Mario Zechner, bonificatie impozit,
AI scaffolding) + notă coaching grok. Actualizează index KB.
Fix email_digest și email_forward. Update newsletter cercetasi + cron jobs.
ANAF monitor hashes/snapshots/versions la zi.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-13 21:02:55 +00:00
parent f04e033dbe
commit 3570d9a625
16 changed files with 676 additions and 72 deletions

View File

@@ -37,9 +37,9 @@
"report_on": "changes", "report_on": "changes",
"timeout": 120, "timeout": 120,
"enabled": true, "enabled": true,
"last_run": "2026-05-02T16:00:00.002445+00:00", "last_run": "2026-05-13T16:00:00.002138+00:00",
"last_status": "ok", "last_status": "ok",
"next_run": "2026-05-05T10:00:00+00:00" "next_run": "2026-05-14T10:00:00+00:00"
}, },
{ {
"name": "security-audit-daily", "name": "security-audit-daily",
@@ -53,9 +53,9 @@
"report_on": "changes", "report_on": "changes",
"timeout": 180, "timeout": 180,
"enabled": true, "enabled": true,
"last_run": "2026-05-05T03:00:00.002010+00:00", "last_run": "2026-05-13T03:00:00.002406+00:00",
"last_status": "ok", "last_status": "error",
"next_run": "2026-05-06T03:00:00+00:00" "next_run": "2026-05-14T03:00:00+00:00"
}, },
{ {
"name": "kb-index-refresh", "name": "kb-index-refresh",
@@ -69,9 +69,9 @@
"report_on": "never", "report_on": "never",
"timeout": 120, "timeout": 120,
"enabled": true, "enabled": true,
"last_run": "2026-05-05T03:30:00.001580+00:00", "last_run": "2026-05-13T03:30:00.002771+00:00",
"last_status": "ok", "last_status": "ok",
"next_run": "2026-05-06T03:30:00+00:00" "next_run": "2026-05-14T03:30:00+00:00"
}, },
{ {
"name": "archive-tasks-daily", "name": "archive-tasks-daily",
@@ -85,9 +85,9 @@
"report_on": "changes", "report_on": "changes",
"timeout": 60, "timeout": 60,
"enabled": true, "enabled": true,
"last_run": "2026-05-05T03:00:00.001682+00:00", "last_run": "2026-05-13T03:00:00.002019+00:00",
"last_status": "ok", "last_status": "ok",
"next_run": "2026-05-06T03:00:00+00:00" "next_run": "2026-05-14T03:00:00+00:00"
}, },
{ {
"name": "backup-config", "name": "backup-config",
@@ -101,9 +101,9 @@
"report_on": "never", "report_on": "never",
"timeout": 120, "timeout": 120,
"enabled": true, "enabled": true,
"last_run": "2026-05-05T02:00:00.001344+00:00", "last_run": "2026-05-13T02:00:00.002918+00:00",
"last_status": "ok", "last_status": "ok",
"next_run": "2026-05-06T02:00:00+00:00" "next_run": "2026-05-14T02:00:00+00:00"
}, },
{ {
"name": "insights-extract", "name": "insights-extract",
@@ -185,9 +185,9 @@
"enabled": true, "enabled": true,
"prompt": "RAPORT DIMINEAȚĂ - trimite pe EMAIL (Gmail: mmarius28@gmail.com)\n\n## CALENDAR\nVerifică calendarul:\n```bash\ncd ~/echo-core && source venv/bin/activate && python3 tools/calendar_check.py today\npython3 tools/calendar_check.py travel\npython3 tools/calendar_check.py week\n```\n\n## CITEȘTE CONTEXT\n- USER.md pentru programul lui Marius (luni-joi 15-16 liber)\n- memory/kb/insights/ pentru propuneri (ultimele 3 zile)\n- /home/moltbot/echo-core/approved-tasks.json pentru status proiecte/features (câmpurile: name, status, started_at, pid)\n\n## FORMAT EMAIL HTML\n- Font: 16px text, 18px titluri\n- Culori: albastru (#dbeafe) DONE, gri (#f3f4f6) PROGRAMAT, verde (#d1fae5) PROJECTS\n- Link-uri vizibile\n\n## STRUCTURA RAPORT\n\n### 1. CALENDAR\n- 📅 **AZI:** [evenimente]\n- 📅 **MÂINE:** [evenimente]\n- 📅 **PESTE 2 ZILE:** [dacă e GRUP, NLP, meeting mare]\n- 🚂 **TRAVEL:** Reminders bilete+cazare\n\n### 2. PROIECTE/FEATURES NOAPTEA 💻\n\nCitesc /home/moltbot/echo-core/approved-tasks.json și raportez ce s-a realizat:\n(statusuri: pending, approved, running, complete, failed, stopped)\nPentru stories done/total: citesc /home/moltbot/workspace/{name}/scripts/ralph/prd.json\n\n**Format pentru fiecare proiect/feature [x]:**\n\n```html\n<div style=\"background: #d1fae5; padding: 15px; margin: 10px 0; border-radius: 8px;\">\n <h3>✅ P1 - Nume Proiect</h3>\n \n <p><strong>Status:</strong> X/Y stories complete</p>\n \n <p><strong>Stories realizate:</strong></p>\n <ul>\n <li>✅ US-001: Titlu story - implementat cu succes</li>\n <li>✅ US-002: Titlu story - quality checks pass</li>\n <li>🔄 US-003: Titlu story - în progres (blocat pe dependency)</li>\n </ul>\n \n <p><strong>Link:</strong> <a href=\"https://gitea.romfast.ro/romfast/PROJECT-NAME\">gitea.romfast.ro/romfast/PROJECT-NAME</a></p>\n \n <p><strong>Learnings:</strong> [din progress.txt - ce patterns am descoperit]</p>\n \n <p><strong>Next steps:</strong> [ce rămâne de făcut]</p>\n</div>\n```\n\n**Dacă NU s-au executat proiecte/features:**\n- Sari peste această secțiune\n\n### 3. STATUS GENERAL\n- Ce s-a făcut ieri (joburi, taskuri)\n- Git status ~/clawd\n- Joburi executate (YouTube, insights, etc.)\n\n### 4. PROPUNERI CU ZI ȘI ORĂ!\n\n**OBLIGATORIU:** Fiecare propunere TU+EU sau FAC TU trebuie să aibă ZI și ORĂ concrete!\n\nCategorii:\n- 🤖 **FAC EU** (0 efort) - execut singur\n- 🤝 **TU+EU** (eu pregătesc) - cu zi/oră!\n- 👤 **FAC TU** (template gata) - cu zi/oră!\n\nExemplu:\n- **A1 - Sesiune Dizolvare Vină** 🤝 TU+EU\n 📅 **Marți 3 feb, 15:00-15:30**\n Context + link sursă\n\nReguli programare:\n- Luni-Joi 15:00-16:00 = slot liber\n- Vineri-Duminică = NLP, evită\n- Verifică calendar să nu fie ocupat\n\n### 5. INSIGHTS DISPONIBILE\n\nListează insights-uri [ ] nepropuse încă (format scurt).\n\n### 6. CUM RĂSPUNZI\n- DA = aprob toate (cu zilele/orele propuse)\n- 1 pentru A1,A2 = execut ACUM\n- 2 pentru A3 = programez noapte\n- 3 pentru A5 = skip\n- Alt orar = \"A1 miercuri nu marți\"\n\n## TRIMITERE\npython3 /home/moltbot/echo-core/tools/email_send.py \"mmarius28@gmail.com\" \"Raport Dimineata DATA\" \"HTML_CONTENT\"\n\nNU trimite pe Discord - doar email.", "prompt": "RAPORT DIMINEAȚĂ - trimite pe EMAIL (Gmail: mmarius28@gmail.com)\n\n## CALENDAR\nVerifică calendarul:\n```bash\ncd ~/echo-core && source venv/bin/activate && python3 tools/calendar_check.py today\npython3 tools/calendar_check.py travel\npython3 tools/calendar_check.py week\n```\n\n## CITEȘTE CONTEXT\n- USER.md pentru programul lui Marius (luni-joi 15-16 liber)\n- memory/kb/insights/ pentru propuneri (ultimele 3 zile)\n- /home/moltbot/echo-core/approved-tasks.json pentru status proiecte/features (câmpurile: name, status, started_at, pid)\n\n## FORMAT EMAIL HTML\n- Font: 16px text, 18px titluri\n- Culori: albastru (#dbeafe) DONE, gri (#f3f4f6) PROGRAMAT, verde (#d1fae5) PROJECTS\n- Link-uri vizibile\n\n## STRUCTURA RAPORT\n\n### 1. CALENDAR\n- 📅 **AZI:** [evenimente]\n- 📅 **MÂINE:** [evenimente]\n- 📅 **PESTE 2 ZILE:** [dacă e GRUP, NLP, meeting mare]\n- 🚂 **TRAVEL:** Reminders bilete+cazare\n\n### 2. PROIECTE/FEATURES NOAPTEA 💻\n\nCitesc /home/moltbot/echo-core/approved-tasks.json și raportez ce s-a realizat:\n(statusuri: pending, approved, running, complete, failed, stopped)\nPentru stories done/total: citesc /home/moltbot/workspace/{name}/scripts/ralph/prd.json\n\n**Format pentru fiecare proiect/feature [x]:**\n\n```html\n<div style=\"background: #d1fae5; padding: 15px; margin: 10px 0; border-radius: 8px;\">\n <h3>✅ P1 - Nume Proiect</h3>\n \n <p><strong>Status:</strong> X/Y stories complete</p>\n \n <p><strong>Stories realizate:</strong></p>\n <ul>\n <li>✅ US-001: Titlu story - implementat cu succes</li>\n <li>✅ US-002: Titlu story - quality checks pass</li>\n <li>🔄 US-003: Titlu story - în progres (blocat pe dependency)</li>\n </ul>\n \n <p><strong>Link:</strong> <a href=\"https://gitea.romfast.ro/romfast/PROJECT-NAME\">gitea.romfast.ro/romfast/PROJECT-NAME</a></p>\n \n <p><strong>Learnings:</strong> [din progress.txt - ce patterns am descoperit]</p>\n \n <p><strong>Next steps:</strong> [ce rămâne de făcut]</p>\n</div>\n```\n\n**Dacă NU s-au executat proiecte/features:**\n- Sari peste această secțiune\n\n### 3. STATUS GENERAL\n- Ce s-a făcut ieri (joburi, taskuri)\n- Git status ~/clawd\n- Joburi executate (YouTube, insights, etc.)\n\n### 4. PROPUNERI CU ZI ȘI ORĂ!\n\n**OBLIGATORIU:** Fiecare propunere TU+EU sau FAC TU trebuie să aibă ZI și ORĂ concrete!\n\nCategorii:\n- 🤖 **FAC EU** (0 efort) - execut singur\n- 🤝 **TU+EU** (eu pregătesc) - cu zi/oră!\n- 👤 **FAC TU** (template gata) - cu zi/oră!\n\nExemplu:\n- **A1 - Sesiune Dizolvare Vină** 🤝 TU+EU\n 📅 **Marți 3 feb, 15:00-15:30**\n Context + link sursă\n\nReguli programare:\n- Luni-Joi 15:00-16:00 = slot liber\n- Vineri-Duminică = NLP, evită\n- Verifică calendar să nu fie ocupat\n\n### 5. INSIGHTS DISPONIBILE\n\nListează insights-uri [ ] nepropuse încă (format scurt).\n\n### 6. CUM RĂSPUNZI\n- DA = aprob toate (cu zilele/orele propuse)\n- 1 pentru A1,A2 = execut ACUM\n- 2 pentru A3 = programez noapte\n- 3 pentru A5 = skip\n- Alt orar = \"A1 miercuri nu marți\"\n\n## TRIMITERE\npython3 /home/moltbot/echo-core/tools/email_send.py \"mmarius28@gmail.com\" \"Raport Dimineata DATA\" \"HTML_CONTENT\"\n\nNU trimite pe Discord - doar email.",
"allowed_tools": [], "allowed_tools": [],
"last_run": "2026-05-04T08:30:00.001359+00:00", "last_run": "2026-05-13T08:30:00.001407+00:00",
"last_status": "ok", "last_status": "ok",
"next_run": "2026-05-05T08:30:00+00:00" "next_run": "2026-05-14T08:30:00+00:00"
}, },
{ {
"name": "evening-report", "name": "evening-report",
@@ -197,9 +197,9 @@
"enabled": true, "enabled": true,
"prompt": "RAPORT SEARĂ - trimite pe EMAIL (Gmail: mmarius28@gmail.com)\n\n## CALENDAR\nVerifică ce ai mâine și săptămâna:\n```bash\ncd ~/echo-core && source venv/bin/activate && python3 tools/calendar_check.py today\npython3 tools/calendar_check.py week\n```\n\n## CITEȘTE CONTEXT\n- USER.md pentru programul lui Marius (luni-joi 15-16 liber, vineri-dum NLP)\n- memory/kb/insights/YYYY-MM-DD.md pentru propuneri insights\n- memory/kb/youtube/ și memory/kb/articole/ pentru inspirație proiecte\n- /home/moltbot/echo-core/approved-tasks.json pentru status proiecte existente (câmpurile: name, status, proposed_at)\n\n## FORMAT EMAIL HTML\n- Font: 16px text, 18px titluri\n- Culori: albastru (#dbeafe) DONE, gri (#f3f4f6) PROGRAMAT, verde (#d1fae5) PROJECTS\n- Link-uri vizibile\n\n## STRUCTURA RAPORT\n\n### 1. MÂINE\n- 📅 Evenimente calendar\n- 🚂 Travel reminders\n\n### 2. STATUS\n- Ce s-a făcut azi\n- Git status\n\n### 3. PROPUNERI CU ZI ȘI ORĂ!\n\n**OBLIGATORIU:** Fiecare propunere TU+EU sau FAC TU trebuie să aibă ZI și ORĂ concrete!\n\nReguli programare:\n- Luni-Joi 15:00-16:00 = slot liber\n- Vineri-Duminică = NLP, evită\n- Verifică calendar să nu fie ocupat\n- Sesiuni scurte: 15-30 min\n\n### 4. PROGRAME/PROIECTE PRACTICE 💻\n\n**CONTEXT OBLIGATORIU - citește înainte de a propune:**\n\n**Proiecte existente (PRIORITARE pentru features):**\n- **roa2web** (gitea.romfast.ro/romfast/roa2web) - FastAPI+Vue.js+Telegram bot\n - Are deja: balanță, facturi, trezorerie\n - Lipsesc: validări declarații ANAF, facturare valută/taxare inversă, notificări\n - Rapoarte ROA noi → FEATURE în roa2web, NU proiect separat!\n- **Chatbot Maria** (Flowise pe LXC 104, ngrok → romfast.ro/chatbot_maria.html)\n - Document store: XML, MD | Groq gratuit + Ollama embeddings + FAISS\n - Problema: răspunsuri nu sunt suficient de bune\n - Angajatul nou poate menține documentația (scrie TXT, trebuie converter)\n - Clientii îl accesează din programele ROA direct\n\n**Întrebări frecvente clienți (surse de proiecte):**\n- Erori validare declarații ANAF (D406, D394, D100 etc.)\n- Cum facturez în valută cu taxare inversă?\n- Probleme la instalări, inițializări firme noi, configurări\n\n**Reguli propuneri (80/20 STRICT):**\n- Impact mare pentru Marius → apoi pentru clienți ERP ROA\n- Inspirat din discovery (YouTube, articole, insights procesate)\n- Features roa2web > proiecte noi (integrare în existent)\n- Proiecte independente doar dacă NU se potrivesc în roa2web/Flowise\n\n**A. FEATURES PROIECTE EXISTENTE (2-3, PRIORITAR):**\n\nFormat:\n```\n### ⚡ F1 - Feature pentru [roa2web/chatbot]\n**Ce face:** Descriere scurtă\n**De ce:** Ce problemă rezolvă (ex: \"clienții întreabă X de 5 ori/săptămână\")\n**Complexitate:** S/M/L\n**Proiect:** roa2web / chatbot-maria\n```\n\n**B. PROIECTE NOI (max 1, doar dacă nu se integrează în existente):**\n\nFormat:\n```\n### 💻 P1 - Nume Proiect\n**De ce:** Cum se leagă de nevoile lui Marius/clienți\n**Impact:** Pentru Marius + pentru clienți\n**Efort:** Ore/zile realist\n**Stack:** Simplu (80/20)\n**Sursă:** [Link nota KB]\n```\n\n**NU propune:**\n- Proiecte complexe fără beneficiu clar\n- Proiecte duplicat cu ce există deja\n- Rapoarte ROA ca proiect separat (→ feature roa2web)\n\n### 5. INSIGHTS DISPONIBILE\nListează insights-uri [ ] nepropuse încă (format scurt).\n\n### 6. CUM RĂSPUNZI\n- DA = aprob toate (cu zilele/orele propuse)\n- 1 pentru A1,A2 = execut ACUM\n- 2 pentru A3 = programez noapte\n- 3 pentru A5 = skip\n- **F pentru F1,F3** = implementează features (joburi noapte)\n- **P pentru P1** = creează proiect nou (job noapte)\n- Alt orar = \"A1 miercuri nu marți\"\n\n## IMPLEMENTARE PROIECTE APROBATE\n\nCând propui features (F) sau proiecte (P), adaugă-le automat în /home/moltbot/echo-core/approved-tasks.json cu status 'pending':\n```bash\npython3 -c \"\nimport json, datetime\nf = open('/home/moltbot/echo-core/approved-tasks.json')\ndata = json.load(f); f.close()\ndata['projects'].append({'name': 'SLUG-PROIECT', 'description': 'DESCRIERE', 'status': 'pending', 'proposed_at': datetime.datetime.utcnow().isoformat(), 'approved_at': None, 'started_at': None, 'pid': None})\ndata['last_updated'] = datetime.datetime.utcnow().isoformat()\nopen('/home/moltbot/echo-core/approved-tasks.json', 'w').write(json.dumps(data, indent=2))\n\"\n```\n\nÎn email, arată lui Marius comanda de aprobare:\n`!approve SLUG-PROIECT` (trimite pe Discord/Telegram la Echo)\n\nNight-execute (23:00) va:\n - genera PRD cu ralph_prd_generator.py dacă nu există prd.json\n - lansa ralph.sh 15 iterații pentru fiecare proiect aprobat\n\n## TRIMITERE\npython3 /home/moltbot/echo-core/tools/email_send.py \"mmarius28@gmail.com\" \"Raport Seara DATA\" \"HTML_CONTENT\"\n\nNU trimite pe Discord - doar email.", "prompt": "RAPORT SEARĂ - trimite pe EMAIL (Gmail: mmarius28@gmail.com)\n\n## CALENDAR\nVerifică ce ai mâine și săptămâna:\n```bash\ncd ~/echo-core && source venv/bin/activate && python3 tools/calendar_check.py today\npython3 tools/calendar_check.py week\n```\n\n## CITEȘTE CONTEXT\n- USER.md pentru programul lui Marius (luni-joi 15-16 liber, vineri-dum NLP)\n- memory/kb/insights/YYYY-MM-DD.md pentru propuneri insights\n- memory/kb/youtube/ și memory/kb/articole/ pentru inspirație proiecte\n- /home/moltbot/echo-core/approved-tasks.json pentru status proiecte existente (câmpurile: name, status, proposed_at)\n\n## FORMAT EMAIL HTML\n- Font: 16px text, 18px titluri\n- Culori: albastru (#dbeafe) DONE, gri (#f3f4f6) PROGRAMAT, verde (#d1fae5) PROJECTS\n- Link-uri vizibile\n\n## STRUCTURA RAPORT\n\n### 1. MÂINE\n- 📅 Evenimente calendar\n- 🚂 Travel reminders\n\n### 2. STATUS\n- Ce s-a făcut azi\n- Git status\n\n### 3. PROPUNERI CU ZI ȘI ORĂ!\n\n**OBLIGATORIU:** Fiecare propunere TU+EU sau FAC TU trebuie să aibă ZI și ORĂ concrete!\n\nReguli programare:\n- Luni-Joi 15:00-16:00 = slot liber\n- Vineri-Duminică = NLP, evită\n- Verifică calendar să nu fie ocupat\n- Sesiuni scurte: 15-30 min\n\n### 4. PROGRAME/PROIECTE PRACTICE 💻\n\n**CONTEXT OBLIGATORIU - citește înainte de a propune:**\n\n**Proiecte existente (PRIORITARE pentru features):**\n- **roa2web** (gitea.romfast.ro/romfast/roa2web) - FastAPI+Vue.js+Telegram bot\n - Are deja: balanță, facturi, trezorerie\n - Lipsesc: validări declarații ANAF, facturare valută/taxare inversă, notificări\n - Rapoarte ROA noi → FEATURE în roa2web, NU proiect separat!\n- **Chatbot Maria** (Flowise pe LXC 104, ngrok → romfast.ro/chatbot_maria.html)\n - Document store: XML, MD | Groq gratuit + Ollama embeddings + FAISS\n - Problema: răspunsuri nu sunt suficient de bune\n - Angajatul nou poate menține documentația (scrie TXT, trebuie converter)\n - Clientii îl accesează din programele ROA direct\n\n**Întrebări frecvente clienți (surse de proiecte):**\n- Erori validare declarații ANAF (D406, D394, D100 etc.)\n- Cum facturez în valută cu taxare inversă?\n- Probleme la instalări, inițializări firme noi, configurări\n\n**Reguli propuneri (80/20 STRICT):**\n- Impact mare pentru Marius → apoi pentru clienți ERP ROA\n- Inspirat din discovery (YouTube, articole, insights procesate)\n- Features roa2web > proiecte noi (integrare în existent)\n- Proiecte independente doar dacă NU se potrivesc în roa2web/Flowise\n\n**A. FEATURES PROIECTE EXISTENTE (2-3, PRIORITAR):**\n\nFormat:\n```\n### ⚡ F1 - Feature pentru [roa2web/chatbot]\n**Ce face:** Descriere scurtă\n**De ce:** Ce problemă rezolvă (ex: \"clienții întreabă X de 5 ori/săptămână\")\n**Complexitate:** S/M/L\n**Proiect:** roa2web / chatbot-maria\n```\n\n**B. PROIECTE NOI (max 1, doar dacă nu se integrează în existente):**\n\nFormat:\n```\n### 💻 P1 - Nume Proiect\n**De ce:** Cum se leagă de nevoile lui Marius/clienți\n**Impact:** Pentru Marius + pentru clienți\n**Efort:** Ore/zile realist\n**Stack:** Simplu (80/20)\n**Sursă:** [Link nota KB]\n```\n\n**NU propune:**\n- Proiecte complexe fără beneficiu clar\n- Proiecte duplicat cu ce există deja\n- Rapoarte ROA ca proiect separat (→ feature roa2web)\n\n### 5. INSIGHTS DISPONIBILE\nListează insights-uri [ ] nepropuse încă (format scurt).\n\n### 6. CUM RĂSPUNZI\n- DA = aprob toate (cu zilele/orele propuse)\n- 1 pentru A1,A2 = execut ACUM\n- 2 pentru A3 = programez noapte\n- 3 pentru A5 = skip\n- **F pentru F1,F3** = implementează features (joburi noapte)\n- **P pentru P1** = creează proiect nou (job noapte)\n- Alt orar = \"A1 miercuri nu marți\"\n\n## IMPLEMENTARE PROIECTE APROBATE\n\nCând propui features (F) sau proiecte (P), adaugă-le automat în /home/moltbot/echo-core/approved-tasks.json cu status 'pending':\n```bash\npython3 -c \"\nimport json, datetime\nf = open('/home/moltbot/echo-core/approved-tasks.json')\ndata = json.load(f); f.close()\ndata['projects'].append({'name': 'SLUG-PROIECT', 'description': 'DESCRIERE', 'status': 'pending', 'proposed_at': datetime.datetime.utcnow().isoformat(), 'approved_at': None, 'started_at': None, 'pid': None})\ndata['last_updated'] = datetime.datetime.utcnow().isoformat()\nopen('/home/moltbot/echo-core/approved-tasks.json', 'w').write(json.dumps(data, indent=2))\n\"\n```\n\nÎn email, arată lui Marius comanda de aprobare:\n`!approve SLUG-PROIECT` (trimite pe Discord/Telegram la Echo)\n\nNight-execute (23:00) va:\n - genera PRD cu ralph_prd_generator.py dacă nu există prd.json\n - lansa ralph.sh 15 iterații pentru fiecare proiect aprobat\n\n## TRIMITERE\npython3 /home/moltbot/echo-core/tools/email_send.py \"mmarius28@gmail.com\" \"Raport Seara DATA\" \"HTML_CONTENT\"\n\nNU trimite pe Discord - doar email.",
"allowed_tools": [], "allowed_tools": [],
"last_run": "2026-05-04T21:00:00.002974+00:00", "last_run": "2026-05-12T21:00:00.002654+00:00",
"last_status": "ok", "last_status": "ok",
"next_run": "2026-05-05T21:00:00+00:00" "next_run": "2026-05-13T21:00:00+00:00"
}, },
{ {
"name": "morning-coaching", "name": "morning-coaching",
@@ -269,9 +269,9 @@
"prompt": "Heartbeat check. Rulează src/heartbeat.py printr-un scurt raport de status.\nDacă nu e nimic de raportat (email=0, calendar nu are evenimente <2h, kb ok), răspunde doar cu HEARTBEAT_OK și oprește-te — nu trimite mesaj.\nDacă e ceva: raport scurt pe Discord #echo-work.", "prompt": "Heartbeat check. Rulează src/heartbeat.py printr-un scurt raport de status.\nDacă nu e nimic de raportat (email=0, calendar nu are evenimente <2h, kb ok), răspunde doar cu HEARTBEAT_OK și oprește-te — nu trimite mesaj.\nDacă e ceva: raport scurt pe Discord #echo-work.",
"allowed_tools": [], "allowed_tools": [],
"enabled": true, "enabled": true,
"last_run": "2026-05-05T08:00:00.002199+00:00", "last_run": "2026-05-13T18:00:00.001091+00:00",
"last_status": "ok", "last_status": "ok",
"next_run": "2026-05-05T10:00:00+00:00" "next_run": "2026-05-14T06:00:00+00:00"
}, },
{ {
"name": "night-execute", "name": "night-execute",
@@ -285,8 +285,8 @@
"Read", "Read",
"Write" "Write"
], ],
"last_run": "2026-05-04T23:00:00.001951+00:00", "last_run": "2026-05-12T23:00:00.001168+00:00",
"last_status": "ok", "last_status": "ok",
"next_run": "2026-05-05T23:00:00+00:00" "next_run": "2026-05-13T23:00:00+00:00"
} }
] ]

View File

@@ -1,5 +1,5 @@
{ {
"last_sent": 16, "last_sent": 17,
"year": 2026, "year": 2026,
"last_sent_at": "2026-04-30T14:11:33.004565+00:00" "last_sent_at": "2026-05-07T17:18:55.389499+00:00"
} }

View File

@@ -0,0 +1,185 @@
# GROK Online — Instructiuni complete (romana)
> Compilat din: 3 video-uri YouTube + pagina oficiala de instructiuni grok-online-v1.netlify.app
> Data: 2026-05-05
> Tags: @growth @coaching @sprijin
---
## Ce este GROK?
GROK este un joc virtual de empatie (pentru 1 sau 2 persoane) bazat pe Comunicarea Nonviolenta (CNV / NVC). Scopul jocului este sa te ajute sa identifici si sa articulezi **sentimentele** si **nevoile** dintr-o situatie — ale tale sau ale altcuiva — printr-un proces ghidat cu carti vizuale.
Numele vine de la verbul "to grok" (a intelege profund, a simti cu adevarat).
Platforma functioneaza **pe computer** (nu pe telefon sau tableta).
---
## Componentele jocului
### Carti de SENTIMENTE (Feelings Cards)
- Descriu stari emotionale
- Sunt ordonate de la sentimente "inconfortabile" la sentimente "confortabile"
- Exemple: ingrijorat, ranit, descurajat, dezamagit, tandru, delicat, incantat, extaziat, uimit
### Carti de NEVOI (Needs Cards)
- Descriu aspecte importante, valori, lucruri esentiale pentru o persoana
- Exemple: conexiune, securitate, claritate, pace, recunoastere, a fi vazut/auzit, realitate impartasita, incredere, compasiune, empatie, apartenenta
**Recomandat pentru inceput:** seturi de 50 de carti; pe masura ce te familiarizezi, treci la seturi de 70.
---
## Cele 3 moduri de joc
### Jocul 1 — Auto-empatie (solo)
Folosesti jocul singur, pentru o situatie care te preocupa pe tine.
- Deschizi cartile de sentimente si alegi ce simti TU
- Deschizi cartile de nevoi si alegi ce nevoi ai TU neimplinite sau implinite
- Rezultatul: claritate emotionala despre ce se petrece in interiorul tau
### Jocul 2 — Empatie intre doi jucatori (cel mai folosit)
- Un jucator este **Vorbitorul** (cel care are o situatie)
- Celalalt jucator este **Ascultator / Empatizator** (cel care ghiceste)
- Ascultator ghiceste sentimentele si nevoile Vorbitorului — nu le stie sigur, le propune
- Vorbitorul confirma, corecteaza sau nuanteaza
### Jocul 3 — Empatie pentru o persoana absenta
- Se ghicesc sentimentele si nevoile unei persoane care **nu este prezenta** in conversatie
- Util cand vrei sa intelegi mai bine o persoana cu care ai un conflict sau o situatie dificila
---
## Pasii detaliati — Jocul pentru 2 persoane
### Pasul 1 — Vorbitorul descrie situatia (scurt)
Vorbitorul impartaseste o situatie concreta care are nevoie de empatie. Nu trebuie sa fie lunga — cateva propozitii sunt suficiente.
> Exemplu din video: "Suntem in Ecuador, departe de copiii nostri. Am un copil caruia i-am trimis mesaje si am sunat, dar nu raspunde. Imi este dor de el si ma intreb ce se intampla — e bine? Ma ura? Acestea sunt lucrurile care imi vin in minte."
### Pasul 2 — Ascultator deschide cartile de SENTIMENTE
Ascultatorul parcurge cartile de sentimente si propune ghiciri, folosind formule de genul:
- "Ma intreb daca te simti..."
- "Poate ca simti..."
- "As ghici ca esti..."
Vorbitorul raspunde cu: da / nu / partial / ceva mai specific.
**Cum se organizeaza cartile:**
- Cartile cu rezonanta puternica → stanga mesei (zona "da, cu siguranta")
- Cartile cu rezonanta partiala → mijloc (zona "poate")
- Cartile care nu rezoneza → se pun deoparte (discard)
> Exemplu din video: Ascultatorul a ghicit: "ingrijorare" (da), "ranit" (da, definitiv), "descurajat" (da). Cartile cu rezonanta puternica au fost asezate in stanga.
### Pasul 3 — Ascultator deschide cartile de NEVOI
Dupa ce sentimentele sunt identificate, ascultatorul trece la cartile de nevoi si ghiceste ce nevoi stau in spatele acelor sentimente.
> Exemplu din video: Ascultatorul a ghicit: "incredere" (da, dar mai specific), "conexiune" (da — o nevoie clara), "securitate" (da, sa stie ca e in siguranta), "pace interioara" (da, asta e!), "claritate" (da, exact).
**Nota:** Daca gasesti o carte mai specifica si mai potrivita, o poti inlocui pe cea generala.
> In video, ascultatorul a incercat "intelegere", dar Vorbitorul a simtit ca "claritate" este mai potrivita. S-a facut inlocuirea.
### Pasul 4 — Potrivirea sentimentelor cu nevoile (optional, dar valoros)
Ascultatorul poate propune conexiuni intre sentimente si nevoi — care sentimente vin din care nevoi?
> Exemplu din video:
> - "Ranit" si "tandru" → nevoia de a conta, de a apartine, de a fi vazut si auzit
> - "Ingrijorat" → nevoia de claritate si pace
> - "Dezamagit" → nevoia de conexiune, de atentie reciproca
> - "Descurajat" → nevoia de compasiune si empatie
### Pasul 5 — Reflectia finala
Vorbitorul impartaseste cum se simte dupa ce a vazut cartile asezate si conexiunile:
- Cum se simte corpul tau acum?
- Ce s-a schimbat in interior?
- Exista nevoi neimplinite pe care vrei sa le jelesti?
- Exista actiuni sau strategii noi pe care le poti incerca?
**Recomandare:** Fa o poza cu cartile asezate si trimite-o persoanei relevante sau pastreaz-o pentru tine.
> Exemplu din video: "Emotiile mele se simt vazute. De obicei, cand nu imi simt emotiile, am dureri fizice. A vedea totul asezat m-a ajutat sa am compasiune pentru mine insami. Nevoia de conexiune si de a fi auzita a fost implinita prin acest joc."
---
## Modul "Celebrare" — varianta pozitiva
GROK se poate folosi si pentru a **celebra nevoi implinite**, nu doar pentru situatii dificile.
### Cum functioneaza:
- Vorbitorul impartaseste o veste buna sau o realizare
- Ascultatorul parcurge cartile de sentimente cautand cele "confortabile" (bucurie, incantat, extaziat, recunoscator, uimit etc.)
- Vorbitorul spune "da" / "nu" / "continua" rapid
- Se identifica si nevoile implinite
> Exemplu din video (Claire si Jen): Claire a primit un mesaj frumos de la o prietena despre un curriculum la care a muncit un an. Au trecut prin carti rapid: "incantat" (da), "extaziat" (prea mult), "uimit" (poate). Nevoia identificata: "realitate impartasita" (mai puternica decat "a fi auzita"). La final, Claire a vrut sa fotografieze cartile si sa le trimita prietenei cu mesajul original.
---
## Exemple complete din video-uri
### Exemplu 1 — Situatie dificila (Jen si Christine)
**Situatia:** Christine e in Ecuador, departe de copiii ei. Un fiu nu raspunde la mesaje sau apeluri.
**Sentimente identificate:**
- Ingrijorare (worried) — da
- Ranita (hurt) — da, definitiv
- Descurajata (discouraged) — da
- Dezamagita (disappointed) — da
- Tandra (tender) — da
**Nevoi identificate:**
- Conexiune — da (nevoie clara)
- Securitate — da (sa stie ca e in siguranta)
- Pace interioara — da (exact asta)
- Claritate — da (mai potrivita decat "intelegere")
**Conexiuni sentimente-nevoi:**
- Ranit + Tandru → nevoia de a conta, a apartine, a fi vazut/auzit
- Ingrijorare → nevoia de claritate si pace
- Dezamagire → nevoia de conexiune si atentie
- Descurajare → nevoia de compasiune si empatie
**Reflectie:** Christine a simtit ca emotiile ei sunt "vazute". Nevoile de claritate si pace au ramas neimplinite — dar s-a decis sa jeleasca aceste nevoi neimplinite si sa caute strategii noi.
---
### Exemplu 2 — Celebrare (Jen si Claire)
**Situatia:** Claire a primit un mesaj de la o prietena care o felicita pentru un curriculum GROK pentru copii (3-6 ani) la care a muncit un an.
**Sentimente identificate:**
- Incantata (delighted) — da
- Uimita (amazed) — poate
**Nevoi implinite:**
- Realitate impartasita (shared reality) — da, mai puternic decat "a fi auzita"
**Actiune:** Claire a facut o poza cu cartile si a trimis-o prietenei impreuna cu mesajul original.
---
## Sfaturi practice
- **Observa corpul.** Cand cartile rezoneza, corpul iti da semnale — tensiune, emotie, usurare. Presta atentie la aceste senzatii.
- **Nu e un test.** Ghicirile ascultatorului nu trebuie sa fie "corecte" — sunt propuneri. Vorbitorul corecteaza liber.
- **Fotografia cartilor** este un instrument puternic — o poti trimite celui despre care ai facut empatie, sau pastra pentru tine.
- **Incepe cu pachete mici** (50 carti) pana te familiarizezi cu vocabularul de sentimente si nevoi.
- **Jeleste nevoile neimplinite** — nu e un semn de slabiciune, e un pas spre actiune.
- **Schimba rolurile** pentru o experienta reciproca.
- **Platforma e pentru computer** — nu functioneaza bine pe telefon/tableta.
---
## Link-uri utile
- Joc online: https://groktheworld.com/pages/play-grok-online
- Instructiuni oficiale: https://grok-online-v1.netlify.app/help/grok-online-help
- Video 1 (sesiune completa): https://www.youtube.com/watch?v=qJH3naJNH9A
- Video 2 (sesiune scurta): https://www.youtube.com/watch?v=c0JTkggdm6Q
- Video 3 (celebrare nevoi implinite): https://www.youtube.com/watch?v=oZUOxm6QHnk
---
*Nota: GROK este bazat pe principiile Comunicarii Nonviolente (NVC) a lui Marshall Rosenberg. Vocabularul de sentimente si nevoi este specific CNV.*

View File

@@ -268,7 +268,10 @@ Terms of Service
--- ---
## TL;DR ## TL;DR
<!-- Echo: completează cu rezumat --> Newsletter Cercetașii României, ediția 17/2026 (7 mai). Teme principale: Ziua Europei (9 mai), deadline formulare 3,5% (20 mai transmitere, 25 mai depunere finală), resurse afiș Festival al Luminii, eveniment Oalala ed. 9 la Scout Edu Hub București (9 mai, 17:00), traininguri antreprenoriale Busola Nord, apel redeschis African Rover Moot 2026 (Africa de Sud, 1-8 aug, DDL 18 mai), lansare Instagram @cej.romania pentru CEJ Ungaria 2026.
## Insights ## Insights
<!-- Echo: extrage idei acționabile cu tag-uri @work @health @growth etc --> - [ ] **Formulare 3,5%** — DDL 20 mai 2026 pentru transmitere, 25 mai depunere finală. Dacă ești implicat în centru local fără PJ, urmărește deadline-ul. @scout
- [ ] **African Rover Moot** — Africa de Sud, 1-8 aug 2026. Apel deschis până 18 mai, prima tranșă plată 26 mai. Oportunitate pentru seniori. @scout
- [ ] **CEJ 2026 Ungaria** — Urmărește @cej.romania pe Instagram pentru noutăți contingent. @scout
- [ ] **Oalala ed. 9** — Eveniment Scout Edu Hub București, 9 mai (azi). Plimbare + gătit + relaxare. Cazare disponibilă pentru cei din afara Bucureștiului. @scout

View File

@@ -1,5 +1,122 @@
{ {
"notes": [ "notes": [
{
"file": "notes-data/youtube/2026-05-09_wasting-ai-time-scaffolding.md",
"title": "You're Wasting 40% Of Your AI Time On Something Fixable",
"date": "2026-05-09",
"tags": [],
"domains": [
"work",
"growth"
],
"types": [],
"category": "youtube",
"project": null,
"subdir": null,
"video": "",
"tldr": "Oamenii pierd masiv timp cu AI pentru că nu înțeleg \"harness-ul\" din jurul LLM-ului — stratul de scaffolding care face diferența între un model generic și un agent care chiar lucrează pentru tine. Vid..."
},
{
"file": "notes-data/youtube/2026-05-08_bonificatie-3-impozit-2025.md",
"title": "Bonificația de 3% din impozit — Răspunsul Ministerului Finanțelor (2025)",
"date": "2026-05-08",
"tags": [
"fiscal",
"bonificatie",
"impozit-profit",
"micro"
],
"domains": [
"work"
],
"types": [],
"category": "youtube",
"project": null,
"subdir": null,
"video": "",
"tldr": "Ministerul Finanțelor a răspuns oficial (luni, 27...) unei adrese trimise de Camera Consultanților Fiscali privind tratamentul contabil și fiscal al **bonificației de 3%** acordate de ANAF la finalul ..."
},
{
"file": "notes-data/emails/2026-05-07_fwd-newsletter-17-din-2026.md",
"title": "Newsletter 17 din 2026",
"date": "2026-05-07",
"tags": [],
"domains": [],
"types": [],
"category": "emails",
"project": null,
"subdir": null,
"video": "",
"tldr": "Newsletter Cercetașii României, ediția 17/2026 (7 mai). Teme principale: Ziua Europei (9 mai), deadline formulare 3,5% (20 mai transmitere, 25 mai depunere finală), resurse afiș Festival al Luminii, e..."
},
{
"file": "notes-data/youtube/2026-05-06_mario-zechner-tokens-agents.md",
"title": "Tokens can make you rich, just do this Mario Zechner",
"date": "2026-05-06",
"tags": [],
"domains": [
"work",
"growth"
],
"types": [],
"category": "youtube",
"project": null,
"subdir": null,
"video": "",
"tldr": "Interviu cu Mario Zechner, creatorul agentului de cod Pi (pi.dev), despre agenți AI, tokeconomics, și viitorul muncii. Teza centrală: agenții fac oamenii mult mai productivi, dar nu înlocuiesc judecat..."
},
{
"file": "notes-data/youtube/2026-05-06_llama-cpp-35b-6gb-vram.md",
"title": "Running a 35B AI Model on 6GB VRAM, FAST (llama.cpp Guide)",
"date": "2026-05-06",
"tags": [
"llama",
"AI",
"local-AI",
"hardware"
],
"domains": [
"work"
],
"types": [],
"category": "youtube",
"project": null,
"subdir": null,
"video": "",
"tldr": "Cum rulezi Qwen3 35B (model Mixture of Experts) pe un GPU de 8 ani cu 6GB VRAM la 17 token/s și 256K context — prin 5 flag-uri llama.cpp specifice arhitecturii MoE. Defaulturile sunt bottleneck-ul, nu..."
},
{
"file": "memory/feedback_heartbeat_git_silent.md",
"title": "feedback_heartbeat_git_silent",
"date": "2026-05-06",
"tags": [],
"domains": [],
"types": [
"memory"
],
"category": "memory",
"project": null,
"subdir": null,
"video": "",
"tldr": ""
},
{
"file": "notes-data/coaching/2026-05-05_grok-online-instructiuni.md",
"title": "GROK Online — Instructiuni complete (romana)",
"date": "2026-05-05",
"tags": [],
"domains": [
"health"
],
"types": [
"coaching"
],
"category": "coaching",
"project": null,
"subdir": null,
"video": "",
"tldr": "*Nota: GROK este bazat pe principiile Comunicarii Nonviolente (NVC) a lui Marshall Rosenberg. Vocabularul de sentimente si nevoi este specific CNV.*"
},
{ {
"file": "notes-data/facebook/2026-05-05_5-1k-views-1-8k-reactions-todo-movimento-bate-o-pe.md", "file": "notes-data/facebook/2026-05-05_5-1k-views-1-8k-reactions-todo-movimento-bate-o-pe.md",
"title": "TODO MOVIMENTO — Cântec cercetași brazilian", "title": "TODO MOVIMENTO — Cântec cercetași brazilian",
@@ -9217,19 +9334,19 @@
} }
], ],
"stats": { "stats": {
"total": 530, "total": 537,
"by_domain": { "by_domain": {
"work": 169, "work": 173,
"health": 98, "health": 99,
"growth": 239, "growth": 241,
"sprijin": 39, "sprijin": 39,
"scout": 8 "scout": 8
}, },
"by_category": { "by_category": {
"articole": 1, "articole": 1,
"coaching": 50, "coaching": 51,
"conversations": 0, "conversations": 0,
"emails": 19, "emails": 20,
"exercitii": 4, "exercitii": 4,
"facebook": 2, "facebook": 2,
"health": 6, "health": 6,
@@ -9238,8 +9355,8 @@
"reflectii": 3, "reflectii": 3,
"retete": 1, "retete": 1,
"tools": 7, "tools": 7,
"youtube": 113, "youtube": 117,
"memory": 43 "memory": 44
} }
}, },
"domains": [ "domains": [

View File

@@ -0,0 +1,105 @@
# Running a 35B AI Model on 6GB VRAM, FAST (llama.cpp Guide)
**URL:** https://youtu.be/8F_5pdcD3HY
**Data:** 2026-05-06
**Durata:** 15:05
**Tags:** @work @tech #llama.cpp #AI #local-AI #hardware
---
## TL;DR
Cum rulezi Qwen3 35B (model Mixture of Experts) pe un GPU de 8 ani cu 6GB VRAM la 17 token/s și 256K context — prin 5 flag-uri llama.cpp specifice arhitecturii MoE. Defaulturile sunt bottleneck-ul, nu hardware-ul.
---
## Setup de test (worst-case floor)
- GPU: GTX 1060, 6GB VRAM, PCIe Gen3
- CPU: i3 8100, 4 core, fără hyperthreading
- RAM: 24GB DDR4
- Model: **Qwen3 35B A3B** — MoE, 35B parametri total, dar doar 3B activi per token (8 experți din 256 per layer)
---
## Cele 5 flag-uri (de la 3 tok/s → 17 tok/s)
### Flag 1: `--n-cpu-moe 41` (+230%)
- **Problema:** Split naiv (jumătate GPU, jumătate CPU pe layers) = 3 tok/s. Fiecare layer aduce toți experții cu el pe CPU → PCIe se înfundă.
- **Soluția MoE:** Experții stau "adormiți" majoritatea timpului. Pune TOATE expert-blocks pe CPU (RAM), restul pe GPU.
- **Rezultat:** 3 → 10 tok/s
### Flag 2: `--no-mmap` (+35%)
- **Problema:** llama.cpp face "lazy loading" din disk (mmap). Fiecare expert neîncărcat → page fault → pauză.
- **Soluția:** Încarcă toți cei 20GB în RAM la start. Niciun read din disk la inferență.
- **Rezultat:** 10 → 13.5 tok/s
### Flag 3: `--n-cpu-moe 35` (ajustare fină, +26%)
- 2GB VRAM liberi → readuci 6 layere de experți înapoi pe GPU
- Trade-off: context scade 100K → 64K (mai puțin room pentru KV cache)
- **Rezultat:** 13.5 → 17 tok/s
### Flag 4: Turbo Quant KV cache (`--cache-type-k q4_0 --cache-type-v q3_0`)
- **Problema:** KV cache crește liniar cu contextul → mânâncă VRAM
- **Soluția:** Google DeepMind Turbo Quant — rotație aleatoare + quantizare agresivă (4bit keys, 3bit values), fără pierdere vizibilă de calitate
- Asimetrie justificată: grouped query attention 8:1 → keys suportă compresie mai mare
- **Rezultat:** Context 64K → **256K** la același 17 tok/s (5.9/6GB VRAM)
### Flag 5: `--mlock` (stabilitate pe termen lung)
- **Problema:** Kernelul paginează experții din RAM pe disk după ore de idle → stutter la token 1000
- **Soluția:** mlock — spui kernelului "nu atinge RAM-ul ăsta". Necesită 3 locuri: LXC/container permisiuni, Docker `--cap-add IPC_LOCK`, flag llama.cpp
- **Rezultat:** mlocked: 12KB → 16GB. Sistem stabil după o săptămână.
---
## Ce NU a funcționat: Speculative Decoding
- Idee: draft model mic (Qwen3 0.8B) ghicește 8 token-uri → big model verifică în batch
- Rezultat: **17 → 11 tok/s** (mai lent)
- De ce eșuează pe MoE:
1. **MoE + batching = memory thrash**: 8 tokeni în batch pot activa 64 experți diferiți/layer → nu mai e batch real
2. **SSM layers (state space)**: 30/40 layers sunt SSM — secvențiale prin definiție, nu se pot paraleliza
---
## Rezultat final
```
Model: Qwen3 35B A3B (MoE)
VRAM: 5.9 / 6 GB
Context: 256,000 tokens
Viteză: 17 tok/s
Hardware: GTX 1060, 8 ani vechime
```
---
## Puncte cheie
- **MoE ≠ dense**: Experții "dormiți" sunt mai ieftini în RAM decât pe GPU — inversul intuiției normale
- **Defaulturile sunt bottleneck-ul, nu hardware-ul** — 5 flag-uri = 5.6x speedup
- **No-mmap e contra-intuitiv**: "lazy loading" sună smart, dar pentru inferență e catastrofal
- **Turbo Quant (DeepMind)**: 4bit/3bit KV cache fără pierdere vizibilă — folosește rotație aleatoare înainte de quantizare
- **mlock e critic pentru producție** — fără el, sistemul degradează silențios după ore
- **Speculative decoding nu merge pe MoE+SSM** — arhitectura contează, nu doar parametrii
---
## Quote-uri
> "The hardware isn't the bottleneck anymore. The defaults are."
> "Dead weight if you're sitting on the GPU, but cheap rent if you're sitting in RAM."
> "Twice the context, twice the memory." — KV cache crește liniar
> "No code, no retraining, no quantization tricks, just telling the OS: stop being clever about my RAM."
---
## Relevanță pentru Marius
- Rulezi modele mari local pe hardware vechi/modest — **fără cloud, fără cost lunar**
- Relevant pentru LXC 104 (Ollama) — flag-urile sunt compatibile și cu Ollama (via GGUF + llama.cpp backend)
- Qwen3 35B cu 256K context = poate procesa cod-sursă întreg ca context
- Flag-urile `--n-cpu-moe` sunt specifice MoE — nu se aplică la all-minilm (dense, mic)

View File

@@ -0,0 +1,58 @@
# Tokens can make you rich, just do this Mario Zechner
**Sursa:** https://youtu.be/sqtX2OmgOF0
**Data:** 2026-05-06
**Durată:** 47:41
**Tags:** @work @growth
---
## TL;DR
Interviu cu Mario Zechner, creatorul agentului de cod Pi (pi.dev), despre agenți AI, tokeconomics, și viitorul muncii. Teza centrală: agenții fac oamenii mult mai productivi, dar nu înlocuiesc judecata umană. Cine controlează contextul și infrastructura câștigă. Modelele open weights (DeepSeek, Kimi) vor democratiza accesul. Architecture thinking devine mai valoros decât a ști să scrii cod.
---
## Puncte cheie
- **De ce a creat Pi**: Claude Code devenise instabil, se schimba constant (harness changes), îi strica workflow-urile zilnic. A trecut la Pi în octombrie 2025 — tool minimal, stabil, sub controlul lui deplin.
- **Context rot = degradare reală**: Multe "degradări de model" raportate de utilizatori sunt de fapt schimbări în harness (Claude Code), nu în model. Zechner nu a experimentat degradări în Pi, care folosește aceleași modele Claude.
- **Unlock masiv: non-tehnicii cu agenți**: Soția lui (lingvistă) și-a înmulțit output-ul scientific de 5× folosind Claude Code pentru scripturi Python pe date Excel. Nu știe să programeze, dar știe inputul și outputul. Același pattern în companii mici (6-10 oameni) care bat echipe de 50-100.
- **Ralph loops (agenți autonomi)**: Zechner e sceptic față de "dark factories" și PRD loops. Funcționează doar când ai **funcție obiectiv clară** + **criterii de succes verificabile** (modelul lui Karpathy pentru auto-research). Un loop care iterează pe spec file fără feedback obiectiv = cargo culting.
- **Tokeconomics**: Intelligence trebuie să fie accesibilă tuturor. Modelele open weights (DeepSeek, Kimi K2.6) comprimă prețurile. Kimi rulează pe un GPU cluster propriu la cost comparabil cu API-ul Anthropic. 5-10 persoane pot împărți un cluster și să iasă mai ieftin.
- **Viitorul muncii**: Seniori + agent pot înlocui 2 juniori ca output, dar echilibrul se va restabili (companiile rămân fără pipeline). Nu UBI, ci upskilling forțat. Consumer vs creator — aceeași logică ca la content.
- **Architecture > syntax**: LLMs sunt slabi la design de sisteme pentru că training data nu conține procesul de gândire arhitecturală, ci doar codul rezultat (care e în majoritate mediocru). 90% din codul din training = garbage.
- **Ideile de business**: LLM-ul e prost la generarea ideii inițiale (interpolează în "norul" ce a văzut), bun la validare și completare ("ai uitat de X").
- **Europa vs USA**: Problema principală e legală (no Delaware equivalent), nu regulatorie. Investiția și ESOP-urile sunt mult mai complexe în Europa. Mișcarea EU Inc. ar putea schimba asta.
---
## Quote-uri
> "The code doesn't need to be perfect. The code can be total slop. As long as it generates time saving."
> "People who have the means of production in the sense that they can afford the tokens have a massive edge."
> "A senior in a knowledge work position can now replace two juniors with an agent and still have their own output."
> "Don't let the agent design things for you because it learned all of that from the internet. And on the internet, it's my old shitty code... 90% of that code is shit."
> "I've never seen [a PRD Ralph loop] work. If people make it work, more power to them. For me, it's cargo culting."
> "The squishy human parts, the things that make you *you* and make your business successful — that's hard to encode in tokens."
---
## Idei acționabile
- [ ] @work: Workflow-ul lui Zechner cu Pi — prompt templates per tip de task (issue analysis, PR review, feature impl). Adaptabil cu Claude Code.
- [ ] @work: Non-tehnicii din echipă pot fi productivi dacă știu inputul și outputul — nu e nevoie să înțeleagă codul. Angajatul nou ar putea beneficia de asta.
- [ ] @growth: Architecture thinking > syntax. Investiția în design și gândire sistemică are randament mai mare decât a ști să scrii cod.

View File

@@ -0,0 +1,45 @@
# Bonificația de 3% din impozit — Răspunsul Ministerului Finanțelor (2025)
**Sursa:** https://www.facebook.com/share/v/1GXgob8U5t/
**Autor:** Cristi Rapcencu
**Data notei:** 2026-05-08
**Tags:** @work @anaf #fiscal #bonificatie #impozit-profit #micro
---
## TL;DR
Ministerul Finanțelor a răspuns oficial (luni, 27...) unei adrese trimise de Camera Consultanților Fiscali privind tratamentul contabil și fiscal al **bonificației de 3%** acordate de ANAF la finalul anului precedent.
Răspunsul complet este publicat pe **necece.fiscal.ro** (prima pagină a site-ului consultanților fiscali).
---
## Puncte cheie
**La plătitorii de impozit pe profit:**
- Bonificația se recunoaște ca **venit** (cont 758 — venituri diverse)
- Venitul este considerat **neimpozabil**
- Temeiul legal: art. 23 lit. d din Codul Fiscal (venituri din anularea/recuperarea unor cheltuieli nedeductibile)
- Valabil inclusiv pentru **anul 2024** (dacă nu s-au finalizat situațiile financiare)
**La microîntreprinderi:**
- Referință: art. 53 — baza impozabilă a microîntreprinderilor
- Venitul din bonificație este **impozabil** (nu se regăsește pe lista veniturilor excluse de la art. 53)
---
## Concluzie practică
| Tip contribuabil | Tratament bonificație 3% |
|-----------------|--------------------------|
| Impozit pe profit | Venit **neimpozabil** (art. 23 lit. d) |
| Microîntreprindere | Venit **impozabil** (baza art. 53) |
Dacă nu s-au finalizat situațiile financiare pe 2024, se poate reveni și corecta tratamentul fiscal al acestui venit.
---
## Transcript original (Whisper)
V-am să vă aduc la cunostință că luni 27 M. de finanție a respons unei adrese mise de camera consultanților Fiscal, responsul m. de finanție il găsim pe siteul consultanților Fiscal, acolo chiar pe prima pagi, necece Fiscal.ro, încecepe veste tratamentul bonificație de 3.00, acordată de către ANAF pe finalul anului precedent. Concluția care este la plătitorii de impozii pe profit, bonificație ani se sugereaza, colonise, recomandă, o monografie contabilă, în sensu că bonificație a se recunoaște pe venitur, pe un 7.5.8. Iar venitul este considerat neimposabil. Și acum și oamă presentat n-a întrecut, putem să ne legăm de acel articul 23 lităra de de la impozii pe profit, și acest venitul putem considera un venit din anularea din recuperarea uniciel ternet deductibile, ca atare și misterul de finance se pronunță și pe cisează că inclusiv pe anul trecut, acest venit este un venit neimposabil. În casul microntreprinderi lor în să se face trimitere la articolo 53, la baza impoziabila microntreprinderi lor, și anume venitul este unul imposabil. Atât timp că nu se regăsește pe lista de venituri acceptate, acolo de la articolo 53, ca mă stă este recomandarea misterul de finance la microntreprinderi venitul este imposabil, la platitorii de impozii pe profit un venit neimposabil. Dacă nu v-ați închis, nu v-ați definitivat anul 2025, n-ați făcut toate situatiile financiare, puteți să reveniți și în casul în care nu ați procedat așa, să reconsiderați acolo tratamentul fiscal al acelui venit.

View File

@@ -0,0 +1,56 @@
# You're Wasting 40% Of Your AI Time On Something Fixable
**URL:** https://youtu.be/647pSnX5H_Y
**Durata:** 27:13
**Data:** 2026-05-09
**Tags:** @work @growth @automation
---
## TL;DR
Oamenii pierd masiv timp cu AI pentru că nu înțeleg "harness-ul" din jurul LLM-ului — stratul de scaffolding care face diferența între un model generic și un agent care chiar lucrează pentru tine. Videoconferința descompune clar 5 componente: Prompt, Skill, Plugin, MCP/Connector, Hook/Script — și când să folosești fiecare. Modelul mental corect e că acestea sunt cărămizi Lego care se construiesc unele peste altele, nu rivale.
---
## Puncte cheie
- **Prompt** = folosit O singură dată, specific momentului. NU e bun pentru task-uri repetitive. Indexul prea mare pe prompt = pierdere de ore pe săptămână.
- **Skill** = fișier markdown cu un proces clar, repetabil. Reutilizabil cross-tool (Codex, Claude Code etc.). 20% din skills = 80% din valoare — găsește-le pe alea.
- **Plugin** = pachet complet: include skills + MCP + hooks + assets + comenzi. Dacă workflow-ul trebuie să călătorească, să fie instalat de echipă sau are nevoie de date live → plugin.
- **MCP / Connector** = "priză universală" la date live (Salesforce, Figma, GitHub, Slack). Un plugin poate *conține* un MCP, dar nu sunt același lucru.
- **Hook / Script** = verificări deterministe. Nu lăsa modelul să "imagineze" că rulează testele — rulează-le efectiv. Dacă JSON-ul trebuie să fie valid, verifică cu un script, nu cu LLM-ul.
- **Regula de aur:** Dacă o faci o singură dată → prompt. Dacă repeți → skill. Dacă workflow-ul are date live / trebuie distribuit → plugin. Dacă ai nevoie de acces la alt sistem → MCP. Dacă trebuie verificat determinist → script/hook.
- **Non-tehnicii pot construi plugins în 2026** — nu mai e nevoie de cod. Domain knowledge (știi când output-ul e greșit, știi ce pași se uită) e mai valoros decât coding skills acum.
- **Cel mai mare risc:** să faci un plugin prea mare (un singur plugin pentru tot customer success = greșeală; separă în 3-8 plugins cu granițe clare).
- **Plugin ≠ App Store addon.** Plugin = pachet de workflow reutilizabil. Întrebarea corectă nu e "ce pot instala?" ci "ce parte din munca mea are structură suficient de repetabilă să fie pachetată?"
---
## Quote-uri
> "You are literally the human plugin — you copy from one app, paste into chat, ask the model to reason, go get data from somewhere else, check the result, come back. If you don't want to be the human plugin, consider making an actual plugin."
> "A good agent workflow is designed so that the parts that are deterministic are correctly framed as scripts or correctly framed as hooks. Some things should not be left to the model."
> "If you do it once, it's a prompt. If you do it repeatedly, it's a skill. If the workflow needs to travel or other people need to install it — if it needs tools or assets or connectors — it's a plugin."
> "Agentic scaffolding must not stay vague. If scaffolding just means 'some engineering stuff around the agent' to most of us, then only engineers can ever participate in designing it. That is an old 2022-era problem."
> "The people who understand the work must be the ones who put that knowledge in."
---
## Relevanță pentru Marius / Echo
- **Echo deja face asta bine:** skills în `personality/*.md`, hooks în `cron/jobs.json`, MCP-uri implicite prin tools/. Arhitectura e solidă.
- **Oportunitate:** Câteva workflow-uri ROA (procesare bonuri, rapoarte ANAF, facturare) ar putea fi "plugins" formale — documentate ca procese reutilizabile.
- **Pentru clienți noi:** știi să construiești aceste structuri = skill rar și valoros în piața actuală.

View File

@@ -96,6 +96,13 @@ def run_heartbeat(config: dict | None = None) -> str:
results.append(emb_result) results.append(emb_result)
checks["embeddings"] = now.isoformat() checks["embeddings"] = now.isoformat()
# Git uncommitted files alone are not an actionable alert — skip Claude too
non_git_results = [r for r in results if not r.startswith("Git:")]
if not critical and not non_git_results:
state["last_run"] = now.isoformat()
_save_state(state)
return "HEARTBEAT_OK"
# Claude CLI: run if HEARTBEAT.md has extra instructions # Claude CLI: run if HEARTBEAT.md has extra instructions
claude_result = _run_claude_extra(hb_config, critical + results) claude_result = _run_claude_extra(hb_config, critical + results)
if claude_result: if claude_result:
@@ -109,11 +116,6 @@ def run_heartbeat(config: dict | None = None) -> str:
if not all_results: if not all_results:
return "HEARTBEAT_OK" return "HEARTBEAT_OK"
# Git uncommitted files alone are not an actionable alert — stay silent
non_git = [r for r in all_results if not r.startswith("Git:")]
if not non_git:
return "HEARTBEAT_OK"
return " | ".join(all_results) return " | ".join(all_results)

View File

@@ -127,12 +127,29 @@ async def check_and_send(config, send_callback) -> None:
return return
channel = config.get("newsletter_cercetasi.channel", "echo-core") channel = config.get("newsletter_cercetasi.channel", "echo-core")
sent = False
try: try:
await send_callback(channel, summary) await send_callback(channel, summary)
sent = True
log.info("Newsletter #%d/%d summary sent to channel '%s'", next_n, current_year, channel)
except Exception as e:
log.error("Send failed for newsletter #%d/%d — will retry next check: %s", next_n, current_year, e)
# Trimite și pe WhatsApp dacă e configurat
owner = config.get("whatsapp.owner", "")
if owner and sent:
owner_jid = f"{owner}@s.whatsapp.net"
bridge_url = config.get("whatsapp.bridge_url", "http://127.0.0.1:8098")
try:
async with httpx.AsyncClient() as client:
for chunk in [summary[i:i+4096] for i in range(0, len(summary), 4096)]:
await client.post(f"{bridge_url}/send", json={"to": owner_jid, "text": chunk}, timeout=15)
log.info("Newsletter #%d/%d summary sent to WhatsApp", next_n, current_year)
except Exception as e:
log.error("WhatsApp send failed for newsletter #%d/%d: %s", next_n, current_year, e)
if sent:
state["last_sent"] = next_n state["last_sent"] = next_n
state["year"] = current_year state["year"] = current_year
state["last_sent_at"] = datetime.now(timezone.utc).isoformat() state["last_sent_at"] = datetime.now(timezone.utc).isoformat()
_write_state(state) _write_state(state)
log.info("Newsletter #%d/%d summary sent to channel '%s'", next_n, current_year, channel)
except Exception as e:
log.error("Send failed for newsletter #%d/%d — will retry next check: %s", next_n, current_year, e)

View File

@@ -10,5 +10,5 @@
"D205": "d3c20a7ae70f4c18bbb7add42af035e3746d323b2e6df37a4e31ed625ddb86d9", "D205": "d3c20a7ae70f4c18bbb7add42af035e3746d323b2e6df37a4e31ed625ddb86d9",
"D390": "4726938ed5858ec735caefd947a7d182b6dc64009478332c4feabdb36412a84e", "D390": "4726938ed5858ec735caefd947a7d182b6dc64009478332c4feabdb36412a84e",
"BILANT_2024": "fbb8d66c2e530d8798362992c6983e07e1250188228c758cb6da4cde4f955950", "BILANT_2024": "fbb8d66c2e530d8798362992c6983e07e1250188228c758cb6da4cde4f955950",
"BILANT_2025": "03fe3c9095345d8ab912bafe789ce69d5957a85d94df38ce03f0d0b11d4a809b" "BILANT_2025": "81a9b74ad2b6b302a507063673134caeab65555a8e9ed75a6da660a8ee764e98"
} }

View File

@@ -1,26 +1,11 @@
S1002-S1003-S1004-S1005 S1002-S1003-S1004-S1005
S1002-S1003-S1004-S1005 S1002-S1003-S1004-S1005
S1010
S1011 S1011
S1014-S1015
S1019
S1020-S1022
S1023-S1044
S1024-S1043
S1025 S1025
S1026-S1077
S1030 S1030
S1039 S1039
S1040-S1041
S1042 S1042
S1046 S1046
S1047-S1049
S1051-S1052-S1053-S1054
S1056
S1061
S1070
S1072
S1079
Tabel Tabel
codificări codificări
tipuri de situaţii financiare şi raportări anuale tipuri de situaţii financiare şi raportări anuale
@@ -29,25 +14,24 @@ Programe asistenţă
Instrucţiuni/ Documentaţie Instrucţiuni/ Documentaţie
PDF PDF
JAVA JAVA
Atenție! Momentan se pot depune doar S1002,S1003 şi S1005.
S1002-S1005 S1002-S1005
Situaţii financiare anuale la Situaţii financiare anuale la
31 decembrie 2025 31 decembrie 2025
întocmite de către entităţile al căror exerciţiu financiar coincide cu anul calendaristic, prevăzute la pct. 1.1 din Anexa 1 la întocmite de către entităţile al căror exerciţiu financiar coincide cu anul calendaristic, prevăzute la pct. 1.1 din Anexa nr. 1 la
OMF nr. 2036/23.12.2025 OMF nr. 2036/23.12.2025
privind principalele aspecte legate de întocmirea şi depunerea situaţiilor financiare anuale şi a raportărilor contabile anuale ale operatorilor economici la Agentia Nationala de Administrare Fiscala. Potrivit art. 185 din Legea societăţilor nr. 31/1990, republicată, cu modificările şi completările ulterioare, consiliul de administraţie, respectiv directoratul, este obligat să depună la ANAF numai în format electronic pe portalul www.e-guvernare.ro, având ataşată o semnătură electronică extinsă, situaţiile financiare anuale, raportul lor, raportul cenzorilor sau raportul auditorilor financiari, după caz. Formatul electronic al situaţiilor financiare anuale la 31 decembrie 2023, generat prin programele de asistenţă, constă într-un fişier PDF având ataşat un fişier xml (care conţine formularele cod 10, cod 20, cod 30 şi cod 40), la care trebuie ataşat şi un fişier cu extensia zip. privind principalele aspecte legate de întocmirea şi depunerea situaţiilor financiare anuale şi a raportărilor contabile anuale ale operatorilor economici la Agentia Nationala de Administrare Fiscala.
Fişierul cu extensia zip va conţine prima pagină din situaţiile financiare anuale listată cu ajutorul programului de asistenţă elaborat de Ministerul Finanţelor, semnată, potrivit legii, precum şi documentele cerute de lege (de exemplu: note explicative la situaţiile financiare anuale, situaţia modificărilor capitalului propriu şi situaţia fluxurilor de numerar, după caz; raportul administratorilor; raportul de audit sau raportul comisiei de cenzori, după caz; propunerea de distribuire a profitului sau de acoperire a pierderii contabile; declaraţia scrisă a persoanelor prevăzute la art. 10 alin. (1) din legea contabilităţii, prin care îşi asumă răspunderea pentru întocmirea situaţiilor financiare anuale), aşa cum acestea sunt întocmite de entităţi, toate acestea fiind scanate, alb-negru, lizibil şi cu o rezoluţie care să permită încadrarea în limita a 9,5 MB a fişierului PDF la care este ataşat fişierul zip. Fişierele zip ataşate situaţiilor financiare anuale nu vor conţine parolă. Potrivit art. 185 din Legea societăţilor nr. 31/1990, republicată, cu modificările şi completările ulterioare, consiliul de administraţie, respectiv directoratul, este obligat să depună la ANAF, în format hârtie şi în format electronic sau numai în formă electronică pe portalul
www.e-guvernare.ro
, având ataşată o semnătură electronică extinsă, situaţiile financiare anuale, raportul lor, raportul cenzorilor sau raportul auditorilor financiari, după caz. Formatul electronic al situaţiilor financiare anuale la 31 decembrie 2023, generat prin programele de asistenţă, constă într-un fişier PDF având ataşat un fişier xml (care conţine formularele cod 10, cod 20, cod 30 şi cod 40), la care trebuie ataşat şi un fişier cu extensia zip. Fişierul cu extensia zip va conţine documentele cerute de lege (de exemplu: note explicative la situaţiile financiare anuale, situaţia modificărilor capitalului propriu şi situaţia fluxurilor de numerar, după caz; raportul administratorilor; raportul de audit sau raportul comisiei de cenzori, după caz; propunerea de distribuire a profitului sau de acoperire a pierderii contabile; declaraţia scrisă a persoanelor prevăzute la art. 10 alin. (1) din legea contabilităţii, prin care îşi asumă răspunderea pentru întocmirea situaţiilor financiare anuale) scanate alb-negru, lizibil, şi cu o rezoluţie care să permită încadrarea în limita a 10 MB a fişierului PDF la care este ataşat fişierul zip. Fişierul zip ataşat situaţiilor financiare anuale nu va conţine parolă.
- publicat în data de - publicat în data de
28.01.2026 28.01.2026
soft A soft A
actualizat în data
27.03.2026
soft J - S1002 soft J - S1002
soft J - S1003 soft J - S1003
soft J - S1004
soft J - S1005 soft J - S1005
Schema XSD 1002 Schema XSD 1002
Schema XSD 1003 Schema XSD 1003
Schema XSD 1004
Schema XSD 1005 Schema XSD 1005
Structura Structura
*softul J se adresează doar contribuabililor care îşi generează fişierul xml din aplicaţiile informatice proprii *softul J se adresează doar contribuabililor care îşi generează fişierul xml din aplicaţiile informatice proprii

View File

@@ -40,16 +40,15 @@
"soft_j_date": "16.02.2026" "soft_j_date": "16.02.2026"
}, },
"BILANT_2025": { "BILANT_2025": {
"soft_a_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/bilant_SC_1225_XML_270326.pdf", "soft_a_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/bilant_SC_1225_XML_110226.pdf",
"soft_a_date": "27.03.2026", "soft_a_date": "11.02.2026",
"soft_j_S1002_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1002_20260128.zip", "soft_j_S1002_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1002_20260513.zip",
"soft_j_S1002_date": "28.01.2026", "soft_j_S1002_date": "13.05.2026",
"soft_j_S1004_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1004_20250204.zip",
"soft_j_S1004_date": "04.02.2025",
"soft_j_S1003_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1003_20260210.zip", "soft_j_S1003_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1003_20260210.zip",
"soft_j_S1003_date": "10.02.2026", "soft_j_S1003_date": "10.02.2026",
"soft_j_S1004_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1004_20260224.zip", "soft_j_S1005_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1005_202060203.zip"
"soft_j_S1004_date": "24.02.2026",
"soft_j_S1005_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1005_20260317.zip",
"soft_j_S1005_date": "17.03.2026"
}, },
"SIT_FIN_SEM_2025": { "SIT_FIN_SEM_2025": {
"soft_j_1012_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1012_20250723.zip", "soft_j_1012_url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/AplicatiiDec/S1012_20250723.zip",

View File

@@ -28,6 +28,16 @@ from tools.email_process import (
from src.config import Config from src.config import Config
BRIDGE_URL = "http://127.0.0.1:8098" BRIDGE_URL = "http://127.0.0.1:8098"
def clean_urls(text: str) -> str:
"""Remove %0A and wrapped newlines from URLs in plain text emails."""
def _clean_url(m):
url = m.group(0)
url = url.replace('%0A', '').replace('%0a', '')
url = re.sub(r'\s+', '', url)
return url.rstrip('.')
return re.sub(r'https?://\S+', _clean_url, text)
DRY_RUN = "--dry-run" in sys.argv DRY_RUN = "--dry-run" in sys.argv
@@ -100,6 +110,8 @@ def generate_summary(subject: str, from_full: str, date: str, body: str) -> str:
display_from = extract_original_sender(subject, body, from_full) display_from = extract_original_sender(subject, body, from_full)
display_subject = re.sub(r'^(Fwd?|Fw)\s*[:\s]\s*', '', subject, flags=re.IGNORECASE).strip() or subject display_subject = re.sub(r'^(Fwd?|Fw)\s*[:\s]\s*', '', subject, flags=re.IGNORECASE).strip() or subject
body = clean_urls(body)
prompt = f"""Mai jos este conținutul unui email. Scrie un rezumat factual pentru WhatsApp. prompt = f"""Mai jos este conținutul unui email. Scrie un rezumat factual pentru WhatsApp.
EMAIL: EMAIL:
@@ -116,7 +128,7 @@ Instrucțiuni:
* Prima propoziție: cine a trimis mesajul original, ce, cui. * Prima propoziție: cine a trimis mesajul original, ce, cui.
* Ce conține mesajul — concret și direct. Omite politețuri și amabilități; include doar faptele. * Ce conține mesajul — concret și direct. Omite politețuri și amabilități; include doar faptele.
* Dacă există termene, date, locuri sau acțiuni cerute — menționează-le explicit. * Dacă există termene, date, locuri sau acțiuni cerute — menționează-le explicit.
* Dacă există URL-uri relevante (articole, documente, formulare, linkuri de citit online, resurse), adaugă o secțiune LINKURI la final cu URL-urile complete, câte unul pe rând. * Dacă un item menționează un formular, document sau resursă cu link, include URL-ul direct după item, pe același rând sau pe rândul imediat următor — inline, nu secțiune separată la final. Copiază URL-urile COMPLET, fără trunchieri sau '...'.
- Nu adăuga secțiuni goale sau care nu se aplică emailului. - Nu adăuga secțiuni goale sau care nu se aplică emailului.
- Plain text, fără markdown. Fără emoji. - Plain text, fără markdown. Fără emoji.
- Răspunde DOAR cu rezumatul, nimic altceva.""" - Răspunde DOAR cu rezumatul, nimic altceva."""

View File

@@ -186,6 +186,7 @@ def fetch_unread_emails():
att_data[fname] = payload att_data[fname] = payload
results.append({ results.append({
'id': eid.decode(),
'subject': decode_mime_header(msg['Subject']), 'subject': decode_mime_header(msg['Subject']),
'from_full': from_addr, 'from_full': from_addr,
'date': msg['Date'], 'date': msg['Date'],
@@ -198,6 +199,21 @@ def fetch_unread_emails():
return results return results
def mark_as_seen(email_ids: list[str]) -> None:
"""Marchează emailurile ca citite pe server IMAP."""
if not email_ids:
return
try:
mail = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT)
mail.login(IMAP_USER, IMAP_PASS)
mail.select('INBOX')
for eid in email_ids:
mail.store(eid.encode(), '+FLAGS', '\\Seen')
mail.logout()
except Exception as e:
print(f"[warn] Marcare Seen esuata: {e}", file=sys.stderr)
def run_forward(): def run_forward():
print("Verific emailuri necitite...") print("Verific emailuri necitite...")
emails = fetch_unread_emails() emails = fetch_unread_emails()
@@ -223,12 +239,14 @@ def run_forward():
if em.get('attachment_data'): if em.get('attachment_data'):
print(f"Atașamente: {list(em['attachment_data'].keys())}") print(f"Atașamente: {list(em['attachment_data'].keys())}")
else: else:
wa_ok = True
for part in parts: for part in parts:
ok = send_whatsapp(owner_jid, part) ok = send_whatsapp(owner_jid, part)
if not ok: if not ok:
print(f"Trimitere esuata: {subject}") print(f"Trimitere esuata: {subject}")
wa_ok = False
break break
else: if wa_ok:
print(f"Trimis pe WhatsApp ({len(parts)} mesaje): {subject}") print(f"Trimis pe WhatsApp ({len(parts)} mesaje): {subject}")
full_text = "\n".join(parts) full_text = "\n".join(parts)
@@ -245,6 +263,9 @@ def run_forward():
else: else:
print(f"Atașament eșuat: {fname}") print(f"Atașament eșuat: {fname}")
if wa_ok:
mark_as_seen([em['id']])
if __name__ == "__main__": if __name__ == "__main__":
run_forward() run_forward()