


























@@ -24,6 +24,20 @@ function readPackageStringList(packageLabel, fieldName, value) {
2424return { entries, errors };
2525}
262627+function readOptionalPackageString(packageLabel, fieldName, value) {
28+if (value === undefined || value === null) {
29+return { entry: "", errors: [] };
30+}
31+const entry = typeof value === "string" ? value.trim() : "";
32+if (!entry) {
33+return {
34+entry: "",
35+errors: [`${packageLabel} package.json ${fieldName} must be a non-empty string`],
36+};
37+}
38+return { entry, errors: [] };
39+}
40+2741function normalizePackagePath(value) {
2842return value
2943.replace(/\\/g, "/")
@@ -58,6 +72,14 @@ function listBuiltRuntimeEntryCandidates(entryPath) {
5872].filter((candidate) => candidate !== normalized);
5973}
607475+function hasPackedFile(packageFiles, entryPath) {
76+return packageFiles.has(normalizePackagePath(entryPath));
77+}
78+79+function missingCompiledRuntimeError(packageLabel, entry, candidates) {
80+return `${packageLabel} requires compiled runtime output for TypeScript entry ${entry}: expected ${candidates.join(", ")}`;
81+}
82+6183function formatPackageLabel(packageJson, fallbackSpec) {
6284const packageName = typeof packageJson.name === "string" ? packageJson.name.trim() : "";
6385const packageVersion = typeof packageJson.version === "string" ? packageJson.version.trim() : "";
@@ -82,16 +104,29 @@ export function collectPluginNpmPublishedRuntimeErrors(params) {
82104"openclaw.runtimeExtensions",
83105packageJson.openclaw?.runtimeExtensions,
84106);
85-errors.push(...extensionsResult.errors, ...runtimeExtensionsResult.errors);
107+const setupEntryResult = readOptionalPackageString(
108+packageLabel,
109+"openclaw.setupEntry",
110+packageJson.openclaw?.setupEntry,
111+);
112+const runtimeSetupEntryResult = readOptionalPackageString(
113+packageLabel,
114+"openclaw.runtimeSetupEntry",
115+packageJson.openclaw?.runtimeSetupEntry,
116+);
117+errors.push(
118+ ...extensionsResult.errors,
119+ ...runtimeExtensionsResult.errors,
120+ ...setupEntryResult.errors,
121+ ...runtimeSetupEntryResult.errors,
122+);
86123if (errors.length > 0) {
87124return errors;
88125}
89126const extensions = extensionsResult.entries;
90127const runtimeExtensions = runtimeExtensionsResult.entries;
91-92-if (extensions.length === 0) {
93-return errors;
94-}
128+const setupEntry = setupEntryResult.entry;
129+const runtimeSetupEntry = runtimeSetupEntryResult.entry;
9513096131if (runtimeExtensions.length > 0 && runtimeExtensions.length !== extensions.length) {
97132errors.push(
@@ -103,7 +138,7 @@ export function collectPluginNpmPublishedRuntimeErrors(params) {
103138for (const [index, entry] of extensions.entries()) {
104139const runtimeEntry = runtimeExtensions[index];
105140if (runtimeEntry) {
106-if (!packageFiles.has(normalizePackagePath(runtimeEntry))) {
141+if (!hasPackedFile(packageFiles, runtimeEntry)) {
107142errors.push(`${packageLabel} runtime extension entry not found: ${runtimeEntry}`);
108143}
109144continue;
@@ -114,13 +149,40 @@ export function collectPluginNpmPublishedRuntimeErrors(params) {
114149}
115150116151const candidates = listBuiltRuntimeEntryCandidates(entry);
117-if (candidates.some((candidate) => packageFiles.has(normalizePackagePath(candidate)))) {
152+if (candidates.some((candidate) => hasPackedFile(packageFiles, candidate))) {
118153continue;
119154}
120155156+errors.push(missingCompiledRuntimeError(packageLabel, entry, candidates));
157+}
158+159+if (runtimeSetupEntry && !setupEntry) {
121160errors.push(
122-`${packageLabel} requires compiled runtime output for TypeScript entry ${entry}: expected ${candidates.join(", ")}`,
161+`${packageLabel} package.json openclaw.runtimeSetupEntry requires openclaw.setupEntry`,
123162);
163+return errors;
164+}
165+166+if (setupEntry) {
167+if (runtimeSetupEntry) {
168+if (!hasPackedFile(packageFiles, runtimeSetupEntry)) {
169+errors.push(`${packageLabel} runtime setup entry not found: ${runtimeSetupEntry}`);
170+}
171+return errors;
172+}
173+174+const candidates = listBuiltRuntimeEntryCandidates(setupEntry);
175+if (candidates.length > 0) {
176+if (candidates.some((candidate) => hasPackedFile(packageFiles, candidate))) {
177+return errors;
178+}
179+errors.push(missingCompiledRuntimeError(packageLabel, setupEntry, candidates));
180+return errors;
181+}
182+183+if (!hasPackedFile(packageFiles, setupEntry)) {
184+errors.push(`${packageLabel} setup entry not found: ${setupEntry}`);
185+}
124186}
125187126188return errors;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。