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

Telegram 任务桥 wfh86421/dsh-telegram-bridge

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

在手机上派任务给本机 AI,答案回传 Telegram

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

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

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wfh86421/dsh-telegram-bridge
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

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

仓库 package.json 标记 private,未发布到 npm,需从源码安装;安装清单取自 src/host-plugin/package.json

展开查看检查明细 ↓

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

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

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

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

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

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 55 处,展示前 36 条)
  • 读取本地文件
    src/headless-bridge/tg-bridge.mjs:79
    const j = JSON.parse(readFileSync(SECRETS, 'utf8').replace(/^ FEFF/, ''));
  • 发起网络请求
    src/headless-bridge/tg-bridge.mjs:90
    const req = https.request({
  • 读取本地文件
    src/headless-bridge/tg-bridge.mjs:139
    function ensureDir(d) { if (!existsSync(d)) mkdirSync(d, { recursive: true }); }
  • 写入本地文件
    src/headless-bridge/tg-bridge.mjs:139
    function ensureDir(d) { if (!existsSync(d)) mkdirSync(d, { recursive: true }); }
  • 读取本地文件
    src/headless-bridge/tg-bridge.mjs:142
    const s = JSON.parse(readFileSync(STATE, 'utf8').replace(/^ FEFF/, ''));
  • 写入本地文件
    src/headless-bridge/tg-bridge.mjs:147
    function saveState(s) { ensureDir(OPTS.stateDir); writeFileSync(STATE, JSON.stringify(s, null, 1), 'utf8'); }
  • 写入本地文件
    src/headless-bridge/tg-bridge.mjs:148
    function logRow(row) { try { ensureDir(OPTS.stateDir); appendFileSync(LOG, JSON.stringify(row) + '\n', 'utf8'); } catch {} }
  • 写入本地文件
    src/headless-bridge/tg-bridge.mjs:149
    function beat() { try { ensureDir(join(PROFILE_DIR, 'ops', 'state')); writeFileSync(HEARTBEAT, now8(), 'utf8'); } catch {} }
  • 读取本地文件
    src/headless-bridge/tg-bridge.mjs:150
    function clearBeat() { try { if (existsSync(HEARTBEAT)) unlinkSync(HEARTBEAT); } catch {} }
  • 删除本地文件
    src/headless-bridge/tg-bridge.mjs:150
    function clearBeat() { try { if (existsSync(HEARTBEAT)) unlinkSync(HEARTBEAT); } catch {} }
  • 读取本地文件
    src/headless-bridge/tg-bridge.mjs:155
    if (existsSync(LOCK)) {
  • 读取本地文件
    src/headless-bridge/tg-bridge.mjs:157
    try { old = JSON.parse(readFileSync(LOCK, 'utf8')); } catch {}
  • 写入本地文件
    src/headless-bridge/tg-bridge.mjs:161
    writeFileSync(LOCK, JSON.stringify({ pid: process.pid, startedAt: now8() }), 'utf8');
  • 删除本地文件
    src/headless-bridge/tg-bridge.mjs:164
    function releaseLock() { try { if (existsSync(LOCK)) unlinkSync(LOCK); } catch {} }
  • 写入本地文件
    src/headless-bridge/tg-bridge.mjs:426
    writeFileSync(stubOk, 'console.log("STUB-OK 最終答案");process.exit(0);\n', 'utf8');
  • 删除本地文件
    src/headless-bridge/tg-bridge.mjs:448
    if (existsSync(LOCK)) unlinkSync(LOCK);
  • 删除本地文件
    src/headless-bridge/tg-bridge.mjs:454
    if (existsSync(LOCK)) unlinkSync(LOCK);
  • 读取本地文件
    src/host-plugin/lib/answerer.js:45
    if (!existsSync(stateDir)) mkdirSync(stateDir, { recursive: true });
  • 写入本地文件
    src/host-plugin/lib/answerer.js:45
    if (!existsSync(stateDir)) mkdirSync(stateDir, { recursive: true });
  • 写入本地文件
    src/host-plugin/lib/answerer.js:46
    appendFileSync(join(stateDir, 'tg-session.jsonl'), JSON.stringify(row) + '\n', 'utf8');
  • 读取本地文件
    src/host-plugin/lib/index.js:80
    const j = JSON.parse(readFileSync(cfg.secretsFile, 'utf8').replace(/^ FEFF/, ''));
  • 读取本地文件
    src/host-plugin/lib/index.js:86
    const ensureDir = (d) => { if (!existsSync(d)) mkdirSync(d, { recursive: true }); };
  • 写入本地文件
    src/host-plugin/lib/index.js:86
    const ensureDir = (d) => { if (!existsSync(d)) mkdirSync(d, { recursive: true }); };
  • 读取本地文件
    src/host-plugin/lib/index.js:89
    const s = JSON.parse(readFileSync(STATE, 'utf8').replace(/^ FEFF/, ''));
  • 写入本地文件
    src/host-plugin/lib/index.js:93
    const saveState = () => { try { ensureDir(stateDir); writeFileSync(STATE, JSON.stringify(state, null, 1), 'utf8'); } catch (e) { warn(`狀態寫入失敗:${e.mess
  • 写入本地文件
    src/host-plugin/lib/index.js:94
    const logRow = (row) => { try { ensureDir(stateDir); appendFileSync(LOG, JSON.stringify(row) + '\n', 'utf8'); } catch { } };
  • 写入本地文件
    src/host-plugin/lib/index.js:95
    const beat = () => { try { ensureDir(join(cfg.workspacePath, 'ops', 'state')); writeFileSync(HEARTBEAT, now8(), 'utf8'); } catch {} };
  • 读取本地文件
    src/host-plugin/lib/index.js:96
    const clearBeat = () => { try { if (existsSync(HEARTBEAT)) unlinkSync(HEARTBEAT); } catch {} };
  • 删除本地文件
    src/host-plugin/lib/index.js:96
    const clearBeat = () => { try { if (existsSync(HEARTBEAT)) unlinkSync(HEARTBEAT); } catch {} };
  • 读取本地文件
    src/host-plugin/lib/index.js:102
    if (existsSync(LOCK)) {
  • 读取本地文件
    src/host-plugin/lib/index.js:104
    try { old = JSON.parse(readFileSync(LOCK, 'utf8')); } catch {}
  • 写入本地文件
    src/host-plugin/lib/index.js:108
    writeFileSync(LOCK, JSON.stringify({ pid: process.pid, startedAt: now8() }), 'utf8');
  • 删除本地文件
    src/host-plugin/lib/index.js:112
    const releaseLock = () => { try { if (haveLock && existsSync(LOCK)) unlinkSync(LOCK); } catch {} haveLock = false; };
  • 发起网络请求
    src/host-plugin/lib/index.js:117
    const req = https.request({
  • 发起网络请求
    src/host-plugin/lib/shared.js:22
    const req = https.request({
  • 读取本地文件
    src/host-plugin/lib/shared.js:42
    const j = JSON.parse(readFileSync(secretsFile, 'utf8').replace(/^ FEFF/, ''));
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 多轮会话插件

README

由 DeepSeek 最新模型翻译生成
dsh-telegram-bridge Telegram ↔ DeepSeek Harness (DSH):在手机上派工给本机的 AI agent,答案回到 Telegram。 两种实现:A=独立程序(headless 一次性任务);B=DSH host 插件(真的 Session、GUI 看得到、可多轮接续)。 Send tasks to a local DeepSeek Harness agent from Telegram, and get the answer back. Two implementations: a standalone headless runner (A) and a host plugin that creates a real, GUI-visible, multi-turn session (B). 这个套件包含什么 | 目录 | 内容 | | docs/ | 教学手册(10 份):总览/快速开始/开发 SOP/契约清单/功能与权限/疑难排解/测试计划/二次开发 | | src/host-plugin/ | 机制 B:dsh-tg-session 插件(零外部依赖,含 25 项测试) | | src/headless-bridge/ | 机制 A:tg-bridge.mjs+PowerShell 包装+启动器(含 9 项自我测试) |
展开完整文档(README 剩余 1 节)
dsh-telegram-bridge

Telegram ↔ DeepSeek Harness (DSH):在手机上派工给本机的 AI agent,答案回到 Telegram。
两种实现:A=独立程序(headless 一次性任务);B=DSH host 插件(真的 Session、GUI 看得到、可多轮接续)。

Send tasks to a local DeepSeek Harness agent from Telegram, and get the answer back. Two implementations: a standalone headless runner (A) and a host plugin that creates a real, GUI-visible, multi-turn session (B).

这个套件包含什么

| 目录 | 内容 |
| docs/ | 教学手册(10 份):总览/快速开始/开发 SOP/契约清单/功能与权限/疑难排解/测试计划/二次开发 |
| src/host-plugin/ | 机制 B:dsh-tg-session 插件(零外部依赖,含 25 项测试) |
| src/headless-bridge/ | 机制 A:tg-bridge.mjs+PowerShell 包装+启动器(含 9 项自我测试) |
| examples/ | 设定范例(cordis.patch.yml、状态档) |

没有包含:任何 token/chat id/日志(凭证一律留在 ~/.dsh/notify-secrets.json,在 profile 之外)。

30 秒选机制

| | B(建议) | A(备援) |
| 你的 TG 讯息 | 变成真的 Session(GUI 看得到、可接手、可多轮) | 一次性 headless 任务(GUI 看不到) |
| 需要核准时 | ⏳ 逾时回报,可在 GUI 按核准后继续 | ❌ 没有核准管道 → 失败 |
| 安装 | 中(装 bundle+改设定+重启 DSH) | 低(复制 3 个档) |

⚠️ 两者不可同时跑:都靠 getUpdates 轮询同一支 bot,会互抢讯息。

快速开始

A:headless 桥接器(10 分钟)

copy src\headless-bridge\tg-bridge.mjs \tools\
copy src\headless-bridge\run-tg-bridge.ps1 \tools\
node \tools\tg-bridge.mjs --selftest --dry-run --state-dir .\tempselftest # 应 9/9
powershell -File \tools\run-tg-bridge.ps1 -Test "用一行回我 OK" # 真的发一则 powershell -File \tools\run-tg-bridge.ps1 # 常驻

B:host 插件(30 分钟)

xcopy /E /I src\host-plugin \packages\dsh-tg-session
cmd /c mklink /J "\node_modules\dsh-tg-session" "\packages\dsh-tg-session"
在 \package.json 的 dsh.profile.bundles 追加 "dsh-tg-session" 在 \cordis.patch.yml 设定 tg-session 那一列(见 docs/01)
dsh --profile --dump-config | Select-String 'tg-session' # 必须出现
重启 DSH

完整步骤与设定键:docs/01-overview-and-quickstart.md

它能做到什么程度(重点)

| | 范围 |
| 看 | 整台电脑都能读(不受限) |
| 改 | 只限你设定的工作区(workspacePath)+允许的暂存区 |
| 要核准 | 写到工作区外、对外网络、传讯息 → 无人时会卡住并通知你 |
| 直接拒绝 | 删除/凭证/远端硬体/系统/大量操作(关键字与类别白名单) |
| 做不到 | 图片档案、历史讯息、看中间过程、DSH 关机时 |
| 费用 | 每则 ≈¥0.03 起(固定前缀 ~1 万 token);内建每日上限 |

细节与实测数字:docs/07-capability-and-permissions.md

文件地图

| 想做的事 | 看这份 |
| 搞清楚要学什么 | docs/00-index.md |
| 快速上手 | docs/01-overview-and-quickstart.md |
| 从零开发一个插件 | docs/05-development-sop.md |
| 要改/延伸(API 契约) | docs/06-contracts.md |
| 功能与权限的界线 | docs/07-capability-and-permissions.md |
| 坏了 | docs/08-troubleshooting.md |
| 上线前测试 | docs/09-telegram-test-plan.md |
| 换 IM/加功能/多人用 | docs/10-second-development.md |

需求

| 项目 | 版本(本套件实测) |
| DeepSeek Harness | @deepseek-ai/dsh 0.1.5-rc.1 |
| Node | v22.23.2 |
| PowerShell | 5.1(Windows)/含 PowerShell 7 亦可 |
| Telegram bot | 任意(用 getUpdates 轮询,不需要公开 IP) |

DSH 是 preview 软件,API 会变。升级后请照 docs/06-contracts.md §11 重跑检查。

安全(请务必读)

- 这个功能=让远程消息在你电脑上执行 agent。只认一个 chat id、密钥放在 profile 之外、沙箱只允许工作区、危险类别硬拒、有每日成本上限。
- 不要把 token 贴进任何文件或消息;~/.dsh/notify-secrets.json 不要进版控。
- 要给他人用 → 另开一支 bot + 另一个 profile,不要共用。

授权

MIT(见 LICENSE)。DSH 本体为 DeepSeek 所有,本套件只使用其公开接口。
预览分享卡片长什么样 ↓wfh86421/dsh-telegram-bridge
分享 · DeepSeek Harness Hub
wfh86421/dsh-telegram-bridge

在手机上派任务给本机 AI,答案回传 Telegram

这是你的仓库?认领条目

回到顶部