const moveUp = result.rows > 1 ? `\x1b[${result.rows - 1}A` : "";lines.push(moveUp + result.sequence);it("detects image with cursor-up prefix (multi-row image)", async () => { const { isImageLine } = await import("../src/terminal-image.js"); // This is what Image.render() actually produces for multi-row images const line = "\x1b[3A\x1b]1337;File=inline=1:base64data==\x07"; assert.strictEqual(isImageLine(line), true);});private containsImage(line: string): boolean { return line.includes("\x1b_G") || line.includes("\x1b]1337;File=");}export function isImageLine(line: string): boolean { const prefix = getImageEscapePrefix(); return prefix !== null && line.startsWith(prefix);}const KITTY_PREFIX = "\x1b_G";const ITERM2_PREFIX = "\x1b]1337;File=";
export function isImageLine(line: string): boolean { // Fast path: sequence at line start (single-row images) if (line.startsWith(KITTY_PREFIX) || line.startsWith(ITERM2_PREFIX)) { return true; } // Slow path: sequence elsewhere (multi-row images have cursor-up prefix) return line.includes(KITTY_PREFIX) || line.includes(ITERM2_PREFIX);}const moveUp = result.rows > 1 ? `\x1b[${result.rows - 1}A` : "";lines.push(moveUp + result.sequence);\x1b[{rows-1}A + {image_sequence}{image_sequence}Small: \x1b_Ga=T,f=100,q=2,c={cols},r={rows};{base64}\x1b\\Chunked: \x1b_Ga=T,f=100,q=2,c={cols},r={rows},m=1;{chunk1}\x1b\\\x1b_Gm=1;{chunk2}\x1b\\...\x1b_Gm=0;{lastchunk}\x1b\\\x1b]1337;File=inline=1;width={w};height=auto:{base64}\x07export function isImageLine(line: string): boolean { // Direct image sequence at start if (line.startsWith(KITTY_PREFIX) || line.startsWith(ITERM2_PREFIX)) { return true; } // Cursor-up prefix: \x1b[{1-3 digits}A followed by image sequence if (line.startsWith("\x1b[")) { const aIdx = line.indexOf("A", 3); if (aIdx > 2 && aIdx < 7) { const rest = line.substring(aIdx + 1); return rest.startsWith(KITTY_PREFIX) || rest.startsWith(ITERM2_PREFIX); } } return false;}