import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import type { DecayRuntime } from "./implementation.js"; import { closeDebug, dbg, span } from "./src/debug.ts"; // Compaction is uncommon, so keep its model, prompt, record, and UI modules out // of Pi startup. One shared promise also serializes jiti's first module load. export default function decayExtension(pi: ExtensionAPI): void { let runtimePromise: Promise | undefined; const runtime = () => (runtimePromise ??= import("./implementation.js").then( ({ createDecayRuntime }) => createDecayRuntime(pi), )); pi.on("session_start", () => dbg?.("session.start")); pi.on("session_before_compact", async (event, ctx) => { const finish = span?.("compaction.prepare"); try { const result = await (await runtime()).sessionBeforeCompact(event, ctx); finish?.(); return result; } catch (error) { finish?.("error"); throw error; } }); pi.on("session_compact", async (event, ctx) => { if (!event.fromExtension) return; const finish = span?.("compaction.complete"); try { const result = await (await runtime()).sessionCompact(event, ctx); finish?.(); return result; } catch (error) { finish?.("error"); throw error; } }); pi.on("session_shutdown", () => { dbg?.("session.shutdown"); closeDebug(); }); }