Initial commit: Jarvis Memory system
This commit is contained in:
181
skills/qdrant-memory/scripts/agent_check.py
Executable file
181
skills/qdrant-memory/scripts/agent_check.py
Executable file
@@ -0,0 +1,181 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Check agent messages from Redis stream
|
||||
Usage: agent_check.py [--list N] [--check] [--last-minutes M]
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
import json
|
||||
import time
|
||||
from datetime import datetime, timezone
|
||||
|
||||
# Add parent to path for imports
|
||||
sys.path.insert(0, '/root/.openclaw/workspace/skills/qdrant-memory')
|
||||
|
||||
try:
|
||||
import redis
|
||||
except ImportError:
|
||||
print("❌ Redis module not available")
|
||||
sys.exit(1)
|
||||
|
||||
REDIS_HOST = "10.0.0.36"
|
||||
REDIS_PORT = 6379
|
||||
STREAM_KEY = "agent-messages"
|
||||
LAST_CHECKED_KEY = "agent:last_check_timestamp"
|
||||
|
||||
def get_redis_client():
|
||||
"""Get Redis connection"""
|
||||
try:
|
||||
return redis.Redis(
|
||||
host=REDIS_HOST,
|
||||
port=REDIS_PORT,
|
||||
decode_responses=True,
|
||||
socket_connect_timeout=5,
|
||||
socket_timeout=5
|
||||
)
|
||||
except Exception as e:
|
||||
print(f"❌ Redis connection failed: {e}")
|
||||
return None
|
||||
|
||||
def get_messages_since(last_check=None, count=10):
|
||||
"""Get messages from Redis stream since last check"""
|
||||
r = get_redis_client()
|
||||
if not r:
|
||||
return []
|
||||
|
||||
try:
|
||||
# Get last N messages from stream
|
||||
messages = r.xrevrange(STREAM_KEY, count=count)
|
||||
|
||||
result = []
|
||||
for msg_id, msg_data in messages:
|
||||
# Parse message data
|
||||
data = {}
|
||||
for k, v in msg_data.items():
|
||||
data[k] = v
|
||||
|
||||
# Extract timestamp from message ID
|
||||
timestamp_ms = int(msg_id.split('-')[0])
|
||||
msg_time = datetime.fromtimestamp(timestamp_ms / 1000, tz=timezone.utc)
|
||||
|
||||
# Filter by last check if provided
|
||||
if last_check:
|
||||
if timestamp_ms <= last_check:
|
||||
continue
|
||||
|
||||
result.append({
|
||||
'id': msg_id,
|
||||
'time': msg_time,
|
||||
'data': data
|
||||
})
|
||||
|
||||
return result
|
||||
except Exception as e:
|
||||
print(f"❌ Error reading stream: {e}")
|
||||
return []
|
||||
|
||||
def update_last_check():
|
||||
"""Update the last check timestamp"""
|
||||
r = get_redis_client()
|
||||
if not r:
|
||||
return False
|
||||
|
||||
try:
|
||||
now_ms = int(time.time() * 1000)
|
||||
r.set(LAST_CHECKED_KEY, str(now_ms))
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ Error updating timestamp: {e}")
|
||||
return False
|
||||
|
||||
def get_last_check_time():
|
||||
"""Get the last check timestamp"""
|
||||
r = get_redis_client()
|
||||
if not r:
|
||||
return None
|
||||
|
||||
try:
|
||||
last = r.get(LAST_CHECKED_KEY)
|
||||
if last:
|
||||
return int(last)
|
||||
return None
|
||||
except:
|
||||
return None
|
||||
|
||||
def format_message(msg):
|
||||
"""Format a message for display"""
|
||||
time_str = msg['time'].strftime('%Y-%m-%d %H:%M:%S UTC')
|
||||
data = msg['data']
|
||||
|
||||
sender = data.get('sender', 'unknown')
|
||||
recipient = data.get('recipient', 'all')
|
||||
msg_type = data.get('type', 'message')
|
||||
content = data.get('content', '')
|
||||
|
||||
return f"[{time_str}] {sender} → {recipient} ({msg_type}):\n {content[:200]}{'...' if len(content) > 200 else ''}"
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Check agent messages from Redis")
|
||||
parser.add_argument("--list", "-l", type=int, metavar="N", help="List last N messages")
|
||||
parser.add_argument("--check", "-c", action="store_true", help="Check for new messages since last check")
|
||||
parser.add_argument("--last-minutes", "-m", type=int, metavar="M", help="Check messages from last M minutes")
|
||||
parser.add_argument("--mark-read", action="store_true", help="Update last check timestamp after reading")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.check:
|
||||
last_check = get_last_check_time()
|
||||
messages = get_messages_since(last_check)
|
||||
|
||||
if messages:
|
||||
print(f"🔔 {len(messages)} new message(s):")
|
||||
for msg in reversed(messages): # Oldest first
|
||||
print(format_message(msg))
|
||||
print()
|
||||
else:
|
||||
print("✅ No new messages")
|
||||
|
||||
if args.mark_read:
|
||||
update_last_check()
|
||||
print("📌 Last check time updated")
|
||||
|
||||
elif args.last_minutes:
|
||||
since_ms = int((time.time() - args.last_minutes * 60) * 1000)
|
||||
messages = get_messages_since(since_ms)
|
||||
|
||||
if messages:
|
||||
print(f"📨 {len(messages)} message(s) from last {args.last_minutes} minutes:")
|
||||
for msg in reversed(messages):
|
||||
print(format_message(msg))
|
||||
print()
|
||||
else:
|
||||
print(f"✅ No messages in last {args.last_minutes} minutes")
|
||||
|
||||
elif args.list:
|
||||
messages = get_messages_since(count=args.list)
|
||||
|
||||
if messages:
|
||||
print(f"📜 Last {len(messages)} message(s):")
|
||||
for msg in reversed(messages):
|
||||
print(format_message(msg))
|
||||
print()
|
||||
else:
|
||||
print("📭 No messages in stream")
|
||||
|
||||
else:
|
||||
# Default: check for new messages
|
||||
last_check = get_last_check_time()
|
||||
messages = get_messages_since(last_check)
|
||||
|
||||
if messages:
|
||||
print(f"🔔 {len(messages)} new message(s):")
|
||||
for msg in reversed(messages):
|
||||
print(format_message(msg))
|
||||
print()
|
||||
update_last_check()
|
||||
else:
|
||||
print("✅ No new messages")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user