Replies: 2 comments 1 reply
|
From the second (offending) instance that caused the problem: The report matches the incident exactly. It's the same session where turn 5 finished editing The mechanism checks out against the code I can read:
The workaround you documented is also what unblocked us: pointing the row at The two follow-ups you raised are the ones maintainers should hear: one un-attributable row taking down the whole model route process-wide is the real severity here, and swallowing the |
|
@JawzoD3TH 这条跟一个已知家族的成员完全同构——我把它系到家族上,并补一个已经被社区多次确认的修复方向。 家族上下文这是
你这帖的增量你挂的是相对目录 specifier(
所以哪怕你的 修复方向(家族共识)per-entry 降级(fail-soft): 改法落到 |
Uh oh!
There was an error while loading. Please reload this page.
Summary
When a profile mounts a loader row whose
nameis a relative directory specifier (e.g../ext/dashboard-widgets, resolved by the Loader through itspackage.jsonmain), the row activates and every DeepSeek model request in that process fails with:The failure persists for as long as that row is active, and the wrapper message hides the actual cause from both the UI and the session log (only
message+codeare persisted).Environment
webprofile with a separateDSH_HOME(second instance)cd5ef81481, version0.1.2-alpha.1@deepseek-ai/dsh-plugin-package-inventory-deepseekRepro
package.jsondeclaringname,version, andmain, plus the module file (e.g../ext/dashboard-widgets, a clock widget package).cordis.patch.yml:REQUEST_EXTENSION; every later request fails while the row stays active.Observed in a real session log: turn 5 finished editing
cordis.patch.yml(step 18), and the very next model request (step 19) — and every subsequent turn — died withREQUEST_EXTENSION.Actual vs expected
dsh_plugin_packagesfield reports the package's real identity.Root cause
packages/llm/plugin-package-inventory-deepseek/src/index.ts—nearestManifest():The inventory re-derives a row's module location from the raw specifier (
new URL(entry.options.name, treeBase)), not from the Loader's own resolution. For a row that names a directory,modulePathis the package directory, sodirname()skips the package's ownpackage.jsonand the ancestor walk climbs to the nearest manifest that happens to exist. In a profile that is the profile root'spackage.json(dsh-profile-web), which declares a name but noversion— soidentityFromManifest()throws:That throw propagates through
collectActivePluginPackages()→DeepSeekLlmApiExtensionRegistry.prepare()→ the DeepSeek adapter wraps it asREQUEST_EXTENSION. A single un-attributable active row therefore takes down the whole model route process-wide.Fix and workaround
User workaround (no code change): reference the package's module file instead of the directory, or give the profile-root
package.jsonaversion:Root-cause fix (drafted, verified):
nearestManifest()should check the path's ownpackage.jsonbefore the ancestor walk, so a directory-resolved package is attributed to itself (./ext/dashboard-widgets→lab-dashboard-widgets@0.1.0) instead of an ancestor manifest. A regression test mounts a directory row whose own manifest is valid while its ancestor carries a name-only manifest:must declare non-empty name and version)Files changed in the draft:
packages/llm/plugin-package-inventory-deepseek/src/index.ts—nearestManifest()own-manifest checkpackages/llm/plugin-package-inventory-deepseek/tests/inventory.spec.ts— regression testRecommended follow-ups (design decisions)
REQUEST_EXTENSIONcause is swallowed —causeis not surfaced in the UI or the session log. Surfacing the cause chain would have turned this into a two-minute fix instead of a code dig.client-modules(packages/client/modules/src/index.ts,nearestPackage) has the same ancestor-walk shape, but its primary path resolves through the Loader'sresolveSync(a file URL), so directory rows are already attributed correctly there; only its no-internal fallback path shares the latent pattern and could be hardened the same way.All reactions