Consume rein-aharness's per-tool-call audit stream (HARNESS-WP-0002-T03)
ToolResult gains an events field (additive, defaults empty) carrying
per-tool audit records when a rein can observe its own inner loop's
individual tool calls -- populated after dispatch_tool returns, not via
a live callback (the contract has no per-event hook). ReinAharness
gains a stream_tool_events flag: when set, passes --stream-tool-events
and parses the tagged {"stream_event": ...} lines back out of captured
stdout into ToolResult.events.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
eaa7f4e7e9
commit
799c61d20e
4 changed files with 91 additions and 9 deletions
|
|
@ -105,3 +105,43 @@ def test_end_session_no_new_commit(tmp_path) -> None:
|
|||
|
||||
summary = rein.end_session({"target_repo": str(repo), "head_before": head})
|
||||
assert summary["committed"] == "False"
|
||||
|
||||
|
||||
def test_dispatch_tool_streams_events_when_enabled() -> None:
|
||||
import json
|
||||
|
||||
rein = ReinAharness(stream_tool_events=True)
|
||||
session = {"task_file": "/tmp/task.json"}
|
||||
|
||||
stdout_lines = [
|
||||
json.dumps({"stream_event": {"type": "assistant", "message": {"content": [{"type": "tool_use", "name": "Read"}]}}}),
|
||||
json.dumps({"stream_event": {"type": "system", "subtype": "hook_started"}}),
|
||||
json.dumps({"ok": True, "committed": True}, indent=2),
|
||||
]
|
||||
fake_result = MagicMock(returncode=0, stdout="\n".join(stdout_lines), stderr="")
|
||||
|
||||
with patch.object(rein, "_bin", return_value="/usr/bin/agent-harness"):
|
||||
with patch("glas_harness.reins.rein_aharness.subprocess.run", return_value=fake_result) as run:
|
||||
result = rein.dispatch_tool(session, ToolCall(name="run_task"))
|
||||
|
||||
argv = run.call_args.args[0]
|
||||
assert "--stream-tool-events" in argv
|
||||
assert len(result.events) == 2
|
||||
assert result.events[0]["message"]["content"][0]["name"] == "Read"
|
||||
assert result.events[1]["subtype"] == "hook_started"
|
||||
assert '"ok": true' in result.output.lower()
|
||||
assert "stream_event" not in result.output
|
||||
|
||||
|
||||
def test_dispatch_tool_no_stream_flag_by_default() -> None:
|
||||
rein = ReinAharness()
|
||||
session = {"task_file": "/tmp/task.json"}
|
||||
fake_result = MagicMock(returncode=0, stdout="ok", stderr="")
|
||||
|
||||
with patch.object(rein, "_bin", return_value="/usr/bin/agent-harness"):
|
||||
with patch("glas_harness.reins.rein_aharness.subprocess.run", return_value=fake_result) as run:
|
||||
result = rein.dispatch_tool(session, ToolCall(name="run_task"))
|
||||
|
||||
argv = run.call_args.args[0]
|
||||
assert "--stream-tool-events" not in argv
|
||||
assert result.events == []
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue