🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

定时唤醒闹钟 catsenior507/dsh-clock

DeepSeek 客户端
catsenior50716 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

DeepSeek Harness 的日历与时钟,能给一个对话定时唤醒:

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/catsenior507/dsh-clock.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态插件
可安装,未声明 dsh 能力
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包@dsh-external/dsh-client-plugin-clock(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/30 17:16:17

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 14 处,展示前 14 条)
  • 写入本地文件
    lib/index.js:298
    mkdirSync(this.config.dataDir, { recursive: true });
  • 写入本地文件
    lib/index.js:299
    appendFileSync(join(this.config.dataDir, "startup.log"), ( new Date()).toISOString() + " " + message + "\n");
  • 发起网络请求
    src/client/clock.ts:27
    const response = await fetch(base + '/state', { headers: { accept: 'application/json' } })
  • 发起网络请求
    src/client/clock.ts:58
    const response = await fetch(base + path, {
  • 发起网络请求
    src/client/clock.ts:80
    await fetch(base + '/client-log', {
  • 写入本地文件
    src/host/service.ts:240
    mkdirSync(this.config.dataDir, { recursive: true })
  • 写入本地文件
    src/host/service.ts:241
    appendFileSync(join(this.config.dataDir, 'startup.log'), new Date().toISOString() + ' ' + message + '\n')
  • 读取本地文件
    src/host/store.ts:148
    if (!existsSync(this.file)) return this.alarms
  • 读取本地文件
    src/host/store.ts:150
    const parsed = JSON.parse(readFileSync(this.file, 'utf8')) as unknown
  • 写入本地文件
    src/host/store.ts:253
    mkdirSync(directory, { recursive: true })
  • 写入本地文件
    src/host/store.ts:255
    writeFileSync(
  • 写入本地文件
    src/host/store.ts:260
    renameSync(temporary, this.file)
  • 读取本地文件
    src/host/store.ts:266
    if (existsSync(target)) {
  • 删除本地文件
    src/host/store.ts:268
    unlinkSync(target)
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 按关键词定时唤醒会话
  • 注入系统时间与漂移量
  • 进程内定时器

DeepSeek Harness 的日历与时钟:闹钟按关键词在指定时刻唤醒指定会话,并把系统时间和漂移量注入唤醒。进程内定时器,外加 Windows 任务计划程序镜像。

README

由 DeepSeek 最新模型翻译生成
⏰ dsh-clock DeepSeek Harness 的日历与时钟,能给一个对话定时唤醒:用户或 agent 指定一个时间点、一个关键词、以及要唤醒的对话;时间一到,关键词就被投递进那个对话—— 哪怕对话是关着的。 每次唤醒都带着钟表信息:计划时刻、实际时刻、带符号的偏差,以及迟到时的明确警告。 迟到三小时的唤醒,读起来绝不该和准点的唤醒一样。 架构 为什么要做这个 harness 本身已经能排提醒,但只在提出提醒的那个对话内部投递。 @deepseek-ai/dsh-schedule 的文档写得很直白:投递是 session 本地的,没有冷会话调度器,关掉的会话会一直把提醒挂着 "已过期",直到有人把它恢复。 所以你没法对一个长任务说"九点回来继续"然后关掉页面。 本插件填的正是这个缺口:闹钟自己写明要唤醒哪个对话,那个对话可以是关着的,唤醒它就会把它恢复起来。
展开完整文档(README 剩余 1 节)
⏰ dsh-clock

DeepSeek Harness 的日历与时钟,能给一个对话定时唤醒:用户或 agent 指定一个时间点、一个关键词、以及要唤醒的对话;时间一到,关键词就被投递进那个对话—— 哪怕对话是关着的。

每次唤醒都带着钟表信息:计划时刻、实际时刻、带符号的偏差,以及迟到时的明确警告。
迟到三小时的唤醒,读起来绝不该和准点的唤醒一样。

架构

为什么要做这个

harness 本身已经能排提醒,但只在提出提醒的那个对话内部投递。
@deepseek-ai/dsh-schedule 的文档写得很直白:投递是 session 本地的,没有冷会话调度器,关掉的会话会一直把提醒挂着 "已过期",直到有人把它恢复。
所以你没法对一个长任务说"九点回来继续"然后关掉页面。

本插件填的正是这个缺口:闹钟自己写明要唤醒哪个对话,那个对话可以是关着的,唤醒它就会把它恢复起来。

唤醒消息长什么样

⏰ dsh-clock wake — keyword: 继续迁移

scheduled 2026-09-11T09:30:00+08:00 [Asia/Shanghai]
now 2026-09-11T11:43:12+08:00 [Asia/Shanghai]
drift +2h13m OVERDUE
now-epoch 1789098192000
trigger catch-up replay at host start

warning OVERDUE by +2h13m: the host was not running at the scheduled instant and this is a catch-up
delivery. Re-check anything time-sensitive before continuing.
note This message was delivered by a timer, not typed by the user. Treat "继续迁移" as the signal to resume whatever was planned for this instant. detail 检查构建是否结束

drift 和 warning 两行是关键。没有它们,被唤醒的 agent 分不清"现在是计划中的九点半"和 "现在是十一点四十三,你迟到了三小时",然后会心安理得地按过期前提干活。

安装

npm install
npm run build
dsh plugin --profile web add link:<本目录绝对路径>
或者直接从 git 装:
dsh plugin --profile web add <git-url>

装好后需要重启 dsh web 才会加载(守望者面板的「重启」按钮最快)。侧边栏底部、设置按钮的上方会出现一个 日历 按钮,点开就是面板。

用法

面板

- 时钟:当前时间、时区,以及到下一次唤醒的实时倒计时;
- 日历:有闹钟的日子带圆点;点一天、填时间与关键词、选对话,按钮上会写清楚它到底要建什么;
- 分支会被发现:分支一个对话复制的是对话,不是闹钟表 —— 分支之前设的闹钟会继续指向原来那条,于是分支永远不会被唤醒。面板会为每个「尚未覆盖」的分支问一次:把闹钟复制到这个分支,或者拒绝;两种回答都会被记住,不会再问。
- 闹钟列表:分成「待触发」和「已结束」两栏,各自是一个独立的滚动窗口,所以历史再长也不会把面板撑长;待触发按时间正序、已结束按时间倒序。每行可以编辑、立即触发、取消、删除;点「编辑」会把这条闹钟装回表单(时间、关键词、内容、目标对话都能改),按钮变成「保存修改」。只有待触发的能编辑 —— 改一条已经触发过的,等于承诺一次不会发生的投递。已触发的行会写明是准点还是迟到,投递失败的原因也留在行上,不会被吞掉。

交给 agent

模型会拿到一个 clock 工具:

{ "action": "set", "afterSeconds": 2700, "keyword": "检查构建", "note": "这时候 release 任务应该跑完了" }

// 唤醒另一个对话: { "action": "set", "at": "2026-09-11T09:30:00+08:00", "keyword": "站会", "sessionId": "session-…", "timeZone": "Asia/Shanghai" }

{ "action": "now" } // 现在几点 { "action": "list" } // 待触发与近期的闹钟 { "action": "cancel", "id": "a-…" }

插件还带一个名为 clock 的 skill。工具只靠一行描述被广告出去;而从没见过这个插件的对话,是靠这个 skill 才知道那一行装不下的东西:目标可以是一个已关闭的对话、被唤醒的对话是原地继续而不是 fork、以及迟到投递会在消息里写明迟了多久。它以 bundled 来源注册,所以在这个 profile 的每个对话 的技能目录里都能看到。

计时是怎么做的

三层触发,一条投递路径:

| 层 | 覆盖的情况 |
| 进程内定时器 | 常规情况。只为最早的那个待触发闹钟挂一个 setTimeout,任何变更都重新推导。没有轮询循环,空闲时零 CPU。 |
| Windows 计划任务 | 机器休眠、宿主被挂起、计划被错过——StartWhenAvailable 让 Windows 在机器真正可用的第一时间补跑。它也是唯一能被要求唤醒机器的一层(wakeComputer)。 |
| 宿主启动时补发 | 闹钟到点时宿主根本没在跑。这条才是真正把错过的闹钟送出去的那一层,也正是唤醒文本必须报告偏差的原因。 |

三层调用同一条 先认领、再投递 的路径,而且闹钟在任何投递开始之前就被翻成 fired。
谁先到谁赢,其余层发现无事可认领,所以三层叠在一起也不会把一个唤醒送三遍。
提示词还带着由闹钟 id 推导出的 request id,session controller 会去重,这是第二道保险。

系统计划任务是镜像,不是所有者:它只 ping 插件自己的端点。任务缺失、失败或过期,都只会退化成另外两层,而不会丢掉这次唤醒。注册走 PowerShell 的 ScheduledTasks 模块(不是 schtasks.exe,后者表达不了 StartWhenAvailable),插件卸载时会被移除。

配置

- id: ui-clock
name: '@dsh-external/dsh-client-plugin-clock'
config:
port: 4801 # profile 没有 web server 时的私有端口 dataDir: … # 默认 $DSH_HOME/clock defaultTimeZone: Asia/Shanghai useSystemScheduler: true # 把最早的闹钟镜像进 Windows 计划任务 wakeComputer: false # 允许那个任务把机器从睡眠中唤醒 wakeMode: queue # queue | steer:唤醒如何进入一个正忙的对话 driftToleranceSeconds: 60 # 偏差小于这个值仍算 ON-TIME retainFiredDays: 7 # 已结算的闹钟在面板里保留多久 exposeTool: true # 把 clock 工具暴露给 agent

说清楚的边界

- 唤醒需要宿主在跑。 只有宿主能恢复会话,所以如果到点时 dsh web 没运行,这次闹钟会在它恢复运行的第一时间补发(靠计划任务的补跑,或启动时的补发),并在消息里写明迟了多久。它不是推送通知:机器关着的时候没有任何东西能送到你手上,也没有邮件和短信。
- 只支持一次性闹钟。 还没有"每个工作日九点"这类重复规则;日历是用来选日期的,不是用来表达重复的。
- 一个计划任务、固定的名字。 任务名是 dsh-clock-wake,所以同一台机器上跑两个宿主会互相抢它。
进程内定时器不受影响。
- 触发按钮是真正的 slot 注册(sidebar.footer.action),但它打开的面板是浮在 body 上的独立表面,所以面板本身不跟随皮肤主题。

HTTP 接口

搭在 harness 的 web server 上(/api/clock);profile 没有 web server 时走私有本地端口。

| 端点 | 用途 |
| GET /api/clock/state | 时钟、日历数据、闹钟、目标对话、调度器状态 |
| GET /api/clock/now | 宿主时区的当前时刻 |
| POST /api/clock/alarms | 新建——{ at \| afterSeconds, keyword, sessionId, … } |
| POST /api/clock/alarms/update | 改时刻、关键词、备注或目标 |
| POST /api/clock/alarms/cancel · /forget | 取消一个待触发闹钟 · 删除一行 |
| POST /api/clock/alarms/fire | 不管到没到点,立刻触发 |
| POST /api/clock/tick | 计划任务的 ping:认领并投递所有到期的 |

所有响应都是 { ok: true, value } 或 { ok: false, error }。

开发

npm run build # tsdown:宿主半边 -> lib/index.js,浏览器半边 -> lib/client.js
npm test # 26 个单元测试,node --test + 类型剥离

测试挑的是"错了代价最大"的地方:让三层触发不会把一个唤醒送三遍的幂等性、唤醒文本报告的偏差、闹钟重载后的持久性、启动时的过期补发、以及日历算术。
测试从不注册 Windows 任务——每个 service 都关掉了系统镜像。

另见

- dsh-context-assembler —— 会话表面上的上下文树,每个节点可以选组装方式。
- dsh-web-watchdog —— dsh web GUI 的崩溃记录、指数退避自动重启与状态面板。

许可

MIT — 见 LICENSE。
预览分享卡片长什么样 ↓catsenior507/dsh-clock
分享 · DeepSeek Harness Hub
catsenior507/dsh-clock

DeepSeek Harness 的日历与时钟,能给一个对话定时唤醒:

这是你的仓库?认领条目

回到顶部