PluginBench
Skill
Fail
Audit score 45

session-logs

steipete/clawdis

Search and analyze your conversation history using jq and ripgrep.

What is session-logs?

Access your complete session logs stored as JSONL files to search older conversations, find historical context, and analyze message patterns. Use this when users reference prior chats or ask about what was discussed before.

  • Search across all session logs for keywords and phrases
  • Extract user messages, assistant responses, or tool usage from specific sessions
  • Calculate total cost and token usage per session or across days
  • List sessions by date and size to locate specific conversations
  • Analyze message counts, timestamps, and conversation metadata
  • Filter by message type (text, tool calls, thinking) for targeted queries

How to install session-logs

npx skills add https://github.com/steipete/clawdis --skill session-logs
Prerequisites
  • jq (JSON query tool)
  • ripgrep (rg) for fast text search
  • Access to $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/ directory
Claude Code
Cursor
Windsurf
Cline

How to use session-logs

  1. 1.Identify your agent ID from the system prompt Runtime line
  2. 2.Set SESSION_DIR to $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/ (defaults to ~/.openclaw/agents/<agentId>/sessions/)
  3. 3.Use jq to parse JSONL files and filter by message.role, message.content type, or timestamp
  4. 4.Combine jq with rg for keyword searches across sessions
  5. 5.Run provided queries to extract costs, message counts, tool usage, or specific text

Use cases

Good for
  • User asks 'what did we discuss about X last week?' - search session logs for the phrase
  • Find all sessions from a specific date to understand conversation volume
  • Calculate daily or weekly API costs from session usage data
  • Identify which tools were used most frequently across conversations
  • Extract a transcript of user messages from a particular session for review
Who it's for
  • Developers debugging agent behavior across multiple conversations
  • Users reviewing their conversation history and context
  • Teams analyzing usage patterns and API costs
  • Anyone needing to search or audit prior chat sessions

session-logs FAQ

Where are session logs stored?

Under $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/ (default: ~/.openclaw/agents/<agentId>/sessions/). Each session is a .jsonl file with one JSON object per line.

How do I find a conversation from a specific date?

Use the provided loop to iterate .jsonl files and grep timestamps, or use jq to filter by timestamp range within a session file.

Can I search across all sessions at once?

Yes, use `rg -l "phrase" $SESSION_DIR/*.jsonl` to find which session files contain a phrase, then inspect those files.

What information is available per message?

Each message includes type (user/assistant/toolResult), timestamp, role, content array (text/thinking/toolCall), and usage cost.

How do I calculate costs for a time period?

Extract timestamps and usage.cost.total from each session, then group by date using awk or similar tools.

Full instructions (SKILL.md)

Source of truth, from steipete/clawdis.


name: session-logs description: "Search and analyze your own session logs (older/parent conversations) using jq." metadata: { "openclaw": { "emoji": "📜", "requires": { "bins": ["jq", "rg"] }, "install": [ { "id": "brew-jq", "kind": "brew", "formula": "jq", "bins": ["jq"], "label": "Install jq (brew)", }, { "id": "brew-rg", "kind": "brew", "formula": "ripgrep", "bins": ["rg"], "label": "Install ripgrep (brew)", }, ], }, }

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 under the active state directory: $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/ (default: ~/.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

AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
for f in "$SESSION_DIR"/*.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

AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
for f in "$SESSION_DIR"/*.jsonl; do
  head -1 "$f" | jq -r '.timestamp' | grep -q "2026-01-06" && echo "$f"
done

Extract user messages from a session

jq -r 'select(.message.role == "user") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl

Search for keyword in assistant responses

jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl | rg -i "keyword"

Get total cost for a session

jq -s '[.[] | .message.usage.cost.total // 0] | add' <session>.jsonl

Daily cost summary

AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
for f in "$SESSION_DIR"/*.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

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

jq -r '.message.content[]? | select(.type == "toolCall") | .name' <session>.jsonl | sort | uniq -c | sort -rn

Search across ALL sessions for a phrase

AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
rg -l "phrase" "$SESSION_DIR"/*.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)

AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' "$SESSION_DIR"/<id>.jsonl | rg 'keyword'