2026-01-07 04:13:23 +00:00
---
name: session-logs
2026-01-19 05:27:45 +00:00
description: Search and analyze your own session logs (older/parent conversations) using jq.
2026-01-31 21:21:09 +09:00
metadata: { "openclaw": { "emoji": "📜", "requires": { "bins": ["jq", "rg"] } } }
2026-01-07 04:13:23 +00:00
---
# session-logs
2026-01-19 05:27:45 +00:00
Search your complete conversation history stored in session JSONL files. Use this when a user references older/parent conversations or asks what was said before.
## Trigger
2026-02-01 13:42:28 -04:00
Use this skill when the user asks about prior chats, parent conversations, or historical context that isn't in memory files.
2026-01-07 04:13:23 +00:00
## Location
2026-01-30 21:01:02 +01:00
Session logs live at: `~/.openclaw/agents/<agentId>/sessions/` (use the `agent=<id>` value from the system prompt Runtime line).
2026-01-07 04:13:23 +00:00
- **`sessions.json` ** - Index mapping session keys to session IDs
- **`<session-id>.jsonl` ** - Full conversation transcript per session
## Structure
Each `.jsonl` file contains messages with:
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
- `type` : "session" (metadata) or "message"
- `timestamp` : ISO timestamp
- `message.role` : "user", "assistant", or "toolResult"
2026-01-19 05:27:45 +00:00
- `message.content[]` : Text, thinking, or tool calls (filter `type=="text"` for human-readable content)
2026-01-07 04:13:23 +00:00
- `message.usage.cost.total` : Cost per response
## Common Queries
### List all sessions by date and size
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
```bash
2026-01-30 21:01:02 +01:00
for f in ~/.openclaw/agents/< agentId > /sessions/*.jsonl; do
2026-01-07 04:13:23 +00:00
date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
size=$(ls -lh "$f" | awk '{print $5}')
echo "$date $size $(basename $f)"
done | sort -r
```
### Find sessions from a specific day
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
```bash
2026-01-30 21:01:02 +01:00
for f in ~/.openclaw/agents/< agentId > /sessions/*.jsonl; do
2026-01-07 04:13:23 +00:00
head -1 "$f" | jq -r '.timestamp' | grep -q "2026-01-06" & & echo "$f"
done
```
### Extract user messages from a session
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
```bash
2026-01-19 05:27:45 +00:00
jq -r 'select(.message.role == "user") | .message.content[]? | select(.type == "text") | .text' < session > .jsonl
2026-01-07 04:13:23 +00:00
```
### Search for keyword in assistant responses
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
```bash
2026-01-19 05:27:45 +00:00
jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' < session > .jsonl | rg -i "keyword"
2026-01-07 04:13:23 +00:00
```
### Get total cost for a session
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
```bash
jq -s '[.[] | .message.usage.cost.total // 0] | add' < session > .jsonl
```
### Daily cost summary
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
```bash
2026-01-30 21:01:02 +01:00
for f in ~/.openclaw/agents/< agentId > /sessions/*.jsonl; do
2026-01-07 04:13:23 +00:00
date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
cost=$(jq -s '[.[] | .message.usage.cost.total // 0] | add' "$f")
echo "$date $cost"
done | awk '{a[$1]+=$2} END {for(d in a) print d, "$"a[d]}' | sort -r
```
### Count messages and tokens in a session
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
```bash
jq -s '{
messages: length,
user: [.[] | select(.message.role == "user")] | length,
assistant: [.[] | select(.message.role == "assistant")] | length,
first: .[0].timestamp,
last: .[-1].timestamp
}' < session > .jsonl
```
### Tool usage breakdown
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
```bash
jq -r '.message.content[]? | select(.type == "toolCall") | .name' < session > .jsonl | sort | uniq -c | sort -rn
```
### Search across ALL sessions for a phrase
2026-01-31 21:21:09 +09:00
2026-01-07 04:13:23 +00:00
```bash
2026-01-30 21:01:02 +01:00
rg -l "phrase" ~/.openclaw/agents/< agentId > /sessions/*.jsonl
2026-01-07 04:13:23 +00:00
```
## Tips
- Sessions are append-only JSONL (one JSON object per line)
- Large sessions can be several MB - use `head` /`tail` for sampling
- The `sessions.json` index maps chat providers (discord, whatsapp, etc.) to session IDs
- Deleted sessions have `.deleted.<timestamp>` suffix
2026-01-19 05:27:45 +00:00
## Fast text-only hint (low noise)
```bash
2026-01-30 21:01:02 +01:00
jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' ~/.openclaw/agents/< agentId > /sessions/< id > .jsonl | rg 'keyword'
2026-01-19 05:27:45 +00:00
```