dsh-session-search
Full-text search across every DeepSeek Harness conversation. Press ⌥K
(Alt+K), type, and jump straight to the message — not just the session.
Search behaviour is modelled on obsidian-omnisearch — an excellent plugin for a different app — and built on the same engine, MiniSearch. This project is not affiliated with it and does not reuse its name.
Why
The Harness sidebar search matches session titles and metadata. This plugin indexes the message bodies — every prompt you typed and every reply you got — so you can find that command you ran three weeks ago in a session you never named.
Install
dsh plugin --profile web add dsh-session-search
Not on npm yet — until it is, install straight from GitHub:
dsh plugin --profile web add github:ivanearisty/dsh-session-search
Then restart the harness (the host half builds its index at boot).
Use
| Key | Action |
|---|---|
⌥K / Alt+K |
Open search |
↑ ↓ (or Ctrl+N / Ctrl+P) |
Move through results |
↵ |
Open the session and scroll to that message |
Esc |
Close |
Results group by session, newest first, with the matched terms highlighted. Choosing a hit opens the session, pages its history back until the message is on screen, and flashes it.
How it works
The index lives entirely on the host — the browser never downloads it, and each query returns only a page of short snippets. The tab stays light.
- One document per message: your prompts (
user/messagewith a human source — plugin and system snapshots are skipped) and the assistant's replies. - Built once at boot from the session store, then kept current from the
live
session/eventstream. No polling, no rescans. - Ranking mirrors omnisearch: prefix + fuzzy matching, a 3× boost on the session title, strict AND with an OR fallback when nothing lines up.
- Renames restamp every document of a session, so a result always shows the session's current name.
- Forks are de-duplicated — a forked session inherits its parent's history verbatim, so the inherited prefix is skipped when the parent is also present. When it is not (archived, deleted, or never on this machine), those messages are indexed here, because they exist nowhere else.
Reference scale: ~70 sessions / ~1,200 messages indexes in about a second, and queries answer in single-digit milliseconds.
Permissions and data
- Reads your local session logs through the harness's own session-store service. Nothing leaves your machine; there is no network call, no telemetry, and no external service.
- Registers one private host channel (
/dsh-session-search) withsearchandstatusendpoints, plus one browser overlay and onekeydownlistener.
Optional companion
If dsh-kepler-graveyard is also
installed, hits in archived sessions show a Resurrect button. Without it,
archived sessions still appear, marked 🪦 and not openable. The companion is
detected at runtime and is in no way required.
Settings
The plugin registers a dsh-session-search settings namespace, so it appears
as a card under Settings → Plugins (showing live index size) like any
other installed plugin, and its section lives in settings.yaml:
dsh-session-search:
resultLimit: 60 # maximum hits per query
indexAssistant: true # index assistant replies as well as your prompts
Compatibility
- DeepSeek Harness
0.1.x(developed against0.1.1-rc.2),webprofile. - Node
^22.19 || >=24. - Harness packages are optional peer dependencies: the plugin resolves them from the host installation rather than bundling its own copies.
Known limitations
- Only text is indexed — images, tool call arguments, and reasoning blocks are not.
- The reveal step finds the message by text. If a message was compacted out of the visible history, the session still opens but nothing is highlighted.
- Chord is fixed at
⌥Kin this version; it is not yet rebindable.
License
MIT
No comments yet. Be the first to write one.