diff --git a/crates/cordiale-core/src/protocol.rs b/crates/cordiale-core/src/protocol.rs index 0fbf37f..4bae9af 100644 --- a/crates/cordiale-core/src/protocol.rs +++ b/crates/cordiale-core/src/protocol.rs @@ -52,7 +52,9 @@ pub const MIN_SUPPORTED_PROTOCOL_VERSION: u32 = 1; /// reads `dm_with` to label a DM mention); 36 adds `dm_with` to every /// scrollback row; 37 removes `dm_conversation_id` from scrollback rows and /// `query_windows_list` entries, and a nick change moves nothing server-side -/// any more (a renamed peer's next message opens a new window). +/// any more (a renamed peer's next message opens a new window). Last +/// re-checked against the Grappa source at tag `v1.5.12`, the first release +/// that speaks 37. pub const CLIENT_PROTOCOL_VERSION: u32 = 37; /// The bootstrap compatibility fields from `GET /api/config`, and echoed diff --git a/docs/feature-matrix.md b/docs/feature-matrix.md index 896eca5..f21f71a 100644 --- a/docs/feature-matrix.md +++ b/docs/feature-matrix.md @@ -181,9 +181,11 @@ provate contro un server reale**: | Area | Stato in Cordiale | Note | |---|---|---| -| `dm_conversation_id` (v34 a v36) | Implementato, solo per server 34-36 | Letto da `query_windows_list` (non dalle righe di scrollback), usato per riconoscere la stessa finestra privata dopo un NICK del peer; il merge di due conversazioni non è rilevato. Dal v37 il server non lo invia più e un NICK non sposta nulla: la finestra vecchia resta con la sua storia e il prossimo messaggio del peer ne apre una nuova col nick nuovo, senza inferenza di rename, senza seguire la selezione, senza portare con sé silenziamenti o cursori di lettura. Non verificato contro un server v37 reale | +| `dm_conversation_id` (v34 a v36) | Implementato, solo per server 34-36 | Letto da `query_windows_list` (non dalle righe di scrollback), usato per riconoscere la stessa finestra privata dopo un NICK del peer; il merge di due conversazioni non è rilevato. Dal v37 il server non lo invia più e un NICK non sposta nulla: la finestra vecchia resta con la sua storia e il prossimo messaggio del peer ne apre una nuova col nick nuovo, senza inferenza di rename, senza seguire la selezione, senza portare con sé silenziamenti o cursori di lettura. Forma verificata sul sorgente del tag `v1.5.12` (prima release col protocollo 37); non provato in una sessione reale | | `dm_with` sulle righe di scrollback (v36) | Non usato | Cordiale instrada le righe per topic e mittente e non classifica mai un DM confrontando `channel` col proprio nick, quindi non ne ha bisogno; `dm_with` resta letto solo nelle menzioni (v35) | -| `dm_with` e `id` nelle menzioni (v35) | Parziale | `dm_with` etichetta la finestra di una menzione di DM (altrimenti `channel`, che per un DM in ingresso è il proprio nick); `id` non è letto, quindi il salto al messaggio non c'è. Non verificato contro un server v35 reale | +| `dm_with` e `id` nelle menzioni (v35) | Parziale | `dm_with` etichetta la finestra di una menzione di DM (altrimenti `channel`, che per un DM in ingresso è il proprio nick); `id` non è letto, quindi il salto al messaggio non c'è (issue 238). Forma verificata sul sorgente del tag `v1.5.12`; non provato in una sessione reale | +| Self-KICK e rientro (Grappa 2321) | Nessuna modifica necessaria | Solo server: il canale resta nello snapshot di rientro e un 474 lo porta in `join_failed`. Cordiale mostra `kicked`, `joined` e `join_failed` come stati di finestra, con riga sbiadita nella sidebar anche da snapshot di riconnessione, quindi il canale non sparisce. Non provato con un server reale | +| Righe molto larghe (Cicchetto 2310) | Da controllare a mano | Cicchetto ritaglia le righe oltre il pannello (block art mIRC) senza far scorrere il pannello di lato. Cordiale va a capo con `StyledText` in una `ListView`, senza ritaglio esplicito: provare una riga lunga senza spazi su desktop | | Catch-up dopo un reconnect | Implementato | Sonda `messages/count?after=&cap=201` per canale; fino a 200 righe con `?after=`, oltre ricarica la coda e lascia una nota del buco | | Presenza in primo piano | Implementato | `visibility` ogni 30 s mentre la finestra è attiva, `client_closing` a chiusura e sign-out | | Profilo proprio per rete | Implementato | Campi CTCP USERINFO e avatar in Settings → General (`PATCH /networks/:slug/profile`, `PUT`/`DELETE .../avatar`) | diff --git a/docs/protocol-notes.md b/docs/protocol-notes.md index 3d8a626..97f03ea 100644 --- a/docs/protocol-notes.md +++ b/docs/protocol-notes.md @@ -12,9 +12,15 @@ Fonti: - **Riferimento funzionale (solo funzionalità, non architettura):** . -Ultimo allineamento (2026-10-02): `protocol_version` 37, -`min_protocol_version` 1 (letti dal sorgente server in `lib/grappa/protocol.ex`); -Cordiale dichiara `client_proto=37` (§2). +Ultimo allineamento (2026-10-03): riletto contro il tag `v1.5.12` di Grappa +(commit `c26c77bc`), la prima release che porta il protocollo 37: +`protocol_version` 37, `min_protocol_version` 1 (letti dal sorgente server in +`lib/grappa/protocol.ex` al tag; `GET /api/config` del server dell'autore +risponde `version` 1.5.12 e protocollo 37). Cordiale dichiara +`client_proto=37` (§2). Le forme di riga di scrollback (`dm_with` opzionale), +di `query_windows_list` (`network_id`, `target_nick`, `opened_at`) e di +`mentions_bundle` (`id` e `dm_with` opzionali) sono state controllate sul +sorgente del tag; i flussi in una sessione reale restano da provare a mano. Convenzione: "la documentazione dice" = contenuto verificato del `CLIENT_PROTOCOL.md`; "sto inferendo" = deduzione non scritta esplicitamente @@ -354,15 +360,44 @@ il resto della sezione Sicurezza resta in Cicchetto: coesistono così come arrivano, senza migrazione di cache o bozze e senza seguire la selezione; silenziamenti e cursori di lettura non passano dal vecchio al nuovo nick (scelta accettata a monte). Il caso di sola - maiuscola/minuscola resta una stessa finestra. Non verificato contro un - server v37 reale. + maiuscola/minuscola resta una stessa finestra. Forma verificata sul + sorgente del tag `v1.5.12`; non provato in una sessione reale. - Dal v35 le righe di `mentions_bundle.messages` portano anche `id` e `dm_with` (entrambi opzionali: assenti su server più vecchi). Su un DM in ingresso `channel` è il **proprio** nick: la finestra di una menzione è `dm_with` (nick del peer, RAW) quando non è `null`, altrimenti `channel`. Cordiale usa `dm_with` come etichetta nel riepilogo delle menzioni; `id` - non è letto (servirebbe solo per saltare al messaggio). Non verificato - contro un server v35 reale. + non è letto (servirebbe solo per saltare al messaggio, issue 238). Forma + verificata sul sorgente del tag `v1.5.12`; non provato in una sessione + reale. +- **Conteggi della finestra di sé dopo un cambio nick proprio (v37).** Il + listener sul topic del proprio nick riceve `window_counts` con `channel` + uguale al segmento del topic, cioè al nick con cui il listener è stato + joinato (`lib/grappa/window_counts/pusher.ex`). Cicchetto non guarda + `channel`: assegna il conteggio alla chiave `(rete, nick corrente)` + (`cicchetto/src/lib/subscribe.ts`, caso `window_counts`). Cordiale + riconosce il listener solo se il topic corrisponde al nick corrente e poi + confronta `channel` con quel nick; dopo un `own_nick_changed` il listener + viene rijoinato col nick nuovo, quindi il confronto torna e il conteggio + della finestra di sé segue il nick. Un push arrivato sul vecchio topic prima + del rejoin viene scartato, dove Cicchetto lo assegnerebbe al nick nuovo: + differenza transitoria, senza effetti oltre il rejoin, lasciata com'è. Il + conteggio non classifica righe, quindi `dm_with` non serve qui. +- **Self-KICK (Grappa 2321, tag `v1.5.12`).** Un KICK subito dal proprio + utente non toglie più il canale dallo snapshot di rientro + (`last_joined_channels`): alla riconnessione il canale viene rientrato, + e un 474 (ban) lo porta in `join_failed` invece di farlo sparire. Solo + server: sul wire non cambia niente. Cordiale tratta `kicked`, `joined` e + `join_failed` come stati di finestra, con riga sbiadita nella sidebar + anche quando l'evento arriva come snapshot di riconnessione sul topic del + canale (`upsert` della voce di sidebar), quindi il canale non sparisce. +- **Righe larghe (Cicchetto 2310).** Cicchetto ritaglia (`overflow-x: clip`) + le righe oltre la larghezza del pannello, tipicamente block art mIRC, invece + di lasciare scorrere il pannello di lato. Le righe di Cordiale sono + `StyledText` con a-capo automatico dentro una `ListView`; non c'è un + ritaglio esplicito. Senza una build locale non ho potuto provare una riga + lunga senza spazi: da controllare a occhio su desktop (vedi + `docs/feature-matrix.md`). - I `kind` di evento non riconosciuti vanno ignorati (regola additive-only, §3).