From 6d0bfe156f72a9e7cedbd97658535045b5b2295c Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Mon, 31 Aug 2026 15:50:03 +0000 Subject: [PATCH] Initial commit: spatiul de lucru al puntii Discord Continut mutat din repo-ul romfast/workspace, unde fusese comis din greseala (commit-urile 0558bae si 47d9fb2 de acolo). Acolo e acum ignorat. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Q4uzvgm7AyJch5WH8QHRhY --- .gitignore | 5 + CLAUDE.md | 25 +++++ README.md | 11 ++ docs/discord-bridge-context.md | 40 ++++++++ docs/echo-roa2web.md | 104 +++++++++++++++++++ docs/infrastructure.md | 59 +++++++++++ docs/maria-whatsapp-rag-prototype.md | 146 +++++++++++++++++++++++++++ tools/roa2web.sh | 21 ++++ 8 files changed, 411 insertions(+) create mode 100644 .gitignore create mode 100644 CLAUDE.md create mode 100644 README.md create mode 100644 docs/discord-bridge-context.md create mode 100644 docs/echo-roa2web.md create mode 100644 docs/infrastructure.md create mode 100644 docs/maria-whatsapp-rag-prototype.md create mode 100755 tools/roa2web.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6265214 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +__pycache__/ +*.pyc +.venv/ +node_modules/ +.env diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3121578 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,25 @@ +# CLAUDE.md — claude-agent (spațiul puntii Discord) + +Vezi `README.md` pentru context general. + +## Canal principal + +Utilizatorul comunică cu acest agent în principal prin **Discord**, prin puntea Discord → Claude Code +(cod sursă: `romfastsql/proxmox/lxc171-claude-agent/discord-bridge/`, vezi și `docs/echo-roa2web.md` +pentru diferența față de Echo/MoltBot). Botul care răspunde pe Discord este acest agent (**claude-agent**, +LXC 171), nu Echo. Atașamentele (imagini, fișiere) trimise pe Discord nu sunt încă citite automat de +punte — doar textul mesajului ajunge la Claude (vezi limitarea cunoscută mai jos, în lucru). + +## Documentație + +| Subiect | Fișier | +|---------|--------| +| Infrastructură Proxmox (noduri, LXC, VM, proiecte) | [docs/infrastructure.md](docs/infrastructure.md) | +| Echo (LXC 110 moltbot) — acces și comenzi pentru roa2web | [docs/echo-roa2web.md](docs/echo-roa2web.md) | +| Maria — punte WhatsApp + RAG (LXC 171, servicii + dashboard comun) | [docs/maria-whatsapp-rag-prototype.md](docs/maria-whatsapp-rag-prototype.md) | + +Detalii complete Proxmox (config, troubleshooting, incidente): `/workspace/romfastsql/proxmox/`. + +## Convenții de lucru + +- Pentru sarcini care se pot repeta (ex: extragere transcript video, procesare de fișiere), scrie un script reutilizabil (bash/python) în `tools/` în loc de comenzi ad-hoc de unică folosință. diff --git a/README.md b/README.md new file mode 100644 index 0000000..66c0ced --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# claude-agent — spatiul de lucru al puntii Discord + +Directorul implicit (`DEFAULT_CWD`) al firelor din puntea Discord -> Claude Code. +Ce ceri botului in `#claude-agent` ateriza aici, nu direct in `/workspace`. + +Repo propriu, ca lucrurile facute din Discord sa aiba istoric separat de proiectele +reale si sa se poata da inapoi fara sa atinga altceva. + +- Codul puntii NU e aici: e in `romfastsql/proxmox/lxc171-claude-agent/discord-bridge/`. +- Pentru a lucra pe alt proiect dintr-un fir: `!cd /workspace/`. +- Fiecare fir Discord isi tine propriul director; `!status` il arata. diff --git a/docs/discord-bridge-context.md b/docs/discord-bridge-context.md new file mode 100644 index 0000000..9b1d891 --- /dev/null +++ b/docs/discord-bridge-context.md @@ -0,0 +1,40 @@ +# Puntea Discord — cum se acumulează și se golește contextul + +Sursă: `romfastsql/proxmox/lxc171-claude-agent/discord-bridge/` (`bot.py`, `runner.py`, `session_store.py`). + +## Model + +Fiecare fir de Discord (thread) e mapat pe o sesiune Claude Code reală, nu pe o +fereastră de memorie proprie (spre deosebire de chatbot-ul Maria/Flowise, care +folosește Buffer Window Memory cu `k=5`). + +- `session_store.py` ține în `state.json` câte o înregistrare per `thread_id`, + cu câmpul `sid` = session id-ul Claude Code. +- La fiecare tur nou pe același fir, `runner.py` pornește procesul cu + `claude --resume --autocompact auto` — deci **contextul se acumulează + la nesfârșit** în sesiunea Claude Code, cu compactare automată (`--autocompact + auto`) gestionată de Claude Code însuși când se apropie de limita de context + (nu e o ștergere, e un sumar intern). +- Dacă procesul moare/repornește, se reia cu `--resume` pe același `sid` — + contextul supraviețuiește restart-urilor botului. + +## Când se golește efectiv + +Nu există curățare automată pe timp (nu e un TTL/cron). Contextul unui fir se +resetează DOAR manual, din Discord: + +- **`/new`** — pornește o sesiune nouă (`sid = None`), fir „curat". +- **`/new fork:True`** — sesiune nouă, dar pornită dintr-un fork al + contextului curent (păstrează istoricul până la acel punct, apoi ramifică). + +`bot.py:645` apelează `runner.reset(tid, fork=...)`, care în `runner.py:333` +oprește procesul curent și șterge `proc.sid` (la fork, marchează following +`--resume` cu fork în loc de resume simplu). + +## De reținut + +- Nu confunda acest mecanism cu Maria (Flowise): acolo fereastra e fixă (ultimele + 5 schimburi, per `sessionId`), aici fereastra e "tot" + auto-compact intern + Claude Code, golit doar la `/new`. +- Comanda `/cleanup` (`cleanup.py`) NU are legătură cu contextul conversației — + curăță procese orfane rămase în urma firelor (memorie RAM), nu istoricul de chat. diff --git a/docs/echo-roa2web.md b/docs/echo-roa2web.md new file mode 100644 index 0000000..e47bbee --- /dev/null +++ b/docs/echo-roa2web.md @@ -0,0 +1,104 @@ +# Echo (LXC 110 moltbot) — acces și comenzi pentru roa2web + +„Echo" nu face parte din codul roa2web — e un bot AI separat (Echo Core, Claude Opus 4.5), +rulat pe LXC 110 (moltbot), care are acces la `/workspace` și deci „știe" despre roa2web ca +orice alt agent Claude cu acces la filesystem (a generat chiar câteva documente +roa2web — vezi bylines „Generated by: Echo" în `roa2web-agent-ai/tasks/prd-roa2web-telegram-bonuri.md` +și `roa2web-agent-ai/backend/scripts/whatsapp_import/README.md`). + +Sursa completă: `/workspace/romfastsql/proxmox/lxc110-moltbot/README.md`. + +## Ce este + +| | | +|---|---| +| Nume proces | `echo-core` (Python), `/home/moltbot/echo-core`, `python3 src/main.py` | +| Container | LXC 110 „moltbot", pve1 | +| IP | `10.0.20.173` (intern) / `100.120.119.70` (Tailscale) | +| Model | Anthropic `claude-opus-4-5`, context 200k | +| Canale | Telegram (ON), WhatsApp (ON, +40723197939), Discord (inclus în descrierea serviciului) | + +⚠️ Stack-ul vechi **clawdbot/OpenClaw** (CLI, comenzi `clawdbot ...`) **nu mai e funcțional** +(verificat 2026-08-30) — folosește comenzile `echo-core` de mai jos, nu pe cele vechi. + +## Servicii systemd (pe container, user `moltbot`) + +```bash +systemctl --user status echo-core +systemctl --user restart echo-core +journalctl --user -u echo-core -f +``` + +Servicii înrudite: `echo-taskboard.service` (dashboard API), `echo-whatsapp-bridge.service` +(punte WhatsApp, Node/Baileys). + +## Acces + +### SSH direct +```bash +ssh moltbot@10.0.20.173 # rețea internă +ssh moltbot@100.120.119.70 # Tailscale, de oriunde +``` + +### Dashboard web +```bash +ssh -L 18789:127.0.0.1:18789 -N moltbot@10.0.20.173 & +# apoi: http://localhost:18789 +``` +Sau prin Tailscale: `https://moltbot.tailf7372d.ts.net/echo/`. + +### Chat (Telegram / WhatsApp / Discord) +Scrii direct botului pe canalul respectiv — nu există un CLI de invocat local pentru asta. + +## Client roa2web al lui Echo (`tools/roa2web_client.py`) + +Pe lângă chat, Echo are un client CLI propriu pentru API-ul financiar roa2web: +`~/echo-core/tools/roa2web_client.py` (pe moltbot). Autentificare: user/parolă Oracle + +2FA email la primul login; după primul login cu `trust_device=True`, token-urile +(access/refresh/trusted-device) stau în keyring-ul local (`service="echo-core"`, +`src/credential_store.py`) — sesiunile următoare nu mai cer OTP. + +Config (`~/echo-core/config.json` → cheia `roa2web`): +```json +{ + "base_url": "https://roa2web.romfast.ro/roa2web/api", + "default_company": "114", + "default_company_name": "ROMFAST SRL" +} +``` + +Comenzi client (rulate pe moltbot, în `~/echo-core`, cu `.venv/bin/python3`): + +| Comandă | Ce face | +|---|---| +| `companies` | Listează toate firmele (`id_firma` + nume) | +| `summary [--company ] [--luna N] [--an N]` | Dashboard financiar: clienți, furnizori, trezorerie (`/reports/dashboard/summary`) | +| `get [--company ...] [--param k=v ...]` | Query generic pe orice endpoint, ex. `/reports/treasury/bank-cash-register`, `/reports/invoices` | +| `verify-2fa ` | Finalizează login-ul cu un cod OTP primit pe email (doar dacă tokenul a expirat și cere reautentificare) | + +Endpoint-uri disponibile sub `/api/reports/...` (din `roa2web-agent-ai/backend/modules/reports/routers/`): +`dashboard/summary`, `dashboard/trends`, `dashboard/cashflow`, `dashboard/maturity`, +`dashboard/treasury-breakdown`, `invoices/`, `invoices/summary`, `invoices/{numar}`, +`treasury/bank-cash-register`, `treasury/bank-cash-accounts`, `trial-balance/`. + +### Integrare în claude-agent — `tools/roa2web.sh` + +Wrapper în acest repo (`/workspace/claude-agent/tools/roa2web.sh`) care rulează clientul de +mai sus pe moltbot prin SSH, **fără să dubleze credențialele** aici — folosește token-ul deja +în keyring-ul lui echo-core: + +```bash +tools/roa2web.sh companies +tools/roa2web.sh summary # firma implicită: ROMFAST SRL (114) +tools/roa2web.sh summary --company 114 --luna 8 --an 2026 +tools/roa2web.sh get /reports/treasury/bank-cash-register --company 114 +``` + +Necesită SSH fără parolă către `moltbot@10.0.20.173` (deja funcțional din acest container). + +## Alt canal: comenzi financiare directe în roa2web (fără Echo) + +Independent de Echo, aplicația roa2web are propriul bot Telegram +(`roa2web-agent-ai/backend/modules/telegram/`, vezi `docs/telegram/README.md` din acel repo) +cu comenzi ca `/dashboard`, `/sold`, `/facturi`, `/trezorerie` — util dacă ai cont Oracle +legat direct la Telegram, fără să treci prin Echo/moltbot. diff --git a/docs/infrastructure.md b/docs/infrastructure.md new file mode 100644 index 0000000..69128dc --- /dev/null +++ b/docs/infrastructure.md @@ -0,0 +1,59 @@ +# Infrastructură Proxmox + +Sursă completă: `/workspace/romfastsql/proxmox/README.md` (și subdirectoarele `lxc*/`, `vm*/`, `cluster/`). +Acest fișier e un rezumat rapid — pentru detalii (config, troubleshooting, incidente) mergi la sursă. + +## Noduri Cluster (3 noduri, quorum activ) + +| Nod | IP | Rol | +|-----|-----|-----| +| pve1 | 10.0.20.200 | Nod cluster | +| pvemini | 10.0.20.201 | Nod principal (majoritatea LXC-urilor) | +| pveelite | 10.0.20.202 | Nod cluster | + +## LXC-uri + +| VMID | Nume | Nod | IP | +|------|------|-----|-----| +| 100 | portainer | pvemini | 10.0.20.170 | +| 101 | minecraft | pve1 | - | +| 102 | docker.romfast.ro | pvemini | 10.0.20.113 | +| 103 | dokploy | pvemini | 10.0.20.167 | +| 104 | flowise | pvemini | 10.0.20.161 | +| 106 | gitea | pvemini | 10.0.20.165 | +| 108 | central-oracle | pvemini | 10.0.20.121 | +| 110 | moltbot | pve1 | 10.0.20.173 | +| **171** | **claude-agent (acest container)** | pvemini | 10.0.20.171 | +| 301 | docker-portainer-template | pveelite | - (stopped) | + +## VM-uri (QEMU) + +| VMID | Nume | Nod | IP | +|------|------|-----|-----| +| 109 | oracle-dr-windows | pveelite | 10.0.20.37 (stopped) | +| 201 | roacentral | pvemini | 10.0.20.122 | +| 302 | oracle-test-302 | pvemini | - (stopped) | +| 303 | Win11-Adina | pvemini | DHCP | +| 310 | Win11-Template-Sysprep | pvemini | template | + +## Acces SSH real la noduri și containere + +Am acces SSH direct (chei deja autorizate, fără parolă) la nodurile Proxmox: +```bash +ssh root@10.0.20.200 # pve1 +ssh root@10.0.20.201 # pvemini +ssh root@10.0.20.202 # pveelite +``` + +De pe un nod, `pct exec -- ` rulează comenzi direct în container, fără SSH separat către container (util mai ales unde containerul nu are IP/SSH propriu accesibil de aici). Exemplu: +```bash +ssh root@10.0.20.201 "pct exec 104 -- systemctl status flowise --no-pager" +``` + +Unele containere (ex. moltbot/110) au și SSH direct funcțional către user-ul de serviciu (`ssh moltbot@10.0.20.173`), altele nu — verifică ambele căi. + +**Nu presupune starea infrastructurii din documentație — verifică live prin SSH/`pct exec`** înainte de a raporta sau a planifica pe baza ei (docs pot fi neactualizate; ex. resurse reale, servicii active, modele instalate). + +## Proiecte în /workspace + +atm, autopass, city-discovery, claude-agent, efactura-generator, escape-builder, game-library, gomag-vending, icon-generator, paula-escape, qr-generator, qrpdf, roa2web, roa2web-agent-ai, roaauto, romfastsql, romfast-website, service-auto, space-booking, vending_data_intelligence_report, vfp_roaauto diff --git a/docs/maria-whatsapp-rag-prototype.md b/docs/maria-whatsapp-rag-prototype.md new file mode 100644 index 0000000..6fccc68 --- /dev/null +++ b/docs/maria-whatsapp-rag-prototype.md @@ -0,0 +1,146 @@ +# Maria — punte WhatsApp + RAG (LXC 171), acum serviciu în git + +Sursa: `romfastsql/proxmox/lxc171-claude-agent/maria-whatsapp-bridge/` (repo +`ROMFASTSQL`, commit „Add Maria WhatsApp+RAG bridge as a service (LXC 171)"). + +A pornit ca prototip nefinalizat în `/tmp/maria-bridge/` (fără git, fără +serviciu systemd — vezi istoricul acestei conversații). A fost mutat integral +în git, ca proiect sibling lui `discord-bridge/`, cu servicii `systemctl --user` +proprii și dashboard de control. + +Nu trebuie confundat cu: +- **Maria pe Flowise** (`vfp_roaauto/COMUN/utile/chatbot/`) — chatbot web, + memorie Buffer Window (`k=5`) în Flowise. +- **Echo / `echo-whatsapp-bridge.service`** (LXC 110 moltbot) — bridge WhatsApp + Baileys separat, al lui Echo Core (Claude Opus 4.5). +- **Punte Discord -> Claude Code** (`discord-bridge/`, același container) — + alt scop (comandă Claude Code de pe Discord), vezi + [`discord-bridge-context.md`](discord-bridge-context.md). + +## Arhitectură + +``` +WhatsApp (self-chat implicit) + -> whatsapp/index.js (Baileys, port 8099) + -> rag/consumer.py (polling, RAG STATELESS — fara chat_history) + -> rag/store.py (depozit .txt/.md in ~/.maria-bridge/documents/) + -> rag/indexer.py (chunking + embeddings Ollama -> rag_index.json) + -> rag/sync.py (rclone pull din Google Drive + reindexare conditionata) +dashboard/api.py (stdlib, port 18792) — control total din browser +``` + +## Servicii `systemctl --user` (pe LXC 171, sub `~/.config/systemd/user/`) + +| Unitate | Rol | +|---|---| +| `maria-whatsapp.service` | Puntea Baileys (Node), port 8099 | +| `maria-rag.service` | Consumer RAG (Python venv), răspunde la mesaje | +| `maria-sync.service` + `maria-sync.timer` | Sincronizare Drive + reindexare, la 10 min | + +Instalare: `ops/install.sh` (idempotent, mirror al `discord-bridge/ops/install.sh` +— creează `~/.maria-bridge/`, venv, `npm install`, symlink-uri unit, +`systemctl --user enable`). Bridge-ul **nu pornește automat** — cere scanarea +unui cod QR (pas manual, o singură dată); vezi `README.md` din proiect. + +## Control — dashboard COMUN cu puntea Discord (nu unul separat) + +**Decizie ulterioară** (la cererea explicită a utilizatorului): Maria NU are +dashboard propriu. Controlul se face din **dashboard-ul punții Discord** +(`discord-bridge/dashboard/`, `https://claude-agent.tailf7372d.ts.net/claude`), +secțiunea „Maria — WhatsApp + RAG", adăugată direct în `dashboard/api.py` și +`index.html` ale acelui proiect. Rutele Maria (`/api/maria/*`) rulează în +ACELAȘI proces Python ca puntea Discord, dar comunică cu Maria doar prin +subprocess (`systemctl`, scripturi din `rag/`) și HTTP către bridge — fără +import de module Python din `maria-whatsapp-bridge`, ca să nu coliseze cu +`discord-bridge/config.py` (ambele s-ar numi `config`). + +Ce oferă secțiunea Maria din acel panou: +- start/stop/restart pentru `maria-whatsapp` și `maria-rag` (unități fixe, + aceeași protecție ca la Discord — niciun nume de unit nu vine din request) +- stare conexiune WhatsApp + cod QR de asociere (când nu e conectat) +- listă documente din depozit, adăugare/ștergere text, reindexare manuală +- buton „sincronizează din Drive acum" (`rag/sync.py`, apelat și de timer) +- loguri (tail) pentru `whatsapp.log`/`rag.log` + +Autentificare: aceeași sesiune/cookie ca restul dashboard-ului Discord +(`DASHBOARD_TOKEN` din `~/.claude-discord/env`) — un singur login pentru +ambele punți. + +## Depozit de documente + Google Drive + +Documentele (`.txt`/`.md`) stau în `~/.maria-bridge/documents/` pe container. +Se pot administra manual din dashboard, sau sincroniza automat cu dosarul +Google Drive de pe Windows (`D:\GoogleDrive\romfast\document_store`) prin +**rclone cu un cont de serviciu Google** (nu OAuth interactiv — containerul +e headless). Pași de configurare completi în README-ul proiectului +(`maria-whatsapp-bridge/README.md`, secțiunea „Sincronizare cu Google Drive"). +`DRIVE_REMOTE` gol în env = sincronizare dezactivată, doar upload manual. + +## Context conversațional — neschimbat față de prototip + +`rag/consumer.py` tot NU ține memorie între mesaje — fiecare întrebare e o +interogare RAG independentă (system prompt + top-K chunk-uri din index + +întrebare). Nu există nimic de "golit"; comparativ: +- Maria/Flowise: fereastră fixă de 5 schimburi; +- Discord bridge: context nelimitat (autocompact), golit doar cu `/new`; +- Maria WhatsApp+RAG: zero memorie, fiecare mesaj e independent. + +## Embeddings — Ollama local pe LXC 171 + +Inițial `OLLAMA_URL=http://127.0.0.1:11434` din `env` era un placeholder +nefuncțional (niciun Ollama instalat nicăieri, nici local nici pe alt LXC — +verificat explicit, nu există server Ollama documentat în infrastructură). +**Rezolvat 2026-08-31**: instalat Ollama direct pe acest container +(`curl -fsSL https://ollama.com/install.sh | sh`, plus `zstd` ca dependință), +pornit ca `ollama.service` (systemd la nivel de sistem, nu `--user`), și +tras modelul `nomic-embed-text` (`ollama pull nomic-embed-text`, ~274 MB, +rulează CPU-only, fără GPU pe container). Cu asta `rag/indexer.py` și +`rag/consumer.py` au un backend de embeddings funcțional local, fără nicio +dependință externă de rețea. + +## Sincronizare Google Drive — status real + +`rclone` a fost instalat pe container (`apt-get install rclone`), dar +`DRIVE_REMOTE` rămâne **negol configurat**: pasul care lipsește e crearea +unui cont de serviciu Google (GCP Console → IAM → Service Accounts) și +partajarea folderului `document_store` cu adresa lui de email — acțiuni +care cer acces la consola Google Cloud a utilizatorului, deci nu pot fi +automatizate din container. Vezi README, secțiunea „Sincronizare cu Google +Drive", pentru pașii exacți rămași. + +**Testare imediată a indexării** (fără să aștepte configurarea rclone): +s-au adus manual 6 documente reale din folderul Drive `document_store` +(`romfast_info.md`, `erori_generale_knowledge.md`, `bilant_knowledge.md`, +`import_knowledge.md`, `roafacturare_manual.md`, `spv_semnatura_knowledge.md`) +folosind uneltele MCP Google Drive disponibile agentului (cont +`mmarius28@gmail.com`, folder id `1C4e75zgH1_7ZK-_oBP5ZZBvUPh3iEo1O`), scrise +direct în `~/.maria-bridge/documents/` și indexate cu `rag/indexer.py` — +**25 de chunk-uri, index de ~400 KB, reconstruit cu succes** folosind Ollama-ul +local de mai sus. Asta confirmă că pipeline-ul store → indexer → embeddings +funcționează capăt-la-capăt; rămâne doar conectarea automată la Drive prin +`rclone` (pasul manual al utilizatorului, de mai sus). + +## Stare la momentul scrierii (actualizat 2026-08-31) + +`maria-whatsapp`, `maria-rag` și `maria-sync.timer` sunt `active (running)`/ +`enabled`. Dashboard-ul propriu (`maria-dashboard.service`) a fost **oprit, +dezactivat și eliminat din cod** — controlul e acum consolidat în +dashboard-ul punții Discord (secțiunea „Maria — WhatsApp + RAG", verificată +funcțională prin `curl` direct pe `/api/maria/status`). Bridge-ul a generat +cod QR și așteaptă scanarea din telefon (`connected: false` până atunci). + +Rămâne de făcut manual: +- **scanarea codului QR** din dashboard (cardul „Conectare WhatsApp") — pas fizic, + nu poate fi automatizat; +- **contul de serviciu Google + `DRIVE_REMOTE`** — vezi secțiunea de mai sus; + fără el, sincronizarea automată din Drive rămâne inactivă (dar upload-ul + manual de documente + reindexare funcționează deja, testat); +- **file picker în dashboard** — cerut explicit de utilizator: secțiunea + „Adaugă document" din panoul Maria permite azi doar scrierea manuală de + text într-un textarea; de înlocuit/completat cu un input de tip fișier + care acceptă selecția mai multor fișiere deodată (upload multipart, nu + JSON), pentru administrare mai rapidă a depozitului. **Neimplementat încă.** + +Bug reparat în timpul instalării inițiale (înainte de consolidare): `install.sh` +lega unitatea dashboard-ului propriu la o cale greșită — devenit irelevant +odată cu eliminarea acelui dashboard. diff --git a/tools/roa2web.sh b/tools/roa2web.sh new file mode 100755 index 0000000..8e06d6d --- /dev/null +++ b/tools/roa2web.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Wrapper peste clientul roa2web deja autentificat pe moltbot (LXC 110, echo-core). +# Nu duplica credentiale aici: ruleaza tools/roa2web_client.py de pe moltbot prin SSH, +# folosind token-ul din keyring-ul lui echo-core. +# +# Uz: +# tools/roa2web.sh companies +# tools/roa2web.sh summary [--company ] [--luna N] [--an N] +# tools/roa2web.sh get [--company ] [--param k=v ...] +# +# Firma implicita (daca omiti --company): ROMFAST SRL (114), din config.json de pe moltbot. +set -euo pipefail + +HOST="moltbot@10.0.20.173" +REMOTE_CMD="cd ~/echo-core && .venv/bin/python3 tools/roa2web_client.py" + +for arg in "$@"; do + REMOTE_CMD+=" $(printf '%q' "$arg")" +done + +exec ssh -o BatchMode=yes -o ConnectTimeout=10 "$HOST" "$REMOTE_CMD"