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
}
}