健康提醒(dsh-health-reminder)
给 DSH 桌面端用的健康提醒插件:上班时段里按固定间隔提醒你喝水、起身动一动、看看远处、拉伸一下, 顺带记录每日完成情况与连续达标天数,还能把整套提醒配置存成多套方案(作息 + 每类的间隔 / 目标 / 开关 + 提醒方式), 随时切换、复制、改名、删除。
- 默认作息:周一~周六 10:00-19:00(可在设置里改成任意上班日与时段)
- 默认提醒:喝水每 60 分钟(8 杯 × 250ml)、起身每 45 分钟(每次 3 分钟,8 次)
- 另有护眼 20 分钟(12 次)、拉伸 90 分钟(3 次)两类,默认关闭,在「设置」里按需打开
- 界面跟随宿主主题(浅色 / 深色都用同一套宿主色板,自绘控件,不用会脱色的原生下拉)
- 默认午休 12:00-13:00 不打扰(可关);另有免打扰时段(可跨零点)
- 提醒方式(系统通知 / 应用内提示卡 / 提示音)三个独立开关,默认全开
- 设置、统计与方案都存在本机浏览器本地存储里:插件完全不联网(不发任何请求,也不调用模型), 换设备用「报告」页的导出 / 导入自己搬
排期规则(固定时刻表)
提醒时刻只由作息决定:每个开启的提醒类型各自从上班时间起,按自己的间隔排队(第一个点 = 上班时间 + 1 个间隔), 落在午休、免打扰、非上班日上的点直接丢掉,不补。
- 暂停 / 恢复:暂停期间过去的点只记为「已处理」,恢复后从时刻表继续,不重置、也不补发。
- 完成 / 跳过 / 手动「记一杯水 / 记一次起身」:只写统计,不会把下一次推到「现在 + 间隔」。
- 「10 分钟后再提醒」只覆盖下一次;到点后自动回到时刻表。
- 「今天不再提醒」= 顺延到下一个有提醒的上班日的第一个点。
- 应用关久了(到点时已错过超过 2 分钟)的点只记不补发。
「试一下提醒(不计入)」是演练:只弹卡片 / 系统通知 / 提示音,带 test 标记,
不写记录、不参与统计、也不会存进本地状态。
它长什么样
| 位置 | 内容 |
|---|---|
| 侧边栏图标 | 水滴 + 一道水纹;点开进入主面板 |
| 主面板 · 今日 | 下一次各类型提醒倒计时、完成按钮、今日进度条、连续达标与近 7 天柱状图、今日记录 |
| 主面板 · 报告 | 近 7 天 / 近 30 天趋势、每类累计、导出 JSON / CSV 与导入 |
| 主面板 · 设置 | 总开关、上班日与时段、午休、免打扰、每个提醒类型的参数、提醒方式(含音量 / 音色 / 全屏静音)、快捷操作、数据清理 |
| 主面板 · 方案 | 把整套提醒配置存成多套方案(作息 + 每类的间隔 / 目标 / 开关 + 提醒方式):照当前设置新建、随时切换、编辑、重命名、复制、删除;只存配置不存统计 |
| 全局横幅 | 到点时浮在界面顶部(任何面板下都可见):完成 / 10 分钟后再提醒 / 跳过这次 / 今天不再提醒 |
| 会话输入框 | 输入 /health 直接打开面板并展开底部快捷卡片;面板「今日」页有「复制今日小结」 |
多方案怎么用
「方案」页把一整套提醒配置存成一份快照:上班日与时段、午休、免打扰、每个提醒类型的间隔 / 目标 / 开关、提醒方式。方案只存配置,不存统计——切换方案不会动你的记录。快照也包含总开关:关着提醒时保存的方案,应用它之后提醒仍然是关着的。
- 新建:在「新建方案」里写个名字(留空就按作息自动起一个),点「照当前设置新建」——存下的是此刻的设置,并立刻成为当前方案。
- 切换:在「全部方案」里点某一份的「应用」,设置与下一次提醒一起换过去,今天的统计保持不动。
- 编辑:点某一份的「编辑」在弹窗里改作息、午休、每类参数与提醒方式(系统通知 / 应用内提示卡 / 提示音);正在使用的那份保存后立刻作用到当前设置,改别的方案则不影响当前设置。点「取消」就全丢掉。音色、音量、全屏静音与免打扰也在快照里,但在设置页里调整——改完点「保存到方案」更新快照。
- 保存到方案 / 恢复方案:「当前方案」卡片显示它记下的配置;设置改了会标「有改动」,可以「保存到方案」覆盖快照,也可以「恢复方案」退回快照(两者都会先问一句)。
- 重命名 / 复制 / 删除:删除只删这份配置(先确认),当前设置和统计都不受影响;删掉的正好是当前方案时,「当前」会清空,设置保持原样。
第一次升级上来(本地存的还是旧结构)会自动兜一份「默认方案」;要是你把方案全删光了,它不会自己再冒出来。
提示音与全屏静音
- 提示音用 WebAudio 现场合成(插件不带音频资源),三种音色:清脆(默认)、柔和、双音铃; 音量是一个 5%~100% 的滑块,改完立刻能用「测试提示音」听效果。
- 全屏时静音(默认开启):演示、看视频、全屏游戏时不发声,但系统通知、应用内提示卡与统计照常—— 不至于因为一次全屏就漏掉记录。
- 点系统通知会先把窗口拉到前台,再打开健康提醒面板并展开输入区底部的快捷卡片,直接就能记录。
- 设置页里的「快捷操作」是面板那几个动作的快捷入口(打开面板、记一杯水、记一次起身、暂停 / 恢复提醒), 只是为了不用切回面板就能点,不占键盘快捷键。
报告与同步
「报告」页签里可以直接看到:
- 近 7 天 / 近 30 天切换:每天每类一根柱子(30 天视图自动变细、隔几天标一个日期), 下面是达标天数、当前连续、最长连续、上班日数、跳过次数,以及这段时间的饮水合计(ml)与活动合计(分钟);
- 每类累计:每个提醒类型在这段时间里的累计次数(按各类型自己的单位:喝水「杯」,起身 / 护眼 / 拉伸「次」) 与日均值(分母是这段时间的日历天数)。
同步走文件,不依赖账号也不联网:
- 导出 JSON:把设置 + 全部记录(可选运行期状态)打包成一份 JSON
(文件里的格式标识是
dsh-health-reminder/export,文件名是health-reminder-<日期>.json), 在另一台设备上「报告 → 导入」即可; - 导出 CSV:最近 7 天 / 30 天按天一行(日期、星期、每类数量、跳过、是否达标),带 BOM,Excel 直接打开;
- 导入:选择文件或直接粘贴 JSON 文本 → 先校验格式并给出摘要(多少天、多少条、是否有设置)→ 确认后再写入。合并规则:同一天取较大值、日志按条目去重、坏日期键直接丢掉; 设置默认保留本机,也可以在导入时选择以文件为准。
DSH 没有给插件提供账号级的云端 KV(插件能拿到的存储只在本机渲染进程里,不跨设备同步), 所以这里用「导出 / 导入文件」代替账号同步:一份文件就是一次快照,设备之间自己搬。
在会话里用
- 输入
/health:打开健康提醒面板,并把输入区底部的快捷卡片展开,直接就能记录、推迟或暂停。这是一条 裸命令(不发送消息、不占对话轮次),所以不会在会话记录里留下痕迹。 - 面板「今日」页的**「复制今日小结」**会把当天的情况整理成几行文本(作息、今日完成 / 跳过、连续达标、 近 7 天与每类累计),复制后直接贴进对话输入框,就能让当前的对话帮你分析——比如「今天水喝少了,帮我把下午的安排调一下」。 这里刻意不做「自动把小结发进对话」:命令行的结果不进会话日志,硬发一条消息反而会污染上下文。
当前状态
已安装进 desktop profile:profile 的 package.json 里有一条
"dsh-health-reminder": "link:C:/Users/Lenovo/Documents/deepseek-harness/default-workspace/dsh-health-reminder",
dsh.profile.bundles 里也包含了 dsh-health-reminder,因此重启 DSH 客户端后侧边栏就会出现「健康提醒」。
卸载:
dsh plugin --profile desktop remove dsh-health-reminder
因为装的是
link:,改完本目录里的client.js或index.js只需完全重启客户端即可生效(不需要重新安装)。
安装
这是一个 DSH 插件,需要装进 profile 才会被桌面端加载。推荐用插件管理器/CLI 安装(会同时写入
package.json、cordis.patch.yml 与 lockfile,不要手改这几个文件,管理器会覆盖):
# 本地目录安装(link:),profile 名按你的桌面端取值(这里通常是 desktop)
dsh plugin --profile desktop add link:C:\Users\Lenovo\Documents\deepseek-harness\default-workspace\dsh-health-reminder
装完后重启 DSH 客户端(或按提示刷新)即可在侧边栏看到图标。
首次使用系统通知时,浏览器/Electron 会询问通知权限——在「设置 → 提醒方式」里点「请求权限」, 也可以先用「测试系统通知」「测试提示音」确认效果。若权限被拒,仍会走应用内提示卡与提示音。
自测
不需要 DSH、不需要浏览器,伪造宿主模块加载器与 localStorage 后直接跑:
node test/run-tests.mjs
覆盖:时间工具(HH:MM 解析、时段判定、时长文案)、固定时刻表(daySlots 排队、午休/免打扰跳点、
迟到窗口、不重复提醒)、暂停不重置也不补发、完成/跳过/手动记录不动时刻表、推迟只覆盖一次、今日免打扰顺延到下一个上班日、
演练不落盘不计数、旧状态迁移、提醒类型表(默认开关、间隔与目标上下限、v2 的 settings.water/stand 迁移、
已去掉的番茄类型不会复活)、
连续达标与 7 天统计、报告(近 7 天 / 30 天合计、达标天数、最长连续、每类累计——在册的每一类都算,
护眼 / 拉伸这类后加的类型不会漏统计)、
导出 / 导入(格式校验、按天取较大值、日志去重、设置可选覆盖)与 CSV、提示音音色与音量、全屏静音、
多方案(照当前设置新建并切成当前、自动命名与长度上限、切换方案时设置与计时一起换而统计不动、
保存到方案覆盖快照 / 恢复方案退回快照、重命名 / 复制 / 删除、读盘时丢坏项与重复 id、
老状态自动兜一份「默认方案」而显式空数组不兜、编辑弹窗只写回这一份且编辑当前方案保存后立刻生效、
应用方案原样套用快照里的总开关、方案名上限和落库一致)、
宿主半区(只依赖 webServer、一条只读探针路由、GET / HEAD 报名字与版本、其他方法 405、缺服务时不抛错)、
设置归一化与持久化、五个席位注册容错、两个设置入口同源与面板滚动容器、危险操作必先弹确认(取消不动数据)、
方案页的新建 / 覆盖 / 恢复 / 删除都先确认、/health 裸命令与今日小结文本、界面跟随主题(不用原生下拉,用自绘分段按钮)、
每类数字输入框的上限就是真正的上限(不给出会被无声裁剪的值)、
以及对界面组件的一次「渲染不抛错」冒烟测试加关键交互
(点按钮 → 弹确认 → 取消/确认两条路径;方案页的新建 / 应用 / 重命名 / 删除 / 编辑弹窗;报告页签的导出 / 导入入口;
浮层席位缺席时方案编辑弹窗改挂在面板里;「测试系统通知」在没有权限 / 环境不支持时会说出原因)。
当前 70/70 通过(node test/run-tests.mjs,不需要 DSH)。
文件
dsh-health-reminder/
├─ package.json 插件清单(dsh.engines / bundle.patch / client)
├─ cordis.patch.yml 把插件挂进 profile 的 patch 行
├─ index.js 宿主半区:只读探针 GET /health-reminder/status(不加载模型、不读数据)
├─ client.js 全部界面与纯逻辑(宿主模块加载器包装,手写 ESM,无需构建)
├─ icon.svg 侧边栏 / 面板入口的图标
├─ design-notes.md 设计说明:配置模型、判定逻辑、多套方案、文案池
├─ LICENSE BSD-3-Clause
└─ test/run-tests.mjs 离线自测(70 项)
已知限制
- 提醒依赖界面进程存活:DSH 客户端关掉后不会提醒(不驻留后台服务)。
- 统计存于渲染进程的 localStorage,清理站点数据会一并清空。
- 「固定时刻表」语义:到点只认「上班时间 + N × 间隔」这些时刻;不在上班时段 / 午休 / 免打扰上的点直接丢弃, 错过超过 2 分钟的点只记为已处理,不补发。暂停、完成、跳过、手动记录都不会改动时刻表。
- 面板与设置页共用同一份设置(面板「设置」页签 = 设置里的「健康提醒」页);面板正文自己滚动,设置页由设置外壳滚动。
- 没有云同步:DSH 没给插件留账号级的云端存储,所以跨设备靠「报告 → 导出 JSON / 导入」手动搬; 导入是合并不是覆盖(同一天取较大值、日志去重),需要「以文件为准」时在导入时勾选。
- 会用掉已有数据或覆盖设置的动作都会先弹确认框:清空今日记录、清空全部统计、恢复默认设置、覆盖方案(保存到方案)、恢复方案、删除方案, 导入也会先给出摘要再确认。弹窗挂在全局浮层这一层;万一外壳不提供浮层席位,确认框会自动退回系统原生确认框(不会静默执行), 方案编辑弹窗则会退到面板里显示(点「编辑」不会没反应)。
- 提示音只有系统自带音色库里没有的三种合成音;全屏静音只作用于声音,通知与提示卡不受影响。
- 界面配色全部取自宿主主题 token(
--dsw-*),浅色 / 深色跟着宿主走;宿主没定义某个 token 时退回插件里的兜底色。 音色这类 2~4 个固定选项刻意不用原生<select>——它的选项弹层由系统绘制,深色主题下会变成一块白底。 - 插件不注册任何键盘快捷键:DSH 的快捷键服务里不会出现这个插件,能记录的入口是底部状态行、 全局横幅、系统通知点击和设置页的「快捷操作」。
/health依赖桌面端提供的命令服务(@deepseek-ai/dsh-client-ui-commands);缺包时只影响这一个入口, 其余功能照常。插件对外只有/health一条命令, 不会顶掉或改写 DSH 自己的命令(名字冲突时注册失败并只打一条警告)。- 插件完全不联网、不调用模型:提醒、统计与方案全在本机算,一个请求都不发;自然也无需登录任何账号。
- 宿主半区只剩一条只读探针
GET /health-reminder/status(报插件名字与版本;不加载模型、不读你的数据), 只是给「插件到底装上没有」留个排查入口。改完index.js必须完全重启桌面端才生效(只刷新窗口不够); 探针没挂上(profile 没加载index.js、宿主没提供webServer)也不影响任何提醒功能。 - 方案存在本机 localStorage,和设置 / 统计在一起;「报告」页的导出格式仍是 v1,不含方案—— 换设备时方案要按当下设置重新存一遍(方案只是配置快照,重建成本很低)。
No comments yet. Be the first to write one.