diff --git a/trulymem_entry.py b/trulymem_entry.py index d856a07..3eb977d 100644 --- a/trulymem_entry.py +++ b/trulymem_entry.py @@ -1,6 +1,9 @@ #!/usr/bin/env python3 +import argparse import sys import os +import signal +import threading from pathlib import Path # 用户配置文件始终放在用户目录 @@ -30,21 +33,54 @@ from ui import GraphMemoryApp def main(): - backend_server = BackendServer( - db_path=str(DB_PATH), - use_embedded_db=True, - config_file=str(CONFIG_PATH) - ) - backend_server.start() - - app = GraphMemoryApp(backend_server=backend_server, config_file=str(CONFIG_PATH)) - - try: - app.run() - except KeyboardInterrupt: - print("\n退出") - finally: + parser = argparse.ArgumentParser(description='TrulyMEM - True Human Memory') + parser.add_argument('--web', action='store_true', help='以 Web 服务模式启动(headless,不启动 TUI)') + parser.add_argument('--port', type=int, default=4096, help='Web 服务端口(默认 4096)') + args = parser.parse_args() + + if args.web: + # Web headless 模式 + from web_api import run_web_server, stop_web_server + + backend_server = BackendServer( + db_path=str(DB_PATH), + use_embedded_db=True, + config_file=str(CONFIG_PATH) + ) + backend_server.start() + + print(f"TrulyMEM Web 服务启动在 http://0.0.0.0:{args.port}") + run_web_server(port=args.port, host='0.0.0.0') + + # 阻塞主线程直到收到信号 + shutdown_event = threading.Event() + def _handle_signal(signum, frame): + print("\n收到停止信号,正在关闭...") + shutdown_event.set() + signal.signal(signal.SIGINT, _handle_signal) + signal.signal(signal.SIGTERM, _handle_signal) + + shutdown_event.wait() + stop_web_server() backend_server.shutdown() + print("TrulyMEM Web 服务已停止") + else: + # TUI 模式(默认) + backend_server = BackendServer( + db_path=str(DB_PATH), + use_embedded_db=True, + config_file=str(CONFIG_PATH) + ) + backend_server.start() + + app = GraphMemoryApp(backend_server=backend_server, config_file=str(CONFIG_PATH)) + + try: + app.run() + except KeyboardInterrupt: + print("\n退出") + finally: + backend_server.shutdown() if __name__ == "__main__":