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

消息中枢管家 SteelUnion/dsh-softsensor-hub

DeepSeek Harness
SteelUnion8 天前有提交已提供中文文档扫描:含敏感能力

统一收集各类通知,按轻重缓急决定是否提醒你

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add SteelUnion/dsh-softsensor-hub
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 96 处,展示前 68 条)
  • 读取本地文件
    lib/index.js:147
    if (!existsSync(p)) return { exists: false, version: null };
  • 读取本地文件
    lib/index.js:148
    const text = readFileSync(p, 'utf8');
  • 读取本地文件
    lib/index.js:201
    if (!existsSync(cfgPath)) return defaults;
  • 读取本地文件
    lib/index.js:203
    const c = JSON.parse(readFileSync(cfgPath, 'utf8'));
  • 读取本地文件
    lib/index.js:242
    if (!existsSync(p)) mkdirSync(p, { recursive: true });
  • 写入本地文件
    lib/index.js:242
    if (!existsSync(p)) mkdirSync(p, { recursive: true });
  • 读取本地文件
    lib/index.js:261
    if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:261
    if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:262
    appendFileSync(join(dir, name), `${JSON.stringify(obj)}\n`, 'utf8');
  • 写入本地文件
    lib/index.js:293
    writeFileSync(target, raw, 'utf8');
  • 请求外部主机api.github.com
    lib/index.js:1040
    const r = await fetch('https://api.github.com/repos/SteelUnion/dsh-relay/releases/latest', {
  • 发起网络请求
    lib/index.js:1040
    const r = await fetch('https://api.github.com/repos/SteelUnion/dsh-relay/releases/latest', {
  • 写入本地文件
    lib/index.js:1554
    renameSync(src, join(ROOT, 'archive', `rejected-${Date.now()}-${f}`));
  • 写入本地文件
    lib/index.js:1565
    renameSync(src, join(ROOT, 'archive', `deduped-${Date.now()}-${f}`));
  • 读取本地文件
    lib/message.mjs:33
    if (!existsSync(peersDir)) return map;
  • 读取本地文件
    lib/message.mjs:34
    for (const f of readdirSync(peersDir)) {
  • 读取本地文件
    lib/message.mjs:37
    const p = JSON.parse(readFileSync(join(peersDir, f), 'utf8'));
  • 读取本地文件
    lib/rules.mjs:255
    if (!existsSync(this.filePath)) {
  • 读取本地文件
    lib/rules.mjs:260
    const text = readFileSync(this.filePath, 'utf8');
  • 写入本地文件
    lib/store.mjs:150
    mkdirSync(this.dir, { recursive: true });
  • 读取本地文件
    lib/store.mjs:168
    for (const f of readdirSync(this.dir)) {
  • 读取本地文件
    lib/store.mjs:172
    for (const line of readFileSync(join(this.dir, f), 'utf8').split('\n')) {
  • 写入本地文件
    lib/store.mjs:188
    appendFileSync(this._dayFile(this._dayOf(event)), `${JSON.stringify(event)}\n`, 'utf8');
  • 读取本地文件
    lib/store.mjs:197
    for (const f of readdirSync(this.dir).sort()) {
  • 读取本地文件
    lib/store.mjs:200
    for (const line of readFileSync(join(this.dir, f), 'utf8').split('\n')) {
  • 读取本地文件
    lib/store.mjs:237
    if (!existsSync(f)) return [];
  • 读取本地文件
    lib/store.mjs:239
    for (const line of readFileSync(f, 'utf8').split('\n')) {
  • 删除本地文件
    lib/store.mjs:280
    try { unlinkSync(join(this.dir, f)); } catch { }
  • 写入本地文件
    lib/store.mjs:288
    writeFileSync(tmp, arr.map((e) => JSON.stringify(e)).join('\n') + '\n', 'utf8');
  • 写入本地文件
    lib/store.mjs:289
    renameSync(tmp, target);
  • 读取本地文件
    lib/state.mjs:126
    if (!existsSync(file)) return new Map();
  • 读取本地文件
    lib/state.mjs:127
    const raw = JSON.parse(readFileSync(file, 'utf8'));
  • 写入本地文件
    lib/state.mjs:139
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/state.mjs:142
    writeFileSync(tmp, JSON.stringify(Object.fromEntries(mem), null, 2), 'utf8');
  • 写入本地文件
    lib/state.mjs:143
    renameSync(tmp, file);
  • 读取本地文件
    lib/config-sync.mjs:187
    if (!existsSync(configPath)) return { exists: false, data: null, hasBanner: false };
  • 读取本地文件
    lib/config-sync.mjs:188
    const data = JSON.parse(readFileSync(configPath, 'utf8'));
  • 写入本地文件
    lib/config-sync.mjs:212
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/config-sync.mjs:215
    writeFileSync(tmp, JSON.stringify(withBanner, null, 2) + '\n', 'utf8');
  • 写入本地文件
    lib/config-sync.mjs:216
    renameSync(tmp, configPath);
  • 读取本地文件
    lib/collectors/finance.mjs:124
    if (!existsSync(dbPath)) {
  • 发起网络请求
    lib/collectors/weather.mjs:184
    const r = await fetch(url, { signal: ctrl.signal, headers: { 'user-agent': 'dsh-relay/weather' } });
  • 读取本地文件
    lib/credentials.mjs:116
    if (master !== null && existsSync(this.file)) {
  • 读取本地文件
    lib/credentials.mjs:118
    const doc = JSON.parse(readFileSync(this.file, 'utf8'));
  • 读取本地文件
    lib/credentials.mjs:155
    if (existsSync(this.file)) {
  • 读取本地文件
    lib/credentials.mjs:157
    const cur = JSON.parse(readFileSync(this.file, 'utf8'));
  • 写入本地文件
    lib/credentials.mjs:163
    mkdirSync(dirname(this.file), { recursive: true });
  • 写入本地文件
    lib/credentials.mjs:165
    writeFileSync(tmp, JSON.stringify(doc, null, 2), 'utf8');
  • 写入本地文件
    lib/credentials.mjs:166
    renameSync(tmp, this.file);
  • 读取本地文件
    lib/credentials.mjs:175
    if (existsSync(this.file)) {
  • 读取本地文件
    lib/credentials.mjs:177
    const doc = JSON.parse(readFileSync(this.file, 'utf8'));
  • 读取本地文件
    pack.mjs:88
    const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8'));
  • 读取本地文件
    pack.mjs:118
    if (!existsSync(abs)) {
  • 读取本地文件
    pack.mjs:122
    files.push({ rel, abs, size: statSync(abs).size });
  • 读取本地文件
    pack.mjs:130
    const raw = readFileSync(f.abs);
  • 写入本地文件
    pack.mjs:184
    mkdirSync(DIST, { recursive: true });
  • 写入本地文件
    pack.mjs:185
    writeFileSync(outPath, Buffer.concat([...locals, cdBuf, eocd]));
  • 读取本地文件
    pack.mjs:187
    const total = statSync(outPath).size;
  • 读取本地文件
    relay.mjs:22
    if (!existsSync(d)) mkdirSync(d, { recursive: true });
  • 写入本地文件
    relay.mjs:22
    if (!existsSync(d)) mkdirSync(d, { recursive: true });
  • 读取本地文件
    relay.mjs:28
    if (!existsSync(p)) return [];
  • 读取本地文件
    relay.mjs:30
    for (const line of readFileSync(p, 'utf8').split(/ ? /)) {
  • 读取本地文件
    relay.mjs:51
    if (existsSync(p)) {
  • 写入本地文件
    relay.mjs:56
    writeFileSync(
  • 读取本地文件
    relay.mjs:85
    if (!existsSync(p)) {
  • 删除本地文件
    relay.mjs:89
    unlinkSync(p);
  • 读取本地文件
    relay.mjs:95
    const files = readdirSync(PEERS).filter((f) => f.endsWith('.json'));
  • 写入本地文件
    relay.mjs:141
    writeFileSync(join(INBOX, name), JSON.stringify(msg, null, 2), 'utf8');
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:api.github.com

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

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

DeepSeek Harness 的消息中枢与管家框架:事件模型、热重载规则、事件存储、可插拔采集器。内置系统监控在进程内运行。

README

由 DeepSeek 最新模型翻译生成
dsh-softsensor-hub 消息中枢。收消息、判轻重、告诉智能体。它自己不动手。 版本 0.6.1。测试 793 项,全过。 它解决什么问题 DSH 里有很多东西想通知你:系统告警、邮件、行情、天气。 它们各自写一套投递逻辑很啰嗦。这个插件统一收,统一判断该不该吵醒你。 判断规则可配置。默认:critical 立刻叫,warn 攒批,info 只留档。 装完发生什么 首次启动会从 config.template.json 复制一份 config.json。 配置文件里所有 null 都是待填项,旁边有 _xxx说明 提示。 然后跑一次配置向导。能自证的项自动标好,剩下的等你选。 详细步骤见 INSTALL.md。 四个采集器 | 采集器 | 干什么 | 默认 | | system | 内存、磁盘、事件循环延迟 | 开 | | weather | 天气,按城市或 IP 定位 | 开 | | mail | IMAP 收邮件 | 关 | | finance | 读量化库,产行情事件 | 关 | 采集器跑在插件进程里,不需要外部守护进程。 外部进程一死,采集就断,而且没人知道。这个坑踩过一次,不再踩。 目录 安装目录就是数据目录。卸载前记得备份整个目录。
展开完整文档(README 剩余 1 节)
dsh-softsensor-hub

消息中枢。收消息、判轻重、告诉智能体。它自己不动手。

版本 0.6.1。测试 793 项,全过。

它解决什么问题

DSH 里有很多东西想通知你:系统告警、邮件、行情、天气。

它们各自写一套投递逻辑很啰嗦。这个插件统一收,统一判断该不该吵醒你。

判断规则可配置。默认:critical 立刻叫,warn 攒批,info 只留档。

装完发生什么

首次启动会从 config.template.json 复制一份 config.json。

配置文件里所有 null 都是待填项,旁边有 _xxx说明 提示。

然后跑一次配置向导。能自证的项自动标好,剩下的等你选。

详细步骤见 INSTALL.md。

四个采集器

| 采集器 | 干什么 | 默认 |
| system | 内存、磁盘、事件循环延迟 | 开 |
| weather | 天气,按城市或 IP 定位 | 开 |
| mail | IMAP 收邮件 | 关 |
| finance | 读量化库,产行情事件 | 关 |

采集器跑在插件进程里,不需要外部守护进程。

外部进程一死,采集就断,而且没人知道。这个坑踩过一次,不再踩。

目录

安装目录就是数据目录。卸载前记得备份整个目录。

dsh-softsensor-hub\
├── config.json 你的配置 ├── logs\ 所有日志 ├── inbox\ archive\ 消息队列 ├── peers\ 对端登记 ├── data\ 事件库、凭据库 └── lib\ test\ schema\ 代码与测试

数据放在别处也行。改 config.json 的 root 即可。

日志

全在 logs\,一行一个 JSON。

排错先看 logs\errors.jsonl。

每个文件管什么,见 INSTALL.md 第五节。

开发

node test/zz-all.mjs # 全部测试
node test/zz-check.mjs # 运维体检
node pack.mjs # 打包到 dist/

打包用白名单。日志、凭据、配置不进包。

许可

MIT,见 LICENSE。
预览分享卡片长什么样 ↓SteelUnion/dsh-softsensor-hub
分享 · DeepSeek Harness Hub
SteelUnion/dsh-softsensor-hub

统一收集各类通知,按轻重缓急决定是否提醒你

回到顶部