Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-shared-library

    Adicionar uma verificação global de alias-uniqueness

    * * *************************************************************************************************************************** estava certo, enquanto um pseudônimo só foi resolvido como (security provider id, alias) — o par por trás de um <alias>.<domínio-mãe> Host. Dois orgs sob provedores diferentes poderiam compartilhar um sem ambiguidade. Uma organização pode agora ser nomeada diretamente por seu alias, com ?org=, e que a procura não tem qualquer fornecedor para explorar. Um apelido repetido faz o referência ambígua plataforma ampla, então OrgResolutionService recusa em vez de escolher uma — o que deixa ambas as organizações inalcançáveis por Alias. A propriedade já contém repetições (quatro orgs share "acme-corp", duas partes "kia-kaha"), razão pela qual o solucionador se recusa; esta é o que deixa de ser criado. excludeId permite que uma organização mantenha o seu próprio alias enquanto outros campos são salvo; passe nulo ao criar. 1597 testes passam.

  2. · KlusterServices

    Envia um relatório de erro para o código VS aberto do Sage

    Manipulador URI que cria uma conversa em uma janela Running e pré-preenchimento a entrada, que é a única maneira de chegar ao editor sábio já tem aberto em vez de começar uma segunda ao lado dela. O URI carrega um prompt e nada mais, então modelo e esforço passam codificadorProcessWrapper — um invólucro que mapeia uma enum validada para bandeiras fixas e nunca toma argv do arquivo, então um arquivo forjado pode escolher um modelo e nada mais. O URI pré-preenchimento, mas não submeter, por isso a submissão é um retorno sintético e o agente aguarda uma transcrição antes de relatar o sucesso. A agulha que procura é JSON-escapado: transcritos são JSONL, e pesquisa para newlines brutos marcaria cada mensagem entregue como falhada.

  3. · InitializerService

    Criar as tabelas de Bugs do Sistema

    Nenhuma restrição de verificação nas colunas ordinais: support ticket status check is o que acontece quando o Hibernate congela um com o tamanho de um enum e o enum então cresce, e SystemBugStatusType é esperado para crescer. Aplicado a yb-tserver:5433 à mão também, uma vez que este serviço não tem CI.

  4. · kamo-internal

    Gerencie um domínio personalizado a partir das configurações da empresa

    Um domínio costumava ser a porta para uma organização: DNS tinha que ser configurado antes de qualquer pessoa poder iniciar sessão, por isso o /setup/dns foi alcançado a partir do assistente de org-criação e de um banner de "necessidades de configuração" em vez do que das configurações. É opcional agora, por isso pertence ao resto do rotulagem branca. Adiciona uma seção de domínio personalizado para Configurações → Essential → Comportamento & Rotulagem, entre informações da empresa e Branding. Mostra o domínio atual da org, ou diz claramente que não há um, e abre /setup/dns para adicionar ou alterar Ele. O botão lê "Definir um domínio" ou "Gerenciar domínio" dependendo de Qual daqueles é. A cópia leva com o espaço de trabalho já sendo acessível em kamocrm.com, Então um proprietário que nunca quer o seu próprio endereço sabe que isso é algo que eles pode ignorar. Usa orgIdStr em vez de organiz.id: esse campo é um número JS e trunca int64 org ids passado MAX SAFE INTEGER, que abriria o DNS página para uma organização diferente. O botão está desativado até que ele resolve em vez de navegar com uma identificação errada. Cópia desembarcada no dicionário kamo-tradução primeiro (98ee7cb6) — CI clona-a unpined no tempo de construção da imagem, então app-first é uma compilação vermelha. 2921 testes e todos os 8 guardas passar, i18n incluído.

  5. · SecurityService

    Enviar a árvore no ponto final do app-catalog também

    Tipos de ramo → Aplicativos permitidos constrói seu editor de /features/app-catalog, não da lista de características do inquilino, então era a única superfície que podia não ver quais aplicativos são filhos dos quais. Um pai decide o que é as crianças podem até ser oferecidas, então o editor precisa da mesma forma. 947 testes em verde.

  6. · kamo-internal

    Renderize a árvore de aplicativos e confirme o que um switch-off pai leva

    As crianças agora se sentam sob seus pais na lista de aplicativos e recursos, cada um com O seu próprio interruptor. Aninhamento é expresso por ORDER mais um travessão em vez de um recipiente aninhado, assim que o cartão existente, movimento e código intocado — e uma criança cujo pai é filtrado da aba atual ainda renderiza no nível superior em vez de desaparecer. Dois comportamentos que a cascata tornou necessários: Alternando agora aplica toda a lista de recursos do servidor em vez de virar a linha clicada. Activar e desactivar uma criança o pai desliga todas as crianças, para que uma atualização local de uma linha a UI discordar com o servidor sobre tudo o resto a cascata Tocado. Ambos os terminais já devolveram a lista completa; nada de novo foi precisava do servidor. O velho caminho de fila única permanece como um recuo para um Segurança Serviço que não envia lista. Desligar um pai pede primeiro, nomeando os filhos que ele irá levar com Ele. Essa é uma ação maior do que a aparência de comutador. A árvore vem do endpoint de características em vez de um espelho TypeScript do ServiceType — aqueles já se afastaram do Java duas vezes, e o servidor é o único lugar que conhece o catálogo do operador. 203 arquivos de teste / 2921 testes verde, construir limpo.

  7. · InitializerService

    Preço das crianças do comércio e da EHR, com uma guarda total

    Nenhum mapa de preços tinha uma verificação de totalidade, e os dois modos de falha são diferente e ambos em silêncio. Desaparecido do CATALOG, um aplicativo não cai em lugar algum a matriz de preços. Desaparecido de TIERS, cada nível escreve is included=false — um DENIAL explícito que o direito falha-abrir faz NÃO resgate, porque falha-abertura só se aplica quando um plano não tem linha em tudo e esta escreve uma. Então um app esquecido é dado a todos ou cadeado para todos, e qual depende de um detalhe ninguém lembra-se na altura. Os cinco verticais de comércio sentam-se exactamente na pista do POS. Não estavam. Compras separadas antes da árvore de aplicações — qualquer coisa que uma org holding POS poderia fazer, poderia fazer — assim, colocá-los em qualquer outro lugar seria retroactivamente carga por capacidade que as pessoas já têm. Um teste pinos que para POS em vez do que para um literal, então mover POS move-os. A EHR é negociada pelas empresas como os sistemas de origem: sem preço de lista, Apenas planos aDUANEIROs, ausentes de cada nível. Onboarding um cliente PHI significa um BAA e uma revisão de conformidade, não um auto-serve checkout. 159 testes em verde.

  8. · kamo-marketing

    Pare de contar as visitas de um membro ao seu próprio link

    Um membro verificando se seu próprio link de rastreamento funciona é o mais comum primeiro visitar qualquer código já recebe, e é pior do que inútil: infla o número são medidos sobre, é indistinguível de uma perspectiva real no visitante gaveta, e deixa-os segurando um cookie visitante permanente para cada visita posterior Conta outra vez. Um código que mostra três visitas, todas a pessoa que o criou, é um registro de pagamento com uma mentira nele. Este site é a única origem que pode responder à pergunta — não tem sessão e nenhum membro, e o console interno não pode configurar um cookie em www. <apex> de interna.<apex>. O que cruza essa lacuna é um link: chegando com ?mrt self=1 mentas a exclusão, e a partir de então no navegador é excluído em cada visita se ou não existe o parâmetro. A guia de códigos de rastreamento interno aumenta o controle que produz essa ligação. Não cunhar não é suficiente, então uma visita excluída DELETES o visitante e fonte Biscoitos também. Um membro que visualizou seu link antes deste enviado, ou que optou fora em um navegador já contado, ainda está carregando um GUID — e os fogos de farol para qualquer um que tenha um. Sem a exclusão o opt-out só teria funcionado para pessoas que não precisavam dela. A exclusão não é deliberadamente em TRACKING COOKIES: esse conjunto é o que o cookie a política delete o controle desobstrui, e varrendo um opt-OUT com os identificadores o único visitante que pediu para não ser contado — no controle mais provável de ser pressionado por exatamente essa pessoa. cheque-desconta-cookie cresce de 50 verificações para 72, cobrindo o valor correspondente, o ortografias de parâmetros, exclusão de conjuntos de exclusão, e as duas fontes invariantes (middleware deve apagar a identidade, o farol deve sair localmente porque middleware roda em pedidos de documentos enquanto o beacon roda em cada lado do cliente navegação).

  9. · kamo-internal

    O widget de painel de vendas de afiliados

    Uma coluna de grade larga e duas fileiras de altura: as dez pessoas na organização trazendo a maioria através de seus links de rastreamento, sobre hoje, este mês, este ano ou todo o tempo, abrindo em visitantes este mês. A reordenação é o recurso. Todas as outras formas de mostrar quatro métricas sobre quatro windows é dezesseis listas separadas; esta é uma lista que se reorganiza. Linhas são chaveados por membro e carregam uma animação de layout, então alternando slides de categoria as mesmas pessoas passam umas pelas outras em vez de apagar o painel — e o gancho mantém cada placa que foi obtida, por isso a imprensa que desencadeia a animação tem dados para animar no mesmo quadro. Os selectores são armazenados contra o PROFILE do membro, não no localStorage, então o O quadro que alguém montou na secretária é o quadro que tem no portátil. Ambos os leitores desclassificam um valor não reconhecido para o padrão em vez de o recusarem — o servidor aplica a regra idêntica e ecoa de volta o que ele usou, então a A preferência escrita por uma compilação antiga nunca pode deixar um membro num painel em branco. Um membro fora dos dez primeiros começa sua própria linha fixada abaixo da lista, e um O membro sem nada ainda o consegue na posição zero. Um tabuleiro que só pode dizer "você é não nele" é a única coisa que um placar não deve fazer às pessoas que existe para motivar. Também aqui, porque é o mesmo problema do outro lado: um controle "preview" na aba Rastreamento de Códigos que abre um link SEM contar a visita. Verificação onde o seu próprio link terras é a primeira visita mais comum qualquer código já recebe, e a contagem coloca os próprios cliques do membro no registro em que são medidos. compilaçãoTracking PreviewLink é o link real mais o marcador o site de marketing lê - um contrato cross-repo, então o teste pinos o nome do parâmetro.

  10. · MediaService

    O objetivo do painel de avaliação de vendas de afiliados

    O que é isto? o top 10 da organização por uma métrica sobre uma janela, mais o próprio De pé quando não estão nele. Os balcões no WETCHING TRACKING CODES não podem confirmar isto: eles são de todos os tempos roll-ups sem dimensão de tempo, e não há nada em um total em execução que Diz quando tudo aconteceu. A verdade de janela está nas fileiras — ************* para aquisição, e cada conversão é própria * AT selo nos VISITORES. E é também por isso que All Time concorda com o código grade: mesmos dados, contados da mesma forma, não uma segunda contabilidade. Quatro decisões que valem a pena declarar: - Aquisição é datada pelo primeiro contato, não por atividade. Contando visitantes que estavam apenas ativos na janela iria re-creditar a mesma pessoa todos os meses, Então o trabalho feito uma vez seria superior ao trabalho feito agora, para sempre. - Conversões rank por atribuídoTrackingCodeld sozinho. Esta coluna congela o momento em que uma conta existe; últimoTrackingCodeId continua se movendo, e ranqueando-a deixaria um membro tomar a conversão fechada de outro com um clique extra. - A janela é cortada no calendário do MEMBRO e comparada em UTC. "Este mês" difere por até um dia dependendo de qual calendário é perguntado, e cada coluna neste esquema está um localDateTime livre de offset que significa UTC. - Todas as quatro métricas são calculadas por solicitação, então a categoria de comutação é um instante re-sort de linhas já na tela em vez de um spinner. Gated on AFFILIATE SCOREBOARD WIDGET e nada mais — ver o direito próprio Javadoc. Ele não compra nenhuma broca: não há ID de código, nenhum ID de visitante e nenhum membro parâmetro no endpoint, e todos os endpoints de análise by-id ainda passa MarketingTrackingScopeResolver inalterado. As quatro agregações usam a vírgula-join em vez de AJUNTAR..ON porque nenhum dos dois chave estrangeira é uma associação JPA e a forma vírgula analisa em cada Hibernate versão a frota funciona — MarketingTrackingHqlTest agora analisa todos os quatro contra o modelo de entidade real em 6.2.13, e fixa a aquisição, atribuição e locatário predicados que falham silenciosamente se eles derivam.

  11. · kamo-shared-library

    Adicione os direitos do widget do painel de vendas de afiliados

    Cinco direitos, 234-238, no grupo de comercialização e suspensos VER REFERRAL CODES: uma tabela de números de referência é dados de código de rastreamento, e um membro que pode não ver a aba de códigos de rastreamento não tem nenhum negócio nele. O widget direito — not view ALL MEMBER TRACKING — é o que divulga outro Os totais dos membros, e isso é deliberado. 200/201 portão a ANÁLISE: cujo visitantes, cujos endereços, cujas cronologias, resolveram por resolvedor de escopo. Um painel de pontuação revela um nome, uma classificação e um número, para Todos de uma vez. Requisitar o direito de análise em toda a ordem o deixaria visível apenas para os administradores que possuem um, que é um relatório em vez de um conselho. Deliberadamente NÃO sem sementes, pelo mesmo motivo 200 e 201 não são: semeadura seria publicar os totais de referência de cada titular existente para seus colegas na inicialização que o enviou, que é uma decisão de divulgação tomada por um destacamento em vez de por Um administrador. 229/166/32/31 sob a forma auditada — todas as cinco são crianças e VER REFERRAL CODES é por si só uma criança de VER MARKETING, assim nenhum balde raiz se move.

  12. · kamo-login

    Marca e escopo da tela de entrada com ?org=

    login.kamocrm.com é a tela de login para cada organização que não tem host de sua própria, de modo que o nome do host não pode dizer qual está entrando. ?org= does: nomeia a organização por id ou alias, seleciona o branding para pintar, e viaja com as credenciais como a organização que eles são Verificado. Uma dica, não uma credencial. A adesão é comprovada no servidor de qualquer forma, então nomear uma organização a que não pertence recebe a mesma recusa que nomear Um fictício. O pior que uma referência errada consegue é o logotipo errado em uma página pública. Branding vem do /org/public/{ref} do SecurityService, retransmitido então a regra sobre o que uma referência adivinho pode expor Fica num só lugar. A base temática segue então a organização em vez de o host, usado como indicado: soltando sua primeira etiqueta da forma como o caminho do host faz transformar acme.kamocrm.com em kamocrm.com e pintar um inquilino no A plataforma está a marcar. A primeira pintura utiliza necessariamente a marca do hospedeiro, porque a referência ainda não foi resolvido; KAMO THEME REAPLY repinta uma vez que tenha. Uma visita que nomes nenhuma organização limpa qualquer referência uma visita anterior gravada nesta aba, para que a tela da própria plataforma não mantenha logótipo.

  13. · SecurityService

    Serve a marca de uma org para uma tela sem sessão

    Login, registro e o lobby da reunião pintam as cores de uma organização antes de qualquer sessão existir. Eles sabiam qual dos hostname, que é exactamente o que uma organização sem um nome próprio não pode fornecer. GET /api/security/org/public/{ref} transforma uma referência explícita ?org= -- o id como dígitos, ou o pseudônimo -- em algo para pintar. APENAS Marcação: nome, logotipo, cores, locale, host tema. Não características, não direitos, não domínios, não membros. A primeira tentativa de reutilização do o registo de organização projectado e a catraca de avaliação recusada; corretamente -- pseudônimos são adicionáveis, então um registro completo por trás de um adivinho a referência enumera a configuração de cada organização. O que resta é o que qualquer um abrindo a página de login dessa organização já vê, e um nomes de teste os campos excluídos individualmente para colocar um de volta tem que ser deliberado. Só para leitura. O irmão /org/domain/{host} auto-provisions app features as a efeito colateral; um endpoint alcançável por suposições não deve escrever. Uma referência desconhecida 404s, e assim faz um alias ambíguo -- byPublicRef já se recusa a nomear várias orgs, e este pins que a recusa atinge o chamador como "não tal organização" em vez de como Marcas. O ouvinte volta para a plataforma. TemaDomain tem o mesmo valor que o shell e o uso do provisionador do tema, assim, uma tela pré-sessão lê a marca de uma org da pasta que foi realmente escrito para -- {alias}.kamocrm.com para uma org sem domínio. 947 testes passam.

  14. · MediaService

    Recusar gravação de reunião para um inquilino que lida com PHI

    A capacidade dividida feita ServiceType.MEET permitido — uma conferência ao vivo no Meet self-hosted nunca sai do cluster — enquanto MEETING RECORDING ficou bloqueado, porque este gasoduto posta toda a transcrição para o Roteador de IA multifornecedor e, em seguida, e-mails do resultado para cada participante incluindo hóspedes externos. Essa é uma cópia de terceiros irrevogável. O guard senta- se no funil privado de ambos os pontos de entrada públicos através, por isso ele se recusa antes de qualquer bytes alcançar MinIO, e novamente no topo da execuçãoResumoPipeline, que é pública e @Async. 200 testes verdes.

  15. · VOIPService

    A capacidade bloqueada agora supera a direita, e o modo deus

    PhiPlaybackAutor gated PHI call playback on View CALL LOGS. Isso foi... toda a verificação porque ServiceType.VOIP mapeou para o bloqueado Módulo VOIP RECORDING, então um inquilino PHI não poderia ter o sistema de telefone em Tudo e esta aula nunca correu para uma. A divisão de capacidade tornou o VOIP em si permitido — o tratamento de chamadas é in-cluster — enquanto VOIP RECORDING permanecia BLOCADO PENDING WORK por razões que não foram alteradas: a reprodução não realiza nenhuma verificação de depuração, transcrições passeio em metadados, e não há caminho de retenção ou eliminação. Deixado sozinho que teria sido um enfraquecimento reto: um inquilino PHI poderia permitir o sistema de telefone e, com um direito concedido, jogar tudo de volta. Assim, a capacidade física Guarda corre primeiro e sua recusa é final. É preciso não parâmetro de chamada, por isso, para um inquilino PHI nenhum direito o levanta — e nenhum faz uma sessão de deus ativo, que é a propriedade que mais importa. ********************** é agora **************************** Três testes codificaram o contrato antigo e são reescritos em vez de apagada, cada gravação por que a expectativa virou. A mensagem de recusa do correio de voz já não culpa o direito em falta, que geralmente já não é a razão. 152 testes em verde.

  16. · SecurityService

    Sirva a árvore de aplicativos e conserte o dispositivo automático não vigiado

    FeatureController agora envia pai/filho/pai em cada série aplicativo para que o cliente possa renderizar crianças aninhadas sob seus pais. Servido em vez de espelhado no TypeScript de propósito: os espelhos ServiceType já se afastou de Java duas vezes e uma segunda cópia da árvore ser mais uma coisa à deriva. Nenhuma nova forma de resposta foi necessária para a cascata — / habilitar e / desactivar já re-serialize toda a lista de recursos, então as mudanças no knock-on chegam sem o cliente reconciliar nada. Ambos os loops de auto- prestação agora ignoram um filho cujo pai a plataforma faz não oferecer, uma vez que habilitar as cascatas de feature o pai e não o faria ligar um pai que ninguém publicou. O loop do OrganizationController não tinha verificação do PHI enquanto o do FeatureController equivalente fez, num ponto público não autenticado. Para um inquilino PHI o primeiro módulo bloqueado lançado, a captura circundante registrou um aviso, e eficazCaracterísticas silenciosamente caiu para trás para linhas cruas sem modelo aplicado Projecção. Agora pede em vez de capturas, exatamente como as características A listagem faz. /api/segurança/ehr registado. Os prefixos de comércio permanecem mapeados para POS: O pai é o portão grosso certo e... já refina por mercado. 938 testes verdes.

  17. · kamo-internal

    Mirror os seis aplicativos de criança comércio, e parar os espelhos à deriva

    Ambos os espelhos TS agora são GENERADOS do ServiceType.java em vez de Mantido à mão. Eles se afastaram mal de Java e uns dos outros: já "integração RAG" e "cai de volta à organização-mãe SMTP" cópia que Java removido em 2026-08, POS marcado PLANNING in ServiceType.ts enquanto AppType.ts disse COMPLETED, e descrições diferentes para o mesmo app em cada arquivo. Vale a pena saber antes de confiar neles: displayName e descrição aqui estão LER POR NADA. Cada consumidor utiliza estas constantes apenas para fins de identidade — hasFeature () corresponde no id, appServiceIcons no nome. A cópia vem de GET /api/security/features, que honra PLATFORM APP CATALOG substitui Os espelhos não conseguem ver. As cordas são sincronizadas para que um leitor não seja enganado. e o cabeçalho do arquivo diz para não começar a renderizá-los. A árvore pai/filho não é deliberadamente espelhada — as características endpoint envia pai/filho/pai por aplicativo, e uma segunda cópia do A forma seria mais uma coisa à deriva. Além disso: um ícone por nova vertical em vez de pedir emprestado do pai storefront, e Organização getters, incluindo isEhr.

  18. · kamo-internal

    Uma barra de pergaminho, três vezes mais larga, em cada conversa

    A barra ao lado das mensagens foi 8px no chat membro e SMS, 6px em tickets de suporte e social, e no bate-papo de IA não foi nada: essa lista declarou `scrollbar-width' inline ao lado das suas regras ::-webkit-scrollbar, e desde o Chrome 121 uma `largura-scrollbar¿ não inicial ou `scrollbar-color` faz com que o navegador descarte todo o bloco -webkit - então ele pediu 12px e Tenho o cabo da plataforma. documentos globals.css que regra para o roller de página; nada Forçaram-no, e o bate-papo da IA estava no lado errado. Todos os cinco agora lêem uma constante CHAT SCROLLBAR: uma calha 24px — três vezes o chat do membro largura antiga — com o polegar inserido 6px cada lado por uma borda transparente, assim uma barra que largo ainda lê como um comprimido em um cocho em vez de uma laje soldada à borda da janela. A conversa da IA propriedades padrão mover para `@ supports not selector(::-webkit-scrollbar)`, que é onde globals.css coloca-os eo único lugar onde Firefox lê-los sem custar Chrome suas regras. O teste é de nível fonte porque o assunto é uma folha de estilo e o jsdom não implementa barras de rolagem: pins que nenhuma janela tamanho sua barra de um literal, e que nenhum deles define o padrão Propriedade desprotegida novamente.

  19. · InitializerService

    Estenda o avô de mercado para o backfill da árvore de aplicativos

    avô Existindo GatedMarkets já andou mercados ativos de cada org, resolveu getRequiredService () e ativou o aplicativo faltando — era apenas restrito a verticais isGated(), ou seja, MORTGAGE e PERSONAL LOANS. Agora. que cada CommerceType nomeia o seu próprio aplicativo infantil a restrição se foi, Assim, as mesmas sementes de laço RETALHO / ALUGAMENTO / SERVIÇO / SUBSCRIPÇÃO / Linhas de procedimentos. Não era necessária nova migração. Também sementes RETAIL para orgs que detêm POS sem nenhum mercado, que tinha o comércio de trabalho antes da árvore porque o varejo não precisava de nenhum aplicativo próprio. As orgs de nível superior não são mais ignoradas, e essa é a solução que importa. A isenção estava correcta quando só concedeu as duas aplicações de concessão de empréstimos — a O operador de plataforma org não deve adquirir silenciosamente a MLOS — mas está errado para a árvore de aplicativos, porque isAppEffectivelyEnabled requer um OrgFeature ROW e não tem isenção de nível superior. A primeira execução relatou sucesso enquanto deixando KamoCRM, que gere os mercados de RETAIL e SUBSCRIPTION activos, com nenhuma linha para qualquer um dos dois; teria perdido tanto de /commerce no próximo Segurança Serviço a postos. Apanhado por consulta à base de dados, não por leitura O tronco. habilitarFeature agora cascata uma criança para seu pai, de modo que semear uma criança também garante a linha POS. Correr contra prod 2026-08-24. Verificado: cada linha de comércio mercados ativo agora tem uma criança ativa OrgFeature linha, zero faltando.

  20. · SecurityService

    Verificar o direito a cada vertical, não apenas os dois fechados

    Cada CommerceType agora nomeia seu próprio aplicativo infantil em POS, de modo que o isGated () curto-circuito que acenou varejo, aluguel, serviço, assinaturas E a aquisição foi-se. Esses mercados são agora verificados contra a sua própria aplicação — que é o ponto: uma vertical pode ser vendida, e Desligado, sozinho. Depende do enchimento KamoInitializer ter funcionado.

  21. · kamo-internal

    A pesquisa da barra de ferramentas é um glifo que se abre em um campo

    O chat do membro carregava uma caixa de pesquisa permanente através do topo da janela — a largura do barra de ferramentas inteira, gasta em um controle que está vazio quase todo o tempo e usado em estouros. Ele é agora uma lupa de 28px que se abre no campo ao clicar, e a barra de ferramentas lê como quatro glifos e ar. A ideia é construída em torno: a lupa nunca se move e nunca é trocada. Colapso, a pílula é 28px e o ícone fica no seu centro, 14px da borda esquerda; aberta, a pílula tem 6px de preenchimento antes de um ícone de 16px, que coloca o centro do ícone em 14px novamente. Portanto, a pílula cresce fora de trás de um glifo que se mantém parado, e o controle lê como um objeto abrindo melhor do que dois estados a passar. A largura molas com um pouco de excesso no caminho aberto e nenhum no caminho fechado; o placeholder trilha o crescimento em 60ms para que o texto chegue em uma caixa que já tem espaço para isso; as molas de controle claro só uma vez que há algo para limpar. Fechamento sempre limpa a consulta, e o campo não pode ser colocado de lado enquanto ele mantém um: a ampliação colapsada ainda filtrando a conversa seria a janela mentindo sobre o que é Mostrando. Borrão deixa-o aberto com texto nele, e um clique perdido no glifo foca o campo em vez de descartar a busca. O movimento reduzido é honrado ao longo de todo, o glifo carrega o anel de foco para uma aba, bem como um clique, e o espaçador 50px que a caixa velha necessária foi com ele.

  22. · kamo-shared-library

    Cada nome vertical seu próprio aplicativo infantil

    requiredService torna-se total agora que cada vertical tem um aplicativo infantil sob ServiceType.POS, que exclui o "null significa POS sozinho é suficiente" Caso especial e isGated() com ele. Cada vertical agora pode ser ligado, licenciado e PHI-classificado de forma independente — que é o que permite a um médico prática usar comércio em tudo, uma vez que RETAIL permanece bloqueado para um inquilino PHI enquanto o resto do comércio não. SAÚDECARE(ServiceType.EHR) é o que faz o EHR aparecer em Quando o aplicativo está ligado, sem nenhum novo gating código: assertCommerceTypeAllowed, getAllowedCommerceTypes, the Endpoint de tipos permitidos atrás de ambos os catadores de mercado, E a lista de mercado filtra tudo já resolve através do getRequiredService(). NÃO EMPRESA até que o enchimento KamoInitializer tenha sido executado. assertCommerceTypePermitido reads getRequiredService() diretamente, assim que o momento SecurityService vê isso cada org com um mercado de varejo ou aluguel precisa de uma criança OrgFeature linha que ele faz Ainda não.

  23. · MediaService

    Deixe a configuração pública ser endereçada pelo org id, não apenas pela máquina

    O sidecar meet procura a configuração de uma org para decidir se um hóspede precisa de uma senha de reunião. Perguntado pelo nome da máquina, que no encontro compartilhado o host resolve para a organização da plataforma -- então um inquilino que requer senha teria tido essa exigência silenciosamente deixado cair para cada convidado unindo-se por ligação. Um convidado não tem sessão, então a única coisa que nomeia o inquilino é o quarto, que agora carrega um símbolo de org. Por conseguinte, ambos os objectivos públicos aceitam orgId explícito e voltar para o domínio pesquisa quando nenhum é dado, assim nada que pergunte pelo anfitrião hoje muda. Os IDs chegam como dígitos e são analisados como um longo: eles são passados 2^53, então um roteado através de um nome duplo uma organização diferente. Passam 200 testes.

  24. · kamo-shared-library

    O recurso Cascade ativa/desativa em toda a árvore de aplicativos

    Habilitar um filho habilita seu pai; desabilitar um pai desabilita cada filho; desabilitar o último filho desabilita o pai. Habilitando um pai deixa os filhos sozinhos, então um pai ligou deliberadamente sem As crianças ficam. A cascata é orientada para eventos e não há reconciliação deliberadamente Varrer. Isso é uma propriedade de segurança: um pai com nenhuma criança habilitada está desligada" invariante iria desligar o comércio para cada existente org no momento em que este enviado, porque não existem linhas de filhos até O KamoInitializer é executado. Uma criança afirma que o PHI guarda no módulo de seus pais, bem como o seu próprio, antes de qualquer escrita — caso contrário, uma criança permitida sob um pai bloqueado ou ficaria encalhado ou desligaria silenciosamente o pai bloqueado.

  25. · kamo-shared-library

    Adicionar PhiCapabilityGuard para verificação da capacidade de chamada-tempo

    PhiTenantGuard é executado em tempo realizável e em nenhum outro lugar — três chamadas sites, todos no serviço de recursos. Agora que a PhiModule tem capacidade, aplicação cujo núcleo é permitido pode ainda conter uma capacidade que não seja, e verificação de tempo de habilitação não pode ver a diferença. A mesma assinatura deliberada que PhiTenantGuard: uma função pura de (status, module) sem chamador, parâmetro direito ou modo deus, então há Nada para elevar. Classe simples em vez de um estereótipo — uma linguagem partilhada @Component precisando de um repositório não escaneado tem serviços de crash-looped quatro times; cada serviço consumidor declara seu próprio @Bean. OBSERVAÇÃO: A RECORDAÇÃO E A RECORDAÇÃO DE VOIP RECORDING estão agora isentas de qualquer ServiceType mas ainda não guardado em seus sites de chamadas — que é o próximo commit tocando MediaService e VOIPService. Isto é inerte na produção entretanto porque cada org atualmente tem manipulaPhi=false, mas a chamada Os locais devem aterrar antes de qualquer inquilino ser marcado.

  26. · kamo-shared-library

    Dividir PhiModule desde a aplicação em grão até à capacidade em grão

    POS mapeado para ECOMMERCE SYNC (BLOCKED NO BAA) e todo o comércio superfície pendura fora POS, assim que uma org com alçasPhi=verdade não poderia mudar comércio em tudo — nenhum mercado, nenhum / comércio, e nenhum vertical clínico Construído nele. Os dez adaptadores de sincronização de varejo são a coisa que deixa o fronteira, não a coluna comercial. POS agora mapeia os escopos COMMERCE CORE (permitido) e ECOMMERCE SYNC para baixo à criança RETAIL. A mesma correcção para MEET (conferência ao vivo vs. resumo pipeline que envia transcrições para inferência externa) e VOIP (telefonia vs gravações e transcrições armazenadas). REUNIÃO RECORDANDO e VOIP RECORDING agora não tem ServiceType em tudo: eles são capacidades Atingível apenas através de código, e o javadoc da PhiModule agora declara a regra que tal constante DEVE ser verificada pela PhiCapabilityGuard na sua chamada site. Reclassificar um aplicativo conforme permitido sem guardar a capacidade dentro dela lê-se como complacente enquanto força nada. AI ASSISTANTE e RAG SEARCH ficam deliberadamente bloqueados: KlusterServices tem incorporação, sussurro-asr e tradução, mas nenhuma LLM generativa, e RAG compartilha uma coleção Qdrant isolada por um filtro de carga útil. Dividindo Isso seria uma mudança de papel. Dois testes codificados o modelo de app-grained e são atualizados em vez de extended: PhiServiceTypeMapping O teste está bloqueado, e RecursoServicePhiGateTest, cujo exemplar bloqueado se move de VOIP para RETALHO — O VOIP já não é refusível no tempo de habilitação.

  27. · kamo-internal

    Terreno dentro de uma org recém-criada em vez de na configuração DNS

    Criando uma org roteou o criador para /setup/dns, e a razão foi real: entrar significava um redirecionamento OTK para interno.<novo domínio>, e um novo O org não tem DNS, então o hospedeiro estava inatingível. A configuração do DNS foi, portanto, o preço de abrir a coisa que você tinha acabado de fazer -- a parede exata esta O trabalho remove. A chamada de criação já devolve uma chave única; o assistente não tinha nenhum para gastá-lo. Ele agora gasta na origem atual, onde a sessão nomeia o org, então não há anfitrião para esperar. Um domínio ainda vale a pena ter e Configurações é onde ele vive agora: e Passo opcional em branco em vez de uma porta. Avisos de marca são realizada de qualquer forma, e se nenhuma chave voltar a existir, Assim, o mago pousa na vista da propriedade em vez de falhar. check-client-navigation corretamente marcou o window.location.href. Sua própria docstring nomes /validar com uma chave única como uma sessão-fronteira genuína saltar, então isso é permitido com essa razão em vez de trabalhar em torno -- o router manteria a sessão OLD do criador, que é precisamente o que está a ser substituído. 2857 testes e todos os 7 guardas passam.

  28. · kamo-shared-library

    Dar o ServiçoType uma árvore pai/filho de dois níveis

    Seis crianças do comércio em novos IDs 26-31, ligados a POS em um bloco estático em o padrão RoleRightType (uma constante de enum não pode referenciar outra de seus próprios argumentos construtor). MLOS e LOS reparem sem alterar o ID, porque ORG FEATURES persiste o id via ServiceTypeConverter e mover um seria reatribuir cada linha existente. A cópia de POS torna-se "Linhas de Negócios" agora que ele pais empréstimo e registros dos pacientes; o nome constante permanece POS porque **************************** persiste nomes como strings. Seu velho descrição move-se para RETAIL, onde é preciso e já verificado por ServiceTypeCustomerCopyTest. Novas constantes navio PLANNING / desactivado assim CaracterísticaController.list's o loop de auto-fornecimento não pode ligá-los para cada org. Mapeamento de Tipos do PhiService O teste falha por design até que o próximo commit mapeia o novas constantes; ambas as terras em um impulso.

  29. · kamo-internal

    Fazer uma org sem um domínio entrável

    Entrar numa org significava navegar para... Sem domínio esse URL renderizado como literal **************************** assim Enter foi desativado e proprietários foram encaminhados para /setup/dns em vez disso -- DNS era a porta, não uma Opção de etiqueta branca. O espaço de trabalho agora abre sobre a origem CURRENT quando não há um custom live host, e a sessão nomeia o org. Um inquilino com um domínio personalizado de trabalho Ainda abre no seu próprio hospedeiro, por isso nada muda para ninguém marcado com a etiqueta branca. Um domínio personalizado inacabado é tratado como nenhum domínio: esse HOST não pode servir ainda, que não é o mesmo que o org sendo inacessível. podeEnterOrg, portanto, chaves sobre a coisa que sempre foi o real pré-requisito -- uma associação utilizável -- em vez de em um domínio. necessidadesDomainSetup e orgStatus deliberadamente continuam relatando um inacabado domínio: não é mais uma barreira, mas ainda é uma excelente pessoa tarefa, e a vista da propriedade é onde isso é notado. A shell também teve que parar de perguntar ao hostname em que org está. A raiz layout despojou "interno". e olhou para o host, que responde "quem possui este nome" -- a mesma pergunta que "em que espaço de trabalho estou eu" apenas enquanto Cada inquilino tinha um anfitrião só para si. Na máquina da plataforma retorna o proprietário da plataforma, então um membro entrando em uma org sem domínio teria sido mostrado KamoCRM Branding da Inc., recursos e direitos. Agora pergunta a sessão primeiro via /api/org/current e volta para o host quando não houver sessão, que mantém a renderização de shell assinada. O cookie *** é o que faz que alcançável em tudo -- sessionStorage é invisível a um pedido de documento. 2857 testes e todos os 7 guiões de guarda passam.

  30. · SecurityService

    Deixar a shell obter a sua org da sessão, não a máquina

    o layout raiz do kamo-internal lê o cabeçalho Host, tira "interno". e obtém /org/domain/<that>. Em um anfitrião servindo um inquilino que é o mesmo pergunta como "que org sou eu"; em um anfitrião compartilhado é uma pergunta diferente com uma resposta errada - ele retorna quem possui o anfitrião, então um membro que entrou em uma org domainless seria entregue KamoCRM Inc. marca, características e bandeiras. Adiciona GET /api/security/org/current, retornando o registro projetado para organização da SESSÃO do chamador está em. O layout pode alcançá-lo porque ele já encaminha o cabeçalho Cookie e existe um cookie ***, por isso o servidor pode ver uma sessão mesmo que o sessionStorage seja invisível para um documento pedido. Não toma nenhum parâmetro, deliberadamente. O primeiro projecto aceitou um id ou alias E... corretamente recusou-a: essa forma torna enumerável o registro de cada org, adivinhando um nome falso, e pseudônimos são Adivinho. A sessão já sabe em que org está, então um parâmetro só poderia perguntar sobre um diferente. Com a sessão resolvida o ratchet passa por conta própria em vez de necessitar de uma entrada de base. A projeção é extraída em vez de copiada. Dois objetivos retornando dois formas do mesmo registro é a falha que vale a pena prevenir -- um cliente não sei qual é o seu lugar, e eles derivam pela primeira vez apenas um é actualizado. 928 testes passam.

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