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

Discord 桥接 ghbhiee/dsh-plugin-discord

DeepSeek Harnessv0.1.0
ghbhiee25 天前有提交已提供中文文档扫描:含敏感能力

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
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 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,否则会把它挤下线。
预览分享卡片长什么样 ↓ghbhiee/dsh-plugin-discord
分享 · DeepSeek Harness Hub
ghbhiee/dsh-plugin-discord

DeepSeek Harnessdsh的 Discord 桥接插件:在 Discord 里和你自己的 dsh…

这是你的仓库?认领条目

回到顶部