| 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; |
| } |
|
|