Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· SecurityService
Iniciar uma sessão de codificador na nuvem e dizer quais terminais são
repositório como cwd) e responde `nuvem: true`; a máquina constrói o uma sessão de nuvem pode começar. A listagem de terminal carrega o agente `nuvem' marca através, para a nuvem no ícone da janela.
· KlusterServices
Iniciar uma sessão de codificador na nuvem a partir de uma verificação local
repositório. O pacote é forçado porque nossos controles remotos são Forgejo, não GitHub, e o ponto é o checkout neste disco. Sem -- permissão- modo (o CLI deixa cair as Permissões para uma sessão na nuvem) e não -- session-id ou recibo (a nuvem nomeia a sessão e não mantém nenhuma transcrição aqui). A sessão tmux está marcada @kamo cloud para que os relatórios de listagem do terminal `nuvem: true` e o console pode colocar uma nuvem no ícone da janela depois ~/Kamo/Projects, mais recentemente trabalhou em primeiro lugar, para o menu para escolher.
· kamo-internal
Os anexos estão acima do corpo, como os próprios arquivos
Um e-mail cujo único conteúdo era um PDF não tinha como abrir ou baixar o arquivo: o clipe de papel mostrado na linha da lista, e o painel de leitura mostrado Nada. EmailService tinha marcado o PDF inline porque o aplicativo Gmail deu um conteúdo-ID (fixado lá em 0de0823); o painel caiu cada linha parte sem perguntar se o corpo realmente o pintou. A regra agora vive em um lugar, listadosAtaques: uma parte fica fora de a lista somente quando o corpo HTML referencia seu cid:. O painel de leitura, a linha do tempo do lead e reencaminhando todos usá-lo, então uma mensagem enviada não mais tempo silenciosamente deixa cair esse arquivo. Não confia no servidor flag, que os corpos armazenados no navegador ainda carregam de antes da correção. O higienizador resolve CID: referências com a mesma normalização, então Qualquer coisa deixada fora da lista é sempre algo que o corpo mostra. A prateleira do anexo, primeira coisa sob o cabeçalho: - cada arquivo é um cartão mostrando o próprio arquivo: página um de um PDF (com sua contagem de página), a foto, ou o tipo de glifo em papel em branco - visualização de um clique em um visualizador de tela cheia: PDF através de pdf.js com zoom e um contador de páginas, imagens apto para tela com clique-para-zoom, vídeo e reprodutores de áudio, texto e CSV/TSV como uma tabela; as setas e um filmestrip mover entre arquivos - os downloads passam por busca, carregando o cabeçalho de sessão per-tab um nu <a download> nunca poderia, com um anel de progresso e um tique desenhado - "Download all" entrega todos os arquivos como um .zip escrito no navegador - teclado-primeiro, movimento reduzido honrado, machado limpo; duas cartas por linha num painel estreito
· kamo-shared-library
Arive como um segundo LOS externo, e uma costura provedor que é real
Arive é acessível apenas através de seu aplicativo só para convidados, então a conexão é Zapier em ambas as direções: comandos de posts Kamo (criar empréstimo, atualizar empréstimo fase, atualizar chumbo, converter chumbo) para por mercado Catch Hooks, e Arive gatilhos postar de volta para um sinal de entrada por conexão. O adaptador, campo mapper (três nomes Arive, lidos do aplicativo ao vivo), mapa de palco, criptografado os segredos e o log de atividade vivem em integrações. arive / integrations.los. O LeadService não executa mais o código MeridianLink para cada link. Empurra para O próprio link LosProviderAdapter; um provedor sem um é ignorado e registado em vez de receber um envelope SOAP. Inbound aplica-se fornecedor-neutro LosLeadPatch (contacto, endereço de correio, factos hipotecários, status) e atributo histórico ao provedor. O resolvedor procura o membro credenciais pelo provedor da conexão, e uma economia de mercado com um desconhecido O valor de MLOS é 400 em vez de um NO MLOS silencioso. As colunas que estes mapas já existem em Yugabyte (LosAriveSchemaMigration's as declarações foram aplicadas antes deste push).
· kamo-internal
Uma tela de lançamento projetada, na própria marca da organização
Abrindo um computador mostrou uma linha de texto simples em uma página branca, escrita diretamente na aba com «document.body.textContent». Por até noventa segundos — um currículo lê toda a imagem da memória do hóspede recuar de um volume replicado — essa frase foi toda a experiência, e ele lê como um navegador erro em vez de como o próprio software do membro. Uma página que parece quebrada é uma pessoa perto de quarenta segundos, que não cancela nada. É uma tela agora, construída para o cânone deste aplicativo em vez de inventado: a lavagem radial primária/secundária no branco, uma carta branca no raio 14 com --lev-hover, o gradiente herói 90deg como sua regra, ...casa tranquila, modo de luz. O logótipo da organização e o seu vídeo ao vivo. anel de contagem decrescente para a estimativa que o SERVER deu em vez de um palpite, e ambiente lava que prefere o movimento reduzido desliga completamente. Um fracasso agora tem uma saída. Ele mostra a sentença do próprio servidor — "nenhum nó tem atualmente 8 GiB livre" vale a pena ler — e uma tentativa novamente que executa o lançamento na mesma aba. O Tab mantém o Ícone da Organização, que é a outra metade disto. Navegando para o gateway entrega todo o documento para Guacamole, cujo próprio `<link rel="icon" href="images/logo-64.png">` então possui a guia: um membro abrindo o computador de sua empresa viu-o se transformar no logotipo de Guacamole. A sessão é emoldurada dentro desta página em vez, então o ícone eo título permanecem o org eo hand-over é um fade em vez de um flash branco. Guacamole não envia opções X-Frame nem um anteparo de quadros política — verificada, não assumida — e se o frame não puder ser criado a aba navega da forma como sempre fez, porque uma aba mais bonita não vale a pena um membro não chegar ao seu computador. Os ícones não são reconstruídos a partir de um caminho: eles são os elementos `<link>` DynamicMetaLoader já resolvido para esta organização, clonado. Re-derivando qual das duas pastas favicon que uma org usa seria uma segunda resposta que pode derivar da primeira. Cada string é uma chave, empurrada para o dicionário primeiro. A cópia é injectada em vez de ser examinada — a página é escrita em outra janela por uma função simples, onde `useTranslations` não pode correr — e não existe nenhum padrão em inglês, então um chamador que esquece não compila em vez de enviando inglês para cada local. Treze testes, incluindo que uma mensagem do servidor é escapada em vez de escrita como marcação.
· kamo-login
Aponte um membro que digitou seu e-mail de trabalho em seu pessoal
As palavras-password esquecidas vão para o endereço na conta de utilizador, normalmente uma pessoal, mas os membros digitam o endereço de trabalho que sua organização lhes deu. SecurityService agora reconhece um endereço de trabalho e respostas 409 WORK EMAIL com personalEmailHint, o endereço da conta mascarado. Nada é enviado. O assistente mostra que no lugar de "verifique sua caixa de entrada": o endereço que eles digitaram, a dica mascarada em uma linha própria, e o campo limpo, remarcado "Endereço de email pessoal", focado, com a dica como seu placeholder. A *** permanece resolvido, uma vez que o membro está a ser ajudado ao invés de Recusado. Introduzir o endereço pessoal continua na etapa de código como antes. /Recover's email passo mostra a mesma resposta que uma mensagem de informação em vez de "Falhou em enviar e-mail de recuperação".
· SecurityService
Um endereço de trabalho na senha esquecida pede a própria conta, mostrada mascarada
Os membros abrem sua conta com um endereço pessoal (gmail, yahoo) e são mais tarde dado um endereço de trabalho por sua organização, que é o que eles lembram e digite a palavra-passe esquecida. Isso só foi resolvido na máquina de login da sua própria org, e depois a carta foi para a caixa de entrada do trabalho. Para 20 dos membros do KamoCRM que é um KamoMail caixa de correio, que é lido dentro do produto eles acabaram de ser trancado Fora. Em qualquer outro host o endereço não correspondeu a ninguém, e a página disse "se isto e-mail está registrado, um link foi enviado" não tendo enviado nada. /api/Recover/email/initiate agora responde ao e-mail da conta exatamente como antes. Para qualquer outro endereço procura um endereço de trabalho de membro: primeiro na org cuja página de login esta é (a caixa de correio primária, em seguida, members.email), em seguida, em qualquer live org. Quando isso nomeia uma conta com um endereço próprio, nada é enviado. A resposta é um 409 com razão WORK EMAIL e pessoalEmailHint, o endereço da conta com cada personagem do nome entre o primeiro e o último estrelado, e o domínio completo. É um 409 de propósito: uma página de login que antecede o hint mostra `mensagem' para um não-2xx, e `mensagem' diz a mesma coisa em palavras. Uma conta sem endereço próprio ainda recebe a carta na caixa de entrada do trabalho no anfitrião da sua org, já que essa é a única caixa de entrada registada. A dica diz que um endereço pertence a alguém, que a resposta genérica nunca fez, então cada um é contado pelo CodeAtttemptLimiter: cinco por hora por endereço datilografado, mais o limite de endereço do chamador compartilhado com as verificações de código. Depois disso O pedido recebe um 429.
· EmailService
Mover o e-mail do sistema e o próprio domínio de envio da plataforma org para kamouniverse.com
platform.mail.domain agora é padrão para kamouniverse.com (valor de configuração, no mudança padrão do código) e portas de cada org do domínio não verificado retrocesso transacional De, como antes. Org de plataforma (kamocrm) utilizado para contornar essa propriedade e enviar como seu próprio OrgDomain verificado - agora PlatformOrgResolver força-o através do mesmo recuo, por isso ambos siga uma propriedade em vez de correr duas linhas diferentes. **************************** recebe a peça correspondente para membros: a caixa de correio primária da plataforma org recebe uma síntese entrada do kamouniverse.com pretendida (mesma caixa de correio, klusterservices mail/ aliases it back to the real kamocrm.com maildir) como o novo compositor padrão, enquanto o endereço original kamocrm.com permanece totalmente sendable - aditivo, não substituto. Todas as outras orgias não são afectadas. Correio a granel/campanha (bulk-email.platform-relay.*, hello.kamocrm.com) um caminho de código separado e intocado.
· KlusterServices
Adicione kamouniverse.com como um segundo domínio de email regular
Adiciona kamouniverse.com ao domínio virtual alias postfix com um regexp local-part-preservando assim qualquer endereço nele pousa no caixa de correio kamocrm.com idêntica (sem configuração por usuário, funciona para caixas de correio criado mais tarde também), e para relé sender domínios para que os membros/serviços possam enviar como kamouniverse.com através deste relé. rspamd obtém o seu próprio DKIM keypair e bloco de assinatura para o domínio (e- mail do seletor, publicado como **************************** Olá.kamocrm.com / postfix-bulk são intocada.
· KlusterServices
Encaminhar kamouniverse.com para kamocrm.com
DNS para o ápice e www agora ponto no IP público do k1m1. Adicionar um redirecionar rotaRegex em ambos os pontos de entrada (301, caminho/pergunta preservada, Caminho de desafio ACME excluído em :80) e ambos os hospedeiros em STATIC DOMAINS do auto-cert para que eles obtenham certificados apesar de não serem domínio org registrado, o mesmo que sign.pink.
· kamo-internal
Selecione- tudo/deseleccionar- tudo para o filtro de lead estados, padrão para todos
A dimensão dos estados do painel de audiência da campanha e gatilho de gotejamento filtro de lead não mostrou nada marcado por padrão, mesmo que um lista já significa "todos os estados" no fio — o mesmo "sem restrição" mercado de convenções/vendor/vendor-produto já utilizado. Que fez o o selecionador parece estar filtrando para zero leads ao invés de para todos, e não deu nenhuma maneira rápida de começar de "todos os estados" ou "nenhum" antes de escolher alguns. leadAudienceFilter.ts ganha effectiveStates() (o que mostrar verificado: o lista armazenada, ou cada estado quando está desativada) e comStates() (o que para store back: o conjunto completo colapsa para indefinido ao invés de explícito lista de 50 códigos, por isso uma pista com um estado em branco no ficheiro ainda corresponde "cada estado" a forma como uma ausência real de um filtro faz — um explícito Na lista não). Ambos os painéis recebem um "Select all" / "Desselect all" par ao lado do catador de estados apenas; as outras três dimensões são inalterado, uma vez que o seu enquadramento vazio por defeito já estava correcto.
· kamo-internal
Passos DKIM e DMARC, então o e-mail que enviamos para uma org está totalmente autenticado
Dois novos passos após o SPF existente, escrito para um proprietário não técnico da mesma forma que o SpfCard já é — linguagem simples, uma caixa "por que isso importa", e nunca pedir uma mudança que não precisamos. - DkimCard: SecurityService gera uma chave de assinatura para o domínio o primeiro tempo isso carrega, em seguida, lê se o registro TXT é publicado. Apenas dois. estados reais (nada publicado ainda, ou algo publicado que não uma vez que um registro DKIM nunca pode colidir com nada do cliente já tem — ao contrário do SPF, não há distinção "adicionar vs. editar". - DmarcCard: somente leitura. Porque o correio do Kamo usa sempre o domínio da org como tanto remetente de envelopes quanto visível De, a verificação de alinhamento da DMARC já está satisfeito uma vez que o SPF é feito, qualquer que seja a política que o org tenha escolhido — por isso esta apenas mostra o que é publicado (ou sugere um ponto de partida), nunca pede Uma mudança. Ambas as novas... as proxies seguem o spf/route.ts existentes exatamente — nenhum catch-all aqui, então um caminho sem o seu próprio arquivo de rota 404s antes de chegar ao SecurityService. DnsSetupStudio agora mostra 6 passos em vez de 4; numeração de passos ao longo actualizados tanto para os processos relativos à propriedade como para os processos relativos à não propriedade. Depende do dicionário de tradução-kamo 2f143f94 (o setup.dns.studio.dkim.* e setup.dns.studio.dmarc.* copy) e os endpoints consultivos do serviço de segurança.
· EmailService
DKIM-signal transactional mail enviado como domínio próprio de uma org
Uma vez que o SecurityService confirma o registro DKIM de um domínio é publicado (org domains.dkim verified), reset de senha, convites e outros cartas transacionais enviadas como NoReply@ {org domain} agora carregam um DKIM assinatura juntamente com a autorização SPF existente — reutilizando o mesmo O correio de campanha do DkimSigner já está assinado, não modificado. EmailSmtpService recebe uma nova sobrecarga de envio(...) tomando um Assinante de Mensagens, espelhando o caminho assinado do sendVia: saveChanges() uma vez, sinal, em seguida, um Transporte gerenciado manualmente, desde o Transport.send() estático usado por todas as outras chamadas send() saveChanges() novamente internamente e Novo ID de mensagem após a assinatura ter sido computada sobre a antiga. A existente 6-arg send(...) agora delegados para ele com um assinante nulo, então cada outro chamador é byte-for-byte inalterado. * *************portas em DkimVerificado especificamente (não apenas uma chave existente) e só se aplica quando já estamos o envio como domínio próprio da org — nunca sob o domínio da plataforma, e nunca na plataforma-endereço repetir quando o próprio envio da org falha. Depende da biblioteca 5de57705 e da DKIM do serviço de segurança Endpoint consultivo, que gera e verifica a chave que este lê.
· SecurityService
Objetivos consultivos DKIM e DMARC para /setup/dns
Adiciona dois endpoints ao lado do SPF um existente, de modo transacional de uma org e- mail (senha resets, convites, notificações) pode ter uma assinatura DKIM e o proprietário pode ver sua postura DMARC: - GET /api/security/domínios/{id}/dkim — gera a chave DKIM de um domínio primeira vez que é pedido (nunca regenerado depois, desde a troca chave quebraria a verificação de qualquer coisa já assinada com o antigo), verifica se o registro TXT é publicado, e armazena o veredicto sobre **************** a mesma forma de estado verificado spf verified já usa. - Só para leitura. Cada mensagem que o Kamo envia como NoReply@{domínio} usa esse domínio como remetente de envelopes e visível De, assim que a verificação de alinhamento da DMARC já está satisfeita uma vez que o SPF é feito, qualquer política que o cliente tenha escolhido. Isto apenas relata o que é publicado (ou sugere um registro inicial quando nada é) — nunca pergunta Para variar, já que Kamo nunca precisa de um. **************************** espelho SpfAdvisoryService's shape (um inspect puro (), uma costura createLookup () para testes) e DkimAutorization Serviço espelhos SpfAutorizationService (persiste no veredicto, deixa-o sozinho em um pesquisa falhada). DkimDomainRepository é um simples JpaRepository da mesma forma SpfDomainRepository é, pela mesma razão: ele envia com uma redistribuição em vez de uma versão bibliotecária compartilhada. Depende do kamo-shared-library 5de57705 (novos campos dkim * do OrgDomain).
· kamo-shared-library
Campos de chaves DKIM para o correio transacional de um domínio org
Acrescenta: para org domínios, espelhando o par spf verified/spf checked at já lá — assim um domínio pode segurar um keypair DKIM gerado e se seu registro TXT tem foi confirmado, a mesma forma de estado verificado SPF já usa.
· EmailService
Estreite o público líder de uma campanha e gatilhos de gotejamento pelo mercado, fornecedor, produto e estado
A caixa "All Leads" do editor de campanha e o filtro de chumbo do gatilho de gotejamento podem só corresponde a cada pista que o remetente pode ver, sem nenhuma forma de atingir um mercado, fornecedor, produto do fornecedor ou estado - a grade /leades teve todos os quatro por semanas. - Novo LeadAudienceFilter **************************** roscado através de CampaignAudienceInput -> AudienceDefinition -> AudienceQueries.shape()'s Caso LEADS, espelhando os predicados do LeadGridSpecifications directamente ou através de um produto do fornecedor; o estado é propriedade com conhecimento de hipotecas vs. correio, O escopo foi alterado. /estimar e /browse tomar os mesmos quatro filtros que params de consulta separados por vírgulas, de modo que a contagem ao vivo do editor reflete uma conta não salva filtro também. - TriggerConfig ganha um campo de estados ao lado do mercado existenteIds/vendorIds/ productIds; DripTriggerMatcher.leadFilter () verifica. O caminho do evento-payload nunca transportado vendedor ou estado, então o estado é resolvido ao vivo por lead (DripContacts. stateOfLead), da mesma forma que o vendedor já era do produto fornecedor. Cada site de chamada existente 3/6/8-arg continua a compilar inalterado através adicionado sobrecargas e construtores secundários; somente AudienceGatherer, que sempre threads de uma definição de filtro através, precisava de seus sites de chamada atualizados.
· kamo-internal
******************* filtros em pistas de campanha e gatilhos de gotejamento
A fonte de audiência do editor de campanha "Todos os leads" não tinha como restringir que alcançou além do escopo de visibilidade. Adiciona um painel de filtro (Mercado -> Fabricante -> Cascata do Produto Fornecedor, mais uma dimensão independente do Estado) que reduz a contagem ao vivo, a visualização da navegação e o público salvo, threaded através da campanhaAudienceApi estimativa / chamadas de navegação. O filtro de chumbo do gatilho de gotejamento já tinha o Market/Vendor/Produto cascata; adiciona a mesma dimensão de Estado lá, ao lado do existente Três, não em cascata.
· KlusterServices
A máquina de computadores de uma org recebe um certificado e uma rota
computadores é um pseudônimo padrão agora — cada org-branco-label é dito para apontar um em Kamo em /setup/dns, a forma como ele aponta atender e assinar — então duas coisas tiveram que segui-lo ou o O recorde resolveria e não faria nada. Um certificado. computadores junta SUBDOMAINS, que é a lista por-org deste serviço problemas de. Sem ele o host de uma org tem DNS e nenhum TLS, que é um aviso do navegador sobre a sua marca em vez de uma secretária de trabalho. Uma via. O gateway combinou Host(`computers.kamocrm.com`) e nada mais, então uma org poderia adicionar o disco, assistir o estúdio de instalação ficar verde e ainda pousar em algum lugar que Não é este portal. As novas rotas usam HostRegexp(`^computadores[.].+$`), a mesma forma E o riacho. rotas já utilizadas. Ingressos SEPARATOS em vez de alargar as regras existentes, e a razão é TLS. As rotas da plataforma têm um nome secreto explícito, que é o único certificado que pode ser nomeado antes do tempo; um inquilino chega quando seu domínio vai ao vivo. Alargamento regras teriam feito uma resposta secreta nomeada para cada domínio de inquilino — um certificado aviso sobre a marca de outra pessoa, que é pior do que nenhuma rota em tudo porque parece Como se Kamo tivesse errado o domínio deles. As rotas de locação deixam a TLS para a loja da Traefik e SNI, como meet faz, e sentar-se em menor prioridade para computadores. kamocrm.com mantém o seu próprio. Servindo cada org de um regex mãos ninguém nada: a conexão é escolhida pela token assinado, nunca pelo nome da máquina, e um token ments um computador para um membro para uma sessão.
· kamo-internal
Os computadores gravam no estúdio DNS
Mais uma carta em /setup/dns, então uma org configurando seu domínio é informada sobre o host Os computadores hospedados estão abertos. Sem ela uma org poderia seguir a página à letra, terminar com cada cartão verde, e ainda ter um computador que produz uma aba do navegador que abre e fecha — o link é construído a partir de computadores. host sem registro falha antes de qualquer pedido sair da máquina. Obrigatório como qualquer outro rótulo, em vez de apenas para orgs segurando o aplicativo. O registro é o que faz o aplicativo funcionar no dia em que ele é ligado, e uma org enviado de volta para o seu registrar meses depois para um registro é uma org cujo primeiro computador não abre. A etiqueta tem que combinar exatamente com KnownAliases no serviço de segurança — DomainAliasContractTest pins-los, porque uma etiqueta que o estúdio requer mas check-dns nunca emite um status para não relata como faltando: a busca falta cai para "pendente" e o cartão fica em "esperar DNS" para sempre, seja qual for a zona do cliente.
· SecurityService
Computadores é um alias padrão, e o link usa o próprio org
Cada org branco aponta um conjunto fixo de rótulos em Kamo e computadores não era um deles, assim que uma org poderia seguir /setup/dns à letra e ainda ter um hospedado Computador que ninguém podia abrir. O link é construído a partir dessa máquina; um link para uma máquina sem registro é uma guia do navegador que abre e fecha antes de qualquer pedido sair da máquina, sem nada registado em Kamo e no próprio computador saudável e acordado Por todo o lado. Quatro listas se movem juntas ou não. DomainAliasContractTest afirma exatamente igualdade entre conhecidosAliases, SSL PROBE LABELS e seu próprio espelho do estúdio catálogo, porque o fracasso que eles guardam contra é silencioso: uma etiqueta que o estúdio requer mas verifica-dns nunca emite um status para quedas até "pendentes", então o cartão fica em "esperar o DNS" para sempre, não importa o que a zona do cliente diga. Isso é o que Aconteceu com a mídia por quatro meses em 2026. Obrigatório como qualquer outro rótulo, em vez de apenas para orgs segurando o aplicativo. O registro é o que faz os computadores hospedados trabalhar no dia em que ele é ligado, e uma org enviado de volta para seu registro meses depois, para um registro, é uma org cujo primeiro computador não Abra. A linha agora usa o próprio host do ORG buildLink leva a organização e constrói https://computadores.<seu domínio ao vivo>, via OrgLinkHosts.liveRootDomain — o mesmo auxiliar que o portal mutuário usa, e para o mesma razão: um domínio configurado mas ainda não verificado enviaria um membro para um host que não resolve. Ao contrário do portal mutuário, voltar para o host plataforma é CORRECT aqui em vez do que uma ligação quebrada. Um portal serve a cada inquilino e a máquina é escolhida pelo token assinado, nunca pelo nome da máquina, por isso uma org sem domínio ao vivo ainda recebe um trabalho computador — simplesmente abre em computadores. kamocrm.com até que seu próprio domínio esteja vivo.
· SecurityService
Listar apenas os passos iniciais de uma organização
Uma organização cujo modelo de segurança corrige todas as respostas produto um membro pode mudar, uma faixa etária para cada tipo de membro) contou com nove passos. Tinha de "salvar" um nono passo vazio antes do seu assistente preso como terminado (notificado 2026-09-21, Gnosia). OrgSetupStepAplicabilidade decide quais passos se aplicam, a partir do modelo aplicado. Hoje só a Compliance pode desistir. Os passos do resumo, etapasConcluídas e totalSteps, o completoNa trava e lastStep todos passam por cima dessa lista. A passo gravado antes de parar de aplicar permanece armazenado, mas não é contado, então ele volta marcado se o modelo alguma vez oferece uma escolha lá novamente. Se a modelo não pode ser lido, o passo é mostrado: um passo mostrado pode ser ignorado, a Oculto não pode ser alcançado. A regra espelha o getComplianceStepUi do kamo-internal (o que o passo desenha); Os dois estão presos na mesma mesa. AplicadoModelController agora lê políticas de produtos e faixas etárias através dos mesmos ajudantes, por isso o ponto final E a regra não se pode separar.
· kamo-internal
Um passo que a organização não é solicitada não é mostrado ou contado
Uma organização cujo modelo de segurança corrige todas as respostas produto um membro pode mudar, uma faixa etária para cada tipo de membro) mostrou um nono passo dizendo que não havia nada para configurar. Tinha que "salvar" esse passo antes do assistente contar como terminado (notificado 2026-09-21). SecurityService agora lista apenas os passos que uma organização é solicitada, e o página segue essa lista: o trilho, a contagem "x de y", onde o assistente retoma, o que vem após o último passo, e um `?step=` nomear um passo que Não está na lista. Uma carga útil sem lista utilizável ainda lê como cada passo, então um Resposta mal formada nunca deixa um assistente vazio. complianceStepAplies.test.ts pinos getComplianceStepUi para o mesmo caso tabela como SegurançaOrgSetupStepAplicabilityTest. O servidor decide se o passo está listado, e esta função decide o que ele desenha, então o Dois têm de concordar.
· KlusterServices
Emissão e espelhar o certificado para computers.kamocrm.com
Abrindo um computador hospedado produziu uma guia do navegador que apareceu e desapareceu. A link de lançamento está correto e assim é o token: SecurityService compila ************* de KAMO HC GUAC BASE URL, cujo por omissão é essa máquina. A máquina não tem certificado e nenhum registro A, então a aba morre antes de qualquer coisa em Kamo ouvir sobre ele — nenhum pedido chega Traefik, nada é Registrado, e o computador fica desperto e saudável o tempo todo. O hc-https IngressRoute já referencia tls-computers-kamocrm-com pelo nome; o segredo simplesmente nunca foi cunhada, porque este serviço questões para uma lista explícita e computador.kamocrm.com não estava nele. desktop.kamocrm.com está listado para exatamente o mesma razão — nada atinge qualquer um dos hospedeiros até que alguém seja entregue um link, então nem é Descobriu nos registos do Traefik como um domínio de inquilino. Também espelhado em 'computadores hospedados', porque o IngressRoute vive lá e referencia o segredo pelo nome em seu próprio espaço de nomes. Isto não menta nada até que o disco A exista. O loop salta uma máquina cujo DNS não resolver, porque um desafio HTTP-01 contra ele não pode ser respondido: (DNS não resolve; HTTP-01 falharia) computers.kamocrm.com precisa do mesmo registro que kamocrm.com e desktop.kamocrm.com, 47.181.8.84. Essa parte está no provedor de DNS, não aqui. Uma vez. resolve, este problema dentro de um laço e espelha o segredo sem mais nenhuma ação.
· kamo-internal
A lista de mensagens nomeia um lead ou contato, não seu endereço
Uma linha foi dirigida pelo nome do remetente, ou pela parte do endereço antes do @ quando não havia nenhum, então uma pista que escreveu como "jlrivera1984" acima de "jlrivera1984@mail.example". O chip de cabeçalho Já preferia o nome do nosso próprio registo, mas a lista nunca perguntou. VirtualMessageList agora resolve os correspondentes de cada página carregada ao lado seus avatars (um pedido em lote, em cache por endereço para a sessão) e lidera a linha com o nome no registro: um colega, um contato salvo, ou - novo com EmailService d3d6e03 - um lead. O monograma escreve o mesmo nome. O cartão correspondente rotula um líder "Lead" e oferece "View lead".
· kamo-internal
A lista de mensagens nomeia um lead ou contato, não seu endereço
Uma linha foi dirigida pelo nome do remetente, ou pela parte do endereço antes do @ quando não havia nenhum, então uma pista que escreveu como "rodarisdolgovanton" acima de "rodarisdolgovanton@gmail.com". O chip de cabeçalho Já preferia o nome do nosso próprio registo, mas a lista nunca perguntou. VirtualMessageList agora resolve os correspondentes de cada página carregada ao lado seus avatars (um pedido em lote, em cache por endereço para a sessão) e lidera a linha com o nome no registro: um colega, um contato salvo, ou - novo com EmailService d3d6e03 - um lead. O monograma escreve o mesmo nome. O cartão correspondente rotula um líder "Lead" e oferece "View lead".
· EmailService
Um líder que escreve é nomeado pelo correspondente
A lista de caixas de correio encabeçava a mensagem de um líder com a parte do seu endereço antes do @ ("jlrivera1984") quando seu cliente de e-mail não enviou nenhuma exibição nome, embora a org os mantenha como um chumbo ("Jordan Rivera"). O resolvedor conhecia os colegas e salvou apenas contatos. CorrespondenteResolver ganha um quarto nível, LEAD (após CONTACTO), com o nome do lead, empresa e leadId (uma string: uids pass MAX SAFE INTEGER). LeadCorrespondents responde apenas o que a grade de leads mostraria ao leitor: VER LEADS necessários, um lead não atribuído precisa VER UNASSIGNED LEADS (falhas fechado em free-for-all produtos), sem telefones (informações de contato direitos que este cartão não verifica), e cada lead nomeado é escrito para phi access log como uma LIST lida em uma org PHI, via AudiencePhiAudit. leads não tinham índice no endereço: a pesquisa percorreu todos os ~790k do Org do repórter lidera em 9.8 s. ix leades org email lower on (org id HASH, lower(trim(email))) está em db/leaders-email-lookup-index.sql e foi APLIED by Hand como o proprietário antes desta implantação; o plano genérico agora Toma 3.4 ms.
· EmailService
Um líder que escreve é nomeado pelo correspondente
A lista de caixas de correio encabeçava a mensagem de um líder com a parte do seu endereço antes do @ ("rodarisdolgovanton") quando seu cliente de e-mail não enviou nenhuma exibição nome, embora o org os mantém como um chumbo ("Anton Dolgov"). O resolvedor conhecia os colegas e salvou apenas contatos. CorrespondenteResolver ganha um quarto nível, LEAD (após CONTACTO), com o nome do lead, empresa e leadId (uma string: uids pass MAX SAFE INTEGER). LeadCorrespondents responde apenas o que a grade de leads mostraria ao leitor: VER LEADS necessários, um lead não atribuído precisa VER UNASSIGNED LEADS (falhas fechado em free-for-all produtos), sem telefones (informações de contato direitos que este cartão não verifica), e cada lead nomeado é escrito para phi access log como uma LIST lida em uma org PHI, via AudiencePhiAudit. leads não tinham índice no endereço: a pesquisa percorreu todos os ~790k do Org do repórter lidera em 9.8 s. ix leades org email lower on (org id HASH, lower(trim(email))) está em db/leaders-email-lookup-index.sql e foi APLIED by Hand como o proprietário antes desta implantação; o plano genérico agora Toma 3.4 ms.
· kamo-internal
O membro que causou uma notificação abre o seu cartão a partir dele
"Dana Reyes te entregou", "Sincronização Semanal · Dana Reyes", um cartão de bate-papo não lido cujo corpo é o remetente: EmailService (29cb21e) agora envia actorMemberId (como texto) e actorName, o nome exactamente como o título ou corpo o soletra, e o sino desenha esse trecho de texto como o nome do membro. - NotificaçãoO texto retira o nome do título (ou seja, o corpo) uma vez, na sua primeira ocorrência; Tudo o resto é como antes. Usado pelo brinde, a linha do histórico (clique emToggles={false}: a linha abre a notificação) e a janela de detalhes. - Um cartão de brinde abre ao nível do convés. MemberHoverCard/Nome de Membro tome zIndex, e a torrada passa NOTIFICAÇÃO DECK Z (1500, agora uma constante com a própria plataforma). No cartão 1305. aberto por baixo do convés de onde veio; no mesmo nível que pinta sobre ele (é anexado ao <body> posterior) e ainda sob suas próprias dicas (aprovou ainda mais tarde). - UnreadChatNotifier envia o remetente como ator, nunca para Exec2Exec. O servidor também mantém um apenas da própria organização do interlocutor. - Spec "As built": o parágrafo de notificações. Verificado: tsc; eslint (nada em linhas alteradas); os 19 guardas do acordo de recompra; vitest (notificações, membros, lib, configurações, chat; os poucos que cronometraram sob o passe de carga da máquina por conta própria); e uma Sonda cromada que o nome permanece em linha no título de duas linhas da torrada e na linha de história a elipse ainda se mantém.
· kamo-shared-library
A aplicação Notas é "Notas e Listas de Verificação"
O aplicativo Notas possui checklists também desde 2026-09-23 (passos marcados como eles são feitos, um passo que espera até os passos antes de ser terminado, uma lista de verificação agendada no calendário), e é chamado "Notas & Checklists" em qualquer lugar que é nomeado. ServiceType.NOTES carrega o novo nome de exibição e uma descrição que cobre ambos, que é o que Apps & Características, Tipos de Branch e o assistente org-criar mostrar uma vez SecurityService é reconstruído. Apenas cópia: o nome e o ID constantes estão inalterados, por isso não existe uma concessão armazenada ou movimentos da linha do recurso. Tipo de ServiçoCustomerCopy Teste fixa o nome e que o descrição menciona checklists.
· MediaService
O convite Hold'em eo lembrete reunião dizer de quem eles são
MembroNotificaçãoClient.raise ganha uma sobrecarga carregando atorMembroId/atorName (o id enviado como texto; a assinatura antiga está inalterada e não envia nenhuma). HoldemInviteMessenger passa o revendedor ("Dana Reyes te tratou em"; MeetingReminderSweep passa o criador da reunião quando o título os nomeia ("Semanly sync · Dana Reyes"), lendo o criador uma vez ao invés de dentro title(). EmailService mantém o par e kamo-internal desenha esse nome como cartão do membro. Um EmailService mais antigo do que os campos Ignora-os. Testes: HoldemInviteMessengerTest (+1; suas verificações de elevação levam a nova sobrecarga), EncontroReminderActorTest (2), ******************* (2). Suíte completa: 1060 execução, 0 falhas.

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