import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; import { textTokens } from "../estimate"; import { compactList } from "../format"; import type { Line, Section } from "../types"; /** Tool definitions breakdown, grouped by source (builtin / sdk / extension). */ export const toolsSection = (pi: ExtensionAPI): Section => { const tools = pi.getAllTools(); const groups = new Map(); for (const tool of tools) { let group: string; switch (tool.sourceInfo?.source) { case "builtin": group = "builtin"; break; case "sdk": group = "sdk"; break; default: // Extensions — incl. any MCP tools registered via an extension // (pi has no built-in MCP support). group = "extension (incl. MCP)"; } const serialized = JSON.stringify({ name: tool.name, description: tool.description, parameters: tool.parameters, }); const t = textTokens(serialized); const g = groups.get(group) ?? { count: 0, tokens: 0, biggest: [] }; g.count += 1; g.tokens += t; g.biggest.push({ label: tool.name, tokens: t }); groups.set(group, g); } const lines: Line[] = []; let total = 0; for (const [group, g] of [...groups.entries()].sort((a, b) => b[1].tokens - a[1].tokens)) { total += g.tokens; lines.push({ label: `${group} (${g.count})`, tokens: g.tokens, detail: compactList(g.biggest, 3), }); } return { title: "Tools", total, lines }; };