DeepSeek Harnessdsh的 Discord 桥接插件:在 Discord 里和你自己的 dsh…
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/9 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:npm 同名包「dsh-plugin-discord」归属 tjiisztiuv/dsh-plugin-discord,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ghbhiee/dsh-plugin-discord该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · platform
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 25 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意npm 同名包「dsh-plugin-discord」归属 tjiisztiuv/dsh-plugin-discord,装到的可能不是本插件
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-plugin-discord @ 0.1.0
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/14 16:15:32
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 32 处,展示前 18 条)
- 发起网络请求lib/index.js:289
const response = await fetch(`${this.base}${path}`, { - 发起网络请求lib/index.js:314
return await this.request("GET", "/users/@me"); - 发起网络请求lib/index.js:318
return await this.request("POST", `/channels/${channelId}/messages`, { - 发起网络请求lib/index.js:329
await this.request("POST", `/channels/${channelId}/typing`); - 发起网络请求lib/index.js:333
return await this.request("POST", `/channels/${channelId}/messages`, { - 发起网络请求lib/index.js:341
await this.request("PATCH", `/channels/${channelId}/messages/${messageId}`, { - 写入本地文件lib/index.js:893
await mkdir(this.config.cwd, { recursive: true }); - 写入本地文件lib/index.js:1038
await mkdir(directory, { recursive: true }); - 写入本地文件lib/index.js:1040
await writeFile(target, data); - 读取本地文件lib/index.js:1054
roots.push(await realpath(root)); - 读取本地文件lib/index.js:1057
const resolved = await realpath(path); - 读取本地文件lib/index.js:1062
const info = await stat(resolved); - 读取本地文件lib/index.js:1073
data: new Uint8Array(await readFile(resolved)) - 写入本地文件lib/index.js:1505
await mkdir(dir, { recursive: true }); - 写入本地文件lib/index.js:1508
await writeFile(path, file.data); - 读取本地文件lib/index.js:1872
const raw = await readFile(this.file, "utf8"); - 写入本地文件lib/index.js:1905
await mkdir(dirname(this.file), { recursive: true }); - 读取本地文件lib/index.js:2071
const raw = (await readFile(config.tokenFile, "utf8")).trim();
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-agent-presets@deepseek-ai/dsh-llm@deepseek-ai/dsh-session给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 在Discord中聊天
DeepSeek Harness 的 Discord 桥接:在 Discord 里和你 dsh 网页会话聊天
README
由 DeepSeek 最新模型翻译生成dsh-plugin-discord
DeepSeek Harness(dsh)的 Discord 桥接插件:在 Discord 里和你自己的 dsh 会话聊天——就是 web UI 里显示的那些会话,所以你在电脑前开始的对话,可以在手机上通过 Discord 继续,反过来也一样。
- 白名单内的 Discord 用户/频道发来的消息会转发进 dsh 会话;回复以 Discord 消息返回(长回复会拆分,代码围栏在拆分后依然完整)。
- /new 新建会话,名字形如 [Discord] 08-18 15:04——置顶标题在 web 侧边栏里标出它的来源。
- 会话通过 web 宿主使用的同一套智能体预设组合创建,因此自带完整工具链,随时可以在 web UI 里打开、继续、重命名。web 上创建的会话也能用 /use <id> 从 Discord 接管。
- 零运行时依赖:网关跑在 Node 内置的 WebSocket 上,REST 跑在内置 fetch 上。
命令
启动时,桥接插件会把这些注册成真正的 Discord 斜杠命令(出现在 / 选择器里)。纯文本形式仍然可用作兜底——注册还没同步到位时,输入 /new 回车也能用。
展开完整文档(README 剩余 1 节)
dsh-plugin-discord
DeepSeek Harness(dsh)的 Discord 桥接插件:在 Discord 里和你自己的 dsh 会话聊天——就是 web UI 里显示的那些会话,所以你在电脑前开始的对话,可以在手机上通过 Discord 继续,反过来也一样。
- 白名单内的 Discord 用户/频道发来的消息会转发进 dsh 会话;回复以 Discord 消息返回(长回复会拆分,代码围栏在拆分后依然完整)。
- /new 新建会话,名字形如 [Discord] 08-18 15:04——置顶标题在 web 侧边栏里标出它的来源。
- 会话通过 web 宿主使用的同一套智能体预设组合创建,因此自带完整工具链,随时可以在 web UI 里打开、继续、重命名。web 上创建的会话也能用 /use <id> 从 Discord 接管。
- 零运行时依赖:网关跑在 Node 内置的 WebSocket 上,REST 跑在内置 fetch 上。
命令
启动时,桥接插件会把这些注册成真正的 Discord 斜杠命令(出现在 / 选择器里)。纯文本形式仍然可用作兜底——注册还没同步到位时,输入 /new 回车也能用。
| 命令 | 作用 |
| (任意文本) | 向频道当前会话发提示词(会自动创建一个) |
| /new [标题] | 新建会话,标题带日期戳 [Discord] |
| /sessions(/list) | 最近的 Discord 桥接会话 |
| /use <id>(/switch、/resume) | 把本频道绑定到某个会话——web 创建的 id 也能用 |
| /current(/session) | 显示绑定的会话及其状态 |
| /stop(/cancel) | 取消正在运行的回合 |
| /help | 帮助 |
其他任何以 / 开头的文本都当作提示词透传。
iMessage 中继 API
同一个会话桥接插件还对外提供 iMessage 中继服务(例如 imessage-agent),这样 iMessage 对话就变成普通的、web 可见的会话,标题形如 [iMessage] 10-09 08:07。中继自己负责 chat.db 和 AppleScript;插件只把「频道 + 文本」变成一个会话回合,复用 Discord 那边跑的同一套 create/resume/prompt/command 代码。命令(/new、/sessions、/use、/current、/stop、/help)用法相同。
回合可能跑好几分钟,所以提示词按任务接受并轮询:
| 端点 | Body / query | 响应 |
| POST /plugins/imessage/api/chat | {"channel": "<any stable id>", "text": "..."} | 202 {"job": "<id>"} |
| GET /plugins/imessage/api/job?id=<job> | | {"done": false} 或 {"done": true, "chunks": [...], "files": ["/tmp/..."]} |
鉴权用 notify bearer secret(<profile dir>/discord-notify.secret)。智能体用 [discord-file: /path] 标记的附件,会以临时文件路径返回,供中继发送。绑定关系存在 imessage-bridge-state.json 里,和 Discord 状态放在一起。配置项:imessageEnabled(默认 true)、imessageCwd(默认:cwd)、imessageTitlePrefix(默认 [iMessage] )。
主动通知:HTTP API + MCP(监控 / 提醒 / 告警)
每个部署的 bridge 也会把自己的 bot 当作推送通道,这样智能体和守护进程就能主动给用户发消息,而不是只能被动回复。因为每个 dsh 都服务自己的 bot,发送方身份跟着部署走:你本地的 dsh 用它自己的 bot 发通知,你服务器上的 dsh 用它自己的 bot 发通知。
哪些是自动的,哪些要手动:
| 部分 | 自动? |
| MCP 服务端端点(POST /plugins/discord/mcp) | ✅ 插件启动时自动提供,无需操作 |
| HTTP API(POST /plugins/discord/api/notify) | ✅ 插件启动时自动提供 |
| Bearer 密钥 | ✅ 首次启动自动生成 → <profile dir>/discord-notify.secret(0600);可用配置 notifySecret 或环境变量 DSH_DISCORD_NOTIFY_SECRET 覆盖 |
| MCP 客户端注册(让智能体看到这个工具) | ❌ 每个客户端手动做一次,配方见下 |
用 notifyEnabled: false 可关闭整套接口。
HTTP API 参考(适用于任何应用)
POST http://127.0.0.1:<dsh port>/plugins/discord/api/notify
| 认证 | Authorization: Bearer <secret> —— 从 <profile dir>/discord-notify.secret 读取密钥(例如 ~/.dsh/profiles/web/discord-notify.secret) |
| 请求体 | {"content": "text", "userId"?: "...", "channelId"?: "..."} —— JSON,content 必填 |
| 目标 | 默认 = 第一个 allowedUsers 条目的私信;userId = 另一个用户的私信;channelId = bot 能发帖的服务器频道 |
| 内容 | Discord markdown;超过 2000 字符会自动拆成多条消息 |
| 200 | {"ok": true, "channelId": "...", "messageIds": ["..."]} |
| 400 | JSON 格式错误 / content 为空 |
| 401 | 缺少或错误的 bearer token |
| 502 | Discord 侧投递失败({"ok": false, "error": "..."}) |
curl -s -X POST http://127.0.0.1:3080/plugins/discord/api/notify \
-H "authorization: Bearer $(cat ~/.dsh/profiles/web/discord-notify.secret)" \
-H 'content-type: application/json' \
-d '{"content": "⚠️ 磁盘使用率 92%"}'
端点默认只监听回环地址(dsh 绑定 127.0.0.1):同机调用方直接访问;远程调用方走隧道(ssh -L 3080:127.0.0.1:3080 host),或者走已经在前面代理你 dsh 的反向代理。
注册 MCP 客户端(一次性,每个智能体各做一次)
MCP 服务端(Streamable HTTP,工具 discord_notify)已经在运行了 —— 下面这些配方只是把客户端指向它。
dsh 自身(让每个 dsh 智能体都能用这个工具)—— 全局 ~/.dsh/cordis.patch.yml,然后重启 dsh:
- insert:
- id: mcp-discord-notify
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: discord
transport: streamable-http
url: http://127.0.0.1:3080/plugins/discord/mcp
headers:
authorization: Bearer <contents of discord-notify.secret>
Claude Code:
claude mcp add --transport http discord \
http://127.0.0.1:3080/plugins/discord/mcp \json
{ "command": "npx", "args": ["-y", "mcp-remote", "http://127.0.0.1:3080/plugins/discord/mcp", "--header", "Authorization: Bearer <secret>"] }
给其他智能体用的复制粘贴提示词
把下面这段交给智能体,让它自己注册 MCP(把路径换成你的):
帮我接入本机 dsh 的 Discord 通知能力:MCP 端点是
http://127.0.0.1:3080/plugins/discord/mcp(transport: streamable-http),
鉴权头 Authorization: Bearer <密钥>,密钥内容读文件 ~/.dsh/profiles/web/discord-notify.secret。请把它注册进你的 MCP 配置, 然后调用 discord_notify 工具发一条测试消息「MCP 接入成功」验证。
把下面这段交给智能体,让它在代码/脚本里用 HTTP API(不需要 MCP):
本机有一个 Discord 推送接口,写监控/定时脚本需要通知我时调用它: POST http://127.0.0.1:3080/plugins/discord/api/notify, 请求头 Authorization: Bearer $(cat ~/.dsh/profiles/web/discord-notify.secret) 和 Content-Type: application/json,请求体 {"content": "通知文本"}。
返回 {"ok": true} 即送达;非 200 时把状态码和响应体记入日志,不要重试超过 3 次。
或者把这段一行话放进智能体的常驻指令(CLAUDE.md 等),让它始终知道有这个通道:
需要主动通知用户时(任务完成、告警、提醒),POST
http://127.0.0.1:3080/plugins/discord/api/notify,Bearer 密钥在
~/.dsh/profiles/web/discord-notify.secret,body {"content": "..."}。
内联提问(ask_user_question → Discord components)
智能体向用户提问时(dsh 的 ask_user_question 工具——选项选择、确认、方案评审),桥接会把问题渲染成绑定频道里的 Discord inline components:选项用下拉菜单(支持多选),✏️ 按钮打开模态框填写自由文本答案,还有一个取消按钮。选中某个选项会就地更新消息,智能体这一轮带着答案继续往下走。
原理:harness 在 Cordis waterfall user-questions/request 上派发问题,桥接在它上面占一个前置席位——浏览器的应答者会直接认领问题,所以排在它后面的席位永远看不到问题。桥接从前端拿到问题后,发出 Discord 卡片,再用 next() 把同一个问题传下去,这样两个界面都保持可用,谁先回答谁生效。网页端回答后,Discord 卡片会明显关闭。
需要 dsh >= 0.1.1(该 waterfall)。在更老的宿主上,这个席位根本不会触发,问题只留在网页端。
文件传输
两个方向都能用,智能体也会被告知这些能力(首次从 Discord 驱动时,每个会话注入一次能力提示):
- 智能体 → Discord:智能体在回复里写一行 [discord-file: /absolute/path];桥接会剥掉这一行,把文件作为 Discord 附件上传(图片内联渲染)。只有会话工作目录下的文件(加上配置的 uploadRoots)且在 maxUploadBytes 以内才会发送——被拒绝会在回复里说明。
- Discord → 智能体:用户附上的文件/图片会保存到会话 cwd 的 .discord-uploads/ 目录,以及其中文件的路径,都会追加到提示词里,智能体可以直接读取。
安装 sh
dsh plugin --profile web add github:ghbhiee/dsh-plugin-discord
通过 dsh 进程的 DSH_DISCORD_TOKEN 环境变量提供 bot token(推荐这样做——不会有任何机密信息写进配置档 YAML)。在 launchd 部署下,就是服务 plist 的 EnvironmentVariables 字典;在 systemd 下,是一行 Environment=;在 shell 里,直接 export。
然后在配置档的 cordis.patch.yml 里配置这一行: yaml
- id: discord-bridge
config:
allowedUsers: ["<your discord user id>"]
allowedChannels: ["<guild channel id>"] # empty = DM-only
cwd: /Users/you/projects # where new sessions live
preset: "" # agent preset; empty = deployment default
titlePrefix: "[Discord] "
token 查找顺序:config.token → $DSH_DISCORD_TOKEN(变量名可通过 tokenEnv 配置)→ tokenFile(原始 token,或 env 风格的文件)。
两个允许列表都为空时,桥接拒绝启动——不设限制的桥接会把你的智能体(连同它的工具)交给任何能给 bot 发私信的人。
配置
| 字段 | 默认值 | 含义 |
| token | "" | Bot token;为空则回退到 tokenEnv,再回退到 tokenFile |
| tokenEnv | DSH_DISCORD_TOKEN | token 为空时查询的环境变量 |
| tokenFile | "" | 存放 token 的文件——原始 token,或 env 风格的 KEY=value 行。让机密信息不进入配置档 YAML |
| tokenFileKey | DISCORD_BOT_TOKEN | tokenFile 为 env 风格时查找的键 |
| allowedUsers | [] | 允许对话的 Discord 用户 id(私信场景必填) |
| allowedChannels | [] | 桥接监听的公会频道 id;为空 = 仅私信 |
| cwd | 主目录 | 新建会话的工作目录(不存在则创建)。已绑定的会话保留创建时的 cwd——改完这个配置后用 /new |
| preset | "" | 新会话的智能体预设;为空则组合默认值 |
| titlePrefix | "[Discord] " | 标题前缀,用来标记来自 Discord 的会话 |
| maxChunksPerReply | 6 | 每条回复的 Discord 消息数上限(超出部分截断并给出提示) |
| maxUploadBytes | 8000000 | 单个外发附件([discord-file: …])的大小上限 |
| uploadRoots | [] | 智能体可上传的额外目录(会话 cwd 始终允许) |
| maxIncomingBytes | 25000000 | 单个传入 Discord 附件保存到磁盘的大小上限 |
| stateFile | "" | 频道→会话绑定文件;为空则在配置档目录下派生一个 |
| typingIntervalMs | 8000 | 一轮对话运行期间刷新「正在输入」指示的间隔 |
| gatewayUrl | "" | Gateway URL 覆盖——供 scripts/fake-discord.mjs 使用的测试接缝 |
| restBaseUrl | "" | REST 源覆盖——同一个测试接缝 |
不接 Discord 的本地端到端测试
scripts/fake-discord.mjs 会运行一个脚本化的假 Discord(gateway + REST),监听在 ws://127.0.0.1:8931 / http://127.0.0.1:8932。用 gatewayUrl/restBaseUrl 把插件指向它(token 随便填),重启 dsh,脚本就会驱动一整段对话——创建会话、/new、/use、上下文连续性——跑在你真实的 dsh 部署上,并打印桥接发出的每一条回复。
Discord 应用配置
1. Discord 开发者门户 → 你的应用 → Bot。
2. 启用 Message Content Intent(服务器频道里的文本需要它;私信不需要——如果被拒绝,桥接会自动去掉该 intent 重试,并在日志里给出警告)。
3. 把机器人邀请到你的服务器,或者直接给它发私信。
共享会话部分是怎么工作的
- 新会话走 agentPresets.resolve/mount——和 session.create 在 web 链路上用的是同一条组装路径——并由宿主的会话持久化保存,所以 session.list 会像显示其他会话一样显示它们。
- 恢复冷会话时,会组装其日志里记录的预设,与 web 宿主的冷恢复路径一致。
- 桥接会给每条转发的提示词的消息来源打上 Discord 消息 id(和 web 客户端用 rpcId 是同一套做法),然后只归拢这条提示词开启的那一轮——同一会话里并发运行的 web 提示词绝不会被误认成 Discord 的回复。
- 模型选择跟随会话日志(web 宿主的行为),所以在 web UI 里切换模型会延续到之后的 Discord 轮次。
已知限制
- 回复在整轮完成后才到达(运行期间显示正在输入);目前还没有流式分段编辑。
- Discord 发来的附件和图片会被忽略——目前只支持文本。
- 审批提示(工具权限询问)无法从 Discord 回答;会话按配置档组装出的审批策略运行。
- 一个机器人 token 对应一条网关连接:不要复用另一个正在运行的机器人(比如 Hermes)在用的 token,否则会把它挤下线。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ghbhiee/dsh-plugin-discord
DeepSeek Harnessdsh的 Discord 桥接插件:在 Discord 里和你自己的 dsh…
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,792已汉化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
这是你的仓库?认领条目