bloodarea/dsh-agent-team-presets ↗★ 2
dsh-agent-team-presets
Reusable Agent Team presets for DeepSeek Harness: a captain plus members with their own prompt, model, reasoning effort, and tools. 适合需要构建和切换包含特定提示词、模型及工具的智能体团队的用户。
Install
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:bloodarea/dsh-agent-team-presetsREADME
Read the full README ↗dsh-agent-team-presets

English | 中文
Status: community plugin v0.1.3. Install the pinned release with
dsh plugin --profile add github:bloodarea/dsh-agent-team-presets#v0.1.3. The supported Harness peer range is>=0.2.0-rc.1 manager; the Harness version is not this plugin's version. Plugin details fordsh-agent-team-presetsshould showv0.1.3. A card naming@deepseek-ai/dsh-experimental-agent-team-presetsinstead is the monorepo development package, whose version follows the Harness (for example,0.2.0-rc.2), not this community release.lib/` ships prebuilt; rebuilding source needs a Harness checkout — see DEVELOPMENT.md and CHANGELOG.md.
Summary
dsh-agent-team-presets adds a Settings page that configures named Agent Teams and a composer control that applies one Team to a Session. A Team has a captain and any number of members: the captain carries its own prompt and tool policy, while each member also carries its own provider/model route and reasoning effort, read from the stored Team each time that member is summoned. Applying a Team installs the captain's prompt, restricts its tools, and registers spawn_team_member, which summons a member with that member's own persona, route, effort, and tools. A captain leads on the model the Session already selected.
Project introduction
Turn DeepSeek Harness Agent Teams from ad-hoc lineups into configurable, reusable professional AI teams.
dsh-agent-team-presets is a visual Agent Team preset manager for DeepSeek Harness. It configures roles, per-member models, reasoning effort, system prompts, and tool permissions, so a professional AI team is configured once and reused on demand.
Why this plugin?
DeepSeek Harness already ships Agent Teams with multi-agent collaboration, but it leaves room in per-team configuration and reuse.
This plugin addresses five gaps:
- Teams are hard to reuse. Native teams focus on runtime creation and collaboration and offer no visual preset management; this plugin saves, duplicates, and reuses team configurations.
- Role setup is repetitive. Member responsibilities no longer have to be re-described every time: each role's name, description, and system prompt are configured in advance.
- Splitting work across models is awkward. Every member picks its own model and reasoning effort, so one team combines models by task; the captain keeps leading on the model the session already selected.
- Tool permissions have no fine-grained entry point. The captain and each member carry their own global tool allow-list, so roles differ in what they may use.
- Switching teams is inconvenient. Pick a preset team from the composer, with no repeated manual role setup.
Design principle: native Agent Teams owns collaboration at runtime; dsh-agent-team-presets owns configuring, managing, and reusing teams.
Screenshots
The Team control in the composer — apply one preset Team to this Session, or clear it.

Settings → Agent team presets — every configured Team, with create, duplicate, and delete.

One Team — its name and description, the captain, and the member roster.

One member — its own provider, model, and reasoning effort. The captain leads on the Session model, so only a member carries a route.

The model picker — every provider and model the deployment currently advertises.

Table of Contents
- Project introduction
- Why this plugin?
- Screenshots
- Use this package
- Understand the implementation
- Further Exploration
- Model Experience
- Known Limitations and Deferred Work
- Dev Note
Use this package
Install the bundle into a profile that already composes @deepseek-ai/dsh-experimental-agent-team-profile (the Team service, the Team tools, and the Web roster), then open Settings → Agent team presets.
Install, upgrade, and verify the version
dsh plugin --profile
add github:bloodarea/dsh-agent-team-presets#v0.1.3
Replace with the profile the GUI actually runs (for example, web).
Releases do not update installed plugins automatically: back up the profile and
its Team configuration, remove the installed package, then install the pinned
release into the same profile. If the old package is the development link, remove
@deepseek-ai/dsh-experimental-agent-team-presets, not dsh-agent-team-presets.
Do not enable both packages: they own the same agent-team-presets settings and
client registrations. When migrating a development profile, keep the Team
configuration and selections under that entry id, but replace its module name
and the selected bundle with dsh-agent-team-presets.
After switching package identities, restart the running Harness and refresh the
GUI; a page refresh alone can leave the old client entry in the Host's module
table and produce duplicate-plugin boot failures. Verify the plugin details show
both dsh-agent-team-presets and v0.1.3, with its component running. The
Harness's own 0.2.0-rc.* version is a separate compatibility requirement.
Configure a Team
Settings → Agent team presets is three stacked pages, so a narrow Settings panel never crowds:
- Teams — every configured Team as one row (name, member count, session model). Create, duplicate, or delete from here.
- One Team — its name and description, the captain row, and the member roster. Adding a member opens that member's page.
- One agent (captain or member) — identity, tools, and system prompt, each in its own card; a member page adds the model card and deletes that member.
Every edit is staged and written by the Save control in the shared footer; the stored value lives in the profile's user settings document. Settings accepts saves during a Team task without interrupting it. A Session is busy while its captain is running or any teammate is running or provisioning; its captain persona, briefing, member preset prompts and role descriptions, member tool description and roster, and tool permissions keep the applied definition, and members summoned during that task use that definition. A member's model route and each slot's color are deliberately outside the frozen definition, because both are read from the stored Team when they are needed: saving a corrected provider, model, or reasoning effort reaches the next member the running task summons without restarting it, and a color change redraws right away. Once the Session is fully idle, it adopts the latest saved definition before its next Team task; successive saves converge to the latest value. Sessions sharing a preset adopt it independently.
The footer reports the selected Team's execution state across online Sessions:
idle— no Session is executing that Team's task; a save takes effect immediately.busy— at least one Session is executing; idle Sessions adopt a definition change immediately, while busy Sessions adopt it before their next task. A member's route saved meanwhile applies to the next member summoned, in a task already running as well. A teammate finishing does not release the definition while the captain is still running.unknown— execution cannot be confirmed, including before the stream is ready, after it ends or fails, during a connection loss, or when the Host lacks the method or a Team's state. The page does not treat a previous idle frame as current fact. A definition change still cannot affect a task already in progress, while a member's route saved meanwhile applies to the next member summoned.
| Field | Meaning |
|---|---|
| Team name | Display name shown in Settings and in the composer control. |
| Captain | The agent that leads the Session: its system prompt becomes the Session prompt and its tool scope scopes the session tools. It leads on the model the Session already selected, so it has no route of its own. |
| Members | Role templates the captain summons by name. |
| Name | Display name; the teammate target is derived from it (lower-kebab-case, falling back to member-). |
| Color | Accent mark shown in Settings. |
| Description | The role hint the models act on: the captain reads its own description, the Team description, and every member's description, so it can pick the member whose description fits the work; a summoned member reads the Team description and its own description as its role. |
| Provider / Model | Members only. Route chosen from every provider and model the deployment currently advertises. Empty runs the member on the Session route. |
| Reasoning effort | Members only. Adapter-owned effort for the selected route; empty uses the model default. |
| Allowed tools | Choose Default: all tools or Custom allowed tools separately for the captain and each member. Custom mode displays the deployment's global tools as an expanded checkbox grid, with select-all and clear controls. No checks in custom mode denies all configurable tools; default mode adds no restriction and preserves the saved checks. Captain and member policies apply independently, so a member can have tools the captain cannot use. Unavailable saved names remain removable; invalid names reject application instead of granting unrestricted access. Scoped coordination tools remain available. |
| System prompt | Registered as a prompt section template; complete {{variable}} groups interpolate against registered prompt variables. A summoned member reads it after its Team briefing. |
Select a Team
The composer's team control sits in the tool row after the permission control. Picking a Team writes this Session's selection; an idle Session applies its captain prompt and tool scope immediately, while a busy Session keeps its current application until it is fully idle. Picking "No team" removes the Team application at the same boundary, restoring the Session's other prompt and tool contributions. The model stays the one the composer already shows, because no Team writes a model selection.
Share one Team
Export on a Team row writes that Team as one fixed JSON document, and Import preset reads such a document. A shared document carries only what keeps working across deployments: the Team's name and purpose, and the name, description, system prompt, and color of its captain and each member. Model routes and tool permissions stay local, because they name this deployment's providers and tools; a document that carries them is refused instead of being silently trimmed.
An import matches by name. When the document's Team name is already configured, the dialog asks whether to replace that team or add it under a new name. When the captain name or a member name is already used by the Team being replaced, the same dialog asks, per name, whether to replace that agent or add the imported one renamed. A replacement writes only the fields the document carries, so the target Team keeps its model routes and tool permissions and keeps every member the document does not mention.
An import lands in the draft first, so it reaches the settings document only when you press Save; an export writes what the page currently shows, including an unsaved draft.
Let the captain adjust a Team preset
The captain of a Session also holds two tools for the case this plugin exists for: a Team ran once, and the descriptions or prompts it ran with do not yet match the work.
get_team_presetreads every editable field of this Session's Team (or of the Team ateam_idnames) with the current settings revision. When the Session selected no Team it reportsno-selectionand lists the configured Teams, so the captain asks the user which one to change instead of guessing.update_team_presetreplacesteam_description,captain_description,captain_system_prompt, and per-memberdescription/system_prompt, fenced by the revisionget_team_presetreturned.
A successful tool write saves to the same settings document as the Settings page and follows the same per-Session adoption timing described above. A captain still running its current task keeps the old definition through its subsequent model steps. An existing teammate keeps its creation-time description, persona, and tool filter, including when resumed by a message; the updated preset supplies future new members after that Session adopts it. Send an existing teammate a new requirement to adjust its work without replacing its stored composition.
Both tools register in the Session-root Agent scope only, so a teammate never sees them, and the write additionally requires a turn the user started: an automatic continuation or a teammate's report cannot rewrite the shared preset. Names, member routes, and tool permissions are outside their reach — renaming changes a teammate target and collides with Agent Teams' permanent-name rule, so the Settings page owns it.
The tool's write policy differs from the Settings page: if any online Session that selected or still has that Team applied has a teammate running or provisioning, update_team_preset returns team-busy without saving. This conservative model-initiated write check counts teammates only, not the captain executing the tool; counting that captain would block every call. Wait for those teammates to finish, or interrupt them with interrupt_agent, then call get_team_preset again and retry with its revision. The running task keeps its original definition; the Settings page can still save changes for later adoption, and a member route saved there applies to the next member that task summons. get_team_preset reports the executing teammate count.
The tool also refuses a revision another writer advanced (re-read, retry) and a supplied standing prompt whose {{variable}} group cannot resolve. An unknown variable fails the request when the template is used rather than degrading it. Only prompts supplied by the call are checked, so an unrelated edit still succeeds on top of text the Settings page wrote.
Understand the implementation
Host composition
The Host half owns the live configuration and the per-Session applications:
| File | Role |
|---|---|
src/index.ts | Plugin entry: live Config, per-Session definition freezing and adoption on Agent lifecycle, settings commits, and team/member settlements. |
src/execution.ts | Event-driven execution monitor: captain and teammate status, applied-versus-stored definitions, and aggregate whole-set frames. |
src/config.ts | Volatile teams and selections fields, the continuable-provider names, and the captain-route cleanup of stored Teams. |
src/application.ts | Applies one Team to one live Agent: prompt sections, tool scope, and the spawn_team_member tool. |
src/preset-editor.ts | Pure preset edits behind the preset tools: the editable-field whitelist, member resolution, and the roster's description limit. |
src/preset-tools.ts | The captain's get_team_preset and `update_tea |