"""Unified CLI for oG-Memory — main entry point."""
from __future__ import annotations
import argparse
import logging
import sys
from cli import __version__
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
prog="ogmem",
description="oG-Memory — unified management CLI",
)
parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}")
parser.add_argument(
"-v", "--verbose",
action="store_true",
help="Enable debug logging",
)
sub = parser.add_subparsers(dest="command", help="Available commands")
p_onboard = sub.add_parser("onboard", help="Interactive setup wizard")
p_onboard.add_argument("--non-interactive", action="store_true", help="Run without prompts")
p_onboard.add_argument("--mode", choices=["docker", "plugin", "headless"], help="Deployment mode")
p_onboard.add_argument("--provider", help="LLM provider (openai/volcengine/dashscope/zhipu/mock)")
p_onboard.add_argument("--api-key", help="LLM API key")
p_onboard.add_argument("--base-url", help="LLM API base URL")
p_onboard.add_argument("--model", help="LLM model name")
p_onboard.add_argument("--embedding-model", help="Embedding model name")
p_onboard.add_argument("--embedding-provider", help="Embedding provider")
p_onboard.add_argument("--vector-db", choices=["chroma", "opengauss"], help="Vector DB type")
p_onboard.add_argument("--port", type=int, default=8090, help="HTTP port")
p_onboard.add_argument("--storage-backend", choices=["agfs", "sql"], default="sql", help="Storage backend (default: sql)")
p_onboard.add_argument("--db-connection", help="PostgreSQL connection string (SQL backend)")
p_start = sub.add_parser("start", help="Start services")
p_start.add_argument(
"mode",
nargs="?",
default=None,
choices=["headless", "local", "docker", "plugin", "index"],
help="What to start",
)
p_start.add_argument("-d", "--daemon", action="store_true", help="Run in background")
p_start.add_argument("--dry-run", action="store_true", help="Print commands without executing")
p_start.add_argument("-c", "--config", help="Path to ogmem.yaml")
p_start.add_argument("--agfs-bin", help="Override AGFS binary path")
p_start.add_argument("--health-timeout", type=int, default=30, help="Health check timeout (seconds)")
p_start.add_argument("--env-file", help="Path to deploy.env (docker mode)")
p_start.add_argument("--skip-pull", action="store_true", help="Skip image pull (docker mode)")
p_start.add_argument("--password", "-p", help="openGauss password (docker mode)")
p_stop = sub.add_parser("stop", help="Stop services")
p_stop.add_argument(
"mode",
nargs="?",
default=None,
choices=["headless", "local", "docker", "plugin"],
help="What to stop",
)
sub.add_parser("status", help="Show service status")
sub.add_parser("check", help="Environment diagnostics")
p_logs = sub.add_parser("logs", help="Tail service logs")
p_logs.add_argument("--service", choices=["agfs", "ogmem", "openclaw"], help="Which service logs")
p_logs.add_argument("-f", "--follow", action="store_true", help="Follow log output")
p_eval = sub.add_parser("eval", help="Run LoCoMo eval pipeline")
p_eval.add_argument("eval_mode", choices=["ingest", "qa", "judge", "stat"], help="Eval step")
p_eval.add_argument("input", help="Input file (JSON or CSV)")
p_eval.add_argument("--output", "-o", help="Output path")
p_eval.add_argument("--base-url", default="http://127.0.0.1:18789")
p_eval.add_argument("--token", help="Auth token")
p_eval.add_argument("--sample", type=int, help="Sample index")
p_eval.add_argument("--count", type=int, help="Number of questions")
p_eval.add_argument("-p", "--parallel", type=int, help="Parallel workers")
p_config = sub.add_parser("config", help="Configuration management")
config_sub = p_config.add_subparsers(dest="config_action")
config_sub.add_parser("show", help="Show resolved config (masked)")
config_sub.add_parser("init", help="Generate starter ogmem.yaml")
return parser
def main(argv: list[str] | None = None) -> int:
parser = build_parser()
args = parser.parse_args(argv)
logging.basicConfig(
level=logging.DEBUG if args.verbose else logging.INFO,
format="%(message)s",
)
if not args.command:
parser.print_help()
return 0
cmd = args.command
if cmd == "check":
from cli.commands.check import run
return run(args)
elif cmd == "status":
from cli.commands.status import run
return run(args)
elif cmd == "start":
from cli.commands.start import run
return run(args)
elif cmd == "stop":
from cli.commands.stop import run
return run(args)
elif cmd == "onboard":
from cli.commands.onboard import run
return run(args)
elif cmd == "logs":
from cli.commands.logs import run
return run(args)
elif cmd == "eval":
from cli.commands.eval_cmd import run
return run(args)
elif cmd == "config":
from cli.commands.config import run
return run(args)
else:
parser.print_help()
return 1
if __name__ == "__main__":
sys.exit(main())