hermes-agent/infographic
Teknium 6d879d486b
fix(dashboard): close PTY WebSocket on child EOF to stop FD leak (#54028) (#54123)
* fix(dashboard): close PTY WebSocket on child EOF to stop FD leak

The /api/pty handler's reader task returns on child EOF, but the writer
loop stayed blocked on ws.receive() until the browser sent a disconnect.
When the browser socket is half-open (no FIN delivered — common on
macOS/launchd), that disconnect never arrives, so the handler never
reaches its finally and the PTY master fd + child process leak. With
dashboard auto-reconnect (#52962), every dropped socket then spawns a
fresh PTY on top of the orphaned one, exhausting file descriptors within
hours (EMFILE / Errno 24).

Fix: the reader task now closes the WebSocket in a finally when the child
EOFs or the send side breaks, which unblocks ws.receive() so the existing
finally runs bridge.close(). The writer loop also guards ws.receive()
against the RuntimeError Starlette raises once the socket is closed.

Reported by @fifteenzhang.

Fixes #54028

* docs: add infographic for #54028 PTY FD leak fix
2026-06-28 02:42:21 -07:00
..
53175-gateway-cleanup-off-loop docs: add infographic for #53175 gateway cleanup off-loop fix 2026-06-28 02:41:36 -07:00
atomic-env-snapshot-38249 docs: add infographic for #38249 atomic env-snapshot fix 2026-06-28 02:08:57 -07:00
auth-login-hint-fix fix(cli): correct stale hermes auth login nous hints to hermes auth add nous (#53929) 2026-06-27 21:30:37 -07:00
ci-file-timeout-300 test(ci): raise per-file timeout 140s → 300s to stop false timeouts (#54143) 2026-06-28 02:41:07 -07:00
clarify-expiry-32762 docs: add PR infographic for #32762 clarify-expiry fix 2026-06-28 01:07:53 -07:00
content-filter-fallback docs: add infographic for #32421 content-filter fallback fix 2026-06-28 01:15:21 -07:00
discord-no-bot2bot docs(discord): document bot-to-bot comms as unsupported (#32791) (#54063) 2026-06-28 01:15:34 -07:00
eager-fallback-transport docs(infographic): eager fallback on persistent transport failures 2026-06-27 19:12:21 -07:00
empty-400-unmasked docs: add infographic for #36109 empty-400 diagnostics 2026-06-28 02:05:20 -07:00
gateway-force-exit-53107 docs: add infographic for #53107 gateway force-exit fix 2026-06-28 02:34:23 -07:00
intent-ack-continuation fix(agent): config-driven intent-ack continuation for all api_modes (#27881) (#53943) 2026-06-27 20:46:00 -07:00
model-name-canon fix(config): canonicalize model.name/model.model to model.default (#34500) 2026-06-28 02:05:13 -07:00
model-picker-fixes docs(infographic): model picker fixes (#49129 + #51488) 2026-06-27 21:23:25 -07:00
partial-stream-recovery infographic: partial-stream recovery fix (salvage #41498) 2026-06-27 22:03:14 -07:00
pr-27539 docs: add PR infographic for config-defaults fix 2026-06-27 19:38:11 -07:00
pr-29285-provider-precedence docs: add infographic for provider-precedence fix (#29285) 2026-06-27 19:49:02 -07:00
pr-54028-pty-fd-leak fix(dashboard): close PTY WebSocket on child EOF to stop FD leak (#54028) (#54123) 2026-06-28 02:42:21 -07:00
skills-sync-external-dirs docs(infographic): skill sync external_dirs shadow fix 2026-06-27 21:07:53 -07:00
standalone-plugin-policy docs: third-party-product plugins ship standalone, not into core tree (#54001) 2026-06-27 22:23:50 -07:00
state-db-fullfsync docs: add infographic for #30636 macOS state.db fix 2026-06-28 00:53:19 -07:00
telegram-send-path-35205 fix(telegram): clear send_path_degraded on successful reconnect (#35205) (#54076) 2026-06-28 01:38:17 -07:00
vision-any-provider fix(tools): let vision pick any provider+model, not just OpenRouter (#53606) 2026-06-27 04:41:42 -07:00
whatsapp-lid-session-fix docs: add infographic for #36664 WhatsApp LID session-path fix 2026-06-28 02:05:26 -07:00
whatsapp-send-queue infographic: whatsapp send-queue serialization (#33360) 2026-06-28 01:10:14 -07:00
windows-update-loop-52378 docs: add infographic for #52378 Windows update-loop salvage 2026-06-28 02:40:37 -07:00