DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

Roles Zeta — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
R

dsh-roles-zeta

Roles Zeta

面向 DeepSeek Harness 的基于角色的子代理委派:通过一个委派工具管理角色文件夹,并提供可随时覆盖的内置角色列表

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

npx -y @deepseek-ai/dsh plugin --profile web add github:zeta987/dsh-roles-zeta#bbfa1eddf7e261906616b33efb72abd054a25908
README兼容性版本

兼容性与来源证明

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

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

版本

0.4.1stable
2026/9/17

相关插件

正在加载相关插件…

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

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

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

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

认领这个 Plugin →
报告问题

相关插件

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

Headless@deepseek-ai/dsh-headlessdsh one-shot bundle:基于 dsh-base 的直接核心 Agent/Session 运行器,不包含 Host、HTTP 或浏览器层Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层Subagent Codex@deepseek-ai/dsh-subagent-codex基于官方 app-server 协议的一次性 Codex 子代理提供程序Subagent Claude Code@deepseek-ai/dsh-subagent-claude-code基于官方 Agent SDK 的一次性 Claude Code 子代理提供方

README

English | 繁體中文 | 简体中文

dsh-roles-zeta

dsh-roles-zeta gives a dsh agent one delegate tool and a folder of role files. A call names a role; the role file supplies the child's persona, model route, reasoning effort, and tool surface. It sits on the same ctx.subagents service the built-in subagent tool uses, so providers, delegation depth, continuation, and background settlement keep working unchanged. The built-in subagent and subagent_fork tools stay mounted: they let the model pick a route per call, while a role is fixed when the file is written.

Around the tool sit three surfaces, each mounted only where its host service exists: one slash command per role in the Web input box, a Role agents page in the Web settings, and a watcher on the role directory so an edit reaches the next call without recomposing the profile.

Install

dsh plugin --profile web add dsh-roles-zeta
# restart the host

Profiles are separate install roots, so install into each profile that should have it. github:zeta987/dsh-roles-zeta and file:<path> specs work too. On the first load the eight role files are written to $DSH_HOME/agents ($DSH_HOME defaults to ~/.dsh), and a new session has a delegate tool whose description lists them.

~/.dsh/agents
├── code-mapper-lite.md   explorer.md            log-distiller.md   triage.md
├── deep-coordinator.md   hypothesis-debate.md   reviewer.md        worker.md
└── .seeded.json

Updating

Nothing updates on its own: dsh plugin forwards to pnpm inside the profile, starting the host installs nothing, and no page checks a registry. To move to a release:

dsh plugin --profile web add dsh-roles-zeta@0.4.0
# restart the host

Name the version. update stays inside the ^0.x range pnpm wrote at install time, and pnpm 11+ hides a version published less than 24 hours ago from outdated and @latest (minimumReleaseAge); an explicit version installs right away. Role files you edited are left alone; shipped ones you never touched are refreshed on the next load.

Slash commands

Every loaded role is a command in the Web input box. Type / to see them next to /plan and /goal; /reviewer look at lib/index.js queues a turn asking the agent to call delegate with role reviewer and that text as the task, run it in the foreground, and relay the result. The delegation therefore stays in the transcript as an ordinary tool call, where /plan <message> puts its message too.

Commands follow the roster: adding, renaming, or removing a role re-registers them and the menu refreshes. A role whose id collides with another plugin's command is skipped as a command (logged) and still works through the tool. commands: false mounts none; commandPrefix: "r-" gives /r-reviewer.

The Web input box with / typed: the roles listed as commands next to the built-in ones

Settings page

Settings → Role agents lists the roster with a badge per role (shipped, yours, edited) and edits one role at a time: id, the when line, the route (with the session's allowed routes as suggestions), the effort, the tools as a checklist of what is registered right now (or "inherit everything" plus the delegation toggle), and the persona. Saving writes <id>.md into $DSH_HOME/agents, the same file you would write by hand.

ButtonOn disk
Delete, on a role you addedRemoves the file
Delete, on a shipped roleLeaves a disabled: true stub so the packaged copy stops loading; listed under Disabled shipped roles until restored
Restore this roleCopies the shipped file back over yours
Restore the shipped rolesThe same for all eight; roles you added are never touched

The page is a browser module over JSON routes under /__dsh/roles-zeta/, gated by the same browser-session cookie and Host/Origin fence as the rest of the Web API. settingsPage: false mounts neither.

Settings → Role agents: the roster on top, the reviewer role open in the editor below

Role files

One Markdown file per role: frontmatter for the machine fields, body as the child's persona prefix.

---
id: reviewer
when: Deep read-only reviewer for correctness, regressions, edge cases, and missing tests.
route: deepseek-official/deepseek-flash
effort: high
allow: [read, glob, grep, web_search, web_fetch, skill]
---

Review like an owner.
Prioritize correctness, regressions, edge cases, and concurrency hazards.
FieldRequiredMeaning
idyesRole id; the _ spelling resolves to the same role
whenyesOne line; the model's menu entry and the command description
routenoA model id (deepseek-flash) or an exact provider/model
effortnooff/minimal/low/medium/high/xhigh/max, clamped per route
allownoTool names the child keeps; omitted inherits everything
delegationnotrue keeps the delegation tools in a child without an allow list
disablednotrue removes a shipped role

A role with an allow list can delegate only if the list names the delegation tools; one without an allow list only with delegation: true.

Where roles load from

Two roots, later winning: the package's own roles/*.md, then $DSH_HOME/agents. The package seeds its roster into your directory on first load and keeps it managed while you leave it alone:

What you doNext load
NothingShipped files follow the package; a release that changes a role updates it
Edit oneIt is yours and is never overwritten again
Delete oneIt is not seeded again, but the packaged copy still loads; remove the role itself with a disabled stub or the settings page
Add oneIt loads alongside the shipped roles

.seeded.json records what the package wrote. A file you drop in replaces the shipped role by id; a stub with only id and disabled: true removes it. The directory is watched, so any change is re-read after a short quiet period. seedRolesDir: false stops the package from writing into your directory; watchRolesDir: false reads it once per composition.

Configuration

- insert:
    - id: roles-zeta
      name: dsh-roles-zeta
      config:
        provider: spawn
        toolName: delegate
        backgroundMode: continuable
        maxDepth: 2

No model and no path appears here: role files name their route and the plugin resolves it. The row is host plane, so every agent in every preset sees the tool.

FieldDefaultMeaning
dshHome$DSH_HOME, else ~/.dshHarness home the role directory is derived from
rolesDir$DSH_HOME/agentsYour role directory: seed target and override root
seedRolesDirtrueWrite the shipped roster into rolesDir and keep it current while unedited
watchRolesDirtrueReload the roster when a file in rolesDir changes
commandstrueOne /<id> slash command per role
commandPrefix(empty)Text placed before every command name
settingsPagetrueMount the settings API and page
providerspawnctx.subagents provider name
toolNamedelegateModel-facing tool name
backgroundModecontinuablecontinuable returns a durable child id; one-shot a job id
enableRunInBackgroundtrueExpose run_in_background
maxDepth2Delegation-depth cap for a started child
defaultRoute(empty)Used when a role names no route:
routes{}Alias table: deep: { provider: deepseek-official, model: deepseek-flash } lets roles say route: deep

How a route resolves

A route: is looked up in this order: the row's routes aliases; the session's subagent-model-selection allowed list (the models ticked in the DSH settings); the registered providers' catalogs; an inline model: { provider, model } on the role. The catalog step is what lets a headless profile resolve without any settings surface. When the allowed list is enabled it also gates the role's route: a registered model the list excludes is rejected with a message, not run quietly.

With no route named anywhere the child inherits the calling agent's provider and model, and the result says so; the plugin never picks from the allowed list by itself. A bare model id registered under two providers must be written as provider/model.

Effort is clamped onto the levels the route advertises, the higher one on a tie: deepseek-flash offers off/low/high/max, so medium becomes high and xhigh becomes max. The shipped roles all say high. A substitution is reported in the delegation result.

What the model sees

One tool schema per session: a roster line per role and the allowed routes in the description; parameters role, description, prompt, an optional route alias, provider/model when the session enables model selection, and run_in_background. A call resolves the role, preflights the route, narrows the tool filter against the live registry, and starts one child whose persona prefix is the role body. A foreground call returns the child's final text; a continuable background call returns started subagent <id> and settles through the runtime's notice.

Known limitations

  • A preset's delegation tools survive a role's allow list. Under a preset whose subagent row sets modelSelectionSettings: true, that row installs itself per agent, and tools.restrict() never filters a scope's own layer: a role allowing six tools received eight in the web profile (subagent and list_subagent_models leaked) and six in headless. A read-only role in the web profile can still start a child; the persona says not to, the filter cannot enforce it.
  • A role cannot change the workspace instruction chain. Every child loads the same AGENTS.md/CLAUDE.md chain as its parent.
  • The registry probe is advisory. A tools.restrict() rejection narrows the filter and retries up to three times, so a stale name costs one failed start.
  • A slash command is a request, not a guarantee. The model performs the delegation; the transcript shows whether it did.
  • The settings page edits files, not sessions. A running child is unaffected by a later edit; the next start reads the new file.
  • No per-role memory.