| 1234567891011121314151617181920212223242526272829303132 |
- import { parseAcsCommand, resolverComandoAcs } from "./acsCommand.js";
- import { parseCtoCommand, resolverComandoCto } from "./ctoCommand.js";
- import { parseLoginCommand, resolverComandoLogin } from "./loginCommand.js";
- // comandos explícitos, à parte dos 3 modos do roteador por LLM — cada um intercepta
- // a mensagem antes de classificarModoChat pra resolver via consulta estruturada
- // direto no ERP, sem gastar chamada de LLM nem arriscar alucinação em dado técnico.
- // login fica por último: "/<pppoe>" (uma palavra, sem espaço) é o fallback genérico,
- // então precisa vir depois de qualquer comando mais específico como "/cto <busca>"
- // (que sempre tem espaço e por isso nunca colide com o parser de login). "/acs" sozinho
- // (sem espaço) cairia no fallback de login, então o /acs também vem antes dele.
- const COMMANDS = [
- { parse: parseAcsCommand, resolve: resolverComandoAcs },
- { parse: parseCtoCommand, resolve: resolverComandoCto },
- { parse: parseLoginCommand, resolve: resolverComandoLogin }
- ];
- // mesmo dado (cliente, contratos, faturas, OS) que o modo "atendimentos" já restringe
- // a administradores — os comandos consultam o ERP direto, então precisam da mesma checagem.
- const COMANDO_RESTRITO_TEXTO =
- "Esse comando consulta dados de cliente no ERP e é restrito a administradores — não é possível usá-lo " +
- "com o seu nível de acesso atual. Peça para um administrador verificar, se precisar dessa informação.";
- export async function resolverComandoChat(message, { isAdmin = false } = {}) {
- for (const { parse, resolve } of COMMANDS) {
- const termo = parse(message);
- if (termo === null || termo === undefined) continue;
- if (!isAdmin) return { answer: COMANDO_RESTRITO_TEXTO, sources: [] };
- return resolve(termo);
- }
- return null;
- }
|