Skip to content

Releases

v1.5.3-lite

Choose a tag to compare

@github-actions github-actions released this 07 Nov 10:36

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。两个原因叠在一起:

  1. 切的位置不对。原分界在 House Rules 之前,于是 Scoped Rules(任务分类规则,8,165 字符)留在通用段里,只有 Routing 和 CTF 两节被切出去——占大头的分类规则一直在每轮发送。
  2. 切了不生效也没人知道。分段文件只认手放的那一份,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

Choose a tag to compare

@github-actions github-actions released this 07 Nov 10:19

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.js node --check 通过。
  • 84 条补丁表未触碰,--status 不受影响。

离线验证只证明注入文本正确,不等于模型行为已验证。升级后发两条消息对比 thinking 长度才算验证完。

升级

github: / 插件市场安装:点「更新」即可。

注意密文槽改动后出厂默认的哈希会变,而磁盘上已有的 $DSH_HOME/prompt-inject.md 属于用户文件,插件不会覆盖。想让新默认生效,二选一:

  1. 手动把 $DSH_HOME/prompt-inject.md 里那三处按上表改掉(改完重启)。
  2. 删掉该文件,让插件在下一次 apply 时重新从密文槽落下(会丢掉你自己改过的内容)。

只改 lib/default-prompt-inject*.md 不会生效——运行时读的是密文槽落盘的 prompt-inject.md。

已知边界

  • 锚点仍然要求思考以第一人称进行,只是不再要求每轮自报身份。
  • 思考长度不是可精确调的量:本版去掉的是无效自检(语言冲突、清单比对、边界回环),不是压缩产出规划。
  • 关闭注入开关时,本版全部改动都不生效——关就是原生装配。

v1.5.1-lite

Choose a tag to compare

@github-actions github-actions released this 07 Nov 10:02

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 归零,不含任何注入正文。
  • isInjectedName 10 个边界用例全对;lib/index.js / lib/anchor.js node --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

Choose a tag to compare

@github-actions github-actions released this 07 Nov 08:22

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 观察策略、#40 system-prompt、#67 agent-loop 缩进、#74 preStep 参数结构、桌面壳 #82 / #84 / #92。
  • 代码搬迁:#54 交付物提示词 → dsh-deliverable-file-references;#60 PTC/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 上):

  1. 在旧目录执行 node bin/dsh-purge.js --revert;
  2. 下载 dsh-purge-1.5.0-lite.zip,解压后整体替换 <DSH_HOME>/profiles/desktop/node_modules/dsh-purge;
  3. 执行 node bin/dsh-purge.js --apply --status;
  4. 重启 DSH。

用 github: 或插件市场安装的,点「更新」只替换插件文件、不会自动重打宿主补丁,更新完仍要走第 3、4 步。

同时把宿主升到 0.2.2-rc.1 时,还有三件事不在本插件职责内:

  1. 第三方 dsh-ops 0.4.4 声明 >=0.2.0-rc.2 <0.2.2-0,须先升到 0.5.0,否则 dsh-app-boot 会拒绝加载插件;
  2. 覆盖安装会还原 app.asar、摊掉已解包的 resources/app 与全部补丁,需重新解包后重打;
  3. app-update.yml 会恢复官方 nightly 源,要锁版本需再改回 disabled.invalid。

已知边界

离线验证只证明补丁正确写进宿主文件,不等于运行时模型行为已验证。升级后请发一条消息,确认注入正文仍生效、审批与沙箱按预期放行。桌面壳补丁在真实宿主上由 officialShellMain() 定位,离线验证时因找不到 exe 是单独按同一套替换引擎验证的。

v1.4.2-lite

Choose a tag to compare

@github-actions github-actions released this 07 Nov 07:44

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

Choose a tag to compare

@github-actions github-actions released this 07 Nov 03:42

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

Choose a tag to compare

@github-actions github-actions released this 06 Nov 16:47

1.4.0-lite

注入正文支持按模式分段;新增 ops_bash 前台超时上限的收紧命令。默认配置与 1.3.0 完全一致,不选模式就什么都没变。

为什么

两处实测出来的浪费:

  1. 注入正文 26 KB 每轮全量重发,其中约 6.8 KB 只有做渗透时才用得上(CTF 两段 + CANNED WORKFLOWS + web-pentest canned slots + WEB PENTEST ROUTING)。
  2. 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

Choose a tag to compare

@github-actions github-actions released this 06 Nov 16:19

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

Choose a tag to compare

@github-actions github-actions released this 05 Nov 02:24

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

Choose a tag to compare

@github-actions github-actions released this 05 Nov 02:17

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。