Tools are the model's entry point for performing operations. DSH ships 21 @deepseek-ai/dsh-tool-* packages out of the box, grouped by capability domain below. They register through ctx.tools and automatically appear in the model's tool list.
Want to add a tool for the model? See writing a tool. This page only covers the built-in, out-of-the-box capabilities.
At a glance
| Capability domain | Tool packages | In one sentence |
|---|
| Terminal | tool-bash / tool-bash-persistent / tool-terminal / tool-pwsh | run commands, long-lived sessions |
| Files | tool-fs / tool-fs-search / tool-str-replace-editor | read/write, search, precise editing |
| Network | tool-web | web_search / web_fetch |
| Code | tool-lsp | jump-to-definition, find references, hover |
| Delegation | tool-subagent / tool-subagent-control / tool-subagent-report | hand work to subagents |
| Scheduling | schedule | timed reminders |
| Goals | tool-goal | session-level goals |
| Jobs | tool-jobs | background job output/list/terminate |
| Todos | tool-todo | todo_write |
| Skills | tool-skill | load skills |
| Session query | tool-session-query | history search/traces |
| Questions | tool-ask-user | ask the user |
| Introspection | tool-cordis | query Host/Client contracts and manage versioned dynamic plugins |
| Orchestration | tool-workflow / tool-ralph | JS orchestration, Ralph iteration |
| Model-carrying | decided by each seam | presentation and scheduling |
Terminal domain
| Tool | Key usage | Description |
|---|
bash | run shell commands, optional background jobs, sandbox escalation | general command execution |
bash (tool-bash-persistent) | long-lived shell sessions (same name as tool-bash) | owner-isolated persistent Bash (PTY-based) |
terminal | six persistent terminal tools | interactive terminals, owner-isolated, connected to background jobs |
pwsh | execute PowerShell | the shell layer for Windows scenarios |
Terminal tools all pass through ctx.sandbox.confine (see sandbox and security). The execution environment is uniformly provided by shell-env (ctx.shellEnv): every foreground/background shell call receives a freshly collected managed DSH_* environment snapshot, with built-in DSH_HOME, DSH_SHELL=1, DSH_SESSION_ID (agent calls also carry the DSH_SESSION_JSONL location hint); other plugins can register effect-scoped contributors to append facts; duplicate attribution or undeclared runtime keys fail loud. shell-env is mounted by default, and process.env is never rewritten. | | |
File domain
| Tool | Key usage | Description |
|---|
fs | read / write / edit | goes through the ctx.fs capability seam |
fs_search | glob / grep | bundled ripgrep, fast discovery |
str_replace_editor | view/create/literal replace/insert lines | precise editing, small diffs, easy to review |
Delegation and parallelism
| Tool | Key usage | Description |
|---|
subagent | dispatch one-shot subagents | goes through the ctx.subagents seam |
subagent_control | send_message / interrupt_agent / list_agents | global control of continuable sub-sessions |
report (tool-subagent-report) | the subagent reports back | available within subagent scope |
The full delegation model is in Subagents and parallelism.
Goals / jobs / todos
| Tool | Key usage | Description |
|---|
goal | same-session long-term goals | execution-time permission checks |
jobs | job_output / job_list / job_kill | background job registry |
todo | todo_write | writes into the event-sourced session log |
See Goals, Jobs, and Todos.
Search / query / questions
| Tool | Key usage | Description |
|---|
session_search (et al.) | history session search / traces / event reads | queries DSH's own sessions, opt-in (not mounted by default) |
ask_user | ask the user a question | goes through ctx.userQuestions |
dsh-tool-session-query registers session_search/session_trace/session_event_read and so on to query DSH's own history sessions; the package is opt-in and not mounted by default.
Network
What the model sees is the web tool (web_search / web_fetch), both going through the same ctx.web capability seam. The actual retrieval/forward-fetch is done by the provider backends registered into ctx.web; tool-web only handles presentation (tool name, schema, result format, HTML→markdown):
| Backend | Type | Description | Mount |
|---|
web-search-deepseek | search provider | Anthropic-compatible Messages API + native web_search tool, parses structured result blocks, reuses DEEPSEEK_API_KEY | mounted by default (searchProvider: deepseek-official) |
web-fetch-http | fetch provider | anonymous public HTTP(S), same-origin redirects, byte/char limits, binary rejection; SSRF protection deferred | opt-in (base default fetch: false, no fetch provider mounted) |
web-search-exa | search provider | Exa POST /search, auto/keyword/neural; no generated answer, content omitted | opt-in (requires EXA_API_KEY) |
web-search-perplexity | search provider | OpenAI-compatible chat/completions, generated answer content + citations sources[] | opt-in (requires PERPLEXITY_API_KEY) |
Providers register capabilities, not tools; tool-web's registration follows the product switch (fetch off by default), not backend availability — when a provider is missing/unavailable/ambiguous, the tool schema stays and a structured WebError is thrown at execution. Provider selection resolves within the seam at execution time (an explicit searchProvider/fetchProvider or automatic selection of the single available provider).
Code
| Tool | Key usage | Description |
|---|
lsp | goToDefinition / findReferences / goToImplementation / hover | read-only, based on ctx.lsp |
Introspection and orchestration
| Tool | Key usage | Description |
|---|
cordis | inspect_list/query/self + define/run/stop/undefine | versioned dynamic Cordis toolset |
workflow | run JS orchestration scripts | goes through ctx.workflowEngine |
ralph | Ralph iteration loop with fresh Agents | combines workflow + subagent |
See Workflow and Ralph.
Common combinations (how to chain them to get work done)
| You want | Combination |
|---|
| search + read a file + change code | session_search to find history → fs/str_replace_editor to change |
| terminal running + background jobs | bash resident + jobs to collect background output |
| split a large task for parallel | subagent to dispatch + subagent_control to collect |
| scheduled progress | schedule to set reminders + goal/todo to record progress |
| stuck, ask a human | ask_user to confirm before continuing |
Tools are atomic capabilities; fixing common sequences into reusable form is what skills or workflows are for.
dsh web --dump-config | grep -E "tool-"
# each tool-* plugin and whether it's enabled is visible in the composition tree
Every tool package can override config at the profile layer via a patch (e.g. whether it's off by default, timeouts, workspace authorization). A tool's presentation (native/code/both) is decided by ctx.tools.presentAs, not something a tool cares about itself.