session-logs
Searches and analyzes conversation history using jq and ripgrep.
Install
mkdir -p .claude/skills/session-logs && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/618" && unzip -o skill.zip -d .claude/skills/session-logs && rm skill.zipInstalls to .claude/skills/session-logs
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Search and analyze your own session logs (older/parent conversations) using jq.Key capabilities
- →Search and filter historical session logs
- →Extract user messages from past conversations
- →Calculate total costs per session
- →Analyze tool usage patterns
- →Include archived reset or deleted transcripts
How it works
The skill uses jq and ripgrep to parse and query JSONL files located in the agent's state directory, including active, reset, and deleted session transcripts.
Inputs & outputs
When to use session-logs
- →Find what was discussed in a previous session
- →Analyze historical conversation usage data
- →Recall context from parent sessions
About this skill
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<session-id>.jsonl.reset.<timestamp>Z- Transcript archived by/newor/reset<session-id>.jsonl.deleted.<timestamp>Z- Transcript archived when a session was deleted
When searching history, include the archived (.reset.*, .deleted.*) variants too — they
still contain real conversation content. The plain-glob examples below only catch the
active *.jsonl files; use the "Include archived transcripts" snippet when you need
full recall.
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
Include archived transcripts (.reset.*, .deleted.*)
# Bash helper that emits every searchable transcript path — active and archived.
# Saves and restores `nullglob` locally so callers' shell options aren't disturbed.
AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
list_session_transcripts() {
local _nullglob_state
_nullglob_state=$(shopt -p nullglob 2>/dev/null)
shopt -s nullglob
for f in "$SESSION_DIR"/*.jsonl \
"$SESSION_DIR"/*.jsonl.reset.*Z \
"$SESSION_DIR"/*.jsonl.deleted.*Z; do
[ -f "$f" ] && printf '%s\n' "$f"
done
eval "$_nullglob_state"
}
Use list_session_transcripts (or an equivalent find invocation) wherever the
plain *.jsonl glob is shown below if you need to include archived sessions:
find "$SESSION_DIR" -maxdepth 1 -type f \
\( -name '*.jsonl' -o -name '*.jsonl.reset.*Z' -o -name '*.jsonl.deleted.*Z' \) -print
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
Tip: swap the for f in ... line for a while-read over
list_session_transcripts (see snippet above) when you also want archived
.reset / .deleted files in the listing. The while-read pattern is safe
for paths with spaces or other IFS characters:
while IFS= read -r f; do
date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
size=$(ls -lh "$f" | awk '{print $5}')
echo "$date $size $(basename "$f")"
done < <(list_session_transcripts) | 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"
# Active sessions only:
rg -l "phrase" "$SESSION_DIR"/*.jsonl
# Active + archived (`.reset.*`, `.deleted.*`) — use this when checking for
# content that may have been compacted/reset/deleted:
rg -l "phrase" "$SESSION_DIR"/*.jsonl \
"$SESSION_DIR"/*.jsonl.reset.*Z \
"$SESSION_DIR"/*.jsonl.deleted.*Z 2>/dev/null
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 - Reset/compacted sessions have
.jsonl.reset.<timestamp>Zsuffix — still contain full transcripts and are searchable. - Deleted sessions have
.jsonl.deleted.<timestamp>Zsuffix — also still searchable. - A plain
*.jsonlglob will miss both archived forms. Include them explicitly (see the "Include archived transcripts" snippet above) when you need full history.
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'
When not to use it
- →When the information is available in current memory
Prerequisites
Limitations
- →Requires jq and ripgrep CLI tools
- →Performance may vary with very large session files
How it compares
It enables programmatic access to the full history of interactions, including archived data, which is not accessible through standard chat memory.
Compared to similar skills
session-logs side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| session-logs (this skill) | 8 | 2mo | Review | Intermediate |
| context-management-context-restore | 10 | 4mo | Review | Advanced |
| conversation-memory | 8 | 6mo | No flags | Advanced |
| zlibrary-to-notebooklm | 6 | 7mo | Review | Beginner |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by openclaw
View all by openclaw →You might also like
context-management-context-restore
sickn33
Use when working with context management context restore
conversation-memory
davila7
Persistent memory systems for LLM conversations including short-term, long-term, and entity-based memory Use when: conversation memory, remember, memory persistence, long-term memory, chat history.
zlibrary-to-notebooklm
zstmfhy
自动从 Z-Library 下载书籍并上传到 Google NotebookLM。支持 PDF/EPUB 格式,自动转换,一键创建知识库。
workiq-copilot
github
Guides the Copilot CLI on how to use the WorkIQ CLI/MCP server to query Microsoft 365 Copilot data (emails, meetings, docs, Teams, people) for live context, summaries, and recommendations.
compound-learnings
parcadei
Transform session learnings into permanent capabilities (skills, rules, agents). Use when asked to "improve setup", "learn from sessions", "compound learnings", or "what patterns should become skills".
anachb
mitsuhiko
Austrian public transport (VOR AnachB) for all of Austria. Query real-time departures, search stations/stops, plan routes between locations, and check service disruptions. Use when asking about Austrian trains, buses, trams, metro (U-Bahn), or directions involving public transport in Austria.