--- title: "Comandos dialog.*" slug: "comandos-dialog" updated: 2026-09-11T19:15:23Z published: 2026-09-11T19:15:23Z canonical: "docs.omnisiga.ai/comandos-dialog" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.omnisiga.ai/llms.txt > Use this file to discover all available pages before exploring further. # Comandos dialog.* #### Comandos dialog.* | Família | Finalidade | | --- | --- | | `dialog.*` | Ações sobre sessão, mensagens, fluxo, integrações, IA, atendimento humano, sinais, formulários e demais operações do **OmniSIGA**. | #### Regras gerais - Prefira blocos visuais especializados quando eles já resolverem o comportamento; use caixa de código para regras personalizadas. - Valide `null` e entradas externas antes de converter, acessar propriedades ou enviar dados. - Os nomes de nós usados em comandos de navegação precisam existir no fluxo. - Teste caminhos de sucesso, erro, retorno externo e ausência de dados antes de publicar. - Para ações sobre fluxo/sessão, use as APIs documentadas do OmniSIGA em vez de presumir comportamento de JavaScript moderno. --- ## Como usar - Use um bloco visual especializado quando ele já resolver o comportamento desejado. A caixa de código é indicada para regras personalizadas. - Os exemplos usam JavaScript e devem ser colocados no campo correspondente do bloco: entrada, resposta do usuário, saída ou retorno externo. - `dialog.*` atua sobre a sessão e o fluxo atuais. Os nomes de nós usados em `dialog.go(...)` e comandos semelhantes precisam existir no fluxo. - `variables`, `input` e `session` representam dados disponíveis no contexto da execução. Verifique quais deles estão disponíveis no momento em que o código roda. - Teste os caminhos de sucesso, erro, retorno externo e ausência de dados antes de publicar o fluxo. --- ## Navegação #### `dialog.go(dialogNodeId)` Navega para outro nó do fluxo. O nó destino terá seu `onEnter` executado normalmente na próxima iteração do motor. Equivalente a `redirect()`. ``` dialog.go('node-confirmacao'); ``` #### `dialog.redirect(dialogNodeId)` Sinônimo de `go()`. Prefira `go()` em novos scripts. ``` dialog.redirect('node-confirmacao'); ``` #### `dialog.changeFlow(flowId)` Troca o fluxo ativo da sessão para outro fluxo cadastrado na plataforma. Encerra o fluxo atual e inicia o novo do início. ``` dialog.changeFlow('fluxo-suporte-tecnico'); ``` #### `dialog.resetDialog()` Reinicia o diálogo atual, descartando todas as ações pendentes. Variáveis de sessão e estado de navegação são preservados. ``` dialog.resetDialog(); ``` #### `dialog.resetDialog(id)` Reinicia um diálogo específico pelo ID. ``` dialog.resetDialog('outro-dialog-id'); ``` --- ## Ciclo de vida #### `dialog.finishDialog()` Encerra o atendimento com status padrão `'ok'`. ``` dialog.finishDialog(); ``` #### `dialog.finishDialog(status)` Encerra o atendimento com status customizado. ``` dialog.finishDialog('resolved'); ``` #### `dialog.abandonDialog()` Encerra o atendimento como abandonado sem status. ``` dialog.abandonDialog(); ``` #### `dialog.abandonDialog(status)` Encerra o atendimento marcando-o como abandonado, com status customizado. ``` dialog.abandonDialog('sem-resposta'); ``` #### `dialog.missed()` Redireciona para o nó de missed configurado no fluxo. Sinaliza que o bot não conseguiu tratar o input atual. ``` dialog.missed(); ``` #### `dialog.throwError()` Força um erro de processamento no nó atual. Lança exceção que interrompe a execução do script e dispara o tratamento de erro do motor. ``` if (!variavelObrigatoria) { dialog.throwError(); } ``` #### `dialog.assistantLoop()` Inicia o loop de processamento do assistente LLM na sessão atual. Sinaliza ao motor que o assistente deve assumir o controle da conversa. ``` dialog.assistantLoop(); ``` --- ## Mensagens de texto e interação #### `dialog.say(text)` Envia uma mensagem de texto ao usuário pelo canal da sessão atual. ``` dialog.say('Olá! Como posso ajudar?'); ``` #### Formatação do texto O texto aceita os marcadores de formatação no padrão WhatsApp: | Marcador | Efeito | | --- | --- | | `*texto*` | negrito | | `_texto_` | itálico | | `~texto~` | riscado | | `__texto__` | sublinhado | ``` dialog.say('Olá, *Maria*! Bem-vinda ao _atendimento_.'); ``` Regras práticas: - O marcador precisa estar colado ao texto: `* negrito *` não formata; `*negrito*` sim; - Para negrito e itálico juntos, combine os marcadores: `*_texto_*`; - O comando envia o texto com os marcadores como estão — quem interpreta é o canal ou a borda de exibição: - **WhatsApp** renderiza negrito, itálico e riscado nativamente; o canal não tem sublinhado; - **Chat do atendente e respostas rápidas** exibem os marcadores convertidos em HTML (`<b>`, `<i>`, `<s>`, `<u>`); - **Messenger e Instagram** não renderizam os marcadores — no envio pelo chat do atendente eles são removidos do texto. #### `dialog.sendButtons(text, buttons)` Envia botões de resposta rápida. O mapa `buttons` tem chave = valor retornado ao clicar e valor = label exibido. ``` dialog.sendButtons('Escolha uma opção:', {'sim': 'Sim', 'nao': 'Não'}); ``` #### `dialog.sendButtons(text, title, buttons)` Versão com título separado do corpo. Útil para canais que exibem título e corpo de forma distinta. ``` dialog.sendButtons('Corpo da mensagem.', 'Escolha:', {'s': 'Sim', 'n': 'Não'}); ``` #### `dialog.sendInteractiveList(text, buttonText, headerText, footerText, items)` Envia uma lista interativa de itens selecionáveis. Cada item é um mapa com `id`, `title` e `description`. ``` dialog.sendInteractiveList( 'Selecione o departamento:', 'Ver opções', null, null, [{'id': 'fin', 'title': 'Financeiro'}, {'id': 'sup', 'title': 'Suporte'}] ); ``` #### `dialog.sendLocation(name, address, latitude, longitude)` Envia um ponto geográfico com nome e endereço para exibição no canal. ``` dialog.sendLocation('Sede Visual', 'Av. Paulista, 1000', -23.5615, -46.6561); ``` #### `dialog.requestLocation(text)` Solicita ao usuário que compartilhe sua localização. Envia mensagem com botão de compartilhamento. ``` dialog.requestLocation('Por favor, compartilhe sua localização.'); ``` --- ## Templates WhatsApp Business (HSM) #### `dialog.sendTemplateTextMediaMsg(json)` Envia mensagem usando template de texto/mídia do WhatsApp Business (HSM aprovado). Use para mensagens ativas fora da janela de 24h. ``` dialog.sendTemplateTextMediaMsg(JSON.stringify(templateObj)); ``` #### `dialog.sendTemplateLocationMsg(input)` Envia template de localização HSM. ``` dialog.sendTemplateLocationMsg(JSON.stringify(locationTemplateObj)); ``` #### `dialog.sendCarouselTemplateMsg(json)` Envia template de carrossel HSM. ``` dialog.sendCarouselTemplateMsg(JSON.stringify(carouselObj)); ``` --- ## Mídia #### `dialog.sendFileLink(link, filename, mimeType)` Envia um arquivo para o usuário a partir de uma URL, com nome e tipo MIME. ``` dialog.sendFileLink('https://example.com/boleto.pdf', 'boleto.pdf', 'application/pdf'); ``` #### `dialog.sendFileLink(link)` Versão simplificada sem nome ou tipo MIME. ``` dialog.sendFileLink('https://example.com/doc.pdf'); ``` #### `dialog.sendImageLink(link)` Envia uma imagem a partir de uma URL, sem legenda. ``` dialog.sendImageLink('https://example.com/foto.jpg'); ``` #### `dialog.sendImageLink(link, caption)` Envia uma imagem com legenda. ``` dialog.sendImageLink('https://example.com/foto.jpg', 'Comprovante de pagamento'); ``` #### `dialog.sendVideoLink(link)` Envia um vídeo a partir de uma URL, sem legenda. ``` dialog.sendVideoLink('https://example.com/tutorial.mp4'); ``` #### `dialog.sendVideoLink(link, caption)` Envia um vídeo com legenda. ``` dialog.sendVideoLink('https://example.com/tutorial.mp4', 'Tutorial de instalação'); ``` #### `dialog.sendAudioLink(link)` Envia um áudio a partir de uma URL, sem legenda. ``` dialog.sendAudioLink('https://example.com/instrucoes.mp3'); ``` #### `dialog.sendAudioLink(link, caption)` Envia um áudio com legenda. ``` dialog.sendAudioLink('https://example.com/instrucoes.mp3', 'Instruções de uso'); ``` #### `dialog.sendMediaMessage(mediaId, name)` Envia uma mídia já armazenada na plataforma pelo ID interno, sem precisar de URL pública. ``` dialog.sendMediaMessage(variables.get('mediaId'), 'Documento enviado'); ``` --- ## Integrações HTTP #### `dialog.webhook(headers, url, method, content)` Dispara uma chamada HTTP fire-and-forget. Envia e segue sem aguardar resposta. Use para notificações onde o resultado não é necessário. ``` dialog.webhook( {'Content-Type': 'application/json'}, 'https://api.example.com/notify', 'POST', JSON.stringify({evento: 'atendimento-iniciado'}) ); ``` #### `dialog.rest(headers, url, method, content)` Faz uma chamada HTTP e aguarda a resposta. Roteia por faixa de status: 2xx = sucesso, demais = falha. A resposta fica em `restResponse` (com `statusCode` e `body`) via `externalSource` no nó receptor. ``` dialog.rest( {'Authorization': 'Bearer ' + variables.get('token')}, 'https://api.example.com/clientes/' + variables.get('cpf'), 'GET', null ); ``` #### `dialog.oauthRest(headers, url, method, content, oauthParams)` Idêntico ao `rest()`, mas gerencia o token OAuth2 (password grant ou client credentials) de forma transparente. ``` dialog.oauthRest( {'Content-Type': 'application/json'}, 'https://api.example.com/recurso', 'GET', null, {'clientId': 'abc', 'clientSecret': 'xyz', 'tokenUrl': 'https://auth.example.com/token'} ); ``` #### `dialog.kbSearch(kbId, query, messages)` Consulta uma base de conhecimento com contexto de histórico. ``` dialog.kbSearch('kb-suporte', variables.get('perguntaUsuario'), null); ``` #### `dialog.kbSearch(kbId, query)` Consulta uma base de conhecimento sem histórico. ``` dialog.kbSearch('kb-faq', variables.get('duvida')); ``` --- ## Inteligência Artificial (inline) #### `dialog.sentimentAnalysis(text, language)` Analisa o sentimento de um texto via IA. Classifica como POSITIVE, NEGATIVE, NEUTRAL ou MIXED. ``` dialog.sentimentAnalysis(variables.get('feedbackUsuario'), 'pt'); ``` #### `dialog.chatCompletion(data)` Executa um chat completion via IA. O parâmetro é JSON serializado com os parâmetros do completion. ``` dialog.chatCompletion(JSON.stringify({prompt: variables.get('contexto')})); ``` #### `dialog.namedEntities(text, language)` Extrai entidades nomeadas (nomes, datas, locais, organizações) de um texto via IA. ``` dialog.namedEntities(variables.get('textoCandidato'), 'pt'); ``` #### `dialog.intentClassification(text, list)` Classifica a intenção de um texto contra uma lista de opções via IA. ``` dialog.intentClassification(variables.get('input'), ['cancelar', 'consultar', 'pagar']); ``` --- ## Variáveis de sessão #### `dialog.set(variable, content)` Define o valor de uma variável de sessão. Variáveis com prefixo `visible` também atualizam as variáveis visíveis ao atendente. ``` dialog.set('cpf', '123.456.789-00'); dialog.set('dadosCliente', {nome: 'João', email: 'joao@email.com'}); ``` #### `dialog.get(variable)` Lê o valor de uma variável de sessão. Retorna `null` se não existir. ``` var cpf = dialog.get('cpf'); if (dialog.get('tentativas') > 3) { dialog.go('node-bloqueio'); } ``` #### `dialog.del(variable)` Remove uma variável de sessão. Útil para limpar dados temporários. ``` dialog.del('tokenTemporario'); ``` #### `dialog.visible(variable, content)` Define uma variável visível ao atendente humano. Passar `null` remove a variável visível. ``` dialog.visible('CPF', variables.get('cpf')); dialog.visible('Motivo', 'Cancelamento de contrato'); ``` #### `dialog.updateVariable(key, value)` Alias de `set()`. Prefira `set()` em novos scripts. ``` dialog.updateVariable('nome', 'João'); ``` #### `dialog.updateGlobalVariable(key, value)` Define uma variável global, compartilhada entre fluxos e subprocessos ativos. Diferente de `set()`, que opera apenas no escopo do fluxo atual. ``` dialog.updateGlobalVariable('idTransacao', txId); ``` --- ## Atendimento humano e ticket #### `dialog.toHuman()` Transfere a conversa para um agente humano. Muda a situação da sessão para HUMAN. Use `visible()` antes para preparar os dados que o atendente verá. ``` dialog.visible('Nome', variables.get('nomeCliente')); dialog.visible('CPF', variables.get('cpf')); dialog.toHuman(); ``` #### `dialog.setOnBotReturn(nodeId)` Define o nó para onde o fluxo retorna após o atendimento humano. ``` dialog.setOnBotReturn('node-pos-atendimento'); ``` #### `dialog.setTicketPriority(priority)` Define a prioridade do ticket de atendimento. ``` dialog.setTicketPriority('alta'); ``` #### `dialog.setTicketSLA(sla)` Define o SLA do ticket de atendimento. ``` dialog.setTicketSLA('sla-4h'); ``` #### `dialog.setTicketLabel(label)` Define o label (etiqueta) do ticket de atendimento. ``` dialog.setTicketLabel('cancelamento'); ``` #### `dialog.getTicketResult()` Lê o resultado do último ticket encerrado na sessão. Disponível após o atendente devolver o controle ao bot. ``` var resultado = dialog.getTicketResult(); if (dialog.getTicketResult() == 'resolvido') { dialog.go('node-encerramento'); } ``` --- ## Tags da sessão #### `dialog.addTag(tag)` Adiciona uma tag à sessão atual. ``` dialog.addTag('cliente-vip'); ``` #### `dialog.removeTag(tag)` Remove uma tag da sessão atual. ``` dialog.removeTag('em-analise'); ``` #### `dialog.setTags(tags)` Substitui todas as tags da sessão pelo array informado. ``` dialog.setTags(['suporte', 'urgente', 'plano-pro']); ``` --- ## Analytics e eventos #### `dialog.emit(event)` Registra um evento de analytics na sessão. ``` dialog.emit('cpf-validado-com-sucesso'); ``` #### `dialog.emit(event, duration)` Registra um evento de analytics com duração em milissegundos — útil para medir tempo de etapas. ``` dialog.emit('etapa-coleta-dados', 12000); ``` --- ## Contato (sessão) #### `dialog.setContact(contactId)` Vincula um contato à sessão pelo ID. ``` dialog.setContact(variables.get('contatoId')); ``` #### `dialog.setContact(contact)` Vincula um objeto `Contact` à sessão e grava o objeto em `variables.contact`. ``` dialog.setContact(contatoEncontrado); // após isso: var nome = dialog.get('contact').name; ``` --- ## Avaliação (NPS / CSAT) #### `dialog.assess(assessmentId, score)` Registra uma avaliação de atendimento com nota (sem comentário). Marca como `closed`. ``` dialog.assess('avaliacao-nps', parseInt(variables.get('nota'))); ``` #### `dialog.assess(assessmentId, score, comment)` Registra avaliação com nota e comentário. Marca como `open`. ``` dialog.assess('avaliacao-nps', parseInt(variables.get('nota')), variables.get('comentario')); ``` #### `dialog.assess(assessmentId, comment)` Registra avaliação somente com comentário (sem nota). ``` dialog.assess('avaliacao-aberta', variables.get('sugestao')); ``` --- ## Configurações de canal #### `dialog.setMediaUpload(enabled)` Habilita ou desabilita o upload de mídias pelo usuário no canal. ``` dialog.setMediaUpload(true); ``` #### `dialog.setSpeakToText(enabled)` Habilita ou desabilita a transcrição automática de áudio para texto no canal. ``` dialog.setSpeakToText(true); ``` --- ## Formulários #### `dialog.clearForm()` Limpa os dados de formulário da sessão atual. ``` dialog.clearForm(); ``` #### `dialog.createCustomerForm(customerFormDefinitionId, variableName)` Cria um formulário para preenchimento pelo cliente e grava o link na variável especificada. ``` dialog.createCustomerForm('form-dados-cadastrais', 'linkFormulario'); dialog.say('Preencha o formulário: ' + dialog.get('linkFormulario')); ``` --- ## Controle de Fluxo #### `dialog.runOnEnter(targetNode)` Força a execução do `onEnter` do nó destino imediatamente, encadeando-o ao processamento atual. Use para roteamento programático sem aguardar input do usuário. > ⚠️ Use com cautela: pode criar loops se o nó destino também redirecionar de volta. ``` if (variables.cpfInvalido) { dialog.runOnEnter('node-erro-cpf'); } ``` --- ## Fila e Sessão #### `dialog.hasAttendants(tags)` Verifica se há atendentes disponíveis em filas filtradas por tags. O resultado fica acessível no contexto para uso por nós subsequentes (ex: decisão). ``` dialog.hasAttendants(['suporte', 'horario-comercial']); ``` #### `dialog.hasAttendants()` Verifica disponibilidade sem filtro — olha o total geral em qualquer fila. ``` dialog.hasAttendants(); ``` #### `dialog.setSessionOption(key, value)` Define uma opção da sessão que terá efeito ao transferir para um humano. ``` dialog.setSessionOption('prioridade', 'alta'); ``` #### `dialog.setSessionProperty(property, value)` Define uma propriedade arbitrária na sessão. Diferente de variáveis de fluxo, propriedades de sessão são metadados persistentes e podem ser lidos por integrações externas. ``` dialog.setSessionProperty('cpfValidado', 'true'); ``` --- ## Assistente IA #### `dialog.sendToAssistantV2(assistantId, previousResponseId, callId, message, customInstructions)` Envia uma mensagem ao assistente OpenAI v2 (Responses API), com chaining via `previousResponseId`. **Prefira esta função em novos fluxos.** - `previousResponseId`: null para iniciar nova conversa, ou o ID da última resposta para continuar. - `callId`: correlaciona a resposta retornada com esta chamada. - `customInstructions`: instruções extras válidas só para este turn; null para usar o padrão do assistente. > ⚠️ Não misture `sendToAssistant` (v1) e `sendToAssistantV2` no mesmo fluxo — são APIs distintas e o estado não é compartilhado. ``` // Primeiro turn (sem histórico) dialog.sendToAssistantV2('asst_xyz', null, 'call-1', input.text, null); // Continuação de conversa anterior dialog.sendToAssistantV2('asst_xyz', session.lastResponseId, 'call-2', input.text, null); ``` #### `dialog.sendToAssistant(assistantId, threadId, message, options)` Versão legada v1 (Assistants API — modelo thread/run). Use em fluxos já em produção que dependem desta API. ``` dialog.sendToAssistant('asst_legacy', session.threadId, input.text, null); ``` #### `dialog.sendToAssistant(assistantId, threadId, message)` Overload de conveniência sem o parâmetro de opções. ``` dialog.sendToAssistant('asst_legacy', session.threadId, input.text); ``` #### `dialog.respondToAssistant(assistantId, threadId, runId, outputs)` Responde a uma tool call iniciada pelo assistente v1, devolvendo o output da função. ``` var outputs = JSON.stringify([{ tool_call_id: callId, output: result }]); dialog.respondToAssistant('asst_xyz', threadId, runId, outputs); ``` --- ## Tarefas de IA #### `dialog.imageAnalysis(mediaId, questions)` Analisa uma imagem já recebida no fluxo (referenciada por mediaId) respondendo a perguntas em linguagem natural. > ⚠️ Requer que `mediaId` já tenha sido produzido por um nó anterior (collectMedia, etc). Não funciona com URLs externas — para isso use `imageAnalysisByUrl`. ``` dialog.imageAnalysis(input.mediaId, 'Qual é o número do RG e o nome completo?'); ``` #### `dialog.imageAnalysisByUrl(url, questions)` Analisa uma imagem disponível em URL pública respondendo a perguntas em linguagem natural. > ⚠️ A URL precisa ser acessível publicamente pelo provedor de IA. URLs autenticadas ou de redes internas falharão. ``` dialog.imageAnalysisByUrl(variables.imageUrl, 'Há texto manuscrito na imagem? Qual o conteúdo?'); ``` --- ## E-mail e SMS #### `dialog.sendEmail(domain, templateName, variables)` Envia e-mail usando template registrado, com variáveis para interpolação. ``` var vars = { nome: variables.nomeCliente, protocolo: variables.protocolo }; dialog.sendEmail('minhaempresa.com.br', 'boas-vindas', vars); ``` #### `dialog.sendEmail(domain, htmlText)` Envia e-mail com corpo HTML literal (sem template). ``` dialog.sendEmail('minhaempresa.com.br', '

Olá

Protocolo: ' + variables.protocolo + '

'); ``` #### `dialog.sendEmail(domain, to, subject, templateName, variables)` Envia e-mail via template para destinatário e assunto explícitos. ``` dialog.sendEmail('minhaempresa.com.br', variables.email, 'Boas-vindas', 'boas-vindas', {nome: variables.nome}); ``` #### `dialog.sendEmail(domain, to, subject, htmlText)` Envia e-mail HTML literal para destinatário e assunto explícitos. ``` dialog.sendEmail('minhaempresa.com.br', variables.email, 'Status', '

Seu pedido foi enviado.

'); ``` #### `dialog.sendEmail(domain, templateName, variables, attachments)` Envia e-mail via template com anexos referenciados por lista de URLs públicas. ``` dialog.sendEmail('minhaempresa.com.br', 'boas-vindas', {nome: variables.nome}, ['https://example.com/termos.pdf']); ``` #### `dialog.sendEmail(domain, htmlText, attachments)` Envia e-mail HTML literal com anexos. ``` dialog.sendEmail('minhaempresa.com.br', '

Segue o documento.

', ['https://example.com/documento.pdf']); ``` #### `dialog.sendEmail(domain, to, subject, templateName, variables, attachments)` Combinação completa: template + destinatário + assunto + anexos. ``` dialog.sendEmail('minhaempresa.com.br', variables.email, 'Contrato', 'contrato', {nome: variables.nome}, ['https://example.com/contrato.pdf']); ``` #### `dialog.sendEmail(domain, to, subject, htmlText, attachments)` Combinação completa sem template: HTML + destinatário + assunto + anexos. ``` dialog.sendEmail('minhaempresa.com.br', variables.email, 'Contrato', '

Segue o contrato.

', ['https://example.com/contrato.pdf']); ``` #### `dialog.sendSMS(phoneNumber, message, type)` Envia SMS via provedor configurado. O número é normalizado internamente. `type` deve ser `'Transactional'` ou `'Promotional'`. > ⚠️ Lança RuntimeException se `message` vier vazia. Valide antes de chamar. ``` dialog.sendSMS(variables.celular, 'Seu código é ' + variables.codigo, 'Transactional'); ``` #### `dialog.sendChatHistoryEmail(domain, to, subject)` Envia por e-mail o histórico de mensagens trocadas na conversa atual. Útil em encerramento de atendimento. ``` dialog.sendChatHistoryEmail('minhaempresa.com.br', variables.emailCliente, 'Histórico do seu atendimento'); ``` --- ## Sinais e Subprocessos #### `dialog.createSubProcess(channel, gdId, variables, properties, contactId)` Inicia um subprocesso (novo diálogo) em outro canal/contato com variáveis e propriedades pré-carregadas. Cria nova sessão de diálogo independente da atual. > ⚠️ Subprocessos rodam em paralelo, fora do controle do fluxo atual. ``` var vars = { protocolo: variables.protocolo }; var props = { origem: 'callback-pos-atendimento' }; dialog.createSubProcess('whatsapp', 'gd-pesquisa-satisfacao', vars, props, variables.contactId); ``` #### `dialog.emitSignal(signalName, payload)` Emite um sinal nomeado que acorda outros fluxos aguardando por ele via `awaitSignal`. ``` dialog.emitSignal('cpf-validado-' + variables.cpf, JSON.stringify({status: 'ok'})); ``` #### `dialog.awaitSignal(signalName)` Suspende a execução do fluxo até que um sinal nomeado seja emitido. > ⚠️ Sem timeout configurado, o fluxo pode ficar suspenso indefinidamente. Combine com `createNamedTimeout`. ``` dialog.awaitSignal('confirmacao-pagamento-' + variables.protocolo); ``` #### `dialog.stopAwaitingSignal(signalName)` Cancela a espera por um sinal nomeado (libera o fluxo que estava aguardando). ``` dialog.stopAwaitingSignal('confirmacao-pagamento-' + variables.protocolo); ``` #### `dialog.shareMedia(destinationSessionId, sideFilter, mediaIdFilter)` Compartilha mídias da sessão atual com outra sessão. `sideFilter` limita por lado (`'user'`/`'bot'`) e `mediaIdFilter` seleciona uma mídia específica. ``` dialog.shareMedia(variables.destinationSessionId, 'user', variables.mediaId); ``` --- ## Atendentes #### `dialog.findUserById(id)` Busca um atendente pelo ID, incluindo suas variáveis adicionais configuradas no cadastro (`user.variables`). Retorna `null` se não encontrado. ``` var atendente = dialog.findUserById('abc-123'); if (atendente != null) { dialog.variables.set('nomeAtendente', atendente.firstName); dialog.variables.set('regiao', atendente.variables['regiao']); } ``` #### `dialog.findUserByUsername(name)` Busca um atendente pelo username. Retorna apenas os campos base do cadastro — **variáveis adicionais não são carregadas** (use `findUserById` para obtê-las). ``` var atendente = dialog.findUserByUsername('joao.silva'); if (atendente != null) { dialog.variables.set('grupoAtendente', atendente.groupName); } ``` --- ## Timeouts Nomeados #### `dialog.createNamedTimeout(name, timeout, targetNode, sourceCode)` Cria um timeout que dispara após `timeout` segundos. Ao expirar, vai para `targetNode` e/ou executa `sourceCode` JS. Pode ser cancelado via `deleteNamedTimeout`. > ⚠️ O parâmetro `targetNode` está nomeado `targetNone` no código original — provável typo histórico. Trate como o nó destino. ``` // Se o usuário não responder em 5 minutos, ir para o nó de despedida dialog.createNamedTimeout('inatividade', 300, 'node-despedida', null); ``` #### `dialog.deleteNamedTimeout(name)` Cancela um timeout nomeado previamente agendado. Não-op se o timeout não existir. ``` dialog.deleteNamedTimeout('inatividade'); ``` --- ## Contadores #### `dialog.incrementCounter(counterName, variable, step)` Incrementa o contador em `step` unidades e grava o resultado na variável informada. Cria o contador automaticamente na primeira invocação (começando em 0). ``` dialog.incrementCounter('protocoloAtendimento', 'numProtocolo', 1); ``` #### `dialog.incrementCounter(counterName, destinationVariable, prefix, step, startAt)` Versão completa: além de incrementar, aplica prefixo ao valor e permite definir valor inicial. ``` dialog.incrementCounter('protocolo2024', 'protocolo', 'PROT-2024-', 1, 1000); ``` --- ## Validação de Dados — DataValid #### `dialog.checkPFBasica(cpf, data)` Validação cadastral básica — confronta o CPF com dados cadastrais (nome, data nascimento, etc). Não exige mídias. ``` var payload = JSON.stringify({nome: variables.nome, dataNascimento: variables.dataNasc}); if (!dialog.checkPFBasica(variables.cpf, payload)) { /* tratar erro */ } ``` #### `dialog.checkPFCompleta(cpf, data, mediasJson)` Validação cadastral completa com mídias anexas (foto do documento). `mediasJson` é opcional. > ⚠️ Se `mediasJson` for JSON malformado, retorna `false` silenciosamente. ``` dialog.checkPFCompleta(variables.cpf, JSON.stringify({nome: variables.nome}), JSON.stringify([variables.mediaDocumento])); ``` #### `dialog.checkPFDigital(cpf, data, mediasJson)` Validação biométrica digital (impressão digital). ``` dialog.checkPFDigital(variables.cpf, JSON.stringify({dedo: variables.digital}), JSON.stringify([variables.mediaDigital])); ``` #### `dialog.checkPFFacial(cpf, data, mediasJson)` Validação facial — confronta selfie do titular com base biométrica facial governamental. ``` dialog.checkPFFacial(variables.cpf, JSON.stringify({nome: variables.nome}), JSON.stringify([variables.selfie])); ``` #### `dialog.checkPFFacialDigital(cpf, data, mediasJson)` Validação facial + digital combinada. ``` dialog.checkPFFacialDigital(variables.cpf, JSON.stringify({nome: variables.nome}), JSON.stringify([variables.selfie, variables.digital])); ``` #### `dialog.checkPFFacialQrCode(cpf, data, mediasJson)` Validação facial via captura por QR Code (uso típico em desktop/totem que redireciona para o celular do usuário). ``` dialog.checkPFFacialQrCode(variables.cpf, JSON.stringify({sessao: variables.sessao}), JSON.stringify([variables.qrCode])); ``` --- ## Atendimento por Vídeo #### `dialog.rejectVideo(reason)` Recusa uma chamada de vídeo em andamento, propagando o motivo para o chamador. Use quando o fluxo identifica que o atendimento por vídeo não pode prosseguir. ``` dialog.rejectVideo('Fora do horário de atendimento por vídeo.'); ``` --- ## Observações finais - As assinaturas `dialog.sendToAssistant(...)` são da integração legada v1; para novos fluxos, prefira `dialog.sendToAssistantV2(...)` quando o projeto tiver essa integração configurada. - Operações externas, como REST, formulários, sinais, DataValid e assistentes, podem continuar em outro momento. Use a área de retorno externo do bloco para tratar o resultado. - O catálogo de funções `utils.*` e `contact.*` está na referência completa [[botengine-dsl-catalogo|Botengine — Catálogo DSL]]. Este arquivo lista exclusivamente os comandos `dialog.*` solicitados para as caixas de código. ---