[mcp] 修复: restart-package 对任意扩展生效(disable/enable 须传注册路径)

Editor.Package.disable/enable 的参数是扩展绝对路径不是 name(typings:
enable(path)/disable(path, options)), 传 name 会 disable 静默不生效 +
enable 报 "[Package] Unknown and unable to start", 旧实例(含其 http
server 等资源)永久泄漏。改为 getPackages 按 name 反查 path 再调用;
传入已是路径则直接用。实测 guide-editor 按名 reload 后 unload→load
完整执行, 8099 监听 socket 换新
This commit is contained in:
furao
2026-06-11 14:37:24 +08:00
parent b180bd290b
commit 2526bc3beb
+17 -2
View File
@@ -531,16 +531,31 @@ async function doOpenPrefab(urlOrPath) {
* 注意:reload 本插件自身时,本函数处于即将被卸载的 main.js 上下文,必须 fire-and-forget。
* Editor.Package.disable 是 host 进程 API,扩展沙箱卸载后仍然有效;
* enable 在 disable 完成后用 setTimeout 触发,给 unload 收尾留窗口。
* ⚠️ disable/enable 的参数是扩展**绝对路径**不是 nametypings: enable(path) /
* disable(path, options))——传 name 会 disable 静默不生效 + enable 报
* "[Package] Unknown and unable to start",必须先用 getPackages 反查注册路径。
*/
function doRestartSelf(name) {
name = name || 'cc-3-8-x-mcp';
log('restart-package: scheduling disable → enable for ' + name);
setImmediate(function () {
Promise.resolve()
.then(function () { return Editor.Package.disable(name, true); })
.then(function () {
if (name.indexOf('/') >= 0 || name.indexOf('\\') >= 0) return name; // 已是路径直接用
var list = (Editor.Package.getPackages() || []).filter(function (p) {
return p && (p.name === name || (p.info && p.info.name === name));
});
if (!list.length || !list[0].path) {
throw new Error('找不到扩展 "' + name + '" 的注册路径(getPackages 匹配 ' + list.length + ' 条)');
}
return list[0].path;
})
.then(function (pkgPath) {
return Promise.resolve(Editor.Package.disable(pkgPath))
// 200ms 给 unload 钩子(stopRefreshWatcher / stopMcpServer)跑完
.then(function () { return new Promise(function (r) { setTimeout(r, 200); }); })
.then(function () { return Editor.Package.enable(name, true); })
.then(function () { return Editor.Package.enable(pkgPath); });
})
.catch(function (err) {
console.error('[restart-package] failed:', err && (err.stack || err.message) || err);
});