File size: 2,684 Bytes
fc93158 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | import { parseFrontmatterBlock } from "../markdown/frontmatter.js";
import {
applyOpenClawManifestInstallCommonFields,
getFrontmatterString,
normalizeStringList,
parseOpenClawManifestInstallBase,
parseFrontmatterBool,
resolveOpenClawManifestBlock,
resolveOpenClawManifestInstall,
resolveOpenClawManifestOs,
resolveOpenClawManifestRequires,
} from "../shared/frontmatter.js";
import type {
OpenClawHookMetadata,
HookEntry,
HookInstallSpec,
HookInvocationPolicy,
ParsedHookFrontmatter,
} from "./types.js";
export function parseFrontmatter(content: string): ParsedHookFrontmatter {
return parseFrontmatterBlock(content);
}
function parseInstallSpec(input: unknown): HookInstallSpec | undefined {
const parsed = parseOpenClawManifestInstallBase(input, ["bundled", "npm", "git"]);
if (!parsed) {
return undefined;
}
const { raw } = parsed;
const spec = applyOpenClawManifestInstallCommonFields<HookInstallSpec>(
{
kind: parsed.kind as HookInstallSpec["kind"],
},
parsed,
);
if (typeof raw.package === "string") {
spec.package = raw.package;
}
if (typeof raw.repository === "string") {
spec.repository = raw.repository;
}
return spec;
}
export function resolveOpenClawMetadata(
frontmatter: ParsedHookFrontmatter,
): OpenClawHookMetadata | undefined {
const metadataObj = resolveOpenClawManifestBlock({ frontmatter });
if (!metadataObj) {
return undefined;
}
const requires = resolveOpenClawManifestRequires(metadataObj);
const install = resolveOpenClawManifestInstall(metadataObj, parseInstallSpec);
const osRaw = resolveOpenClawManifestOs(metadataObj);
const eventsRaw = normalizeStringList(metadataObj.events);
return {
always: typeof metadataObj.always === "boolean" ? metadataObj.always : undefined,
emoji: typeof metadataObj.emoji === "string" ? metadataObj.emoji : undefined,
homepage: typeof metadataObj.homepage === "string" ? metadataObj.homepage : undefined,
hookKey: typeof metadataObj.hookKey === "string" ? metadataObj.hookKey : undefined,
export: typeof metadataObj.export === "string" ? metadataObj.export : undefined,
os: osRaw.length > 0 ? osRaw : undefined,
events: eventsRaw.length > 0 ? eventsRaw : [],
requires: requires,
install: install.length > 0 ? install : undefined,
};
}
export function resolveHookInvocationPolicy(
frontmatter: ParsedHookFrontmatter,
): HookInvocationPolicy {
return {
enabled: parseFrontmatterBool(getFrontmatterString(frontmatter, "enabled"), true),
};
}
export function resolveHookKey(hookName: string, entry?: HookEntry): string {
return entry?.metadata?.hookKey ?? hookName;
}
|