npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-command-menu

v0.2.0

Published

Cmd/Ctrl+K command menu for the DeepSeek Harness Web UI: search sessions by title and message text, run slash commands, open settings sections and workspaces, switch the session's model, and run app actions (new session, sidebar, theme) from one keyboard-

Readme

dsh-command-menu

A Cmd/Ctrl+K command menu for the DeepSeek Harness (dsh) Web UI, in the style of Linear, Raycast, and VS Code. One keyboard-first search box finds and acts on:

  • sessions by title, and message text through the server's session search; opening a message hit scrolls to the match;
  • the current session's slash commands;
  • settings pages, themes, and workspaces;
  • models: switch the current session's model;
  • actions: new session, toggle the sidebars, toggle light and dark, fork the session, stop the running turn, focus the message box.

Contents

Install

dsh plugin --profile web add dsh-command-menu

From a packed tarball (for example one built from this repository with pnpm pack):

dsh plugin --profile web add /absolute/path/to/dsh-command-menu-0.2.0.tgz

The bundle patch (cordis.patch.yml) inserts one plugin row with id command-menu. Restart dsh if the profile does not reload live.

Message text search needs the server's session search index, which the stock Web profile keeps off. Turn it on with a profile patch:

- id: session-query-sqlite
  config:
    path: ':memory:'          # or a file path to keep the index across restarts
    openAt: first-search

Without it the menu still matches session titles and says that message search is off.

Using it

Press Cmd+K (macOS) or Ctrl+K (Windows, Linux) anywhere, including while typing in the message box. Press it again, or Escape, to close. On a phone, tap the search button at the bottom of the sidebar; the menu fills the screen.

With an empty search box the menu lists Recent entries you used, then Actions, your latest Sessions, and the search Scopes. Type to search everything; results are grouped (Sessions, Commands, Settings, Models, Messages, ...) and the group with the best match comes first.

| Key | Action | |---|---| | ↑ ↓ (or Ctrl+P Ctrl+N) | Move | | Enter | Run the highlighted row, or open its list | | Backspace in an empty box | Back one list | | Esc | Back one list, then close |

Start the search with a prefix to narrow it:

| Prefix | Searches | |---|---| | > or / | Slash commands (and actions) | | @ | Sessions, message text, and workspaces | | # | Settings pages and themes | | ? | Lists these scopes |

Rows ending in › open a nested list: Switch model…, Change theme…, Open workspace…, and each workspace (its sessions plus "New session in ..."). The field shows where you are; Backspace in an empty field goes back.

What each row does

| Row | Effect | |---|---| | Session | Opens the session. | | Message hit | Opens the session, scrolls the matching text into view, and highlights it for a moment. If the match is in older history that is not loaded yet, a notice says to scroll up. | | /command | Runs the command in the current session, exactly as if you typed it in the message box. A command that takes input (such as /goal <objective>) is placed in the message box for you to finish. The message box draft is replaced. | | Settings page | Opens Settings on that page. | | Theme | Sets the theme preference (Follow system, Light, Dark, or an installed theme). | | Model | Switches the current session's model; the composer's model control shows the change. | | Workspace | Opens a list of its sessions and "New session in ...". |

Rows appear only when the part of dsh behind them is loaded: no model or command rows without an open session, no Stop without a running turn, no right-panel toggle without the right sidebar.

Configuration

A profile patch targeting the command-menu row:

- id: command-menu
  config:
    hotkeys: [Mod+K, Mod+Shift+P]   # Mod = Cmd on macOS, Ctrl elsewhere
    recentLimit: 5                  # recents on the empty menu, 0 to 20
    groupLimit: 8                   # rows per group while searching, 1 to 50
    messageSearch: true             # search message text through the server

| Field | Default | Meaning | |---|---|---| | hotkeys | [Mod+K] | Key combinations that open and close the menu: Mod, Ctrl, Meta, Alt, Shift joined with +, then a letter, digit, F1–F12, or a named key (Slash, Period, Comma, Space, ...). Keys match the physical key, so they work in any keyboard layout. An empty list leaves only the sidebar button. | | recentLimit | 5 | Recently used entries listed when the search box is empty. | | groupLimit | 8 | Rows each group shows while searching; the rest are counted. | | messageSearch | true | Also search message text. |

The hotkey yields when another handler already took the key (for example a shortcut plugin bound to the same combination), while an input method is composing, and inside any element marked data-command-menu-ignore.

Privacy

Recently used entries are stored in this browser's localStorage (dsh-command-menu:recents) as ids only (session:<id>, command:<name>, ...). Search text, titles, and message snippets are never stored. Message search sends the query to your dsh server's session search, like the sidebar search does.

Known limitations

  • Client-only slash commands (added by browser plugins through commandUi.register) are not listed; dsh has no public list of them. Host commands, skills, and plugin commands are listed.
  • Opening a settings page clicks the sidebar Settings button and then the page's tab, because the settings dialog has no public "open page" call. A layout without that button shows a notice.
  • Scroll to match searches the rendered conversation for the query text. Message search returns no message position, so a match in history that is not loaded yet cannot be revealed.
  • Recent files are not listed; dsh exposes no list of recently opened files. Use @ in the message box for files.

Compatibility

  • dsh >=0.2.0-rc.1 <0.3, Web profile (dsh.client.platform: web).
  • Node.js ^22.19 || >=24.
  • Coexists with keyboard-shortcut plugins such as @hytime/dsh-client-ui-shortcuts (its default chords use Meta+Alt+Shift).

Development

pnpm install
pnpm --filter dsh-command-menu run typecheck
pnpm --filter dsh-command-menu test
pnpm --filter dsh-command-menu run build
pnpm --filter dsh-command-menu run pack:tarball   # writes .artifacts/dsh-command-menu-<version>.tgz

The unit tests cover ranking, prefixes, grouping, recents, and hotkey matching; the menu's keyboard behavior, nested pages, and ARIA wiring in jsdom; the service adapter against fake dsh services (commands, model switch, settings, message reveal); the client plugin's registrations and global hotkey; and the Host half through a real Cordis Loader.

The browser test (e2e/) installs the packed plugin and a test-only model route into a throwaway DSH_HOME, boots the web profile with message search on, and drives Chromium through the hotkey, a new session, message search and reveal, the nested model page and a model switch, slash commands, a settings page, themes, recents, and the phone-width sheet:

# @deepseek-ai/dsh from npm, at the version of the pinned @deepseek-ai/dsh-* dev dependencies
pnpm --filter dsh-command-menu run test:e2e
# another npm version, a built dsh checkout, or any other launcher
DSH_E2E_VERSION=0.2.0-rc.2 pnpm --filter dsh-command-menu run test:e2e
DSH_E2E_CHECKOUT=/path/to/deepseek-harness pnpm --filter dsh-command-menu run test:e2e
DSH_E2E_BIN="npx -y @deepseek-ai/dsh@next" pnpm --filter dsh-command-menu run test:e2e

DSH_E2E_KEEP_HOME=1 keeps the throwaway DSH_HOME; DSH_E2E_SCREENSHOT=/path.png saves a screenshot of the open menu. It needs Playwright's Chromium (pnpm exec playwright install chromium).

Design notes and research: docs/design.md.

License

MIT