| import { describe, expect, it, vi } from "vitest"; |
| import type { PluginRegistry } from "./registry.js"; |
| import { createHookRunner } from "./hooks.js"; |
|
|
| function createMockRegistry( |
| hooks: Array<{ hookName: string; handler: (...args: unknown[]) => unknown }>, |
| ): PluginRegistry { |
| return { |
| hooks: hooks as never[], |
| typedHooks: hooks.map((h) => ({ |
| pluginId: "test-plugin", |
| hookName: h.hookName, |
| handler: h.handler, |
| priority: 0, |
| source: "test", |
| })), |
| tools: [], |
| httpHandlers: [], |
| httpRoutes: [], |
| channelRegistrations: [], |
| gatewayHandlers: {}, |
| cliRegistrars: [], |
| services: [], |
| providers: [], |
| commands: [], |
| } as unknown as PluginRegistry; |
| } |
|
|
| describe("llm hook runner methods", () => { |
| it("runLlmInput invokes registered llm_input hooks", async () => { |
| const handler = vi.fn(); |
| const registry = createMockRegistry([{ hookName: "llm_input", handler }]); |
| const runner = createHookRunner(registry); |
|
|
| await runner.runLlmInput( |
| { |
| runId: "run-1", |
| sessionId: "session-1", |
| provider: "openai", |
| model: "gpt-5", |
| systemPrompt: "be helpful", |
| prompt: "hello", |
| historyMessages: [], |
| imagesCount: 0, |
| }, |
| { |
| agentId: "main", |
| sessionId: "session-1", |
| }, |
| ); |
|
|
| expect(handler).toHaveBeenCalledWith( |
| expect.objectContaining({ runId: "run-1", prompt: "hello" }), |
| expect.objectContaining({ sessionId: "session-1" }), |
| ); |
| }); |
|
|
| it("runLlmOutput invokes registered llm_output hooks", async () => { |
| const handler = vi.fn(); |
| const registry = createMockRegistry([{ hookName: "llm_output", handler }]); |
| const runner = createHookRunner(registry); |
|
|
| await runner.runLlmOutput( |
| { |
| runId: "run-1", |
| sessionId: "session-1", |
| provider: "openai", |
| model: "gpt-5", |
| assistantTexts: ["hi"], |
| lastAssistant: { role: "assistant", content: "hi" }, |
| usage: { |
| input: 10, |
| output: 20, |
| total: 30, |
| }, |
| }, |
| { |
| agentId: "main", |
| sessionId: "session-1", |
| }, |
| ); |
|
|
| expect(handler).toHaveBeenCalledWith( |
| expect.objectContaining({ runId: "run-1", assistantTexts: ["hi"] }), |
| expect.objectContaining({ sessionId: "session-1" }), |
| ); |
| }); |
|
|
| it("hasHooks returns true for registered llm hooks", () => { |
| const registry = createMockRegistry([{ hookName: "llm_input", handler: vi.fn() }]); |
| const runner = createHookRunner(registry); |
|
|
| expect(runner.hasHooks("llm_input")).toBe(true); |
| expect(runner.hasHooks("llm_output")).toBe(false); |
| }); |
| }); |
|
|