The A2A progress code strips internal tool names out of the update before it goes to the remote agent (untrusted, and it controls the task text). But the guard in _clean_update only treats _ as a boundary, while the normaliser keeps ., : and - - so a tool name next to one of those slips through:
_clean_update("Running bash checks now", ["bash"]) -> blocked
_clean_update("Running bash-based checks now", ["bash"]) -> leaks "bash"
_clean_update("Inspecting the bash.exe helper", ["bash"]) -> leaks "bash"
"bash-based", "grep-style", "edit.py" etc are enough to carry a tool name past the guard and out via a2a_reply. Nothing else sanitises it in between.
Small fix - treat any non-alphanumeric as a boundary so ., :, - count like _. Opened a PR with the fix and a test.
The A2A progress code strips internal tool names out of the update before it goes to the remote agent (untrusted, and it controls the task text). But the guard in
_clean_updateonly treats_as a boundary, while the normaliser keeps.,:and-- so a tool name next to one of those slips through:"bash-based","grep-style","edit.py"etc are enough to carry a tool name past the guard and out viaa2a_reply. Nothing else sanitises it in between.Small fix - treat any non-alphanumeric as a boundary so
.,:,-count like_. Opened a PR with the fix and a test.