Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-internal

    Reatribuir a massa selecionada leva a um membro da equipe

    A grade já tinha caixas de seleção múltiplas, mas nada a ver com uma seleção. Verificando as linhas agora revela uma ação Reatribuir ao lado das outras ações de liderança, fechado REASSIGN LEADS MANUALMENTE (o servidor verifica de novo; isto é apenas conveniência). Usa checkRight em vez de checkRole para que o modo deus corresponda ao hasGod da infra- estrutura bypass — checkRole não faz bypass e iria divergir para usuários de deus. A janela escolhe um membro de destino por pesquisa, toma uma nota opcional, e diz na frente que o membro será enviado por e-mail, uma vez que esse é o ponto do recurso. Indigo/azul em vez de laranja/rosa quente: este é um ação administrativa deliberada em massa, não uma transferência de chamada urgente. A caixa de seleção do cabeçalho seleciona cada linha na grade do lado do cliente — milhares para um grande org — por isso o limite de 250 é aplicado aqui também. Caso contrário, o título "selecionar tudo e reatribuir" o fluxo falharia no servidor apenas após o usuário ter preencheu todo o diálogo, com um erro não traduzido. A seleção é limpa através de selectedIdsRef antes de recarregar: loadLeads re-seleciona o que quer que o ref detém, assim deixando-o povoado iria re-verificar o As filas moveram-se. A mensagem do resultado é composta em vez de uma cadeia se, porque um lote pode ser parcial e não notificado e a cadeia notificada apenas O primeiro.

  2. · SecurityService

    Endpoint de reatribuição em massa, fechado em REASSIGN LEADS MANUALY

    POST **************** move um lote de pistas para uma equipa membro e e-mails que membro uma vez para todo o lote. Autorização usa REASSIGN LEADS MANUALLY (149) — o direito nomeado para exatamente Isto. Isso é mais rigoroso do que o caminho de liderança única em PUT /leades/{id}, que verifica ASSIGN LEADS; reatribuir uma centena de leads é um raio de explosão diferente da reatribuição de um, e os dois direitos existem para que possam ser concedidos separadamente. O nível de visibilidade não atribuído também é aplicado aqui. A atribuição é uma visibilidade subsídio: uma vez que um lead é atribuído ao chamador ele lê como "atribuído a mim", que levanta o 403 não atribuído e salta a máscara de contato-info. Sem isto verificar um chamador segurando 149 mas não View UNASSIGNED LEADS poderia auto-atribuir leads A grelha esconde-se deles e lava-os para serem totalmente legíveis. Saltado leads report NOT FOUND — coincidindo com o que sua própria grade mostra — então a resposta não pode enumerar pistas escondidas ou estrangeiras. O lote não é deliberadamente tudo-ou-nada: cada atribuiçãoLead funciona em seu próprio transação e um ID ruim torna-se um skip, porque descartar nove bons As reatribuições ao longo do décimo é pior do que relatar qual não tomou. Capturei a 250 por chamada para amarrar tanto as fechaduras da linha como o ventilador em tempo real. O notificador resolve os seus dados numa transacção curta através de um feijão separado e envia depois, então uma chamada de saída com um tempo limite de leitura 30s nunca pinos um Ligação CRDB. Cruzar o limite do feijão é também o que faz @Transactional aplicar-se em tudo — auto-invocação seria silenciosamente executado sem transação e LAZY associação de usuários jogaria.

  3. · EmailService

    Variáveis de amostra para o modelo LEADS ASSIGNED

    Sem um caso aqui, a Previsão do editor de modelos de administrador renderiza o novo modelo com cada espaço em branco, que lê como um modelo quebrado em vez de um um não preenchido. notesBlock é HTML pré- renderizado porque o renderizador não tem condicional — o remetente colapsa-o para "" quando não há nota.

  4. · kamo-shared-library

    Modelo de e- mail LEADS ASSIGNED; harden atribuLead para uso em massa

    atribuirLead tinha zero chamadas e nunca tinha executado em produção. Antes de fiar o a rota de reatribuição de massa para ele, dar-lhe as garantias de que o caminho precisa: - tomar orgId e verificar ambos o chumbo eo novo atribuído pertencem a ele, então um reatribuição não pode chegar entre inquilinos (referido como "não encontrado" em vez de "proibido" para que o erro não possa ser usado para sondar IDs de lead estrangeiros) - bloquear a linha com findByUidForUpdate: uma reatribuição manual e um concorrente pool-aceitar o alvo o mesmo chumbo e de outra forma iria deixar em um perdido atualizar - limpar as bandeiras da piscina, espelhando CreditLeadAssignmentService. Um chumbo marcado para auto-atribuição caso contrário permanece no pool após ser reivindicado à mão e é retirado de debaixo do seu novo proprietário - publicar chat roteamento, como updateLead já faz, então o mutuário está aberto ao vivo chat segue a liderança em vez de ficar com o oficial anterior Adicione também o modelo canônico LEADS ASSIGNED. A chave deve estar em CANONICAL KEYS ou nunca pode ser semeado e nunca pode se auto-curar, e cada envio retorna um 404 permanente.

  5. · kamo-shared-library

    Adicionar GESTÃO ORG BRANDO (174)

    Org branding endpoints (logos, cores, fundos, provisionamento tema) foram apenas proprietário-ou-deus, não deixando nenhuma maneira de delegar a marca sem entregar A propriedade da org. Adiciona o direito delegível; os cheques do proprietário permanecem como um Subvenção implícita para que os proprietários existentes continuem a trabalhar sem que lhe seja atribuído.

  6. · kamo-internal

    Matrizes de elegibilidade do autor do painel de catálogo

    Sem uma matriz cobrindo a ocupação e finalidade de um cenário, o preço retorna NO COVERAGE — Assim, antes disso, apenas uma compra de uma residência primária poderia ser pago. Os autores da forma a matriz e suas células para um tipo limite escolhido, ocupação e finalidade, com célula add/remove linhas, ao lado do formulário de política de bloqueio no mesmo painel. Deixando o produto unset autores uma matriz por produto ativo do investidor, porque o escopo do produto da matriz não é NULL e não pode expressar "todos os produtos" como uma única linha.

  7. · SecurityService

    Reencaminhar eligibilidade-matriz de autoria; reconstruir pega o currículo SUSPENDED

    Relés POST ****************** através da escrita existente Ajudante, então um mordomo autores matrizes apenas para o seu próprio inquilino. Este impulso também se reconstrui contra a mudança de lib que permite um empréstimo SUSPENDED retomar. Kamo-shared-library não tem nenhum CI próprio — cada serviço clona e constrói-o a partir da fonte — para que a correção alcance este serviço apenas quando este serviço for reconstruído.

  8. · kamo-internal

    Reconstruir o estúdio agente como um espaço de trabalho de largura total

    Remover a tampa de largura não foi a correção; o layout em si precisava ser projetado para o espaço em vez de tolerado nele. O estúdio está agora três zonas lado a lado: - **Outline rail** — as seções, com a atual destacada enquanto você rola (IntersectionObserver, de topo para que uma seção se torne atual quando seu cabeçalho chega onde realmente está a atenção). Seções escritas à mão são marcadas, assim um a parte manuscrita é mais tarde encontrada sem abrir cada um. - **Editor** — as seções em si, colocando em tantas colunas como o viewport detém em vez de uma fita estreita. - ** Conversa ao vivo** — uma coluna real em uma tela larga, não uma tira que colapsa o conteúdo quando aberto. Este é o ciclo de edição e observação do estúdio. existe para: mudar uma instrução, ver a mudança de resposta, sem navegar. Uma instância TestDrivePanel, reposicionada em vez de duplicada — montando-a duas vezes começariam duas sessões descartadas. Abaixo xl ele cai sob o editor como uma linha de largura total em vez de apertar uma terceira coluna num ecrã sem espaço para um, e o trilho se esconde inteiramente em telas pequenas.

  9. · kamo-internal

    Políticas de bloqueio do autor — sem um, nenhuma taxa pode ser bloqueada em tudo

    TaxaCommitmentService recusa um bloqueio sempre que o resultado a preços carrega não lockPolicyVersionId ("a versão de política de bloqueio é necessária"), e um resultado só carrega um se O investidor tem uma versão de política de bloqueio publicada. Nenhuma UI poderia publicar um, então taxa de bloqueio foi inacessível para cada inquilino — enquanto o endpoint em si já foi construído, org-gated e sobressaindo corretamente. Só faltava o método do cliente e este formulário. A forma toma os períodos de bloqueio oferecidos como uma lista ordenada porque o primeiro torna-se o padrão, então ele deliberadamente não os classifica; entradas que não são um todo positivo número de dias são deixados cair em vez de enviados como um termo de bloqueio ruim.

  10. · kamo-internal

    Mostrar como cada agente está indo

    Adiciona uma seção de performance ao topo do estúdio de agentes: conversas, como muitas vezes uma pessoa assumiu o controle e o que desencadeou, resultados de divulgação, e custo. Escrito para que nenhuma figura possa enganar: - Zero é a palavra "Nenhum", nunca 0. - Um compartilhamento renderiza apenas quando existe um denominador; caso contrário 'Sem conversas' Ainda para comparar. Não existem percentagens de denominador zero. - Quando nada no período carregou um preço, nenhum valor de custo é mostrado em tudo - Apenas uma explicação de que os preços foram estabelecidos após o tráfego acontecer. Parcial a cobertura mostra o valor mais quantas respostas faltam. - A extensão suprimida é apresentada como a característica que é: Propósito - eles são seu registro de porque alguém não foi contactado.' - Códigos de enum desconhecidos degradam-se para texto legível em vez de um caminho chave cru. As colunas de mensagem por versão e de transferência foram removidas: a API não agrega eles por versão, então essas células teriam transformado um 0 fabricado como se foram medidos. Conversas só responder para que a tabela é - que salvou cópia manuseada que tráfego. Dobrado no documento de estúdio de rolagem existente em vez de uma nova aba, e mantido fora da lista de agentes, onde um 0 nu contra cada agente seria o exato A leitura errada é evitada.

  11. · AIService

    Cartão de pontuação por agente

    O que cada agente realmente fez: conversas, quantas vezes uma pessoa teve que assumir e porquê, resultados de divulgação, incluindo os que se retiveram, e quanto custa. Cada número é um que os dados podem realmente suportar. Três coisas são deliberadamente Não aqui. - ** Nenhum total de fichas.** Eles são reais no caminho da sincronização e fabricados no streaming um (content.length()/4), então qualquer total é parte inventada. Respostas de custo a mesma pergunta honestamente, porque é nulo em vez de adivinhado onde o O preço é desconhecido. - Sem resolução ou taxa de deflexão. Nada observa se uma conversa terminou bem, e "não houve entrega" não é evidência de sucesso. - ** Nenhuma mensagem por versão ou conta de transferência.** Não são agregados por versão, e emitindo 0 para eles seria uma fabricação renderizada como um medição - a falha precisa que esta tela existe para evitar. Custo carrega uma bandeira rastreada explícita e um valor nulo em vez de 0 quando nada na janela era preço, por isso uma org cujo tráfego antecede preços vê 'não gravado' em vez de um confiante $0.00. preçodCalls é a autoridade em vez do que a soma, de modo que um verdadeiro zero de preços chamadas de nível livre ainda lê como Rastreado. Transcrição prosa is gated on VEZ SALES AGENT@ netcabo. pt conta - o resumo do modelo de um visitante específico é conteúdo de conversa, não um métrica. Agentes sem tráfego retornam uma placa de pontuação vazia estruturalmente completa: um agente ausente da lista lê como um erro, um agente presente com zeros lê como a verdade. parseHandoffArguments agora é compartilhado com o caminho de bate-papo em vez de reimplementado, assim, a coerção de razões inventadas para OUTROS não pode derivar entre os dois. A suite tem 150 testes, verde.

  12. · kamo-shared-library

    Consultas agregadas agrupadas para a placa de pontuação do agente

    Doze @Query agregados entre sessões, mensagens, registros de uso e saída toca, por isso uma placa de pontuação é um punhado de consultas agrupadas em vez de carregar linhas na memória. Duas propriedades são aplicadas nos predicados ao invés de deixar para os chamados: - ** é As sessões de teste são excluídas na própria consulta.** Num jovem agente, as próprias unidades de teste do autor seriam a maioria dos dados, e um esquece de filtrar produz números que parecem reais e não são. - ** conta(custoEstimado) conta apenas os custos NÃO-NULL. ** Isso é o que permite o scorecard distinguir 'nada foi preço' de ' seu custo zero' - colapso que colocaria um $0.00 confiante na frente de uma org cujo tráfego simplesmente Predates preço. Os toques de saída são agrupados por decisão em vez de filtrados para envios. A recusas são a metade mais interessante: um agente cujos toques são quase todos SUPRESSED QUIET HOURS é mal configurado, e isso é invisível se os decodificadores são descartado.

  13. · kamo-internal

    Editar o que cada modelo custa

    Adiciona edição de preço por modelo para a tela de configuração do provedor. Os preços são semeados de Preço de lista de cada vendedor onde o conhecemos, e em branco onde não - um custo em branco significa simplesmente não é rastreado para esse modelo, o que é melhor do que um número que está confiantemente errado. Cópia diz às pessoas para verificar as figuras semeadas contra sua própria conta em vez de apresentando-os como autoritários. Corrige um erro de exibição capturado na revisão: o trim- zero teria renderizado um preço de 10 como 1. Agora tira zeros apenas após o ponto decimal.

  14. · AIService

    Modele catálogo de preços, escreva caminho e backfill

    Contabilidade de custos nunca poderia funcionar: AiModel tem colunas de preço, AiModelController lê-los e ChatOrquestrationService lê-los para calcular custoEstimate - mas Nada as escreveu em nenhum lugar. Os modelos são criados apenas pela descoberta do fornecedor, e nenhuma API de provedor retorna preços. 140 modelos, 0 preço, nenhum caminho pelo qual pode mudar. As colunas eram estruturalmente inalcançáveis. Três partes: - ModelPricingCatalog seeds fornecedor LIST prices at discovery, combined on a identificador normalizado com uma regra de prefixo limite hífen para que o gpt-4 nunca possa alegar gpt-4o. Modelos sem bate- papo (TTS, incorporações, em tempo real) são rejeitados por reutilizando a verificação modalidade existente - eles cobram uma folha diferente. - Endpoint PATCH + UI para que uma org possa corrigir ou limpar um preço. Org-scoped exatamente como o DELETE existente. - Backfill preenche apenas colunas NULL, por coluna de forma independente, e nunca sobrescreve o que uma org tem definido - caso contrário, tornar os preços editáveis seria um Mentira. Idempotente, e embrulhado para que a contabilidade de custos nunca pode bloquear o arranque. **Um modelo que não estamos confiantes sobre obter NO preço em vez de um adivinhado.** GPT-5, o3, a maioria Mistral, DeepSeek, xAI, Cohere e Meta estão deliberadamente em branco; OpenRouter e HuggingFace nunca combinam por design, já que cobram suas próprias taxas e herdar preços a montante seria um palpite. Um preço errado produz um figura em forma de fatura que é confiantemente errado - o mesmo custo razão ainda é não calculado no caminho de transmissão, onde as contagens de fichas são fabricadas. A conversão para a coluna per-1k usa RoundingMode. Não-necessário: um preço precisando de mais de 6 lançamentos decimais na classe-init em vez de silenciosamente armazenar um razão e é deixado em branco. A suite tem 145 testes, verde.

  15. · kamo-internal

    Mostrar o contexto de transferência de IA para o agente assumir

    Muda um evento do sistema AI HANDOFF como um cartão com a razão, o resumo da IA, e uma transcrição dobrável da conversa até agora - assim que o mutuário faz não têm de se explicar novamente à pessoa que atende. Os três estados degradados são explícitos e visíveis em vez de silenciosos: transcrição Indisponível, transcrito truncado e carga útil despojada em trânsito. Um agente deve Nunca se deixe de acreditar que eles têm o contexto completo quando não têm. Visitante e agente compartilham um tópico STOMP, para que o quadro ao vivo chegue editado (o O resumo da IA é a sua avaliação privada do visitante e não pode navegador). Em vez de dizer ao agente para recarregar, o cartão re-ler a linha completa uma vez a partir do seu próprio endpoint autenticado. A releitura é validada antes de ser adoptado - uma resposta que voltou ainda desprovida é rejeitada em vez de utilizada, por isso, o aviso só pode ser claro quando o contexto foi verdadeiramente ganho. Qualquer falha Volta para a mensagem de recarga.

  16. · APIService

    Proxy a rota AI->human handoff pública

    Adiciona-se ao POST. próximo ao MediaService ao lado de seu createSupportSession irmão. Sem isso, o recurso de entrega estava morto na chegada: Endpoint do MediaService requer X-Internal-Auth, X-Public-Chat-Org-Id e X-Public-Chat-Key-Hash, que só este gateway injeta, então o widget POST 404'd aqui e nunca Acertei-lhe. Carrega a mesma guarda condicional *** que o createSupportSession. Correções de transferência o caminho de criação de sessão completa, então proxy-lo desnudo teria deixado um Rota de criação de bilhetes que ultrapassa a prova de trabalho que o seu irmão impõe.

  17. · MediaService

    Levar a conversa da IA para o fio humano na entrega

    Cria ou reutiliza a sessão de suporte, copia a transcrição de IA como um sistema evento, roteia, e diz ao visitante honestamente o que acontece a seguir. Confidencialidade é dividida pelo público, que o primeiro passo foi para trás. A O resumo e a razão da IADetail são a sua avaliação privada do visitante, toda a carga estava atingindo o próprio navegador do visitante através de duas portas REST e O quadro STOMP enquanto o agente não viu nada. A Redação agora se aplica a cada caminho voltado para o visitante; a linha persistente mantém a carga útil completa para o agente. chat.session.{guid} é um único tópico em que ambas as audiências subscrevem, por isso o frame é cortado para o que o visitante pode ver e o agente UI re-ler a linha completa A partir do seu próprio ponto final autenticado. Idempotência é chaveada em aiSessionGuid, org-scoped, e verificada ANTES de criar Qualquer coisa. Teclando-o na sessão e verificando após a criação - o óbvio forma - é inútil precisamente quando importa: uma repetição que perdeu sua sessão token sempre passa a verificação e produz um ticket duplicado e um segundo agente Page. transcriçãoAttached agora relata o que realmente aconteceu. Já tinha voltado. verdade mesmo quando a escrita tinha silenciosamente falhou, o que é o pior possível combinação: o visitante é informado de que seu contexto se deparou, o tópico do agente é vazio, e nenhuma das partes sabe. Copy-on-handoff, não migração: AI vira ficar onde a análise lê-los.

  18. · AIService

    Transferência iniciada pelo agente para um ser humano, com contexto

    A IA não podia pedir previamente uma pessoa: as regras de escalada atingiram o modelo através do prompt compilado, mas não havia sinal legível por máquina de volta, então o modelo só poderia dizer que iria buscar alguém e nada aconteceu. - Ferramenta kamo request human sintética, descrita a partir do próprio agente habilitado títulos de regra de escalada para que o modelo veja condições de gatilho idênticas no prompt e a ferramenta. Interceptado antes da expedição MCP - é um sinal, não um chamada real ferramenta - e a linha TOOL persiste é o que torna a razão durável e analytics-pronto com zero novas colunas. - Anexado SOMENTE quando o canal realmente tem suporte ao vivo ativado. Entrega de uma AI-somente org uma ferramenta que promete um humano que nunca pode chegar é pior do que não tendo nenhuma ferramenta: o widget não tem guia de suporte, então o sinal é deixado cair e o O visitante fica à espera de alguém que nunca viria. - Novo endpoint interno devolve a razão da transferência, o resumo da IA para quem assume o comando, e a transcrição do usuário/assistente. TOOL e linhas do SISTEMA são excluído - o humano precisa da conversa, não da maquinaria. - razãoDetalhes e resumo são deliberadamente retidos do navegador do visitante: são a avaliação privada do modelo do visitante. Apenas {requerido, razão} cruza para o cliente; MediaService obtém o servidor- lado restante. - As voltas de IA nunca são movidas ou apagadas. AiChatMessage permanece o sistema de análise O lado humano recebe uma cópia. Também corrige um erro latente encontrado no caminho: o bloco de ferramentas ignorou o modelo supportsToolUse flag, então um modelo explicitamente sinalizado como não suportando ferramentas foi Ainda os enviou. 31 de 140 modelos são marcados como false; ai mcp server configs é O raio de explosão de hoje é zero. A suite tem 124 testes, verde.

  19. · MediaService

    Aceitar o acesso autorizado pelo agente a uma linha aberta de mutuário

    O agente da AIService chama. Sem ele o todo caminho de saída terminado em um 404 gravado - o portão autorizou um toque, o mensagem foi composta, e não havia onde colocá-lo. Propriedade permanece dividida deliberadamente: AIService decide se um toque pode sair e escreve o texto, este serviço coloca-o. A escrever estas linhas do AIService seria propriedade da transcrição para o serviço que não possui nem o chat mesas nem a tomada. Duas coisas que não vai fazer. Ela nunca cria uma conversação - pode continuar um tópico que o visitante já abriu, nunca conjure uma janela de bate-papo para alguém que Não. E nunca cruza orgs: um UID de chumbo resolvendo para outro bilhete de org colocaria o agente de uma org dentro da conversa de outra org. verificou contra o ticket em vez de confiar no ouvinte. A mensagem é atribuída ao membro da sessão, exatamente como uma mensagem de visitante NÃO para o oficial humano designado. Renderizando uma mensagem composta por IA como embora uma pessoa nomeada, licenciada escreveu-o é o que uma regra de AI-divulgação existe para prevenir. Assegura que a assinatura precede a publicação do NATS porque o consumidor utiliza Entregar a Política. Novo: publicar primeiro persistiria a mensagem, mas a soltaria de Todos os clientes ligados. Retorna o ID e o messageId para o registro de auditoria de divulgação referencia a mensagem em vez do tópico. 404 quando não existe um fio aberto, Assim, o chamador registra uma falha limpa em vez de assumir a entrega.

  20. · AIService

    Ativadores de saída, agendador e despacho de web-chat

    Faz com que a espinha da extensão dispare. O portão, estado de contacto, consentimento e a auditoria já existia; nada causou um toque a ser avaliado. - NATS habilitado para AIService através de seu próprio k8s/configmap.yaml (cada serviço Java) carrega sua própria dir k8s; KlusterServices detém apenas infra cluster). JetStream é deliberadamente deixado OFF: NatsConfig afirma seu próprio fator de replicação contra streams providos centralmente na inicialização, e AIService só se inscreve no núcleo NATS e nada publica, permitindo-lhe que não ganhasse nada e arriscasse um segundo serviço afirmando contagem de réplicas. - AgentOutboundConsumer assina security.leades.rt> e consome SOMENTE LEAD CREED/LEAD UPDAted. O editor também emite eventos de bloqueio e estatísticas - procurando uma pessoa porque um colega pegou uma trava de edição em seu registro Não é defensável. Os documentos chegam como cordas do editor, por isso são analisados como texto ao invés de asLong(). - AgentOutboundScheduler avalia gatilhos de programação sob quatro limites: conjunto org derivado de agentes que realmente têm alcance sobre (capped), um deslizamento fino corte de tempo para que o custo rastreie a nova taxa de chumbo em vez de leads totais, uma linha por tick tampa, e um amortecedor de reavaliação para que um cruzamento de chumbo durante horas tranquilas seja novamente testado uma vez em vez de cada tique durante um dia. - Texto das sementes de composiçãoConcluída com o prompt compilado da versão PUBLICADA, Nunca o rascunho, mais a intenção do gatilho. Registros de falha de composição FALHA; Não há nenhuma mensagem de emergência enlatada. - WEB CHAT despacho continua uma thread existente apenas. A divulgação pode retomar conversação que o visitante abriu; pode não invocar uma janela de chat para alguém que nunca abriu uma. - SMS/EMAIL/SOCIAL DM rota para um registro FAILED nomeando a conformidade em falta encanamento, então uma org apontando um gatilho para SMS vê por que no log de divulgação imediatamente em vez de nada acontecer. 23 novos testes; suite é 68 e verde.

  21. · kamo-internal

    Editor de texto obrigatório; dedupe configurações gerais do IA; corrige a opção do modelo

    Adiciona um editor para o texto de abertura/fechamento exigido por org - o compilador e colunas existiam, mas nada as podia definir, então a capacidade estava morta. Copiar afirma claramente que os agentes não o podem remover e que a poupança o aplica a cada Agente imediatamente, e o brinde relata quantos agentes foram republicados do que um 'Salvado' nu, porque agentes vivos apenas mudaram o que dizem. Dois erros pré-existentes encontrados ao longo do caminho: - O interruptor 'Auto-select best available model' nunca funcionou. A interface ler data.autoSelectModel e enviou autoSelectModel, mas a infra-estrutura retorna e espera autoModelEnabled - então a opção sempre renderizada true e seu valor foi descartado em cada salvamento. Fixo frontend- side; nenhuma alteração do servidor necessária. - AiGeneralSettings.tsx era código morto, nunca importado, enquanto um verbatim inline O duplicado viveu no fundo do SecurityModelsTab.tsx. Em vez de implementar texto exigido duas vezes, o duplicado é excluído e SecurityModelsTab importa o componente partilhado. Também substitui a dica de ajuda de agentes de vendas, que ainda disse aos usuários que o recurso era Estou a chegar.

  22. · AIService

    Persistir texto org-wide exigido e aplicá-lo imediatamente

    AiOrgSettings ganhou forçadoPreamble/forçadoFooter e SalesAgentCompiler já dobra- os em cada agente, mas o controlador de configurações não leu nem escreveu eles - então a capacidade estava morta: um salvamento parecia ter sucesso e voltou em branco na recarga. GET agora retorna ambos os campos (incluindo nos padrões sem configurações) e PUT persiste, normalizando em branco para nulo, então limpar um campo realmente o limpa em vez de deixar uma cadeia vazia para ser dobrada como separador. O texto exigido entra em vigor imediatamente, recompilando e republicando Todos os agentes publicados na org. Deixar que se aplique na próxima publicação de cada agente era mais barato e é uma armadilha: um administrador que adiciona 'sempre diz que você é um automatizado assistente vai acreditar que é ao vivo, e um agente que ninguém republica continuaria a falar sem ela indefinidamente. Uma linha exigida que silenciosamente faz não aplicar é pior do que não oferecer um. Cada agente afetado recebe um novo salvo cópia rotulada com o porquê, e os relatórios de resposta quantos foram republicados a UI pode dizer o que realmente aconteceu em vez de apenas 'Salvado'.

  23. · kamo-internal

    Estúdio AI Sales Agent de página completa, substituindo os modais

    O editor do agente era um Diálogo MUI ~ 800px cuja superfície inteira era uma linha 10 área de texto, na página de IA que usou uma janela. É agora um dedicado route, e o modelo de edição por trás dele é estruturado em vez de um blob. - /settings/ai/venda-agentes/novo — uma coluna de 720px, não o estúdio. Cartas de modelos (o cartão é a indústria, por isso, nenhum dropdown da indústria), em seguida, dois campos: nome e Uma frase sobre o negócio. Um agente em menos de um minuto. - /settings/ai/vendas-agentes/[id] — largura total, UM documento de rolagem com pegajoso cabeçalhos de seção, conteúdo fechado em 880px para entradas de linha única não são esticadas através de uma tela 4K. No 240px nav rail: nove seções é um trabalho de rolagem- spy, não um Trabalho de navegação. - Try-it-out é uma opção de cabeçalho em vez de uma coluna permanentemente reservada. An painel de bate- papo vazio ao lado de um novo agente é espaço desperdiçado que lê como o falha do usuário em preenchê-lo. - A prontidão é uma lista ordenada e descartável do que ajudaria — nunca uma fração. Uma fração diz a alguém que está falhando; uma lista lhes diz o que fazer a seguir. - Regras bloqueadas tornam bloqueadas e irremovíveis, e tomando uma seção à mão adverte quando contém um (o compilador agora re-aplica-os independentemente). - Header afirma claramente que as edições só afetam conversas NOVAS, porque o prompt é instantâneo na criação da sessão e os usuários de outra forma concluiriam sua mudança não funcionou. - outboundEnabled só é enviado quando realmente alterado: o servidor 403s o todo PUTE se esse campo estiver presente sem MANAGEM SALES AGENT OUTREACH, então incluindo em cada salvamento automático quebraria o estúdio para quem não tivesse esse direito. Também remove a caixa "prompt do sistema IA" do canal de chat editor. Era um segundo lugar, mais fraco para autor da mesma coisa, sem versionando, sem regras bloqueadas e sem histórico — seja qual for o editor que você aconteceu Open decidiu o que os clientes ouviram. Os prompts existentes ainda resolvem; canais usando um agora obter um aviso apontando para agentes. A cópia não carrega nenhum jargão de IA por design, e o array da indústria inglesa é substituído por rótulos traduzidos.

  24. · AIService

    Compilador de agentes de vendas, versioning, outreach gate; corrige a repetição da ferramenta

    A configuração do agente estruturado compila- se para o prompt do sistema, congela por publicado versão, e ganha o portão um agente deve passar antes de iniciar o contato. Compilador - AgentConfig + SalesAgentCompiler: compilação pura e determinística de estruturada configure em um prompt seccionado. Seções vazias são omitidas, então uma regra de três o agente não compila para um documento que é principalmente cabeçalhos. - Sobreposição de nível de seção ("escrever esta parte você mesmo") em vez de um nível de documento comutador raw- edit: um autor obtém poder expressivo total em uma seção enquanto cada outra secção continua a compilar, mantém as suas regras bloqueadas e continua a versionar. - Esse mesmo mecanismo torna a migração idêntica - a prosa de um agente pré-config é armazenado como um documento inteiro sobrepuja e compila de volta inalterado, então migração O dia é um no-op para agentes que já falam com clientes. Provado pelo teste. - FraseBank é deliberadamente duas dimensões, com a boa prosa no TEMPLATE. Um banco global com chave em cada combinação de enum precisa de cerca de 90 parágrafos escritos à mão, degenera em cláusulas empilhadas, e faria cada org aberto com o mesmo sentença - que destrói a única coisa que uma org está comprando. - Seis modelos (front-desk e inbound-leader primeiro: eles são horizontais e cobertura Qualquer org cuja vertical não esteja listada). Cada navio bloqueou as regras de conformidade a modelo nunca pode remover, verificado pelo teste. Ciclo de vida + autorização - Publicar congela {config, compiladoPrompt, hash, model, provedor}; rollback remarca e restaura o rascunho para que o estúdio nunca possa mostrar uma coisa enquanto O agente serve outro. - O controlador está fechado pela primeira vez. Anteriormente em Any autenticado membro de qualquer org poderia reescrever o que essa org diz aos seus clientes. Recuar para MANAGEM AI SETTINGS para que nenhum administrador existente seja bloqueado na implantação. - O chat público prefere o aviso congelado da versão publicada sobre o vivo TreinamentoContexto e vendas de selosAgentId/versionId na sessão - o agente já lá estava resolvido e estava a ser descartado. - Redação assistida por IA: uma frase dentro, configurá-la. Regras bloqueadas são Transferido em código, nunca mostrado ao modelo, então uma linha de conformidade nunca pode ser suprimido por instruções. Porta de extensão (todas as 14 regras testadas) - Opt-out bate todos os outros cheques E é relatado como a razão, porque o A própria razão registada contra uma recusa é a prova. - SMS sem registro de consentimento é recusado: sob TCPA o ónus da prova está sobre o remetente, então a ausência de registro é ausência de consentimento. - As horas de silêncio são julgadas onde está o CONTATO, não onde está o negócio. - Os envios falhados não gastam o orçamento de toque; os envios suprimidos também não, ou um bloco em cascata para bloquear tudo depois dele. - O portão falha FECHADO - um portão de extensão que erros abrem não envia mensagens ninguém autorizado, o único fracasso aqui que não pode ser desfeito. Fixações encontradas ao longo do caminho - O histórico da chamada de ferramentas foi quebrado: a linha TOOL persistiu sem conteúdo e o tool use turn assistente nunca foi persistido, então turn 2 enviou um conteúdo nulo Blocos. A activação das ferramentas teria falhado em todas as conversas multi- turnos. - textComplete não teve tempo limite (bloqueando .get(), fixando um thread em um lento provedor) e registrou nenhum uso, tornando cada ajudador chamada invisível para faturamento. - O ajuste da partição do sistema no contexto foi descappado, então um agente verbose mais um RAG Block pode acabar com toda a história. - o costeEstimate agora está povoado apenas no caminho de sincronização, de tokens de provedores reais. O streaming permanece nulo: fabrica tokens como content.length()/4 e multiplicando que por um preço real produz um número em forma de factura que está errado.

  25. · kamo-shared-library

    Configuração estruturada de agentes de vendas, coluna de versão e estado de divulgação

    Substitui o blob de contexto de treinamento único por um agente estruturado e versável modelo, e adiciona a coluna por contato que um agente precisa antes de iniciar contato em vez de apenas responder. - SalesAgent ganha configJson (jsonb-as-String, correspondência WebChatIntegration .designConfig), temConfig, publicouVersionId, audiência e saídaEnabled. formação Contexto é mantido como o COMPILED OutPUT assim que cada consumidor existente continua a trabalhar intocado. hasConfig é explícito em vez de inferido de formaçãoContexto em branco, porque uma vez que é compilado saída nunca é em branco e qualquer teste de branco seria inacessível. - SalesAgentVersion congela {configJson, compiladoPrompt, compiladoHash, modelId, providerId} por publicação. O modelo é fixado ao lado do prompt: congelamento instruções enquanto o modelo auto-rotas tornaria o artefato uma meia-verdade. - AiChatSession/AiUsageRecord win salesAgentId + salesAgentVersionId. Anteriormente "que agente tratou disto?" só podia ser respondido andando o mutável, nullable, non-FK WebChatIntegration.salesAgentId hop, por isso reatribuindo um canal silenciosamente re-atribuiu toda a história. - Ganhos do AiOrgSettings forçadosPreamble/forcedFooter como NOVAs colunas nuláveis em vez do que reutilizar o defaultSystemPrompt, a concatenação é um no-op até um administrador Preenche um. A reutilização do campo existente teria mudado de comportamento para cada Org que já tinha um povoado, no dia de implantação. - AgentContactState + AgentOutboundTouch: supressão entre canais por contato, colunas explícitas por canal opt-out e consentimento cronometrado. Opt-out é armazenado como colunas reais em vez de JSON porque "provar este número foi suprimido em essa data" não deve depender da extração do caminho JSON. Os registros do registro de toque REFUSALS assim como envia - um log de envios prova o que você fez, um log de As decisões provam o que não farias. - Direitos 168-173 repartidos * ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** MANAGEM AI SETTINGS(53), que anteriormente não tinha nada disso.

  26. · kamo-internal

    AI Sales Agents tab + atribuição de agente por canal

    Compila /settings/ai?tab=vendas-agentes (era um stub): orgs criam agentes para seus indústria de vendas, quer a partir de um modelo incorporado ou escrevendo o contexto de formação eles mesmos, em seguida, editá-los / habilitá-los / deletá-los. Canais de bate-papo (/settings/features/chat) podem agora escolher qual agente dirige que IA do canal, independentemente — o agente substitui o prompt do sistema bruto.

  27. · SecurityService

    Enriquecer o roteamento de bate-papo do mutuário + capturar o estado de propriedade

    chat-routing agora retorna NMLS do oficial designado, título, foto, telefone, e-mail e se possuem uma licença válida para o estado sujeito-propriedade, mais o e se ainda temos de o pedir. Reutiliza o cartão SAFE-Act dados resolvidos para que o chat nunca possa mostrar uma identidade fabricada. Adiciona POST /portal/sujeito-estado: quando o líder ainda não tem estado de propriedade, o o mutuário pode defini-lo do chat; ele flui através do patchEstimate (e sua atribuição pool re-entrada) como qualquer outro fato reivindicado, que desbloqueia a linha de licença.

  28. · MediaService

    Atribuir um agente de vendas por canal + relatar disponibilidade de LO

    - WebChatIntegration CRUD threads salesAgentId (null limpa a atribuição) - lo-presence agora retorna disponibilidade do membroStatus ao lado on-line, por isso o widget pode mostrar um status real em vez de um ponto nu. Sondas Cross-org ainda retornar somente {online:false}.

  29. · AIService

    CRUD de agente de vendas, modelo de hipoteca e prompt de chat orientado por agente

    - AiSalesAgentController (/api/ai/agentes de vendas): CRUD + GET/templates - SalesAgentTemplateRegistry: built-in starter templates, começando com um assistente de empréstimo hipotecário (consciente de conformidade: nenhuma cotação obrigatória, não promessas de aprovação, adia para o locatário licenciado, pede estado sujeito) - PublicAiChatService: o SalesAgent atribuiu treinamentoContexto se torna o topo nível da cascata imediata (agente -> prompt de integração -> org -> genérico)

  30. · kamo-shared-library

    SalesAgent entidade + atribuição de agente por canal

    Agentes de vendas de IA configuráveis por org: um agente nomeado para uma indústria de vendas, programado com um contexto de treinamento os autores de org (de um modelo ou à mão), aos canais para conduzir a IA desse canal. Kamo serve todas as indústrias — hipoteca é Só um modelo. - SalesAgent entity (dao/beans/ai) + SalesAgentRepository + SalesAgentDTO - WebChatIntegration.salesAgentId (ligação suave nula) + Campo DTO

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