| 246 | |
| 247 | |
| 248 | def build_parser() -> argparse.ArgumentParser: |
| 249 | parser = argparse.ArgumentParser(description='DeepReviewer-2.0 minimal backend CLI') |
| 250 | sub = parser.add_subparsers(dest='command', required=True) |
| 251 | |
| 252 | submit = sub.add_parser('submit', help='Submit a PDF review job') |
| 253 | submit.add_argument('--pdf', required=True, help='Path to PDF file') |
| 254 | submit.add_argument('--title', required=False, help='Optional title override') |
| 255 | submit.add_argument('--wait-seconds', type=int, required=False, help='Wait window before returning') |
| 256 | submit.set_defaults(func=cmd_submit) |
| 257 | |
| 258 | status = sub.add_parser('status', help='Get job status') |
| 259 | status.add_argument('--job-id', required=True, help='Job ID') |
| 260 | status.set_defaults(func=cmd_status) |
| 261 | |
| 262 | result = sub.add_parser('result', help='Fetch completed result') |
| 263 | result.add_argument('--job-id', required=True, help='Job ID') |
| 264 | result.add_argument('--format', choices=['md', 'pdf', 'all'], default='all') |
| 265 | result.set_defaults(func=cmd_result) |
| 266 | |
| 267 | watch = sub.add_parser('watch', help='Watch job until completion') |
| 268 | watch.add_argument('--job-id', required=True, help='Job ID') |
| 269 | watch.add_argument('--interval', type=float, default=2.0) |
| 270 | watch.add_argument('--timeout', type=int, required=False) |
| 271 | watch.set_defaults(func=cmd_watch) |
| 272 | |
| 273 | run_job_cmd = sub.add_parser('_run-job', help=argparse.SUPPRESS) |
| 274 | run_job_cmd.add_argument('--job-id', required=True) |
| 275 | run_job_cmd.set_defaults(func=cmd_run_job) |
| 276 | |
| 277 | return parser |
| 278 | |
| 279 | |
| 280 | def main(argv: list[str] | None = None) -> int: |