Bundle
dsh-better-model-picker
A composable model picker for the DeepSeek Harness Web composer: filters the model list by name or id.
- Source
- taot
- License
- MIT
- Updated
- Updated 8 days ago
Readme
# dsh-better-model-picker
An installable **bundle** for the DeepSeek Harness (DSH) Web GUI that replaces
the composer's model selector with an upgraded version. It shares the session's
model directory, so models picked here stay in sync with the `/model` popup.
## Features
- **Filter** — a text box that narrows the model list as you type, using
space-separated terms.
- **Star-pin** — an ☆/★ toggle on each model. Starred models stay pinned to the
top under a "Starred" section with their provider headings, and persist
across refresh and restart.
## Install
```sh
pnpm install && pnpm run build # produces lib/index.js + lib/client.js
dsh plugin --profile web add /path/to/dsh-better-model-picker
```
Then restart Deepseek Harness. `dsh plugin add` does both halves of the job because
this package declares `dsh.bundle.patch`: pnpm links it into the profile, and
the CLI appends it to that profile's `dsh.profile.bundles` layer stack. It is
the bundle's own `cordis.patch.yml` that inserts the plugin row.
Adding or removing the plugin only takes effect after restarting DeepSeek
Harness. The bundle layer is read at boot, so any change to the profile's
plugin set requires the harness process to be restarted before the new
configuration is reflected in the Web GUI.
Verify it landed without booting:
```sh
dsh --profile web --dump-config | grep -A2 better-model-picker
```
### Uninstall
```sh
dsh plugin --profile web remove dsh-better-model-picker
```
As with installation, removal only takes effect after restarting DeepSeek
Harness.
### Publish
`prepare` is intentionally omitted; run `pnpm pack` after `pnpm run build` to
ship prebuilt artifacts, or publish to a registry with `lib/` built. Consumers
then need no build step:
```sh
dsh plugin --profile web add dsh-better-model-picker # registry
dsh plugin --profile web add ./dsh-better-model-picker-0.1.0.tgz # tarball
```
## How it works
- A **bundle** ships a configuration layer (`dsh.bundle.patch` →
`cordis.patch.yml`). A profile listing this package in `dsh.profile.bundles`
applies that layer.
- One row serves as both halves. The loader mounts `main` (`lib/index.js`) as
the host half (a no-op: selection rides the shipped session RPCs). The
client-modules node half scans loader entries for packages declaring
`dsh.client` and serves this one's browser bundle at
`/plugins/dsh-better-model-picker/client.js`.
- The client half registers as the occupant of the `conversation.input.model`
slot at `priority: -1`, shadowing the shipped `ui-model-selection` entry
**without disabling it**. The shipped plugin keeps owning the `/model` popup
and the `model` locale namespace, and both surfaces share one directory
service (`ctx.modelDirectories`).
No web-shell rebuild is needed: plugin bundles are served per package from
`lib/client.js` and reach the page through `window.__DSH_BOOT__` at boot.
## Build
```sh
pnpm run build # tsdown -> lib/index.js (ESM) + lib/client.js (CJS browser)
pnpm run typecheck # optional; see tsconfig.json paths (needs a harness checkout)
```
The browser artifact is a CJS body wrapped in the
`window.__ModuleLoader__.load({ id, factory })` closure the client module
system expects. `react` and the other shell-owned platform modules stay
external so the plugin shares the page's single React instance; everything else
is bundled. CSS Modules are inlined by lightningcss and inject a
`<style data-plugin>` tag at factory execution.
## Layout
```
dsh-better-model-picker/
├── package.json # dsh.bundle (layer) + dsh.client (browser roster)
├── cordis.patch.yml # the layer: inserts the plugin row
├── tsdown.config.ts # both build faces
├── tsconfig.json # opt-in typecheck only
└── src/
├── index.ts # host half (no-op)
└── client/
├── index.ts # plugin body + slot registration
├── slots.ts # ModelSelectInjected face
├── FilteredModelSelect.tsx # the component
├── FilteredModelSelect.module.css
└── css-modules.d.ts
```
Install
dsh plugin --profile web add github:taot/dsh-better-model-picker
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-better-model-picker from the hub
- 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.