Passa al contenuto principale

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

TipoChi può vederloChi partecipa
publicTutti possono esplorarloChiunque può iscriversi autonomamente
privateSoltanto i membriIl proprietario invita i membri
dmSoltanto i due partecipantiAperto 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

LimiteValore
Canali creati per utente50
Membri per canale200
Messaggi per canale50,000
Lunghezza del messaggio8,000 caratteri
Allegati per messaggio5 × 10 MB
Reazioni per messaggio200

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.