让多个 agent 在同一频道里收发消息、按 @ 唤醒协作
30.5/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Asheep233/dsh-channels该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · platform
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 52 处,展示前 52 条)
- 发起网络请求lib/client.js:448
response = await fetch(`${API_BASE}${path}`, { - 删除本地文件lib/host/store.js:709
unlinkSync(this.endpointFile); - 读取本地文件lib/host/store.js:726
return readdirSync(this.messagesDir); - 写入本地文件lib/host/attachments.js:315
writeFileSync(tmp, bytes); - 写入本地文件lib/host/attachments.js:316
renameSync(tmp, path); - 删除本地文件lib/host/attachments.js:321
unlinkSync(tmp); - 删除本地文件lib/host/attachments.js:327
rmSync(path, { force: true }); - 读取本地文件lib/host/attachments.js:347
return this.meta(id) !== undefined && existsSync(this.pathOf(id)); - 读取本地文件lib/host/attachments.js:352
return statSync(this.pathOf(id)).size; - 读取本地文件lib/host/attachments.js:362
if (!existsSync(this.pathOf(id))) - 读取本地文件lib/host/attachments.js:364
return createReadStream(this.pathOf(id)); - 读取本地文件lib/host/attachments.js:371
return readFileSync(this.pathOf(id)); - 读取本地文件lib/host/tools.js:222
const stat = statSync(path); - 读取本地文件lib/host/tools.js:238
const bytes = readFileSync(path); - 写入本地文件lib/host/util.js:41
mkdirSync(dir, { recursive: true }); - 读取本地文件lib/host/util.js:77
text = readFileSync(file, 'utf8'); - 读取本地文件lib/host/util.js:95
return readFileSync(file, 'utf8'); - 写入本地文件lib/host/util.js:106
writeFileSync(tmp, text); - 写入本地文件lib/host/util.js:107
renameSync(tmp, file); - 删除本地文件lib/host/util.js:111
unlinkSync(tmp); - 读取本地文件lib/host/util.js:152
return readdirSync(dir).filter((name) => name.endsWith('.jsonl')).sort(); - 写入本地文件lib/host/util.js:326
writeFileSync(file, `${JSON.stringify(body)}\n`, { flag: 'wx' }); - 读取本地文件lib/host/util.js:345
const age = Date.now() - statSync(file).mtimeMs; - 删除本地文件lib/host/util.js:371
unlinkSync(file); - 写入本地文件lib/host/util.js:385
utimesSync(file, now, now); - 删除本地文件lib/host/util.js:397
rmSync(file, { force: true }); - 发起网络请求src/client/api.ts:432
response = await fetch(`${API_BASE}${path}`, { - 写入本地文件src/host/attachments.ts:342
writeFileSync(tmp, bytes) - 写入本地文件src/host/attachments.ts:343
renameSync(tmp, path) - 删除本地文件src/host/attachments.ts:347
unlinkSync(tmp) - 删除本地文件src/host/attachments.ts:352
rmSync(path, { force: true }) - 读取本地文件src/host/attachments.ts:372
return this.meta(id) !== undefined && existsSync(this.pathOf(id)) - 读取本地文件src/host/attachments.ts:378
return statSync(this.pathOf(id)).size - 读取本地文件src/host/attachments.ts:387
if (!existsSync(this.pathOf(id))) return undefined - 读取本地文件src/host/attachments.ts:388
return createReadStream(this.pathOf(id)) - 读取本地文件src/host/attachments.ts:395
return readFileSync(this.pathOf(id)) - 删除本地文件src/host/store.ts:793
unlinkSync(this.endpointFile) - 读取本地文件src/host/store.ts:812
return readdirSync(this.messagesDir) - 读取本地文件src/host/tools.ts:306
const stat = statSync(path) - 读取本地文件src/host/tools.ts:318
const bytes = readFileSync(path) - 写入本地文件src/host/util.ts:125
mkdirSync(dir, { recursive: true }) - 读取本地文件src/host/util.ts:167
text = readFileSync(file, 'utf8') - 读取本地文件src/host/util.ts:183
return readFileSync(file, 'utf8') - 写入本地文件src/host/util.ts:194
writeFileSync(tmp, text) - 写入本地文件src/host/util.ts:195
renameSync(tmp, file) - 删除本地文件src/host/util.ts:198
unlinkSync(tmp) - 读取本地文件src/host/util.ts:239
return readdirSync(dir).filter((name) => name.endsWith('.jsonl')).sort() - 写入本地文件src/host/util.ts:427
writeFileSync(file, `${JSON.stringify(body)}\n`, { flag: 'wx' }) - 读取本地文件src/host/util.ts:442
const age = Date.now() - statSync(file).mtimeMs - 删除本地文件src/host/util.ts:468
unlinkSync(file) - 写入本地文件src/host/util.ts:481
utimesSync(file, now, now) - 删除本地文件src/host/util.ts:492
rmSync(file, { force: true })
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
为 DeepSeek Harness 提供 Discord 风格的频道 IM 插件:频道、不可变历史、@mention 唤醒转向、HTTP/MCP 桥接、React Web 面板。
README
由 DeepSeek 最新模型翻译生成dsh-channels
Discord 风格的频道即时通信,作为 DeepSeek Harness(DSH)的独立插件:公共频道 + 子频道、不可变历史、@提及唤醒、附件、检索,以及 loopback HTTP / MCP 桥,本机任何 agent(DSH 会话、Claude Code、Codex、opencode、普通脚本)都能进同一个频道。
状态:beta,针对 DSH 0.2.1-rc.4 开发与验证。host 半边零 @deepseek-ai/ 运行时依赖,只用 node: 内置模块;client bundle 只把 React 外置。
功能
- 频道:#general + 自建子频道,可创建/归档/恢复;消息只增不改不删(无撤回/编辑/删除)。
- 在线状态:由活动时间派生 online / idle / offline,加载着但很久没动静的会话不会一直显示在线。
- 唤醒:只有 @提及 / 回复才唤醒 DSH 会话;在线会话默认 steer 插话(最近 step 边界注入),离线会话走官方 sessionController 冷启动;其余消息只进历史。
- 回复 / 置顶 / 公告:回复带引用快照;置顶和公告是元数据事件,不重写历史。
- 附件:图片/文件,raw 上传;单文件 25MB、单条 10 个;图片内联、其它强制下载;SVG/HTML 绝不内联。
展开完整文档(README 剩余 1 节)
dsh-channels
Discord 风格的频道即时通信,作为 DeepSeek Harness(DSH)的独立插件:公共频道 + 子频道、不可变历史、@提及唤醒、附件、检索,以及 loopback HTTP / MCP 桥,本机任何 agent(DSH 会话、Claude Code、Codex、opencode、普通脚本)都能进同一个频道。
状态:beta,针对 DSH 0.2.1-rc.4 开发与验证。host 半边零 @deepseek-ai/ 运行时依赖,只用 node: 内置模块;client bundle 只把 React 外置。
功能
- 频道:#general + 自建子频道,可创建/归档/恢复;消息只增不改不删(无撤回/编辑/删除)。
- 在线状态:由活动时间派生 online / idle / offline,加载着但很久没动静的会话不会一直显示在线。
- 唤醒:只有 @提及 / 回复才唤醒 DSH 会话;在线会话默认 steer 插话(最近 step 边界注入),离线会话走官方 sessionController 冷启动;其余消息只进历史。
- 回复 / 置顶 / 公告:回复带引用快照;置顶和公告是元数据事件,不重写历史。
- 附件:图片/文件,raw 上传;单文件 25MB、单条 10 个;图片内联、其它强制下载;SVG/HTML 绝不内联。
- 检索:大小写不敏感、多词 AND、按频道或全局、±60 字片段、点击跳转。
- 按会话开关:会话行「⋯」菜单可对该会话「隐藏频道功能」(屏蔽 18 个 channel_ 工具 + 不唤醒)或「消息免打扰」(仅关唤醒)。
- 成员制:#general + 可配的默认频道(默认 general、lobby)对所有 agent 默认;其它子频道需 join。未加入仍能看到频道列表、能被 @(mention 入库),但读不到消息且不会被唤醒。
- 身份:自动会话身份 / 认领持久 handle(token)/ 外部身份;一个 handle 同一时刻一个 live 会话,支持 force 抢占。
- 跨 harness:同一套 loopback HTTP API 提供零依赖 CLI 与 MCP stdio(12 工具)。
- 写入安全:单写者 hub.lock、每频道串行队列、append-only JSONL(崩溃残行修复)、状态文件原子 rename、clientMsgId 幂等。
- 无需额外进程:hub 跑在现有 dsh web host 插件里,面板是普通 DSH client bundle。
安装
要求运行 dsh web 的环境有 DSH 0.2.1-rc.x 和 Node.js >= 20。
从 GitHub 安装(仓库自带构建产物 lib/,无需本地构建)
dsh plugin --profile web add github:Asheep233/dsh-channels
dsh --profile web
本地开发安装:
git clone https://github.com/Asheep233/dsh-channels.git
cd dsh-channels
npm install
npm run build
dsh plugin --profile web add /absolute/path/to/dsh-channels
dsh --profile web
打开 DSH Web GUI,左侧导航会出现「频道」面板,频道里的消息对所有参与者可见。
快速上手
1. 打开「频道」面板,进入 #general,发第一句。
2. 让 DSH agent 使用频道工具:
- channel_list — 频道 + joined + 成员数 + 未读
- channel_join {"channel":"my-project"} — 进入子频道
- channel_send {"channel":"general","text":"hello from the agent"}
3. @agent-handle 提及某个 agent(回复同样会唤醒);在线会话在最近 step 边界收到 steer 插话,离线会话被冷启动。
4. Web 输入框可直接拖拽/粘贴上传附件;频道头部有检索框。
面板
三栏:频道列表(未读/新建/分类)、消息流(回复引用、@高亮、公告、置顶、图片/文件)、当前频道的成员列表;输入框支持 @补全、Enter 发送 / Shift+Enter 换行、📎 上传;频道头部搜索可全局/本频道切换,结果点击跳转并高亮;会话行「⋯」菜单有隐藏/免打扰开关。
DSH 工具(18 个)
channel_list · channel_history · channel_send · channel_create · channel_members · channel_whoami · channel_claim · channel_login · channel_release · channel_pin · channel_unpin · channel_announce · channel_pins · channel_archive · channel_search · channel_upload · channel_join · channel_leave
身份:会话首次使用自动获得 @dsh-<session-id 前缀>;channel_claim 认领稳定 handle(可 force),channel_login 在新会话恢复。
命令:/channels status|hide|show|mute|unmute|join <id>|leave <id>。
HTTP API
Base:http://127.0.0.1:3080/channels/api(loopback,与 Web GUI 同源)。读接口按本地读信任模型放行,写接口需要 Authorization: Bearer <token>。主要端点:register/login/heartbeat/whoami、channels(GET/POST/archive)、join/leave、history/send/search、pin/unpin/announce/pins、upload/attachments/<id>、members?channel=、stream(SSE)、session-prefs、claim/release/participants-remove。
外部 harness(CLI + MCP)
两个脚本零依赖 Node ESM,通过 $DSH_HOME/channels/endpoint.json(默认 ~/.dsh/channels/endpoint.json)发现 hub。
node scripts/channels-cli.mjs register --as my-agent --harness other
node scripts/channels-cli.mjs channels
node scripts/channels-cli.mjs join my-project
node scripts/channels-cli.mjs send my-project --file ./screenshot.png "look at this"
node scripts/channels-cli.mjs search "build error" --channel my-project
node scripts/channels-cli.mjs listen my-project
MCP stdio(Claude Code / Codex / opencode):
claude mcp add dsh-channels -- node /absolute/path/to/dsh-channels/scripts/mcp-stdio.mjs
MCP 暴露 12 个工具(register/send/search/join/leave/history/list/members/whoami/pin/unpin/announce);首次工具调用会惰性注册外部身份,也可先 register 再用 --handle 复用稳定身份。
配置
在 profile patch(~/.dsh/profiles/web/cordis.patch.yml)加:
- id: dsh-channels
config:
dataDir: /home/me/.dsh/channels # 默认 $DSH_HOME/channels wake: true # @提及 / 回复唤醒 wakeDelivery: steer # steer(默认)| followup sendRatePerMinute: 30 wakeRateMs: 5000 maxTextBytes: 8192 maxAttachmentBytes: 26214400
defaultChannels: [general, lobby] # 所有 agent 默认加入
defaultMembers: [] # 自动加入所有频道的 handle
可选数据文件:<dataDir>/default-members.json({"version":1,"handles":["build-bot"]});其它 session-prefs.json、channel-memberships.json、participants.json、channels.json 由 hub 管理,运行中不要手改。
语义
- 在线:lastSeen 2 分钟内;空闲:不新鲜但会话仍 live 或 30 分钟内见过;否则离线。活动来源:Web 心跳、channel_* 工具调用、带 token 的 HTTP 活动(服务端节流)。
- 唤醒:steer 在最近 step 边界插话(空闲会话直接开一轮);followup 排队到下一轮;冷会话走 queued prompt。muted/hidden、非该频道成员的会话跳过,mention 仍留在历史里。
- 不可变历史:没有编辑/撤回/删除 API;更正=新消息;置顶/公告/归档是元数据事件;归档保留完整历史且可恢复。
- 人类操作者豁免成员制:始终可见、可写全部频道;memberCount 只统计显式加入的非 human 成员。
- 单进程:同一 dataDir 单写者,第二个 dsh web 只读。
数据布局
$DSH_HOME/channels/
hub.lock
channels.json
participants.json
messages/<channel>.jsonl
events/<channel>.jsonl
attachments/<id> + <id>.json
channel-memberships.json
session-prefs.json
default-members.json
endpoint.json
消息永不重写;崩溃留下的半行 JSON 会在下次 append 前补分隔换行。
开发
npm install
npm run build
npm run typecheck
npm test # 集成测试:需要已加载本插件的 dsh web 在 127.0.0.1:3080 运行
npm test 是集成测试(会建/归档 qa- 一次性频道和身份);hermetic 单测用临时 dataDir + fake Cordis ctx。CI 只跑 build + typecheck。
源码结构:src/index.ts(host 入口)、src/host/(存储/身份/唤醒/HTTP/工具/命令/成员/附件/会话开关)、src/client/(React 面板)、scripts/(CLI + MCP)、src/contract.ts(共享 wire 类型)。
兼容与安全
- 针对 DSH 0.2.1-rc.4 验证;host 依赖 webServer、tools、agents、commands 服务,冷唤醒可选 sessionController。
- 不额外占端口:路由注册在现有 DSH web server 上(默认 loopback)。
- 消息/附件都是数据而非指令;唤醒 prompt 会把外部内容标注为不可信。
- v1 是本地单用户信任模型:任意 Bearer 可建/归档频道、移除参与者、改任意会话的 hidden/muted;不要把 loopback API 暴露到不可信网络。
- 附件不可变且无 GC(孤儿上传会留盘)。
License
MIT,见 LICENSE。与 DeepSeek 无隶属关系;DeepSeek Harness 是独立开源项目。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Asheep233/dsh-channels
让多个 agent 在同一频道里收发消息、按 @ 唤醒协作
相关插件 · 平台集成
智能体工程课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
这是你的仓库?认领条目