Bundle
dsh-in-convo-mode-change
Switch the agent preset (conversation mode: Standard / Code / Minimal / Creator) of a session mid-conversation, straight from the session header.
- Source
- jiangr100
- stars
- 1 stars
- License
- MIT
- Updated
- Updated 14 days ago
Readme
# dsh-in-convo-mode-change
Switch the **agent preset** of a conversation mid-session in the DeepSeek
Harness web UI. The presets are the "conversation modes" shipped with the
harness — **Standard mode**, **Code mode (PTC)**, **Minimal mode**, and
**Creator mode**, plus any custom presets you have authored.
By default the session header's preset icon is a read-only label: a session's
composition is fixed when it starts, and the built-in picker only exists on
the new-session hero screen. This plugin turns the header icon into a real
mode switcher that works on a conversation that has already started.
## How it works
- **Client half** (`lib/client.js`) replaces the built-in `agent-preset` cell
in `conversation.session.header.actions` with a menu button. Picking a mode
asks for confirmation, then POSTs `{ sessionId, agentPreset }` to the host
route.
- **Host half** (`lib/index.js`) registers the `POST /change-convo-mode/switch`
route on the web server. It uses the host's own
`agentPresets.recompose()` — the same machinery the built-in blank-session
picker uses — without the "no turn has ever run" restriction, and records
the switch in the session log as an `agent-preset/selected` event so the
transcript stays honest.
- Picking is disabled while the session is running a turn; the host refuses
anyway (defense in depth), because re-parenting the agent's scope chain
mid-call could strand an in-flight tool invocation.
## Caveats
Switching modes mid-conversation is deliberately *not* offered by the host,
and this plugin bypasses that gate on purpose:
- The switch applies from the **next turn**. The current transcript is
untouched, but tool calls made under the previous mode may **render
differently** in the chat afterwards, because the UI resolves tool views
through the session's current preset.
- Don't switch while a turn is running — the menu is disabled during a run.
## Install
From a local checkout:
```sh
dsh plugin --profile web add /path/to/dsh-in-convo-mode-change
```
Or straight from GitHub (the `dsh.bundle.patch` manifest field makes the
dependency join the profile's plugin layers automatically):
```sh
dsh plugin --profile web add github:jiangr100/dsh-in-convo-mode-change
```
Then **restart the web server** (stop the `dsh web` process and run `dsh web`
again) so the loader picks up the new plugin row and the client bundle.
After restart, the header of any conversation shows the mode switcher where
the read-only preset label used to be.
## Uninstall
```sh
dsh plugin --profile web remove dsh-in-convo-mode-change
```
and restart `dsh web`. Sessions that already switched modes keep running on
the preset they switched to.
## Development notes
- The client bundle is a hand-written module-loader bundle (no build step),
following the same pattern as `dsh-rewind`.
- The host row injects `webServer`, `agentPresets`, and `agents`; it imports
error classes from `@deepseek-ai/dsh-agent-presets`, resolved by the
harness loader at mount time.
- The client replaces the built-in label by registering the SAME id
(`agent-preset`) in `conversation.session.header.actions` at a **lower
`priority`** (the built-in sits at the default 0). The slots registry keys
list cells by `(id, priority)`: a duplicate id at the same priority throws
and fails the whole plugin entry at load; the lowest priority wins the
cell. `test/slots.test.mjs` drives the real `SlotCore` to lock this in.
Do not remove the `priority: -10` option.
Install
dsh plugin --profile web add github:jiangr100/dsh-in-convo-mode-change
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-in-convo-mode-change from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.