<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>插件机制 on Trevor's Blog</title><link>http://mings.in/tags/%E6%8F%92%E4%BB%B6%E6%9C%BA%E5%88%B6/</link><description>Recent content in 插件机制 on Trevor's Blog</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 29 Oct 2026 07:52:35 +0800</lastBuildDate><atom:link href="http://mings.in/tags/%E6%8F%92%E4%BB%B6%E6%9C%BA%E5%88%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>升级 DeepSeek Harness 后，插件全被禁用</title><link>http://mings.in/posts/dsh-022/</link><pubDate>Thu, 29 Oct 2026 07:52:35 +0800</pubDate><guid>http://mings.in/posts/dsh-022/</guid><description>npm 上还没更新的版本，得把版本号写死才装得到。装完三个插件当场被拒载，不是 bug，是精确版本锁在起作用。</description><content:encoded><![CDATA[<p>昨晚把本机的 DeepSeek Harness 从 0.2.1-rc.2 升到 0.2.2-alpha.2，16 秒装完。</p>
<p>有个前提得先说清楚。这个版本 npm 上还没更新到最新，直接装装出来的还是 0.2.1-rc.2，得手动把版本号写死才行。</p>
<pre tabindex="0"><code>npm install -g @deepseek-ai/dsh@0.2.2-alpha.2
</code></pre><p>少写这一段版本号，后面说的所有东西你都看不到。</p>
<p>启动之后，问题来了。日志里连着刷了三行 <code>disabling profile plugin row</code>，我装的东西被拿掉了三个。</p>
<p>装的时候 npm 还提了个醒，五个包的 install scripts 被拦了，包括 node-pty 和 koffi 这两个原生模块。我盯着看了会儿，还是先启动试了，web 界面能开，模型列表能拉，暂时没看出影响。这条先记着，后面要是哪里不对再回头查。</p>
<h2 id="升级完第一眼就撞上这三行">升级完第一眼就撞上这三行</h2>
<p>日志原文是这样的。</p>
<pre tabindex="0"><code>dsh: disabling profile plugin row &#34;plugin-market&#34;:
  Plugin @deepseek-ai/dsh-plugin-market@0.2.1-rc.2
  is incompatible with dsh 0.2.2-alpha.2:
  requirements {&#34;@deepseek-ai/dsh-plugin-manager&#34;:&#34;0.2.1-rc.2&#34;,
                &#34;@deepseek-ai/dsh-settings&#34;:&#34;0.2.1-rc.2&#34;,
                &#34;@deepseek-ai/dsh-tools&#34;:&#34;0.2.1-rc.2&#34;,
                &#34;@deepseek-ai/dsh-typert-protocol&#34;:&#34;0.2.1-rc.2&#34;}
</code></pre><p>被禁的三个是 <code>ui-agent-team</code>、<code>plugin-market</code>、<code>tool-plugin-market</code>。后两个其实是同一个包，被两行不同的配置引用了。</p>
<p>关键在 requirements 那一串。它写的是 <code>&quot;0.2.1-rc.2&quot;</code>，没有脱字符，没有波浪号，就是精确的四个版本号。而运行时的那四个内部包已经升到 0.2.2-alpha.2 了。</p>
<p>精确匹配失败，插件被拒载。DeepSeek Harness 的处理很干脆，不加载也不报错，只打一行警告继续跑下去。</p>
<p>这个设计其实是对的。让一个声明「我只在这些版本上测过」的插件硬跑在新 runtime 上，崩起来更难查。拒载比带病加载好。</p>
<p>只是对用户来说，代价是升个版本，装的东西消失，而且只是警告不是错误，很容易漏看。</p>
<h2 id="连带塌方插件市场读不到索引">连带塌方，插件市场读不到索引</h2>
<p>我装过自定义插件索引，配置在 <code>~/.dsh/profiles/web/cordis.patch.yml</code> 第 12 行，指向本地一个静态服务。</p>
<p>升级后点进 Plugins → Discover，红字一行：</p>
<blockquote>
<p>Could not read the index sources.</p>
</blockquote>
<p>旁边挂着个 Retry，点了还是这行。</p>
<p><img loading="lazy" src="/images/dsh-022/05-discover-failed.png"></p>
<p>排查时我先看的是那个静态服务，<code>lsof -iTCP:3489</code> 果然是空的，服务早就挂了。我以为这就是全部原因，把服务拉起来，<code>curl</code> 返回 200，3764 字节的 index.json 躺在那儿。</p>
<p>回浏览器点 Retry，同一行红字。</p>
<p>回浏览器点 Retry 还是那行红字，这才反应过来读索引这个动作本身就是 plugin-market 干的。索引源通了，读的人不在，页面照样空。</p>
<p>所以这里其实压着两层，表面是索引源没起，根因是读索引的插件被禁用了。</p>
<p>顺手踩到一个自己的坑，记一下。那个复现用的 <code>serve.py</code> 把访问日志硬编码到 <code>/tmp/market/access.log</code>，目录被我清过，不存在。每个请求一进来就抛异常，<code>curl</code> 返回的是 exit 52，空回复。把目录建出来，请求才恢复正常。</p>
<h2 id="修它有官方开关藏在报错文案里">修它有官方开关，藏在报错文案里</h2>
<p>那三行警告的末尾其实给了办法，说可以用 <code>dsh plugin allow-version</code> 这个命令，或者走插件管理器，给一个精确版本豁免。</p>
<p>我先敲了一遍帮助，DeepSeek Harness 的插件子命令说明里根本没提这个用法，只说剩余参数会转发给 pnpm。</p>
<p>直接试，用法自己跳出来了：</p>
<pre tabindex="0"><code>dsh: Error: usage: dsh plugin allow-version &lt;package@version&gt;
                   --dsh-version &lt;exact&gt; --accept-risk
</code></pre><p>按这个补全，两个插件各豁免一次：</p>
<pre tabindex="0"><code>$ dsh plugin --profile web allow-version \
    &#34;@deepseek-ai/dsh-plugin-market@0.2.1-rc.2&#34; \
    --dsh-version 0.2.2-alpha.2 --accept-risk
dsh: allowed @deepseek-ai/dsh-plugin-market@0.2.1-rc.2 for DSH 0.2.2-alpha.2
</code></pre><p>豁免精确到包和版本，换个版本得重新给一次。重启 DeepSeek Harness 之后，那三行警告从日志里消失了，Discover 立刻能读到索引，两个插件正常列出来，分类和标签筛选也都在。</p>
<p><img loading="lazy" src="/images/dsh-022/06-discover-fixed.png"></p>
<p>补一句，<code>--accept-risk</code> 这四个字是认真的。我这次运气好，插件跑起来没出事，但不保证。</p>
<h2 id="新界面长什么样">新界面长什么样</h2>
<p><img loading="lazy" src="/images/dsh-022/02-plugins-page.png"></p>
<p>插件页现在是 Installed 和 Discover 两栏。Installed 里分成上下两段。</p>
<p>上面一段叫 Built-in plugin settings，四条。Subagent 管递归深度、数量和模型。Web search 管 DeepSeek 搜索源的配置。Agent loop 控制 agent 怎么派发工具调用。Shell 限制单条命令能跑多久、能吐多少输出。</p>
<p>下面一段叫 Experimental plugins，五条，各带一个开关：</p>
<p>Agent teams 让 agent 把活拆给具名队友，共享一块任务板，再把结果报回来。</p>
<p>Voice input 用 SenseVoice 在本机转录，首次使用要先装依赖。</p>
<p>Custom plugin indexes 就是给 Plugins 加 Discover 那一栏的，从你加的索引源里浏览和安装。</p>
<p>Auto authorization review 是新增的审核模式，每次工具调用前先让模型对着你原本的要求过一遍，合规的批量放行。</p>
<p>Change requests &amp; worktrees 追踪每个会话的变更请求和它的检查、评审结果，还能让新会话直接在 Git worktree 里起。</p>
<p>这五条里前两条默认开着，后三条默认关。</p>
<h2 id="插件页上真变了的两处">插件页上真变了的两处</h2>
<p>绕完这一圈，回头看清这次升级到底给了什么。</p>
<p>插件详情页现在直接渲染包自带的 README。点进某个实验性插件，看到的是完整的文档，带 English 和中文切换、Summary、目录，往下还有一段叫 Use this package。</p>
<p>更有意思的是同一个页面把那个 bundle 拆成了 5 个 component 逐个列出来，每个一行，带图标、一句话说明、短名、完整包名，右边一个独立的开关。</p>
<p>比如 Change requests &amp; worktrees 这个包，展开是五个部分。</p>
<p>Change requests、GitHub change requests、Session change requests、Worktree service、Change request panel。页面顶部写着 <code>Components 5 total · 5 off</code>。</p>
<p>底部还标了来源，Code source 是 Built in，当前版本 0.2.2-alpha.2。</p>
<p><img loading="lazy" src="/images/dsh-022/04-plugin-components.png"></p>
<p>这比过去那种「一个插件一个开关」清楚太多。一个 bundle 里各部分能查、能单独开关，装了什么不用去翻配置文件。</p>
<h2 id="我的一点看法">我的一点看法</h2>
<p>这次经历最有意思的地方不是那个坑，而是它暴露的设计取舍。</p>
<p>精确版本锁让插件生态安全，代价是每次 runtime 升级都可能批量失效。alpha 和 rc 之间尤其明显，几个内部包一升，所有声明依赖它们的插件全部掉线。</p>
<p>DeepSeek Harness 给了豁免开关，但默认路径是拒载。它赌的是「宁可少加载，不要带病跑」。</p>
<p>对做插件的人，这意味着每跟一次 runtime 版本，都要重新发一次版本声明。对用插件的人，这意味着升级前得知道自己装了什么，不然升级后连哪里少了都未必看得出来。</p>
<p>DeepSeek 官方在 0.2.2-alpha.2 的发布说明里还写了一条，说插件热更新失败会尝试恢复旧版本。这个机制救的是运行中的更新，救不了启动前的版本检查，两套逻辑互不相干。</p>
<p>这版还列了几个我没验的：subagent_oar 能把独立任务交给本机的 Codex 或 Claude CLI 去跑，开发者工具那个统计插件能按轮次看上下文、缓存、模型和工具耗时。前者听着最有意思，但界面上没找到入口，估计要单独装，我没动。热更新失败回滚那条也一样，官方口径，我没构造出失败场景。</p>
<p>你升级工具链之前会先看一眼自己装了哪些插件吗？还是跟我一样，升完才发现东西没了。</p>
<h2 id="参考资料">参考资料</h2>
<ul>
<li>DeepSeek Harness v0.2.2-alpha.2 发布说明：https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.2-alpha.2</li>
<li>本机实测环境：macOS arm64，DeepSeek Harness 由 0.2.1-rc.2 直升 0.2.2-alpha.2，npm 全局安装</li>
</ul>
]]></content:encoded></item></channel></rss>