用微信遥控 DeepSeek Harness:手机上聊天,电脑上的 DSH 干活。
66/100
综合分
334
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xcisxc29/dsh-wechat该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · platform
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 7 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-wechat-workspace(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 15:45:46
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 39 处,展示前 36 条)
- 发起网络请求packages/bundle/client.js:59
void fetch(`${PREFIX}/client-error`, { - 发起网络请求packages/bundle/client.js:349
const response = await fetch(path, { - 读取本地文件packages/bundle/src/cli.ts:364
if (!existsSync(params.file)) throw new Error(`读不到文件:${params.file}`) - 写入本地文件packages/bundle/src/cli.ts:572
mkdirSync(dir, { recursive: true }) - 写入本地文件packages/bundle/src/cli.ts:573
appendFileSync(join(dir, 'boot.log'), `${new Date().toISOString()} ${line}\n`, 'utf-8') - 读取本地文件packages/bundle/src/cli.ts:608
return await readFile(path) - 写入本地文件packages/bundle/src/host.ts:436
mkdirSync(dir, { recursive: true }) - 写入本地文件packages/bundle/src/host.ts:439
writeFileSync(path, media.data) - 读取本地文件packages/bundle/src/host.ts:738
const text = readFileSync(join(this.#home, 'wechat', BOOT_LOG_NAME), 'utf8') - 读取本地文件packages/bundle/src/host.ts:1573
const parsed = JSON.parse(readFileSync(this.#stateFilePath, 'utf-8')) as { - 读取本地文件packages/bundle/src/host.ts:2588
if (!existsSync(entry.path)) { - 读取本地文件packages/bundle/src/host.ts:2893
const data = await readFile(path) - 写入本地文件packages/bundle/src/host.ts:3335
await writeFile(path, text, 'utf8') - 写入本地文件packages/bundle/src/host.ts:3356
mkdirSync(dir, { recursive: true }) - 读取本地文件packages/bundle/src/host.ts:4086
const parsed = JSON.parse(readFileSync(stateFile, 'utf-8')) as { - 写入本地文件packages/bundle/src/host.ts:4125
mkdirSync(workspace, { recursive: true }) - 写入本地文件packages/bundle/src/host.ts:4251
mkdirSync(dir, { recursive: true }) - 发起网络请求packages/core/src/http.ts:201
const response = await fetch(url.toString(), { - 读取本地文件packages/core/src/media.ts:193
data: await readFile(params.path), - 读取本地文件packages/core/src/media.ts:212
data: await readFile(path), - 读取本地文件packages/core/src/media.ts:267
data: await readFile(params.path), - 发起网络请求packages/core/src/media.ts:598
const response = await fetch(params.url, { - 发起网络请求packages/core/src/media.ts:679
const response = await fetch(params.target, { - 读取本地文件packages/core/src/session-index.ts:164
const raw = await readFile(join(storeDir, name), 'utf-8') - 读取本地文件packages/core/src/session-index.ts:232
const dirs = await readdir(sessionsRoot, { withFileTypes: true }) - 读取本地文件packages/core/src/session-index.ts:245
const entries = await readdir(join(sessionsRoot, folder), { withFileTypes: true }) - 读取本地文件packages/core/src/session-index.ts:293
const entries = await readdir(sessionsRoot, { withFileTypes: true }) - 读取本地文件packages/core/src/session-index.ts:303
const entries = await readdir(join(sessionsRoot, folder), { withFileTypes: true }) - 读取本地文件packages/core/src/session-index.ts:385
await stat(join(indexDir, name)) - 读取本地文件packages/core/src/silk.ts:47
if (existsSync(join(dir, 'package.json'))) roots.push(dir) - 读取本地文件packages/core/src/state.ts:602
const parsed = JSON.parse(await readFile(this.file, 'utf-8')) as Partial<ChannelState> - 写入本地文件packages/core/src/state.ts:642
await mkdir(dirname(this.file), { recursive: true }) - 写入本地文件packages/core/src/state.ts:645
await writeFile(temp, `${JSON.stringify(state, null, 2)}\n`, { encoding: 'utf-8', mode: 0o600 }) - 写入本地文件packages/core/src/state.ts:647
await rename(temp, this.file) - 删除本地文件packages/core/src/state.ts:649
await rm(temp, { force: true }) - 读取本地文件packages/core/src/thumbnail.ts:121
if (existsSync(join(dir, 'package.json'))) roots.push(dir)
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
6 张 · 点击查看大图功能亮点
- 微信端远程操控
- 手机聊天下发指令
- 电脑端执行任务
README
由 DeepSeek 最新模型翻译生成dsh-wechat-plugin
用微信遥控 DeepSeek Harness:手机上聊天,电脑上的 DSH 干活。
不需要安装 OpenClaw,也不需要公网 IP。
能在当前的 DSH 桌面端上跑 —— 针对 DSH 0.2.1-rc.3 开发和实测,并会随桌面端的更新持续跟进。不少社区插件随着 DSH 升级已经悄悄不能用了;这个是一直维护的,每次改动都走 CI 发布。
左边是 16:16 的手机,正在读一条关于电脑时钟的答复;中间是同一时刻锁着屏的电脑;下面则是正在处理这轮对话的 DeepSeek Harness 窗口
上面这一张就是全部意思:电脑锁着屏,手机照样在用。16:16 那一刻,手机向这台电脑要了桌面上的一个文件、又问了它的时钟——两样都回来了,两块屏幕的状态栏是同一分钟;下面那个窗口才是真正干活的那个,两条请求都已经答完。
功能
- 文字双向:微信消息变成 DSH 提示词,回复发回微信
- 图片、文件、语音、视频:双向。收到的附件落盘到会话工作区并交给 agent;agent 也能用 send_to_wechat 把本机文件发给你
- 一个微信对话,多个 DSH 会话:/new /list /switch /model /current /cancel,或者直接说「换个对话」
- 手机上回答权限与提问:权限申请和多选提问会发到微信,回一个数字即可。
展开完整文档(README 剩余 1 节)
dsh-wechat-plugin
用微信遥控 DeepSeek Harness:手机上聊天,电脑上的 DSH 干活。
不需要安装 OpenClaw,也不需要公网 IP。
能在当前的 DSH 桌面端上跑 —— 针对 DSH 0.2.1-rc.3 开发和实测,并会随桌面端的更新持续跟进。不少社区插件随着 DSH 升级已经悄悄不能用了;这个是一直维护的,每次改动都走 CI 发布。
左边是 16:16 的手机,正在读一条关于电脑时钟的答复;中间是同一时刻锁着屏的电脑;下面则是正在处理这轮对话的 DeepSeek Harness 窗口
上面这一张就是全部意思:电脑锁着屏,手机照样在用。16:16 那一刻,手机向这台电脑要了桌面上的一个文件、又问了它的时钟——两样都回来了,两块屏幕的状态栏是同一分钟;下面那个窗口才是真正干活的那个,两条请求都已经答完。
功能
- 文字双向:微信消息变成 DSH 提示词,回复发回微信
- 图片、文件、语音、视频:双向。收到的附件落盘到会话工作区并交给 agent;agent 也能用 send_to_wechat 把本机文件发给你
- 一个微信对话,多个 DSH 会话:/new /list /switch /model /current /cancel,或者直接说「换个对话」
- 手机上回答权限与提问:权限申请和多选提问会发到微信,回一个数字即可。不在电脑旁也不会被卡住
- 设置页:DSH 的 设置 → 微信
用起来是什么样
| 玩游戏时收到定时叫醒 | workplace 工作区里的会话推送到微信 |
| 主动推送:会话可以自己找你。这里「16:39 叫我」在打游戏时到了——是 agent 找手机,不是手机找它 | 任何工作区都能推,不只是微信那个。这个会话在 workplace 里,照样能推到手机。哪些对话可以,是个设置项 |
| 电脑上改好文件发回来,以及从手机发文件给它看 | 语音控制,以及 agent 发图片回来 |
| 文件双向:左图是它在电脑上改好文件再发回来;右图是你从手机发个文档问它写了什么 | 语音进来,图片出去:不用打字,说就行。让它找张图,它会搜、下载、发给你,还标注来源 |
| | 微信设置页 |
| | 设置 → 微信:每个对话的权限、主动推送、附件合并窗口、回复上限、指令表、日志 |
安装
用于 DSH 桌面端 —— 需要 DSH 的工作区、工具和界面服务(也就是桌面端的标准组合),以及一台保持开机的电脑。针对 0.2.1-rc.3 实测,并随桌面端更新持续跟进。
侧栏点插件,选添加插件。这个输入框接受包名、Git 地址、压缩包或本地路径。
要装的名字是 dsh-wechat-plugin
仓库叫 dsh-wechat,但包名不是:请复制 dsh-wechat-plugin,别手打,注意后面那个 -plugin。安装命令必须和包名完全一致。
从 npm 装 —— 不需要额外配置
dsh-wechat-plugin
需要指定版本就带上:dsh-wechat-plugin@0.36.5。
从 GitHub 装 —— 仓库自行构建,适合跟分支或固定提交
https://github.com/xcisxc29/dsh-wechat
DSH 会克隆仓库并在本地构建。pnpm 会拦一次构建、要求你放行——这是正常的,任何 Git 安装的插件都会这样。DSH 会告诉你该加哪个键,形如这样,写在 ~/.dsh/profiles/desktop/pnpm-workspace.yaml 里:
allowBuilds:
dsh-wechat-workspace@git+file:///…/dsh-wechat#<commit>: true
大多数人不需要这个。 想固定到某个提交、跟某个分支,或者连不上 npm 时再用。
等安装完成,点立即启用,然后重启 DSH。
也可以从终端装
图形界面底层是 pnpm,所以同一件事也可以这样:
dsh plugin --profile desktop add dsh-wechat-plugin
dsh plugin --profile desktop add https://github.com/xcisxc29/dsh-wechat
此时要自己确认组合包已启用(立即启用做的就是这件事)——在 ~/.dsh/profiles/desktop/package.json 里:
{
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-wechat-plugin"
]
}
}
}
用本地打好的包装
pnpm install && pnpm run dist && pnpm run pack
产出 dsh-wechat-plugin-<version>.tgz
把这个 .tgz 的绝对路径粘进添加插件,或者交给命令行:
dsh plugin --profile desktop add /绝对路径/dsh-wechat-plugin-<version>.tgz
开始用
重启 DSH 后打开 设置 → 微信,点重新扫码,用手机微信扫出现的二维码并确认。之后在微信里发 你好,应该收到回复。
可选:语音转文字
微信语音是 SILK 格式。装了这个编解码器就能在本地转成 WAV:
dsh plugin --profile desktop add silk-wasm
不装也能用:原始 SILK 会落盘,连同服务端转写一起交给 agent。
用法
直接发消息就行,会送到 agent:
你好
下面这些指令用来控制你在跟哪个 DSH 对话讲话:
| 指令 | 作用 |
| /new | 开一个新对话。后面跟的字会成为标题:/new 修复登录 就是开一个叫「修复登录」的对话。不跟字的话,标题取自你的第一条消息 |
| /list | 直接进微信工作区那一层(每屏最多 10 条) |
| /list all | 列出本机的会话夹(工作区),每个一行、带会话数;回复编号或名字进入 |
| /switch 3 | 切到那一屏的第 3 个 |
| /switch e716f0 | 按行尾那个短 id 切——跟编号无关,永远不会过期 |
| 回复「查看其余」 | 往下翻十条(两层都能用,一直翻到底)。编号跨屏连续(1–10,然后 11–20) |
| 直接回 3、名字或行尾 id | 列表就在眼前时不用打 /switch |
| 引用列表消息 → /switch 3 | 按那一屏的编号切,编号冻结在那条消息里 |
| /model | 看有哪些模型,以及每个模型的推理等级,标出当前用的那个 |
| /model 2 | 切到列表里的第 2 个,也可以直接发模型名字 |
| /model 等级 高 | 换当前模型的推理等级(等级名字就是列表里印的那些) |
| /model 2 等级 高 | 换模型的同时指定等级 |
| /current | 当前在哪个对话 |
| /cancel | 中断正在跑的任务 |
| /help | 这份列表 |
空格可以省:/switch3、/switch 3、/switch:3 都一样。
编号会过期:会话在你读列表时还在跑,等你回「3」时第 3 行可能已经换人了。所以每行末尾都带一个最多 6 个字符的短 id,直接回它或 /switch 都收;或者引用那一屏的列表消息再回编号,编号就按那条消息印的算。
列表分两层,每屏 10 条:/list 直接进本工作区的会话;/list all 列出会话夹(工作区),回编号或名字进入。两层都用「查看其余」往下翻十条,编号跨屏连续(1–10,然后 11–20),翻到底会明说而不是继续邀请你翻。进会话夹只改浏览位置,不改绑定——真要切过去,还要在里面再选一个会话。
说大白话也行:「换个对话」「看下有哪些对话」「把推理等级调高」「停一下」都认。判断意图的是 agent,不是死规则,并且切换成功或失败都会明确告诉你。
安全性
只有你自己能碰到它。 渠道只连腾讯官方的 iLink 网关,别的什么都不连——没有第三方、没有自建中转。你扫码时,机器人会和你的微信账号做密码学绑定:它拿到的 token 里嵌着你的 ilink_user_id,而服务端只投递这一个账号发来的消息。机器人不是微信联系人——没有名片、搜不到、别人加不了。
所以不存在"陌生人发条消息就能操作你电脑"这条路,也因此不需要白名单:协议层本身就是一道白名单。
还有两件事是真的,值得知道:
微信来的对话默认是「完全访问」,agent 不会先问你。 这是有意的:权限询问会发到微信,然后任务就停在那里等你回答——在手机上,等于每条命令都卡在一段你已经离开的对话里。想恢复和桌面端一样的把关,把设置页的微信对话的权限改成「跟随 DSH 设置」。
agent 以你的身份运行。 它能执行命令、读写文件,用的是你用户的权限——这就是它的用途,也意味着你能在这台电脑上做的事,它都能做。所以:交代完任务扫一眼再走,离开时锁屏。锁屏不影响它干活(见使用手册),但能挡住路过的人动你的桌面。
这台电脑上任何会话都能主动推送到你微信(默认开启)。 「做完了告诉我」靠的就是它:干活的会话通常不是微信绑定的那个,没有这个能力它就没法汇报自己的结果。关掉允许其他会话推送到微信即可恢复更严的规则——只有绑定会话能发。
文档
| docs/HANDBOOK-USER.md | 使用手册:从安装到排错,不需要技术背景 |
| docs/HANDBOOK-DEV.md | 开发手册:开发历程、版本迭代、怎么继续改 |
| SETTINGS.md | 每条设置的实际作用 |
| docs/INTERNALS.md | 协议依据、架构、两个包的区别 |
| docs/PROGRESS.md | 各档功能的完成情况与验证方式 |
| docs/POSTMORTEM.md | 开发中踩过的坑与根因 |
| docs/RELEASING.md | 怎么发一个版本 |
| examples/ | 只用 core 的完整例子:回声机器人、主动发文件 |
开发
pnpm install
pnpm build # 只编译,保留 @dsh-wechat/core 引用(pack 要靠它改写)
pnpm run dist # build + 内嵌 core,产出可直接加载的形态
pnpm typecheck
pnpm test # 328 项
pnpm check # build + typecheck + test
pnpm run pack # 需要先 dist
pnpm run verify-pack # 解包、校验清单文件、按 DSH 的方式挂载一次
改完 core 要重新 pnpm build。 测试通过 node_modules 解析到 lib/,源码改了没重建时跑的是旧代码,通过也不作数。
许可证
MIT — 见 LICENSE。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
xcisxc29/dsh-wechat
用微信遥控 DeepSeek Harness:手机上聊天,电脑上的 DSH 干活。
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,778已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,110已汉化DeepSeek 客户端
70.9
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,031已汉化DSH
70.7