模型炼丹失败,工具每次更新直接挂能不能加一个过滤机制 不兼容的 插件启动的时候会直接过滤掉 #7006
Replies: 4 comments
|
其实不用删除的,dsh是根据profile来的,你的插件是注册到profile里进行使用的,比如说你默认的profile是web,那你的所有插件可以都注册到这个profile里。 |
|
dsh跟炼丹有半毛钱关系? |
|
Your request is reasonable, and part of it already exists — but not the part you need. Here is what I can contribute, with measurements. The filter that already exists (and why it doesn't help here)dsh plugins declare compatibility through It fails to filter for two reasons. 1. Declared ranges are routinely wrong — too narrow. I maintain community plugins and measured this on my own set. A real example from one of my packages: A semver comparator admits a prerelease only when some comparator in the same group shares that prerelease's 2. Declared ranges are also wrong in the other direction — too broad. Then the install succeeds and it breaks at runtime, which no install-time filter can catch. And a third case worth separating out: sometimes it isn't incompatibility at all. Discussion #7031 is a harness regression in CJS resolution routing ( An audit you can run today, against your installed plugin set: npm view <plugin> peerDependenciesCompare each declared line against the dsh you are actually running ( The structural gap: boot is all-or-nothing
What does exist nearby: What I'd suggest instead of a silent filterIsolate per-entry import failure at boot:
The trade-off has to be stated explicitly, because the obvious cheap version is worse than the status quo: silently dropping a plugin is more dangerous than refusing to start. A skipped plugin looks like a working one; its tool simply never appears, and you lose the feature without any signal. Whatever isolation ships must make the skip visible. That would turn your workflow from "delete Immediate unblock for todayThe boot error already names the offender, so you don't need to delete and remove just that package ( I maintain several community plugins of my own; if a range on any of them refuses your dsh line, that is a bug on my side and I would want it reported — it is exactly the defect I have been fixing in my own set. |
|
Follow-up: I ran that audit across my whole published set. It was worse than the four I quoted above, and the worst case is not a refusal at all. Above I said I had found the too-narrow range in four of my packages. I then swept all 22 and computed each declared range's real admitted set with The audit, runnable now# What does this plugin's declared range ACTUALLY admit, out of everything published?
node -e '
const {satisfies}=require("semver"),{execFileSync}=require("child_process");
const p=require(process.argv[1]+"/package.json");
const v=JSON.parse(execFileSync("npm",["view","@deepseek-ai/dsh-llm","versions","--json"],{encoding:"utf8"}));
for (const [d,r] of Object.entries(p.peerDependencies ?? {}))
if (d.startsWith("@deepseek-ai/dsh-")) {
const a=v.filter(x=>satisfies(x,r));
console.log(d, a.length+"/"+v.length,
a.includes(v[v.length-1]) ? "(covers newest)" : "(NEWEST LINE REFUSED)", r);
}
' node_modules/<plugin>The decisive output is the tail of each line: does the admitted set reach the newest published dsh, or stop short of it. What it found (22 packages, 2026-09-18; newest dsh =
|
| package | fixed in | admits now |
|---|---|---|
@argszero/cordis-plugin-llm-tool-call-guard |
0.1.5 |
8/23 |
@argszero/cordis-plugin-schedule-cron |
0.1.2 |
8/23 |
@argszero/cordis-plugin-turn-budget-guard |
0.1.1 |
8/23 |
@argszero/cordis-plugin-prompt-audit |
0.1.1 |
8/23 |
@argszero/cordis-plugin-job-id-guidance |
0.1.1 |
8/23 |
Three packages refuse exactly one version on purpose — they read the assistant-stream area, which does not exist before 0.1.3-alpha.2. That is a correct narrow range, not a bug. Worth stating because a narrow range is not automatically the defect, and mislabelling those three would send their authors chasing nothing.
The case a startup filter can never catch
subagent-effort@0.1.0 declared five harness packages as dependencies at ^0.1.1-rc.2 instead of as peers. A caret on a prerelease admits only its own tuple, so no newer tree can satisfy it — and npm resolves an unsatisfiable dependency by nesting its own copy. Measured, installing the published 0.1.0 into a project running 0.1.6-alpha.2:
node_modules/@argszero/cordis-plugin-subagent-effort/node_modules/@deepseek-ai/dsh-tools (=0.1.1-rc.2)
node_modules/@deepseek-ai/dsh-tools (=0.1.6-alpha.2)
Install succeeds. No warning, no error, and the plugin still loads — so nothing at boot reports a problem. Two copies of the harness runtime in one process. This is precisely the failure mode a compatibility filter cannot reach: by the time a filter runs, the install has already succeeded, and at runtime the symptom is a symptom, not a mismatch report. Fixed in subagent-effort@0.1.1 by declaring them as peers; the same narrow scope now yields ERESOLVE, which is the correct answer for a user on a line that plugin does not target.
Why the wrong ranges shipped with green CI
This is the part I would underline for plugin authors, because the obvious guard does not work.
- Two of the five shipped a guard that only pattern-matched the range string — it asserted the range mentioned
0.1.2-rc.Nand0.1.5-alpha.N. That cannot distinguish a correct range from an incorrect one; it fails only on a different-looking string. So it certified the broken range. - Two had no tests and no
testscript at all. - One had a genuinely good
semver-based guard, with a claimed-lines list and an "admits nothing it was not tested against" assertion — and it still missed this. Its claimed list was written before0.1.6existed, and a closed list can never notice that a newly published line is being refused. It guarded the over-admission direction only.
The invariant that actually covers it is asserting set equality in both directions — every claimed version admitted, and nothing but claimed versions admitted — plus an explicit assertion that the newest published release is admitted, or is refused with a stated reason. That last one is what turns a range from a claim into a checked claim. The same files now also assert that the README quotes the manifest range verbatim, since a README that quotes part of a union teaches readers to copy the broken form.
What generalises
A declared range is a prediction about future releases, and nothing re-measures it when upstream cuts one. 0.1.6-alpha.2 was published after I wrote those ranges; the predictions silently expired, and the packages kept passing their own CI the whole time.
So the request in this thread is half-reachable. A startup filter would catch plugins that fail to load. It cannot catch a plugin that installs cleanly and then misbehaves — and in my set, that was the more dangerous of the two defects. The upstream-side change with the best ratio would be author-facing rather than user-facing: publish the released dsh lines in a machine-readable place, so "does my declared range include the newest line?" is a CI check rather than something every author has to remember. That would have caught all six of these before release, and it costs nothing at boot.
Uh oh!
There was an error while loading. Please reload this page.
过滤不兼容的插件,现在每次排查那个插件不兼容要好长时间⌛️ 都是直接删除.dsh 后一个个试 然后再还原备份
All reactions