Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions gateway/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -25644,6 +25644,15 @@ def _set_session_env(self, context: SessionContext) -> list:
_adapters = getattr(self, "adapters", None) or {}
_adapter = _adapters.get(context.source.platform)
_async_delivery = getattr(_adapter, "supports_async_delivery", True)
# Multiplex remaps get_hermes_home() per turn. TERMINAL_CWD is bridged
# once from the default profile at process start, so secondary-profile
# turns would otherwise inject that profile's AGENTS.md.
cwd = ""
if getattr(getattr(self, "config", None), "multiplex_profiles", False):
try:
cwd = str(get_hermes_home())
except Exception:
cwd = ""
return set_session_vars(
platform=context.source.platform.value,
chat_id=context.source.chat_id,
Expand All @@ -25659,6 +25668,7 @@ def _set_session_env(self, context: SessionContext) -> list:
session_key=context.session_key,
message_id=str(context.source.message_id) if context.source.message_id else "",
profile=getattr(context.source, "profile", "") or "",
cwd=cwd,
async_delivery=_async_delivery,
cron_session="",
)
Expand Down
65 changes: 65 additions & 0 deletions tests/gateway/test_session_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,71 @@ async def test_run_in_executor_with_context_preserves_session_env(monkeypatch):
}


def test_set_session_env_pins_cwd_to_profile_home_when_multiplexed(tmp_path, monkeypatch):
"""Multiplex turns must use the serving profile home, not process TERMINAL_CWD."""
from types import SimpleNamespace

from agent.runtime_cwd import resolve_context_cwd
from hermes_constants import reset_hermes_home_override, set_hermes_home_override

runner = object.__new__(GatewayRunner)
runner.config = SimpleNamespace(multiplex_profiles=True)
runner.adapters = {}

monkeypatch.delenv("TERMINAL_CWD", raising=False)
source = SessionSource(
platform=Platform.TELEGRAM,
chat_id="2144471399",
chat_type="dm",
user_id="123456",
user_name="alice",
thread_id=None,
)
context = SessionContext(source=source, connected_platforms=[], home_channels={})

token = set_hermes_home_override(str(tmp_path))
try:
tokens = runner._set_session_env(context)
try:
assert resolve_context_cwd() == tmp_path
finally:
runner._clear_session_env(tokens)
assert resolve_context_cwd() is None
finally:
reset_hermes_home_override(token)


def test_set_session_env_leaves_cwd_unset_without_multiplex(tmp_path, monkeypatch):
"""Single-profile gateways keep falling through to TERMINAL_CWD / launch cwd."""
from types import SimpleNamespace

from agent.runtime_cwd import resolve_context_cwd
from hermes_constants import reset_hermes_home_override, set_hermes_home_override

runner = object.__new__(GatewayRunner)
runner.config = SimpleNamespace(multiplex_profiles=False)
runner.adapters = {}

monkeypatch.delenv("TERMINAL_CWD", raising=False)
source = SessionSource(
platform=Platform.TELEGRAM,
chat_id="2144471399",
chat_type="dm",
user_id="123456",
user_name="alice",
thread_id=None,
)
context = SessionContext(source=source, connected_platforms=[], home_channels={})

token = set_hermes_home_override(str(tmp_path))
try:
tokens = runner._set_session_env(context)
try:
assert resolve_context_cwd() is None
finally:
runner._clear_session_env(tokens)
finally:
reset_hermes_home_override(token)


def test_cron_session_contextvar_preserves_legacy_env_fallback(monkeypatch):
Expand Down
Loading