import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import { registerWebFetchReadTool } from "./artifact-tools.ts"; import { ArtifactStore } from "./artifacts.ts"; import { missingAuthGuidance } from "./auth.ts"; import { registerWebConfigCommand } from "./commands.ts"; import { loadPiWebConfig, PiWebConfigError } from "./config.ts"; import { pruneHistoricalWebResults } from "./context-pruning.ts"; import { registerWebSearchTool, webSearchDescription } from "./web-search-tool.ts"; import { registerWebFetchTool } from "./web-fetch-tool.ts"; export default function piWebExtension(pi: ExtensionAPI): void { registerWebConfigCommand(pi, (pipeline) => registerWebSearchTool(pi, {}, webSearchDescription(pipeline))); registerWebSearchTool(pi); registerWebFetchTool(pi); registerWebFetchReadTool(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-web artifact cleanup failed: ${error instanceof Error ? error.message : String(error)}`, "warning"); }); try { const config = await loadPiWebConfig({ cwd: ctx.cwd, projectTrusted: ctx.isProjectTrusted(), }); registerWebSearchTool(pi, {}, webSearchDescription(config.pipeline)); if (!ctx.hasUI) return; if (config.mode === "disabled") return; if (config.provider === "exa") return; if (!ctx.modelRegistry.find(config.provider, config.model)) { ctx.ui.notify( `pi-web: standalone search model ${config.provider}/${config.model} is not installed. Run /web-config.`, "warning", ); return; } if (config.summaryProvider && config.summaryModel && !ctx.modelRegistry.find(config.summaryProvider, config.summaryModel)) { ctx.ui.notify( `pi-web: summary model ${config.summaryProvider}/${config.summaryModel} is not installed. Run /web-config.`, "warning", ); return; } if (!ctx.modelRegistry.getProviderAuthStatus(config.provider).configured) { ctx.ui.notify(`pi-web: search authentication is not configured. ${missingAuthGuidance(config.provider)}`, "warning"); } if (config.summaryProvider && config.summaryProvider !== config.provider && !ctx.modelRegistry.getProviderAuthStatus(config.summaryProvider).configured) { ctx.ui.notify(`pi-web: summary-model authentication for ${config.summaryProvider} is not configured.`, "warning"); } } catch (error) { const message = error instanceof Error ? error.message : String(error); if (ctx.hasUI) ctx.ui.notify(`pi-web: ${message}`, error instanceof PiWebConfigError ? "warning" : "error"); } }); } export { WebSearchParameters, normalizeSearchCommands } from "./schema.ts"; export { WebFetchParameters } from "./web-fetch-tool.ts"; export { WebFetchReadParameters } from "./artifact-tools.ts"; export { loadPiWebConfig, savePiWebConfig, getPiWebConfigPaths } from "./config.ts";