dsh-steer-button

DSH PLUGINUI 与外观

仓库 lyuwen/dsh-steer-button

UI 与外观 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

为 DeepSeek Harness 会话提供队列、转向与积压三种发送模式,并在输入框上方显示待处理消息队列条,让用户在 Agent 运行中更灵活地交互。

一句话选型结论

按资料字段整理

dsh-steer-button 是UI 与外观类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,列出 4 项功能,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类UI 与外观 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-09-11 创建于 2026-08-26
README 11.9 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:lyuwen/dsh-steer-button#v0.3.3
  1. 1
    确认版本与运行环境

    兼容的 DSH 版本为 0.2.0-rc.2 等 8 个;版本不匹配时安装会报错。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本0.2.0-rc.2 等 8 个版本版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

4 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-steer-button:DeepSeek Harness 运行中干预 agent 的 DSH 插件

  • 三种发送模式
  • 队列条显示
  • 消息编辑删除
  • 快捷键支持

上游标签

dsh-plugin

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-10-08): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
L5 · 运行已测 ✓ 通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 方式:Web 启动
  • L5.3_HTTP_SERVED HTTP 服务响应 方式:HTTP 请求
  • L5.4_PLUGIN_INVENTORY_ACTIVE 插件清单中已激活 方式:插件清单查询

风险详情

  • 审查结论 通过
  • 结论说明 vet 静态分析未发现可疑行为,判定为干净(clean)。
  • 风险计数 严重 0 / 高 0 / 中 0
  • 风险详情 未发现严重或警告级问题。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。
  • 标注了兼容的 DSH 版本(0.2.0-rc.2 等 8 个),按版本装不容易报错。
  • 列出了 4 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在UI 与外观场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-steer-button当前 L5 · 运行验证通过 低风险 0 0.2.0-rc.2 等 8 个 有
nuwa-skill 未做沙盒验证 未标注 3.8 万 未标注 有
awesome-dsh-plugin L4 · 沙盒安装通过 低风险 1.8 万 0.1.1-rc.2 有
deepseek-balance-whale-widget L4 · 沙盒安装通过 低风险 4,492 0.1.7-rc.2 等 2 个 有
dsh-better-sidebar L4 · 沙盒安装通过 低风险 4,112 0.1.7-rc.2 等 10 个 有
dsh-deep-whale L4 · 沙盒安装通过 低风险 2,470 未标注 有

仓库档案

UI 与外观
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方lyuwen仓库 dsh-steer-button · 默认分支 main
分类UI 与外观skin
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言JavaScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-08-26 · 2026-09-11最后推送 2026-09-11
本站收录2026-08-27首次进入本站目录的时间

README 全文

11.9 KB
作者原文,中文版优先;只做安全转义,不改内容

queue-steer-button

Queue / Steer / Backlog composer controls for DeepSeek Harness. While the
agent is running in a session, the plugin overrides the composer's input
behaviors with three delivery modes and shows every pending message in a queue
strip above the text box.

Trigger Host RPC Delivery
Queue Enter session.prompt([…], "steer") Next agent step: the current step finishes and commits its observation, then the message is sent together with that observation in the next LLM request. Nothing is interrupted.
Steer ⌘+Return / Ctrl+Enter session.cancel() then session.prompt([…], "steer") The current step's LLM stream aborts; the partial output is preserved as an interrupted assistant message; the new request continues with your message.
Backlog ⌘+⇧+Return / Ctrl+Shift+Enter session.prompt([…], "queue") DSH's native queue: waits for the whole turn to finish, then runs as its own turn.
Stop Esc withdraw, session.cancel(), then session.prompt([…], "steer") Stops the running agent, and delivers whatever was still pending in the queue as a steering prompt so the turn continues with it.

The controls replace the shipped behavior while the agent is busy:

  • plain Enter is the plugin's Queue (next-step delivery) instead of the
    native busy-enter queue (whole-turn backlog) — the delivered text stays
    editable in the queue strip until the next step boundary;
  • Shift+Enter keeps its native newline role in the text box;
  • ⌘/Ctrl+⇧+Enter sends to the backlog; ⌘/Ctrl+Enter is the plugin's
    Steer instead of the native accelerated send. With an empty draft
    ⌘/Ctrl+Enter falls through to the native gesture that steers all pending
    backlog rows into the running turn.

Buttons are hidden while the agent is idle, in a blank/new chat, or in a
removed session; slash-command drafts (/…) and an open trigger menu keep
native adjudication.

Escape

Esc is the composer's Stop button, with the queue folded in. It acts on the
Session the workspace is showing — a background Session's running turn is
never touched — and only while that Session is running. The composer draft is
never submitted by Esc.

Pending queue What Esc does
nothing session.cancel() — the same call the Stop button makes
one or more rows each row is withdrawn (updateQueue(id, {kind: "remove"})), the current step is cancelled, and the withdrawn text is re-submitted as a steering prompt

Why withdrawing and re-submitting, not promoting in place. session.cancel()
reaches agent.cancel(…, { keepInbox: true }): the inbox survives the stop, but
the aborted turn never reaches the step boundary that would have delivered a
pending next step row, so promoting updateQueue(id, {kind: "steer"}) and
cancelling leaves that row parked with nothing to wake it — it stops the agent
and silently strands the message. Re-submitting the text is the wake, and it
is the same delivery the Steer button gives the draft.

The withdraw is careful: a row is re-submitted only if its removal succeeded, so
a row the agent already claimed stays with the agent and is never duplicated. A
row with no text projection (an attachment-only row) is left parked rather than
dropped, because prompt cannot carry its durable attachment references back.

Esc is deliberately polite about it: an open trigger menu, popup, inline
editor, or dialog owns the key first, and a form field outside the composer
keeps it for itself. That is why the handler runs in the bubble phase and
checks defaultPrevented rather than intercepting like the Enter chords.

The queue strip

Every still-pending message renders in a strip above the composer card:

  • next step rows are Queue-mode messages waiting for the current step's
    finish — they enter the context with that step's observation;
  • turn end rows are Backlog messages waiting for the whole turn — their
    Send button delivers them with the next agent step instead.

Each row offers icon buttons (with tooltips):

  • Edit (pencil) — moves the text back into the text box (removing it from
    the queue) for free-form editing; press Enter to re-queue the edited text.
  • Remove (trash) — drops the message without sending it.
  • Send (arrow, backlog rows only) — deliver now with the next agent step.

With the cursor in the text box, pressing ↑ (Up) pulls the most recently
queued message back into the composer for editing. Editing always happens in
the text box — never in the narrow dock row.

How it works

The plugin drives the existing Host session API directly from the browser
— the host half stays a pure UI mount with no custom RPC:

  • Queue → session.prompt([…], "steer") — host mode "steer" is
    agent.steer (next-step delivery).
  • Steer → session.cancel() then session.prompt([…], "steer") — cancel
    aborts the current step (agent.cancel(…, { keepInbox: true })), and the
    same delivery then continues with the new request.
  • Backlog → session.prompt([…], "queue") — host mode "queue" is
    agent.followup (next-turn inbox): exactly DSH's native queue mode.

The queue strip replaces the shipped queue dock and pending-steering tail
bubbles (hidden via CSS) with one surface that shows both placements, and the
queue-mutation verbs (updateQueue edit/remove/steer) stay native.

(Note: the shipped Settings "queue" busy-enter preference now corresponds to
the plugin's Backlog, not its Queue. The plugin's Queue is exactly the
shipped "steer" preference — the same non-interrupting agent.steer
next-step delivery — so users of either preference keep consistent behavior;
only the dock display and the new editing model are added.)

Package layout

  • package.json — declares dsh.bundle.patch (self-installing bundle) and
    dsh.client (browser half, platform: "web"); exports map with types.
  • cordis.patch.yml — the bundle patch that inserts the plugin row.
  • lib/index.js — host half. Pure UI plugin; the empty apply exists so the
    row mounts in the host Loader.
  • lib/client.js — browser half (window.__ModuleLoader__.load bundle).
    Registers the three composer actions in conversation.input.right and the
    queue strip in conversation.input.dock, wires the running-session chords
    and the ↑ withdraw gesture, and calls the session face from the sessions
    client service.
  • lib/types/*.d.ts — hand-written declarations.
  • test/contract.test.mjs — contract tests against the installed DSH
    (npm test); tools/dsh-matrix.mjs runs the same checks across versions.
  • LICENSE — MIT.

Compatibility

Verified against DSH 0.1.5-rc.1 (current latest) and 0.1.5-rc.2
(next)
— the full contract suite passes against both. The browser half is
composed at DSH boot from the profile's installed copy, so after installing
or updating this package the profile must be restarted — a page reload is not
enough.

The 0.1.1-rc.1 line is out of range: it predates
@deepseek-ai/dsh-api-session-controller, the package that now declares the
session face and queue-row contracts this plugin is written against, so the
matrix cannot evaluate it. The 0.1.1-rc.1 peer entries this repo used to
declare are gone for the same reason.

The plugin consumes only public client contracts, and every one of them is
asserted against the installed DSH so a future update fails the tests loudly
instead of silently dropping the controls (which is exactly what DSH 0.1.5
did):

Contract Why it matters
conversation.input.right, conversation.input.dock where the controls and the queue strip render
useSession / useInput standard slot props Session lifecycle and draft state; 0.1.5 dropped the InputZone owner from the actions slot
InputState.draft / .phase / .attachmentIds what gates the three actions; imageIds was renamed in 0.1.5 and is still read as a fallback
[data-composer-card], [data-composer-input] the composer card and its editor host; the editor was a textarea before 0.1.5
SessionFace.prompt / .cancel / .updateQueue the three delivery modes, the Esc stop, and the strip row actions
QueueAction kinds steer / remove Esc promoting backlog rows, and the strip row actions
SessionListState.current Esc acting only on the Session the workspace shows
QueuedMessage.placement / .preview / .text the strip rows (queued = turn end, steering = next step)

DSH client packages are supplied by the host at runtime, so none of them is
declared as a peer dependency: the profile never installs them, and npm's
prerelease rules cannot express a 0.1.x prerelease range anyway.

Tests

npm test                                         # contract tests against the installed DSH
DSH_ROOT=/path/to/@deepseek-ai/dsh npm test      # …against an explicit DSH
node tools/dsh-matrix.mjs 0.1.5-rc.2 0.1.1-rc.1  # the same checks across versions

test/contract.test.mjs reads the DSH's own type declarations and composed
client bundle — no browser, no network. tools/dsh-matrix.mjs installs each
published version into a throwaway directory first, so it needs the network and
belongs to an on-demand or nightly run; a version that fails there is outside
the range claimed above, so either the claim or the code has to change.

Install

This package is a bundle: the repo root is the package, it ships its own
cordis.patch.yml, and declares dsh.bundle.patch — so a single command
installs the code and mounts the plugin row, with no manual composition
edit.

From the git URL (canonical):

dsh plugin --profile web add git+https://github.com/lyuwen/dsh-steer-button

Or from a local checkout (same behavior):

dsh plugin --profile web add /home/lfu/git-projects/dsh-steer

(Without the CLI: cd ~/.dsh/profiles/web && pnpm add /
npm install — the package manager adds the dependency, then the
same dsh plugin reconcile logic promotes the dsh.bundle-declaring package
into the profile's bundle layer stack.)

Then restart the profile: dsh.client package metadata is cached per name, so
plugin-set changes take effect only on restart.

> "install plugin https://github.com/lyuwen/dsh-steer-button" — telling a DSH
> agent this installs the plugin exactly as the command above does.

Current deployment state

Installed into the local web profile from the git URL — dependency and
bundle layer in ~/.dsh/profiles/web/package.json, package at
~/.dsh/profiles/web/node_modules/queue-steer-button/. To move the profile to
a new revision, re-run the install command (it re-resolves the dependency and
re-pins pnpm-lock.yaml), then restart the profile:

dsh plugin --profile web add git+https://github.com/lyuwen/dsh-steer-button

Editing lib/* in this checkout does not affect the running profile until
that install re-syncs the copy under ~/.dsh/profiles/web/node_modules/.

Verify

Start a slow task. While it runs:

  • Type a message and press Enter — it appears in the queue strip as a
    next step row; when the current step finishes it joins the next request
    with that step's observation.
  • Press ↑ with the cursor in the text box — the queued text returns to
    the box; edit it and press Enter again to re-queue.
  • Press ⌘+Return / Ctrl+Enter — the current step stops, its partial
    output stays visible, and the agent answers your message.
  • Press ⌘+⇧+Return / Ctrl+Shift+Enter — the message waits as a turn end
    row; its Send button delivers it with the next agent step.
  • Press Esc — the agent stops. Queue one or more messages first and Esc
    promotes them to next step rows and stops in the same gesture, so the
    turn continues with them; press it while another session is on screen and
    nothing happens to this one.

常见问题

8 问
答案由本站依据条目字段整理,不引用上游原文
dsh-steer-button 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:lyuwen/dsh-steer-button#v0.3.3` 即可。

dsh-steer-button 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-steer-button 安全吗?

低风险。vet 静态分析未发现可疑行为,判定为干净(clean)。

dsh-steer-button 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-steer-button 支持哪些 DSH 版本?

上游记录的兼容版本包括 0.2.0-rc.2、0.2.0-rc.1、0.1.7-rc.2、0.1.6-alpha.2、0.1.6-alpha.1、0.1.3-alpha.2、0.1.3-alpha.1、0.1.2-rc.1。

dsh-steer-button 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-steer-button 有哪些功能?

三种发送模式、队列条显示、消息编辑删除、快捷键支持。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

UI 与外观
按星标排序,可作替代方案

nuwa-skill

nuwa-skill

女娲 DSH plugin 只需输入一个名字,就自动调研、提炼并验证任何人的心智模型、决策启发式与表达 DNA,生成可直接调用的思维视角 S

未标注验证等级 3.8 万 星

awesome-dsh-plugin

awesome-dsh-plugin

A curated list of plugins for DeepSeek Harness (dsh) · DeepSeek Harnes

L4 · 沙盒安装通过 1.8 万 星

deepseek-balance-whale-widget

DeepSeek-Balance-Whale-Widget

DSH 界面右下角的常驻小鲸鱼余额挂件,实时显示 DeepSeek 账户余额、今日已用与每轮对话消耗,支持拖拽吸附、Q 弹动画与音效,开箱即

L4 · 沙盒安装通过 4,492 星

dsh-better-sidebar

DSH-better-sidebar

面向 DeepSeek Harness 的服务化侧边栏工作台插件,把文件编辑、终端、Git 变更、子代理任务与侧边对话整合进右侧栏与底部面板

L4 · 沙盒安装通过 4,112 星

dsh-deep-whale

dsh-deep-whale

DSH Web 鲸鱼娘皮肤系列(深海女仆工坊 maid-atelier)。

L4 · 沙盒安装通过 2,470 星

deepseek-design

deepseek-design

可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。

L4 · 沙盒安装通过 1,438 星

lyuwen 的其它插件

5 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-10-08。