# dsh-model-search

<p align="center">
  <a href="https://www.npmjs.com/package/dsh-model-search"><img alt="npm version" src="https://img.shields.io/npm/v/dsh-model-search?label=npm&color=blue"></a>
  <a href="https://www.npmjs.com/package/dsh-model-search"><img alt="monthly downloads" src="https://img.shields.io/npm/dm/dsh-model-search?label=%E6%9C%88%E4%B8%8B%E8%BD%BD&color=brightgreen"></a>
  <a href="https://github.com/HeathHe/dsh-model-search"><img alt="stars" src="https://img.shields.io/github/stars/HeathHe/dsh-model-search?style=social"></a>
  <a href="https://github.com/HeathHe/dsh-model-search/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/github/license/HeathHe/dsh-model-search?color=orange"></a>
  <img alt="platform" src="https://img.shields.io/badge/platform-DeepSeek%20Harness%20Web-8A2BE2">
</p>

为 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web 界面的「模型切换」下拉（输入框右侧的模型座位）增加一个搜索框：在 provider 分组之上，按 **模型名 / 模型 id / provider 名** 即时过滤模型列表，其余官方交互全部保留。

Adds a search box to the [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web GUI model switcher (the composer model seat): filters the provider-grouped model list by **model name / id / provider** while preserving every official interaction.

---

## 使用 / Usage

### 安装 / Install

```sh
dsh plugin --profile web add dsh-model-search
```

装完重启 `dsh web`，输入框右侧的模型座位打开后顶部即出现搜索框。/ Restart `dsh web` afterwards; the search box appears at the top of the model panel.

安装指定版本 / Install a specific version:

```sh
dsh plugin --profile web add dsh-model-search@latest
```

### 升级 / Upgrade

```sh
dsh plugin --profile web add dsh-model-search@<新版本>
# 然后重启 dsh web
```

### 源码开发 / Development

```sh
dsh plugin --profile web add link:/绝对路径/到/dsh-model-search
```

### 重新构建 / Rebuild

`lib/client.js` 由 `lib/build.mjs` 从官方 `@deepseek-ai/dsh-client-ui-model-selection` 浏览器产物打补丁生成：

```sh
npm run build   # 即 node lib/build.mjs
```

打补丁锚点全部做了「唯一性 + 恰好出现一次」校验，官方包升级导致锚点漂移时构建会报错而不是静默失效。

---

## 功能 / Features

- **顶部搜索框** — 打开模型面板即出现，按空格分词、大小写不敏感，同时匹配模型名 / 模型 id / provider 名
- **分组收起** — 没有命中的 provider 分组自动隐藏
- **空结果区分** — 无匹配显示「没有匹配的模型」，真正无模型时才显示「没有可用的模型」
- **键盘导航** — 搜索框内 ↑↓ 直接跳到过滤结果首/末项；选择后自动清空搜索词
- **交互保留** — 推理等级选择、当前项勾选、加载/错误状态、toast 全部沿用官方实现

> ⚠️ **重要说明**：本插件通过 `cordis.patch.yml` **替换**官方模型选择组件（`@deepseek-ai/dsh-client-ui-model-selection`），而非叠加增强。DeepSeek Harness 升级后若官方组件发生变化，可能导致本插件失效——届时需重新构建（`npm run build`）并更新插件。

### 已知局限 / Known Limitations

- **依赖上游版本**：`lib/client.js` 从 `@deepseek-ai/dsh-client-ui-model-selection` 的特定版本打补丁生成。上游升级后，构建脚本的锚点可能漂移，需人工适配。
- **键盘覆盖**：搜索框内的 `↑`/`↓` 跳转到过滤结果首/末项，可能覆盖官方原有的某些键盘行为。
- **空格分词**：模型名或 provider 名中若含空格，以空格分词搜索时可能产生意外匹配。

---

## 许可 / License

MIT · `lib/client.js` 衍生自 `@deepseek-ai/dsh-client-ui-model-selection`，详见 `NOTICE` / `LICENSE`。
