DeepSeek Harness (DSH) 微信桥接插件:三端通用,host 工具 + Web 管理面板
38.1/100
综合分
5
GitHub 星标
469
npm 周下载
—/5
用户评分
数据截至 2026/9/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @lanbaolu/dsh-wechat-bridgenpm 源 · @lanbaolu/dsh-wechat-bridge 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · platform
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包@lanbaolu/dsh-wechat-bridge @ 0.9.1
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 03:45:59
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 134 处,展示前 92 条)
- 写入本地文件lib/index.js:53
mkdirSync(dataDir, { recursive: true }); - 写入本地文件lib/index.js:54
mkdirSync(join(dataDir, 'logs'), { recursive: true }); - 写入本地文件lib/index.js:59
mkdirSync(dataDir, { recursive: true }); - 写入本地文件lib/index.js:61
appendFileSync(pluginLogPath, line, 'utf8'); - 读取本地文件lib/index.js:86
const raw = JSON.parse(readFileSync(sessionIdMapPath, 'utf8')); - 写入本地文件lib/index.js:94
mkdirSync(dataDir, { recursive: true }); - 写入本地文件lib/index.js:95
writeFileSync(sessionIdMapPath, JSON.stringify(map, null, 2) + '\n', 'utf8'); - 读取本地文件lib/index.js:141
const raw = JSON.parse(readFileSync(selectedSessionIdPath, 'utf8')); - 读取本地文件lib/index.js:404
const files = readdirSync(accountsDir).filter((file) => file.endsWith('.json')); - 读取本地文件lib/index.js:410
const stat = statSync(join(accountsDir, file)); - 读取本地文件lib/index.js:856
const raw = readFileSync(pidPath, 'utf8').trim(); - 读取本地文件lib/index.js:897
if (!existsSync(script)) { - 执行外部命令来自配置/变量lib/index.js:901
const child = spawn(process.execPath, [script, 'start'], { - 删除本地文件lib/index.js:926
unlinkSync(pidPath); - 删除本地文件lib/index.js:962
unlinkSync(pidPath); - 发起网络请求lib/index.js:1464
const resp = await fetch(`http://127.0.0.1:${info.port}/notify/status`, { - 发起网络请求lib/index.js:1497
const resp = await fetch(`http://127.0.0.1:${info.port}/pending/status`, { - 发起网络请求lib/index.js:1532
const resp = await fetch(`http://127.0.0.1:${info.port}/notify`, { - 发起网络请求lib/index.js:1580
const resp = await fetch(`http://127.0.0.1:${info.port}/approval`, { - 发起网络请求lib/client.js:180
fetch(`${API_BASE}/status`, { cache: "no-store" }), - 发起网络请求lib/client.js:181
fetch(`${API_BASE}/projects`, { cache: "no-store" }), - 发起网络请求lib/client.js:182
fetch(`${API_BASE}/notify/status`, { cache: "no-store" }) - 发起网络请求lib/client.js:200
const pendingRes = await fetch(`${API_BASE}/pending/status`, { cache: "no-store" }); - 发起网络请求lib/client.js:207
const trustRes = await fetch(`${API_BASE}/trust`, { cache: "no-store" }); - 发起网络请求lib/client.js:214
const cfgRes = await fetch(`${API_BASE}/config`, { cache: "no-store" }); - 发起网络请求lib/bridge/wechat/login.js:12
const res = await fetch(QR_CODE_URL); - 发起网络请求lib/bridge/wechat/login.js:38
res = await fetch(url, { signal: controller.signal }); - 读取本地文件lib/bridge/store.js:15
const raw = readFileSync(filePath, "utf-8"); - 写入本地文件lib/bridge/store.js:24
renameSync(filePath, `${filePath}.corrupt-${Date.now()}`); - 写入本地文件lib/bridge/store.js:39
mkdirSync(dirname(filePath), { recursive: true }); - 写入本地文件lib/bridge/store.js:41
writeFileSync(filePath, raw, "utf-8"); - 写入本地文件lib/bridge/store.js:43
chmodSync(filePath, 0o600); - 读取本地文件lib/bridge/trust.js:28
const raw = readFileSync(path, 'utf8'); - 写入本地文件lib/bridge/trust.js:53
renameSync(path, corruptPath); - 写入本地文件lib/bridge/trust.js:70
mkdirSync(dirname(path), { recursive: true }); - 写入本地文件lib/bridge/trust.js:71
writeFileSync(path, JSON.stringify(file, null, 2) + '\n', 'utf8'); - 写入本地文件lib/bridge/trust.js:73
chmodSync(path, FILE_MODE); - 读取本地文件lib/bridge/config.js:10
const content = readFileSync(CONFIG_PATH, "utf-8"); - 写入本地文件lib/bridge/config.js:21
mkdirSync(config.workingDirectory, { recursive: true }); - 写入本地文件lib/bridge/config.js:26
mkdirSync(config.workingDirectory, { recursive: true }); - 写入本地文件lib/bridge/config.js:55
mkdirSync(DATA_DIR, { recursive: true }); - 写入本地文件lib/bridge/config.js:71
writeFileSync(CONFIG_PATH, JSON.stringify(data, null, 2) + "\n", "utf-8"); - 写入本地文件lib/bridge/config.js:73
chmodSync(CONFIG_PATH, 0o600); - 读取本地文件lib/bridge/wechat/accounts.js:30
const files = readdirSync(ACCOUNTS_DIR).filter((f) => f.endsWith('.json')); - 读取本地文件lib/bridge/wechat/accounts.js:36
const stat = statSync(join(ACCOUNTS_DIR, file)); - 读取本地文件lib/bridge/logger.js:9
const files = readdirSync(LOG_DIR) - 删除本地文件lib/bridge/logger.js:13
unlinkSync(join(LOG_DIR, files.shift())); - 写入本地文件lib/bridge/logger.js:42
mkdirSync(LOG_DIR, { recursive: true }); - 写入本地文件lib/bridge/logger.js:59
appendFileSync(getLogFilePath(), line, "utf-8"); - 发起网络请求lib/bridge/dsh-client.js:16
const res = await fetch(`${this.baseUrl}/api/status`, { - 发起网络请求lib/bridge/dsh-client.js:25
const res = await fetch(`${this.baseUrl}/api/prompt`, { - 发起网络请求lib/bridge/dsh-client.js:38
await fetch(`${this.baseUrl}/api/stop`, { - 发起网络请求lib/bridge/dsh-client.js:46
await fetch(`${this.baseUrl}/api/clear`, { - 发起网络请求lib/bridge/dsh-client.js:58
const res = await fetch(`${this.baseUrl}/api/approval/decide`, { - 发起网络请求lib/bridge/dsh-client.js:70
const res = await fetch(`${this.baseUrl}/api/projects`, { - 执行外部命令来自配置/变量lib/bridge/main.js:56
sleepGuard = spawn(cmd.cmd, cmd.args, { stdio: 'ignore', windowsHide: true }); - 写入本地文件lib/bridge/main.js:98
mkdirSync(DATA_DIR, { recursive: true }); - 写入本地文件lib/bridge/main.js:102
writeFileSync(contextTokensPath(), JSON.stringify({ tokens, updatedAt: Date.now() }) + '\n', 'utf8'); - 写入本地文件lib/bridge/main.js:104
writeFileSync(contextTokenPath(), JSON.stringify({ token: lastContextToken, updatedAt: Date.now() }) + '\n', 'utf8'); - 写入本地文件lib/bridge/main.js:107
chmodSync(contextTokensPath(), 0o600); - 写入本地文件lib/bridge/main.js:108
chmodSync(contextTokenPath(), 0o600); - 读取本地文件lib/bridge/main.js:118
const parsed = JSON.parse(readFileSync(contextTokensPath(), 'utf8')); - 读取本地文件lib/bridge/main.js:129
const parsed = JSON.parse(readFileSync(contextTokenPath(), 'utf8')); - 读取本地文件lib/bridge/main.js:168
return JSON.parse(readFileSync(POLL_LOCK_PATH, 'utf8')); - 写入本地文件lib/bridge/main.js:185
mkdirSync(DATA_DIR, { recursive: true }); - 执行外部命令来自配置/变量lib/bridge/main.js:391
const result = spawnSync(cmd, args, { stdio: 'ignore' }); - 删除本地文件lib/bridge/main.js:449
unlinkSync(QR_PATH); - 读取密钥环境变量lib/bridge/main.js:477
const apiToken = process.env.DSH_BRIDGE_API_TOKEN; - 读取密钥环境变量lib/bridge/main.js:510
const token = process.env.DSH_BRIDGE_API_TOKEN; - 读取密钥环境变量lib/bridge/main.js:586
writeFileSync(notifyPortPath, JSON.stringify({ port: notifyPort, token: process.env.DSH_BRIDGE_API_TOKEN }, null, 2) + '\n', 'utf8'); - 删除本地文件lib/bridge/main.js:836
unlinkSync(POLL_LOCK_PATH); - 删除本地文件lib/bridge/main.js:840
unlinkSync(notifyPortPath); - 读取本地文件lib/bridge/main.js:1152
return AUTO_PUSH_EXTENSIONS.has(ext) && existsSync(f); - 读取本地文件lib/bridge/notify.js:28
const raw = JSON.parse(readFileSync(path, 'utf8')); - 写入本地文件lib/bridge/notify.js:37
mkdirSync(DATA_DIR, { recursive: true }); - 写入本地文件lib/bridge/notify.js:38
writeFileSync(join(DATA_DIR, 'notify-stats.json'), JSON.stringify(entry, null, 2) + '\n', 'utf8'); - 读取本地文件lib/bridge/pending-queue.js:10
if (!existsSync(QUEUE_DIR)) { - 写入本地文件lib/bridge/pending-queue.js:11
mkdirSync(QUEUE_DIR, { recursive: true }); - 读取本地文件lib/bridge/pending-queue.js:17
if (!existsSync(path)) - 读取本地文件lib/bridge/pending-queue.js:19
const raw = readFileSync(path, 'utf-8'); - 写入本地文件lib/bridge/pending-queue.js:34
writeFileSync(queuePath(accountId), JSON.stringify(items, null, 2), 'utf-8'); - 读取本地文件lib/bridge/session.js:58
const oldStat = statSync(oldPath); - 读取本地文件lib/bridge/session.js:63
statSync(newPath); - 写入本地文件lib/bridge/session.js:70
renameSync(oldPath, newPath); - 写入本地文件lib/bridge/session.js:91
mkdirSync(SESSIONS_DIR, { recursive: true }); - 读取本地文件lib/bridge/session.js:153
const files = readdirSync(SESSIONS_DIR).filter((f) => f.endsWith('.json')); - 发起网络请求lib/client/Panel.js:158
fetch(`${API_BASE}/status`, { cache: 'no-store' }), - 发起网络请求lib/client/Panel.js:159
fetch(`${API_BASE}/projects`, { cache: 'no-store' }), - 发起网络请求lib/client/Panel.js:160
fetch(`${API_BASE}/notify/status`, { cache: 'no-store' }), - 发起网络请求lib/client/Panel.js:190
const pendingRes = await fetch(`${API_BASE}/pending/status`, { cache: 'no-store' }); - 发起网络请求lib/client/Panel.js:203
const trustRes = await fetch(`${API_BASE}/trust`, { cache: 'no-store' }); - 发起网络请求lib/client/Panel.js:216
const cfgRes = await fetch(`${API_BASE}/config`, { cache: 'no-store' });
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-default-model@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-tools@deepseek-ai/dsh-workspace@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 三端通用
- host工具
- Web管理面板
最近更新
在 GitHub 查看全部 →v0.9.12026-09-29
· v0.9.1 — 回复丢失修复 + 会话 id path-safe
· Fixed
· 会话格式 v3+ 下回复丢失(#4):宿主不再把 assistant/chunk 写入会话日志,插件据此累积的正文恒为空,微信侧每轮只能收到 DSH 无返回内容。。改为用本轮 assistant/message 正文兜底。
· 会话 id 非 path-safe 导致投影缓存写入被拒(#5):会话 id 清洗为只保留 [A-Za-z0-9_-],session_projcache 恢复正常写入,日志不再每约 6 秒刷一条警告。
· Changed
· 回复回传改为整轮兜底:宿主不再下发增量期间没有逐段输出,且只回传本轮最后一条 assistant 消息正文——有工具调用的多步轮次,中间步骤的叙述文本不下发。恢复逐段流式已列入 docs/future-plan.md。
· README.md 的「流式回复」条目对齐实际回传行为。
· 已知限制
· 存量会话 id 仍按原值续用,老会话的投影缓存警告不会因本次修复自动消失(迁移会话目录与 workspace.json 引用属于另一项改动)。
v0.9.02026-08-30
· v0.9.0 — 视频收发 + 待补发队列可视化 + 面板折叠重构
· Added
· 视频收发(iLink/ClawBot 协议):入站 CDN 下载+解密存 .mp4 交 agent;出站按扩展名路由 VIDEO(mp4/mov/webm/mkv/avi)。真机收发抽验通过。
· 待补发队列状态可视化:面板展示发送失败待补发数量/字数/最早入队时间。
· Changed
· 面板折叠分组重构:5 个可折叠分组(状态与操作/连接与账号/消息与通知/系统行为/多用户与安全),降低设置页复杂度。
v0.8.02026-08-29
· v0.8.0 — 发送失败补发 + 防休眠 + 单测入 CI
· Added
· 发送失败补发闭环(pending-queue 接入):整轮发送结束仍未发出的缓冲落盘暂存,daemon 启动补发 + 每 5 分钟重试,成功才移除——不再因 daemon 退出丢失。
· 防休眠(preventSleep):config.json 新增 preventSleep(默认关),开启后 daemon 运行期间抑制系统休眠(macOS caffeinate / Linux systemd-inhibit / Windows 尽力而为);面板「💤 防休眠」开关,重启 daemon 生效。
· Changed
· 单测纳入 CI(39 项断言)。
· 方向方案存档 docs/future-plan.md。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成@lanbaolu/dsh-wechat-bridge
License
Node
CI
PRs Welcome
基于 Wechat-ggGitHub/wechat-claude-code 开发的 DeepSeek Harness (DSH) 微信桥接插件。
⚠️ 免责声明:本项目仅用于个人学习与自动化。使用非官方微信协议存在账号风险,请自行评估并承担后果。
三端通用:Windows / macOS / Linux 均使用纯 Node.js 进程管理,不依赖 launchd / systemd / Windows Service;同时提供 DSH 模型工具(CLI/Headless 可用)和 Web 管理面板(Web/桌面可用)。
功能
- 微信扫码绑定个人微信后,在微信里直接与 DSH 本机 Agent 对话。
- 复用 wechat-claude-code 的 iLink Bot 微信协议层:文字、图片、语音转文字、文件收发。
- 守护进程由 DSH 插件管理:启动 / 停止 / 重启 / 状态 / 日志,全部走模型工具或 Web 面板。
- 每个微信账号对应一个 DSH 会话,DSH Host 重启后会自动 resume 原持久化会话,对话上下文不断档;/clear、/new、/stop、/cwd、/model、/prompt 等斜杠命令可用。
展开完整文档(README 剩余 1 节)
@lanbaolu/dsh-wechat-bridge
License
Node
CI
PRs Welcome
基于 Wechat-ggGitHub/wechat-claude-code 开发的 DeepSeek Harness (DSH) 微信桥接插件。
⚠️ 免责声明:本项目仅用于个人学习与自动化。使用非官方微信协议存在账号风险,请自行评估并承担后果。
三端通用:Windows / macOS / Linux 均使用纯 Node.js 进程管理,不依赖 launchd / systemd / Windows Service;同时提供 DSH 模型工具(CLI/Headless 可用)和 Web 管理面板(Web/桌面可用)。
功能
- 微信扫码绑定个人微信后,在微信里直接与 DSH 本机 Agent 对话。
- 复用 wechat-claude-code 的 iLink Bot 微信协议层:文字、图片、语音转文字、文件收发。
- 守护进程由 DSH 插件管理:启动 / 停止 / 重启 / 状态 / 日志,全部走模型工具或 Web 面板。
- 每个微信账号对应一个 DSH 会话,DSH Host 重启后会自动 resume 原持久化会话,对话上下文不断档;/clear、/new、/stop、/cwd、/model、/prompt 等斜杠命令可用。
- 回复回传:DSH Agent 的回复经本地 SSE 推送到微信(批量发送,不刷屏)。会话格式 v3+ 起宿主不再下发 assistant/chunk 增量,现为整轮结束时回传本轮最后一条 assistant 消息正文——有工具调用的多步轮次只回传最后一步文本,逐段流式待恢复(见 docs/future-plan.md)。
- 超时安抚:DSH 超过 5 分钟无输出时自动发一条“还在处理”的消息。
- 主动通知:agent 可通过 wechat_notify 工具在任务完成 / 失败 / 需要确认时主动推送微信,内置节流(每小时 ≤6 条、每日 ≤50 条,超限排队延迟发送),规避个人号风控。
- 微信内审批:agent 请求权限时推送审批消息到微信,回复 /yes 批准、/no 拒绝;超时自动拒绝(fail-closed),仅绑定账号本人可裁决,不影响桌面 GUI 会话。
- 防卡死:微信会话自动注入通道约束提示词,禁用浏览器端交互式选项工具(手机看不到会永久阻塞),改用纯文本编号选项。
- 文件双向:微信发图片/文件给 DSH;DSH 回复中提到的本地文件会自动推回微信。
- 消息队列:处理中收到的普通消息会排队,等当前任务结束后继续处理(多用户下按用户独立排队,A 的长任务不阻塞 B)。
- 多用户支持:信任集 + per-user 会话。可让多个微信用户与同一 bot 对话,每人独立会话/上下文/队列/审批归属,互不可见;信任集可控、可吊销(详见下方「安全模型」)。
媒体能力矩阵(2026-08-21 代码核实 + 真机抽验;2026-08-29 视频收发补齐)
| 方向 | 文本 | 图片 | 语音 | 文件 | 视频 |
| 微信 → DSH | ✅ | ✅ CDN 下载+解密落盘 | ✅ iLink 端转写为文本 | ✅ 下载落盘交 agent | ✅ CDN 下载落盘交 agent(存 .mp4) |
| DSH → 微信 | ✅ 攒批聚合发送 | ✅ 按扩展名路由直发 | — | ✅ 回复提及自动推送 | ✅ 按扩展名路由直发(mp4/mov/webm/mkv/avi) |
语音出站(DSH → 微信)仍未支持:协议无公开实现参考,需真机实测后补齐。视频收发为 2026-08-29 按 iLink/ClawBot 协议源码补齐,真机收发已抽验通过(2026-08-30)。
方向对照与后续可行性方案见 docs/feasibility-plan.md。
架构
微信 App ←→ iLink Bot API ←→ bridge daemon (Node.js) │ HTTP + SSE (127.0.0.1, token 鉴权) ▼ DSH Host Plugin │ ctx.agents.create/resume + followup ▼ DSH Agent (本机 LLM + 工具)
- src/bridge/:从 wechat-claude-code 移植的微信协议层 + 适配 DSH 的守护进程。
- src/index.ts:DSH Host 插件,负责内部 API、Agent 生命周期、守护进程管理和模型工具。
- src/client/index.ts:Web 管理面板(settings.section 槽位)。
安装
方式一:npm 一键安装(推荐)
npm install @lanbaolu/dsh-wechat-bridge
dsh plugin --profile web add @lanbaolu/dsh-wechat-bridge
dsh web
方式二:本地路径安装(开发/个人使用)
在 DSH profile 中安装本地包:
git clone https://github.com/lanbaolu/dsh-wechat-bridge.git
dsh plugin --profile web add /path/to/dsh-wechat-bridge
dsh web
或者使用超级注入器(开发模式):
dev_inject_plugin /path/to/dsh-wechat-bridge
方式三:从源码运行
npm install
npm run build # host → lib/
npm run build:client # client → lib/client.js
npm run typecheck
注意:build:client 使用 tsdown,需要 Node.js 22.18+ 或 24.11+(CI 使用 22/24 验证)。运行时要求仍为 Node 18+。
使用
1. 扫码绑定
推荐在 DSH Web 设置页的「📱 微信桥接」面板中完成:
1. 打开 Settings / 设置 → 📱 微信桥接。
2. 填写 DSH 工作目录。
3. 点击 扫码绑定,用微信扫描页面上的二维码。
4. 绑定成功后直接点击 启动。
也可以在 DSH 所在机器终端执行:
node lib/bridge/main.js setup
按提示用微信扫码,完成后选择 DSH 工作目录。
2. 启动桥接
在 DSH 对话中让模型执行:
- wechat_bridge_start
- wechat_bridge_status
- wechat_bridge_logs
- wechat_bridge_stop
或者在 Web 设置页(settings.section 槽位)点击“启动 / 停止 / 重启”。
3. 微信端命令
| 命令 | 说明 |
| /help | 显示帮助 |
| /clear | 清除当前 DSH 会话 |
| /new | 开启全新会话(等价 /clear) |
| /stop | 停止当前任务并清空排队消息 |
| /status | 查看会话状态 |
| /cwd [路径] | 查看 / 切换工作目录 |
| /model [名称] | 查看 / 切换模型 |
| /prompt [内容] | 查看 / 设置系统提示词 |
| /history [数量] | 查看最近对话 |
| /send | 发送本地文件到微信 |
| /trust [备注] | 添加信任用户(manual 模式;仅 owner) |
| /distrust | 吊销信任用户(仅 owner) |
| /trustlist | 查看信任集(仅 owner) |
| /trustmode [模式] | 查看/切换信任模式(owner-only / bootstrap / manual) |
超时安抚配置
DSH 长时间没有产出消息时,桥接会主动发一条“还在处理”的安抚消息(默认 5 分钟静默后、每 5 分钟一条,避免用户以为卡死)。嫌频繁或想自定义,可在 Web 面板「⏳ 超时安抚」区块调整,或直接编辑 config.json 的 calm 节:
{
"calm": {
"enabled": true, // 是否启用安抚,默认 true "silenceMs": 600000, // 首次静默多久后安抚(毫秒),默认 300000(5 分钟) "intervalMs": 900000, // 两次安抚最小间隔(毫秒),默认同 silenceMs "maxCount": 3, // 每轮任务最多安抚次数,0/省略 = 不限制
"messages": [ // 自定义文案(随机取一条),留空用内置默认
"还在处理中,这个问题有点复杂,请再稍等一下", "马上就好,正在收尾" ] } }
保存后即时生效(最长延迟数秒),无需重启守护进程。改动只在守护进程运行时展示于面板;若面板无「超时安抚」区块,请更新插件后重启 DSH。
防休眠(preventSleep)
默认关闭。开启后,守护进程运行期间会抑制系统休眠——锁屏/合盖不挂起,微信消息持续响应(适合挂机跑长任务)。
- 面板「💤 防休眠」开关,或直接编辑 config.json:
{
"preventSleep": true
}
- 平台实现:macOS caffeinate / Linux systemd-inhibit / Windows SetThreadExecutionState(尽力而为)。
- 切换后需重启守护进程生效(面板「重启」按钮即可)。
安全模型(多用户信任集)
iLink 微信协议的扫码绑定是 bot 自身 登录(不是用户配对)。因此“多用户”的边界在协议层之上划定:把可信微信用户的 from_user_id 加进信任集,放行/拒绝入站。
信任模式(fail-closed 默认)
| 模式 | 行为 | 适用 |
| owner-only(默认) | 只认绑定账号 owner 本人,陌生人一律拒绝 | 单用户,行为与旧版完全一致 |
| bootstrap | 首个联系的陌生人自动入信任集(一次性),之后不再自动 | 快速开号试用 |
| manual | 仅 owner 用 /trust 或 Web 面板显式添加的人可对话 | 正式多人使用 |
- 信任集持久化在 trust.json(0600),mode 是唯一真相源;config.json 只存 notifyRejected。
- 拒绝原则:陌生人消息只记日志、不回复(不泄露任何内部信息);可选 notifyRejected: true 让 owner 收到「陌生人尝试联系」提醒(Web 面板或 /trustmode 后由面板开关)。
- 吊销即失效:/distrust 或面板「吊销」后,该用户新消息立刻被拒绝;其历史会话文件保留只读(不丢历史)。
per-user 隔离
- 每个受信用户(含 owner)一套独立:DSH 会话(${botAccountId}::${userId} 为 key)、会话文件、消息队列、上下文 token、/history /status /cwd /model。
- A 的任务进行中,B 发消息不会被阻塞(独立队列);A 的 /yes /no 只裁决 A 自己 agent 的待审批(审批 key 归属 session key),B 无权替 A 裁决。
- 项目绑定两级粒度:Web 面板选择项目会话 → 对该 bot 下所有用户生效;微信内 /session 绑定 → 仅对当前用户生效。
升级迁移
- 旧单用户数据自动迁移:sessions/.json → sessions/__.json,session-ids.json 旧 key → ${accountId}::${ownerUserId},迁移留痕日志,绝不丢历史;无法确定 owner 的旧数据保留原样只读。
⚠️ 验证状态(如实标注):信任集判定与迁移逻辑有纯函数单测覆盖(39 项); owner-only 模式已真机回归(行为与旧版一致)。多用户路径(bootstrap 入集、双用户隔离并发)真机验证待补——需要第二个微信账号走查,在此之前请仅在受控环境开启 bootstrap/manual 模式。
数据目录
默认 ~/.dsh/wechat-bridge/(可用 DSH_HOME 调整):
~/.dsh/wechat-bridge/
├── accounts/ # 微信账号凭证(0600) ├── sessions/ # 每个微信账号的本地会话状态 ├── session-ids.json # 微信账号 → DSH 持久化会话 ID 映射(用于重启后 resume) ├── trust.json # 多用户信任集(模式 + 信任用户,0600) ├── context-tokens.json # per-user context_token(主动推送/审批通行证) ├── pending-queue/ # 发送失败暂存队列 ├── daemon-port.json # 守护进程 notify 端点端口(token 鉴权) ├── notify-stats.json # 主动通知每日配额计数 ├── config.json # 工作目录 / 模型 / 系统提示词 └── logs/ # 运行日志
安全说明
- 守护进程与 DSH 插件之间的内部 API 只监听 127.0.0.1,并使用随机 token 鉴权。
- 微信账号凭证仅保存在本机 ~/.dsh/wechat-bridge/accounts/,权限为 0600。
- 日志中的 token / secret / password 会自动脱敏。
- 请勿把真实账号凭证、token 或日志提交到 Issue / PR。
贡献
欢迎提交 Issue 和 PR。请先阅读 CONTRIBUTING.md,并查看 SECURITY.md 了解安全报告方式。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
lanbaolu/dsh-wechat-bridge
DeepSeek Harness (DSH) 微信桥接插件:三端通用,host 工具 + Web 管理面板
相关插件 · 平台集成
智能体工程课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