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
This commit is contained in:
Claude Agent
2026-08-31 07:36:34 +00:00
parent feb31eaabe
commit 1cc1a572d9
13 changed files with 526 additions and 14 deletions

View File

@@ -61,6 +61,7 @@ Cateva alegeri care nu se vad din diagrama:
| `/status` | Sesiune, director, model, cost cumulat, proces viu, ultimele linii de stderr |
| `/stop` | Opreste turul in desfasurare din firul curent |
| `/cleanup` | Listeaza procesele lasate in urma (rulare seaca). `/cleanup force:True` le opreste |
| `/permisiuni` | Ce s-a aprobat pentru tot firul. `/permisiuni revoca:True` sterge aprobarile |
| `/help` | Lista de mai sus, in fir |
Comenzile sunt **application commands** (`/`), inregistrate pe guild-urile din
@@ -304,7 +305,10 @@ Ce apara efectiv:
2. **Confirmare pentru operatiuni ireversibile.** Un hook `PreToolUse` opreste comanda si
posteaza butoane in fir; fara raspuns in fereastra de timp raspunsul e **deny**
(fail-closed). Verificat: a blocat un `rm -rf`, a asteptat aprobarea externa 20s si a
permis apoi executia, fara timeout.
permis apoi executia, fara timeout. Butonul **Allow (tot firul)** memoreaza tiparul
`(regula, motiv)` — nu comanda — pentru firul curent, ca o sesiune care lucreaza pe
acelasi host sa nu ceara zece confirmari identice; `/new`, `/permisiuni revoca:True`
si TTL-ul de 12h il sterg. Detalii in [`security/README.md`](security/README.md).
3. **Wrapper `infra`** cu lista explicita de hosturi + token Proxmox cu ACL.
Ce **nu** apara: regulile `deny` din settings. Sub `bypassPermissions` ele sunt un strat