fix: catch KeyboardInterrupt in exit cleanup handlers (#3257)

except Exception does not catch KeyboardInterrupt (inherits from
BaseException). A second Ctrl+C during exit cleanup aborts pending
writes — Honcho observations dropped, SQLite sessions left unclosed,
cron job sessions never marked ended.

Changed to except (Exception, KeyboardInterrupt) at all five sites:
- cli.py: honcho.shutdown() and end_session() in finally exit block
- run_agent.py: _flush_honcho_on_exit atexit handler
- cron/scheduler.py: end_session() and close() in job finally block

Tests exercise the actual production code paths and confirm
KeyboardInterrupt propagates without the fix.

Co-authored-by: dieutx <dangtc94@gmail.com>
This commit is contained in:
Teknium
2026-03-26 14:34:31 -07:00
committed by GitHub
parent e9e7fb0683
commit 41ee207a5e
4 changed files with 110 additions and 5 deletions

4
cli.py
View File

@@ -7163,13 +7163,13 @@ class HermesCLI:
if self.agent and getattr(self.agent, '_honcho', None):
try:
self.agent._honcho.shutdown()
except Exception:
except (Exception, KeyboardInterrupt):
pass
# Close session in SQLite
if hasattr(self, '_session_db') and self._session_db and self.agent:
try:
self._session_db.end_session(self.agent.session_id, "cli_close")
except Exception as e:
except (Exception, KeyboardInterrupt) as e:
logger.debug("Could not close session in DB: %s", e)
_run_cleanup()
self._print_exit_summary()