插件目录 / Developer / dsh-rich-editor
dsh-rich-editor
未验证 MarchLiu
功能简介
Third-party dsh web plugin: a rich Markdown notebook for the composer region — tool-row toggle plus a CodeMirror editor card with Codex-style list editing
未验证 — 尚未实测
Third-party dsh web plugin: a rich Markdown notebook for the composer region — tool-row toggle plus a CodeMirror editor card with Codex-style list editing 尚未验证——请自行安装测试。
「未验证」表示我们的自动化 CI 尚未安装过该插件。功能描述与版本兼容性均为作者声明。这不是安全审计,也不代表对第三方代码的背书。
README
@mars.liu/dsh-rich-editor
English | 中文

Third-party DeepSeek Harness web plugin: a rich Markdown notebook for the composer region. Its browser half contributes two entries to the composer region that dsh-client-ui-conversation owns: a tool-row toggle (conversation.input.left) and an editor card in the composer context stack (conversation.input.dock). Both entries share one per-session store handle, so the in-progress draft survives closing and reopening the panel, surface remounts, and — because the engine scopes session stores by session id — each session keeps its own notebook.
The editor is a CodeMirror 6 instance over the Markdown language: syntax highlighting for the draft (GFM tables included), native undo/redo and selection, and Enter-key list editing in the Codex style — pressing Enter on a non-empty list item opens the next item (ordered markers increment 1. → 2., checkbox items reopen unchecked, indentation is preserved, and a mid-line caret splits the item), while Enter on an empty item drops the marker and returns the line to plain-text editing. Enter on a non-list line falls through to a plain newline. Mod+Enter submits.

Submission rides the scope-addressed conversation service's send verb — the same path the plain composer's submit rides — so adjudication, queueing, and prompt-error reporting behave exactly like a typed prompt. A failed send surfaces on the session's composer notice channel and the panel keeps its draft.
The notebook and the native composer are two editing surfaces over one draft: opening the panel adopts whatever the native editor already holds (an empty composer instead receives the notebook's kept draft); while the panel is open, every edit on either side mirrors live to the other — notebook edits ride the session input facade's single setDraft write path, native edits flow back through a subscription on the facade's InputState store applied as a minimal-diff splice (an equality guard breaks the echo loop and preserves a caret outside the edited range); closing leaves the final text in the native editor, and a successful submit clears both surfaces.

Install
dsh plugin --profile web add @mars.liu/dsh-rich-editor
The package carries its own bundle patch (cordis.patch.yml adds the ui-rich-editor row); list the bundle in the profile's dsh.profile.bundles if you compose profiles by hand. From a checkout:
pnpm install && pnpm run build && pnpm test
Requires the dsh family at >=0.0.1-rc.1 (published on npm) and a dsh web composition that mounts dsh-client-ui-conversation.
Development notes
The npm 0.0.1-rc.1 dsh snapshot ships browser loader bundles only — its node halves export almost nothing, and several pre-rename dependency names (dsh-compact, dsh-user-interaction, dsh-type-meta, dsh-client-ui-slash) were never published. This repo works around both:
package.json > overridespoints the missing names at empty stubs undervendor/stubs/(nothing in this plugin's surface imports them);vitest.config.tsaliases@deepseek-ai/dsh-client-runtime/clientand.../dsh-client-locale/clientonto a local harness checkout's TypeScript sources (DSH_CHECKOUT, default../deepseek-harness) and inlines all@deepseek-ai/dsh-client-*packages, mirroring how in-repo dsh tests reach client APIs.
Drop both workarounds when the dsh family republishes a complete, installable closure.
Known Limitations and Deferred Work
- Ordered renumbering is deferred — continuing an ordered list increments the new item's marker, but editing or removing earlier items does not renumber the following ones.
- No
/and@trigger integration yet — the notebook does not participate in the slash-command and file-mention pipeline; those gestures belong to the plain composer below it. - Draft is session-lifetime only — the store keeps the draft across remounts and tab switches, but a full page reload discards it (no persistence key).
- No attachment intake — pasting or dropping images into the notebook is not wired to the session's image attachment path.
- The browser bundle inlines ~268 kB gzip of CodeMirror —
@codemirror/lang-markdownstatically depends on@codemirror/lang-html(which pulls the JavaScript and CSS parsers) even with embedded code highlighting off (codeLanguages: []), and the client bundler inlines the whole chain; a deferred trim would split the editor mount behind a dynamic import.
License
MIT
安装
装一次目录插件,之后本站所有插件都能让 DeepSeek Harness 自动找、自动装:
dsh plugin add dshbase-catalog 然后对 agent 说「帮我装 dsh-rich-editor」,它会在目录里找到并自动安装。文档:dshbase-catalog · 已验证场景包。
该插件是 GitHub 源码(未发 npm)——直接从仓库装:
Web profile:
dsh plugin --profile web add github:MarchLiu/dsh-rich-editor Headless(CLI)profile:
dsh plugin --profile headless add github:MarchLiu/dsh-rich-editor 实测报告
尚未 L3 验证——若已跑过,见下方失败备注。