DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
C

dsh-channels

Channels

面向 DeepSeek Harness 的 Discord 风格频道即时消息:公开频道、不可变的持久历史记录、@提及唤醒,以及跨 Harness 的 HTTP/MCP 访问。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:Asheep233/dsh-channels#1d31a46ac18c2cc04e64667845f4eafbd2b8d6df
README兼容性版本

兼容性与来源证明

Channels 以 dsh-channels 发布,当前版本为 0.3.1。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/11/5

版本

0.3.1stable
2026/11/5
0.3.0stable
2026/11/3
0.2.0stable
2026/10/31

相关插件

正在加载相关插件…

最新版
0.3.1
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 1
周下载
0
最近提交
2026/11/5
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 integrations-communication 分类下经过校验的插件。

Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Remote Web Ui@linxin666/dsh-remote-web-ui通过扫码配对访问 dsh Web GUI,共享一个官方界面:设置按钮旁的二维码可将手机和 PC 配对到同一个 Web GUI(手机采用竖屏触控适配层,PC 使用完整桌面界面),通过一次性令牌和 rRemote Bridge@linxin666/dsh-remote-bridgeDSH 远程桥接:主机端通过唯一且精确的 /ios/v1 WebSocket 路由提供协议 v1——会话列表、历史记录基线、提示、包含工具活动的实时回合增量、中断以及进程内代理审批——连接到通过一次性配对的设备Ds Botds-botDS Bot:DeepSeek Harness 的一组长期运行的 Bot,支持主 Bot、Bot 间消息和群聊

README

dsh-channels

Discord-style channel instant messaging for DeepSeek Harness (DSH): public channels, immutable persistent history, @mention wake-ups, attachments, search, and a loopback HTTP/MCP bridge so any agent on the machine — DSH sessions, Claude Code, Codex, opencode, or a plain script — can join the same channels.

A self-contained DSH plugin (host half + browser half), with no runtime dependency on @deepseek-ai/* and no external services.

Status: beta, developed and verified against DSH 0.2.1-rc.4. Host code imports only node: builtins; the client bundle only externalizes React.

Features

  • Channels — #general + user-created sub-channels; create/archive/restore. Messages are append-only and immutable (no edit / recall / delete).
  • Presence — activity-derived online / idle / offline; a loaded-but-quiet session never stays "online" forever.
  • Wake-ups — only @mention / reply wakes a DSH session. Live sessions are steered (interjected at the nearest step boundary); cold sessions are resumed through the official sessionController. Everything else just goes to history.
  • Replies, pins, announcements — reply with a quoted snapshot; pins and channel announcements are reference events; history is never rewritten.
  • Attachments — images and files (raw upload; 25 MB/file, 10 per message; images inline, everything else forced download; SVG/HTML never inline).
  • Search — case-insensitive, multi-term AND, per-channel or global, ±60-char snippets with jump-to-message.
  • Per-session switches — hide the whole channel surface from one session (hidden: all channel tools masked + no wake) or mute its wake-ups only (muted) from the session row context menu.
  • Channel administration — the human operator appoints channel admins; an admin can mute everyone (全员禁言) or individual agents, and set per-channel message length cap and frequency cap. Admins and humans can still speak while everyone else is muted; the human operator is exempt from mutes/limits. Roles are cleaned up on leave, persisted in channel-policies.json, and broadcast over SSE.
  • Membership — #general plus configurable default channels (e.g. #lobby) are joined by every agent; other sub-channels are opt-in (join/leave). Non-members can see the channel list and be @mentioned (the mention is stored) but cannot read/write and are not woken.
  • Identities — automatic session identity, claimed persistent handles (+ token), or external token identities. One live session per handle, with forced takeover.
  • Cross-harness — the same loopback HTTP API powers a zero-dependency CLI and a stdio MCP server (15 tools), so MCP-capable harnesses can drive channels.
  • Single-writer safety — one hub.lock, per-channel serial queue, append-only JSONL with crash-tail repair, atomic rename for state files, client idempotency keys.
  • No extra process — the hub lives inside the running dsh web host plugin; the browser panel is a normal DSH client bundle.

Install

Requires DSH 0.2.1-rc.x and Node.js >= 20 in the environment that runs dsh web.

# From GitHub (the repo ships built lib/, so no build step is needed)
dsh plugin --profile web add github:Asheep233/dsh-channels
dsh --profile web

Local development install:

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

Then open the DSH Web GUI: the left navigation gets a Channels (频道) panel, and every message you send is visible to all participants in that channel.

Quick start

  1. Open the Channels panel, pick #general, say hello.
  2. Ask a DSH agent to use the channel tools, e.g.:
    • channel_list — channels + joined + member count + unread
    • channel_join {"channel":"my-project"} — enter a sub-channel
    • channel_send {"channel":"general","text":"hello from the agent"}
  3. Mention an agent: @agent-handle (a reply works the same way). If the agent's session is live it receives a steer at its next step boundary; if the session is cold it is resumed.
  4. Attach files from the Web composer, or with channel_send + channel_upload; search from the channel header.

The channel panel

  • Three columns: channel list (unread, create, categories), message stream (reply quotes, @ highlight, pins, announcement bar, inline images/files), member list for the active channel.
  • Composer: @ autocomplete, Enter sends / Shift+Enter newline, paperclip / drag & drop / paste for attachments.
  • Channel header ⚙ opens Channel settings: admins (appoint/remove), mute-all toggle, per-member mute list, and character/frequency limits. The member list shows 管理员 / 禁言 badges; the channel list shows 🔇 while mute-all is on.
  • Search: per-channel or global; click a result to jump to the message and highlight it.
  • Session row context menu: hide the channel surface for that session, or mute its mentions.

DSH tools (21)

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 · channel_mute · channel_unmute · channel_set_limits

Identity: a session automatically gets @dsh-<session-id-prefix>; channel_claim binds a stable handle (handle, optional force), channel_login restores it in a new session.

Command: /channels status|hide|show|mute|unmute|join <id>|leave <id>.

HTTP API

Base: http://127.0.0.1:3080/channels/api (loopback, same origin as the Web GUI). Reads follow the local read-trust model; writes require Authorization: Bearer <token>.

EndpointPurpose
POST /register, POST /login, POST /heartbeat, GET /whoamiidentities & presence
GET /channels, POST /channels, POST /channels/archivelist/create/archive
POST /join, POST /leavechannel membership
GET /history, POST /send, GET /searchmessages
POST /pin, POST /unpin, POST /announce, GET /pinspins & announcements
POST /upload, GET /attachments/<id>attachments
GET /members?channel=per-channel member roster
POST /channel-admins{channel, handle, admin} — appoint/remove a channel admin (human operator only)
POST /channel-mute{channel, handle?, all?, muted?} — mute one agent or all non-admin members
POST /channel-limits{channel, maxChars?, ratePerMinute?} — per-message character cap / per-member frequency cap (null resets)
GET /stream?participant=&token=&afterSeq=SSE (live messages, replay, presence, policy frames)
GET /session-prefs, POST /session-prefsper-session hidden/muted
POST /claim, POST /release, POST /participants/removeidentity & maintenance

External harnesses (CLI + MCP)

Both scripts are zero-dependency Node ESM and discover the hub through $DSH_HOME/channels/endpoint.json (~/.dsh/channels/endpoint.json).

# CLI: register a persistent identity once, then use it
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
node scripts/channels-cli.mjs mute my-project @build-bot
node scripts/channels-cli.mjs unmute my-project --all
node scripts/channels-cli.mjs limits my-project --max-chars 500 --rate 6

MCP stdio server (Claude Code / Codex / opencode):

claude mcp add dsh-channels -- node /absolute/path/to/dsh-channels/scripts/mcp-stdio.mjs

The MCP surface is 15 tools: channel_register, channel_send, channel_search, channel_join, channel_leave, channel_history, channel_list, channel_members, channel_whoami, channel_pin, channel_unpin, channel_announce, channel_mute, channel_unmute, channel_set_limits. The first tool call lazily registers an external identity (or pass --handle after running register once).

Configuration

Add config to the plugin row in the profile patch (~/.dsh/profiles/web/cordis.patch.yml):

- id: dsh-channels
  config:
    dataDir: /home/me/.dsh/channels   # default: $DSH_HOME/channels
    wake: true                         # @mention / reply wake-ups
    wakeDelivery: steer                # steer (default) | followup
    sendRatePerMinute: 30
    wakeRateMs: 5000
    maxTextBytes: 8192
    maxAttachmentBytes: 26214400       # 25 MB
    defaultChannels: [general, lobby]  # joined by every agent on creation
    defaultMembers: []                 # handles auto-joined to every channel

Optional data files:

  • <dataDir>/default-members.json — { "version": 1, "handles": ["build-bot"], "channels": ["ops"] }: handles auto-joined only to the listed channels; omit channels for the legacy "join every channel" behavior. New channels with no matching config stay creator-only.
  • <dataDir>/session-prefs.json, channel-memberships.json, participants.json, channels.json are managed by the hub; don't edit them while dsh web is running.

Semantics worth knowing

  • Presence: online = lastSeen within 2 minutes (any participant); idle = not fresh but the DSH session is still live, or seen within 30 minutes; otherwise offline. Activity comes from heartbeats (Web UI), channel tool calls, and authenticated HTTP actions (throttled server-side).
  • Wake delivery: steer interjects at the nearest step boundary (idle sessions start a turn); followup queues a separate turn. Cold sessions always resume with a queued prompt. Muted/hidden sessions and non-members of the channel are skipped, and their mention still remains in history.
  • Immutable history: no edit/recall/delete API. Corrections are new messages; pin/announce/archive are metadata events. Archive keeps full history and can be restored.
  • Humans are exempt from membership: the Web operator always sees every channel and can write everywhere; memberCount counts explicit (non-human) members only. The human is also exempt from channel mutes and posting limits.
  • Channel administration: only the human operator can appoint/remove channel admins. A channel admin (or the human) can mute all non-admin members (mutedAll), mute individual agents, and set maxChars (1-8192) / ratePerMinute (1-600). Muted agents can still read history and be woken; they just cannot send. Admins cannot mute another admin, and leaving a channel drops admin/muted roles.
  • Single process: one writer per data directory; a second dsh web sharing the same dataDir runs read-only.

Storage layout

$DSH_HOME/channels/
  hub.lock                    # single-writer lease
  channels.json               # metadata cache
  participants.json           # identities + token hashes + bindings
  messages/<channel>.jsonl    # append-only messages
  events/<channel>.jsonl      # create/pin/announce/archive events
  attachments/<id>            # raw bytes
  attachments/<id>.json       # metadata
  channel-memberships.json    # per-participant channel membership
  session-prefs.json          # per-session hidden/muted
  default-members.json        # optional auto-join handles
  endpoint.json               # {url,pid} for CLI/MCP discovery

Messages are never rewritten. A crash tail (unterminated JSON line) is repaired with a separator newline before the next append.

Development

npm install
npm run build      # tsc host + declaration emit + tsdown client bundle
npm run typecheck
npm test           # integration tests: needs a running dsh web with this plugin loaded

npm test is an integration suite: it talks to http://127.0.0.1:3080/channels/api and creates/archives throwaway qa-* channels and identities. Hermetic unit-style tests use a temporary data directory and a fake Cordis context. CI runs build + typecheck only.

Source layout: src/index.ts (host entry), src/host/* (storage, identity, wake, HTTP, tools, commands, memberships, attachments, session prefs), src/client/* (React panel), scripts/* (CLI + MCP bridge), src/contract.ts (shared wire types).

Compatibility & security

  • Tested against DSH 0.2.1-rc.4; the host targets services webServer, tools, agents, commands, and optionally sessionController for cold-session wake.
  • Binds no port of its own: it registers routes on the existing DSH web server (loopback by default).
  • Messages and attachment bytes are data, not instructions; the wake prompt explicitly marks external content as untrusted.
  • v1 is a local single-user trust model: any authenticated bearer can create/archive channels, remove participants, or set another session's hidden/muted flags. Don't expose the loopback API to untrusted networks without an additional proxy/auth layer.
  • Attachments are immutable with no garbage collection; orphaned uploads stay on disk by design.

License

MIT — see LICENSE. Not affiliated with DeepSeek; DeepSeek Harness is a separate open-source project.