Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-marketing

    Add Flowroute to INTEGRATED WITH banner

  2. · kamo-internal

    Show accurate provider connection status from isConnected field

    Replaces the old logic that showed "Connected" for any provider with no sync error (including brand-new providers that were never tested). New three-state badge driven by isConnected (null/true/false): - null / never tested → grey "Not tested" (HelpOutlineIcon) - false → red "Not connected" (ErrorOutlineIcon) - true + sync error → amber "Sync error" (WarningAmberIcon) - true → green "Connected" (CheckCircleIcon) - RingCentral no OAuth → amber "Needs reauth" (unchanged)

  3. · VOIPService

    Persist connection test result to isConnected field

    - test() endpoint saves isConnected=true/false to DB after every health check - update() resets isConnected to null when configJson changes (credentials may have changed, requiring a re-test before showing Connected) - toDto() exposes isConnected so the frontend can distinguish: never tested / connected / not connected

  4. · kamo-shared-library

    Add isConnected field to VoipProviderInstance

    Nullable Boolean: null = never tested, true = last test passed, false = failed. Requires KamoInitializerService schema migration to add IS_CONNECTED column.

  5. · kamo-marketing

    Mostrar banner de oferta ativa com contagem decrescente de milissegundos ao vivo

    Fetches o lado ativo do servidor de promoção na página inicial e renderiza um HeroOfferBanner entre a sub-linha e a chamada gratuita para sempre. O banner mostra a quantidade de desconto, duração e uma contagem regressiva ao vivo * ************* a 50ms) com uma animação Fronteira de gradiente e varredura de brilho. Não cede nada quando não estiver activo Existe uma promoção não expirada.

  6. · kamo-internal

    Conexão disponível/indisponível para backend e corrigir bug de presença OFFLINE

    - Renomear o chip pausado/ativo para disponível/indisponível em NavTop - Obter disponibilidade inicial na montagem e persistir comuta através da nova API de eu/disponibilidade - Adicionar é campo disponível para a interface de membro e suporte do MemberItem - Os passes de lista de membros estão disponíveis a partir da resposta do departamento ao - MemberItem mostra etiqueta ONLINE/OFFLINE/UNAVAILÁVEL com cor laranja para não estar disponível - Corrigir o erro OFFLINE: adicionar visibilidadechange batimento cardíaco e 120s a granel periódica re-fetch

  7. · SecurityService

    Adicionar éDisponível para resposta de by-department e me/availability endpoints

  8. · InitializerService

    Backfill is available = TRUE para membros existentes

  9. · kamo-shared-library

    Adicionar campo disponível para a disponibilidade de membros

  10. · kamo-internal

    Remover a aba Acesso e Domínios e o componente DomainManager

  11. · kamo-marketing

    Live unread emblema + salto na nova mensagem do agente

    - Mantém o LiveSupportPanel montado fora da tela enquanto o widget é minimizado (somente quando existe uma sessão de suporte) para que a subscrição STOMP permaneça vivo e noUnreadMessage dispara para mensagens de agente recebidas, mesmo quando O visitante não está a olhar para a conversa. - Anima o crachá com uma escala de mola em cada mudança de contagem (truque chave Re-monta o elemento) mais um anel contínuo de ping Tailwind enquanto > 0. - Salta e inclina a aba minimizada sempre que a contagem sobe, e pinta-o vermelho com um brilho para que ele atraia a atenção de toda a página. - HandleExpand já limpa a contagem em aberto, por isso nenhuma alteração necessária Pronto.

  12. · MediaService

    Contagem pendente de transmissão + não- lida na leitura do agente & envio do visitante

    - * **************** agora delegados para Então, o conde... reflete sessões com mensagens e decrementos de visitantes não lidos quando o Agente chama MarkAsRead. - Novo público. * * * * * * * * * * * * * * * * por sessão não lida carga útil após os últimos avanços visualizados e (b) chama a helper para que o suporte navtopButton permaneça em sincronia sem esperar a próxima sondagem dos anos 60. - * * * * * * * * * * Também chama o ajudante para o Navtop bate ao vivo quando um visitante envia. A contagem de navegação agora corresponde ao estado do crachá por linha ambos imediatamente depois de clicar e depois de uma atualização do navegador.

  13. · kamo-shared-library

    Contagem não lida + assistente de pesquisa por sessão

    Então, o Navtop SuporteButton emblema pode contar tickets de suporte que realmente precisam atenção (ter mensagens de visitante não lidas) em vez de apenas PRE TICKET/NOVO Situação. A contagem é lida directamente do DB para sobreviver a uma actualização. Também adiciona *************So MediaService pode resolver o proprietário de org a partir de uma sessão GUID após a marcaAsRead.

  14. · KlusterServices

    Adicionar mídia à lista de provisionamento de certificados de subdomínios

  15. · kamo-internal

    Adicionar subdomínio de mídia aos apelidos de DNS necessários

  16. · kamo-internal

    Adicionar coluna de localização à grelha de dados do ticket

    Leituras **************************** diretamente fora do SupportTicketDTO (agora instantâneo na entidade do ticket em tempo de criação — nenhuma viagem de ida e volta extra). Bandeira de remetentes + cidade/região/país com o IP mostrado em uma dica; cai de volta para um em-dash quando nenhum dado geo Está no bilhete. Apenas vista de agente. TicketHeader já consome os mesmos campos DTO, então a ferramenta popup janela agora mostra o instantâneo também — nenhuma leitura GeoLite ou tabela de visitantes em renderização.

  17. · kamo-shared-library

    Imagem geo do visitante na entidade do ticket

    Adiciona VISITOR IP ADDRESS, VISITOR COUNTRY CODE, VISITOR COUNTRY NAME, VISITOR CITY, VISITOR SUBDIVISION colunas. Capturado na criação de tickets por isso os parâmetros de avaliação lista/detalhes nunca têm de fazer uma análise de gama GeoLite ou uma pesquisa separada da tabela de visitantes na hora de leitura. KamoInitializerService (hibernate.ddl-auto: update) irá adicionar o colunas quando a próxima execução; as linhas existentes voltam para o registro do visitante País armazenadoCódigo em toDTO.

  18. · MediaService

    Adicionar /ws/public-chat-native WebSocket endpoint ao lado de SockJS

    Regista um segundo objectivo STOMP sem o SockJS em /ws/public-chat-native assim que o frontend pode se conectar com um WebSocket nativo (brokerURL) sem precisar a biblioteca sockjs-client, que registra um manipulador Permissões-Política do site. O endpoint original /ws/public-chat SockJS é mantido para compatibilidade para trás.

  19. · kamo-internal

    Por-ticket não lido emblema + filtro 'Só mensagens novas'

    - A lista de tickets mostra um crachá de bate-papo com a contagem não lida ao lado de ticket# sempre que a sessão tiver mensagens mais novas que as do agente última mensagem visualizada. - Adiciona um filtro 'Só mensagens novas' à barra de filtro. - TicketChat agora chama-se... carregar e sempre que uma mensagem de entrada chega, para que o crachá limpa como O agente lê a conversa. Confia na mudança kamo-shared-library que se amplia findChatMembershipsPorMembro para incluir sessões SUPPORT TICKET, mais O MediaService divulgou em..

  20. · MediaService

    A transmissão não lida conta para o agente na mensagem do visitante

    Depois de um visitante enviar uma mensagem de suporte, push the latest unread-counts Carga para a lista de bilhetes do agente. Emblema e atualização do contador navtop em tempo real. Espelhos da transmissão em MediaController.sendMessage para chats de membro para membro.

  21. · kamo-shared-library

    Incluir sessões SUPPORT TICKET na consulta de membros não lida

    findChatMembershipsByMemberId agora retorna afiliações para CHAT e Tipos de sessão SUPPORT TICKET, por isso a conta não lida existente por membro infraestrutura (getUnreadCountsPorMembro, /topic/chat/unread/{memberId} Transmissões, GET ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* automaticamente cobre bilhetes de apoio também. Mostra aos agentes indicadores de nova mensagem por bilhete na lista de tickets e um crachá total não lido combinado no navtop.

  22. · KlusterServices

    Falha na produção2ban com cadeias PJSIP e estado persistente

    - Adicionar fail2ban-configmap.yaml com cadeias [asterisco] e [freepbx-web], aumento incremental da proibição (1h→24h→30d teto), LAN ignorarip, e a filtro personalizado asterisco-security.conf segmentando registros PJSIP SecurityEvent - Montar o erro2ban-config ConfigMap e hostPath /var/lib/pbx/fail2ban (ban o estado persiste através das reinicializaçãos do pod) tanto nas implementações do k1m1 como no k2m1 - Configura o fio no startup.sh antes de iniciar o fail2ban-client em ambos os nós

  23. · kamo-shared-library

    Add resetHasAttachmentsForFolder query to ConversationRepository

    Allows sync to reset stale has_attachments flags before re-indexing so corrected MIME detection can rebuild the field from actual attachment data.

  24. · KlusterServices

    Integrate Coqui TTS with norman voice (VCTK p267)

    - Deploy coqui-tts server (VCTK VITS model, CPU-only) as ClusterIP service on port 5002 with model cache at /var/lib/coqui-tts on k1m1 - Inject coqui_tts.agi into /var/lib/asterisk/agi-bin on each boot: calls HTTP API, caches 8 kHz mono WAV under sounds/coqui-tts/, streams via AGI STREAM FILE — use AGI(coqui_tts.agi,text) in any dialplan context - Write say.conf on each boot to route all Asterisk built-in say functions (digits, numbers, dates, times) through Coqui TTS

  25. · KlusterServices

    Add LAN DNS pod for split-DNS on k1m1

    Deploys a dnsmasq pod with hostNetwork on k1m1 that listens on 192.168.4.22:53. Overrides pbx.k1.kluster.kamocrm.com -> 192.168.4.22 so LAN phones reach the PBX directly without NAT hairpin. All other queries are forwarded to 8.8.8.8/8.8.4.4. Router DHCP must be pointed to 192.168.4.22 as the primary DNS server for LAN clients to pick this up.

  26. · kamo-internal

    Páginas de configuração da plataforma (General / VOIP & SMS / Usuário do Sistema / Avançado)

    Quebras Em SettingsView com quatro abas: - Geral: visão geral da plataforma somente leitura — orgs totais, servidor de telefone ativo contagem de instância, contagem de instância ativa do provedor de SMS, última sincronização global do VOIP Timetamp. Leituras do novo... - VOIP & SMS: edite voipSyncIntervalMinutes (1...1440) e voipSyncEnabled, superfície últimoGlobalVoipSyncAt, além de um botão "Execute a sincronização global agora" que calls SecurityService → VOIPService /internal/voip/sync-global. - Usuário do sistema: o acesso do usuário do sistema existente concede UI, retirado de ConfiguraçãoClient verbatim em um componente de tabulação (sem mudança de comportamento). - Advanced: botão paralelo "Trigger global VOIP sync now" para ops, plus uma mensagem explícita de estado vazio para os controlos futuros. ConfigurationClient é agora um orquestrador de tabulação fino. UsePlatformAdminGuard permanece no lugar no nível do orquestrador para que todas as quatro abas sejam fechadas.

  27. · DaemonService

    Trabalho global de sincronização VOIP (intervalo de administração)

    VoipGlobalSyncJob marca a cada minuto e, em cada tique, lê o SystemConfiguration singleton para decidir se uma sincronização global é devida: - Se voipSyncEnabled for false → skip. - Se o últimoGlobalVoipSyncAt + voipSyncIntervalMinutes > now → skip. - Caso contrário: POST /internal/voip/sync-global para VOIPService com o header InternalAuthFilter; actualiza o último GlobalVoipSyncAt no sucesso. Isso permite que os operadores de plataforma ajustem a cadência em tempo de execução de **************************** → VOIP & SMS sem reiniciar DaemonService ou tocar em expressões de cron. Registrado em QuartzConfig ao lado dos trabalhos existentes. k8s/configmap.yaml adiciona o carrapato cron (1 minuto padrão) e kamo.services.voip.base-url + internal.auth.secret para que a chamada HTTP seja autenticada.

  28. · SecurityService

    Endpoints de configuração do sistema + visão geral da plataforma

    Superfície de configuração ampla da plataforma, fechada pelo proprietário de topo existente guard (matches SystemUserConfigController's requireTopLevelOwner pattern). Pontos finais: - GET /api/security/system-config — retorna linha única - PUT /api/security/system-config — update voipSyncIntervalMinutos / voipSyncEnabled. Actualizações parciais suportada; validação obriga intervalo 1..1440 minutos. - GET /api/security/platform-overview — estatísticas agregadas contagens de instância ativa do telefone/SMS, última sincronização timestamp, atual intervalo + bandeira ativada). - Post ************************* Chama VOIPService /internal/voip/sync-global via InternalAuthFilter (internal auth secret) para que os operadores de plataforma possam disparar uma sincronização VOIP global a nova configuração da plataforma → guia VOIP & SMS / guia avançada. Configuração: - kamo.services.voip.base-url (defaults to VOIPService cluster-local service URL). - Reutiliza o actual segredo interno.

  29. · VOIPService

    Controladores de recursos por instalação + agregado org + sincronização interna

    Por recurso de instalação CRUD (extensões / usuários / dispositivos / correio de voz): - VoipExtensionsController. - VoipUsersController em /api/voip/instances/{id}/usuários - VoipDevicesController. - VoipVoicemailController em... - Cada GET aceita ?refresh=true para force-fetch do provedor e atualizar cache; caso contrário, serve de cache local para UI snappy. - Cada provedor de chamadas de caminho de gravação E upserts cache local para o agregado as visualizações permanecem consistentes sem esperar pela próxima sincronização agendada. - Voicemail GET /{vmId}/audio transmite o áudio bruto do provedor através StreamingResponseBody para que a UI possa <audio src=...> diretamente. Org-aggregate (VoipOrgAggregateController em /api/voip/org): - /extensões, /usuários, /dispositivos, /voicemails retornam linhas em cada instância com comprimidos {instanceId, instanceName}. UI transforma estes no agregado tabulações em /settings/features/phone. - /health runs checkHealth () em cada instância ativa em paralelo per-instance (através das contagens em cache da instanceSyncService), devolve a instanceHealthDto[]. - POST /sync executa instânciaSyncService contra cada instância ativa do org atual. Pode o nível de inquilino "Sync esta org agora" botão na UI. Sincronização interna (VoipInternalSyncController): - POST /internal/voip/sync-loops globais de todas as instâncias ativas em toda a plataforma. Chamado pelo trabalho do DaemonService. Protegidos pelos actuais InternalAuthFilter no VOIPService. Fica verde.

  30. · VOIPService

    Refactor de provedor multi-instanciamento + FreePBX completo + Flowroute SMS

    Mudança de modelo principal: uma org → muitas VoipProviderInstances (foi: uma por org). Cada chamada API de provedor agora é vigiada por instância. Interface PhoneProvider: - Novos métodos para extensão/usuário/dispositivo CRUD + áudio/transcrição de correio de voz. - Novas bandeiras de capacidade (extensionManagement, userManagement, deviceManagement, Correio de vozTranscrição). Os padrões lançam... (HTTP 501) para que os fornecedores não quebrem. Checks frontend getCapabilities () esconder/desactivar acções por prestador. - ProviderException (HTTP 502) para falhas de dependência externa. Fábrica do Provider do Telefone: - GetInstance (UUID) / ********************************************************************************************************************************************************************************************************************** substituir o legado getProvider( Long orgId); getPrimaryForOrg (Long) mantido para sites de chamadas legados (CallController, CapabilitiesController, SipController, webhook inbound). - RingCentral OAuth tokens agora escopo por (orgId, provedor, instânciaId) assim um org pode autenticar várias implantações independentes do RingCentral. - Construção FreePBX lê config json → {baseUrl, clientId, clientSecret, ignoreSslErrors} e instancia um FreePBXGraphQLClient dedicado. RingCentral (RingCentralProvider): - Construtor toma instânciaId para o contexto de log. - Novos métodos: listExtensions / createExtension / updateExtension / deleteExtension; listUsers / createUser / updateUser / deleteUser (modelosRC) tanto como tipo=Extensões do usuário); listDispositivos / createDevice / updateDevice / deleteDevice; fetchVoicemailAudio (conteúdo de anexos de fluxos) e buscarVoicemailTranscrição. FreePBX (FreePBXProvider) — implementação completa substitui o substituto: - Cache OAuth2 de clientes-credenciais através do FreePBXTokenCache (~1h TTL, auto- atualização em 401, por instance). - FreePBXGraphQLClient: GraphQL + transporte REST com opcional skip-SSL-verification para auto-assinados PBXes on-prem. - Extensões, usuários do Gerenciador de Usuários, dispositivos Endpoint Manager, voicemail list/mark-read/delete + fluxo de áudio, histórico de chamadas CDR, credenciais SIP derivado do segredo pjsip da extensão, saúde via fetchAsteriscoInfo. - SMS explicitamente não suportado (capacidade sms=false) — FreePBX não lida Transportador SMS. Flowroute SMS (FlowrouteTextProvider): - Mensagens v2.1 API com HTTP Basic (accessKey, secretKey). - Sonda de saúde atinge GET / numbers?limit=1. - Registrado com BulkTextProviderFactory através de novo valor de enum FLOWROUTE. Controladores: - VoipInstanceController (renomeado de ProviderConfigController) — CRUD completo em /api/voip/instâncias com teste/sincronização por instalação. Segredos editados em GET respostas ('***'); merge- update permite que UI round-trip campos redigidos sem A bater nas credenciais armazenadas. - BulkTextInstanceController ( renomeado de BulkTextConfigController) — mirror CRUD em /api/bulktext/instances com teste / test-send / send. - OAuthController reescrito para OAuth: iniciar, retornar, status, desligar todos tomar instânciaId. - SmsController resolve instância de membro. instanceId → org primary, attages para conversas sobremesas. - CallController / CapabilitiesController / SipController voltar para o org's Exemplar ativo primário para os objetivos de uma única instalação legados. Serviços: - instanceSyncService: pull-through cache sync — extensões/usuários/dispositivos/ mensagens de voz copiadas do provedor para as tabelas locais, linhas em falta marcadas Desconhecido. Cada sub- passo embrulhado para que uma capacidade não suportada não falhe toda a sincronização (por exemplo, FreePBX no-SMS + has-extensions). - VoipMessageService: todos os caminhos de conversação/mensagem propagam instânciaId. Testes: testes específicos pré-existentes de VoipProviderConfig removidos (cobriu o Tipos renomeados; a reescrita está fora de alcance por especificação de projeto §10 — sem TDD a infra-estrutura está sendo adicionada neste refator). Constrói verde com biblioteca de kamo-compartilhada atualizada.

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