






















@@ -13,7 +13,7 @@ import {
1313import { builtinModules } from "node:module";
1414import { createRequire } from "node:module";
1515import { tmpdir } from "node:os";
16-import { isAbsolute, join, relative } from "node:path";
16+import { dirname, isAbsolute, join, relative } from "node:path";
1717import { pathToFileURL } from "node:url";
1818import { formatErrorMessage } from "../src/infra/errors.ts";
1919import { BUNDLED_RUNTIME_SIDECAR_PATHS } from "../src/plugins/runtime-sidecar-paths.ts";
@@ -129,6 +129,7 @@ export function collectInstalledPackageErrors(params: {
129129}
130130131131errors.push(...collectInstalledContextEngineRuntimeErrors(params.packageRoot));
132+errors.push(...collectInstalledPluginSdkZodArtifactErrors(params.packageRoot));
132133errors.push(...collectInstalledRootDependencyManifestErrors(params.packageRoot));
133134134135return errors;
@@ -214,6 +215,97 @@ export function collectInstalledContextEngineRuntimeErrors(packageRoot: string):
214215return errors;
215216}
216217218+function resolveInstalledDistRelativeImport(params: {
219+distRoot: string;
220+importerPath: string;
221+specifier: string;
222+}): string | null {
223+if (!params.specifier.startsWith(".")) {
224+return null;
225+}
226+227+const candidatePath = join(dirname(params.importerPath), params.specifier);
228+const candidatePaths = [
229+candidatePath,
230+`${candidatePath}.js`,
231+`${candidatePath}.mjs`,
232+`${candidatePath}.cjs`,
233+join(candidatePath, "index.js"),
234+join(candidatePath, "index.mjs"),
235+join(candidatePath, "index.cjs"),
236+];
237+238+for (const resolvedPath of candidatePaths) {
239+const relativePath = relative(params.distRoot, resolvedPath);
240+if (
241+relativePath.length === 0 ||
242+relativePath.startsWith("..") ||
243+isAbsolute(relativePath) ||
244+!existsSync(resolvedPath)
245+) {
246+continue;
247+}
248+return resolvedPath;
249+}
250+251+return null;
252+}
253+254+export function collectInstalledPluginSdkZodArtifactErrors(packageRoot: string): string[] {
255+const distRoot = join(packageRoot, "dist");
256+const entryRelativePath = "dist/plugin-sdk/zod.js";
257+const entryPath = join(packageRoot, entryRelativePath);
258+const pending = [entryPath];
259+const visited = new Set<string>();
260+261+while (pending.length > 0) {
262+const filePath = pending.pop();
263+if (!filePath || visited.has(filePath)) {
264+ continue;
265+}
266+visited.add(filePath);
267+268+if (!existsSync(filePath)) {
269+return [`installed package is missing required plugin SDK artifact: ${entryRelativePath}`];
270+}
271+272+const relativePath = relative(packageRoot, filePath).replaceAll("\\", "/");
273+const fileStat = lstatSync(filePath);
274+if (!fileStat.isFile() || fileStat.size > MAX_INSTALLED_ROOT_DIST_JS_BYTES) {
275+return [
276+`installed package plugin SDK artifact '${relativePath}' is invalid or exceeds ${MAX_INSTALLED_ROOT_DIST_JS_BYTES} bytes.`,
277+];
278+}
279+280+const source = readFileSync(filePath, "utf8");
281+const parsedSpecifiers = extractJavaScriptImportSpecifiers(source);
282+if (!parsedSpecifiers.ok) {
283+return [
284+ `installed package plugin SDK artifact '${relativePath}' could not be parsed for runtime dependency verification: ${parsedSpecifiers.error}.`,
285+];
286+}
287+288+for (const specifier of parsedSpecifiers.specifiers) {
289+if (specifier === "zod" || specifier.startsWith("zod/")) {
290+return [
291+ `installed package plugin SDK zod artifact must be self-contained but ${relativePath} imports ${specifier}.`,
292+];
293+}
294+295+const resolvedPath = resolveInstalledDistRelativeImport({
296+distRoot,
297+importerPath: filePath,
298+specifier,
299+});
300+if (resolvedPath) {
301+pending.push(resolvedPath);
302+}
303+}
304+}
305+306+return [];
307+}
308+217309function listInstalledRootDistJavaScriptFiles(packageRoot: string): string[] {
218310return listDistJavaScriptFiles(packageRoot, {
219311skipRelativePath: (relativePath) => relativePath.startsWith("extensions/"),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。