Session Logs (YiHui)

v1.0.0

Search and analyze your own session logs (older/parent conversations) using jq.

0· 37·0 current·0 all-time
by辉哥@1yihui

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for 1yihui/yihui-session-logs.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "Session Logs (YiHui)" (1yihui/yihui-session-logs) from ClawHub.
Skill page: https://clawhub.ai/1yihui/yihui-session-logs
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Required binaries: jq, rg
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install yihui-session-logs

ClawHub CLI

Package manager switcher

npx clawhub@latest install yihui-session-logs
Security Scan
VirusTotalVirusTotal
Pending
View report →
OpenClawOpenClaw
Benign
medium confidence
Purpose & Capability
Name/description match the requested binaries (jq, rg) and the SKILL.md contains concrete jq/rg commands for searching session JSONL files under the agent state directory; installing jq and ripgrep via brew is proportional to the task.
!
Instruction Scope
The instructions explicitly read session files under $OPENCLAW_STATE_DIR/agents/<agentId>/sessions and use the agent id from the runtime system prompt. This is in-scope for a session-log searcher, but the SKILL.md references the OPENCLAW_STATE_DIR environment variable (and the Runtime agent=<id> value) without declaring them in the skill manifest — a minor mismatch that should be documented. Also, reading those files will surface potentially sensitive past conversation content.
Install Mechanism
Install spec uses Homebrew formulas for jq and ripgrep (ripgrep provides rg). These are well-known package sources and appropriate for a CLI-focused, instruction-only skill; no arbitrary downloads or extract operations are present.
Credentials
The skill does not request credentials or config paths, which is appropriate. However it relies on OPENCLAW_STATE_DIR (not declared) and on filesystem access to the agent's sessions directory; while expected for its purpose, that access exposes private conversation history and should be considered sensitive.
Persistence & Privilege
always:false and no requests to modify other skills or system-wide configuration. The skill does not require persistent privileges beyond reading local session files and installing optional binaries.
Assessment
This skill appears to do what it says: it runs jq and rg on your local OpenClaw session JSONL files. Before installing or invoking it, confirm you are comfortable with it reading conversation history in $OPENCLAW_STATE_DIR (default ~/.openclaw). Note the SKILL.md references OPENCLAW_STATE_DIR but the manifest doesn't declare that env var — nothing malicious, but double-check the path it will read. Installing will add jq and ripgrep via brew. If your sessions contain sensitive data you don't want accessible, either don't install the skill or run the provided commands manually in a controlled shell instead of granting the agent autonomous access.

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

📜 Clawdis
Binsjq, rg

Install

Install jq (brew)
Bins: jq
brew install jq
Install ripgrep (brew)
Bins: rg
brew install ripgrep
latestvk9756xq29wzgm5ybm888f3tqk985pwc0
37downloads
0stars
1versions
Updated 12h ago
v1.0.0
MIT-0

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'

Comments

Loading comments...