Skip to content

Releases

2.0.8 — 探针降频到 30 秒 / 轻量端点 / 快照去重

Choose a tag to compare

@cijiezhi cijiezhi released this 18 Oct 19:20

2.0.8

修复:自证探针把整页维基百科当心跳

  • 探针原先挂在看门狗末尾,随 3 秒心跳每拍发一次真实请求。默认地址是维基百科条目页(gzip 后 141 KB),实测单次下行 25–34 KB、折算 ≈36 MB/小时 —— 代理客户端的流量曲线上就是每 3 秒一个尖峰。
  • 探针改为自有节奏 probeIntervalMs(默认 30 秒);判定结果变化时立即补探(force),所以代理开关的发现速度不受影响 —— 那由 stateTtlMs(5 秒)决定,是本地 TCP 探活、零外网流量。
  • 默认探针地址换成 https://www.gstatic.com/generate_204:只要"通",不要正文。单次下行 25–34 KB → 4.75 KB(绝大部分是 TLS 握手)。
  • body.cancel() 改为读空 body,让 TLS 连接回到连接池(实测 TTFB 757 ms → 195 ms),另设 256 KB 上限防大页面。
  • 净效果:小时流量 ≈36 MB → ≈0.57 MB。

修复:诊断快照每 3 秒写盘,去重形同虚设

  • 快照里的 at(当前时间)与 health.stateFileWrites(写入次数)每次都在变,text === lastWritten 永远不成立 —— 每次判定都写一个 2.4 KB 的 JSON,一天 28800 次、约 70 MB 写入。
  • 现在快照构造走 buildSnapshot({ reason, at, writeCount, uptimeSec, gate }),易变字段一律走参数:落盘时传真实值,比对时钉成常量。字段集合由同一个函数产生,不会漏比。写盘降为"实质内容变化时"(实测约每 30 秒一次,一天约 7 MB)。

变更(安全)

  • lib/resolve-dsh-install.ps1 不再硬编码开发机上的应用落点,改为遍历本机固定驱动器根目录探测 —— 仓库里出现真实磁盘布局等于把开发机配置公开出去。

验证

  • node test/selftest.mjs:43 通过 / 0 失败(新增 7 条回归,含"心跳空转 2 秒写盘 ≤4 次")
  • node test/standalone.mjs:3 通过 / 0 失败
  • 端到端:心跳 800 ms / 5 秒窗口下,旧行为 7 次探针 → 新默认 1 次;判定切成 proxied 后 2.5 秒内立即补探 1 次
  • 宿主实测:probe.at 间隔 30 秒稳定;33 秒内写盘 3 次(改前约 11 次)

兼容性

  • 纯行为修复,无破坏性变更。不需要改 profile 配置,重启 DSH 即生效。
  • 若你之前显式配置过 probeUrl,它会继续按你的配置走;probeIntervalMs 默认 30 秒。

完整说明见 CHANGELOG.md。

v2.0.7 — DSH 桌面应用(app.asar)下的宿主依赖解析修复

Choose a tag to compare

@cijiezhi cijiezhi released this 16 Oct 10:30

[2.0.7] — 2026-10-16

修复(DSH 桌面应用下插件整条不激活)

  • 降级壳必须提供默认值。Config 解析不到 @deepseek-ai/schemastery 时会走降级壳,
    而旧降级壳的 validate 返回 {}、不提供任何默认值,宿主据此投影出 config = undefined,
    apply 第一行读 config.probeTimeoutMs 即抛 TypeError → 条目 did not activate:
    proxy_fetch 未注册、提示词引导段未注入、看门狗没启动(GUI 里显示"1 异常")。
    现在 config-schema.js 导出 DEFAULT_CONFIG 作为默认值唯一真相源,降级壳据此补齐;
    apply(ctx, config = {}) 另加一层兜底。这是既有缺陷(自 2.0 首发就在),
    只在"宿主依赖不可见 + schemastery 解析失败"时暴露。

修复(宿主依赖解析:DSH 桌面应用把依赖打进 app.asar)

  • 新增 lib/host-module.js:以 resources/app.asar 自身为锚点建
    createRequire,用 CJS require 加载(Electron 的 asar 支持打在 CJS loader 上,
    对 asar 内文件做 ESM 动态 import() 长期有问题)。undici 与 dsh-http-proxy
    两条腿都改走它,于是全局 dispatcher 与官方代理 seam 在桌面形态下恢复工作。
  • 背景:DSH 桌面 0.2.0-rc.2 把 undici / schemastery / dsh-http-proxy 全部打包进
    resources/app.asar,文件系统不可见;插件又不在宿主 node_modules 树内。于是
    import('undici') 找不到包、拼绝对路径普通 fs 看不见 asar 内容 →
    dispatcherModule: null、proxy_fetch 报 reading 'fetchWith'、seam 报 reading 'routeFor'。

修复(诊断与容错)

  • 装载诊断落盘:loadUndici / loadProxySeam 全过程诊断写入快照
    (dispatcherError / seamError / initError),能直接区分"没找到包"与"找到了但契约变了"。
    早先失败时直接 return undefined,把诊断一起丢了,快照只剩 null,排查时极易被误导。
  • describeRoute 全面容错:routeFor 缺失、返回 undefined/null、proxied 字段缺失都不抛。
    旧写法读 route.proxied 抛错后又被 catch 包装成"函数不存在",把排查方向带偏过。
  • 装载结果 ?? null 归一:原先 undefined 赋给初值 null 的变量,=== null 判断会漏掉它,
    把"未找到 seam"错报成"已装载"。
  • fetchWith 回调在 dispatcher 不可用时退回宿主 fetch,不再直接抛。

修复(体检脚本)

  • install.ps1 / verify.ps1 支持 DSH 桌面形态。原先只认 npm 全局安装
    (%APPDATA%\npm\node_modules\@deepseek-ai\dsh),桌面版上 verify.ps1 第一段就
    throw,四段体检全跑不到。新增 lib/resolve-dsh-install.ps1:显式环境变量(DSH_APP_DIR /
    DSH_INSTALL_DIR)/ 桌面形态 / npm 形态 / 可执行文件上行 四类候选。
  • 新增 lib/probe-host-deps.mjs:PowerShell 的 Test-Path 看不到 asar 内部
    (不是安装损坏),所以改为借宿主自己的运行时(ELECTRON_RUN_AS_NODE=1 + 宿主 exe)
    真实 require 一次三个宿主依赖。verify.ps1 新增 1.5 节展示实测结果。
  • verify.ps1 第 2 节不再误报"未在默认位置找到 DSH",改报已探测到的安装路径。

验证

  • 本机(DSH 桌面 0.2.0-rc.2 / electron 44.0.0 / node 24):selftest 36 通过 0 失败、
    standalone 3 通过 0 失败;快照 dispatcherPatched:true、
    seamRoute: proxied via http://127.0.0.1:7890;proxy_fetch 实测 200 且 Via 为代理;
    代理开↔关各在 5 秒内跟随、全程未重启 DSH;verify.ps1 首次完整跑完并输出"体检通过"。

v2.0.6 — 选错工具也能被拉回(含 v2.0.3→v2.0.6 全部变更)

Choose a tag to compare

@cijiezhi cijiezhi released this 15 Oct 13:06

dsh-proxy-auto v2.0.6

从 v2.0.2 升级:以下包含 v2.0.3 → v2.0.6 的全部变更。

  • 代理开关免重启:开着走代理、关掉 3 秒内回落直连,绝不留下指向死端口的代理地址
  • 数据落点合规(2.0.3):快照移到 $DSH_HOME/cache/,插件本体自包含在 ~/.dsh,不再依赖工作区
  • 模型会主动调用(2.0.4):注入系统提示词引导段(段位 2150)+ 强化 proxy_fetch 工具描述
  • 选错也能被拉回(2.0.5 / 2.0.6):官方 web_fetch 失败时自动追加纠正上下文,提示同一 URL 改用 proxy_fetch
  • 2.0.6 修复:CI 补 node --check 语法检查、verify.ps1 容忍缺 test/、发布包纳入 test/

安装与验证见 README 与 INSTALL.md。


[2.0.6] — 2026-10-15

变更

  • block 决定现在也会追加纠正上下文。官方 PostToolDecision 的 accept 与 block 两种形态
    都声明了 additionalContexts,而 2.0.5 只处理 accept,等于放弃了一半的注入路径。现在 block
    也追加(原样保留它的 feedback),其余决定类型仍原样放过。

新增(诊断)

  • fetchFallback 快照新增 6 个自证字段,回答"装了却一次都没注入"到底卡在哪一步:
    calls(钩子被调用次数)、matched(命中兜底条件次数)、skippedKind(被决定类型挡下的次数)、
    tools / errorTools(见过的工具名 / 以失败结束过的工具名)、kinds 与 lastDecisionKind
    (下游决定的类型分布)。有了它们,一次触发即可区分"钩子没接上""工具名不符""决定类型不符"
    三种情形,不必再靠推断。

修复(CI 与安装)

  • CI 的 node --check 列表补上 lib/dsh-home.js、lib/prompt-hint.js、lib/fetch-fallback.js:
    这三个 2.0.3~2.0.5 新增的核心文件此前不在语法检查内,写错语法 CI 不会报。
  • package.json 的 files 白名单纳入 test/:此前发布包不含测试,而 verify.ps1 会无条件运行自测,
    从仓库或 npm 安装的用户会看到"自测未通过"的假失败。
  • verify.ps1 的自测步骤增加存在性判断:测试文件缺失时显示"跳过"而非"未通过"(手工打的 zip
    漏带 test/ 时同样安全);install.ps1 的同类提示也只在测试确实存在时才打印。

[2.0.5] — 2026-10-15

新增

  • web_fetch 失败兜底(B 方案):在官方 tools/post-execute 事件上注册策略 ——
    当官方 web_fetch 以失败结束时,给它追加一条纠正上下文(PostToolDecision.additionalContexts,
    官方字段语义正是 "attach context for the next request"):说明 web_fetch 按设计永远直连、
    被墙站点必然失败,并提示"同一 URL 改用 proxy_fetch 重试"。

    与引导段(A)的分工:A 让模型大概率选对工具;B 保证即使选错也能被纠正。
    不动原始失败结果(保留报错便于排查);下游策略已 block 时一律不插手;
    任何异常只记录、按原决定返回 —— 兜底逻辑绝不影响工具调用本身。配置项 fetchFallback(默认开)。

诊断

  • 快照新增 fetchFallback 字段(installed / reason / injected / lastError):
    直接看"兜底装没装上、已经纠正过几次"——排查"用户说装了没效果"的第二步。

[2.0.4] — 2026-10-15

新增

  • 系统提示词引导段:注册 ctx.systemPrompt.section(...),让模型主动在抓被墙页面时选用
    proxy_fetch。段位取 2150 —— 夹在官方 TOOL_WEB_FETCH(2100)与 TOOL_LSP(2200)之间,
    所以模型的阅读顺序是"官方 web_fetch 说明 → 本段纠正 → 其余工具说明"。
    文案说明三件事:官方 web_fetch 为何必然失败(设计如此)、何时改用 proxy_fetch、
    以及别在试过之前就告诉用户站点不可达。配置项 promptHint(默认开)/ promptHintText(自定义文案)。
    服务缺失或注册失败一律降级,绝不让插件因此加载不了。

  • 强化 proxy_fetch 的工具描述(模型可见的唯一元数据):明确写出"目标可能被墙时优先用它、
    web_fetch 失败或超时后用同一 URL 重试"。

诊断

  • 快照新增 promptHint 字段(registered / reason / name / order / chars),
    外部可直接确认引导段有没有注入成功——这是排查"用户说装了没效果"的第一步。

为什么做这个

工具注册 ≠ 模型会调用。官方 web_fetch 与 proxy_fetch 同时在工具清单里,而"抓网页"这个意图上
模型更可能选名字更直白的 web_fetch(它按设计永远直连,对被墙站点必然失败),
于是用户会以为"插件没用"。引导段把选择条件写进系统提示,从机制上解决自调用问题。

[2.0.3] — 2026-10-15

修复

  • 诊断快照改放 $DSH_HOME/cache/dsh-proxy-auto/state.json(原来散在 home 根的
    ~/.dsh/dsh-proxy-auto.state.json)。它是派生数据——每 3 秒重写、丢了会自动重建——
    按官方约定应落在 cache/(dshCachePath() 的用途就是"可重新生成的数据"),
    而不是污染 home 根。旧的顶层文件可以直接删除,首次运行会自动在新位置重建。

  • 修掉一处路径派生缺陷:快照路径原来用 os.homedir() + '.dsh' 拼,忽略了 $DSH_HOME,
    于是用户把 home 设到别处时,快照会被写到错的地方。现在新增 lib/dsh-home.js 作为唯一解析处
    (优先级与官方 @deepseek-ai/dsh-home-paths 一致:显式配置 > $DSH_HOME > ~/.dsh;
    空白值一律视为未设置,避免把 home 悄悄落到当前工作目录),.env 与快照都经它派生。
    这一类"两处各拼路径、随后漂移"的重复,正是官方架构笔记
    single-harness-home-resolver 在 harness 内部合并掉的问题,插件侧同理。

测试

  • test/selftest.mjs 新增 5 条断言:三层优先级、显式覆盖、空白值回退、派生数据必须落在 cache/。
    自测总数 17 → 22。

v2.0.2 — verify.ps1 增加仓库完整性检查

Choose a tag to compare

@cijiezhi cijiezhi released this 09 Oct 10:52

新增

  • verify.ps1 新增仓库完整性检查:确认 .git/HEAD|config|index|objects|refs 齐全、git 能识别该仓库、与 origin/main 是否同步
  • 起因:在 GUI 里从 GitHub 安装同名插件时(profile 原本是 link: 指向同一目录),替换/回滚路径可能削掉 .git/HEAD|config|index,使 git 突然报 not a git repository
  • 现在跑一次体检即可提前发现,并给出重建步骤(工作区文件不会丢,提交都已在远端)
  • 从 zip 解压安装(没有 .git)不会误报,只提示一句“非 git 检出,属正常”

安装

解压下方附件后:pwsh -File .\install.ps1
装完重启 DSH 一次;pwsh -File .\verify.ps1 做体检(输出已脱敏,可直接贴出)

附件

dsh-proxy-auto-2.0.2.zip

v2.0.1 — 安装方式说明 + 跨平台与脱敏修复

Choose a tag to compare

@cijiezhi cijiezhi released this 09 Oct 10:35

让 DeepSeek Harness 在运行时跟随本机代理(开关代理免重启),并提供能抓墙外页面的 proxy_fetch 工具。

安装(三选一)

  1. CLI 管理的 profile(tui / web):dsh plugin --profile add github:cijiezhi/dsh-proxy-auto
  2. desktop profile:解压下方附件后,在目录里执行 pwsh -File .\install.ps1
  3. 手工安装:见 INSTALL.md

装完重启 DSH 一次;pwsh -File .\verify.ps1 一条命令做体检。

本版变更

  • 补充"从仓库直接安装"的说明(本插件无构建步骤,不受 pnpm allowBuilds 限制)
  • install.ps1:非 Windows / 环境变量缺失时不再报错;显式退出码;候选路径只接受绝对路径
  • install.ps1 与 verify.ps1 的输出做脱敏(用户名 / 主目录 / AppData)
  • 新增 README.en.md、CHANGELOG.md、verify.ps1;README 按惯例重排