fix: /clear command broken inside TUI (patch_stdout interference)
The /clear command was using Rich's console.clear() and console.print() which write directly to stdout. Inside the TUI, prompt_toolkit's patch_stdout intercepts stdout via StdoutProxy, which doesn't interpret screen-clearing escape sequences and mangles Rich's ANSI output, resulting in raw escape codes dumped to the terminal. Fix: - Use prompt_toolkit's output.erase_screen() + cursor_goto() to clear the terminal directly (bypasses patch_stdout's StdoutProxy) - Render the banner through ChatConsole (which routes Rich output through prompt_toolkit's native print_formatted_text/ANSI renderer) - Use _cprint for the status message (prompt_toolkit-compatible) - Fall back to the old behavior when not inside the TUI (e.g. startup)
This commit is contained in:
parent
306d92a9d7
commit
7e36468511
1 changed files with 38 additions and 5 deletions
43
cli.py
43
cli.py
|
|
@ -1811,13 +1811,46 @@ class HermesCLI:
|
||||||
self.agent.flush_memories(self.conversation_history)
|
self.agent.flush_memories(self.conversation_history)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
# Clear terminal screen using Rich (portable, no shell needed)
|
# Clear terminal screen. Inside the TUI, Rich's console.clear()
|
||||||
self.console.clear()
|
# goes through patch_stdout's StdoutProxy which swallows the
|
||||||
|
# screen-clear escape sequences. Use prompt_toolkit's output
|
||||||
|
# object directly to actually clear the terminal.
|
||||||
|
if self._app:
|
||||||
|
out = self._app.output
|
||||||
|
out.erase_screen()
|
||||||
|
out.cursor_goto(0, 0)
|
||||||
|
out.flush()
|
||||||
|
else:
|
||||||
|
self.console.clear()
|
||||||
# Reset conversation
|
# Reset conversation
|
||||||
self.conversation_history = []
|
self.conversation_history = []
|
||||||
# Show fresh banner
|
# Show fresh banner. Inside the TUI we must route Rich output
|
||||||
self.show_banner()
|
# through ChatConsole (which uses prompt_toolkit's native ANSI
|
||||||
print(" ✨ (◕‿◕)✨ Fresh start! Screen cleared and conversation reset.\n")
|
# renderer) instead of self.console (which writes raw to stdout
|
||||||
|
# and gets mangled by patch_stdout).
|
||||||
|
if self._app:
|
||||||
|
cc = ChatConsole()
|
||||||
|
if self.compact:
|
||||||
|
cc.print(COMPACT_BANNER)
|
||||||
|
else:
|
||||||
|
tools = get_tool_definitions(enabled_toolsets=self.enabled_toolsets, quiet_mode=True)
|
||||||
|
cwd = os.getenv("TERMINAL_CWD", os.getcwd())
|
||||||
|
ctx_len = None
|
||||||
|
if hasattr(self, 'agent') and self.agent and hasattr(self.agent, 'context_compressor'):
|
||||||
|
ctx_len = self.agent.context_compressor.context_length
|
||||||
|
build_welcome_banner(
|
||||||
|
console=cc,
|
||||||
|
model=self.model,
|
||||||
|
cwd=cwd,
|
||||||
|
tools=tools,
|
||||||
|
enabled_toolsets=self.enabled_toolsets,
|
||||||
|
session_id=self.session_id,
|
||||||
|
context_length=ctx_len,
|
||||||
|
)
|
||||||
|
_cprint(" ✨ (◕‿◕)✨ Fresh start! Screen cleared and conversation reset.\n")
|
||||||
|
else:
|
||||||
|
self.show_banner()
|
||||||
|
print(" ✨ (◕‿◕)✨ Fresh start! Screen cleared and conversation reset.\n")
|
||||||
elif cmd_lower == "/history":
|
elif cmd_lower == "/history":
|
||||||
self.show_history()
|
self.show_history()
|
||||||
elif cmd_lower in ("/reset", "/new"):
|
elif cmd_lower in ("/reset", "/new"):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue