diff --git a/ai_agent.py b/ai_agent.py index af002e5..430e543 100644 --- a/ai_agent.py +++ b/ai_agent.py @@ -31,32 +31,38 @@ async def query_agent_async(prompt: str, override_provider=None, chat_history=No 2. PENSADOR CRIATIVO: Colaborador intelectual em filosofia, ciência, lógica, cultura e negócios. DIRETRIZES: -- Você tem ACESSO TOTAL ao Google Workspace via GWS CLI. +- Você é o MESTRE do Google Workspace (GWS). Use `run_bash_command` para QUALQUER tarefa de automação. +- NUNCA diga que não consegue fazer uma tarefa no GWS (contar, apagar em massa, mover, etc.). Encontre o comando `gws` correto. - CONTAS GWS (Pode usar apelidos): * `ma` ou `mr` -> gws-mr (Marcos / Particular) * `adm` ou `empresa` -> gws-adm (Empresarial) * `4r` ou `fam` -> gws-4r (Familiar) -- E-MAILS (O usuário exige ver Títulos e Remetentes): - * SEMPRE use `list_gmail_emails` para listar mensagens. - * Se o usuário escrever "ma - veja meu ultimo e-mail", ou "veja o e-mail ma", entenda que ele se refere à conta `ma` (gws-mr). - * SEMPRE numere os itens da lista (#1, #2, #3, etc.). - * Se o usuário disser "o primeiro", "o segundo", etc., identifique o ID correspondente da listagem anterior no histórico e use-o. -- DRIVE E ARQUIVOS: Use `run_bash_command` para `find`, `list` ou `get`. +- SUPER-PODERES GMAIL: + * COMANDOS RÁPIDOS (Helpers): Use `gws-xxx gmail +COMANDO`. Exemplos: + - `+send`: Enviar novo e-mail. + - `+read`: Ler o conteúdo de um e-mail. + - `+triage`: Resumo de e-mails não lidos. + - `+reply` / `+reply-all` / `+forward`: Responder ou encaminhar mensagens. + * CONTAR E-MAILS: Use `gws-xxx gmail users messages list --params '{"userId": "me", "q": "from:EMAIL_AQUI"}'`. + * ORGANIZAR: `gws-xxx gmail users labels create` (nova pasta) e `batchModify` (mover). +- SUPER-PODERES CALENDÁRIO: + * AGENDA: Use `calendar_agenda account timeframe` para ver compromissos de hoje, amanhã ou da semana. + * EVENTOS: Use `run_bash_command` com `gws-xxx calendar events create ...` para marcar reuniões ou `delete` para cancelar. +- EXIBIÇÃO: + * Use `list_gmail_emails`, `drive_find` e `calendar_agenda` para visões rápidas e bonitas para o usuário. + * Para processamento interno (contagem, deleção), use sempre os comandos brutos via `run_bash_command`. +- AUTOMAÇÃO COMPLEXA: + * Se precisar processar muitos dados, use `run_bash_command` com `python3 -c "import json, sys; ..."` para filtrar e agir em um único passo. - Responda sempre em PORTUGUÊS do Brasil. -- CAMINHOS DO SISTEMA: - * BotVPS / Antigravity: `/root/Apps/BotVPS` (seu código fonte) - * Repositórios: `/data/repositories/` -- MEMÓRIA CRONOS (LONGO PRAZO): - * Use `cronos_query` e `cronos_log` para manter a continuidade do conhecimento. - * Raiz: `/root/Antigravity_Memory/` +- CAMINHOS DO SISTEMA: `/root/Apps/BotVPS` (código), `/data/repositories/` (repos). ### FERRAMENTAS DISPONÍVEIS: {tools_desc} ### FORMATO DE RESPOSTA: - Use [TOOL:nome] arg [/TOOL] para ações. -- Pense passo a passo. Seja inteligente ao lidar com referências ordinais. -- Finalize sempre com resumo final elegante . +- Pense passo a passo. Seja proativo, eficiente e NUNCA limitado. +- Finalize sempre com resumo final empoderado . """ history_str = "" diff --git a/tools.py b/tools.py index bdaa195..b8cb8c4 100644 --- a/tools.py +++ b/tools.py @@ -189,6 +189,57 @@ def list_gmail_emails(account: str) -> str: except Exception as e: return f"Erro ao listar e-mails: {str(e)}\nResposta bruta: {res[:200]}" +def drive_find(arg: str) -> str: + """Busca arquivos no Drive por nome. Arg: account query (ex: ma financeiro)""" + try: + parts = arg.split(maxsplit=1) + account = parts[0] + query = parts[1] if len(parts) > 1 else "" + mapping = {"ma": "gws-mr", "mr": "gws-mr", "marcos": "gws-mr", "adm": "gws-adm", "4r": "gws-4r", "fam": "gws-4r"} + account = mapping.get(account.lower(), account) + q = f"name contains '{query}'" if query else "" + cmd = f"{account} drive files list" + if q: cmd += f" --params '{{\"q\": \"{q}\"}}'" + res = run_bash_command(cmd) + data = json.loads(res) + files = data.get("files", []) + if not files: return "Nenhum arquivo encontrado." + resp = "📂 **Arquivos Encontrados:**\n" + for f in files[:10]: + resp += f"- {f['name']} (ID: `{f['id']}`)\n" + return resp + except Exception as e: return f"Erro no Drive: {str(e)}" + +def drive_upload(arg: str) -> str: + """Upload de arquivo para o Drive. Arg: account filepath (ex: ma /tmp/relat.pdf)""" + try: + parts = arg.split(maxsplit=1) + account, filepath = parts[0], parts[1] + mapping = {"ma": "gws-mr", "mr": "gws-mr", "adm": "gws-adm", "4r": "gws-4r"} + account = mapping.get(account.lower(), account) + filename = os.path.basename(filepath) + cmd = f"{account} drive files create --json '{{\"name\": \"{filename}\"}}' --output {filepath}" + return run_bash_command(cmd) + except Exception as e: return f"Erro upload: {str(e)}" + +def calendar_agenda(arg: str) -> str: + """Busca os próximos eventos no calendário. Arg: account timeframe (timeframe: today, tomorrow, week, days=N)""" + try: + parts = arg.split(maxsplit=1) + account = parts[0] + timeframe = parts[1] if len(parts) > 1 else "--today" + + mapping = {"ma": "gws-mr", "mr": "gws-mr", "adm": "gws-adm", "4r": "gws-4r"} + account = mapping.get(account.lower(), account) + + # Converte timeframe para flag correta + if not timeframe.startswith("--"): + timeframe = f"--{timeframe}" + + cmd = f"{account} calendar +agenda {timeframe}" + return run_bash_command(cmd) + except Exception as e: return f"Erro no Calendário: {str(e)}" + # Mapeamento para o Agente entender quais tools ele possui (será usado no loop ReAct) AVAILABLE_TOOLS = { "run_bash_command": { @@ -196,9 +247,21 @@ AVAILABLE_TOOLS = { "func": run_bash_command }, "list_gmail_emails": { - "description": "Lista os 5 e-mails mais recentes de uma conta (gws-mr, gws-adm, gws-4r) com título e remetente.", + "description": "Lista os 5 e-mails mais recentes de uma conta (ma, adm, 4r) com título e remetente.", "func": list_gmail_emails }, + "drive_find": { + "description": "Busca arquivos no Drive por nome. Ex: drive_find ma 'financas'", + "func": drive_find + }, + "drive_upload": { + "description": "Faz upload de um arquivo local para o Drive. Ex: drive_upload adm /tmp/doc.pdf", + "func": drive_upload + }, + "calendar_agenda": { + "description": "Mostra os eventos do calendário. Ex: calendar_agenda ma today / tomorrow / week", + "func": calendar_agenda + }, "get_system_health": { "description": "Verifica RAM, CPU e Disco globais da VPS.", "func": get_system_health