import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, } from "@mariozechner/pi-coding-agent"; export const wrapResult = (text: string) => { const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES, }); let output = truncation.content; if (truncation.truncated) { output += `\n\n[Output truncated: ${truncation.outputLines} of ${truncation.totalLines} lines `; output += `(${formatSize(truncation.outputBytes)} of ${formatSize(truncation.totalBytes)}).]`; } return { content: [{ type: "text", text: output }] }; }; export const createWithCommonHandling = (deps: { callSerena: (toolName: string, args: Record, timeoutMs: number) => Promise; resetClient: () => Promise; defaultTimeoutMs: number; }) => { return async ( signal: AbortSignal | undefined, timeoutSeconds: number | undefined, toolName: string, args: Record, ) => { if (signal?.aborted) { return { content: [{ type: "text", text: "Request cancelled." }], isError: true }; } const timeoutMs = timeoutSeconds ? timeoutSeconds * 1000 : deps.defaultTimeoutMs; try { const text = await deps.callSerena(toolName, args, timeoutMs); return wrapResult(text); } catch (err: any) { await deps.resetClient(); const message = err?.message ? `Serena MCP error: ${err.message}` : "Serena MCP error."; return { content: [{ type: "text", text: message }], isError: true }; } }; };