| 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<string, boolean> = { |
| "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<string, HookConfig | undefined>)[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"; |
|
|
| |
| if (!pluginManaged && hookConfig?.enabled === false) { |
| return false; |
| } |
|
|
| return evaluateHookRuntimeEligibility({ |
| entry, |
| config, |
| hookConfig, |
| eligibility, |
| }); |
| } |
|
|