dsh-effort-slider

DSH PLUGIN文档与办公

仓库 suyunxing/dsh-effort-slider · npm @lolannn/dsh-effort-slider

文档与办公 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

把 DSH 输入框的模型选择器换成星光滑轨,模型与思考强度同控件管理,切换模型自动匹配最接近档位,不再报错。

一句话选型结论

按资料字段整理

dsh-effort-slider 是文档与办公类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,列出 5 项功能,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类文档与办公 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-11-08 创建于 2026-11-04
README 11.1 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add @lolannn/dsh-effort-slider@0.2.8
  1. 1
    确认版本与运行环境

    兼容的 DSH 版本为 0.2.2-rc.1;版本不匹配时安装会报错。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本0.2.2-rc.1版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名@lolannn/dsh-effort-slider可用 npm view 查看包信息

能做什么

5 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-effort-slider:DeepSeek Harness 输入框里的星光滑轨档位控件

  • 星光滑轨替换模型选择器
  • 按模型动态生成思考档位
  • 跨模型自动就近映射档位
  • 输入框光环随档位变化
  • 光环开关本地持久化

适用场景

内容创作

上游标签

deepseek-harnessdshdsh-pluginreasoning-effort

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-11-11): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
L5 · 运行已测 ✓ 通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 方式:Web 启动
  • L5.3_HTTP_SERVED HTTP 服务响应 方式:HTTP 请求
  • L5.4_PLUGIN_INVENTORY_ACTIVE 插件清单中已激活 方式:插件清单查询

风险详情

  • 结论说明 静态扫描 低;动态审计无结论(以下以静态为准)→ 总评级 低。
  • 风险计数 严重 0 / 高 0

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。
  • 标注了兼容的 DSH 版本(0.2.2-rc.1),按版本装不容易报错。
  • 列出了 5 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在文档与办公场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-effort-slider当前 L5 · 运行验证通过 低风险 0 0.2.2-rc.1 有
reactive-resume L3 · 安装规范通过 低风险 4.4 万 未标注 有
webnovel-writer L4 · 沙盒安装通过 低风险 7,742 未标注 有
baoyu-design L4 · 沙盒安装通过 低风险 6,403 未标注 有
answer-me-with-html L4 · 沙盒安装通过 低风险 4,782 未标注 有
Pagekin L4 · 沙盒安装通过 低风险 2,601 未标注 有

仓库档案

文档与办公
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方suyunxing仓库 dsh-effort-slider · 默认分支 main
分类文档与办公creator
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言JavaScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-11-04 · 2026-11-08最后推送 2026-11-08
本站收录2026-11-05首次进入本站目录的时间

README 全文

11.1 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-effort-slider

A reasoning-effort slider that replaces the shipped model selector in the dsh
web GUI composer. One control owns both halves of the model choice: the model
list and that model's reasoning effort, which becomes a glowing rail with a
starfield behind it.

中文:把 dsh 输入框里的模型选择器换成一条"星光滑轨"——模型列表与思考强度由同一个控件管,切到不支持当前档位的模型时自动落到最接近的一档,不再报错。

dsh plugin add @lolannn/dsh-effort-slider          # from npm
dsh plugin add git+https://github.com/suyunxing/dsh-effort-slider   # from source

Screenshots

The rail is drawn from the model's own reasoning.efforts, so the tick labels
change with the model — off / low / high / max on one, low / medium / high / xhigh / max on another — and the knob lands on the level the session is
actually using.

What it does

  • Takes over conversation.input.model (a single slot, so this shadows the
    shipped selector rather than sitting next to it) at priority: -1 — a single
    slot renders the lowest priority first.
  • Reads the model catalogue at runtime: the model list comes from
    catalog.groups (grouped by provider) and the levels are exactly the
    reasoning.efforts the current model declares (typically off / low / high / max). No hard-coded list.
  • Shows the Session's real selection, not the deployment default, by reading
    the durable modelSelection projection.
  • Picking a level or a model calls the session selectModel remote with the
    explicit { provider, model, reasoningEffort } triple, so the choice applies to
    the Session and is saved as the default in the background.
  • Switching to a model that does not declare the level in hand is resolved on the
    client first: the closest level that model does declare is sent instead, and
    the status line says which substitution happened. A model with no reasoning at
    all is switched to with the field omitted, so the Host applies that model's own
    default. Nothing errors, nothing is silently dropped.
  • The rail is animated: drifting particles, soft ribbon waves, iridescent
    four-point stars, a breathing star core, and a three-armed galaxy that
    collapses out of the rail at the top level. Reaching the top fires a shockwave
    burst, a star-warp starfield and a light-blade flash.
  • The composer itself carries the light: a halo wraps the whole input card, with
    the same hue as the rail. Brightness, ring alpha and glow radius all follow the
    level, so off is a faint rim and the top level breathes; opening the panel
    lifts it. The pill only keeps an outline while the halo is on.
  • The halo is a setting, not a hard rule. A 外圈光环 switch sits under the rail;
    turn it off and the glow returns to the pill alone, the way it was before the
    halo existed. The choice is stored in localStorage under
    effort-slider:halo, so it survives a reload.
  • The halo knows its place in the page. It is a body-level layer at z-index: 30
    — above the docked panes (10) that hold the composer, below floating panes (60),
    host menus (70) and dialogs (1000) — so anything opened over the composer covers
    the ring instead of the ring painting over it. For overlays that sit lower in
    the stack than that, the ring asks the page what is on top along the card's
    edge (elementFromPoint) and steps aside while two or more probes land on a
    foreign element, coming back as soon as the composer is clear again.
  • Models without reasoning efforts are tagged 无档位 in the model list and
    degrade gracefully once selected: the rail is dimmed and the status line says so
    instead of pretending to switch.

Surfaces

Slot Content
conversation.input.model the trigger (模型 · 档位) and, while open, the popup: model row, grouped model list, effort rail, level scale, status line
conversation.input.model.label untouched — the shipped non-interactive label stays owner-managed

The popup renders through react-dom's createPortal into document.body,
because the composer row can live inside a transformed/overflowing ancestor that
would clip a position: fixed child.

Interaction

  • Click the trigger, then drag the rail or press ← → ↑ ↓ Home End.
  • The rail snaps to the nearest level on release (elastic overshoot).
  • The level names under the rail are buttons too — same edge math as the thumb,
    so each label sits exactly under its stop.
  • Click the 模型 row to expand the model list; picking a model carries the current
    effort across, remapping it when that model lacks the level (see below).
  • Outside click or Esc closes. Direction keys are ignored while a text field
    has focus, so typing in the composer never changes the effort.

Files

  • index.js — Host half. The bundle row exists so the browser half has an entry
    to attach to; it declares no service, tool or config.
  • client.js — the whole feature: stylesheet injection, catalogue + projection
    mapping, canvas engine, controller and the slot registration.
  • icon.svg — original artwork (pinched four-point star over a lit rail).

Notes

  • All canvas work is requestAnimationFrame-driven and stops on unmount.
  • prefers-reduced-motion: reduce disables the burst, the warp and the quake.
  • Only transforms, opacity and canvas are animated; no layout thrash.
  • The canvas is sized from the card (getBoundingClientRect + ResizeObserver),
    not from the viewport.
  • Opening the popup while already on the top level arms the burst guard instead of
    firing it, so the celebration only plays when you actually move into the top
    level.
  • The popup opens upward, but flips downward and caps its height when the trigger
    sits too low for that (landscape phone, small window).

Why a model switch remaps the effort

The Host validates the triple, it does not normalize it. In
@deepseek-ai/dsh-llm → resolveCallWithInfo:

const reasoning = info.reasoning;
const requested = defaulted.reasoningEffort;
if (reasoning === void 0) {
if (requested !== void 0) throw new LlmError(`... does not support reasoning effort "${requested}"`, "UNSUPPORTED_REASONING_EFFORT");
} else {
const effective = requested ?? reasoning.defaultEffort;
if (effective !== void 0 && !reasoning.efforts.some((e) => e.id === effective)) throw new LlmError(..., "UNSUPPORTED_REASONING_EFFORT");
}

The comment above it is explicit: "no clamping or aliasing is performed." A
model with three rungs and a model with seven therefore reject each other's
levels, and the session remote wraps that rejection as
RemoteError("session/model-unavailable", …) — which used to surface as a red
切换失败:provider "…" model "…" does not support reasoning effort "…".

So resolveEffort(model, wantedId) in client.js maps the level onto the target
model before the request is built:

Case What is sent Status line
target declares the level it, unchanged nothing
target declares other levels the closest one 该模型没有「medium」档,已自动切到最接近的「low」
target declares no reasoning the field is omitted 「」没有思考强度档位,已按模型默认运行

"Closest" is measured on one shared scale rather than per-provider lists, because
every adapter names its rungs from the same vocabulary:
off · none · minimal · low · medium/med · high · xhigh · max · ultra. A tie
resolves to the stronger rung — losing reasoning power is the worse of the two
surprises (high → xhigh rather than high → medium when both are one step
away). A rung whose id is not on that scale is placed by its position in its own
list, and when the id being carried is itself unknown the target's
defaultEffort (then its strongest rung) is used instead, because its distance
cannot be measured.

The last real choice is remembered in lastEffort, so
max → 无档位模型 → back returns to max instead of that model's default: the
intent survives the models that cannot express it.

Why every visible label is passed through safeLabel

dsh-pocket installs a document-level click guard for phones: any click on a
/ whose text content looks like a file path is cancelled with
preventDefault() + stopImmediatePropagation() and replaced by a toast
("手机上无法直接打开电脑上的文件"). Its matcher includes
/[\w.\-]+\/[\w.\-]+\.\w{1,12}/, which a model id like
workbuddy-ai/deepseek-v4.1-flash matches — so the trigger became unclickable on
mobile while working fine on the desktop.

Every label rendered as text therefore runs through safeLabel(), which turns
/ and \ into ·. aria-label and title keep the raw identifier, because
they are attributes and the guard only reads textContent.

Where the "current" model comes from

modelCatalog().default is the deployment default and can differ from what a
Session really runs (a Session-local override). Spreading it into a commit
silently switched the model while the user only meant to change the effort.

So the controller follows the Session's durable projection — the same source the
shipped selector reads:

sessions.binding(sessionId).session.projections.faceOf("modelSelection")
// -> ObservableSnapshot<{ lastUsed, next }>, next = pending ?? lastUsed

model/selection carries the user's intent immediately (pending), and
request/header records what a request actually used (lastUsed). Two details
matter:

  • The face is subscribed before the first getSnapshot(); reading a
    projection nobody observes can return no value at all.
  • The catalogue default is a fallback only, used until the projection has a value.

Verification

  • conversation.input.model resolves to this plugin (priority: -1, active) and
    the shipped registrant goes inactive.
  • Trigger reads 选择模型与思考强度 — ·; changing the level
    propagates through selectModel into the projection and back into the label.
  • The popup's model list exposes every routable model, grouped per provider.
  • Switching medium (on a seven-rung model) to an off/low/high/max model sends
    low and reports the substitution; switching to a no-reasoning model sends no
    reasoningEffort at all; switching back restores medium.
  • Checked in a real client at 360×780, 360×400 (short) and 1280×800: a real click
    opens the popup, it stays inside the viewport, the level labels sit under the
    thumb stops, the selected model is marked, and opening does not replay the
    top-level burst.
  • A panel laid over the composer hides the ring and it returns once the panel is
    gone; the card's own ancestors and this plugin's popup never blank it.
  • npm test runs four harnesses (effort mapping, model switch, halo, refresh
    queue), 87 assertions in total.

常见问题

8 问
答案由本站依据条目字段整理,不引用上游原文
dsh-effort-slider 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add @lolannn/dsh-effort-slider@0.2.8` 即可。对应的 npm 包名是 `@lolannn/dsh-effort-slider`。

dsh-effort-slider 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-effort-slider 安全吗?

低风险。静态扫描 低;动态审计无结论(以下以静态为准)→ 总评级 低。

dsh-effort-slider 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-effort-slider 支持哪些 DSH 版本?

上游记录的兼容版本包括 0.2.2-rc.1。

dsh-effort-slider 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-effort-slider 有哪些功能?

星光滑轨替换模型选择器、按模型动态生成思考档位、跨模型自动就近映射档位、输入框光环随档位变化、光环开关本地持久化。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

同名或近似条目

7 条
不同作者的仓库分开列,请确认你要装的是哪一个
文档与办公
按星标排序,可作替代方案

webnovel-writer

webnovel-writer

基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200 万字量级 连载创作。

L4 · 沙盒安装通过 7,742 星

baoyu-design

baoyu-design

L4 · 沙盒安装通过 6,403 星

answer-me-with-html

answer-me-with-html

Answer me with HTML — an agent skill that answers hard questions with

L4 · 沙盒安装通过 4,782 星

Pagekin

Pagekin

Pagekin,免费 AI 小说写作软件,从设定、蓝图到正文、审稿、定稿;支持拆解仿写、续写、改写,可导入写作 Skill(如去 AI 味)

L4 · 沙盒安装通过 2,601 星

suyunxing 的其它插件

3 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-11-11。