Microqian2th/dsh-codex-effort-slider

dsh-codex-effort-slider

把官方「推理等级」那一行改成一条可拖动的连续轨道:填充从蓝渐变到紫罗兰,较高档位带星尘粒子,官方数值文字跟着档位变色。Off 档保持官方灰,不改写官方任何文字。

待分类aiai-agentscodex

dsh-codex-effort-slider

给 DeepSeek Harness(DSH)用的 Codex 风格推理等级滑条。

一档一色、越往右越"通电":填充从蓝渐变到紫罗兰,高档位亮起紫色星云与星尘粒子, 连官方那一行的数值文字也跟着变色(Off 档保持官方灰)。

怎么用

  1. 拖:在模型菜单里那条滑条上按住拖动 —— 跟手连续运动,拖到哪一档就即时变成哪一档

(滑过档位边界就把官方档位切过去,不用等松手)。

  1. 右键:在滑条上点右键打开设置面板
  2. 设置即时生效并记住;出问题时点一下「复制诊断」把逐帧记录导出。

设置项 · 可选 · 说明 动画效果 · 快速动画 / 简洁动画 / 完整动画 · 三种都不受系统「减少动态效果」影响(否则系统一开就退化成"瞬跳")。快速复刻 Codex 桌面版手感 —— 旋钮不跟手、停在档位格上,指针越过 1/3 档距才切下一格(后退要退回 2/3,带滞回),约 70~85ms 吸附到位且无回弹;简洁更干脆;完整最跟手、惯性更长 已到达档位的刻度点 · 亮白显示 / 与未到达同色 / 隐藏 · 控制轨道上那些定位小点的可见性 · · 复制诊断(逐帧记录,反馈问题时用)/ 恢复默认 / 关闭

装好之后长这样(真机截图)

收起态:档位就在输入框里那枚模型席按钮上,点开之前也按档位着色。

点开模型菜单后(左列浅色主题 / 右列深色主题,四档从上到下):

档位 · 浅色主题 · 深色主题 Max · · High · · Low · · Off · ·

对比度都算过(最高档的数值文字:白底 4.23:1、深色底 4.02:1)。 不用安装也能先玩:▶ 在线试玩 —— 或者下载仓库后双击本地 preview/panel.html。可拖动、切浅深色、切 4/2/6 档模型,动画三档(快速 / 简洁 / 完整)都能试。

⚠️ 直接点 raw.githubusercontent.com 的链接只会看到源码 ✗ —— 它以文本形式返回文件;要看效果请用上面的「在线试玩」或本地打开。

(另有脚本生成的实现示意图:preview/seat-color.png、preview/distribution.png)。

它不新增入口:直接改造官方模型菜单里的「推理等级」那一行 —— 那一行被加高上下内距、允许折行,滑条作为第二行铺满整行宽度;拖到最高档时整条轨道亮起紫色能量层。

点开官方模型菜单后:
┌────────────────────────────────────┐
│ 模型             DeepSeek-V41-Flash › │   ← 官方原样
├────────────────────────────────────┤
│ 推理等级                       Max › │   ← 官方原样(label / value / chevron 一个没动)
│ ●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    │   ← 插件注入的滑条(这一行因此被加高)
└────────────────────────────────────┘
输入框工具行:**不加任何东西**(没有胶囊、没有浮层)

拖到最高档:轨道变为紫色星云(流向渐变 + 扫光 + 22 颗错峰星尘粒子),那一行同时描一圈紫边。

30 秒上手:下载/克隆本仓库 → 双击 install.cmd(或按下面的「安装」一节)→ 完全退出并重开 DSH Desktop。

安装

首选:npm 一条命令(已发布到 registry)

# 非 desktop profile
dsh plugin --profile <你的 profile> add dsh-codex-effort-slider
DSH Desktop 用户:桌面版的 profile 由 Electron 独占管理,命令行装不了它 —— 请走
设置 → 插件 → 添加插件,在输入框里填 `dsh-codex-effort-slider`(包名,现在直接走 npm),
或填 github:Microqian2th/dsh-codex-effort-slider,点安装,完全退出并重开 DSH Desktop。
装出来的就是上面那组真机截图的样子。

不想用 npm 也没问题 —— 下面两条路一样有效。

直接下载打包好的 zip:Releases → 最新版。

只走 DSH Desktop 自己的插件面板——命令行装不了 desktop profile:

dsh plugin --profile desktop add link:"F:\Work Space\DeepSeek Harness\dsh-codex-effort-slider"
# error: profile "desktop" is managed exclusively by the Electron application

(这不是配置问题:bin.js 里对 desktop 直接 program.error,只有 Electron 应用本人被允许管理这个保留 profile。)

两条路:

  1. 面板安装(推荐):设置 → 插件 → 添加插件 → 填本地目录路径 → 安装 → 重启 DSH Desktop。

面板会校验两件事,本插件都已满足:是有效的插件包、声明了组合包(dsh.bundle.patch)。

  1. 手工安装(当面板本身不可用时——例如 profileContext 没挂上,dsh-base 会把

plugin-manager 整行 disabled,设置侧栏里就看不到「插件」): 备份 profile 的 package.json → 加一条 link: 依赖 → dsh.profile.bundles 追加本包名 → 在 profiles//node_modules/ 下建一个指向本目录的 junction → 重启。

卸载用面板;手工装的用 cmd /c rmdir (不要用 Remove-Item -Recurse,
那可能顺着 junction 把插件目录里的文件删掉)。

想先看观感、不装也行:node preview/make-preview.mjs 生成 preview/panel.html, 用浏览器打开即可拖动、切浅深色、切 4/2/6 档模型(页面里连官方菜单外壳都复刻了, CSS 与拖动数学都是从真产物抽出来的)。

分享给别人

打包

npm run pack      # = powershell -NoProfile -ExecutionPolicy Bypass -File pack-dist.ps1

产出 dist/dsh-codex-effort-slider-.zip(约 350 KB)。本插件零运行时依赖、无构建步骤 —— 解开就能装,接收方不需要 pnpm install。若要让人从 GitHub / npm 装,把本目录的内容推到仓库根 (package.json 必须在仓库根,pnpm 才能把它当包解析)。

接收方怎么装(三种,按省事程度排序)

  1. 面板安装(推荐):DSH Desktop → 设置 → 插件 → 添加插件,填三者之一:
  • 本地目录路径(解开 zip 后那一层目录)
  • `github:/`(面板会先做一次 GitHub 连接检查,再交给 pnpm 拉取)
  • npm 包名 `dsh-codex-effort-slider`(已发布,走 registry;DSH 默认已配 npm 镜像作为回退)
  1. 命令行(只有非 desktop profile 能这么装):
dsh plugin --profile tui add link:"<插件的绝对路径>"
   dsh plugin --profile tui add github:<用户名>/<仓库>

desktop 是 Electron 保留 profile,命令行会被直接拒绝 (error: profile "desktop" is managed exclusively by the Electron application)。

  1. 脚本(desktop profile 且设置里没有「插件」面板时):
install.cmd                    # 装进 desktop
   install.cmd -Profile tui       # 装进别的 profile
   install.cmd -Uninstall         # 卸载

install-profile.ps1 做四件事:备份 profile 的 package.json → 加一条 link: 依赖 → 把包名追加进 dsh.profile.bundles → 在 profile 的 node_modules 下建链接 (Windows 用 junction,其它平台用符号链接),最后校验这三项都成立。 已用一个假 profile 完整跑过安装与卸载,并确认卸载只删链接、不会顺着链接删掉插件本体。

注意事项

  • link: 里是绝对路径,所以每台机器装完都必须指向自己的目录(面板/脚本会自动写对)。
  • 改过 lib/client.js 后必须完全退出并重开 DSH Desktop 才生效 —— 宿主在启动时把插件读进内存,

只关窗口不够。

  • 卸载:面板卸载,或 install.cmd -Uninstall;手工建过 junction 的用 cmd /c rmdir 。

不要用 Remove-Item -Recurse,它可能顺着链接把插件目录里的文件删掉。

  • 兼容性:DOM 锚点全部是官方语义属性(aria-haspopup / aria-expanded / aria-controls / role)

加两个官方 class;哈希前缀不依赖(收起态那段档位文字是按文字认的)。官方若改语义,插件 静默不生效(fail-open),不会把官方界面改坏。本插件不注册任何宿主钩子、不注入消息 (测试里有 ctx.on 监视断言守着这一点)。

  • 许可 MIT(见 LICENSE)。package.json 已去掉 "private",并发布在 npm 上:`dsh-codex-effort-slider`。

它怎么工作(两半)

半边 · 干什么 lib/index.js(宿主) · 空逻辑 + 一次客户端产物静态核对。存在的唯一理由是让本包成为 cordis 树上的一行,否则 dsh.client 的 bundle 不会被扫进启动图 lib/client.js(客户端) · 一个不可见锚点(注册进 conversation.input.right,用来拿 sessionId 与 ctx)+ DOM 桥 + 滑条(react-dom portal 注入官方那一行)

DOM 桥依赖的官方锚点(全部是语义属性,不是哈希 class)

锚点 · 官方产物里的形状 席:button[aria-haspopup="menu"][aria-expanded="true"] · ` 菜单:席的 aria-controls → getElementById(…) · 菜单 id={…-menu},portal 到 body 目标行:菜单里 button[role="menuitem"] 的**第 2 个** · 根面板恰好两行(模型 / 推理等级);子面板用 menuitemradio,所以 menuitem 唯一标识根面板 归属判定:从自己的锚点向上找 [data-composer-card]` · composer 卡片带这个标记;打开的那颗席必须在自己的 composer 里

只改那一行:写 4 个内联样式(height:auto / flex-wrap:wrap / padding-block:10px)+ append 一个容器; 关菜单或插件卸载时逐个还原。不碰官方 class、不改官方文字与 chevron。

fail-open:任何一步认不出(没有 aria-controls、不是根面板、不是自己的 composer、 目录里没有档位、会话作用域没就绪)就什么都不做 —— 官方菜单保持原样,绝不会因为本插件点不开。

官方菜单是"测量后固定定位"的,插件加高那一行后会派发一次 resize, 官方自己的 place() 会重新读 offsetHeight 并重新夹取位置。

数据路径(只用官方公开面)

用途 · 接口 读档位 · directoryFor(sessionId).store.getSnapshot() → groups[].models[].reasoning.efforts 写档位 · directory.select({ provider, model, reasoningEffort })(与官方菜单同一写入口) 订阅 · store.subscribe() + React.useSyncExternalStore

色彩与粒子(由位置连续驱动,与档位数无关)

拖到哪,颜色与粒子就跟到哪。三个纯函数(都有断言):

位置 pct · 颜色 fillColorFor · 能量 energyFor · 粒子数 particleCountFor · 速率 speedFor 0(第一档) · 蓝 #4d93f8 · 0 · 0 · 0.35× 1/3(第二档) · 蓝(第一档到第二档恒为蓝) · 0 · 0 · 0.35× 2/3(high) · 紫 #9333ea · 0.5 · 11 / 22 · 1×(就是"现在这个速度刚刚好") 1(max) · 深紫 #4c1d95 · 1 · 22 / 22 · 2×

  • 颜色:填充层是 linear-gradient(90deg, 蓝, 当前位置的颜色) —— 左端恒为蓝、右端是当前位置的颜色,

所以 high 档自然呈现"左蓝右紫",越往右右端越深(深紫 #4c1d95)。

  • 能量层(紫色星云 + 扫光)强度 = energyFor,它在第二档以前是 0 —— 所以左半段是干净的蓝,

往右才逐渐"通电";官方那一行的紫边透明度也跟着能量走(0.16 + 0.34 × energy)。

  • 能量条只覆盖已填充那一段:能量层宽度与填充层完全相同(都到旋钮圆心),

所以档位右边没达到的部分不会出现能量条,只剩轨道底色。

  • Off 档在"两个界面"里都保持官方灰(isOffLevel + valueColorFor 返回空串):

Off 档时既不给菜单里那一行的数值文字上色,也不给收起态席按钮上的档位文字上色 —— 空串 = 不写内联色 = 官方原本的颜色。档位是不是"关"按 id 和 name 都认(off/none/关闭/无, 大小写与空格不敏感;DeepSeek 的真实档位表见 dsh-llm-deepseek/lib/index.js 的 REASONING_EFFORTS)。 Off 档本身也没有能量层(energy 0 → 纯蓝、无星云、无星尘)。