dsh-recent-fav-models
v0.1.0
Published
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"
Downloads
291
Maintainers
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)
