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

多渠道通知遥控 THEWOLFWALKER/dsh-notifier

DeepSeek Harnessv0.13.1
THEWOLFWALKER17 天前有提交已提供中文文档扫描:含敏感能力notify

DSH 通知与远程控制平面:28 条出站通道、6 项入站控制、原生通知与控制 UI、实时热应用、零运行时依赖。

54.1/100
综合分
55
GitHub 星标
563
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-notifier
npm 源 · dsh-notifier 的发布者账号已校验与本仓库一致

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包dsh-notifier @ 0.13.1
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 22:37:49

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 62 处,展示前 46 条)
  • 写入本地文件
    src/index.mjs:457
    mkdirSync(stateDir, { recursive: true })
  • 删除本地文件
    src/index.mjs:459
    try { unlinkSync(BOOTSTRAP_CODE_FILE) } catch { }
  • 写入本地文件
    src/index.mjs:460
    writeFileSync(BOOTSTRAP_CODE_FILE, `${code}\n`, { encoding: 'utf8', mode: 0o600 })
  • 写入本地文件
    src/index.mjs:462
    try { chmodSync(BOOTSTRAP_CODE_FILE, 0o600) } catch { }
  • 删除本地文件
    src/index.mjs:471
    try { unlinkSync(BOOTSTRAP_CODE_FILE) } catch { }
  • 读取本地文件
    src/ledger.mjs:77
    if (existsSync(file)) {
  • 读取本地文件
    src/ledger.mjs:78
    entryCount = readFileSync(file, 'utf8').split('\n').filter((line) => line.trim() !== '').length
  • 写入本地文件
    src/ledger.mjs:83
    try { mkdirSync(dir, { recursive: true }) } catch { }
  • 写入本地文件
    src/ledger.mjs:101
    appendFileSync(file, `${JSON.stringify(entry)}\n`)
  • 写入本地文件
    src/ledger.mjs:104
    try { chmodSync(file, 0o600) } catch { }
  • 读取本地文件
    src/ledger.mjs:115
    const lines = readFileSync(file, 'utf8').split('\n').filter((line) => line.trim() !== '')
  • 写入本地文件
    src/ledger.mjs:122
    writeFileSync(tmp, `${kept.map((line) => `${line}\n`).join('')}`)
  • 写入本地文件
    src/ledger.mjs:123
    try { chmodSync(tmp, 0o600) } catch { }
  • 写入本地文件
    src/ledger.mjs:124
    renameSync(tmp, file)
  • 读取本地文件
    src/ledger.mjs:132
    if (!existsSync(file)) return []
  • 读取本地文件
    src/ledger.mjs:133
    const lines = readFileSync(file, 'utf8').split('\n')
  • 读取本地文件
    src/ledger.mjs:173
    if (n === 0 || !existsSync(file)) return []
  • 读取本地文件
    src/inbound/store.mjs:57
    if (!existsSync(filePath)) return {}
  • 读取本地文件
    src/inbound/store.mjs:64
    const mode = statSync(filePath).mode & 0o777
  • 写入本地文件
    src/inbound/store.mjs:68
    chmodSync(filePath, 0o600)
  • 读取本地文件
    src/inbound/store.mjs:74
    raw = readFileSync(filePath, 'utf8')
  • 读取本地文件
    src/inbound/store.mjs:99
    try { sizeBytes = statSync(filePath).size } catch { }
  • 写入本地文件
    src/inbound/store.mjs:108
    copyFileSync(filePath, backup)
  • 读取本地文件
    src/inbound/store.mjs:129
    if (!existsSync(filePath)) return { ok: true, value: {}, missing: true }
  • 读取本地文件
    src/inbound/store.mjs:131
    try { raw = readFileSync(filePath, 'utf8') } catch { return { ok: false, reason: 'read-failed' } }
  • 写入本地文件
    src/inbound/store.mjs:201
    try { mkdirSync(dirname(filePath), { recursive: true }) } catch { }
  • 删除本地文件
    src/inbound/store.mjs:204
    try { unlinkSync(lockPath) } catch { }
  • 删除本地文件
    src/inbound/store.mjs:219
    if (readFileSync(lockPath, 'utf8') === ownerId) unlinkSync(lockPath)
  • 删除本地文件
    src/inbound/store.mjs:225
    if (readFileSync(lockPath, 'utf8') === '') unlinkSync(lockPath)
  • 删除本地文件
    src/inbound/store.mjs:231
    try { unlinkSync(lockPath) } catch { }
  • 删除本地文件
    src/inbound/store.mjs:239
    try { unlinkSync(lockPath) } catch { }
  • 写入本地文件
    src/inbound/store.mjs:299
    mkdirSync(dirname(filePath), { recursive: true })
  • 写入本地文件
    src/inbound/store.mjs:307
    renameSync(filePath, backup)
  • 写入本地文件
    src/inbound/store.mjs:323
    writeFileSync(tmp, JSON.stringify(draft), { encoding: 'utf8', mode: 0o600 })
  • 删除本地文件
    src/inbound/store.mjs:333
    if (tmp !== null) try { unlinkSync(tmp) } catch { }
  • 写入本地文件
    src/admin/api.mjs:406
    mkdirSync(dirname(auditFile), { recursive: true })
  • 读取本地文件
    src/admin/api.mjs:408
    if (statSync(auditFile).size > AUDIT_MAX_BYTES) {
  • 删除本地文件
    src/admin/api.mjs:409
    try { unlinkSync(`${auditFile}.1`) } catch { }
  • 写入本地文件
    src/admin/api.mjs:410
    renameSync(auditFile, `${auditFile}.1`)
  • 写入本地文件
    src/admin/api.mjs:413
    appendFileSync(auditFile, `${JSON.stringify({ time: new Date().toISOString(), action, detail: redactDiagnosticValue(detail) })}\n`, 'utf8')
  • 写入本地文件
    src/admin/api.mjs:415
    try { chmodSync(auditFile, 0o600) } catch { }
  • 读取本地文件
    src/admin/api.mjs:1299
    try { return readFileSync(file, 'utf8') } catch { return '' }
  • 发起网络请求
    src/adapters/_shared.mjs:166
    ? await fetch(url, { ...init, redirect: 'manual' })
  • 发起网络请求
    src/inbound/feishu-bot.mjs:58
    request: (options) => base.request(opts(options)),
  • 发起网络请求
    src/adapters/_engine.mjs:79
    const request = spec.request(resolved, msg)
  • 发起网络请求
    src/security/network-policy.mjs:225
    const request = client.request(target.url, {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

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

界面预览

6 张 · 点击查看大图

功能亮点

  • 28条出站通道
  • 6项入站控制
  • 原生通知与控制UI
v0.13.12026-09-26
v0.13.1 是 v0.13 的后续版本。 亮点: · 收尾管理界面的双语资源与证据边界后续工作 · 更新 npm 文档允许列表和 README 展示图 · 包含六张视口尺寸的管理控制台截图,覆盖桌面和窄屏/移动端布局 · 已通过 2011 项自动化测试、发布守卫、28 通道矩阵和 Host 兼容性检查验证 真实 DSH 设备、服务商账号和端到端交付证据仍明确待补,详见 docs/memory/risks.md。
v0.13.02026-09-26
架构收敛发布。 · Native 与 Admin 共用 canonical outbound config 和运行时服务。 · provider handshake/deadline、durable cursor、epoch/revision 生命周期与结构化 RPC 错误完成收口。 · npm test:1984 pass,0 fail,0 skip。 · npm run verify:release 与 28 渠道矩阵检查通过。 · 本次未新增真机 DSH、真实 provider 账号或真实投递回执验证,外部证据缺口见 docs/memory/risks.md。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-notifier Your agent, in your pocket. 把 DeepSeek Harness 放进手机里:28 个出站通知渠道、6 个入站控制渠道,通知、审批、提问、远程会话和任务/Session 控制统一收口。 English · 快速指南 · 排障 · 兼容性 dsh-notifier@0.13.1 · test/ 2011 个测试 · 2011 个自动化契约测试 它解决什么 dsh-notifier 是 DeepSeek Harness 的通知与远程操作层。最核心的使用场景很简单:你离开 DSH 窗口以后,仍然知道 Agent 在干什么;需要你时,直接从手机处理。 - 随时收到通知:任务完成、审批、错误、长任务状态,以及模型主动触发的通知。 - 手机直接处理:批准/拒绝、回答 ask_user、继续对话、纠偏正在执行的任务、切换任务或 Session。 - 日常管理留在 DSH:Native 「通知与控制」 是主入口;高级管理台只负责成员、绑定、Session、诊断和 Recovery。 - 失败尽量局部化:未知/未绑定的入站操作 fail-closed;单个通知渠道失败不拖垮其他渠道。
展开完整文档(README 剩余 1 节)
dsh-notifier

Your agent, in your pocket.

把 DeepSeek Harness 放进手机里:28 个出站通知渠道、6 个入站控制渠道,通知、审批、提问、远程会话和任务/Session 控制统一收口。

English · 快速指南 · 排障 · 兼容性

dsh-notifier@0.13.1 · test/ 2011 个测试 · 2011 个自动化契约测试

它解决什么

dsh-notifier 是 DeepSeek Harness 的通知与远程操作层。最核心的使用场景很简单:你离开 DSH 窗口以后,仍然知道 Agent 在干什么;需要你时,直接从手机处理。

- 随时收到通知:任务完成、审批、错误、长任务状态,以及模型主动触发的通知。
- 手机直接处理:批准/拒绝、回答 ask_user、继续对话、纠偏正在执行的任务、切换任务或 Session。
- 日常管理留在 DSH:Native 「通知与控制」 是主入口;高级管理台只负责成员、绑定、Session、诊断和 Recovery。
- 失败尽量局部化:未知/未绑定的入站操作 fail-closed;单个通知渠道失败不拖垮其他渠道。

界面预览

安装

一句话让 AI 帮你装

把下面这句话发给能操作当前机器终端的 AI / Agent:

请帮我在这台机器上安装或升级 dsh-notifier 最新稳定版。先自动识别当前正在使用的 DSH profile 和现有安装来源,确认 DSH / Node 版本兼容,并保护已有配置;不要修改无关插件,也不要打印任何 Token / Secret。使用官方发布包完成安装,重启对应 DSH Host 一次,确认实际安装版本和 「通知与控制」 入口,最后把你执行过的命令、结果和仍存在的异常汇报给我。项目:https://github.com/THEWOLFWALKER/dsh-notifier

更完整、适合直接交给 Codex / Claude Code / Cursor / 终端 Agent 的版本见:AI 安装指南。

自己安装

dsh plugin add dsh-notifier@latest --profile <profile名>

安装后重启 DSH 一次,让新的 Host 插件和 client.js 装载。然后:

1. 从 DSH 侧栏打开 「通知与控制」,或进入 Plugins → dsh-notifier;
2. 选一个你已经在用的通知渠道;
3. 填凭证,点 「保存并测试」;
4. 如果提供方只确认 API 已接受请求,而没有端到端 receipt,请到手机实际确认;“provider accepted”不会被写成“确认送达”。

装好以后,出站配置修改会 Hot Apply。入站 SDK / WebSocket / 长轮询如果页面显示 「等待重启」,仍需要重启来重建连接。

你需要哪一种用法

| 你的目标 | 从这里开始 |
| 只想收到任务通知 | 在「通知与控制」配置一个出站渠道 |
| 想在手机批准 / 回答问题 | 再配置一个支持的入站渠道,然后完成成员配对 |
| 想直接在手机和 Agent 对话 | 配对后,在机器人私聊直接发文字 |
| 想中途纠偏正在执行的任务 | 在已绑定私聊发送 ! <补充指令> |
| 想管理成员、绑定、Session、Recovery | 从 Native 打开「高级管理台」 |
| Headless / 自动化部署 | 看 完整指南 的 YAML / CLI 部分 |

支持的渠道

出站 28 个: Bark、Bell、Chanify、Desktop、钉钉、Discord、飞书、Google Chat、Gotify、iGot、Mattermost、ntfy、OneBot 11、PushDeer、Pushover、PushPlus、Qmsg、QQ 官方机器人、Server酱、Slack、Microsoft Teams、Telegram、Webhook、企业微信群机器人、企业微信应用、WPS Bot、WxPusher、息知。

入站控制 6 个: Telegram、飞书、QQ 官方机器人、WxPusher、微信 iLink、钉钉。

不同 provider 的按钮、附件、送达回执、重连、账号额度并不一样。项目只按真实证据等级声明能力,详见 兼容性矩阵。

常用私聊命令

| 命令 | 用途 |
| /help | 查看命令 |
| /whoami | 查看身份 / 配对状态 |
| /status | 当前路由 / Session 状态 |
| /tasks / /use … | 查看或选择活跃任务 |
| /sessions | Session 概览 |
| /stop | 停止当前 turn |
| /route | 查看双向路由 |
| /quiet … / /unquiet … | 静默 / 恢复通知 |
| /pair <码> / /unpair | 配对 / 解绑入站身份 |
| /log [N] | 有界、脱敏的近期通知摘要;默认关闭且仅 owner |

普通文字会继续和 Agent 对话;前缀 ! 会纠偏当前正在执行的 turn。群聊默认不开放高风险远程控制语义。

工作方式

DSH 事件 / notify() / 其它插件 │ ▼ dsh-notifier core ┌────────┴────────┐ ▼ ▼ 28 个出站 health / activity │ │ ▼ │ 手机 │ │ │ └─ 6 个入站 ──────┘ │ ▼ identity + Control Core 审批 · ask_user · 会话 · 任务/Session 控制

Native UI、notifier runtime、高级管理台和测试尽量围绕同一份真实状态工作,不维护“页面看起来已经改了、运行时其实没改”的第二套真相。

遇到问题:先让 AI 帮你定位,再上报

不要一上来就把一大段日志贴进 Issue。 推荐支持流程:

1. 把 AI 排障提示词 发给能读当前终端/日志的 AI;
2. 先做只读诊断:确认实际安装版本、DSH profile / 版本、安装来源、问题属于哪个子系统,并做最小复现;全程脱敏;
3. 如果只是旧包、错误 profile、残留 file: 安装、漏重启、凭证或 provider 配置问题,让 AI 协助本地解决并重新验证;
4. 如果仍解决不了,让 AI 按 定位与诊断指南 生成一份短小、可复现的报告;
5. 再把这份报告发到 GitHub Issue / QQ 群 / 邮箱。

这样维护者拿到的是“已经排除常见环境问题后的证据”,不是聊天记录和猜测。

文档

| 文档 | 用来干什么 |
| 完整指南 | 安装、首访、出站/入站、配对、日常使用 |
| AI 安装 | 一句话 / 完整提示词,让终端 Agent 安全安装 |
| 排障指南 | 人类 + AI 的第一轮问题定位 |
| 定位与诊断 | 收集证据、生成 Support Report |
| 兼容性 | DSH / 可选 SDK / provider 的证据等级 |
| 升级指南 | 更新、确认实际版本、清理残留、回滚 |
| 插件 API | ctx.notifier 消费方接口 |
| 架构 | 内部设计与运行时权威 |
| 变更记录 | 版本历史 |

联系方式

可稳定复现的产品问题,优先走AI 预排障后的 GitHub Issue。

- QQ:3622976831
- 邮箱:3622976831@qq.com
- QQ 群:947656156

不要通过 Issue、QQ 或邮件发送 Bot Token、Webhook Secret、Admin Token、完整 state.json 或未脱敏的私聊内容。

维护公告:至 2026-10-01 前作者因考试,回复可能较慢。

开发信息

Node.js 22+、ESM、零强制运行时依赖。部分 provider 的扫码/接入能力使用 optional dependency,仅在需要时加载。

开发、验证和发布规则见 AGENTS.md、OPERATIONS 和仓库测试。

License

MIT
预览分享卡片长什么样 ↓THEWOLFWALKER/dsh-notifier
分享 · DeepSeek Harness Hub
THEWOLFWALKER/dsh-notifier

DSH 通知与远程控制平面:28 条出站通道、6 项入站控制、原生通知与控制 UI、实时热应用、零运行时依赖。

回到顶部