diff --git a/src/plugin-sdk/facade-activation-check.runtime.ts b/src/plugin-sdk/facade-activation-check.runtime.ts index ceeb27ed2c3..87752a9043d 100644 --- a/src/plugin-sdk/facade-activation-check.runtime.ts +++ b/src/plugin-sdk/facade-activation-check.runtime.ts @@ -16,7 +16,10 @@ import { loadPluginManifestRegistry, type PluginManifestRecord, } from "../plugins/manifest-registry.js"; -import { normalizeBundledPluginArtifactSubpath } from "../plugins/public-surface-runtime.js"; +import { + PUBLIC_SURFACE_SOURCE_EXTENSIONS, + normalizeBundledPluginArtifactSubpath, +} from "../plugins/public-surface-runtime.js"; const ALWAYS_ALLOWED_RUNTIME_DIR_NAMES = new Set([ "image-generation-core", @@ -60,7 +63,6 @@ type FacadeModuleLocation = { modulePath: string; boundaryRoot: string; }; -const PUBLIC_SURFACE_SOURCE_EXTENSIONS = [".ts", ".mts", ".js", ".mjs", ".cts", ".cjs"] as const; function readFacadeBoundaryConfigSafely(): { rawConfig: OpenClawConfig; diff --git a/src/plugin-sdk/facade-loader.ts b/src/plugin-sdk/facade-loader.ts index e33ae5e2717..d19ac2eeed6 100644 --- a/src/plugin-sdk/facade-loader.ts +++ b/src/plugin-sdk/facade-loader.ts @@ -10,13 +10,13 @@ import { type PluginJitiLoaderFactory, } from "../plugins/jiti-loader-cache.js"; import { + PUBLIC_SURFACE_SOURCE_EXTENSIONS, normalizeBundledPluginArtifactSubpath, resolveBundledPluginPublicSurfacePath, } from "../plugins/public-surface-runtime.js"; import { resolveLoaderPackageRoot } from "../plugins/sdk-alias.js"; const CURRENT_MODULE_PATH = fileURLToPath(import.meta.url); -const PUBLIC_SURFACE_SOURCE_EXTENSIONS = [".ts", ".mts", ".js", ".mjs", ".cts", ".cjs"] as const; const nodeRequire = createRequire(import.meta.url); const jitiLoaders: PluginJitiLoaderCache = new Map(); diff --git a/src/plugin-sdk/facade-runtime.ts b/src/plugin-sdk/facade-runtime.ts index d5c2eadb18f..80a1d9a7ddc 100644 --- a/src/plugin-sdk/facade-runtime.ts +++ b/src/plugin-sdk/facade-runtime.ts @@ -5,6 +5,7 @@ import { fileURLToPath } from "node:url"; import { resolveBundledPluginsDir } from "../plugins/bundled-dir.js"; import type { PluginManifestRecord } from "../plugins/manifest-registry.js"; import { + PUBLIC_SURFACE_SOURCE_EXTENSIONS, normalizeBundledPluginArtifactSubpath, resolveBundledPluginPublicSurfacePath, } from "../plugins/public-surface-runtime.js"; @@ -27,7 +28,6 @@ const OPENCLAW_PACKAGE_ROOT = moduleUrl: import.meta.url, }) ?? fileURLToPath(new URL("../..", import.meta.url)); const CURRENT_MODULE_PATH = fileURLToPath(import.meta.url); -const PUBLIC_SURFACE_SOURCE_EXTENSIONS = [".ts", ".mts", ".js", ".mjs", ".cts", ".cjs"] as const; const OPENCLAW_SOURCE_EXTENSIONS_ROOT = path.resolve(OPENCLAW_PACKAGE_ROOT, "extensions"); const cachedFacadeModuleLocationsByKey = new Map< string, diff --git a/src/plugins/bundled-channel-config-metadata.ts b/src/plugins/bundled-channel-config-metadata.ts index 79324d426c1..b8f4bdab328 100644 --- a/src/plugins/bundled-channel-config-metadata.ts +++ b/src/plugins/bundled-channel-config-metadata.ts @@ -13,8 +13,8 @@ import type { PluginManifest, PluginManifestChannelConfig, } from "./manifest.js"; +import { PUBLIC_SURFACE_SOURCE_EXTENSIONS } from "./public-surface-runtime.js"; -const PUBLIC_SURFACE_SOURCE_EXTENSIONS = [".ts", ".mts", ".js", ".mjs", ".cts", ".cjs"] as const; const SOURCE_CONFIG_SCHEMA_CANDIDATES = [ path.join("src", "config-schema.ts"), path.join("src", "config-schema.js"), diff --git a/src/plugins/bundled-plugin-scan.ts b/src/plugins/bundled-plugin-scan.ts index 61ae99e4df3..73dfd77275f 100644 --- a/src/plugins/bundled-plugin-scan.ts +++ b/src/plugins/bundled-plugin-scan.ts @@ -2,8 +2,8 @@ import fs from "node:fs"; import path from "node:path"; import { normalizeOptionalString } from "../shared/string-coerce.js"; import { normalizeTrimmedStringList } from "../shared/string-normalization.js"; +import { PUBLIC_SURFACE_SOURCE_EXTENSIONS } from "./public-surface-runtime.js"; -const PUBLIC_SURFACE_SOURCE_EXTENSIONS = [".ts", ".mts", ".js", ".mjs", ".cts", ".cjs"] as const; const RUNTIME_SIDECAR_ARTIFACTS = new Set([ "helper-api.js", "light-runtime-api.js", diff --git a/src/plugins/public-surface-runtime.test.ts b/src/plugins/public-surface-runtime.test.ts index 96b57224740..d6364eb0e08 100644 --- a/src/plugins/public-surface-runtime.test.ts +++ b/src/plugins/public-surface-runtime.test.ts @@ -1,7 +1,21 @@ import { describe, expect, it } from "vitest"; -import { normalizeBundledPluginArtifactSubpath } from "./public-surface-runtime.js"; +import { + PUBLIC_SURFACE_SOURCE_EXTENSIONS, + normalizeBundledPluginArtifactSubpath, +} from "./public-surface-runtime.js"; describe("bundled plugin public surface runtime", () => { + it("exports the canonical public surface source extension list", () => { + expect(PUBLIC_SURFACE_SOURCE_EXTENSIONS).toEqual([ + ".ts", + ".mts", + ".js", + ".mjs", + ".cts", + ".cjs", + ]); + }); + it("allows plugin-local nested artifact paths", () => { expect(normalizeBundledPluginArtifactSubpath("src/outbound-adapter.js")).toBe( "src/outbound-adapter.js", diff --git a/src/plugins/public-surface-runtime.ts b/src/plugins/public-surface-runtime.ts index d7f1e7d4571..b76d1a30a4c 100644 --- a/src/plugins/public-surface-runtime.ts +++ b/src/plugins/public-surface-runtime.ts @@ -2,7 +2,14 @@ import fs from "node:fs"; import path from "node:path"; import { resolveBundledPluginsDir } from "./bundled-dir.js"; -const PUBLIC_SURFACE_SOURCE_EXTENSIONS = [".ts", ".mts", ".js", ".mjs", ".cts", ".cjs"] as const; +export const PUBLIC_SURFACE_SOURCE_EXTENSIONS = [ + ".ts", + ".mts", + ".js", + ".mjs", + ".cts", + ".cjs", +] as const; export function normalizeBundledPluginArtifactSubpath(artifactBasename: string): string { if (