中文EN

dsh-queue-reorder

uinpmMIT

在官方队列 dock 内直接重排忙碌时排队的消息:每一行带拖拽手柄与上下移动按钮,移动在宿主端以一次带并发校验的 inbox splice 完成。只装饰官方 dock 而不替换它,因此预览、行内编辑、插话、删除与附件保持原样。队列已变化、该行不是用户消息(例如目标轮次提示)、或队列属于子代理会话时,移动会被拒绝。

下载量 / Downloads
703

安装

dsh plugin --profile web add dsh-queue-reorder

沙箱测试

这个插件还没测过。提交测试 →

README

dsh-queue-reorder

![npm](https://www.npmjs.com/package/dsh-queue-reorder)

![license](LICENSE)

![dsh-plugin](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

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:

dsh plugin --profile web add -w link:/absolute/path/to/dsh-queue-reorder

Uninstall:

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

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

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:2,最后更新 2026-09-14

链接

GitHub · Homepage · npm

同类插件