# 06 · 健康提醒 桌宠会按你设定的规则,**定时**弹气泡 + 弹系统通知(Linux 走 `notify-send`,macOS/Windows 走 tauri-plugin-notification)。 ## 1. 默认规则 第一次启动时自动写入三条: | 名称 | action_type | 间隔 | 优先级 | 静默时段 | 用途 | |---|---|---|---|---|---| | `remind_water` | remind_water | **90 秒** ⚠️ | 0 | 关 | 喝水提醒 | | `remind_stretch` | remind_stretch | **180 秒** ⚠️ | 1 | 关 | 伸展提醒 | | `remind_test` | remind_test | 120 秒 | 9 | 关 | 验证系统通知是否生效 | > ⚠️ 90 秒 / 180 秒是**开发用**的短间隔。**生产请改成 45 分钟 / 60 分钟**(即 `interval_secs = 2700` / `3600`)。否则你会觉得桌宠在"轰炸"你。 > > 改的方法:托盘 → 健康提醒 → 找到那一条 → 改"触发间隔(秒)"。详见 §4。 ## 2. 如何进入「健康提醒」管理面板 **右键系统托盘图标 → 「健康提醒」**(独立窗口,800×500,可调整大小)。 > 每次点都会**重建窗口**以读取最新配置。 ## 3. 可用的 action_type UI 下拉里内置 9 种: | action_type | 含义 | 触发时 | |---|---|---| | `remind_water` | 喝水提醒 | 弹气泡"记得喝水~"等文案 + 通知 | | `remind_stretch` | 伸展提醒 | 弹气泡"起来动一动~"等文案 + 通知 | | `remind_eyes` | 用眼休息 | 远眺、闭眼等文案 | | `remind_stand` | 站立提醒 | 起来走走 | | `greet_morning` | 早安问候 | 早上 8-12 点 | | `greet_afternoon` | 下午好 | 下午 12-18 点 | | `greet_evening` | 晚安问候 | 晚上 18 点后 | | `remind_test` | 测试通知 | 不分时段 | | `remind_custom` | 自定义 | 不分时段 | 每种 action_type 都有内置的**多套随机文案**(5+ 条),触发时随机抽一条,不重复。 > 这套文案存在 `brain.rs` 的 `FallbackCache` 里。如果你要新增自定义文案,目前需要改源码(本用户手册不涉及开发)。 ## 4. 新增 / 编辑 / 删除 ### 4.1 新增 点 **「+ 添加提醒」** → 弹窗填表: | 字段 | 必填 | 说明 | |---|---|---| | **名称**(name) | ✅ | 唯一标识,不能跟现有重名;建议用英文 + 下划线 | | **动作类型**(action_type) | ✅ | 上面 9 个之一 | | **触发间隔(秒)**(interval_secs) | ✅ | 两次触发的最小间隔(必须 > 0) | | **优先级**(priority) | ✅ | 0=最高,数字越大越低;同 tick 多个 fire 时不区分 | | **是否启用静默时段**(quiet_hours_enabled) | — | 关掉则 24h 都会触发 | | **静默开始小时** | 仅启用时 | 0-23,含 | | **静默结束小时** | 仅启用时 | 0-23,不含 | 点 **确认** → 立即生效(**不用重启**)。 ### 4.2 编辑 表格里点任意一行的 **「编辑」** 按钮(内置两条 `remind_water` / `remind_stretch` 也可编辑)→ 改完确认 → 立即生效。 > 💡 编辑支持**改名**——后端按 `old_name` 找,更新为新 name。 ### 4.3 删除 点 **「删除」** → 确认 → 立即生效。 > ⚠️ 内置的 `remind_water` / `remind_stretch` 也能删(不会自动恢复)。删了想恢复就在「添加」里手动建一条。 ## 5. 静默时段 举例:晚上 22:00 - 次日 08:00 不打扰 - `quiet_hours_enabled = true` - `quiet_start_hour = 22` - `quiet_end_hour = 8` > 静默时段内**不触发提醒**,但**计时器会偷偷推进**到 80% 间隔。所以静默结束后**不会立刻轰炸**,而是大约 20% 间隔后补一次。 ## 6. 触发后会发生什么 1. 60 秒定时循环检查每条 Behavior 距上次触发的时间 2. 到达间隔 + 不在静默时段 → 标记 `should_fire = true` 3. 调 `brain.think(action_type, SystemReminder, None)` — **不调 LLM**!走 FallbackCache 随机文案 4. 三个事同时发生: - **聊天面板**:自动切到「🔔 提醒中心」视图,把这条提醒作为新消息 - **系统通知**:弹一个原生通知(Linux 通知中心 / macOS 通知中心 / Windows 操作中心) - **情绪引擎**:注入 `TimePasses` 事件(不是 reminder 事件本身,但累计推进情绪衰减) ## 7. 手动触发(验证用) 聊天面板顶部有 **🔔** 按钮,但那是"跳到提醒中心",**不触发**。 **手动触发**目前需要从**聊天面板**里**没有**快捷按钮(已知缺口),但你可以通过**临时改短间隔**到 5 秒来测试通知。详见 [09-常见问题FAQ.md](09-常见问题FAQ.md) → "怎么手动测一次通知"。 > 或者调用 Rust 的 `trigger_reminder` Tauri 命令(开发者向,跳过)。 ## 8. 后端权威 提醒事件流是**后端权威**: - 即使前端没启动 / 聊天面板关着,定时器照常跑 - 提醒消息**直接写入**提醒中心 jsonl(不依赖前端 listener) - 前端只是**被动接收** `ezvibe:reminder` 事件来切视图 - 写盘和通知即使前端崩了也会发生 > 所以**不要怕关窗口丢提醒**。 ## 9. 常见疑问 **Q: 怎么关掉所有提醒?** A: 把所有行为的 `interval_secs` 改成超大值(如 `99999999`),或一条条删掉。**当前没有"全局开关"**。 **Q: 改完规则多久生效?** A: 后端用 `reload_all_behaviors` 立即全量替换,**当前 tick 就生效**。不需要等下一次循环。 **Q: 静默时段是按哪个时区算?** A: 本地时区(`chrono::Local::now().hour()`)。 **Q: 我能用 cron 表达式吗?** A: 不能。当前只支持"每 N 秒" + 静默时段。 --- 下一步:[07-LLM对话.md](07-LLM对话.md)。