Skip to content
dsh.fish
Bundle

dsh-client-ui-effort-slider

Animated reasoning-level slider for DeepSeek Harness model selection.

Source
MEMZ-JZY
stars
2 stars
License
MIT
Updated
Updated 11 days ago

Readme

# DSH Claude Style Reasoning Slider

An animated reasoning-effort slider and model picker for **DeepSeek Harness (DSH)**.
It replaces the native model selector's `conversation.input.model` slot with a
compatible selector whose reasoning pane is a Claude-style animated slider.

> πŸ‡¨πŸ‡³ δΈ­ζ–‡η‰ˆθ―΄ζ˜Žθ―·θ§ [README.zh.md](README.zh.md)

## Preview

![DSH Effort Slider preview](assets/dsh-effort-slider-preview.png)

## Features

- **Drop-in model selector** β€” replaces only the `conversation.input.model` slot;
  the rest of the chat input stays untouched.
- **Canonical effort slider** β€” always shows `Off | Low | Medium | High | Extra | Max`
  positions, regardless of how the provider names its levels.
- **Tolerant name matching** β€” aliases such as `off`, `none`, `disabled`,
  `ultracode` β†’ `max`, `med` β†’ `medium`, `extreme` β†’ `extra`, and similar
  display names are mapped to canonical slider positions.
- **Unsupported levels stay visible** β€” a level the current model does not
  support is dimmed but remains clickable. Clicking it keeps the thumb on the
  chosen slot and applies the nearest supported level **below** it, with a toast
  explaining the downgrade.
- **Model switching preserves effort** β€” when you switch models, the current
  effort is kept when possible, or automatically downgraded to the nearest
  supported level below it (with a toast).
- **Default and adapter-specific strengths** β€” `Default` is offered as a pill
  below the slider and submits without `reasoningEffort` (the provider's own
  default applies). Other provider strengths that do not map to a canonical
  slider position are also shown as selectable pills.
- **Models without reasoning metadata stay manageable** β€” when DSH does not
  expose `reasoning`/`efforts` for the selected model (for example some
  OpenRouter or hand-declared custom entries), the Effort menu still appears:
  it shows a short β€œno effort levels” notice plus the safe `Default` pill,
  instead of hiding every thinking-strength control.
- **Liang Calibrator (ζ»‘εŠ¨ε˜η₯–器)** β€” optional, off by default. Binds the six
  canonical levels to stage names: `Off β†’ 小难撁`, `Low β†’ 牒撁`,
  `Medium β†’ 撁子`, `High β†’ 撁圣`, `Extra β†’ 撁η₯ž`, `Max β†’ 撁η₯–`. When enabled,
  a 31-frame portrait (`frame-00`…`frame-30`) appears above the slider and
  follows the thumb continuously while dragging, then snaps to the segment's
  first frame on release. Labels and the trigger show `Max 撁η₯–`-style suffixes.
  The setting persists in `localStorage`.
- **Big Fat Fish thumb** β€” optional, off by default. Replaces the slider thumb
  with an 8-frame running chibi fish sprite. The idle animation loops at
  `720ms`, speeds up to `420ms` while dragging, and freezes under
  `prefers-reduced-motion`. Toggle it in DSH **Settings β†’ General β†’ Big Fat Fish
  slider**; changes apply immediately and persist in `localStorage`.
- **High / Extra ripple field** β€” `High` and `Extra` now show a sparse blue /
  purple dot-matrix field with random flicker and radial water ripples around
  the thumb, as a lighter prelude to the `Max` pixel field.
- **Max / Ultracode treatment** β€” the model's `max`/`ultracode` level turns the
  slider into an animated purple pixel field, and the `Max` label becomes a
  flowing multi-color gradient text.
- **Localized and theme-aware** β€” ships with English and Simplified Chinese
  dictionaries and follows DSH light/dark design tokens.
- **Accessible** β€” keyboard-operable slider (arrows, Home/End, PageUp/PageDown),
  ARIA labels, focus management, and `prefers-reduced-motion` support.

## Install

Install the bundle from the Git repository:

```sh
dsh plugin --profile web add github:MEMZ-JZY/DSH-Claude-Style-Reasoning-Slider
dsh --profile web
```

Or use a local checkout:

```sh
dsh plugin --profile web add ./dsh-client-ui-effort-slider
```

Restart the web profile after installing or removing the bundle.

## Usage

1. Click the model/effort trigger chip in the conversation input.
2. In the popup menu, choose **Model** to switch models, or **Effort** to adjust
   the reasoning level of the current model.
3. In the effort pane:
   - Drag or click the slider to pick `Off`, `Low`, `Medium`, `High`, `Extra`,
     or `Max`.
   - If a position is unsupported, the thumb stays where you clicked and the
     nearest supported level below is applied; a toast tells you what happened.
   - Click **Default** to remove `reasoningEffort` and let the provider decide.
   - Click any extra pill to apply a provider-specific strength that does not
     map to a slider position.
   - If the model has no declared reasoning levels, the pane shows a notice
     and only the **Default** pill. For providers that do support effort but
     are configured without `reasoningEfforts` (common with custom OpenRouter
     routes), add the levels in DSH's `llm-pi-ai` settings to get the full
     slider back.
4. When switching models, the plugin preserves the current effort level where
   supported; otherwise it downgrades to the nearest supported level below or
   falls back to `Default`, always with a toast.
5. To enable the **Liang Calibrator**, click the `ζ»‘εŠ¨ε˜η₯–器` switch below the
   track. The portrait and stage-name suffixes turn on immediately; the state
   is remembered across sessions.
6. To enable the **Big Fat Fish thumb**, open DSH **Settings β†’ General** and turn
   on **Big Fat Fish slider**. The thumb changes immediately without a restart.

## UI effects

- **Trigger chip** β€” shows the current model and effort label, six rising
  signal bars that fill with the current level, and a chevron. At `Max` the
  effort label flows as a purple gradient. With the Liang Calibrator enabled it
  also shows stage suffixes such as `Max 撁η₯–`.
- **Two-level popup menu** β€” a compact menu with a model list (grouped by
  provider) and an effort pane; loading/error/retry states are included.
- **Glass track** β€” inner bevel shadows and a subtle fractal-noise layer break
  up flat-color banding.
- **Light field** β€” the track responds to the pointer like a light source: an
  interior light pool and a glass-edge highlight follow the cursor, brightening
  as the pointer approaches and fading with distance. The light is suppressed
  at `Max` so the pixel field stays clean.
- **Level labels** β€” faint tick labels; the current level is always shown,
  hovering near a slot highlights it, and others stay barely visible.
- **Liang portrait** β€” when the Liang Calibrator is enabled, a `224px` square
  portrait appears above the track. It uses 31 WebP frames (`frame-00`…
  `frame-30`) that change continuously while dragging and keep the original
  scanline + light-spot texture.
- **Liang toggle indicator** β€” the `ζ»‘εŠ¨ε˜η₯–器` switch below the track uses a
  dot indicator: a gray dot when off, a glowing purple dot when on.
- **High / Extra dot-matrix ripple** β€” `High` (blue) and `Extra` (purple) show a
  sparse particle field that expands from the thumb, flickers randomly, and
  animates bright/dark water ripples radiating outward.
- **Max pixel field** β€” at `Max` the track becomes an animated purple pixel
  field with a reveal sweep and flowing cell flicker; the `Max` label uses a
  flowing multi-color gradient.
- **Big Fat Fish thumb** β€” when enabled, the thumb becomes an 8-frame running
  chibi fish sprite. It loops at `720ms` when idle, `420ms` while dragging, and
  freezes under reduced motion. The left edge stays aligned and the right edge
  is clamped so the fish never overflows.
- **Motion safety** β€” effects use CSS transitions/animations or lightweight
  event handlers, and `prefers-reduced-motion` is respected.

## Development

Build the client bundle from source:

```sh
npm install
npm run build
```

`lib/client.js` is generated from `src/client.js` plus `src/ds-effort-slider.js`
by `scripts/build-client.mjs`.

Run the standalone component demo:

```sh
# open demo/index.html in a browser
```

The demo page exercises panel mode, inline mode, supported-level combinations,
theme switching, the Max pixel field, the Liang Calibrator, and the Big Fat Fish
thumb.

## Package contract

This is a DSH bundle, not a dynamic `cordis_define` snippet. The package uses:

- `dsh.bundle.patch` (`cordis.patch.yml`) for self-registration.
- `dsh.client.platform: web` for the browser half.
- `lib/client.js` as a prebuilt ModuleLoader artifact, generated from `src/`.
- `index.js` as the host half: it mounts an `/effort-slider-assets/` static
  route that serves `assets/liang-frames/*.webp` and
  `assets/chibi-runner-strip.png` to the browser half.

## Files

- `index.js` β€” host half; serves the Liang portrait frames and chibi sprite.
- `src/ds-effort-slider.js` β€” standalone Web Component (shadow DOM, no framework).
- `src/client.js` β€” React wrapper + forked model selector plugin logic.
- `scripts/build-client.mjs` β€” bundle generator.
- `demo/index.html` β€” standalone UI demo.
- `assets/` β€” `liang-frames/` (31 WebP frames) and `chibi-runner-strip.png`.

Install

dsh plugin --profile web add github:MEMZ-JZY/DSH-Claude-Style-Reasoning-Slider

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script β€” that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source