ff56251555
Re-applied against v0.18.2. Upstream now covers the OpenAI-path stall watchdog (cross-turn give-up breaker #58962) and the tool-batch deadline, so those are dropped. Two gaps remain: - Bedrock streaming had NO liveness watchdog and was excluded from the #58962 breaker (it returns before _check_stale_giveup). Add an on_event hook to stream_converse_with_callbacks (fires per yielded event = true wire-level liveness), drive a stale timer from it, and wire Bedrock INTO the existing breaker: entry _check_stale_giveup, _bump_stale_streak on stall, raise to end the call (invalidate_runtime_client can't abort the in-flight botocore stream, so the streak escalates across turns like the OpenAI path), and reset the streak on success. - local providers still got float('inf') stale timeout (watchdog disabled) — give a finite ceiling (HERMES_LOCAL_STREAM_STALE_TIMEOUT, default 900s). - tests: on_event per-event + swallow; Bedrock stall bumps streak + aborts; pre-elevated streak aborts at entry; success resets streak. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>