/** * Hooks Configuration * * Hooks intercept agent events for logging, blocking, or modification. */ import { createAgentSession, type HookFactory, SessionManager } from "@mariozechner/pi-coding-agent"; // Logging hook const loggingHook: HookFactory = (api) => { api.on("agent_start", async () => { console.log("[Hook] Agent starting"); }); api.on("tool_call", async (event) => { console.log(`[Hook] Tool: ${event.toolName}`); return undefined; // Don't block }); api.on("agent_end", async (event) => { console.log(`[Hook] Done, ${event.messages.length} messages`); }); }; // Blocking hook (returns { block: true, reason: "..." }) const safetyHook: HookFactory = (api) => { api.on("tool_call", async (event) => { if (event.toolName === "bash") { const cmd = (event.input as { command?: string }).command ?? ""; if (cmd.includes("rm -rf")) { return { block: true, reason: "Dangerous command blocked" }; } } return undefined; }); }; // Use inline hooks const { session } = await createAgentSession({ hooks: [{ factory: loggingHook }, { factory: safetyHook }], sessionManager: SessionManager.inMemory(), }); session.subscribe((event) => { if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") { process.stdout.write(event.assistantMessageEvent.delta); } }); await session.prompt("List files in the current directory."); console.log(); // Disable all hooks: // hooks: [] // Merge with discovered hooks: // const discovered = await discoverHooks(); // hooks: [...discovered, { factory: myHook }] // Add paths without replacing discovery: // additionalHookPaths: ["/extra/hooks"]