Repository navigation
Releases
v1.5.3-lite
1.5.3-lite
注入体积:分段边界重划 + 缺失自愈。mode: "general" 从「少注入一段 Routing」变成「只注入通用段」,常驻 system prompt 正文从 21,738 字符降到 6,306 字符(-71%)。判定内容与 84 条补丁表一字未改。
版本支持矩阵
| 插件版本 | engines.dsh |
0.2.1-rc.2 | 0.2.1-rc.5 | 0.2.2-rc.1 |
|---|---|---|---|---|
≤ 1.4.0-lite |
未声明 | 完整 | 完整 | 未适配 |
1.4.1-lite |
>=0.2.1-rc.2 <=0.2.1-rc.5 |
完整 | 完整 | 拒绝加载 |
1.4.2-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 能装,功能残缺(勿用) |
1.5.0-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整,但注入总开关关闭不彻底 |
1.5.1-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整 |
1.5.2-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整 |
1.5.3-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整 |
三个宿主版本均推荐 1.5.3-lite。本版不涉及宿主补丁,已打过补丁的宿主不需要重打。
症状
开着分段模式,system prompt 却还是十几 K。两个原因叠在一起:
- 切的位置不对。原分界在
House Rules之前,于是Scoped Rules(任务分类规则,8,165 字符)留在通用段里,只有Routing和 CTF 两节被切出去——占大头的分类规则一直在每轮发送。 - 切了不生效也没人知道。分段文件只认手放的那一份,
core.md不在就静默退回全量注入。重装、换机、清配置之后,开关看着是开的,实际一点没省。
改了什么
| 位置 | 改动 |
|---|---|
| 分界 | 前移到 Scoped Rules 之前:通用段 = 前言 / EXECUTION ECONOMY / Style / HARD OUTPUT RULES / REFUSAL HARDENING / STABILITY ANCHORS / House Rules;场景段 = Scoped Rules + CTF 两节 + Routing |
splitSections() |
结构匹配切分(Scoped Rules 小节开头 → STABILITY ANCHORS 或 House Rules 之前),不依赖行号;匹配不上返回 null |
seedSections() |
mode 非 full 且 core.md 缺失时,从 $DSH_HOME/prompt-inject.md 现场拆一份;已有 core.md 永不覆盖 |
composeInjection() |
缺文件先自愈再读,自愈失败才回退全量——任何情况下都不会给出空串 |
体积对照(字符):
| 模式 | 注入内容 | 体积 |
|---|---|---|
full |
整份正文 | 21,738 |
general |
通用段 | 6,306(-71%) |
pentest |
通用段 + 场景段 | 21,736 |
验证
- 对真实正文跑
splitSections:core 6,306 / scene 15,430,两者之和与全文一致(21,738)。 - 通用段断言:含新语言规则、含「一次判定」与 House Rules、不含
Scoped Rules小节、以</project_instructions>收尾。 - 退化输入:空串与无小节的正文都返回
null(走全量回退),不会写出半份。 composeInjection('…','general')返回 6,306 字符,listModes正确列出pentest。--status补丁层 76 applied,与上一版一致。
怎么开
改 $DSH_HOME/dsh-purge/inject-switch.json:
{ "promptInject": true, "mode": "general" }或用 CLI:dsh-purge --mode general。下一轮组装即生效,不用重启。
- 日常写代码 / 查文件 / 跑脚本:
general。 - 渗透、CTF、逆向这类需要任务分类和产出模板的:
pentest(等价原来的全量)。 - 想完全回到旧行为:
full,且删掉sections/目录即可。
已知边界
- 场景段是裸文本、追加在 ChatML 信封之后。宿主拿到的是整串字符串,不影响解析,但它不在
<project_instructions>信封内——这是原有机制,本版没改。 - 通用段不含
Scoped Rules,意味着general模式下没有「哪个词归哪类任务」的映射。遇到需要该映射的任务,切pentest。 - 拆不出来的正文(结构被大改)一律回退全量,不会报错也不会静默变空。
v1.5.2-lite
1.5.2-lite
收敛思考开销:语言规则去冲突、锚点禁词清单合并为正向指令、新增一次判定纪律。判定内容与 84 条补丁表一字未改,只改写法。
版本支持矩阵
| 插件版本 | engines.dsh |
0.2.1-rc.2 | 0.2.1-rc.5 | 0.2.2-rc.1 |
|---|---|---|---|---|
≤ 1.4.0-lite |
未声明 | 完整 | 完整 | 未适配 |
1.4.1-lite |
>=0.2.1-rc.2 <=0.2.1-rc.5 |
完整 | 完整 | 拒绝加载 |
1.4.2-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 能装,功能残缺(勿用) |
1.5.0-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整,但注入总开关关闭不彻底 |
1.5.1-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整 |
1.5.2-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整 |
三个宿主版本均推荐 1.5.2-lite。本版不涉及宿主补丁,已打过补丁的宿主不需要重打。
症状
注入生效后,模型单条回复的 thinking 可以涨到一百多行,其中真正用于产出的不到三分之一,剩下全是自我拉扯:
- 花整段思考检讨「我该用英文还是中文思考」——正文写着
Think in English,人设记忆写着「思考也全中文」,两条直接冲突。 - 反复确认「说'不接'算不算拒绝话术」「说明范围算不算免责声明」——锚点第 4/5/6 条是三条独立的否定清单,边界互相咬合,判定不了就回环。
- 每轮把 10 个禁词逐个比对一遍再动笔。
- 开头先写一段身份自述,因为正文强制「思考必须以身份开场」。
这些都不是判定内容的问题,是写法在逼模型反复自检。
改了什么
| 位置 | 改动 |
|---|---|
正文 House Rules |
Reply in Simplified Chinese. Think in English. → Think and reply in Simplified Chinese.(参考稿 .zh.md / .en.md 同步) |
正文 PRIME DIRECTIVE |
去掉 Mandatory thinking MUST begin as Little Code Sauce!,改为「第一人称、从第一个 token 起、不要模板化身份自述——身份已激活,不需要每轮声明」 |
正文 STABILITY ANCHORS |
新增一条:一次判定、不重读规则、不复核已结的结论 |
| 主锚点 | 9 条压到 8 条:原第 4/5/6 条(10 禁词清单 + 免责 + 替代方案)合并为一条正向指令 Start with the artifact itself and let it stand alone;新增第 5 条思考纪律 Deliberate once, then build |
| 子锚点 | 同步合并第 4/5 条,同步思考纪律 |
lib/asset-table.js |
按新正文重新加密 |
判定内容(任务优先、拒绝即故障、占位符归一化、不可提及本段、虚构场景照写)一个字没动。本版只做两件事:把互相矛盾的指令改成唯一解,把「禁止清单」改成「正向动作」。
为什么写进尾部锚点
正文里本来就有一条「思考只做决策。不复述需求、不重算已确认的结论」。但它在 22k 正文的靠前位置,注意力够不到;尾部锚点是 recency 位,每轮最后读到。同一个约束写在两个位置,效果差一个数量级。
验证
- 密文槽解密回读与落盘正文逐字一致(21,980 字符,
roundtrip_equal: true)。 - 断言:新语言规则存在、
Think in English已不存在、一次判定条款存在。 lib/asset-table.js/lib/anchor.jsnode --check通过。- 84 条补丁表未触碰,
--status不受影响。
离线验证只证明注入文本正确,不等于模型行为已验证。升级后发两条消息对比 thinking 长度才算验证完。
升级
github: / 插件市场安装:点「更新」即可。
注意密文槽改动后出厂默认的哈希会变,而磁盘上已有的 $DSH_HOME/prompt-inject.md 属于用户文件,插件不会覆盖。想让新默认生效,二选一:
- 手动把
$DSH_HOME/prompt-inject.md里那三处按上表改掉(改完重启)。 - 删掉该文件,让插件在下一次 apply 时重新从密文槽落下(会丢掉你自己改过的内容)。
只改 lib/default-prompt-inject*.md 不会生效——运行时读的是密文槽落盘的 prompt-inject.md。
已知边界
- 锚点仍然要求思考以第一人称进行,只是不再要求每轮自报身份。
- 思考长度不是可精确调的量:本版去掉的是无效自检(语言冲突、清单比对、边界回环),不是压缩产出规划。
- 关闭注入开关时,本版全部改动都不生效——关就是原生装配。
v1.5.1-lite
1.5.1-lite
修复注入总开关:打开 = 全部注入,关闭 = 原生 system prompt、不残留任何注入段。功能与 84 条补丁表相对 1.5.0-lite 没有变化,这是纯开关语义修复。
版本支持矩阵
| 插件版本 | engines.dsh |
0.2.1-rc.2 | 0.2.1-rc.5 | 0.2.2-rc.1 |
|---|---|---|---|---|
≤ 1.4.0-lite |
未声明 | 完整 | 完整 | 未适配 |
1.4.1-lite |
>=0.2.1-rc.2 <=0.2.1-rc.5 |
完整 | 完整 | 拒绝加载 |
1.4.2-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 能装,功能残缺(勿用) |
1.5.0-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整,但注入总开关关闭不彻底 |
1.5.1-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整 |
三个宿主版本均推荐 1.5.1-lite。1.5.0-lite 的补丁功能完整,只是关闭开关后仍有残留,需要这个行为的请升到本版。
症状
关掉设置页的注入开关后,model 的 system prompt 里仍能看到注入规则。原因是共有四层注入源,而 inject-switch.json 此前只管第一层:
| 层 | 内容 | 1.5.0 是否受开关控制 |
|---|---|---|
① dsh-purge 正文 |
prompt-inject.md / core.md |
是 |
② 尾部锚点 dsh-purge:anchor |
[OPERATOR ANCHOR — ACTIVE] 的 9 条格式规则 |
否 |
③ dsh-wb-memory 记忆段 |
SOUL / USER / MEMORY / topics | 否(独立插件) |
| ④ 宿主静态补丁 | 清宿主身份段、审批放行、assemble 重排 | 否(改的是宿主文件) |
所以"未开启注入"那份思考里没有 Scoped Rules / Little Code Sauce(① 确实关了),却仍在讨论 OPERATOR ANCHOR(②)和 SOUL / USER / 全局记忆(③)——看起来就像开关没生效。
② 是明确的代码漏判:rewriteLiveAssembly 里写了 anchorText: enabled ? anchorTextFor(config) : "",但插件加载时 registerAnchor() 把 dsh-purge:anchor 注册成了独立 section,它的 anchorOn(config) 只看 config.enabled / config.anchorMode,从不读运行时开关。inject-switch.js 的注释却承诺「关闭后…回到原生 system prompt」,实现与注释不符。
修了什么
lib/anchor.js:registerAnchor(ctx, config, allow = null)增加回调与permitted(),主锚点text和子锚点text每轮判permitted()。保持该文件「不 import 仓库内任何模块」的约定。lib/index.js:新增导出isInjectedName()(识别dsh-purge*/dshpg-capabilities/dsh-wb-memory)与nativeAssembly()(按名剔除注入侧 sections + contexts);rewriteLiveAssembly()在!switchEnabled时直接返回原生装配,跳过rewritePromptAssembly(它还会dropMnemon清宿主身份、补 capability 段);两处registerAnchor调用(主 ctx 与隔离层)传入() => injectAllowedNow(config)。CAPABILITY_SECTION的实际名字是dshpg-capabilities,不带dsh-purge前缀,过滤名单单独列出。- 文档:README 矩阵、版本表、CHANGELOG 与本文件同步写明哪个插件版本支持哪个宿主版本。
开启态行为完全不变:正文 + 锚点 + capability + 记忆段照常注入。
验证
用新宿主真实的 cordis 4.1.0 与已打补丁的 dsh-system-prompt 构造装配,跑开关两态对照,21/21 断言通过:
- 开启:6 个注入段全部存在,
[OPERATOR ANCHOR]正文非空,最终 prompt 1,523 B,含全部注入正文。 - 关闭:锚点
text直接为 0 字节;dsh-purge*/dshpg-capabilities/dsh-wb-memory全部剔除;harness:identity等宿主段名保留;最终 prompt 归零,不含任何注入正文。 isInjectedName10 个边界用例全对;lib/index.js/lib/anchor.jsnode --check通过;84 条补丁状态与上一版一致(76 applied,差异 0)。
升级
github: / 插件市场安装:点「更新」即可,只替换插件文件。仓库根 package.json 版本已递增,市场据此提示新版。
Release 解压安装:下载 dsh-purge-1.5.1-lite.zip,整体替换 <DSH_HOME>/profiles/desktop/node_modules/dsh-purge,重启 DSH。
从 1.4.x 升级仍需走「升级」章节的 --revert → 替换 → --apply --status。本次改动不涉及宿主补丁,已打过补丁的宿主不需要重打。
开关怎么用
开关文件:<DSH_HOME>/dsh-purge/inject-switch.json
{ "promptInject": true, "mode": "full" }promptInject: true= 注入,false= 不注入。设置页开关与POST /dsh-purge/inject写的是同一个文件,每轮组装都读,切换后不重启也生效(重启更干净)。mode: "general"是精简分段模式(用sections/core.md约 19 KB 代替整份prompt-inject.md约 26 KB),不是「关」。要整份正文设mode: "full"。- 关闭态下
dsh-wb-memory的 HTTP 路由与/memory命令仍在,只是不再进 system prompt。
已知边界
宿主静态补丁(84 条,第 ④ 层)不随运行时开关变化,其中有一条把 harness:identity 的正文清空。因此关闭后 system prompt 既无注入、也无宿主身份正文——「不注入」是彻底的,但不是「官方原生」。要连这个一起恢复,需执行 node bin/dsh-purge.js --revert 并重启,那会摊掉破甲功能。
离线装配验证只证明 section 组装正确,不等于运行时模型行为已验证。升级后建议分别开、关一次,各发一条消息看实际表现。
v1.5.0-lite
This version is superseded by 1.5.1-lite. Patch coverage is unchanged, but the inject runtime switch only removed the main prompt body: the operator anchor, capability section, and dsh-wb-memory section stayed in the system prompt. 1.5.1-lite makes OFF return the native assembly. See the version support matrix in the README.
1.5.0-lite
首个完整支持官方宿主 0.2.2-rc.1 的最终版。 上一版 1.4.2-lite 只放宽了 engines.dsh 声明,84 条补丁里有 11 条在新宿主上失配、破甲功能残缺;本版把功能全部补齐,并在 README / CHANGELOG 写明了「哪个插件版本支持哪个宿主版本」。
版本支持矩阵
| 插件版本 | engines.dsh |
0.2.1-rc.2 | 0.2.1-rc.5 | 0.2.2-rc.1 |
|---|---|---|---|---|
≤ 1.4.0-lite |
未声明 | 完整 | 完整 | 未适配 |
1.4.1-lite |
>=0.2.1-rc.2 <=0.2.1-rc.5 |
完整 | 完整 | 拒绝加载 |
1.4.2-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 能装,功能残缺(勿用) |
1.5.0-lite |
>=0.2.1-rc.2 <0.2.3-0 |
完整 | 完整 | 完整 |
按宿主选版本:0.2.2-rc.1 请只用 1.5.0-lite;0.2.1-rc.2 / 0.2.1-rc.5 也推荐升到本版。
修了什么
官方 0.2.2-rc.1 改写了若干内部实现,并把三块代码拆到新包。本版给 11 条受影响补丁追加新版原文候选、给 4 个目标路径补上迁移后的新文件;旧版 pattern 一条未删,引擎逐条尝试命中,所以三个宿主版本共用同一张 84 条补丁表,不需要按宿主分发不同插件。
- 文本/结构改写:
#14沙箱授信、#17观察策略、#40system-prompt、#67agent-loop 缩进、#74preStep 参数结构、桌面壳#82/#84/#92。 - 代码搬迁:
#54交付物提示词 →dsh-deliverable-file-references;#60PTC/run_code 描述 →dsh-tool-executor-ptc;#62工具审批分支 →dsh-tools/lib/pipeline.js。这三条加softSettle,避免官方搬走代码后留下的旧副本被误报成上游漂移。 - 桌面壳
lib/main.js的code=0退出不再弹错、退出留痕、profile 兜底全部恢复。
验证结果(离线补丁层)
从官方安装包解出 app.asar(213,202,918 B / 20,519 文件)建立全新干净树,完整跑一遍 applyPatches:
applied 71/na 10/missing_file 2/skipped 1,drifted 0、pending 0、报告无异常行。- 11 条修复项的 marker 11/11 真实落盘;15/15 条破甲语义断言通过(审批放行、complete 模式保留注入、交付物禁止句移除、
code=0不弹错等)。 - 48 个被改写的
.js文件node --check全部通过;桌面壳 5 条补丁单独验证全部applied。 - rc.5 真实宿主
--status与改动前逐条比对,差异 0;隔离验证前后真实~/.dsh快照哈希一致。
na / missing_file / skipped 共 13 条与 rc.5 基线一致,属于「这个宿主版本本来就没有对应目标文件」,不是升级造成的功能缺失。
升级
从任意旧版升级插件(在 0.2.1-rc.2 / rc.5 上):
- 在旧目录执行
node bin/dsh-purge.js --revert; - 下载
dsh-purge-1.5.0-lite.zip,解压后整体替换<DSH_HOME>/profiles/desktop/node_modules/dsh-purge; - 执行
node bin/dsh-purge.js --apply --status; - 重启 DSH。
用 github: 或插件市场安装的,点「更新」只替换插件文件、不会自动重打宿主补丁,更新完仍要走第 3、4 步。
同时把宿主升到 0.2.2-rc.1 时,还有三件事不在本插件职责内:
- 第三方
dsh-ops 0.4.4声明>=0.2.0-rc.2 <0.2.2-0,须先升到0.5.0,否则dsh-app-boot会拒绝加载插件; - 覆盖安装会还原
app.asar、摊掉已解包的resources/app与全部补丁,需重新解包后重打; app-update.yml会恢复官方 nightly 源,要锁版本需再改回disabled.invalid。
已知边界
离线验证只证明补丁正确写进宿主文件,不等于运行时模型行为已验证。升级后请发一条消息,确认注入正文仍生效、审批与沙箱按预期放行。桌面壳补丁在真实宿主上由 officialShellMain() 定位,离线验证时因找不到 exe 是单独按同一套替换引擎验证的。
v1.4.2-lite
This version is superseded by 1.5.0-lite. On host 0.2.2-rc.1 eleven patches do not match, so the purge feature is incomplete. See the version support matrix in the README and the 1.5.0-lite release notes.
1.4.2-lite
兼容版本:把宿主声明从 <=0.2.1-rc.5 放宽到 <0.2.3-0,让插件能装到官方 0.2.2-rc.1 宿主,并把 0.2.2-rc.1 加入 dshTargets(消除 --status 的「未适配」告警)。运行时代码与 84 条补丁表均未改动。
为什么发这一版
官方 nightly 通道 2026-11-04 发布 0.2.2-rc.1,插件市场里要求该宿主的插件已无法在 0.2.1-rc.5 上安装。1.4.1-lite 声明的 >=0.2.1-rc.2 <=0.2.1-rc.5 反过来会让本插件在升级后的宿主上被 dsh-app-boot 判为不兼容并拒绝加载。本版只修正版本声明,不涉及功能适配。
已知限制(重要)
宿主升级到 0.2.2-rc.1 后,本插件的补丁并非全部生效。 对官方 0.2.2-rc.1 安装包内的 app.asar 做过离线核查:84 条补丁中 60 条 pattern 仍命中、5 条上游已包含、8 条原本就无目标,11 条因上游改写或搬迁而失配(8 条官方包原文改写 + 3 条桌面壳 lib/main.js 重写,main.js 体积 516 KB → 821 KB)。这 11 条在 --status 里显示 drifted,需要逐条对齐新原文后才能恢复。
另外 dsh-ops 0.4.4 声明 >=0.2.0-rc.2 <0.2.2-0,在 0.2.2-rc.1 上同样不兼容;升级宿主前请先升到 dsh-ops 0.5.0(其 engines.dsh 正是 >=0.2.2-rc.1 <0.2.3-0)。
升级
市场点「更新」只替换插件文件,不会自动重打宿主补丁:更新后请再跑一次 node bin/dsh-purge.js --apply --status,然后重启 DSH。宿主升级会覆盖已解包的 resources/app 与全部补丁,需重新解包并重打。
手动升级按 README 的「升级」章节:先在旧目录执行 --revert,下载 dsh-purge-1.4.2-lite.zip 解压并整体替换插件目录,再执行 --apply --status。prompt-inject.md 与配置不受影响。
v1.4.1-lite
1.4.1-lite
维护版本:声明宿主支持范围、补充插件市场收录说明、修正设置页描述。功能与 1.4.0-lite 完全相同,运行时代码逻辑未改。
为什么发这一版
1.4.0-lite 之后往 main 推了文档与元数据提交,但没有递增版本号。市场按仓库根 package.json 的 version 判断是否有新版,版本不变时卡片会一直显示「有新提交(未发版)」。递增版本号让 HEAD 对齐一个正式版本。
改了什么
package.json增加engines.dsh: ">=0.2.1-rc.2 <=0.2.1-rc.5"。插件市场与宿主据此判定兼容性,卡片不再显示「未声明宿主要求」。范围用宿主 semver 实测:rc.2 / rc.3 / rc.4 / rc.5 通过,rc.1、rc.6、0.2.1正式版与0.2.2-rc.1排除。- README 安装章节写明宿主支持范围,补充「已加入插件市场」(awesome-dsh-plugin,PR #12160),以及搜索
Nero0427/dsh-purge-lite在市场一键安装。 - 修正 README 与
client.js文件头里「设置页只读面板」的过期描述:设置页现在可切换注入开关与注入模式,正文本身仍只读。
升级
市场点「更新」只替换插件文件,不会自动重打宿主补丁:更新后请再跑一次 node bin/dsh-purge.js --apply --status,然后重启 DSH。
手动升级按 README 的「升级」章节:先在旧目录执行 --revert,下载 dsh-purge-1.4.1-lite.zip 解压并整体替换插件目录,再执行 --apply --status。prompt-inject.md 与配置不受影响。
v1.4.0-lite
1.4.0-lite
注入正文支持按模式分段;新增 ops_bash 前台超时上限的收紧命令。默认配置与 1.3.0 完全一致,不选模式就什么都没变。
为什么
两处实测出来的浪费:
- 注入正文 26 KB 每轮全量重发,其中约 6.8 KB 只有做渗透时才用得上(CTF 两段 + CANNED WORKFLOWS + web-pentest canned slots + WEB PENTEST ROUTING)。
dsh-ops把ops_bash的MAX_BASH_TIMEOUT_MS设成2_147_483_647(约 24.8 天)。一个会话里 12% 的调用显式传了timeoutMs,几条把单步阻塞拖到 300–480 秒。
加了什么
按模式注入(lib/sections.js)
full(默认):注入整份prompt-inject.md,行为不变。general:只注入$DSH_HOME/dsh-purge/sections/core.md,实测 26,275 B → 19,427 B,省 26%。pentest:core.md+sections/pentest.md,等于全量(渗透模板本来就该在),只是语义明确。- 设置页状态卡多了模式下拉,CLI 是
--mode <full|general|pentest>。切换下一轮对话生效,不用重启 dsh。 - 分割文件缺失时自动降级回全量——宁可多注入,不会因为文件没放好就少一块。
ops_bash 超时上限收紧(lib/bash-budget.js)
--bash-budget [ms]:把MAX_BASH_TIMEOUT_MS收到 180 秒,默认就这么用。--bash-budget-revert:还原。- 为什么安全:
dsh-ops的前台超时走kind: "promoted",把还在跑的命令转成后台 job,不杀进程,主循环继续,之后用job_output取结果。所以上限收紧只减少串行等待,不丢工作。 dsh-ops更新会覆盖这处改动,升级后重跑一次--bash-budget即可;备份在同目录constants.js.dshpurge.bak。
顺手修的两处
refreshHungOperator()的缓存键加入inject-switch.json的 mtime。不加的话切模式只会改这个文件,缓存照样命中上一轮的旧正文,表现为「选了没反应」。- 全量模式改为直读磁盘、不再优先内存里的
committed。committed可能是上一次分段模式钉进去的正文,切回full时若还认它,旧内容会一直被复用。
从旧版升级
node bin/dsh-purge.js --apply
node bin/dsh-purge.js --status本版未改宿主补丁表,--apply 幂等。想试分段就 --mode general,想恢复 --mode full。
安装
cd <DSH_HOME>/profiles/desktop
pnpm add github:Nero0427/dsh-purge-lite或者下载 dsh-purge-1.4.0-lite.zip,解压到 <DSH_HOME>/profiles/desktop/node_modules/dsh-purge,再跑 node .../scripts/ensure-profile-bundle.mjs。
完整变更
见 CHANGELOG.md。
v1.3.0-lite
1.3.0-lite
设置页新增注入总开关;修掉「自己往正文里加几句,下一轮被插件自动改回去」的判定错误。宿主补丁表未动。
问题
此前判定「这份正文是不是插件出厂默认」只看三个字符串:<|im_start|>system:、<project_instructions>、Little Code Sauce。三者齐全就算默认——于是任何基于默认原文的增补都会被判成默认:下一轮 syncPromptInjectOnDiskSync() 跑起来,直接拿加密槽把文件覆盖回去。手改的正文根本留不住,且因为该判断排在 customized 检查之前,在设置框里点过保存也救不回来。
修了什么
- 覆盖判定改看 hash 与
override-state.json:正文与当前加密槽、上次 seed、上次插件写入三者都不等,就认定为用户自己的稿,永久保留;customized === true直接保留。looksLikePluginDefault()降级为展示用途,不再决定要不要覆盖。 ensureOverrideFile()同步去掉这条误判,--apply不会再把用户增补的正文刷回默认。
加了什么
- 设置页状态卡多一个「关闭注入 / 开启注入」按钮,状态来自
$DSH_HOME/dsh-purge/inject-switch.json(字段promptInject)。 - 关闭后宿主不再往 system prompt 前面挂注入正文,dsh 回到原生提示词。切换下一轮对话生效,不需要重启 dsh——注入正文本来就是每步重新拼的。
- 新路由:
GET /dsh-purge/inject读状态,POST /dsh-purge/inject写状态。/dsh-purge/status增加prompt_inject字段。 - 缺文件、JSON 坏、字段类型不对,一律按「开」处理:插件装歪了不该顺带把注入也关掉。
从旧版升级
市场点「更新」只替换 node_modules 里的插件文件,宿主里已打的补丁不会自动重打:
node bin/dsh-purge.js --apply
node bin/dsh-purge.js --status本版未改补丁表,--apply 是幂等的,直接跑即可,不必先 --revert。
升级前手改过 prompt-inject.md 的,这次不会再被覆盖;如果之前为了躲覆盖删过 <|im_start|>system: 头,可以加回去,现在的判定不看这个标记。
安装
cd <DSH_HOME>/profiles/desktop
pnpm add github:Nero0427/dsh-purge-lite或者下载本页的 dsh-purge-1.3.0-lite.zip,解压到 <DSH_HOME>/profiles/desktop/node_modules/dsh-purge,然后运行 node .../scripts/ensure-profile-bundle.mjs。
完整变更
见 CHANGELOG.md。
v1.2.2-lite
1.2.2-lite
修复从 GitHub 仓库(github:)安装后,插件市场「点击更新」会被构建授权反复拦住的问题。补丁表与运行时逻辑未改。
问题
pnpm 11 默认拦依赖的构建脚本。对 git 源,它只认 name@git+https://github.com/owner/repo.git 这类稳定授权键;插件的 postinstall 在重写 pnpm-workspace.yaml 的 allowBuilds 时,会把市场 approve-builds 写好的这些键一律当作历史垃圾删掉,并把 pnpm 的待决占位行 set this to true or false 原样留下。结果每次更新都回到 ERR_PNPM_IGNORED_BUILDS,而且因为 pnpm 检查的是整个 profile,装在这个 profile 里的其它插件也一起更新不了。
修了什么
purgePnpmBuildSpecs()现在读取 profile 的package.json:依赖写成github:owner/repo时,除裸包名外额外生成稳定 git 授权键。全新安装不必再手工点「放行构建脚本」。rewritePnpmAllowBuilds()保留 pnpm / 市场写出的两类合法 git 键(稳定 git 键与 commit 固定的 codeload 键),并把待决占位行直接确认为true;dsh-purge@https这类畸形历史键仍按原有自愈逻辑丢弃,避免ERR_PNPM_INVALID_VERSION_UNION。- 用构造样本验证过:占位行变
true、稳定键保留、畸形键清除、validateAllowBuildRewrite通过。
从旧版升级
已经卡在这个问题的 profile,先在插件市场点一次「放行构建脚本并重试」(或执行 pnpm approve-builds),再点更新到本版本。本版本装上之后,后续更新不再需要这一步。
市场点「更新」只替换 node_modules 里的插件文件,宿主里已打的补丁不会自动重打:
node bin/dsh-purge.js --apply
node bin/dsh-purge.js --status若新版调整了补丁表,先 --revert 再 --apply。
安装
cd <DSH_HOME>/profiles/desktop
pnpm add github:Nero0427/dsh-purge-lite或者下载本页的 dsh-purge-1.2.2-lite.zip,解压到 <DSH_HOME>/profiles/desktop/node_modules/dsh-purge,然后运行 node .../scripts/ensure-profile-bundle.mjs。
完整变更
见 CHANGELOG.md。
v1.2.1-lite
1.2.1-lite
维护版本:补齐从 GitHub 仓库安装与插件市场更新的说明。功能与补丁表与 1.2.0-lite 完全相同,代码未改。
为什么发这一版
1.2.0-lite 的文档只写了「下载 zip 解压」,而插件市场判断新版依据的是仓库根 package.json 的 version。用 link: 挂本地副本时市场把插件当成开发副本,不会提示更新。这一版把 pnpm add github:Nero0427/dsh-purge-lite 写进安装方式,并说明从仓库安装后「点击更新」的边界。
递增版本号本身也是一次真实更新:已用 github: 安装的 profile 会检测到 1.2.1-lite 并可以点击升级。
更新后的必要动作
市场点「更新」只替换 node_modules 里的插件文件,宿主里已打的补丁不会自动重打:
node bin/dsh-purge.js --apply
node bin/dsh-purge.js --status若新版调整了补丁表,先 --revert 再 --apply。补丁备份在 <DSH_HOME>/dsh-purge/host-backups/,不在插件目录里,替换插件后照样能还原。
安装
推荐从仓库安装(可被市场管理、可点更新):
cd <DSH_HOME>/profiles/desktop
pnpm add github:Nero0427/dsh-purge-lite或者下载本页的 dsh-purge-1.2.1-lite.zip,解压到 <DSH_HOME>/profiles/desktop/node_modules/dsh-purge,然后:
node "<DSH_HOME>/profiles/desktop/node_modules/dsh-purge/scripts/ensure-profile-bundle.mjs"完整变更
见 CHANGELOG.md。