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- jq (JSON query tool)
- ripgrep (rg) for fast text search
- Access to $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/ directory
How to use session-logs
- 1.Identify your agent ID from the system prompt Runtime line
- 2.Set SESSION_DIR to $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/ (defaults to ~/.openclaw/agents/<agentId>/sessions/)
- 3.Use jq to parse JSONL files and filter by message.role, message.content type, or timestamp
- 4.Combine jq with rg for keyword searches across sessions
- 5.Run provided queries to extract costs, message counts, tool usage, or specific text
Use cases
- 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
- 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
Under $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/ (default: ~/.openclaw/agents/<agentId>/sessions/). Each session is a .jsonl file with one JSON object per line.
Use the provided loop to iterate .jsonl files and grep timestamps, or use jq to filter by timestamp range within a session file.
Yes, use `rg -l "phrase" $SESSION_DIR/*.jsonl` to find which session files contain a phrase, then inspect those files.
Each message includes type (user/assistant/toolResult), timestamp, role, content array (text/thinking/toolCall), and usage cost.
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 timestampmessage.role: "user", "assistant", or "toolResult"message.content[]: Text, thinking, or tool calls (filtertype=="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/tailfor sampling - The
sessions.jsonindex 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'
Related skills
More from steipete/clawdis and the wider catalog.

sherpa-onnx-tts
Offline text-to-speech using sherpa-onnx—no cloud, runs locally on macOS, Linux, and Windows.

skill-creator
Create, edit, audit, tidy, validate, or restructure AgentSkills and SKILL.md files.

slack
Send, read, edit, delete, and react to Slack messages with full channel and member management.

songsee
Generate spectrograms and multi-panel audio visualizations from MP3, WAV, and other formats.

sonoscli
Control Sonos speakers on your local network—discover, play, pause, adjust volume, and group speakers.

spotify-player
Terminal Spotify playback and search via spogo or spotify_player.