From 81630ed4776d03fbe6fe4d0c189829ada73636e5 Mon Sep 17 00:00:00 2001 From: Deepseek Harness Date: Sat, 10 Oct 2026 23:49:42 +0000 Subject: [PATCH] Show xhigh effort as Extra in the model seat; rebuild client.js --- README.md | 1 + client.js | 8 ++++++-- client.src.js | 8 ++++++-- package.json | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 810db72..8988a71 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ An enhanced model selector for the DeepSeek Harness (DSH) Web UI: **pinned, drag - Replaces the composer model seat (slot `conversation.input.model`). - Pin favourite models to the top and reorder them with drag and drop; pins persist in `localStorage` and sync across tabs. - Brand icons (Anthropic, OpenAI, Gemini, DeepSeek, Qwen, Mistral, Grok, Meta, …) matched by model id/name first, then by provider; serving platforms (OpenRouter, Bedrock, Azure, Together, …) only when the model name says nothing. +- Friendlier effort labels: the `xhigh` level is shown as **Extra** (the stored key stays `xhigh`). - Shortcut to open **Settings → Models**. - English and Chinese strings. diff --git a/client.js b/client.js index da923ec..d32bd1c 100644 --- a/client.js +++ b/client.js @@ -119,6 +119,10 @@ window.__ModuleLoader__.load({ pinStore.listeners.forEach((fn) => fn()); }; + // DSH derives effort names from the level key ("xhigh" -> "Xhigh"); show friendlier ones. + const EFFORT_NAMES = { xhigh: 'Extra' }; + const effortName = (e) => (e === undefined ? undefined : EFFORT_NAMES[e.id] ?? e.name); + function moveKey(order, from, to, pos) { if (from === to) return order; const without = order.filter((k) => k !== from); @@ -347,10 +351,10 @@ window.__ModuleLoader__.load({ ? state.retainedEffort : effectiveEffort === undefined ? t('effort.providerDefault') - : reasoning.efforts.find((l) => l.id === effectiveEffort)?.name ?? effectiveEffort; + : effortName(reasoning.efforts.find((l) => l.id === effectiveEffort)) ?? effectiveEffort; const effortChoices = React.useMemo(() => (reasoning === undefined ? [] : [ ...(reasoning.defaultEffort === undefined ? [{ key: 'provider-default', effort: undefined, label: t('effort.providerDefault') }] : []), - ...reasoning.efforts.map((e) => ({ key: 'effort:' + e.id, effort: e.id, label: e.name })), + ...reasoning.efforts.map((e) => ({ key: 'effort:' + e.id, effort: e.id, label: effortName(e) })), ]), [reasoning, t]); const { pending } = state; diff --git a/client.src.js b/client.src.js index 63f2861..dc1c17f 100644 --- a/client.src.js +++ b/client.src.js @@ -119,6 +119,10 @@ window.__ModuleLoader__.load({ pinStore.listeners.forEach((fn) => fn()); }; + // DSH derives effort names from the level key ("xhigh" -> "Xhigh"); show friendlier ones. + const EFFORT_NAMES = { xhigh: 'Extra' }; + const effortName = (e) => (e === undefined ? undefined : EFFORT_NAMES[e.id] ?? e.name); + function moveKey(order, from, to, pos) { if (from === to) return order; const without = order.filter((k) => k !== from); @@ -347,10 +351,10 @@ window.__ModuleLoader__.load({ ? state.retainedEffort : effectiveEffort === undefined ? t('effort.providerDefault') - : reasoning.efforts.find((l) => l.id === effectiveEffort)?.name ?? effectiveEffort; + : effortName(reasoning.efforts.find((l) => l.id === effectiveEffort)) ?? effectiveEffort; const effortChoices = React.useMemo(() => (reasoning === undefined ? [] : [ ...(reasoning.defaultEffort === undefined ? [{ key: 'provider-default', effort: undefined, label: t('effort.providerDefault') }] : []), - ...reasoning.efforts.map((e) => ({ key: 'effort:' + e.id, effort: e.id, label: e.name })), + ...reasoning.efforts.map((e) => ({ key: 'effort:' + e.id, effort: e.id, label: effortName(e) })), ]), [reasoning, t]); const { pending } = state; diff --git a/package.json b/package.json index 2ac2389..4c7a343 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@local/model-selector-plus", - "version": "1.0.0", + "version": "1.0.1", "private": true, "type": "module", "exports": { ".": "./index.js", "./client": "./client.js" },