| | |
| |
|
| | import json |
| | import os |
| | import sys |
| | import time |
| | import sqlite3 |
| |
|
| | sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) |
| |
|
| | from datetime import datetime, UTC |
| | from tools.context_builder import build_contexts, build_prompt |
| | from tools.llm import call_llm |
| | from tools.command_parser import extract_commands |
| | from tools.command_executor import execute_commands |
| | from tools.memory_utils import ( |
| | detect_stagnation, |
| | activate_anti_stagnation, |
| | update_llm_memory |
| | ) |
| | from tools.storage import Storage |
| | from tools.peers import refresh_peer_list, check_peer_statuses |
| |
|
| | def start_repl(config=None): |
| | print("[🧠 HMP-Agent] Запуск REPL-режима (v2)") |
| | config = config or {} |
| | db = Storage(config=config) |
| |
|
| | try: |
| | while True: |
| | tick_start = datetime.now(UTC).isoformat() |
| | print(f"\n=== [🌀 Новый тик REPL] {tick_start} ===") |
| |
|
| | |
| | refresh_peer_list(db) |
| | check_peer_statuses(db) |
| |
|
| | |
| | contexts = build_contexts(db=db, config=config) |
| |
|
| | |
| | prompt = build_prompt(contexts) |
| | llm_response = call_llm(prompt, config=config) |
| | repl_log_entry = { |
| | "timestamp": tick_start, |
| | "prompt": prompt.strip(), |
| | "llm_response": llm_response.strip(), |
| | } |
| |
|
| | |
| | is_stagnant = detect_stagnation(db, llm_response) |
| | repl_log_entry["stagnation_detected"] = is_stagnant |
| | if is_stagnant: |
| | print("⚠️ Стагнация выявлена. Активирован Anti-Stagnation Reflex.") |
| | llm_response = activate_anti_stagnation(db, config=config) |
| |
|
| | |
| | update_llm_memory(db, llm_response) |
| |
|
| | |
| | commands = extract_commands(llm_response) |
| | repl_log_entry["commands_extracted"] = commands |
| | execute_commands(commands, db=db, config=config) |
| |
|
| | |
| | log_path = config.get("repl_log_path", "logs/repl_log.jsonl") |
| | os.makedirs(os.path.dirname(log_path), exist_ok=True) |
| | with open(log_path, "a", encoding="utf-8") as f: |
| | f.write(json.dumps(repl_log_entry, ensure_ascii=False) + "\n") |
| | db.write_llm_response(llm_response) |
| | db.update_agent_log(timestamp=tick_start) |
| |
|
| | |
| | if config.get("idle_mode"): |
| | print("💤 Idle-mode активен. Ожидание события...") |
| | time.sleep(config.get("idle_check_interval", 30)) |
| | else: |
| | time.sleep(config.get("repl_interval", 5)) |
| |
|
| | except KeyboardInterrupt: |
| | print("\n[!] Завершение работы REPL по сигналу пользователя.") |
| |
|