Files
workspace/process-session.py

107 lines
3.9 KiB
Python
Executable File

#!/usr/bin/env python3
import json
import sys
import subprocess
import os
from pathlib import Path
def extract_assistant_turns(session_file):
"""Extract assistant messages and their preceding user messages"""
turns = []
messages = []
# Read all messages from the JSONL file
with open(session_file, 'r') as f:
for line in f:
try:
data = json.loads(line.strip())
if data.get('type') == 'message':
messages.append(data)
except json.JSONDecodeError:
continue
# Find assistant messages and pair with preceding user messages
for i, msg in enumerate(messages):
if msg.get('message', {}).get('role') == 'assistant':
# Find the most recent user message before this assistant message
user_msg = None
for j in range(i-1, -1, -1):
if messages[j].get('message', {}).get('role') == 'user':
user_msg = messages[j]
break
if user_msg:
# Extract content text from user message
user_content = ""
user_msg_content = user_msg.get('message', {}).get('content', [])
if isinstance(user_msg_content, list):
for item in user_msg_content:
if item.get('type') == 'text':
user_content += item.get('text', '')
elif isinstance(user_msg_content, str):
user_content = user_msg_content
# Extract content text from assistant message
assistant_content = ""
assistant_msg_content = msg.get('message', {}).get('content', [])
if isinstance(assistant_msg_content, list):
for item in assistant_msg_content:
if item.get('type') == 'text':
assistant_content += item.get('text', '')
elif isinstance(assistant_msg_content, str):
assistant_content = assistant_msg_content
if user_content.strip() and assistant_content.strip():
turns.append({
"user": user_content.strip(),
"assistant": assistant_content.strip(),
"agent_id": "case",
"session": "main"
})
# Return last 10 turns
return turns[-10:] if len(turns) > 10 else turns
def main():
session_file = "/home/wdjones/.openclaw/agents/main/sessions/8fb5bcf0-cc48-4e32-b34a-0c7bdf93b6b5.jsonl"
if not os.path.exists(session_file):
print(f"Session file not found: {session_file}", file=sys.stderr)
return 1
turns = extract_assistant_turns(session_file)
if not turns:
print("No assistant turns found", file=sys.stderr)
return 1
print(f"Extracted {len(turns)} assistant turns", file=sys.stderr)
# Pipe each turn to the auto-memory hook
hook_script = "/home/wdjones/.openclaw/workspace/tools/auto-memory-hook.py"
for i, turn in enumerate(turns):
try:
# Convert to JSON and pipe to the hook script
json_data = json.dumps(turn)
result = subprocess.run(
["python3", hook_script],
input=json_data,
text=True,
capture_output=True
)
if result.returncode == 0:
print(f"Turn {i+1}: Processed successfully", file=sys.stderr)
else:
print(f"Turn {i+1}: Error - {result.stderr}", file=sys.stderr)
except Exception as e:
print(f"Turn {i+1}: Exception - {e}", file=sys.stderr)
print("Auto-memory indexing complete", file=sys.stderr)
return 0
if __name__ == "__main__":
sys.exit(main())