import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import { ArtifactStore } from "./artifacts.ts"; import { missingAuthGuidance } from "./auth.ts"; import { registerCodexSearchConfigCommand } from "./commands.ts"; import { CodexSearchConfigError, loadCodexSearchConfig } from "./config.ts"; import { pruneHistoricalWebResults } from "./context-pruning.ts"; import { registerWebSearchTool } from "./web-search-tool.ts"; export default function piCodexSearchExtension(pi: ExtensionAPI): void { registerCodexSearchConfigCommand(pi, () => registerWebSearchTool(pi)); registerWebSearchTool(pi); pi.on("context", async (event) => ({ messages: pruneHistoricalWebResults(event.messages) })); pi.on("session_start", async (_event, ctx) => { const store = new ArtifactStore(ctx.sessionManager.getSessionId()); await store.cleanup().catch((error) => { if (ctx.hasUI) ctx.ui.notify(`Pi Codex Search artifact cleanup failed: ${error instanceof Error ? error.message : String(error)}`, "warning"); }); try { const config = await loadCodexSearchConfig({ cwd: ctx.cwd, projectTrusted: ctx.isProjectTrusted(), }); if (!ctx.hasUI) return; if (config.mode === "disabled") return; if (config.provider === "openai-compatible") return; if (!ctx.modelRegistry.find(config.provider, config.model)) { ctx.ui.notify( `Pi Codex Search: ${config.provider}/${config.model} is not installed. Run /codex-search-config.`, "warning", ); return; } if (!ctx.modelRegistry.getProviderAuthStatus(config.provider).configured) { ctx.ui.notify(`Pi Codex Search: authentication is not configured. ${missingAuthGuidance(config.provider)}`, "warning"); } } catch (error) { const message = error instanceof Error ? error.message : String(error); if (ctx.hasUI) ctx.ui.notify(`Pi Codex Search: ${message}`, error instanceof CodexSearchConfigError ? "warning" : "error"); } }); } export { WebSearchParameters, normalizeSearchCommands } from "./schema.ts"; export { loadCodexSearchConfig, saveCodexSearchConfig, getCodexSearchConfigPaths } from "./config.ts";