一键导入
session-logs
Search and analyze your own session logs (older/parent conversations) using jq.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Search and analyze your own session logs (older/parent conversations) using jq.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use when the user asks to use a consumer integration that is not set up yet: WhatsApp as Me, Email, Google Workspace, Apple Notes, Apple Reminders, Telegram as Me, Google Maps Search, or creative audio. Route here only when the right integration exists but is blocked by missing login, OAuth, QR pairing, permissions, local dependency setup, configuration, or API credentials, and the response should guide setup in product language instead of dumping CLI commands.
Use for Google Workspace requests tied to Gmail, Google Calendar, Drive, Docs, Sheets, or Contacts, especially when the user explicitly mentions Google or needs cross-surface Google account access. Prefer this over generic email skills when the task is clearly in the Google ecosystem.
Use when the user asks to triage messages, emails, chats, inboxes, unread messages, recent messages, open replies, who they owe replies to, outreach, or reply drafting across one or more channels such as WhatsApp, Telegram, Gmail/email, Slack, Signal, iMessage, browser portals, or files. For broad sweeps, first produce a scoped prioritized triage list; for one known target, use single-thread draft mode. Always require user approval before any external reply/send.
Use for generic email tasks on connected mail accounts: search, read, summarize, draft, reply, forward, send, and organize email over IMAP/SMTP. This is the better match for normal mailbox work that is not specifically a Gmail or Google Workspace request.
Use for Telegram-as-me requests on this Mac: reading, sending, replying, or waiting as the user's real Telegram account. Do not use it for the normal Telegram bot channel, BotFather setup, or generic bot onboarding.
Send WhatsApp messages to other people or search/sync WhatsApp history via the wacli CLI (not for normal user chats).
| name | session-logs |
| description | Search and analyze your own session logs (older/parent conversations) using jq. |
| metadata | {"openclaw":{"emoji":"📜","requires":{"bins":["jq","rg"]}}} |
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.
Use this skill when the user asks about prior chats, parent conversations, or historical context that isn't in memory files.
Session logs live under the active state directory: $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/ (use the agent=<id> value from the system prompt Runtime line). If $OPENCLAW_STATE_DIR is not set, source/dev OpenClaw defaults to ~/.openclaw.
sessions.json - Index mapping session keys to session IDs<session-id>.jsonl - Full conversation transcript per sessionEach .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 (filter type=="text" for human-readable content)message.usage.cost.total: Cost per responsefor f in "${OPENCLAW_STATE_DIR:-$HOME/.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
for f in "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"/agents/<agentId>/sessions/*.jsonl; do
head -1 "$f" | jq -r '.timestamp' | grep -q "2026-01-06" && echo "$f"
done
jq -r 'select(.message.role == "user") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl
jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl | rg -i "keyword"
jq -s '[.[] | .message.usage.cost.total // 0] | add' <session>.jsonl
for f in "${OPENCLAW_STATE_DIR:-$HOME/.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
jq -s '{
messages: length,
user: [.[] | select(.message.role == "user")] | length,
assistant: [.[] | select(.message.role == "assistant")] | length,
first: .[0].timestamp,
last: .[-1].timestamp
}' <session>.jsonl
jq -r '.message.content[]? | select(.type == "toolCall") | .name' <session>.jsonl | sort | uniq -c | sort -rn
rg -l "phrase" "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"/agents/<agentId>/sessions/*.jsonl
head/tail for samplingsessions.json index maps chat providers (discord, whatsapp, etc.) to session IDs.deleted.<timestamp> suffixjq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"/agents/<agentId>/sessions/<id>.jsonl | rg 'keyword'