import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import type { CorridorRuntime } from "../application/corridor-runtime.ts"; import { ensureHubDetached, shouldAutoOpenBrowser } from "../application/hub-client.ts"; export function registerLifecycle( pi: ExtensionAPI, runtime: CorridorRuntime, isActive: () => boolean = () => true, ): void { pi.on("session_start", (_event, ctx) => { if (!isActive()) return; runtime.initialize(ctx); const sessionId = runtime.getSessionId() ?? ctx.sessionManager.getSessionId(); ensureHubDetached({ ...(sessionId ? { sessionId } : {}), open: shouldAutoOpenBrowser(), }); }); pi.on("session_tree", (_event, ctx) => { if (!isActive()) return; runtime.initialize(ctx); }); pi.on("before_agent_start", (event) => { if (!isActive()) return; return { systemPrompt: `${event.systemPrompt}\n\n${runtime.toAgentContext()}`, }; }); pi.on("tool_execution_start", (event, ctx) => { if (!isActive()) return; runtime.toolStarted(event.toolCallId, event.toolName, ctx); }); pi.on("tool_execution_update", (event, ctx) => { if (!isActive()) return; runtime.toolUpdated(event.toolCallId, ctx); }); pi.on("tool_execution_end", (event, ctx) => { if (!isActive()) return; runtime.toolEnded(event.toolCallId, event.isError, ctx); }); pi.on("message_end", (event, ctx) => { if (!isActive()) return; const message = event.message; if (message.role === "toolResult" && message.toolName === "update_action_path") { runtime.finalizePersistedToolResult(message.toolCallId, ctx); } }); pi.on("session_shutdown", (_event, ctx) => { if (!isActive()) return; runtime.close(ctx); }); }