





















@@ -1,42 +1,88 @@
11import fs from "node:fs";
22import path from "node:path";
334-/**
5- * Static, non-transpiled runtime assets referenced by built extension code.
6- *
7- * `dest` is the root-package dist path. Package-local runtime builds rewrite it
8- * under the plugin package's own dist directory.
9- */
10-export const STATIC_EXTENSION_ASSETS = [
11-{
12-src: "extensions/acpx/src/runtime-internals/mcp-proxy.mjs",
13-dest: "dist/extensions/acpx/mcp-proxy.mjs",
14-},
15-{
16-src: "extensions/acpx/src/runtime-internals/error-format.mjs",
17-dest: "dist/extensions/acpx/error-format.mjs",
18-},
19-{
20-src: "extensions/acpx/src/runtime-internals/mcp-command-line.mjs",
21-dest: "dist/extensions/acpx/mcp-command-line.mjs",
22-},
23-{
24-src: "extensions/diffs/assets/viewer-runtime.js",
25-dest: "dist/extensions/diffs/assets/viewer-runtime.js",
26-},
27-];
4+function toPosixPath(value) {
5+return String(value ?? "").replaceAll("\\", "/");
6+}
7+8+function readJsonFile(filePath, fsImpl) {
9+return JSON.parse(fsImpl.readFileSync(filePath, "utf8"));
10+}
11+12+function normalizePackageRelativePath(value) {
13+const normalized = toPosixPath(value)
14+.trim()
15+.replace(/^\.\/+/u, "");
16+if (!normalized || normalized.startsWith("../") || normalized.includes("/../")) {
17+return "";
18+}
19+return normalized;
20+}
21+22+function listExtensionPackageDirs(rootDir, fsImpl) {
23+const extensionsRoot = path.join(rootDir, "extensions");
24+if (!fsImpl.existsSync(extensionsRoot)) {
25+return [];
26+}
27+return fsImpl
28+.readdirSync(extensionsRoot, { withFileTypes: true })
29+.filter((entry) => entry.isDirectory())
30+.map((entry) => ({
31+dirName: entry.name,
32+packageDir: path.join(extensionsRoot, entry.name),
33+}))
34+.toSorted((left, right) => left.dirName.localeCompare(right.dirName));
35+}
36+37+function readPackageStaticAssetEntries(packageJson) {
38+const entries = packageJson.openclaw?.build?.staticAssets;
39+return Array.isArray(entries) ? entries : [];
40+}
41+42+export function discoverStaticExtensionAssets(params = {}) {
43+const rootDir = params.rootDir ?? process.cwd();
44+const fsImpl = params.fs ?? fs;
45+const assets = [];
46+for (const { dirName, packageDir } of listExtensionPackageDirs(rootDir, fsImpl)) {
47+const packageJsonPath = path.join(packageDir, "package.json");
48+if (!fsImpl.existsSync(packageJsonPath)) {
49+continue;
50+}
51+const packageJson = readJsonFile(packageJsonPath, fsImpl);
52+for (const entry of readPackageStaticAssetEntries(packageJson)) {
53+const source = normalizePackageRelativePath(entry?.source);
54+const output = normalizePackageRelativePath(entry?.output);
55+if (!source || !output) {
56+continue;
57+}
58+assets.push({
59+pluginDir: dirName,
60+src: toPosixPath(path.posix.join("extensions", dirName, source)),
61+dest: toPosixPath(path.posix.join("dist", "extensions", dirName, output)),
62+});
63+}
64+}
65+return assets.toSorted((left, right) => left.dest.localeCompare(right.dest));
66+}
28672968export function listStaticExtensionAssetOutputs(params = {}) {
30-const assets = params.assets ?? STATIC_EXTENSION_ASSETS;
69+const assets = params.assets ?? discoverStaticExtensionAssets(params);
3170return assets
3271.map(({ dest }) => dest.replace(/\\/g, "/"))
3372.toSorted((left, right) => left.localeCompare(right));
3473}
357475+export function listStaticExtensionAssetSources(params = {}) {
76+const assets = params.assets ?? discoverStaticExtensionAssets(params);
77+return assets
78+.map(({ src }) => src.replace(/\\/g, "/"))
79+.toSorted((left, right) => left.localeCompare(right));
80+}
81+3682export function copyStaticExtensionAssets(params = {}) {
3783const rootDir = params.rootDir ?? process.cwd();
38-const assets = params.assets ?? STATIC_EXTENSION_ASSETS;
3984const fsImpl = params.fs ?? fs;
85+const assets = params.assets ?? discoverStaticExtensionAssets({ rootDir, fs: fsImpl });
4086const warn = params.warn ?? console.warn;
4187for (const { src, dest } of assets) {
4288const srcPath = path.join(rootDir, src);
@@ -52,8 +98,8 @@ export function copyStaticExtensionAssets(params = {}) {
52985399export function copyStaticExtensionAssetsForPackage(params) {
54100const rootDir = params.rootDir ?? process.cwd();
55-const assets = params.assets ?? STATIC_EXTENSION_ASSETS;
56101const fsImpl = params.fs ?? fs;
102+const assets = params.assets ?? discoverStaticExtensionAssets({ rootDir, fs: fsImpl });
57103const packagePrefix = `extensions/${params.pluginDir}/`;
58104const rootDistPrefix = `dist/extensions/${params.pluginDir}/`;
59105const copied = [];
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。