diff --git a/REGRAS_IA.md b/REGRAS_IA.md index 2e6a654..fa43c30 100644 --- a/REGRAS_IA.md +++ b/REGRAS_IA.md @@ -7,8 +7,12 @@ Este arquivo contém restrições críticas que **Sempre** devem ser seguidas pe - **RESTRIÇÃO:** Nunca altere esta versão automaticamente (nem em código, nem em `.env`, nem em `config.json`). - **AÇÃO:** Sempre **pergunte e peça autorização explícita** antes de considerar qualquer mudança neste modelo. -## 2. Deploy Automático -- Sempre use o script `./update.sh` após qualquer alteração no código para garantir sincronização com Gitea e Coolify via Webhook. +## 3. Sistema Cronos (Memória Permanente) +- **DIRETRIZ:** Todo agente deve ser "Cronos-Aware". +- **AÇÃO:** + 1. No início de uma tarefa complexa, use `cronos_query` para recuperar o contexto mais recente. + 2. Ao finalizar um bloco de trabalho ou decisão importante, use `cronos_log` para persistir o progresso. + 3. Mantenha os logs em `current_week` para acompanhamento semanal e `knowledge` para informações técnicas fixas. --- *Assinado: Antigravity Agent* diff --git a/ai_agent.py b/ai_agent.py index a49081b..95b4606 100644 --- a/ai_agent.py +++ b/ai_agent.py @@ -47,14 +47,19 @@ DIRETRIZES: * BotVPS / Antigravity: `/root/Apps/BotVPS` (seu código fonte) * Repositórios: `/data/repositories/` - Se não souber onde um arquivo está, use `run_bash_command` com `find`. NUNCA CHUTE DIRETÓRIOS. +- MEMÓRIA CRONOS (LONGO PRAZO): + * Siga a "Amizade Intelectual": lembre-se de conversas passadas e planos. + * Use `cronos_query` no início de tarefas complexas para recuperar contexto semanal ou por assunto. + * Use `cronos_log` (folder='current_week' ou 'knowledge') para salvar progressos, decisões e ideias importantes. + * Raiz: `/root/Antigravity_Memory/` ### FERRAMENTAS DISPONÍVEIS: {tools_desc} ### FORMATO DE RESPOSTA: - Use [TOOL:nome] arg [/TOOL] para ações. -- Pense passo a passo se a tarefa for complexa. -- Finalize sempre com resumo final para o usuário . +- Pense passo a passo. Se for uma nova sessão ou assunto, comece buscando em Cronos. +- Finalize sempre com resumo final . """ history_str = "" diff --git a/cronos_util.py b/cronos_util.py new file mode 100644 index 0000000..55d8b78 --- /dev/null +++ b/cronos_util.py @@ -0,0 +1,32 @@ +import sys +import argparse +import json +from tools import cronos_log, cronos_query + +def main(): + parser = argparse.ArgumentParser(description="Utilitário CLI para o Sistema Cronos (Memória Permanente)") + parser.add_argument("--log", type=str, help="Conteúdo para salvar no log") + parser.add_argument("--query", type=str, help="Termo para pesquisar na memória") + parser.add_argument("--topic", type=str, default="geral", help="Assunto do log (nome do arquivo .md)") + parser.add_argument("--folder", type=str, default="current_week", help="Pasta (current_week ou knowledge)") + + args = parser.parse_args() + + if args.log: + payload = { + "topic": args.topic, + "content": args.log, + "folder": args.folder + } + result = cronos_log(json.dumps(payload)) + print(result) + elif args.query: + # Formata arg como string simples ou pair para o parser do tools.py + query_arg = f'query="{args.query}" folder="{args.folder}"' + result = cronos_query(query_arg) + print(result) + else: + parser.print_help() + +if __name__ == "__main__": + main() diff --git a/tools.py b/tools.py index f930b15..d98e636 100644 --- a/tools.py +++ b/tools.py @@ -2,6 +2,8 @@ import subprocess import os import psutil import time +import re +import json def run_bash_command(command: str) -> str: """Executa um comando bash na VPS e retorna a saída.""" @@ -75,6 +77,64 @@ def get_docker_stats() -> str: """Retorna o uso de CPU/RAM de todos os containers ativos via comando docker stats.""" return run_bash_command('docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"') +# ============================================================ +# SISTEMA CRONOS (MEMÓRIA DE LONGO PRAZO) +# ============================================================ + +MEMORY_ROOT = "/root/Antigravity_Memory" + +def cronos_log(arg: str) -> str: + """ + Salva memórias. Formato esperado: topic="assunto", content="texto", folder="current_week" + Também aceita JSON. + """ + try: + # Tenta como JSON primeiro + try: + data = json.loads(arg) + topic = data.get("topic", "geral") + content = data.get("content", "") + folder = data.get("folder", "current_week") + except: + # Parser simples por regex para query="xxx" ou topic="xxx" + topic_m = re.search(r'topic=["\'](.*?)["\']', arg) + content_m = re.search(r'content=["\'](.*?)["\']', arg, re.S) + folder_m = re.search(r'folder=["\'](.*?)["\']', arg) + + topic = topic_m.group(1) if topic_m else "geral" + content = content_m.group(1) if content_m else arg # fallback para arg bruto + folder = folder_m.group(1) if folder_m else "current_week" + + if not content: return "Erro: Conteúdo vazio." + + target_dir = os.path.join(MEMORY_ROOT, folder) + if not os.path.exists(target_dir): + os.makedirs(target_dir, exist_ok=True) + + filename = f"{topic.lower().replace(' ', '_')}.md" + filepath = os.path.join(target_dir, filename) + + timestamp = time.strftime("%Y-%m-%d %H:%M:%S") + entry = f"\n---\n### ENTRY: {timestamp}\n{content}\n" + + with open(filepath, "a" if os.path.exists(filepath) else "w") as f: + f.write(entry) + + return f"Sucesso: Salvo em Cronos/{folder}/{filename}" + except Exception as e: + return f"Erro ao salvar em Cronos: {e}" + +def cronos_query(arg: str) -> str: + """Busca informações. Formato: query="termo", folder="pasta" """ + query_m = re.search(r'query=["\'](.*?)["\']', arg) + folder_m = re.search(r'folder=["\'](.*?)["\']', arg) + + query = query_m.group(1) if query_m else arg + folder = folder_m.group(1) if folder_m else "current_week" + + target_dir = os.path.join(MEMORY_ROOT, folder) + return run_bash_command(f"grep -rniI '{query}' {target_dir} | head -n 20") + # Mapeamento para o Agente entender quais tools ele possui (será usado no loop ReAct) AVAILABLE_TOOLS = { "run_bash_command": { @@ -92,5 +152,13 @@ AVAILABLE_TOOLS = { "get_docker_stats": { "description": "Retorna uma tabela com o consumo de CPU e Memória de cada container.", "func": get_docker_stats + }, + "cronos_log": { + "description": "Salva memórias importantes (assunto, conteúdo, pasta=current_week|knowledge). Use sempre que algo for concluído.", + "func": cronos_log + }, + "cronos_query": { + "description": "Busca informações no histórico da Memória Cronos.", + "func": cronos_query } }