commit 1fbde91d4f65907a1a79460907c8400bd10984d5 Author: zlei9 Date: Sun Mar 29 09:45:22 2026 +0800 Initial commit with translated description diff --git a/SKILL.md b/SKILL.md new file mode 100644 index 0000000..485ef3f --- /dev/null +++ b/SKILL.md @@ -0,0 +1,105 @@ +--- +name: session-logs +description: "使用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: `~/.clawdbot/agents//sessions/` (use the `agent=` value from the system prompt Runtime line). + +- **`sessions.json`** - Index mapping session keys to session IDs +- **`.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 ~/.clawdbot/agents//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 ~/.clawdbot/agents//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' .jsonl +``` + +### Search for keyword in assistant responses +```bash +jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' .jsonl | rg -i "keyword" +``` + +### Get total cost for a session +```bash +jq -s '[.[] | .message.usage.cost.total // 0] | add' .jsonl +``` + +### Daily cost summary +```bash +for f in ~/.clawdbot/agents//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 +}' .jsonl +``` + +### Tool usage breakdown +```bash +jq -r '.message.content[]? | select(.type == "toolCall") | .name' .jsonl | sort | uniq -c | sort -rn +``` + +### Search across ALL sessions for a phrase +```bash +rg -l "phrase" ~/.clawdbot/agents//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.` suffix + +## Fast text-only hint (low noise) + +```bash +jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' ~/.clawdbot/agents//sessions/.jsonl | rg 'keyword' +``` diff --git a/_meta.json b/_meta.json new file mode 100644 index 0000000..30fea5d --- /dev/null +++ b/_meta.json @@ -0,0 +1,6 @@ +{ + "ownerId": "kn7e8qx3t885vqaya3vk3q7z0180fxd2", + "slug": "session-logs", + "version": "1.0.0", + "publishedAt": 1770136427000 +} \ No newline at end of file