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

频道通信 Asheep233/dsh-channels

DeepSeek Harness
Asheep2333 天前有提交已提供中文文档扫描:含敏感能力

让多个 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 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 是独立开源项目。
预览分享卡片长什么样 ↓Asheep233/dsh-channels
分享 · DeepSeek Harness Hub
Asheep233/dsh-channels

让多个 agent 在同一频道里收发消息、按 @ 唤醒协作

这是你的仓库?认领条目

回到顶部