commands.js 1.8 KB

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