dsh-auto-paste
Auto-saves large pasted text as an attachment file in the DeepSeek Harness web input box; with dsh-better-sidebar installed, the paste pill opens the file in the sidebar editor and saves it back.
Install
dsh plugin --profile web add dsh-auto-paste
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-auto-paste




往输入框里粘 8000 字日志,最后只剩一张卡片。
DeepSeek Harness(DSH)插件:粘贴超过 500 字(默认阈值,可配置)时,原文自动保存到当前工作区的 pastes/<时间戳>.txt,输入框里只插入一张卡片;发送后消息里也是同一张卡片,模型收到的是一行文件引用,按需再读。聊天框和上下文都不会被长文占满。
安装
npm i dsh-auto-paste dsh plugin --profile web add dsh-auto-paste
装完刷新页面即可,不需要改配置。桌面版(DeepSeek Harness 桌面应用)需在它自己的 profile 上单独装一次,见下文 [安装与激活](#install--安装与激活)。
适用
日志与堆栈、代码与 diff、论文、会议记录、聊天导出——凡是「很长、但不想让它占满聊天框」的文本。
兼容性
DSH 版本 · 状态
0.2.1-alpha.5 · ✅ 实测可用
0.2.1-rc.1 · ✅ 实测可用
0.2.1-rc.2 · ✅ 实测可用
0.2.1-rc.3 · ✅ 实测可用
0.2.1-rc.4 · ✅ 同线判断可用(官方仅修 ACP 模式下诊断输出混入 stdout;未单独实测)
0.2.1-rc.5 · ✅ 实测可用
0.2.2-rc.1 · ✅ 实测可用(桌面版)
如果它帮你省了时间
点一个 Star ⭐ —— 这是对作者最直接的鼓励,也能让更多人看到它。遇到问题欢迎开 issue。
Release / 发布状态
- npm:npm 页面 —— 官方源
registry.npmjs.org。发版策略:新版本先发到dist-tag: next观察,再人工转为latest。当前0.3.1(latest与next一致)。 - 源仓库:
https://github.com/sakuraqqq/dsh-auto-paste(tag 与版本号一一对应)。 - 许可:MIT(见下)。
- 同步提示:npm 发布后国内镜像(npmmirror)同步有几秒到几分钟延迟,以官方 registry 为准。
License / 许可
MIT License — Copyright (c) 2026 misakamaster。
本插件以 MIT 许可开源:可自由使用、修改、再分发(含商用),需保留版权声明与许可文本。详见 [LICENSE](LICENSE)。
反馈(bug/建议)欢迎提交:QQ 群测试反馈或直接联系作者。
What it does / 功能
1. Web 客户端粘贴钩子(主路径) — dsh.client.platform: web。在输入框粘贴超过阈值(默认 500 字符)的文本时:
- 客户端拦截粘贴事件,通过现有 connection RPC(
/api→ Typert gateway)调用宿主pasteStore/savePaste; - 宿主把文本写入当前会话工作区的
pastes/<时间戳>.txt; - 输入框里插入 dsh 原生原子引用卡片(与 dsh 自己的附件同一套节点):
- 只显示文件名 + 字符数(
📄 20260815-103000.txt · 1234 字符),不显示路径; - 一键删除:Backspace / Delete 一次把整张删掉——它是 Lexical 装饰节点(
contenteditable="false"),不存在被逐字删的中间态; - 点击即在右侧栏打开全文(官方侧栏对
.txt走纯文本预览,只读;要能编辑需装 dsh-better-sidebar,见下); - 发送后消息里是同一张可点卡片。模型侧不塞正文:卡片序列化出来就是
@"pastes/20260815-103000.txt"这个引用,dsh-file-reference明确该语法不增加请求 token,模型据此自己去读那个文件。 - 降级(自动,无提示):拿不到上面那套输入框接口时——老 dsh 线、输入框正忙(提交中)、或光标在你打字期间被改动——退回文本引用
@"pastes/20260815-103000.txt" (1234 字符):发送后同样渲染成可点卡片,只是输入框里是纯文本、要手工删。两条路径给模型的文本完全一致。 - 其中 N 是 UTF-16 code units(即 JS 的字符串长度:emoji/代理对算 2,CJK 算 1),与 UTF-8 字节数不是一回事——这个口径是冻结的,已发消息里的引用数字不会被改写。卡片上的数字走卡片自己的显示字段,不进引用本身(引用必须是裸的
@"路径",否则点击时会把数字当成路径的一部分而打不开)。 - 保存失败时会尝试把原始文本插回输入框,并如实说明是否插回成功:插回去了就说已按原样粘贴;没插回去会明说「没能自动插回、内容仍在剪贴板,请手动 Ctrl+V 重试」,不做未经验证的承诺。
- 超过 1 MiB 的文本会被服务端拒绝(大小上限,防资源耗尽):报错并回退为普通粘贴,不落盘。
2. save_paste 工具(纪律兜底) — 宿主同时注册 save_paste 工具,模型在用户贴大段文字时可主动调用,把文本持久化为 pastes/<时间戳>.txt 并在回复中引用路径。工具输出只含 path / bytes / chars(不含本机绝对路径,RPC 结果同样收窄:绝对路径含用户名与目录结构,仅宿主内部使用)。建议在项目 AGENTS.md 加一行纪律:
## dsh-auto-paste 纪律 用户粘贴大段文字(约 500 字符以上)时:若输入框钩子未拦截,主动调用 save_paste 工具 把文本存入 pastes/<时间戳>.txt,并在回复中引用该工作区相对路径,不要复述原文。
可选集成:dsh-better-sidebar(在侧栏编辑粘贴文件)
本插件不调用 better-sidebar 的 API,只探测它在不在(ctx.inject(['betterSidebar']),仅用于下面那行提示与设置页状态)。点粘贴卡片的动作由 dsh 内核路由:内核把卡片地址交给右侧栏,装了 better-sidebar 时它认领该地址、用它的编辑器打开 pastes/*.txt(可编辑);没装则落到 dsh 自带的只读纯文本预览。
因此:
- 没装时:第一次粘贴出卡片后会就地说明一次(一行提示,可关闭,关掉后不再出现);万一错过了,设置页 General 分区的「侧栏集成」一行会一直写着,装上后自动消失。
- ⚠️ 版本要求:
dsh-better-sidebar≥ 0.28.0。更早的版本里,侧栏编辑器保存时会用工作区相对路径,而它的写接口只接受绝对路径 ⇒ 保存报 400(is not an absolute path,host 侧校验在lib/index.js的if (!isAbsolute(path)) throw …)。那是上游 omdsh-dev/DSH-better-sidebar#646(本插件无关,已于 2026-10-04 修复)。 - 0.28.0 实测可正常保存(2026-10-17,桌面版)。
- 若暂时无法升级,两条替代路径:从 better-sidebar 自己的文件树 / 路径输入框打开同一文件再保存(那条路会传绝对路径);或继续用
pastes/下的文件本身(内容已在磁盘上,编辑只是便利)。
与 dsh 自带文件面板的区别:自带面板能浏览工作区文件(包括 pastes/),但只读、改不了;装了 better-sidebar 才有编辑入口。两者的差别只在"能不能改",不在"能不能看"。
Install / 安装与激活
方式一:从 npm 安装(推荐)
npm i dsh-auto-paste # 最新版(dist-tag: latest);--save-exact 可锁版 npm i dsh-auto-paste@0.3.1 # 或指定版本(换成你要的版本号) # 在插件父目录执行,以包名注册到目标 profile: dsh plugin --profile web add dsh-auto-paste dsh --profile web # 重启 web profile,观察: [dsh-auto-paste] host ready ... # 刷新浏览器页面后,控制台可见: [dsh-auto-paste] client paste listener attached — threshold 500 chars until the host's config arrives # 随后: [dsh-auto-paste] config from host: minChars=500 (deployment), maxBytes=1048576
方式二:本地目录安装(开发/调试)
# 在插件父目录(本仓库根)执行;相对路径锚定调用目录: dsh plugin --profile web add ./dsh-auto-paste dsh --profile web
改动插件后:pnpm install && pnpm run build(tsc → dist/),然后重启 dsh --profile web 并刷新页面。
官方桌面版(DeepSeek Harness 桌面应用):同样支持,但要在桌面版自己的 profile 上单独装一次(它不复用 web profile 的装配)——桌面版自带 CLI,在应用安装目录下执行:
set "DSH_HOME=%USERPROFILE%\.dsh" # 换成桌面版实际使用的 home(隔离启动器会改它) resources\runtime\cli\bin\dsh.cmd plugin --profile desktop add dsh-auto-paste
桌面版是独立 dsh 线(如 0.2.0-rc.2)。若它的运行时版本超出本插件声明的 peer 范围,dsh 会拒绝加载该 bundle(表现为插件完全无输出、设置里也没有本插件的阈值项),需要精确版本豁免——用 dsh plugin --profile desktop allow-version dsh-auto-paste@<版本> --dsh-version <运行时版本> --accept-risk,它会在 profile 目录写一个 compatibility.json;--dsh-version 必须填它报错时给出的那个值。豁免是精确配对的,插件升级或 dsh 升级都不会继承。
minChars 有两个入口:Settings → General 的「大段粘贴阈值」(保存即生效、不用重启;旁边的「恢复默认」清掉这次覆盖),以及 cordis.patch.yml 的 row config(部署默认值,改完只需重启 dsh、不用重新构建)。用户设置优先,没设置时用部署默认值。
覆盖值存在哪里随 dsh 线而变,保存后都立即生效:dsh 0.1.5 线存进 dsh 自己的设置文档;dsh 0.1.7 起 dsh 改成"从插件自己的 Config 投影",覆盖值写回 profile patch(同一个 cordis.patch.yml)—— 所以本插件把 minChars 声明为 schemastery 的 volatile 字段:没有它,dsh 不会为该插件生成表单,写入也会被
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::17,最后更新 2026-11-06