diff --git a/apps/coder/src/plugins/host.ts b/apps/coder/src/plugins/host.ts new file mode 100644 index 0000000..f45f46f --- /dev/null +++ b/apps/coder/src/plugins/host.ts @@ -0,0 +1,42 @@ +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(); +}