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 the web seam — plain fetch() with redirect following, a 2 MB body cap, and text/HTML/JSON/XML content-type handling.
  • Registers a web_fetch model 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 notes model tool with add / list / remove actions.
  • 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

  1. Copy the plugin directories into your DSH plugins directory:

    ~/.dsh/plugins/web-fetch/index.js
    ~/.dsh/plugins/quick-notes/index.js
    
  2. 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
    
  3. 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