packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
为 DSH 设置面板增加「快捷键」页面:六个可改键命令(权限模式切换、思考强度调节、状态页、任务清单),并展示翻页键跳转与可选的输入框 Enter 重映射。
A Keyboard Shortcuts settings page for DeepSeek Harness (DSH), with permission-mode cycling, reasoning-effort stepping, prompt navigation, a status-page shortcut, a task-list toggle, and an optional composer key remap.
dsh-keyboard-shortcut adds one page to DSH's Settings panel and eight shortcuts
to the application. The page lists every binding in the running application,
lets you change the ones this plugin owns, and carries a switch for remapping the
composer's Enter keys.
Every shortcut this plugin adds is an ordinary DSH command. It appears in the shortcut reference, it can be rebound, and it respects the same conflict rules as the built-in commands.
| Requirement | Minimum |
|---|---|
| DeepSeek Harness | 0.2.0-rc.2 |
| Node.js (for building from source) | 22.12.0 |
This plugin is a client plugin: everything it does happens in the browser
half. Its Host half is an empty apply that exists only so DSH serves the
browser bundle.
Install into a profile with the DSH plugin command:
dsh plugin --profile <profile> add dsh-keyboard-shortcut
Then restart the profile, or toggle the bundle off and on from Settings → Plugins if the profile reloads live.
Settings → Keyboard shortcuts sits directly after General. It has four sections:
| Shortcut | Action | Platforms |
|---|---|---|
| Ctrl+Q | Cycle to the next permission mode | Desktop Windows, macOS |
| Ctrl+1 | Lower the reasoning effort one level | Desktop |
| Ctrl+2 | Raise the reasoning effort one level | Desktop |
| Alt+A | Open the DeepSeek status page in the sidebar browser | Desktop |
| Ctrl+L | Expand or collapse the task list | Desktop |
| PgUp | Go to the previous input | All (fixed) |
| PgDn | Go to the next input | All (fixed) |
| Ctrl+/ | Open this plugin's settings page | All |
Ctrl/Cmd+/ is the built-in shortcut reference's default binding. This plugin claims it through the shortcut preference layer, so the reference dialog moves off that key and stays reachable from Settings → General → Edit shortcuts. Turning the switch off restores the original binding.
When enabled, the composer's three Enter gestures rotate:
| Stroke | Default | With input optimisation |
|---|---|---|
| Enter | Send | Insert a line break |
| Ctrl+Enter | Complementary Queue/Steer | Send |
| Shift+Enter | Insert a line break | Complementary Queue/Steer |
The switch is off by default.
The plugin reads two switches and one binding table from browser storage. Both switches are off-by-default except the shortcut takeover, and all of it is per device.
| Key | Default | Meaning |
|---|---|---|
optimizeComposerKeys | false | Rotate the composer's Enter gestures |
takeOverShortcutKey | true | Give Ctrl+/ to this plugin |
bindings | {} | Combinations this plugin delivers itself (see below) |
Preferences live in localStorage under dsh.keyboard-shortcut.v1, beside the
key bindings DSH itself stores per device. They are not in the Host settings
document, so one machine's choice cannot rewrite another's.
Changing a binding through the settings page writes to DSH's own shortcut store —
localStorage on Web, userData/keybindings.json under Electron — whenever the
registry accepts the combination, so the binding also appears in DSH's shortcut
reference. In the DSH Desktop shell, which the shortcut service classifies as a
browser, a few combinations cannot be stored there; those are kept in
bindings and delivered by the plugin instead, and the settings page says so on
the row.
The plugin requests no elevated permissions. It reads the session projections
DSH already publishes to the browser and runs the same /permission command the
built-in picker runs. It performs no filesystem access and no network requests.
html[data-platform] marker — that marker would make the
service demand a native keyboard bridge the shell does not provide, and the
service throws without one — so desktop:* defaults never resolve and the
registry refuses to store the combinations above. The plugin detects the
window itself and delivers them through observeFixedInput, the same raw-input
path the page keys use. A registry binding always wins, so one press never runs
an action twice, and a combination a desktop window also reserves
(Ctrl+C, Ctrl+V, …) is never taken
over. See docs/shortcuts.md.observeFixedInput
rather than registerFixed, because DSH's shortcut registry validates every
declared code against a closed whitelist — Key*, Digit*, F1–F24, and a
fixed set of named keys that does not include the page keys.
registerFixed normalizes its bindings up front and throws
Unsupported shortcut code: PageUp, so a registration could never succeed.
The keyboard layer forwards every keydown to observeFixedInput regardless of
registration, so the keys work; they just have no catalog row, and the settings
page lists them from a local table as non-rebindable rows.dsh-client-ui-conversation; the option rewrites an event's
modifier flags rather than reimplementing the send logic. See
docs/design.md for the reasoning and the failure mode.npm install
npm run build # writes lib/index.js and lib/client.js
npm test # build check + unit tests
npm run watch # rebuild the client half on change
See CONTRIBUTING.md and docs/development.md.