pairing — associare utenti, canali e dispositiviChiedi a Metnos con una richiesta come quella di questo esempio: «Mostrami come collegare Telegram all'utente Lucia». Il Tutor indica il percorso nella chat web anche quando la domanda proviene da Telegram.
In Metnos, associare significa stabilire un'identità verificata prima di elaborare una richiesta. L'identità non viene mai dedotta dal testo del messaggio. Utente logico, recapito del canale, sessione di chat e dispositivo di esecuzione sono oggetti distinti, con registri e revoche indipendenti.
| Oggetto | Cosa identifica | Fonte corrente |
|---|---|---|
| Utente logico | La persona alla quale appartengono ruolo, preferenze, lingua e canali. | users.db, tabella users |
| Canale | Un recapito verificato, per esempio un chat_id Telegram o un browser associato. | users.db, tabella user_channels; per Telegram anche pairings.db |
| Sessione di chat | Il dispositivo che, in questo momento, può scrivere nella conversazione web dell'utente. | users.db, tabelle active_sessions e chat_conversations |
| Dispositivo remoto | Una macchina autorizzata a eseguire executor per un determinato proprietario. | devices.db, tabella devices |
Un browser associato non è automaticamente un dispositivo remoto. Il primo consente di usare la chat; il secondo riceve lavoro dal server e lo esegue sulla macchina in cui risiedono dati o applicazioni. Analogamente, trasferire una sessione web non modifica il pairing Telegram né la proprietà di un dispositivo.
runtime/users.py mantiene un solo utente con ruolo
host e gli eventuali utenti guest. Ogni record ha un
identificativo tecnico, un nome univoco, un ruolo, un proprietario opzionale e
un livello di autonomia. user_channels collega quello stesso utente
ai canali verificati telegram, mail e http.
La lingua e le preferenze vengono risolte dall'associazione autenticata prima del turno e applicate in un contesto locale alla richiesta. Una modifica per un utente non cambia la lingua o la sessione di un altro. Anche conversazioni, dialoghi pendenti e diritto di scrittura della chat web sono circoscritti per utente e canale.
I due registri usano vocabolari diversi e non vanno confusi:
users.db: read_only, restricted, full;pairings.db: ReadOnly, Supervised, Full.Nel daemon Telegram, ReadOnly impedisce l'avvio di un turno
operativo. Supervised e Full possono entrare nel
runtime; ogni executor resta comunque soggetto ai propri manifest, ai controlli
di sicurezza e alle approvazioni previste. Il livello memorizzato non è, da solo,
la prova che una specifica azione sia consentita.
Dalla chat web apri Settings > Sistema > Utenti. Crea o seleziona l'utente, quindi usa il controllo di associazione del canale desiderato. Se stai leggendo queste istruzioni da Telegram, il percorso indicato si trova nella chat web di Metnos, non nell'app Telegram.
/start <token>.chat_id all'utente e conferma l'associazione.Il token è casuale, monouso e valido un'ora. Il consumo usa una transazione
SQLite: due richieste concorrenti non possono usare entrambe lo stesso token.
Il comando /start associa l'utente ma non esegue una richiesta
operativa; il messaggio successivo avvia un nuovo turno.
HttpOnly e Secure.Il cookie utente dura al massimo 90 giorni, ma a ogni verifica il server controlla che il binding HTTP esista ancora. Rimuovere il canale dal dettaglio dell'utente invalida quindi l'accesso anche se il browser conserva il cookie.
runtime/pairing.py espone anche il flusso tecnico
/pair PAIR.<payload>.<firma>. Il payload dichiara versione,
identificativo, livello di autonomia, scadenza ed emittente; la firma Ed25519
viene verificata contro le chiavi pubbliche fidate. Il codice scade dopo cinque
minuti per impostazione predefinita e può essere consumato una sola volta.
./.venv/bin/python -m runtime.pairing generate <ReadOnly|Supervised|Full> 5m ./.venv/bin/python -m runtime.pairing list ./.venv/bin/python -m runtime.pairing revoke telegram <sender_id>
Questo flusso crea il record di basso livello (channel, sender_id).
Per associare una persona già presente nel registro utenti, il percorso
Settings > Sistema > Utenti con /start è più
diretto perché conserva esplicitamente l'identità logica.
Se il bootstrap è abilitato, il primo messaggio proveniente dal
default_chat_id può creare un pairing Full soltanto
quando il canale non contiene ancora alcun pairing. L'opzione
--no-bootstrap richiede invece un'associazione esplicita anche per
l'host.
Per ogni coppia (utente, canale web) Metnos ammette una sola
sessione di scrittura attiva. Se apri la chat su un dispositivo mentre la
sessione appartiene a un altro, la finestra propone tre scelte:
| Scelta | Effetto |
|---|---|
| Continua la sessione precedente | Revoca il diritto di scrittura del vecchio dispositivo, trasferisce la sua conversazione al dispositivo corrente e ne mostra lo storico. |
| Rendi attiva la sessione corrente | Revoca il vecchio dispositivo e mantiene la conversazione locale del dispositivo corrente. |
| Annulla | Non modifica le sessioni; il dispositivo corrente resta senza diritto di scrittura. |
La risoluzione è atomica e legata all'utente autenticato. Il token di risoluzione è monouso; un utente non può trasferire la conversazione di un altro. Il dispositivo precedente riceve, quando connesso, l'evento di revoca e passa in sola lettura. La conversazione appartiene all'utente, non al browser.
Dalla chat web apri Settings > Sistema > Dispositivi. La pagina elenca nome, proprietario, sistema operativo, versione del client, impronta della chiave, ultimo heartbeat e stato. Puoi installare il client sul PC corrente, generare un collegamento per un altro PC oppure emettere un token manuale.
Il flusso guidato è il seguente:
POST /agent/register consuma il token e registra chiave pubblica, impronta, proprietario e caratteristiche del sistema.La sessione guidata usa un token firmato, monouso, normalmente valido 30 minuti; la variante manuale emessa dalla pagina vale 10 minuti. Un secondo consumo con la stessa chiave è idempotente, mentre lo stesso token presentato con una chiave diversa viene rifiutato. Un token nuovo associato alla medesima chiave costituisce una ri-autorizzazione esplicita e può riattivare un dispositivo revocato.
Il protocollo degli executor remoti usa per impostazione predefinita la
porta 8765 sulla rete interna o su una rete privata. Poll, risultati e heartbeat
sono firmati dal dispositivo sui byte esatti del corpo. Gli ordini e i bundle
del server sono verificati dal client tramite la chiave associata durante l'appaiamento.
last_heartbeat segnala che il processo è vivo;
last_poll segnala separatamente che il worker sta chiedendo lavoro.
| Oggetto | Come si revoca | Conseguenza |
|---|---|---|
| Canale utente | Rimuovi il canale in Settings > Sistema > Utenti. | Il recapito non risolve più quell'utente; il cookie web collegato non supera il controllo del binding. |
| Pairing Telegram di basso livello | ./.venv/bin/python -m runtime.pairing revoke telegram <sender_id> | get_pairing non restituisce più il record attivo. |
| Sessione web | Uscita esplicita o acquisizione da un altro dispositivo. | Il token di scrittura viene marcato come revocato; la conversazione resta dell'utente. |
| Dispositivo remoto | Pulsante di revoca in Settings > Sistema > Dispositivi. | Poll, risultati e heartbeat successivi vengono rifiutati; il record resta disponibile per l'audit. |
Per il contratto generale dei trasporti vedi
channel; per le approvazioni delle
azioni vedi approvazioni e controllo umano;
per le rotte HTTP vedi http_api.