lovstudio/dsh-model-select-search0

@lovstudio/dsh-model-select-search

接管输入框模型选择器,在保留原生分组的基础上,新增固定搜索框与模糊匹配功能。

AI 分析

核心用途是优化模型切换的搜索体验。适合配置了大量模型、需要通过模糊搜索快速切换当前会话模型的 DSH 用户。

包名
@lovstudio/dsh-model-select-search
版本
0.1.0
最近更新
2026年9月5日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:lovstudio/dsh-model-select-search

@lovstudio/dsh-model-select-search

Search-enabled composer model seat for the DeepSeek Harness web GUI.

The built-in composer model seat (conversation.input.model) only lists provider-grouped models. This plugin takes over that single seat cell with a ModelSelect that adds a pinned search field and fuzzy matching while keeping the built-in package running underneath — the /model popup and the shared per-session model directory still come from @deepseek-ai/dsh-client-ui-model-selection.

What the takeover adds:

  • Sticky search — the field is pinned above the scrolling option list, so typing filters while rows scroll and the field never leaves the viewport.
  • Fuzzy matching — each whitespace-separated term matches as a plain substring, a separator-free spelling (v4pro finds deepseek-v4-pro), or an ordered subsequence within one provider/model name or id (v4p still finds deepseek-v4-pro); order is preserved, never permuted. Descriptions are intentionally not searchable (this surface never shows them), and a query with no hits shows a distinct "no matching models" message instead of the catalog-empty copy.
  • Keyboard + ARIA — entering the pane focuses the search; ArrowUp/Down enter the visible rows at the correct edge; Escape is staged (clear query → back to the Model/Effort root → close). The model list owns its own role="menu" region so the textbox never sits inside a menu.

How it takes over the seat

conversation.input.model is a single slot; occupants coexist at distinct priorities and the lowest live entry renders. The built-in registers at the default priority 0; this plugin registers the same seat at priority -100, so its ModelSelect renders while the built-in package keeps providing the modelDirectories service and the /model command. No data logic is copied: the seat's injected directory/load/select face is built over the shared ctx.modelDirectories service, so the takeover shares one catalog and one session projection with the /model popup.

Removing the plugin restores the built-in seat exactly.

Install

Prerequisites: Node.js 22.19+ or 24+, pnpm 11 (corepack enable or npm i -g pnpm) — dsh plugin forwards to pnpm inside the profile directory.

From a git checkout:

dsh plugin --profile web add github:lovstudio/dsh-model-select-search

Then restart the web profile so the new client bundle is served:

dsh --profile web --no-open

Load gate

After installing, open the web GUI, click the composer model seat (e.g. DeepSeek-V4-Flash · High), drill into the model list and confirm the search field with the placeholder Search by name or ID appears above the groups. Typing v4p should narrow to DeepSeek-V4-Pro rows while other models stay hidden — that proves the takeover bundle, not the built-in seat, is rendering.