Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

extensions/decay/index.ts

Raw
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<DecayRuntime> | 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();
	});
}