Bundle
dsh-queue-reorder
Reorder queued messages inside the DeepSeek Harness Web GUI queue dock: grip-and-drag plus move buttons, without taking over the official dock.
- Source
- damlys99
- License
- MIT
- Updated
- Updated 3 days ago
Readme
# dsh-queue-reorder
[](https://www.npmjs.com/package/dsh-queue-reorder)
[](LICENSE)
[](https://github.com/topics/dsh-plugin)
Reorder the messages you queued while a DSH agent was busy — **inside the
official queue dock**, not in a panel beside it.

## What you get
- A **grip handle** on every queued row: drag a message where you want it.
- **↑ / ↓** per row, wearing the dock's own action-button class, for precision
instead of a drag. The last row's ↓ is disabled, because there is nothing
after it.
- The dock is **decorated, never replaced**. Previews, inline editing, steering,
removal, attachments and collapse stay exactly as the conversation plugin
ships them; uninstall and the dock is untouched.
## Install
```sh
dsh plugin --profile web add -w dsh-queue-reorder
# restart dsh web, then reload the page
```
Requires DSH `>=0.1.2-alpha.1 <0.2.0-0` (earlier client-plugin contracts have no
`conversation.input.dock` slot). From a checkout instead:
```sh
dsh plugin --profile web add -w link:/absolute/path/to/dsh-queue-reorder
```
Uninstall:
```sh
dsh plugin --profile web remove dsh-queue-reorder
```
## Design
Two small halves, no build step, no runtime dependencies:
- **Host** (`lib/index.js`) registers one same-origin route,
`POST /queue-reorder`, and performs a single concurrency-checked
`agent/inbox.splice('next-turn', …)` over the smallest span containing both
ends of the move.
- **Browser** (`lib/client.js`) is a hand-authored module-loader bundle. A hidden
`conversation.input.dock` entry (which renders `null`) reads the session
snapshot for the queued ids and their order — the dock's DOM carries no ids —
and a `MutationObserver` decorates the official rows. It re-reads each row's
position at click and drag time, because the dock reorders those very elements
in place.
## What it refuses, and why
| Refusal | Reason |
| --- | --- |
| `QUEUE_CHANGED` | Your view of the queue no longer matches the live queue; retry rather than scramble it. |
| `NON_USER_MESSAGE` | The move would discard and reinsert a row whose source the harness still tracks (a goal round prompt, for example), cancelling that work. |
| `SUBAGENT_UNSUPPORTED` | A subagent session's queue is owned by its parent session. |
| Steering rows | Only `next-turn` (`placement: "queued"`) rows move; `next-step` stays put. |
A refused move changes nothing: every guard runs before the splice.
## Caveats
- The decorator attaches to the official dock's markup (`[data-queue-dock]`, its
row list, the trailing action container). Those are implementation details of
`@deepseek-ai/dsh-client-ui-conversation`, not a published contract: if the dock
is restructured, the controls may stop appearing. It fails soft — the dock keeps
working, you just lose the grip until this plugin catches up.
- Verified on DSH 0.1.5-rc.1, in a browser and through `selftest.mjs`.
- The route answers on the loopback interface without the GUI's session cookie,
like other plugin HTTP routes. A cross-site browser request is still blocked:
the JSON content type forces a CORS preflight that the route answers with 405.
## Tests
```sh
node selftest.mjs
```
No network, no browser, no build. 32 assertions covering the move transaction,
every refusal, the request decoder, the HTTP surface, and the dock decoration
(injection idempotence, live index reads, drop marking, notice reporting).
## License
MIT
Install
dsh plugin --profile web add github:damlys99/dsh-queue-reorder
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-queue-reorder from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.