import type { ExtensionAPI } from "@mariozechner/pi-coding-agent"; import { registerSearchToolsCommand } from "./commands/search-tools"; import { ensureBundledBinary, resolvePreferredBinary } from "./install"; import { verifyBundledBinary } from "./integrity"; import { getRuntimeTarget } from "./platform"; import { registerFdTool } from "./tools/fd"; import { registerRgTool } from "./tools/rg"; import { notify } from "./ui"; export default function registerSearchTools(pi: ExtensionAPI) { registerSearchToolsCommand(pi); registerRgTool(pi); registerFdTool(pi); pi.on("session_start", async (_event, ctx) => { const target = getRuntimeTarget(); let rg = await resolvePreferredBinary("rg"); let fd = await resolvePreferredBinary("fd"); let rgVerify = verifyBundledBinary("rg", target.key); let fdVerify = verifyBundledBinary("fd", target.key); const needsRepair = !rg || !fd || !rgVerify.ok || !fdVerify.ok; if (needsRepair) { try { await ensureBundledBinary("rg", target.key); await ensureBundledBinary("fd", target.key); } catch { // fall through to re-check; notify below if still broken } rg = await resolvePreferredBinary("rg"); fd = await resolvePreferredBinary("fd"); rgVerify = verifyBundledBinary("rg", target.key); fdVerify = verifyBundledBinary("fd", target.key); } if (!rg || !fd) { notify( ctx, "Bundled search binaries are not available and auto-fetch failed. Run /search-tools ensure to retry, or prefetch binaries into this package's bin/ directory.", "warning", ); return; } if (!rgVerify.ok || !fdVerify.ok) { notify( ctx, `Bundled search binaries failed integrity verification for ${target.key}. rg=${rgVerify.reason} fd=${fdVerify.reason}. System binaries may be used as fallback. Run /search-tools ensure to repair.`, "warning", ); } }); }