import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent"; import { PI_AGI_VERSION } from "./version.ts"; export interface AgiModeState { enabled: boolean; } export interface ModeController { isEnabled(): boolean; toggle(ctx: ExtensionContext): void; setEnabled(enabled: boolean, ctx: ExtensionContext): void; restore(state: AgiModeState | undefined, ctx: ExtensionContext): void; updateStatus(ctx: ExtensionContext): void; /** Clear all extension-owned UI (R-UI-5). */ clearUI(ctx: ExtensionContext): void; } export function createModeController(pi: ExtensionAPI): ModeController { let enabled = false; function persist(): void { pi.appendEntry("agi-mode", { enabled }); } function updateStatus(ctx: ExtensionContext): void { if (!enabled) { ctx.ui.setStatus("agi-mode", undefined); return; } ctx.ui.setStatus("agi-mode", ctx.ui.theme.fg("accent", "AGI")); } function setEnabled(next: boolean, ctx: ExtensionContext): void { if (next === enabled) return; enabled = next; if (enabled) { ctx.ui.notify(`pi-agi v${PI_AGI_VERSION} enabled. Full tools available; delegate substantial work to workers.`); } else { ctx.ui.notify("AGI mode disabled."); } updateStatus(ctx); persist(); } return { isEnabled: () => enabled, updateStatus, toggle(ctx) { setEnabled(!enabled, ctx); }, setEnabled, restore(state, ctx) { enabled = state?.enabled ?? false; updateStatus(ctx); }, clearUI(ctx) { ctx.ui.setStatus("agi-mode", undefined); }, }; }