"""meshnet-tracker CLI entry point.""" import argparse import sys import time from .server import TrackerServer def main() -> None: parser = argparse.ArgumentParser( prog="meshnet-tracker", description="Distributed Inference Network node registry and route selection", ) subparsers = parser.add_subparsers(dest="command") start_cmd = subparsers.add_parser("start", help="Start the tracker server") start_cmd.add_argument("--host", default="127.0.0.1", help="Host interface to listen on") start_cmd.add_argument("--port", type=int, default=8080, help="Port to listen on") start_cmd.add_argument( "--heartbeat-timeout", type=float, default=30.0, help="Seconds before a node is removed from the registry after missed heartbeat", ) start_cmd.add_argument( "--cluster-peers", default="", help="Comma-separated URLs of peer tracker nodes (enables Raft cluster mode)", ) start_cmd.add_argument( "--self-url", default=None, help="This tracker's own URL as seen by peers (auto-derived from --host/--port if omitted)", ) start_cmd.add_argument( "--stats-db", default=None, metavar="PATH", help="SQLite database path for persistent model usage statistics", ) args = parser.parse_args() if args.command == "start": cluster_peers = [u.strip() for u in args.cluster_peers.split(",") if u.strip()] server = TrackerServer( host=args.host, port=args.port, heartbeat_timeout=args.heartbeat_timeout, cluster_peers=cluster_peers or None, cluster_self_url=args.self_url, stats_db=getattr(args, "stats_db", None), ) port = server.start() print(f"meshnet-tracker listening on http://{args.host}:{port}", flush=True) try: while True: time.sleep(1) except KeyboardInterrupt: server.stop() sys.exit(0) else: parser.print_help() if __name__ == "__main__": main()