"""trex-core CLI entrypoints (REQ-032). Subcommands: pause — durably pause a portfolio (Postgres) resume — clear the pause paused — list paused portfolio_ids """ from __future__ import annotations import argparse import sys from trex_core.adapters.portfolio.pause_store import PostgreSQLPauseStore from trex_core.runtime.config import DaemonConfig def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser(prog="trex-core", description="trex-core admin CLI") sub = parser.add_subparsers(dest="cmd", required=True) p_pause = sub.add_parser("pause", help="Pause a portfolio_id") p_pause.add_argument("portfolio_id") p_pause.add_argument("--actor", default="cli") p_resume = sub.add_parser("resume", help="Resume a portfolio_id") p_resume.add_argument("portfolio_id") sub.add_parser("paused", help="List paused portfolio_ids") args = parser.parse_args(argv) cfg = DaemonConfig.from_env() store = PostgreSQLPauseStore(cfg.dsn) if args.cmd == "pause": store.pause(args.portfolio_id, actor=args.actor) print(f"paused {args.portfolio_id}") elif args.cmd == "resume": store.resume(args.portfolio_id) print(f"resumed {args.portfolio_id}") elif args.cmd == "paused": for pid in sorted(store.list_paused()): print(pid) return 0 if __name__ == "__main__": # pragma: no cover sys.exit(main())