Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· EmailService
IMAP/SMTP-backed enviar, pasta e procurar por stubs de nuvem
Extrair o padrão de delegação IMAP/SMTP em AbstractImapBackedCloudProvider e ter Zoho, IceWarp, Exchange, Google Workspace, e Microsoft 365 estender Ele. A classe base implementa MailSender, MailReader, FolderManager, e SearchProvider no topo do EmailImapService, EmailSmtpService e SearchService — os mesmos serviços que o KamoMail utiliza, - envie / salveTrabalho de draft para qualquer provedor de nuvem com credenciais SMTP. - Todas as operações de pastas (criar / renomear / excluir / mover / setFlags / deleteMessage) funciona através do IMAP. - Procurar delegados para o serviço de pesquisa existente. - Operações de leitura e cid em linha: a renderização continua a fluir através do e-mail compartilhadoImapService parser. Os restos de cada fornecedor de betão — Aviso em tempo real (em que aplicável), DomainManager, e MailboxProvisioner — realmente precisa APIs de administrador nativas do provedor (Microsoft Graph, Google Admin SDK, Zoho Admin API, EWS, IceWarp admin) que ainda não estão ligados a esta base de códigos. Cada stub agora carrega um comentário estilo TODO nomeando a API que iria implementá-lo.
· EmailService
MailReader apoiado por IMAP para os stubs de provedor de nuvem
Zoho, IceWarp, Exchange, Google Workspace e Microsoft 365 expõem IMAP, Então, envie os métodos MailReader de cada provedor de nuvem através do EmailImapService em vez de lançar Operação Não SuportadaExcepção. Isto: - Desbloqueia a leitura de mensagens nesses provedores quando apenas credenciais IMAP são configurada (a implantação mais comum hoje). - Faz com que o novo conteúdoId/inline de metadados de anexos flua uniformemente cada provedor, uma vez que EmailImapService é o analisador único. - Permite que o endpoint inline-image resolva cid: referências para qualquer provedor. Os restantes métodos de fornecimento de nuvem (envio, gestão de pastas, provisionamento, domain ops) ainda não são suportadosOperaçãoExcepção — essas necessidades APIs provedor-nativas e não estão em escopo aqui. Também adiciona MailContext.toMailCredentials() para provedores (e os existentes Adaptador KamoMailReader) compartilhar um único helper de conversão de credenciais.
· kamo-internal
Renderizar cid em linha: imagens através do novo endpoint do EmailService
Quando uma mensagem expõe partes em linha (cada uma carregando um conteúdoId), o email renderer agora reescreve <img src="cid:..."> referências no tempo de montagem para * ************* que o representante agora também encaminha o Cache-Control para que o navegador faça cache na imagem obtida. - EmailAttachment (tanto em conversaçãoTypes e a cópia local em MessageBrowser) ganha campos de conteúdoId e inline. - SanitizedEmailRenderer aceita inlineImageBaseUrl + inlineContentIds; on cid: imgs reescreve cids conhecidos e esconde o resto, com o onerror handler ainda escondendo qualquer outra imagem quebrada. - Reverte-se o desfibrilador dedicado que vivia no higiénico. reescrever pertence ao tempo de renderização, onde o contexto da mensagem existe. - A lista de anexos visíveis no ThreadDetailView e MessageBrowser filtra as peças em linha para que os logotipos de assinatura incorporados já não apareçam como anexos para download.
· EmailService
Servir imagens em linha partes MIME e metadados de superfície Content-ID
Renderize <img src="cid:..."> nas mensagens UI, expondo as partes em linha que o corpo HTML se refere. - AnexoInfo ganha conteúdoId (sem parênteses de ângulo) e bandeira em linha. - processarMultipart e getAttachment compartilhar um único isAttachmentParte predicate e um caminhante recursivo, por isso em linha peças aninhadas dentro multiparte / relacionado são capturados (e seus índices permanecem alinhados entre os dois métodos). Anteriormente, a recursão sobrescrevia a lista de anexos do pai, que também deixou cair anexos reais em estruturas aninhadas. - o acesso é agora conduzido apenas por peças não-in-line — logótipos de assinatura mais tempo iluminar o clipe de papel em cada mensagem. - Novo ponto final. EmailController e SharedMailboxMailController; resolve cid através do Anexamento analisadoInfo, transmite a parte com Conteúdo-Disposição: inline e Cache-Control: privado, max-age=3600.
· KlusterServices
Adicionar preço@kamocrm.com caixa de correio e IMAP NodePort externo
- Novo correio de serviço/dovecot-imap-external (NodePort 30143 -> 143) IMAP pode ser alcançado de fora do cluster em $NODE:30143. - Preço de sementes@kamocrm.com em mysql-init para um bootstrap DB fresco recria a caixa de correio; a linha ao vivo já está presente no MySQL.
· kamo-internal
Reprojetar ChatsLista de linhas — layout elegante, sem rolagem horizontal, pontos online, crachá não lido, datas relativas
· 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
Aumente a transmissão não lida com carga útil da ACTIVITY para atualizações da lista de chats
· kamo-internal
Atualizações da lista de chats ao vivo via canal NATS não lido
· kamo-internal
Páginas para membros/chats no painel do centro de interação
· kamo-internal
Lista de conversas com rolagem infinita, virtualizada via IntersectionObserver
· kamo-internal
Multi-selecionar na Lista de Membros para iniciar chats em grupo
· kamo-internal
Cabeçalho de bate-papo com pilha avatar, popover de título e selecionador de membros
· kamo-internal
Compositor com drag-drop, chips de anexos pendentes, entrada multi-linha
· kamo-internal
Bubble de mensagem com avatares, ações hover e indicador visto
· kamo-internal
Renderização de anexos em linha e caixa de luz
· kamo-internal
Tipos de clientes e ganchos para sessões, recibos, anexos
· kamo-internal
Rotas de proxy para encontrar ou criar, membros, anexos, proxy de imagem, mudo, revogar
Extrair compartilhado ********** Ajudador para app/lib/mediaServiceUrl.ts. Adicionar rotas proxy: find-or-create, membros, recibos, anexos (streaming), mudos, revogar,
· 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
Adicione ************* para 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

Seu universo está esperando.
Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.
Gratuito para sempre — não é necessário cartão de crédito