import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent"; import { foldLedger, poolTokens, selectPromotionOverflow, type Entry } from "../ledger/index.ts"; import type { Runtime } from "../runtime.ts"; import { evaluateConsolidatorTrigger } from "../hooks/consolidator-trigger.ts"; export async function handleConsolidateCommand(_args: string, ctx: ExtensionContext, runtime: Runtime): Promise { if (!runtime.enabled) { if (ctx.hasUI) ctx.ui.notify("memory-log is disabled (run /mem-log on to enable)", "info"); return; } if (runtime.consolidatorInFlight) { if (ctx.hasUI) ctx.ui.notify("memory-log: consolidation is already in progress", "warning"); return; } runtime.ensureConfig(ctx.cwd); const branch = ctx.sessionManager.getBranch() as Entry[]; const active = foldLedger(branch).activeObservations; const { promote } = selectPromotionOverflow(active, runtime.config.poolTargetTokens); if (promote.length === 0) { if (ctx.hasUI) { ctx.ui.notify( `memory-log: consolidation not needed (pool buffer ${poolTokens(active).toLocaleString()} tok <= target ${runtime.config.poolTargetTokens.toLocaleString()} tok)`, "info", ); } return; } const saved = runtime.config.consolidateAtPoolTokens; runtime.config.consolidateAtPoolTokens = 0; try { evaluateConsolidatorTrigger(piInstance!, runtime, ctx); } finally { runtime.config.consolidateAtPoolTokens = saved; } } let piInstance: ExtensionAPI | undefined; export function registerConsolidateCommand(pi: ExtensionAPI, runtime: Runtime): void { piInstance = pi; const handler = async (args: string, ctx: ExtensionContext) => handleConsolidateCommand(args, ctx, runtime); pi.registerCommand("mem-log:consolidate", { description: "Archive short-term observations to durable topic files immediately (ignore pool threshold)", handler, }); }