@kanadego/dsh-heartbeat
An agent that wakes up on its own schedule: by default every 60 minutes, ±20% (48–72). It browses the interests you set, drops what it finds into a local pool of notes, and keeps a profile of what you like. When it has enough worth sharing it hands the session you linked a short package of notes — w
Install
dsh plugin --profile web add @kanadego/dsh-heartbeat
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-heartbeat
让 DeepSeek Harness 的 agent 拥有持续存在感的心跳插件:她按节律自己醒来,维护记忆与画像、感知你的忙闲、按兴趣闲逛看新东西、把没说完的话带过下一拍,然后按分寸决定开不开口——开口要有真实来处,沉默要有具体理由。



![platform]()
![license]()
一分钟了解
装好之后,全部能力都收在插件管理页的心跳面板里,日常使用零命令行:
心跳状态 · 会话绑定
 · 
素材池 · 用户画像(只读)
 · 
<details>
<summary><b>展开看其余分区:兴趣范围 / 周报 / 节律 · 专注模式 · 换机迁移</b></summary>
兴趣范围 · 周报
 · 
设置页把节律、专注模式、换机迁移、账本与摘抄本入口收在一起:
<img src="docs/screenshots/panel-settings.png" width="620" alt="设置:节律配置 / 时间与状态栏 / 表达 / 专注模式 / 换机迁移 / 账本与摘抄本">
</details>
截图为 v2.1.0。画像与会话绑定两张里的条目文字已打码。
它想解决的三件事:
你想要的 · 插件怎么给
零命令行 · 绑定会话、节律、素材池、画像、账本、迁移全在设置卡里;CLI 只留给脚本场景
不打扰、不烧 token · 静默时段 / 忙时窗口 / 每日上限 / 开口冷却 / 在场联动全是代码层判定——判「别说」时,之后的决策与表达两相根本不调用模型(闲逛相在闸门之前触发,另算)
像活人,不像定时播报 · 素材分话题与聊天两仓,反刍成一句话再投递;说不说、说哪条,由你那个会话里的 agent 按当下处境拍板;没说完的话能留在心事匣里带到下一拍,看见想记的话就抄进摘抄本
快速开始
安装(npm 包,推荐)
dsh plugin --profile web add @kanadego/dsh-heartbeat
重启 DSH 即生效——插件自动创建专用心跳会话并按节律运行,之后日常无需任何操作。
心跳预设是自动装的:插件加载时直接向宿主注册(agentPresets.register(),v1.9.2 起),不需要任何手动操作,安装清单里也不再声明宿主包。缺失就按包内模板建好,已有文件永不覆写(你手改过的预设原样保留)。无论走哪条路径,没有这个预设心跳 agent 就是个"裸 agent",连 web_search 都看不见——想手动检查/修复用 preset status / preset install(见下节);把插件 config 的 installPreset 设为 false 可同时关掉运行时注册与目录自装,预设完全由你管。
从源码安装(开发/改造用)
dsh plugin --profile web add file:D:/path/to/dsh-heartbeat
数据放在哪
数据默认住在包外:<DSH_HOME>/heartbeat-data(没有 DSH_HOME 就是 ~/.dsh/heartbeat-data),重装与升级都不会碰它。老版本装在包目录里的 data/ 会在首次启动时自动搬过去(搬迁前先备份、逐文件校验通过才删原件,见下节「卸载」)。要换位置就用插件 config 的 dataDir,或环境变量 HEARTBEAT_DATA_DIR。
平台支持
Windows 上全部功能可用。v2.1.0 起 Linux / macOS 也能跑起来:心跳循环、表达与投递、时间注入、心事匣 / 账本 / 摘抄本、素材池、周报、设置面板与 RPC 通道都照常;依赖 PowerShell 的那几项——截屏、空闲检测、锁屏检测、前台窗口探测、桌面通知——在这两个平台上不可用,插件会直接按「探针失败」降级,不会卡住某一跳。代价是忙闲判定缺席:静默时段、每日上限、开口冷却照常生效,但「他大概在忙」这类窗口判断不会触发。
数据不跨平台搬家:data/vault.key 在 Windows 上由 DPAPI 保护,在 Linux / macOS 上是一份权限 0600 的密钥文件,两边互不相认。换平台就是重新开一份数据目录。
核心工作机制
一跳 = agent 自己醒一次(默认 60 分钟)。醒着的时候依次走七相,最后由留痕收尾:
维护 → 采集 → 闲逛 → 闸门 → Digest → 反刍备料 → 投递 → 留痕
│
判「别说」→ 本跳到此为止,决策与表达不再调模型
<details>
<summary><b>点此展开:七相详情与关键概念</b></summary>
① 维护 ── 清素材池 / 滚动日志 / 判断该不该合并画像
② 采集 ── 全屏截图(加密落盘)+ 忙闲判定 + 前台窗口类别
╰─ 观察:把绑定会话里你新说的话收进画像收件箱
②′ 闲逛 ── 条件触发:agent 自己按兴趣焦点用 web_search 看新东西
③ 闸门 ── 纯代码判定:静默窗 / 忙时 / 在场 / 每日上限 / 冷却
╰─ 判「别说」→ 本跳到此为止,决策与表达不再调模型
④ Digest ── 拼出「此刻状态」:画像 + 时间 + 素材池 + 待办
⑤ 反刍 ── 引擎室从素材池挑 ≤3 条,各压成一句话(备料)
⑥ 投递 ── 拼成素材包,送进你指定投递的那个会话
⑦ 留痕 ── 写审计日志 + 账本(真正开口了才计数)
│
▼
你读的那个会话 ── 那里的 agent 按当下处境,决定说不说、说哪条
文档里反复出现几个词,在这里一次说清:
词 · 意思
心跳 · 本插件的核心动作——不用你开口,agent 按固定节律自己「醒一次」:做维护、感知环境、决定要不要说话。醒一次叫一跳,默认 60 分钟一跳。
宿主 · 运行插件的那个程序,即 DSH 本体。心跳是挂在宿主里的插件——模型通道、会话、工具这些能力都由宿主提供。
客户端 · 宿主里负责界面的那一侧(Web 界面或者 DSH desktop)。设置页的心跳卡片属于客户端;卡片显示不出来,通常是客户端插件没加载成功,与心跳本体无关。
相 · 一跳内部的一个阶段。主循环共七相——维护 → 采集 → 闲逛 → 闸门 → Digest → 反刍备料 → 投递,最后统一由留痕收尾。每相结束都会在审计日志留一条 phase_done,所以「这一跳停在哪」可以直接查。
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::22,最后更新 2026-11-04