From f3e0cfa65ab1a7864dcd775a997256337a38d751 Mon Sep 17 00:00:00 2001 From: letta-code <248085862+letta-code@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:08:03 +0000 Subject: [PATCH] fix: secondary sort by timestamp + NEW indicator for notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - responder.py: Sort queue by (priority, -timestamp) so newest items appear first within each priority tier - respond.py: Add 🆕 indicator for items queued < 30 min ago - respond.py: Show priority level in list output for visibility Fixes #3 Co-authored-by: Cameron --- tools/respond.py | 25 +++++++++++++++++++++++-- tools/responder.py | 10 ++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/tools/respond.py b/tools/respond.py index 580786d..0b94757 100644 --- a/tools/respond.py +++ b/tools/respond.py @@ -12,9 +12,11 @@ This tool handles YAML manipulation properly so subagents don't corrupt the file import sys import yaml from pathlib import Path +from datetime import datetime, timezone QUEUE_FILE = Path("drafts/queue.yaml") SENT_FILE = Path("drafts/sent.txt") +NEW_THRESHOLD_MINUTES = 30 # Items newer than this get 🆕 indicator def load_queue(): @@ -46,6 +48,19 @@ def load_sent_uris() -> set: return set(content.split("\n")) +def is_new(queued_at: str | None) -> bool: + """Check if item was queued within NEW_THRESHOLD_MINUTES.""" + if not queued_at: + return False + try: + item_time = datetime.fromisoformat(queued_at) + now = datetime.now(timezone.utc) + age_minutes = (now - item_time).total_seconds() / 60 + return age_minutes <= NEW_THRESHOLD_MINUTES + except (ValueError, TypeError): + return False + + def list_queue(): """List queue items with indices.""" queue = load_queue() @@ -57,9 +72,11 @@ def list_queue(): for i, item in enumerate(queue): author = item.get("author", "unknown") - text = item.get("text", "")[:60].replace("\n", " ") + priority = item.get("priority", "MEDIUM") + text = item.get("text", "")[:50].replace("\n", " ") response = item.get("response") uri = item.get("uri", "") + queued_at = item.get("queued_at") # Status: ✓ = has response, ○ = no response, ⚠ = already sent (duplicate) if uri in sent_uris: @@ -68,7 +85,11 @@ def list_queue(): status = "✓" else: status = "○" - print(f"{i}: [{status}] @{author}: {text}...") + + # NEW indicator for recent items + new_indicator = "🆕" if is_new(queued_at) else " " + + print(f"{i}: {new_indicator} [{status}] [{priority}] @{author}: {text}...") def set_response(uri: str, response: str): diff --git a/tools/responder.py b/tools/responder.py index f3d3e83..67282f2 100644 --- a/tools/responder.py +++ b/tools/responder.py @@ -170,8 +170,14 @@ async def queue_notifications(limit=50): queue.insert(0, entry) # Newest first? Or append? Let's prepend. count += 1 - # Sort queue by priority (CRITICAL first, SKIP last) - queue.sort(key=lambda x: PRIORITY_ORDER.get(x.get("priority", "MEDIUM"), 2)) + # Sort queue by priority (CRITICAL first, SKIP last), then by timestamp (newest first within tier) + def sort_key(x): + priority = PRIORITY_ORDER.get(x.get("priority", "MEDIUM"), 2) + # Default to epoch if no timestamp (puts legacy items last within tier) + queued_at = x.get("queued_at", "1970-01-01T00:00:00+00:00") + # Negate timestamp for reverse chronological within priority tier + return (priority, -datetime.fromisoformat(queued_at).timestamp()) + queue.sort(key=sort_key) with open(DRAFTS_FILE, "w") as f: yaml.dump(queue, f, sort_keys=False, indent=2) -- 2.51.2