

























@@ -1022,6 +1022,53 @@ function resolvePluginModuleExport(moduleExport: unknown): {
10221022return {};
10231023}
102410241025+function isPluginLoadDebugEnabled(env: NodeJS.ProcessEnv): boolean {
1026+const normalized = normalizeLowercaseStringOrEmpty(env.OPENCLAW_PLUGIN_LOAD_DEBUG);
1027+return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
1028+}
1029+1030+function describePluginModuleExportShape(
1031+value: unknown,
1032+label = "export",
1033+seen: Set<unknown> = new Set(),
1034+): string[] {
1035+if (value === null) {
1036+return [`${label}:null`];
1037+}
1038+if (typeof value !== "object") {
1039+return [`${label}:${typeof value}`];
1040+}
1041+if (seen.has(value)) {
1042+return [`${label}:circular`];
1043+}
1044+seen.add(value);
1045+1046+const record = value as Record<string, unknown>;
1047+const keys = Object.keys(record).toSorted();
1048+const visibleKeys = keys.slice(0, 8);
1049+const extraCount = keys.length - visibleKeys.length;
1050+const keySummary =
1051+visibleKeys.length > 0
1052+ ? `${visibleKeys.join(",")}${extraCount > 0 ? `,+${extraCount}` : ""}`
1053+ : "none";
1054+const details = [`${label}:object keys=${keySummary}`];
1055+1056+for (const key of ["default", "module", "register", "activate"]) {
1057+if (Object.prototype.hasOwnProperty.call(record, key)) {
1058+details.push(...describePluginModuleExportShape(record[key], `${label}.${key}`, seen));
1059+}
1060+}
1061+return details;
1062+}
1063+1064+function formatMissingPluginRegisterError(moduleExport: unknown, env: NodeJS.ProcessEnv): string {
1065+const message = "plugin export missing register/activate";
1066+if (!isPluginLoadDebugEnabled(env)) {
1067+return message;
1068+}
1069+return `${message} (module shape: ${describePluginModuleExportShape(moduleExport).join("; ")})`;
1070+}
1071+10251072function mergeChannelPluginSection<T>(
10261073baseValue: T | undefined,
10271074overrideValue: T | undefined,
@@ -2511,7 +2558,7 @@ export function loadOpenClawPlugins(options: PluginLoadOptions = {}): PluginRegi
2511255825122559if (typeof register !== "function") {
25132560logger.error(`[plugins] ${record.id} missing register/activate export`);
2514-pushPluginLoadError("plugin export missing register/activate");
2561+pushPluginLoadError(formatMissingPluginRegisterError(mod, env));
25152562continue;
25162563}
25172564@@ -2934,7 +2981,7 @@ export async function loadOpenClawPluginCliRegistry(
2934298129352982if (typeof register !== "function") {
29362983logger.error(`[plugins] ${record.id} missing register/activate export`);
2937-pushPluginLoadError("plugin export missing register/activate");
2984+pushPluginLoadError(formatMissingPluginRegisterError(mod, env));
29382985continue;
29392986}
29402987此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。