Bug Description
When resuming a session with hermes -c, the "Previous Conversation" recap panel is effectively useless for understanding what happened in the prior session. There are two compounding problems:
1. Tool-call-only messages eat the display slots
In tool-heavy sessions (debugging, file investigation, terminal work), the MAX_DISPLAY_EXCHANGES = 10 cap fills up entirely with [1 tool call: terminal] entries that carry no useful information. Meaningful exchanges get pushed out or buried.
2. Hardcoded truncation limits make text unreadable
Even when a text response does appear, the display truncates it to 200 characters / 3 lines — barely one sentence of a real response. This makes the recap useless even when it does show something.
Steps to Reproduce
- Run a session with significant tool use (debugging, investigation, multi-step terminal work)
- Exit and re-enter with
hermes -c
- Observe the recap panel
Actual Behavior
... 106 earlier messages ...
◆ Hermes: [1 tool call: terminal]
◆ Hermes: [1 tool call: terminal]
◆ Hermes: [1 tool call: terminal]
◆ Hermes: [1 tool call: terminal]
◆ Hermes: [1 tool call: terminal]
◆ Hermes: [1 tool call: terminal]
◆ Hermes: [1 tool call: terminal]
◆ Hermes: [1 tool call: terminal]
◆ Hermes: Got everything I need. Here's the full picture:
**This is intended behavior, and it's by design — but the d... ← truncated mid-sentence
Expected Behavior
The recap should show the last N meaningful exchanges — skipping tool-call-only messages — with enough text to actually understand the context. Both the slot count and truncation limits should be configurable.
Root Cause
In cli.py, _display_resumed_history(), all constants are hardcoded with no config hooks:
MAX_DISPLAY_EXCHANGES = 10 # consumes slots on tool-only messages
MAX_USER_LEN = 300 # truncates user messages
MAX_ASST_LEN = 200 # truncates assistant text — too short
MAX_ASST_LINES = 3 # truncates assistant text — too few lines
Proposed Fix
Two changes:
1. Skip tool-call-only assistant entries when filling MAX_DISPLAY_EXCHANGES — only count messages that have actual text content toward the cap.
2. Expose all limits as config options under the existing display section in config.yaml:
display:
resume_display: full # existing option
resume_exchanges: 10 # new: max meaningful exchanges to show
resume_max_user_chars: 300 # new: truncation for user messages
resume_max_assistant_chars: 200 # new: truncation for assistant text
resume_max_assistant_lines: 3 # new: max lines of assistant text
resume_skip_tool_only: true # new: skip tool-call-only entries
This gives users a Claude Code-style full-context experience if they want it (set chars/lines to 0 for unlimited), while keeping the compact default for those who prefer it.
Environment
- Hermes version: current main
- Platform: CLI (
hermes -c)
- Session type: investigation/debugging session with many sequential terminal calls
Bug Description
When resuming a session with
hermes -c, the "Previous Conversation" recap panel is effectively useless for understanding what happened in the prior session. There are two compounding problems:1. Tool-call-only messages eat the display slots
In tool-heavy sessions (debugging, file investigation, terminal work), the
MAX_DISPLAY_EXCHANGES = 10cap fills up entirely with[1 tool call: terminal]entries that carry no useful information. Meaningful exchanges get pushed out or buried.2. Hardcoded truncation limits make text unreadable
Even when a text response does appear, the display truncates it to 200 characters / 3 lines — barely one sentence of a real response. This makes the recap useless even when it does show something.
Steps to Reproduce
hermes -cActual Behavior
Expected Behavior
The recap should show the last N meaningful exchanges — skipping tool-call-only messages — with enough text to actually understand the context. Both the slot count and truncation limits should be configurable.
Root Cause
In
cli.py,_display_resumed_history(), all constants are hardcoded with no config hooks:Proposed Fix
Two changes:
1. Skip tool-call-only assistant entries when filling
MAX_DISPLAY_EXCHANGES— only count messages that have actual text content toward the cap.2. Expose all limits as config options under the existing
displaysection inconfig.yaml:This gives users a Claude Code-style full-context experience if they want it (set chars/lines to 0 for unlimited), while keeping the compact default for those who prefer it.
Environment
hermes -c)