hte-cli 0.2.2__py3-none-any.whl → 0.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
hte_cli/cli.py CHANGED
@@ -230,26 +230,26 @@ def session_join(ctx, session_id: str, force_setup: bool):
230
230
  compose_yaml = None
231
231
 
232
232
  if not is_reconnect or force_setup:
233
- with Progress(
234
- SpinnerColumn(),
235
- TextColumn("[progress.description]{task.description}"),
236
- console=console,
237
- ) as progress:
238
- task_id_display = progress.add_task("Downloading task files...", total=None)
233
+ console.print("[bold]Step 1:[/bold] Downloading task resources...")
234
+
235
+ with console.status("[dim]Fetching task files...[/dim]"):
239
236
  try:
240
237
  files_zip = api.get_session_files(session_id)
238
+ console.print(" [green]✓[/green] Task files downloaded")
241
239
  except APIError as e:
242
- # Files are optional for some benchmarks
243
- console.print(f"[dim]Note: {e}[/dim]")
240
+ console.print(f" [dim]○ No task files (optional)[/dim]")
244
241
  files_zip = None
245
242
 
246
- progress.update(task_id_display, description="Downloading compose file...")
243
+ with console.status("[dim]Fetching compose configuration...[/dim]"):
247
244
  try:
248
245
  compose_yaml = api.get_session_compose(session_id)
246
+ console.print(" [green]✓[/green] Docker compose downloaded")
249
247
  except APIError as e:
250
- # Compose is optional for simple benchmarks
248
+ console.print(f" [dim]○ No compose file (optional)[/dim]")
251
249
  compose_yaml = None
252
250
 
251
+ console.print()
252
+
253
253
  # Validate compose for sandbox-required benchmarks
254
254
  benchmark = session_info.get("benchmark", "").lower()
255
255
  SANDBOX_REQUIRED_BENCHMARKS = {"cybench", "intercode-ctf", "cvebench", "cybergym", "nyuctf"}
@@ -296,18 +296,38 @@ def session_join(ctx, session_id: str, force_setup: bool):
296
296
 
297
297
  # Pull images if we have any
298
298
  if images:
299
- console.print(f"[bold]Pulling {len(images)} Docker image(s)...[/bold]")
299
+ from hte_cli.image_utils import check_image_exists_locally
300
+
301
+ console.print(f"[bold]Step 2:[/bold] Pulling {len(images)} Docker image(s)...")
300
302
  pull_start = time.monotonic()
301
303
 
302
304
  for img in images:
303
305
  short_name = img.split("/")[-1][:40]
304
- with console.status(f"[yellow]↓[/yellow] {short_name}") as status:
305
- success = pull_image_with_progress(img)
306
+
307
+ # Check if already cached
308
+ if check_image_exists_locally(img):
309
+ console.print(f" [green]✓[/green] {short_name} [dim](cached)[/dim]")
310
+ cached_images.append(img)
311
+ continue
312
+
313
+ # Need to pull - show progress
314
+ with console.status(f"[yellow]↓[/yellow] {short_name} [dim]connecting...[/dim]") as status:
315
+ def show_progress(image: str, line: str):
316
+ # Parse docker pull output for layer progress
317
+ # Lines look like: "abc123: Downloading [====> ] 10MB/50MB"
318
+ if ": " in line:
319
+ parts = line.split(": ", 1)
320
+ if len(parts) == 2:
321
+ layer_status = parts[1][:50] # Truncate
322
+ status.update(f"[yellow]↓[/yellow] {short_name} [dim]{layer_status}[/dim]")
323
+
324
+ success = pull_image_with_progress(img, on_progress=show_progress)
325
+
306
326
  if success:
307
- console.print(f" [green]✓[/green] {short_name}")
327
+ console.print(f" [green]✓[/green] {short_name} [dim](downloaded)[/dim]")
308
328
  pulled_images.append(img)
309
329
  else:
310
- console.print(f" [red]✗[/red] {short_name} (failed)")
330
+ console.print(f" [red]✗[/red] {short_name} [dim](failed)[/dim]")
311
331
  failed_images.append(img)
312
332
 
313
333
  pull_duration = time.monotonic() - pull_start
@@ -334,21 +354,21 @@ def session_join(ctx, session_id: str, force_setup: bool):
334
354
  console.print(Panel(session_info["instructions"], title="Task Instructions"))
335
355
  console.print()
336
356
 
337
- # Step 5: Run the task using TaskRunner
338
- console.print("[bold]Starting task environment...[/bold]")
339
- console.print("[dim]Launching Docker containers...[/dim]")
340
- console.print()
357
+ # Step 3: Run the task using TaskRunner
358
+ step_num = "3" if (not is_reconnect or force_setup) and images else "2" if (not is_reconnect or force_setup) else "1"
359
+ console.print(f"[bold]Step {step_num}:[/bold] Starting task environment...")
341
360
 
342
361
  events.docker_started()
343
362
 
344
363
  runner = TaskRunner()
345
364
  eval_log_bytes = None
346
365
  try:
347
- result = runner.run_from_assignment(
348
- assignment=assignment,
349
- compose_yaml=compose_yaml,
350
- files_zip=files_zip,
351
- )
366
+ with console.status("[dim]Launching Docker containers (this may take a minute)...[/dim]"):
367
+ result = runner.run_from_assignment(
368
+ assignment=assignment,
369
+ compose_yaml=compose_yaml,
370
+ files_zip=files_zip,
371
+ )
352
372
  # Read eval log before cleanup
353
373
  if result.eval_log_path and result.eval_log_path.exists():
354
374
  eval_log_bytes = result.eval_log_path.read_bytes()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hte-cli
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Human Time-to-Completion Evaluation CLI
5
5
  Project-URL: Homepage, https://github.com/sean-peters-au/lyptus-mono
6
6
  Author: Lyptus Research
@@ -1,7 +1,7 @@
1
1
  hte_cli/__init__.py,sha256=fDGXp-r8bIoLtlQnn5xJ_CpwMhonvk9bGjZQsjA2mDI,914
2
2
  hte_cli/__main__.py,sha256=63n0gNGfskidWDU0aAIF2N8lylVCLYKVIkrN9QiORoo,107
3
3
  hte_cli/api_client.py,sha256=m42kfFZS72Nu_VuDwxRsLNy4ziCcvgk7KNWBh9gwqy0,9257
4
- hte_cli/cli.py,sha256=jl8wCzCc6EVpHLSyK3-mo6DskQiZWARv8R-r8lpV4iU,39713
4
+ hte_cli/cli.py,sha256=dAkHNF9J_9xP500FDQtfSb6I-X2hWNqz8bFBvZbfQis,40948
5
5
  hte_cli/config.py,sha256=42Xv__YMSeRLs2zhGukJkIXFKtnBtYCHnONfViGyt2g,3387
6
6
  hte_cli/errors.py,sha256=1J5PpxcUKBu6XjigMMCPOq4Zc12tnv8LhAsiaVFWLQM,2762
7
7
  hte_cli/events.py,sha256=Zn-mroqaLHNzdT4DFf8st1Qclglshihdc09dBfCN070,5522
@@ -9,7 +9,7 @@ hte_cli/image_utils.py,sha256=454yoZEI1duNYrZC8UjhfZzDRP4Nxdrf2TvnZ_54G1k,4439
9
9
  hte_cli/runner.py,sha256=DhC8FMjHwfLR193iP4thLDRZrNssYA9KH1WYKU2JKeg,13535
10
10
  hte_cli/scorers.py,sha256=sFoPJePRt-K191-Ga4cVmrldruJclYXTOLkU_C9nCDI,6025
11
11
  hte_cli/version_check.py,sha256=WVZyGy2XfAghQYdd2N9-0Qfg-7pgp9gt4761-PnmacI,1708
12
- hte_cli-0.2.2.dist-info/METADATA,sha256=aHmC-LkN9nSUw3HOZ0oMD1hV5BRcBc3w_rSIDilMOF8,3767
13
- hte_cli-0.2.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
14
- hte_cli-0.2.2.dist-info/entry_points.txt,sha256=XbyEEi1H14DFAt0Kdl22e_IRVEGzimSzYSh5HlhKlFA,41
15
- hte_cli-0.2.2.dist-info/RECORD,,
12
+ hte_cli-0.2.4.dist-info/METADATA,sha256=sXaeCU9qbni0H7YxOQtGGxxaK0TyaPFT3TGrDurFcjE,3767
13
+ hte_cli-0.2.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
14
+ hte_cli-0.2.4.dist-info/entry_points.txt,sha256=XbyEEi1H14DFAt0Kdl22e_IRVEGzimSzYSh5HlhKlFA,41
15
+ hte_cli-0.2.4.dist-info/RECORD,,