Skip to content

v1.14.0 — o projeto de origem inteiro chega ao cliente

Choose a tag to compare

@Elevstudio-Dev Elevstudio-Dev released this 04 Sep 14:29
· 40 commits to main since this release

Adicionado

  • A IA pode ser limitada a atender só leads de origem conhecida Num número de WhatsApp que também é usado para falar com clientes, fornecedores
    e contatos pessoais, a IA respondia todo mundo assim que um agente era
    publicado. Agora dá para ligar, por canal, o modo "só atende quem eu autorizei":
    a IA fica em silêncio por padrão e só assume a conversa quando o lead veio de
    uma origem elegível — uma submissão nova de formulário, uma campanha
    identificada, ou uma liberação manual pela tela. Histórico antigo, existência do
    contato, conversa anterior ou reinício de um worker nunca autorizam sozinhos.

    Esse limite vale para TODOS os caminhos de resposta automática — o motor do
    agente, o follow-up, o texto fixo de fluxo, o worker de resposta legado e a
    passagem para humano por sentimento. Não há atalho: nenhum deles envia mensagem
    de IA para uma conversa não autorizada.

    Além disso, e independentemente desse modo: quando você responde um cliente à
    mão pelo próprio WhatsApp (celular, ou outra plataforma na mesma conta), a IA
    para naquela conversa para não responder junto.
    Essa pausa dura uma hora, e se renova a cada mensagem sua.
    Enquanto você estiver atendendo, a IA continua calada; quando você para, a hora
    corre e ela volta a atender aquela conversa sozinha. Você não precisa lembrar de
    religar nada.

    Se quiser a IA de volta antes da hora, é o botão "devolver ao automático" na
    conversa. E se quiser que ela fique parada por tempo indeterminado, é o mesmo de
    sempre: assumir a conversa pela tela — aí ela só volta quando você devolver.
    Nenhuma dessas coisas apaga a origem do lead.

    Quem não ligar o modo "só atende quem eu autorizei" mantém o comportamento de
    antes para todo o resto.

  • Importar leads de uma planilha A lista de clientes que já está no Excel agora entra no funil sem digitação. Em
    Funis, o botão "Importar planilha" pede um arquivo CSV e cria um negócio por
    linha, na primeira etapa do funil escolhido.

    O importador reconhece os cabeçalhos usuais — nome, telefone, e-mail, valor,
    origem, tags, observação — em português, com ou sem acento, e aceita o
    ponto-e-vírgula que o Excel brasileiro usa. Valor escrito como "R$ 1.200,00"
    entra certo.

    Quando a planilha traz telefone, o contato é criado junto e ligado ao negócio —
    e o mesmo número repetido em várias linhas vira um contato só, não vários.

    Nada é aceito no escuro: ao terminar, a tela mostra quantos negócios entraram,
    quantos contatos foram criados, quais colunas o importador não reconheceu e
    quais linhas foram recusadas, com o motivo e o número da linha como você a vê na
    planilha. Uma linha com erro não derruba as outras.

    Há uma planilha modelo para baixar, para quem prefere começar do formato certo.

    Isto veio da contribuição de James, da Clínica Centro do Sorriso
    (@clinicacentrodosorrisosc-code).

Corrigido

  • A chave da OpenRouter passa a ser conferida de verdade antes de a tela dizer que está validada Ao cadastrar uma chave da OpenRouter em Agente de IA › Credenciais, o sistema conferia
    a chave contra o catálogo de modelos do provedor — um endereço que responde a
    qualquer um, com chave errada ou sem chave nenhuma. Na prática, qualquer texto
    colado ali era gravado como credencial validada, e o cartão passava a mostrar
    "Validada" com o final da chave ao lado.

    O erro só aparecia depois, na primeira mensagem que o agente tentava responder,
    e aparecia como "User not found." — um texto que não fala em chave nem em
    credencial. Quem procurava a causa olhava o modelo, o provedor, o próprio
    atendimento; a tela, enquanto isso, afirmava que a peça quebrada estava boa.

    Agora a prova é feita contra o endereço que exige a credencial. O catálogo
    continua sendo lido em seguida, porque é dele que sai a lista de modelos que a
    tela mostra — ali ele é dado, não prova. E catálogo fora do ar não recusa mais
    uma chave que já provou ser válida: seria trocar um erro de credencial por um de
    indisponibilidade, e mandar quem opera caçar defeito na chave certa.

    Uma ressalva sobre em que versão isto entrou: a correção já está no ar desde a
    1.13.0. O que chega atrasado é esta nota — a mudança foi publicada sem ela,
    e por isso não apareceu na lista daquela versão.

    Chave boa continua sendo aceita do mesmo jeito, e não há passo de atualização.
    A única coisa que vale conferir é o que foi cadastrado antes: se a sua chave da
    OpenRouter é anterior à 1.13.0 e o atendimento falha sem motivo aparente, abra
    Agente de IA › Credenciais e use o botão de revalidar — as setas em círculo, no
    cartão da credencial. A resposta que ele dá agora é real.

    Isto veio da contribuição de @Elevstudio-Dev.

  • O aviso de erro da importação de planilha volta ao raio de borda do produto A caixa de aviso da tela de importar leads estava com o canto arredondado pela
    metade — 4px em vez dos 8px que o resto do produto usa. É pequeno e é visível:
    ela fica ao lado de outros blocos com o raio certo.

    A causa é da migração para o Tailwind 4, que mudou o significado de rounded
    puro. Quem escreveu a tela usou o nome que valia antes.

  • A troca de senha pela linha de comando volta a encontrar o usuário Quem perde o acesso a uma instalação sem SMTP — o estado normal de um self-host
    recém-instalado — só tem um caminho de volta: o reset-password.sh do kit. Ele
    não funcionava para ninguém. Não era intermitente nem dependia do e-mail:
    qualquer endereço, existente ou não, recebia a mesma resposta seca de "usuário
    não encontrado", e a pessoa ficava trancada do lado de fora do próprio sistema.

    A causa era uma consulta escrita na sintaxe errada. O script pedia ao servidor de
    autenticação um filtro no formato do banco (email.eq.<endereço>), e esse
    servidor não fala esse formato — ele usa a expressão inteira como texto de busca.
    Como nenhum e-mail contém o pedaço email.eq., a busca não achava nada, sempre.

    Agora a consulta vai no formato que o servidor entende. E, como a busca dele é por
    trecho do endereço, o script passou a exigir o e-mail inteiro antes de aceitar
    o resultado: pedir ana@empresa.com também traz mariana@empresa.com, e entregar
    a pessoa errada a um comando que TROCA SENHA seria pior que não achar ninguém. Na
    dúvida ele não devolve nada — quem chama vê "não encontrado", que é ruim mas se
    resolve; a senha de outra pessoa trocada, não.

    Quem opera uma VPS não precisa fazer nada além de atualizar. Nenhuma configuração
    muda, nenhum arquivo precisa ser editado à mão.

  • Anonimizar um contato retoma de onde parou, em vez de dizer que já foi A anonimização de um contato remove os dados pessoais em três lugares: o
    cadastro do contato, os títulos dos negócios dele e o histórico de atividades.
    Se a operação era interrompida no meio — o navegador desistindo, o servidor
    reiniciando —, o primeiro lugar ficava pronto e os outros dois não.

    E não havia como terminar: clicar em "Anonimizar" de novo respondia "já anonimizado"
    e não fazia mais nada. O contato ficava para sempre com nome de
    cliente visível dentro dos negócios e do histórico — que é exatamente o dado que
    a anonimização existe para remover, e que a lei dá prazo para remover.

    Pior: nesse estado a tela não mostra botão nenhum — assim que o contato
    consta como anonimizado, o botão dá lugar a um aviso. Não havia como pedir a
    retomada nem sabendo que ela era necessária.

    Agora a verificação diária do sistema encontra sozinha as anonimizações que
    ficaram pela metade e termina o serviço, sem ninguém precisar procurar contato
    por contato. Como a lei dá prazo, esse conserto não podia depender de alguém
    lembrar de clicar. Rodar de novo num contato já inteiro não escreve nada, e o
    registro de auditoria mostra o que foi realmente feito, em qual contato e em que
    dia — separado da execução original, para a data em que o titular exerceu o
    direito não ser sobrescrita.

  • A proteção de envio volta a aceitar a data de hoje Em Conexões › Proteção de envio, informar hoje em "este número é usado
    desde" era recusado durante a manhã inteira: até as 9h no relógio de quem
    opera no Brasil, salvar devolvia "Campos inválidos." e não gravava nada — nem
    a janela de horário, nem o intervalo entre envios, nem o teto diário que você
    tinha acabado de mudar na mesma tela.

    O motivo: o campo pergunta um DIA, mas a verificação o comparava com a hora
    exata em Londres. Um dia não tem hora — ele começa em horários diferentes em
    cada parte do mundo —, e por isso "hoje" só era aceito depois do meio-dia
    londrino. Agora a verificação compara dias com dias, e só recusa a data que
    ainda não chegou em canto nenhum do planeta.

    O calendário do campo também parou de oferecer o dia errado: depois das 21h ele
    mostrava amanhã como escolha possível.

    Data futura continua recusada, e data antiga continua sendo o caso normal — é
    informando a data antiga que um número usado há meses deixa de ser tratado como
    recém-criado e sai do teto de 20 envios por dia.

  • O painel de IA para de avisar que um modelo não enxerga imagens quando ele enxerga Duas informações erradas no painel de provedores, e as duas faziam quem opera
    tomar decisão contra o que o sistema realmente faz.

    A primeira: o painel avisava que um modelo "não enxerga imagens" e que fotos
    e comprovantes do cliente seriam ignorados — sobre modelos que enxergam, e num
    sistema onde a leitura estava funcionando. Na mesma instalação em que o aviso
    aparecia, o print que o cliente enviou virou descrição correta para o atendente.

    O painel lia uma tabela de catálogo; o atendimento lia outra coisa. Agora os
    dois respondem pela mesma fonte, e o painel não pode mais discordar do que
    acontece de verdade. Onde o sistema não conhece o modelo — o seu, ou um de um
    serviço próprio —, o catálogo continua sendo a resposta, e a falta de informação
    continua sendo dita como falta de informação, não como "não funciona".

    A segunda: quem usa a OpenRouter tinha o problema INVERTIDO — e ele é pior,
    porque não tem sintoma. Ali o sistema não sabia dizer se um modelo enxerga: ele
    olhava só o começo do nome. Como openai/gpt-4o enxerga e openai/gpt-3.5-turbo
    não, e os dois começam igual, um palpite pelo começo do nome erra metade das
    vezes — e a OpenRouter já informa a resposta certa, modelo por modelo, quando o
    catálogo é sincronizado na instalação.

    O efeito prático era duplo. O painel deixava de avisar quando o aviso era
    verdadeiro, então quem opera achava que o comprovante do cliente estava sendo
    lido e não estava. E o atendimento chegava a enviar a imagem para um modelo que
    não a aceita, o que fazia a resposta daquela mensagem falhar. Agora, quando a
    OpenRouter informa a capacidade, é ela que vale — e quando não informa, o
    sistema volta a dizer que não sabe, em vez de afirmar.

    A terceira: o ponto "Ouvir o áudio do cliente" mostrava um modelo de
    conversa, com "usando o padrão da organização" — ao lado do próprio texto do
    ponto, que diz que a transcrição usa o padrão da OpenAI. A mesma tela afirmava
    duas coisas incompatíveis, e modelo de conversa não transcreve áudio.

    Agora ele mostra o que de fato transcreve. Trocar o modelo de conversa nunca
    mudou nada ali; o que muda é a tela parar de sugerir que mudaria.

    Para quem opera uma instalação, nada muda no dia a dia: nenhuma configuração
    nova, nenhum passo de atualização. O que muda é que o painel volta a descrever
    o sistema que está rodando.

  • Salvar o rascunho de um agente para de escrever por cima de um rascunho antigo Na tela de um agente, "Salvar rascunho" podia gravar numa versão diferente
    da que estava aberta na tela — e apagar, no caminho, um rascunho antigo que a
    própria tela prometia estar guardado.

    O estado que produzia isso é comum e tem um gatilho conhecido: quem tinha
    trabalho em andamento num rascunho e usou o botão Reverter, na aba
    Histórico. Reverter cria uma versão nova e a publica na hora; o rascunho que
    existia fica, a partir dali, "atrás" da versão publicada. A tela sabe disso e
    avisa, no selo ao lado do nome do agente: "o rascunho v5 é anterior a esta
    versão e foi superado por ela — ele continua no Histórico."

    Só que o servidor não sabia. Ele procurava "o rascunho de maior número" e
    gravava ali. Duas consequências, nenhuma delas com mensagem de erro:

    • O trabalho parecia sumir. O aviso verde dizia "Rascunho v5 salvo.", a
      página recarregava, e a tela voltava a mostrar o texto anterior — porque ela
      não reabre um rascunho superado, e o botão de publicar também não o oferece.
      Quem estava editando via "salvo" e nada mudando, sem ter o que fazer a
      respeito.
    • O Histórico perdia conteúdo, em silêncio. Aquele rascunho v5 é um
      retrato: a linha dele no Histórico existe para mostrar o que estava escrito
      ali. Regravá-lo trocava esse conteúdo por um texto que ninguém rascunhou
      naquele momento, sem aviso e sem volta.

    Agora o servidor decide em qual versão escrever pela mesma regra que a tela
    usa para decidir qual versão abrir. Quando o rascunho existente está superado,
    a gravação nasce numa versão nova — que é a que a tela reabre e o botão publica
    — e o rascunho antigo fica intacto no Histórico, como estava prometido.

    Junto vem um cuidado que não aparece na tela mas decide o resultado: quem é a
    versão publicada passa a ser sempre o ponteiro que o atendimento executa, e
    não o rótulo "publicada" gravado na linha da versão. Os dois já se contradizem
    em instalações reais, e a resposta otimista era a errada.

    Para quem opera uma instalação, nada muda no dia a dia: nenhuma configuração
    nova, nenhum passo de atualização, nenhuma mudança no banco. O que muda é que
    "salvei" volta a significar "está salvo onde você está vendo".

  • Os e-mails de acesso deixam de apontar para um endereço que não existe Numa instalação feita pelo caminho documentado, os e-mails de recuperação de
    senha, de confirmação de cadastro e de aceite de convite chegavam com um link
    para localhost:3000 — um endereço que só existe na máquina de quem programa.
    O e-mail chegava, a pessoa clicava, e o navegador dizia que a página não existe.
    Na prática, ninguém conseguia redefinir a própria senha.

    O endereço certo mora no painel do Supabase, e o instalador já sabia configurá-lo
    sozinho — só que precisava de um token que ele nunca pedia. O aviso existia, mas
    saía no meio de um registro de dez minutos, logo antes de uma tela verde dizendo
    "Instalação concluída". Ninguém voltava para ler.

    Agora o instalador pergunta esse token. Ele é opcional e não fica salvo —
    abre a conta inteira do Supabase, então é usado uma vez e descartado, e nem
    sequer entra no rascunho que guarda suas respostas para o caso de a instalação
    ser interrompida. Por isso, se você recomeçar uma instalação, ele é a única
    pergunta que volta a ser feita; a tela diz isso na hora, e apertar Enter pula.

    Quem preferir pular continua podendo: a instalação termina repetindo o passo que
    falta, com o seu domínio já preenchido, em vez de deixar a descoberta para o dia
    em que alguém esquecer a senha. E quando o passo automático roda mas o endereço
    não fica como este sistema precisa — porque o seu projeto já tinha outro
    endereço escolhido, por exemplo —, ele passou a dizer isso em vez de terminar
    com um "pronto" verde.

    Se você já tinha instalado antes desta versão, a próxima atualização mostra
    esse mesmo passo uma vez, com o seu domínio preenchido, e não repete depois.

Do projeto de origem

Esta versão traz junto a 1.13.0 do DeskcommCRM, o projeto do qual o Elev CRM
deriva — 229 mudanças de código. Os itens abaixo estão em uma linha cada; a
explicação longa de cada um está no CHANGELOG daquele projeto.

Alterado

  • O CRM instala em Postgres 15, não só em 17.

Corrigido

  • A busca do Inbox passa a achar pelo nome e pelo telefone do cliente.
  • A inteligência artificial não se cala mais por três horas depois de responder.
  • A proteção de envio volta a salvar sem a data do número.
  • A atualização volta a chegar quando alguém aprova outra coisa durante o fechamento da versão.
  • Áudio que demora para transcrever não faz mais o agente dizer "não entendi".
  • Uma instabilidade passageira do provedor de IA deixa de matar o atendimento na primeira rajada.
  • O endereço interno do seu servidor deixa de aparecer na página pública de saúde.
  • Instalar pelo canal padrão não mistura mais versões entre os serviços.
  • Loja com catálogo grande volta a achar o próprio produto.
  • Fechar um negócio parou de avisar duas vezes, e o card não some mais numa coluna arquivada.
  • O atendente de IA passa a enxergar os compromissos já marcados do cliente.
  • O agente para de dizer que o cliente não tem nada marcado quando tem.
  • O agente para de repetir uma pergunta que o cliente já respondeu.
  • Os avisos coloridos do sistema voltam a ter cor.
  • Um fluxo de retorno publicado não abre mais vazio na tela.
  • O limiar de sentimento passa a vir do agente que atende aquela conversa.
  • O nome, a descrição e a ordem do agente passam a ser salvos de verdade.
  • "Quero 2 iPhone 15" volta a encontrar o iPhone 15.
  • O prompt que você salva passa a ser o que o agente realmente executa.
  • Título de novidade com aspas no meio chega inteiro à tela de atualização.
  • Um WhatsApp fora do ar deixa de pendurar a tela até o navegador desistir.
  • Planilha exportada do Excel com acento entra inteira, sem virar caractere estranho.
  • Quem não é administrador volta a ver a lista de credenciais de IA.
  • A tela de chaves de IA explica o que deu errado e mostra quantos modelos a chave alcança.