


























@@ -168,6 +168,64 @@ export async function validatePackageExtensionEntriesForInstall(params: {
168168}
169169}
170170171+const packageManifest = getPackageManifestMetadata(params.manifest);
172+const setupEntry = normalizeOptionalString(packageManifest?.setupEntry);
173+const runtimeSetupEntry = normalizeOptionalString(packageManifest?.runtimeSetupEntry);
174+if (runtimeSetupEntry && !setupEntry) {
175+return {
176+ok: false,
177+error: "package.json openclaw.runtimeSetupEntry requires openclaw.setupEntry",
178+};
179+}
180+if (setupEntry) {
181+const sourceEntry = await validatePackageExtensionEntry({
182+packageDir: params.packageDir,
183+entry: setupEntry,
184+label: "setup entry",
185+requireExisting: false,
186+});
187+if (!sourceEntry.ok) {
188+return sourceEntry;
189+}
190+191+if (runtimeSetupEntry) {
192+const runtimeResult = await validatePackageExtensionEntry({
193+packageDir: params.packageDir,
194+entry: runtimeSetupEntry,
195+label: "runtime setup entry",
196+requireExisting: true,
197+});
198+if (!runtimeResult.ok) {
199+return runtimeResult;
200+}
201+return { ok: true };
202+}
203+204+if (sourceEntry.exists) {
205+return { ok: true };
206+}
207+208+let foundBuiltSetupEntry = false;
209+for (const builtEntry of listBuiltRuntimeEntryCandidates(setupEntry)) {
210+const builtResult = await validatePackageExtensionEntry({
211+packageDir: params.packageDir,
212+entry: builtEntry,
213+label: "inferred runtime setup entry",
214+requireExisting: false,
215+});
216+if (!builtResult.ok) {
217+return builtResult;
218+}
219+if (builtResult.exists) {
220+foundBuiltSetupEntry = true;
221+break;
222+}
223+}
224+if (!foundBuiltSetupEntry) {
225+return { ok: false, error: `setup entry not found: ${setupEntry}` };
226+}
227+}
228+171229return { ok: true };
172230}
173231@@ -307,6 +365,7 @@ function resolvePackageRuntimeEntrySource(params: {
307365packageRootRealPath?: string;
308366entryPath: string;
309367runtimeEntryPath?: string;
368+runtimeEntryLabel?: string;
310369origin: PluginOrigin;
311370sourceLabel: string;
312371diagnostics: PluginDiagnostic[];
@@ -340,6 +399,12 @@ function resolvePackageRuntimeEntrySource(params: {
340399if (runtimeSource) {
341400return runtimeSource;
342401}
402+params.diagnostics.push({
403+level: "error",
404+message: `${params.runtimeEntryLabel ?? "runtime entry"} not found: ${params.runtimeEntryPath}`,
405+source: params.sourceLabel,
406+});
407+return null;
343408}
344409345410if (shouldInferBuiltRuntimeEntry(params.origin)) {
@@ -397,6 +462,7 @@ export function resolvePackageSetupSource(params: {
397462 : {}),
398463entryPath: setupEntryPath,
399464runtimeEntryPath: normalizeOptionalString(packageManifest?.runtimeSetupEntry),
465+runtimeEntryLabel: "runtime setup entry",
400466origin: params.origin,
401467sourceLabel: params.sourceLabel,
402468diagnostics: params.diagnostics,
@@ -435,6 +501,7 @@ export function resolvePackageRuntimeExtensionSources(params: {
435501 : {}),
436502 entryPath,
437503runtimeEntryPath: runtimeResolution.runtimeExtensions[index],
504+runtimeEntryLabel: "runtime extension entry",
438505origin: params.origin,
439506sourceLabel: params.sourceLabel,
440507diagnostics: params.diagnostics,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。