Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-internal
Autor scripts em configurações CRM, leia-os em uma chamada
Duas abas de configurações de CRM por trás do MANAGEM SALES SCRIPTS — os scripts ao vivo e o arquivo — mais uma guia de Scripts de Vendas no Centro de Interação por trás VER VENDAS SCRIPTS, e um pino que mantém o Centro de Interação aberto. O leitor é um teleprompter, não um documento. A única questão que importa enquanto alguém está a falar com um cliente é "onde estou eu", por isso um progresso espinha corre para baixo a pilha de bloco e preenche como as peças são marcadas, a próxima parte não lida é elevado ao contraste total enquanto lê os retrocede, e tiquetaque um rola o Próximo no lugar. Um script genuinamente é uma sequência lida de cima para baixo uma vez, que é o que ganha o tratamento sequencial. Tudo o resto na superfície é Mantiveram-se calados para que uma coisa o pudesse carregar. O compositor espelha a mesma espinha, então um autor está olhando para a forma que o agente verá em vez de um formulário que produz. Read-progress e o pino ambos ao vivo em sessãoStorage: eles sobrevivem a uma recarga a aba em que o membro está trabalhando, não os siga em uma segunda aba uma chamada diferente, e são idos no sign-out — aplicativo / logout já faz um atacado sessionStorage.clear(), então nenhum dos dois precisa descontrair. Todos os acessórios estão embrulhados. porque sessionStorage THROWS em vez de retornar nulo em um perfil endurecido, e este código é executado dentro do cromo de aplicação. O portão de abertura do NavTop vai do acesso ao chat sozinho aos scripts de vendas de chat. Ele teve que: um agente CRM em uma org sem o aplicativo Chat não pôde alcançar o Interaction Center em tudo, então a aba Scripts de Vendas teria sido invisível para exactamente para quem é. Cada aba dentro ainda carrega seu próprio portão. O compositor toma sua linha de base "nada mudou ainda" uma macrotarefa após carregar em vez dos valores que semeou. Lexical re-serializa um documento quando o carrega — equivalente JSON, raramente idêntico — comparando assim com o string do servidor relatou todos os scripts recém abertos como editados e solicitados "sair sem salvar?" na saída de um ninguém tinha tocado. Blocos sem um cabeçalho nem nenhum texto são deixados em salvo. Um autor que adicionar um e seguir em frente não significou publicar um passo vazio, e o leitor faria uma caixa de seleção contra nada. Os dois novos cartões de desembarque juntam-se temAtiveMarkets e canManageSalesScripts to As dependências do memorando. Ambos resolver assíncrono, por isso sem eles o O memorando foi construído enquanto ambos eram falsos e nunca reconstruídos. Os quatro mercados Os cartões de CRM acima já dependiam de outras alterações de dependência no tempo; nomear hasActiveMarkets corrige-os de passagem.
· KBService
Servir os scripts que um agente lê numa chamada
/api/kb/sales-scripts, com os dois novos direitos. Leituras take VER VENDAS SCRIPTS ou GESTÃO VENDAS SCRIPTS, escreve tomar GESTÃO. SessionHelper.hasRight fails closed, que é o que cada portão neste serviço Depende. Aqui em vez de no SecurityService porque o APIService já avança /api/kb/** para este serviço por atacado, por isso o recurso não precisa de mudança de gateway, e porque donotmodify.dao.repos está na aplicação @EnableJpaRepositorys — a pesquisa no mercado de leads que um script precisa é uma consulta local Em vez de uma chamada cruzada. O ponto final da lista retorna resumos com um bloco COUNT e sem corpos de bloco. A a lista de configurações de uma dúzia de scripts não tem uso para uma dúzia de documentos Lexical completos, e as contagens vêm de uma consulta agrupada em vez de uma por linha — a forma que fez /leades lento o suficiente para ser relatado como uma falha. GET /markets existe para que o Centro de Interação possa desenhar seus sub-tabs em um Chama. A alternativa era buscar cada mercado e cada script e intersectando-os no navegador: duas viagens redondas e uma carga de script corpos para responder a uma pergunta sobre IDs.
· kamo-shared-library
O script que um membro lê em uma chamada, como blocos ordenados
Duas mesas e dois direitos. SALES SCRIPTS pendura fora de um mercado de chumbo da forma LeadVendor faz; SALES SCRIPT BLOCKS detém as peças, cada uma uma uma Lexical documento mais o texto achatado as pré-visualizações e estimativa do tempo de leitura lido. Os blocos são linhas em vez de um array JSON no script porque o id de um bloco é o que é o progresso de leitura de um membro é definido. Como um array, posição seria o somente a identidade disponível, assim que um autor que inserisse um parágrafo perto do topo seria Mudem silenciosamente o lugar de todos no guião. Com IDs estáveis, o texto pode ser reescrito e os blocos reordenados enquanto cada agente no meio da chamada mantém o Tiques que eles já fizeram — é por isso que ******************* preserva o ID de qualquer bloco que a carga ainda nomeie, e por que o teste para ele é o primeiro no ficheiro. Salvando é uma REPLACE FULL: blocos carregando uma atualização do ID no lugar, blocos sem um são criados, e bloqueia os omits de carga são DELETADOS. Declarado sobre o DTO e coberto por um teste, porque um chamador assumindo de outra forma perde dados com nada para mostrar para ele — o mesmo contrato, e a mesma armadilha, como fundos/compromisso. Omitir 'blocos' é o caso separado e seguro que Deixe-os em paz. VEZ SALES SCRIPTS (300) é uma raiz: ler o campo não é implícito por qualquer outro direito, menos de todos VER LEADS, desde o estagiário que aprende o script Antes de receber uma pista é exactamente para quem é a bolsa. GESTÃO (301) por isso a autoria não pode ser concedida sem a capacidade de ler o que está sendo autor, e revogando a leitura leva a escrita com ele. Ambos os nomes ServiceType.CRM, que é o que os coloca no grupo de segurança de CRM — permissionGroupTree deriva grupos do serviceType, então nenhuma edição do grupo é necessária e um direito em nenhum grupo não poderia ser concedido em tudo.
· DocsService
Preencha um retângulo, honre a opacidade de um destaque, e redigir
Três coisas sobre a forma como um documento preparado faz as marcas do designer. Um retângulo foi desenhado como um esboço, então o preenchimento de um membro agora escolhe para cobrir Algo de errado não chegou. Preenche primeiro e passa depois, e só se lá é uma fronteira deixada para desenhar — a opacidade pertence ao preenchimento, não à fronteira à volta. Um destaque ignorou a opacidade que o designer sempre salvou e pintou cada um a 30%. E um retângulo marcado "remover o texto por baixo" agora tem o seu texto retirado por PdfRedactor em vez de meramente coberto. Isso funciona antes de qualquer coisa ser desenhada, porque ele reescreve o fluxo de conteúdo da própria página. As anotações também avançam para as operações da página, que é uma correção em sua própria direito: uma anotação nomeia sua página por índice no DESIGN, e aplicaPageOperations apaga as páginas, então cada índice passado por uma deletada mudou. Uma marca desenhada depois pousou em qualquer página que tivesse se movido para aquele slot – que para uma caixa de redação significa limpar o texto na página errada e deixar o texto certo sozinho.
· ESigService
Coloque as anotações do designer no documento assinado
flash() aplicado páginas em branco, rotações, modificadores, valores de campo, ordem de página e certificados. Nunca desenhou as anotações. Um retângulo, um realce ou uma seta desenhado sobre um modelo exibido no designer e no navegador do assinante e então simplesmente não estava no PDF que foi entregue. Para um destaque que é um florescimento perdido. Para o retângulo um membro desenha um número de conta bancária é o oposto do que eles pediram, então todos os cinco os tipos são desenhados agora, após os valores do campo e antes das marcas d'água que se sentam acima — a ordem em que o designer empilha suas camadas. Um retângulo marcado "remover o texto por baixo" também tem seu texto retirado, por PdfRedactor, antes de qualquer coisa ser desenhada: reescrita da página fluxo de conteúdo, então uma marca carimbada primeiro seria reescrita com o texto Era para sobreviver. Nem arremessos de passe — uma redação que falha não deve perder uma assinatura – e uma falha é registrada para o que é, que é que o coberto as palavras ainda estão no arquivo entregue.
· kamo-signer-monorepo
Desenhar o preenchimento de um retângulo na visão do assinante
O designer agora pode dar a um retângulo um preenchimento e uma opacidade, que é como um O membro encobre alguma coisa. Este renderizador desenhou fill="nenhum", então o sinalizador viu um contorno vazio onde um bloco sólido foi concebido para ser — e em um retângulo de redação Eles teriam visto o que estava a ser tirado. O preenchimento carrega a opacidade e a fronteira permanece sólida: desaparecendo uma fronteira ao longo com um bloco de 30% faz com que seja lido como um erro em vez de uma escolha. Um retângulo sem preenchimentoColor é o contorno que cada um salvo antes disso ainda desenha.
· kamo-internal
Faça a ferramenta retângulo algo que você pode esconder coisas com
A ferramenta retângulo esteve sempre na barra de anotações, mas desenhou uma esboço: preenchimento="nenhum" em cada renderizador. Não havia nada para esconder. nenhuma opacidade, e nenhuma maneira de tocar uma forma novamente uma vez que foi desenhado — anotação a seleção era um código inalcançável, porque a camada só tomou eventos de ponteiros enquanto uma ferramenta de desenho estava ativa e o manipulador de cliques só foi executado enquanto a ferramenta selecionada Era. Então um retângulo agora tem um preenchimento, uma opacidade, uma borda que não pode ser nada, e um switch que diz que o texto em baixo deve ser removido em vez de coberto (o A infra- estrutura faz essa parte). Chega como um bloco preto sólido, porque cobrindo algo acima é o que as pessoas alcançam para que ele faça; o contorno cada retângulo salvo antes que isso ainda tenha é o que nenhum preenchimentoCor significa, então nenhum deles muda. Desenhar é um gesto: arraste-o para fora, ou clique uma vez para ancorá-lo e novamente para terminar — uma prensa que não vai a lado nenhum costumava ser descartada como muito pequena para ser mantida, que é exactamente o gesto que começa agora. A fuga abandona-a. Uma vez desenhado é selecionado, com oito alças e um corpo arrastável, utilizando o mesmo e mapeamento de espaço de página como um canto de campo puxa para que os dois se sintam iguais. E... porque uma anotação selecionada não tinha para onde ir, um painel de propriedades vazio usado deslizar para cima; agora tem um, com os mesmos controles após o fato. Ferramentas de dois pontos todos tomar o segundo gesto, não apenas o retângulo, e destaques obter as alças também — eles são a mesma caixa por baixo.
· kamo-shared-library
PdfRedactor, então uma palavra coberta realmente se foi
Um retângulo preenchido desenhado sobre um número de conta esconde- o do olho e do nada mais: os glifos ficam no fluxo de conteúdo da página, e um copy-paste ou Um extractor de texto dá-lhes de volta. O designer esign está prestes a oferecer "remover o texto por baixo" em sua ferramenta retângulo, e isso é o que tem que ser É verdade que isso significa alguma coisa. Cada glifo uma página tintas é medido, e os que uma região cobre são deixados cair do fluxo do token e substituído por um avanço TJ de exatamente a largura que eles ocupado — para que o resto da linha não se mova e tudo mais na página Está escrito intocado. O texto pintado de dentro de um formulário XObject não pode ser alcançado dessa forma, porque o O próprio fluxo token da página não o contém. Então o trabalho é verificado depois medindo os glifos novamente, e uma página que ainda pinta texto dentro de uma região é re-renderizado como uma imagem. Essa página perde seu texto pesquisável, que é um pobre resultado e é registrado como um — mas é a única das duas opções que é Não é uma fuga silenciosa. PDFBox é declarado opcional para que não chegue aos vinte e poucos serviços que nunca abra um PDF; os dois que já declaram 3.0.3 eles mesmos.
· kamo-internal
Vincular os artigos com um rascunho de nomes
O congresso de autoria é nomear um artigo de irmãos, colocando seu título em itálico — "Leia *Funções de segurança explicadas* antes de edificá-las". 181 spans através dos rascunhos fazê-lo e nada nunca os transformou em links, então um publicado artigo diz ao leitor qual ler e depois deixa-os para encontrar Ele. Há exatamente um link Markdown em trezentos artigos e aponta fora do local. Também alimentou o bug KB-link que o assistente tinha. conteúdoPlainText é o que fica incorporado e o que o assistente é mostrado, e um itálico despojado lê como prosa, então a lista de verificação de configuração alcançou o modelo nomeando uma dúzia de artigos com maneira de chegar a qualquer um deles. Isso está guardado no serviço de IA agora, mas uma referência Isso é uma ligação que não precisa de protecção. A resolução acontece na importação, contra a base de conhecimentos a ser publicada em, porque o endereço é um guid e um guid pertence a uma base de do que aos rascunhos — escrevê-los nos arquivos de conteúdo centro de uma única organização. Ele corre na árvore convertida, onde um referência já é um nó de texto itálico segurando exatamente o título, que mantém markdown-to-lexical.mjs intocados para que os outros trezentos artigos não possam Regressar. Apenas uma correspondência exata de título está ligada, e itálico fazer duplo dever aqui — 62 itálico spans são rótulos de UI, ênfase ou títulos de perguntas e permanecem como estão. An o próprio nome do artigo não é uma referência, o link de um autor sempre ganha, e Uma segunda corrida é um não-op. Verificado contra a base de conhecimento ao vivo: 181 referências, 119 distintas destinos, 110 artigos ganhando links, nada não resolvido.
· kamo-internal
Uma taxa de instalação em uma cotação de preço único, ea suíte em sua própria linha
A taxa de configuração só existia em cotações multi-opção, então 'Um preço' não tinha caixa para — no formulário ou na página impressa. Agora está ao lado da Shipping, aparece em o trilho vivo e impressões como sua própria linha total. Está fora do desconto Subtotal, espelhando CitaçãoTotais: uma porcentagem fora das mercadorias não é uma porcentagem fora do custo de instalá-los. Um endereço chegou como uma corda de vírgula, então 'Suite 400' correu para a rua e a cidade. A unidade é seu próprio campo agora e adquire sua própria linha, sob o rua — no bloco do destinatário da cotação, nos pormenores do cabeçalho do próprio vendedor, e no cartão de Endereço de Correio principal no modo de visualização, que é onde o mesmo o endereço é lido antes de chegar a uma citação.
· InitializerService
Commerce quotes.setup fee
Uma taxa de instalação única em uma citação que apresenta um preço único. A taxa já Existiu em QuoteOption, onde cada alternativa carrega o seu próprio; uma folha plana tinha nenhuma opção para pendurar um, de modo que não poderia gravar uma taxa de configuração em tudo. Nulable, assim que o ADD COLUMN é aceito em uma tabela povoada e cada existente a citação continua a significar o que significava: sem coluna, sem taxa.
· kamo-shared-library
Uma taxa de instalação em uma cotação de preço único, ea suíte em sua própria linha
Duas coisas que uma citação não poderia afirmar. Uma taxa única de instalação viveu apenas no QuoteOption, onde cada alternativa carrega o seu Mesmo. Uma folha plana não tem opção para pendurar uma, por isso não pôde gravar uma configuração taxa em tudo — citando um significava mudar toda a citação para Comparar Opções, que altera a forma como o documento é lido para o cliente. Quote.setup fee é o Equivalente a folha plana. Ele fica fora do subtotal de desconto deliberadamente: a percentagem de desconto das mercadorias não é uma percentagem de desconto do custo de instalação. Um endereço foi montado em uma cadeia de vírgulas, então 'Suite 400' correu para a rua e a cidade. Não é assim que se escreve um endereço, e numa citação é o que um cliente deve publicar um cheque. A unidade agora viaja como seu próprio campo no bloco do cliente e os próprios detalhes da org, deixando a página livre para lhe dar a sua própria linha. A coluna é nulável — cada linha escrita antes de não ter taxa, e meios nulos nenhum — então nenhuma cotação existente muda o valor.
· kamo-signer-monorepo
A suíte em sua própria linha, e uma taxa de instalação em uma cotação de preço único
Duas coisas que a página impressa não podia dizer. Um endereço chegou como uma corda de vírgula, então 'Suite 400' correu para a rua e a cidade — não como um endereço é escrito, e esta é a página que um cliente é Espera-se que seja publicado um cheque contra. A unidade agora viaja como seu próprio campo e Impressões na sua própria linha, no bloco do destinatário e nos detalhes do vendedor. A taxa de instalação só existia em cotações multi-opção, de modo que uma cotação de preço único poderia não estado um em tudo; mudando modos para gravar mudou como o documento inteiro Lê. Ele agora tem sua própria linha de totais, mostrado apenas quando há um.
· InitializerService
Reprice armazenado cotações totais através do motor de preços
Colunas de dinheiro de citação são escritas, não calculadas em leitura, então as duas correções que desembarcou em 2026-09-02 — um preço unitário é uma taxa mensal multiplicada, e um termo comprometido vale a pena para o que se compromete — deixe cada linha existente Levando a aritmética antiga até que algo o salve. Na citação que expôs esta, uma opção de três anos armazenada um mês de si mesma. Chamadas QuoteService.reprice, o mesmo código que preços uma cotação em salvar, em vez do que reimplementar as regras de dinheiro no SQL. Um enchimento com sua própria cópia deles é uma segunda fonte de verdade e os dois derivam no momento em que é tocado. Aspas de terminal são relatadas, nunca reescritas. Os registos totais de uma citação aceite o que um cliente concordou com a figura que eles foram mostrados; que valor pode ser Errado, mas corrigi-lo aqui iria silenciosamente reafirmar um documento assinado. Cada um é registrado com seu valor armazenado e recomputado para uma pessoa decidir. Idempotente, e pediu tarde porque carrega entidades.
· kamo-signer-monorepo
Imprima a linha completa na cotação do cliente
Cada linha mostrou um nome e uma quantidade. Isso pede ao cliente para tomar o quantidade, a unidade, a taxa e qualquer redução na confiança, e não lhes deixa nada verificar uma factura posterior contra. As cartas de opção agora imprimem as mesmas colunas que a folha plana, e ambas ganham uma Coluna de desconto: uma redução que foi acordada pertence ao documento que declara o acordo. Linhas sem desconto mostram um traço mudo em vez de uma lacuna, então um coluna deles ainda lê como deliberado. Corresponde à antevisão de impressão do kamo- internal, que existe para projectar isto página — os dois são apenas úteis para o pessoal enquanto eles concordam.
· kamo-internal
Imprima a linha completa na citação e pare de perder o trabalho no interruptor de modo
Duas coisas que uma citação não podia fazer. Os itens da linha impressa dentro de um cartão de opção mostraram um nome e uma quantidade, nada Caso contrário — sem quantidade, sem etiqueta unitária, sem taxa, sem desconto. Isso pede ao cliente para levar todos os quatro em confiança e não deixa nada para verificar uma fatura contra. Opção cartões agora imprimir as mesmas colunas a folha plana faz, e ambos ganhar um desconto coluna: uma redução acordada tem que ser visível no documento que declara o acordo. A mudança entre «Preço único» e «Opções de comparação» só tem um sentido, e só quando ainda não existia uma opção. Virando e voltando, portanto, descartado o que quer que tivesse sido datilografado em qualquer vista que fosse deixada para trás. Os dois modos são dois views da mesma primeira coisa sendo vendido, então o interruptor agora carrega-lo de ambas as maneiras; opções passadas as primeiras são alternativas e são deixadas sozinhas, desde a folha plana não tem onde os segurar. O transporte é duas funções puras exportadas em vez de lógica dentro de um manipulador de cliques, Então o comportamento que estava silenciosamente errado é agora o comportamento sob teste.
· kamo-internal
Reemitir um link de compartilhamento de sua linha, e parar de perder o URL único
A lista de links Share não ofereceu nenhuma forma de visualizar ou copiar um link, e nada explicou Porquê? Nada pode revelar um existente — apenas SHA-256 do token é armazenado, então a URL existe na resposta menta e na caixa de entrada do cliente e em nenhum outro lugar. A resposta da própria arquitetura a um link perdido é menta outra, que deixa o cópia já enviada trabalhando e independentemente revogável; essa resposta simplesmente não foi acessível a partir da UI. Cada linha agora a carrega: Copie um novo link menta silenciosamente e abra a janela de cópia, e onde a linha nomeia um destinatário, E-mail um novo link envia-lo também. Ambos passam um caminho doMint com o próprio diálogo criado, então os três não podem derivar. Uma legenda sob a lista afirma a restrição em vez de deixar o leitor à procura de um botão que não pode existir. Duas reparações menores para a mesma queixa. A janela de URL única foi descartável por clique pano de fundo e Escape — um clique perdido e o link era irrecuperável; ele Agora só se fecha através do Feito. E a resposta da hortelã é "embalada" é o OUTCOME enquanto o pedido é o INTENT: pedindo por um email e não recebendo um renderizado o mesmo "Link criado." como nunca perguntar. Os dois são rastreados separadamente agora e um O envio falhou.
· RAGService
Resolver os artigos com nomes de passagens em alvos de links
Um artigo central — "Configurar a sua organização — Uma lista de verificação" — existe para envia o leitor a uma dúzia de outros, e nomeia cada um deles em texto simples. O editor não armazena os nós de ligação, por isso os títulos são todos os que chegam contentPlainText, que é o que é incorporado e o que o assistente é mostrado. Busca então retornou aquela passagem com os caminhos de apenas o punhado de artigos que corresponderam à consulta vetorial, e o assistente, disse para ligar o que cita, colocar um desses caminhos em todas as doze recomendações. A resposta de busca agora carrega artigos vinculable: os artigos essas passagens nome, resolvido para guids reais, filtrado pelos mesmos níveis de audiência a pesquisa usos de filtro — um artigo que o assistente pode citar é um que pode vincular. Um título só é combinado quando é específico o suficiente para significar um artigo. "Chat", "Leads" e "Notas" são títulos de artigos aqui também e aparecem em prosa comum constantemente, assim a correspondência é limitada a títulos de três palavras e doze personagens, em limites de palavras inteiras. O catálogo é apenas títulos e bandeiras, nunca os corpos @Lob, e é em cache por org — isso é executado no caminho de busca.
· kamo-internal
Pergunte se os convidados devem ser informados, e como
Adicionar um convidado a um evento não lhes disse, e o diálogo nunca disse isso. A A única coisa que já escreveu a um convidado foi um lembrete — que chega a um colega in-app e chega a um endereço externo nunca — assim convidando um cliente para uma reunião Não contactei ninguém, e não havia controlo em lado nenhum. Um cartão sob a lista de convidados, em forma de privacidade e cartões de lembrete fica entre: um interruptor, e dois chips de rota abaixo dele. O interruptor liga-se quando o primeiro convidado chega, uma vez e nunca mais, porque adicionar alguém para um O resultado surpreendente — e voltar atrás Off tem que ficar ainda enquanto mais convidados ainda estão sendo adicionados. A linha de resumo é a parte que ganha o cartão. Um hóspede externo não tem conversa thread e nenhum calendário Kamo; e- mail é a única rota que os alcança e é o que carrega o arquivo de calendário. Desligar o e-mail e nada mais na interface diria que sim. Desligar a última rota desliga tudo. em vez de deixar um interruptor que afirma estar convidando as pessoas ao enviar Nada. Escondido para o callback principal, que possui seu próprio salvo no SecurityService: enviar um convite de reunião para o momento em que você pretende chamá-los não é O que significa agendar uma chamada de retorno. "Atualizar e notificar" vai. Foi postado no endpoint de convite do próprio compositor de correio, que menta o seu próprio evento e recusa qualquer cujo ORGANIZER EMAIL não seja o remetente — uma coluna que nenhum evento de calendário já definiu — e enviou a lista de convidados como era quando o diálogo foi aberto, então uma edição que adicionou alguém notificou todos, exceto eles. Nunca poderia ter funcionado em qualquer caso: foi fechado no participante. éOrganizer, que a sincronização de convidados do calendário escreve como falso para cada linha. Salvar agora faz o trabalho.
· InitializerService
As colunas que deixam um evento convidar seus convidados
Três no calendário eventos, porque se uma reunião convida pessoas pertence ao reunião em vez de ao momento em que foi salvo — uma edição seis semanas depois que acrescenta Um convidado tem de saber. Todos os padrões para deixar os eventos existentes em silêncio: CalDAV, os ics o importador e o compositor de chamadas de voz, todos escrevem através do mesmo serviço e nenhum deles oferece esta escolha. Dois em calendar event attendees, ambos nulos, e nulos é o valor de carga: significa "nunca disse", que é o que cada linha existente é e o que cada convidado adicionado por uma edição posterior será. Um padrão em qualquer um dos dois faria todo o recurso silenciosamente não fazer nada. Aplicado manualmente ao cluster, pois o KamoInitializerService não é implantado.
· EmailService
Enviar o convite da reunião a lista de convidados implícita
Adicionar alguém à lista de convidados de um evento não lhes disse. Apenas um lembrete escreveu para um hóspede, e um lembrete chega a um membro no aplicativo e um endereço externo nunca — por isso um cliente convidado para uma reunião nunca foi contactado, e O colega ouviu falar dela quinze minutos antes de começar. EventInviteService é executado após os commits save, em um tópico assync. Após a commit porque um convite para uma reunião cuja gravação então regredida não pode ser recolhido; fora do thread porque depoisCommit ainda funciona antes da resposta escrito, e cinquenta conversas SMTP há cinquenta segundos de spinner em um salvar que já conseguiu. Duas rotas, e a diferença entre elas é porque são dois controles. E- mail é a única coisa que pode chegar a um endereço pertencente a ninguém aqui, e carrega o anexo ics — que é todo o mecanismo pelo qual uma reunião organizada em Kamo aterra no calendário de um convidado externo. Bate-papo chega a um colega no thread que eles já têm com o organizador, através do mesmo par MediaService AlertChatService usa e ignora um convidado externo por construção: um tópico de bate-papo é entre dois membros, por isso não há ninguém para falar. Quem é devido o que vem da fileira de convidados em vez de o que o salvar inserido. Nunca disse significa um convite, sempre que foram adicionados. Atrás SEQUÊNCIA significa uma atualização. Nível significa silêncio, então corrigir um erro de digitação não envia O quarto. atualizaçãoEvent levanta SEQUÊNCIA apenas quando a reunião em si se moveu — o descrição é deliberadamente para fora, porque é onde agendas ir e enviar cada convidado por linha treinaria o quarto para ignorar o correio que diz que o tempo mudou. O registro é escrito após uma rota ter sucesso, nunca antes: marcar otimistamente transformaria uma falha transiente SMTP em um convidado permanentemente acreditado ter Foi dito, que é o silêncio que existe para acabar. Também define ORGANIZER EMAIL, da caixa de correio a ser enviada. Nenhum evento feito através do calendário já carregou um, e um ics sem ele não pode ser respondeu — a "aceita" do hóspede não tem endereço para ir. Excluindo um evento que as pessoas convidadas agora retraem-no dos convidados que foram informados, e apenas aqueles.
· kamo-shared-library
Deixe um evento convidar seus convidados, e colocá-lo em seu calendário
Salvar um evento não disse a ninguém. A lista de convidados foi materializada e o público Guardados, e as pessoas nele não ouviram nada até que um aviso disparou, atinge um membro no aplicativo e atinge um endereço externo nunca. Para que um membro pudesse convidar um cliente para uma reunião, assistir o nome aparecer na lista de convidados, O cliente nunca seria informado. Nem um convidado podia ver a reunião. A visibilidade foi decidida pelo proprietário calendário sozinho, então um evento no calendário do organizador foi invisível para Todos convidados para isso. **************** teve um interruptor em Preferências do Calendário e uma coluna por trás dele desde aquela tela enviada, e Nada o leu. O evento carrega a escolha — seja para convidar, e por e-mail, chat ou ambos — porque uma edição seis semanas depois que adiciona um convidado tem que saber se este é um uma reunião que convida as pessoas. A fila de convidados carrega quando foi dito pela última vez e em que SEQUÊNCIA, que é o que faz "um convidado adicionado mais tarde recebe um convite para a mesma reunião" correta em qualquer número de edições: derivando de qualquer linhas uma gravação inserida é exatamente uma vez. Visibilidade ganha um ramo convidado-convidado através de uma adesão explícita à esquerda, fechado em que a preferência através de um ID de membro nada pode corresponder. Uma linha em vez de uma cópia por convidado: um RSVP, e um organizador movendo a reunião move-lo para todos. O calendário da organização não é de propriedade das sociedades de seguros e de resseguros. membro, então uma expressão do caminho implícito deixa cair todos os eventos da empresa compartilhada, o trap findBusyForMember já tem documentos.
· SecurityService
Um endereço de membro assina você em sua própria org, não cada org
Um membro que se inscreve com a caixa de correio de org sinalizado Primária em seu membro as configurações estavam sendo oferecidas a cada espaço de trabalho a que sua conta de usuário pertence. A endereço existe apenas dentro de uma organização — caixas de correio são únicas em (org id, e-mail), não globalmente — por isso, iniciar sessão com ele está a iniciar sessão HÁ. A outras áreas de trabalho da conta permanecem acessíveis pelo nome de usuário da própria conta ou E-mail, para o qual serve um identificador de conta. O identificador agora possui um escopo. Um identificador de conta o deixa em branco e nada muda; um membro da caixa de correio nomeia o(s) org(s) em que é Primário, e Esse conjunto é a única coisa que o sinal pode entrar. Limitar a lista que o catador desenha é cosmético por si só: a escolha volta de um navegador, e o membro geralmente é um membro genuíno do outro espaços de trabalho, então /session/select a re-prova de adesão passaria. A restrição portanto vive no token de seleção, em Redis, onde o chamador não pode chegar ele — e volta com o símbolo quando uma falha transitória o devolve, ou uma repetição Alargaram-se silenciosamente para uma entrada sem restrições. - PrimaryMailboxIdentityLookup: a pesquisa não vigiada retorna os ids org com o ID do utilizador. Ainda se recusa quando o endereço nomeia duas contas diferentes; uma A conta que a detém em dois dos seus próprios orgs oferece ambos, e nada mais. - CredencialResultar ganhos orgScope, vazio significado irrestrito. - loginSemoutAresolvedHost filtros enterableOrgs por ele (apenas removendo, assim uma associação inativa ainda cai), recusa uma dica ?org= fora dela em as palavras uma senha errada recebe, e não mais pré-seleciona um last org id o endereço não pode chegar. - OrgSelectTokenService armazena userId:orgIds; um ID de usuário nu de um pod mid O lançamento continua a descodificar, sem restrições. Falha numa restrição ilegível Fechado. - SessionSelectController recusa uma org 403 fora de token back — isso não é uma culpa que o membro não causou. O caminho do domínio personalizado está intocado: o host já nomeia uma org.
· SecurityService
Forçar a visibilidade da plataforma e editá-la
GET/PUT /api/security/reports/catalog, ambos fechados em MANAGEM REPORTS na plataforma coluna vertebral. A lista vem do REGIStry, não da tabela de sobreposição: um operador tem que ser capaz de restringir um relatório que ainda não tem linha, que é todos os relatórios até Alguém toca num. O próprio cheque entrou em ReportScopeResolver.mayRun, que o catálogo, o corredor, os catadores, o exportador, a lista de visualização salva e a varredura de agenda tudo Já cruzei. Adicioná-lo a cada um desses teria sido seis chances para um deles para discordar — e o que discordou seria o que mostrou um informar que a plataforma tinha escondido. Está na frente dos direitos do relatório, e Deus não o aprova. Vidro partido amplia o que um membro pode ver dentro de sua organização; esta é uma questão sobre que organizações um relatório existe para tudo, e um deus em um inquilino ainda está em Aquele inquilino. ReportVisibilidadeO serviço falha OPEN, que é o oposto de tudo o mais aqui e deliberada: uma tabela de sobreposição ilegível faria todos os relatórios sobre a plataforma desaparece, e os relatórios por baixo ainda estão fechados por seus próprios direitos e o seu próprio alcance. Perder esta tabela custa uma restrição, não uma divulgação. A definição de ALL ORGS exclui a linha em vez de armazenar o padrão. Um relatório restrito para seus horários existentes, e a execução é gravada FALHA com "o proprietário do programa já não tem acesso" — a mesma pista de auditoria que revoga Alguém tem razão, o que é a mesma coisa a acontecer.
· kamo-internal
Decida quem vê cada relatório, da administração da plataforma
Uma guia Relatórios na consola de Configuração, fechada por MANAGEM REPORTS no plataforma espinha — que é também, sem mais trabalho, uma linha nos direitos de gestão diálogo, uma vez que esse diálogo renderiza o catálogo do servidor. Cada relatório dos navios de plataforma, agrupados por pasta, cada um com um controle tridirecional: todas as orgs, apenas a organização da plataforma, ou apenas administradores de plataforma. Cada linha também mostra o direito que um membro ainda precisa, porque um operador restringindo um relatório deve ser capaz de ver que já está fechado — a maioria não precisa de nada aqui, e um console que escondia que convidava a restringir as coisas duas vezes. Poupa por fileira, optimicamente. Um controle de três vias que espera em uma viagem de ida e volta sente quebrado, e o único custo de estar errado é o botão estalando de volta com o Razão. A cópia é cuidadosa sobre dois portões que soam iguais. Este é o exterior: dentro uma organização um relatório ainda precisa do direito de governar seus dados, e pessoas ainda Ver apenas os registos que lhes são permitidos. A ajuda diz em voz alta que restringir um relatório pára qualquer programa já configurado para ele — comportamento correto, e o mínimo Consequências detectáveis no ecrã. Duas coisas o sistema de tipo e um guarda capturado em vez de revisão: Right ICON é um Registo exaustivo, de modo que a nova direita não poderia enviar sem um glifo; e a aba tinha nenhum link do menu Administração de Plataformas. Cada outra conta tem uma, então o guarda agora required it — uma aba acessível apenas por alguém que já sabe a faixa de tabulação é Há uma conta que ninguém encontra.
· kamo-internal
Dê à opção de faturamento de citações uma tela para viver
A definição de org-wide que decide se uma cotação é faturada cada período ou na íntegra na frente existe no OrgPOSConfig há algum tempo, e o endpoint que escreve Também tem. O único componente que o torna... é importado por nada, então nenhum membro jamais foi capaz de alcançá-lo: a configuração foi configurável apenas por postagem manual para a API. Configurações de comércio ganha uma guia de cobrança de citações. O painel carrega apenas a facturação escolha; a outra metade do componente órfão, o tipo de engajamento, é já servido por Markets & Fields nesta mesma página. A cópia é lida do seu espaço de nome da mensagem em vez de duplicado, uma vez que já está traduzido. Salvar envia os tipos de engajamento de volta exatamente como lido — o endpoint trata o lista activada como toda a verdade, por isso omitindo- a irá desactivar todas as Org tem.
· kamo-shared-library
Deixe a plataforma decidir quem pode ver cada relatório
GESTÃO REPORTS, anexado ao PlatformRightType, e uma linha de sobreposição RELATO CATALOG Por relatório que contenha um de ALL ORG, PLATFORM ORG ONLY ou PLATFORM ADMIN ONLY. Este é um portão mais grosso do que tudo no quadro e senta-se na frente dentre eles: um relatório próprio é exigido Direito decide o que um membro vê INSIDE um inquilino, e o âmbito da linha diminui ainda mais. Isto decide se o inquilino é oferecido o relatório em tudo, que é a decisão da plataforma em vez de da organização. Na coluna da plataforma deliberadamente. Um administrador de inquilinos pode editar o seu próprio modelos de segurança, então um RoleRightType aqui deixaria um cliente ampliar um relatório A plataforma estava restrita. As três configurações são condições INDEPENDENTES, não uma escada — um administrador de plataforma dentro de um inquilino satisfaz PLATFORM ADMIN ONLY e não PLATFORM ORG ONLY, e um O membro da plataforma org que não é administrador satisfaz o inverso. Lendo-os como um ranking iria silenciosamente ampliar um dos dois, e o alargamento Parece que o recurso está a funcionar. Um relatório sem linha é ALL ORGS, que é o que todos os relatórios fazem hoje — por isso tabela inicial vazia muda nada ao vivo, e restringir um relatório permanece um acto deliberado. Apendido no final do enum direito porque getSortOrder() é ordinal(): a a inserção renumeraria o console. As subvenções são armazenadas pelo nome, assim, anexando não muda nada já concedido.
· kamo-signer-monorepo
Mostrar o termo inteiro quando o vendedor fatura na frente
O cartão levou com a taxa recorrente independentemente, de modo que um cliente assinando um um valor mensal e um total separado abaixo dela. Onde a citação diz que o termo é devido na frente, que total é agora o O preço do cartão e as sub-linhas que o reafirmam são reduzidas. Lê uma base em falta como por período, então nada muda até que a API envie o Campo.
· kamo-internal
Lidere com todo o termo quando a conta é devida na frente
Um org que cobra o termo comprometido na assinatura viu a taxa mensal sobre o seu ter citações de três anos. A citação agora carrega a base em que foi levantada, e o cartão, o trilho ao vivo e a visualização de impressão cada lead com a figura que base realmente pede — todo o termo, com a menção «deve antes», ou um período Como antes. A escolha é um ajudante exportado, títuloAmount, em vez do mesmo ternário em três blocos JSX: estas superfícies não devem ser capazes de discordar sobre o que O número é o preço. O equivalente mensal permanece ao lado de qualquer forma, porque É o único número em que se comparam três anos e uma opção anual. Lê indefinido como o padrão por período, então isso renderiza exatamente como ele faz hoje até o Serviço de Segurança enviar o campo.
· InitializerService
Comércio quotes.billing basis
O instantâneo por citação da cotação da orgConversion Escolha de faturamento, então uma citação mantém os termos sob os quais foi levantada após um administrador alterar a configuração. Nulable — cada linha existente o precede, e null resolve para FIRST PERIOD PLUS SETUP, o comportamento em que essas aspas foram enviadas. @Order(0) pela razão usual: uma vez compartilhada-lib mapeia a coluna, qualquer corredor que carrega Citação emite-o em seu SELECT, e uma migração tardia nunca é executada.

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