home / skills / openclaw / openclaw / session-logs

session-logs skill

/skills/session-logs

This skill helps you locate and analyze prior conversations in session logs using jq to provide historical context.

This is most likely a fork of the session-logs skill from openclaw
npx playbooks add skill openclaw/openclaw --skill session-logs

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
3.3 KB
---
name: session-logs
description: Search and analyze your own session logs (older/parent conversations) using jq.
metadata: { "openclaw": { "emoji": "📜", "requires": { "bins": ["jq", "rg"] } } }
---

# 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

```bash
for f in ~/.openclaw/agents/<agentId>/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

```bash
for f in ~/.openclaw/agents/<agentId>/sessions/*.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
for f in ~/.openclaw/agents/<agentId>/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

```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
rg -l "phrase" ~/.openclaw/agents/<agentId>/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)

```bash
jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' ~/.openclaw/agents/<agentId>/sessions/<id>.jsonl | rg 'keyword'
```

Overview

This skill lets you search and analyze your complete conversation history stored as session JSONL files. It’s designed for retrieving prior chat context, auditing assistant behavior, and computing usage metrics. The tool works with standard jq and ripgrep commands so you can run fast, reproducible queries on any platform.

How this skill works

Session logs live under ~/.openclaw/agents/<agentId>/sessions/ as an index file and per-session .jsonl transcripts. Each line is a JSON object with metadata and message entries; human-readable text is in message.content[] items with type=="text". Use jq to filter roles, extract text, compute costs, and aggregate counts; use ripgrep (rg) or shell loops to search across many sessions.

When to use it

  • A user references an older or parent conversation that isn’t in current memory.
  • You need to verify what the assistant said in a past session.
  • Audit or compute costs for a past session or day.
  • Search across all chats for a phrase or tool usage pattern.
  • Recover or sample long conversations stored as JSONL.

Best practices

  • Filter message.content[] by type=="text" to avoid tool-call noise.
  • Use head/tail on large .jsonl files to sample before full processing.
  • Aggregate costs with jq -s to avoid floating-point surprises.
  • Map agentId from the runtime/system prompt to find the correct sessions folder.
  • Respect deleted session suffixes (.deleted.<timestamp>) when listing history.

Example use cases

  • List all sessions sorted by date and size to find recent long chats.
  • Extract only user messages from a session to see user intent evolution.
  • Search assistant responses for a keyword to reproduce instructions given earlier.
  • Calculate total spending per session or produce a daily cost summary.
  • Count messages and roles in a session to produce a quick activity report.

FAQ

Where are session files located?

They are under ~/.openclaw/agents/<agentId>/sessions/, with sessions.json as the index and <session-id>.jsonl for each transcript.

How do I get readable text from a .jsonl file?

Use jq to select messages and filter message.content[] by type=="text", then print the .text field.