跳到正文
dsh-market 浏览插件 GitHub EN

MarchLiu/dsh-rich-editor

为输入区提供富 Markdown 笔记本:工具行开关加 CodeMirror 编辑卡片,支持 Codex 风格列表编辑,经会话服务提交。

Star 数 ★ 2 分类 UI 增强 收录于 2026-09-15

安装

在 DeepSeek Harness 里通过 dsh-market 安装

dsh plugin --profile web add dshmarket

或使用命令行

dsh plugin --profile web add github:MarchLiu/dsh-rich-editor

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络。请先审阅源码,并尽量锁定 commit(github:owner/repo#sha)。

截图

README

English | 中文

打开 Markdown 笔记本后的输入区

DeepSeek Harness 的第三方 Web 插件:输入区的富 Markdown 笔记本。浏览器半边向 dsh-client-ui-conversation 拥有的输入区贡献两个条目:工具行开关(conversation.input.left)与输入区上下文栈中的编辑卡片(conversation.input.dock)。两个条目共享同一个按会话作用域的 store 句柄,因此进行中的草稿在关闭/重开面板、表面重挂载后仍然保留;引擎按会话 id 切分 session store,每个会话各有自己的笔记本。

编辑器是运行 Markdown 语言扩展的 CodeMirror 6 实例:草稿语法高亮(含 GFM 表格)、原生 undo/redo 与选区,以及 Codex 风格的 Enter 列表编辑——在非空列表项上按 Enter 打开下一项(有序标记 1. → 2. 递增,复选项重新变为未勾选,缩进保留,光标在行中时拆分该项),在空列表项上按 Enter 删除标记、回到普通文本编辑。非列表行的 Enter 落回普通换行。Tab 与 Shift-Tab 调整列表深度:列表项上按 Tab 缩进一级、按 Shift-Tab 升一级,最上一级列表项上按 Shift-Tab 退出列表(去掉标记与复选框、保留文字);非列表行上两者均放行编辑器默认行为。Mod+Enter 提交。

卡片顶边有一对编辑 / 预览标签。预览通过 marked 实时渲染草稿,并经 DOMPurify 消毒后才接触 DOM——它只是格式化 Markdown(GFM 表格、任务列表、围栏代码、引用块)的只读视图,绝不改动提交内容:草稿文本原样走发送通道。切到预览时 CodeMirror 宿主只是隐藏而非卸载,undo 历史与光标在往返后原样保留。

Enter 列表编辑:打开下一项、复选框重置、空项去标记

提交走按作用域寻址的 conversation 服务的 send 动词——与普通输入框的提交同一条路径——因此裁决、排队与 prompt 错误报告的行为与手打 prompt 完全一致。发送失败时会话的 composer 通知通道会浮现错误,草稿保留在面板中。

笔记本与原生输入框是同一份草稿的两个编辑面:打开面板时,原生编辑区已有的内容进入笔记本(原生为空时则把笔记本保留的草稿推下去);面板打开期间,任一侧的每次编辑都实时镜像到另一侧——笔记本经会话 input facade 的 setDraft 单一写路径写入原生草稿,原生侧则订阅 facade 的 InputState store,以最小差异替换回流笔记本(相等即不写的守卫阻断回环,也保住编辑面外的光标);关闭面板时最终文本留在原生编辑区,成功提交则同时清空两侧。

组件关系:两个输入区插槽、一个会话 store、一个 send 动词

安装

dsh plugin --profile web add @mars.liu/dsh-rich-editor

包自带 bundle patch(cordis.patch.yml 添加 ui-rich-editor 行);手动编排 profile 时把本 bundle 列进 dsh.profile.bundles。从源码构建:

pnpm install && pnpm run build && pnpm test

要求 dsh 家族 ^0.1.2-alpha.5(已发布到 npm;0.1.2 线移除了 dsh-client-runtime / dsh-client-web-react,其 API 现由 dsh-client-store、dsh-client-ui-renderer、dsh-api-session-controller、dsh-session 提供),以及挂载了 dsh-client-ui-conversation 的 dsh web 组合。

⚠️ 兼容性提示(在 0.1.5-rc.x 上安装前必读)

安装本插件会重新解析 profile 的共享 @deepseek-ai/* 依赖树。在 DSH 0.1.5-rc.1 / 0.1.5-rc.2 上,这可能把 profile 落到同一版本线里两个互不兼容的 @deepseek-ai/* 构建——核心入口 dsh-api-session-controller 可能因此无法从 dsh-attachment 导入,导致 dsh web 完全无法启动(#4)。

  • 首次安装请先用独立 profile(例如临时建一个 web-test profile),不要直接在日用 profile 上试。
  • 禁用插件不等于回滚。 损坏发生在 node_modules 里已解析的包版本上,而不是插件清单里;切换插件条目或安全模式都不会重写这些版本,只有 pnpm 级操作才会重新解析依赖树。
  • 恢复方法:移除本包即可重新解析依赖树,立即恢复一致的包组合:
dsh plugin --profile web remove @mars.liu/dsh-rich-editor
dsh web   # 正常启动

本项目暂时不 pin @deepseek-ai/* 版本范围(pin 会与同 profile 里的其他插件互相冲突)。替代做法是:每次发布前,对 npm 上当前 latest 标签起(含)往前的最近 5 个已发布版本做一轮可用性冒烟测试,并在 README 标明该次发布验证过的兼容范围。若你安装的版本落在范围之外,首次安装请优先使用独立 profile。

开发说明

npm 上的 0.0.1-rc.1 dsh 快照只发布了浏览器 loader bundle——node 半边几乎无导出,且若干改名前的依赖名(dsh-compact、dsh-user-interaction、dsh-type-meta、dsh-client-ui-slash)从未发布。本仓库用两个手段绕开:

  • package.json > overrides 把缺失名指向 vendor/stubs/ 下的空 stub(本插件的任何代码路径都不 import 它们);
  • vitest.config.ts 通过本地 harness checkout 的 tsconfig.base.json 中的 paths 映射解析全部 @deepseek-ai/* 说明符(DSH_CHECKOUT 环境变量,默认 ../deepseek-harness),并 inline 全部 @deepseek-ai/dsh-client-* 包——与 dsh 树内测试获取 client API 的方式一致。

待 dsh 家族重新发布完整可安装的闭包后,移除这两个绕行。

已知限制与暂缓事项

  • 有序列表重编号暂缓 — 续写有序列表会递增新项标记,但编辑或删除前项不会自动重编后续项。
  • 暂未接入 / 与 @ 触发 — 笔记本不参与斜杠命令与文件提及管线;这些手势属于其下方的普通输入框。
  • 草稿仅会话生命周期 — store 让草稿跨重挂载与标签切换保留,但整页刷新会丢弃(无持久化键)。
  • 无附件入口 — 笔记本未接入会话的图片附件路径,粘贴/拖入图片不生效。
  • 浏览器 bundle 内联了约 268 kB gzip 的 CodeMirror — 即便关闭嵌入代码高亮(codeLanguages: []),@codemirror/lang-markdown 仍静态依赖 @codemirror/lang-html(连带 JavaScript 与 CSS 解析器),客户端打包器会把整条链内联进来;后续瘦身方向是把编辑器挂载拆到动态导入之后。

许可

MIT

内容来自项目 README(GitHub)↗

评论

评论存放在 GitHub Discussions。用 GitHub 账号登录后可发表评论或点表情。