Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-shared-library

    Contar eventos DISTINCT através de proprietários de um rollop

    Um número de telefone pode ser um ponto de contato em mais de um proprietário ao mesmo tempo, e dois Uma conta que partilha uma conta é o caso ORDINÁRIO — são geralmente A mesma pessoa a perguntar duas vezes. O fósforo escreve uma linha por proprietário deliberadamente, Porque cada uma dessas linhas do tempo precisa de si própria. Resumido sobre um rolo, simples contagens reportam uma chamada como duas, e um trilho lendo 11 acima de uma lista mostrando 6 é Pior do que nada. COUNT(DISTINCT sourceId) sobre uma lista de proprietários de um tipo conta exatamente o que a linha do tempo mesclada mostra, e transforma as 26 consultas de contagem de uma conta em duas.

  2. · kamo-internal

    Gate a janela de linha por membro, e mostrar em que modo você está

    O controle de lançamento. Default off, opt-in per member from Phone Settings, aninhado sob o interruptor VOIP porque não significa nada para um membro sem linha. Um gancho possui o portão para que seus dois consumidores não podem discordar — o controle NavTop que abre a janela e a tira dentro do softphone que lhe oferece. A membro que vê um mas não o outro é pior do que um que vê nenhum dos dois. Ele falha ao fechar: uma configuração inalcançável lida esconde a funcionalidade em vez de oferecer uma janela que pode não funcionar, e o softphone na página não é afetado de qualquer forma. A tira responde a uma pergunta que um membro não pode ver a resposta para: Esta chamada está a salvo de uma actualização? Com a janela aberta a chamada vive lá e o painel é um controle remoto, então ele oferece para trazer a janela para frente — um popup pode acabar por trás do navegador e nada mais pode levantá-lo. Com a janela Fechado a chamada vive na aba e uma atualização termina-lo, por isso diz. Inbound agora usa o único gesto que pode produzir: a notificação do desktop clique, que anteriormente não tinha qualquer manipulador.

  3. · VOIPService

    Leia e escreva o portão de linha-janela

    GET superfícies linhaWindowEnabled; PUT aceita-o como um booleano nullable de modo que ausente significa "não mencionado" e preserva o valor armazenado. Todos os existentes o chamador deste endpoint omite o campo, e tratando aqueles como seria falso desligar o recurso para qualquer membro cujas configurações de telefone foram salvas para razão não relacionada. Também normaliza uma leitura nula para false antes de salvar: uma linha escrita antes do coluna existente ainda pode levar null através de Hibernate, ea coluna não é NULL.

  4. · kamo-shared-library

    Mapa LINHA WINDOW ENABLED no membroVoipConfig

    O portão por membro para a janela dedicada da linha de softphone. O pino da versão permanece a 1.6.0 — adicionar um campo não precisa de solavanco, e um pino dividido quebraria o CI para Todos os consumidores de uma só vez. A coluna já existe na base de dados; a DDL aterrou no KamoInitializer primeiro, deliberadamente, porque um serviço que mapeia uma coluna em falta falha no bean criação em vez de degradação.

  5. · InitializerService

    DDL para o portão de linha-janela por membro

    Acrescenta que não é falso. Uma coluna em vez de uma bandeira de recurso porque não existe nenhum sistema de bandeira aqui e O MemberCapabilities é um conjunto fechado, fechado por falhas, sem slot sobressalente — por isso o controle vive ao lado das outras preferências de telefone do membro, que também é onde Um administrador iria procurá-lo. Seu próprio corredor em vez de uma linha em MultiInstancePhoneMigration porque o ordem é o ponto: KamoInitializer não tem CI, por isso isto é aplicado à mão e deve pousar ANTES de uma construção VOIPService que mapeia a coluna, ou Hibernate falha em A criação do feijão e o serviço não começarão. O ALTER já foi aplicado para o banco de dados ao vivo por exatamente essa razão; este corredor torna-o repetivel e idempotente para todos os outros ambientes.

  6. · kamo-internal

    Uma sub-tab IA no Centro de Interação

    As sessões de IA ao vivo no AIService e não são MediaSessions, então este balde fica seu próprio carregador na frente do /api/media/sessions/chat buscar os outros quatro compartilhar, então adapta cada sessão na mesma forma de linha ao invés de um segundo renderer — a lista, sua pesquisa, seus avatares e seu chip não lido são um superfície, e um segundo derivaria do primeiro dentro de uma liberação. Não- Lido vem através do ai: namespace os crachás hexhead lidos (getUnread, not conversaKeyForWindow — uma linha de chats-list não é uma janela de ferramentas), então uma linha e sua janela minimizada nunca pode discordar sobre o número. Três lacunas para além do resumo do plano, apanhados antes de embarcarem em silêncio: bucketOf() nunca roteou sessionType 'AI' em qualquer lugar, então cada linha de IA resolveu 'equipeMembros' e a aba IA teriam sido renderizadas permanentemente em branco; a linha o próprio título nunca leu linha. título, então cada conversa de IA teria mostrado como "Conversa vazia"; e 'ai' estava faltando de ALL BUCKETS, então o sub-tab por membro A preferência se recusaria silenciosamente a restaurá-la após um interruptor. O processo é... o próprio exemplo unreadFor () também não é usado como escrito — substituindo o existente computação não lida com ele atacado teria zeroado cada linha social emblema (nunca no mapa ao vivo, ao contrário de CHAT/SUPPORT) e flashed cada linha para zero antes das cargas de instantâneo ao vivo; o ramo IA é dobrado para o existente computação em vez disso, preservando ambos.

  7. · kamo-internal

    A janela de linha dedicada

    A chamada agora vive em uma janela uma atualização do espaço de trabalho não pode tocar. SoftphoneProvider torna-se proprietário ou seguidor. Apenas o proprietário REGISTRA e abre o socket STOMP; um seguidor renderiza estado espelhado, envia comandos sobre o ponte, e fica em silêncio — sem toque, sem ringback, sem sons de evento, porque Não tem nenhuma sessão e o botão Resposta não faria nada. Onde está o Web Locks indisponível a aba simplesmente possui a linha e não há nenhuma janela, que é comportamento de hoje: nunca degradar em dois registros. /phone renderiza através de um terceiro ramo AuthedChrome carregando SoundProvider e SoftphoneProvider e nada mais. Excluindo ToolWindowRestore está carregando — a sua guarda é de âmbito de módulo, de modo que um novo documento reproduziria o conjunto do membro dock dentro do popup — e assim está excluindo SessionManager, que navega para /logout ao expirar e apagaria a sessão compartilhada do Redis sob o Página do espaço de trabalho. Pela mesma razão useUserInfo e apiClient agora se recusam a auto-navegar desta rota; uma sessão perdida é renderizada, não redirecionada. A janela abre síncrona a partir de um clique no NavTop (a ativação transitória abre não sobreviver a uma espera), é nomeado assim que um segundo clique foca em vez de Duplicando, e relata um popup bloqueado em vez de falhar silenciosamente — o O softphone na página continua a funcionar de qualquer forma. Dentro: um Start portão que compra activação pegajosa antes de qualquer coisa precisa dele, deglutir chave de recarga, um close Confirma, e uma trava de despertador.

  8. · kamo-internal

    Uma página de comunicações que enrola os leads da conta

    O nível que a maioria das pessoas quer dizer quando dizem "as chamadas deste cliente". Várias pistas comumente pendurar uma conta precisamente porque eles são a mesma pessoa questionando duas vezes, e cada uma das suas chamadas foi compatível com o que número na época — então ler a linha do tempo de um lead responde a uma pergunta mais estreita do que o que alguém que olha para um cliente está a perguntar. Isso torna a linha do tempo existente da plataforma, não uma segunda. A coluna vertebral é O histórico do lead desenha uma conta dada a uma base diferente. Um fósforo, um A aba diz o que não está mostrando. Os portões do servidor cada chumbo enrolado no os mesmos direitos que a página principal aplica e caps quantos ele enrola, e ambos são surfaced: "N leads não são mostrados porque você não tem permissão" é um frase diferente de "esta conta tem mais leads do que nós enrolamos de uma vez", e uma faixa para ambos esconderia a primeira atrás da segunda. Notas e bate-papo estão ausentes em vez de vazios. Ambos são lead-native — uma nota vive no fluxo de mídia de um lead, chat em seu link social — então uma conta não tem nada a colocar lá, e uma aba permanentemente vazia lê como quebrado em vez de inaplicável.

  9. · KlusterServices

    Publique uma visita nua ao login do Kamo e termine a sessão na aba fechar

    Fechar a aba KamoDesktop deixou uma sessão ao vivo na máquina. Guacamole mantém o seu token de autenticação no localStorage (GUAC AUTH), que sobrevive ao fechar a página, fechar a janela e reiniciar o navegador, e o token permanece válido para 60 minutos depois da sua última utilização. Então, a próxima pessoa a abrir o portal sobre isso O computador herdou a área de trabalho da pessoa anterior. Fim a fim. Duas mudanças, ambas do lado do servidor primeiro. A borda agora redireciona uma solicitação de documento nu para login.kamocrm.com. KamoDesktop tem exatamente um ponto de entrada legítimo — uma ligação assinada, de uso único cunhada para alguém já autenticado para Kamo — então uma pessoa digitando o nome do host, ou restaurar um favorito, ou deixar o navegador completá-lo automaticamente, não tem negócio Ver a caixa de senhas do Guacamole. Servir um oferece um alvo de recheio credencial para a conta `sage' e permite que um navegador segurando um token ao vivo sessão. Escondido ao Caminho(`/`) de propósito: uma carga de SPA fria puxa ~41 ativos e API chamadas que não carregam ?data=, então qualquer coisa mais ampla quebra o aplicativo de imediato. O fragmento #/client/... nunca atinge o servidor, por isso uma ligação profunda com os favoritos é um '/' nu aqui e também é saltado - o que é correto. E o símbolo é agora revogado quando a aba vai embora, em vez de meramente esquecido: DELETE /api/sessão com o cabeçalho Guacamole-Token (vivo verificado — 204, e o token pára de funcionar imediatamente). Saltado para um BFcache congelamento, então Pressionar Back não assina ninguém. Kamo-reconnect.Js desapareceu. Existiu para papel sobre sessões abandonadas, levou o desktop para baixo duas vezes, e as causas que ele estava compensando — implementa reiniciando a porta de entrada, e a OOM — são fixadas na sua fonte. O que o substitui é um trimestre do tamanho e sua pior falha é que você está assinado para fora, que é o resultado que está tentando produzir.

  10. · kamo-internal

    Propriedade de linha, a ponte, e a regra da entrega sem ianque

    Três módulos puros sem consumidores ainda, por isso este navio inerte. lineOwnership elege exatamente um registrador SIP por navegador via Web Locks. Isso. é obrigatório aqui em vez de defensiva: verificado ao vivo, cada FreePBX AOR é max contacts=1 com remove existing=yes, então um segundo REGISTER despeja o primeiro e o documento despejado continua mostrando "Registrado" enquanto não recebe nada. Web Locks não precisa de protocolo de liveness — o bloqueio pertence ao agente, por isso um A janela despenhada ou morta por tarefas liberta-a e o próximo garçom é promovido. Onde a API está ausente, nós relatamos "não suportado" e o chamador mantém comportamento em vez de arriscar dois registos. lineBridge é uma versão do envelope BroadcastChannel. Não janela.opener: que fica estagnado exatamente quando o abridor recarrega, que é o evento inteiro O recurso existe para sobreviver. A versão inclinada degrada-se para um controle remoto obsoleto, Nunca um lance em uma UI chamada ao vivo. O estado espelhado é uma lista de permissões — diretório os dados permanecem onde estão carregados. lineHandover é uma regra: uma chamada ao vivo nunca é arrancada.

  11. · kamo-internal

    O título da aba conta tudo à espera, não apenas o chat

    A faixa de tabulação tem espaço para um número, e 'chat e suporte apenas' deixou de ser o que um membro está esperando uma vez SMS, IA, chamadas perdidas e relatórios sem revisão Cada um tem um indicador.

  12. · kamo-internal

    Distingue a opção IA com respostas sem revisão

  13. · kamo-internal

    Um total no ícone do telefone, a avaria no menu

    Este ícone não carregava nenhum crachá, então uma chamada perdida enquanto o softphone estava fechado chegou ao membro em nenhum lugar. Abrir o telefone limpa a contagem falhada.

  14. · kamo-internal

    Um total no ícone, a discriminação no menu

    pendenteCount era o crachá inteiro, por isso relatórios de bugs sem revisão e webinars reservados em nome de alguém não tinha como contactar ninguém. Abrir os selos da linha webinar Eles viram, então a contagem pode realmente sair.

  15. · kamo-internal

    O crachá de bate-papo conta chats

    Era conversa silenciosa mais apoio, então um bilhete acendeu o sino do chat e nada distinguiu os dois. Suporte tem seu próprio ícone agora; social junta chat, porque uma conversa social vive na lista de Chats e não tem nenhum ícone próprio.

  16. · kamo-internal

    Deixe uma fila suspensa ter sua própria contagem

    O ícone mostra a soma e as linhas mostram a desagregação — o ponto de divisão os indicadores é ver O QUE coisa quer você sem abrir nada.

  17. · kamo-internal

    Golpe na chegada, com o brilho dissipando para fora

    Sua própria camada dentro .hex-escala: esse elemento já anima transformar para o paire crescer, e duas animações em um elemento não compõem — o segundo substitui o primeiro, de modo que uma batida no meio do hover cairia a escala hover. Teclado em vez de alternado por classe, ou duas mensagens em rápida sucessão bater uma vez. Gated a escala-pulse em uma classe `.thumped ` presente apenas após uma batida real: o mudança de chave faz `.hex-thump` um nó DOM fresco tanto em um thump real E no primeiro monte, e CSS não pode dizer aqueles dois para além da chave sozinho, então o Fiação literal teria jogado o pulso em cada cabeça uma sessão restaurada desovas - o "screenful de hexágonos pulsantes" deve Tump existe para prevenir.

  18. · SecurityService

    Uma linha temporal de comunicações de nível de conta

    O nível que a maioria das pessoas quer dizer quando dizem "as chamadas deste cliente". A coluna vertebral é já com a tecla de um proprietário, por isso o endpoint da conta é o mesmo mesclado, O componente torna-o apenas com uma base diferente. CommsSubjectResolver decide que proprietários uma linha temporal pode ler, e é o um lugar que responde é permitido ser mais amplo do que o sujeito questionado. Só conta se expande. Uma pista não herda o tráfego de um irmão: duas podem ser atribuídas a pessoas diferentes. Um paciente não herda nada, o que quer que o gráfico da conta diga — um gráfico mostrando as mensagens de um lead CRM ser uma revelação, e esse teste existe para mantê-lo assim. O rollup é limitado a 25 proprietários e a resposta diz quando o bit cap. A rollup que silenciosamente deixa donos é uma linha do tempo faltando mensagens para não razão visível, que é pior do que uma que admite que é parcial. Cross-org e contas ausentes obter o mesmo 404 para que a resposta não pode ser usado para investigar quais contas existem, e a falta é auditada também. resolverOrgId em vez de um novo sinónimo: a catraca de avaliação reconhece que nome, e lê um corpo método sem seguir chamadas, por isso um ajudante não pode ver leituras como um ponto final não protegido.

  19. · kamo-shared-library

    Deixe uma conta rolar as comunicações de seus leads

    Vários leads comumente penduram fora de uma conta precisamente porque eles são o A mesma pessoa que perguntou duas vezes, e cada uma das suas chamadas foi compatível com qualquer O chumbo tinha o número na altura. Então "as comunicações deste cliente" é o União das linhas da própria conta e cada uma das suas pistas» — leitura A linha do tempo do lead responde a uma pergunta mais estreita do que a que está a ser feita. findUidsByAccount projetos uids em vez de entidades de propósito: Chumbo está em uma hierarquia de hereditariedades, e a seleção de entidades aqui iria arrastar o plano completo de busca para produzir uma lista de ids. PhiResourceType.ACCOUNT então as linhas de auditoria da conta nomeiam o que era Na verdade, ler. Avançado, nunca inserido — o enum é ordinal-persistente.

  20. · kamo-internal

    Um contexto para as contagens dos quatro indicadores

    Compõe o que existe e possui os três que não tinham casa: bug sem revisão Relatórios, webinars não revistos e chamadas e mensagens de voz perdidas. O carrapato de primeiro plano dos anos 60 não é cinto-e-braços — vários destes chegam mais núcleo NATS sem replay, então um frame publicado para uma aba dormindo não está vindo.

  21. · kamo-internal

    O farol de queda relata que caminho ICE realmente escolheu

    O farol de gelo enviadoCandidateType como um campo permanentemente null. Isso é pior. do que omiti-lo: faz a telemetria parecer mais informativa do que é, e esta é a única medida que pode redirecionar todo o projeto linha-janela. O softphone web constrói sua conexão por pares com um STUN público codificado A carga de crédito nunca a levou. Assim, um membro por trás de um NAT simétrico, um VPN ou CGNAT operador pode falhar em estabelecer mídia sem nada para voltar, E o que dizem é "a chamada caiu". Depois do facto de que é indistinguível de "I hit refresh", e os dois têm completamente diferente correções — uma delas duas linhas de configuração TURN em vez de um novo contexto de navegação. Nada é a prova que os separa. O caminho do SIP.js reutiliza o par candidato seu despejo diagnóstico existente já calcula, assim que não custa nenhum getStats extra; o RingCentral path samples raw.rtcPeerConnection on Responde. Uma leitura nula é gravada ao invés de ignorada — "ICE selecionou nenhum par" é a falha sem relé e a leitura mais valiosa disponível – e callDuraçãoSegundos separa-o de "a chamada terminou antes de amostramos". Também registra no plano o que realmente enviou, incluindo a Tarefa 6 guarda que diferente do plano como escrito.

  22. · kamo-internal

    Selector de um dia, partilhado pelo calendário e pela página de definições

    As duas superfícies tinham cada um crescido sua própria resposta para "que dias?". As configurações tab colocar dias de trabalho semana, dias de fim de semana e todos os dias atrás de um dropdown; o o editor do calendário tinha uma fita multi-selecionada e nenhum grupo. Qualquer que seja membro aprendeu primeiro, o outro não poderia fazer o que fez. Partilham Disponibilidade DayPicker agora — os botões de grupo E as sete fichas, em ambas as páginas, definidas uma vez. Este é o único acordo que os mantém O mesmo da próxima vez que for tocado. Grupos selecionam em vez de salvar. Pressionando "Workweek Days" gira em cinco fichas e nada a jusante interpreta um sentinela: o membro pode desmarcar imediatamente a quarta-feira eles estão fora para, e o que chega ao backend é o que tem Sempre ocupado, uma janela por dia. Um botão de grupo é lido como ligado apenas quando exatamente seus dias são escolhidos, assim que o controle pode dizer "esta é a semana de trabalho" em vez de Deixando alguém para contar fichas. A aba de configurações ganha algo que nunca teve — uma escolha arbitrária de vários dias. "Segunda-feira, quarta-feira e sexta-feira" não era expressível lá antes; era um dia ou um grupo. diasToSave, portanto, leva um dia LIST em vez de um dia- ou- grupo, que é o que permite que ambas as superfícies compartilhem um tipo de seleção. Ambos os trilhos de guarda ainda mantêm e são ainda presa: uma edição nunca se expande em várias linhas, e uma escolha de vários dias Nunca colapsa para um. O painel diz "O que significa isso?" e começa a entrar em colapso para todos. Abertura para um membro sem nada declarado foi significado como uma bondade e foi o errado um — ele empurrou a lista e o botão que começa a coisa toda para baixo o coluna, de modo que a primeira coisa que um novo apresentador encontrou foi uma parede de prosa em vez de O controle da prosa é sobre. Também aumenta o tempo limite na varredura de toda a árvore do catálogo de som. Ele lê e concatena cada arquivo fonte no aplicativo, pousa em 6-13s sempre que a máquina está ocupado, e estava falhando na suíte contra o padrão 5s do vitest — com uma mensagem que nomeou nenhum evento, porque nunca chegou à sua afirmação. O exame vale a pena. mantendo; o tempo- limite padrão simplesmente não é dimensionado para ele.

  23. · kamo-internal

    Distinguir uma janela minimizada com o seu servidor por ler

    O único componente que vê tanto a lista de janelas como os mapas não lidos — o o motor não sabe nada sobre conversas e o contexto não lido não sabe nada sobre janelas, para que nenhum deles pudesse responder a isto sozinho. Despacha apenas na mudança: as teclas batem fora de um aumento, então uma contagem repetida Seria como uma chegada e as cabeças pulsariam no temporizador de atualização.

  24. · kamo-internal

    Definir uma contagem absoluta não lida do servidor

    Substitui o Hexhead: vindo, o que nunca foi enviado. O seu +1 teria contou um instantâneo re-entregado como uma nova mensagem, e sua desova-se-se-perde branch deixaria uma cabeça cuja janela não existe — clicável e inerte.

  25. · kamo-internal

    Mensagens e chamadas, no componente de linha do tempo existente

    CommunicationsTimeline e EmailEntry têm um endpoint opcionalBase e manter o caminho principal como o padrão, então cada local de chamada existente é byte- for- não importa o que a linha do tempo é sobre — o chaveamento do proprietário é inteiramente server-side, exatamente como MediaStream toma um feedEndpoint e o DocManager toma um (assocType, assocObjectId). As mensagens de um paciente são desenhadas pelo A faixa de ponto de contato acima da linha do tempo é a parte que de outra forma estar desaparecido. Uma linha do tempo é uma visão; chamadas e mensagens de entrada só sempre LAND em um proprietário o fósforo pode resolver, de modo que um paciente sem número registrado tem uma linha do tempo vazia por uma razão que nada mais na tela seria explicar. Seu estado vazio diz exatamente isso, em vez de implicar nada Nunca aconteceu. 3149 testes verdes, verificação de tipo limpo.

  26. · SecurityService

    Chamadas de um paciente, textos e e-mail — na própria coluna vertebral da plataforma

    Nem uma segunda linha do tempo. LeadCommunicationsService agora leva um assunto de comunicação e a sobrecarga de chumbo delegados para ele, então /leades mantém o seu comportamento exato À deriva. Um paciente é apenas outro dono. Notas e bate-papo aparecem apenas para uma liderança, e isso é um fato em vez de um guarda: as notas vêm do fluxo de mídia de um líder e bate-papo de SocialRemoteUserLead, nenhum dos quais existe para um paciente. Ambas as fontes já retorna vazio quando seu link está ausente, então um paciente fica tráfego e nada finge o contrário. Registrar pontos de contato é a metade que faz funcionar. Apontar a timeline em um novo proprietário muda o que é READ; tráfego de entrada apenas sempre PAIS em um proprietário o fósforo pode resolver, então um paciente cujo número não é Um ponto de contacto recebe chamadas que resolvem a ninguém. O registo é ponto-em-tempo como a coluna principal — mudar um número fecha o ponto antigo e abre um novo, então uma chamada de dois anos atrás ainda explica o que o mesmo piso de sete dígitos, porque um A extensão corresponderia a cada paciente que partilhasse esses dígitos. Ler qualquer coisa precisa de uma relação de cuidado com o paciente, exatamente como o gráfico, e cada entrada mostrada escreve sua própria linha de auditoria. Uma mensagem de voz de um paciente é tão identificado como uma lista de problemas. O endpoint e-mail-corpo verifica novamente a linha em relação ao paciente no caminho. A verificação cuidado-relacionamento é satisfeita pelo paciente na URL, então sem esse segundo verificar um clínico com uma relação com um paciente poderia ler qualquer mensagem na prática, fornecendo o seu ID — o lead Endpoint faz a mesma verificação pela mesma razão. Sua 404 é uma resposta para "não deste paciente", "não um e-mail" e "ainda não localizável", então o a resposta não pode ser usada para sondar IDs de mensagens. Também aqui: o controlador de troca TEFCA – o §164.528 de um paciente contabilidade, tudo enviado para um parceiro (a consulta alguém executa o hora em que uma violação é comunicada), parte 2 divulgações como sua própria pergunta, e a fila de revisão de correspondência entre organizações. 1278 testes verdes.

  27. · kamo-internal

    Pare de perder chamadas para a sessão expirar, rasgar e dispositivos obsoletos

    Quatro guardas que partilham dois ficheiros, por isso partilham um commit. Uma chamada ao vivo agora conta como atividade de sessão. Actividade do Cliente Rastreador igualado presença com eventos de entrada, de modo que um membro que escuta em uma chamada longa leia como ocioso: o Redis TTL decaiu, o aviso de validade aberto em uma aba que eles não estavam olhando em, e /logout rasgou a árvore segurando a sessão SIP. Roteado através do markNow () então a desativação do logout ainda vence — sessionMonitor (120s janela de atividade, 60s re-extende mínimo) governam a cadência, então isso não pode Foge. Um documento que morre com uma chamada agora diz isso. pagehide dispara um melhor esforço BYE — a extremidade anterior sentou - se numa perna morta até que o registrador cronometrasse o contact out, até dez minutos após expirar:600 — e um farol de manutenção membro, org, fornecedor e tinhaLiveSession. Nada em qualquer lugar contou quantas vezes um A demolição realmente custa uma chamada, então não havia número para pesar uma correção maior contra. O farol permite-lista os seus campos: sem números remotos em um log pod, e ids ficar strings porque eles são int64. Uma segunda aba já não toca com um botão de resposta morto. O tópico VOIP STOMP é uma transmissão, então cada conjunto de documentos abertos temIncomingCall enquanto apenas um o O provedor enviou o INVITE para responder. Gated na sessão em vez de o SDK, porque com duas abas abertas ambos possuem um registro. Uma mudança de dispositivo atinge a chamada de qualquer janela. saveAVSettings envia um Same-window CustomEvent; somente useAVSettings também ouviu o documento cruzado evento de armazenamento, então cada consumidor de call-path perdeu uma mudança feita em outro lugar - silenciosamente, porque aplicar SinkId engole cada falha. Uma assinaturaAVSettings Agora cobre ambas as metades.

  28. · InitializerService

    Aumente a coluna de comunicação para um proprietário, na ordem que o mantém seguro

    LEAD CONTACT POINTS e LEAD COMUNICAÇÕES ganham o gerente do documento (assoc type, assoc object id) par para uma conta, um paciente ou um comércio O registo pode possuir comunicações sem pedir uma pista. Quatro passos, e a ordem é o ponto todo. Backfill em primeiro lugar: cada linha existente é de um lead, então assoc type = 'LEAD' e assoc object id = lead uid::text. Executá- lo após a troca de restrições construiria o novo índice único sobre nulos, impondo nada. Em seguida, troque a restrição única para o par proprietário. (org id, lead uid, canal, source id) é o que torna a ingestão idempotente — uma chamada RingCentral é visto duas vezes, uma pelo webhook e outra pela varredura da reconciliação — e com lead uid null para um paciente, Postgres trata cada um desses NULLs como distinto, assim o segundo avistamento insere uma duplicata. A nova restrição é adicionada ANTES que o antigo é deixado cair, então uma falha entre Deixam a mesa protegida por um e não por nenhum. Só então relaxar lead uid não é NULL. Ddl-auto do Hibernate: a atualização adiciona colunas mas nunca relaxa uma restrição, por isso isto não pode ser deixado à mapeamento — e fazê-lo antes do swap abrir exatamente a janela duplicada acima. Em seguida, verifique, lendo pg constraint e information schema de volta. A chaves primárias clínicas estavam corretas em Java e erradas na DDL emitida, e somente a leitura de pg constraint o mostrou. Uma linha à esquerda sem tipo de proprietário nunca apareceria em nenhuma linha temporal, então esse caso registra um erro ao invés de Relatório de sucesso. Idempotente por toda parte, e uma tabela em falta é ignorada em vez de falhar o boot — uma exceção aqui levaria cada corredor posterior com ele. 176 testes verdes.

  29. · kamo-shared-library

    Chave a coluna de comunicação sobre um proprietário, não uma pista

    A coluna vertebral foi construída em forma de chumbo — LEAD CONTACT POINTS.LEAD UID, LEAD COMUNICAÇÕES.LEAD UID — e a associação de que realmente precisa é mais amplo. Uma conta possui vários leads, tipicamente compartilhando o mesmo ponto de contato porque eles são a mesma pessoa perguntando duas vezes. Um registo comercial Detém a conta em vez de qualquer pista. E um prontuário tem chamadas e e-mails sobre isso e nenhuma pista. A chave para os leads significava cada um dos quais pegou emprestado uma pista ou cresceu uma linha do tempo paralela. Ambas as tabelas agora carregam o gerenciador de documentos (assoc type, assoc object id) par, com a liderança, a conta, o paciente e o COMMERCE RECORD como proprietários. LEAD UID é KEPT e ainda é preenchido para linhas de chumbo, então cada existente /leades query, index and call site is intoched — the lead-keyed repositório os métodos e a sobrecarga da linha do tempo do lead permanecem e o novo proprietário Sentam-se ao lado deles. Três coisas que isto tinha de acertar, e uma que quase me enganei. A restrição única se move para o par proprietário. (ORG ID, LEAD UID, CANEL, ORIGINAL ID) é o que torna a ingestão idempotente - uma chamada RingCentral é visto duas vezes, uma pelo webhook e outra pela varredura de reconciliação. Com LEAD UID nulo para um paciente, Postgres trata cada um desses NULLs como distinta e o segundo avistamento insere uma duplicata. A tabela de pontos de contato importa mais do que a linha do tempo. Apontando uma linha do tempo em um novo proprietário muda o que é READ; tráfego de entrada apenas sempre proprietário que tem pontos de contato, porque é isso que o linker corresponde contra. Um paciente cujo número não é um ponto de contato recebe chamadas que Decidir a ninguém. O que eu quase enviei: o linker de-duped corresponde por cp.getLeadUid(). Para um ponto de contato não líder que é nulo, assim vistoLeads.add(null) iria deixar exatamente UM proprietário não líder através por mensagem de entrada — uma chamada para um número dois pacientes iriam chegar a um deles, silenciosamente. Agora de-dupes em O dono. assoc type é um STRING, nunca um ordinal. Hibernate congela um CHECK (col BETWEN 0 E N) sobre uma coluna ordinal enum no QUADRO CREADO e nunca revisita-o, por isso, adicionar um valor mais tarde rejeita cada inserção que o carrega — silenciosamente, porque a instrução falhando está dentro de um método @Transactional Que retira as provas. Sete desses foram encontrados cheios e já quebrando coisas nesta plataforma em agosto. Um null armazenado lê como LEAD, porque cada linha escrita antes da coluna existente é um lead's e retornar nulo para aqueles iria em branco a linha do tempo esta mudança existe para ampliar. Um valor UNKNOWN é nulo em vez de LEAD — anexar o tráfego de outra pessoa a uma linha do tempo de liderança resposta errada pior do que nenhuma. Também neste compromisso: a camada de troca TEFCA (parceiros, a divulgação livro de registos, correspondência entre doentes de organização cruzada). Os seus códigos de finalidade são agora As mesmas cordas HL7 v3 ActReason PhiPurposeOfUse já usam — um teste capturado eu inventando "T" para o tratamento onde a plataforma diz "TREAT", e um a linha de troca e uma linha de auditoria descrevem a mesma divulgação de dois ângulos, Então, um relatório junta-se a eles. 1932 testes verdes.

  30. · kamo-internal

    SMS e IA contam, e uma divisão por superfície

    Um instantâneo MediaService cobre três superfícies que pertencem a dois navegadores diferentes indicadores, então os totais são separados do servidor declarado sessionType em vez de as janelas estarem abertas. Uma entrada sem sessãoType conta como chat — é o que uma compilação antiga envia, e mantém o distintivo a fazer o que fez, em vez de deixar cair uma contagem a meio da operação.

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