dsh-plugins
August 25, 2026 · View on GitHub
Useful plugins for the DeepSeek Harness (DSH). Each plugin is a
self-contained ES module that composes into the DSH host via a cordis.patch.yml row — no build
step, no dependencies.
Plugins
web-fetch
Stock DSH ships web search providers but no fetch provider, so the agent can find URLs but not read them. This plugin fixes that:
- Registers a local
WebFetchProvider(id: local) on thewebseam — plainfetch()with redirect following, a 2 MB body cap, and text/HTML/JSON/XML content-type handling. - Registers a
web_fetchmodel tool that retrieves a URL and returns it as readable plain text (HTML is stripped to text), capped at 50k chars, with a 30s cooperative timeout.
quick-notes
Persistent cross-session memory for your agent:
- Registers a
notesmodel tool withadd/list/removeactions. - Notes are stored in
$DSH_HOME/quick-notes.json(default~/.dsh/quick-notes.json) and survive restarts, so the agent can remember durable facts, decisions, and reminders between sessions.
Install
-
Copy the plugin directories into your DSH plugins directory:
~/.dsh/plugins/web-fetch/index.js ~/.dsh/plugins/quick-notes/index.js -
Add rows to
~/.dsh/cordis.patch.yml:- insert: [{ id: web-fetch, name: ../../plugins/web-fetch/index.js }] - insert: [{ id: quick-notes, name: ../../plugins/quick-notes/index.js }] - id: web config: fetchProvider: local -
Restart DSH. Both tools appear in every session.
Verify
node smoke-test.mjs
Runs both plugins against a stub context: fetches https://example.com through the provider and
tool, and exercises the full notes add/list/remove lifecycle.
Plugin anatomy
A DSH file plugin exports three things:
const name = "my-plugin"; // plugin row name
const inject = ["web", "tools"]; // hard service dependencies
function apply(ctx) { /* register providers/tools on ctx */ }
export { apply, inject, name };
License
MIT