Adicionado3
A conversa ganha "Arquivar" — sai da fila viva, fica guardada numa aba própria e volta sozinha quando o cliente escreve
Quem atende passa o dia na Fila, e nem tudo que acaba ali merece continuar à vista: conversa que o cliente abandonou, número que era trote, atendimento que já terminou e ninguém fechou. Até agora não havia nada a fazer com isso — a conversa ficava na lista para sempre, empurrando para baixo o que ainda é trabalho. Excluir de vez continua fora, porque o histórico é do cliente e não se apaga.
Agora existe Arquivar. Tudo que já é do passado ruma para uma pasta própria: a conversa sai da Fila e das listas de conversas em andamento, aparece na aba Arquivadas (ao lado de "Fechadas", com o próprio número) e o histórico continua inteiro para quem for consultar. Arquivar encerra o atendimento, como um fechamento — a diferença é onde a conversa fica guardada e o rastro que fica na auditoria. Se o cliente escrever de novo, a conversa volta sozinha para a caixa de entrada — o banco já fazia essa volta, e agora a tela conta isso em vez de esconder.
Quem pode arquivar é quem já podia encerrar: atendente para cima. O que passa a ficar registrado é o motivo da mudança: arquivar deixa o evento próprio conversation.archived na auditoria, em vez de se confundir com "devolvida" ou com o fechamento do atendimento. Fechar continua sendo fechar, e o número da aba "Fechadas" passa a contar só as fechadas — antes ele somava as arquivadas e mostrava mais do que a lista.
Os guias do assistente passam a funcionar em qualquer pasta, e dois deixam de ser descartados
Um comando só (curl -fsSL https://raw.githubusercontent.com/melgarafael/DeskcommCRM/main/scripts/instalar-guias.sh | bash) liga os guias deskcomm-instalar, deskcomm-cliente-novo, deskcomm-metricas, deskcomm-prompt, deskcomm-contribuir e deskcomm-doutrina nas pastas globais do Claude Code, Codex, Cursor, OpenCode e Antigravity — antes eles só existiam com o assistente aberto dentro de um clone atualizado, o que deixava de fora justamente quem ainda não instalou. Pedir o assunto em português aciona o guia em qualquer um deles. Os guias não se atualizam sozinhos: rodar o comando de novo traz a versão nova, e curl -fsSL https://raw.githubusercontent.com/melgarafael/DeskcommCRM/main/scripts/instalar-guias.sh | bash -s -- --remover desfaz. O cabeçalho de dois guias trazia um erro de formato que assistentes mais rigorosos descartavam sem avisar, e foi corrigido.
Quem ainda não tem conta já vê login, cadastro, convite e páginas legais em espanhol
O idioma da interface sempre dependeu de uma sessão: preferência da pessoa → idioma da organização → padrão. Fora dessa cadeia — login, cadastro, aceite de convite, política de privacidade e termos — não havia nenhum sinal para seguir, e a tela caía sempre em português, mesmo para quem nunca vai ler português.
Agora essas telas também consultam o Accept-Language que o navegador já manda em toda requisição: se o visitante não tem preferência salva (é a primeira vez, ainda não tem conta), o idioma dele na lista de preferências decide. Uma preferência já salva continua vencendo sempre — isto só entra em jogo para quem a tela nunca viu antes.
Corrigido9
A ajuda de "esperar a resposta por" no follow-up voltava a português mesmo em espanhol
O texto de ajuda do campo "Esperar a resposta por (minutos)" (nos construtores de classificação e de resposta correspondida do fluxo de follow-up) era uma string pronta em português — composta uma vez, no idioma do arquivo, citando o rótulo da aresta e o mínimo em minutos. Com o idioma em espanhol, ela continuava aparecendo em português, porque nunca passava por t(): só existia como texto fixo.
Virou uma função que compõe a frase no idioma de quem está olhando, citando o mesmo rótulo traduzido que a aresta mostra no canvas do fluxo. Nenhum comportamento muda para quem usa português.
O construtor de follow-up para de reaproveitar identificadores, e "cancelar se o lead responder" passa a valer na espera
Duas coisas que estavam quebradas no acompanhamento automático. A primeira: ao abrir um fluxo já salvo e acrescentar um passo ou uma ligação, o construtor recomeçava a contagem de identificadores do zero — o passo novo nascia com o mesmo identificador de um que já existia, e a ligação que você acabou de desenhar aparecia por cima de outra, ou o salvamento era recusado. Agora a contagem continua de onde o fluxo parou. A segunda: a chave "cancelar se o lead responder" só valia enquanto o fluxo esperava uma resposta; numa espera por tempo — "aguarde 2 dias" —, a resposta do cliente não cancelava nada e a próxima mensagem saía assim mesmo, como se ele não tivesse respondido. Agora cancela nos dois casos.
Um aviso para quem já editou fluxos antes desta versão: um rascunho que ficou com identificadores repetidos não se conserta sozinho. Abra o fluxo, apague o passo ou a ligação duplicada pela tela e salve de novo — daí em diante o problema não volta.
O domínio de quem manda o PR não viaja mais dentro da imagem
Nada muda na sua VPS: nenhum endereço de terceiro foi encontrado no código que embarca hoje, e nada foi trocado em produção. O que muda é o portão do repositório. A catraca que já barrava o nome antigo do produto — "DeskcommCRM" escrito na tela de quem instalou com a marca dele — passou a barrar também domínio de terceiro: site pessoal, endereço de teste ou visão de alguém enterrado numa parte do código que vai para a imagem. Quando isso acontece, o PR é reprovado com o endereço e o arquivo na mensagem. Foi por esse buraco que a identificação enviada à OpenRouter levava o endereço pessoal de quem escreveu o PR: o consumo de cada instalação ficava creditado a um site que não é o seu nem o nosso.
Crédito: @webtecnica.
A marca enviada deixa de sumir da barra lateral quando o banco não responde
Quem sobe o logo da instalação em Configurações › Marca recebe o aviso “Logo atualizado.” e, no render seguinte, o desenho da marca. Se a consulta ao banco falhasse exatamente nesse instante — uma resposta perdida, um pico de carga no banco —, o sistema tratava o silêncio como resposta e guardava “não há marca gravada” por 30 segundos: a barra lateral voltava a desenhar a marca do produto, sem logo, com o arquivo novo já gravado e sem nada na tela dizendo que algo tinha falhado. Agora a leitura que falha vale só para aquela tela: a tela seguinte pergunta ao banco de novo e mostra a marca enviada. Quando o banco responde, nada muda — a marca continua sendo lida uma vez a cada 30 segundos.
Material arquivado que ficou marcado no assistente volta para a tela, com o desmarcar a um clique
Arquivar um material do acervo não podia travar o assistente que o tinha marcado — mas travava: o acervo chegava na seção já sem os arquivados, o id continuava em knowledge_source_ids, e o salvar recusava a versão com "um dos materiais marcados não existe mais, ou foi arquivado" sem oferecer onde desmarcar. Agora o arquivado e marcado aparece na lista com o selo "arquivado no acervo" e com o desmarcar a um clique; o arquivado que ninguém marcou continua fora da lista, e arquivado não conta como material do assistente em nenhum aviso.
Material do tipo documento para de oferecer o editor de perguntas e respostas
Quem cadastrou um documento — uma política de troca, um manual, um contrato — clicava em "Editar conteúdo" no cartão dele e caía num editor de pergunta e resposta EM BRANCO, como se o material tivesse sido cadastrado vazio. O botão agora nasce do tipo do material: documento não guarda pergunta e resposta, então não oferece esse editor. O que ele continua oferecendo é preparar de novo, ver o que o agente aprendeu e arquivar.
Importar a planilha não perde mais o produto de nome longo
Quando a planilha não trazia a coluna de código, o nome do produto virava o código dele, cortado em 60 caracteres. Nome de importado passa disso e difere no fim — 100 ml e 200 ml, 128 e 256 GB —, então dois produtos diferentes chegavam com o MESMO código: a segunda linha era recusada como "código repetido na planilha", citando um código que não existe na planilha, e o produto não entrava no catálogo. Agora o corte leva junto uma assinatura curta do nome inteiro, o que mantém os 60 caracteres, continua distinguindo, e a reimportação continua atualizando em vez de duplicar.
O corte também acontecia antes de colapsar os espaços, e um código terminado em espaço é uma identidade diferente da que a tela grava: editar esse produto pela tela mudava o código dele, e a importação seguinte criava uma segunda linha do mesmo produto. Isso acabou junto.
Se o seu catálogo já tem produto de nome muito longo que entrou pela planilha, o código dele passa a terminar com essa assinatura. A próxima importação da mesma planilha cria uma linha nova ao lado da antiga, a de código cortado — a antiga pode ser apagada pela tela do catálogo. Nada a fazer antes de atualizar.
Crédito: @webtecnica.
A tela de criar agente e alguns avisos de IA voltaram a português mesmo com o idioma em espanhol
O guarda de i18n (tests/unit/i18n-espanhol-cobre-a-tela.test.ts) varre o AST das telas atrás de prosa em português fora de t(), mas não alcança texto que mora fora da tela — em constantes importadas de lib/. Quatro pontos escapavam por essa lacuna:
Os pacotes de capacidade (Atender e responder, Vender e mover o funil, Não perder o cliente, Passar para um humano, Organizar a operação, Aprender e evoluir) na tela de criar ou editar agente, e o texto de cada um.
O prompt padrão de um agente novo — que também é o
system_promptde verdade se ninguém editar, por isso em espanhol ele já instrui a IA a responder em espanhol, não em pt-BR.Os seis avisos de erro do cadastro da chave de inteligência artificial (onboarding).
No construtor de fluxo de resposta correspondida, duas opções ("Se a informação já existir" e as três alternativas dela) que a mesma tela de classificação já traduzia corretamente — só esta ficou para trás.
Corrigido envolvendo cada ponto em t()/useT() no local de exibição (mesma convenção do resto do produto) e completando o dicionário. Nenhum comportamento muda para quem usa português.
O atendimento para de se desligar sozinho 15 minutos depois de ser ligado
Em Equipe › Atendimento, ligar a chave de um atendente durava cerca de quinze minutos. Passado esse tempo, o sistema desligava a chave sozinho e nada a religava — a pessoa aparecia como offline, deixava de receber conversas novas e sumia dos horários oferecidos na Agenda, sem ter feito nada. Quem percebia religava, e quinze minutos depois acontecia de novo.
A causa: uma rotina automática desligava quem não desse "sinal de vida", e esse sinal nunca foi implementado em lugar nenhum do sistema. Como ninguém o emitia, todo atendente era considerado ausente logo depois de se declarar disponível — em toda instalação, sempre.
A rotina foi removida, e a disponibilidade passou a ser calculada na hora:
chave desligada → indisponível, e ninguém religa por você
chave ligada, sem jornada publicada → disponível 24 horas por dia
chave ligada, com jornada publicada → disponível dentro dela, indisponível fora — e volta sozinho no início do próximo horário
Essa última linha é a que não existia: a jornada só sabia restringir, nunca reativar. Agora a chave é a sua decisão ("eu atendo") e a jornada diz quando — sem ninguém precisar ligar nada todo dia.
A coluna "Status" da tela passa a mostrar três estados em vez de dois: De plantão, Fora do horário e Desligado. Antes, quem estava com a chave ligada às 22h aparecia igual a quem tinha desligado — e ia procurar defeito onde só havia uma jornada que terminou.
Você não precisa fazer nada para adotar. Se alguém da sua equipe estava aparecendo como offline sem explicação, volta ao normal nesta versão.
Um detalhe que vale conferir na sua equipe: quem fica com a chave ligada e sem jornada publicada passa a contar como disponível 24 horas por dia, porque não há horário que o limite. Se não for isso que você quer para alguém, publique a jornada da pessoa em Equipe › Atendimento.