/** * Global Plugin Hook Runner * * Singleton hook runner that's initialized when plugins are loaded * and can be called from anywhere in the codebase. */ import { createSubsystemLogger } from "../logging/subsystem.js"; import { createHookRunner, type HookRunner } from "./hooks.js"; import type { PluginRegistry } from "./registry.js"; const log = createSubsystemLogger("plugins"); let globalHookRunner: HookRunner | null = null; let globalRegistry: PluginRegistry | null = null; /** * Initialize the global hook runner with a plugin registry. * Called once when plugins are loaded during gateway startup. */ export function initializeGlobalHookRunner(registry: PluginRegistry): void { globalRegistry = registry; globalHookRunner = createHookRunner(registry, { logger: { debug: (msg) => log.debug(msg), warn: (msg) => log.warn(msg), error: (msg) => log.error(msg), }, catchErrors: true, }); const hookCount = registry.hooks.length; if (hookCount > 0) { log.info(`hook runner initialized with ${hookCount} registered hooks`); } } /** * Get the global hook runner. * Returns null if plugins haven't been loaded yet. */ export function getGlobalHookRunner(): HookRunner | null { return globalHookRunner; } /** * Get the global plugin registry. * Returns null if plugins haven't been loaded yet. */ export function getGlobalPluginRegistry(): PluginRegistry | null { return globalRegistry; } /** * Check if any hooks are registered for a given hook name. */ export function hasGlobalHooks(hookName: Parameters[0]): boolean { return globalHookRunner?.hasHooks(hookName) ?? false; } /** * Reset the global hook runner (for testing). */ export function resetGlobalHookRunner(): void { globalHookRunner = null; globalRegistry = null; }