Repository navigation
Replies: 1 comment
|
Second independent report — same symptom chain, plus a per-session pattern and a self-heal step TL;DRSame failure on Three things I could not find in the original report:
Environment
EvidenceRead from
The 01:44 / 01:47 sessions are wedged; the 01:49 / 01:59 sessions are clean. Same machine, same profile, minutes apart. A host-wide "the plugin tree was rebuilt once" story does not fit — the scope loss is per session. The self-heal
Switching the permission preset once re-established something and the session recovered. That points at a reconstructible per-session binding rather than the plugin tree — which would also explain why restarting the host "fixes" it and why a single write is so hard to turn into a reliable reproduction. Also worth noting: a bare Code pointers (0.2.0-rc.2)These look like the reason the permission picker disappears in particular, rather than some other UI:
if (preset === "auto") {
if (this.autoAdmit === void 0)
throw new Error('permission: cannot restore preset "auto" without its active integration')A throw inside the
What I could not establish
Suggested direction
|
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
摘要(中文)
DSH desktop
0.2.0-rc.2/ Windows 11。核心问题不在某个插件,而在dsh-hmr的默认行为:dsh-base以root: []启用 HMR,而 README 明确写着[]「仍保留显式配置监听」——也就是默认就会监听用户 patch 层(cordis.patch.yml)。任何对它的写入都会触发插件树重建,正在运行的 session scope 随之失效,于是每一次工具调用都在派发前死掉:同时界面上的权限选择器消失。与 #8857 的区别:这里 session 没有被 dispose ——
turn/end是completed,会话变成「活着但永远调不动工具」的僵尸。本次触发者是一个第三方插件(
@linxin666/dsh-pet,经@linxin666/dsh-web-all传递引入):它把桌宠坐标持久化进 patch 层,而这只宠物在持续保存位置。同一份 diff 里还有两条通过界面新增的 MCPinsert。TL;DR
Profile:
desktop. Two live sessions in it lost every tool call at the same moment. The first failure isand every subsequent dispatch fails with
The permission picker also disappeared from the GUI. Unlike #8857, the sessions were not disposed:
turn/endreports{"kind":"completed"}, so they stay alive and permanently unable to dispatch a tool.The suspected trigger is a write to the user patch layer
cordis.patch.yml, whichdsh-basemakesdsh-hmrwatch by default. The writer in this instance appears to have been a third-party pet plugin persisting its dragged position (plus two MCPinsertblocks added through the UI).However, a deliberate probe of that write did not reproduce the wedge (see Negative result below). The write alone is therefore not sufficient; the additional condition is unknown. What this report establishes firmly is the symptom chain and the fact that the session never recovers.
Environment
@deepseek-ai/dsh-desktop 0.2.0-rc.2, Electron 44.0.0, Node 24.18.1, Windows 11 x64desktop, bundles:@deepseek-ai/dsh-base,@deepseek-ai/dsh-web-app,@deepseek-ai/dsh-experimental-agent-team-profile,@deepseek-ai/dsh-experimental-auto-review,@linxin666/dsh-web-all,@noop-stupid/dsh-plugin-console,dsh-better-sidebar,dsh-workbuddy-connect,dsh-our-free-model,dsh-opsThe core behaviour
@deepseek-ai/dsh-base/cordis.patch.ymlenables HMR for every profile that has aprofileContext:@deepseek-ai/dsh-hmr/README.mdstates the consequence explicitly:and
The watches are registered in
dsh-hmr/lib/index.js:with
PROFILE_PATCH_FILENAME = "cordis.patch.yml"andpatchPath = join(dir, PROFILE_PATCH_FILENAME)(dsh-app-boot/lib/index.js:487, 588, 946, 1141).So the default profile watches its own user patch layer, and
reconcileProfilePatchesrebuilds the tree, disposing live session/agent scopes:Per the
sessionProjectionsAPI documentation (dsh-tool-cordis/lib/types/api-catalog.js:2087):So the rebuild removes the
permissionskey —dsh-permission-presets/lib/index.js:279then throwspermission: permissions session projection is not registered, which is also why the client stops rendering the permission picker — and service lookups then resolve against an inactive context, soctx.get("sessionProjections")fails for every dispatch (dsh-session-projection/lib/index.js:52installs the registry assuper(ctx, "sessionProjections")). That is why every tool family dies at once, including tools that touch no filesystem and no process.Note: the pet is not part of DSH. It is the third-party plugin
@linxin666/dsh-pet0.4.4, pulled in transitively by the third-party bundle@linxin666/dsh-web-all. It is not a direct dependency of the profile. I am reporting it only because it is the concrete writer; the defect being reported is the default config-watch + rebuild behaviour and the fact that a wedged session never recovers.Timeline (reconstructed from the session logs)
Two sessions in the same profile, both working normally until the same moment:
Both sessions began failing 4 seconds apart while doing unrelated work, and neither recorded
turn/end {"kind":"aborted","reason":{"kind":"disposed"}}.Evidence: the watched patch file was rewritten inside the incident window
C:\<dsh home>\profiles\desktop\cordis.patch.ymlwas rewritten at 00:35:45, inside the incident window. The complete delta against the previous Plugin-Manager backup (cordis.patch.yml.bak-20261015-232654, taken 23:26:54) is:So the only content change is a plugin's persisted runtime UI state (the pet's dragged position) plus two MCP server inserts — i.e. ordinary use, not a deliberate configuration edit. The pet also rewrites its own
pet.jsoncontinuously (observed at 00:23:18, 00:46:27, 00:48:31).pet.jsonin the same window shows the pet still moving (right101 -> 84,bottom467 -> 491), i.e. the plugin was actively persisting state throughout the incident.There is no host-side log for the incident:
logs\gained no new file. The failure is silent.Negative result — the patch-file write alone does not reproduce it
While a session was running normally,
cordis.patch.ymlwas written nine times on purpose, including a burst at roughly 6-second intervals. The session kept dispatching tools normally throughout, including ~20 s after the last write.A 2-second mtime watchdog over the watched files confirmed every write landed:
Two of those writes changed the mounted plugin set (they set
- id: hmr / disabled: true), i.e. they were not mere config-value edits.The reconcile really did run:
cordis.yml— the composed tree — was also rewritten at 00:49:36 and 00:52:05, which only happens when the profile is recomposed. Sessions survived anyway.So a write to the HMR-watched patch layer is not sufficient to wedge a session, and the reconcile/rebuild it triggers is normally survivable. The wedge needs an additional condition that I have not identified. This also means the mechanism I described above is a plausible route to the symptom rather than a demonstrated cause of this incident.
Candidate conditions I could not distinguish with the data available:
A host-side log line per reconcile (what changed, what was disposed, which session scopes were affected) would settle this in a single occurrence; the app currently writes no host log for this event at all.
What is proven and what is not
Proven (from logs and files on disk):
turn/endcompleting normally rather thandisposed;cordis.patch.ymlbeing in HMR's watch list by default viadsh-base, and being rewritten inside the window;Not proven: which exact write fired the rebuild. File mtime only retains the last write. I have installed a 2-second mtime watchdog over
cordis.patch.yml,cordis.yml,package.jsonandpet.jsonto capture the next occurrence and will follow up with timestamps.Relation to existing reports
cordis.patch.ymland the sessions die (turn/end aborted/disposed). Here the writer is ordinary plugin state persisted through the same layer and the sessions survive as zombies, which is harder to notice and cannot be recovered by reopening the session.cordis.patch.ymlreload permanently killssessionController; same family.Suggested fix direction (core-side)
Interim workaround
Disable the HMR row in the user patch layer (this is the documented way;
dsh-acp-app/cordis.patch.yml:23does exactly this):Per the README, this applies on the next start, after which profile-config writes no longer trigger a rebuild.
Remove or hide the pet plugin (stops the frequent writes).
Do not add/edit MCP servers, plugins, or plugin settings while sessions are running.
All reactions