Evidence snapshot reviewed Sep 16, 2026GitHub checked Aug 21, 2026
Evidence-verifiedPlugin BundleInterface & ExperienceWeb Profile

DSH Rich Editor

A CodeMirror Markdown notebook panel for the DSH web composer.

At a glance

What it does

A CodeMirror Markdown notebook panel for the DSH web composer.

Use cases
Interface & ExperienceUIDocumentationConfiguration
Works with
Deepseek HarnessDsh Client Ui ConversationWeb
Compatibility

Web Profile
DSH family ^0.1.2-alpha.5; @deepseek-ai/cordis ^4.0.1

Trust & status

Evidence-verified
Checked Sep 13, 2026, 2:05 PM UTC

Code-evidenced contributions

What it adds to DSH

Web UIRich Markdown notebook for the composer

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.
Data handling
  • 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.

Visit the source project

Maintainer source

Project README

View at commit 4d18eb5
Maintainer-authored contentCaptured from README.md on Sep 13, 2026. The text and repository-relative media are fixed to commit 4d18eb5675dc with content hash e60f70936577; provider-hosted badges may update independently. README commands are upstream documentation; the DSHub copy action above is the verified, version-pinned install.

@mars.liu/dsh-rich-editor

English | 中文

Markdown notebook open above the plain composer

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.

Enter-key list editing: next item, unchecked checkbox, marker dropped

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.

How the pieces connect: two composer slots, one session store, one send verb

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 > overrides points the missing names at empty stubs under vendor/stubs/ (nothing in this plugin's surface imports them);
  • vitest.config.ts resolves every @deepseek-ai/* specifier through the paths map of a local harness checkout's tsconfig.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-markdown statically 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
Verify
dsh plugin --profile web list

Compatibility 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

Draft And Send Access

Reads and updates the session composer draft, and submits through the conversation service.

Evidence
Browser Bundle Size

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

AI reviewed

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 UTCGitHub facts last checked Sep 13, 2026, 2:06 PM UTC

No material source change has been recorded since this evidence baseline.

Next step

Follow the Plugin installation workflow

Subscribe to material changes for DSH Rich Editor