Canali
I canali portano le conversazioni del team in Libre WebUI: stanze pubbliche e private e messaggi diretti, con thread, reazioni, elementi fissati, monitoraggio dei messaggi non letti, allegati e risposte di @model, il tutto sulle stesse fondamenta persistenti e crittografate delle chat.
Tipi di canale e appartenenza
| Tipo | Chi può vederlo | Chi partecipa |
|---|---|---|
public | Tutti possono esplorarlo | Chiunque può iscriversi autonomamente |
private | Soltanto i membri | Il proprietario invita i membri |
dm | Soltanto i due partecipanti | Aperto automaticamente; sempre esattamente due |
L'appartenenza è l'unica autorità sui contenuti del canale: ogni lettura e scrittura, compresi i download degli allegati e la distribuzione degli eventi in tempo reale, verifica prima che il chiamante sia un membro; chi non lo è riceve un errore 404 che non rivela l'esistenza della risorsa. Il ruolo di amministratore globale non concede intenzionalmente alcun accesso ai contenuti dei canali.
Il creatore di un canale pubblico o privato ne è il proprietario. I proprietari possono rinominare e archiviare il canale, invitare persone nei canali privati, rimuovere membri, moderare messaggi ed eliminare il canale; un proprietario esce eliminando il canale, mai abbandonandolo. I messaggi diretti sono deduplicati per coppia: aprire un DM con la stessa persona conduce sempre alla stessa conversazione.
Timeline
I messaggi formano una timeline permanente e ordinata, letta in entrambe le direzioni tramite cursori keyset (created_at più l'ID del messaggio), così la paginazione non salta né duplica mai le voci.
- Pubblicazioni idempotenti. Il client fornisce l'identità del messaggio; una richiesta ripetuta raggiunge esattamente una volta la stessa voce della timeline.
- Eliminazione con tombstone. Eliminare un messaggio ne cancella il contenuto ma conserva la voce nella timeline, così i thread non restano senza riferimento e l'ordine non cambia. Gli autori eliminano i propri messaggi; i proprietari del canale possono moderarli tutti.
- Le modifiche sono riservate all'autore e riportano un indicatore
editedAt. - I thread hanno un solo livello. Qualsiasi messaggio radice può ospitare un thread; le risposte alle risposte vengono rifiutate. I messaggi radice riportano il conteggio delle risposte in tempo reale.
- Le reazioni sono univoche per utente e per emoji e vengono contate senza duplicati.
- Gli elementi fissati sono gestiti dai membri ed elencati per canale.
Nomi e descrizioni dei canali e contenuto dei messaggi vengono crittografati quando sono archiviati, con lo stesso confine applicato ai messaggi delle chat.
Stato di lettura
Ogni appartenenza include un cursore di lettura monotono. I conteggi dei messaggi non letti vengono calcolati lato server per ciascun canale (i tuoi messaggi non risultano mai non letti) e POST /api/channels/:channelId/read fa avanzare il cursore senza mai arretrarlo, così un client obsoleto non può far riapparire messaggi già letti.
Distribuzione in tempo reale
Ogni modifica della timeline viene aggiunta al flusso di eventi permanente channel:<id> e distribuita tramite GET /api/channels/:channelId/events (SSE). L'appartenenza viene ricontrollata prima di ogni distribuzione, quindi la rimozione di un membro chiude in modo sicuro il suo flusso in tempo reale. La timeline SQL resta autorevole: un abbonato che perde eventi rilegge semplicemente la timeline; il registro serve alla distribuzione, non rappresenta la verità.
Allegati
I file vengono prima caricati (POST /api/channels/:channelId/attachments), rimangono brevemente in una cache condivisa delle rivendicazioni e vengono allegati quando si pubblica il messaggio; una rivendicazione di caricamento può essere usata una sola volta e scade dopo 15 minuti se non viene usata. I byte dei blob appartengono all'utente che li carica e consumano la sua quota; ogni richiesta di download verifica di nuovo l'appartenenza al canale.
Risposte di @model
Il compositore può indirizzare un messaggio a un modello. La risposta appare immediatamente come messaggio in sospeso scritto dal modello e viene completata tramite un processo permanente eseguito rigorosamente con l'identità del membro che lo ha invocato: accesso ai modelli, credenziali dei provider e routing sono quelli di tale membro, mai quelli del proprietario del canale o di un altro membro. Se un membro viene rimosso mentre una menzione è in coda, non può mantenerla attiva: il processo ricontrolla l'appartenenza prima della generazione e registra invece un errore visibile. Gli errori del modello appaiono direttamente sulla risposta anziché scomparire in una coda.
Le risposte dei modelli usano come contesto la conversazione recente del canale, fino a 30 messaggi. Vengono eseguite come completamenti singoli: gli strumenti di chat, il recupero delle conoscenze e la ricerca web non sono ancora collegati alle menzioni nei canali.
Limiti
| Limite | Valore |
|---|---|
| Canali creati per utente | 50 |
| Membri per canale | 200 |
| Messaggi per canale | 50,000 |
| Lunghezza del messaggio | 8,000 caratteri |
| Allegati per messaggio | 5 × 10 MB |
| Reazioni per messaggio | 200 |
Confini
- Gli indicatori di presenza e lo stato di digitazione non sono implementati.
- L'esportazione dei contenuti dei canali e i criteri di conservazione seguono la strategia di backup dell'istanza; non esiste ancora un'esportazione per singolo canale.
- Le menzioni generano notifiche tramite il servizio di notifiche interno all'app; non esiste ancora una preferenza di notifica per canale, se non l'uscita dal canale.