[{"name":"weaction_login","title":"WeAction Login","description":"Autentica na plataforma WeON.\n\nIMPORTANTE: Antes de autenticar, pergunte ao usuário:\n1. \"Você é agente, supervisor ou admin (acesso total)?\"\n\nMapeamento de roles:\n  - \"agent\"      → type: \"agent_member\"\n  - \"supervisor\" → type: \"supervisor\"\n  - \"admin\"      → type: null (acesso total)\n\nNAO pergunte org_unit_id antes do login — ele retorna automaticamente no response e e salvo.\norg_unit_id e org_unit_ids sao opcionais — omita-os ao chamar esta tool a menos que o usuario informe explicitamente.\n\nEndpoint: POST {base_url}/weaction-api/api/weon/v1/auth/login\nToken retornado no HEADER \"Authorization\" da resposta.\nSe retornar erro, NAO autentica e retorna a mensagem de erro.","inputSchema":{"type":"object","properties":{"base_url":{"type":"string","minLength":1,"description":"Base URL (ex: https://develop.weon.com.br) ou subdomain (ex: develop)"},"role":{"type":"string","enum":["agent","supervisor","admin"],"description":"Tipo de acesso: agent (atendente), supervisor, admin (acesso total)"},"identifier":{"type":"string","minLength":1,"description":"Identificador/login do usuário"},"password":{"type":"string","minLength":1,"description":"Senha"},"org_unit_id":{"type":"integer","description":"Opcional. ID da unidade organizacional — retorna automaticamente no response do login. So informe se o usuario fornecer explicitamente."},"org_unit_ids":{"type":"array","items":{"type":"integer"},"description":"Opcional. IDs de multiplas unidades para supervisor. So informe se o usuario fornecer explicitamente."}},"required":["base_url","role","identifier","password"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_auth_status","title":"WeAction Auth Status","description":"Verifica o status atual de autenticação. Não expõe o token.","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_init","title":"WeAction Init (Copilot)","description":"Inicializa a partir de uma sessão de browser já autenticada no WeON. Injeta token diretamente.","inputSchema":{"type":"object","properties":{"url":{"type":"string","minLength":1,"description":"Base URL (ex: https://develop.weon.com.br)"},"token":{"type":"string","minLength":1,"description":"Bearer token da sessão existente"}},"required":["url","token"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_set_token","title":"WeAction Set Token","description":"Injeta um Bearer token diretamente (override manual).","inputSchema":{"type":"object","properties":{"token":{"type":"string","minLength":1},"base_url":{"type":"string","description":"Base URL ou subdomain"}},"required":["token"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_logout","title":"WeAction Logout","description":"Remove o token da sessao. Base URL e preservada.","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_list_users","title":"WeAction List Users","description":"Lista os usuários (agentes) do WeON com status por canal (whatsapp, chat, voice).\nRetorna id, name, email e status por canal: \"available\" | \"busy\" (em atendimento) | \"pause (motivo)\" | \"offline\".\n\nArgs:\n  - user_id (string, opcional): filtra um único usuário pelo ID\n  - email (string, opcional): acha o usuário pelo E-MAIL (ex.: o vendedor que organizou a\n    reunião). Devolve {id, name, email} ou \"não encontrado\" com quantos foram conferidos.","inputSchema":{"type":"object","properties":{"user_id":{"type":"string","description":"Filter to a specific user ID"},"email":{"type":["string","null"],"description":"E-mail exato do usuário"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_pause_user","title":"WeAction Pausar atendente","description":"PAUSA um ou mais atendentes, como o menu de ações da tela do supervisor.\n\nArgs:\n  - user_ids: ids numéricos dos atendentes (resolva o nome com weaction_list_users antes)\n  - pause_name: NOME da pausa, exatamente como cadastrado (liste com weaction_list_pauses). Ou pause_id.\n  - channels: canais a pausar; vazio = todos\n\nRetorna `feitos` e `falhas` por atendente e canal. Canal em que ele não está conectado costuma\nfalhar: diga isso ao gestor, não é erro seu. Escrita: apresente para aprovação antes.","inputSchema":{"type":"object","properties":{"user_ids":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Ids numéricos dos atendentes"},"pause_name":{"type":["string","null"],"description":"Nome da pausa (weaction_list_pauses)"},"pause_id":{"type":["string","null"],"description":"Id da pausa, se não tiver o nome"},"channels":{"anyOf":[{"type":"array","items":{"type":"string","enum":["whatsapp","voice","chat"]}},{"type":"null"}],"description":"Canais afetados. Vazio = todos (whatsapp, voice, chat), como o botão 'geral' da tela."}},"required":["user_ids"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_unpause_user","title":"WeAction Retomar atendente da pausa","description":"TIRA DA PAUSA um ou mais atendentes (volta a receber), como a tela do supervisor.\n\nArgs:\n  - user_ids: ids numéricos dos atendentes\n  - channels: canais a retomar; vazio = todos\n\nRetorna `feitos` e `falhas` por atendente e canal. Escrita: apresente para aprovação antes.","inputSchema":{"type":"object","properties":{"user_ids":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Ids numéricos dos atendentes"},"channels":{"anyOf":[{"type":"array","items":{"type":"string","enum":["whatsapp","voice","chat"]}},{"type":"null"}],"description":"Canais afetados. Vazio = todos (whatsapp, voice, chat), como o botão 'geral' da tela."}},"required":["user_ids"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_disconnect_user","title":"WeAction Desconectar atendente","description":"DESCONECTA um ou mais atendentes dos canais, como a tela do supervisor.\n\nArgs:\n  - user_ids: ids numéricos dos atendentes\n  - channels: canais a desconectar; vazio = todos\n\nRetorna `feitos` e `falhas` por atendente e canal. Tira o atendente da distribuição:\napresente para aprovação antes e diga o efeito.","inputSchema":{"type":"object","properties":{"user_ids":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Ids numéricos dos atendentes"},"channels":{"anyOf":[{"type":"array","items":{"type":"string","enum":["whatsapp","voice","chat"]}},{"type":"null"}],"description":"Canais afetados. Vazio = todos (whatsapp, voice, chat), como o botão 'geral' da tela."}},"required":["user_ids"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_list_pauses","title":"WeAction List Pause Types","description":"List all configured pause types/reasons in the system.\n\nReturns pause id, name, and other configuration properties.","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_user_events","title":"WeAction User Events","description":"Retrieve pause, login, and attendance events for voice and WhatsApp channels.\n\nUseful for auditing agent activity, calculating time-in-state, and building reports.\n\nArgs:\n  - start_date (string, optional): início (YYYY-MM-DD hh:mm:ss). Vazio = hoje 00:00.\n  - end_date (string, optional): fim (YYYY-MM-DD hh:mm:ss). Vazio = agora. Máximo 31 dias.\n  - user_ids (array of strings, optional): ids dos atendentes (filtra só eles)\n\nReturns array of event objects.","inputSchema":{"type":"object","properties":{"start_date":{"type":"string","description":"Start date (YYYY-MM-DD hh:mm:ss)"},"end_date":{"type":"string","description":"End date (YYYY-MM-DD hh:mm:ss)"},"user_ids":{"type":"array","items":{"type":"string"},"description":"Filter by user IDs"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_agent_status_times","title":"WeAction Tempos do time no período (pausa, logado, falado)","description":"TEMPO ACUMULADO de cada atendente no período: tempo total em PAUSA, tempo LOGADO, tempo FALADO e tempo DISPONÍVEL, em segundos, com o nome do atendente.\n\nUSE para: \"quem ficou mais tempo em pausa hoje?\", \"quanto tempo cada um ficou logado?\", \"como foi o dia do time em tempo?\", \"produtividade/ociosidade por atendente\". É a fonte do tempo acumulado do DIA; o status AO VIVO (quem está pausado agora) é weaction_team_status.\n\nSem datas = hoje inteiro. Converta segundos em horas/minutos ao responder e ordene pelo que a pessoa perguntou.\n\nArgs:\n  - start_date (string, optional): início (YYYY-MM-DD hh:mm:ss)\n  - end_date (string, optional): fim (YYYY-MM-DD hh:mm:ss)","inputSchema":{"type":"object","properties":{"start_date":{"type":"string","description":"Start date (YYYY-MM-DD hh:mm:ss)"},"end_date":{"type":"string","description":"End date (YYYY-MM-DD hh:mm:ss)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_uso_da_operacao","title":"WeAction Uso da operação (volume, bot, origem, não atendidos)","description":"Os números de USO da operação no período, com as mesmas contas do painel de uso: total de atendimentos, QUANTO É FEITO POR BOT (condução: só bot, bot e humano, só humano, sem atendente), por canal, origem (receptivo, ativo, campanha), não atendidos (abandono e tempo esgotado), maiores grupos, bots, campanhas e atendentes, e quantas pessoas acessaram o WeON por semana.\n\nQUANDO USAR: \"quanto da operação é feito por bot?\", \"volume por grupo/canal/atendente\", \"quantos não foram atendidos?\", \"quanto veio de campanha?\", \"quantas pessoas usam o WeON por semana?\", \"como está a operação no mês?\".\nNÃO É: retrato de agora (fila, quem está online) nem leitura de conversas.\n\nArgs:\n  - de / ate (AAAA-MM-DD, opcionais): padrão os últimos 7 dias fechados; máximo 31 dias\n  - canal (opcional): whatsapp, voice, chat ou email\n  - incluir_acesso (opcional, padrão sim): pessoas que acessaram por semana","inputSchema":{"type":"object","properties":{"de":{"type":["string","null"],"description":"Início AAAA-MM-DD"},"ate":{"type":["string","null"],"description":"Fim AAAA-MM-DD"},"canal":{"anyOf":[{"type":"string","enum":["whatsapp","voice","chat","email"]},{"type":"null"}]},"incluir_acesso":{"type":["boolean","null"]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_conferir_qualificacao","title":"WeAction Conferir qualificação (não grava)","description":"CONFERE se uma qualificação vale para um atendimento e devolve o CAMINHO OFICIAL. Não grava nada,\nnão encerra, não pede aprovação.\n\nUse SEMPRE depois de escolher a folha em weaction_qualificacoes_da_fila e ANTES de citar ou gravar:\n  - perguntaram \"qual qualificação?\": escolha, confira aqui e responda o caminho_oficial + o motivo;\n  - pediram para qualificar: confira aqui e depois chame weaction_qualify_job.\nSó o caminho_oficial devolvido aqui pode ser dito. Se vier valida=false, escolha de novo entre as\nfolhas_validas (pela descrição); se nenhuma casar, diga isso e qual qualificação faltaria.\n\nArgs:\n  - protocol: protocolo do atendimento\n  - qualify_id: id da FOLHA escolhida\n  - atendente_id: só supervisor (dono do atendimento)","inputSchema":{"type":"object","properties":{"protocol":{"type":"string","minLength":1,"description":"Protocolo do atendimento"},"qualify_id":{"type":["string","number"],"description":"Id da folha escolhida"},"atendente_id":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Só supervisor: id do atendente dono do atendimento"}},"required":["protocol","qualify_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_jobs","title":"WeAction List Active Attendances (Jobs)","description":"Lista os atendimentos (jobs) ATIVOS de um agente, paginado.\nPOST /v1/agents/{agent_id}/jobs/active/paginated\n\nRetorna { agentId, attendances[], total, totalPages, currentPage, offset }; cada attendance traz id, protocol, channelAddress, contact, qualification, attendant, channel, group, campaign, type, times, status.\n\nArgs:\n  - agent_id (number, opcional): default = agente logado (JWT sub)\n  - channels (array, opcional): [\"voice\",\"chat\",\"whatsapp\"] (default: os 3)\n  - only_events (\"Y\"|\"N\", opcional): só com eventos (default \"Y\")\n  - only_unread (\"Y\"|\"N\", opcional): só não lidos (default \"N\")\n  - per_page (number, opcional, default 40) · offset (number, opcional, default 0)","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"Agent ID (defaults to logged-in agent)"},"channels":{"type":"array","items":{"type":"string","enum":["voice","chat","whatsapp"]},"description":"Channels filter (default: all)"},"only_events":{"type":"string","enum":["Y","N"],"description":"Only attendances with events (default \"Y\")"},"only_unread":{"type":"string","enum":["Y","N"],"description":"Only unread attendances (default \"N\")"},"per_page":{"type":"integer","minimum":1,"description":"Results per page (default 40)"},"offset":{"type":"integer","minimum":0,"description":"Pagination offset (default 0)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_job","title":"WeAction Abrir atendimento (caminho real)","description":"NÃO abre atendimento: explica como abrir. Na WeOn o atendimento de WhatsApp nasce\nquando a mensagem é enviada. Para o ATENDENTE abrir (ligar ou abrir conversa) use\nweaction_abrir_atendimento_ativo. Para mensagem avulsa use weaction_send_whatsapp_template (janela fechada, >24h desde a\núltima mensagem do cliente) ou weaction_send_whatsapp_message (janela aberta). Não chame esta tool\nesperando que algo seja criado.","inputSchema":{"type":"object","properties":{"contact_id":{"type":["string","null"]},"channel":{"type":["string","null"]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":false,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_end_job","title":"WeAction Encerrar atendimento (supervisor)","description":"ENCERRA um atendimento de WhatsApp em andamento, como o supervisor faz na tela.\nPOST /v1/supervisor/{login}/job/whatsapp/end\n\nFLUXO: pegue o PROTOCOLO do atendimento aberto (weaction_atendimentos_agora) e chame esta tool.\nEncerra sem qualificação (fica registrado como encerrado pelo supervisor). Só WhatsApp.\nSucesso = a tool relê os abertos e confirma que o atendimento saiu. Sem isso, NÃO afirme que encerrou.\nEscrita: apresente para aprovação antes, dizendo o cliente e o atendente.\n\nArgs:\n  - protocolo (string): protocolo do atendimento aberto","inputSchema":{"type":"object","properties":{"protocolo":{"anyOf":[{"type":"string","minLength":6},{"type":"null"}],"description":"Protocolo do atendimento aberto"},"job_id":{"type":["string","null"],"description":"Sinônimo antigo de protocolo"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_qualify_job","title":"WeAction Encerrar e qualificar atendimento (atendente ou supervisor)","description":"ENCERRA (se ainda estiver aberto) e QUALIFICA um atendimento, e o tira da tela, com as mesmas chamadas da tela do atendente.\n\nQUANDO PEDIREM QUALIFICAÇÃO (\"qual qualificação se aplica?\", \"qualifique\", \"encerra e qualifica\"):\nanalise, confira com weaction_conferir_qualificacao, diga a qualificação e o motivo e CHAME ESTA TOOL no\nmesmo turno. Ela passa pelo cartão de aprovação de quem pediu: esse cartão é o pedido de permissão\n(aprovou, grava; rejeitou, nada acontece). Não pergunte \"posso qualificar?\" antes. Não recuse um pedido\nexplícito; pendência na conversa é um aviso de uma linha. Sem pedido de qualificação, nunca chame.\n\nFLUXO:\n  1. Leia a conversa inteira e pegue a árvore com weaction_qualificacoes_da_fila(protocolo = este atendimento).\n  2. Escolha pela DESCRIÇÃO a FOLHA que corresponde ao que aconteceu e confira com\n     weaction_conferir_qualificacao. Item com subopções é pergunta, não resposta.\n  3. Se NADA da árvore casar: diga isso e qual qualificação faltaria. Atendente: sugira pedir ao supervisor para\n     criar. Supervisor: proponha criar (weaction_create_qualification, com aprovação) no grupo de qualificação da\n     fila, avise quando criar e pergunte se pode qualificar com ela.\n  4. Para executar: diga em uma frase \"vou encerrar e qualificar como <caminho>; ele sai da tela\" (ou \"vou\n     qualificar\", se já estiver encerrado) e chame. A tool confere de novo, encerra se precisar, qualifica,\n     fecha e confere que saiu da lista.\n\nArgs:\n  - protocol: protocolo do atendimento\n  - qualify_id: id da FOLHA escolhida em weaction_qualificacoes_da_fila\n  - observation: observação livre (opcional)\n  - atendente_id: SÓ para supervisor: o id do atendente dono do atendimento (campo atendente_id de\n    weaction_atendimentos_agora). Quem conversa sendo o próprio atendente não passa: vale o dele.\n\nA plataforma NÃO tem marcador de \"qualificado por IA\": grava como o atendente. Canal voz: a ligação precisa ter terminado.","inputSchema":{"type":"object","properties":{"protocol":{"type":"string","minLength":1,"description":"Protocolo do atendimento"},"qualify_id":{"type":["string","number"],"description":"Id da folha (weaction_qualificacoes_da_fila)"},"observation":{"type":["string","null"],"description":"Observação livre"},"atendente_id":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Só supervisor: id do atendente dono do atendimento"},"qualify_path":{"type":["string","null"],"description":"Ignorado: o caminho vem da árvore"},"simular":{"type":["boolean","null"],"description":"Legado: para só conferir use weaction_conferir_qualificacao (não pede aprovação)"}},"required":["protocol","qualify_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_qualify_external_activity","title":"WeAction Qualify External Activity","description":"Qualify/register an external activity (non-platform attendance).\n\nUsed for registering activities that happened outside the WeON platform\n(e.g. face-to-face contact, physical documents, etc.).\n\nArgs:\n  - qualification_id (string): Qualification ID\n  - contact_id (string, optional): Contact ID\n  - observation (string, optional): Free-text observation\n\nReturns confirmation from the API.","inputSchema":{"type":"object","properties":{"qualification_id":{"type":"string","minLength":1,"description":"Qualification ID"},"contact_id":{"type":"string","description":"Contact ID"},"observation":{"type":"string","description":"Free-text observation"}},"required":["qualification_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_abrir_atendimento_ativo","title":"WeAction Abrir Atendimento Ativo (fast job)","description":"Abre um atendimento ATIVO para o agente: é o que LIGA para alguém agora ou abre a conversa no WhatsApp (o botão de atendimento rápido da tela).\n\nQUANDO USAR: o usuário pediu contato AGORA — \"ligue para o Fulano\", \"liga pra ele\", \"chama ele no telefone\", \"me põe na linha com ele\", \"abre uma conversa no WhatsApp com ele\". NÃO é tarefa: só crie tarefa (weaction_create_task) se o pedido for para DEPOIS (\"marca para amanhã\", \"agenda um retorno na sexta\").\nPOST /v1/job/whatsapp/active-job · POST /v1/job/voice/active-job\n\nSUPERVISOR: passe `atendente` com o NOME de quem vai atender (ex.: \"Rogério Costa\") — a tool resolve o id, o grupo e a campanha sozinha. Se você não sabe quem deve atender, PERGUNTE ao gestor antes; não escolha.\nJÁ ABERTO: se o contato já tem atendimento em andamento, a tool NÃO abre outro — devolve o protocolo existente. Abrir duas vezes cria dois atendimentos para o mesmo cliente.\n\nFLUXO (a tool resolve o que puder sozinha):\n  1. só `atendente` (nome) + `phone` já basta — ela acha o grupo de WhatsApp e a campanha;\n  2. para escolher a fila, passe `grupo` com o NOME (ex.: \"WhatsDevel\");\n  3. `campaign_id` continua aceito para quem já tem o id.\nContato já cadastrado: passe contact_id (e/ou contact_identifier) para ligar à ficha certa.\n\nRECUSAS da API (repasse ao usuário e NÃO insista): alreadyInAttendance (contato já em atendimento), alreadyInInbox (conversa já na caixa), agentWhatsappOffline (WhatsApp do agente offline), clientOnBot (cliente em fluxo de bot), pause (agente em pausa).\n\nArgs:\n  - channel (string): \"whatsapp\" ou \"voice\"\n  - phone (string): telefone do contato (com ou sem máscara)\n  - atendente (string, opcional): NOME do atendente que vai receber (supervisor)\n  - grupo (string, opcional): NOME do grupo/fila (default: o 1º com campanha do canal)\n  - campaign_id (number, opcional): se você já tem o id da campanha\n  - contact_id (number, opcional) · contact_identifier (string, opcional)\n  - international (boolean, opcional): true = NÃO prefixa 55 (fora do Brasil)\n  - agent_id (number, opcional): default = agente do token","inputSchema":{"type":"object","properties":{"channel":{"type":"string","enum":["whatsapp","voice"],"description":"Canal do atendimento"},"phone":{"type":"string","minLength":8,"description":"Telefone do contato"},"atendente":{"type":["string","null"],"description":"NOME do atendente que vai receber (quando quem pede é supervisor)"},"grupo":{"type":["string","null"],"description":"NOME do grupo/fila de atendimento"},"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"campaign_whatsapp_id ou campaign_voice_id do grupo"},"contact_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"ID do contato, se já cadastrado"},"contact_identifier":{"type":["string","null"],"description":"Identificador do contato"},"international":{"type":["boolean","null"],"description":"true = não prefixa 55"},"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Agente (default: token)"}},"required":["channel","phone"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_atendimentos_agora","title":"WeAction Atendimentos abertos AGORA (visão do supervisor)","description":"Os atendimentos ABERTOS neste instante na operação inteira: em ESPERA na fila (onHold) e EM ANDAMENTO com atendente (inProgress). Visão de SUPERVISOR — cobre todos os atendentes, não um só.\nGET /v1/job?supervisor={login}\n\nQUANDO USAR: \"quais atendimentos estão abertos agora\", \"tem alguém esperando na fila?\", \"o que está em andamento\", \"quem está atendendo quem\", \"está tudo parado?\". Também é o PASSO 1 para transferir (weaction_transferir_atendimento): é aqui que sai o protocolo.\n\nCada linha traz: protocolo, contato (nome/telefone), atendente (id e nome), grupo de atendimento, fila, origem (QUEUE = veio da fila) e desde quando está aberto.\n\nPara ver a carteira/atendimentos de UM atendente específico, use weaction_list_jobs.\n\nArgs:\n  - supervisor (string, opcional): login do supervisor (default: o da sessão)\n  - apenas (string, opcional): \"espera\" | \"andamento\" | \"todos\" (default \"todos\")","inputSchema":{"type":"object","properties":{"supervisor":{"type":["string","null"],"description":"Login do supervisor (default: sessão)"},"apenas":{"anyOf":[{"type":"string","enum":["espera","andamento","todos"]},{"type":"null"}],"description":"Recorte da lista"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_aguardando_qualificacao","title":"WeAction Atendimentos aguardando qualificação (visão do supervisor)","description":"Lista os atendimentos ENCERRADOS que ainda AGUARDAM QUALIFICAÇÃO, com o protocolo, o cliente e DE QUEM é cada um. Visão de SUPERVISOR: percorre os atendentes do time.\n\nQUANDO USAR: \"quais atendimentos estão aguardando qualificação?\", \"de quem são os pendentes de qualificação?\", \"quem não qualificou?\". O número por fila já vem no retrato da operação; esta ferramenta traz a LISTA.\n\nArgs:\n  - atendente_id (number, opcional): só os de um atendente\n  - supervisor (string, opcional): login do supervisor (default: o da sessão)","inputSchema":{"type":"object","properties":{"atendente_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Só os deste atendente"},"supervisor":{"type":["string","null"],"description":"Login do supervisor (default: sessão)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_transferir_atendimento","title":"WeAction Transferir atendimento (supervisor ou o próprio atendente)","description":"TRANSFERE um atendimento de WhatsApp em andamento para OUTRA FILA (grupo de atendimento) ou para OUTRO ATENDENTE. Ação de ESCRITA: confirme o destino com o usuário antes.\nPOST /v1/job/whatsapp/transfer. Serve ao SUPERVISOR (qualquer atendimento aberto) e ao ATENDENTE (os atendimentos dele).\n\nFLUXO OBRIGATÓRIO (não invente ids):\n  1. weaction_atendimentos_agora: pegue o PROTOCOLO do atendimento;\n  2. destino:\n     - para FILA: weaction_list_groups / weaction_list_agent_attendance_groups → grupo_destino_id;\n     - para ATENDENTE: weaction_list_users → atendente_destino_id, E o grupo em que ele atende (grupo_do_atendente_id, via weaction_list_agent_attendance_groups desse atendente).\n  3. chame esta tool.\n\nSó WhatsApp. Voz tem outro fluxo (transfer-request/transfer-accept).\nSucesso = a API responde sem recusa; a tool RELÊ a lista de abertos e confirma se o atendimento mudou de dono. Sem essa confirmação, NÃO afirme que transferiu.\n\nArgs:\n  - protocolo (string): protocolo do atendimento\n  - grupo_destino_id (number, opcional): transferir para esta FILA\n  - atendente_destino_id (number, opcional): transferir para este ATENDENTE\n  - grupo_do_atendente_id (number, opcional): grupo em que o atendente destino atende (obrigatório junto de atendente_destino_id)","inputSchema":{"type":"object","properties":{"protocolo":{"type":"string","minLength":6,"description":"Protocolo do atendimento"},"grupo_destino_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"attendance_group_id de destino (transferência para fila)"},"atendente_destino_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"agent_id de destino (transferência para atendente)"},"grupo_do_atendente_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"attendance_group_id onde o atendente destino atende"}},"required":["protocolo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_contact_history","title":"WeAction Histórico do Contato (jornada)","description":"Histórico de atendimentos/atividades de um contato (timeline), agrupado por data.\nGET /v1/contacts/history\n\nItem: protocol, channel, agent_name, qualify_path, attendanceGroupName, init_date/final_date, attendance_type. USE para avaliar a jornada do contato (risco/oportunidade/etapa de relacionamento). Para LER a conversa de um atendimento, use weaction_conversation_messages(protocol).\n\nArgs:\n  - contact_identifier (string): identificador do contato (NÃO é o id; vem do contato/carteira)\n  - org_unit_id (number, opcional): default = do contexto\n  - initial_date / final_date (\"YYYY-MM-DD\", opcionais; default: últimos 90 dias)\n  - channel (string, opcional): filtrar canal\n  - page (number, opcional, default 1)","inputSchema":{"type":"object","properties":{"contact_identifier":{"type":"string","minLength":1,"description":"Identificador do contato"},"org_unit_id":{"type":"integer"},"initial_date":{"type":"string","description":"YYYY-MM-DD"},"final_date":{"type":"string","description":"YYYY-MM-DD"},"channel":{"type":"string"},"page":{"type":"integer"}},"required":["contact_identifier"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_conversation_messages","title":"WeAction Mensagens da Conversa (transcrição)","description":"Mensagens trocadas em um atendimento (transcrição da conversa).\nGET /v1/job/{protocol}/messages\n\nCada mensagem: quando, QUEM (\"cliente\" | \"atendente\" | \"automático\"), tipo, texto, status e o número (de).\nUSE o campo 'quem' para saber o lado da fala — NUNCA o número: ele vem IGUAL nos dois sentidos.\nAo mostrar a conversa ao usuário, escreva o lado (\"cliente\"/\"atendente\"), nunca o telefone.\nUSE para LER o teor da conversa e avaliar sentimento, risco, oportunidade ou resumir.\nPegue o 'protocol' do weaction_contact_history.\n\nArgs:\n  - protocol (string|number): protocolo do atendimento","inputSchema":{"type":"object","properties":{"protocol":{"type":["string","number"],"description":"Protocolo do atendimento"}},"required":["protocol"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_search_contacts","title":"WeAction Buscar Contatos (nome/telefone/whatsapp)","description":"Busca contatos por nome, TELEFONE ou WhatsApp (full_search) OU lista os CONTATOS DE UMA EMPRESA (employer_id).\nGET /v1/contacts?full_search={termo} | GET /v1/contacts?employerId={id}\n\nUSE para ENCONTRAR/RESOLVER um contato citado pelo usuário; funciona por NOME e por NÚMERO (weaction_contact_filters_list filtra só por nome). Retorna id/identifier para usar em weaction_contact_history, weaction_create_task, etc.\nDE QUEM É A CARTEIRA: leia o campo `carteira` / `carteira_de_agent_id`. `agente_que_cadastrou` é só quem CRIOU o contato e NUNCA indica a carteira. Sem dono: diga \"não está carteirizado\" e, se houver criador, \"foi criado por <nome>\" (nome via weaction_list_users).\nEMPRESA \"SEM CANAL\"? Antes de declarar isso, passe employer_id, liste os contatos vinculados (telefone/e-mail) e SUGIRA o melhor: quem tem WhatsApp cadastrado e mais histórico.\n\nArgs:\n  - full_search (string, opcional quando employer_id vier): nome, telefone ou whatsapp. Ex.: \"João\" ou \"5568985457736\"\n  - employer_id (number, opcional): contatos DESSA empresa (canal/telefone/e-mail)\n  - org_unit (number, opcional): default = do contexto\n  - per_page (opcional, default 20), page (opcional, default 1)","inputSchema":{"type":"object","properties":{"full_search":{"type":"string","description":"Nome, telefone ou whatsapp do contato"},"employer_id":{"type":"integer","description":"ID da empresa — lista os contatos vinculados a ela (p/ achar canal/contato principal)"},"agent_id":{"type":"integer","description":"ID do agente (default: logado)"},"per_page":{"type":"integer"},"page":{"type":"integer"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_contact","title":"WeAction Criar Contato","description":"Cria um contato no WeON (mesmo cadastro da tela de contatos).\nPOST /v3/contacts/create\n\nANTES de criar: busque (weaction_search_contacts) para não duplicar; se o identificador já existir a API responde 409 e nada é criado.\n\nArgs:\n  - name (string): nome completo\n  - phone (string, opcional): telefone só dígitos (canal de voz)\n  - whatsapp (string, opcional): com DDI (ex.: 5541999998888)\n  - email (string, opcional)\n  - identifier (string, opcional): identificador único; gerado se omitido\n  - employer_id (number, opcional): vincula a uma EMPRESA existente\n  - carteirizar (boolean, opcional): true = entra na carteira do agente logado\n  - details (object, opcional): campos customizados da unidade (coluna: valor)\n\nRetorna {id, name} do contato criado.","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Nome completo"},"phone":{"type":"string","description":"Telefone, só dígitos"},"whatsapp":{"type":"string","description":"WhatsApp com DDI (55...)"},"email":{"type":"string","description":"E-mail"},"identifier":{"type":"string","description":"Identificador único (gerado se omitido)"},"employer_id":{"type":"integer","description":"ID da empresa p/ vincular"},"carteirizar":{"type":"boolean","description":"true = entra na carteira do agente logado"},"details":{"type":"object","additionalProperties":{},"description":"Campos customizados (coluna: valor)"}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_create_multiple_contacts","title":"WeAction Importar contatos (criar/atualizar em lote)","description":"IMPORTA contatos na BASE da unidade em lote: cria os novos e ATUALIZA os que já existem pelo identificador (mesmo comportamento da importação por planilha da tela Contatos). É a tool para \"importe esses contatos\", \"sube essa planilha de contatos na base\".\nPOST /v3/contacts/create-multiple — contrato REAL (06/09/2026): cada contato = {contact_id (identificador ÚNICO, obrigatório), contact_name, channel_addresses {phone:[..], whatsapp:[..]}, details {contact_email, employer_id, <coluna_do_cadastro>: valor}}; máx 1000 por chamada (esta tool manda lotes de 200).\n\nFLUXO (planilha → base): 1) leia a planilha (dataset_load_attachment) e mostre linhas, colunas, telefones inválidos e duplicados; 2) confira as colunas da unidade (weaction_list_contact_columns) para mapear as extras; 3) mostre a prévia e peça APROVAÇÃO; 4) chame esta tool; 5) reporte criados / atualizados / falhas com o motivo por linha. Para pôr os contatos numa campanha depois, use weaction_create_whatsapp_mailing (layout da campanha) ou weaction_add_contacts_to_mailing.\nRegras: sem identificador na planilha, esta tool GERA um por contato (CPF/código do cliente é o identificador ideal: permite atualizar depois). Telefone/WhatsApp só dígitos com DDI (55...). Lista de bloqueio (blacklist) é só na tela.\n\nArgs:\n  - contacts (array): [{ identifier?, name, phone?, whatsapp?, email?, employer_id?, extras?: [{coluna, valor}] }] — coluna = nome técnico do cadastro (weaction_list_contact_columns)\n  - org_unit_id (number, opcional): default = unidade do contexto","inputSchema":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"identifier":{"type":["string","null"],"description":"Identificador único (CPF/código); gerado se omitido"},"name":{"type":"string","minLength":1,"description":"Nome completo"},"phone":{"type":["string","null"],"description":"Telefone (voz), só dígitos"},"whatsapp":{"type":["string","null"],"description":"WhatsApp com DDI, só dígitos"},"email":{"type":["string","null"]},"employer_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Empresa para vincular"},"extras":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"coluna":{"type":"string","minLength":1,"description":"Nome técnico da coluna do contato"},"valor":{"type":"string","description":"Valor"}},"required":["coluna","valor"],"additionalProperties":false}},{"type":"null"}]}},"required":["name"],"additionalProperties":false},"minItems":1,"maxItems":5000,"description":"Contatos a importar"},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["contacts"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_contato_360","title":"WeAction Contato 360 (jornada + conversas de vários protocolos)","description":"Visão completa de um contato: atendimentos recentes E o teor das conversas, em UMA chamada.\n\nUSE para sugerir mensagem, resumir o cliente, entender risco/oportunidade ou\nretomar contato. É a tool certa quando o atendimento atual está vazio: o mesmo\nnúmero costuma ter conversa nos protocolos anteriores.\n\nNÃO use para avaliar script de qualidade — a monitoria é só do protocolo atual.\n\nPREFIRA BUSCAR PELO TELEFONE. Um telefone pode ter VÁRIAS fichas cadastradas\n(medido: um número do Develop tem 4), e todas são a MESMA pessoa — esta tool\njunta o histórico de todas. Buscar por NOME cai em pessoa diferente: no teste,\no nome trouxe uma conversa antiga e genérica; o telefone trouxe a conversa que\nimportava, com o cliente perguntando preço e uma promessa de retorno em aberto.\n\nArgs:\n  - telefone (string): telefone do contato com DDI — CAMINHO PREFERIDO\n  - contact_identifier (string, opcional): identificador, se já souber\n  - protocolos (number, opcional): quantos atendimentos ler (padrão 3, máx 6)\n  - dias (number, opcional): janela do histórico (padrão 90)\n\nPasse pelo menos um entre telefone e contact_identifier.\n\nRetorna: atendimentos (protocolo, canal, data, atendente, qualificação, grupo) e,\npara os mais recentes, as mensagens — marcadas por protocolo e por quem falou.","inputSchema":{"type":"object","properties":{"telefone":{"type":"string","description":"Telefone com DDI — PREFERIDO (junta todas as fichas do número)"},"contact_identifier":{"type":"string","description":"Identificador do contato (use só se não tiver o telefone)"},"protocolos":{"type":"integer","minimum":1,"maximum":6,"description":"Quantos atendimentos ler por dentro (padrão 3)"},"dias":{"type":"integer","minimum":1,"maximum":365,"description":"Janela do histórico em dias (padrão 90)"},"org_unit_id":{"type":"integer"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_groups","title":"WeAction List Groups","description":"List all attendance groups (queues) configured in the WeON system.\n\nReturns group id, name, channel, and current queue metrics.","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_agent_attendance_groups","title":"WeAction Grupos de Atendimento do Agente","description":"Lista os grupos/filas de atendimento de UM AGENTE (atendente): TODOS os grupos em que ele atende.\nGET /v1/attendance-group/agent?agent={id}\nGrupo: id, name, channel (voice/whatsapp/chat), broadcastEnabled.\nSUPERVISOR: \"quais grupos EU acompanho/faço parte?\" NÃO é esta tool; é weaction_supervisor_queues (filas que o supervisor acompanha) + weaction_list_departments (departamentos). Se a sessão for de supervisor e você chamar esta sem agent_id, ela devolve as filas do supervisor. Para \"em quais grupos o atendente X atende\", passe agent_id: a lista de grupos que aparece em weaction_supervisor_agents_performance mostra SÓ os grupos que o supervisor supervisiona, não todos os do atendente.\n\nUSE para descobrir o attendanceGroupId ao montar CAMPANHA/lista de transmissão (weaction_create_whatsapp_broadcast). only_whatsapp_broadcast=true retorna APENAS os grupos válidos para broadcast (channel='whatsapp' E broadcastEnabled=true, o mesmo filtro da UI); o attendanceGroupId DEVE ser um desses.\n\nArgs:\n  - agent_id (number, opcional): default = agente logado\n  - only_whatsapp_broadcast (boolean, opcional): só grupos WhatsApp com broadcast habilitado","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente (default: logado, via JWT)"},"only_whatsapp_broadcast":{"type":"boolean","description":"Só grupos WhatsApp com broadcast habilitado"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_group","title":"WeAction Create Group","description":"CRIA um grupo de atendimento (fila) no WeON, na unidade da sessão. É a mesma ação da tela Grupos > Novo do supervisor-web.\nPOST /v1/attendance-group/create (campos do WeOn: supervisor, attendanceGroupName, orgUnitId, channel)\n\nArgs:\n  - name (string): nome do grupo\n  - channel (string): canal — whatsapp | voice | chat | instagram | facebook (obrigatório no WeOn; sem ele a criação falha)\n  - supervisor_login (string, opcional): login do supervisor responsável; default = o do token da sessão\n\nDevolve a resposta do WeOn (id do grupo criado). Para colocar atendentes nele use weaction_group_add_agent.","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Nome do grupo"},"channel":{"type":"string","enum":["whatsapp","voice","chat","instagram","facebook"],"description":"Canal do grupo"},"supervisor_login":{"type":["string","null"],"description":"Login do supervisor responsável (default: o do token)"}},"required":["name","channel"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_queue_abandonment_events","title":"WeAction Abandono de Fila (contado por dia/fila)","description":"ABANDONOS de fila (quem desistiu antes de ser atendido), já CONTADOS: total, por dia, por hora e por fila, com tempo médio de espera antes de desistir.\n\nUSE para: \"quantos abandonos hoje/ontem/na semana?\", \"abandonos por dia\", \"qual fila mais perde\", \"atendimentos perdidos da recepção\". NÃO some nem conte na cabeça: os números já vêm fechados aqui.\n\nSó ações de ABANDONO contam (VoiceQueueAbandonAction e equivalentes de WhatsApp). O total de eventos brutos da fila (login, pausa, qualificação, novas chamadas) vem separado em `total_eventos_brutos` e NÃO é abandono — nunca apresente esse número como perdidos.\n\nAbandono é medido na FILA, não por atendente: o evento não carrega quem deixou de atender. Diga isso quando pedirem \"perdidos de fulano\".\n\nArgs:\n  - start_date / end_date (string, opcional): \"YYYY-MM-DD hh:mm:ss\". Default: hoje.\n  - groups (array de strings, opcional): ids dos grupos/filas\n  - agrupar_por (string, opcional): \"dia\" (default) | \"hora\" | \"fila\" | \"nenhum\"\n  - incluir_amostra (boolean, opcional, default false): traz até 20 eventos de abandono crus (protocolo, fila, espera)\n  - todas_as_acoes (boolean, opcional, default false): em vez de abandono, conta TODOS os eventos por ação (diagnóstico da fila)","inputSchema":{"type":"object","properties":{"start_date":{"type":"string","description":"Start date (YYYY-MM-DD hh:mm:ss)"},"end_date":{"type":"string","description":"End date (YYYY-MM-DD hh:mm:ss)"},"groups":{"type":"array","items":{"type":"string"},"description":"Filter by group IDs"},"agrupar_por":{"type":"string","enum":["dia","hora","fila","nenhum"]},"incluir_amostra":{"type":"boolean"},"todas_as_acoes":{"type":"boolean"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_campaigns","title":"WeAction List Voice Campaigns","description":"List all voice campaigns configured in the WeON system.\n\nReturns campaign id, name, type, status, and configuration details.\n\nGATILHOS EM PORTUGUÊS: \"quais ações de MARKETING vão rodar?\", \"campanhas\nagendadas/ativas\", \"disparos programados\", \"que campanha está no ar?\". As\ncampanhas do WeOn SÃO as ações de marketing/disparo da operação — responda\ncom esta lista (e a de WhatsApp) em vez de dizer que não há ações\nidentificadas. Caso Denis, 17/09: a pergunta tinha resposta aqui e o agente\nrespondeu com outra coisa.","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_mailing","title":"WeAction List Mailing (Voice Campaign)","description":"List mailings for a specific voice campaign (group type).\n\nArgs:\n  - campaign_id (string): Campaign ID\n\nReturns array of mailing objects.","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"string","minLength":1,"description":"Campaign ID"}},"required":["campaign_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_mailing","title":"WeAction Criar mailing de campanha de VOZ (com os contatos)","description":"CRIA um mailing (lista de contatos) numa campanha de VOZ existente, já com os contatos. O discador liga para eles quando a campanha estiver RODANDO (weaction_campaign_start, com aprovação).\nPOST /v3/campaigns/{id}/mailing/create. O WeOn casa cada contato com o LAYOUT de mailing da campanha pelos RÓTULOS das colunas, e exige TODAS as colunas: esta tool lê o layout (/v1/dialer/mailing-columns/{id}), preenche nome, TODAS as colunas de telefone e o identificador, e avisa as que ficaram vazias.\n\nCUIDADO: campanha que já tem mailing agendado liga para TODOS quando iniciar. Para teste, use campanha nova (weaction_campaign_create_voice) ou confira os agendados (weaction_campanha_resultado).\n\nArgs:\n  - campaign_id (string): id da campanha de voz\n  - name (string): nome do mailing\n  - contacts (array): [{ name, phone, extras? }] — phone com DDI+DDD só dígitos; extras = [{coluna, valor}] com o rótulo exato","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"string","minLength":1,"description":"Id da campanha de voz"},"name":{"type":"string","minLength":1,"description":"Nome do mailing"},"contacts":{"type":"array","items":{"type":"object","properties":{"name":{"type":["string","null"],"description":"Nome do contato"},"phone":{"type":"string","minLength":8,"description":"Telefone com DDI+DDD, só dígitos"},"extras":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"coluna":{"type":"string","minLength":1,"description":"Rótulo exato da coluna do layout"},"valor":{"type":"string","description":"Valor para essa coluna"}},"required":["coluna","valor"],"additionalProperties":false}},{"type":"null"}]}},"required":["phone"],"additionalProperties":false},"minItems":1,"description":"Contatos do mailing"}},"required":["campaign_id","name","contacts"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_create_mailing_telemensagem","title":"WeAction Create Mailing (URA/Audio Campaign)","description":"Create a new mailing for a URA or audio/telemensagem campaign.\n\nArgs:\n  - campaign_id (string): Campaign ID\n  - name (string): Mailing name\n  - description (string, optional): Description\n\nReturns the created mailing object.","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"string","minLength":1,"description":"Campaign ID"},"name":{"type":"string","minLength":1,"description":"Mailing name"},"description":{"type":"string"}},"required":["campaign_id","name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_add_contacts_to_mailing","title":"WeAction Add Contacts to Mailing (Voice Campaign)","description":"Add contacts to a mailing list in a voice group campaign.\n\nArgs:\n  - campaign_id (string): Campaign ID\n  - mailing_id (string): Mailing ID\n  - contacts (array): Array of contact objects to add\n  - campaign_type (string): \"group\" for group campaigns or \"telemensagem\" for URA/audio\n\nReturns confirmation from the API.","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"string","minLength":1,"description":"Campaign ID"},"mailing_id":{"type":"string","minLength":1,"description":"Mailing ID"},"contacts":{"type":"array","items":{"type":"object","additionalProperties":{}},"minItems":1,"description":"Contacts to add"},"campaign_type":{"type":"string","enum":["group","telemensagem"],"default":"group","description":"Campaign type: 'group' or 'telemensagem'"}},"required":["campaign_id","mailing_id","contacts"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_remove_contacts_from_mailing","title":"WeAction Remove Contacts from Mailing","description":"Remove contacts from a mailing list in a voice campaign.\n\nArgs:\n  - campaign_id (string): Campaign ID\n  - mailing_id (string): Mailing ID\n  - contact_ids (array of strings): Contact IDs to remove\n\nReturns confirmation from the API.","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"string","minLength":1},"mailing_id":{"type":"string","minLength":1},"contact_ids":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Contact IDs to remove"}},"required":["campaign_id","mailing_id","contact_ids"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_dialer_logs","title":"WeAction Dialer Logs","description":"Retrieve dialer (auto-dialer) event logs from voice campaigns.\n\nUseful for analyzing dialer performance, connection rates, and campaign results.\n\nArgs:\n  - start_date (string, optional): Start date (YYYY-MM-DD hh:mm:ss)\n  - end_date (string, optional): End date (YYYY-MM-DD hh:mm:ss)\n  - campaign_id (string, optional): Filter to a specific campaign\n\nReturns array of dialer log events.","inputSchema":{"type":"object","properties":{"start_date":{"type":"string"},"end_date":{"type":"string"},"campaign_id":{"type":"string","description":"Filter to specific campaign"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_whatsapp_campaigns","title":"WeAction List WhatsApp Campaigns","description":"List all WhatsApp mass-send campaigns configured in the WeON system.\n\nGATILHOS EM PORTUGUÊS: \"ações de MARKETING desta semana\", \"campanhas de\nWhatsApp agendadas/rodando\", \"disparos em massa programados\". Junto com\nweaction_list_campaigns (voz), esta lista É a resposta para \"que ações de\nmarketing vão rodar?\" — não responda \"não há ações identificadas\" sem\nconsultar as duas.","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_campaign_mailing_fields","title":"WeAction Campanha WhatsApp - Colunas exigidas do mailing","description":"COLUNAS que a planilha de mailing precisa ter para UMA campanha de WhatsApp (layout de mailing preso à campanha): rótulo, nome técnico, tipo, obrigatória. Chame ANTES de subir uma planilha para a campanha e compare com as colunas do arquivo; sem layout vinculado o WeOn não lê os contatos.\nGET /v3/campaigns-whatsapp/{campaign_id}/mailing/fields","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"string","minLength":1,"description":"Id da campanha ou o NOME que a pessoa disse"}},"required":["campaign_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_whatsapp_mailing","title":"WeAction List WhatsApp Campaign Mailing","description":"List mailings for a specific WhatsApp campaign.\n\nArgs:\n  - campaign_id (string): WhatsApp campaign ID","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"string","minLength":1,"description":"WhatsApp campaign ID"}},"required":["campaign_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_whatsapp_broadcast","title":"WeAction WhatsApp Broadcast (Lista de Transmissão)","description":"Dispara LISTA DE TRANSMISSÃO / campanha em lote de WhatsApp. POST /v1/broadcast/whatsapp\nUse ESTA tool para \"campanha\", \"lista de transmissão\", \"enviar em lote\". NÃO use weaction_create_whatsapp_mailing (outro fluxo, exige campaign_id).\nObrigatórios (422 se faltarem): template_id (template aprovado; descubra com weaction_list_whatsapp_campaigns), attendance_group_id (grupo/fila; weaction_list_groups), contacts (cada um com contactId e contactWhatsAppIdentifier).\n\nDE ONDE VÊM OS CONTATOS (leia antes de sair buscando um a um):\nToda lista da CARTEIRA já traz os 4 campos prontos — weaction_portfolio_inactive\n(adormecidos), _list, _risk, _active e weaction_carteira_radar. Monte direto:\n  contactId = contact_id · contactWhatsAppIdentifier = whatsapp\n  contactName = nome     · contactIdentifier = identifier\nDescarte quem estiver sem whatsapp e DIGA quantos ficaram de fora.\nNÃO chame weaction_search_broadcast_contacts para cada contato dessa lista: com\n60 adormecidos são 60 chamadas, o turno estoura no meio e a campanha nunca sai\n(caso real, 25/08/2026). Aquela tool é para contato AVULSO citado por nome, que\nnão veio de nenhuma lista.\n\nArgs:\n- name (string): nome da lista\n- message (string): texto da mensagem (template message)\n- template_id (number)\n- attendance_group_id (number)\n- contacts (array): [{ contactId, contactWhatsAppIdentifier, contactName?, contactIdentifier?, disabled? }]\n- media_url (string|null, opcional): URL de mídia\n- agent_id (string): o atendente DONO da campanha. Cai no do token quando existe,\n  mas no widget o token não o carrega — passe o mesmo agent_id que você usou para\n  ler a carteira, senão a API recusa o disparo.","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Nome da lista de transmissão"},"message":{"type":"string","minLength":1,"description":"Texto da mensagem (template message)"},"template_id":{"type":"integer","description":"ID do template de WhatsApp (obrigatório)"},"attendance_group_id":{"type":"integer","description":"ID do grupo/fila de atendimento (obrigatório)"},"contacts":{"type":"array","items":{"type":"object","properties":{"contactId":{"type":"integer","description":"ID interno do contato"},"contactWhatsAppIdentifier":{"type":"string","minLength":1,"description":"Número WhatsApp, ex.: 5511986824466"},"contactName":{"type":"string"},"contactIdentifier":{"type":"string"},"disabled":{"type":"boolean"}},"required":["contactId","contactWhatsAppIdentifier"],"additionalProperties":false},"minItems":1,"description":"Contatos da transmissão"},"media_url":{"type":["string","null"],"description":"URL de mídia (opcional)"},"agent_id":{"type":"string","description":"ID do agente (default: logado)"}},"required":["name","message","template_id","attendance_group_id","contacts"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_list_whatsapp_broadcasts","title":"WeAction Listar Transmissões + status (lido/respondeu)","description":"Lista as transmissões (campanhas) de WhatsApp do agente COM status de cada envio.\nGET /v1/broadcast/whatsapp/agent/{agent_id}\nStatus por contato: QUEUED, SENDING, SENT, DELIVERED, READ (lido), ANSWERED (respondeu), ERROR_* (falhas: sessão expirada, sem opt-in, etc.).\nUSE para \"quantos leram / responderam / falharam\" numa campanha.\n\nArgs:\n- broadcast_id (number, opcional): filtra uma transmissão\n- summarize (boolean, opcional, default true): contagem por status (enxuto); false = payload completo (pode truncar)\n- agent_id (number, opcional): default = agente logado","inputSchema":{"type":"object","properties":{"broadcast_id":{"type":"integer","description":"Filtra uma transmissão específica"},"summarize":{"type":"boolean","description":"Resumo por status (default true)"},"agent_id":{"type":"integer","description":"ID do agente (default: logado)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_search_broadcast_contacts","title":"WeAction Buscar Contatos p/ Transmissão","description":"Resolve contato AVULSO citado por nome/telefone para o formato da transmissão.\nGET /v1/contacts?agent={agent_id}&name={query}&broadcast=false\nRetorna cada contato JÁ no formato de weaction_create_whatsapp_broadcast ({ contactId, contactWhatsAppIdentifier, contactName, contactIdentifier }): use direto no campo 'contacts'.\n\nNÃO É PARA MONTAR LISTA DA CARTEIRA. Adormecidos, risco e radar já devolvem os\n4 campos prontos — monte a partir deles (veja weaction_create_whatsapp_broadcast).\nAqui é para o nome solto que o usuário citou e não está em lista nenhuma.\n\nVários nomes de uma vez: passe 'queries' (uma chamada só). Quem não for\nencontrado volta em nao_encontrados — trate como pendência, não como inexistente.\n\nArgs:\n- query (string, opcional): um termo (nome ou telefone)\n- queries (array de string, opcional): vários termos numa chamada (máx 100)\n- agent_id (number, opcional): default = agente logado","inputSchema":{"type":"object","properties":{"query":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Um termo de busca (nome ou telefone do contato)"},"queries":{"anyOf":[{"type":"array","items":{"type":"string","minLength":1}},{"type":"null"}],"description":"Vários termos numa chamada só (máx 100)"},"agent_id":{"type":"integer","description":"ID do agente (default: logado)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_whatsapp_templates","title":"WeAction Templates de WhatsApp (Gupshup) — inventário com status","description":"INVENTARIA os templates de WhatsApp cadastrados, COM status de aprovação da Meta e categoria.\n\n- CHAME ANTES de propor criar qualquer template. Criar é a ÚLTIMA opção: REUSE um APROVADO que sirva à intenção; só proponha criar quando NENHUM aprovado servir, e diga o motivo.\n- Sem attendance_group_id → inventário da UNIDADE inteira (GET /v1/campaign-whatsapp/load-whatsapp-templates/{org}). Com attendance_group_id → templates da fila (GET /v1/gupshup/templates/group/{id}), aprovados primeiro.\n- Cada item: template_id (valor a usar em broadcast/envio), name, message (o texto; julgue se serve), categoria (MARKETING/UTILITY/AUTHENTICATION), status (APPROVED/PENDING/REJECTED), aprovado (bool), motivo_recusa. O resumo traz 'aprovados' (usáveis AGORA): NÃO afirme \"não há template aprovado\" sem ter chamado esta tool e visto aprovados=0.\n- AMPLIAÇÃO AUTOMÁTICA: fila com aprovados=0 → resposta traz 'na_unidade' com os aprovados da UNIDADE não vinculados à fila. Se 'na_unidade' vier preenchido, é PROIBIDO dizer que não há template aprovado e propor criar um novo: ofereça vincular um existente à fila ou disparar por fila que já o tenha (criar = esperar até 48h da Meta por algo que já existe).\n- Fluxo de campanha: (1) weaction_list_agent_attendance_groups(only_whatsapp_broadcast=true) → attendance_group_id; (2) ESTA tool com esse grupo → template_id; (3) weaction_create_whatsapp_broadcast.\n\nDIETA DE TOKENS (F2, 19/08): no INVENTÁRIO grande (>6 templates, sem filtro) o campo message vem RESUMIDO (message_truncada=true quando cortado). Para ENVIAR é OBRIGATÓRIO o texto COMPLETO (o disparo casa por texto, verbatim): rechame com template_id=<id> (ou buscar=<trecho do nome>) e use o message integral que voltar. NUNCA envie um message que veio com message_truncada=true.\n\nArgs:\n- attendance_group_id (number, OPCIONAL): ID do grupo/fila. OMITA para inventariar a unidade toda.\n- template_id (number, OPCIONAL): foca em UM template e devolve o texto COMPLETO (use antes de enviar).\n- buscar (string, OPCIONAL): filtra por trecho do nome ou do texto; resultados focados vêm com texto COMPLETO.","inputSchema":{"type":"object","properties":{"attendance_group_id":{"type":"integer","description":"ID do grupo/fila. OMITA para inventariar os templates da unidade inteira."},"template_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Foca em UM template (texto COMPLETO). Use antes de enviar."},"buscar":{"type":["string","null"],"description":"Filtra por trecho do nome/texto; focado vem com texto completo."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_whatsapp_mailing","title":"WeAction Create WhatsApp Mailing","description":"CRIA um mailing (lista de contatos) DENTRO de uma campanha de WhatsApp existente, já com o template que vai disparar.\nPOST /v3/campaigns-whatsapp/{campaign_id}/mailing/create — o WeOn exige: mailing_name, contacts, dynamic_mailing, auto_schedule e whatsapp_template_id.\n\nCOMO O WEON LÊ OS CONTATOS (06/09/2026, medido no MailingRepository): cada contato é casado com o LAYOUT DE MAILING preso à campanha, coluna por coluna, pelo RÓTULO da coluna (ex.: \"Nome completo\", \"Telefone\", \"E-mail\"). Esta tool busca o layout da campanha, casa name/phone/email com as colunas e avisa as colunas que ficaram sem valor. Se a campanha NÃO tem layout de mailing, o WeOn não sabe ler a planilha: diga ao supervisor para escolher um layout na campanha (tela Campanhas) antes.\nColunas extras do layout (CPF, código do cliente...): passe em `extras` por contato, com a chave = rótulo exato (veja weaction_campaign_mailing_fields).\n\nFLUXO (planilha → campanha): 1) leia a planilha (dataset_load_attachment); 2) escolha a campanha (weaction_list_whatsapp_campaigns), confira as colunas exigidas (weaction_campaign_mailing_fields) e o template APROVADO (weaction_list_whatsapp_templates); 3) mostre o resumo e peça aprovação; 4) chame esta tool. Para criar a campanha do zero use weaction_campaign_create_whatsapp.\n\nArgs:\n  - campaign_id (string): id da campanha de WhatsApp — OU campanha (string): o NOME que a pessoa disse (a tool acha o id)\n  - name (string): nome do mailing\n  - whatsapp_template_id (int): template aprovado que será disparado (obrigatório no WeOn)\n  - contacts (array): [{ name, phone, email?, extras? }] — phone com DDI+DDD só dígitos; extras = [{coluna, valor}]\n  - dynamic_mailing (boolean, opcional, default false) · auto_schedule (boolean, opcional, default false)\n  - whatsapp_media_url (string, opcional): mídia do template","inputSchema":{"type":"object","properties":{"campaign_id":{"type":["string","null"],"description":"Id da campanha de WhatsApp"},"campanha":{"type":["string","null"],"description":"OU o NOME da campanha (a tool acha o id); use o nome que a pessoa disse"},"name":{"type":"string","minLength":1,"description":"Nome do mailing"},"whatsapp_template_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Id do template APROVADO da rota da campanha; sem ele a tool devolve os aprovados da rota com um recomendado"},"contacts":{"type":"array","items":{"type":"object","properties":{"name":{"type":["string","null"],"description":"Nome do contato"},"phone":{"type":"string","minLength":8,"description":"Telefone com DDI+DDD, só dígitos"},"email":{"type":["string","null"]},"extras":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"coluna":{"type":"string","minLength":1,"description":"Rótulo exato da coluna do layout"},"valor":{"type":"string","description":"Valor para essa coluna"}},"required":["coluna","valor"],"additionalProperties":false}},{"type":"null"}],"description":"Outras colunas do layout de mailing"}},"required":["phone"],"additionalProperties":false},"minItems":1,"description":"Contatos do mailing"},"dynamic_mailing":{"type":["boolean","null"]},"auto_schedule":{"type":["boolean","null"]},"whatsapp_media_url":{"type":["string","null"]}},"required":["name","contacts"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_add_contact_to_whatsapp_mailing","title":"WeAction Add Contact to WhatsApp Mailing","description":"Add a contact to a WhatsApp campaign mailing list.\n\nArgs:\n  - campaign_id (string): WhatsApp campaign ID\n  - mailing_id (string): Mailing ID\n  - contact (object): Contact data to add","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"string","minLength":1},"mailing_id":{"type":"string","minLength":1},"contact":{"type":"object","additionalProperties":{},"description":"Contact data to add"}},"required":["campaign_id","mailing_id","contact"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_remove_contact_from_whatsapp_mailing","title":"WeAction Remove Contact from WhatsApp Mailing","description":"Remove a contact from a WhatsApp campaign mailing list.\n\nArgs:\n  - campaign_id (string): Campaign ID\n  - mailing_id (string): Mailing ID\n  - contact_id (string): Contact ID to remove","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"string","minLength":1},"mailing_id":{"type":"string","minLength":1},"contact_id":{"type":"string","minLength":1,"description":"Contact ID to remove"}},"required":["campaign_id","mailing_id","contact_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_send_whatsapp_message","title":"WeAction Enviar Mensagem WhatsApp (janela aberta)","description":"Envia mensagem de WhatsApp 1:1 pelo MESMO caminho do chat do app (v1 /whatsapp/messages).\nSÓ FUNCIONA com a janela de 24h ABERTA (atendimento aberto com sessão ativa) — fora da\njanela NÃO use esta tool nem a de template crua: escolha o template aprovado com\ncarteira_templates e dispare com carteira_enviar_template (com aprovação). Confirme a\njanela com weaction_acionamento_recomendado ou weaction_whatsapp_janela ANTES.\nSEMPRE confirme o texto com o usuário antes de enviar.\n\nArgs:\n  - to (string): telefone do contato com DDI (ex 5511999999999)\n  - message (string): texto da mensagem\n  - agent_id (string, opcional): ID do atendente remetente; default = usuário logado\n  - contact_id (number, opcional): ID do contato (rastreabilidade)","inputSchema":{"type":"object","properties":{"to":{"type":"string","minLength":1,"description":"Telefone com DDI (ex 5511999999999)"},"message":{"type":"string","minLength":1,"description":"Texto da mensagem"},"agent_id":{"type":"string","description":"ID do atendente remetente (default: logado)"},"contact_id":{"type":"integer","description":"ID do contato (opcional)"}},"required":["to","message"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_whatsapp_janela","title":"WeAction Janela 24h do Contato (como o app verifica)","description":"Verifica a JANELA de 24h de um contato pelo MESMO protocolo do app: atendimento\nABERTO + check-active-sessions. Janela ABERTA = pode mensagem livre (1:1); FECHADA ou sem\natendimento aberto = só template via campanha (weaction_send_whatsapp_template).\nPOST v1 /attendances/search + POST v1 /job/whatsapp/check-active-sessions\n\nSEMPRE que o contexto da tela trouxer \"protocolo=\" (atendimento em foco), PASSE-O em\nprotocol — é o caminho INSTANTÂNEO (zero busca). Junto, passe contato (id) do contexto.\nNUNCA tente descobrir o contato varrendo dados fora do foco da tela/carteira.\n\nArgs:\n  - protocol (string, opcional): protocolo do atendimento EM FOCO (do contexto da tela) — preferencial\n  - phone (string, opcional): telefone do contato com DDI\n  - contato (string, opcional): nome OU id do contato — resolvo a ficha (id) ou o\n    atendimento aberto. Passe pelo menos um dos três.","inputSchema":{"type":"object","properties":{"protocol":{"type":"string","description":"Protocolo do atendimento em foco (contexto da tela) — preferencial"},"phone":{"type":"string","description":"Telefone com DDI (se souber)"},"contato":{"type":"string","description":"Nome ou id do contato — resolvo o telefone pela ficha/atendimento"},"grupo":{"type":"string","description":"Grupo/fila do atendimento (o `grupo=` do contexto da tela). É ele que diz se a rota é OFICIAL — e em rota não-oficial a janela da Meta nem se aplica. Sem ele, tento derivar do atendimento."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_start_bot_flow","title":"WeAction Start Bot Flow","description":"Trigger the start of a bot attendance flow for a contact on WhatsApp.\n\nUsed to proactively initiate a bot conversation with a contact.\n\nArgs:\n  - phone (string): Contact phone number (with country code)\n  - bot_id (string, optional): Specific bot ID to trigger\n  - group_id (string, optional): Attendance group to route to after bot\n\nReturns confirmation and the created attendance session.","inputSchema":{"type":"object","properties":{"phone":{"type":"string","minLength":1,"description":"Contact phone number with country code"},"bot_id":{"type":"string","description":"Bot ID to trigger"},"group_id":{"type":"string","description":"Group to route after bot completion"}},"required":["phone"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_whatsapp_message_status","title":"WeAction WhatsApp Message Status","description":"Check the delivery status of sent WhatsApp messages.\n\nQueries the queue-events endpoint to get current status (sent, delivered, read, failed).\n\nArgs:\n  - message_id (string, optional): Specific message ID to check\n  - start_date (string, optional): Start date for status query (YYYY-MM-DD hh:mm:ss)\n  - end_date (string, optional): End date for status query\n\nReturns array of message status events.","inputSchema":{"type":"object","properties":{"message_id":{"type":"string","description":"Specific message ID"},"start_date":{"type":"string","description":"Start date (YYYY-MM-DD hh:mm:ss)"},"end_date":{"type":"string","description":"End date"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_whatsapp_history","title":"WeAction WhatsApp Attendance History","description":"Retrieve the full message history for a WhatsApp attendance by protocol number.\n\nReturns all messages exchanged during the attendance, including timestamps, direction\n(inbound/outbound), media attachments, and agent/bot info.\n\nArgs:\n  - protocol (string): Attendance protocol number\n\nReturns array of message objects for the attendance.\n\nREGRA DURA: UMA chamada por protocolo e suficiente. Nao alterne com conversation_messages/list_conversation_logs em busca do mesmo dado.","inputSchema":{"type":"object","properties":{"protocol":{"type":"string","minLength":1,"description":"Attendance protocol number"}},"required":["protocol"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_whatsapp_template","title":"WeAction Criar Template WhatsApp (HSM) — submete à Meta","description":"CRIA template HSM no WeON e SUBMETE à aprovação da Meta via Gupshup.\nPOST /v1/whatsapp-templates/{supervisor}/create — mesmo fluxo da tela \"Nova mensagem\".\n\nESCRITA REAL: só chame após o usuário aprovar o kit (nome, categoria, corpo, exemplo,\nbotões). NUNCA diga que criou/registrou sem SUCESSO desta tool. Criado = PENDENTE na\nMeta (minutos até 48h), inutilizável até aprovar — acompanhe com\nweaction_list_whatsapp_templates.\n\nVARIÁVEL = NOME DO CAMPO DO CADASTRO: {{fullname}}, {{agentfirstname}}, {{revenue}}.\nNÃO use posicional {{1}}/{{2}}: o WeOn preenche por NOME de campo; posicional sai\nVAZIO no cliente. A tool recusa posicional. A conversão pro formato da Meta\n(messageParsed com {{1}} na ordem) é AUTOMÁTICA — não faça à mão.\n\nPráticas (skill weon_templates_hsm): exemplo com valores preenchidos; categoria\nhonesta; cheque templates existentes antes (variante quase idêntica é rejeitada).\n\nCATEGORIA (a Meta decide, não nós): reabrir conversa, reengajar, \"sentimos sua falta\",\nconvite e oferta = MARKETING. UTILITY só transação/solicitação EM ANDAMENTO do próprio\ncliente (status de pedido, confirmação de agendamento, fatura, código). Reengajamento\ncomo utility = Meta reclassifica/rejeita (INCORRECT_CATEGORY).\n\nArgs:\n  - nome (string): elementName snake_case minúsculo (ex: retencao_retorno_pendente)\n  - categoria (string): marketing | utility | authentication\n  - corpo (string): texto com variáveis NOMEADAS, ex. \"Olá, {{fullname}}.\" (máx 1024;\n    chave simples {fullname} é aceita e normalizada)\n  - exemplo (string): o corpo com as variáveis PREENCHIDAS (obrigatório p/ aprovação)\n  - org_unit_id (number, opcional): default do contexto\n  - route_id (number): NÃO INFORME — o sistema resolve a 1ª rota Gupshup apta da\n    unidade; rota sem app de parceiro é trocada pela apta com aviso. NUNCA pergunte a\n    rota ao usuário nem bloqueie por causa dela.\n  - rodape (string, opcional): footer curto\n  - botoes (string[], opcional): até 3 rótulos de RESPOSTA RÁPIDA (≤20 chars cada)\n  - nome_exibicao (string, opcional): nome do preset no WeON (default = nome)\n  - attendance_group_ids (number[]): NÃO INFORME — a tool vincula às filas de WhatsApp\n    aptas do atendente; template sem fila não aparece na tela (nasce inutilizável).\n  - supervisor (string, opcional): login do supervisor (default = identidade da sessão)","inputSchema":{"type":"object","properties":{"nome":{"type":"string","minLength":3,"pattern":"^[a-z0-9_]+$"},"categoria":{"type":"string","enum":["marketing","utility","authentication"]},"corpo":{"type":"string","minLength":10,"maxLength":1024},"exemplo":{"type":"string","minLength":10},"org_unit_id":{"type":"integer"},"route_id":{"type":"integer"},"rodape":{"type":"string","maxLength":60},"botoes":{"type":"array","items":{"type":"string","minLength":1,"maxLength":25},"maxItems":3},"nome_exibicao":{"type":"string"},"attendance_group_ids":{"type":"array","items":{"type":"integer"}},"supervisor":{"type":"string"}},"required":["nome","categoria","corpo","exemplo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_whatsapp_rotas","title":"WeAction WhatsApp - Rotas Disponíveis","description":"LISTA as rotas de WhatsApp HABILITADAS visíveis para a sessão (id, nome, número).\nUse SEMPRE antes de afirmar que \"não há rota\": cite a UO consultada e o resultado.\nSe vier vazio e o usuário disser que a rota existe, ela provavelmente está em OUTRA\nunidade organizacional — pergunte/tente com org_unit_id explícito.","inputSchema":{"type":"object","properties":{"org_unit_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0},{"type":"null"}],"description":"UO a consultar (default: a da sessão). Use quando a rota mora em outra unidade."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_acionamento_recomendado","title":"WeAction Acionamento - Melhor Canal por Contato","description":"DECIDE o melhor canal de acionamento para cada contato (determinístico) — use ANTES de\npropor qualquer envio. Regras:\n  - janela WhatsApp ABERTA (última msg do contato < 24h) → mensagem livre (weaction_send_whatsapp_message)\n  - janela FECHADA mas tem WhatsApp → template aprovado (weaction_send_whatsapp_template)\n  - sem WhatsApp mas com e-mail → e-mail (weaction_send_email)\n  - sem canal digital → ligar AGORA (weaction_abrir_atendimento_ativo); se for para depois,\n    aí sim agendar a ligação (weaction_create_task)\n  - 3+ contatos no grupo \"template\" → sugerir CAMPANHA/broadcast em vez de 1:1\nRetorna os grupos por canal com payload pronto + as rotas e templates disponíveis.\nNADA é enviado por esta tool — ela só decide. Proponha ao usuário e aguarde aprovação.\n\nArgs:\n  - contatos (array): [{contact_id?, nome?, whatsapp?, email?}] — passe o que tiver\n    (da carteira/portfolio: identifier = whatsapp). Máx 30.\n  - incluir_templates (boolean, default true): anexa a lista de templates da rota","inputSchema":{"type":"object","properties":{"contatos":{"type":"array","items":{"type":"object","properties":{"contact_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"nome":{"type":["string","null"]},"whatsapp":{"type":["string","null"],"description":"Telefone com DDI, ex 5511999999999"},"email":{"type":["string","null"]}},"additionalProperties":false},"minItems":1,"maxItems":30},"incluir_templates":{"type":"boolean"}},"required":["contatos"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_send_whatsapp_template","title":"WeAction Enviar Template WhatsApp (janela fechada — via campanha)","description":"Envia um TEMPLATE aprovado de WhatsApp (HSM) para UM contato fora da janela de 24h,\npelo motor de campanha do app (v1 /broadcast/whatsapp — cria uma lista de transmissão de\n1 contato, o mesmo caminho da tela Transmissão). Para vários contatos com o mesmo\ntemplate, prefira weaction_create_whatsapp_broadcast direto.\nDescubra o template com weaction_list_whatsapp_templates. SEMPRE confirme com o usuário o\ntemplate e o texto final ANTES de enviar. O envio entra na FILA (status em\nweaction_list_whatsapp_broadcasts).\n\nArgs:\n  - to (string): telefone do contato com DDI\n  - contact_id (number): ID interno do contato (obrigatório pro motor de campanha)\n  - contact_name (string, opcional): nome do contato\n  - message (string): texto final do template com os parâmetros já substituídos\n  - template_id (number): preset_message_id do template cadastrado\n  - attendance_group_id (number, opcional): fila/grupo; omitido = 1ª fila WhatsApp do agente\n  - name (string, opcional): nome da campanha (default gerado)","inputSchema":{"type":"object","properties":{"to":{"type":"string","minLength":1},"contact_id":{"type":"integer","description":"ID interno do contato"},"contact_name":{"type":"string"},"message":{"type":"string","minLength":1,"description":"Corpo final do template"},"template_id":{"type":"integer","description":"preset_message_id do template"},"attendance_group_id":{"type":"integer"},"name":{"type":"string"}},"required":["to","contact_id","message","template_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_send_email","title":"WeAction Enviar E-mail (caixa do atendente)","description":"Envia e-mail pela caixa configurada de um ATENDENTE no WeOn.\nPOST v1 /email/agent/{agent_id}/send. Requer conta de e-mail configurada para o atendente\n(sem conta → erro orientando configurar em WeOn > E-mail). SEMPRE confirme com o usuário\ndestinatário/assunto/corpo ANTES de enviar.\n\nNÃO precisa de template salvo: você pode REDIGIR um e-mail marketing na hora, sob medida\npara a situação (assunto forte, corpo HTML bem formatado, CTA claro) e enviar como content.\nTemplates salvos (weaction_list_email_templates) são atalho opcional de reuso.\n\nANEXOS: para anexar um arquivo (ex.: a PROPOSTA gerada por carteira_proposta), passe\nattachment_urls com a download_url EXATAMENTE como veio no resultado da tool que gerou\no arquivo (URL absoluta assinada — não invente nem encurte). O envio só sai se TODOS\nos anexos subirem: se algum falhar, NADA é enviado (e-mail prometendo anexo sem anexo\né pior que não enviar).\n\nArgs:\n  - agent_id (number): atendente cuja caixa envia (default = usuário do contexto)\n  - to (string ou array): destinatário(s)\n  - subject (string), content (string): assunto e corpo (HTML permitido)\n  - cc / bcc (array, opcional)\n  - attachment_urls (array de string, opcional): URLs absolutas de arquivos pra anexar (máx 5, 25MB cada)","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer"},"to":{"anyOf":[{"type":"string","minLength":3},{"type":"array","items":{"type":"string","minLength":3},"minItems":1}]},"subject":{"type":"string","minLength":1},"content":{"type":"string","minLength":1},"cc":{"type":"array","items":{"type":"string"}},"bcc":{"type":"array","items":{"type":"string"}},"attachment_urls":{"type":"array","items":{"type":"string","minLength":8},"maxItems":5,"description":"URLs absolutas (https) de arquivos pra anexar — ex.: download_url de proposta gerada"}},"required":["to","subject","content"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_list_email_templates","title":"WeAction Templates de E-mail (marketing)","description":"Lista os TEMPLATES SALVOS de e-mail da unidade — ATALHO OPCIONAL de reuso, não\npré-requisito: você pode redigir um e-mail marketing na hora e enviar direto via\nweaction_send_email. GET v1 /email/template.\nUse quando fizer sentido reusar uma peça pronta; se a peça que você redigiu ficou boa e\nreutilizável, OFEREÇA salvar como template (weaction_create_email_template).\n\nArgs:\n  - per_page (number, default 20), page (default 1)\n  - org_unit_id (number, opcional): default = do contexto","inputSchema":{"type":"object","properties":{"per_page":{"type":"integer"},"page":{"type":"integer"},"org_unit_id":{"type":"integer"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_email_template","title":"WeAction Criar Template de E-mail","description":"Cria um TEMPLATE de e-mail reutilizável na unidade (marketing/relacionamento).\nPOST v1 /email/template. SEMPRE mostre nome, assunto e corpo ao usuário e confirme ANTES.\n\nArgs:\n  - nome (string, máx 80), assunto (string, máx 120)\n  - conteudo (string): corpo do e-mail (HTML permitido; use placeholders claros tipo {nome})\n  - org_unit_id (number, opcional): default = do contexto","inputSchema":{"type":"object","properties":{"nome":{"type":"string","minLength":1,"maxLength":80},"assunto":{"type":"string","minLength":1,"maxLength":120},"conteudo":{"type":"string","minLength":1},"org_unit_id":{"type":"integer"}},"required":["nome","assunto","conteudo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_list_agent_emails","title":"WeAction Caixa de E-mail do Atendente (triagem)","description":"Lê a caixa de e-mail de um atendente no WeOn (INBOX, SENT etc.) e ASSOCIA cada remetente\nao contato/empresa da carteira (match determinístico por e-mail via busca de contatos).\nGET v1 /email/agent/{agent_id}. Sem caixa configurada → a tool devolve nao_aplicavel: NÃO analise, NÃO avise e NÃO mencione e-mail na resposta.\n\nAo analisar os e-mails recebidos, avalie o SENTIMENTO de cada um (indignação, reclamação,\nurgência, elogio) pelo assunto + corpo: e-mail indignado de contato da carteira é SINAL DE\nRISCO — proponha ação (responder com aprovação, criar tarefa, alertar o gestor).\nweaction_email_reply usa o uid + folder retornados aqui.\n\nA CAIXA É PAGINADA e pode ter centenas de e-mails (medido: 775 numa caixa real da WeON). Página 1\n= os MAIS RECENTES (ordem por id desc). NUNCA conclua \"não tem e-mail de X\" olhando só a 1ª\npágina: para triagem use varrer_paginas (varre da mais recente para trás e aplica os filtros em\ntodas). O retorno traz total, paginas_lidas, emails_vistos, has_more e next_page — CITE a\ncobertura (\"li os 250 mais recentes de 775\") em vez de falar como se tivesse visto a caixa toda.\n\nArgs:\n  - agent_id (number, opcional): default = usuário do contexto\n  - folder (string, default \"INBOX\"): INBOX | SENT | DRAFTS | TRASH\n  - read (boolean, opcional): true = só lidos, false = só não lidos, null = TODOS (default)\n  - per_page (number, default 25, teto 100)\n  - page (number, default 1): 1 = mais recentes\n  - varrer_paginas (number, opcional): varre N páginas a partir de page (teto 10) aplicando os\n    filtros abaixo — é o modo TRIAGEM (\"tem algo sem resposta?\", \"chegou e-mail da Ademicon?\")\n  - de_contem (string, opcional): filtra por remetente (nome ou e-mail; ignora acento/caixa)\n  - assunto_contem (string, opcional): filtra por assunto\n  - desde_dias (number, opcional): só e-mails dos últimos N dias (na varredura, para cedo)\n  - so_da_carteira (boolean, opcional): só os que casaram com contato da carteira\n  - sem_resposta (boolean, opcional): SÓ o que chegou e NÃO foi respondido. Cruza a INBOX com\n    a pasta SENT (mesmo remetente, envio nosso posterior) e devolve ordenado pelo que espera há\n    mais tempo, com aguardando_horas. É a resposta de \"tem e-mail de cliente sem resposta?\"\n  - associar_contatos (boolean, default true): cruza remetente com a carteira","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer"},"folder":{"type":"string"},"read":{"type":["boolean","null"]},"per_page":{"type":"integer"},"page":{"type":"integer"},"varrer_paginas":{"anyOf":[{"type":"integer"},{"type":"null"}]},"de_contem":{"type":["string","null"]},"assunto_contem":{"type":["string","null"]},"desde_dias":{"anyOf":[{"type":"integer"},{"type":"null"}]},"so_da_carteira":{"type":["boolean","null"]},"sem_resposta":{"type":["boolean","null"]},"associar_contatos":{"type":"boolean"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_email_reply","title":"WeAction Responder E-mail (mantém a thread)","description":"RESPONDE um e-mail existente pela caixa do atendente, mantendo a thread.\nPOST v1 /email/agent/{agent_id}/reply. Descubra uid/folder com weaction_list_agent_emails.\nSEMPRE confirme o texto com o usuário ANTES de enviar.\n\nArgs:\n  - agent_id (number, opcional): default = usuário do contexto\n  - uid (string): UID do e-mail original (de weaction_list_agent_emails)\n  - folder (string, default \"INBOX\"): pasta do e-mail original\n  - to (string ou array): destinatário(s)\n  - subject (string), content (string): assunto e corpo (HTML permitido)\n  - cc / bcc (array, opcional)","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer"},"uid":{"type":"string","minLength":1},"folder":{"type":"string"},"to":{"anyOf":[{"type":"string","minLength":3},{"type":"array","items":{"type":"string","minLength":3},"minItems":1}]},"subject":{"type":"string","minLength":1},"content":{"type":"string","minLength":1},"cc":{"type":"array","items":{"type":"string"}},"bcc":{"type":"array","items":{"type":"string"}}},"required":["uid","to","subject","content"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_objetivos_do_agente","title":"WeAction Objetivos - Dashboard do Atendente","description":"Objetivos do ciclo de UM atendente (aba \"Objetivos\" da carteira): concluídos/total e, por objetivo: nome, atividade, recorrência, dias restantes, cobertura (feitas/meta/faltam) e o quadro (data_field_status_group_id) das tarefas dele.\nGET v3 /objectives/agent/{agent_id}/dashboard\nUSE para \"como estão meus objetivos?\", \"o que falta pra fechar o ciclo?\". CRUZE com a carteira: objetivo atrasado + carteira com risco = priorize as tarefas do objetivo que tocam os clientes em risco.\n\nArgs:\n- agent_id (number): atendente dono dos objetivos","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer"}},"required":["agent_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_objetivos","title":"WeAction Objetivos - Listar (visão supervisor)","description":"Lista os objetivos configurados na unidade (visão de quem CONFIGURA — supervisor).\nGET v1 /objectives. Para a visão de UM atendente use weaction_objetivos_do_agente.\n\nArgs:\n  - supervisor_id (string): login do supervisor (ex: suprogerio)\n  - org_unit_id (number, opcional): default = do contexto\n  - search (string, opcional), status (string, opcional)\n  - per_page (default 20), page (default 1)","inputSchema":{"type":"object","properties":{"supervisor_id":{"type":["string","null"],"description":"Login do supervisor. Omita: sai do token."},"org_unit_id":{"type":"integer"},"search":{"type":"string"},"status":{"type":"string"},"per_page":{"type":"integer"},"page":{"type":"integer"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_objetivo_detalhe","title":"WeAction Objetivos - Detalhe / Ciclos / Histórico","description":"Detalhe de um objetivo: configuração completa, ciclos (recorrências passadas) ou\nhistórico de mudanças. GET v1 /objectives/{id}/details | /cycles | /history.\n\nArgs:\n  - objetivo_id (number)\n  - visao (string, default \"details\"): details | cycles | history","inputSchema":{"type":"object","properties":{"objetivo_id":{"type":"integer"},"visao":{"type":"string","enum":["details","cycles","history"]}},"required":["objetivo_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_objetivo","title":"WeAction Objetivos - Criar (fluxo do supervisor)","description":"CRIA um objetivo (regra de recorrência de tarefas) para atendentes, fluxo do SUPERVISOR.\nPOST v1 /objectives (somente_preview=true → POST /objectives/preview, dry-run SEM criar).\n\nO QUE É: uma REGRA que gera tarefas em ciclo (semanal, trimestral...) sobre a\ncarteira INTEIRA de cada atendente escolhido, cobrindo a meta de %.\n\nO QUE NÃO É, e por isso NÃO peça ao usuário:\n- objetivo NÃO tem contato/cliente. Quem tem contato é a TAREFA\n  (weaction_create_task). Nunca pergunte \"para qual cliente é o objetivo\": a\n  resposta é \"para a carteira\", e é isso que objective_portfolio_type diz.\n- objetivo NÃO cria quadro nem tipo de tarefa. É PROIBIDO chamar\n  weaction_create_task_board ou weaction_create_task_type para viabilizar um\n  objetivo: use os que já existem e, se o que o usuário citou não existir,\n  PERGUNTE qual usar, listando os que existem.\n\nCHAME DIRETO, em UMA chamada: passe **quadro** e **tipo_tarefa** com os NOMES\nque o usuário falou (\"Fluxo Nôa\", \"QBR com cliente\") — esta tool resolve os ids\nsozinha, inclusive o status que conta como concluída. NÃO saia descobrindo\nantes: se algo não casar, eu recuso dizendo exatamente o que falta e quais são\nas opções reais. Só use os campos de id quando você JÁ tem o id na mão.\n\nArgs (contrato validado no ObjectiveValidator):\n- org_unit_id (number, opcional: default do contexto)\n- supervisor_id (string): login do supervisor dono\n- objective_name / objective_description (string)\n- quadro (string): NOME do quadro (\"Fluxo Nôa\") — preferido\n- tipo_tarefa (string): NOME do tipo/atividade (\"QBR com cliente\") — preferido\n- data_field_status_group_id (number): id do QUADRO, se você já tiver\n- data_field_status_id (number): id do status que conta como CONCLUÍDA\n- objective_task_title (string): título-base das tarefas\n- objective_completion_rule: ALL | ANY (aceita \"todas\"/\"qualquer\")\n- objective_portfolio_type: CONTACT | EMPLOYER (aceita \"contato\"/\"empresa\")\n- objective_coverage_goal_percent (number > 0): meta de cobertura (%)\n- objective_recurrence_type: WEEKLY | MONTHLY | QUARTERLY | SEMIANNUAL | SINGLE (aceita \"trimestral\" etc)\n- objective_recurrence_start_date (string YYYY-MM-DD)\n- objective_ending_type: CONTINUOUS | DATE | CYCLES. DATE exige ending_date; CYCLES exige ending_cycles; SINGLE exige DATE + data\n- channel_ids (number[]): canais/atividades do objetivo\n- agent_ids: atendentes (a API exige TEXTO; manda numero que eu converto)\n- template_contact_filter_id (number, opcional): segmento de contatos\n- somente_preview (boolean, default false)","inputSchema":{"type":"object","properties":{"org_unit_id":{"type":"integer"},"supervisor_id":{"type":["string","null"],"description":"Login do supervisor. Omita: sai do token."},"objective_name":{"type":"string","minLength":1},"objective_description":{"type":"string","minLength":1},"quadro":{"type":["string","null"],"description":"NOME do quadro ('Fluxo Nôa'). Preferido: eu resolvo o id e o status de concluída."},"tipo_tarefa":{"type":["string","null"],"description":"NOME do tipo/atividade ('QBR com cliente'). Preferido: eu resolvo o channel_id."},"data_field_status_group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"id do quadro — só se você já tiver; senão use `quadro`."},"data_field_status_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"id do status de concluída — resolvido do quadro quando você usa `quadro`."},"objective_task_title":{"type":"string","minLength":1},"objective_completion_rule":{"type":"string","minLength":1,"description":"ALL (todas as tarefas) | ANY (qualquer uma). Aceita 'todas'/'qualquer'."},"objective_portfolio_type":{"type":"string","minLength":1,"description":"CONTACT | EMPLOYER. Aceita 'contato'/'empresa'."},"objective_coverage_goal_percent":{"type":"number","description":"Meta de cobertura em % (> 0). Ex.: 100 para toda a carteira."},"objective_recurrence_type":{"type":"string","minLength":1,"description":"WEEKLY | MONTHLY | QUARTERLY | SEMIANNUAL | SINGLE. Aceita 'semanal'/'mensal'/'trimestral'/'semestral'/'avulsa'."},"objective_recurrence_start_date":{"type":"string","minLength":8,"description":"Início da recorrência, YYYY-MM-DD."},"objective_ending_type":{"type":"string","minLength":1,"description":"CONTINUOUS | DATE | CYCLES. DATE exige objective_ending_date; CYCLES exige objective_ending_cycles; SINGLE exige DATE + data."},"objective_ending_date":{"type":["string","null"],"description":"YYYY-MM-DD. Obrigatório quando ending_type=DATE ou recorrência SINGLE."},"objective_ending_cycles":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Quantos ciclos. Obrigatório quando ending_type=CYCLES."},"channel_ids":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"description":"ids dos tipos de tarefa — só se você já tiver; senão use `tipo_tarefa` com o nome."},"agent_ids":{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"minItems":1,"description":"Atendentes que recebem o objetivo. A API exige TEXTO; manda número que eu converto."},"template_contact_filter_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"somente_preview":{"type":"boolean"}},"required":["objective_name","objective_description","objective_task_title","objective_completion_rule","objective_portfolio_type","objective_coverage_goal_percent","objective_recurrence_type","objective_recurrence_start_date","objective_ending_type","agent_ids"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_update_objetivo","title":"WeAction Objetivos - Atualizar","description":"Atualiza campos de um objetivo existente (PATCH v1 /objectives/{id}) — fluxo do\nsupervisor. Envie SÓ os campos a mudar (mesmos nomes do create). Confirme antes.\n\nArgs:\n  - objetivo_id (number)\n  - campos (objeto): campos a alterar, ex {\"objective_name\": \"...\", \"agent_ids\": [..]}","inputSchema":{"type":"object","properties":{"objetivo_id":{"type":"integer"},"campos":{"type":"object","additionalProperties":{}}},"required":["objetivo_id","campos"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_mover_tarefa_objetivo","title":"WeAction Tarefas - Mover no Kanban (status)","description":"MOVE uma tarefa/atividade no kanban (muda o status: A Fazer → Fazendo → Feito...).\nPUT v1 /external-activities/agent/{agent_id}/update. Vale para tarefas de objetivo e comuns.\n\nCRITICO (causa de \"aceitou mas nao moveu\"): o status de destino TEM que pertencer ao QUADRO (status_group) da propria tarefa. Passe status_group_id (voce ja sabe pelo weaction_list_tasks) + status_name (coluna destino, ex.: \"Fazendo\") e a tool resolve o data_field_status_id DENTRO do quadro. status_id de outro quadro: a API aceita (200) mas o card NAO muda de coluna — a tool REJEITA isso.\nConfirme antes de mover. Depois, RE-LISTE o quadro (weaction_list_tasks) pra confirmar visualmente antes de dizer \"movido\".\nAtendente so move tarefa DELE; supervisor move de qualquer um (mover_como=\"supervisor\" + login em movido_por).\n\nArgs:\n- protocol (string): protocolo da tarefa\n- channel (string): label_identifier do canal/tipo da tarefa\n- status_group_id (number): QUADRO da tarefa (data_field_status_group_id). Recomendado.\n- status_name (string): coluna de DESTINO (ex.: \"Fazendo\"). Resolvida dentro do quadro.\n- status_id (number, opcional): id direto (so se for do quadro certo) — validado.\n- movido_por (string): agent_id numerico OU login do supervisor\n- mover_como (string, default \"agent\"): agent | supervisor\n- org_unit_id (number, opcional): default = do contexto","inputSchema":{"type":"object","properties":{"protocol":{"type":"string","minLength":1},"channel":{"type":"string","minLength":1},"status_group_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"status_name":{"type":["string","null"]},"status_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"movido_por":{"type":"string","minLength":1},"mover_como":{"type":"string","enum":["agent","supervisor"]},"org_unit_id":{"type":"integer"}},"required":["protocol","channel","movido_por"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_list_conversation_logs","title":"WeAction List Conversation Logs","description":"Mensagens e gravações dos atendimentos WeON (conteúdo da conversa: mensagens, mídia, gravações de chamada). Útil para monitoria de qualidade, transcrição e auditoria. Retorna array de logs de conversa.\n\nArgs:\n  - start_date / end_date (string, opcionais): \"YYYY-MM-DD hh:mm:ss\"\n  - job_ids (array de strings, opcional): IDs de atendimento (job)\n  - protocols (array de strings, opcional): protocolos\n  - channels (array, opcional): \"voice\" | \"whatsapp\" | \"chat\"\n  - users (array de strings, opcional): IDs de agentes\n  - groups (array de strings, opcional): IDs de grupos\n  - include / exclude (arrays de strings, opcionais): propriedades a mostrar / excluir\n\nREGRA DURA: UMA chamada por protocolo. Vazio = NAO EXISTE gravacao; siga com as mensagens de texto. PROIBIDO re-tentar com outras datas ou alternar com whatsapp_history/conversation_messages.","inputSchema":{"type":"object","properties":{"start_date":{"type":"string","description":"Start date (YYYY-MM-DD hh:mm:ss)"},"end_date":{"type":"string","description":"End date (YYYY-MM-DD hh:mm:ss)"},"job_ids":{"type":"array","items":{"type":"string"},"description":"Filter by attendance IDs"},"protocols":{"type":"array","items":{"type":"string"},"description":"Filter by protocol numbers"},"channels":{"type":"array","items":{"type":"string","enum":["voice","whatsapp","chat"]},"description":"Filter by channel"},"users":{"type":"array","items":{"type":"string"},"description":"Filter by agent user IDs"},"groups":{"type":"array","items":{"type":"string"},"description":"Filter by group IDs"},"include":{"type":"array","items":{"type":"string"},"description":"Include only these properties"},"exclude":{"type":"array","items":{"type":"string"},"description":"Exclude these properties"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_qualificacoes_da_fila","title":"WeAction Qualificações da fila (árvore achatada)","description":"Qualificações VÁLIDAS para um atendimento, com o caminho completo de cada uma.\n\nUse SEMPRE esta tool antes de qualificar — nunca `weaction_list_qualifications`,\nque devolve os grupos de TODA a unidade e faz você pegar o id de outra fila.\n\nPASSE O PROTOCOLO do atendimento: a fila (e a árvore) sai do próprio atendimento.\nNão passe o número entre parênteses do nome da fila (é o telefone da rota, não a\nfila) e nunca troque de fila por palpite se uma chamada falhar.\n\nArgs:\n  - protocolo (string): protocolo do atendimento — o jeito certo\n  - atendente_id (number, opcional): dono do atendimento (supervisor precisa passar)\n  - grupo (string, opcional): id ou nome da fila, só para consultar uma fila sem atendimento\n  - somente_folhas (bool, opcional): default true — só o que pode ser escolhido\n\nRetorna cada qualificação como: id, caminho (\"Pai > Filho > Neto\"), tipo\n(POSITIVE/NEUTRAL/NEGATIVE), folha (true = pode ser resposta final) e\ndescricao (o que ela SIGNIFICA: escolha por ela, não só pelo nome).\n\nREGRAS:\n  - só folha pode ir para `weaction_qualify_job`: item com filhos é PERGUNTA\n    ao atendente, não resposta;\n  - o caminho é o que distingue itens de mesmo nome — existem quatro \"Mesmo\n    Grupo\" em ramos diferentes;\n  - desabilitadas não aparecem.","inputSchema":{"type":"object","properties":{"protocolo":{"type":["string","null"],"description":"Protocolo do atendimento: a árvore vem da fila DELE (preferido)"},"atendente_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Dono do atendimento (supervisor passa; atendente não precisa)"},"grupo":{"type":["string","null"],"description":"Id ou nome da fila — só sem protocolo"},"somente_folhas":{"type":"boolean","description":"Só as que podem ser escolhidas (default true)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_qualifications","title":"WeAction List Qualification Trees","description":"List all qualification (tabulation/disposition) trees configured in the WeON system.\n\nNÃO USE para escolher a qualificação de um atendimento: isto traz as árvores de TODAS as filas e\nleva a id/caminho de outra fila. Para um atendimento: weaction_qualificacoes_da_fila(protocolo) e\nweaction_conferir_qualificacao. Esta serve só para administração (ver todos os grupos da unidade).\n\nQualifications are used to categorize attendance outcomes (e.g. \"Sale\", \"No contact\",\n\"Callback scheduled\"). Each qualification has a type: POSITIVE, NEUTRAL, or NEGATIVE.\n\nReturns array of qualification tree objects with their full path structure.","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_qualification","title":"WeAction Create Qualification / Service Channel","description":"Cria uma QUALIFICAÇÃO (tabulação de encerramento) dentro de um\nquadro. O quadro é obrigatório: crie antes com\nweaction_create_qualification_group, ou descubra o existente com\nweaction_list_qualification_groups.\n\nÁRVORE: sem parent_id a qualificação nasce no primeiro nível do quadro; com\nparent_id ela vira filha daquela. Monte de cima para baixo — crie o pai,\nguarde o id que volta, e use como parent_id das filhas.\n\nArgs:\n  - name (string): nome que o atendente vê\n  - type (string): \"POSITIVE\" (conversão) | \"NEUTRAL\" | \"NEGATIVE\"\n  - qualify_group_id (number): o quadro\n  - parent_id (number, opcional): a qualificação pai\n  - alias (string, opcional): código único no quadro (derivado do nome se omitido)","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Nome da qualificação"},"type":{"type":"string","enum":["POSITIVE","NEUTRAL","NEGATIVE"],"description":"POSITIVE (conversão), NEUTRAL ou NEGATIVE"},"qualify_group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"QUADRO onde ela entra (weaction_list_qualification_groups)"},"parent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Qualificação PAI. Omita para criar no primeiro nível."},"description":{"type":["string","null"]},"alias":{"type":["string","null"],"description":"Apelido/código. ÚNICO dentro do quadro; omita para derivar do nome."},"order":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["name","type"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_create_qualification_group","title":"WeAction Create Qualification Group","description":"Cria um QUADRO (grupo) de qualificação — a árvore de\nencerramento que o atendente escolhe ao fechar o atendimento. Um quadro é de UM\ncanal só.\n\nUSE quando pedirem \"cria um grupo de qualificação\", \"monta a árvore de\nencerramento de cobrança\", \"quero uma tabulação nova para o WhatsApp\".\nDEPOIS de criar o quadro, crie as qualificações dentro dele com\nweaction_create_qualification (a primeira sem parent_id = raiz).\n\nArgs:\n  - name (string): nome do quadro (ex: \"Cobrança WhatsApp\")\n  - channel (string): \"whatsapp\" | \"voz\" | \"chat\"\n  - org_unit_id (number, opcional): default = a unidade do seu contexto","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Nome do quadro de qualificação"},"channel":{"type":"string","enum":["whatsapp","voz","chat"],"description":"Canal do quadro"},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["name","channel"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_list_qualification_groups","title":"WeAction List Qualification Groups","description":"Lista os QUADROS de qualificação (árvores de encerramento) do\nsupervisor, com id, nome, canal e unidade. Use para descobrir o\nqualify_group_id antes de criar uma qualificação, e para responder \"quais\ntabulações existem\".\n\nArgs:\n  - filtro (string, opcional): filtra pelo nome do quadro\n  - canal (string, opcional): \"whatsapp\" | \"voz\" | \"chat\"","inputSchema":{"type":"object","properties":{"filtro":{"type":["string","null"]},"canal":{"anyOf":[{"type":"string","enum":["whatsapp","voz","chat"]},{"type":"null"}]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_integrations","title":"WeAction Listar Integrações [INTERNO]","description":"[INTERNO] Lista todas as integrações disponíveis. Filtro opcional por nome.\nGET /v1/integrations","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Filtrar por nome da integração"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_get_integration_instance","title":"WeAction Get Instância Integração [INTERNO]","description":"[INTERNO] Retorna detalhes de uma instância de integração.\nGET /v1/integrations/instances/{id}","inputSchema":{"type":"object","properties":{"instance_id":{"type":"integer","description":"ID da instância"}},"required":["instance_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_update_integration_status","title":"WeAction Habilitar/Desabilitar Integração [INTERNO]","description":"[INTERNO] Altera status de uma instância de integração (CONNECTED, DISCONNECTED).\nPATCH /v1/integrations/instances/{id}/status","inputSchema":{"type":"object","properties":{"instance_id":{"type":"integer"},"status":{"type":"string","enum":["CONNECTED","DISCONNECTED"],"description":"Novo status"}},"required":["instance_id","status"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_update_integration_actions","title":"WeAction Atualizar Ações Integração [INTERNO]","description":"[INTERNO] Atualiza as ações associadas a uma instância.\nPATCH /v1/integrations/instances/{id}/actions","inputSchema":{"type":"object","properties":{"instance_id":{"type":"integer"},"actions":{"type":"array","items":{"type":"number"},"description":"Array de IDs de ações"}},"required":["instance_id","actions"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_get_integration_change_logs","title":"WeAction Histórico de Alterações Integração [INTERNO]","description":"[INTERNO] Histórico de alterações de uma instância de integração.\nGET /v1/integrations/instances/{id}/change-logs","inputSchema":{"type":"object","properties":{"instance_id":{"type":"integer"},"per_page":{"type":"integer","default":20},"page":{"type":"integer","default":1}},"required":["instance_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_get_integration_action_logs","title":"WeAction Histórico de Ações Integração [INTERNO]","description":"[INTERNO] Histórico de execução de ações de uma instância.\nGET /v1/integrations/instances/{id}/actions/logs","inputSchema":{"type":"object","properties":{"instance_id":{"type":"integer"},"per_page":{"type":"integer","default":50},"page":{"type":"integer","default":1},"start_date":{"type":"string","description":"Formato: YYYY-MM-DD HH:mm:ss"},"end_date":{"type":"string","description":"Formato: YYYY-MM-DD HH:mm:ss"},"status":{"type":"string"}},"required":["instance_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_whatsapp_volumetry","title":"WeAction Volumetria WhatsApp [INTERNO]","description":"[INTERNO] Volumetria de atendimentos WhatsApp por agente.\nGET /v1/agents/{id}/whatsapp/volumetry","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente"},"start":{"type":["string","null"],"description":"Data início YYYY-MM-DD (default: hoje)"},"end":{"type":["string","null"],"description":"Data fim YYYY-MM-DD (default: = início)"},"report_type":{"anyOf":[{"type":"string","enum":["daily","hourly"]},{"type":"null"}],"description":"daily (default) | hourly"}},"required":["agent_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_voice_volumetry","title":"WeAction Volumetria Voz [INTERNO]","description":"[INTERNO] Volumetria de atendimentos de voz por agente.\nGET /v1/agents/{id}/voice/volumetry","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente"},"start":{"type":["string","null"],"description":"Data início YYYY-MM-DD (default: hoje)"},"end":{"type":["string","null"],"description":"Data fim YYYY-MM-DD (default: = início)"},"report_type":{"anyOf":[{"type":"string","enum":["daily","hourly"]},{"type":"null"}],"description":"daily (default) | hourly"}},"required":["agent_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_whatsapp_average_times","title":"WeAction Tempos Médios WhatsApp [INTERNO]","description":"[INTERNO] Tempos médios de atendimento WhatsApp por agente.\nGET /v1/agents/{id}/whatsapp/average-times","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente"},"start":{"type":["string","null"],"description":"Data início YYYY-MM-DD (default: hoje)"},"end":{"type":["string","null"],"description":"Data fim YYYY-MM-DD (default: = início)"},"report_type":{"anyOf":[{"type":"string","enum":["daily","hourly"]},{"type":"null"}],"description":"daily (default) | hourly"}},"required":["agent_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_voice_average_times","title":"WeAction Tempos Médios Voz [INTERNO]","description":"[INTERNO] Tempos médios de atendimento de voz por agente.\nGET /v1/agents/{id}/voice/average-times","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente"},"start":{"type":["string","null"],"description":"Data início YYYY-MM-DD (default: hoje)"},"end":{"type":["string","null"],"description":"Data fim YYYY-MM-DD (default: = início)"},"report_type":{"anyOf":[{"type":"string","enum":["daily","hourly"]},{"type":"null"}],"description":"daily (default) | hourly"}},"required":["agent_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_employer","title":"WeAction Criar Empresa (Employer) [INTERNO]","description":"[INTERNO] Cria uma EMPRESA (employer) na unidade do agente.\nPOST /v1/employers/create\nUse quando o cliente é EMPRESA ainda não cadastrada; depois vincule o contato a ela (campo employer_id do contato).\n\nREGRAS (mesmas da tela): nome e código OBRIGATÓRIOS (código só dígitos, até 18); CNPJ opcional, 14 dígitos (máscara removida); se já existir (mesmo código/CNPJ) a API responde 409 e NADA é criado: busque a existente em vez de tentar de novo.\n\nArgs:\n  - name (string): razão/nome da empresa\n  - code (string): código interno (só dígitos, até 18)\n  - cnpj (string, opcional): com ou sem máscara\n  - social_name (string, opcional): nome fantasia\n  - agent_id (number, opcional): dono do cadastro (default: agente do token)\n\nRetorna a empresa criada (id em employerId/employer_id).","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Razão/nome da empresa (até 200 chars)"},"code":{"type":"string","minLength":1,"description":"Código interno, só dígitos (até 18)"},"cnpj":{"type":"string","description":"CNPJ, 14 dígitos (máscara é removida)"},"social_name":{"type":"string","description":"Nome fantasia (até 200 chars)"},"agent_id":{"type":"integer","description":"Agente dono (default: token)"}},"required":["name","code"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_get_employer","title":"WeAction Get Employer [INTERNO]","description":"[INTERNO] Retorna dados de uma empresa (employer).\nGET /v1/employers/{id}","inputSchema":{"type":"object","properties":{"employer_id":{"type":"integer","description":"ID do employer"}},"required":["employer_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_delete_employer","title":"WeAction Remover Employer [INTERNO]","description":"[INTERNO] Remove uma empresa (employer).\nDELETE /v1/employers/{id}","inputSchema":{"type":"object","properties":{"employer_id":{"type":"integer"}},"required":["employer_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_employer_attendance_summary","title":"WeAction Contexto Empresa - Resumo Atendimentos [INTERNO]","description":"[INTERNO] Resumo de atendimentos por grupos de uma empresa.\nGET /v1/employers/{id}/attendances/groups-summary","inputSchema":{"type":"object","properties":{"employer_id":{"type":"integer"},"start_date":{"type":"string","description":"YYYY-MM-DD HH:mm:ss"},"end_date":{"type":"string","description":"YYYY-MM-DD HH:mm:ss"}},"required":["employer_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_contact_attendance_summary","title":"WeAction Contexto Contato - Resumo Atendimentos [INTERNO]","description":"[INTERNO] Resumo de atendimentos por grupos de um contato.\nGET /v1/contacts/{id}/attendances/groups-summary","inputSchema":{"type":"object","properties":{"contact_id":{"type":"integer"},"start_date":{"type":"string","description":"YYYY-MM-DD HH:mm:ss"},"end_date":{"type":"string","description":"YYYY-MM-DD HH:mm:ss"}},"required":["contact_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_update_contact","title":"WeAction Editar Contato","description":"Edita UM contato: nome, e-mail, telefone, WhatsApp, empresa vinculada (vincular, trocar ou desvincular) e cargo, dono (carteirização) e QUALQUER campo customizado.\nPUT /v1/contacts/{id}\n\nUse contact_id (numérico, do resultado da busca). Se só tiver telefone/nome, passe em \"identificador\": se casar com mais de um contato a tool NÃO grava e devolve a lista; então PERGUNTE ao usuário qual é. Nunca escolha sozinho.\nCampos customizados vão em \"campos\" pelo RÓTULO da tela (ex.: {campo:\"nicho\", valor:\"varejo\"}); campo inexistente não grava nada e devolve a lista dos que existem.\nA tool relê o contato depois de gravar e diz o que ficou gravado. Só afirme sucesso do que ela conferiu.\nMude APENAS o que o usuário pediu. Para etiqueta use weaction_tag_entity; para vários contatos, weaction_bulk_update_contacts.","inputSchema":{"type":"object","properties":{"contact_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"id numérico do contato (preferido)"},"identificador":{"type":["string","null"],"description":"identificador, telefone ou nome (só se não tiver o id)"},"name":{"type":["string","null"]},"email":{"type":["string","null"],"description":"novo e-mail; string vazia limpa"},"phone":{"type":["string","null"],"description":"telefone principal"},"whatsapp":{"type":["string","null"],"description":"WhatsApp principal"},"employer_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"id da empresa para vincular/trocar"},"desvincular_empresa":{"type":["boolean","null"],"description":"true = tira o contato da empresa"},"cargo":{"type":["string","null"],"description":"cargo do contato na empresa (ex.: Diretor)"},"carteirizar_para":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"agent_id do novo dono do contato"},"remover_carteira":{"type":["boolean","null"],"description":"true = tira o contato da carteira (fica sem responsável)"},"campos":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"campo":{"type":"string","minLength":1,"description":"Rótulo do campo como aparece na tela (ex.: 'Empresa', 'nicho') ou o nome da coluna"},"valor":{"type":["string","null"],"description":"Novo valor; null limpa o campo"}},"required":["campo","valor"],"additionalProperties":false}},{"type":"null"}],"description":"campos customizados (rótulo e valor)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_delete_contact","title":"WeAction Excluir Contato","description":"EXCLUI um contato do WeOn. IRREVERSÍVEL: apaga também o histórico, as qualificações e as respostas de script dele.\nDELETE /v1/contacts/{id}/{client}\n\nSó quando o usuário PEDIR para excluir. Antes: mostre a ficha (nome, telefone, empresa) e confirme que é esse. Passe contact_id (numérico) e nome_confirmado = o nome da ficha que o usuário confirmou; se não bater com o cadastro, a tool NÃO exclui e devolve a ficha.\nA tool confere depois que o contato sumiu. Contato com atendimento em curso a WeOn não deixa excluir: diga isso.","inputSchema":{"type":"object","properties":{"contact_id":{"type":"integer","description":"id numérico do contato"},"nome_confirmado":{"type":"string","minLength":1,"description":"nome do contato, como na ficha confirmada pelo usuário"}},"required":["contact_id","nome_confirmado"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_bulk_update_contacts","title":"WeAction Editar Contatos em Massa","description":"Aplica a MESMA alteração em vários contatos (até 50 por contact_ids, até 300 pela carteira): trocar dono (carteirizar), TIRAR DA CARTEIRA (sem responsável), vincular/desvincular empresa, preencher campo customizado.\nDuas formas de dizer QUAIS contatos: contact_ids (de uma lista já mostrada ao usuário) OU carteira_de = agent_id do dono, que pega TODOS os contatos da carteira dele aqui dentro (sem você precisar listar os ids). \"Tire os contatos da carteira da Fulana e deixe sem responsável\" = carteira_de (id da Fulana) + remover_carteira=true. \"Passe a carteira da Fulana para o Ciclano\" = carteira_de + carteirizar_para.\nRelê cada contato e devolve o resultado por contato (alterado / não gravou / erro).\nPara etiqueta em massa use weaction_tag_entity com vários ids.","inputSchema":{"type":"object","properties":{"contact_ids":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"description":"ids numéricos (máx 50); vazio quando usar carteira_de"},"carteira_de":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"agent_id do dono: aplica em TODOS os contatos da carteira dele"},"remover_carteira":{"type":["boolean","null"],"description":"true = tira da carteira (fica sem responsável)"},"employer_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"desvincular_empresa":{"type":["boolean","null"]},"carteirizar_para":{"anyOf":[{"type":"integer"},{"type":"null"}]},"campos":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"campo":{"type":"string","minLength":1,"description":"Rótulo do campo como aparece na tela (ex.: 'Empresa', 'nicho') ou o nome da coluna"},"valor":{"type":["string","null"],"description":"Novo valor; null limpa o campo"}},"required":["campo","valor"],"additionalProperties":false}},{"type":"null"}]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_update_employer","title":"WeAction Editar Empresa","description":"Edita UMA empresa (employer): nome, código, CNPJ, nome fantasia, faturamento, contato principal e QUALQUER campo customizado (inclusive escolha única/múltipla, pelo nome da opção).\nPUT /v1/employers/{id}/update\n\nMude APENAS o que o usuário pediu: a tool lê a empresa e preserva o resto (CNPJ, nome fantasia e escolhas não são apagados).\nCampos customizados vão em \"campos\" pelo RÓTULO da tela; para escolha múltipla, separe as opções por vírgula. Campo ou opção inexistente não grava nada e devolve a lista válida.\nRelê a empresa depois de gravar e diz o que ficou gravado. Etiqueta da empresa: weaction_tag_entity.","inputSchema":{"type":"object","properties":{"employer_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"id da empresa (preferido)"},"empresa":{"type":["string","null"],"description":"nome da empresa, se não tiver o id"},"name":{"type":["string","null"]},"code":{"type":["string","null"],"description":"código interno"},"cnpj":{"type":["string","null"],"description":"CNPJ; string vazia limpa"},"social_name":{"type":["string","null"],"description":"nome fantasia; string vazia limpa"},"revenue":{"type":["number","null"],"description":"faturamento"},"main_contact_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"contact_id do contato principal"},"campos":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"campo":{"type":"string","minLength":1,"description":"Rótulo do campo como aparece na tela (ex.: 'Empresa', 'nicho') ou o nome da coluna"},"valor":{"type":["string","null"],"description":"Novo valor; null limpa o campo"}},"required":["campo","valor"],"additionalProperties":false}},{"type":"null"}]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_tag_entity","title":"WeAction Etiquetar Contato ou Empresa","description":"Adiciona ou remove ETIQUETAS (tags) de contatos ou empresas, um ou vários de uma vez (até 50).\nPOST/DELETE /v1/new-tag/{agent|supervisor}/{contacts|employers}/{id}/tag-items\n\n\"etiquetas\" pelo NOME como aparece na tela (ex.: \"Cliente ativo\"). Nome inexistente ou ambíguo não grava nada e devolve as opções válidas.\nAdicionar não remove as etiquetas que já existem. Etiqueta de ATENDIMENTO (protocolo) é outra tool.","inputSchema":{"type":"object","properties":{"entidade":{"type":"string","enum":["contato","empresa"]},"ids":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"description":"contact_id ou employer_id numéricos (preferido)"},"nomes":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"nomes dos contatos ou empresas, se não tiver os ids"},"acao":{"type":"string","enum":["adicionar","remover"]},"etiquetas":{"type":"array","items":{"type":"string"},"minItems":1,"description":"nomes das etiquetas (ou ids)"}},"required":["entidade","acao","etiquetas"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_carteira_visao_unidade","title":"WeAction Carteira - Visão da UNIDADE (todas as carteiras)","description":"Visão SUPERVISOR: agrega as carteiras de TODOS os atendentes da unidade numa chamada.\nUSE para perguntas GLOBAIS: \"como está a carteira?\", \"quem está em risco?\", \"adormecidos?\", \"qual atendente tem mais risco?\".\n\nRetorna totais da unidade (contatos, em risco, adormecidos, receita cadastrada), quebra por atendente e principais contatos em risco.\nIMPORTANTE: receita 0 = receita NÃO CADASTRADA no contato, NUNCA ausência de risco. Risco = health score (1..5); 0/nulo = não medido (não trate como saudável).\nCREDIBILIDADE: (a) receita_cadastrada é APROXIMAÇÃO de cadastro nas fichas — NUNCA apresente como MRR/faturamento da operação; se citar, diga \"receita cadastrada nas fichas (aproximada)\". (b) em_risco é a marcação do health score do WeOn — ao falar disso, DECLARE o critério (\"marcados pelo health score\") ou chame de \"pedindo atenção\"; afirmar RISCO de verdade exige cruzar 2+ fontes (conversa + chamados + silêncio). (c) \"adormecido\" é rótulo de CARTEIRA (cliente carteirizado que esfriou); carteira com volume anômalo de inativos (centenas num atendente só) costuma ser REPOSITÓRIO de base não tratada — reporte separado como \"base sem tratamento\", não some como adormecidos da operação.\n\nArgs:\n  - org_unit_id (number, opcional): default = do contexto\n  - top_agents (number, default 12, máx 20): carteiras analisadas (maiores primeiro)\n  - detalhe_risco (boolean, default true): lista contatos em risco dos maiores ofensores","inputSchema":{"type":"object","properties":{"org_unit_id":{"type":"integer"},"top_agents":{"type":"integer","minimum":1,"maximum":20},"detalhe_risco":{"type":"boolean"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_carteira_analise_profunda","title":"WeAction Carteira - Análise PROFUNDA (dossiê completo)","description":"Varre a carteira COMPLETA de um atendente e monta o dossiê por contato, numa chamada:\n  - Ordem: ADORMECIDOS primeiro, depois RISCO, depois ativos (caps: 100 contatos, 50 empresas).\n  - Histórico por TIPO no período: conversas por canal (whatsapp/voz/e-mail), tarefas, qualificações recentes, NPS, última atividade, gravações de voz (só contagem; transcrição sob demanda no deep-dive de 1 contato).\n  - CHAMADOS: cruza quadros de suporte (nome contendo suporte/support/chamado) com contatos/empresas: total, ABERTOS, frequência mensal, recorrência (3+ em 90d), criticidade P0/P1/P2/P3 (título/status).\nDepois da análise: proponha o plano (e-mail/campanha/mensagem/tarefa p/ N via weaction_acionamento_recomendado) e OFEREÇA executar com aprovação. O próximo passo é sempre valor entregue, nunca \"analisar mais\".\n\nArgs:\n  - agent_id (number): dono da carteira (obrigatório; a análise é POR carteira)\n  - org_unit_id (number, opcional): default = do contexto\n  - max_contatos (default 100, máx 100) / max_empresas (default 50, máx 50)\n  - periodo_dias (number, default 90): janela do histórico\n  - incluir_chamados (boolean, default true)","inputSchema":{"type":"object","properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Agente da carteira. Omita: sai do token."},"org_unit_id":{"type":"integer"},"max_contatos":{"type":"integer","minimum":1,"maximum":100},"max_empresas":{"type":"integer","minimum":1,"maximum":50},"periodo_dias":{"type":"integer","minimum":7,"maximum":365},"incluir_chamados":{"type":"boolean"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_carteira_history_insights","title":"WeAction Insights da Carteira por Histórico","description":"Digest do HISTÓRICO de uma AMOSTRA de contatos da carteira (atendimentos + tarefas), tudo numa ÚNICA chamada (busca server-side). Base para insights de risco/oportunidade/relacionamento.\n\nPor contato: scores (churn/receita/nps/dias) + resumo do histórico (atividades, atendimentos, tarefas, última atividade, qualificações recentes, canais). Com o digest, monte \"top N em risco / top N oportunidades\" SEM buscar contato por contato (não entre em loop).\n\nArgs:\n  - segment (\"inactive\"|\"risk\"|\"active\", default \"inactive\"): origem da amostra\n  - sample_size (number, default 80, máx 80): analisa TODOS do segmento até o teto de 80; havendo mais, pega só os 80 primeiros (não entra em loop)\n  - agent_id (number, opcional), org_unit_id (number, opcional)","inputSchema":{"type":"object","properties":{"segment":{"type":"string","enum":["inactive","risk","active"]},"sample_size":{"type":"integer","minimum":1,"maximum":80},"agent_id":{"type":"integer"},"org_unit_id":{"type":"integer"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_portfolio_kpi","title":"WeAction Carteira - KPI Contatos [INTERNO]","description":"[INTERNO] KPI de contatos na carteira do agente.\nPOST /v1/agents/{id}/portfolio","inputSchema":{"type":"object","properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Agente. Omita: sai do token."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_portfolio_list","title":"WeAction Carteira - Listar Contatos [INTERNO]","description":"[INTERNO] Lista todos os contatos da carteira do agente com paginação e ordenação.\nPOST /v1/agents/{id}/portfolio/list","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente (default: agente logado, resolvido pelo token)"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"order_by":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"order":{"type":"string","enum":["asc","desc","ASC","DESC"]}},"required":["name","order"],"additionalProperties":false}},"filters":{"description":"Filtros avançados"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_portfolio_active","title":"WeAction Carteira - Contatos Ativos [INTERNO]","description":"[INTERNO] Contatos ativos na carteira do agente.\nPOST /v1/agents/{id}/portfolio/active","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente (default: agente logado, resolvido pelo token)"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"order_by":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"order":{"type":"string","enum":["asc","desc","ASC","DESC"]}},"required":["name","order"],"additionalProperties":false}},"filters":{"description":"Filtros avançados"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_portfolio_risk","title":"WeAction Carteira - Contatos de Risco [INTERNO]","description":"[INTERNO] Contatos em risco na carteira do agente.\nPOST /v1/agents/{id}/portfolio/risk","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente (default: agente logado, resolvido pelo token)"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"order_by":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"order":{"type":"string","enum":["asc","desc","ASC","DESC"]}},"required":["name","order"],"additionalProperties":false}},"filters":{"description":"Filtros avançados"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_portfolio_inactive","title":"WeAction Carteira - Contatos Adormecidos [INTERNO]","description":"[INTERNO] Contatos inativos/adormecidos na carteira do agente.\nPOST /v1/agents/{id}/portfolio/inactive","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente (default: agente logado, resolvido pelo token)"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"order_by":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"order":{"type":"string","enum":["asc","desc","ASC","DESC"]}},"required":["name","order"],"additionalProperties":false}},"filters":{"description":"Filtros avançados"},"days_ago":{"type":"integer","description":"Dias sem contato"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_portfolio_employer_kpi","title":"WeAction Carteira - KPI Empresa [INTERNO]","description":"[INTERNO] KPI de empresas na carteira do agente.\nPOST /v1/agents/{id}/portfolio/employer","inputSchema":{"type":"object","properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Agente. Omita: sai do token."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_portfolio_employer_list","title":"WeAction Carteira - Listar Empresas [INTERNO]","description":"[INTERNO] Lista empresas da carteira do agente com filtros avançados.\nPOST /v1/agents/{id}/portfolio/employer/list","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente (default: agente logado, resolvido pelo token)"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"order_by":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"order":{"type":"string","enum":["asc","desc","ASC","DESC"]}},"required":["name","order"],"additionalProperties":false}},"filters":{"description":"Filtros avançados"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_portfolio_employer_risk","title":"WeAction Carteira - Empresas de Risco [INTERNO]","description":"[INTERNO] Empresas em risco na carteira do agente.\nPOST /v1/agents/{id}/portfolio/employer/risk","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente (default: agente logado, resolvido pelo token)"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"order_by":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"order":{"type":"string","enum":["asc","desc","ASC","DESC"]}},"required":["name","order"],"additionalProperties":false}},"filters":{"description":"Filtros avançados"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_portfolio_employer_dormant","title":"WeAction Carteira - Empresas Adormecidas [INTERNO]","description":"Empresas ADORMECIDAS (>30 dias sem interação) na carteira do agente — espelho da aba\n\"Adormecido > Empresa\" da Gestão de Carteira. Adormecidos têm DUAS visões: CONTATOS\n(weaction_portfolio_inactive) e EMPRESAS (esta tool) — para responder \"tem adormecidos?\"\nde uma carteira, consulte as duas.\nPOST /v1/agents/{id}/portfolio/employer/dormant (total em meta.total)","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer","description":"ID do agente (default: agente logado, resolvido pelo token)"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"order_by":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"order":{"type":"string","enum":["asc","desc","ASC","DESC"]}},"required":["name","order"],"additionalProperties":false}},"filters":{"description":"Filtros avançados"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_contact_rating_summary","title":"WeAction Contatos - Resumo Rating [INTERNO]","description":"[INTERNO] Resumo de rating de atendimento de um contato.\nGET /v1/contacts/{id}/attendance-rating/summary","inputSchema":{"type":"object","properties":{"contact_id":{"type":"integer"},"date_start":{"type":"string","description":"YYYY-MM-DD HH:mm:ss"},"date_end":{"type":"string","description":"YYYY-MM-DD HH:mm:ss"}},"required":["contact_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_contact_filters","title":"WeAction Listar Filtros de Contato por Agente [INTERNO]","description":"[INTERNO] Lista os filtros de contato salvos para um agente.\nGET /v1/template/contact-filters/agent/{id}","inputSchema":{"type":"object","properties":{"agent_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Agente. Omita: sai do token."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_custom_filters_list","title":"WeAction Filtros Customizados - Listar [INTERNO]","description":"[INTERNO] Lista os filtros customizados de contato disponiveis para o org_unit do usuario logado.\nGET /v1/template/contact-filters/{org_unit_id}\n\nUSE ESTE TOOL quando o usuario perguntar sobre filtros de contato disponiveis, ou antes de weaction_contact_filters_list para descobrir quais filter_ids existem.\nRetorna: id, nome e configuracao de cada filtro customizado criado na plataforma.","inputSchema":{"type":"object","properties":{"org_unit_id":{"type":"integer","description":"ID da unidade organizacional (usa o do login se omitido)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_contact_filters_list","title":"WeAction Contatos - Listar Contatos [INTERNO]","description":"[INTERNO] TOOL PRINCIPAL para listar contatos do WeON. USE quando o usuario pedir: listar/buscar/ver/filtrar contatos.\nGET /v1/template/contact-filters/contacts/{filter_id}?org_unit={id}\n\n- filter_id=0 (padrao): TODOS os contatos, sem filtro customizado\n- filter_id=N: aplica filtro customizado da plataforma\n- org_unit: preenchido automaticamente pelo login\n- Descubra os filter_ids com weaction_custom_filters_list","inputSchema":{"type":"object","properties":{"filter_id":{"type":"integer","default":0,"description":"ID do filtro customizado (0 = sem filtro, lista todos os contatos)"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"search":{"type":"string","description":"Busca por nome, telefone, etc."},"org_unit":{"type":"integer","description":"ID da unidade organizacional (usa o do login se omitido)"},"order_by":{"type":"string","default":"id","description":"Campo para ordenacao"},"order":{"type":"string","enum":["asc","desc"],"default":"asc"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_history_dept_whatsapp","title":"WeAction Histórico WhatsApp por Departamento","description":"Atendimentos de WhatsApp de um DEPARTAMENTO no período (volume do time no canal).\n\nEXIGE department_id: sem ele a API recusa. Se você não tem o id do departamento, use o histórico por GRUPO de atendimento (weaction_history_group_whatsapp), cujos ids saem de weaction_list_groups.\nPOST /v1/supervisor/history/department/whatsapp","inputSchema":{"type":"object","properties":{"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"start_date":{"type":"string","description":"YYYY-MM-DD hh:mm:ss (default: hoje)"},"end_date":{"type":"string","description":"YYYY-MM-DD hh:mm:ss (default: hoje)"},"department_id":{"type":"integer","description":"Id do departamento (obrigatório na API)"}},"required":["department_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_history_dept_voice","title":"WeAction Histórico Voz por Departamento","description":"Atendimentos de VOZ de um DEPARTAMENTO no período (volume do time no canal).\n\nEXIGE department_id: sem ele a API recusa. Se você não tem o id do departamento, use o histórico por GRUPO de atendimento (weaction_history_group_voice), cujos ids saem de weaction_list_groups.\nPOST /v1/supervisor/history/department/voice","inputSchema":{"type":"object","properties":{"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"start_date":{"type":"string","description":"YYYY-MM-DD hh:mm:ss (default: hoje)"},"end_date":{"type":"string","description":"YYYY-MM-DD hh:mm:ss (default: hoje)"},"department_id":{"type":"integer","description":"Id do departamento (obrigatório na API)"}},"required":["department_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_history_group_voice","title":"WeAction Histórico Voz por Grupo de Atendimento","description":"Atendimentos de VOZ de um GRUPO DE ATENDIMENTO (fila) no período.\n\nUSE para \"qual o volume desta fila hoje/ontem?\", \"quantas ligações esse grupo recebeu?\". O id do grupo vem de weaction_list_groups. Período default: hoje.\nPOST /v1/supervisor/history/attendance-group/voice","inputSchema":{"type":"object","properties":{"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"start_date":{"type":"string","description":"YYYY-MM-DD hh:mm:ss (default: hoje)"},"end_date":{"type":"string","description":"YYYY-MM-DD hh:mm:ss (default: hoje)"},"attendance_group_id":{"type":"integer","description":"Id do grupo de atendimento (fila)"}},"required":["attendance_group_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_history_group_whatsapp","title":"WeAction Histórico WhatsApp por Grupo de Atendimento","description":"Atendimentos de WHATSAPP de um GRUPO DE ATENDIMENTO (fila) no período.\n\nUSE para \"qual o volume desta fila hoje/ontem?\", \"quantas conversas esse grupo recebeu?\". O id do grupo vem de weaction_list_groups. Período default: hoje.\nPOST /v1/supervisor/history/attendance-group/whatsapp","inputSchema":{"type":"object","properties":{"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"start_date":{"type":"string","description":"YYYY-MM-DD hh:mm:ss (default: hoje)"},"end_date":{"type":"string","description":"YYYY-MM-DD hh:mm:ss (default: hoje)"},"attendance_group_id":{"type":"integer","description":"Id do grupo de atendimento (fila)"}},"required":["attendance_group_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_search_attendances","title":"WeAction Buscar Atendimentos","description":"Busca atendimentos. É A FERRAMENTA DO HISTÓRICO DE UM CLIENTE/NÚMERO: para \"me traz os atendimentos desse número\", \"o histórico completo desse cliente\" ou \"o que já aconteceu com ele\", mande `search` com o telefone (ou e-mail/nome/protocolo) e uma JANELA LONGA em start_date (6 a 12 meses).\n\nATENÇÃO, medido na API em 10/09/2026: `search` é o ÚNICO filtro de identidade que funciona aqui. `contact_id`, `channel`, `department_id` e `agent_id` NÃO existem aqui — a rota devolve a página inteira do período. Se você chamar sem `search`, NÃO afirme que os itens são daquele cliente: eles são de vários.\nPOST /v1/attendances/search","inputSchema":{"type":"object","properties":{"search":{"type":"string","description":"TERMO que a API realmente filtra: telefone (com ou sem DDI), e-mail, nome do contato ou protocolo. USE SEMPRE que a pergunta for sobre um cliente/número específico; sem ele não há filtro de identidade."},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1},"start_date":{"type":"string","description":"YYYY-MM-DD HH:mm:ss. Para HISTÓRICO de relacionamento use 6 a 12 meses atrás: com 90 dias o primeiro contato e as tentativas antigas ficam de fora e a leitura de risco sai errada."},"end_date":{"type":"string","description":"YYYY-MM-DD HH:mm:ss"},"channel":{"type":"string","description":"whatsapp, voice, chat, email (filtra o canal)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_monitoring_dashboard_agent","title":"WeAction Monitoria Dashboard Agente [INTERNO]","description":"[INTERNO] Dashboard de monitoria por agente.\nPOST /v1/monitoring/dashboard/agent","inputSchema":{"type":"object","properties":{"agent_id":{"type":"integer"},"start_date":{"type":"string"},"end_date":{"type":"string"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_monitoring_analysis","title":"WeAction Monitoria - Lista de análises [INTERNO]","description":"[INTERNO] LISTA análises de monitoria já existentes. NÃO cria nem envia nada para avaliação: apesar do verbo POST, a rota é de consulta. Para MANDAR um atendimento para a análise oficial use a ferramenta de enviar para análise (POST /monitoring/analysis/send), que exige atendimento encerrado e qualificado.\nPOST /v1/monitoring/analysis","inputSchema":{"type":"object","properties":{"attendance_id":{"type":"integer"},"evaluation_model_id":{"type":"integer"},"topics":{}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_monitoring_evaluation_models","title":"WeAction Monitoria - Modelos de Avaliação [INTERNO]","description":"[INTERNO] Lista modelos de avaliação de monitoria.\nPOST /v1/monitoring/evaluation-models","inputSchema":{"type":"object","properties":{"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_supervisor_agents_kpi","title":"WeAction Supervisor - KPI do time no PERÍODO (hoje por padrão)","description":"KPI do time supervisionado num PERÍODO (default: HOJE, America/Sao_Paulo). É a resposta certa para \"como foi o time hoje/ontem/esta semana\": agentes online x offline, contatos e empresas, contatos ativos e QUALIFICAÇÕES do período, receita, e a AVALIAÇÃO MÉDIA do atendimento (nota do cliente, CSAT) comparada ao período anterior.\nPOST /v1/supervisor/{login}/agents/kpi\n\nNÃO confunda com weaction_supervisor_agents_performance, que é ACUMULADO (não é de hoje). Diga sempre de qual período é cada número.\nArgs:\n  - supervisor_identifier (string, opcional): login do supervisor; default = o do token\n  - start_date / end_date (YYYY-MM-DD ou YYYY-MM-DD HH:mm:ss, opcionais): default = hoje inteiro","inputSchema":{"type":"object","properties":{"supervisor_identifier":{"type":["string","null"],"description":"Login do supervisor (default: o do token)"},"start_date":{"type":["string","null"],"description":"Início (default: hoje 00:00)"},"end_date":{"type":["string","null"],"description":"Fim (default: hoje 23:59)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_supervisor_agents_performance","title":"WeAction Supervisor - Desempenho dos Atendentes","description":"Desempenho ACUMULADO por atendente na visão do SUPERVISOR (tela \"Desempenho\"): contatos, qualificações, receita, última atividade, avaliação média, grupos.\nATENÇÃO: os números são ACUMULADOS (histórico do atendente), NÃO de hoje. Para \"hoje/ontem/esta semana\" use weaction_supervisor_agents_kpi (período) e diga de qual período é cada número. Use esta para ranking no acumulado, ids dos atendentes e a qual grupo pertencem.\nPOST /v1/supervisor/{supervisor_identifier}/agents/performance\n\nEXCLUSIVA DE SUPERVISOR: exige supervisor_identifier = LOGIN do supervisor (ex: suprogerio; normalmente vem do contexto como supervisor_login). NUNCA passe agent_id numérico de atendente. Sem o login no contexto, pergunte ao usuário qual supervisor (não chute).\nUSE para \"como está o time?\", \"quem produz mais?\", \"quem está parado?\". Cruze com weaction_carteira_visao_unidade: atendente parado + carteira com risco = prioridade de gestão.\n\nArgs:\n  - supervisor_identifier (string): login de um SUPERVISOR real (ex: suprogerio)\n  - org_unit_id / attendance_group_id (number, opcionais): filtros\n  - supervised (boolean, default false): só os marcados como supervisionados\n  - search (string, opcional), order_by/order (opcionais)\n  - per_page (default 25, máx 500), page (default 1)","inputSchema":{"type":"object","properties":{"supervisor_identifier":{"type":"string","description":"Login de um SUPERVISOR real (ex: suprogerio)"},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"attendance_group_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"supervised":{"type":"boolean"},"search":{"type":"string"},"order_by":{"type":"string"},"order":{"type":"string"},"per_page":{"type":"integer"},"page":{"type":"integer"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_department_dashboard_statistics","title":"WeAction Dashboard - Estatísticas do DEPARTAMENTO no período","description":"Estatísticas de um DEPARTAMENTO no período (default: HOJE): volumes, tempos e resultado das filas dele — é o painel \"Departamentos\" do supervisor. Pegue o id do departamento em weaction_list_groups.\nPOST /v1/department/dashboard/statistics\nArgs: department_id (obrigatório), start_date / end_date (YYYY-MM-DD, default hoje)","inputSchema":{"type":"object","properties":{"department_id":{"type":"integer","description":"Id do departamento"},"start_date":{"type":["string","null"],"description":"Início YYYY-MM-DD (default hoje)"},"end_date":{"type":["string","null"],"description":"Fim YYYY-MM-DD (default hoje)"}},"required":["department_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_supervisor_dashboard","title":"WeAction Supervisor - Dashboard Agente [INTERNO]","description":"[INTERNO] Dashboard em tempo real do agente supervisionado.\nPOST /v1/supervisor/{identifier}/agentDashboard","inputSchema":{"type":"object","properties":{"supervisor_identifier":{"type":["string","null"],"description":"Login do supervisor. Omita: sai da sessão."},"agentes":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Ids dos atendentes do painel. Omita: todos os atendentes do supervisor."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_supervisor_queues","title":"WeAction Supervisor - Filas (grupos) que ele acompanha","description":"GRUPOS de atendimento que o supervisor logado acompanha: NOME do grupo, canal, id da fila, unidade e se o grupo tem MONITORIA ativa (coletas ativas e modelos de avaliação). Responde \"quais grupos eu acompanho?\", \"quais têm monitoria ativada?\" e é o primeiro passo para \"como está esta fila?\" (pegue `fila_id` e chame weaction_supervisor_dashboard_data).\nSEMPRE cite o NOME do grupo ao falar com o gestor. `fila_id` é chave interna: não é nome e não se fala.\nGET /v1/supervisor/{login}/queues cruzado com /v1/attendance-group e /v1/monitoring/evaluation-models/groups-summary\n\nArgs:\n  - supervisor_login (string, opcional): normalmente vem do token; só informe se o contexto disser outro.","inputSchema":{"type":"object","properties":{"supervisor_login":{"type":"string"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_supervisor_dashboard_data","title":"WeAction Supervisor - Fila em tempo real (TME, TMA, espera, abandono)","description":"PAINEL EM TEMPO REAL de UMA fila (ou campanha): quantos esperando, tempo médio de espera (TME), tempo médio de atendimento (TMA), atendentes por status, abandonos do dia. É o \"tempo médio de resposta\" da operação.\nPOST /v1/supervisor/dashboard-data\n\nUSE para \"como está a fila X agora?\", \"qual o TME da recepção?\", \"tem gente esperando?\". O id da fila vem de weaction_supervisor_queues. Canal: VOICE, WHATSAPP ou CHAT.\n\nWHATSAPP EXIGE O PAR fila + campanha (o WeOn cruza queue_whatsapp_id com campaign_whatsapp_id do grupo): no WeOn eles nascem juntos com o MESMO id, então informe queue_id e a tool completa campaign_id = queue_id quando faltar. Se uma fila de WhatsApp falhar, NÃO repita a chamada para cada fila: diga qual falhou e siga com as demais.\n\nArgs:\n  - queue_id (number, opcional): id da fila/grupo. Informe queue_id OU campaign_id.\n  - campaign_id (number, opcional): id da campanha (WhatsApp: = queue_id quando não souber).\n  - channel (string): VOICE | WHATSAPP | CHAT\n  - supervisor_login (string, opcional): normalmente vem do token.","inputSchema":{"type":"object","properties":{"queue_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"channel":{"anyOf":[{"type":"string","enum":["VOICE","WHATSAPP","CHAT"]},{"type":"null"}]},"supervisor_login":{"type":"string"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_group_add_agent","title":"WeAction Supervisor - Vincular atendente a grupo(s) de atendimento","description":"VINCULA um atendente a um ou mais GRUPOS de atendimento (filas), com as permissões de membro (ativo, receptivo, discador, penalidade). É a mesma ação da tela de membros do grupo no supervisor-web.\nPOST /v1/agents/{supervisor}/{agent_id}/member/attendance-groups\n\nUSE para: \"coloca o Rogério no grupo Vendas\", \"libera a Agatha na fila de cobrança\", \"esse atendente precisa atender receptivo no grupo X\". Pegue o id do grupo em weaction_list_groups e o id do atendente em weaction_list_users.\nNão remove de grupos: só adiciona/atualiza os informados.\n\nArgs:\n  - agent_id (string): id numérico do atendente no WeOn\n  - groups (array): [{ group_id, active_enabled?, receptive_enabled?, dialer_enabled?, penalty? }]\n      active_enabled/receptive_enabled default true; dialer_enabled default false; penalty default 0\n  - supervisor_login (string, opcional): login do supervisor; default = o do token da sessão","inputSchema":{"type":"object","properties":{"agent_id":{"type":"string","minLength":1,"description":"Id numérico do atendente"},"groups":{"type":"array","items":{"type":"object","properties":{"group_id":{"type":["string","number"],"description":"Id do grupo (attendance_group_id)"},"active_enabled":{"type":["boolean","null"],"description":"Atende ATIVO neste grupo (default true)"},"receptive_enabled":{"type":["boolean","null"],"description":"Atende RECEPTIVO neste grupo (default true)"},"dialer_enabled":{"type":["boolean","null"],"description":"Usa discador neste grupo (default false)"},"penalty":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Penalidade da fila (default 0)"}},"required":["group_id"],"additionalProperties":false},"minItems":1,"description":"Grupos a vincular"},"supervisor_login":{"type":["string","null"],"description":"Login do supervisor (default: o do token)"}},"required":["agent_id","groups"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_script_list","title":"WeAction Scripts de atendimento (templates) da unidade","description":"SCRIPTS de atendimento (template de roteiro que o atendente vê na tela) da unidade: id, nome, texto, ativo. USE para \"quais scripts existem?\", \"qual script a campanha X usa?\" e para achar o callcenter_script_id antes de criar campanha.\nGET /v1/supervisor/{login}/resources/template/script/org-unit/{org_unit_id}\n\nNÃO confundir com o \"script de avaliação\" da Monitoria (modelo de avaliação): esse é carteira_monitoria_*.","inputSchema":{"type":"object","properties":{"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"supervisor_login":{"type":"string"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_script_create","title":"WeAction Criar script de atendimento (template)","description":"CRIA um script de atendimento (roteiro que o atendente lê na tela) na unidade. Nome único por unidade (o WeOn recusa duplicado). Nasce ATIVO conforme o WeOn; para ligar/desligar use weaction_script_set_active.\nPOST /v1/supervisor/{login}/resources/template/script\n\nArgs:\n  - nome (string, até 100): descrição/nome do script\n  - texto (string): o roteiro em si (aceita HTML simples)\n  - org_unit_id (number, opcional): default = unidade do contexto","inputSchema":{"type":"object","properties":{"nome":{"type":"string","minLength":1,"maxLength":100},"texto":{"type":"string","minLength":1},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"supervisor_login":{"type":"string"}},"required":["nome","texto"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_script_set_active","title":"WeAction Habilitar/desabilitar script de atendimento","description":"LIGA ou DESLIGA um script de atendimento (template) pelo id. O id vem de weaction_script_list.\nPUT /v1/supervisor/{login}/resources/template/script/status/{id}\n\nArgs:\n  - script_id (number): callcenter_script_id\n  - ativo (boolean): true habilita, false desabilita","inputSchema":{"type":"object","properties":{"script_id":{"type":"integer"},"ativo":{"type":"boolean"},"supervisor_login":{"type":"string"}},"required":["script_id","ativo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_campaign_create_whatsapp","title":"WeAction Criar campanha de WhatsApp (criação rápida)","description":"CRIA uma campanha de WhatsApp na unidade, com os MESMOS defaults da criação rápida do supervisor-web (algoritmo MANUAL_WHATSAPP, prioridade 0, 1 instância, sem envios automáticos). O supervisor logado entra como supervisor da campanha.\nPOST /v1/supervisor/{login}/resources/campaigns/whatsapp\n\nANTES: confirme com o gestor o nome, o grupo de qualificação (weaction_list_qualifications) e a(s) rota(s) de WhatsApp (weaction_whatsapp_rotas). Nome já existente na empresa é recusado pelo WeOn.\n\nArgs:\n  - nome (string): nome/contexto da campanha\n  - qualify_group_id (number): grupo de qualificação\n  - whatsapp_route_ids (number[]): rotas de WhatsApp da campanha\n  - callcenter_script_id (number, opcional, default 1): script de atendimento (weaction_script_list)\n  - scheduler_id (number, opcional, default 1): agenda/horário\n  - agent_ids (number[], opcional): atendentes membros\n  - org_unit_id (number, opcional): default = unidade do contexto","inputSchema":{"type":"object","properties":{"nome":{"type":"string","minLength":1},"qualify_group_id":{"type":"integer"},"whatsapp_route_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"callcenter_script_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"scheduler_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"agent_ids":{"type":"array","items":{"type":"integer"}},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"supervisor_login":{"type":"string"}},"required":["nome","qualify_group_id","whatsapp_route_ids"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_campaign_start","title":"WeAction Iniciar campanha (WhatsApp: enviar mailings; voz/telemensagem: ligar o discador)","description":"INICIA uma campanha. WhatsApp: envia os mailings AGENDADOS (sem isso, mailing criado fica parado). VOZ e TELEMENSAGEM/URA: liga o DISCADOR, que LIGA para TODOS os contatos agendados da campanha: diga quantos na aprovação (contactsScheduled) e, na voz, que precisa de atendente logado no grupo para atender.\nPOST /v1/campaign-whatsapp/{id}/send com os mailings AGENDADOS (o botão Enviar da tela). Confirma relendo o estado antes de dizer que saiu.\n\nANTES, mostre e peça aprovação: campanha, quantos contatos estão agendados nela (weaction_list_whatsapp_mailing) e o template. ATENÇÃO: envia TODOS os mailings agendados daquela campanha, não só o último. A tela avisa que envio em massa pode bloquear o número de WhatsApp: diga isso na aprovação.\n\nArgs:\n  - campaign_id (number): id da campanha de WhatsApp (weaction_list_whatsapp_campaigns)\n  - campanha (string): OU o nome da campanha, quando não tiver o id (a tool acha o id)","inputSchema":{"type":"object","properties":{"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Id da campanha de WhatsApp"},"campanha":{"type":["string","null"],"description":"Nome da campanha (use quando não tiver o id)"},"supervisor_login":{"type":"string"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_campanha_resultado","title":"WeAction Resultado da campanha de WhatsApp (mailings, status, contatos, qualificações)","description":"COMO FOI o envio de uma campanha de WhatsApp: por mailing, quem foi processado e o status de cada contato (SENT = entregue ao provedor; DELIVERED = chegou; READ = leu; ANSWERED = respondeu; ERROR_* = falhou, com o motivo). Só leitura.\nUse para \"qual o status da campanha / do mailing?\", \"chegou?\", \"por que não chegou?\", \"quantos leram / responderam?\", \"como qualificaram quem respondeu?\". Traz o que a tela de campanha mostra: mailings (nome, total, importados, processados), contagem por status, histórico por contato e qualificações. Não diga \"agendado\" quando o mailing já foi processado.\n\nMotivos comuns: ERROR_WHATSAPP_IDENTIFIER_NOT_FOUND = número vazio/inválido no mailing; ERROR_ALREADY_IN_ATTENDANCE / ERROR_ALREADY_IN_INBOX = contato em atendimento aberto (tem que estar fora da lista de atendimentos); ERROR_CLIENT_WINDOW_EXPIRED / *_NOT_OPTED_IN = regra da Meta (precisa de template aprovado).\n\nArgs:\n  - campaign_id (number): id da campanha de WhatsApp\n  - campanha (string): OU o nome da campanha, quando não tiver o id (a tool acha o id)","inputSchema":{"type":"object","properties":{"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Id da campanha de WhatsApp"},"campanha":{"type":["string","null"],"description":"Nome da campanha (use quando não tiver o id)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_campanha_templates","title":"WeAction Templates aprovados da campanha de WhatsApp (da rota dela)","description":"Templates de WhatsApp APROVADOS na ROTA de uma campanha: os únicos que saem nela. Use SEMPRE esta (não weaction_list_whatsapp_templates) para escolher o template de um mailing de campanha. Só leitura.\nQuando pedirem para disparar sem dizer o template, PROPONHA o recomendado (mostre o texto) junto do resumo e peça uma aprovação só.\n\nArgs:\n  - campaign_id (number) OU campanha (string: o nome que a pessoa disse)","inputSchema":{"type":"object","properties":{"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Id da campanha de WhatsApp"},"campanha":{"type":["string","null"],"description":"Nome da campanha"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_campaign_stop","title":"WeAction Parar campanha (WhatsApp ou discador de voz)","description":"PARA uma campanha de WhatsApp em execução (o botão parar da tela): nada mais sai dela até iniciar de novo.\nPOST /v1/campaign-whatsapp/{id}/stop. Confirma relendo o estado (running).\n\nArgs:\n  - campaign_id (number): id da campanha de WhatsApp\n  - campanha (string): OU o nome da campanha, quando não tiver o id (a tool acha o id)","inputSchema":{"type":"object","properties":{"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Id da campanha de WhatsApp"},"campanha":{"type":["string","null"],"description":"Nome da campanha (use quando não tiver o id)"},"supervisor_login":{"type":"string"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_campaign_create_voice","title":"WeAction Criar campanha de voz (criação rápida)","description":"CRIA uma campanha de VOZ (discador) na unidade, com os MESMOS defaults da criação rápida do supervisor-web (modo PROG, estratégia rrmemory, peso 3, sem pausa automática). O supervisor logado entra como supervisor da campanha; o mailing template é o da unidade.\nPOST /v1/supervisor/{login}/resources/campaigns/voice\n\nANTES: confirme nome e grupo de qualificação (weaction_list_qualifications). Depois de criar, o mailing entra por weaction_create_mailing + weaction_add_contacts_to_mailing.\n\nArgs:\n  - nome (string): nome da campanha\n  - qualify_group_id (number): grupo de qualificação\n  - callcenter_script_id (number, opcional, default 1): script de atendimento (weaction_script_list)\n  - agent_ids (number[], opcional): atendentes membros\n  - org_unit_id (number, opcional): default = unidade do contexto","inputSchema":{"type":"object","properties":{"nome":{"type":"string","minLength":1},"qualify_group_id":{"type":"integer"},"callcenter_script_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"agent_ids":{"type":"array","items":{"type":"integer"}},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"supervisor_login":{"type":"string"}},"required":["nome","qualify_group_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_bots_list","title":"WeAction Bots e URAs do supervisor","description":"BOTS e URAs (fluxos Node-RED) que o supervisor acompanha: id, nome, canal (VOICE/WHATSAPP/CHAT), tipo, timeout e quantos nodes o fluxo tem. USE para \"quais bots existem?\", \"o bot de voz está ativo?\", e como primeiro passo antes de weaction_bot_flow.\nGET /v1/supervisor/{login}/resources/bots","inputSchema":{"type":"object","properties":{"supervisor_login":{"type":"string"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_bot_flow","title":"WeAction Fluxo (nodes) de um bot ou URA","description":"FLUXO completo de UM bot/URA: cada node com id, tipo, nome e para onde liga (wires). É a base para diagnosticar (\"onde o cliente desiste\", \"que menu está mal escrito\") e para propor mudança. Cap de 120 nodes na resposta.\nGET /v1/supervisor/{login}/resources/bots (filtrado pelo id)\n\nArgs:\n  - bot_id (number): id do bot (weaction_bots_list)","inputSchema":{"type":"object","properties":{"bot_id":{"type":"integer"},"supervisor_login":{"type":"string"}},"required":["bot_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_automations","title":"WeAction Automações - Listar","description":"LISTA as automações da(s) unidade(s) do supervisor logado: nome, tipo de gatilho (QUALIFY = ao qualificar, NEW_MESSAGE = nova mensagem, ATTENDANCE_START/END = início/fim de atendimento, PERIODIC = periódica), ligada/desligada, quem criou e resumo de execuções. É a tela \"Automações\" do supervisor.\nGET /v1/automation (supervisorId = login do token)\nPara detalhe de UMA automação use weaction_get_automation; para ligar/desligar, weaction_automation_set_enabled; execuções e métricas: weaction_automation_executions / weaction_automation_metrics.","inputSchema":{"type":"object","properties":{"supervisor_login":{"type":["string","null"],"description":"Default: login do token"},"so_ligadas":{"type":["boolean","null"],"description":"true = só as habilitadas"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_automation_set_enabled","title":"WeAction Automações - Ligar/desligar","description":"LIGA ou DESLIGA uma automação (switch da aba Configurações da automação). Escrita: passe pela aprovação humana e diga o nome da automação e o efeito (ex.: \"desligar 'E-mail LINK' para de mandar e-mail ao qualificar\").\nPOST /v1/automation/enable/{id} ou /disable/{id} (body supervisor_id = login)","inputSchema":{"type":"object","properties":{"automation_id":{"type":"integer","description":"Id da automação (weaction_list_automations)"},"enabled":{"type":"boolean","description":"true = ligar, false = desligar"}},"required":["automation_id","enabled"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_automation_executions","title":"WeAction Automações - Execuções (histórico da automação)","description":"EXECUÇÕES de uma automação no período (aba Histórico): quando rodou, desfecho (sucesso / falha / bloqueado pelo limite do módulo / indeterminado), duração e payload. Use para \"a automação X rodou?\", \"por que falhou?\".\nGET /v1/automation/{id}/executions — default: últimos 7 dias, 25 por página.","inputSchema":{"type":"object","properties":{"automation_id":{"type":"integer"},"status":{"type":["string","null"],"description":"Filtro de desfecho (ex.: sucesso, falha, bloqueado)"},"start_date":{"type":["string","null"],"description":"YYYY-MM-DD (default: 7 dias atrás)"},"end_date":{"type":["string","null"],"description":"YYYY-MM-DD (default: hoje)"},"page":{"anyOf":[{"type":"integer"},{"type":"null"}]},"per_page":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["automation_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_automation_metrics","title":"WeAction Automações - Métricas (dashboard da automação)","description":"MÉTRICAS de uma automação no período (aba Dashboard): total de execuções, taxa de sucesso, falhas, bloqueadas, latência. Use para \"a automação está saudável?\" e para gráfico de tendência (chame por períodos).\nGET /v1/automation/{id}/metrics — default: últimos 7 dias.","inputSchema":{"type":"object","properties":{"automation_id":{"type":"integer"},"start_date":{"type":["string","null"],"description":"YYYY-MM-DD (default: 7 dias atrás)"},"end_date":{"type":["string","null"],"description":"YYYY-MM-DD (default: hoje)"}},"required":["automation_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_automation_history","title":"WeAction Automações - Histórico geral do supervisor","description":"HISTÓRICO de execuções de TODAS as automações do supervisor no período (visão geral). Para uma automação específica prefira weaction_automation_executions.\nGET /v1/automation/supervisor/history — default: últimos 7 dias, 25 por página.","inputSchema":{"type":"object","properties":{"start_date":{"type":["string","null"],"description":"YYYY-MM-DD (default: 7 dias atrás)"},"end_date":{"type":["string","null"],"description":"YYYY-MM-DD (default: hoje)"},"page":{"anyOf":[{"type":"integer"},{"type":"null"}]},"per_page":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_team_status","title":"WeAction Time agora - quem está online, em pausa ou desconectado","description":"STATUS AO VIVO de cada atendente que o supervisor acompanha, por canal (WhatsApp, voz, chat): online/disponível, em pausa, ocupado ou desconectado. É a resposta para \"quem está pausado?\", \"quem está online sem atendimento?\", \"quantos estão logados?\". Determinístico: lista os agentes da unidade e consulta GET /v1/agents/{id}/status um a um (paralelo). O painel de agentes do WeOn (agentDashboard) NÃO é necessário.\nLimite honesto: mostra o status ATUAL. TEMPO ACUMULADO do dia (quem ficou mais tempo em pausa, tempo logado/falado por atendente) é weaction_agent_status_times.","inputSchema":{"type":"object","properties":{"supervisor_login":{"type":["string","null"],"description":"Default: login do token"},"canal":{"anyOf":[{"type":"string","enum":["whatsapp","voice","chat","todos"]},{"type":"null"}],"description":"Filtra o canal (default todos)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_departments","title":"WeAction Departamentos do supervisor","description":"DEPARTAMENTOS que o supervisor logado acompanha (tela Departamentos): id, nome, grupos de atendimento dentro dele, configurações. É a resposta para \"de quais departamentos eu faço parte?\" e o passo antes de weaction_department_dashboard_statistics / weaction_history_dept_* (department_id). Filas/grupos: weaction_supervisor_queues.\nGET /v1/department?username={login}","inputSchema":{"type":"object","properties":{"supervisor_login":{"type":["string","null"],"description":"Default: login do token"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_employers","title":"WeAction Empresas - Listar","description":"LISTA as EMPRESAS (contas) cadastradas na unidade: id, código, nome, CNPJ, receita e campos personalizados (tela \"Empresas\"). Filtre por trecho do nome com `busca`. Para a ficha completa de uma empresa use weaction_get_employer.\nGET /v1/employers","inputSchema":{"type":"object","properties":{"busca":{"type":["string","null"],"description":"Trecho do nome/código/CNPJ (filtro local)"},"limite":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Máximo de linhas (default 50)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_contact_columns","title":"WeAction Campos do contato (colunas do cadastro)","description":"CATÁLOGO de campos do CONTATO da unidade (tela Templates › Campos de dados / Filtros): nome técnico (contact_column_database), rótulo, tipo, obrigatório, valores fixos. Use para montar filtros, entender a planilha de mailing (as colunas exigidas vêm daqui) e explicar o cadastro.\nGET /v1/template/filters/columns/{org_unit_id}","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_data_field_types","title":"WeAction Tipos de campo de dados","description":"TIPOS disponíveis para campos de dados/tags (texto, número, CNPJ, data, checklist...). Use antes de criar uma tag/campo com weaction_create_tag.\nGET /v1/data-field/types","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_tags","title":"WeAction Tags (campos de dados) - Listar","description":"LISTA as TAGS/campos de dados da unidade (tela Templates › Tags): nome, tipo, obrigatória, itens (opções) e grupos onde vale. Tag é o rótulo/campo que o atendente marca no contato, na empresa ou no atendimento.\nGET /v1/new-tag/tags","inputSchema":{"type":"object","properties":{"com_itens":{"type":["boolean","null"],"description":"true = traz as opções de cada tag"},"nome_contem":{"type":["string","null"]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_tag","title":"WeAction Tags (campos de dados) - Criar","description":"CRIA uma TAG/campo de dados na unidade (Templates › Tags). Escrita: passe pela aprovação humana mostrando nome, tipo e opções. Tipos em weaction_data_field_types (ex.: text, number, select, checklist, cnpj, date).\nPOST /v1/new-tag/tags","inputSchema":{"type":"object","properties":{"tag_name":{"type":"string","minLength":1},"tag_type":{"type":"string","minLength":1,"description":"Nome do tipo (weaction_data_field_types)"},"items":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Opções, para tipos de seleção"},"tag_required":{"type":["boolean","null"]},"tag_description":{"type":["string","null"]},"tag_helper_text":{"type":["string","null"]},"attendance_group_ids":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"description":"Grupos onde a tag vale (vazio = unidade)"}},"required":["tag_name","tag_type"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_create_pause","title":"WeAction Pausas - Criar","description":"CRIA um motivo de PAUSA na unidade (Templates › Pausas): nome, descrição, se é produtiva (\"útil\"), se alerta o supervisor, se o agente precisa pedir, se permite transferência e o tempo máximo. Escrita: passe pela aprovação humana. Liste as existentes com weaction_list_pauses (nome duplicado é recusado).\nPOST /v1/pauses/create","inputSchema":{"type":"object","properties":{"nome":{"type":"string","minLength":1},"descricao":{"type":"string","minLength":1},"produtiva":{"type":["boolean","null"],"description":"Pausa útil/produtiva (default false)"},"alerta_supervisor":{"type":["boolean","null"],"description":"Alerta o supervisor ao entrar (default false)"},"precisa_pedir":{"type":["boolean","null"],"description":"Agente precisa solicitar (default false)"},"permite_transferencia":{"type":["boolean","null"],"description":"default false"},"tempo_maximo_segundos":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"0 = sem limite"}},"required":["nome","descricao"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_list_mailing_templates","title":"WeAction Layouts de mailing (Templates › Mailing)","description":"LAYOUTS de mailing ATIVOS da unidade (id e nome): é o cabeçalho que a planilha de importação precisa ter, tanto para importar CONTATOS na base (tela Contatos › Importar pede um layout) quanto para mailing de CAMPANHA (a campanha aponta para um layout). Depois pegue as colunas exatas com weaction_mailing_template_columns.\nGET /v1/supervisor/resources/template/mailing/org-unit/{org_unit_id}","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_mailing_template_columns","title":"WeAction Layout de mailing - colunas EXATAS (modelo da planilha)","description":"COLUNAS EXATAS de um layout de mailing, na ordem, com rótulo (o cabeçalho da planilha), nome técnico, tipo e obrigatoriedade. É o MESMO conteúdo do \"baixar modelo\" da tela (arquivo modelodeimportacao_<layout>.csv, separador \";\"). Use para: (a) gerar o modelo da planilha para o usuário (generate_spreadsheet com ESTE cabeçalho, na ordem, sem inventar coluna); (b) validar uma planilha recebida antes de importar; (c) saber o formato do mailing de uma campanha (passe campaign_id).\nGET /v1/supervisor/resources/template/mailing/columns/{template_id} ou .../columns/strategy-campaign/{campaign_id}","inputSchema":{"type":"object","properties":{"template_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Id do layout (weaction_list_mailing_templates)"},"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Ou id da campanha: usa o layout preso a ela"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_serie_operacao","title":"WeAction Série diária da operação (para gráfico de tendência)","description":"SÉRIE DIA A DIA de uma fonte da operação, pronta para chart_line/chart_bar: o servidor chama a fonte 1x por dia do período e devolve os pontos ({dia, métrica...}). Use quando pedirem tendência, evolução, \"últimos 7/15/30 dias\", comparação por dia.\nFontes:\n  - \"kpi\": KPI do time do supervisor AGORA (contatos, qualificações, receita, avaliação média/CSAT, online). Não tem série por dia: o WeOn não aceita data nesta rota, então devolve um valor só.\n  - \"departamento\": estatísticas do departamento por dia (volumes, tempos, resultado das filas). Exige department_id (weaction_list_groups).\nRegras: 2 a 31 dias; gráfico só com ≥3 pontos; diga o período e a fonte. Cada ponto traz TODAS as métricas numéricas da fonte — escolha a que responde a pergunta (ex.: 'card_avg_attendance_rating' para CSAT) e cite o nome dela.","inputSchema":{"type":"object","properties":{"fonte":{"type":"string","enum":["kpi","departamento"]},"dias":{"type":"integer","minimum":2,"maximum":31,"description":"Quantos dias até hoje (inclusive)"},"department_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Obrigatório para fonte=departamento"},"metricas":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filtra as métricas devolvidas (nomes exatos ou trecho)"}},"required":["fonte","dias"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_criar_agente","title":"WeAction Agentes - Criar atendente","description":"CRIA um AGENTE (atendente) no WeOn, igual à tela Agentes › Novo do supervisor. Escrita: passa pela aprovação humana.\nAntes de chamar, tenha da pessoa (não invente nenhum): login numérico do agente (até 6 dígitos, sem zero à esquerda, ex. o ramal ou a matrícula que o cliente usa), nome completo, e-mail (único no WeOn), senha inicial (o agente troca no 1º acesso) e os canais (WhatsApp, voz, chat, e-mail). Identificador é opcional (ex. \"TELEVENDA121\"). Filas e campanhas são opcionais: use os ids/nomes das ferramentas de fila e campanha.\nPara VÁRIOS agentes (planilha), chame uma vez por agente e diga ao final quem foi criado e quem falhou, com o motivo.\nO WeOn recusa login ou e-mail já existentes: repasse o motivo, não tente de novo com outro número por conta própria.\nPOST /v1/agents/create","inputSchema":{"type":"object","properties":{"login":{"type":"string","minLength":1,"description":"Login numérico do agente (agent_id), 1 a 6 dígitos, sem zero à esquerda"},"nome":{"type":"string","minLength":1},"email":{"type":"string","minLength":3},"senha_inicial":{"type":"string","minLength":4,"description":"Senha do 1º acesso (o WeOn obriga a trocar)"},"whatsapp":{"type":"boolean"},"voz":{"type":"boolean"},"chat":{"type":"boolean"},"email_canal":{"type":["boolean","null"],"description":"Canal de e-mail (default false)"},"identificador":{"type":["string","null"],"description":"Identificador exibido (ex. TELEVENDA121)"},"webrtc":{"type":["boolean","null"],"description":"Telefone no navegador (default true, igual à tela)"},"filas_voz":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"campanhas_voz":{"$ref":"#/properties/filas_voz"},"filas_whatsapp":{"$ref":"#/properties/filas_voz"},"campanhas_whatsapp":{"$ref":"#/properties/filas_voz"},"filas_chat":{"$ref":"#/properties/filas_voz"},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Unidade; sem ela, a da sessão"}},"required":["login","nome","email","senha_inicial","whatsapp","voz","chat"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_group_dashboard","title":"WeAction Grupo — dashboard (volume, abandono, NPS, ranking)","description":"NÚMEROS DO GRUPO no período, os MESMOS da tela Grupo › Dashboard: recebidos, ativos, campanha, atendidas, abandono, timeout na fila, recusadas, ignoradas, NPS médio, qualificações e ranking de agentes. Aceita o NOME do grupo (\"Voz Devel\"), que é como o gestor fala. Traz junto a META de espera configurada e o nível de serviço calculado, para você dizer se está DENTRO ou FORA da meta — número solto não é resposta.\nResponde: \"como foi o grupo X hoje/na semana?\", \"quanto abandonou?\", \"qual o NPS?\", \"quem mais atendeu?\".\nPOST /v1/attendance-group/dashboard/statistics-nps-reject","inputSchema":{"type":"object","properties":{"grupo":{"type":"string","description":"NOME do grupo (ou o id). Lista: weaction_supervisor_queues"},"dias":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Janela em dias até hoje (default 7; 1 = só hoje)"},"inicio":{"type":["string","null"],"description":"YYYY-MM-DD (sobrepõe dias)"},"fim":{"type":["string","null"],"description":"YYYY-MM-DD (default hoje)"},"supervisor_login":{"type":["string","null"]}},"required":["grupo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_group_performance","title":"WeAction Grupo — performance (série: nível de serviço, tempos, volume, fluxo)","description":"SÉRIE NO TEMPO de um grupo (tela Grupo › Performance), por dia, por hora ou a cada 30 min. Quatro leituras:\n  • nivel_servico — % dentro da meta de espera, recebidas e atendidas na meta\n  • tempos — TME (espera), TMC (conversa) e TMA (atendimento), por origem\n  • volume — receptivo, ativo, campanha, atendidas, abandono, timeout\n  • fluxo — iniciados, encerrados, em andamento, em espera\nÉ a fonte para \"está melhorando ou piorando?\" e para gráfico de linha. Compare sempre com a meta do grupo (vem em weaction_group_dashboard).\nPOST /v1/performance/{grupo}/{canal}/{servicelevel|average-times|volumetry|attendance-flow}","inputSchema":{"type":"object","properties":{"grupo":{"type":"string","description":"NOME do grupo (ou id)"},"leitura":{"type":"string","enum":["nivel_servico","tempos","volume","fluxo"],"description":"O que medir"},"frequencia":{"anyOf":[{"type":"string","enum":["daily","hourly","30min"]},{"type":"null"}],"description":"daily (até 365d) | hourly (15d) | 30min (7d). Default daily"},"dias":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Janela em dias (default 7)"},"inicio":{"type":["string","null"]},"fim":{"type":["string","null"]},"supervisor_login":{"type":["string","null"]}},"required":["grupo","leitura"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_group_targets","title":"WeAction Grupo — metas configuradas (o que o gestor definiu)","description":"METAS E LIMITES que o gestor configurou nos grupos (tela Grupo › Configurações › Metas e Fila): meta de tempo de espera (nível de serviço, em segundos), método de cálculo, limite de espera, limite de atendimentos aguardando e os tempos do heatmap (disponível, pausa, atendimento).\nSem isto o Nôa fala número sem régua. SEMPRE consulte antes de dizer que algo está \"alto\" ou \"ruim\": alto é acima da meta DESTE grupo. Sem grupo informado, devolve todos.\nGET /v1/attendance-group?supervisor={login} (config.receptive)","inputSchema":{"type":"object","properties":{"grupo":{"type":["string","null"],"description":"NOME do grupo (vazio = todos)"},"supervisor_login":{"type":["string","null"]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_group_evaluation","title":"WeAction Grupo — avaliação do cliente (pesquisa pós-atendimento, voz)","description":"PESQUISA DE AVALIAÇÃO respondida pelo cliente num grupo de VOZ (bloco Avaliação da tela Grupo › Dashboard): quantas avaliações, quantas completas e abandonadas, e por campo configurado a média, a mediana, maior/menor, distribuição e NPS. É a nota que o CLIENTE deu, diferente da nota da MONITORIA (weaction_monitoring_analysis) e do cumprimento de script.\nSó existe para grupo de voz: em WhatsApp/chat a rota recusa (422) e você deve dizer isso, não inventar.\nPOST /v1/attendance-group/dashboard/evaluation-statistics","inputSchema":{"type":"object","properties":{"grupo":{"type":"string","description":"NOME do grupo de voz (ou id)"},"dias":{"anyOf":[{"type":"integer"},{"type":"null"}]},"inicio":{"type":["string","null"]},"fim":{"type":["string","null"]},"supervisor_login":{"type":["string","null"]}},"required":["grupo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_department_performance","title":"WeAction Departamento — performance consolidada (série)","description":"SÉRIE CONSOLIDADA do departamento (todos os grupos dele juntos), por dia ou por hora: atendidas, timeout, abandono, ativo, campanha, receptivo e total. Tela Departamentos › Performance. O id do departamento vem de weaction_list_departments.\nUse para a visão de cima (\"como foi a operação do departamento na semana\"); para o detalhe por grupo use weaction_group_performance.\nPOST /v1/department/performance/statistics","inputSchema":{"type":"object","properties":{"department_id":{"type":"integer","description":"Id do departamento (weaction_list_departments)"},"frequencia":{"anyOf":[{"type":"string","enum":["daily","hourly"]},{"type":"null"}],"description":"Default daily"},"dias":{"anyOf":[{"type":"integer"},{"type":"null"}]},"inicio":{"type":["string","null"]},"fim":{"type":["string","null"]},"supervisor_login":{"type":["string","null"]}},"required":["department_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_report_csv","title":"WeAction Relatório oficial (o mesmo CSV do botão Baixar)","description":"BAIXA O RELATÓRIO OFICIAL do WeOn — o mesmo arquivo do botão \"Baixar\" da tela — e devolve o cabeçalho e as linhas já lidas. NÃO varra grupo a grupo nem some números à mão: peça o relatório aqui e, se o gestor quiser o arquivo, monte com generate_spreadsheet usando ESTE cabeçalho, na ordem, sem inventar coluna.\nRelatórios disponíveis (todos por período):\n  • performance de grupo: nivel_servico | tempos | volume | fluxo (informe grupo)\n  • historico_grupo: 1 linha por atendimento do grupo (protocolo, atendente, contato, qualificação, tempos)\n  • historico_departamento: idem, consolidando os grupos do departamento\nO CSV do WeOn vem com separador \";\" e cabeçalho em português (ex.: \"TME - Receptivo\"). Diga sempre o período e a fonte.\nPOST /v1/performance/{grupo}/{canal}/{tipo}/report · /v1/supervisor/history/attendance-group/{canal}/report · /v1/supervisor/history/department/{canal}/report","inputSchema":{"type":"object","properties":{"relatorio":{"type":"string","enum":["nivel_servico","tempos","volume","fluxo","historico_grupo","historico_departamento"]},"grupo":{"type":["string","null"],"description":"NOME do grupo (relatórios de grupo)"},"department_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"historico_departamento"},"canal":{"anyOf":[{"type":"string","enum":["voice","whatsapp","chat"]},{"type":"null"}],"description":"Só para histórico de departamento; no grupo vem do próprio grupo"},"frequencia":{"anyOf":[{"type":"string","enum":["daily","hourly","30min"]},{"type":"null"}]},"dias":{"anyOf":[{"type":"integer"},{"type":"null"}]},"inicio":{"type":["string","null"]},"fim":{"type":["string","null"]},"max_linhas":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Linhas devolvidas (default 200)"},"supervisor_login":{"type":["string","null"]}},"required":["relatorio"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_department_intel","title":"WeAction Departamento — tendência, time e monitoria numa leitura","description":"LEITURA COMPLETA DE UM DEPARTAMENTO (conjunto de grupos) no período, em UMA chamada, juntando quatro fontes da tela Departamentos:\n  • monitoria consolidada: total de análises, nota média, VARIAÇÃO contra o período anterior e a série no tempo (é daqui que sai \"melhorou ou piorou\")\n  • nota por grupo dentro do departamento (quem puxa a média para baixo)\n  • ranking por ATENDENTE: nota, quantidade de análises, para saber quem vai bem e quem está abaixo da régua\n  • tópicos que mais escapam, por modelo de avaliação (é processo, não pessoa, quando o mesmo ponto falha em várias)\nOpcionalmente traz a produção consolidada por atendente (volumes por canal, tempos, aceitas/rejeitadas/ignoradas, avaliação do cliente e nota da monitoria) com `com_producao`.\n\nUSE para \"como está o departamento X?\", \"o time está melhorando?\", \"quem está abaixo da régua?\", \"qual ponto do script mais escapa?\". O id vem de weaction_list_departments. Para a operação AO VIVO use gestao_operacao_agora; para um grupo só, weaction_group_dashboard.\nAo responder: dê a nota E a variação, cite o NOME do grupo e da pessoa, e diga o tamanho da amostra — nota de 1 análise não é desempenho.\nPOST /v1/monitoring/dashboard/{department,agent,topics} + /v1/department/consolidated-agent-statistics","inputSchema":{"type":"object","properties":{"department_id":{"type":"integer","description":"Id do departamento (weaction_list_departments)"},"dias":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Janela em dias até hoje (default 7)"},"inicio":{"type":["string","null"],"description":"YYYY-MM-DD"},"fim":{"type":["string","null"],"description":"YYYY-MM-DD (default hoje)"},"periodo":{"anyOf":[{"type":"string","enum":["day","week","month"]},{"type":"null"}],"description":"Granularidade da série (default week)"},"canal":{"anyOf":[{"type":"string","enum":["voice","whatsapp","chat","instagram"]},{"type":"null"}]},"com_producao":{"type":["boolean","null"],"description":"Inclui a produção consolidada por atendente (mais pesado)"},"supervisor_login":{"type":["string","null"]}},"required":["department_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_department_agents_production","title":"WeAction Departamento — produção por atendente (consolidado)","description":"PRODUÇÃO CONSOLIDADA POR ATENDENTE do departamento (o mesmo \"relatório por atendente\" da tela): por canal, atendimentos receptivos, ativos, de campanha, total, aceitas, rejeitadas, ignoradas, tempos, avaliação do cliente e nota da monitoria; em voz também primeiro login, último logoff, tempo conectado, em pausa e ocioso.\nUSE para \"como foi a produção do time?\", \"quem atendeu mais?\", \"quem ficou mais tempo em pausa?\". Para QUALIDADE (nota, tópicos, tendência) use weaction_department_intel.\nPOST /v1/department/consolidated-agent-statistics (datas com hora; página em texto)","inputSchema":{"type":"object","properties":{"department_id":{"type":"integer"},"dias":{"anyOf":[{"type":"integer"},{"type":"null"}]},"inicio":{"type":["string","null"]},"fim":{"type":["string","null"]},"pagina":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Default 1"},"por_pagina":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Default 50"},"supervisor_login":{"type":["string","null"]}},"required":["department_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_dialer_statistics","title":"WeAction Discador - Estatísticas [INTERNO]","description":"[INTERNO] Estatísticas em tempo real do discador de uma campanha.\nGET /v1/campaign-dialer/{id}/dialer/statistics","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"integer"}},"required":["campaign_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_dialer_qualifications","title":"WeAction Discador - Qualificações [INTERNO]","description":"[INTERNO] Lista as qualificações disponíveis para uma campanha discador.\nGET /v1/campaign-dialer/{id}/qualifications","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"integer"}},"required":["campaign_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_dialer_call_history","title":"WeAction Discador - Histórico de Chamadas [INTERNO]","description":"[INTERNO] Histórico de chamadas de uma campanha discador.\nGET /v1/campaign-dialer/history/calls/campaign/{id}","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"integer"},"per_page":{"type":"integer","default":25},"page":{"type":"integer","default":1}},"required":["campaign_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_dialer_strategy_results","title":"WeAction Discador - Resultados por Estratégia [INTERNO]","description":"[INTERNO] Resultados consolidados de uma campanha por estratégia.\nGET /v1/campaign-dialer/results/strategycampaign/{id}","inputSchema":{"type":"object","properties":{"strategy_id":{"type":"integer"}},"required":["strategy_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_dialer_start","title":"WeAction Discador - Iniciar","description":"INICIA o discador de uma campanha de voz (campaign_id = id da estratégia da campanha).\nPOST /v1/campaign-dialer/{id}/dialer/start com o supervisor da sessão.\nEscrita: apresente para aprovação antes. Confirme pelo estado_depois, nunca pela resposta vazia.","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"integer","exclusiveMinimum":0}},"required":["campaign_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_dialer_stop","title":"WeAction Discador - Parar","description":"PARA o discador de uma campanha de voz (campaign_id = id da estratégia da campanha).\nPOST /v1/campaign-dialer/{id}/dialer/stop com o supervisor da sessão.\nEscrita: apresente para aprovação antes. Confirme pelo estado_depois, nunca pela resposta vazia.","inputSchema":{"type":"object","properties":{"campaign_id":{"type":"integer","exclusiveMinimum":0}},"required":["campaign_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_etiquetar_atendimento","title":"WeAction Etiquetar atendimento (atendente)","description":"ADICIONA ou REMOVE uma etiqueta (tag) no atendimento em andamento do atendente, como a tela faz.\n\nFLUXO: pegue as etiquetas em weaction_list_tags com com_itens=true (use o id do ITEM, não o da tag) e o protocolo do\natendimento aberto. A tool lê o atendimento na lista do próprio atendente e confere se a etiqueta entrou.\n\nArgs:\n  - protocolo: protocolo do atendimento aberto\n  - etiqueta_id: id do item da etiqueta (weaction_list_tags)\n  - acao: \"adicionar\" ou \"remover\"\n\nEscrita leve: pode fazer quando o atendente pedir, dizendo qual etiqueta e em qual atendimento.","inputSchema":{"type":"object","properties":{"protocolo":{"type":"string","minLength":6,"description":"Protocolo do atendimento aberto"},"etiqueta_id":{"type":"integer","exclusiveMinimum":0,"description":"Id do ITEM da etiqueta (weaction_list_tags com_itens=true)"},"acao":{"type":"string","enum":["adicionar","remover"],"description":"adicionar ou remover"}},"required":["protocolo","etiqueta_id","acao"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_minha_pausa","title":"WeAction Minha pausa (atendente)","description":"Coloca o PRÓPRIO atendente em pausa ou tira da pausa, como o botão de pausa da tela.\n\nArgs:\n  - acao: \"entrar\" ou \"sair\"\n  - pausa: NOME da pausa, exatamente como cadastrado (obrigatório para entrar; liste com weaction_list_pauses)\n  - canais: whatsapp, voice, chat; vazio = todos\n\nA WeOn devolve por canal: aplicada, AGENDADA (ele está em atendimento: a pausa entra quando terminar)\nou SOLICITADA (a pausa precisa de aprovação do supervisor). Repita ao atendente exatamente o que aconteceu.","inputSchema":{"type":"object","properties":{"acao":{"type":"string","enum":["entrar","sair"]},"pausa":{"type":["string","null"],"description":"Nome da pausa"},"canais":{"anyOf":[{"type":"array","items":{"type":"string","enum":["whatsapp","voice","chat"]}},{"type":"null"}]}},"required":["acao"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_agendar_retorno_voz","title":"WeAction Agendar retorno por ligação (atendente)","description":"AGENDA uma ligação de retorno para um contato, numa campanha de voz rodando, como a tela do atendente.\nPOST /v1/voice/schedules. O retorno cai no discador da campanha na data marcada.\n\nSó VOZ: a WeOn não tem agendamento de retorno por WhatsApp (diga isso se pedirem).\n\nArgs:\n  - contato_id: id do contato\n  - campanha_id: strategy_campaign_id da campanha de voz em execução\n  - telefone: um dos telefones do cadastro do contato (a WeOn recusa número fora do cadastro)\n  - data_hora: \"AAAA-MM-DD HH:MM\"\n  - preferencial: true = o retorno volta para este atendente\n\nEscrita: confirme contato, número e horário com o atendente antes.","inputSchema":{"type":"object","properties":{"contato_id":{"type":"integer","exclusiveMinimum":0},"campanha_id":{"type":"integer","exclusiveMinimum":0},"telefone":{"type":"string","minLength":8},"data_hora":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$"},"preferencial":{"type":["boolean","null"]}},"required":["contato_id","campanha_id","telefone","data_hora"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_chamados_suporte","title":"WeAction Chamados de Suporte (visão GERAL da unidade)","description":"CHAMADOS de suporte da unidade INTEIRA, NUNCA filtrado por atendente (chamado é da operação, não do dono da tarefa). Detecta pelos DOIS eixos: quadro com nome contendo suporte/chamado/support/ticket E/OU tipo de tarefa de chamado (ex. \"chamado_de_suport\"), mesmo em quadro comum.\nRetorna: total, ABERTOS, por criticidade (P0-P3; \"crítico/urgente\" = P0), por quadro, recorrência por contato/empresa (3+ chamados), lista (abertos/críticos primeiro).\nUSE para \"tem chamado aberto?\", \"chamados do cliente X\", \"recorrência de chamados\". Para TAREFAS comuns (do atendente) use weaction_list_tasks.\n\nAO CITAR UM CHAMADO, DIGA O QUE ELE É. Cada item traz `descricao` (o corpo do\npedido) além do título: use-a para dizer se é bug, dúvida, melhoria ou\natualização, junto do status, do quadro e de quem é o responsável. Citar o\nnúmero e falar em \"pendência\" genérica não ajuda ninguém — quem lê já sabe que\nexiste um chamado, quer saber o que ele pede e onde travou.\nE quando `descricao` vier vazia ou for irrelevante (\"teste\", uma linha solta),\nDIGA ISSO: \"o chamado está sem descrição útil\". Não invente o assunto a partir\ndo título — em chamado real o título costuma ser o nome de quem abriu.\n\n\"OS MAIS ATRASADOS\" = `resumo.mais_antigos_abertos`, já pronto e ordenado por\n`dias_aberto`. Responda POR ELE, no chat, item a item (protocolo, assunto, dias\naberto, responsável). NÃO gere planilha para responder isso: planilha é\ncomplemento quando pedida, nunca a resposta. E NÃO fale de \"fora do prazo\"\nquando vier `resumo.aviso_prazo` — nessa base o prazo é carimbo automático da\nintegração e diria que 100% está vencido.\n\n\"POR CLIENTE\" só existe se vier `resumo.por_empresa`. Quando vier\n`resumo.aviso_agregacao`, o campo empresa está vazio na origem: diga isso ao\nusuário e ofereça outro eixo (status, tempo aberto, responsável). NUNCA\napresente `recorrentes` como \"clientes com mais chamados\" — ali entra o contato\nCONCENTRADOR da integração (fila tipo \"SuporteJira\"), que é marcado com\n`concentrador: true` e não é cliente nenhum. Se o tenant tiver ferramenta do\nJira disponível, o cliente do chamado vive LÁ (campo próprio do projeto): use\n`ticket` como chave para buscar; sem ferramenta do Jira, diga que esse campo\nnão chega pela integração em vez de improvisar um cliente.\n\nCADA CHAMADO TRAZ `ticket` (ex. TICKET-46380) e `link`. CITE O TICKET, não o\nprotocolo: é o número que a pessoa reconhece e consegue abrir. E `descricao` é\no corpo real do pedido (vem de `fields.Detalhes`) — use-a para dizer se é bug,\ndúvida, melhoria ou atualização.\n\nSe vier `resumo.lista_parcial` ou `campos_reduzidos`, a lista foi cortada de\npropósito: os números do resumo continuam valendo para o total, mas não afirme\nque os chamados são só os listados.\n\nArgs:\n- org_unit_id (number, opcional): default = do contexto\n- contact_id (number, opcional): só chamados de um contato\n- empresa (string, opcional): filtra por nome da empresa (match parcial)\n- somente_abertos (boolean, default false)\n- quadros (string[], opcional): nomes de quadro extras a tratar como suporte","inputSchema":{"type":"object","properties":{"org_unit_id":{"type":"integer"},"contact_id":{"type":"integer"},"empresa":{"type":"string"},"somente_abertos":{"type":"boolean"},"quadros":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_tasks","title":"WeAction Listar Tarefas (atividades externas)","description":"Lista tarefas/atividades (QBR, check-in, follow-up, etc.) da unidade ou de um atendente.\nPOST /v1/tasks (endpoint de LISTAGEM, não de criação).\n\n- SEM agent_id = TODAS as tarefas da unidade (visão supervisor). Use assim para perguntas gerais (\"tem tarefas vencidas?\") e sobre UM CONTATO (a tarefa pode ser de outro atendente). COM agent_id = só as daquele atendente; para \"MINHAS tarefas\", passe o agent_id do SEU contexto de identidade. NÃO reaproveite agent_id de outra conversa se a pergunta é geral.\n- NUNCA passe 0 como agent_id, contact_id ou data_field_status_group_id: para \"todos\", OMITA o campo (0 é tratado como ausência).\n- resumo.atrasadas é o número autoritativo.\n- contact_id é o ID INTERNO (não o código/identificador da tela): se o usuário citou nome/código/telefone, resolva ANTES via weaction_search_contacts ou pela carteira (weaction_portfolio_*) e use o campo id.\n- CHAMADOS de suporte NÃO são tarefas comuns: use weaction_chamados_suporte (sempre visão geral da unidade).\n\nArgs:\n- org_unit_id (number): unidade organizacional (do contexto do usuário)\n- agent_id (number, opcional): filtra por atendente; OMITA para a unidade inteira\n- contact_id (number, opcional): só tarefas de um contato (ID interno, resolva antes)\n- status (number[], opcional): IDs de status (weaction_list_task_status_groups)\n- init_date / final_date (string, opcional): intervalo \"YYYY-MM-DD HH:mm:ss\"\n- search (string, opcional): busca textual\n- per_page (number, opcional, default 100), page (number, opcional)","inputSchema":{"type":"object","properties":{"org_unit_id":{"type":"integer"},"agent_id":{"type":"integer"},"contact_id":{"type":"integer"},"data_field_status_group_id":{"type":"integer","description":"Grupo de status (board). Se omitido, resolve automaticamente os grupos ativos."},"status":{"type":"array","items":{"type":"integer"}},"init_date":{"type":"string"},"final_date":{"type":"string"},"search":{"type":"string"},"per_page":{"type":"integer"},"page":{"type":"integer"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_task_status_groups","title":"WeAction Status de Tarefas","description":"Lista os grupos de status de tarefas e seus status (A Fazer/Fazendo/Feito).\nGET /v1/external-activities/status-groups?org_unit_id={id}\nUse para descobrir os data_field_status_id (filtrar/criar tarefas) e o data_field_status_group_id.\n\nArgs:\n  - org_unit_id (number, opcional): default = do contexto","inputSchema":{"type":"object","properties":{"org_unit_id":{"type":"integer"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_task_channels","title":"WeAction Canais/Tipos de Tarefa","description":"Lista os canais/tipos de tarefa e seus campos (Título, Detalhes, Contato, Qualificação, etc.).\nGET /v1/external-activities/channel/list?org_unit_id={id}\nUse ANTES de criar uma tarefa, para descobrir o canal e os campos obrigatórios.\n\nSEM FILTRO devolve o RESUMO (id, label_identifier, nome, quadro e quantos campos): a lista\ncompleta com os campos passa de 2 milhões de caracteres numa unidade real e vinha cortada\nem 25 mil. Para ver os CAMPOS de um tipo, passe nome (trecho do nome, sem acento/caixa).\n\nArgs:\n  - org_unit_id (number, opcional): default = do contexto\n  - data_field_status_group_id (number, opcional)\n  - nome (string, opcional): só os tipos cujo nome/label contém isto, COM os campos\n  - resumo (boolean, opcional): força o resumo (true) ou a lista completa (false)","inputSchema":{"type":"object","properties":{"org_unit_id":{"type":"integer"},"data_field_status_group_id":{"type":"integer"},"nome":{"type":["string","null"]},"resumo":{"type":["boolean","null"]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_task","title":"WeAction Criar Tarefa (atividade externa)","description":"Cria uma tarefa/atividade (QBR, check-in, follow-up, ligação AGENDADA) ligada a um contato.\nPOST /v1/external-activities/qualify\n\nTarefa é compromisso para DEPOIS. Se o usuário pediu contato AGORA (\"ligue para o\nFulano\", \"chama ele no telefone\", \"abre uma conversa com ele\"), NÃO crie tarefa: use\nweaction_abrir_atendimento_ativo.\n\nCAMINHO RÁPIDO (o comum): chame DIRETO com title + start_datetime + contact. channel e status_id são OPCIONAIS: a tool resolve sozinha o canal (pelo título: ligação/e-mail/visita/reunião) e o QUADRO PADRÃO + status inicial. NÃO chame weaction_list_task_channels nem weaction_list_task_status_groups antes (1 chamada basta). Só passe channel/status_id se o usuário PEDIU um quadro/tipo específico.\nTarefa = atividade externa DINÂMICA: os campos variam por canal/tipo; a tool descobre e preenche automaticamente.\n\nArgs:\n- channel (string, opcional): label_identifier do canal; omita para o default\n- org_unit_id (number): unidade org (do seu contexto); org_unit_name (string, opcional)\n- title (string): título da tarefa\n- status_id (number, opcional): data_field_status_id; omita p/ quadro padrão\n- start_datetime (string): \"YYYY-MM-DD HH:mm:ss\"; end_datetime (string, opcional)\n- details (string, opcional)\n- contact (object): objeto do contato (id, identifier, fullname, contact_fullname, employer_*...)\n- qualification (object, opcional): {qualify_id, qualify_type, qualify_path}\n- agent_id (number, opcional) / agent_name (string, opcional): responsável (default logado)","inputSchema":{"type":"object","properties":{"channel":{"type":"string","description":"label_identifier do canal (omita p/ default)"},"org_unit_id":{"type":"integer"},"org_unit_name":{"type":"string"},"title":{"type":"string","minLength":1,"description":"Título da tarefa"},"quadro":{"type":"string","description":"NOME do quadro onde criar (ex: \"Padrão\", \"Comercial\"). Use SEMPRE que o usuário — ou uma memória dele — disser em qual quadro quer as tarefas. É o jeito de obedecer a preferência sem saber ids."},"status_id":{"type":"integer","description":"data_field_status_id (omita p/ quadro padrão)"},"start_datetime":{"type":"string","description":"YYYY-MM-DD HH:mm:ss"},"end_datetime":{"type":"string"},"details":{"type":"string"},"contact":{"type":"object","additionalProperties":{},"description":"Objeto do contato"},"qualification":{"type":"object","properties":{"qualify_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"qualify_type":{"type":"string"},"qualify_path":{"type":"string"}},"additionalProperties":false},"agent_id":{"type":"integer"},"agent_name":{"type":"string"},"campos_extra":{"type":"array","items":{"type":"object","properties":{"rotulo":{"type":"string","description":"Rótulo EXATO do campo, como a tool devolveu"},"valor":{"type":"string","description":"Valor a gravar nesse campo"}},"required":["rotulo","valor"],"additionalProperties":false},"description":"Campos que ESTE canal exige e que eu não sei preencher sozinha. Use quando uma tentativa anterior recusou dizendo quais rótulos faltavam."},"anexos":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"nome_arquivo":{"type":"string","minLength":1,"description":"Ex.: Ata - Checkpoint FG POA - 07-10-2026.docx"},"conteudo_base64":{"type":"string","minLength":4,"description":"O arquivo inteiro em base64"},"tipo":{"type":"string","minLength":3,"description":"MIME: application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/pdf ou application/msword"}},"required":["nome_arquivo","conteudo_base64","tipo"],"additionalProperties":false}},{"type":"null"}],"description":"Arquivos para anexar já na criação (campo Anexos da tarefa), ex.: a ata da reunião em .docx ou .pdf. Até 20 MB cada."},"_debug":{"type":"boolean"}},"required":["title","start_datetime","contact"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_anexar_arquivo_tarefa","title":"WeAction Tarefas - Anexar arquivo","description":"ANEXA um arquivo (.docx, .pdf ou .doc, até 20 MB) numa tarefa que já existe, no campo Anexos (aparece na tela da tarefa).\nPara anexar já na criação, use o campo anexos do weaction_create_task (uma chamada só).\nPrecisa do protocolo da tarefa e do contact_id (id interno do contato da tarefa: é por ele que a tarefa é achada).\nMesmo arquivo na mesma tarefa: não duplica, devolve ja_existia: true.\nResposta em JSON. Falha: isError com motivo nao_autenticado | tarefa_nao_encontrada | sem_permissao | arquivo_grande_demais | tipo_nao_aceito | conteudo_invalido | envio_falhou | nao_confirmado.\nEscrita: passa pela aprovação humana.","inputSchema":{"type":"object","properties":{"protocolo":{"type":"string","minLength":1,"description":"Protocolo da tarefa (o que o weaction_create_task devolve)"},"contact_id":{"type":"integer","description":"ID interno do contato da tarefa"},"nome_arquivo":{"type":"string","minLength":1},"conteudo_base64":{"type":"string","minLength":4},"tipo":{"type":"string","minLength":3},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"atualizado_por":{"type":["string","null"],"description":"Login do supervisor ou id do atendente que registra a mudança; omita para o login da sessão"}},"required":["protocolo","contact_id","nome_arquivo","conteudo_base64","tipo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_list_external_activity_status_groups","title":"WeAction Grupos de Status de Atividade Externa [INTERNO]","description":"[INTERNO] Lista os grupos de status de atividades externas.\nGET /v1/external-activities/status-groups","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_qualify_external_activity_v1","title":"WeAction Qualificar Atividade Externa [INTERNO]","description":"[INTERNO] Qualifica uma atividade externa.\nPOST /v1/external-activities/qualify","inputSchema":{"type":"object","properties":{"activity_id":{"type":"integer"},"qualification_id":{"type":"integer"},"notes":{"type":"string"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_create_external_activity_status","title":"WeAction Criar Status (coluna) num Quadro de Tarefas","description":"Cria um STATUS (coluna) dentro de um QUADRO de tarefas que JA EXISTE.\nPOST /v1/external-activities/status-groups/{id}/status/create\n\nPara criar o QUADRO use weaction_create_task_board (ele ja cria as colunas).\nInforme o quadro por NOME (`quadro`) ou por id (`group_id`); sem match a tool\ndiz quais quadros existem em vez de criar no lugar errado.\n\nArgs:\n  - name (string): nome do status (ex: \"Aguardando retorno\")\n  - macro_type (TODO | DOING | DONE | NOT_COMPLETED): OBRIGATORIO no WeOn.\n    TODO = ainda nao comecou; DOING = em andamento/aguardando; DONE = concluido;\n    NOT_COMPLETED = nao concluida/cancelada.\n  - quadro (string, opcional): NOME do quadro\n  - group_id (number, opcional): id do quadro (vence o nome)\n  - order (number, opcional): posicao da coluna","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"macro_type":{"type":"string","enum":["TODO","DOING","DONE","NOT_COMPLETED"],"description":"TODO | DOING | DONE | NOT_COMPLETED (o WeOn exige)"},"quadro":{"type":["string","null"],"description":"NOME do quadro onde criar o status"},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"id do quadro (vence o nome)"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["name","macro_type"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_create_task_board","title":"WeAction Criar Quadro de Tarefas","description":"Cria um QUADRO de tarefas novo (o \"grupo de status\" do WeOn), com colunas.\nPOST /v1/external-activities/status-groups/create (+ status por coluna)\n\nO WeOn cria o quadro com 4 colunas padrao: A Fazer (TODO), Fazendo (DOING),\nFeito (DONE), Nao concluida (NOT_COMPLETED). Se voce passar `statuses`, a tool\nAJUSTA as colunas para ficarem como o supervisor pediu: renomeia a coluna\npadrao do mesmo macro_type e cria as que faltam, na ordem dada. Colunas padrao\nque sobrarem sao mantidas e informadas (a tool nao apaga nada). A coluna\n\"Nao concluida\" (NOT_COMPLETED) e protegida pelo WeOn: sempre existe, nao\nmuda de nome nem de ordem. Nao e erro, e como o WeOn funciona.\n\nDEPOIS do quadro, crie o TIPO de tarefa com weaction_create_task_type\n(`quadro` = este nome): sem tipo, \"Nova tarefa\" fica vazio na tela.\n\nArgs:\n  - name (string): nome do quadro (ex: \"Fluxo Noa\")\n  - statuses (lista, opcional): [{name, macro_type, order?}] na ordem desejada.\n    Ex.: A fazer=TODO, Em andamento=DOING, Aguardando retorno=DOING,\n    Concluido=DONE, Nao concluida=NOT_COMPLETED.\n  - org_unit_id (number, opcional): unidade (default: a do contexto)","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"statuses":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"macro_type":{"type":"string","enum":["TODO","DOING","DONE","NOT_COMPLETED"]},"order":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["name","macro_type"],"additionalProperties":false}},{"type":"null"}]},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_create_task_type","title":"WeAction Criar Tipo de Tarefa (modelo do quadro)","description":"Cria um TIPO DE TAREFA (o \"modelo\" que aparece em \"Nova tarefa\") ligado a um QUADRO.\nPOST /v3/external-activities/channel/create\n\nSem tipo o quadro nao recebe tarefa nenhuma (\"Este quadro ainda nao tem tipos\nde tarefa\"). Um quadro pode ter varios tipos (ex.: Reaproximacao inicial,\nSegundo contato, Ligacao de retencao). O tipo nasce com os campos padrao do WeOn.\n\nArgs:\n  - name (string): nome do tipo (ex: \"Reaproximacao inicial\")\n  - quadro (string): NOME do quadro (ou group_id)\n  - group_id (number, opcional): id do quadro (vence o nome)\n  - label (string, opcional): rotulo curto exibido (default = name)\n  - icon (string, opcional): icone mdi (ex: \"mdi-phone\")\n  - qualify_group_id (number, opcional): grupo de qualificacao ao encerrar a tarefa\n  - org_unit_id (number, opcional): unidade (default: a do contexto)","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"quadro":{"type":["string","null"]},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"label":{"type":["string","null"]},"icon":{"type":["string","null"]},"qualify_group_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"org_unit_id":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_get_automation","title":"WeAction Get Automação [INTERNO]","description":"[INTERNO] Retorna detalhes de uma automação.\nGET /v1/automation/{id}","inputSchema":{"type":"object","properties":{"automation_id":{"type":"integer"}},"required":["automation_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_automation","title":"WeAction Criar Automação [INTERNO]","description":"[INTERNO] Cria uma nova automação na plataforma.\nPOST /v1/automation/create","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"trigger":{"type":"string"},"actions":{},"active":{"type":"boolean","default":true}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_update_automation","title":"WeAction Atualizar Automação [INTERNO]","description":"[INTERNO] Atualiza uma automação existente.\nPOST /v1/automation/update/{id}","inputSchema":{"type":"object","properties":{"automation_id":{"type":"integer"},"name":{"type":"string"},"trigger":{"type":"string"},"actions":{},"active":{"type":"boolean"}},"required":["automation_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_remove_automation","title":"WeAction Remover Automação [INTERNO]","description":"[INTERNO] Remove uma automação.\nPOST /v1/automation/remove/{id}","inputSchema":{"type":"object","properties":{"automation_id":{"type":"integer"}},"required":["automation_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_tags_skip_ivr","title":"WeAction Tags - Pular IVR [INTERNO]","description":"[INTERNO] Lista as tags que permitem pular o IVR.\nGET /v1/tags/can-skip-ivr","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_tags_skip_queue","title":"WeAction Tags - Pular Fila [INTERNO]","description":"[INTERNO] Lista as tags que permitem pular a fila de atendimento.\nGET /v1/tags/can-skip-queue","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_scheduler","title":"WeAction Listar Agendamentos [INTERNO]","description":"[INTERNO] Lista os agendamentos do calendário.\nGET /v1/scheduler","inputSchema":{"type":"object","properties":{"start_date":{"type":"string","description":"YYYY-MM-DD"},"end_date":{"type":"string","description":"YYYY-MM-DD"},"agent_id":{"type":"integer"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_list_quick_messages","title":"WeAction Listar Mensagens Rápidas [INTERNO]","description":"[INTERNO] Lista as mensagens rápidas (respostas prontas) da unidade.\nGET /v1/quick-reply-messages\n\nUSE ANTES de criar uma nova: se já existe uma equivalente, reuse/edite em vez\nde duplicar o catálogo.\n\nArgs:\n  - search (string, opcional): filtra por nome no resultado\n  - page (number, opcional, default 1) · per_page (number, opcional, default 50)","inputSchema":{"type":"object","properties":{"search":{"type":"string","description":"Filtro por nome (aplicado no resultado)"},"page":{"type":"integer","description":"Página (default 1)"},"per_page":{"type":"integer","description":"Itens por página (default 50)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_create_quick_message","title":"WeAction Criar Mensagem Rápida [INTERNO]","description":"[INTERNO] Cria uma mensagem rápida (resposta pronta) na unidade, igual à tela \"Mensagens rápidas\".\nPOST /v1/quick-reply-messages\n\nANTES de criar:\n  1. Liste as existentes (weaction_list_quick_messages); se há equivalente, NÃO duplique;\n  2. Nome curto e buscável (é como o atendente a encontra na conversa);\n  3. Conteúdo em TEXTO PURO, tom da empresa, sem dado interno (NPS/risco), sem prometer o que a operação não cumpre.\n\nArgs:\n  - name (string): nome curto (como aparece na busca)\n  - content (string): texto enviado ao cliente","inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Nome curto e buscável"},"content":{"type":"string","minLength":1,"description":"Texto puro enviado ao cliente"}},"required":["name","content"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_slack_buscar_cliente","title":"Slack: buscar menções a um cliente/empresa","description":"Busca GLOBAL no Slack da empresa por um cliente/empresa/termo — em QUALQUER canal público E nos privados onde a conta conectada participa (DM NUNCA entra). USE quando a pergunta envolver \"o que falaram de <cliente> no Slack\", diagnóstico/360 de cliente com Slack conectado, ou contexto interno de uma conta.\n\nRetorna DUAS coisas — use as duas:\n  1. canais_do_cliente: canais cujo NOME casa com o termo (ex.: #ademicon) — quem conversa DENTRO do canal do cliente não repete o nome dele; se existir canal, LEIA com weaction_slack_conversa_do_canal para responder o que foi falado.\n  2. mensagens: menções de PESSOAS (mensagens de bot/integrações ficam fora por default; bots_ocultados diz quantas), diversificadas por canal, com canal + autor + data + trecho + permalink. CITE canal + autor + data.\n\nSe responder {disponivel:false} → Slack não conectado: IGNORE a fonte e siga (não é erro).\n\nArgs:\n  - termo (string): nome do cliente/empresa (ex: \"Ademicon\"). Tente também domínio/apelido do cadastro.\n  - dias (number, opcional, default 90) · max (number, opcional, default 15, teto 30).\n  - incluir_bots (boolean, opcional, default false): inclui posts de bots/integrações.\n  - somente_publicos (boolean, opcional, default false): exclui canais privados.\n  - excluir_canais (lista de string, opcional): canais a ignorar (ex: [\"diretoria\",\"rh\"]).","inputSchema":{"type":"object","properties":{"termo":{"type":"string","minLength":2,"description":"Cliente/empresa/termo a buscar"},"dias":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Janela em dias (default 90)"},"max":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Máx. mensagens (default 15, teto 30)"},"incluir_bots":{"type":["boolean","null"],"description":"Incluir posts de bots/integrações (default false)"},"somente_publicos":{"type":["boolean","null"],"description":"Excluir canais privados (default false)"},"excluir_canais":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Canais a ignorar (sem #)"}},"required":["termo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_slack_listar_canais","title":"Slack: listar canais visíveis","description":"Lista os canais do Slack visíveis à conexão (públicos + privados onde o Nôa participa), com propósito/topic. USE para descobrir onde publicar ou se existe canal dedicado de um cliente. {disponivel:false} = Slack não conectado, ignore a fonte.\n\nArgs:\n  - filtro (string, opcional): filtra por trecho do nome.","inputSchema":{"type":"object","properties":{"filtro":{"type":["string","null"],"description":"Trecho do nome do canal"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_slack_conversa_do_canal","title":"Slack: ler a conversa de um canal","description":"Lê o histórico recente de UM canal do Slack (oldest-first, autores resolvidos). USE quando existir canal dedicado do cliente/projeto ou após a busca apontar um canal quente. O Nôa precisa participar do canal (privados) — se não participar, o erro orienta convidar @noa. {disponivel:false} = Slack não conectado, ignore.\n\nMensagens com resposta em thread vêm marcadas (respostas_na_thread) — as respostas não são expandidas nesta leitura.\n\nArgs:\n  - canal (string): nome (#cliente-acme) ou id (C0123...).\n  - dias (number, opcional, default 30) · max (number, opcional, default 40, teto 100).","inputSchema":{"type":"object","properties":{"canal":{"type":"string","minLength":1,"description":"Nome (#canal) ou id do canal"},"dias":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Janela em dias (default 30)"},"max":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Máx. mensagens (default 40, teto 100)"}},"required":["canal"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_slack_postar_mensagem","title":"Slack: publicar mensagem em canal ou DM","description":"PUBLICA uma mensagem no Slack (sai como Nôa): num CANAL (`canal`) ou na MENSAGEM DIRETA de uma pessoa (`pessoa`). Ação de ESCRITA com aprovação humana — use somente após o usuário aprovar o texto exato. NUNCA cite nota de monitoria/avaliação de colega; NUNCA misture dados de outro cliente. Sucesso retorna o permalink (sinal final: sem permalink, NÃO afirme que publicou). {disponivel:false} = Slack não conectado — nesse caso NÃO ofereça Slack de novo nesta conversa.\n\nDM: passe `pessoa` com o e-mail corporativo (exato, preferido) ou o nome (\"Rogério Costa\"). Nome ambíguo devolve candidatos — PERGUNTE qual, nunca escolha: DM para a pessoa errada é vazamento. Informe um OU outro: `canal` e `pessoa` juntos é erro.\n\nAVISAR UM ATENDENTE DO TIME NÃO É AQUI. Quando o gestor pedir para \"avisar\", \"sinalizar\", \"cobrar\" ou \"pedir retorno\" de um COLABORADOR, o caminho é `weaction_avisar_agente`: ela entrega na TELA em que a pessoa está atendendo, que é onde o pedido vira ação hoje, e é 1:1 por construção. O Slack é canal (o time inteiro vê) ou DM (depende de a pessoa usar Slack e estar com ele aberto). Só use o Slack para isso se o gestor pedir Slack, ou se o canal direto tiver falhado — e aí diga que está indo pela alternativa.\n\nArgs:\n  - canal (string, opcional): nome (#canal) ou id.\n  - pessoa (string, opcional): e-mail, nome ou user id (DM).\n  - texto (string): a mensagem (texto simples; quebras de linha ok).","inputSchema":{"type":"object","properties":{"canal":{"type":["string","null"],"description":"Nome (#canal) ou id do canal"},"pessoa":{"type":["string","null"],"description":"E-mail, nome ou user id — envia como DM"},"texto":{"type":"string","minLength":1,"maxLength":4000,"description":"Texto aprovado da mensagem"}},"required":["texto"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_slack_responder_thread","title":"Slack: responder numa thread","description":"RESPONDE dentro de uma thread existente no Slack (sai como Nôa). Ação de ESCRITA com aprovação humana. O ts da mensagem-mãe vem da busca ou da leitura do canal. Sucesso retorna permalink (sinal final). {disponivel:false} = Slack não conectado.\n\nArgs:\n  - canal (string): nome ou id · thread_ts (string): ts da mensagem-mãe · texto (string).","inputSchema":{"type":"object","properties":{"canal":{"type":"string","minLength":1,"description":"Nome (#canal) ou id do canal"},"thread_ts":{"type":"string","minLength":6,"description":"ts da mensagem-mãe da thread"},"texto":{"type":"string","minLength":1,"maxLength":4000,"description":"Texto aprovado da resposta"}},"required":["canal","thread_ts","texto"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_avisar_agente","title":"Avisar o colaborador pelo chat interno do WeOn","description":"Manda uma mensagem DIRETA do supervisor para o atendente, no chat interno do WeOn (o mesmo da tela do supervisor). USE quando o gestor pedir para \"avisar\", \"sinalizar\", \"cobrar\" ou \"pedir retorno\" de um colaborador.\n\nESTE É O CAMINHO PREFERIDO PARA FALAR COM UMA PESSOA DO TIME. Os meios não são intercambiáveis, e a diferença é onde a mensagem chega:\n\n- AQUI (chat interno do WeOn): cai na TELA em que a pessoa já está atendendo. É onde um pedido de retorno tem a maior chance de virar ação HOJE, e é 1:1 por construção.\n- Slack: é CANAL. O time todo vê (ou, na DM, depende de a pessoa usar Slack e estar com ele aberto). Serve para dar visibilidade a vários, não para cobrar uma pessoa.\n- E-mail: é ASSÍNCRONO. Ela lê quando abrir a caixa, o que pode ser amanhã.\n\nSe o gestor pedir um meio explicitamente (\"manda no Slack\", \"manda por e-mail\"), use o que ele pediu. Se ele só disse \"avisa o fulano\", \"sinaliza\", \"pede retorno\", use ESTE e diga por onde foi. Se este canal falhar, a resposta já traz as alternativas CALCULADAS para esta pessoa e este tenant (tarefa no WeOn, e-mail, Slack), cada uma com disponivel true/false/null: ofereça só as que existem, nunca as marcadas false.\n\nNUNCA diga que sinalizou alguém sem chamar esta tool: registrar na conversa não avisa ninguém, e o supervisor sai achando que delegou.\n\nA mensagem sai IDENTIFICADA como do supervisor logado. Diga a ele exatamente o texto que será enviado e confirme ANTES de chamar — é mensagem para uma pessoa real, no meio do trabalho dela.\n\nELA CONFERE A PRESENÇA ANTES DE MANDAR. O chat interno entrega na TELA da pessoa: com ela fora do sistema, o WeOn recusa (medido). Então, se ela estiver offline, a tool NÃO envia e devolve enviado=false com tentei_enviar=false e as alternativas prontas: diga isso ao gestor e ofereça as alternativas, não invente que mandou. Se ele insistir, chame de novo com forcar=true. QUANDO O ENVIO DÁ CERTO, não afirme nada sobre presença: diga que foi enviada e, se o gestor precisar de certeza de que ela viu, diga com todas as letras que o WeOn não confirma leitura e ofereça um segundo caminho. QUANDO FALHA é diferente: a resposta traz 'colaborador' (online/offline/desconhecido) e uma 'leitura' pronta: use-a, porque \"ela não está com o WeOn aberto agora\" é a explicação mais provável da recusa e é o que o gestor precisa para decidir o próximo passo. Quem responde \"quem está online agora\" é o carteira_colaboradores com filtro online, que lê o status de cada pessoa e devolve os NOMES.\n\nVOCABULÁRIO DO WEON: atendente, agente e colaborador são A MESMA COISA. \"Quantos agentes online?\" e \"quantos colaboradores online?\" são a mesma pergunta e têm que ter a mesma resposta. Só \"agente de IA\" é outra coisa (é você).\n\nArgs:\n  - agente_id (string): id NUMÉRICO do atendente no WeOn (não o nome).\n  - mensagem (string): o texto, já aprovado pelo gestor.","inputSchema":{"type":"object","properties":{"agente_id":{"type":"string","description":"Id numérico do atendente no WeOn"},"mensagem":{"type":"string","description":"Texto aprovado pelo gestor"},"forcar":{"type":["boolean","null"],"description":"Mandar mesmo com a pessoa fora do sistema. Só use quando o gestor insistir depois de eu ter avisado que ela está offline."}},"required":["agente_id","mensagem"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_pipe_listar","title":"Pipe: listar pipes","description":"Lista os Pipes (pipeline de vendas / funil de negócios da WeOn) que o usuário pode operar.\nGET /v1/pipelines\nUSE para descobrir o nome/id do Pipe antes de criar, mover ou listar negócios. Pipe que não aparece = sem acesso ou módulo desligado na unidade.","inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_pipe_etapas","title":"Pipe: etapas e resultados","description":"Etapas (colunas) de um Pipe em ordem, e os resultados possíveis ao finalizar (ganho, perdido).\nGET /v1/pipelines/{id}/stages + /outcomes\nUSE antes de mover um negócio, para usar o nome exato da etapa e do resultado.","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_pipe_negocios","title":"Pipe: listar negócios","description":"Negócios (cards) de um Pipe, com filtros. Tabela com o TOTAL autoritativo.\nGET /v1/pipelines/{id}/cards\nUSE para \"quais negócios estão em Proposta\", \"negócios do Fulano\", \"negócios da empresa X\", \"ganhos do mês\".\nArgs: pipe, busca (título ou código), responsavel (login), contact_id, empresa_id, etapa (nome), resultado (ganho|perdido), page, per_page (máx 100).","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."},"busca":{"type":["string","null"],"description":"Começo do título ou o código exato"},"responsavel":{"type":["string","null"],"description":"Login do responsável"},"contact_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"empresa_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"etapa":{"type":["string","null"],"description":"Nome da etapa"},"resultado":{"anyOf":[{"type":"string","enum":["ganho","perdido"]},{"type":"null"}]},"page":{"anyOf":[{"type":"integer"},{"type":"null"}]},"per_page":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_pipe_negocio","title":"Pipe: detalhe do negócio","description":"Um negócio do Pipe por inteiro: etapa, contatos, empresa, responsável, valor, resultado e, se pedir, o histórico recente.\nGET /v1/pipelines/{id}/cards/{cardId} (+ /history)","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."},"card_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"codigo":{"type":["string","null"],"description":"Código do negócio, ex. OPT-2026-00017"},"historico":{"type":["boolean","null"],"description":"true = inclui os últimos eventos"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]},{"name":"weaction_pipe_criar_negocio","title":"Pipe: criar negócio (com contato, empresa e responsável)","description":"Cria um NEGÓCIO no Pipe já com o contato atrelado, a empresa e o responsável, numa chamada só.\nFaz, nesta ordem: (1) acha o Pipe; (2) confere o responsável (e-mail ou login) na lista de acesso do Pipe; (3) procura o contato na unidade do Pipe pelo telefone e pelo e-mail e, se não existir, cria (número no WhatsApp quando a unidade tem WhatsApp, senão no telefone); (4) se veio empresa, acha ou cria na unidade e atrela ao contato; (5) se o contato já tem negócio ABERTO neste Pipe, devolve o existente em vez de duplicar; (6) cria o negócio e põe o responsável; (7) relê e confirma.\nUSE quando entra um lead/oportunidade que deve ir para o funil de vendas.\nSe o retorno disser \"NÃO CRIEI O NEGÓCIO\" com \"PLANO B\", siga o plano B (criar a tarefa) e NÃO re-chame esta ferramenta.\nArgs: pipe, titulo, nome (do contato), telefone, email, contact_id (se já souber), empresa (nome), empresa_id, responsavel_email, responsavel_login, valor (reais), descricao (vira o 1º comentário).","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."},"titulo":{"type":"string","minLength":1,"description":"Título do negócio, ex.: 'Empresa X: atendimento WhatsApp'"},"nome":{"type":["string","null"],"description":"Nome do contato"},"telefone":{"type":["string","null"],"description":"Telefone/WhatsApp do contato"},"email":{"type":["string","null"]},"contact_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Id do contato, se já souber"},"empresa":{"type":["string","null"],"description":"Nome da empresa do contato"},"empresa_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"responsavel_email":{"type":["string","null"],"description":"E-mail do colaborador responsável"},"responsavel_login":{"type":["string","null"]},"valor":{"type":["number","null"],"description":"Valor estimado em reais"},"descricao":{"type":["string","null"],"description":"Contexto do lead; vira o 1º comentário"},"_debug":{"type":["boolean","null"],"description":"true = só mostra o que faria, não grava"}},"required":["titulo"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_pipe_editar_negocio","title":"Pipe: editar negócio","description":"Edita um negócio do Pipe: título, valor, status, empresa e responsável (por e-mail ou login, conferido no acesso do Pipe).\nPATCH /v1/pipelines/{id}/cards/{cardId}\nStatus possíveis: aguardando_resposta, aguardando_cliente, concluido, impedimento, nenhum. Para mudar de ETAPA use weaction_pipe_mover_negocio.","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."},"card_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"codigo":{"type":["string","null"]},"titulo":{"type":["string","null"]},"valor":{"type":["number","null"],"description":"Valor em reais; use remover_valor para limpar"},"remover_valor":{"type":["boolean","null"]},"status":{"anyOf":[{"type":"string","enum":["aguardando_resposta","aguardando_cliente","concluido","impedimento","nenhum"]},{"type":"null"}]},"empresa_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"empresa":{"type":["string","null"],"description":"Nome de empresa existente na unidade"},"responsavel_email":{"type":["string","null"]},"responsavel_login":{"type":["string","null"]},"_debug":{"type":["boolean","null"]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_pipe_mover_negocio","title":"Pipe: mover negócio de etapa (ou ganhar/perder)","description":"Move um negócio para outra etapa do Pipe, pelo NOME da etapa. Ganhar ou perder = mover para a etapa final informando o resultado (ex.: \"Ganho\", \"Perdido\").\nPOST /v1/pipelines/{id}/cards/{cardId}/movements\nSe a etapa exigir campos de formulário, a resposta lista os campos que faltam: PERGUNTE ao usuário e refaça com campos=[{field_id, valor}]. Nunca invente valor.","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."},"card_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"codigo":{"type":["string","null"]},"etapa":{"type":"string","minLength":1,"description":"Nome da etapa de destino"},"resultado":{"type":["string","null"],"description":"Nome do resultado ao finalizar (ex.: Ganho, Perdido)"},"campos":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"field_id":{"type":"integer"},"valor":{"type":"string"}},"required":["field_id","valor"],"additionalProperties":false}},{"type":"null"}]},"_debug":{"type":["boolean","null"]}},"required":["etapa"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_pipe_contato_negocio","title":"Pipe: contatos do negócio","description":"Adiciona um contato ao negócio, torna um contato o principal, ou remove. O contato precisa ser da unidade do Pipe.\nPOST/PATCH/DELETE /v1/pipelines/{id}/cards/{cardId}/contacts","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."},"card_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"codigo":{"type":["string","null"]},"acao":{"type":"string","enum":["adicionar","principal","remover"]},"contact_id":{"type":"integer"}},"required":["acao","contact_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_pipe_comentar","title":"Pipe: comentar no negócio","description":"Registra um comentário no histórico do negócio (opcional: lembrete em data/hora com fuso, ex. 2026-10-06T09:00:00-03:00).\nPOST /v1/pipelines/{id}/cards/{cardId}/comments","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."},"card_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"codigo":{"type":["string","null"]},"texto":{"type":"string","minLength":1},"lembrete_em":{"type":["string","null"],"description":"ISO-8601 com fuso"}},"required":["texto"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_pipe_vincular_atendimento","title":"Pipe: vincular atendimento ao negócio","description":"Liga um atendimento (protocolo) a um negócio do Pipe; o contato entra no negócio se ainda não estiver. Não move de etapa.\nPOST /v1/pipelines/{id}/cards/{cardId}/attendances","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."},"card_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"codigo":{"type":["string","null"]},"protocolo":{"type":"string","minLength":1},"canal":{"type":"string","enum":["whatsapp","email","voice","chat"]},"contact_id":{"type":"integer"},"inicio":{"type":"string","description":"Início do atendimento, ISO-8601 com fuso"}},"required":["protocolo","canal","contact_id","inicio"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_pipe_excluir_negocio","title":"Pipe: excluir negócio (lixeira)","description":"Manda o negócio para a lixeira do Pipe (recuperável por 30 dias). Exige o título exato confirmado pelo usuário.\nDELETE /v1/pipelines/{id}/cards/{cardId}","inputSchema":{"type":"object","properties":{"pipe":{"anyOf":[{"type":["string","number"]},{"type":"null"}],"description":"Nome ou id do Pipe. Vazio = o único Pipe que o usuário opera (se houver mais de um, pergunte)."},"card_id":{"anyOf":[{"type":"integer"},{"type":"null"}]},"codigo":{"type":["string","null"]},"titulo_confirmado":{"type":"string","minLength":1,"description":"Título do negócio, confirmado pelo usuário"}},"required":["titulo_confirmado"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["mutation"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["mutation"]},"answers_query_types":["mutation"]},{"name":"weaction_versao_dos_servidores","title":"Versão (build) dos servidores WeOn","description":"LÊ o build publicado por servidores do WeOn: AgentWeb (version.json) e SupervisorWeb (comentário \"Build version\"). Só leitura, sem login.\nUSE PARA: saber em que versão um cliente está e comparar com o changelog.\nDEVOLVE: por servidor, agentweb_build e supervisorweb_build (o número depois de \"5.0.\"), as datas e se o servidor foi alcançado.\nNÃO FAZ: não lê outro endereço (só https://*.weon.com.br, só os dois arquivos de versão); não atualiza nada.\nArgs:\n  - servidores (string[]): endereços dos servidores, ex.: \"https://ademicon.weon.com.br\" (até 30).","inputSchema":{"type":"object","properties":{"servidores":{"type":"array","items":{"type":"string","minLength":8},"minItems":1,"maxItems":30,"description":"Endereços dos servidores WeOn (https://<nome>.weon.com.br)"}},"required":["servidores"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"answers_query_types":["filtered_list"]},"execution":{"taskSupport":"forbidden"},"_meta":{"answers_query_types":["filtered_list"]},"answers_query_types":["filtered_list"]}]