Repository navigation
Releases
v0.1.12 — Plugin-list localization and host settings cleanup
English
Fixed
- Plugin-list label localization:
plugins.itemslot now registers a dynamic thunklabel: () => getLocalizedTitle()that resolves to'模型搜索'when Chinese (zh) is active, instead of bypassing the plugin locale dictionary with a hardcoded English literal. - Obsolete settings.register compatibility probe: removed legacy
ctx.inject(['settings'], ...)probe calling removed DSH 0.1.7 settings API for an empty Config schema, eliminating runtime debug warnings on host initialization.
简体中文
修复
- 插件列表名称本地化:
plugins.item插槽注册使用动态 thunklabel: () => getLocalizedTitle(),在激活中文 (zh) 时正确解析为'模型搜索',消除硬编码英文。 - 移除过时的 settings.register 探测: 移除对已废弃 DSH 0.1.7 settings API 的兼容性探测调用,消除空 Config 引起的调试警告。
Русский
Исправлено
- Локализация названия в списке плагинов: слот
plugins.itemтеперь регистрирует динамическую функциюlabel: () => getLocalizedTitle(), корректно возвращающую'模型搜索'при активной китайской локали (zh). - Удаление устаревшего вызова settings.register: удалён legacy-блок опроса удалённого API настроек DSH 0.1.7 для пустой схемы
Config, устранены отладочные предупреждения на хосте.
v0.1.11 — Performance optimization, memory leak fix and settings status
English
Fixed
- Memory leak in activeMenus on dropdown unmount: pruned disconnected DOM elements to ensure complete teardown (
state.cleanup(), search wrap removal, event listener detachment) when the model selector dropdown unmounts. - Settings fallback version: dynamically injected
package.jsonversion intolib/client.jsduring build, eliminating stale0.1.6fallback. - DOM mutation tracking: updated
isMenuNodeto inspect ancestor hierarchy vianode.closest, properly detecting child group insertions inside already mounted menu containers.
Performance
- Single query tokenization per keystroke: separated query parsing into
tokenizeQueryand pre-tokenized queries inupdateFilter(), replacing hundreds of regex splits per keystroke with one. Acronym calculation (extractInitials) is now lazy, reducing matching time across 350+ models to under 3ms.
简体中文
修复
- 下拉菜单卸载时 activeMenus 内存泄漏: 在
scan()中清理未连接的 DOM 节点,确保在 React 卸载模型选择菜单时完整执行资源释放。 - 设置卡片版本号回退: 构建时自动从
package.json注入实际版本号,消除陈旧的0.1.6硬编码。 - DOM 变动监听优化:
isMenuNode增加node.closest祖先层级判定,保证动态插入的模型分组能够及时触发搜索框挂载。
性能优化
- 单次输入只分词一次: 将查询分词抽离为
tokenizeQuery,在updateFilter()中仅执行一次分词。同时将首字母缩写计算(extractInitials)转为惰性求值,350+ 模型检索耗时降低至 3ms 以内。
Русский
Исправлено
- Утечка памяти в activeMenus при размонтировании меню:
scan()теперь очищает отсоединенные узлы (isConnected === false), выполняя полный демонтаж и снятие обработчиков. - Устранение хардкода 0.1.6 в карточке настроек: сборщик автоматически подставляет версию из
package.json. - Отслеживание мутаций дочерних элементов меню:
isMenuNodeрасширен восходящей проверкойnode.closest, гарантируя монтирование поиска при динамической подгрузке каталога.
Оптимизация
- Однократная токенизация запроса: токенизация выполняется 1 раз за нажатие клавиши, а расчет акронимов переведен на ленивую схему. Сопоставление по 350+ моделям занимает менее 3 мс.
v0.1.10
v0.1.9
v0.1.8 — Resilient Web Boot, One-Click Updater, & Preflight Compliance
🇬🇧 English
Overview
Release v0.1.8 brings critical stability improvements, production lifecycle resilience, a built-in one-click plugin updater, and preflight code compliance.
What's Changed
- Resilient Web Boot Lifecycle: Implemented deferred, safe slot injection (
registerSlotWhenReady) usingctx.slots.inject('settings.plugin.item', ...)with defensive exception handling and lifecycle bindings. Prevents WebUI boot crashes caused by uninitialized parent settings slots. - One-Click In-App Updater: Added host-side update module (
lib/updater.js) with loopback security, semver comparison, and settings card integration. - Preflight & Code Quality Compliance: Eliminated all empty catch blocks, replacing them with structured diagnostic logging.
- Theme & DOM Compliance: Converted all literal hex and rgba styling to native DSH
--dsw-*semantic tokens and added stabledata-dsh-plugin="dsh-model-search"markers on injected style elements. - Public Packaging: Excluded internal planning documents from the release package, keeping package size at an ultra-lightweight 21.8 kB.
🇨🇳 中文说明
概述
v0.1.8 版本带来了关键的稳定性改进、生产生命周期弹性、内置一键插件更新器以及预检代码规范支持。
主要更新
- 弹性 Web 启动生命周期:采用安全的延迟槽位注入机制(
registerSlotWhenReady)与ctx.slots.inject('settings.plugin.item', ...),增加了防御性异常捕获和生命周期保护,彻底解决因父级设置插槽尚未声明而导致的 Web 启动失败问题。 - 一键更新模块:引入服务端更新模块(
lib/updater.js),支持同源/本地环回安全校验、语义化版本比对及设置界面卡片集成。 - 代码质量规范:移除了所有空 catch 代码块,替换为结构化诊断日志,满足严格的 preflight 检查要求。
- 主题与 DOM 规范:将样式中的硬编码颜色值全面替换为 DSH
--dsw-*语义化主题变量,并为动态注入的 style 标签增加data-dsh-plugin="dsh-model-search"标识。 - 精简发布包:从发布包中严格排除内部开发文档,打包后体积仅 21.8 kB。
🇷🇺 Русский
Обзор
Релиз v0.1.8 включает критические улучшения отказоустойчивости жизненного цикла плагина в WebUI, встроенный модуль обновления в один клик, поддержку семантических токенов оформления и соответствие стандарту preflight.
Что сделано
- Безопасная отложенная инициализация слотов: Реализовано безопасное внедрение слота настроек (
registerSlotWhenReady) черезctx.slots.inject('settings.plugin.item', ...)с защитными обработчиками ошибок и жизненным циклом. Устранена блокирующая ошибка запуска WebUI при обращении к ещё не объявленному родительскому слоту. - Модуль обновления в один клик: Интегрирован серверный модуль (
lib/updater.js) с проверкой loopback/same-origin, сравнением semver и карточкой в настройках плагина. - Соответствие Preflight: Устранены все пустые блоки catch с добавлением информативного диагностического логирования.
- Семантические токены темы и DOM: Цвета интерфейса переведены на системные переменные
--dsw-*, динамический тег style помечен атрибутомdata-dsh-plugin="dsh-model-search". - Чистый состав пакета: Исключены служебные файлы планов, размер архива в npm составляет всего 21.8 КБ.
Verification: All 16 unit tests passing. Preflight: FAIL=0.
v0.1.7
Release v0.1.7
Key Features & Improvements
- Built-in One-Click Updater: Host-side updater endpoint (
/api/dsh-model-search/update) and settings card in DSH Settings tab. - Resilient WebUI Boot: Resolved runtime boot entry failure (
web boot: 1 entry did not activate) using deferred slot injection (settings.plugin.item), safe DOM guards, and lifecycle management. - Theme & Styling: Complete migration to semantic
--dsw-*theme variables and stabledata-dsh-plugin="dsh-model-search"attribute for style isolation. - Package Cleanliness: Excluded internal development plans from release package; verified file sizes well below DSH Store limits.
- Code Quality: Zero empty catch blocks per preflight standard; 16/16 automated tests passing.
- Multi-language Documentation: Full English, Chinese, and Russian documentation and locale dictionaries.
v0.1.6: Architecture Hardening & Defect Remediation
Highlights in v0.1.6
- Canonical Locale Pipeline: Fixed locale resolution by binding via \ctx.locale.bind()\ and properly registering dictionaries inside \ctx.effect()\ with lifecycle-managed teardown. Supports real-time EN, ZH, and dynamic Russian translation.
- Unified Identity: Synchronized package name to @goodandready/dsh-model-search\ across all manifests and sources.
- Zero-Overhead Search: Selective MutationObserver filter guarantees true zero CPU overhead during chat token streaming.
- Extracted Matcher Engine: \lib/matcher.js\ extracted with build parity check (
pm run build) and direct unit test imports. - DOM & State Hardening: State managed via WeakMap/Set; section headings queried safely via \�ria-labelledby\ and \CSS.escape().
- Streamlined Scope: Removed dead write-only recents code in favor of pure, instant live fuzzy model searching.
v0.1.5 — Live searchable model selector enhancement
Features in v0.1.5
- Instant Search & Multi-term Matching: Real-time filtering by model name, technical ID, and provider title with delimiter support (
/,,,;, spaces). - Subsequence & Acronym Fuzzy Matching: Smart matching for acronyms and non-contiguous search queries (e.g.
dsr1->deepseek-reasoner-1). - Provider Syntax Filter:
@providersyntax (e.g.@ollama,@openai) to isolate models by provider. - Recent Models Memory: Tracks recently selected models in browser
localStoragefor quick access. - Multi-Language Architecture: Native English (
en) and Chinese (zh) support in core; Russian translation provided via@goodandready/dsh-russian-lang. - Keyboard Navigation & A11y: Full arrow-key cycling across visible matches and
Enteractivation. - Core Resilience: Non-mutating DOM visibility control immune to DSH core CSS module class changes.
Installation
dsh plugin --profile web add @goodandready/dsh-model-search@0.1.5v0.1.1 — совместимость клиентской половины с ядром DSH 0.1.2-rc.1
Зачем
Ядро DSH 0.1.2-rc.1 убрало из браузерной поставки @deepseek-ai/dsh-client-runtime, @deepseek-ai/dsh-client-ui-slots и @deepseek-ai/dsh-client-ui-primitives; загрузчик не выдаёт модуль вне своей таблицы (46 записей), и клиентская половина падала в «Failed to load plugins».
Что изменено
inject: убран ui-slots.
ctx.slots в rc.1 — встроенная служба ядра. Защищённый require primitives сохранён (ядро отдаёт модуль через staticModules-шиму, при отсутствии — собственный SVG-фолбэк).
Проверки
- node --test — 0 fail
- изолированный test server (rc.1): установка из .tgz, inject ⊆ 46-таблица, загрузка без «Failed to load plugins»
- production: установлена именно 0.1.1, boot-таблица без мёртвых модулей, inject валиден, журнал чист
Совместимость
Серверная половина не затронута; визуал и поведение не меняются. Установка: dsh plugin --profile web add @goodandready/@0.1.1 (или актуальная).