
Session Logs
Search prior OpenClaw agent session JSONL transcripts with jq when users reference older chats or missing context.
Overview
session-logs is a journey-wide agent skill that searches and analyzes your OpenClaw session JSONL history with jq—usable whenever a solo builder needs prior conversation facts before committing to new work.
Install
npx skills add https://github.com/steipete/clawdis --skill session-logsWhat is this skill?
- Searches complete conversation history in per-session JSONL transcripts
- Uses jq and ripgrep with install hints via Homebrew metadata
- Resolves sessions via sessions.json index and agent id from the runtime line
- Covers parent or older conversations not present in current memory files
- Documents message types, timestamps, and session metadata structure
- Requires jq and ripgrep (rg) binaries
- Session index at sessions.json plus per-session .jsonl transcripts
Adoption & trust: 2.2k installs on skills.sh; 378k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
The active agent window lacks older or parent-session context, so you cannot answer what was agreed or implemented in a previous chat.
Who is it for?
OpenClaw operators with multi-session agent workflows who need fast local search over JSONL logs.
Skip if: Teams without OpenClaw session layout, cloud-only chat products with no local JSONL export, or users unwilling to install jq and ripgrep.
When should I use this skill?
User asks about prior chats, parent conversations, or historical context not in memory files.
What do I get? / Deliverables
You locate the right session file, filter messages with jq/rg, and surface timestamps and content needed to continue work consistently.
- Filtered message excerpts with timestamps from target sessions
- Session id resolution from sessions.json
- Structured summary of findings from historical transcripts
Recommended Skills
Journey fit
Useful at every journey phase - explore requirements and options before committing to a direction.
Where it fits
Recover the implementation plan message from last Tuesday’s session before editing the same module.
Verify whether a security concern was already discussed in a parent conversation before merging.
Trace which debugging steps were already tried across multiple agent sessions.
Pull exact wording promised to early users from an older support-oriented agent chat.
Re-read scope decisions from a brainstorm session file instead of re-deriving requirements.
How it compares
Local session forensics on JSONL—not a hosted analytics dashboard or generic git blame.
Common Questions / FAQ
Who is session-logs for?
Solo builders and power users running OpenClaw agents who store conversations locally and need to query past sessions on demand.
When should I use session-logs?
During Build when resuming a feature thread from an old session; during Operate when tracing what fix was attempted; during Ship review when verifying prior security discussions; anytime the user cites a parent or older conversation.
Is session-logs safe to install?
Review the Security Audits panel on this Prism page; the skill reads local session files only but may expose sensitive prompts and secrets embedded in past chats—scope disk access carefully.
SKILL.md
READMESKILL.md - Session Logs
# 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 ```bash 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 ```bash 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 ```bash jq -r 'select(.message.role == "user") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl ``` ### Search for keyword in assistant responses ```bash jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl | rg -i "keyword" ``` ### Get total cost for a session ```bash jq -s '[.[] | .message.usage.cost.total // 0] | add' <session>.jsonl ``` ### Daily cost summary ```bash 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 ```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 ```bash jq -r '.message.content[]? | select(.type == "toolCall") | .name' <session>.jsonl | sort | uniq -c | sort -rn ``` ### Search across ALL sessions for a phrase ```bash 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 ch