dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Persistent Bots, group rooms and a durable run ledger, inside DSH.
简体中文 · Design notes · MIT
A community-maintained DeepSeek Harness plugin, not an official DeepSeek product.
A Bot here is not a temporary subagent: it has an identity, its own model and permission preset, its own workspace, and its own session that survives a restart. Put several of them in a room and they answer together. Every run is recorded, so a conversation can be read back later even after the session that produced it is gone.

agent_community_create_bot, agent_community_update_bot,
agent_community_list_bots, agent_community_create_room, agent_community_send_message,
agent_community_list_runs, agent_community_get_context, agent_community_post_message,
agent_community_task_decompose, agent_community_task_assign, agent_community_task_status,
agent_community_task_report, agent_community_submit_final, agent_community_remember,
agent_community_deliver.agent_community_deliver; the turn then shows file cards below its reply — preview in the panel,
open with the OS application association, or reveal in Finder. Files may live inside the Bot's
workspace or at any absolute path..docx through docx-preview (paginated pages,
selectable text, fit width), .xlsx/.csv through SheetJS (sheet tabs, frozen header, virtual
scrolling). PowerPoint and legacy .doc/.xls go through the host's Office→PDF conversion into the
same PDF viewer. All viewers are bundled into the plugin's single browser artifact (3.3 MB, ~0.9 MB
gzipped) — the panel never fetches a viewer from the network. See
THIRD_PARTY_NOTICES.md for their licenses./compact summarises the older part of a room with the room's own
Bot model, keeps the newest messages verbatim, and retires the session that was carrying the old
history — so the next answer continues from the summary instead of replaying the transcript.| DeepSeek Harness | 0.2.1-rc.2 (built and verified against it; no DSH version is pinned) |
| Node.js | ^22.19.0 or >=24 |
| pnpm | 11.7.0 (for building from source) |
@deepseek-ai/* packages are not published to the public npm registry, so this repo cannot install
them and pnpm install alone fails — expected. The plugin deliberately does not pin a DSH version:
every peer range is * and a missing host package degrades at load instead of failing the install. That
is also why the plugin is meant to be installed into a DSH profile, where the running harness supplies
those packages.
dsh plugin --profile <your-profile> add dsh-plugin-agent-collaboration
The published package carries all three packages prebuilt, so nothing is compiled on your machine. Restart DSH and refresh the page — Bots团队 appears in the sidebar.
The archive attached to each release is the same build that is published to npm — use it when you would rather not install through a registry. The line below points at the latest public release; see CHANGELOG.md for what a newer version changes.
dsh plugin --profile <your-profile> add \
https://github.com/Leo-sail/dsh-plugin-agent-collaboration/releases/download/v0.3.5/dsh-plugin-agent-collaboration-0.3.5.tgz
dsh plugin --profile <your-profile> add "file:/path/to/this/repo/packages/bundle/agent-collaboration"
Keep the file: prefix. pnpm records a bare absolute path as a link: symlink and then installs none of
the bundle's own file: dependencies; the profile ends up with the bundle and no @dsh-plugin-agent-community/* rows,
and every row fails to import. The same applies to DSH's own plugin manager, which passes an absolute
path through unchanged.
Verify the install — all three must be real directories, not symlinks:
ls -ld ~/.dsh/profiles/<your-profile>/node_modules/@dsh-plugin-agent-community/*
Install the DSH plugin at
https://github.com/Leo-sail/dsh-plugin-agent-collaboration/releases/download/v0.3.5/dsh-plugin-agent-collaboration-0.3.5.tgz
into my DSH profile, restart DSH, and confirm the "Bots团队" entry appears in the sidebar.
| What you want | How |
|---|---|
| Create a Bot | Open Bots团队 → + → fill in name, model, permission and workspace. The Bot is created immediately and appears in the roster. |
| Talk to one Bot | Select it in the Bots tab (one-to-one room) and send a message. |
| Create a group | + in the 群聊 tab, pick the members. |
| Address one member of a group | Type @ and pick a Bot from the menu, or use its name in the text. Only that Bot is queued. |
| Address the whole room | Send a message that names nobody. Every member answers. |
| Add a file or image | + → 文件, or paste/drop it onto the composer. |
| Change the model for one room | + → 模型. Affects the next run, not one already in flight. |
| Change a Bot's permission preset | + → 权限: 仅可查看 / 工作区内修改 / 完全权限. |
| Compress a long room | + → 压缩. Shows a summary row and keeps the newest messages. |
| Stop a run | 停止 in the title bar cancels the room's active runs. |
| Read an older part | Scroll up — the transcript pages in earlier entries. |
| Clear a room | 清空消息 in the room header. |
Status is visible while it happens: a queued run shows as 排队, a running one as 进行中 with a live duration, and a failed one as a red row that names the provider error rather than silently publishing an older answer.
Every key is optional and is set on the bundle's row in the profile's cordis.patch.yml.
| Key | Default | What it does |
|---|---|---|
maxBots | 32 | Bots that may exist |
maxRooms | 64 | Rooms that may exist |
maxMessages | 10000 | Messages kept before the oldest are pruned |
maxRuns | 1000 | Run records kept |
maxConcurrentRuns | 8 | Bots that may answer at the same time, across all rooms |
runTimeoutMs | 600000 | A run is failed after this long |
runLeaseMs | 60000 | How long a run's lease lasts without a heartbeat |
historyMessagesInPrompt | 10 | Messages of context handed to each answer |
a2aMinIntervalMs | 3000 | Minimum gap between Bot-to-Bot messages |
groupProposalTimeoutMs | 120000 | How long a group proposal waits for an answer |
idleLimit | 12 | Live Bot sessions kept before the least recently used is disposed — disposing one is what releases its session write lease |
hardLimit | 24 | Hard ceiling on live Bot sessions |
botReasoningEffort | max | Reasoning effort for Bot turns: off low high max, or '' to take the provider default. A Bot can override it |
botAgentPreset | standard | Agent preset handed to each Bot session |
botDeniedTools | plugin_manager, ask_user_question, skill | Tools a Bot must never see |
homeDir | $DSH_HOME, else ~/.dsh | Where the board is stored |
sessionsDir | <homeDir>/sessions | Where Bot session logs are written |
maxConcurrentRuns is global, not per room. At 2, a four-bot group runs two and parks the rest behind
the 排队 banner, which is the opposite of what a group is for; raise it if a room should hold more
simultaneous Bots.
$DSH_HOME/agent-community/state.json the board: Bots, rooms, messages, runs, read marks
$DSH_HOME/agent-community/workspaces/<bot> each Bot's workspace, including its attachments
$DSH_HOME defaults to ~/.dsh. Deleting that directory resets the plugin to a fresh install; nothing
is kept anywhere else.
This repo ships the Community half only. DSH's built-in Agent Teams bundle owns teammates, the shared task board and peer messaging, so this bundle mounts only what has no in-box equivalent. The two can run side by side without either disabling the other.
An older @dsh-plugin-agent-community/agent-team fork (with its tool- and ui- packages) used to live in this repo
unmounted and unbuildable; it has been removed.
A group room where three Bots answered one message, each attributed to its own Bot:

The roster and the room list, with the sidebar entry carrying an unread count:

The composer's menu — 文件 / 压缩 / 权限 / 模型, then the skills group:

These are declared in screenshots.json — beside
the bundle's package.json, because this plugin is listed as a monorepo subpackage and that is where
storefronts read it from. See
screenshots/README.md for how they were taken.
pnpm install # fails by design: @deepseek-ai/* are not on the public registry
pnpm typecheck # typecheck every package against the real DSH types, when they resolve
pnpm bundle # build all packages and run the build-shape checks
Browser bundle dependencies. The panel's three viewers (PDF.js / docx-preview / SheetJS) are bundled into
ui-agent-community/lib/client.jsat build time: the DSH client module system serves exactly one script per plugin and re-reads no sibling assets, so the PDF worker and the viewers can not ship as separate files. They are workspace devDependencies (rootpackage.json), installed once for the build; the artifact is 3.3 MB (~0.9 MB gzipped). Licenses: THIRD_PARTY_NOTICES.md.
pnpm bundle runs scripts/check-build.mjs — every assertion in it maps to a
bug this repo actually shipped (a bare-ESM client bundle, a package whose files omitted its own types, a
stale lib/, dangling exports targets, duplicate CSS selectors). Installing a broken tree is worse than
refusing to install, so scripts/install-profile.sh runs the same checks before copying anything.
To develop against a real runtime, install the bundle into a profile with
scripts/install-profile.sh <profile> and restart DSH.
packages/
core/agent-community the service: Bots, rooms, runs, sessions, the ledger
AgentCommunityService (ctx.agentCommunity), persists state.json
tools/tool-agent-community the 15 model-facing tools (ctx.tools.register)
ui/ui-agent-community the browser panel: sidebar entry, transcript, composer,
right-hand preview dock and the PDF/DOCX/spreadsheet viewers
bundle/agent-collaboration the installable entry (cordis.patch.yml)
The bundle mounts all three; each package is also installable on its own — core/agent-community ships
its own cordis.patch.yml and dsh.bundle, which is the right shape for a headless deployment.
See DESIGN.md for the UI decisions (DSH token system, DSH client primitives, StateDot for
presence).
Third-party libraries bundled into the browser artifact (PDF.js, docx-preview, JSZip, SheetJS) are distributed under their own licenses — see THIRD_PARTY_NOTICES.md.