dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness 插件:文件增量挂载 + 重复读取去重。记录每个文件哪些行范围已经进入模型上下文,重复读取只补缺失的部分;文件在磁盘上变化时按行级对比只补改动的行;并用「挂载文件」仪表盘实时展示账本。
移植自 piwpi 的 context-mount 机制。
Agent 会反复读同一个文件:刚看过一眼的实现,改两行再看一次;或者换个窗口范围再读一遍。每一次都是完整的 token 开销,而其中绝大部分内容模型刚刚才看过。
这个插件把「读过什么」记成账本。第二次之后的读取只把真正缺失或改动的行送进上下文,重复的部分换成一行去重说明——省下的是上下文,也是钱。

file_mount_forget 工具让模型能主动强制重读。statsFile)。一个包两面:dsh.bundle.patch 挂载宿主插件行,dsh.client manifest 让 Web 端扫描出浏览器半部。装进 profile 后必须重启 harness(刷新页面不够)。需要本机有 pnpm(dsh plugin 转调它)和 Node ^22.19 || >=24。
npx --yes @deepseek-ai/dsh plugin --profile web add https://github.com/acefun29/dsh-file-mount/releases/latest/download/dsh-file-mount.tgz
npx --yes @deepseek-ai/dsh --profile web
已有全局 dsh 时,第一行换成 dsh plugin --profile web add <同一个地址>。装的是预构建包:不走 npm,也不需要 allowBuilds。
DSH 桌面版用的是 desktop profile,把命令里的 --profile web 换成 --profile desktop 即可。改完源码要让已装进 profile 的那份生效,用 pnpm dsh:install 重装——安装器默认只装 web profile,PowerShell 里先设 $env:DSH_PROFILE = 'desktop' 再跑即切到桌面 profile。
若 npx @deepseek-ai/dsh 长时间没输出,多半在拉 CLI(首次要下整棵依赖树),等它结束即可。
pnpm dsh:install
安装器会构建、打包 tarball,再用 file:E:/...tgz 交给 pnpm。
Windows 注意:不要对目录路径用
dsh plugin add .或file:E:\...(反斜杠)。pnpm 会把盘符拼进 profile 目录(profile\E:\...),插件装上但不激活。安装器已经处理了这个坑。
pnpm run build
npm pack --ignore-scripts
dsh plugin --profile web add file:$(pwd)/dsh-file-mount-$(node -p "require('./package.json').version").tgz
Windows PowerShell:
pnpm run build
npm pack --ignore-scripts
$Tgz = ((Get-Location).Path -replace '\\','/') + "/dsh-file-mount-$((Get-Content package.json -Raw | ConvertFrom-Json).version).tgz"
npx --yes @deepseek-ai/dsh plugin --profile web add "file:$Tgz"
不要用 github:acefun29/dsh-file-mount 装源码:仓库不含 lib/,包也已去掉 prepare。请用上面的 Release 或安装器。
在 profile 的插件行里写 config,例如:
- id: file-mount
name: dsh-file-mount
config:
excludeGlobs: ['**/node_modules/**']
statsFile: ./dsh-file-mount-stats.json
全部键(含默认值):
| 键 | 默认 | 说明 |
|---|---|---|
enabled | true | 总开关;关闭后所有读取原生透传 |
capacity | 32 | 文件身份缓存容量(挂载中的文件被钉住,不受淘汰影响) |
ttlMs | 300000 | 缓存安全阀:同一 stat 内容被改的兜底重读间隔 |
maxPinnedFiles | 256 | 单个会话最多钉住多少个挂载文件 |
minSavedTokens | 16 | 去重/增量的净收益低于此值则原生透传且不写账本(也不计入安全阀次数) |
maxFingerprintBytes | 1000000 | 超过此大小的文件不留行级底稿(改动时先识别纯追加只补尾巴,否则整本重挂) |
maxManagedBytes | 16777216 | 超过此大小的文件不接管,原样放行 |
excludeGlobs | [] | 命中的路径永远原样放行 |
statsFile | 无 | 可选:跨会话总账落盘路径 |
freshnessEnabled | true | 新鲜度总开关 |
freshnessThreshold | 0.6 | 新鲜度分数低于此值判为过期 |
safeRatio | 0.95 | 窗口压力为 0 的阈值比例(Lsafe = safeRatio × W) |
safeTokens | 无 | 直接给 Lsafe 绝对值;设置后优先于 safeRatio |
pinAfter | 1 | 过期几次后钉住(钉住的段不再被摘除) |
contextWindow | 128000 | 会话未报告窗口时的默认窗口 W |
resendBudget | 无 | 大于此 token 的段本轮不摘除 |
valveReads | 2 | 重读安全阀:连续拦截达到此次数触发原生透传重读(0 = 关闭) |
插件挂在 tools/post-execute 拦截面,按工具名分流:
N: 行号,与原生 read 对齐;cancel 清 inbox 最多丢掉账本纸条,下次当没挂过再发),纸条只留 head-only 账本声明;hash 变化时拿行级底稿做 diff,只补改动的行(没动的行号平移;中段过大时用唯一行锚点切分 LCS);没底稿的超大文件先识别纯追加(前缀哈希匹配则旧坐标恒等、只补新尾巴,旧末行无换行符被续写时该行一并重发),都不行才整本重挂。首次挂载仍保留原生 read 正文 + head-only 纸条。行级底稿的切分严格镜像 read 工具(含 UTF-8 BOM 剥除与 CRLF 折叠),指纹是仅存在内存中的 53 位快速哈希(不进协议、不落盘)。after)时,会先与磁盘逐行指纹比对:不一致(比如 format-on-save 钩子改写了文件)则不免单、不记账,下次读按新文件重新锚定——模型没见过的内容不会被藏起来。user/message 事件),恢复重放与浏览器折叠共用同一载体、同一套合并规则(mount-source.ts)。{kind:'plugin', plugin:'compact'} 的 sourceEventSeqs),被 shadow 的挂载消息不再计入账本。file_mount_forget 工具主动作废某个文件的账(强制重读)。去重 marker 会提示:上文找不到内容时,先 forget 再 read。seq,按它在当前上下文中的位置判断是否还适合去重。接近窗口上限时,越靠前的内容越容易被摘账,下次读取会重发;过期一次后钉住。压缩才会真正把内容移出上下文。另有重读安全阀(连续全覆盖去重达到次数后放行原生 read)。新鲜度不提供界面调节。路径身份:账本用绝对路径 + realpath(软链接统一到真实文件)+ 大小写折叠(按文件系统实测,Windows/Mac 默认折叠)。模型可见的纸条 head 用相对工作目录的路径(正斜杠),工作目录取自会话 header.cwd,没有则用 dsh-fs-local 的 cwd。
| 插件版本 | DSH |
|---|---|
0.9.0 | 0.2.1-rc.2(npm latest 线;兼容判定自 0.2.1 起以 engines.dsh 为主,peers 同步提升;平台模块表实测新增 zod 与 @tanstack/react-virtual;类型检查 / 242 项测试 / 构建 / 产物级客户端冒烟 / dsh profile 实装与 evaluatePluginCompatibility 判定均已核验) |
0.8.1 | 0.2.0-rc.2(桌面版线;账本 source 成员瘦身以缓解格式升级拒载风险,并给 read/write/edit 的形状漂移加每会话一次告警) |
0.8.0 | 0.2.0-rc.2(桌面版线;peerDependencies 声明 ^0.2.0-rc.2,类型检查 / 单测 / 构建与产物级客户端冒烟均已核验,并把构建产物装进桌面 profile 比对哈希) |
0.7.0 | 0.1.5-rc.1 及以上,包括 0.1.7 的会话格式 v4(在 0.1.7-rc.2 上实测) |
0.5.1–0.6.0 | 0.1.5-rc.1 及以上(在 0.1.5-rc.2 上实测) |
≤0.5.0 | 0.1.0-rc.5 时代的 DSH;Session.events 被移除(0.1.2-alpha.4)之后不再适用 |
插件同时对接两侧契约:宿主侧的 tools/post-execute 拦截面与 read/write/edit 的 canonical value;浏览器侧的插槽(conversation.view)与会话快照布局。
升级 DSH 后先跑一遍测试。压缩 checkpoint 形状、工具结果形状、客户端快照布局这几处耦合点都由测试钉死(pnpm test),DSH 改形状时会立刻报警——真机上「页面空白」这类只改语义不改名字的变更,更是只有实跑才能发现。客户端半另有一条产物级冒烟(pnpm run smoke:client):用 DSH 冻结的模块表加载构建后的 lib/client.js,走一遍注册槽 + 真实 React 渲染 + 焦点请求 ack,任何越表 require 都会立即报错。
sourceEventSeqs 识别并跳过,下一次读取重新锚定。maxManagedBytes 的文件与 excludeGlobs 命中的路径不接管,原样放行(不做抽检:抽检有「改了没看出来」的风险)。sidebar.panellist / main 注册全局面板,跨会话视图有望解锁。excludeGlobs 配排除名单(如 **/node_modules/**),maxManagedBytes 配大文件上限;名单外/超大文件原样放行。file_mount_forget 工具作废该文件的账,下次读整本重发。去重结果里也会写明:上文找不到就先 forget 再 read。statsFile 后自动累计到该文件,可通过 fileMount.stats() 读取(界面展示暂缓)。dsh.profile.bundles。改用 Release 包或 pnpm dsh:install,然后重启 harness。npx @deepseek-ai/dsh plugin add … 一直没输出? npx 在拉完整 CLI 包,可能要好几分钟。安装请用 GitHub Release 的 dsh-file-mount.tgz 地址;本仓库开发用 pnpm dsh:install。pnpm install
pnpm test # vitest(242 用例:单元 + 真实 read/write 循环集成 + 持久化往返 + 压缩感知 + 新鲜度 + 客户端组件 + 安装契约 + 账本降级契约 + 形状守卫)
pnpm typecheck # tsc --noEmit
pnpm run build # tsc + tsdown(lib/index.js / lib/client.js)
pnpm dsh:install # 打包 tarball 并装进本机 web profile(Windows 可用;源码比产物新时会自动重建)
打 GitHub Release:打 v* 标签并 push,CI 会上传稳定文件名 dsh-file-mount.tgz(releases/latest/download/dsh-file-mount.tgz)。暂不发布 npm。
MIT