Rebase onto upstream (a4d95fd)
#12
+15
-3
@@ -429,12 +429,24 @@ class AgentLoop:
|
|||||||
for chain_msg in messages[turn_start:]:
|
for chain_msg in messages[turn_start:]:
|
||||||
session.add_raw_message(chain_msg)
|
session.add_raw_message(chain_msg)
|
||||||
self.sessions.save(session)
|
self.sessions.save(session)
|
||||||
|
|
||||||
|
# Check for suppress mode
|
||||||
|
suppress_output = msg.metadata.get("suppress_output", False) if msg.metadata else False
|
||||||
|
|
||||||
|
if suppress_output:
|
||||||
|
# Prefix content for session visibility
|
||||||
|
final_content_for_session = f"[HIDDEN] {final_content}"
|
||||||
|
# Mark as suppressed for channel handler
|
||||||
|
outbound_metadata = {**(msg.metadata or {}), "suppressed": True}
|
||||||
|
else:
|
||||||
|
final_content_for_session = final_content
|
||||||
|
outbound_metadata = msg.metadata or {}
|
||||||
|
|
||||||
return OutboundMessage(
|
return OutboundMessage(
|
||||||
channel=msg.channel,
|
channel=msg.channel,
|
||||||
chat_id=msg.chat_id,
|
chat_id=msg.chat_id,
|
||||||
content=final_content,
|
content=final_content_for_session,
|
||||||
metadata=msg.metadata or {}, # Pass through for channel-specific needs (e.g. Slack thread_ts)
|
metadata=outbound_metadata,
|
||||||
)
|
)
|
||||||
|
|
||||||
async def _process_system_message(self, msg: InboundMessage) -> OutboundMessage | None:
|
async def _process_system_message(self, msg: InboundMessage) -> OutboundMessage | None:
|
||||||
|
|||||||
@@ -14,10 +14,10 @@ async def test_process_direct_passes_metadata():
|
|||||||
provider = MagicMock(spec=LLMProvider)
|
provider = MagicMock(spec=LLMProvider)
|
||||||
provider.chat = AsyncMock(return_value=LLMResponse(
|
provider.chat = AsyncMock(return_value=LLMResponse(
|
||||||
content="test response",
|
content="test response",
|
||||||
has_tool_calls=False,
|
|
||||||
tool_calls=[]
|
tool_calls=[]
|
||||||
))
|
))
|
||||||
provider.get_default_model = MagicMock(return_value="test-model")
|
provider.get_default_model = MagicMock(return_value="test-model")
|
||||||
|
provider.thinking_budget = 0
|
||||||
|
|
||||||
workspace = Path("/tmp/test-workspace")
|
workspace = Path("/tmp/test-workspace")
|
||||||
workspace.mkdir(exist_ok=True)
|
workspace.mkdir(exist_ok=True)
|
||||||
@@ -41,3 +41,56 @@ async def test_process_direct_passes_metadata():
|
|||||||
# the flow worked by checking the session was created)
|
# the flow worked by checking the session was created)
|
||||||
session = loop.sessions.get_or_create("cli:direct")
|
session = loop.sessions.get_or_create("cli:direct")
|
||||||
assert len(session.messages) > 0
|
assert len(session.messages) > 0
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_suppress_mode_adds_hidden_prefix():
|
||||||
|
"""Test that suppress_output metadata adds [HIDDEN] prefix."""
|
||||||
|
bus = MessageBus()
|
||||||
|
provider = MagicMock(spec=LLMProvider)
|
||||||
|
provider.chat = AsyncMock(return_value=LLMResponse(
|
||||||
|
content="This is the agent response",
|
||||||
|
tool_calls=[]
|
||||||
|
))
|
||||||
|
provider.get_default_model = MagicMock(return_value="test-model")
|
||||||
|
provider.thinking_budget = 0
|
||||||
|
|
||||||
|
workspace = Path("/tmp/test-workspace")
|
||||||
|
workspace.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
loop = AgentLoop(bus=bus, provider=provider, workspace=workspace)
|
||||||
|
|
||||||
|
# Call with suppress_output=True
|
||||||
|
response = await loop.process_direct(
|
||||||
|
content="test message",
|
||||||
|
metadata={"suppress_output": True}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Response content should have [HIDDEN] prefix
|
||||||
|
assert response.startswith("[HIDDEN]")
|
||||||
|
assert "This is the agent response" in response
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_normal_mode_no_hidden_prefix():
|
||||||
|
"""Test that normal messages don't get [HIDDEN] prefix."""
|
||||||
|
bus = MessageBus()
|
||||||
|
provider = MagicMock(spec=LLMProvider)
|
||||||
|
provider.chat = AsyncMock(return_value=LLMResponse(
|
||||||
|
content="Normal response",
|
||||||
|
tool_calls=[]
|
||||||
|
))
|
||||||
|
provider.get_default_model = MagicMock(return_value="test-model")
|
||||||
|
provider.thinking_budget = 0
|
||||||
|
|
||||||
|
workspace = Path("/tmp/test-workspace")
|
||||||
|
workspace.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
loop = AgentLoop(bus=bus, provider=provider, workspace=workspace)
|
||||||
|
|
||||||
|
# Call without suppress_output
|
||||||
|
response = await loop.process_direct(content="test message")
|
||||||
|
|
||||||
|
# Response should NOT have [HIDDEN] prefix
|
||||||
|
assert not response.startswith("[HIDDEN]")
|
||||||
|
assert response == "Normal response"
|
||||||
|
|||||||
Reference in New Issue
Block a user