mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-15 14:22:43 +00:00
fix(cli): preserve chat -q answer by gating exit-summary screen clear (#53009)
In single-query (-q) mode, the assistant's final answer was printed and then immediately erased by _print_exit_summary() — which unconditionally called _clear_terminal_on_exit() (ESC[3J ESC[2J ESC[H]). The answer was present in the session store but invisible in the terminal. The clear is only needed for interactive TUI teardown (#38928) where prompt_toolkit chrome must be cleaned up. Add a clear_screen parameter to _print_exit_summary() (default True, preserving interactive behavior) and pass False from the single-query call site so the answer stays visible above the exit summary. Regression tests cover: - clear_screen=True (default) calls _clear_terminal_on_exit() - clear_screen=False skips the clear - Single-query -q path passes False end-to-end - Interactive path still clears (preserving #38928)
This commit is contained in:
parent
e10c8eba00
commit
efb226b586
2 changed files with 171 additions and 14 deletions
36
cli.py
36
cli.py
|
|
@ -12745,19 +12745,27 @@ class HermesCLI(CLIAgentSetupMixin, CLICommandsMixin):
|
|||
except (Exception, KeyboardInterrupt) as e:
|
||||
logger.debug("Could not persist active CLI session before close: %s", e)
|
||||
|
||||
def _print_exit_summary(self):
|
||||
"""Print session resume info on exit, similar to Claude Code."""
|
||||
# Clear the screen + scrollback before printing the summary so the
|
||||
# live bottom chrome (status bar, input box, separator rules) and the
|
||||
# rest of the session transcript don't get stranded above the exit
|
||||
# summary (#38252). By this point app.run() has returned and
|
||||
# prompt_toolkit has restored terminal modes, so writing raw escapes
|
||||
# to stdout is safe. ESC[3J clears scrollback, ESC[2J clears the
|
||||
# visible screen, ESC[H homes the cursor — so the summary prints at a
|
||||
# clean top-left. Falls back to the platform clear command if stdout
|
||||
# isn't a TTY-capable stream. Honors NO_COLOR/dumb terminals by
|
||||
# skipping silently when there's no real console.
|
||||
self._clear_terminal_on_exit()
|
||||
def _print_exit_summary(self, clear_screen: bool = True):
|
||||
"""Print session resume info on exit, similar to Claude Code.
|
||||
|
||||
Args:
|
||||
clear_screen: When True (default), clear the terminal screen and
|
||||
scrollback before printing the summary. This is appropriate for
|
||||
interactive TUI teardown (#38252). Single-query (-q) mode should
|
||||
pass False to preserve the printed answer (#53009).
|
||||
"""
|
||||
if clear_screen:
|
||||
# Clear the screen + scrollback before printing the summary so the
|
||||
# live bottom chrome (status bar, input box, separator rules) and the
|
||||
# rest of the session transcript don't get stranded above the exit
|
||||
# summary (#38252). By this point app.run() has returned and
|
||||
# prompt_toolkit has restored terminal modes, so writing raw escapes
|
||||
# to stdout is safe. ESC[3J clears scrollback, ESC[2J clears the
|
||||
# visible screen, ESC[H homes the cursor — so the summary prints at a
|
||||
# clean top-left. Falls back to the platform clear command if stdout
|
||||
# isn't a TTY-capable stream. Honors NO_COLOR/dumb terminals by
|
||||
# skipping silently when there's no real console.
|
||||
self._clear_terminal_on_exit()
|
||||
print()
|
||||
msg_count = len(self.conversation_history)
|
||||
if msg_count > 0:
|
||||
|
|
@ -16171,7 +16179,7 @@ def main(
|
|||
# banner, doesn't depend on the welcome banner being shown.
|
||||
cli._show_security_advisories()
|
||||
cli.chat(query, images=single_query_images or None)
|
||||
cli._print_exit_summary()
|
||||
cli._print_exit_summary(clear_screen=False)
|
||||
finally:
|
||||
_finalize_single_query(cli)
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue