mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-09 08:21:50 +00:00
fix(terminal): collapse CWD-only overrides to shared container
When register_task_env_overrides is called with only a 'cwd' key (ACP adapter workspace tracking), the task_id should collapse to 'default' so all interactive surfaces (TUI, gateway, dashboard) share one long-lived container. Previously, any override registration — even CWD-only — caused _resolve_container_task_id to return the session key unchanged, spinning up a separate container per session. This made it impossible to authenticate into external services once and have that auth available across all surfaces. Now only overrides containing isolation keys (docker_image, modal_image, singularity_image, daytona_image, env_type) trigger per-task container isolation. Fixes #37361
This commit is contained in:
parent
1a626470ca
commit
6459b3d991
2 changed files with 58 additions and 1 deletions
|
|
@ -105,3 +105,49 @@ def test_get_active_env_honours_rl_override():
|
|||
terminal_tool.clear_task_env_overrides("rl-42")
|
||||
terminal_tool._active_environments.pop("default", None)
|
||||
terminal_tool._active_environments.pop("rl-42", None)
|
||||
|
||||
|
||||
def test_cwd_only_override_collapses_to_default():
|
||||
"""CWD-only overrides (ACP adapter workspace tracking) must NOT trigger
|
||||
container isolation — they should collapse to the shared 'default'
|
||||
container so all surfaces (TUI, gateway, dashboard) share one sandbox.
|
||||
Regression for #37361."""
|
||||
terminal_tool.register_task_env_overrides(
|
||||
"acp-session-abc", {"cwd": "/home/user/project"}
|
||||
)
|
||||
try:
|
||||
assert (
|
||||
terminal_tool._resolve_container_task_id("acp-session-abc")
|
||||
== "default"
|
||||
)
|
||||
finally:
|
||||
terminal_tool.clear_task_env_overrides("acp-session-abc")
|
||||
|
||||
|
||||
def test_cwd_plus_docker_image_keeps_own_id():
|
||||
"""When overrides include both cwd AND docker_image, isolation must
|
||||
still be honoured (RL/benchmark pattern with explicit cwd)."""
|
||||
terminal_tool.register_task_env_overrides(
|
||||
"rl-with-cwd", {"docker_image": "myimg:latest", "cwd": "/workspace"}
|
||||
)
|
||||
try:
|
||||
assert (
|
||||
terminal_tool._resolve_container_task_id("rl-with-cwd")
|
||||
== "rl-with-cwd"
|
||||
)
|
||||
finally:
|
||||
terminal_tool.clear_task_env_overrides("rl-with-cwd")
|
||||
|
||||
|
||||
def test_env_type_override_keeps_own_id():
|
||||
"""env_type is an isolation key — must trigger per-task container."""
|
||||
terminal_tool.register_task_env_overrides(
|
||||
"bench-env", {"env_type": "sandbox", "cwd": "/work"}
|
||||
)
|
||||
try:
|
||||
assert (
|
||||
terminal_tool._resolve_container_task_id("bench-env")
|
||||
== "bench-env"
|
||||
)
|
||||
finally:
|
||||
terminal_tool.clear_task_env_overrides("bench-env")
|
||||
|
|
|
|||
|
|
@ -1006,9 +1006,20 @@ def _resolve_container_task_id(task_id: Optional[str]) -> str:
|
|||
task_id, we honour it by returning the task_id unchanged -- those
|
||||
rollouts need their own isolated sandbox, which is the whole point of
|
||||
the override.
|
||||
|
||||
CWD-only overrides (registered by the ACP adapter for workspace
|
||||
tracking) are *not* isolation signals — they should not cause each
|
||||
session to spin up its own container. Only overrides containing
|
||||
backend-specific image keys or ``env_type`` trigger isolation.
|
||||
"""
|
||||
_ISOLATION_KEYS = frozenset({
|
||||
"docker_image", "modal_image", "singularity_image",
|
||||
"daytona_image", "env_type",
|
||||
})
|
||||
if task_id and task_id in _task_env_overrides:
|
||||
return task_id
|
||||
overrides = _task_env_overrides[task_id]
|
||||
if set(overrides.keys()) & _ISOLATION_KEYS:
|
||||
return task_id
|
||||
return "default"
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue