export type HookName = | 'tool.execute.before' | 'tool.execute.after' | 'turn.start' | 'turn.end' | 'task.terminal'; export interface ToolHookContext { tool: string; args: Record; projectRoot: string; sessionId: string; } export interface ToolResultContext extends ToolHookContext { result: unknown; } export type PluginHook = (ctx: any) => Promise; const hooks = new Map(); export function registerHook(name: HookName, fn: PluginHook): void { const list = hooks.get(name) || []; list.push(fn); hooks.set(name, list); } export async function emitHook(name: HookName, ctx: any): Promise { const list = hooks.get(name); if (!list) return ctx; let current = ctx; for (const fn of list) { const result = await fn(current); if (result !== undefined) current = result; } return current; } export function clearHooks(): void { hooks.clear(); }