You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
dsh web 0.1.7-alpha.1(Node v22.23.2 / Windows,源码启动);
全局插件含任一未导出 ./locale/en.json 的包(官方 persona / command-goal 即可,无需特殊配置);
启动 web,打开插件管理器页面;
结果:这些插件条目全部显示「包元信息错误:Plugin metadata for … TypeError: Cannot assign to read only property 'stack' of object 'Error: Package subpath './locale/en.json' is not defined by "exports" …'」;应用下文补丁并重启后,同一页面不再报错。
conststack=error.stacktry{error.message=messageif(stack!==undefined)error.stack=stack.replace(originalMessage,message)}catch{/* keep the original error */}
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
摘要
0.1.7-alpha.1 的插件元信息读取(
readPluginMeta())会对每个全局插件探测可选资源<pkg>/locale/en.json,资源缺失属预期,missingResource()按错误code静默容忍。但探测错误在返回调用方之前,会先经过 profile 解析拦截层的throwWithImporter(),该函数为隐藏内部路由路径而改写错误的 message 与 stack,且对error.stack的赋值没有任何防御。在真实启动链路上,解析器错误的stack是只读访问器,赋值即抛 TypeError——而 TypeError 没有code,容忍逻辑认不出它。后果:一个本应静默跳过的「资源缺失」被错误处理代码自己放大为显性故障。任何未内置 locale 字典的全局插件都会触发——实测「内置插件」页 persona、agent-instructions、tool-bash、tool-pwsh、tool-fs、tool-fs-search 六个全部复现,「全局插件」页的 ui-directory-picker-native 同样触发(见下图),启用与停用状态均可;插件加载与功能不受影响,但报错普遍、持续且具误导性。
![全局插件页:uidirectorypickernative 显示同一条「包元信息错误」]

截图:设置 → 全局插件(共 180 个)。ui-directory-picker-native 报同一 TypeError;右侧 include(
cordis:include,非包 specifier)不走元信息探测、显示正常。复现
./locale/en.json的包(官方 persona / command-goal 即可,无需特殊配置);根因
throwWithImporter()(packages/boot/app-boot/src/profile-resolution/resolver.ts)在捕获ERR_PACKAGE_PATH_NOT_EXPORTED/ERR_MODULE_NOT_FOUND后改写错误消息,并无条件执行error.stack = stack.replace(...)(throwWithoutCjsAnchor()同样如此)——改写与运行时是否允许写入无关;部分链路上解析器错误的stack为只读访问器,赋值即崩,崩出的 TypeError 又没有code,使missingResource()的按-code 容忍完全失效。(仓库的 FIXME/TODO/XXX 标签、README Known Limitations 章节、提交历史均无此问题声明,属未预期缺陷。)期望行为 / 修复建议
错误改写必须是 best-effort:对 message / stack 的赋值包 try/catch,任何失败保留原错误对象与
code,让missingResource()按设计静默跳过、元信息回退显示包名。仅这一处防御即可让探测从「显性报错」恢复为「自愈性跳过」。(
throwWithoutCjsAnchor()中 message / requireStack / stack 的改写同理;补丁已在本地验证,resolver.ts+18/−8。)All reactions