Files
Claude Agent 1cc1a572d9 feat(discord-bridge): aprobari valabile pe tot firul (buton "Allow (tot firul)")
Confirmarea per comanda devenea obositoare intr-o sesiune care lucreaza pe
acelasi host: `ssh pvemini ...` de zece ori la rand insemna zece butoane.

Butonul de confirmare are acum trei variante: Allow / Allow (tot firul) / Deny.
"Allow (tot firul)" memoreaza tiparul `(rule, reason)` produs de clasificator,
nu comanda: dupa o aprobare pe `ssh pvemini uptime`, orice comanda catre ACEL
host trece singura, dar `ssh 10.0.20.36` sau un `rm -rf` cer din nou
confirmare. Aprobarile stau in ~/.claude-discord/approvals/grants/<fir>.json.

Domeniul e firul Discord, nu `session_id`: acela se schimba la `--resume`, iar
aprobarile ar disparea exact cand omul se astepta sa tina.

Expirare: `/new` le sterge (sesiune noua = permisiuni noi), `/permisiuni
revoca:True` la cerere, TTL implicit 12h (CLAUDE_DISCORD_GRANT_TTL), iar
CLAUDE_DISCORD_SESSION_GRANTS=off dezactiveaza complet mecanismul.

Fail-closed peste tot, ca restul hook-ului: fara CLAUDE_DISCORD_THREAD_ID (hook
rulat in afara puntii), cu fisierul de aprobari corupt, cu un thread_id care nu
arata a id (`../`, punct la inceput, peste 128 de caractere) sau la orice
exceptie, has_grant() raspunde False si se cere confirmare in Discord.

Adaugat si `/permisiuni [revoca:True]` (listare/revocare) plus butonul
echivalent in dashboard (`decision: "allow_session"`).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B29CApsP1JkSdjYaGaHpE7
2026-08-31 07:36:34 +00:00

82 lines
4.2 KiB
Plaintext

# Configurarea puntii Discord -> Claude Code.
#
# install.sh copiaza acest fisier in ~/.claude-discord/env cu drepturi 0600.
# Formatul e cel cerut de systemd EnvironmentFile: CHEIE=valoare, fara `export`,
# fara ghilimele in jurul valorii, fara expandare de variabile.
#
# DUPA COPIERE COMPLETEAZA MANUAL cel putin DISCORD_TOKEN si allowlist-ul.
# --- Discord ---------------------------------------------------------------
# Token-ul botului: Discord Developer Portal -> aplicatia ta -> Bot -> Reset Token.
# Se vede o singura data. Daca ajunge in git, invalideaza-l imediat din portal.
DISCORD_TOKEN=
# Allowlist. Liste separate prin virgula, cu ID-uri numerice (Discord -> Advanced ->
# Developer Mode, apoi click dreapta -> Copy ID). Gol = nimic permis (fail-closed).
DISCORD_GUILD_IDS=
DISCORD_CHANNEL_IDS=
DISCORD_USER_IDS=
# Aplicatia Discord a puntii (creata 2026-08-30). Link de reinvitare, daca botul
# a fost scos din server sau ii lipsesc permisiuni:
# https://discord.com/oauth2/authorize?client_id=1543576449624186880&scope=bot%20applications.commands&permissions=309237763136
# permissions=309237763136 -> View Channel, Send Messages, Embed Links, Attach Files,
# Read Message History, Add Reactions, Create/Send in Public Threads.
# --- Model si cost ---------------------------------------------------------
# Modelul implicit al firelor noi. `/model opus` il schimba per fir.
CLAUDE_MODEL=sonnet
# Plafon de cost pe zi, in USD. La atingere botul refuza tururi noi si alerteaza.
# Reper masurat: un tur banal pe opus a costat $0.1547.
# Plafon zilnic de cost. Pe abonament (Pro/Max) costul raportat de CLI e doar
# pretul echivalent la API, nu o factura: lasa `off`. Un numar (ex. 5.00)
# activeaza plafonul si opreste tururile cand e atins.
COST_CAP_USD_DAY=off
# --- Limite ----------------------------------------------------------------
# Maxim de procese `claude` vii simultan (406 MB RSS fiecare, masurat).
MAX_LIVE_PROCESSES=4
# Timeout per tur, secunde.
TURN_TIMEOUT_S=900
# Reaper: dupa cate secunde de inactivitate se opreste procesul unui fir.
IDLE_REAP_S=1200
# Cat asteapta hook-ul de confirmare o apasare pe Allow/Deny, secunde.
# CONSTRANGERE: trebuie sa ramana MAI MIC decat `timeout` din bot-settings.json
# (acum 330), altfel CLI-ul taie hook-ul inainte ca acesta sa refuze curat.
CLAUDE_DISCORD_APPROVAL_TIMEOUT=300
# Butonul "Allow (tot firul)": aprobarea data o data tine pentru tot firul, ca sa
# nu se ceara confirmare la fiecare `ssh pvemini ...`. Se memoreaza tiparul
# (regula + motiv), nu comanda; `/permisiuni` le listeaza, `/permisiuni
# revoca:True` si `/new` le sterg. Pune `off` ca sa se confirme iar per comanda.
CLAUDE_DISCORD_SESSION_GRANTS=on
# Cat traieste o aprobare pe fir daca nimeni nu o revoca, secunde (implicit 12h).
CLAUDE_DISCORD_GRANT_TTL=43200
# --- Alerte (alerts.py) ----------------------------------------------------
# Destinatarul emailurilor de alerta. Aceeasi conventie ca restul repo-ului
# (vezi proxmox/vm109-windows-dr/scripts/pveelite-down-alert.sh): default root.
ALERT_RECIPIENT=root
# --- Directorul de lucru implicit -----------------------------------------
# Directorul in care porneste un fir nou. Spatiu dedicat, cu git propriu, ca ce se
# face din Discord sa aiba istoric separat de proiectele reale. `/cd <cale>` il
# schimba per fir, oriunde in /workspace.
DEFAULT_CWD=/workspace/claude-agent
# --- dashboard de control (dashboard/api.py) --------------------------------
# Token de acces. Generat automat de ops/install.sh daca lipseste.
DASHBOARD_TOKEN=
# `off` scoate complet login-ul. De pus DOAR fiindca panoul e legat de 127.0.0.1
# si publicat exclusiv in tailnet: acolo identitatea o face Tailscale (antetul
# Tailscale-User-Login ajunge in jurnal la fiecare start/stop/restart). Orice
# alta valoare pastreaza tokenul.
DASHBOARD_AUTH=
# Implicit 127.0.0.1: butoanele opresc un agent cu bypassPermissions si chei SSH
# spre tot clusterul, deci accesul se face prin tunel SSH, nu expus in LAN.
DASHBOARD_BIND=127.0.0.1
DASHBOARD_PORT=18790
# Prefixul sub care il publica `tailscale serve --set-path` (vezi dashboard/README.md).
# Gol = montat in radacina. Paginile au URL-uri relative, deci prefixul e nevoie
# doar pentru redirecturi.
DASHBOARD_PREFIX=/claude