安装
在 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 | 中文

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 历史与光标在往返后原样保留。

提交走按作用域寻址的 conversation 服务的 send 动词——与普通输入框的提交同一条路径——因此裁决、排队与 prompt 错误报告的行为与手打 prompt 完全一致。发送失败时会话的 composer 通知通道会浮现错误,草稿保留在面板中。
笔记本与原生输入框是同一份草稿的两个编辑面:打开面板时,原生编辑区已有的内容进入笔记本(原生为空时则把笔记本保留的草稿推下去);面板打开期间,任一侧的每次编辑都实时镜像到另一侧——笔记本经会话 input facade 的 setDraft 单一写路径写入原生草稿,原生侧则订阅 facade 的 InputState store,以最小差异替换回流笔记本(相等即不写的守卫阻断回环,也保住编辑面外的光标);关闭面板时最终文本留在原生编辑区,成功提交则同时清空两侧。

安装
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-testprofile),不要直接在日用 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
评论
评论存放在 GitHub Discussions。用 GitHub 账号登录后可发表评论或点表情。