At a glance
What it does
A CodeMirror Markdown notebook panel for the DSH web composer.
Web Profile
DSH family ^0.1.2-alpha.5; @deepseek-ai/cordis ^4.0.1
Evidence-verified
Checked Sep 13, 2026, 2:05 PM UTC
Code-evidenced contributions
What it adds to DSH
Adds a composer toggle and CodeMirror-based Markdown editor card that shares the session draft with the native composer.
Mechanism evidence ↗Before you choose it
This third-party DSH web plugin adds a toggleable Markdown notebook above the composer. It provides syntax highlighting, Edit and Preview tabs, list-focused keyboard editing, and Mod+Enter submission. Its draft stays synchronized with the native composer for the current session.
Best for
DSH web users who want a larger Markdown-focused surface while composing prompts.
Common tasks
- Draft Markdown prompts with highlighted tables, task lists, code fences, and blockquotes.
- Use Enter, Tab, and Shift-Tab to create, indent, outdent, or exit Markdown lists.
- Preview sanitized rendered Markdown before submitting the unchanged draft.
- Close and reopen the notebook without losing the current session draft.
Permissions and data
Works in the browser composer and conversation flow.
Permissions- Accesses the current session's composer draft.
- Uses the conversation service send action when the user submits.
- Keeps the notebook draft in a per-session store across panel closes and UI remounts.
- The README states that a full page reload discards the draft; no persistence key is used.
Limitations
- No slash-command or file-mention trigger integration.
- Does not accept pasted or dropped image attachments.
- Ordered lists are not renumbered after earlier items are edited or removed.
- Preview behavior and runtime compatibility were not independently executed for this review.
What DSHub checked
- Pinned Git bundle structure and patch were verified.
- The package declares a web client integration and the listed DSH peer dependencies.
- The source documents the UI behavior, installation command, and known limitations.
What DSHub did not check
- Installation or operation in a live DSH profile.
- Actual browser performance, including the documented bundle-size impact.
- Whether the npm package corresponds to this repository; its repository metadata differs.
Pinned install
Install DSH Rich Editor
This plugin bundle does not have a DSH Plugin install action. Use its source documentation for the delivery method.
Maintainer source
Project 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. Tab and Shift-Tab steer list depth: Tab on a list item indents it one level, Shift-Tab outdents one level, and Shift-Tab on a top-level item exits the list (marker and checkbox drop, the text stays); both decline on non-list lines to the editor defaults. Mod+Enter submits.
An Edit / Preview pair of tabs sits at the card's top edge. Preview renders the live draft through marked and sanitizes the result with DOMPurify before it touches the DOM — a read-only look at the formatted Markdown (GFM tables, task lists, fenced code, blockquotes), never a modification of what gets submitted: the draft text rides the send path verbatim. Toggling to Preview hides the CodeMirror host instead of unmounting it, so undo history and caret survive the round-trip.

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.1.2-alpha.5 (published on npm; the 0.1.2 line removed dsh-client-runtime / dsh-client-web-react, whose APIs now come from dsh-client-store, dsh-client-ui-renderer, dsh-api-session-controller and dsh-session) 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.tsresolves every@deepseek-ai/*specifier through thepathsmap of a local harness checkout'stsconfig.base.json(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
Operate deliberately
Install and manage
Prerequisites and target Profile
Target: Web Profile
Delivery: Dsh Bundle Git — MarchLiu/dsh-rich-editor#4d18eb5675dcc5a6d917a7612697d79216bb9321。
Verify, update, and remove
Show lifecycle commands
dsh plugin --profile web listCompatibility and access
Requires a DSH web composition with the conversation UI mounted: DSH family ^0.1.2-alpha.5; @deepseek-ai/cordis ^4.0.1。
Review compatibility evidence ↗
Risk facts
Reads and updates the session composer draft, and submits through the conversation service.
Evidence ↗The documented browser bundle includes about 268 kB gzip of CodeMirror.
Evidence ↗Evidence and editorial reviewManifest, Bundle patch, distribution and freshness
Immutable evidence
Review status and source activity
Prefer the pinned Git bundle source for evaluation because the supplied record flags an npm repository metadata mismatch.
AI reviewed Sep 13, 2026, 2:06 PM UTC。GitHub facts last checked Sep 13, 2026, 2:06 PM UTC。
No material source change has been recorded since this evidence baseline.