Kanaler
Kanaler bringer teamsamtaler ind i Libre WebUI: offentlige og private rum samt
direkte beskeder med tråde, reaktioner, fastgjorte beskeder, sporing af ulæste,
filvedhæftninger og @model-svar — alt på det samme vedvarende, krypterede fundament
som chat.
Kanaltyper og medlemskab
| Type | Hvem kan se den | Hvem tilmelder sig |
|---|---|---|
public | Alle kan gennemse den | Alle kan selv tilmelde sig |
private | Kun medlemmer | Ejeren inviterer medlemmer |
dm | Kun de to deltagere | Åbnes automatisk; altid præcis to deltagere |
Medlemskab er den eneste autoritet over kanalindhold. Hver læsning og skrivning — herunder download af vedhæftninger og levering af livehændelser — kontrollerer først kalderens medlemskab. Ikke-medlemmer får et 404-svar, som ikke afslører, om ressourcen findes. Den globale administratorrolle giver bevidst ingen adgang til kanalindhold.
Den, der opretter en offentlig eller privat kanal, er dens ejer. Ejere kan omdøbe, arkivere, invitere (privat), fjerne medlemmer, moderere beskeder og slette kanalen. En ejer forlader kanalen ved at slette den, aldrig ved at opgive den. Der findes kun én kanal til direkte beskeder pr. deltagerpar: Hvis du åbner et DM med samme person, lander du altid i den samme samtale.
Tidslinjen
Beskeder danner en vedvarende, ordnet tidslinje, der læses med nøglebaserede markører
(created_at plus besked-ID) i begge retninger, så sideinddeling aldrig springer
poster over eller duplikerer dem.
- Idempotente opslag. Klienten leverer beskedens identitet. En anmodning, der prøves igen, lander præcis én gang på den samme tidslinjepost.
- Sletning med gravsten. Når en besked slettes, ryddes indholdet, men tidslinjeposten bevares, så tråde aldrig hænger løst, og rækkefølgen ikke flytter sig. Forfattere sletter egne beskeder; kanalejere kan moderere alle.
- Redigeringer er kun for forfatteren og har markøren
editedAt. - Tråde har ét niveau. Enhver rodbesked kan have en tråd; svar på svar afvises. Rodbeskeder viser det aktuelle antal svar.
- Reaktioner er pr. bruger og emoji og tælles uden dubletter.
- Fastgjorte beskeder administreres af medlemmer og vises pr. kanal.
Kanalnavne, beskrivelser og beskedindhold krypteres ved lagring med samme grænse som chatbeskeder.
Ulæst tilstand
Hvert medlemskab har en monotont stigende læsemarkør. Antallet af ulæste beregnes
på serversiden pr. kanal (dine egne beskeder er aldrig ulæste), og
POST /api/channels/:channelId/read flytter markøren fremad — aldrig baglæns — så
en forældet klient ikke kan gøre læste beskeder ulæste igen.
Levering i realtid
Hver ændring af tidslinjen føjes til den vedvarende hændelsesstream
channel:<id> og spredes over GET /api/channels/:channelId/events (SSE).
Medlemskab kontrolleres igen før hver levering, så fjernelse af et medlem lukker
den pågældendes live-stream sikkert. SQL-tidslinjen er fortsat autoritativ. En
abonnent, der har mistet hændelser, læser blot tidslinjen igen — journalen er til
levering, ikke sandheden.
Vedhæftninger
Filer uploades først (POST /api/channels/:channelId/attachments), parkeres kort
i en fælles claim-cache og vedhæftes, når beskeden publiceres. Et upload-claim kan
bruges én gang og udløber efter 15 minutter, hvis det ikke gøres gældende. Blobdata
tilhører uploaderen (dennes kvote), og kanalmedlemskab kontrolleres igen ved hver download.
@model-svar
Skrivefeltet kan rette en besked til en model. Svaret vises straks som en afventende, modelforfattet besked og fuldføres gennem et vedvarende job, der kører strengt under det kaldende medlems identitet: deres modeladgang, deres udbyderlegitimationsoplysninger og deres routing — aldrig kanalejerens eller et andet medlems. Et medlem, der fjernes, mens en omtale ligger i kø, kan ikke holde den i live. Jobbet kontrollerer medlemskab igen før generering og registrerer i stedet en synlig fejl. Modelfejl vises på selve svaret i stedet for at forsvinde i en kø.
Modelsvar bruger den seneste kanalsamtale (op til 30 beskeder) som kontekst. De kører som engangs-completions. Chatværktøjer, videnshentning og websøgning er endnu ikke forbundet med kanalomtaler.
Grænser
| Grænse | Værdi |
|---|---|
| Kanaler oprettet pr. bruger | 50 |
| Medlemmer pr. kanal | 200 |
| Beskeder pr. kanal | 50,000 |
| Beskedlængde | 8,000 tegn |
| Vedhæftninger pr. besked | 5 × 10 MB |
| Reaktioner pr. besked | 200 |
Afgrænsninger
- Tilstedeværelsesindikatorer og skrivetilstand er ikke implementeret.
- Eksport af kanalindhold og opbevaringspolitikker følger instansens sikkerhedskopieringsmodel. Eksport pr. kanal findes endnu ikke.
- Omtaler giver notifikationer gennem notifikationstjenesten i appen. Der findes endnu ingen notifikationspræference pr. kanal ud over at forlade kanalen.