dsh-plugins
No description
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 22, 2026
- Updated
- Aug 22, 2026
Introduction
dsh-plugins
Plugins for DeepSeek Harness. One repo, five
packages, published independently under @creait. They came out of running dsh
against self-hosted models, and each closes a gap the harness leaves open.
| Package | What it does | Why |
|---|---|---|
hookkit@creait/dsh-hookkit | Config-driven lifecycle hooks, including context injection. Declare event → handler → outcome in YAML. | dsh has the seams (agent/pre-step, tools/pre-execute, …) but reaching them means writing a plugin. This turns them into config. |
gen-limit@creait/dsh-gen-limit | Per provider/model concurrency cap, enforced at subagent spawn and at the stream, with a settings card. | One self-hosted GPU has a real ceiling; a fan-out of subagents will find it. Denying the spawn beats letting the child die opaquely. |
web-search-searxng@creait/dsh-web-search-searxng | Points web_search at a self-hosted SearXNG instance instead of the native route. | Search without handing every query to a third party. |
web-fetch@creait/dsh-web-fetch | A guarded local fetch provider behind ctx.web, with SSRF blocking on the resolved address. | dsh implements web_fetch in full but ships no provider, so the tool is present and every call fails. |
research-mode@creait/dsh-research-mode | Deep research as an agent mode: a fixed, reviewed loop that plans, researches in adaptive parallel rounds, synthesises and reviews. | A loop the model rewrites per call re-earns the same mistakes per call. Shipping it as a preset also keeps it out of every session that is not research. |
hookkit is the general-purpose one: a small engine that ships no hooks of its
own — 13 lifecycle events × 3 handler kinds (in-process tool, shell, HTTP) ×
3 outcomes (inject context, deny the call, fire-and-forget). It is what makes
something like memory recall a config change rather than a plugin. The rest are
single-purpose. web-search-searxng and web-fetch are both providers for the same
ctx.web seam and compose: together they give an agent search and page reading
without a third-party round trip. research-mode wants web-fetch mounted —
without it, its researchers are capped at search snippets.
Install
Each package installs on its own — you do not need the others:
dsh plugin --profile web add @creait/dsh-hookkit
Develop
The packages resolve their dsh peer dependencies from the harness you have installed, not from the registry, so you are always building against the version you actually run:
DSH="$(npm root -g)/@deepseek-ai/dsh/node_modules/@deepseek-ai"
mkdir -p node_modules/@deepseek-ai
for p in cordis dsh-llm dsh-settings dsh-web schemastery; do
ln -sfn "$DSH/$p" "node_modules/@deepseek-ai/$p"
done
Then:
pnpm test # 194 tests across the five packages
Do not run pnpm install at the root — it would replace those symlinks with
published copies that may not match your harness.
To run a checkout against a live harness, link the package directory into a profile:
// ~/.dsh/profiles/web/package.json
"dependencies": {
"@creait/dsh-hookkit": "link:/path/to/dsh-plugins/hookkit"
}
then pnpm install in the profile and restart dsh web. The boot manifest is
built at startup, so adding a plugin needs the restart — editing a linked one
does not.
Release
Versions are independent; publish only what changed:
cd hookkit && npm publish --access public
pnpm publish-all does every package that has a new version. Scoped packages
default to restricted, so --access public matters on a package's first
publish.
Caveat
All five bind to pre-1.0 internal dsh seams with no compatibility guarantee.
peerDependencies pins the versions each was built against; a harness upgrade
can move them. Each README has a "What breaks this" section.
License
MIT.
research-mode's loop design is ported from
dsh-deep-research
(MIT, Copyright (c) 2026 dsh2026); see research-mode/LICENSE for the
acknowledgement. Everything else here is original.