# dsh-reasoning-ruler [简体中文](README.md) | **English** [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![npm version](https://img.shields.io/npm/v/dsh-reasoning-ruler.svg)](https://www.npmjs.com/package/dsh-reasoning-ruler) A DeepSeek Harness (DSH) web plugin that moves the reasoning-effort picker out of the model popup and into the composer as a **minimal hairline ruler** — the selected level is a sliding vertical marker, its name shown left of the line. Effort is **remembered per model** and switching is **optimistic** (UI updates instantly, the host round-trip settles asynchronously). Also streamlines the model picker: opens directly on the full model list, no wheel, no "Refreshing model list" flash, closes on pick. > Not affiliated with DeepSeek. > ⚠️ **Experimental**: some polish layers rely on DSH Web DOM details (hashed class suffixes, label text matching) and may break on DSH upgrades; the core picker uses official slot / ModelDirectory APIs and is unaffected. File an issue if something regresses. ## Preview
minimal ruler next to a model-only seat picker opens directly on the full model list
## Features - **Minimal hairline ruler**: one 2px line, low→high left to right; selected level is a sliding marker with hover ghost preview and tooltip - **Per-model effort memory**: each model remembers your last pick (localStorage) and restores it on switch - **Optimistic switching**: effort and model picks paint instantly; the host RPC settles later, with rollback on failure - **Model picker polish**: opens directly on the full model list (skips the root pane), list fully expanded (no wheel), "Refreshing model list" flash hidden, closes on pick - **Seat dedup**: the model seat shows the model name only; the native "Effort" row in the popup is hidden ## Install ```bash dsh plugin --profile web add dsh-reasoning-ruler ``` Wait for hot reload, refresh the browser. No DSH restart needed. Or hand it to your AI assistant with the prompt in `INSTALL.md`. ## How it works The host half is a no-op; the client mounts a Ruler component into the official `conversation.input.right` slot and shares the native ModelSelect's `modelDirectories` SnapshotStore (two-way sync). Polish layers run in pre-paint MutationObserver microtasks for zero-flash DOM handling. ## License MIT