lzbaclz/dsh-selection-ask
ChatGPT 风格的选中即问,用于 DeepSeek Harness Web:在对话中选中文本,会出现一个浮动的「询问 DeepSeek」按钮 — 点击即可将选中内容引用到编辑器。
Project Overview项目介绍
dsh-selection-ask is a DeepSeek Harness web plugin that adds a ChatGPT-style selection helper to conversations. Selecting text in the transcript surfaces a floating "Ask DeepSeek" button beside it; clicking inserts the selection into the composer as a Markdown blockquote (> ) and focuses the input for an immediate follow-up. Use it when you need to quote and ask about a specific snippet without manual copy-paste. Caveat: selections outside the transcript (such as inside the composer) are ignored, and the button hides while a takeover composer like a question or approval prompt is active.
dsh-selection-ask 是 DeepSeek Harness 的 Web 端插件,为对话界面增加 ChatGPT 风格的选择询问手势:在对话正文中选中文字后,旁边浮现「询问 DeepSeek」按钮,点击即把选区以 Markdown 引用块(> )插入编辑器,光标置于末尾,直接输入追问即可。适用于需要快速引用上文、围绕特定片段继续提问的场景。注意:选区须位于会话正文(data-conversation-scroll 内),编辑器内的选中不触发;接管式编辑器(如提问卡)显示时按钮会自动隐藏。
请帮我了解并安装插件:【dsh-selection-ask】【https://github.com/lzbaclz/dsh-selection-ask】
Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。
Or use CLI install (for developers)或使用命令行安装(适合开发者)
CLI Install命令行安装
dsh plugin --profile web add github:lzbaclz/dsh-selection-ask
把 lzbaclz/dsh-selection-ask 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh-selection-ask

简体中文 · Installation · Usage · Development · Troubleshooting · License
Select it. Quote it. Ask DeepSeek.
DeepSeek Harness is a text-first terminal/agent workspace. But quoting a piece of context back into the chat should be one gesture, not a copy-paste chore. dsh-selection-ask gives the web GUI a ChatGPT-style selection helper: select text in a conversation and a floating 「询问 DeepSeek」 button appears beside it. Click it — the selection is quoted into the composer as a Markdown blockquote (> ), the composer is focused, and the caret is parked at the end. Just type your follow-up and send.
Why
- Zero friction quoting — the exact gesture you know from ChatGPT, in DeepSeek Harness.
- Official integration, no hacks — writes through the harness's
inputActions.setDraftinput-machine API, so undo history and draft persistence keep working. It never touches DSH internals or DOM state directly. - One command to install — the compiled
lib/is committed, so agithub:install fetches ready-to-load artifacts with no build step.
Features
- Button follows the selection — positioned at the selection's screen coordinates (
position: fixed), clamped to the viewport, hidden once the selection scrolls away. - Quotes conversation text only — selections must be inside the transcript (
[data-conversation-scroll]); selecting inside the composer itself does nothing (quoting the draft back into itself is nonsense). - Quote-aware append — every selected line gets a
>prefix; an empty draft is replaced, a non-empty draft gets the quote appended as its own paragraph (blank line in between). - Session-scoped — the button state resets on session switch, and the button hides while a takeover composer (question/approval) replaces the default one.
Requirements
- DeepSeek Harness with the
webprofile (dsh web), DSH packages of the0.1.0-rc.6era. - A browser page on the harness GUI (
http://127.0.0.1:3080by default). - Building from source needs Node
^22.19.0 || >=24and pnpm. Installing the prebuilt package does not (compiledlib/is committed).
Installation
1. Install the package
From GitHub (recommended)
dsh plugin --profile web add github:lzbaclz/dsh-selection-ask
Pin a release for reproducibility: dsh plugin --profile web add github:lzbaclz/dsh-selection-ask#v0.1.0
From a local clone
git clone https://github.com/lzbaclz/dsh-selection-ask.git
dsh plugin --profile web add link:/absolute/path/to/dsh-selection-ask
From npm (not published yet — dsh plugin --profile web add dsh-selection-ask will work once it is; see Roadmap)
2. Activate it
dsh plugin add already registers the package in your profile's dsh.profile.bundles list, and this package ships its own cordis.patch.yml, so the entry row is inserted automatically at boot. Choose one of the two activation paths — never both.
Path A — restart (zero YAML editing; recommended for new setups)
Restart dsh web (or just start it if it is not running). Done — no config files to edit.
# stop your dsh web process, then:
dsh web
Path B — hot activation on a running server (no restart)
Use raw pnpm (not dsh plugin, which would also register the bundle) so the bundles list is untouched, then patch the profile's patch layer, which DSH watches and applies live:
cd ~/.dsh/profiles/web
pnpm add github:lzbaclz/dsh-selection-ask
Now open ~/.dsh/profiles/web/cordis.patch.yml and replace the [] with the insert block — the file must stay a valid YAML list:
# BEFORE:
# Your patch layer for this dsh profile, applied after every bundle layer:
# a top-level YAML array of loader patch entries (id-targeted config
# overrides, disables, and insert lists; `!!js` expressions allowed).
[]
# AFTER:
# Your patch layer for this dsh profile, applied after every bundle layer:
# a top-level YAML array of loader patch entries (id-targeted config
# overrides, disables, and insert lists; `!!js` expressions allowed).
- insert:
- id: dsh-selection-ask
name: dsh-selection-ask
config: {}
Save the file and refresh the browser page — the plugin is loaded.
⚠️ Do not combine Path A and Path B (e.g.
dsh plugin add+ a manual patch row): the entry would be registered twice anddsh webfails to boot withduplicate loader entry id: dsh-selection-ask.⚠️ Do not append the YAML block after an existing
[]— that produces an invalid file anddsh webfails to boot withfailed to parse patches. Replace the[]as shown above.If your profile is not named
web, substitute your profile name; if you set a custom harness home, substitute your$DSH_HOMEfor~/.dsh.
Older profiles (created by an earlier dsh version) may lack the autoInstallPeers: false line in pnpm-workspace.yaml. Add it so pnpm never tries to auto-install pre-release peers:
packages:
- .
nodeLinker: hoisted
autoInstallPeers: false
3. Verify
Refresh the GUI page and select a sentence in the chat flow — the 「询问 DeepSeek」 button floats beside the selection. Click it: the text lands in the composer as a quote.
Usage
- Select text anywhere in the conversation transcript.
- Click the 「询问 DeepSeek」 button floating beside the selection.
- The selection is quoted into the composer (
> selected text), the composer is focused and the caret is at the end — type your follow-up question and send.
Uninstall
dsh plugin --profile web remove dsh-selection-ask
If you used Path B, also remove the insert block from cordis.patch.yml (put the [] back), then refresh / restart.
Troubleshooting
| Symptom | Cause & fix |
|---|---|
dsh plugin add fails with ERR_PNPM_NO_MATCHING_VERSION for @deepseek-ai/... |
Your profile is missing the autoInstallPeers: false line in pnpm-workspace.yaml (older profiles), so pnpm tries to auto-install pre-release peers. Add the line (see below), remove any stray @deepseek-ai/* entries from the profile's package.json dependencies, delete the profile's pnpm-lock.yaml, then re-run. This plugin also marks every peer optional, so it never triggers auto-install. |
dsh web fails to boot: failed to parse patches |
The insert block was appended after the file's existing [], making the YAML invalid. Replace the [] with the block instead (see Path B). |
dsh web fails to boot: duplicate loader entry id: dsh-selection-ask |
The package is registered twice — you used dsh plugin add (which adds the bundle) and a manual patch row. Remove one of the two. |
Installed via dsh plugin add but nothing appears after a page refresh |
Bundle-list changes are composed at boot — restart dsh web (Path A), or use the hot-activation Path B. |
| Button never appears after selecting text | Selection is outside the transcript (try selecting a chat message), the page wasn't refreshed after activation, or the insert row is missing. |
| Button appears but click does nothing | An outdated bundle is cached — hard-refresh the page (Cmd/Ctrl+Shift+R). If the package was rebuilt locally, re-run pnpm build and re-link: it. |
| Button gone while a question card is showing | Expected: the overlay hides with the default composer under a takeover. It returns when the default composer does. |
dsh plugin add fails |
Any pnpm specifier works (link:, github:, tarball URL). Check the profile path under ~/.dsh/profiles/ and your Node version. |
Development
The compiled lib/ is committed, so normal installs never need a build. To hack on it:
git clone https://github.com/lzbaclz/dsh-selection-ask.git
cd dsh-selection-ask
pnpm install
pnpm typecheck # host + client tsc programs, zero errors
pnpm build # tsc(host) + tsc(client) + tsdown bundle
pnpm verify # offline smoke checks over the built artifacts
src/index.ts— host half (emptyapply; exists so the roster scan finds the package).src/client/index.tsx— browser half: injects CSS, registers into theconversation.input.overlayslot.src/client/SelectionAskButton.tsx— the floating button: selection detection, positioning, quote writing.src/client/quote.ts— purebuildQuote/appendQuotehelpers (exercised offline byverify).src/client/styles.ts— button CSS + HMR-safe<style>injection.
After changing src/, rebuild, reinstall (or re-link:), and refresh the page.
How it works
The plugin registers a component into the session-scoped conversation.input.overlay slot, which grants it the session input kit (useInput, inputActions). A document-level selectionchange/mouseup listener detects selections inside the transcript and renders a position: fixed button at the selection's bounding rect. Clicking builds a Markdown quote, joins it with the current draft, writes the full draft through inputActions.setDraft — the input machine's official write path — then focuses the composer textarea.
Roadmap
- Publish to npm (
dsh plugin --profile web add dsh-selection-ask). - Optional keyboard shortcut (e.g. ⌘⇧Q) to quote the current selection.
- Configurable button label / language.
License
MIT © lzbaclz
Issues and PRs are welcome any time — open an issue and tell us what you built with it.
liangmianya/dsh-synapse
alaliqing/claude-paper
omdsh-dev/dsh-annotation
Anionex/dsh-turn-rewind
hanshenmesen/dsh-turn-delete
qkycir-123/dsh-run2skill
Tyan66666/billion-context-dsh
PKUfudawei/dsh-capability-menu