import type { OpenClawConfig, HookConfig } from "../config/config.js"; import { evaluateRuntimeEligibility, hasBinary, isConfigPathTruthyWithDefaults, resolveConfigPath, resolveRuntimePlatform, } from "../shared/config-eval.js"; import { resolveHookKey } from "./frontmatter.js"; import type { HookEligibilityContext, HookEntry } from "./types.js"; const DEFAULT_CONFIG_VALUES: Record = { "browser.enabled": true, "browser.evaluateEnabled": true, "workspace.dir": true, }; export { hasBinary, resolveConfigPath, resolveRuntimePlatform }; export function isConfigPathTruthy(config: OpenClawConfig | undefined, pathStr: string): boolean { return isConfigPathTruthyWithDefaults(config, pathStr, DEFAULT_CONFIG_VALUES); } export function resolveHookConfig( config: OpenClawConfig | undefined, hookKey: string, ): HookConfig | undefined { const hooks = config?.hooks?.internal?.entries; if (!hooks || typeof hooks !== "object") { return undefined; } const entry = (hooks as Record)[hookKey]; if (!entry || typeof entry !== "object") { return undefined; } return entry; } function evaluateHookRuntimeEligibility(params: { entry: HookEntry; config?: OpenClawConfig; hookConfig?: HookConfig; eligibility?: HookEligibilityContext; }): boolean { const { entry, config, hookConfig, eligibility } = params; const remote = eligibility?.remote; const base = { os: entry.metadata?.os, remotePlatforms: remote?.platforms, always: entry.metadata?.always, requires: entry.metadata?.requires, hasRemoteBin: remote?.hasBin, hasAnyRemoteBin: remote?.hasAnyBin, }; return evaluateRuntimeEligibility({ ...base, hasBin: hasBinary, hasEnv: (envName) => Boolean(process.env[envName] || hookConfig?.env?.[envName]), isConfigPathTruthy: (configPath) => isConfigPathTruthy(config, configPath), }); } export function shouldIncludeHook(params: { entry: HookEntry; config?: OpenClawConfig; eligibility?: HookEligibilityContext; }): boolean { const { entry, config, eligibility } = params; const hookKey = resolveHookKey(entry.hook.name, entry); const hookConfig = resolveHookConfig(config, hookKey); const pluginManaged = entry.hook.source === "openclaw-plugin"; // Check if explicitly disabled if (!pluginManaged && hookConfig?.enabled === false) { return false; } return evaluateHookRuntimeEligibility({ entry, config, hookConfig, eligibility, }); }