fix: update facade tests for contextvar hooks + fix ephemeral guard

The test_run_populates_tools_used_across_iterations,
test_run_populates_final_messages, and
test_run_user_hooks_still_fire_alongside_capture tests were reading
bot._loop._extra_hooks directly in their fake_process_direct mocks,
but the contextvar change moved per-call hooks to _per_call_hooks.

Also fixes the ephemeral guard: per_call hooks should not be used in
ephemeral mode (the original code incorrectly applied them regardless).
This commit is contained in:
michaelxer
2026-06-21 15:59:28 +08:00
committed by Xubin Ren
parent 0bb1b0b3c2
commit 345ef80571
2 changed files with 13 additions and 5 deletions
+3 -1
View File
@@ -728,7 +728,9 @@ class AgentLoop:
)
hook: AgentHook = loop_hook
per_call = _per_call_hooks.get()
extra_hooks = per_call if per_call is not None else (self._extra_hooks if not ephemeral else None)
extra_hooks = None
if not ephemeral:
extra_hooks = per_call if per_call is not None else self._extra_hooks
if extra_hooks:
hook = CompositeHook([loop_hook] + extra_hooks)
+10 -4
View File
@@ -184,8 +184,10 @@ async def test_run_populates_tools_used_across_iterations(tmp_path):
bot = Nanobot.from_config(config_path, workspace=tmp_path)
async def fake_process_direct(message, *, session_key):
# Whatever hooks the SDK installed are now on the loop.
extras = bot._loop._extra_hooks
# Whatever hooks the SDK installed are now in the contextvar.
from nanobot.agent.loop import _per_call_hooks
extras = _per_call_hooks.get() or []
messages = [{"role": "user", "content": message}]
ctx1 = AgentHookContext(iteration=0, messages=messages)
ctx1.tool_calls = [
@@ -217,7 +219,9 @@ async def test_run_populates_final_messages(tmp_path):
bot = Nanobot.from_config(config_path, workspace=tmp_path)
async def fake_process_direct(message, *, session_key):
extras = bot._loop._extra_hooks
from nanobot.agent.loop import _per_call_hooks
extras = _per_call_hooks.get() or []
messages = [
{"role": "user", "content": message},
{"role": "assistant", "content": "hi there"},
@@ -266,7 +270,9 @@ async def test_run_user_hooks_still_fire_alongside_capture(tmp_path):
seen_iterations.append(context.iteration)
async def fake_process_direct(message, *, session_key):
extras = bot._loop._extra_hooks
from nanobot.agent.loop import _per_call_hooks
extras = _per_call_hooks.get() or []
assert len(extras) == 2, f"expected capture + user hook, got {len(extras)}"
ctx = AgentHookContext(iteration=7, messages=[])
for h in extras: