• v1.4.1 0cf8a84f1f

    wqmll released this 2026-10-19 12:29:24 +08:00 | 0 commits to main since this release

    1.4.1 — 修「装完就用不了」的 cwd 变量崩溃

    症状

    装完插件、还没点「应用」,每一轮对话都失败:

    unknown prompt variable "{{cwd}}" in section "deployment:persona-suffix";
    registered variables: provider, model
    

    根因

    0.2.1 的 dsh-agent-loop 只注册两个提示词变量:

    ctx.systemPrompt.variable("provider", …)
    ctx.systemPrompt.variable("model",    …)
    

    cwd 在 0.1.x 还有,0.2 拿掉了。而宿主的 interpolate() 遇到未注册变量不是留空,
    是抛异常:

    if (!Object.hasOwn(variables, name)) {
      throw new Error(`unknown prompt variable "{{{name}}}" in ${kind} "${input.name}"; …`)
    }
    

    旧版 cordis.patch.yml 给 system-prompt 配了:

    personaSuffix: Your working directory is {{cwd}}.
    

    deployment:persona-suffix 是每轮都参与渲染的段,所以这个错在插件一装上就发生,
    与是否点过「应用」无关——这就是「基本上下载安装后都有」的原因。

    修法(三层,逐层收窄)

    层 文件 做法
    1. 配置 cordis.patch.yml personaSuffix 改为 ""。persona 不再发任何变量;工作目录由宿主 runtime context 提供,persona 里重复一遍没有收益。
    2. 注册 lib/cwd-variable.js(新) 插件在 systemPrompt 全局层补一个 cwd provider,取值优先级 agent.options.cwd → session.header.cwd → process.cwd()。这样用户自己 preset 里写的 {{cwd}} 也能解析。宿主已注册同名变量时抛 already registered,按成功处理。
    3. 兜底 lib/identity.js ① overlayOfficialIdentity 写出的 persona-suffix 改成纯文本;② 旧的 Working directory: {{cwd}}. 剥离后不再留变量;③ sanitizeAssemblySections 把任何残留的 {{cwd}} 降级成 { {cwd} }——变量注册失败时也不会炸整轮。

    关键取舍:不依赖「宿主会留空未注册变量」。三层里任何一层单独生效都不会崩,
    三层齐全时 {{cwd}} 正常解析出真实路径。

    验证

    npm run test:cwd(test/cwd-variable.mjs,21 项)直接加载宿主真实的
    dsh-system-prompt 渲染器,逐条断言:

    • 旧配置在 provider/model 两个变量下确实抛错,且报错文本与用户反馈一致(复现)
    • 当前 cordis.patch.yml 的活动配置里没有 {{cwd}}
    • overlayOfficialIdentity 的产物能渲染通过,输出里没有裸 {{cwd}}
    • registerCwdVariable 注册后 {{cwd}} 解析出真实路径(含三条 fallback)
    • 重复注册不算失败
    • 转义后的文本能被宿主渲染(证明兜底不是装饰)

    找不到宿主模块时,依赖渲染器的断言会显式 skip,不会假装通过——上一版正是
    这种「看起来没问题」的验证方式漏掉了这个 bug。



    镜像说明 / Mirror note:dsh-purge-plus 是社区分支(JeffKeeping/dsh-purge-plus),不在已删除的 YuJunZhiXue/dsh-purge 仓库内,原仓库没有发布过 GitHub Release。本 Release 由镜像仓库 wqmll/dsh-purge-plus 依据 tag 生成,说明文字取自该分支的 CHANGELOG.md。

    资产按上游 CI 相同方式生成:dsh-purge-plus-1.4.1.zip 是 git archive 源码包(可直接 dsh plugin install 离线安装);dsh-purge-plus-1.4.1.tgz 是内容等价的 npm 包。

    Downloads