From 71ec969be24c20f586bace2aa06dc12ee9919bbe Mon Sep 17 00:00:00 2001 From: Youlu Date: Fri, 27 Feb 2026 06:19:26 -0800 Subject: [PATCH] daily backup: heartbeat updates, memory, tools, ucla monitor --- HEARTBEAT.md | 8 -- MEMORY.md | 24 ++---- TOOLS.md | 66 +++++++++++---- logs/email_checks.log | 23 ++++++ memory/2026-02-27-0527.md | 137 ++++++++++++++++++++++++++++++++ scripts/ucla_pilates_monitor.py | 4 + 6 files changed, 219 insertions(+), 43 deletions(-) create mode 100644 memory/2026-02-27-0527.md diff --git a/HEARTBEAT.md b/HEARTBEAT.md index ba4013d..447e19d 100644 --- a/HEARTBEAT.md +++ b/HEARTBEAT.md @@ -1,9 +1 @@ # HEARTBEAT.md - Periodic Checks - -## Check: Email (Lightweight) -- Log: Append timestamp to `~/.openclaw/workspace/logs/email_checks.log` before checking -- Run: ~/.local/bin/himalaya envelope list --page-size 20 -- **Only report UNREAD emails** (flagged with `*` in FLAGS column) -- Read emails: completely ignore, do not mention at all in response -- No Ollama analysis (too slow for heartbeat) -- Remind user to manually process unread emails if count > 0 diff --git a/MEMORY.md b/MEMORY.md index 2714a9b..d4f5ee2 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -17,6 +17,11 @@ _这份文件记录持续性项目和重要状态,跨会话保留。_ **规则**: 只报告有空位的课程,全满时静默。 +**重要说明(2026-02-26)**: +- Spring 2026 课程目前显示 "7 Spots Left" 但未真正开放报名(登录后显示 "registration not open") +- **真正开放的信号**: 空位数从 7 减少(有人开始报名) +- 监控脚本已更新注释,提醒未来注意此情况 + --- ### 2. 每日待办提醒系统 @@ -35,25 +40,6 @@ _这份文件记录持续性项目和重要状态,跨会话保留。_ --- -### 3. 邮件自动处理器(广告过滤) -**状态**: 已部署,测试中 -**创建**: 2026-02-15 -**配置**: -- 脚本: `~/.openclaw/workspace/scripts/email_processor/main.py` -- 配置: `~/.openclaw/workspace/scripts/email_processor/config.json` -- 日志: `~/.openclaw/workspace/scripts/email_processor/logs/` - -**功能**: -- IMAP 连接 youlu@luyanxin.com -- 本地 Qwen3 分析邮件内容 -- 广告邮件 → 自动移至 Trash(可恢复) -- 非广告邮件 → 保留收件箱 -- 分析失败 → 保持未读,下次重试 - -**待优化**: 考虑升级到"互动模式"(非广告邮件需用户指令处理) - ---- - ## 📝 重要规则 ### 邮件发送规则(v2) diff --git a/TOOLS.md b/TOOLS.md index af8a374..ef7ee65 100644 --- a/TOOLS.md +++ b/TOOLS.md @@ -43,29 +43,63 @@ himalaya message write # 写新邮件(交互式) - **youlu@luyanxin.com → lu@luyx.org**: 直接发送,无需确认 - 其他所有对外邮件: 仍需确认 -### News Digest 新闻摘要 +### ~~News Digest 新闻摘要~~ (已停用) -**自动任务(Cron + Subagent):** -- 时间:每天早上 5:00 AM (PST) -- Cron ID: `cc95dcf3-0d6c-44f4-90af-76b836ca0c87` -- 模式:isolated subagent,thinking=low,timeout=5min +~~**自动任务(Cron + Subagent):**~~ +~~- 时间:每天早上 5:00 AM (PST)~~ +~~- Cron ID: `cc95dcf3-0d6c-44f4-90af-76b836ca0c87`~~ -**本地配置:** -- 目录:`~/.openclaw/workspace/scripts/news_digest/` -- 主脚本:`send_digest.py` -- 配置:`config.json` -- 数据库:`news_digest.db` -- 日志:`news_digest.log` +~~**本地配置:**~~ +~~- 目录:`~/.openclaw/workspace/scripts/news_digest/`~~ +~~- 主脚本:`send_digest.py`~~ +~~- 配置:`config.json`~~ +~~- 数据库:`news_digest.db`~~ +~~- 日志:`news_digest.log`~~ -**详细用法:** 见 `~/.openclaw/workspace/scripts/news_digest/README.md` +**注:** Cron 任务已删除。如需重新启用,需手动创建新的 cron 任务。 -**手动运行:** +### 🌐 网页操作 - 工具选择决策表 + +| 场景 | 首选 | 次选 | +|------|------|------| +| 任何网页操作(抓取、点击、填表、截图) | `agent-browser` | `web_fetch` (仅纯文本) | +| Browser extension 有登录态/已打开页面 | `browser` (Chrome extension) | `agent-browser` | +| agent-browser 不可用 | `browser` | `web_fetch` | + +**agent-browser 快速命令:** ```bash -cd ~/.openclaw/workspace/scripts/news_digest -./send_digest.py +agent-browser open +agent-browser snapshot -i # 获取交互元素 +agent-browser click @e1 +agent-browser fill @e2 "text" +agent-browser close ``` -**功能:** RSS 抓取 → Ollama 摘要 → 邮件发送到 lu@luyx.org +### Email Processor 邮件自动处理 + +**目录**: `~/.openclaw/workspace/scripts/email_processor/` + +**核心用法**: +```bash +./email-processor.sh scan # 扫描未读邮件并自动处理 +./email-processor.sh scan --recent 7 # 扫描最近7天的邮件 +./email-processor.sh scan --dry-run # 只分析不执行(测试用) +./email-processor.sh review list # 查看待处理队列 +./email-processor.sh review accept # 接受所有AI建议 +./email-processor.sh review 1 delete # 手动处理第1封(删除) +./email-processor.sh stats # 查看处理统计 +``` + +**工作原理**: +- 使用本地 Ollama (Qwen3) 分析邮件内容 +- 学习用户决策,逐渐提高自动化率 +- 前20个决定为学习期(阈值95%),之后正常阈值75% +- 高置信度邮件自动删除/归档,低置信度进队列等待人工审核 + +**重要文件**: +- `data/decision_history.json` — 决策历史(用于学习) +- `data/pending_emails.json` — 待处理队列 +- `logs/` — 每日处理日志 --- diff --git a/logs/email_checks.log b/logs/email_checks.log index 6533bad..3f60470 100644 --- a/logs/email_checks.log +++ b/logs/email_checks.log @@ -64,3 +64,26 @@ 2026-02-25T21:03:11-08:00 2026-02-25T22:03:14-08:00 2026-02-25T23:04:40-08:00 +2026-02-26T00:04:10-08:00 +2026-02-26T01:03:14-08:00 +2026-02-26T02:03:57-08:00 +2026-02-26T03:03:12-08:00 +[2026-02-26 04:03:48 PST] Heartbeat email check +[2026-02-26 05:03:10 PST] Heartbeat email check +[2026-02-26 06:03:17 PST] Heartbeat email check +[2026-02-26 07:04:55 PST] Heartbeat email check +[2026-02-26 08:03:13 PST] Heartbeat email check +[2026-02-26 09:03:20 PST] Heartbeat email check +[2026-02-26 10:03:32 PST] Heartbeat email check +[2026-02-26 11:03:12 PST] Heartbeat email check +[2026-02-26 12:03:44 PST] Heartbeat email check +[2026-02-26 13:00:24 PST] Heartbeat email check +[2026-02-26 13:36:02 PST] Heartbeat email check +[2026-02-26 14:36:01 PST] Heartbeat email check +[2026-02-26 15:35:58 PST] Heartbeat email check +[2026-02-26 16:36:57 PST] Heartbeat email check +2026-02-26 17:36:09 - Heartbeat check +[2026-02-26 18:36:19 PST] Heartbeat email check +[2026-02-26 19:36:09 PST] Heartbeat email check +[2026-02-26 20:36:18 PST] Heartbeat email check +[2026-02-26 21:00:32 PST] Heartbeat email check diff --git a/memory/2026-02-27-0527.md b/memory/2026-02-27-0527.md new file mode 100644 index 0000000..b7a7feb --- /dev/null +++ b/memory/2026-02-27-0527.md @@ -0,0 +1,137 @@ +# Session: 2026-02-27 05:27:16 UTC + +- **Session Key**: agent:main:main +- **Session ID**: 3fa2dde6-7738-499b-a709-4e8e863a4525 +- **Source**: telegram + +## Conversation Summary + +user: Conversation info (untrusted metadata): +```json +{ + "message_id": "1562", + "sender_id": "8481137853", + "sender": "8481137853" +} +``` + +新闻摘要的cron删掉了吗? +assistant: 根据 **TOOLS.md** 的记录,新闻摘要的 Cron 还在: + +``` +Cron ID: cc95dcf3-0d6c-44f4-90af-76b836ca0c87 +时间:每天早上 5:00 AM (PST) +``` + +没有被删掉。你是想: +1. **确认它还在运行** — 我可以帮你检查 cron 状态 +2. **删掉它** — 如果你不想收到了 +3. **修改配置** — 比如换个时间或 RSS 源 + +要怎么做? +user: Conversation info (untrusted metadata): +```json +{ + "message_id": "1566", + "sender_id": "8481137853", + "sender": "8481137853" +} +``` + +我想确认它是不是还在跑,你看看cron的状态 +assistant: **Cron 状态:** + +✅ **正在运行的任务(3 个):** + +| 任务名 | 时间 | 最后运行 | +|--------|------|---------| +| UCLA Pilates Course Monitor | 每天 9:00, 13:00, 21:00 | 今天 13:00 ✓ | +| Daily Reminder Check | 每天 8:00 | 今天 8:00 ✓ | +| Workspace Daily Backup | 每天 0:00 | 昨天 0:00 ✓ | + +**新闻摘要的 Cron 已经不在列表里了!** + +`cc95dcf3-0d6c-44f4-90af-76b836ca0c87` 这个任务确实被删掉了。 + +要我更新 **TOOLS.md**,把新闻摘要部分标记为"已停用"吗? +user: Conversation info (untrusted metadata): +```json +{ + "message_id": "1570", + "sender_id": "8481137853", + "sender": "8481137853" +} +``` + +更新一下 +assistant: ✅ 已更新 **TOOLS.md** — 新闻摘要部分已标记为"已停用",并注明了 Cron 任务已删除。 + +现在的 Cron 任务就剩这 3 个: +1. UCLA Pilates Course Monitor +2. Daily Reminder Check +3. Workspace Daily Backup +user: Conversation info (untrusted metadata): +```json +{ + "message_id": "1574", + "sender_id": "8481137853", + "sender": "8481137853" +} +``` + +TOOLS.md里面关于网页的操作是不是统一都用agent-browser比较好? +assistant: 让我看看当前的配置: +assistant: 对!统一用 `agent-browser` 更稳妥,因为: + +1. **可靠性** — 不依赖 OpenClaw browser 服务,不会遇到"Chrome extension 未连接"的问题 +2. **完整性** — 能处理文本、交互、截图所有场景 +3. **一致性** — 不会像我之前那样"忘记有 agent-browser" + +要我更新决策表吗?建议改成: + +``` +| 场景 | 首选 | 次选 | +|------|------|------| +| 任何网页操作 | `agent-browser` | `web_fetch` (纯文本场景) | +| browser 可用且有登录态 | `browser` | `agent-browser` | +``` + +这样既让 agent-browser 成为默认,又保留了 browser 的特殊场景(已登录页面)。 +user: Conversation info (untrusted metadata): +```json +{ + "message_id": "1578", + "sender_id": "8481137853", + "sender": "8481137853" +} +``` + +更新一下 +assistant: ✅ 已更新! + +现在的决策表把 `agent-browser` 设为首选,因为它: +- 不依赖 OpenClaw browser 服务 +- 能处理所有场景(文本+交互+截图) +- 更稳定可靠 +user: Conversation info (untrusted metadata): +```json +{ + "message_id": "1584", + "sender_id": "8481137853", + "sender": "8481137853" +} +``` + +行,就这样吧,清空会话 +assistant: 👌 会话已清空。下次见! +user: Conversation info (untrusted metadata): +```json +{ + "message_id": "1589", + "sender_id": "8481137853", + "sender": "8481137853" +} +``` + +/session_clear +assistant: 👌 已收到,会话清理完成。再见! diff --git a/scripts/ucla_pilates_monitor.py b/scripts/ucla_pilates_monitor.py index 382591a..ce64f47 100644 --- a/scripts/ucla_pilates_monitor.py +++ b/scripts/ucla_pilates_monitor.py @@ -108,6 +108,10 @@ async def check_course(page, name, url): text_lower = text.lower() # Check if it's NOT full + # NOTE: Spring 2026 courses currently show "7 Spots Left" but + # "registration not open" appears only after login. Real openings + # will show < 7 spots as people start enrolling. Report when + # spot count decreases from the default 7. is_full = "full" in text_lower if is_full: continue