refactor(hermes_cli): sessions_cmd pin/retitle/prune preview tightening

This commit is contained in:
Teknium
2026-09-02 23:37:04 -07:00
parent 3cc998a4b8
commit 251a82b46e

View File

@@ -639,11 +639,9 @@ def _cmd_prune_or_archive(db, args, action):
# direct-open count would misdescribe its effect.
skipped_open = db.count_open_prune_matches(**filters) if prune else 0
if skipped_open:
print(
f"Note: {skipped_open} open session{'' if skipped_open == 1 else 's'} also match these filters but "
"will be skipped because prune only deletes ended sessions. Use `hermes sessions delete <id>` "
"to remove one explicitly."
)
print(f"Note: {skipped_open} open session{'' if skipped_open == 1 else 's'} also match these filters but "
"will be skipped because prune only deletes ended sessions. Use `hermes sessions delete <id>` "
"to remove one explicitly.")
if not candidates:
print(f"No sessions match ({describe_filters(filters)}).")
return
@@ -657,12 +655,9 @@ def _cmd_prune_or_archive(db, args, action):
shown = candidates if args.dry_run else candidates[:15]
print(f"{len(candidates)} session(s) match ({describe_filters(filters)}; {_span}):")
for s in shown:
title = (s.get("title") or "")[:36]
model = (s.get("model") or "-").split("/")[-1][:24]
print(
f" {s['id']} {format_epoch(s.get('last_active')):<17} {s['source']:<10} {model:<24} "
f"{s['message_count']:>4} msgs {title}"
)
print(f" {s['id']} {format_epoch(s.get('last_active')):<17} {s['source']:<10} {model:<24} "
f"{s['message_count']:>4} msgs {(s.get('title') or '')[:36]}")
if len(candidates) > len(shown):
print(f" … and {len(candidates) - len(shown)} more")
if args.dry_run:
@@ -712,8 +707,7 @@ def _cmd_pin(db, args, pinning):
print(f"{'Pinned' if pinning else 'Unpinned'} session '{resolved}'.{f' ({title})' if title else ''}")
else:
failures += _not_found(raw_id)
if failures:
return 1
return 1 if failures else None
def _cmd_pinned(db, args):
@@ -738,11 +732,6 @@ def _cmd_retitle_skills(db, args):
from agent.title_generator import generate_title
limit = max(1, int(getattr(args, "limit", 200) or 200))
apply_changes = bool(getattr(args, "apply", False))
def _is_titlelike(candidate: str) -> bool:
"""Reject non-titles: an auxiliary model occasionally answers the prompt instead of titling it
('$ df -h /'). This is a REPAIR — never replace a serviceable title with that."""
return bool(candidate) and candidate[0].isalnum()
candidates = db.list_skill_scaffolded_sessions(limit=limit)
if not candidates:
print("No sessions were titled from a /skill invocation.")
@@ -756,7 +745,9 @@ def _cmd_retitle_skills(db, args):
new_title = generate_title(typed)
if not new_title or new_title == row["title"]:
continue
if not _is_titlelike(new_title):
if not new_title[0].isalnum():
# Non-title: an auxiliary model occasionally answers the prompt instead of titling it
# ('$ df -h /'). This is a REPAIR — never replace a serviceable title with that.
print(f" {session_id}\n kept {row['title']!r} — got {new_title!r}")
continue
print(f" {session_id}\n {row['title']!r}\n → {new_title!r}")