DeepSeek Harness Hub
← 返回列表

Asianfleet/dsh-message-copy-enhance

DeepSeek 客户端兼容 / 相关生态spec-screened在 GitHub 查看 ↗
未验证

一个 DeepSeek Harness 客户端 UI 插件:当你在模型消息中选中文本并复制时,剪贴板内容会被重写为…

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/19 · 已提供中文文档

将 dsh 助手输出复制为 Markdown,保留链接、LaTeX 源码和代码围栏。

综合分
29.9
GitHub 分
29.9
用户评分
★ Stars
4
周下载量
兼容 / 相关生态插件(非 dsh 原生,请按其对应运行时安装)
git clone https://github.com/Asianfleet/dsh-message-copy-enhance.git
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-message-copy-enhance

npm version
npm downloads
License: MIT
TypeScript

English ·

一个 DeepSeek Harness 客户端 UI 插件:当你在模型消息中选中文本并复制时,剪贴板内容会被重写为 Markdown,这样链接、LaTeX 源码、代码围栏语言信息等就不再丢失。

工作原理

DSH 通过 dsh-client-ui-conversation → dsh-client-ui-primitives 渲染模型输出:

| 内容 | DOM 结构 | 恢复方式 |
|---|---|---|
| 链接 |  | 直接取 href,输出 label |
| 行内 / 块级 LaTeX | KaTeX 渲染的 .katex / .katex-display | 从 MathML 分支中的  取回 TeX 源码,输出 $...$ / $$...$$ |
| 代码块 | .md-code-block(横幅显示语言)+ pre | 输出围栏代码块;语言来自 language- 类或横幅的 infostring |
| 标题 / 强调 / 列表 / 引用 / 表格 | 标准 HTML | 恢复为 GFM |

该插件在 捕获阶段 监听 document 上的 copy 事件,仅当选区起始于 [data-chat-flow-kind="assistant"] 消息内部且包含 markdown 关键元素时才接管:

1. 将选区扩展到完整的 .katex 元素(在公式中间选中也能拿到完整源码)
2. 用 Range.cloneContents() 克隆选区 DOM
3. 用内置的零依赖 DOM→Markdown 转换器恢复 markdown(src/client/toMarkdown.ts,用 TypeScript 编写,类型擦除后内联进 bundle)
4. preventDefault() 并写入 text/plain 和 text/markdown

其他选区(用户气泡、工具卡片、纯文本)和空选区完全不受影响;如果转换失败,会自动恢复默认复制行为。

项目结构

dsh-message-copy-enhance/
├── package.json            # dsh.client 元数据(客户端插件声明)
├── tsconfig.json           # 类型检查配置(strict,包含 src/test/vite.config.ts)
├── vite.config.ts          # vite 构建(DSH module-loader 输出)+ vitest 配置
├── src/client/
│   ├── index.ts            # 插件入口:复制拦截 + apply/inject(TS,apply(ctx) 使用官方
│   │                       #   @deepseek-ai/cordis Context 类型,与 dsh-client-ui- 相同)
│   └── toMarkdown.ts       # DOM→Markdown 转换器(TS,零依赖)
├── lib/
│   ├── index.js            # 宿主侧空操作插件(由 DSH Loader 加载的 JS 入口)
│   └── index.d.ts          # 宿主入口的类型声明
├── dist/client.js          # 构建产物(预生成)
└── test/                   # vitest(.test.ts):转换器 / 打包 / 包布局

构建与测试

npm install           # 开发依赖:typescript / vite / vitest / @types/node / linkedom / @deepseek-ai/cordis(官方类型)
npm run typecheck     # tsc -p tsconfig.json — 完整类型检查(严格模式)
npm run build         # vite build — 将 src/client 打包为 dist/client.js,采用 DSH 模块加载器格式
npm test              # vitest run — 36 个用例(转换器 / 真实打包 / 包布局)
npm run test:watch    # vitest — 监听模式
npm run test:coverage # vitest run --coverage — v8 覆盖率报告

发布

发布由 release-it 驱动,并使用 Conventional Commits 变更日志。请在 main 分支上、工作区干净的状态下运行:

pnpm release

它是交互式的:首先会展示自上一个标签以来的提交作为变更日志预览(按类型分组,包含 conventional-commits 推荐版本),然后你从提示中选择下一个版本(patch / minor / major / 预发布变体 / 自定义)。按顺序会发生以下事情:

1. 检查(npm run check:release):版本是有效的 SemVer,该版本尚未发布到 npm(或自其标签以来有新的提交),GITHUB_TOKEN 已设置,npm 已认证;然后运行类型检查和测试套件。
2. 提示 — 打印变更日志预览,并交互式选择下一个版本(显示来自 conventional commits 的推荐升级;feat → minor,fix/perf/revert → patch,破坏性变更 → major)。
3. 变更日志 — 根据自上一个标签以来的提交重新生成 CHANGELOG.md,置于所选版本下。
4. 构建 — npm run build(DSH 模块加载器客户端打包)。
5. 发布 — 提交 chore(release): vX.Y.Z,打标签 vX.Y.Z,推送到 GitHub,创建 GitHub Release(发布说明来自变更日志),然后执行 npm publish。

前提条件:

- 已导出 GITHUB_PAT_TOKEN(一个 GitHub PAT — 具有 repo 范围的经典令牌,或在本仓库上具有 Contents: Read and write 权限的细粒度令牌;gh auth token 也可以;GITHUB_TOKEN 可作为后备),并已 npm login。协作者预检查会被跳过(github.skipChecks),因为细粒度令牌在该端点上会收到 403;GitHub 在创建发布时仍会强制执行真实权限。
- 提交遵循 Conventional Commits;脚本仅识别这些类型。

实用变体:

pnpm release:dry                   # 试运行:预览所有内容而不做任何更改
pnpm release -- --increment=patch  # 跳过提示并强制 patch 升级(或 minor/major)
pnpm release -- --ci               # 完全非交互式(用于 CI;回退到补丁版本号递增)

注意:如果设置了 CI 环境变量,release-it 会自动切换到非交互模式。

安装

dsh plugin --profile desktop add dsh-message-copy-enhance

升级

dsh plugin --profile desktop add dsh-message-copy-enhance@latest

此包尚未发布 1.0 版本,像 ^0.1.0 这样的脱字符范围仅覆盖补丁版本(0.1.x)——次版本递增(0.1 → 0.2)超出了该范围,因此 dsh plugin update 不会获取到它。请使用 @latest(或 @)显式升级。

用法

在任意模型回答中选中内容并按 Ctrl/Cmd+C,然后粘贴到 Typora / Obsidian / VS Code / 任意 markdown 编辑器中,即可获得完整的 markdown。

限制

- 跨多条消息的选区不会被拦截(仅处理起始于助手消息内部的选区)。
- 被渲染白名单过滤掉的链接(例如 file:、相对链接)本身就没有 href,无法恢复。
- 代码块仅恢复选中的行(不会强制展开整个代码块);当选中区域不包含语言标识行时,语言标签会缺失。
- 显示为 .katex-error(KaTeX 渲染失败)的元素会以 $source$ 形式输出。
- 表格以 GFM 管道表格形式输出;| 会被转义。

许可证

MIT — 版权所有 (c) 2026 Asianfleet

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群