Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· EmailService
IMAP/SMTP-backed send, folder, and search for cloud stubs
Estrarre il modello di delegazione IMAP/SMTP in AbstractImapBackedCloudProvider e hanno Zoho, IceWarp, Exchange, Google Workspace, e Microsoft 365 estendere Ecco. La classe di base implementa MailSender, MailReader, FolderManager, e CercaProvider sulla parte superiore di EmailImapService, EmailSmtpService e SearchService — gli stessi servizi utilizzati da KamoMail: - inviare / salvareDraft lavoro per qualsiasi provider cloud con credenziali SMTP. - Tutte le operazioni di cartella (creare / rinominare / eliminare / spostare / setFlags / deleteMessage) funziona tramite IMAP. - Ricerca dei delegati al servizio di ricerca esistente. - Operazioni di lettura e cid in linea: il rendering continua a scorrere attraverso condiviso EmailImapService parser. I rimanenti stubs in ogni fornitore di calcestruzzo — RealtimeNotifier (dove applicabile), DomainManager e MailboxProvisioner — veramente bisogno provider-native admin API (Microsoft Graph, Google Admin SDK, Zoho Admin API, EWS, IceWarp admin) che non sono ancora collegati a questo codebase. Ogni stub ora porta un commento in stile TODO che nomina l'API che lo implementa.
· EmailService
IMAP-backed MailReader per il cloud-provider stubs
Zoho, IceWarp, Exchange, Google Workspace, e Microsoft 365 tutti espongono IMAP, quindi collegare i metodi MailReader di ogni cloud-provider tramite EmailImapService invece di lanciare UnsupportedOperationException. Questo: - Sblocca i messaggi di lettura su quei provider quando solo le credenziali IMAP sono configurato (la distribuzione più comune oggi). - Rende i nuovi metadati di attacco contentId/inline uniformemente attraverso ogni fornitore, dal momento che EmailImapService è il singolo parser. - Consente di risolvere il punto finale dell'immagine in linea: riferimenti per qualsiasi fornitore. I restanti metodi cloud-provider (in attesa, gestione delle cartelle, provisioning, dominio ops) sono ancora UnsupportedOperationException — quelle necessità API provider-native e non sono in campo. Aggiunge anche MailContext.toMailCredentials() così fornitori (e l'esistente Adattatore KamoMailReader) condividere un singolo helper di conversione delle credenziali.
· kamo-internal
Render inline cid: immagini tramite il nuovo endpoint EmailService
Quando un messaggio espone parti in linea (ciascuno che trasporta un contentId), l'e-mail rewrites <img src="cid:..."> riferimenti al tempo di montaggio a E ora anche il proxy. inoltra Cache-Control in modo che il browser memorizza l'immagine recuperata. - EmailAttachment (entrambi in conversazioneTypes e la copia locale in MessageBrowser) acquisisce i campi contenutiId e inline. - SanitizedEmailRenderer accetta inlineImageBaseUrl + inlineContentIds; on cid: imgs riscrive cids conosciuti e nasconde il resto, con l'esistente maneggiatore onerror ancora nascondendo qualsiasi altra immagine rotta. - La spogliatura cid dedicata che viveva nel sanitizzatore è ritratta — riscrittura appartiene al tempo di rendering, dove esiste il contesto del messaggio. - L'elenco degli allegati visibili in ThreadDetailView e MessageBrowser filtri fuori parti in linea così i loghi firma incorporati non appaiono più come allegati scaricabili.
· EmailService
Serve l'immagine inline MIME parti e la superficie
Render <img src="cid:..."> nei messaggi UI esponendo le parti in linea che i riferimenti del corpo HTML. - AttachmentInfo ottiene il contenutoId (senza staffe angolari) e la bandiera in linea. - parseMultipart e getAttachment condividono un singolo isAttachmentPart predicate e un walker ricorsivo, così parti inline nidificate all'interno di multipart/collegato sono catturati (e i loro indici rimangono allineati attraverso i due metodi). In precedenza la ricorsione ha superato l'elenco degli allegati del genitore, che anche abbandonato gli attaccamenti reali in strutture nidificate. - haAttachment è ora guidato solo da parti non in linea — loghi firma no accendere più a lungo la clip di carta su ogni messaggio. - Un nuovo endpoint GET. EmailController e SharedMailboxMailController; risolve cid tramite il parsed AttachmentInfo, trasmette la parte con Content-Disposition: inline e Cache-Control: privato, max-age=3600.
· KlusterServices
Aggiungi pricing@kamocrm.com mailbox e IMAP NodePort esterno
- Nuova posta di servizio/dovecot-imap-esterno (NodePort 30143 -> 143) IMAP può essere raggiunto da fuori del cluster su $NODE:30143. - Seed pricing@kamocrm.com in mysql-init così un fresco DB bootstrap ricrea la casella di posta; la riga live è già presente in MySQL.
· kamo-internal
Redesign ChatsList righe — layout elegante, nessun rotolo orizzontale, punti online, badge non letto, timestamp relativi
· MediaService
Add GET /sessions/{guid}/members endpoint with display-name priority
Returns member list with name resolved via usernameAlias → fullName → alias → username, matching the same priority as the chat sessions list. This feeds ChatBox.loadMembers() so the tool window title bar can show the correct preferred name.
· kamo-internal
Derive and dispatch tool window title from session members
Adds onMembersChange callback to ChatBox; ChatTool derives the title (single name for 1-on-1, or '<name> (+N more)' for groups) and dispatches tool:title to update the ToolWindowShell title bar dynamically.
· kamo-internal
Lift search above tab strip, share query across Members and Chats tabs
Moves the search TextField from MemberList into NavTopPanel above the Tabs. Passes searchQuery as a prop to both MemberList and ChatsList so a single field filters both tabs. ChatsList filters rows by matching any non-self member's name.
· MediaService
Augment non letto trasmissione con ACTIVITY payload per gli aggiornamenti di chat-list
· kamo-internal
Live chat-list aggiornamenti via NATS canale non letto
· kamo-internal
Tabs per membri/chat nel pannello centrale di interazione
· kamo-internal
Elenco delle chat con scorrimento infinito, virtualizzato tramite IntersezioneObserver
· kamo-internal
Multi-select in MemberList per avviare chat di gruppo
· kamo-internal
Intestazione di chat con avatar stack, popover titolo e picker membro
· kamo-internal
Composer con drag-drop, chip di fissaggio in attesa, ingresso multi-linea
· kamo-internal
La bolla di messaggio con avatar, le azioni di hover, e l'indicatore visto
· kamo-internal
Rendering degli allegati in linea e lightbox
· kamo-internal
Tipi di clienti e ganci per sessioni, ricevute, allegati
· kamo-internal
Proxy routes for find-or-create, members, attachments, imaging proxy, mute, revoke
Extract shared **************** helper to app/lib/mediaServiceUrl.ts. Add proxy routes: find-or-create, members, receipts, attachments (streaming), mutes, revoke,
· MediaService
Configmap entries for attachment limits and multipart
· MediaService
Paged chat list with previews, members, unread counts
that returns ChatListRowDto rows including last message preview, member summaries, per-session unread counts, and ownLastViewedAt.
· kamo-shared-library
Add countUnreadAfter(guid, memberId, since) to MediaObjRepository
Needed by paged chat-list endpoint to compute per-session unread counts when ownLastViewedAt is a LocalDateTime pointer rather than a message UUID.
· MediaService
Real NATS publisher impl and READ_RECEIPT broadcast
· MediaService
Per-viewer mute endpoint and message filter
· kamo-shared-library
Aggiunta a MediaSessionMuteRepository
· MediaService
Imaging proxy with HTTP Range support and per-member download tracking
· kamo-shared-library
Add MediaObjImgDownloadRepository with existsByObjImgIdAndMemberId
Required by ImagingProxyService (Task 10) to deduplicate per-member download tracking without a full table scan.
· kamo-shared-library
Add CHAT_ATTACHMENT assoc type with imaging-chat-attachments bucket
· kamo-shared-library
Service methods for exact-match find/create, member add, mute, revoke, read

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta