diff --git a/hud/eval/runtime.py b/hud/eval/runtime.py index a05e16ab..b40d40a1 100644 --- a/hud/eval/runtime.py +++ b/hud/eval/runtime.py @@ -664,7 +664,9 @@ def __init__( self.snapshot_name = snapshot_name # Default command serves on *port*, so the SSH forward target always # matches what's listening; override only for a non-default layout. - self.command = command or f"hud serve env.py --host 0.0.0.0 --port {port}" + self.command = ( + command or f'PATH="$PWD/.venv/bin:$PATH" hud serve env.py --host 0.0.0.0 --port {port}' + ) self.workdir = workdir self.port = port self.ssh_host = ssh_host @@ -720,6 +722,7 @@ async def __call__(self, task: Task) -> AsyncIterator[Runtime]: kwargs: dict[str, Any] = { "image": Image.base(config.image), "ephemeral": True, + "auto_stop_interval": 0, } if daytona_resources is not None: kwargs["resources"] = daytona_resources @@ -751,6 +754,7 @@ async def __call__(self, task: Task) -> AsyncIterator[Runtime]: sandbox_params = CreateSandboxFromSnapshotParams( snapshot=self.snapshot_name, ephemeral=True, + auto_stop_interval=0, ) create_timeout = 120 diff --git a/hud/eval/tests/test_docker_provider.py b/hud/eval/tests/test_docker_provider.py index 1f757f7c..d2458baa 100644 --- a/hud/eval/tests/test_docker_provider.py +++ b/hud/eval/tests/test_docker_provider.py @@ -195,6 +195,7 @@ async def create(*args: str, **kwargs: object) -> _FakeModalSandbox: class _CreateSandboxFromSnapshotParams: snapshot: str ephemeral: bool + auto_stop_interval: int @dataclass(frozen=True) @@ -207,6 +208,7 @@ class _CreateSnapshotParams: class _CreateSandboxFromImageParams: image: object ephemeral: bool + auto_stop_interval: int resources: object | None = None @@ -641,6 +643,7 @@ async def test_daytona_runtime_config_flows_into_daytona_sdk( assert create_params == _CreateSandboxFromImageParams( image=_DaytonaImage("img:tag"), ephemeral=True, + auto_stop_interval=0, resources=_DaytonaResources( cpu=2, memory=4, @@ -653,7 +656,9 @@ async def test_daytona_runtime_config_flows_into_daytona_sdk( assert calls["execute"] == ( "hud-serve", _SessionExecuteRequest( - command="cd /app && hud serve env.py --host 0.0.0.0 --port 8765", + command=( + 'cd /app && PATH="$PWD/.venv/bin:$PATH" hud serve env.py --host 0.0.0.0 --port 8765' + ), run_async=True, ), ) @@ -692,11 +697,31 @@ async def test_daytona_task_runtime_config_overlays_provider_defaults( assert create_params == _CreateSandboxFromImageParams( image=_DaytonaImage("img:task"), ephemeral=True, + auto_stop_interval=0, resources=_DaytonaResources(cpu=2, memory=4), ) assert create_timeout == 45 +async def test_daytona_snapshot_sandboxes_disable_auto_stop( + monkeypatch: pytest.MonkeyPatch, +) -> None: + calls = _install_fake_daytona(monkeypatch) + + async with DaytonaRuntime("snapshot")(_row()): + pass + + create_call = calls["create"] + assert isinstance(create_call, tuple) + create_params, create_timeout = create_call + assert create_params == _CreateSandboxFromSnapshotParams( + snapshot="snapshot", + ephemeral=True, + auto_stop_interval=0, + ) + assert create_timeout == 120 + + async def test_daytona_runtime_config_rejects_unsupported_fields( monkeypatch: pytest.MonkeyPatch, ) -> None: