* fix(middleware): derive the externalized filename from the tool call id
_build_externalized_filename documents that the host-disk and sandbox paths
share it so both produce the identical naming scheme, but it used a random uuid
suffix and ignored tool_call_id: the same call got a different name every time,
so the two paths could not agree and externalizing one output twice left two
files behind. Derive the name from the call id instead, sanitised the same way
tool names are, and drop the now unused uuid import.
* fix(middleware): hash externalized call IDs and content
* fix(middleware): catch sandbox filename encoding failures
* fix(middleware): handle host output encoding failures
---------
Co-authored-by: Willem Jiang <willem.jiang@gmail.com>