125 lines
5.5 KiB
Markdown
125 lines
5.5 KiB
Markdown
# 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)。
|