Merge commit '6110aed9b' into feat/whatsapp-cloud-api
This commit is contained in:
@@ -18,7 +18,6 @@ from agent.prompt_builder import (
|
||||
build_skills_system_prompt,
|
||||
build_nous_subscription_prompt,
|
||||
build_context_files_prompt,
|
||||
build_environment_hints,
|
||||
CONTEXT_FILE_MAX_CHARS,
|
||||
DEFAULT_AGENT_IDENTITY,
|
||||
TOOL_USE_ENFORCEMENT_GUIDANCE,
|
||||
@@ -441,6 +440,7 @@ class TestBuildNousSubscriptionPrompt:
|
||||
features={
|
||||
"web": NousFeatureState("web", "Web tools", True, True, True, True, False, True, "firecrawl"),
|
||||
"image_gen": NousFeatureState("image_gen", "Image generation", True, True, True, True, False, True, "Nous Subscription"),
|
||||
"video_gen": NousFeatureState("video_gen", "Video generation", False, False, False, False, False, False, ""),
|
||||
"tts": NousFeatureState("tts", "OpenAI TTS", True, True, True, True, False, True, "OpenAI TTS"),
|
||||
"stt": NousFeatureState("stt", "Speech-to-text", True, True, True, True, False, True, "OpenAI Whisper"),
|
||||
"browser": NousFeatureState("browser", "Browser automation", True, True, True, True, False, True, "Browser Use"),
|
||||
@@ -466,6 +466,7 @@ class TestBuildNousSubscriptionPrompt:
|
||||
features={
|
||||
"web": NousFeatureState("web", "Web tools", True, False, False, False, False, True, ""),
|
||||
"image_gen": NousFeatureState("image_gen", "Image generation", True, False, False, False, False, True, ""),
|
||||
"video_gen": NousFeatureState("video_gen", "Video generation", False, False, False, False, False, False, ""),
|
||||
"tts": NousFeatureState("tts", "OpenAI TTS", True, False, False, False, False, True, ""),
|
||||
"stt": NousFeatureState("stt", "Speech-to-text", True, False, False, False, False, True, ""),
|
||||
"browser": NousFeatureState("browser", "Browser automation", True, False, False, False, False, True, ""),
|
||||
@@ -945,6 +946,29 @@ class TestEnvironmentHints:
|
||||
assert "Terminal backend: docker" in result
|
||||
assert "inside" in result.lower()
|
||||
|
||||
def test_build_environment_hints_uses_terminal_cwd_over_launch_dir(self, monkeypatch, tmp_path):
|
||||
"""THE BUG: gateway/cron set TERMINAL_CWD but the prompt emitted os.getcwd()
|
||||
(the daemon launch dir). Regression for #24882/#24969/#27383/#29265."""
|
||||
import agent.prompt_builder as _pb
|
||||
monkeypatch.setattr(_pb, "is_wsl", lambda: False)
|
||||
monkeypatch.delenv("TERMINAL_ENV", raising=False)
|
||||
configured = tmp_path / "workspace"
|
||||
configured.mkdir()
|
||||
monkeypatch.setenv("TERMINAL_CWD", str(configured))
|
||||
monkeypatch.chdir(tmp_path)
|
||||
_pb._clear_backend_probe_cache()
|
||||
assert f"Current working directory: {configured}" in _pb.build_environment_hints()
|
||||
|
||||
def test_build_environment_hints_falls_back_to_launch_dir(self, monkeypatch, tmp_path):
|
||||
"""The #19242 local-CLI contract: no TERMINAL_CWD → the launch dir."""
|
||||
import agent.prompt_builder as _pb
|
||||
monkeypatch.setattr(_pb, "is_wsl", lambda: False)
|
||||
monkeypatch.delenv("TERMINAL_ENV", raising=False)
|
||||
monkeypatch.delenv("TERMINAL_CWD", raising=False)
|
||||
monkeypatch.chdir(tmp_path)
|
||||
_pb._clear_backend_probe_cache()
|
||||
assert f"Current working directory: {tmp_path}" in _pb.build_environment_hints()
|
||||
|
||||
def test_build_environment_hints_uses_live_probe_when_available(self, monkeypatch):
|
||||
"""When the probe succeeds, its output must appear in the hint block."""
|
||||
import agent.prompt_builder as _pb
|
||||
@@ -961,12 +985,64 @@ class TestEnvironmentHints:
|
||||
def test_remote_backend_list_covers_known_sandboxes(self):
|
||||
"""Regression guard: if someone adds a remote backend, they must list it here."""
|
||||
import agent.prompt_builder as _pb
|
||||
for backend in ("docker", "singularity", "modal", "daytona", "ssh", "vercel_sandbox"):
|
||||
for backend in ("docker", "singularity", "modal", "daytona", "ssh"):
|
||||
assert backend in _pb._REMOTE_TERMINAL_BACKENDS, (
|
||||
f"{backend!r} must be in _REMOTE_TERMINAL_BACKENDS so its host "
|
||||
f"info is suppressed in the system prompt"
|
||||
)
|
||||
|
||||
def test_environment_hint_from_env_var_is_appended(self, monkeypatch):
|
||||
"""HERMES_ENVIRONMENT_HINT lets an embedder describe the runtime env."""
|
||||
import agent.prompt_builder as _pb
|
||||
monkeypatch.setattr(_pb, "is_wsl", lambda: False)
|
||||
monkeypatch.delenv("TERMINAL_ENV", raising=False)
|
||||
monkeypatch.setenv("HERMES_ENVIRONMENT_HINT", "Running inside an OpenShell sandbox.")
|
||||
_pb._clear_backend_probe_cache()
|
||||
result = _pb.build_environment_hints()
|
||||
assert "Running inside an OpenShell sandbox." in result
|
||||
# The factual host block must still come first.
|
||||
assert result.index("Host:") < result.index("OpenShell")
|
||||
|
||||
def test_environment_hint_env_var_overrides_config(self, monkeypatch):
|
||||
"""Env var wins over config.yaml agent.environment_hint."""
|
||||
import agent.prompt_builder as _pb
|
||||
monkeypatch.setattr(_pb, "is_wsl", lambda: False)
|
||||
monkeypatch.delenv("TERMINAL_ENV", raising=False)
|
||||
monkeypatch.setenv("HERMES_ENVIRONMENT_HINT", "ENV-WINS")
|
||||
monkeypatch.setattr(
|
||||
"hermes_cli.config.load_config",
|
||||
lambda: {"agent": {"environment_hint": "CONFIG-VALUE"}},
|
||||
)
|
||||
_pb._clear_backend_probe_cache()
|
||||
result = _pb.build_environment_hints()
|
||||
assert "ENV-WINS" in result
|
||||
assert "CONFIG-VALUE" not in result
|
||||
|
||||
def test_environment_hint_falls_back_to_config(self, monkeypatch):
|
||||
"""With no env var, the config.yaml value is used."""
|
||||
import agent.prompt_builder as _pb
|
||||
monkeypatch.setattr(_pb, "is_wsl", lambda: False)
|
||||
monkeypatch.delenv("TERMINAL_ENV", raising=False)
|
||||
monkeypatch.delenv("HERMES_ENVIRONMENT_HINT", raising=False)
|
||||
monkeypatch.setattr(
|
||||
"hermes_cli.config.load_config",
|
||||
lambda: {"agent": {"environment_hint": "CONFIG-VALUE"}},
|
||||
)
|
||||
_pb._clear_backend_probe_cache()
|
||||
result = _pb.build_environment_hints()
|
||||
assert "CONFIG-VALUE" in result
|
||||
|
||||
def test_environment_hint_empty_by_default(self, monkeypatch):
|
||||
"""No hint configured anywhere → no embedder text, host block intact."""
|
||||
import agent.prompt_builder as _pb
|
||||
monkeypatch.setattr(_pb, "is_wsl", lambda: False)
|
||||
monkeypatch.delenv("TERMINAL_ENV", raising=False)
|
||||
monkeypatch.delenv("HERMES_ENVIRONMENT_HINT", raising=False)
|
||||
monkeypatch.setattr("hermes_cli.config.load_config", lambda: {"agent": {}})
|
||||
_pb._clear_backend_probe_cache()
|
||||
result = _pb.build_environment_hints()
|
||||
assert "Host:" in result
|
||||
|
||||
|
||||
# =========================================================================
|
||||
# Conditional skill activation
|
||||
@@ -1213,4 +1289,3 @@ class TestOpenAIModelExecutionGuidance:
|
||||
# =========================================================================
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user