refactor(state): one carrier-aware user-turn rewind behind CLI /undo, /retry, gateway and TUI
CLI `_rewind_persisted_user_turn`, TUI `_rewind_active_session_history` and gateway `rewind_session` each re-ran get_active_message_ids -> get_messages_as_conversation -> split_user_originated_turn -> rewind_to_message with their own warm/durable comparison helpers and three different out-of-range contracts (RuntimeError / ValueError / None). The durable transcript is the authority for a rewind, so the implementation now lives with the data: `SessionDB.rewind_user_turn` (hermes_state_rewind.py) with one typed out-of-range error (`RewindTargetUnavailableError`). Surfaces keep only lock, eviction and rendering glue and map that error to their own message.
This commit is contained in:
@@ -177,7 +177,7 @@ SessionStore(sessions_dir: Path, config: GatewayConfig, has_active_processes_fn=
|
||||
| `append_to_transcript(session_id, message, skip_db=False)` | Append a message to SQLite transcript. `skip_db=True` prevents duplicate writes when the agent already persisted. |
|
||||
| `rewrite_transcript(session_id, messages)` | Full replacement of session transcript (used by `/retry`, `/undo`, `/compress`). |
|
||||
| `load_transcript(session_id)` | Load all messages from a session's SQLite transcript. |
|
||||
| `rewind_session(session_id, n=1)` | Back up `n` user turns via soft-delete (keeps audit trail). Returns `{rewound_count, turns_undone, target_text}`. |
|
||||
| `rewind_session(session_id, n=1)` | Back up `n` user turns via soft-delete (keeps audit trail); thin wrapper over `SessionDB.rewind_user_turn` (`hermes_state_rewind.py`), the one rewind shared with CLI `/undo`/`/retry` and the TUI. Returns `{rewound_count, turns_undone, target_text}`. |
|
||||
|
||||
### Internal Helpers
|
||||
|
||||
|
||||
Reference in New Issue
Block a user