@pure01fx/dsh-subagent-tiers-hu
v0.1.0
Published
Hu's Subagent Tiers for DeepSeek Harness
Readme
Hu's Subagent Tiers
@pure01fx/dsh-subagent-tiers-hu provides provider-neutral, configurable subagent tiers for DeepSeek Harness. The bundle ships two disabled worker templates:
subagent_fast: scoped edits, quick repository scans, and concise summaries; max depth 1.subagent_pro: focused review, design evaluation, risk analysis, and final synthesis; max depth 2.
No model provider is required or selected by the package. A tier becomes visible only after the user enables it and selects an exact provider/model route that the current DSH profile can validate.
Install
Add the package to the Web profile, restart the existing Web process, and refresh the GUI:
dsh plugin --profile web add @pure01fx/dsh-subagent-tiers-huFor local development, the package spec may instead be an absolute checkout path.
Configure in DSH Web
Open Settings → Subagent tiers. Fast and Pro are built-in templates, and New tier creates removable custom tiers with a unique ID and tool name. Every tier provides editable fields for:
- enabled state, provider, model, reasoning effort, and optional token limit;
- tool description and worker persona/prompt, with a per-tier prompt reset action;
- fresh/fork context, continuable/one-shot background mode, background permission, and maximum delegation depth;
- for custom tiers, a unique tool name and any currently installed non-default mode in which the tool should be visible. New tiers start with no mode selected.
Provider, model, and effort choices come from DSH's live LLM catalog. The host validates the exact route with the owning adapter; catalog membership is advisory, while adapter validation is authoritative. An unconfigured or unavailable tier is not registered, and the built-in generic delegation tools remain available when no replacement tier is active.
Configuration is stored in subagent-tiers.json beside the active profile's cordis.yml (normally $DSH_HOME/profiles/web/subagent-tiers.json). The version-3 file contains worker definitions, custom-tier mode exposure, route identities, and prompts, never credentials. Writes are revision-fenced, cross-process locked, atomically replaced, and mode 0600. If editable state is malformed, tiers fail closed while the settings page remains available to repair it; independently valid historical route revisions are retained during that repair.
The rc.6 Web API does not let third-party plugins expose their own privileged settings namespace, so this package temporarily serves a loopback- and same-origin-only configuration endpoint. Provider credentials continue to use DSH's credentials/settings services and are never accepted by this endpoint.
Architecture
Each exact worker route receives an immutable revision provider name in the durable subagent/descriptor. A root agent/request waterfall resolves that revision from the profile ledger and pins provider, model, effort, and optional token limit. Editing any tier creates a new revision without changing routes used by existing continuable children; malformed, legacy, or missing tier revisions fail closed instead of falling through to a host default.
The plugin wraps DSH's built-in spawn or fork subagent provider. Current revisions own the visible built-in and custom tier tools; historical wrappers remain registered only so durable children can resume. Tools are exposed only after both the LLM route and the matching base subagent provider are available.
Tools are registered in the profile and hidden per live agent with scoped restrictions derived from presetBindings plus custom-tier exposure choices. No shipped or third-party preset files are edited. The mode picker comes from the live agentPresets.list() roster; custom tiers may explicitly opt into a discovered mode, while unselected modes inherit the safe default and expose no custom tier tools.
Background report scheduling
The bundle changes the host tool-subagent-report policy to reportDelivery: quiet for all continuable children in the profile. A child-authored report adds parent context without waking the parent or creating a one-message followup turn; runtime-owned settlement notices remain separate and wake or steer the parent when an Activation ends.
There is no blocking wait tool for an already-started continuable child. The parent should keep doing independent work while children run, then finish only its current response when no independent work remains so settlement can resume it. It must not end or dispose the session. If the current response cannot complete without the child result, start the tier with run_in_background: false instead.
Host configuration
The bundle patch contains disabled Fast/Pro templates and built-in preset bindings. A profile overlay may still override the subagent-tiers Cordis row when deployment-managed defaults are preferred.
workers.<id> accepts:
- optional
enabled,route,persona, andtoolFilter; - required
toolNameanddescription; route.provider,route.model, optionalreasoningEffortandmaxTokens;execution.contextMode(freshorfork),backgroundMode,enableRunInBackground, andmaxDepth.
A worker with a route and no explicit enabled keeps backward-compatible enabled behavior. An enabled worker must have a route. presetBindings.<preset> accepts an expose list and optional replaceGenericTools. Unknown presets fall back to presetBindings.default; the safe default exposes nothing.
validateRoutesOnStart: true turns an unavailable configured route into a plugin startup failure. The default keeps the settings UI available, marks the route unavailable, and withholds its tier tool until the route becomes valid.
Visibility and cold resume
As configured base providers and LLM adapters change, the plugin reconciles tier availability and live-agent restrictions. Standard, Code, Cordis, and Minimal keep their native/Code Mode wire; only configured, valid tiers appear.
A low-level schemas(standingKeyFor(preset)) query in rc.6 does not include live-agent restrictions. The current Web GUI uses live-agent scopes and does not render catalogs from standing preset keys. If that changes, registration should move into generated preset layers.
Route revisions are append-only because a cold-resumed child's descriptor stores the wrapper provider name. Removing an old revision without proving that no session references it would break cold resume, so automatic garbage collection is intentionally omitted.
Development
npm install
npm run check
npx publint
npx @arethetypeswrong/cli --pack .The test suite covers configuration/routing, profile persistence, immutable route revisions, provider and tool mounting, preset restrictions, request pinning, foreground execution, and continuable execution. Live-profile verification should additionally cover actual model headers, route edits followed by cold resume, adapter add/remove, and Web settings interaction.
