{"repo":"NousResearch/hermes-agent","public_id":"48335","display_label":"PTY session disposal on desktop quit/restart","summary":"These items concern a crash or race condition during application quit or update-restart caused by open PTY sessions not being disposed in the before-quit handler. Two are fixes and one is a bug report describing the underlying issue.","subsystem":null,"counts":{"members":3,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":48421,"merged_at":"2026-06-18T12:55:18+00:00"},"resolution":{"state":"resolved","by":"pr-48421"},"freshness":{"state":"verified","last_verified_at":"2026-06-18T12:55:18+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":48335,"pr_number":48421,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-06-18T12:55:18+00:00"}],"members":[{"kind":"issue","number":48335,"title":"Desktop: SIGABRT crash on quit/update-restart — node-pty ThreadSafeFunction teardown race (ptys not disposed in before-quit)","url":null,"state":"closed"},{"kind":"pr","number":48393,"title":"fix(desktop): dispose open PTY sessions in before-quit handler","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#48421","number":48421},{"kind":"pr","value":"#904","number":904},{"kind":"pr","value":"#48335","number":48335}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":48421,"title":"fix(desktop): dispose open PTY sessions in before-quit handler","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["apps/desktop/electron/main.cjs","scripts/release.py"],"fix_hunks":[{"file":"apps/desktop/electron/main.cjs","hunks":["@@ -6551,6 +6551,12 @@ app.on('before-quit', () => {\n   flushDesktopLogBufferSync()\n   closePreviewWatchers()\n \n+  // Kill open PTYs before environment teardown to avoid the node-pty#904\n+  // ThreadSafeFunction SIGABRT race.\n+  for (const id of [...terminalSessions.keys()]) {\n+    disposeTerminalSession(id)\n+  }\n+\n   if (hermesProcess && !hermesProcess.killed) {\n     hermesProcess.kill('SIGTERM')\n   }"]},{"file":"scripts/release.py","hunks":["@@ -45,6 +45,7 @@\n \n # Auto-extracted from noreply emails + manual overrides\n AUTHOR_MAP = {\n+    \"286497132+srojk34@users.noreply.github.com\": \"srojk34\",\n     \"59806492+sitkarev@users.noreply.github.com\": \"sitkarev\",\n     \"[redacted:email]\": \"omegazheng\",\n     \"220877172+james47kjv@users.noreply.github.com\": \"james47kjv\",\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}