Labsco
firecrawl logo

session-logs

✓ Official3

by firecrawl · part of firecrawl/openclaw

Search and analyze your own session logs (older/parent conversations) using jq.

🔥🔥🔥✓ VerifiedFreeQuick setup
🧰 Not standalone. This skill ships with firecrawl/openclaw and only works together with that tool — install the tool first, then add this skill.

Search and analyze your own session logs (older/parent conversations) using jq.

Inspect the full instructions your agent will receiveExpand

This is the exact playbook injected into your agent when the skill activates — shown here so you can audit it before installing. You don't need to read it to use the skill.

by firecrawl

Search and analyze your own session logs (older/parent conversations) using jq. npx skills add https://github.com/firecrawl/openclaw --skill session-logs Download ZIPGitHub3

session-logs

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

Use this skill when the user asks about prior chats, parent conversations, or historical context that isn't in memory files.

Location

Session logs live at: ~/.openclaw/agents/<agentId>/sessions/ (use the agent=<id> value from the system prompt Runtime line).

  • sessions.json - Index mapping session keys to session IDs

  • <session-id>.jsonl - Full conversation transcript per session

Structure

Each .jsonl file contains messages with:

  • type: "session" (metadata) or "message"

  • timestamp: ISO timestamp

  • message.role: "user", "assistant", or "toolResult"

  • message.content[]: Text, thinking, or tool calls (filter type=="text" for human-readable content)

  • message.usage.cost.total: Cost per response

Common Queries

List all sessions by date and size

Copy & paste — that's it
for f in ~/.openclaw/agents/ /sessions/*.jsonl; do
 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

Copy & paste — that's it
for f in ~/.openclaw/agents/ /sessions/*.jsonl; do
 head -1 "$f" | jq -r '.timestamp' | grep -q "2026-01-06" && echo "$f"
done

Extract user messages from a session

Copy & paste — that's it
jq -r 'select(.message.role == "user") | .message.content[]? | select(.type == "text") | .text' .jsonl

Search for keyword in assistant responses

Copy & paste — that's it
jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' .jsonl | rg -i "keyword"

Get total cost for a session

Copy & paste — that's it
jq -s '[.[] | .message.usage.cost.total // 0] | add' .jsonl

Daily cost summary

Copy & paste — that's it
for f in ~/.openclaw/agents/ /sessions/*.jsonl; do
 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

Copy & paste — that's it
jq -s '{
 messages: length,
 user: [.[] | select(.message.role == "user")] | length,
 assistant: [.[] | select(.message.role == "assistant")] | length,
 first: .[0].timestamp,
 last: .[-1].timestamp
}' .jsonl

Tool usage breakdown

Copy & paste — that's it
jq -r '.message.content[]? | select(.type == "toolCall") | .name' .jsonl | sort | uniq -c | sort -rn

Search across ALL sessions for a phrase

Copy & paste — that's it
rg -l "phrase" ~/.openclaw/agents/ /sessions/*.jsonl

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

Fast text-only hint (low noise)

Copy & paste — that's it
jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' ~/.openclaw/agents/ /sessions/ .jsonl | rg 'keyword'