export interface JsonEnvelope { ok: boolean; command: string; data?: T; error?: unknown; } function isEpipe(error: unknown): boolean { return typeof error === "object" && error !== null && "code" in error && (error as { code?: unknown }).code === "EPIPE"; } process.stdout.on("error", (error) => { if (isEpipe(error)) process.exit(0); throw error; }); process.stderr.on("error", (error) => { if (isEpipe(error)) process.exit(0); throw error; }); export function emitJson(command: string, data: T, ok = true): void { const envelope: JsonEnvelope = { ok, command, data }; safeStdoutWrite(`${JSON.stringify(envelope, null, 2)}\n`); } export function emitError(command: string, error: unknown): void { const payload = error instanceof Error ? { name: error.name, message: error.message, stack: error.stack ?? null } : { message: String(error) }; const envelope: JsonEnvelope = { ok: false, command, error: payload }; safeStdoutWrite(`${JSON.stringify(envelope, null, 2)}\n`); } function safeStdoutWrite(text: string): void { try { process.stdout.write(text); } catch (error) { if (isEpipe(error)) process.exit(0); throw error; } }