






























@@ -376,6 +376,44 @@ function readInstalledPluginIndex() {
376376return readJson(file);
377377}
378378379+function assertExternalPluginInstall(records, pluginId, packageName) {
380+const record = records[pluginId];
381+assert(record, `configured external ${pluginId} plugin install record missing`);
382+assert(
383+record.source === "clawhub" || record.source === "npm",
384+`configured external ${pluginId} plugin installed from unexpected source: ${record.source}`,
385+);
386+const installPath = resolveHomePath(record.installPath);
387+assert(
388+installPath,
389+`configured external ${pluginId} plugin installPath missing: ${JSON.stringify(record)}`,
390+);
391+assert(
392+fs.existsSync(installPath),
393+`configured external ${pluginId} plugin installPath missing on disk: ${installPath}`,
394+);
395+assert(
396+fs.existsSync(path.join(installPath, "package.json")),
397+`configured external ${pluginId} plugin package.json missing: ${installPath}`,
398+);
399+if (record.source === "clawhub") {
400+assert(
401+String(record.spec ?? "").startsWith(`clawhub:${packageName}`),
402+`configured external ${pluginId} plugin ClawHub spec changed`,
403+);
404+} else {
405+const npmRoot = path.join(requireEnv("OPENCLAW_STATE_DIR"), "npm", "node_modules");
406+assert(
407+isPathInside(npmRoot, installPath),
408+`configured external ${pluginId} npm install path outside managed npm root: ${installPath}`,
409+);
410+assert(
411+String(record.spec ?? record.resolvedSpec ?? "").startsWith(packageName),
412+`configured external ${pluginId} plugin npm spec changed`,
413+);
414+}
415+}
416+379417function assertConfiguredPluginInstalls() {
380418const coverage = getCoverage();
381419const stage = process.env.OPENCLAW_UPGRADE_SURVIVOR_ASSERT_STAGE || "survival";
@@ -395,44 +433,12 @@ function assertConfiguredPluginInstalls() {
395433"configured matrix plugin is neither present in the plugin index nor installed externally",
396434);
397435assert(bundledMatrix.enabled !== false, "configured bundled matrix plugin is disabled");
398-assert(!records.discord, "internal discord plugin should not be installed externally");
436+assertExternalPluginInstall(records, "discord", "@openclaw/discord");
399437assert(!records.telegram, "internal telegram plugin should not be installed externally");
400438return;
401439}
402-assert(
403-matrix.source === "clawhub" || matrix.source === "npm",
404-`configured external matrix plugin installed from unexpected source: ${matrix.source}`,
405-);
406-const installPath = resolveHomePath(matrix.installPath);
407-assert(
408-installPath,
409-`configured external matrix plugin installPath missing: ${JSON.stringify(matrix)}`,
410-);
411-assert(
412-fs.existsSync(installPath),
413-`configured external matrix plugin installPath missing on disk: ${installPath}`,
414-);
415-assert(
416-fs.existsSync(path.join(installPath, "package.json")),
417-`configured external matrix plugin package.json missing: ${installPath}`,
418-);
419-if (matrix.source === "clawhub") {
420-assert(
421-String(matrix.spec ?? "").startsWith("clawhub:@openclaw/matrix"),
422-"configured external matrix plugin ClawHub spec changed",
423-);
424-} else {
425-const npmRoot = path.join(requireEnv("OPENCLAW_STATE_DIR"), "npm", "node_modules");
426-assert(
427-isPathInside(npmRoot, installPath),
428-`configured external matrix npm install path outside managed npm root: ${installPath}`,
429-);
430-assert(
431-String(matrix.spec ?? matrix.resolvedSpec ?? "").startsWith("@openclaw/matrix"),
432-"configured external matrix plugin npm spec changed",
433-);
434-}
435-assert(!records.discord, "internal discord plugin should not be installed externally");
440+assertExternalPluginInstall(records, "matrix", "@openclaw/matrix");
441+assertExternalPluginInstall(records, "discord", "@openclaw/discord");
436442assert(!records.telegram, "internal telegram plugin should not be installed externally");
437443}
438444此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。