packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
在输入框粘贴大段文本时自动保存为附件文件;装了 dsh-better-sidebar 时,药丸上的「查看」可在侧栏编辑器打开并保存回原文件。
往输入框里粘 8000 字日志,最后只剩一张卡片。
DeepSeek Harness(DSH)插件:粘贴超过 500 字(默认阈值,可配置)时,原文自动保存到当前工作区的 pastes/.txt,输入框里只插入一张卡片;发送后消息里也是同一张卡片,模型收到的是一行文件引用,按需再读。聊天框和上下文都不会被长文占满。
npm i dsh-auto-paste
dsh plugin --profile web add dsh-auto-paste装完刷新页面即可,不需要改配置。桌面版(DeepSeek Harness 桌面应用)需在它自己的 profile 上单独装一次,见下文 安装与激活。
日志与堆栈、代码与 diff、论文、会议记录、聊天导出——凡是「很长、但不想让它占满聊天框」的文本。
DSH 版本 · 状态 0.2.1-alpha.5 · ✅ 实测可用 0.2.1-rc.1 · ✅ 实测可用 0.2.1-rc.2 · 未验证
点一个 Star ⭐ —— 这是对作者最直接的鼓励,也能让更多人看到它。遇到问题欢迎开 issue。
registry.npmjs.org。发版策略:新版本先发到 dist-tag: next 观察,再人工转为 latest。当前 `0.3.1`(latest 与 next 一致)。https://github.com/sakuraqqq/dsh-auto-paste(tag 与版本号一一对应)。MIT License — Copyright (c) 2026 misakamaster。 本插件以 MIT 许可开源:可自由使用、修改、再分发(含商用),需保留版权声明与许可文本。详见 LICENSE。 反馈(bug/建议)欢迎提交:QQ 群测试反馈或直接联系作者。
dsh.client.platform: web。在输入框粘贴超过阈值(默认 500 字符)的文本时:/api → Typert gateway)调用宿主 pasteStore/savePaste;pastes/.txt;📄 20260815-103000.txt · 1234 字符),不显示路径;contenteditable="false"),不存在被逐字删的中间态;.txt 走纯文本预览,只读;要能编辑需装 dsh-better-sidebar,见下);@"pastes/20260815-103000.txt" 这个引用,dsh-file-reference 明确该语法不增加请求 token,模型据此自己去读那个文件。 @"pastes/20260815-103000.txt" (1234 字符):发送后同样渲染成可点卡片,只是输入框里是纯文本、要手工删。两条路径给模型的文本完全一致。@"路径",否则点击时会把数字当成路径的一部分而打不开)。save_paste 工具,模型在用户贴大段文字时可主动调用,把文本持久化为 pastes/.txt 并在回复中引用路径。工具输出只含 path / bytes / chars(不含本机绝对路径,RPC 结果同样收窄:绝对路径含用户名与目录结构,仅宿主内部使用)。建议在项目 AGENTS.md 加一行纪律:## dsh-auto-paste 纪律
用户粘贴大段文字(约 500 字符以上)时:若输入框钩子未拦截,主动调用 save_paste 工具
把文本存入 pastes/<时间戳>.txt,并在回复中引用该工作区相对路径,不要复述原文。本插件不调用 better-sidebar 的 API,只探测它在不在(ctx.inject(['betterSidebar']),仅用于下面那行提示与设置页状态)。点粘贴卡片的动作由 dsh 内核路由:内核把卡片地址交给右侧栏,装了 better-sidebar 时它认领该地址、用它的编辑器打开 pastes/*.txt(可编辑);没装则落到 dsh 自带的只读纯文本预览。
因此:
is not an absolute path,host 侧校验在 lib/index.js 的 if (!isAbsolute(path)) throw …)。那是上游 omdsh-dev/DSH-better-sidebar#646(本插件无关,已于 2026-10-04 修复)。pastes/ 下的文件本身(内容已在磁盘上,编辑只是便利)。与 dsh 自带文件面板的区别:自带面板能浏览工作区文件(包括 pastes/),但只读、改不了;装了 better-sidebar 才有编辑入口。两者的差别只在"能不能改",不在"能不能看"。方式一:从 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 不会为该插件生成表单,写入也会被拒。当前 dsh 无法在界面保存时(没有 settings 服务、或该线不支持 volatile),设置行会说明原因并禁用保存。
host 始终是唯一权威:客户端半身拿不到 row config(dsh 的 dsh.client 只认 platform/inject/external/immediately,启动图里不带 config),它在启动时、以及每次保存设置后,都用 pasteStore/getConfig RPC 取生效值;取不到时用 500 兜底并在控制台标出来源。maxBytes 只有 row config 一个入口(属部署口径)。
dsh --profile web --dump-config | grep dsh-auto-paste # 配置层含本行
dsh plugin --profile headless add ./dsh-auto-paste
dsh --profile headless "run a probe" # host 半身加载;模型调用会 MISSING_CREDENTIALdsh.bundle.patch → ./cordis.patch.yml(dsh 加载插件的硬性要求,缺失只会被当作普通依赖安装)dsh.client.platform: web + exports["./client"] → dist/client.jsexports["./typert"] → dist/typert.host.js(typert-loader 自动注册 remote 调用)pastes/ 下的本地文件^0.1.5-rc.1 || ^0.2.0-rc.2)——别改回单段:dsh 在挂载前用 semver 逐个校验 @deepseek-ai/dsh/@deepseek-ai/dsh-* peer(带 includePrerelease),任一不满足就整包拒绝加载。单段 ^0.1.x 会拒掉 0.2 线(官方桌面版在跑 0.2.0-rc.2);写成区间(>=0.1.5-rc.1 <0.3.0)又会把没测过的 0.2.1+ 一并放行。并列两段 = 只放行实测过的线@deepseek-ai/dsh-tools: ^0.1.5-rc.1 || ^0.2.0-rc.2(peerDependency — 两段并列,见上)@deepseek-ai/dsh-typert-protocol: ^0.1.5-rc.1 || ^0.2.0-rc.2(peerDependency — 同上;RPC schema 那一层)@deepseek-ai/cordis: ^4.0.1 (peerDependency — host provides it; runtime import of Service resolves through the profile's node_modules).zod: ^4.4.3 (Typert host schema instances, same line as in-box host remotes).@deepseek-ai/dsh-tools latest is a STALE 0.0.1-rc.1; the real line is under the next tag (0.1.0-rc.x). This scaffold pins the next-tag version for you — never npm i @deepseek-ai/dsh-tools over it.@deepseek-ai/dsh-tools 的 latest 是过期的 0.0.1-rc.1,正确版本在 next tag。本脚手架已锁 next 版本,勿再手动 npm i 覆盖。@deepseek-ai/dsh-* package on the same 0.1.0-rc.x line so pnpm does not install two module copies.@deepseek-ai/cordis is a peerDependency: import only type { Context } where possible (erased at compile). At runtime the host hands you ctx — the Service base class import resolves through the profile's node_modules."type": "module"; build with module: esnext + moduleResolution: bundler to keep bare specifiers.dsh plugin add anchors relative paths to the INVOKING directory — run it from the parent directory, not from inside the plugin.@deepseek-ai/dsh* peer before mounting a bundle, and a rejected bundle is skipped without a word — no host log, no client bundle request, no settings row. If the plugin "does nothing at all" on a newer dsh line (the desktop app runs its own line, e.g. 0.2.0-rc.2), read package.json peer ranges FIRST, then grant the exact-version exemption (see Install).0.2.0-rc.2)上"毫无反应",先看 `package.json` 的 peer 范围,再考虑精确版本豁免(见安装节)。cordis.patch.yml, name is a package name (resolved via node_modules / $DSH_HOME/profiles/node_modules), not a relative path.ctx.tools.register() / ctx.on() auto-dispose on unload. Wrap your OWN resources (timers/connections) in ctx.effect(() => { acquire; return cleanup }).export const inject = ['tools'] makes the plugin wait until ctx.tools is ready.DEEPSEEK_API_KEY; without it --verify proves load/list/event, and the model call fails with MISSING_CREDENTIAL.