Skip to content
dsh.fish
Bundle

dsh-subagent-roles

Role-based model routing for DSH subagent delegation.

Source
trynewthin
stars
1 stars
License
MIT
Updated
Updated 5 days ago

Readme

# DSH Subagent Roles

> A DeepSeek Harness plugin for routing delegated work through named roles while each user keeps control of the model behind every role.

![7 default roles](https://img.shields.io/badge/default_roles-7-4c6ef5) ![6 contract tests](https://img.shields.io/badge/contract_tests-6-2ea44f) [![DeepSeek Harness plugin](https://img.shields.io/badge/DeepSeek_Harness-plugin-4c6ef5)](https://github.com/deepseek-ai/deepseek-harness)

```text
Main agent
  └─ subagent_roles              inspect configured roles and routes
       └─ delegate_role(scout)   start a continuable child with scout's model

scout → your configured provider / model / reasoning effort
```

A multi-model setup usually fails at the handoff: the lead agent can create a child, but has no durable vocabulary for *why* that child should use a particular model. This plugin adds role names, role descriptions, a settings surface, and two model-facing tools so delegation can express that decision.

## The role is stable; the model is yours

**Seven OMP-inspired role presets give the lead a selection vocabulary.** `scout`, `designer`, `reviewer`, `security-reviewer`, `librarian`, `task`, and `sonic` each carry a short selection description. Reset restores those names and descriptions.

**Model routes are personal configuration, not plugin defaults.** Every user chooses the provider, model, and reasoning effort for each role in Settings. Reset restores the presets while retaining routes for matching role IDs; it never hardcodes someone else's models.

**The handoff keeps the chosen model attached to the child.** `delegate_role` starts a continuable child with the selected route and records the role and reasoning effort in its label, so a later child turn uses the same selection.

**The lead receives a delegation warning.** The plugin adds system guidance to inspect roles and prefer `delegate_role` when creating a child. It is guidance, not enforcement: native subagent tools remain available.

## What it does not claim

Roles currently select a model route and provide lead-agent guidance. They do **not** impose sandbox permissions, tool restrictions, filesystem access rules, or a role-specific child system prompt. A role named `scout` is not technically read-only unless the surrounding DSH profile enforces that separately.

## Install

```sh
dsh plugin --profile web add github:trynewthin/dsh-subagent-roles
```

Restart `dsh web`, then open **Settings → 子代理角色** and select a model route for each role you intend to delegate to.

## Delegate through a role

The main agent can use two tools:

| Tool | Use |
| --- | --- |
| `subagent_roles` | List roles, their selection descriptions, and configured model routes. |
| `delegate_role` | Start a continuable child with a selected role, complete task, and optional label. |

A role without both a provider and model remains visible but cannot be delegated. The tool reports the configuration gap instead of guessing a model.

## Reset behavior

The Settings page places a two-step **重置** action beside **添加角色**. Click once to request confirmation; if it is not clicked again within three seconds, it returns to normal. Confirming restores the seven built-in role names and descriptions, preserves existing routes for matching IDs, and removes custom roles.

Deleting an individual role uses the same two-step, three-second confirmation behavior.

## Compatibility

Built against DeepSeek Harness `0.1.0-rc.6` and Cordis `4.0.1`.

```sh
pnpm install
pnpm typecheck
pnpm build
pnpm test
```

## License

[MIT](https://opensource.org/license/mit)

Install

dsh plugin --profile web add github:trynewthin/dsh-subagent-roles

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source