mcpField
S
session-logs

session-logs

github.com/openclawAgent 工作流393.3k5.0k 次安装今天更新
代码仓库

关于 session-logs

session-logs 是一项用于搜索 OpenClaw 会话 JSONL 文件的技能,适合需要查找旧对话或历史上下文的场景。它提供按日期、关键词、角色及会话统计信息检索的命令示例,并提示纳入归档记录。

主要功能

  1. 01搜索会话历史记录
  2. 02检索重置或删除的归档记录
  3. 03提取用户或助手消息
  4. 04统计会话消息与费用

适用场景

  1. 01查找以前对话中的内容
  2. 02按日期筛选会话
  3. 03搜索助手回复中的关键词
  4. 04汇总会话费用和消息数

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/openclaw/openclaw --skill session-logs

安装后在 Claude Code 中输入/session-logs确认已加载。

详细介绍

session-logs

搜索存储在会话 JSONL 文件中的完整对话历史。当用户提及较早的/父级对话,或询问之前说了什么时,使用此技能。

触发条件

当用户询问先前的聊天、父级对话或记忆文件中没有的历史上下文时,使用此技能。

位置

会话日志位于活动状态目录下: $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/(默认:~/.openclaw/agents/<agentId>/sessions/)。 使用系统提示词 Runtime 行中的 agent=<id> 值。

  • sessions.json——将会话键映射到会话 ID 的索引
  • <session-id>.jsonl——每个会话的完整对话记录
  • <session-id>.jsonl.reset.<timestamp>Z——由 /new 或 /reset 归档的对话记录
  • <session-id>.jsonl.deleted.<timestamp>Z——会话删除时归档的对话记录

搜索历史记录时,也要包含归档的(.reset.*、.deleted.*)变体,因为它们 仍包含实际对话内容。下面的普通 glob 示例只能匹配 活动 *.jsonl 文件;需要 完整回溯时,请使用上面的“包含归档记录”代码片段。

结构

每个 .jsonl 文件都包含以下消息字段:

  • type: "session"(元数据)或 "message"
  • timestamp:ISO 时间戳
  • message.role:"user"、"assistant" 或 "toolResult"
  • message.content[]:文本、思考或工具调用(筛选 type=="text" 以获取可供人阅读的内容)
  • message.usage.cost.total:每次响应的成本

常见查询

包含归档记录(.reset.*、.deleted.*)
# Bash helper that emits every searchable transcript path — active and archived.
# Saves and restores `nullglob` locally so callers' shell options aren't disturbed.
AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
list_session_transcripts() {
  local _nullglob_state
  _nullglob_state=$(shopt -p nullglob 2>/dev/null)
  shopt -s nullglob
  for f in "$SESSION_DIR"/*.jsonl \
           "$SESSION_DIR"/*.jsonl.reset.*Z \
           "$SESSION_DIR"/*.jsonl.deleted.*Z; do
    [ -f "$f" ] && printf '%s\n' "$f"
  done
  eval "$_nullglob_state"
}

如果需要包含归档会话,请在下面所有使用普通 *.jsonl glob 的位置使用 list_session_transcripts(或等效的 find 调用):

find "$SESSION_DIR" -maxdepth 1 -type f \
  \( -name '*.jsonl' -o -name '*.jsonl.reset.*Z' -o -name '*.jsonl.deleted.*Z' \) -print
按日期和大小列出所有会话
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

提示: 如果还想将归档的 .reset / .deleted 文件纳入列表,请将 for f in ... 行替换为基于 list_session_transcripts 的 while 读取操作(见上方代码片段)。这种 while 读取模式可安全处理 含空格或其他 IFS 字符的路径:

while IFS= read -r f; do
  date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
  size=$(ls -lh "$f" | awk '{print $5}')
  echo "$date $size $(basename "$f")"
done < <(list_session_transcripts) | sort -r
查找特定日期的会话
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
从会话中提取用户消息
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
每日成本汇总
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
统计会话中的消息和词元数
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
在所有会话中搜索短语
AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"

# Active sessions only:
rg -l "phrase" "$SESSION_DIR"/*.jsonl

# Active + archived (`.reset.*`, `.deleted.*`) — use this when checking for
# content that may have been compacted/reset/deleted:
rg -l "phrase" "$SESSION_DIR"/*.jsonl \
               "$SESSION_DIR"/*.jsonl.reset.*Z \
               "$SESSION_DIR"/*.jsonl.deleted.*Z 2>/dev/null

提示

  • 会话记录采用仅追加的 JSONL 格式(每行一个 JSON 对象)
  • 大型会话可能达到数 MB——使用 head/tail 抽样查看
  • sessions.json 索引将聊天提供商(discord、whatsapp 等)映射到会话 ID
  • 已重置/已压缩的会话具有 .jsonl.reset.<timestamp>Z 后缀——仍包含 完整对话记录,可以搜索
  • 已删除的会话具有 .jsonl.deleted.<timestamp>Z 后缀——也仍可搜索
  • 普通 *.jsonl glob 会_漏掉_这两种归档形式。请显式包含它们 (见上面的“包含归档记录”代码片段),以获取完整历史记录。

快速纯文本提示(低噪声)

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'

评论

支持 Markdown