dsh-recent-fav-models
Verifieddsh-recent-fav-models · v0.1.0 · MIT · Web UI
DeepSeek Harness plugin «Свежие модели» — embeds a «Последние» (5 most recently used, unique) and a collapsible «Избранные» block at the top of the model selector popup. Clicking a model programmatically activates the matching stock `[role="menuitemradio"
Install
dsh plugin add dsh-recent-fav-models Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Readme
dsh-recent-fav-models
Плагин DeepSeek Harness «Свежие модели» — расширяет выпадающий список выбора модели
списками, группировкой и навигацией. Неинвазивный: не форкает и не «затеняет»
штатный UI — ждёт появления [role="menu"] в DOM и работает поверх него чистым
DOM API (без React, слотов и словарей).
Возможности
Блоки вверху списка моделей
- «Последние» — до 5 уникальных, самых недавно использованных моделей (самая свежая первой, MRU). Обновляется автоматически при каждом выборе модели (в т.ч. из обычного списка). У каждой строки справа — звёздочка ★/☆: клик добавляет/убирает модель из избранного.
- «Избранные» — сворачиваемый блок (шеврон ▾/▸). В заголовке кнопка «+» открывает попап со ВСЕМИ моделями и чекбоксами, чтобы добавить сразу несколько.
- Пользовательские списки — именованные сворачиваемые списки моделей. Создание/редактирование/переименование/удаление — через попап (кнопка «+» у «Избранные» либо «+» в заголовке списка). Имя валидируется хостовой стороной: латиница+кириллица+пробелы, 3–40 символов. Каждый список имеет «🗑» (удаление с подтверждением).
Группировка и навигация по списку моделей
- Сворачиваемые группы провайдеров — штатные секции провайдеров
(
Anthropic,OpenAI,Google, …) сворачиваются/разворачиваются кликом по заголовку группы (шеврон ▾/▸). Состояние (какие группы свёрнуты) сохраняется на хосте и восстанавливается. По умолчанию все группы развёрнуты. - Скролл к выбранной модели — при каждом первом открытии списка он прокручивается к текущей выбранной модели (даже если это модель по умолчанию). Если выбранная модель лежит внутри свёрнутой группы — группа автоматически разворачивается.
- Плавающая кнопка «▴» — закреплена внизу окна со списком моделей независимо
от прокрутки. Поведение:
- если выбранная модель выше видимой области и не в поле зрения → прокрутка к её строке;
- если выбранная модель ниже или в поле зрения → прокрутка на самый верх. Кнопка скрывается, когда список закрыт.
Архитектура и хранение
- Хранение на хосте — один JSON-файл (
<DSH_HOME>/recent-fav-models.json, по умолчанию~/.dsh/recent-fav-models.json), атомарная запись (temp + rename), переживает перезапуск DSH. СледуетDSH_HOME(в изолированном профиле/превью — свои записи).schemaVersion: 2. - Ключ модели — точная строка
titleштатной кнопки[role="menuitemradio"](уникальна на строку); ею же клиент ищет совпадение в живом DOM — единственная стабильная идентичность end-to-end. - Канал — прямой
webServer-роутPOST /recent-fav/<method>(неctx.connection.rpc, т.к. dsh-client-connection не резолвитwebServerв этом Cordis-дереве), паттерн как уdsh-skill-folder/@weibaohui/skills-management. - Выбор модели — программный клик по штатному
[role="menuitemradio"][title=<ключ>], запускается штатный обработчик DSH; модуль никогда сам не переключает модель.
Методы RPC (по адресу /recent-fav/<method>, POST, JSON)
| Метод | Вход | Выход |
|---|---|---|
snapshot |
{} |
{ recent, favorites, lists, collapsedGroups, schemaVersion, maxRecent } |
markUsed |
{ key } |
{ ok, recent } |
setFavorites |
{ keys } |
{ ok, favorites } |
createList |
{ name, models } |
{ ok, list, lists } |
renameList |
{ id, name } |
{ ok, lists } |
deleteList |
{ id } |
{ ok, lists } |
setListModels |
{ id, models, name? } |
{ ok, lists } |
setGroupCollapsed |
{ names } |
{ ok, collapsedGroups } |
Ошибки возвращаются со статусом 200 и полем result.error:
bad-request (невалидные входы), not-found (неизвестный список/метод).
Возможности/структура
lib/index.js— хостовый плагин: регистрация RPC-роута/recent-fav, валидация входов.lib/storage.js— атомарное JSON-хранилище (recent,favorites,lists,collapsedGroups).lib/client.js— веб-бандл: инъекция блоков, попапы, группы, скролл, плавающая кнопка.
Установка (из npm)
Пакет публикуется в npm как dsh-recent-fav-models. Установка идёт в профиль DSH
(под капотом это pnpm add, тянущий пакет из npmjs):
dsh plugin --profile web add dsh-recent-fav-models
dsh web
<name> в --profile <name> — имя вашего профиля DSH (обычно web, если не
настраивали отдельный профиль). После установки/обновления клиентской части
обязателен хард-рефреш (Ctrl+Shift+R), т.к. клиентский бандл кэшируется.
Локальная разработка
Вместо npm-пакета можно подключить модуль из локального каталога через link:
(в package.json профиля): "dsh-recent-fav-models": "link:/путь/до/dsh-recent-fav-models".
Скрипты
npm run check— синтаксическая проверка всехlib/*.jsчерезnode --check.
Требования
- Node.js 22+
- DSH
0.1.x(протестировано на0.1.5-rc.3)