dsh-btw
/btw for DeepSeek Harness (dsh) — a
Claude-Code-style side question command.
Ask something in the middle of a task, get the answer rendered directly in the
UI, and keep working. Neither the question nor the answer becomes a model
message in the main conversation: your session log records only the log-only
command/run / command/done pair, the token usage stays zero, and the prefix
cache is untouched.
/btw what's the difference between Drop and DropImpl again?
The answer comes from a one-shot subagent (the fork provider by default),
so it is aware of the ongoing conversation — but the conversation never sees
the exchange.
Install
Requires Node.js ≥ 20 and a dsh installation (npx @deepseek-ai/dsh).
From npm (prebuilt, no build permission needed)
dsh plugin --profile web add dsh-btw
From GitHub
dsh plugin --profile web add github:<your-github-name>/dsh-btw
A git install runs the package's prepare build script, so allow it once in
the profile's pnpm-workspace.yaml (pnpm ≥10 policy):
allowBuilds:
dsh-btw: true
Re-run the add after adding the allowance. Pin a commit
(github:<you>/dsh-btw#<sha>) if you want reproducibility.
Try it from a checkout without installing
dsh --profile web --patch ./smoke/btw.yml
# btw.yml:
# - insert:
# - id: btw
# name: '/absolute/path/to/dsh-btw/src/index.ts'
Verify: dsh --profile web --dump-config shows a btw row; the Web UI's
slash-command catalog lists btw beside plan and compact.
Configuration
The plugin row in cordis.patch.yml accepts a config block (fail-loud:
unknown keys abort plugin load):
- insert:
- id: btw
name: dsh-btw
config:
provider: fork # fork (default) | spawn
persona: terse # optional child persona
| key | default | meaning |
|---|---|---|
provider |
fork |
fork seeds the child with the main session's completed-turn prefix (context-aware answers); spawn starts a fully isolated child. |
persona |
— | Optional persona applied to the child (supported by the in-process fork/spawn providers). |
How it works
- The dsh commands registry dispatches
/btwin the human-only command plane — zero model tokens by construction. - The handler starts a one-shot subagent via
ctx.subagents.start(provider, …)with the exact receivingagentas parent and the UI'sAbortSignal. - The run's result is awaited and the child is always disposed
(
allSettledsettlement — a dispose failure is reported, never swallowed). - The child's visible text blocks are joined and returned as the direct
CommandResult; failure paths map stop reasons to readable errors and preserve partial output.
Full requirements analysis, alternatives considered, and the TDD plan live in docs/DESIGN.md.
Compatibility
Targets the dsh 0.1.0-rc.x line (peer ranges >=0.1.0-rc.1 <0.2). dsh is a
developer preview; expect API movement across rc versions.
Develop
pnpm install
pnpm test # vitest, 30 cases
pnpm typecheck
pnpm build # tsdown → lib/
License
MIT
No comments yet. Be the first to write one.