Every tool is a plugin package. The core set is run_code (@deepseek-ai/dsh-tools), bash and its persistent variant, str_replace_editor, the fs read/write/edit family, glob and grep, lsp, subagent and workflow orchestration, goals and todos, session queries, web search and fetch, scheduling, and the cordis_* runtime tools. Which of them your agent sees is decided by the mode and the bundles your profile stacks.
Most write-ups describe DeepSeek Harness in the abstract: "it has tools". The repository ships an actual catalogue, and reading it tells you more about the harness's design than any summary — every tool is its own package, which is what "everything is a plugin" means in practice.
Here is the full set, grouped by what it does.
Execution
| Tool | Package | What it does |
|---|---|---|
run_code | @deepseek-ai/dsh-tools | Executes a TypeScript program. Takes code — the body of an async function, erasable syntax only, with top-level await and return working — plus a description. |
bash | @deepseek-ai/dsh-tool-bash | Runs bash commands. Each call runs in a fresh shell: no cwd, variables or functions persist between calls. Supports run_in_background: true. |
bash (persistent) | @deepseek-ai/dsh-tool-bash-persistent | Same surface, but state — including current directory and exported environment variables — persists across calls. |
pwsh | @deepseek-ai/dsh-tool-pwsh | PowerShell equivalent for Windows. Also a fresh process per call. |
run_code is the mechanism behind Code mode — the preset whose official Chinese display name is PTC 模式. The model
writes one program instead of issuing a tool call, reading the result, issuing the next, and paying a
model round-trip for each step.
Filesystem
| Tool | Package | What it does |
|---|---|---|
read, write, edit, read_image | @deepseek-ai/dsh-tool-fs | Text file operations with line numbering. read_image retrieves PNG/JPEG/WebP/GIF for image-capable models. |
str_replace_editor | @deepseek-ai/dsh-tool-str-replace-editor | View, create and edit files by precise literal string replacement. Commands: view, create, str_replace, insert. |
glob, grep | @deepseek-ai/dsh-tool-fs-search | File discovery by glob pattern and ripgrep regex search. Returns up to 100 matches; larger result sets are written to disk. |
Minimal mode is exactly dsh-tool-bash-persistent plus dsh-tool-str-replace-editor — which is why
the mode description says "two tools" rather than "a reduced tool set".
Terminals
terminal_open, terminal_send, terminal_read, terminal_close, terminal_list,
terminal_signal — all from @deepseek-ai/dsh-tool-terminal.
These are persistent PTY sessions, not one-shot commands. They support a background job mode for
long-running processes, which is the right tool for anything interactive: a REPL, a dev server, an
ssh session, a process you need to send a signal to.
Code navigation
lsp (@deepseek-ai/dsh-tool-lsp) issues language-server queries: goToDefinition,
findReferences, goToImplementation, hover. It requires a registered LSP provider — without one,
the tool is present but has nothing to ask.
This is a meaningful capability difference from grep-based navigation. findReferences through a
language server knows about types and scopes; grep knows about strings.
Sub-agents and orchestration
| Tool | Package | What it does |
|---|---|---|
subagent, subagent_fork | @deepseek-ai/dsh-tool-subagent | Delegates work to a separate agent. The fork backend registers additionally as subagent_fork. |
send_message, interrupt_agent, list_agents | @deepseek-ai/dsh-tool-subagent-control | Controls background sub-agents — follow-up messages, interrupting a turn, listing what is running. |
report | @deepseek-ai/dsh-tool-subagent-report | A child agent reports findings to its parent. Visible only inside continuable in-process child sessions. |
job_list, job_output, job_kill | @deepseek-ai/dsh-tool-jobs | Manages background work across every job type — bash, terminals, sub-agents. |
workflow | @deepseek-ai/dsh-tool-workflow | Orchestrates multi-agent workflows with agent(), pipeline() and parallel() primitives. |
ralph | @deepseek-ai/dsh-tool-ralph | Runs a foreground fresh-agent Ralph loop toward one immutable objective. Each round spawns a new child session. |
This group is the part of the harness that is genuinely ambitious, and the part least covered elsewhere. It gets its own guide.
Planning and goals
| Tool | Package | What it does |
|---|---|---|
exit_plan_mode | @deepseek-ai/dsh-plan-mode | Presents a complete plan as markdown for review and approval before execution. |
create_goal, get_goal, update_goal | @deepseek-ai/dsh-tool-goal | Persisted completion objectives with continuation rounds. Supports pause, resume, complete and blocked states. |
todo_write | @deepseek-ai/dsh-tool-todo | Session task lists with pending, in_progress and completed. Replaces the entire list per call. |
Note the difference in durability. A todo list is session scratch state; a goal is a durable objective attached to a session, with a phase and a round cap. They are not two names for the same idea.
Session history
session_search, session_trace, session_event_read, session_event_search, session_event_trace
— all from @deepseek-ai/dsh-tool-session-query.
These are read-only queries across authorised sessions in the workspace. They are what makes the append-only session log useful to the agent rather than only to you: an agent can search what a past session actually did instead of being told about it.
Interaction, web, skills, scheduling
| Tool | Package | What it does |
|---|---|---|
ask_user_question | @deepseek-ai/dsh-tool-ask-user | Pauses for user input. Each question carries a stable id echoed back in the answer. |
web_search, web_fetch | @deepseek-ai/dsh-tool-web | Search and fetch. Providers sit behind the ctx.web service, so the backend is swappable. |
skill | @deepseek-ai/dsh-tool-skill | Loads the full instructions for an available skill before acting on a matching task. |
schedule_create, schedule_list, schedule_delete | @deepseek-ai/dsh-schedule | Session-local reminders triggered by delay, fixed rate, or absolute time. |
Runtime extension
cordis_define, cordis_run, cordis_inspect_list, cordis_inspect_query, cordis_inspect_self,
cordis_stop, cordis_undefine — from @deepseek-ai/dsh-tool-cordis.
These let the agent define and manage Cordis plugins at runtime. This is the machinery behind
Creator mode: cordis_inspect_self is how an agent examines the composition it is currently running
inside, and cordis_define is how it tries a new one in memory before anything is saved.
How to see your own set
The catalogue above is what exists. What your agent has is decided by the mode and by the bundles your profile stacks:
dsh --profile web --dump-configEvery tool package that mounted appears as a row, and every row can be patched — removed, replaced, or reconfigured — from a layer above it.
Frequently asked
Why does my agent not have a tool listed here?
Tools are plugin packages, and a mode is a particular composition of them. Minimal mode deliberately exposes only persistent bash and str_replace_editor. Run dsh --profile <name> --dump-config to see which tool packages your profile actually mounts.
What is the difference between bash and persistent bash?
The plain bash tool runs each call in a fresh shell, so no cwd, variables or functions survive between calls. The persistent variant keeps that state across calls.
Is run_code the same thing as Code mode?
run_code is the tool that makes Code mode work — it executes a TypeScript program body so the model can combine multi-step operations into one call instead of many tool round-trips.