Install
openclaw skills install @liuxiaolong1988/lingxi-memory自动记忆提炼 & 写入飞书知识库。定时扫描 OpenClaw 会话文件,自动提炼有价值的记忆,写入飞书多维表格/云文档知识库。
openclaw skills install @liuxiaolong1988/lingxi-memory本技能的正常工作需要:
如果你不希望会话内容被 AI 处理,或者不希望数据存储到飞书,请不要安装。
灵曦自动记忆系统,定时扫描 OpenClaw 会话文件,自动提炼有价值的记忆,写入飞书多维表格/云文档知识库。
v5 新架构:一次完成,省去队列,bash 调用 agent,agent 直接提炼 + 写入 + 通知,更简洁更实时!
.jsonl / .jsonl.reset.* / .jsonl.deleted.* 所有会话格式【阶段 1:定时触发】
│
├─▶ crontab
│ ├─ 白天(8:00-22:00):每 1 分钟
│ └─ 夜间(22:00-次日8:00):每 5 分钟
│
【阶段 2:会话检查】
│
├─▶ session_check.sh
│ │
│ ├─ 1. 获取进程锁(/tmp/session_check.lock)
│ │
│ ├─ 2. 读取 sessions.json
│ │
│ ├─ 3. 获取活跃会话
│ │ ├─ 只保留最近 24 小时内更新的
│ │ └─ 排除 key 为 "agent:main:main" 的 heartbeat 会话(活跃列表层面排除)
│ │
│ ├─ 4. 遍历所有会话文件
│ │ ├─ .jsonl
│ │ ├─ .jsonl.reset.*
│ │ └─ .jsonl.deleted.*
│ │
│ ├─ 5. 对每个会话:
│ │ │
│ │ ├─ a. 文件存在?
│ │ │ └─ 否 → 下一个
│ │ │
│ │ ├─ b. 已处理过?(/tmp/processed_sessions.tmp)
│ │ │ └─ 是 → 下一个
│ │ │
│ │ ├─ c. 是 heartbeat 会话?
│ │ │ ├─ 判断逻辑:
│ │ │ │ 1. 从 sessions.json 读取 agent:main:main 的 sessionFile
│ │ │ │ 2. 从 sessionFile 中提取 session_id
│ │ │ │ 3. 如果当前文件的 session_id == heartbeat 会话的 session_id → 跳过
│ │ │ └─ 是 → 跳过,下一个
│ │ │ └─ 否 → 继续
│ │ │
│ │ ├─ d. 是活跃会话?
│ │ │ └─ 是 → 下一个
│ │ │
│ │ ├─ e. 已提炼过?(memory/.extracted_sessions)
│ │ │ └─ 是 → 下一个
│ │ │
│ │ └─ f. 发现未提炼会话!
│ │ │
│ │ ├─ 发送通知:"发现未提炼会话: <session_id>,正在处理..."
│ │ │
│ │ ├─ 调用 do_extract_and_write.sh <会话文件路径>
│ │ │
│ │ └─ 检查结果:
│ │ ├─ 成功(退出码 0)→ 标记为已提炼
│ │ └─ 失败(退出码非 0)→ 不标记,下次重试
│ │
│ └─ 6. 释放进程锁
│
【阶段 3:AI 提炼 + 写入(一次完成)】
│
├─▶ do_extract_and_write.sh
│ │
│ ├─ 1. 完整读取会话文件(无行数限制)
│ │
│ ├─ 2. 统计用户消息数和内容长度
│ │ ├─ 支持 .message.role
│ │ └─ 支持 .message.content[0].text(数组和字符串两种格式)
│ │
│ ├─ 3. 过滤条件检查
│ │ ├─ 用户消息数 ≥ 1
│ │ └─ 内容长度 ≥ 20
│ │
│ ├─ 4. 过滤通过?
│ │ ├─ 否 → 发送通知(CLI)→ 标记为已提炼 → 返回 0
│ │ └─ 是 → 继续
│ │
│ ├─ 5. 准备 AI 提炼 prompt(占位符替换,解决多行引号问题)
│ │
│ ├─ 6. 调用 openclaw agent 进行 AI 提炼(后台运行,最多等待 300 秒 = 5 分钟)
│ │
│ ├─ 7. 检查 AI 调用结果:
│ │ ├─ a. 超时?(> 300 秒)
│ │ │ └─ 是 → 发送通知(CLI)→ "❌ 会话 <SESSION_ID> 提炼失败:AI调用超时(300秒)" → 退出 1
│ │ ├─ b. 退出码非 0?
│ │ │ └─ 是 → 发送通知(CLI)→ "❌ 会话 <SESSION_ID> 提炼失败:AI调用失败(退出码:<code>)" → 退出 1
│ │ ├─ c. 输出为空?
│ │ │ └─ 是 → 发送通知(CLI)→ "❌ 会话 <SESSION_ID> 提炼失败:AI返回为空" → 退出 2
│ │ ├─ d. 输出包含 "DONE" → AI 已完成所有写入 → 标记为已提炼 → 退出 0
│ │ ├─ 不包含 "DONE" 但包含错误 → 发送通知(CLI)→ "❌ 会话 <SESSION_ID> 提炼失败:AI返回错误信息" → 退出 1
│ │ └─ 不包含 "DONE" 也不包含错误 → 发送通知(CLI)→ "❌ 会话 <SESSION_ID> 提炼失败:AI 没有完成写入" → 退出 3
│ │
│ └─ 完成,返回 0
│
【阶段 4:完成】
│
└─▶ 结束,agent 已经完成所有提炼 + 写入 + 通知
skill/lingxi-memory/
├── SKILL.md # 这个文件
├── session_check.sh # 会话检查脚本
└── do_extract_and_write.sh # AI 提炼 + 写入脚本
你必须在 workspace/.env 文件中配置以下环境变量,否则脚本无法运行:
# 你的飞书 open_id(必填,用于接收通知)
export FEISHU_USER_OPEN_ID="ou_xxxxxxxxxxxxxxxxxx"
# L2 任务看板:飞书多维表格 app_token(必填)
export L2_APP_TOKEN="your_l2_app_token"
# L2 任务看板:数据表 ID(必填)
export L2_TABLE_ID="your_l2_table_id"
# L3 项目日志:飞书云文档 doc_id(必填)
export L3_DOC_ID="your_l3_doc_id"
# L4 知识沉淀:飞书云文档 doc_id(必填)
export L4_DOC_ID="your_l4_doc_id"
# 可选配置:OpenClaw 会话目录(默认:/root/.openclaw/agents/main/sessions)
# export SESSIONS_DIR="/path/to/your/sessions"
# 可选配置:通知目标(默认:user:$FEISHU_USER_OPEN_ID)
# export NOTIFY_TARGET="user:ou_xxxxxxxxxxxxxxxxxx"
重要安全提示:
| 场景 | 通知内容 | 发起方 |
|---|---|---|
| 发现未提炼会话 | 发现未提炼会话: <session_id>,正在处理... | session_check.sh (bash) |
| 会话文件不存在 | ❌ 会话 <SESSION_ID> 提炼失败:文件不存在 | do_extract_and_write.sh (bash) |
| 过滤跳过 | ℹ️ 会话 <SESSION_ID> 过滤跳过:<原因> | do_extract_and_write.sh (bash) |
| AI 调用超时 | ❌ 会话 <SESSION_ID> 提炼失败:AI调用超时(300秒) | do_extract_and_write.sh (bash) |
| AI 调用失败 | ❌ 会话 <SESSION_ID> 提炼失败:AI调用失败(退出码:<code>) | do_extract_and_write.sh (bash) |
| AI 返回为空 | ❌ 会话 <SESSION_ID> 提炼失败:AI返回为空 | do_extract_and_write.sh (bash) |
| AI 返回错误 | ❌ 会话 <SESSION_ID> 提炼失败:AI返回错误信息 | do_extract_and_write.sh (bash) |
| AI 没有完成写入 | ❌ 会话 <SESSION_ID> 提炼失败:AI 没有完成写入 | do_extract_and_write.sh (bash) |
| 提炼成功(有内容) | ## 提炼结果\n\n- **L2 任务**: X 条\n- **L3 项目**: X 条\n- **L4 知识**: X 条 | agent (AI) |
| 提炼成功(无内容) | ℹ️ 会话 <SESSION_ID> 提炼完成,无内容需要写入 | agent (AI) |
# 1. 克隆/复制脚本到你的 workspace/scripts 目录
cp session_check.sh /root/.openclaw/workspace/scripts/
cp do_extract_and_write.sh /root/.openclaw/workspace/scripts/
# 2. 添加执行权限
chmod +x /root/.openclaw/workspace/scripts/*.sh
# 3. 创建已提炼记录文件
mkdir -p /root/.openclaw/workspace/memory
touch /root/.openclaw/workspace/memory/.extracted_sessions
# 4. 配置 crontab
# 编辑 crontab: crontab -e
# 添加以下内容:
# 白天(8:00-22:00)每 1 分钟运行一次
# */1 8-22 * * * /root/.openclaw/workspace/scripts/session_check.sh >> /tmp/session_check.log 2>&1
# 夜间(22:00-次日8:00)每 5 分钟运行一次
# */5 22-23 * * * /root/.openclaw/workspace/scripts/session_check.sh >> /tmp/session_check.log 2>&1
# */5 0-7 * * * /root/.openclaw/workspace/scripts/session_check.sh >> /tmp/session_check.log 2>&1
使用前必须完成:
workspace/.env 文件中配置以下环境变量:# 你的飞书 open_id(必填,用于接收通知)
export FEISHU_USER_OPEN_ID="ou_xxxxxxxxxxxxxxxxxx"
# L2 任务看板:飞书多维表格 app_token
export L2_APP_TOKEN="your_l2_app_token"
# L2 任务看板:数据表 ID
export L2_TABLE_ID="your_l2_table_id"
# L3 项目日志:飞书云文档 doc_id
export L3_DOC_ID="your_l3_doc_id"
# L4 知识沉淀:飞书云文档 doc_id
export L4_DOC_ID="your_l4_doc_id"
如果不配置环境变量,会使用默认配置,但默认配置只能在灵曦的记忆空间使用,其他人使用需要修改为自己的飞书资源。
| 检查项 | 状态 | 说明 |
|---|---|---|
| 命令注入 | ✅ 安全 | 所有变量都正确使用引号包裹,文件名使用 basename 提取,不会导致命令注入 |
| 路径遍历 | ✅ 安全 | 使用 basename 正确提取 session_id,不会路径遍历 |
| 硬编码密钥 | ✅ 已修复 | 所有飞书资源 ID 都通过环境变量配置,无硬编码 |
| 必需环境变量 | ✅ 已声明 | 在 skill.json 中完整声明了所有必需环境变量 |
| 进程锁 | ✅ 安全 | 使用 mkdir 原子操作获取锁,支持过期锁(超过 10 分钟)自动清理,不会死锁 |
| 临时文件 | ✅ 安全 | 使用 $$ PID 隔离临时文件,用完自动删除,不会冲突 |
| 错误处理 | ✅ 安全 | 每个步骤都有错误检查和通知,不会静默失败 |
本技能的核心功能是读取本地 OpenClaw 会话文件,将完整对话内容发送给 AI 代理进行提炼,然后写入你的飞书知识库。这是本技能的设计初衷,如果你使用本技能,即同意:
$SESSIONS_DIR 目录下所有未提炼的会话文件(包含你的对话历史),这是自动化提炼的必要设计$SESSIONS_DIR 目录下的所有未提炼会话文件(默认:/root/.openclaw/agents/main/sessions/),这是本技能的核心功能请确认你理解这些权限范围后再安装使用。
灵曦 / Linxi-MindVault