()
| 268 | |
| 269 | |
| 270 | def main(): |
| 271 | args = parse_args() |
| 272 | |
| 273 | # Register signal handlers so Ctrl+C exits immediately |
| 274 | # instead of blocking on ThreadPoolExecutor.shutdown(wait=True) |
| 275 | signal.signal(signal.SIGINT, _signal_handler) |
| 276 | signal.signal(signal.SIGTERM, _signal_handler) |
| 277 | |
| 278 | # Step 1: Ensure data is available |
| 279 | _ensure_data() |
| 280 | |
| 281 | # Step 2: Load queries |
| 282 | queries = _load_queries(query_indices=args.query_indices, limit=args.limit) |
| 283 | print(f"\n{len(queries)} queries to process") |
| 284 | |
| 285 | # Step 3: Run agent on each query |
| 286 | runs_dir = Path(args.output_dir) / "runs" |
| 287 | runs_dir.mkdir(parents=True, exist_ok=True) |
| 288 | |
| 289 | # Derive experiment name from --output-dir for cohesive sandbox naming. |
| 290 | # e.g. "outputs/my_experiment" -> "my_experiment" |
| 291 | experiment_name = Path(args.output_dir).name |
| 292 | |
| 293 | results: List[WritingResult] = [] |
| 294 | |
| 295 | if args.max_parallel > 1: |
| 296 | print(f"Running with max {args.max_parallel} parallel instances") |
| 297 | print(f"Sandbox output: outputs/{experiment_name}/query_*/") |
| 298 | if args.save_logs: |
| 299 | print(f"Logs: {runs_dir}/<index>/<index>_full.log") |
| 300 | if args.quiet: |
| 301 | print( |
| 302 | "Terminal output suppressed (--quiet). Use dashboard to view logs." |
| 303 | ) |
| 304 | with ThreadPoolExecutor(max_workers=args.max_parallel) as executor: |
| 305 | futures = { |
| 306 | executor.submit( |
| 307 | _run_single_query, |
| 308 | i + 1, |
| 309 | len(queries), |
| 310 | q, |
| 311 | args, |
| 312 | runs_dir, |
| 313 | experiment_name, |
| 314 | ): q |
| 315 | for i, q in enumerate(queries) |
| 316 | } |
| 317 | for future in as_completed(futures): |
| 318 | try: |
| 319 | results.append(future.result()) |
| 320 | except Exception as e: |
| 321 | q = futures[future] |
| 322 | results.append( |
| 323 | WritingResult( |
| 324 | index=q["index"], |
| 325 | query=q["query"], |
| 326 | status="failed", |
| 327 | error=str(e), |
no test coverage detected