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

微信消息队列 SteelUnion/dsh-wechat-queue

DeepSeek 客户端
SteelUnion10 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

用微信收发消息,串行排队与智能体稳定对话

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

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

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/SteelUnion/dsh-wechat-queue.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成

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

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

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

读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 28 处,展示前 27 条)
  • 读取本地文件
    lib/index.js:118
    if (existsSync(candidate)) return candidate;
  • 写入本地文件
    lib/index.js:235
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:237
    writeFileSync(
  • 写入本地文件
    lib/index.js:269
    writeFileSync(logPath, line, { flag: 'a' });
  • 写入本地文件
    lib/index.js:382
    mkdirSync(dataDir, { recursive: true });
  • 读取本地文件
    lib/index.js:1061
    if (!statSync(path).isFile()) return false;
  • 读取本地文件
    lib/index.js:1074
    const data = readFileSync(path);
  • 读取密钥环境变量
    lib/index.js:1161
    const envToken = process.env.DSH_WECHAT_QUEUE_TOKEN;
  • 写入本地文件
    lib/index.js:1235
    writeFileSync(join(dataDirRef, 'cursor.txt'), cursor, 'utf8');
  • 读取本地文件
    lib/index.js:1246
    if (!existsSync(file)) return undefined;
  • 读取本地文件
    lib/index.js:1247
    const text = readFileSync(file, 'utf8').trim();
  • 发起网络请求
    lib/client.js:134
    fetch(ROUTES.status, { cache: 'no-store' })
  • 发起网络请求
    lib/client.js:164
    fetch(ROUTES.state, { cache: 'no-store' })
  • 发起网络请求
    lib/client.js:190
    return fetch(path, { method: 'POST', body: body })
  • 写入本地文件
    lib/queue/store.js:99
    mkdirSync(this.dir, { recursive: true });
  • 读取本地文件
    lib/queue/store.js:110
    if (existsSync(file)) files.push(file);
  • 读取本地文件
    lib/queue/store.js:118
    text = readFileSync(file, 'utf8');
  • 写入本地文件
    lib/queue/store.js:338
    appendFileSync(this.fileFor(), `${tombstone}\n`, 'utf8');
  • 写入本地文件
    lib/queue/store.js:358
    appendFileSync(this.fileFor(), `${JSON.stringify(record)}\n`, 'utf8');
  • 读取本地文件
    pack.mjs:34
    for (const entry of readdirSync(join(ROOT, dir), { withFileTypes: true })) {
  • 读取本地文件
    pack.mjs:55
    const missing = INCLUDE.filter((rel) => !existsSync(join(ROOT, rel)));
  • 读取本地文件
    pack.mjs:65
    const size = statSync(join(ROOT, rel)).size;
  • 读取本地文件
    pack.mjs:73
    const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8'));
  • 读取本地文件
    pack.mjs:103
    size: statSync(join(ROOT, rel)).size,
  • 读取本地文件
    pack.mjs:111
    const raw = readFileSync(f.abs);
  • 写入本地文件
    pack.mjs:165
    mkdirSync(DIST, { recursive: true });
  • 写入本地文件
    pack.mjs:166
    writeFileSync(outPath, Buffer.concat([...locals, cdBuf, eocd]));
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

把微信接入 DeepSeek Harness 的通道插件,带落盘串行队列。微信(iLink)通道,用于 DeepSeek Harness,带持久化串行消息队列。

README

由 DeepSeek 最新模型翻译生成
dsh-wechat-queue 把微信接入 DeepSeek Harness —— 带一个落盘的串行消息队列。 用微信和你的 DSH 智能体对话:发文字、发图、发文件、发视频,它在微信里回你。 一条回完才处理下一条,进程死了重启接着干。 它解决什么 | 问题 | 老插件 | 本插件 | | 收不到 | listAccounts()[0] 取最旧的僵尸账号 | 登录时清空旧记录,永远只有一个 | | 中途发 | 每个 assistant/message 都发一段 | 攒到 turn/end,一次发完 | | 卡死 | runExclusive 无超时 + catch {} 静默 | 三层超时,任何终态都推进队列 | 功能 - 严格串行:一条回完才取下一条,不会在 inbox 里堆成多个 turn - 落盘队列:JSONL 存盘,进程死了重启接着处理 - 对方正在输入:轮次开始上报,结束收掉;它坏了不影响主流程 - DSH 原生命令转发:/compact、/goal 等进队列执行,与普通消息同序 - 接收图片 / 文件 / 视频:失败不丢文字,只在那条附件上留一句说明 - 发送文件:回复里提到 deliverables/ 下的文件就会发过去 - 附件声明:告诉智能体附件的名字、大小、uid,它不用翻目录猜 - 扫码登录面板:单账号,登录时清空旧记录 安装
展开完整文档(README 剩余 1 节)
dsh-wechat-queue

把微信接入 DeepSeek Harness —— 带一个落盘的串行消息队列。

用微信和你的 DSH 智能体对话:发文字、发图、发文件、发视频,它在微信里回你。
一条回完才处理下一条,进程死了重启接着干。

它解决什么

| 问题 | 老插件 | 本插件 |
| 收不到 | listAccounts()[0] 取最旧的僵尸账号 | 登录时清空旧记录,永远只有一个 |
| 中途发 | 每个 assistant/message 都发一段 | 攒到 turn/end,一次发完 |
| 卡死 | runExclusive 无超时 + catch {} 静默 | 三层超时,任何终态都推进队列 |

功能

- 严格串行:一条回完才取下一条,不会在 inbox 里堆成多个 turn
- 落盘队列:JSONL 存盘,进程死了重启接着处理
- 对方正在输入:轮次开始上报,结束收掉;它坏了不影响主流程
- DSH 原生命令转发:/compact、/goal 等进队列执行,与普通消息同序
- 接收图片 / 文件 / 视频:失败不丢文字,只在那条附件上留一句说明
- 发送文件:回复里提到 deliverables/ 下的文件就会发过去
- 附件声明:告诉智能体附件的名字、大小、uid,它不用翻目录猜
- 扫码登录面板:单账号,登录时清空旧记录

安装

dsh plugin --profile desktop add <解压后的目录>

装完完全退出 DSH 再启动,宿主才能发现插件。

首次使用需要在 GUI 插件页扫码登录,或者用环境变量临时登录:

$env:DSH_WECHAT_QUEUE_TOKEN = "<accountId>:<token>"

配置

- id: wechat-queue
config:
enabled: true

会话工作目录。决定微信那边读到的是谁的人格。
cwd: 'C:\path\to\your\workspace'

权限:管「能不能碰文件」 permission: 'danger-full-access'

Agent 预设:管「有没有工具可用」 agentPreset: 'cordis'

deliverTimeoutMs: 600000
turnTimeoutMs: 600000
queueAckText: ''

⚠️ permission 和 agentPreset 是两件事

| 配了什么 | 结果 |
| 只给 permission | 权限全开,但智能体一个工具都没有 |
| 两个都给 | 权限全开 + 工具齐全 |

只给 permission 时,智能体会说「我没有工具,请你手动跑这条命令」,而且它说的是实话。

agentPreset 不要留空串 —— 空串会回落到配置档的默认预设,不一定是你在用的那个。

微信内命令

| 命令 | 作用 |
| /stop | 中止当前这一轮(写标记,不会卡住) |
| /status | 队列状态 |
| /new | 开一段新对话 |
| /help | 帮助,含 DSH 原生命令列表 |

其他 /xxx 如果 DSH 认识,会进队列在轮到时执行。

发文件给微信

把文件放进 <cwd>/deliverables/,然后在回复里提到它。

<你的工作区>/ └─ deliverables/ └─ 报告.pdf ← 放这里,提到就会发

只有 deliverables/ 下的文件才会被自动发送。

不加这个限制的话,模型说「我读了 SOUL.md、USER.md」就会把那些文件也发出去 —— 列举路径不等于要发文件。

数据在哪

| 内容 | 位置 |
| 队列记录 | <DSH_HOME>/wechat-queue/queue-YYYY-MM-DD.jsonl |
| 运行日志 | <DSH_HOME>/wechat-queue/wechat-queue-YYYY-MM-DD.log |
| 轮询游标 | <DSH_HOME>/wechat-queue/cursor.txt |
| 启动错误 | <DSH_HOME>/wechat-queue/startup-error.txt |
| 账号凭证 | .credentials.yaml 的 wechat-queue/account |
排查先看运行日志。 GUI 启动没有终端,console.error 的输出没人看得见。

消息状态

received → queued → delivered → running → replied
├→ failed (带 stage + error) ├→ timeout (带 stage) └→ stopped (被 /stop)

任何终态都会让队列推进到下一条。 这是「永不堵死」的来源。

测试

node test/zz-all.mjs

548 项,18 个套件,0 失败。

覆盖:串行与超时、状态机、JSONL 存储、四种媒体(图片/文件/视频/语音)、文件发送与上传、预设挂载契约、事件竞态、扫码登录。

打包

node pack.mjs # 输出 dist/dsh-wechat-queue-v<version>.zip
node pack.mjs --list # 只列清单

零运行时依赖。 peerDependencies 只声明 @deepseek-ai/cordis, DSH 本体版本要求写在 engines.dsh。

技术要点

为什么不用 ctx.get() 做软探测:它不是软探测,用到的服务必须写进 inject,否则直接抛。

为什么 agentPresets.resolve() 必须 await:它是 async 的。不 await 会拿到一个 Promise, preset?.id 永远是 undefined,于是预设从未挂载 —— 这就是「权限全开但一个工具都没有」的原因。

为什么媒体要「先下载完再入队」:worker 是独立循环,enqueue 一完成它就可能取走交付。
图片几十毫秒赶得上,视频几秒就赶不上 —— 附件会丢掉,而且队列记录看起来一切正常。

这些坑和更多细节都在 NOTES.md。

来源声明

协议层(lib/protocol/)搬自 dsh-channel-wechat v0.2.5(MIT)。
lib/protocol/qrcode.js 是 vendored 的 qrcode-generator 2.0.4(MIT)。

详见 THIRD_PARTY_NOTICES.md。

队列层、worker、桥接层、命令转发、typing 指示器、媒体处理是本插件自己的实现。

许可

MIT。全文见 LICENSE。
预览分享卡片长什么样 ↓SteelUnion/dsh-wechat-queue
分享 · DeepSeek Harness Hub
SteelUnion/dsh-wechat-queue

用微信收发消息,串行排队与智能体稳定对话

回到顶部