UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

194 lines (193 loc) 6.91 kB
import { c as isRecord } from "./record-coerce-DItp3I4t.js"; import { At as boolean, Et as array, Rn as string, Tn as object, Xn as union, dn as literal, wn as number } from "./schemas-zxit8y5H.js"; //#region src/config/zod-schema.installs.ts const InstallSourceSchema = union([ literal("npm"), literal("archive"), literal("path"), literal("clawhub"), literal("git") ]); const PluginInstallSourceSchema = union([InstallSourceSchema, literal("marketplace")]); const PluginInstallRecordShape = { source: InstallSourceSchema, spec: string().optional(), sourcePath: string().optional(), installPath: string().optional(), version: string().optional(), resolvedName: string().optional(), resolvedVersion: string().optional(), resolvedSpec: string().optional(), integrity: string().optional(), shasum: string().optional(), resolvedAt: string().optional(), installedAt: string().optional(), clawhubUrl: string().optional(), clawhubPackage: string().optional(), clawhubFamily: union([literal("code-plugin"), literal("bundle-plugin")]).optional(), clawhubChannel: union([ literal("official"), literal("community"), literal("private") ]).optional(), clawhubTrustDisposition: union([ literal("clean"), literal("review-recommended"), literal("review-required"), literal("blocked") ]).optional(), clawhubTrustScanStatus: string().optional(), clawhubTrustModerationState: string().optional(), clawhubTrustReasons: array(string()).optional(), clawhubTrustPending: boolean().optional(), clawhubTrustStale: boolean().optional(), clawhubTrustCheckedAt: string().optional(), clawhubTrustAcknowledgedAt: string().optional(), artifactKind: union([literal("legacy-zip"), literal("npm-pack")]).optional(), artifactFormat: union([literal("zip"), literal("tgz")]).optional(), npmIntegrity: string().optional(), npmShasum: string().optional(), npmTarballName: string().optional(), clawpackSha256: string().optional(), clawpackSpecVersion: number().int().nonnegative().optional(), clawpackManifestSha256: string().optional(), clawpackSize: number().int().nonnegative().optional(), gitUrl: string().optional(), gitRef: string().optional(), gitCommit: string().optional(), source: PluginInstallSourceSchema, marketplaceName: string().optional(), marketplaceSource: string().optional(), marketplacePlugin: string().optional(), acceptedSurface: object({ channels: array(string().min(1)), providers: array(string().min(1)), tools: array(string().min(1)), contracts: array(string().min(1)), hooks: array(string().min(1)), mcpServers: array(string().min(1)), cliCommands: array(string().min(1)), cliBackends: array(string().min(1)), skills: array(string().min(1)), dangerousConfigFlags: array(string().min(1)) }).strict().optional(), acceptedSurfaceHash: string().optional(), acceptedSurfaceAt: string().optional(), acceptedSurfaceIntegrity: string().optional() }; //#endregion //#region src/config/plugin-install-record-map.ts const PluginInstallRecordSchema = object(PluginInstallRecordShape).passthrough(); const NORMALIZED_STRING_FIELDS = [ "spec", "sourcePath", "installPath", "version", "resolvedName", "resolvedVersion", "resolvedSpec", "integrity", "shasum", "resolvedAt", "installedAt", "clawhubUrl", "clawhubPackage", "clawhubFamily", "clawhubChannel", "clawhubTrustDisposition", "clawhubTrustScanStatus", "clawhubTrustModerationState", "clawhubTrustCheckedAt", "clawhubTrustAcknowledgedAt", "artifactKind", "artifactFormat", "npmIntegrity", "npmShasum", "npmTarballName", "clawpackSha256", "clawpackManifestSha256", "gitUrl", "gitRef", "gitCommit", "marketplaceName", "marketplaceSource", "marketplacePlugin", "acceptedSurfaceHash", "acceptedSurfaceAt", "acceptedSurfaceIntegrity" ]; const utf8Encoder = new TextEncoder(); function comparePluginIds(left, right) { const leftBytes = utf8Encoder.encode(left); const rightBytes = utf8Encoder.encode(right); const sharedLength = Math.min(leftBytes.length, rightBytes.length); for (let index = 0; index < sharedLength; index += 1) { const difference = (leftBytes[index] ?? 0) - (rightBytes[index] ?? 0); if (difference !== 0) return difference; } return leftBytes.length - rightBytes.length; } function createPluginInstallRecordMap() { return Object.create(null); } function setPluginInstallRecordMapEntry(records, pluginId, record) { Object.defineProperty(records, pluginId, { configurable: true, enumerable: true, value: record, writable: true }); } function getPluginInstallRecordMapEntry(records, pluginId) { return records && Object.hasOwn(records, pluginId) ? records[pluginId] : void 0; } function copyPluginInstallRecordMap(records) { const copied = createPluginInstallRecordMap(); for (const [pluginId, record] of Object.entries(records ?? {})) setPluginInstallRecordMapEntry(copied, pluginId, record); return copied; } function parsePluginInstallRecord(value) { const parsed = PluginInstallRecordSchema.safeParse(value); if (!parsed.success) return null; const record = parsed.data; for (const field of NORMALIZED_STRING_FIELDS) { const fieldValue = record[field]; if (typeof fieldValue !== "string") continue; const normalized = fieldValue.trim(); if (normalized) record[field] = normalized; else delete record[field]; } if (record.clawhubTrustReasons) { const reasons = record.clawhubTrustReasons.map((entry) => entry.trim()).filter(Boolean); if (reasons.length > 0) record.clawhubTrustReasons = reasons; else delete record.clawhubTrustReasons; } return record; } function parsePluginInstallRecordMap(value) { if (!isRecord(value)) return null; const records = createPluginInstallRecordMap(); for (const [pluginId, rawRecord] of Object.entries(value)) { const record = parsePluginInstallRecord(rawRecord); if (!record) return null; setPluginInstallRecordMapEntry(records, pluginId, record); } return records; } function inspectPluginInstallRecordMap(value) { if (value === void 0) return { status: "missing" }; const records = parsePluginInstallRecordMap(value); return records ? { status: "valid", records } : { status: "invalid" }; } /** * Object enumeration reorders integer-index keys, so persisted bytes must be * assembled from sorted entries instead of relying on object insertion order. */ function serializePluginInstallRecordMap(records) { return `{${Object.entries(records).toSorted(([left], [right]) => comparePluginIds(left, right)).map(([pluginId, record]) => `${JSON.stringify(pluginId)}:${JSON.stringify(record)}`).join(",")}}`; } //#endregion export { inspectPluginInstallRecordMap as a, serializePluginInstallRecordMap as c, getPluginInstallRecordMapEntry as i, setPluginInstallRecordMapEntry as l, copyPluginInstallRecordMap as n, parsePluginInstallRecord as o, createPluginInstallRecordMap as r, parsePluginInstallRecordMap as s, PluginInstallRecordSchema as t };