DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins
C

dsh-channels

Channels

Discord-style channel IM for DeepSeek Harness: public channels, immutable persistent history, @mention wake, cross-harness HTTP/MCP access.

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add github:Asheep233/dsh-channels#1d31a46ac18c2cc04e64667845f4eafbd2b8d6df
READMECompatibilityVersions

Compatibility and provenance

Channels is published as dsh-channels and currently resolves to version 0.3.1. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
web
Release source
github
Registry updated
11/5/2026

Versions

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

Related plugins

Loading related plugins…

Latest
0.3.1
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
web
License
MIT
Source
github
GitHub
★ 1
Weekly downloads
0
Last push
11/5/2026
View source ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in integrations-communication.

Acp App@deepseek-ai/dsh-acp-appThe dsh ACP profile bundle: automation-only JSON-RPC stdio and process lifecycle over dsh-baseRemote Web Ui@linxin666/dsh-remote-web-uiScan-to-pair remote access for the dsh web GUI that shares one official interface: a QR beside the settings button pairs phones and PCs into the same Web GUI (a portrait-touch adaptation layer for phones, full desktop on PCs) through one-time tokens and rRemote Bridge@linxin666/dsh-remote-bridgeDSH remote bridge: the host half serves protocol v1 over one exact /ios/v1 WebSocket route — session roster, history baseline, prompting, live turn increments with tool activity, interrupt, and in-process agent approval — to a device paired by a one-shot Ds Botds-botDS Bot: a team of long-lived Bots for DeepSeek Harness, with Main Bots, Bot-to-Bot messages and group chats

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.