mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 02:10:46 +00:00
refactor(plugins): rename clawhub storepack metadata to clawpack
This commit is contained in:
@@ -53,8 +53,8 @@ const { CLAWHUB_INSTALL_ERROR_CODE, formatClawHubSpecifier, installPluginFromCla
|
||||
await import("./clawhub.js");
|
||||
|
||||
const DEMO_ARCHIVE_INTEGRITY = "sha256-qerEjGEpvES2+Tyan0j2xwDRkbcnmh4ZFfKN9vWbsa8=";
|
||||
const DEMO_STOREPACK_SHA256 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
|
||||
const DEMO_STOREPACK_MANIFEST_SHA256 =
|
||||
const DEMO_CLAWPACK_SHA256 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
|
||||
const DEMO_CLAWPACK_MANIFEST_SHA256 =
|
||||
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
|
||||
const tempDirs: string[] = [];
|
||||
|
||||
@@ -293,7 +293,7 @@ describe("installPluginFromClawHub", () => {
|
||||
);
|
||||
});
|
||||
|
||||
it("returns StorePack metadata from compatible ClawHub package versions", async () => {
|
||||
it("returns ClawPack metadata from compatible ClawHub package versions", async () => {
|
||||
fetchClawHubPackageVersionMock.mockResolvedValueOnce({
|
||||
version: {
|
||||
version: "2026.3.22",
|
||||
@@ -304,14 +304,14 @@ describe("installPluginFromClawHub", () => {
|
||||
pluginApiRange: ">=2026.3.22",
|
||||
minGatewayVersion: "2026.3.0",
|
||||
},
|
||||
storepack: {
|
||||
clawpack: {
|
||||
available: true,
|
||||
specVersion: 1,
|
||||
format: "storepack.zip",
|
||||
sha256: DEMO_STOREPACK_SHA256,
|
||||
format: "clawpack.zip",
|
||||
sha256: DEMO_CLAWPACK_SHA256,
|
||||
size: 4096,
|
||||
fileCount: 7,
|
||||
manifestSha256: DEMO_STOREPACK_MANIFEST_SHA256,
|
||||
manifestSha256: DEMO_CLAWPACK_MANIFEST_SHA256,
|
||||
builtAt: 1774200000000,
|
||||
buildVersion: "2026.3.22",
|
||||
hostTargets: [],
|
||||
@@ -329,15 +329,15 @@ describe("installPluginFromClawHub", () => {
|
||||
expect(result).toMatchObject({
|
||||
ok: true,
|
||||
clawhub: {
|
||||
storepackSha256: DEMO_STOREPACK_SHA256,
|
||||
storepackSpecVersion: 1,
|
||||
storepackManifestSha256: DEMO_STOREPACK_MANIFEST_SHA256,
|
||||
storepackSize: 4096,
|
||||
clawpackSha256: DEMO_CLAWPACK_SHA256,
|
||||
clawpackSpecVersion: 1,
|
||||
clawpackManifestSha256: DEMO_CLAWPACK_MANIFEST_SHA256,
|
||||
clawpackSize: 4096,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it("does not persist package-level StorePack metadata for version records without StorePack facts", async () => {
|
||||
it("does not persist package-level ClawPack metadata for version records without ClawPack facts", async () => {
|
||||
parseClawHubPluginSpecMock.mockReturnValueOnce({ name: "demo", version: "2026.3.21" });
|
||||
fetchClawHubPackageDetailMock.mockResolvedValueOnce({
|
||||
package: {
|
||||
@@ -352,14 +352,14 @@ describe("installPluginFromClawHub", () => {
|
||||
pluginApiRange: ">=2026.3.22",
|
||||
minGatewayVersion: "2026.3.0",
|
||||
},
|
||||
storepack: {
|
||||
clawpack: {
|
||||
available: true,
|
||||
specVersion: 1,
|
||||
format: "storepack.zip",
|
||||
sha256: DEMO_STOREPACK_SHA256,
|
||||
format: "clawpack.zip",
|
||||
sha256: DEMO_CLAWPACK_SHA256,
|
||||
size: 4096,
|
||||
fileCount: 7,
|
||||
manifestSha256: DEMO_STOREPACK_MANIFEST_SHA256,
|
||||
manifestSha256: DEMO_CLAWPACK_MANIFEST_SHA256,
|
||||
builtAt: 1774200000000,
|
||||
buildVersion: "2026.3.22",
|
||||
hostTargets: [],
|
||||
@@ -395,10 +395,10 @@ describe("installPluginFromClawHub", () => {
|
||||
if (!result.ok) {
|
||||
throw new Error(result.error);
|
||||
}
|
||||
expect(result.clawhub.storepackSha256).toBeUndefined();
|
||||
expect(result.clawhub.storepackSpecVersion).toBeUndefined();
|
||||
expect(result.clawhub.storepackManifestSha256).toBeUndefined();
|
||||
expect(result.clawhub.storepackSize).toBeUndefined();
|
||||
expect(result.clawhub.clawpackSha256).toBeUndefined();
|
||||
expect(result.clawhub.clawpackSpecVersion).toBeUndefined();
|
||||
expect(result.clawhub.clawpackManifestSha256).toBeUndefined();
|
||||
expect(result.clawhub.clawpackSize).toBeUndefined();
|
||||
});
|
||||
|
||||
it("installs when ClawHub advertises a wildcard plugin API range", async () => {
|
||||
|
||||
@@ -25,7 +25,7 @@ import {
|
||||
type ClawHubPackageCompatibility,
|
||||
type ClawHubPackageDetail,
|
||||
type ClawHubPackageFamily,
|
||||
type ClawHubPackageStorePackSummary,
|
||||
type ClawHubPackageClawPackSummary,
|
||||
type ClawHubPackageVersion,
|
||||
} from "../infra/clawhub.js";
|
||||
import { formatErrorMessage } from "../infra/errors.js";
|
||||
@@ -66,10 +66,10 @@ export type ClawHubPluginInstallRecordFields = {
|
||||
integrity?: string;
|
||||
resolvedAt?: string;
|
||||
installedAt?: string;
|
||||
storepackSha256?: string;
|
||||
storepackSpecVersion?: number;
|
||||
storepackManifestSha256?: string;
|
||||
storepackSize?: number;
|
||||
clawpackSha256?: string;
|
||||
clawpackSpecVersion?: number;
|
||||
clawpackManifestSha256?: string;
|
||||
clawpackSize?: number;
|
||||
};
|
||||
|
||||
type ClawHubInstallFailure = {
|
||||
@@ -127,38 +127,36 @@ type ClawHubArchiveEntryLimits = {
|
||||
addArchiveBytes: (bytes: number) => boolean;
|
||||
};
|
||||
|
||||
function normalizeClawHubStorePackInstallFields(
|
||||
storepack: ClawHubPackageStorePackSummary | null | undefined,
|
||||
function normalizeClawHubClawPackInstallFields(
|
||||
clawpack: ClawHubPackageClawPackSummary | null | undefined,
|
||||
): Pick<
|
||||
ClawHubPluginInstallRecordFields,
|
||||
"storepackSha256" | "storepackSpecVersion" | "storepackManifestSha256" | "storepackSize"
|
||||
"clawpackSha256" | "clawpackSpecVersion" | "clawpackManifestSha256" | "clawpackSize"
|
||||
> {
|
||||
if (storepack?.available !== true) {
|
||||
if (clawpack?.available !== true) {
|
||||
return {};
|
||||
}
|
||||
const storepackSha256 =
|
||||
typeof storepack.sha256 === "string" ? normalizeClawHubSha256Hex(storepack.sha256) : null;
|
||||
const storepackManifestSha256 =
|
||||
typeof storepack.manifestSha256 === "string"
|
||||
? normalizeClawHubSha256Hex(storepack.manifestSha256)
|
||||
const clawpackSha256 =
|
||||
typeof clawpack.sha256 === "string" ? normalizeClawHubSha256Hex(clawpack.sha256) : null;
|
||||
const clawpackManifestSha256 =
|
||||
typeof clawpack.manifestSha256 === "string"
|
||||
? normalizeClawHubSha256Hex(clawpack.manifestSha256)
|
||||
: null;
|
||||
const storepackSpecVersion =
|
||||
typeof storepack.specVersion === "number" &&
|
||||
Number.isSafeInteger(storepack.specVersion) &&
|
||||
storepack.specVersion >= 0
|
||||
? storepack.specVersion
|
||||
const clawpackSpecVersion =
|
||||
typeof clawpack.specVersion === "number" &&
|
||||
Number.isSafeInteger(clawpack.specVersion) &&
|
||||
clawpack.specVersion >= 0
|
||||
? clawpack.specVersion
|
||||
: undefined;
|
||||
const storepackSize =
|
||||
typeof storepack.size === "number" &&
|
||||
Number.isSafeInteger(storepack.size) &&
|
||||
storepack.size >= 0
|
||||
? storepack.size
|
||||
const clawpackSize =
|
||||
typeof clawpack.size === "number" && Number.isSafeInteger(clawpack.size) && clawpack.size >= 0
|
||||
? clawpack.size
|
||||
: undefined;
|
||||
return {
|
||||
...(storepackSha256 ? { storepackSha256 } : {}),
|
||||
...(storepackSpecVersion !== undefined ? { storepackSpecVersion } : {}),
|
||||
...(storepackManifestSha256 ? { storepackManifestSha256 } : {}),
|
||||
...(storepackSize !== undefined ? { storepackSize } : {}),
|
||||
...(clawpackSha256 ? { clawpackSha256 } : {}),
|
||||
...(clawpackSpecVersion !== undefined ? { clawpackSpecVersion } : {}),
|
||||
...(clawpackManifestSha256 ? { clawpackManifestSha256 } : {}),
|
||||
...(clawpackSize !== undefined ? { clawpackSize } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -641,7 +639,7 @@ async function resolveCompatiblePackageVersion(params: {
|
||||
version: string;
|
||||
compatibility?: ClawHubPackageCompatibility | null;
|
||||
verification: ClawHubArchiveVerification | null;
|
||||
storepack?: ClawHubPackageStorePackSummary | null;
|
||||
clawpack?: ClawHubPackageClawPackSummary | null;
|
||||
}
|
||||
| ClawHubInstallFailure
|
||||
> {
|
||||
@@ -676,7 +674,7 @@ async function resolveCompatiblePackageVersion(params: {
|
||||
compatibility:
|
||||
versionDetail.version?.compatibility ?? params.detail.package?.compatibility ?? null,
|
||||
verification: null,
|
||||
storepack: versionDetail.version?.storepack ?? null,
|
||||
clawpack: versionDetail.version?.clawpack ?? null,
|
||||
};
|
||||
}
|
||||
const verificationState = resolveClawHubArchiveVerification(
|
||||
@@ -693,7 +691,7 @@ async function resolveCompatiblePackageVersion(params: {
|
||||
compatibility:
|
||||
versionDetail.version?.compatibility ?? params.detail.package?.compatibility ?? null,
|
||||
verification: verificationState.verification,
|
||||
storepack: versionDetail.version?.storepack ?? null,
|
||||
clawpack: versionDetail.version?.clawpack ?? null,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -922,7 +920,7 @@ export async function installPluginFromClawHub(
|
||||
}
|
||||
|
||||
const pkg = detail.package!;
|
||||
const storepackFields = normalizeClawHubStorePackInstallFields(versionState.storepack);
|
||||
const clawpackFields = normalizeClawHubClawPackInstallFields(versionState.clawpack);
|
||||
const clawhubFamily =
|
||||
pkg.family === "code-plugin" || pkg.family === "bundle-plugin" ? pkg.family : null;
|
||||
if (!clawhubFamily) {
|
||||
@@ -948,7 +946,7 @@ export async function installPluginFromClawHub(
|
||||
// server-attested sha256hash from ClawHub version metadata.
|
||||
integrity: archive.integrity,
|
||||
resolvedAt: new Date().toISOString(),
|
||||
...storepackFields,
|
||||
...clawpackFields,
|
||||
},
|
||||
};
|
||||
} finally {
|
||||
|
||||
@@ -52,10 +52,10 @@ function normalizeInstallRecord(
|
||||
setInstallStringField(normalized, "clawhubPackage", record.clawhubPackage);
|
||||
setInstallStringField(normalized, "clawhubFamily", record.clawhubFamily);
|
||||
setInstallStringField(normalized, "clawhubChannel", record.clawhubChannel);
|
||||
setInstallStringField(normalized, "storepackSha256", record.storepackSha256);
|
||||
setInstallNumberField(normalized, "storepackSpecVersion", record.storepackSpecVersion);
|
||||
setInstallStringField(normalized, "storepackManifestSha256", record.storepackManifestSha256);
|
||||
setInstallNumberField(normalized, "storepackSize", record.storepackSize);
|
||||
setInstallStringField(normalized, "clawpackSha256", record.clawpackSha256);
|
||||
setInstallNumberField(normalized, "clawpackSpecVersion", record.clawpackSpecVersion);
|
||||
setInstallStringField(normalized, "clawpackManifestSha256", record.clawpackManifestSha256);
|
||||
setInstallNumberField(normalized, "clawpackSize", record.clawpackSize);
|
||||
setInstallStringField(normalized, "gitUrl", record.gitUrl);
|
||||
setInstallStringField(normalized, "gitRef", record.gitRef);
|
||||
setInstallStringField(normalized, "gitCommit", record.gitCommit);
|
||||
|
||||
@@ -192,37 +192,37 @@ describe("plugin index install records store", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("preserves ClawHub StorePack install metadata in persisted records", async () => {
|
||||
it("preserves ClawHub ClawPack install metadata in persisted records", async () => {
|
||||
const stateDir = makeStateDir();
|
||||
const candidate = createPluginCandidate(stateDir, "storepack-demo");
|
||||
const candidate = createPluginCandidate(stateDir, "clawpack-demo");
|
||||
await writePersistedInstalledPluginIndexInstallRecords(
|
||||
{
|
||||
"storepack-demo": {
|
||||
"clawpack-demo": {
|
||||
source: "clawhub",
|
||||
spec: "clawhub:storepack-demo",
|
||||
installPath: path.join(stateDir, "plugins", "storepack-demo"),
|
||||
spec: "clawhub:clawpack-demo",
|
||||
installPath: path.join(stateDir, "plugins", "clawpack-demo"),
|
||||
clawhubUrl: "https://clawhub.ai",
|
||||
clawhubPackage: "storepack-demo",
|
||||
clawhubPackage: "clawpack-demo",
|
||||
clawhubFamily: "code-plugin",
|
||||
clawhubChannel: "official",
|
||||
storepackSha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
storepackSpecVersion: 1,
|
||||
storepackManifestSha256:
|
||||
clawpackSha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
clawpackSpecVersion: 1,
|
||||
clawpackManifestSha256:
|
||||
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
||||
storepackSize: 4096,
|
||||
clawpackSize: 4096,
|
||||
},
|
||||
},
|
||||
{ stateDir, candidates: [candidate] },
|
||||
);
|
||||
|
||||
await expect(loadInstalledPluginIndexInstallRecords({ stateDir })).resolves.toMatchObject({
|
||||
"storepack-demo": {
|
||||
"clawpack-demo": {
|
||||
source: "clawhub",
|
||||
spec: "clawhub:storepack-demo",
|
||||
storepackSha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
storepackSpecVersion: 1,
|
||||
storepackManifestSha256: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
||||
storepackSize: 4096,
|
||||
spec: "clawhub:clawpack-demo",
|
||||
clawpackSha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
clawpackSpecVersion: 1,
|
||||
clawpackManifestSha256: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
||||
clawpackSize: 4096,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
@@ -48,10 +48,10 @@ export type InstalledPluginInstallRecordInfo = Pick<
|
||||
| "clawhubPackage"
|
||||
| "clawhubFamily"
|
||||
| "clawhubChannel"
|
||||
| "storepackSha256"
|
||||
| "storepackSpecVersion"
|
||||
| "storepackManifestSha256"
|
||||
| "storepackSize"
|
||||
| "clawpackSha256"
|
||||
| "clawpackSpecVersion"
|
||||
| "clawpackManifestSha256"
|
||||
| "clawpackSize"
|
||||
| "gitUrl"
|
||||
| "gitRef"
|
||||
| "gitCommit"
|
||||
|
||||
@@ -1003,10 +1003,10 @@ describe("updateNpmInstalledPlugins", () => {
|
||||
clawhubChannel: "official",
|
||||
integrity: "sha256-next",
|
||||
resolvedAt: "2026-03-22T00:00:00.000Z",
|
||||
storepackSha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
storepackSpecVersion: 1,
|
||||
storepackManifestSha256: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
||||
storepackSize: 4096,
|
||||
clawpackSha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
clawpackSpecVersion: 1,
|
||||
clawpackManifestSha256: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
||||
clawpackSize: 4096,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1041,10 +1041,10 @@ describe("updateNpmInstalledPlugins", () => {
|
||||
clawhubFamily: "code-plugin",
|
||||
clawhubChannel: "official",
|
||||
integrity: "sha256-next",
|
||||
storepackSha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
storepackSpecVersion: 1,
|
||||
storepackManifestSha256: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
||||
storepackSize: 4096,
|
||||
clawpackSha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
clawpackSpecVersion: 1,
|
||||
clawpackManifestSha256: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
||||
clawpackSize: 4096,
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -938,10 +938,10 @@ export async function updateNpmInstalledPlugins(params: {
|
||||
clawhubPackage: clawhubResult.clawhub.clawhubPackage,
|
||||
clawhubFamily: clawhubResult.clawhub.clawhubFamily,
|
||||
clawhubChannel: clawhubResult.clawhub.clawhubChannel,
|
||||
storepackSha256: clawhubResult.clawhub.storepackSha256,
|
||||
storepackSpecVersion: clawhubResult.clawhub.storepackSpecVersion,
|
||||
storepackManifestSha256: clawhubResult.clawhub.storepackManifestSha256,
|
||||
storepackSize: clawhubResult.clawhub.storepackSize,
|
||||
clawpackSha256: clawhubResult.clawhub.clawpackSha256,
|
||||
clawpackSpecVersion: clawhubResult.clawhub.clawpackSpecVersion,
|
||||
clawpackManifestSha256: clawhubResult.clawhub.clawpackManifestSha256,
|
||||
clawpackSize: clawhubResult.clawhub.clawpackSize,
|
||||
});
|
||||
} else if (record.source === "git") {
|
||||
const gitResult = result as Extract<
|
||||
|
||||
Reference in New Issue
Block a user