From 304943658db9a5df9b5da82a38da5b628f3a34d4 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 10:44:38 -0800 Subject: [PATCH 001/124] Support Kitty graphics protocol --- addons/addon-kitty-graphics/LICENSE | 19 ++ addons/addon-kitty-graphics/README.md | 47 ++++ .../fixture/black-1x1.png | Bin 0 -> 123 bytes .../addon-kitty-graphics/fixture/rgb-3x1.png | Bin 0 -> 131 bytes addons/addon-kitty-graphics/package.json | 27 +++ .../src/KittyGraphicsAddon.test.ts | 156 ++++++++++++++ .../src/KittyGraphicsAddon.ts | 200 ++++++++++++++++++ addons/addon-kitty-graphics/src/tsconfig.json | 27 +++ .../test/KittyGraphicsAddon.test.ts | 41 ++++ .../test/playwright.config.ts | 35 +++ .../addon-kitty-graphics/test/tsconfig.json | 30 +++ addons/addon-kitty-graphics/tsconfig.json | 5 + .../typings/addon-kitty-graphics.d.ts | 82 +++++++ addons/addon-kitty-graphics/webpack.config.js | 44 ++++ bin/esbuild.mjs | 1 + bin/test_integration.js | 1 + demo/client/client.ts | 8 +- demo/client/tsconfig.json | 1 + demo/client/types.ts | 45 ++-- send-png | 33 +++ tsconfig.all.json | 1 + 21 files changed, 781 insertions(+), 22 deletions(-) create mode 100644 addons/addon-kitty-graphics/LICENSE create mode 100644 addons/addon-kitty-graphics/README.md create mode 100644 addons/addon-kitty-graphics/fixture/black-1x1.png create mode 100644 addons/addon-kitty-graphics/fixture/rgb-3x1.png create mode 100644 addons/addon-kitty-graphics/package.json create mode 100644 addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts create mode 100644 addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts create mode 100644 addons/addon-kitty-graphics/src/tsconfig.json create mode 100644 addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts create mode 100644 addons/addon-kitty-graphics/test/playwright.config.ts create mode 100644 addons/addon-kitty-graphics/test/tsconfig.json create mode 100644 addons/addon-kitty-graphics/tsconfig.json create mode 100644 addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts create mode 100644 addons/addon-kitty-graphics/webpack.config.js create mode 100755 send-png diff --git a/addons/addon-kitty-graphics/LICENSE b/addons/addon-kitty-graphics/LICENSE new file mode 100644 index 000000000..a6db9edcf --- /dev/null +++ b/addons/addon-kitty-graphics/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2025, The xterm.js authors (https://github.com/xtermjs/xterm.js) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/addons/addon-kitty-graphics/README.md b/addons/addon-kitty-graphics/README.md new file mode 100644 index 000000000..650f84e03 --- /dev/null +++ b/addons/addon-kitty-graphics/README.md @@ -0,0 +1,47 @@ +# @xterm/addon-kitty-graphics + +An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that adds support for the [Kitty graphics protocol](https://sw.kovidgoyal.net/kitty/graphics-protocol/). + +## Install + +```bash +npm install --save @xterm/addon-kitty-graphics @xterm/xterm +``` + +## Usage + +```typescript +import { Terminal } from '@xterm/xterm'; +import { KittyGraphicsAddon } from '@xterm/addon-kitty-graphics'; + +const terminal = new Terminal(); +const kittyGraphicsAddon = new KittyGraphicsAddon(); +terminal.loadAddon(kittyGraphicsAddon); +``` + +## Features + +This addon implements the Kitty graphics protocol, allowing applications to display images directly in the terminal using APC (Application Program Command) escape sequences. + +### Supported Features + +- PNG image transmission (f=100) +- Direct RGB/RGBA pixel data (f=24, f=32) +- Image placement at cursor position +- Basic query support (a=q) + +### Protocol Format + +The Kitty graphics protocol uses APC escape sequences: + +``` +_G=,=,...;\ +``` + +Key parameters: +- `a`: Action (t=transmit, T=transmit+display, q=query) +- `f`: Format (100=PNG, 24=RGB, 32=RGBA) +- `i`: Image ID +- `m`: More data follows (1=yes, 0=no) + +See the [Kitty graphics protocol documentation](https://sw.kovidgoyal.net/kitty/graphics-protocol/) for full details. diff --git a/addons/addon-kitty-graphics/fixture/black-1x1.png b/addons/addon-kitty-graphics/fixture/black-1x1.png new file mode 100644 index 0000000000000000000000000000000000000000..9456317423574592cd13da42412c3b4a28fd663e GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx3?wy9o9qTs%mF?ju0VQumF+Dc#pUVZ7*a7O zIRVIKVqo-GzoZbzk}YwKC<)F_D=AMbN@Z}!Da}hPNX*PD(J#nL*G-L1;E+?AmspUPnOCA;ke9BToS%}K U{MA`f4ycg9)78&qol`;+0CYAY1^@s6 literal 0 HcmV?d00001 diff --git a/addons/addon-kitty-graphics/package.json b/addons/addon-kitty-graphics/package.json new file mode 100644 index 000000000..5bb560e7e --- /dev/null +++ b/addons/addon-kitty-graphics/package.json @@ -0,0 +1,27 @@ +{ + "name": "@xterm/addon-kitty-graphics", + "version": "0.1.0", + "author": { + "name": "The xterm.js authors", + "url": "https://xtermjs.org/" + }, + "main": "lib/addon-kitty-graphics.js", + "module": "lib/addon-kitty-graphics.mjs", + "types": "typings/addon-kitty-graphics.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-kitty-graphics", + "license": "MIT", + "keywords": [ + "terminal", + "xterm", + "xterm.js", + "kitty", + "graphics" + ], + "scripts": { + "build": "../../node_modules/.bin/tsc -p .", + "prepackage": "npm run build", + "package": "../../node_modules/.bin/webpack", + "prepublishOnly": "npm run package", + "start": "node ../../demo/start" + } +} diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts new file mode 100644 index 000000000..9378e954d --- /dev/null +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts @@ -0,0 +1,156 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + */ +import { assert } from 'chai'; +import { Terminal } from 'browser/public/Terminal'; +import { KittyGraphicsAddon, parseKittyCommand } from './KittyGraphicsAddon'; + +/** + * Write data to terminal and wait for completion. + */ +function writeP(terminal: Terminal, data: string | Uint8Array): Promise { + return new Promise(r => terminal.write(data, r)); +} + +// Test image: 1x1 black PNG (captured from `send-png fixture/black-1x1.png`) +// Get the below base64-encoded PNG file by: `python3 send-png addons/addon-kitty-graphics/fixture/black-1x1.png` +const BLACK_1X1_BASE64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAA1BMVEUAAACnej3aAAAACklEQVR4nGNgAAAAAgABSK+kcQAAAAt0RVh0Q29tbWVudAAA1LTqjgAAAApJREFUeJxjYAAAAGQA2AAAAAt0RVh0Q29tbWVudAAA1LTqjg5JREFUAAAAASUVORK5CYII='; + +// Test image: 3x1 RGB PNG (red, green, blue pixels) +const RGB_3X1_BASE64 = 'iVBORw0KGgoAAAANSUhEUgAAAAMAAAABCAMAAAAsPuSGAAAACVBMVEX/AAAA/wAAAP8tSs2KAAAADElEQVR4nGNgYGQCAAAIAAQ24LCmAAAAHXRFWHRTb2Z0d2FyZQBAbHVuYXBhaW50L3BuZy1jb2RlY/VDGR4AAAAASUVORK5CYII='; + +// Currently tests the flow: write escape sequence -> addon stores image. +// Pixel-level verification of rendered images is done in Playwright tests. +describe('KittyGraphicsAddon', () => { + let terminal: Terminal; + let addon: KittyGraphicsAddon; + + beforeEach(() => { + terminal = new Terminal({ cols: 80, rows: 24, allowProposedApi: true }); + addon = new KittyGraphicsAddon({ debug: false }); + terminal.loadAddon(addon); + }); + + describe('parseKittyCommand', () => { + it('should parse control data with action and format', () => { + const cmd = parseKittyCommand('a=T,f=100'); + assert.equal(cmd.action, 'T'); + assert.equal(cmd.format, 100); + }); + + it('should parse control data with all options', () => { + const cmd = parseKittyCommand('a=t,f=32,i=5,s=10,v=20,c=3,r=2,m=1,q=2'); + assert.equal(cmd.action, 't'); + assert.equal(cmd.format, 32); + assert.equal(cmd.id, 5); + assert.equal(cmd.width, 10); + assert.equal(cmd.height, 20); + assert.equal(cmd.columns, 3); + assert.equal(cmd.rows, 2); + assert.equal(cmd.more, 1); + assert.equal(cmd.quiet, 2); + }); + + it('should handle empty control data', () => { + const cmd = parseKittyCommand(''); + assert.equal(cmd.action, undefined); + assert.equal(cmd.format, undefined); + }); + + it('should parse transmit action', () => { + const cmd = parseKittyCommand('a=t,f=100'); + assert.equal(cmd.action, 't'); + assert.equal(cmd.format, 100); + }); + + it('should parse delete action', () => { + const cmd = parseKittyCommand('a=d,i=5'); + assert.equal(cmd.action, 'd'); + assert.equal(cmd.id, 5); + }); + }); + + describe('APC handler', () => { + it('should store image when transmit+display sequence is written', async () => { + // Write Kitty graphics sequence: ESC _ G ; ESC \ + const sequence = `\x1b_Ga=T,f=100;${BLACK_1X1_BASE64}\x1b\\`; + await writeP(terminal, sequence); + + // Addon should have stored the image + assert.equal(addon.images.size, 1); + + const image = addon.images.get(1)!; + assert.exists(image); + assert.equal(image.format, 100); // PNG format + assert.equal(image.data, BLACK_1X1_BASE64); + }); + + it('should store RGB image with correct payload', async () => { + const sequence = `\x1b_Ga=T,f=100;${RGB_3X1_BASE64}\x1b\\`; + await writeP(terminal, sequence); + + assert.equal(addon.images.size, 1); + const image = addon.images.get(1)!; + assert.equal(image.data, RGB_3X1_BASE64); + }); + + it('should use explicit image id when provided', async () => { + const sequence = `\x1b_Ga=T,f=100,i=42;${BLACK_1X1_BASE64}\x1b\\`; + await writeP(terminal, sequence); + + assert.equal(addon.images.size, 1); + assert.isTrue(addon.images.has(42)); + assert.isFalse(addon.images.has(1)); + }); + + it('should handle transmit-only (a=t) without display', async () => { + const sequence = `\x1b_Ga=t,f=100;${BLACK_1X1_BASE64}\x1b\\`; + await writeP(terminal, sequence); + + // Image should still be stored?? + assert.equal(addon.images.size, 1); + }); + + it('should delete image by id', async () => { + // First store an image with id=5 + await writeP(terminal, `\x1b_Ga=T,f=100,i=5;${BLACK_1X1_BASE64}\x1b\\`); + assert.equal(addon.images.size, 1); + + // Delete it + await writeP(terminal, `\x1b_Ga=d,i=5\x1b\\`); + assert.equal(addon.images.size, 0); + }); + + it('should delete all images when no id specified', async () => { + // Store multiple images + await writeP(terminal, `\x1b_Ga=T,f=100,i=1;${BLACK_1X1_BASE64}\x1b\\`); + await writeP(terminal, `\x1b_Ga=T,f=100,i=2;${RGB_3X1_BASE64}\x1b\\`); + assert.equal(addon.images.size, 2); + + // Delete all + await writeP(terminal, `\x1b_Ga=d\x1b\\`); + assert.equal(addon.images.size, 0); + }); + + it('should handle chunked transmission (m=1 flag)', async () => { + // Split payload into chunks using m=1 (more data coming) + const half = Math.floor(BLACK_1X1_BASE64.length / 2); + const chunk1 = BLACK_1X1_BASE64.substring(0, half); + const chunk2 = BLACK_1X1_BASE64.substring(half); + + // First chunk with m=1 + await writeP(terminal, `\x1b_Ga=t,f=100,i=10,m=1;${chunk1}\x1b\\`); + // Image not complete yet (pending) + assert.equal(addon.images.size, 0); + + // Final chunk without m=1 + await writeP(terminal, `\x1b_Ga=t,f=100,i=10;${chunk2}\x1b\\`); + // Now image should be stored + assert.equal(addon.images.size, 1); + + const image = addon.images.get(10)!; + assert.equal(image.data, BLACK_1X1_BASE64); + }); + }); +}); diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts new file mode 100644 index 000000000..0dde0671b --- /dev/null +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -0,0 +1,200 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import type { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; +import type { KittyGraphicsAddon as IKittyGraphicsApi, IKittyGraphicsOptions, IKittyImage } from '@xterm/addon-kitty-graphics'; + +/** + * Kitty graphics protocol action types. + */ +const enum KittyAction { + TRANSMIT = 't', + TRANSMIT_DISPLAY = 'T', + QUERY = 'q', + PLACEMENT = 'p', + DELETE = 'd' +} + +/** + * Kitty graphics protocol format types. + */ +const enum KittyFormat { + RGB = 24, + RGBA = 32, + PNG = 100 +} + +/** + * Parsed Kitty graphics command. + */ +export interface IKittyCommand { + action?: string; + format?: number; + id?: number; + width?: number; + height?: number; + x?: number; + y?: number; + columns?: number; + rows?: number; + more?: number; + quiet?: number; + payload?: string; +} + +/** + * Parses Kitty graphics control data into a command object. + * Exported for testing. + */ +export function parseKittyCommand(data: string): IKittyCommand { + const cmd: IKittyCommand = {}; + const parts = data.split(','); + + for (const part of parts) { + const eqIdx = part.indexOf('='); + if (eqIdx === -1) continue; + + const key = part.substring(0, eqIdx); + const value = part.substring(eqIdx + 1); + + switch (key) { + // Question: How do we know which radix to use? + case 'a': cmd.action = value; break; + case 'f': cmd.format = parseInt(value); break; + case 'i': cmd.id = parseInt(value); break; + case 's': cmd.width = parseInt(value); break; + case 'v': cmd.height = parseInt(value); break; + case 'x': cmd.x = parseInt(value); break; + case 'y': cmd.y = parseInt(value); break; + case 'c': cmd.columns = parseInt(value); break; + case 'r': cmd.rows = parseInt(value); break; + case 'm': cmd.more = parseInt(value); break; + case 'q': cmd.quiet = parseInt(value); break; + } + } + + return cmd; +} + +export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { + private _terminal: Terminal | undefined; + private _apcHandler: IDisposable | undefined; + private _images: Map = new Map(); + private _pendingData: Map = new Map(); + private _nextImageId = 1; + private _debug: boolean; + + constructor(options?: IKittyGraphicsOptions) { + this._debug = options?.debug ?? false; + } + + public get images(): ReadonlyMap { + return this._images; + } + + public activate(terminal: Terminal): void { + this._terminal = terminal; + // TODO: Remove console log + console.log('[KittyGraphicsAddon] Activated'); + + // Register APC handler for 'G' (0x47) - Kitty graphics protocol + // APC sequence format: ESC _ G ESC \ + this._apcHandler = terminal.parser.registerApcHandler(0x47, (data: string) => { + return this._handleKittyGraphics(data); + }); + } + + public dispose(): void { + this._apcHandler?.dispose(); + this._images.clear(); + this._pendingData.clear(); + this._terminal = undefined; + } + + private _handleKittyGraphics(data: string): boolean { + const semiIdx = data.indexOf(';'); + const controlData = semiIdx === -1 ? data : data.substring(0, semiIdx); + const payload = semiIdx === -1 ? '' : data.substring(semiIdx + 1); + + const cmd = parseKittyCommand(controlData); + cmd.payload = payload; + + if (this._debug) { + console.log('[KittyGraphicsAddon] Received command:', cmd); + } + + const action = cmd.action || 't'; + + switch (action) { + case KittyAction.TRANSMIT: + return this._handleTransmit(cmd); + case KittyAction.TRANSMIT_DISPLAY: + return this._handleTransmitDisplay(cmd); + case KittyAction.QUERY: + return this._handleQuery(cmd); + case KittyAction.DELETE: + return this._handleDelete(cmd); + default: + return true; + } + } + + private _handleTransmit(cmd: IKittyCommand): boolean { + const id = cmd.id || this._nextImageId++; + const payload = cmd.payload || ''; + + if (cmd.more === 1) { + const existing = this._pendingData.get(id) || ''; + this._pendingData.set(id, existing + payload); + return true; + } + + let fullPayload = payload; + if (this._pendingData.has(id)) { + fullPayload = this._pendingData.get(id)! + payload; + this._pendingData.delete(id); + } + + const image: IKittyImage = { + id, + data: fullPayload, + width: cmd.width || 0, + height: cmd.height || 0, + format: (cmd.format || KittyFormat.PNG) as 24 | 32 | 100 + }; + + this._images.set(id, image); + + if (this._debug) { + console.log(`[KittyGraphicsAddon] Stored image ${id}`); + } + + return true; + } + + private _handleTransmitDisplay(cmd: IKittyCommand): boolean { + this._handleTransmit(cmd); + // TODO: Display image at cursor position (canvas layer) + return true; + } + + private _handleQuery(cmd: IKittyCommand): boolean { + // TODO: Respond with APC sequence indicating graphics support + // Protocol: terminal should reply with ESC _ G i=;OK ESC \ + if (this._debug) { + console.log('[KittyGraphicsAddon] Query received'); + } + return true; + } + + private _handleDelete(cmd: IKittyCommand): boolean { + if (cmd.id !== undefined) { + this._images.delete(cmd.id); + } else { + this._images.clear(); + } + return true; + } +} diff --git a/addons/addon-kitty-graphics/src/tsconfig.json b/addons/addon-kitty-graphics/src/tsconfig.json new file mode 100644 index 000000000..570d4af57 --- /dev/null +++ b/addons/addon-kitty-graphics/src/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es2021", + "lib": ["dom", "es2015"], + "rootDir": ".", + "outDir": "../out", + "sourceMap": true, + "removeComments": true, + "strict": true, + "types": ["../../../node_modules/@types/mocha"], + "paths": { + "browser/*": ["../../../src/browser/*"], + "vs/*": ["../../../src/vs/*"], + "@xterm/addon-kitty-graphics": ["../typings/addon-kitty-graphics.d.ts"] + } + }, + "include": ["./**/*", "../../../typings/xterm.d.ts"], + "references": [ + { + "path": "../../../src/browser" + }, + { + "path": "../../../src/vs" + } + ] +} diff --git a/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts b/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts new file mode 100644 index 000000000..114df4615 --- /dev/null +++ b/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + * + * Playwright integration tests for Kitty Graphics Addon. + * These test the addon in a real browser with visual verification. + * + * Unit tests for parsing are in src/KittyGraphicsAddon.test.ts + */ + +import test from '@playwright/test'; +import { deepStrictEqual, strictEqual } from 'assert'; +import { ITestContext, createTestContext, openTerminal } from '../../../test/playwright/TestUtils'; + +let ctx: ITestContext; + +test.beforeAll(async ({ browser }) => { + ctx = await createTestContext(browser); +}); + +test.afterAll(async () => { + await ctx.page.close(); +}); + +test.describe('KittyGraphicsAddon', () => { + test.beforeEach(async () => { + await openTerminal(ctx, { cols: 80, rows: 24 }); + await ctx.page.evaluate(` + window.term.reset(); + `); + }); + + test('addon should be loaded and activated', async () => { + // Verify the addon is available on the window + const hasAddon = await ctx.page.evaluate(`typeof window.KittyGraphicsAddon !== 'undefined'`); + strictEqual(hasAddon, true, 'KittyGraphicsAddon should be available'); + }); + + // TODO: WAYYYYYY More tests that would initially fail, but work when addon work is complete. Like implementation of the handler. + +}); diff --git a/addons/addon-kitty-graphics/test/playwright.config.ts b/addons/addon-kitty-graphics/test/playwright.config.ts new file mode 100644 index 000000000..22834be11 --- /dev/null +++ b/addons/addon-kitty-graphics/test/playwright.config.ts @@ -0,0 +1,35 @@ +import { PlaywrightTestConfig } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + testDir: '.', + timeout: 10000, + projects: [ + { + name: 'ChromeStable', + use: { + browserName: 'chromium', + channel: 'chrome' + } + }, + { + name: 'FirefoxStable', + use: { + browserName: 'firefox' + } + }, + { + name: 'WebKit', + use: { + browserName: 'webkit' + } + } + ], + reporter: 'list', + webServer: { + command: 'npm run start', + port: 3000, + timeout: 120000, + reuseExistingServer: !process.env.CI + } +}; +export default config; diff --git a/addons/addon-kitty-graphics/test/tsconfig.json b/addons/addon-kitty-graphics/test/tsconfig.json new file mode 100644 index 000000000..8a7426703 --- /dev/null +++ b/addons/addon-kitty-graphics/test/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ESNext", + "lib": ["es2021"], + "rootDir": ".", + "outDir": "../out-test", + "sourceMap": true, + "removeComments": true, + "baseUrl": ".", + "paths": { + "common/*": ["../../../src/common/*"], + "browser/*": ["../../../src/browser/*"] + }, + "strict": true, + "types": ["../../../node_modules/@types/node"] + }, + "include": ["./**/*", "../../../typings/xterm.d.ts"], + "references": [ + { + "path": "../../../src/common" + }, + { + "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" + } + ] +} diff --git a/addons/addon-kitty-graphics/tsconfig.json b/addons/addon-kitty-graphics/tsconfig.json new file mode 100644 index 000000000..6531dac8b --- /dev/null +++ b/addons/addon-kitty-graphics/tsconfig.json @@ -0,0 +1,5 @@ +{ + "files": [], + "include": [], + "references": [{ "path": "./src" }, { "path": "./test" }] +} diff --git a/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts b/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts new file mode 100644 index 000000000..792f516df --- /dev/null +++ b/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; + +declare module '@xterm/addon-kitty-graphics' { + /** + * An xterm.js addon that provides support for the Kitty graphics protocol. + * This allows applications to display images in the terminal using APC + * escape sequences. + */ + export class KittyGraphicsAddon implements ITerminalAddon, IDisposable { + /** + * Creates a new Kitty graphics addon. + * @param options Optional configuration for the addon. + */ + constructor(options?: IKittyGraphicsOptions); + + /** + * Activates the addon. + * @param terminal The terminal the addon is being loaded in. + */ + public activate(terminal: Terminal): void; + + /** + * Disposes the addon. + */ + public dispose(): void; + + /** + * Gets the current images stored in the addon. + * Returns a map of image IDs to their image data. + */ + public readonly images: ReadonlyMap; + } + + /** + * Options for the Kitty graphics addon. + */ + export interface IKittyGraphicsOptions { + /** + * Enable debug logging of received graphics commands. + * Default: false + */ + debug?: boolean; + } + + /** + * Represents a stored Kitty graphics image. + */ + export interface IKittyImage { + /** + * The image ID assigned by the terminal or the application. + */ + id: number; + + /** + * The image data as a base64 string or ImageData object. + */ + data: string | ImageData; + + /** + * Width of the image in pixels. + */ + width: number; + + /** + * Height of the image in pixels. + */ + height: number; + + /** + * Format of the image data. + * - 24: RGB (3 bytes per pixel) + * - 32: RGBA (4 bytes per pixel) + * - 100: PNG + */ + format: 24 | 32 | 100; + } +} diff --git a/addons/addon-kitty-graphics/webpack.config.js b/addons/addon-kitty-graphics/webpack.config.js new file mode 100644 index 000000000..89ed51dec --- /dev/null +++ b/addons/addon-kitty-graphics/webpack.config.js @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + */ + +const path = require('path'); + +const addonName = 'KittyGraphicsAddon'; +const mainFile = 'addon-kitty-graphics.js'; + +const addon = { + entry: `./out/${addonName}.js`, + devtool: 'source-map', + module: { + rules: [ + { + test: /\.js$/, + use: ["source-map-loader"], + enforce: "pre", + exclude: /node_modules/ + } + ] + }, + resolve: { + modules: ['./node_modules'], + extensions: [ '.js' ], + alias: { + common: path.resolve('../../out/common'), + browser: path.resolve('../../out/browser'), + vs: path.resolve('../../out/vs') + } + }, + output: { + filename: mainFile, + path: path.resolve('./lib'), + library: addonName, + libraryTarget: 'umd', + // Force usage of globalThis instead of global / self. (This is cross-env compatible) + globalObject: 'globalThis', + }, + mode: 'production' +}; + +module.exports = [addon]; diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 5e0a370ca..5c7e5afea 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -137,6 +137,7 @@ if (config.addon) { "@xterm/addon-clipboard": "./addons/addon-clipboard/lib/addon-clipboard.mjs", "@xterm/addon-fit": "./addons/addon-fit/lib/addon-fit.mjs", "@xterm/addon-image": "./addons/addon-image/lib/addon-image.mjs", + "@xterm/addon-kitty-graphics": "./addons/addon-kitty-graphics/lib/addon-kitty-graphics.mjs", "@xterm/addon-progress": "./addons/addon-progress/lib/addon-progress.mjs", "@xterm/addon-search": "./addons/addon-search/lib/addon-search.mjs", "@xterm/addon-serialize": "./addons/addon-serialize/lib/addon-serialize.mjs", diff --git a/bin/test_integration.js b/bin/test_integration.js index 37e6aca7c..caceaf9be 100644 --- a/bin/test_integration.js +++ b/bin/test_integration.js @@ -25,6 +25,7 @@ const addons = [ 'clipboard', 'fit', 'image', + 'kitty-graphics', 'progress', 'search', 'serialize', diff --git a/demo/client/client.ts b/demo/client/client.ts index 1ed836696..70ed39b5f 100644 --- a/demo/client/client.ts +++ b/demo/client/client.ts @@ -29,6 +29,7 @@ import { TestWindow } from './components/window/testWindow'; import { VtWindow } from './components/window/vtWindow'; import { ClipboardAddon } from '@xterm/addon-clipboard'; import { FitAddon } from '@xterm/addon-fit'; +import { KittyGraphicsAddon } from '@xterm/addon-kitty-graphics'; import { LigaturesAddon } from '@xterm/addon-ligatures'; import { ProgressAddon } from '@xterm/addon-progress'; import { SearchAddon, ISearchOptions } from '@xterm/addon-search'; @@ -47,6 +48,7 @@ export interface IWindowWithTerminal extends Window { ClipboardAddon?: typeof ClipboardAddon; FitAddon?: typeof FitAddon; ImageAddon?: typeof ImageAddon; + KittyGraphicsAddon?: typeof KittyGraphicsAddon; ProgressAddon?: typeof ProgressAddon; SearchAddon?: typeof SearchAddon; SerializeAddon?: typeof SerializeAddon; @@ -74,6 +76,7 @@ const addons: AddonCollection = { clipboard: { name: 'clipboard', ctor: ClipboardAddon, canChange: true }, fit: { name: 'fit', ctor: FitAddon, canChange: false }, image: { name: 'image', ctor: ImageAddon, canChange: true }, + kittyGraphics: { name: 'kittyGraphics', ctor: KittyGraphicsAddon, canChange: true }, progress: { name: 'progress', ctor: ProgressAddon, canChange: true }, search: { name: 'search', ctor: SearchAddon, canChange: true }, serialize: { name: 'serialize', ctor: SerializeAddon, canChange: true }, @@ -196,6 +199,7 @@ if (document.location.pathname === '/test') { window.ClipboardAddon = ClipboardAddon; window.FitAddon = FitAddon; window.ImageAddon = ImageAddon; + window.KittyGraphicsAddon = KittyGraphicsAddon; window.ProgressAddon = ProgressAddon; window.SearchAddon = SearchAddon; window.SerializeAddon = SerializeAddon; @@ -294,6 +298,7 @@ function createTerminal(): Terminal { addons.serialize.instance = new SerializeAddon(); addons.fit.instance = new FitAddon(); addons.image.instance = new ImageAddon(); + addons.kittyGraphics.instance = new KittyGraphicsAddon(); addons.progress.instance = new ProgressAddon(); addons.unicodeGraphemes.instance = new UnicodeGraphemesAddon(); addons.clipboard.instance = new ClipboardAddon(); @@ -306,6 +311,7 @@ function createTerminal(): Terminal { addons.webFonts.instance = new WebFontsAddon(); typedTerm.loadAddon(addons.fit.instance); typedTerm.loadAddon(addons.image.instance); + typedTerm.loadAddon(addons.kittyGraphics.instance); typedTerm.loadAddon(addons.progress.instance); typedTerm.loadAddon(addons.search.instance); typedTerm.loadAddon(addons.serialize.instance); @@ -607,7 +613,7 @@ function updateTerminalSize(): void { function getBox(width: number, height: number): any { return { string: '+', - style: 'font-size: 1px; padding: ' + Math.floor(height/2) + 'px ' + Math.floor(width/2) + 'px; line-height: ' + height + 'px;' + style: 'font-size: 1px; padding: ' + Math.floor(height / 2) + 'px ' + Math.floor(width / 2) + 'px; line-height: ' + height + 'px;' }; } if (source instanceof HTMLCanvasElement) { diff --git a/demo/client/tsconfig.json b/demo/client/tsconfig.json index 17aae876b..554272dec 100644 --- a/demo/client/tsconfig.json +++ b/demo/client/tsconfig.json @@ -11,6 +11,7 @@ "@xterm/addon-clipboard": ["../../addons/addon-clipboard"], "@xterm/addon-fit": ["../../addons/addon-fit"], "@xterm/addon-image": ["../../addons/addon-image"], + "@xterm/addon-kitty-graphics": ["../../addons/addon-kitty-graphics"], "@xterm/addon-progress": ["../../addons/addon-progress"], "@xterm/addon-search": ["../../addons/addon-search"], "@xterm/addon-serialize": ["../../addons/addon-serialize"], diff --git a/demo/client/types.ts b/demo/client/types.ts index 4790fd4f9..8cafdd506 100644 --- a/demo/client/types.ts +++ b/demo/client/types.ts @@ -9,6 +9,7 @@ import type { ImageAddon } from '@xterm/addon-image'; import type { AttachAddon } from '@xterm/addon-attach'; import type { ClipboardAddon } from '@xterm/addon-clipboard'; import type { FitAddon } from '@xterm/addon-fit'; +import type { KittyGraphicsAddon } from '@xterm/addon-kitty-graphics'; import type { LigaturesAddon } from '@xterm/addon-ligatures'; import type { ProgressAddon } from '@xterm/addon-progress'; import type { SearchAddon } from '@xterm/addon-search'; @@ -19,7 +20,7 @@ import type { WebFontsAddon } from '@xterm/addon-web-fonts'; import type { WebLinksAddon } from '@xterm/addon-web-links'; import type { WebglAddon } from '@xterm/addon-webgl'; -export type AddonType = 'attach' | 'clipboard' | 'fit' | 'image' | 'progress' | 'search' | 'serialize' | 'unicode11' | 'unicodeGraphemes' | 'webFonts' | 'webLinks' | 'webgl' | 'ligatures'; +export type AddonType = 'attach' | 'clipboard' | 'fit' | 'image' | 'kittyGraphics' | 'progress' | 'search' | 'serialize' | 'unicode11' | 'unicodeGraphemes' | 'webFonts' | 'webLinks' | 'webgl' | 'ligatures'; export interface IDemoAddon { name: T; @@ -29,32 +30,34 @@ export interface IDemoAddon { T extends 'clipboard' ? typeof ClipboardAddon : T extends 'fit' ? typeof FitAddon : T extends 'image' ? typeof ImageAddon : - T extends 'ligatures' ? typeof LigaturesAddon : - T extends 'progress' ? typeof ProgressAddon : - T extends 'search' ? typeof SearchAddon : - T extends 'serialize' ? typeof SerializeAddon : - T extends 'webFonts' ? typeof WebFontsAddon : - T extends 'webLinks' ? typeof WebLinksAddon : - T extends 'unicode11' ? typeof Unicode11Addon : - T extends 'unicodeGraphemes' ? typeof UnicodeGraphemesAddon : - T extends 'webgl' ? typeof WebglAddon : - never + T extends 'kittyGraphics' ? typeof KittyGraphicsAddon : + T extends 'ligatures' ? typeof LigaturesAddon : + T extends 'progress' ? typeof ProgressAddon : + T extends 'search' ? typeof SearchAddon : + T extends 'serialize' ? typeof SerializeAddon : + T extends 'webFonts' ? typeof WebFontsAddon : + T extends 'webLinks' ? typeof WebLinksAddon : + T extends 'unicode11' ? typeof Unicode11Addon : + T extends 'unicodeGraphemes' ? typeof UnicodeGraphemesAddon : + T extends 'webgl' ? typeof WebglAddon : + never ); instance?: ( T extends 'attach' ? AttachAddon : T extends 'clipboard' ? ClipboardAddon : T extends 'fit' ? FitAddon : T extends 'image' ? ImageAddon : - T extends 'ligatures' ? LigaturesAddon : - T extends 'progress' ? ProgressAddon : - T extends 'search' ? SearchAddon : - T extends 'serialize' ? SerializeAddon : - T extends 'webFonts' ? WebFontsAddon : - T extends 'webLinks' ? WebLinksAddon : - T extends 'unicode11' ? Unicode11Addon : - T extends 'unicodeGraphemes' ? UnicodeGraphemesAddon : - T extends 'webgl' ? WebglAddon : - never + T extends 'kittyGraphics' ? KittyGraphicsAddon : + T extends 'ligatures' ? LigaturesAddon : + T extends 'progress' ? ProgressAddon : + T extends 'search' ? SearchAddon : + T extends 'serialize' ? SerializeAddon : + T extends 'webFonts' ? WebFontsAddon : + T extends 'webLinks' ? WebLinksAddon : + T extends 'unicode11' ? Unicode11Addon : + T extends 'unicodeGraphemes' ? UnicodeGraphemesAddon : + T extends 'webgl' ? WebglAddon : + never ); } diff --git a/send-png b/send-png new file mode 100755 index 000000000..9afe64c5a --- /dev/null +++ b/send-png @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# TODO: Consider removing when Kitty Graphics Addon is shipped. +""" +Minimal Kitty Graphics Protocol image sender. +Based on: https://sw.kovidgoyal.net/kitty/graphics-protocol/#a-minimal-example + +Usage: + ./send-png black-1x1.png + ./send-png rgb-3x1.png +""" +import sys +from base64 import standard_b64encode + +def serialize_image(path): + with open(path, 'rb') as f: + data = f.read() + return standard_b64encode(data).decode('ascii') + +def write_chunked(data): + # a=T means transmit and display + # f=100 means PNG format + # For small images, single chunk (no chunking needed) + sys.stdout.write(f'\x1b_Ga=T,f=100;{data}\x1b\\') + sys.stdout.flush() + +if __name__ == '__main__': + if len(sys.argv) < 2: + print("Usage: ./send-png ", file=sys.stderr) + sys.exit(1) + + img_data = serialize_image(sys.argv[1]) + write_chunked(img_data) + print() # newline after the sequence diff --git a/tsconfig.all.json b/tsconfig.all.json index b0ed02799..2f6827393 100644 --- a/tsconfig.all.json +++ b/tsconfig.all.json @@ -11,6 +11,7 @@ { "path": "./addons/addon-clipboard" }, { "path": "./addons/addon-fit" }, { "path": "./addons/addon-image" }, + { "path": "./addons/addon-kitty-graphics" }, { "path": "./addons/addon-ligatures" }, { "path": "./addons/addon-progress" }, { "path": "./addons/addon-search" }, From 6a02d7c9f551cdd3185d32c9146101425227c281 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 11:56:48 -0800 Subject: [PATCH 002/124] Add some playwright tests that will first fail --- .../test/KittyGraphicsAddon.test.ts | 140 +++++++++++++++++- 1 file changed, 137 insertions(+), 3 deletions(-) diff --git a/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts b/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts index 114df4615..c937620f3 100644 --- a/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts +++ b/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts @@ -9,8 +9,13 @@ */ import test from '@playwright/test'; +import { readFileSync } from 'fs'; import { deepStrictEqual, strictEqual } from 'assert'; -import { ITestContext, createTestContext, openTerminal } from '../../../test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal, timeout } from '../../../test/playwright/TestUtils'; + +// Load test images as base64 +const BLACK_1X1_BASE64 = readFileSync('./addons/addon-kitty-graphics/fixture/black-1x1.png').toString('base64'); +const RGB_3X1_BASE64 = readFileSync('./addons/addon-kitty-graphics/fixture/rgb-3x1.png').toString('base64'); let ctx: ITestContext; @@ -27,15 +32,144 @@ test.describe('KittyGraphicsAddon', () => { await openTerminal(ctx, { cols: 80, rows: 24 }); await ctx.page.evaluate(` window.term.reset(); + window.kittyAddon?.dispose(); + window.kittyAddon = new KittyGraphicsAddon({ debug: true }); + window.term.loadAddon(window.kittyAddon); `); }); test('addon should be loaded and activated', async () => { - // Verify the addon is available on the window const hasAddon = await ctx.page.evaluate(`typeof window.KittyGraphicsAddon !== 'undefined'`); strictEqual(hasAddon, true, 'KittyGraphicsAddon should be available'); }); - // TODO: WAYYYYYY More tests that would initially fail, but work when addon work is complete. Like implementation of the handler. + test.describe('image storage', () => { + test('stores PNG image with a=t (transmit only)', async () => { + const seq = `\x1b_Ga=t,f=100;${BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(50); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 1); + }); + test('stores PNG image with a=T (transmit and display)', async () => { + const seq = `\x1b_Ga=T,f=100;${BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(50); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 1); + }); + + test('assigns auto-incrementing IDs when not specified', async () => { + const seq1 = `\x1b_Ga=t,f=100;${BLACK_1X1_BASE64}\x1b\\`; + const seq2 = `\x1b_Ga=t,f=100;${RGB_3X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq1); + await ctx.proxy.write(seq2); + await timeout(50); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 2); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(1)'), true); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(2)'), true); + }); + + test('uses specified image ID', async () => { + const seq = `\x1b_Ga=t,f=100,i=42;${BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(50); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(42)'), true); + }); + + test('deletes specific image with a=d', async () => { + const seq1 = `\x1b_Ga=t,f=100,i=10;${BLACK_1X1_BASE64}\x1b\\`; + const seq2 = `\x1b_Ga=d,i=10;\x1b\\`; + await ctx.proxy.write(seq1); + await timeout(50); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 1); + await ctx.proxy.write(seq2); + await timeout(50); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 0); + }); + + test('deletes all images with a=d (no id)', async () => { + const seq1 = `\x1b_Ga=t,f=100,i=1;${BLACK_1X1_BASE64}\x1b\\`; + const seq2 = `\x1b_Ga=t,f=100,i=2;${RGB_3X1_BASE64}\x1b\\`; + const seqDelete = `\x1b_Ga=d;\x1b\\`; + await ctx.proxy.write(seq1); + await ctx.proxy.write(seq2); + await timeout(50); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 2); + await ctx.proxy.write(seqDelete); + await timeout(50); + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 0); + }); + }); + + test.describe('chunked transmission (m=1)', () => { + test('assembles multi-chunk image', async () => { + // Split the base64 in half + const half = Math.floor(BLACK_1X1_BASE64.length / 2); + const part1 = BLACK_1X1_BASE64.substring(0, half); + const part2 = BLACK_1X1_BASE64.substring(half); + + const seq1 = `\x1b_Ga=t,f=100,i=99,m=1;${part1}\x1b\\`; + const seq2 = `\x1b_Ga=t,f=100,i=99;${part2}\x1b\\`; + + await ctx.proxy.write(seq1); + await timeout(50); + // Image should not be stored yet (still pending) + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(99)'), false); + + await ctx.proxy.write(seq2); + await timeout(50); + // Now it should be stored + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(99)'), true); + + // Verify the full data was assembled + const storedData = await ctx.page.evaluate('window.kittyAddon.images.get(99).data'); + strictEqual(storedData, BLACK_1X1_BASE64); + }); + }); + + // TODO: These tests will fail until decode + rendering is implemented + test.describe.skip('pixel verification', () => { + test('renders 1x1 black PNG at cursor position', async () => { + // Send image with a=T to transmit and display + const seq = `\x1b_Ga=T,f=100;${BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + + // Read pixel from addon's canvas overlay + const pixel = await ctx.page.evaluate(() => { + const canvas = document.querySelector('.xterm-kitty-graphics-layer') as HTMLCanvasElement; + if (!canvas) return null; + const ctx = canvas.getContext('2d'); + if (!ctx) return null; + return Array.from(ctx.getImageData(0, 0, 1, 1).data); + }); + + // Black pixel: [0, 0, 0, 255] + deepStrictEqual(pixel, [0, 0, 0, 255]); + }); + + test('renders 3x1 RGB PNG (red, green, blue pixels)', async () => { + const seq = `\x1b_Ga=T,f=100;${RGB_3X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + + const pixels = await ctx.page.evaluate(() => { + const canvas = document.querySelector('.xterm-kitty-graphics-layer') as HTMLCanvasElement; + if (!canvas) return null; + const ctx = canvas.getContext('2d'); + if (!ctx) return null; + const imageData = ctx.getImageData(0, 0, 3, 1).data; + return { + red: Array.from(imageData.slice(0, 4)), + green: Array.from(imageData.slice(4, 8)), + blue: Array.from(imageData.slice(8, 12)) + }; + }); + + // Verify RGB pixels + deepStrictEqual(pixels?.red, [255, 0, 0, 255]); + deepStrictEqual(pixels?.green, [0, 255, 0, 255]); + deepStrictEqual(pixels?.blue, [0, 0, 255, 255]); + }); + }); }); From 447746314e826ab4bdf9fd9436583bd2e9808e5a Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 11:58:51 -0800 Subject: [PATCH 003/124] npm install to update pckage-lock.json --- package-lock.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/package-lock.json b/package-lock.json index 4c218b709..89fda195d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,6 +82,11 @@ "xterm-wasm-parts": "^0.1.0" } }, + "addons/addon-kitty-graphics": { + "name": "@xterm/addon-kitty-graphics", + "version": "0.1.0", + "license": "MIT" + }, "addons/addon-ligatures": { "name": "@xterm/addon-ligatures", "version": "0.10.0", @@ -2274,6 +2279,10 @@ "resolved": "addons/addon-image", "link": true }, + "node_modules/@xterm/addon-kitty-graphics": { + "resolved": "addons/addon-kitty-graphics", + "link": true + }, "node_modules/@xterm/addon-ligatures": { "resolved": "addons/addon-ligatures", "link": true From bea16280150fab7045d386edaadf50163e4cf73a Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 12:02:46 -0800 Subject: [PATCH 004/124] Edit ci.yml ? --- .github/workflows/ci.yml | 449 ++++++++++++++++++++------------------- 1 file changed, 227 insertions(+), 222 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c40e86ff2..768f02176 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,131 +2,134 @@ name: CI on: push: - branches: [ "master" ] + branches: ["master"] pull_request: - branches: [ "master" ] + branches: ["master"] jobs: build: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: 'npm' - - name: Install dependencies - run: npm ci - - name: Setup and run tsc - run: npm run setup - - name: Esbuild - run: npm run esbuild - - name: Zip artifacts - run: | - zip -r compressed-build \ - ./lib/* \ - ./out/* \ - ./out-*/* \ - ./addons/addon-attach/lib/* \ - ./addons/addon-attach/out/* \ - ./addons/addon-attach/out-*/* \ - ./addons/addon-clipboard/lib/* \ - ./addons/addon-clipboard/out/* \ - ./addons/addon-clipboard/out-*/* \ - ./addons/addon-fit/lib/* \ - ./addons/addon-fit/out/* \ - ./addons/addon-fit/out-*/* \ - ./addons/addon-image/lib/* \ - ./addons/addon-image/out/* \ - ./addons/addon-image/out-*/* \ - ./addons/addon-ligatures/lib/* \ - ./addons/addon-ligatures/out/* \ - ./addons/addon-ligatures/out-*/* \ - ./addons/addon-progress/lib/* \ - ./addons/addon-progress/out/* \ - ./addons/addon-progress/out-*/* \ - ./addons/addon-search/lib/* \ - ./addons/addon-search/out/* \ - ./addons/addon-search/out-*/* \ - ./addons/addon-serialize/lib/* \ - ./addons/addon-serialize/out/* \ - ./addons/addon-serialize/out-*/* \ - ./addons/addon-unicode11/lib/* \ - ./addons/addon-unicode11/out/* \ - ./addons/addon-unicode11/out-*/* \ - ./addons/addon-unicode-graphemes/lib/* \ - ./addons/addon-unicode-graphemes/out/* \ - ./addons/addon-unicode-graphemes/out-*/* \ - ./addons/addon-web-links/lib/* \ - ./addons/addon-web-links/out/* \ - ./addons/addon-web-links/out-*/* \ - ./addons/addon-web-fonts/lib/* \ - ./addons/addon-web-fonts/out/* \ - ./addons/addon-web-fonts/out-*/* \ - ./addons/addon-webgl/lib/* \ - ./addons/addon-webgl/out/* \ - ./addons/addon-webgl/out-*st/* - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: build-artifacts - path: compressed-build.zip - if-no-files-found: error + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: "npm" + - name: Install dependencies + run: npm ci + - name: Setup and run tsc + run: npm run setup + - name: Esbuild + run: npm run esbuild + - name: Zip artifacts + run: | + zip -r compressed-build \ + ./lib/* \ + ./out/* \ + ./out-*/* \ + ./addons/addon-attach/lib/* \ + ./addons/addon-attach/out/* \ + ./addons/addon-attach/out-*/* \ + ./addons/addon-clipboard/lib/* \ + ./addons/addon-clipboard/out/* \ + ./addons/addon-clipboard/out-*/* \ + ./addons/addon-fit/lib/* \ + ./addons/addon-fit/out/* \ + ./addons/addon-fit/out-*/* \ + ./addons/addon-image/lib/* \ + ./addons/addon-image/out/* \ + ./addons/addon-image/out-*/* \ + ./addons/addon-kitty-graphics/lib/* \ + ./addons/addon-kitty-graphics/out/* \ + ./addons/addon-kitty-graphics/out-*/* \ + ./addons/addon-ligatures/lib/* \ + ./addons/addon-ligatures/out/* \ + ./addons/addon-ligatures/out-*/* \ + ./addons/addon-progress/lib/* \ + ./addons/addon-progress/out/* \ + ./addons/addon-progress/out-*/* \ + ./addons/addon-search/lib/* \ + ./addons/addon-search/out/* \ + ./addons/addon-search/out-*/* \ + ./addons/addon-serialize/lib/* \ + ./addons/addon-serialize/out/* \ + ./addons/addon-serialize/out-*/* \ + ./addons/addon-unicode11/lib/* \ + ./addons/addon-unicode11/out/* \ + ./addons/addon-unicode11/out-*/* \ + ./addons/addon-unicode-graphemes/lib/* \ + ./addons/addon-unicode-graphemes/out/* \ + ./addons/addon-unicode-graphemes/out-*/* \ + ./addons/addon-web-links/lib/* \ + ./addons/addon-web-links/out/* \ + ./addons/addon-web-links/out-*/* \ + ./addons/addon-web-fonts/lib/* \ + ./addons/addon-web-fonts/out/* \ + ./addons/addon-web-fonts/out-*/* \ + ./addons/addon-webgl/lib/* \ + ./addons/addon-webgl/out/* \ + ./addons/addon-webgl/out-*st/* + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: compressed-build.zip + if-no-files-found: error lint: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - name: Lint code - env: - NODE_OPTIONS: --max_old_space_size=4096 - run: npm run lint - - name: Lint API - run: npm run lint-api + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - name: Lint code + env: + NODE_OPTIONS: --max_old_space_size=4096 + run: npm run lint + - name: Lint API + run: npm run lint-api test-unit-coverage: needs: build runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Unit test coverage - run: | - npm run test-unit-coverage --forbid-only - EXIT_CODE=$? - ./node_modules/.bin/nyc report --reporter=cobertura - exit $EXIT_CODE + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Unit test coverage + run: | + npm run test-unit-coverage --forbid-only + EXIT_CODE=$? + ./node_modules/.bin/nyc report --reporter=cobertura + exit $EXIT_CODE test-unit: timeout-minutes: 20 @@ -136,34 +139,34 @@ jobs: runs-on: [ubuntu, macos, windows] runs-on: ${{ matrix.runs-on }}-latest steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - name: Wait for build job - uses: NathanFirmo/wait-for-other-job@v1.1.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - job: build - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Unit tests - run: npm run test-unit --forbid-only + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - name: Wait for build job + uses: NathanFirmo/wait-for-other-job@v1.1.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + job: build + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Unit tests + run: npm run test-unit --forbid-only test-integration: timeout-minutes: 20 @@ -174,64 +177,66 @@ jobs: browser: [chromium, firefox, webkit] runs-on: ${{ matrix.runs-on }} steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - name: Install playwright - run: npx playwright install --with-deps ${{ matrix.browser }} - - name: Wait for build job - uses: NathanFirmo/wait-for-other-job@v1.1.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - job: build - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Build demo client - run: npm run esbuild-demo-client - - name: Build demo server - run: npm run esbuild-demo-server - - name: Integration tests (core) # Tests use 50% workers to reduce flakiness - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core - - name: Integration tests (addon-attach) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-attach - - name: Integration tests (addon-clipboard) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-clipboard - - name: Integration tests (addon-fit) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit - - name: Integration tests (addon-image) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image - - name: Integration tests (addon-progress) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress - - name: Integration tests (addon-search) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-search - - name: Integration tests (addon-serialize) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-serialize - - name: Integration tests (addon-unicode-graphemes) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode-graphemes - - name: Integration tests (addon-unicode11) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode11 - - name: Integration tests (addon-web-fonts) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-fonts - - name: Integration tests (addon-web-links) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-links - - name: Integration tests (addon-webgl) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - name: Install playwright + run: npx playwright install --with-deps ${{ matrix.browser }} + - name: Wait for build job + uses: NathanFirmo/wait-for-other-job@v1.1.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + job: build + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Build demo client + run: npm run esbuild-demo-client + - name: Build demo server + run: npm run esbuild-demo-server + - name: Integration tests (core) # Tests use 50% workers to reduce flakiness + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core + - name: Integration tests (addon-attach) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-attach + - name: Integration tests (addon-clipboard) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-clipboard + - name: Integration tests (addon-fit) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit + - name: Integration tests (addon-image) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image + - name: Integration tests (addon-kitty-graphics) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-kitty-graphics + - name: Integration tests (addon-progress) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress + - name: Integration tests (addon-search) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-search + - name: Integration tests (addon-serialize) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-serialize + - name: Integration tests (addon-unicode-graphemes) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode-graphemes + - name: Integration tests (addon-unicode11) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode11 + - name: Integration tests (addon-web-fonts) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-fonts + - name: Integration tests (addon-web-links) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-links + - name: Integration tests (addon-webgl) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl release-dry-run: needs: build @@ -240,32 +245,32 @@ jobs: matrix: node-version: [22] steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - name: Install playwright - run: npx playwright install - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Package headless - run: | - npm run package-headless - node ./bin/package_headless.js - - name: Publish to npm (dry run) - run: node ./bin/publish.js --dry + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - name: Install playwright + run: npx playwright install + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Package headless + run: | + npm run package-headless + node ./bin/package_headless.js + - name: Publish to npm (dry run) + run: node ./bin/publish.js --dry From fc0dc3fb07b20874039657202115126e1f62976d Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 13:06:42 -0800 Subject: [PATCH 005/124] Dont mess with og formatting for ci.yml --- .github/workflows/ci.yml | 449 +++++++++++++++++++-------------------- 1 file changed, 222 insertions(+), 227 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 768f02176..c40e86ff2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,134 +2,131 @@ name: CI on: push: - branches: ["master"] + branches: [ "master" ] pull_request: - branches: ["master"] + branches: [ "master" ] jobs: build: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: "npm" - - name: Install dependencies - run: npm ci - - name: Setup and run tsc - run: npm run setup - - name: Esbuild - run: npm run esbuild - - name: Zip artifacts - run: | - zip -r compressed-build \ - ./lib/* \ - ./out/* \ - ./out-*/* \ - ./addons/addon-attach/lib/* \ - ./addons/addon-attach/out/* \ - ./addons/addon-attach/out-*/* \ - ./addons/addon-clipboard/lib/* \ - ./addons/addon-clipboard/out/* \ - ./addons/addon-clipboard/out-*/* \ - ./addons/addon-fit/lib/* \ - ./addons/addon-fit/out/* \ - ./addons/addon-fit/out-*/* \ - ./addons/addon-image/lib/* \ - ./addons/addon-image/out/* \ - ./addons/addon-image/out-*/* \ - ./addons/addon-kitty-graphics/lib/* \ - ./addons/addon-kitty-graphics/out/* \ - ./addons/addon-kitty-graphics/out-*/* \ - ./addons/addon-ligatures/lib/* \ - ./addons/addon-ligatures/out/* \ - ./addons/addon-ligatures/out-*/* \ - ./addons/addon-progress/lib/* \ - ./addons/addon-progress/out/* \ - ./addons/addon-progress/out-*/* \ - ./addons/addon-search/lib/* \ - ./addons/addon-search/out/* \ - ./addons/addon-search/out-*/* \ - ./addons/addon-serialize/lib/* \ - ./addons/addon-serialize/out/* \ - ./addons/addon-serialize/out-*/* \ - ./addons/addon-unicode11/lib/* \ - ./addons/addon-unicode11/out/* \ - ./addons/addon-unicode11/out-*/* \ - ./addons/addon-unicode-graphemes/lib/* \ - ./addons/addon-unicode-graphemes/out/* \ - ./addons/addon-unicode-graphemes/out-*/* \ - ./addons/addon-web-links/lib/* \ - ./addons/addon-web-links/out/* \ - ./addons/addon-web-links/out-*/* \ - ./addons/addon-web-fonts/lib/* \ - ./addons/addon-web-fonts/out/* \ - ./addons/addon-web-fonts/out-*/* \ - ./addons/addon-webgl/lib/* \ - ./addons/addon-webgl/out/* \ - ./addons/addon-webgl/out-*st/* - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: build-artifacts - path: compressed-build.zip - if-no-files-found: error + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: 'npm' + - name: Install dependencies + run: npm ci + - name: Setup and run tsc + run: npm run setup + - name: Esbuild + run: npm run esbuild + - name: Zip artifacts + run: | + zip -r compressed-build \ + ./lib/* \ + ./out/* \ + ./out-*/* \ + ./addons/addon-attach/lib/* \ + ./addons/addon-attach/out/* \ + ./addons/addon-attach/out-*/* \ + ./addons/addon-clipboard/lib/* \ + ./addons/addon-clipboard/out/* \ + ./addons/addon-clipboard/out-*/* \ + ./addons/addon-fit/lib/* \ + ./addons/addon-fit/out/* \ + ./addons/addon-fit/out-*/* \ + ./addons/addon-image/lib/* \ + ./addons/addon-image/out/* \ + ./addons/addon-image/out-*/* \ + ./addons/addon-ligatures/lib/* \ + ./addons/addon-ligatures/out/* \ + ./addons/addon-ligatures/out-*/* \ + ./addons/addon-progress/lib/* \ + ./addons/addon-progress/out/* \ + ./addons/addon-progress/out-*/* \ + ./addons/addon-search/lib/* \ + ./addons/addon-search/out/* \ + ./addons/addon-search/out-*/* \ + ./addons/addon-serialize/lib/* \ + ./addons/addon-serialize/out/* \ + ./addons/addon-serialize/out-*/* \ + ./addons/addon-unicode11/lib/* \ + ./addons/addon-unicode11/out/* \ + ./addons/addon-unicode11/out-*/* \ + ./addons/addon-unicode-graphemes/lib/* \ + ./addons/addon-unicode-graphemes/out/* \ + ./addons/addon-unicode-graphemes/out-*/* \ + ./addons/addon-web-links/lib/* \ + ./addons/addon-web-links/out/* \ + ./addons/addon-web-links/out-*/* \ + ./addons/addon-web-fonts/lib/* \ + ./addons/addon-web-fonts/out/* \ + ./addons/addon-web-fonts/out-*/* \ + ./addons/addon-webgl/lib/* \ + ./addons/addon-webgl/out/* \ + ./addons/addon-webgl/out-*st/* + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: compressed-build.zip + if-no-files-found: error lint: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - name: Lint code - env: - NODE_OPTIONS: --max_old_space_size=4096 - run: npm run lint - - name: Lint API - run: npm run lint-api + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - name: Lint code + env: + NODE_OPTIONS: --max_old_space_size=4096 + run: npm run lint + - name: Lint API + run: npm run lint-api test-unit-coverage: needs: build runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Unit test coverage - run: | - npm run test-unit-coverage --forbid-only - EXIT_CODE=$? - ./node_modules/.bin/nyc report --reporter=cobertura - exit $EXIT_CODE + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Unit test coverage + run: | + npm run test-unit-coverage --forbid-only + EXIT_CODE=$? + ./node_modules/.bin/nyc report --reporter=cobertura + exit $EXIT_CODE test-unit: timeout-minutes: 20 @@ -139,34 +136,34 @@ jobs: runs-on: [ubuntu, macos, windows] runs-on: ${{ matrix.runs-on }}-latest steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - name: Wait for build job - uses: NathanFirmo/wait-for-other-job@v1.1.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - job: build - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Unit tests - run: npm run test-unit --forbid-only + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - name: Wait for build job + uses: NathanFirmo/wait-for-other-job@v1.1.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + job: build + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Unit tests + run: npm run test-unit --forbid-only test-integration: timeout-minutes: 20 @@ -177,66 +174,64 @@ jobs: browser: [chromium, firefox, webkit] runs-on: ${{ matrix.runs-on }} steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - name: Install playwright - run: npx playwright install --with-deps ${{ matrix.browser }} - - name: Wait for build job - uses: NathanFirmo/wait-for-other-job@v1.1.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - job: build - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Build demo client - run: npm run esbuild-demo-client - - name: Build demo server - run: npm run esbuild-demo-server - - name: Integration tests (core) # Tests use 50% workers to reduce flakiness - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core - - name: Integration tests (addon-attach) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-attach - - name: Integration tests (addon-clipboard) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-clipboard - - name: Integration tests (addon-fit) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit - - name: Integration tests (addon-image) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image - - name: Integration tests (addon-kitty-graphics) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-kitty-graphics - - name: Integration tests (addon-progress) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress - - name: Integration tests (addon-search) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-search - - name: Integration tests (addon-serialize) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-serialize - - name: Integration tests (addon-unicode-graphemes) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode-graphemes - - name: Integration tests (addon-unicode11) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode11 - - name: Integration tests (addon-web-fonts) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-fonts - - name: Integration tests (addon-web-links) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-links - - name: Integration tests (addon-webgl) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - name: Install playwright + run: npx playwright install --with-deps ${{ matrix.browser }} + - name: Wait for build job + uses: NathanFirmo/wait-for-other-job@v1.1.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + job: build + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Build demo client + run: npm run esbuild-demo-client + - name: Build demo server + run: npm run esbuild-demo-server + - name: Integration tests (core) # Tests use 50% workers to reduce flakiness + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core + - name: Integration tests (addon-attach) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-attach + - name: Integration tests (addon-clipboard) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-clipboard + - name: Integration tests (addon-fit) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit + - name: Integration tests (addon-image) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image + - name: Integration tests (addon-progress) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress + - name: Integration tests (addon-search) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-search + - name: Integration tests (addon-serialize) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-serialize + - name: Integration tests (addon-unicode-graphemes) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode-graphemes + - name: Integration tests (addon-unicode11) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode11 + - name: Integration tests (addon-web-fonts) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-fonts + - name: Integration tests (addon-web-links) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-links + - name: Integration tests (addon-webgl) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl release-dry-run: needs: build @@ -245,32 +240,32 @@ jobs: matrix: node-version: [22] steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - name: Install playwright - run: npx playwright install - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Package headless - run: | - npm run package-headless - node ./bin/package_headless.js - - name: Publish to npm (dry run) - run: node ./bin/publish.js --dry + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - name: Install playwright + run: npx playwright install + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Package headless + run: | + npm run package-headless + node ./bin/package_headless.js + - name: Publish to npm (dry run) + run: node ./bin/publish.js --dry From 8f0e711a79a781d14ed518c34f46ddcc8807316b Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 13:09:44 -0800 Subject: [PATCH 006/124] ci.yml --- .github/workflows/ci.yml | 449 ++++++++++++++++++++------------------- 1 file changed, 227 insertions(+), 222 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c40e86ff2..768f02176 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,131 +2,134 @@ name: CI on: push: - branches: [ "master" ] + branches: ["master"] pull_request: - branches: [ "master" ] + branches: ["master"] jobs: build: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: 'npm' - - name: Install dependencies - run: npm ci - - name: Setup and run tsc - run: npm run setup - - name: Esbuild - run: npm run esbuild - - name: Zip artifacts - run: | - zip -r compressed-build \ - ./lib/* \ - ./out/* \ - ./out-*/* \ - ./addons/addon-attach/lib/* \ - ./addons/addon-attach/out/* \ - ./addons/addon-attach/out-*/* \ - ./addons/addon-clipboard/lib/* \ - ./addons/addon-clipboard/out/* \ - ./addons/addon-clipboard/out-*/* \ - ./addons/addon-fit/lib/* \ - ./addons/addon-fit/out/* \ - ./addons/addon-fit/out-*/* \ - ./addons/addon-image/lib/* \ - ./addons/addon-image/out/* \ - ./addons/addon-image/out-*/* \ - ./addons/addon-ligatures/lib/* \ - ./addons/addon-ligatures/out/* \ - ./addons/addon-ligatures/out-*/* \ - ./addons/addon-progress/lib/* \ - ./addons/addon-progress/out/* \ - ./addons/addon-progress/out-*/* \ - ./addons/addon-search/lib/* \ - ./addons/addon-search/out/* \ - ./addons/addon-search/out-*/* \ - ./addons/addon-serialize/lib/* \ - ./addons/addon-serialize/out/* \ - ./addons/addon-serialize/out-*/* \ - ./addons/addon-unicode11/lib/* \ - ./addons/addon-unicode11/out/* \ - ./addons/addon-unicode11/out-*/* \ - ./addons/addon-unicode-graphemes/lib/* \ - ./addons/addon-unicode-graphemes/out/* \ - ./addons/addon-unicode-graphemes/out-*/* \ - ./addons/addon-web-links/lib/* \ - ./addons/addon-web-links/out/* \ - ./addons/addon-web-links/out-*/* \ - ./addons/addon-web-fonts/lib/* \ - ./addons/addon-web-fonts/out/* \ - ./addons/addon-web-fonts/out-*/* \ - ./addons/addon-webgl/lib/* \ - ./addons/addon-webgl/out/* \ - ./addons/addon-webgl/out-*st/* - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: build-artifacts - path: compressed-build.zip - if-no-files-found: error + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: "npm" + - name: Install dependencies + run: npm ci + - name: Setup and run tsc + run: npm run setup + - name: Esbuild + run: npm run esbuild + - name: Zip artifacts + run: | + zip -r compressed-build \ + ./lib/* \ + ./out/* \ + ./out-*/* \ + ./addons/addon-attach/lib/* \ + ./addons/addon-attach/out/* \ + ./addons/addon-attach/out-*/* \ + ./addons/addon-clipboard/lib/* \ + ./addons/addon-clipboard/out/* \ + ./addons/addon-clipboard/out-*/* \ + ./addons/addon-fit/lib/* \ + ./addons/addon-fit/out/* \ + ./addons/addon-fit/out-*/* \ + ./addons/addon-image/lib/* \ + ./addons/addon-image/out/* \ + ./addons/addon-image/out-*/* \ + ./addons/addon-kitty-graphics/lib/* \ + ./addons/addon-kitty-graphics/out/* \ + ./addons/addon-kitty-graphics/out-*/* \ + ./addons/addon-ligatures/lib/* \ + ./addons/addon-ligatures/out/* \ + ./addons/addon-ligatures/out-*/* \ + ./addons/addon-progress/lib/* \ + ./addons/addon-progress/out/* \ + ./addons/addon-progress/out-*/* \ + ./addons/addon-search/lib/* \ + ./addons/addon-search/out/* \ + ./addons/addon-search/out-*/* \ + ./addons/addon-serialize/lib/* \ + ./addons/addon-serialize/out/* \ + ./addons/addon-serialize/out-*/* \ + ./addons/addon-unicode11/lib/* \ + ./addons/addon-unicode11/out/* \ + ./addons/addon-unicode11/out-*/* \ + ./addons/addon-unicode-graphemes/lib/* \ + ./addons/addon-unicode-graphemes/out/* \ + ./addons/addon-unicode-graphemes/out-*/* \ + ./addons/addon-web-links/lib/* \ + ./addons/addon-web-links/out/* \ + ./addons/addon-web-links/out-*/* \ + ./addons/addon-web-fonts/lib/* \ + ./addons/addon-web-fonts/out/* \ + ./addons/addon-web-fonts/out-*/* \ + ./addons/addon-webgl/lib/* \ + ./addons/addon-webgl/out/* \ + ./addons/addon-webgl/out-*st/* + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: compressed-build.zip + if-no-files-found: error lint: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - name: Lint code - env: - NODE_OPTIONS: --max_old_space_size=4096 - run: npm run lint - - name: Lint API - run: npm run lint-api + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - name: Lint code + env: + NODE_OPTIONS: --max_old_space_size=4096 + run: npm run lint + - name: Lint API + run: npm run lint-api test-unit-coverage: needs: build runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Unit test coverage - run: | - npm run test-unit-coverage --forbid-only - EXIT_CODE=$? - ./node_modules/.bin/nyc report --reporter=cobertura - exit $EXIT_CODE + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Unit test coverage + run: | + npm run test-unit-coverage --forbid-only + EXIT_CODE=$? + ./node_modules/.bin/nyc report --reporter=cobertura + exit $EXIT_CODE test-unit: timeout-minutes: 20 @@ -136,34 +139,34 @@ jobs: runs-on: [ubuntu, macos, windows] runs-on: ${{ matrix.runs-on }}-latest steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - name: Wait for build job - uses: NathanFirmo/wait-for-other-job@v1.1.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - job: build - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Unit tests - run: npm run test-unit --forbid-only + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - name: Wait for build job + uses: NathanFirmo/wait-for-other-job@v1.1.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + job: build + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Unit tests + run: npm run test-unit --forbid-only test-integration: timeout-minutes: 20 @@ -174,64 +177,66 @@ jobs: browser: [chromium, firefox, webkit] runs-on: ${{ matrix.runs-on }} steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - name: Install playwright - run: npx playwright install --with-deps ${{ matrix.browser }} - - name: Wait for build job - uses: NathanFirmo/wait-for-other-job@v1.1.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - job: build - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Build demo client - run: npm run esbuild-demo-client - - name: Build demo server - run: npm run esbuild-demo-server - - name: Integration tests (core) # Tests use 50% workers to reduce flakiness - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core - - name: Integration tests (addon-attach) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-attach - - name: Integration tests (addon-clipboard) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-clipboard - - name: Integration tests (addon-fit) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit - - name: Integration tests (addon-image) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image - - name: Integration tests (addon-progress) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress - - name: Integration tests (addon-search) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-search - - name: Integration tests (addon-serialize) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-serialize - - name: Integration tests (addon-unicode-graphemes) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode-graphemes - - name: Integration tests (addon-unicode11) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode11 - - name: Integration tests (addon-web-fonts) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-fonts - - name: Integration tests (addon-web-links) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-links - - name: Integration tests (addon-webgl) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - name: Install playwright + run: npx playwright install --with-deps ${{ matrix.browser }} + - name: Wait for build job + uses: NathanFirmo/wait-for-other-job@v1.1.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + job: build + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Build demo client + run: npm run esbuild-demo-client + - name: Build demo server + run: npm run esbuild-demo-server + - name: Integration tests (core) # Tests use 50% workers to reduce flakiness + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core + - name: Integration tests (addon-attach) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-attach + - name: Integration tests (addon-clipboard) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-clipboard + - name: Integration tests (addon-fit) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit + - name: Integration tests (addon-image) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image + - name: Integration tests (addon-kitty-graphics) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-kitty-graphics + - name: Integration tests (addon-progress) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress + - name: Integration tests (addon-search) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-search + - name: Integration tests (addon-serialize) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-serialize + - name: Integration tests (addon-unicode-graphemes) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode-graphemes + - name: Integration tests (addon-unicode11) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode11 + - name: Integration tests (addon-web-fonts) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-fonts + - name: Integration tests (addon-web-links) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-links + - name: Integration tests (addon-webgl) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl release-dry-run: needs: build @@ -240,32 +245,32 @@ jobs: matrix: node-version: [22] steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: 'npm' - - name: Install dependencies - run: | - npm ci - - name: Install playwright - run: npx playwright install - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Package headless - run: | - npm run package-headless - node ./bin/package_headless.js - - name: Publish to npm (dry run) - run: node ./bin/publish.js --dry + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: "npm" + - name: Install dependencies + run: | + npm ci + - name: Install playwright + run: npx playwright install + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Package headless + run: | + npm run package-headless + node ./bin/package_headless.js + - name: Publish to npm (dry run) + run: node ./bin/publish.js --dry From ec5b421dfbe7e73670e692381160627c4cf99034 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 15:40:59 -0800 Subject: [PATCH 007/124] Renderer + og formatting for ci.yml --- .github/workflows/ci.yml | 452 +++++++++++++++++++-------------------- 1 file changed, 225 insertions(+), 227 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 768f02176..863a627d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,134 +2,134 @@ name: CI on: push: - branches: ["master"] + branches: [ "master" ] pull_request: - branches: ["master"] + branches: [ "master" ] jobs: build: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: "npm" - - name: Install dependencies - run: npm ci - - name: Setup and run tsc - run: npm run setup - - name: Esbuild - run: npm run esbuild - - name: Zip artifacts - run: | - zip -r compressed-build \ - ./lib/* \ - ./out/* \ - ./out-*/* \ - ./addons/addon-attach/lib/* \ - ./addons/addon-attach/out/* \ - ./addons/addon-attach/out-*/* \ - ./addons/addon-clipboard/lib/* \ - ./addons/addon-clipboard/out/* \ - ./addons/addon-clipboard/out-*/* \ - ./addons/addon-fit/lib/* \ - ./addons/addon-fit/out/* \ - ./addons/addon-fit/out-*/* \ - ./addons/addon-image/lib/* \ - ./addons/addon-image/out/* \ - ./addons/addon-image/out-*/* \ - ./addons/addon-kitty-graphics/lib/* \ - ./addons/addon-kitty-graphics/out/* \ - ./addons/addon-kitty-graphics/out-*/* \ - ./addons/addon-ligatures/lib/* \ - ./addons/addon-ligatures/out/* \ - ./addons/addon-ligatures/out-*/* \ - ./addons/addon-progress/lib/* \ - ./addons/addon-progress/out/* \ - ./addons/addon-progress/out-*/* \ - ./addons/addon-search/lib/* \ - ./addons/addon-search/out/* \ - ./addons/addon-search/out-*/* \ - ./addons/addon-serialize/lib/* \ - ./addons/addon-serialize/out/* \ - ./addons/addon-serialize/out-*/* \ - ./addons/addon-unicode11/lib/* \ - ./addons/addon-unicode11/out/* \ - ./addons/addon-unicode11/out-*/* \ - ./addons/addon-unicode-graphemes/lib/* \ - ./addons/addon-unicode-graphemes/out/* \ - ./addons/addon-unicode-graphemes/out-*/* \ - ./addons/addon-web-links/lib/* \ - ./addons/addon-web-links/out/* \ - ./addons/addon-web-links/out-*/* \ - ./addons/addon-web-fonts/lib/* \ - ./addons/addon-web-fonts/out/* \ - ./addons/addon-web-fonts/out-*/* \ - ./addons/addon-webgl/lib/* \ - ./addons/addon-webgl/out/* \ - ./addons/addon-webgl/out-*st/* - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: build-artifacts - path: compressed-build.zip - if-no-files-found: error + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: 'npm' + - name: Install dependencies + run: npm ci + - name: Setup and run tsc + run: npm run setup + - name: Esbuild + run: npm run esbuild + - name: Zip artifacts + run: | + zip -r compressed-build \ + ./lib/* \ + ./out/* \ + ./out-*/* \ + ./addons/addon-attach/lib/* \ + ./addons/addon-attach/out/* \ + ./addons/addon-attach/out-*/* \ + ./addons/addon-clipboard/lib/* \ + ./addons/addon-clipboard/out/* \ + ./addons/addon-clipboard/out-*/* \ + ./addons/addon-fit/lib/* \ + ./addons/addon-fit/out/* \ + ./addons/addon-fit/out-*/* \ + ./addons/addon-image/lib/* \ + ./addons/addon-image/out/* \ + ./addons/addon-image/out-*/* \ + ./addons/addon-kitty-graphics/lib/* \ + ./addons/addon-kitty-graphics/out/* \ + ./addons/addon-kitty-graphics/out-*/* \ + ./addons/addon-ligatures/lib/* \ + ./addons/addon-ligatures/out/* \ + ./addons/addon-ligatures/out-*/* \ + ./addons/addon-progress/lib/* \ + ./addons/addon-progress/out/* \ + ./addons/addon-progress/out-*/* \ + ./addons/addon-search/lib/* \ + ./addons/addon-search/out/* \ + ./addons/addon-search/out-*/* \ + ./addons/addon-serialize/lib/* \ + ./addons/addon-serialize/out/* \ + ./addons/addon-serialize/out-*/* \ + ./addons/addon-unicode11/lib/* \ + ./addons/addon-unicode11/out/* \ + ./addons/addon-unicode11/out-*/* \ + ./addons/addon-unicode-graphemes/lib/* \ + ./addons/addon-unicode-graphemes/out/* \ + ./addons/addon-unicode-graphemes/out-*/* \ + ./addons/addon-web-links/lib/* \ + ./addons/addon-web-links/out/* \ + ./addons/addon-web-links/out-*/* \ + ./addons/addon-web-fonts/lib/* \ + ./addons/addon-web-fonts/out/* \ + ./addons/addon-web-fonts/out-*/* \ + ./addons/addon-webgl/lib/* \ + ./addons/addon-webgl/out/* \ + ./addons/addon-webgl/out-*st/* + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts + path: compressed-build.zip + if-no-files-found: error lint: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - name: Lint code - env: - NODE_OPTIONS: --max_old_space_size=4096 - run: npm run lint - - name: Lint API - run: npm run lint-api + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - name: Lint code + env: + NODE_OPTIONS: --max_old_space_size=4096 + run: npm run lint + - name: Lint API + run: npm run lint-api test-unit-coverage: needs: build runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - name: Use Node.js 22.x - uses: actions/setup-node@v3 - with: - node-version: 22.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Unit test coverage - run: | - npm run test-unit-coverage --forbid-only - EXIT_CODE=$? - ./node_modules/.bin/nyc report --reporter=cobertura - exit $EXIT_CODE + - uses: actions/checkout@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@v3 + with: + node-version: 22.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Unit test coverage + run: | + npm run test-unit-coverage --forbid-only + EXIT_CODE=$? + ./node_modules/.bin/nyc report --reporter=cobertura + exit $EXIT_CODE test-unit: timeout-minutes: 20 @@ -139,34 +139,34 @@ jobs: runs-on: [ubuntu, macos, windows] runs-on: ${{ matrix.runs-on }}-latest steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - name: Wait for build job - uses: NathanFirmo/wait-for-other-job@v1.1.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - job: build - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Unit tests - run: npm run test-unit --forbid-only + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - name: Wait for build job + uses: NathanFirmo/wait-for-other-job@v1.1.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + job: build + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Unit tests + run: npm run test-unit --forbid-only test-integration: timeout-minutes: 20 @@ -177,66 +177,64 @@ jobs: browser: [chromium, firefox, webkit] runs-on: ${{ matrix.runs-on }} steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - name: Install playwright - run: npx playwright install --with-deps ${{ matrix.browser }} - - name: Wait for build job - uses: NathanFirmo/wait-for-other-job@v1.1.1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - job: build - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Build demo client - run: npm run esbuild-demo-client - - name: Build demo server - run: npm run esbuild-demo-server - - name: Integration tests (core) # Tests use 50% workers to reduce flakiness - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core - - name: Integration tests (addon-attach) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-attach - - name: Integration tests (addon-clipboard) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-clipboard - - name: Integration tests (addon-fit) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit - - name: Integration tests (addon-image) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image - - name: Integration tests (addon-kitty-graphics) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-kitty-graphics - - name: Integration tests (addon-progress) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress - - name: Integration tests (addon-search) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-search - - name: Integration tests (addon-serialize) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-serialize - - name: Integration tests (addon-unicode-graphemes) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode-graphemes - - name: Integration tests (addon-unicode11) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode11 - - name: Integration tests (addon-web-fonts) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-fonts - - name: Integration tests (addon-web-links) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-links - - name: Integration tests (addon-webgl) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - name: Install playwright + run: npx playwright install --with-deps ${{ matrix.browser }} + - name: Wait for build job + uses: NathanFirmo/wait-for-other-job@v1.1.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + job: build + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Build demo client + run: npm run esbuild-demo-client + - name: Build demo server + run: npm run esbuild-demo-server + - name: Integration tests (core) # Tests use 50% workers to reduce flakiness + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core + - name: Integration tests (addon-attach) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-attach + - name: Integration tests (addon-clipboard) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-clipboard + - name: Integration tests (addon-fit) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit + - name: Integration tests (addon-image) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image + - name: Integration tests (addon-progress) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress + - name: Integration tests (addon-search) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-search + - name: Integration tests (addon-serialize) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-serialize + - name: Integration tests (addon-unicode-graphemes) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode-graphemes + - name: Integration tests (addon-unicode11) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode11 + - name: Integration tests (addon-web-fonts) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-fonts + - name: Integration tests (addon-web-links) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-links + - name: Integration tests (addon-webgl) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl release-dry-run: needs: build @@ -245,32 +243,32 @@ jobs: matrix: node-version: [22] steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }}.x - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }}.x - cache: "npm" - - name: Install dependencies - run: | - npm ci - - name: Install playwright - run: npx playwright install - - uses: actions/download-artifact@v4 - with: - name: build-artifacts - - name: Unzip artifacts - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" - else - unzip -o compressed-build.zip - fi - ls -R - - name: Package headless - run: | - npm run package-headless - node ./bin/package_headless.js - - name: Publish to npm (dry run) - run: node ./bin/publish.js --dry + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }}.x + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }}.x + cache: 'npm' + - name: Install dependencies + run: | + npm ci + - name: Install playwright + run: npx playwright install + - uses: actions/download-artifact@v4 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R + - name: Package headless + run: | + npm run package-headless + node ./bin/package_headless.js + - name: Publish to npm (dry run) + run: node ./bin/publish.js --dry From a507afb388b102e832ce8f85f214849ad9e01b69 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 15:41:48 -0800 Subject: [PATCH 008/124] Add rendering, tweak send-png --- .../src/KittyGraphicsAddon.ts | 154 ++++++++++- .../src/KittyImageRenderer.ts | 240 ++++++++++++++++++ .../test/KittyGraphicsAddon.test.ts | 4 +- send-png | 22 +- 4 files changed, 408 insertions(+), 12 deletions(-) create mode 100644 addons/addon-kitty-graphics/src/KittyImageRenderer.ts diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 0dde0671b..24d280f25 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -5,6 +5,7 @@ import type { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; import type { KittyGraphicsAddon as IKittyGraphicsApi, IKittyGraphicsOptions, IKittyImage } from '@xterm/addon-kitty-graphics'; +import { KittyImageRenderer } from './KittyImageRenderer'; /** * Kitty graphics protocol action types. @@ -81,7 +82,9 @@ export function parseKittyCommand(data: string): IKittyCommand { export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { private _terminal: Terminal | undefined; private _apcHandler: IDisposable | undefined; + private _renderer: KittyImageRenderer | undefined; private _images: Map = new Map(); + private _decodedImages: Map = new Map(); private _pendingData: Map = new Map(); private _nextImageId = 1; private _debug: boolean; @@ -96,8 +99,11 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { public activate(terminal: Terminal): void { this._terminal = terminal; - // TODO: Remove console log - console.log('[KittyGraphicsAddon] Activated'); + this._renderer = new KittyImageRenderer(terminal); + + if (this._debug) { + console.log('[KittyGraphicsAddon] Activating, registering APC handler for G (0x47)'); + } // Register APC handler for 'G' (0x47) - Kitty graphics protocol // APC sequence format: ESC _ G ESC \ @@ -108,8 +114,16 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { public dispose(): void { this._apcHandler?.dispose(); + this._renderer?.dispose(); this._images.clear(); this._pendingData.clear(); + + // Close all decoded bitmaps + for (const bitmap of this._decodedImages.values()) { + bitmap.close(); + } + this._decodedImages.clear(); + this._terminal = undefined; } @@ -175,11 +189,130 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { } private _handleTransmitDisplay(cmd: IKittyCommand): boolean { + // First store the image this._handleTransmit(cmd); - // TODO: Display image at cursor position (canvas layer) + + // Get the image ID (same logic as _handleTransmit) + const id = cmd.id || (this._nextImageId - 1); + const image = this._images.get(id); + + if (!image) { + return true; + } + + // Decode and display with sizing + this._decodeAndDisplay(image, cmd.columns, cmd.rows).catch(err => { + if (this._debug) { + console.error(`[KittyGraphicsAddon] Failed to decode/display image ${id}:`, err); + } + }); + return true; } + /** + * Decode base64 image data into an ImageBitmap. + */ + private async _decodeImage(image: IKittyImage): Promise { + const format = image.format; + const base64Data = image.data as string; + + // Decode base64 to binary + const binaryString = atob(base64Data); + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + if (format === KittyFormat.PNG) { + // PNG: create blob and decode + const blob = new Blob([bytes], { type: 'image/png' }); + return createImageBitmap(blob); + } + + // RGB (24) or RGBA (32): create ImageData + const width = image.width; + const height = image.height; + + if (!width || !height) { + throw new Error('Width and height required for raw pixel data'); + } + + const bytesPerPixel = format === KittyFormat.RGBA ? 4 : 3; + const expectedBytes = width * height * bytesPerPixel; + + if (bytes.length < expectedBytes) { + throw new Error(`Insufficient pixel data: got ${bytes.length}, expected ${expectedBytes}`); + } + + // Convert to RGBA ImageData + const imageData = new ImageData(width, height); + const data = imageData.data; + + for (let i = 0; i < width * height; i++) { + const srcOffset = i * bytesPerPixel; + const dstOffset = i * 4; + + data[dstOffset] = bytes[srcOffset]; // R + data[dstOffset + 1] = bytes[srcOffset + 1]; // G + data[dstOffset + 2] = bytes[srcOffset + 2]; // B + data[dstOffset + 3] = format === KittyFormat.RGBA + ? bytes[srcOffset + 3] // A from source + : 255; // Fully opaque for RGB + } + + return createImageBitmap(imageData); + } + + /** + * Decode an image and display it at the cursor position. + * @param columns - Optional: number of terminal columns to span + * @param rows - Optional: number of terminal rows to span + */ + private async _decodeAndDisplay(image: IKittyImage, columns?: number, rows?: number): Promise { + if (!this._renderer) { + return; + } + + // Check if already decoded + let bitmap = this._decodedImages.get(image.id); + + if (!bitmap) { + bitmap = await this._decodeImage(image); + this._decodedImages.set(image.id, bitmap); + + if (this._debug) { + console.log(`[KittyGraphicsAddon] Decoded image ${image.id}: ${bitmap.width}x${bitmap.height}`); + } + } + + // Calculate pixel dimensions from columns/rows if specified + let width = 0; + let height = 0; + if (columns || rows) { + const cellSize = this._renderer.getCellSize(); + if (columns) { + width = columns * cellSize.width; + } + if (rows) { + height = rows * cellSize.height; + } + // If only one dimension specified, maintain aspect ratio + if (width && !height) { + height = Math.round(width * (bitmap.height / bitmap.width)); + } else if (height && !width) { + width = Math.round(height * (bitmap.width / bitmap.height)); + } + } + + // Place at cursor position + this._renderer.placeImage(bitmap, image.id, undefined, undefined, width, height); + + if (this._debug) { + console.log(`[KittyGraphicsAddon] Placed image ${image.id} at cursor, size: ${width || bitmap.width}x${height || bitmap.height}`); + } + } + private _handleQuery(cmd: IKittyCommand): boolean { // TODO: Respond with APC sequence indicating graphics support // Protocol: terminal should reply with ESC _ G i=;OK ESC \ @@ -192,8 +325,23 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { private _handleDelete(cmd: IKittyCommand): boolean { if (cmd.id !== undefined) { this._images.delete(cmd.id); + // Close and remove decoded bitmap + const bitmap = this._decodedImages.get(cmd.id); + if (bitmap) { + bitmap.close(); + this._decodedImages.delete(cmd.id); + } + // Remove from renderer + this._renderer?.removeByImageId(cmd.id); } else { this._images.clear(); + // Close all decoded bitmaps + for (const bitmap of this._decodedImages.values()) { + bitmap.close(); + } + this._decodedImages.clear(); + // Clear all from renderer + this._renderer?.clearAll(); } return true; } diff --git a/addons/addon-kitty-graphics/src/KittyImageRenderer.ts b/addons/addon-kitty-graphics/src/KittyImageRenderer.ts new file mode 100644 index 000000000..d23698ff3 --- /dev/null +++ b/addons/addon-kitty-graphics/src/KittyImageRenderer.ts @@ -0,0 +1,240 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import type { Terminal, IDisposable } from '@xterm/xterm'; + +/** + * A placed image in the terminal. + */ +export interface IPlacedImage { + /** The decoded image bitmap */ + bitmap: ImageBitmap; + /** Column position in terminal */ + col: number; + /** Row position in terminal (relative to buffer, not viewport) */ + row: number; + /** Width to render (in pixels, 0 = original) */ + width: number; + /** Height to render (in pixels, 0 = original) */ + height: number; + /** The image ID for reference */ + id: number; +} + +/** + * Handles canvas layer management and image rendering for Kitty graphics. + * + * Similar to ImageRenderer in addon-image but simplified for Kitty protocol. + */ +export class KittyImageRenderer implements IDisposable { + private _canvas: HTMLCanvasElement | undefined; + private _ctx: CanvasRenderingContext2D | null | undefined; + private _terminal: Terminal; + private _placements: Map = new Map(); + private _placementIdCounter = 0; + private _renderDisposable: IDisposable | undefined; + private _resizeDisposable: IDisposable | undefined; + + constructor(terminal: Terminal) { + this._terminal = terminal; + } + + /** + * Initialize the canvas layer. Called when first image is placed. + */ + public ensureCanvasLayer(): void { + if (this._canvas) { + return; + } + + // Access internal screenElement + const core = (this._terminal as any)._core; + const screenElement = core?.screenElement; + if (!screenElement) { + console.warn('[KittyGraphicsAddon] Cannot create canvas: no screenElement'); + return; + } + + // Get dimensions from terminal + const dimensions = (this._terminal as any).dimensions; + const width = dimensions?.css?.canvas?.width || 800; + const height = dimensions?.css?.canvas?.height || 600; + + // Create canvas + this._canvas = document.createElement('canvas'); + this._canvas.width = width; + this._canvas.height = height; + this._canvas.classList.add('xterm-kitty-graphics-layer'); + + // Position absolutely over the terminal + this._canvas.style.position = 'absolute'; + this._canvas.style.top = '0'; + this._canvas.style.left = '0'; + this._canvas.style.pointerEvents = 'none'; + this._canvas.style.zIndex = '10'; + + screenElement.appendChild(this._canvas); + this._ctx = this._canvas.getContext('2d', { alpha: true }); + + // Hook into render events to redraw when terminal scrolls + this._renderDisposable = this._terminal.onRender(() => this._onRender()); + + // Handle resize + this._resizeDisposable = this._terminal.onResize(() => this._onResize()); + } + + /** + * Get cell dimensions from terminal. + */ + public getCellSize(): { width: number; height: number } { + const dimensions = (this._terminal as any).dimensions; + return { + width: dimensions?.css?.cell?.width || 9, + height: dimensions?.css?.cell?.height || 17 + }; + } + + /** + * Place a decoded image at cursor position. + * @param width - Optional width in pixels (0 = original) + * @param height - Optional height in pixels (0 = original) + */ + public placeImage(bitmap: ImageBitmap, id: number, col?: number, row?: number, width?: number, height?: number): number { + this.ensureCanvasLayer(); + + const buffer = this._terminal.buffer.active; + const placementId = ++this._placementIdCounter; + + const placement: IPlacedImage = { + bitmap, + col: col ?? buffer.cursorX, + row: row ?? (buffer.cursorY + buffer.baseY), + width: width || 0, + height: height || 0, + id + }; + + this._placements.set(placementId, placement); + this._draw(); + + return placementId; + } + + /** + * Remove a placed image. + */ + public removePlacement(placementId: number): void { + const placement = this._placements.get(placementId); + if (placement) { + this._placements.delete(placementId); + this._draw(); + } + } + + /** + * Remove all placements for an image ID. + */ + public removeByImageId(imageId: number): void { + const toDelete: number[] = []; + for (const [placementId, placement] of this._placements) { + if (placement.id === imageId) { + toDelete.push(placementId); + } + } + for (const id of toDelete) { + this._placements.delete(id); + } + if (toDelete.length > 0) { + this._draw(); + } + } + + /** + * Clear all images. + */ + public clearAll(): void { + this._placements.clear(); + if (this._ctx && this._canvas) { + this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); + } + } + + /** + * Redraw all placed images. + */ + private _draw(): void { + if (!this._ctx || !this._canvas) { + return; + } + + // Clear canvas + this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); + + const buffer = this._terminal.buffer.active; + const viewportStartRow = buffer.baseY; + const viewportRows = this._terminal.rows; + const cellSize = this.getCellSize(); + + // Draw each placement that's visible + for (const placement of this._placements.values()) { + // Check if placement is in viewport + const relativeRow = placement.row - viewportStartRow; + if (relativeRow < 0 || relativeRow >= viewportRows) { + continue; // Not in viewport + } + + const x = placement.col * cellSize.width; + const y = relativeRow * cellSize.height; + + const width = placement.width || placement.bitmap.width; + const height = placement.height || placement.bitmap.height; + + this._ctx.drawImage(placement.bitmap, x, y, width, height); + } + } + + /** + * Called when terminal renders (scrolling, content change). + */ + private _onRender(): void { + this._draw(); + } + + /** + * Called when terminal resizes. + */ + private _onResize(): void { + if (!this._canvas) { + return; + } + + const dimensions = (this._terminal as any).dimensions; + const width = dimensions?.css?.canvas?.width || 800; + const height = dimensions?.css?.canvas?.height || 600; + + if (this._canvas.width !== width || this._canvas.height !== height) { + this._canvas.width = width; + this._canvas.height = height; + this._draw(); + } + } + + public dispose(): void { + this._renderDisposable?.dispose(); + this._resizeDisposable?.dispose(); + + // Close all bitmaps + for (const placement of this._placements.values()) { + placement.bitmap.close(); + } + this._placements.clear(); + + if (this._canvas) { + this._canvas.remove(); + this._canvas = undefined; + this._ctx = undefined; + } + } +} diff --git a/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts b/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts index c937620f3..307604f2e 100644 --- a/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts +++ b/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts @@ -127,8 +127,8 @@ test.describe('KittyGraphicsAddon', () => { }); }); - // TODO: These tests will fail until decode + rendering is implemented - test.describe.skip('pixel verification', () => { + test.describe('pixel verification', () => { + // TODO: Add more intense ones. test('renders 1x1 black PNG at cursor position', async () => { // Send image with a=T to transmit and display const seq = `\x1b_Ga=T,f=100;${BLACK_1X1_BASE64}\x1b\\`; diff --git a/send-png b/send-png index 9afe64c5a..8bb820d92 100755 --- a/send-png +++ b/send-png @@ -5,8 +5,9 @@ Minimal Kitty Graphics Protocol image sender. Based on: https://sw.kovidgoyal.net/kitty/graphics-protocol/#a-minimal-example Usage: - ./send-png black-1x1.png - ./send-png rgb-3x1.png + ./send-png image.png # Original size + ./send-png image.png 10 # Scale to 10 columns wide + ./send-png image.png 10 5 # Scale to 10 columns x 5 rows """ import sys from base64 import standard_b64encode @@ -16,18 +17,25 @@ def serialize_image(path): data = f.read() return standard_b64encode(data).decode('ascii') -def write_chunked(data): +def write_chunked(data, columns=None, rows=None): # a=T means transmit and display # f=100 means PNG format - # For small images, single chunk (no chunking needed) - sys.stdout.write(f'\x1b_Ga=T,f=100;{data}\x1b\\') + # c=columns, r=rows for sizing + params = 'a=T,f=100' + if columns: + params += f',c={columns}' + if rows: + params += f',r={rows}' + sys.stdout.write(f'\x1b_G{params};{data}\x1b\\') sys.stdout.flush() if __name__ == '__main__': if len(sys.argv) < 2: - print("Usage: ./send-png ", file=sys.stderr) + print("Usage: ./send-png [columns] [rows]", file=sys.stderr) sys.exit(1) img_data = serialize_image(sys.argv[1]) - write_chunked(img_data) + columns = int(sys.argv[2]) if len(sys.argv) > 2 else None + rows = int(sys.argv[3]) if len(sys.argv) > 3 else None + write_chunked(img_data, columns, rows) print() # newline after the sequence From 27825f9ed8297b811c643321bf68476a46fdad2c Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 15:59:46 -0800 Subject: [PATCH 009/124] param in kittyGraphicsAddon.ts , ci.yml --- .github/workflows/ci.yml | 2 ++ addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 863a627d8..03f289b9b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -219,6 +219,8 @@ jobs: run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit - name: Integration tests (addon-image) run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image + - name: Integration tests (addon-kitty-graphics) + run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-kitty-graphics - name: Integration tests (addon-progress) run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress - name: Integration tests (addon-search) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 24d280f25..69d0c95d9 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -266,6 +266,7 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { /** * Decode an image and display it at the cursor position. + * @param image - The Kitty image to decode and display * @param columns - Optional: number of terminal columns to span * @param rows - Optional: number of terminal rows to span */ From 8b6f8f31721945cd639f474bc8c663886f22781e Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 16:16:30 -0800 Subject: [PATCH 010/124] Rename --- .../src/KittyImageRenderer.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyImageRenderer.ts b/addons/addon-kitty-graphics/src/KittyImageRenderer.ts index d23698ff3..e6a85ccfe 100644 --- a/addons/addon-kitty-graphics/src/KittyImageRenderer.ts +++ b/addons/addon-kitty-graphics/src/KittyImageRenderer.ts @@ -79,16 +79,16 @@ export class KittyImageRenderer implements IDisposable { this._ctx = this._canvas.getContext('2d', { alpha: true }); // Hook into render events to redraw when terminal scrolls - this._renderDisposable = this._terminal.onRender(() => this._onRender()); + this._renderDisposable = this._terminal.onRender(() => this._draw()); // Handle resize - this._resizeDisposable = this._terminal.onResize(() => this._onResize()); + this._resizeDisposable = this._terminal.onResize(() => this._resizeCanvas()); } /** * Get cell dimensions from terminal. */ - public getCellSize(): { width: number; height: number } { + public getCellSize(): { width: number, height: number } { const dimensions = (this._terminal as any).dimensions; return { width: dimensions?.css?.cell?.width || 9, @@ -98,6 +98,10 @@ export class KittyImageRenderer implements IDisposable { /** * Place a decoded image at cursor position. + * @param bitmap - The decoded ImageBitmap to place + * @param id - The image ID this placement belongs to + * @param col - Optional column position (defaults to cursor X) + * @param row - Optional row position (defaults to cursor Y + baseY) * @param width - Optional width in pixels (0 = original) * @param height - Optional height in pixels (0 = original) */ @@ -195,17 +199,10 @@ export class KittyImageRenderer implements IDisposable { } } - /** - * Called when terminal renders (scrolling, content change). - */ - private _onRender(): void { - this._draw(); - } - /** * Called when terminal resizes. */ - private _onResize(): void { + private _resizeCanvas(): void { if (!this._canvas) { return; } From 849110d300c8b68903386d5cc61acf6058c1e326 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 18:40:37 -0800 Subject: [PATCH 011/124] add query to say OK responses --- .../src/KittyGraphicsAddon.ts | 124 ++++++++++++++++-- addons/addon-kitty-graphics/src/Types.ts | 29 ++++ .../test/KittyGraphicsAddon.test.ts | 94 +++++++++++++ 3 files changed, 239 insertions(+), 8 deletions(-) create mode 100644 addons/addon-kitty-graphics/src/Types.ts diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 69d0c95d9..3cf76f249 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -6,6 +6,7 @@ import type { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; import type { KittyGraphicsAddon as IKittyGraphicsApi, IKittyGraphicsOptions, IKittyImage } from '@xterm/addon-kitty-graphics'; import { KittyImageRenderer } from './KittyImageRenderer'; +import type { ITerminalExt } from './Types'; /** * Kitty graphics protocol action types. @@ -80,7 +81,7 @@ export function parseKittyCommand(data: string): IKittyCommand { } export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { - private _terminal: Terminal | undefined; + private _terminal: ITerminalExt | undefined; private _apcHandler: IDisposable | undefined; private _renderer: KittyImageRenderer | undefined; private _images: Map = new Map(); @@ -98,11 +99,11 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { } public activate(terminal: Terminal): void { - this._terminal = terminal; + this._terminal = terminal as ITerminalExt; this._renderer = new KittyImageRenderer(terminal); if (this._debug) { - console.log('[KittyGraphicsAddon] Activating, registering APC handler for G (0x47)'); + console.log('[KittyGraphicsAddon] Registering APC handler for G (0x47)'); } // Register APC handler for 'G' (0x47) - Kitty graphics protocol @@ -314,12 +315,119 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { } } - private _handleQuery(cmd: IKittyCommand): boolean { - // TODO: Respond with APC sequence indicating graphics support - // Protocol: terminal should reply with ESC _ G i=;OK ESC \ - if (this._debug) { - console.log('[KittyGraphicsAddon] Query received'); + /** + * Send a response back to the client via the terminal's data event. + * Per the Kitty protocol, responses are sent when an image id (i=) is specified. + * Format: ESC _ G i=;message ESC \ + * + * The quiet flag (q=) can suppress responses: + * - q=1: suppress OK responses + * - q=2: suppress error responses + * + * @param id - The image ID to include in the response + * @param message - The message (e.g., 'OK' or 'EINVAL:error description') + * @param quiet - The quiet flag value (0, 1, or 2) + */ + private _sendResponse(id: number, message: string, quiet: number): void { + // Check quiet flag: q=1 suppresses OK, q=2 suppresses errors + const isOk = message === 'OK'; + if (isOk && quiet === 1) { + return; } + if (!isOk && quiet === 2) { + return; + } + + if (!this._terminal) { + return; + } + + const response = `\x1b_Gi=${id};${message}\x1b\\`; + this._terminal._core.coreService.triggerDataEvent(response); + + if (this._debug) { + console.log(`[KittyGraphicsAddon] Sent response: i=${id};${message}`); + } + } + + /** + * Handle query action (a=q). + * + * Per the Kitty graphics protocol documentation: + * "Sometimes, using an id is not appropriate... In that case, you can use the + * query action, set a=q. Then the terminal emulator will try to load the image + * and respond with either OK or an error, as above, but it will not replace an + * existing image with the same id, nor will it store the image." + * + * The query is used by clients to check if the terminal supports the graphics + * protocol. A typical query looks like: + * ESC _ G i=31,s=1,v=1,a=q,t=d,f=24;AAAA ESC \ ESC [c + * + * If the terminal supports graphics, it responds with: + * ESC _ G i=31;OK ESC \ + * + * @param cmd - The parsed Kitty command + */ + private _handleQuery(cmd: IKittyCommand): boolean { + const id = cmd.id || 0; + const quiet = cmd.quiet || 0; + + if (this._debug) { + console.log(`[KittyGraphicsAddon] Query received, id=${id}, quiet=${quiet}`); + } + + // Try to validate the image data without storing it + const payload = cmd.payload || ''; + + if (!payload) { + // No payload - just checking if graphics protocol is supported + // Respond with OK to indicate support + this._sendResponse(id, 'OK', quiet); + return true; + } + + // Validate the image data can be decoded + try { + // Decode base64 to verify it's valid + const binaryString = atob(payload); + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + const format = cmd.format || 32; + + if (format === KittyFormat.PNG) { + // For PNG, we just verify base64 decoded successfully + // Full PNG validation would require async createImageBitmap + // which we can't do synchronously, so we trust the data is valid PNG + this._sendResponse(id, 'OK', quiet); + } else { + // RGB (24) or RGBA (32): verify we have enough bytes + const width = cmd.width || 0; + const height = cmd.height || 0; + + if (!width || !height) { + this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet); + return true; + } + + const bytesPerPixel = format === KittyFormat.RGBA ? 4 : 3; + const expectedBytes = width * height * bytesPerPixel; + + if (bytes.length < expectedBytes) { + this._sendResponse(id, `EINVAL:insufficient pixel data, got ${bytes.length}, expected ${expectedBytes}`, quiet); + return true; + } + + this._sendResponse(id, 'OK', quiet); + } + } catch (e) { + // Base64 decode failed or other error + const errorMsg = e instanceof Error ? e.message : 'unknown error'; + this._sendResponse(id, `EINVAL:${errorMsg}`, quiet); + } + return true; } diff --git a/addons/addon-kitty-graphics/src/Types.ts b/addons/addon-kitty-graphics/src/Types.ts new file mode 100644 index 000000000..a2c502ece --- /dev/null +++ b/addons/addon-kitty-graphics/src/Types.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import type { Terminal } from '@xterm/xterm'; + +/** + * Core service interface for triggering data events. + * This is used to send responses back to the terminal client. + */ +export interface ICoreService { + triggerDataEvent(data: string, wasUserInput?: boolean): void; +} + +/** + * Core terminal interface exposing internal services. + */ +export interface ICoreTerminal { + coreService: ICoreService; +} + +/** + * Extended terminal interface that exposes the internal _core property. + * This is needed to send responses back to the client. + */ +export interface ITerminalExt extends Terminal { + _core: ICoreTerminal; +} diff --git a/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts b/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts index 307604f2e..57b22f150 100644 --- a/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts +++ b/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts @@ -172,4 +172,98 @@ test.describe('KittyGraphicsAddon', () => { deepStrictEqual(pixels?.blue, [0, 0, 255, 255]); }); }); + + test.describe('query support (a=q)', () => { + test('responds with OK for capability query without payload', async () => { + let response = ''; + const disposable = ctx.proxy.onData(data => { response = data; }); + + await ctx.proxy.write('\x1b_Gi=31,a=q;\x1b\\'); + await timeout(100); + + disposable.dispose(); + + strictEqual(response, '\x1b_Gi=31;OK\x1b\\'); + }); + + test('responds with OK for valid PNG query', async () => { + let response = ''; + const disposable = ctx.proxy.onData(data => { response = data; }); + + // Send query with PNG data + await ctx.proxy.write(`\x1b_Gi=42,a=q,f=100;${BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + disposable.dispose(); + + strictEqual(response, '\x1b_Gi=42;OK\x1b\\'); + }); + + test('query does NOT store the image (unlike transmit)', async () => { + const disposable = ctx.proxy.onData(() => { /* consume response */ }); + + await ctx.proxy.write(`\x1b_Gi=50,a=q,f=100;${BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + disposable.dispose(); + + // Image should NOT be stored + strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(50)'), false); + }); + + test('responds with error for invalid base64', async () => { + let response = ''; + const disposable = ctx.proxy.onData(data => { response = data; }); + + // Send query with invalid base64 + await ctx.proxy.write('\x1b_Gi=60,a=q,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + disposable.dispose(); + + // Should contain EINVAL error + strictEqual(response.startsWith('\x1b_Gi=60;EINVAL:'), true); + }); + + test('responds with error for RGB data without dimensions', async () => { + let response = ''; + const disposable = ctx.proxy.onData(data => { response = data; }); + + // RGB format (f=24) requires width (s) and height (v) + // Send RGB data without specifying s= and v= + await ctx.proxy.write('\x1b_Gi=70,a=q,f=24;AAAA\x1b\\'); + await timeout(100); + + disposable.dispose(); + + strictEqual(response, '\x1b_Gi=70;EINVAL:width and height required for raw pixel data\x1b\\'); + }); + + test('suppresses OK response when q=1', async () => { + // q=1 means suppress OK responses + let gotResponse = false; + const disposable = ctx.proxy.onData(() => { gotResponse = true; }); + + await ctx.proxy.write(`\x1b_Gi=80,a=q,q=1,f=100;${BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + disposable.dispose(); + + strictEqual(gotResponse, false); + }); + + test('suppresses error response when q=2', async () => { + // q=2 means suppress error responses + let gotResponse = false; + const disposable = ctx.proxy.onData(() => { gotResponse = true; }); + + // Send invalid data with q=2 + await ctx.proxy.write('\x1b_Gi=90,a=q,q=2,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + disposable.dispose(); + + strictEqual(gotResponse, false); + }); + }); }); From bc1d87dade613ad7cd80c76cda7f3d8a41d0da19 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 22 Jan 2026 23:38:10 -0800 Subject: [PATCH 012/124] comments --- addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 3cf76f249..cbfac5d65 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -62,7 +62,9 @@ export function parseKittyCommand(data: string): IKittyCommand { const value = part.substring(eqIdx + 1); switch (key) { + // These are key(s) from: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference // Question: How do we know which radix to use? + // TODO: Support more keys like type of compression, animations, etc case 'a': cmd.action = value; break; case 'f': cmd.format = parseInt(value); break; case 'i': cmd.id = parseInt(value); break; @@ -84,6 +86,8 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { private _terminal: ITerminalExt | undefined; private _apcHandler: IDisposable | undefined; private _renderer: KittyImageRenderer | undefined; + // Question: ImageAddon has ImageStorage, lot going on there though comapred to IKittyImage atm. + // Maybe add more, rename to IKittyImageStorage instead of IKittyImage? private _images: Map = new Map(); private _decodedImages: Map = new Map(); private _pendingData: Map = new Map(); @@ -142,6 +146,7 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { const action = cmd.action || 't'; + // Actions from: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference switch (action) { case KittyAction.TRANSMIT: return this._handleTransmit(cmd); From 5e95ef652dbab2cf6a1642c1a22f4ab4a4aff03a Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Fri, 23 Jan 2026 11:11:02 -0800 Subject: [PATCH 013/124] more comments --- addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index cbfac5d65..51e67681e 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -10,6 +10,8 @@ import type { ITerminalExt } from './Types'; /** * Kitty graphics protocol action types. + * Possible actions from protocol. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'. */ const enum KittyAction { TRANSMIT = 't', @@ -21,6 +23,7 @@ const enum KittyAction { /** * Kitty graphics protocol format types. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference where the format for *-bit came from. */ const enum KittyFormat { RGB = 24, From 1442f84e4ef93c3e930f446988e5426928dc061b Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 17:21:38 -0800 Subject: [PATCH 014/124] Fix chunking for large data, allow pixels --- .../src/KittyGraphicsAddon.ts | 200 ++++++++++++++++-- .../typings/addon-kitty-graphics.d.ts | 7 + demo/client/client.ts | 8 +- 3 files changed, 192 insertions(+), 23 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 51e67681e..10be97b7e 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -31,6 +31,15 @@ const enum KittyFormat { PNG = 100 } +/** + * Kitty graphics protocol compression types. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'. + */ +const enum KittyCompression { + NONE = '', + ZLIB = 'z' +} + /** * Parsed Kitty graphics command. */ @@ -46,6 +55,7 @@ export interface IKittyCommand { rows?: number; more?: number; quiet?: number; + compression?: string; payload?: string; } @@ -66,8 +76,6 @@ export function parseKittyCommand(data: string): IKittyCommand { switch (key) { // These are key(s) from: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference - // Question: How do we know which radix to use? - // TODO: Support more keys like type of compression, animations, etc case 'a': cmd.action = value; break; case 'f': cmd.format = parseInt(value); break; case 'i': cmd.id = parseInt(value); break; @@ -79,12 +87,24 @@ export function parseKittyCommand(data: string): IKittyCommand { case 'r': cmd.rows = parseInt(value); break; case 'm': cmd.more = parseInt(value); break; case 'q': cmd.quiet = parseInt(value); break; + case 'o': cmd.compression = value; break; } } return cmd; } +/** + * Pending chunked transmission state. + * Stores metadata from the first chunk while accumulating payload data. + */ +interface IPendingTransmission { + /** The parsed command from the first chunk (contains action, format, dimensions, etc.) */ + cmd: IKittyCommand; + /** Accumulated base64 payload data */ + data: string; +} + export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { private _terminal: ITerminalExt | undefined; private _apcHandler: IDisposable | undefined; @@ -93,7 +113,11 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { // Maybe add more, rename to IKittyImageStorage instead of IKittyImage? private _images: Map = new Map(); private _decodedImages: Map = new Map(); - private _pendingData: Map = new Map(); + /** + * Pending chunked transmissions keyed by image ID. + * ID 0 is used for transmissions without an explicit ID (the "anonymous" transmission). + */ + private _pendingTransmissions: Map = new Map(); private _nextImageId = 1; private _debug: boolean; @@ -124,7 +148,7 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { this._apcHandler?.dispose(); this._renderer?.dispose(); this._images.clear(); - this._pendingData.clear(); + this._pendingTransmissions.clear(); // Close all decoded bitmaps for (const bitmap of this._decodedImages.values()) { @@ -165,27 +189,88 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { } private _handleTransmit(cmd: IKittyCommand): boolean { - const id = cmd.id || this._nextImageId++; - const payload = cmd.payload || ''; + const payload = cmd.payload ?? ''; + // Use 0 as the key for anonymous transmissions (no explicit i=) + const pendingKey = cmd.id ?? 0; - if (cmd.more === 1) { - const existing = this._pendingData.get(id) || ''; - this._pendingData.set(id, existing + payload); + // Check if this is a continuation of a chunked transmission + const isMoreComing = cmd.more === 1; + const pending = this._pendingTransmissions.get(pendingKey); + + if (pending) { + // This is a continuation chunk - append data + pending.data += payload; + + if (this._debug) { + console.log(`[KittyGraphicsAddon] Chunk continuation for id=${pendingKey}, total size=${pending.data.length}, more=${isMoreComing}`); + } + + if (isMoreComing) { + // More chunks coming, keep waiting + return true; + } + + // Final chunk - use the stored command's metadata + const originalCmd = pending.cmd; + const fullPayload = pending.data; + this._pendingTransmissions.delete(pendingKey); + + // Assign a real ID if this was anonymous (pendingKey === 0) + const id = originalCmd.id ?? this._nextImageId++; + + const image: IKittyImage = { + id, + data: fullPayload, + width: originalCmd.width ?? 0, + height: originalCmd.height ?? 0, + format: (originalCmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, + compression: originalCmd.compression ?? '' + }; + + this._images.set(id, image); + + if (this._debug) { + console.log(`[KittyGraphicsAddon] Stored chunked image ${id}, payload size=${fullPayload.length}`); + } + + // If the original action was 'T' (transmit+display), display the image now + if (originalCmd.action === KittyAction.TRANSMIT_DISPLAY) { + this._decodeAndDisplay(image, originalCmd.columns, originalCmd.rows).catch(err => { + if (this._debug) { + console.error(`[KittyGraphicsAddon] Failed to decode/display chunked image ${id}:`, err); + } + }); + } + + cmd.id = id; return true; } - let fullPayload = payload; - if (this._pendingData.has(id)) { - fullPayload = this._pendingData.get(id)! + payload; - this._pendingData.delete(id); + // This is the first chunk (or a non-chunked transmission) + if (isMoreComing) { + // First chunk of a multi-chunk transmission - store the command and start accumulating + this._pendingTransmissions.set(pendingKey, { + cmd: { ...cmd }, // Clone the command to preserve metadata + data: payload + }); + + if (this._debug) { + console.log(`[KittyGraphicsAddon] Started chunked transmission, id=${pendingKey}, format=${cmd.format}, compression=${cmd.compression}, size=${cmd.width}x${cmd.height}, initial payload=${payload.length}`); + } + + return true; } + // Non-chunked transmission - store immediately + const id = cmd.id ?? this._nextImageId++; + const image: IKittyImage = { id, - data: fullPayload, - width: cmd.width || 0, - height: cmd.height || 0, - format: (cmd.format || KittyFormat.PNG) as 24 | 32 | 100 + data: payload, + width: cmd.width ?? 0, + height: cmd.height ?? 0, + format: (cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, + compression: cmd.compression ?? '' }; this._images.set(id, image); @@ -194,18 +279,41 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { console.log(`[KittyGraphicsAddon] Stored image ${id}`); } + // Update cmd.id for _handleTransmitDisplay + cmd.id = id; return true; } private _handleTransmitDisplay(cmd: IKittyCommand): boolean { - // First store the image + const pendingKey = cmd.id ?? 0; + const wasPendingBefore = this._pendingTransmissions.has(pendingKey); + + // Delegate to _handleTransmit which will: + // 1. Accumulate chunks if m=1 + // 2. Store the image when complete + // 3. Trigger display when chunked transmission completes (checks original action) this._handleTransmit(cmd); - // Get the image ID (same logic as _handleTransmit) - const id = cmd.id || (this._nextImageId - 1); + // If this was a chunked transmission (first chunk with m=1), _handleTransmit + // stored it as pending and will display when complete. Don't display now. + if (cmd.more === 1) { + return true; + } + + // If there was a pending transmission that just completed, _handleTransmit + // already triggered the display. Don't display again. + if (wasPendingBefore) { + return true; + } + + // For non-chunked transmission, display now + const id = cmd.id!; const image = this._images.get(id); if (!image) { + if (this._debug) { + console.log(`[KittyGraphicsAddon] No image found for id=${id} after transmit`); + } return true; } @@ -228,11 +336,19 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { // Decode base64 to binary const binaryString = atob(base64Data); - const bytes = new Uint8Array(binaryString.length); + let bytes = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) { bytes[i] = binaryString.charCodeAt(i); } + // Decompress if needed (o=z means zlib/deflate compression) + if (image.compression === KittyCompression.ZLIB) { + bytes = await this._decompressZlib(bytes); + if (this._debug) { + console.log(`[KittyGraphicsAddon] Decompressed ${binaryString.length} -> ${bytes.length} bytes`); + } + } + if (format === KittyFormat.PNG) { // PNG: create blob and decode const blob = new Blob([bytes], { type: 'image/png' }); @@ -273,6 +389,48 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { return createImageBitmap(imageData); } + /** + * Decompress zlib/deflate compressed data using the browser's DecompressionStream API. + */ + private async _decompressZlib(compressed: Uint8Array): Promise { + // Use DecompressionStream API (available in modern browsers) + // 'deflate-raw' is the format used by zlib without headers + // Try 'deflate' first (zlib with header), fall back to 'deflate-raw' if that fails + try { + return await this._decompress(compressed, 'deflate'); + } catch { + // If 'deflate' fails, try 'deflate-raw' + return await this._decompress(compressed, 'deflate-raw'); + } + } + + private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise { + const ds = new DecompressionStream(format); + const writer = ds.writable.getWriter(); + writer.write(compressed); + writer.close(); + + const chunks: Uint8Array[] = []; + const reader = ds.readable.getReader(); + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + chunks.push(value); + } + + // Combine chunks into single Uint8Array + const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0); + const result = new Uint8Array(totalLength); + let offset = 0; + for (const chunk of chunks) { + result.set(chunk, offset); + offset += chunk.length; + } + + return result; + } + /** * Decode an image and display it at the cursor position. * @param image - The Kitty image to decode and display diff --git a/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts b/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts index 792f516df..32a137cb0 100644 --- a/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts +++ b/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts @@ -78,5 +78,12 @@ declare module '@xterm/addon-kitty-graphics' { * - 100: PNG */ format: 24 | 32 | 100; + + /** + * Compression type. + * - '': no compression + * - 'z': zlib compression + */ + compression?: string; } } diff --git a/demo/client/client.ts b/demo/client/client.ts index 70ed39b5f..a2ccd40af 100644 --- a/demo/client/client.ts +++ b/demo/client/client.ts @@ -327,7 +327,9 @@ function createTerminal(): Terminal { } const cols = size.cols; const rows = size.rows; - const url = '/terminals/' + pid + '/size?cols=' + cols + '&rows=' + rows; + const pixelWidth = Math.round(term.dimensions?.css?.canvas?.width ?? 0); + const pixelHeight = Math.round(term.dimensions?.css?.canvas?.height ?? 0); + const url = '/terminals/' + pid + '/size?cols=' + cols + '&rows=' + rows + '&pixelWidth=' + pixelWidth + '&pixelHeight=' + pixelHeight; fetch(url, { method: 'POST' }); }); @@ -378,7 +380,9 @@ function createTerminal(): Terminal { if (useRealTerminal instanceof HTMLInputElement && !useRealTerminal.checked) { runFakeTerminal(); } else { - const res = await fetch('/terminals?cols=' + term.cols + '&rows=' + term.rows, { method: 'POST' }); + const pixelWidth = Math.round(term.dimensions?.css?.canvas?.width ?? 0); + const pixelHeight = Math.round(term.dimensions?.css?.canvas?.height ?? 0); + const res = await fetch('/terminals?cols=' + term.cols + '&rows=' + term.rows + '&pixelWidth=' + pixelWidth + '&pixelHeight=' + pixelHeight, { method: 'POST' }); const processId = await res.text(); pid = processId; socketURL += processId; From 40342ecd1e3dd37c33794f164dc21198e624b809 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 17:26:06 -0800 Subject: [PATCH 015/124] remove send-png --- send-png | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100755 send-png diff --git a/send-png b/send-png deleted file mode 100755 index 8bb820d92..000000000 --- a/send-png +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 -# TODO: Consider removing when Kitty Graphics Addon is shipped. -""" -Minimal Kitty Graphics Protocol image sender. -Based on: https://sw.kovidgoyal.net/kitty/graphics-protocol/#a-minimal-example - -Usage: - ./send-png image.png # Original size - ./send-png image.png 10 # Scale to 10 columns wide - ./send-png image.png 10 5 # Scale to 10 columns x 5 rows -""" -import sys -from base64 import standard_b64encode - -def serialize_image(path): - with open(path, 'rb') as f: - data = f.read() - return standard_b64encode(data).decode('ascii') - -def write_chunked(data, columns=None, rows=None): - # a=T means transmit and display - # f=100 means PNG format - # c=columns, r=rows for sizing - params = 'a=T,f=100' - if columns: - params += f',c={columns}' - if rows: - params += f',r={rows}' - sys.stdout.write(f'\x1b_G{params};{data}\x1b\\') - sys.stdout.flush() - -if __name__ == '__main__': - if len(sys.argv) < 2: - print("Usage: ./send-png [columns] [rows]", file=sys.stderr) - sys.exit(1) - - img_data = serialize_image(sys.argv[1]) - columns = int(sys.argv[2]) if len(sys.argv) > 2 else None - rows = int(sys.argv[3]) if len(sys.argv) > 3 else None - write_chunked(img_data, columns, rows) - print() # newline after the sequence From e2dabc77fd9847de6f1c1410f0d62f31c8f3863d Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 17:58:10 -0800 Subject: [PATCH 016/124] Prefer ?? and move disposable location --- .../src/KittyGraphicsAddon.test.ts | 31 +++++++++++++++++ .../src/KittyGraphicsAddon.ts | 6 ++-- .../src/KittyImageRenderer.ts | 34 +++++++++---------- 3 files changed, 51 insertions(+), 20 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts index 9378e954d..4066a45f1 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts @@ -69,6 +69,19 @@ describe('KittyGraphicsAddon', () => { assert.equal(cmd.action, 'd'); assert.equal(cmd.id, 5); }); + + it('should parse empty action as empty string', () => { + const cmd = parseKittyCommand('a=,f=100'); + assert.equal(cmd.action, ''); + assert.equal(cmd.format, 100); + }); + + it('should leave action undefined when key is not present (parser only)', () => { + const cmd = parseKittyCommand('f=100,i=5'); + assert.equal(cmd.action, undefined); + assert.equal(cmd.format, 100); + assert.equal(cmd.id, 5); + }); }); describe('APC handler', () => { @@ -112,6 +125,24 @@ describe('KittyGraphicsAddon', () => { assert.equal(addon.images.size, 1); }); + it('should default to transmit action when action is omitted', async () => { + // No a= key - should default to 't' (transmit) + const sequence = `\x1b_Gf=100;${BLACK_1X1_BASE64}\x1b\\`; + await writeP(terminal, sequence); + + // Image should be stored (transmit action) + assert.equal(addon.images.size, 1); + }); + + it('should ignore command when action is empty string', async () => { + // a= with no value is invalid - should be ignored + const sequence = `\x1b_Ga=,f=100;${BLACK_1X1_BASE64}\x1b\\`; + await writeP(terminal, sequence); + + // Empty action is invalid, command should be ignored + assert.equal(addon.images.size, 0); + }); + it('should delete image by id', async () => { // First store an image with id=5 await writeP(terminal, `\x1b_Ga=T,f=100,i=5;${BLACK_1X1_BASE64}\x1b\\`); diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 10be97b7e..4ce0aa8ab 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -171,7 +171,7 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { console.log('[KittyGraphicsAddon] Received command:', cmd); } - const action = cmd.action || 't'; + const action = cmd.action ?? 't'; // Actions from: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference switch (action) { @@ -535,8 +535,8 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { * @param cmd - The parsed Kitty command */ private _handleQuery(cmd: IKittyCommand): boolean { - const id = cmd.id || 0; - const quiet = cmd.quiet || 0; + const id = cmd.id ?? 0; + const quiet = cmd.quiet ?? 0; if (this._debug) { console.log(`[KittyGraphicsAddon] Query received, id=${id}, quiet=${quiet}`); diff --git a/addons/addon-kitty-graphics/src/KittyImageRenderer.ts b/addons/addon-kitty-graphics/src/KittyImageRenderer.ts index e6a85ccfe..4d9501059 100644 --- a/addons/addon-kitty-graphics/src/KittyImageRenderer.ts +++ b/addons/addon-kitty-graphics/src/KittyImageRenderer.ts @@ -41,6 +41,23 @@ export class KittyImageRenderer implements IDisposable { this._terminal = terminal; } + public dispose(): void { + this._renderDisposable?.dispose(); + this._resizeDisposable?.dispose(); + + // Close all bitmaps + for (const placement of this._placements.values()) { + placement.bitmap.close(); + } + this._placements.clear(); + + if (this._canvas) { + this._canvas.remove(); + this._canvas = undefined; + this._ctx = undefined; + } + } + /** * Initialize the canvas layer. Called when first image is placed. */ @@ -217,21 +234,4 @@ export class KittyImageRenderer implements IDisposable { this._draw(); } } - - public dispose(): void { - this._renderDisposable?.dispose(); - this._resizeDisposable?.dispose(); - - // Close all bitmaps - for (const placement of this._placements.values()) { - placement.bitmap.close(); - } - this._placements.clear(); - - if (this._canvas) { - this._canvas.remove(); - this._canvas = undefined; - this._ctx = undefined; - } - } } From ae171acb79c777da0c837ee0196ee1fdfecf1dbe Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 18:44:40 -0800 Subject: [PATCH 017/124] Dont forget about action o for compression --- .../src/KittyGraphicsAddon.ts | 2 +- demo/server/server.ts | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 4ce0aa8ab..670ec77e5 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -86,8 +86,8 @@ export function parseKittyCommand(data: string): IKittyCommand { case 'c': cmd.columns = parseInt(value); break; case 'r': cmd.rows = parseInt(value); break; case 'm': cmd.more = parseInt(value); break; - case 'q': cmd.quiet = parseInt(value); break; case 'o': cmd.compression = value; break; + case 'q': cmd.quiet = parseInt(value); break; } } diff --git a/demo/server/server.ts b/demo/server/server.ts index 0f4a79b3d..ef98eb84c 100644 --- a/demo/server/server.ts +++ b/demo/server/server.ts @@ -65,6 +65,8 @@ function startServer(): void { } const cols = parseInt(req.query.cols); const rows = parseInt(req.query.rows); + const pixelWidth = typeof req.query.pixelWidth === 'string' ? parseInt(req.query.pixelWidth) : 0; + const pixelHeight = typeof req.query.pixelHeight === 'string' ? parseInt(req.query.pixelHeight) : 0; const isWindows = process.platform === 'win32'; const term = pty.spawn(isWindows ? 'powershell.exe' : 'bash', [], { name: 'xterm-256color', @@ -77,7 +79,13 @@ function startServer(): void { useConptyDll: isWindows, }); - console.log('Created terminal with PID: ' + term.pid); + // Set pixel dimensions immediately after spawn (pty.spawn doesn't support them) + if (pixelWidth > 0 && pixelHeight > 0) { + term.resize(cols, rows, { width: pixelWidth, height: pixelHeight }); + console.log('Created terminal with PID: ' + term.pid + ' (' + cols + 'x' + rows + ', ' + pixelWidth + 'px x ' + pixelHeight + 'px)'); + } else { + console.log('Created terminal with PID: ' + term.pid); + } terminals[term.pid] = term; unsentOutput[term.pid] = ''; temporaryDisposable[term.pid] = term.onData(function(data) { @@ -95,10 +103,17 @@ function startServer(): void { const pid = parseInt(req.params.pid); const cols = parseInt(req.query.cols); const rows = parseInt(req.query.rows); + const pixelWidth = typeof req.query.pixelWidth === 'string' ? parseInt(req.query.pixelWidth) : 0; + const pixelHeight = typeof req.query.pixelHeight === 'string' ? parseInt(req.query.pixelHeight) : 0; const term = terminals[pid]; - term.resize(cols, rows); - console.log('Resized terminal ' + pid + ' to ' + cols + ' cols and ' + rows + ' rows.'); + if (pixelWidth > 0 && pixelHeight > 0) { + term.resize(cols, rows, { width: pixelWidth, height: pixelHeight }); + console.log('Resized terminal ' + pid + ' to ' + cols + ' cols, ' + rows + ' rows, ' + pixelWidth + 'px x ' + pixelHeight + 'px'); + } else { + term.resize(cols, rows); + console.log('Resized terminal ' + pid + ' to ' + cols + ' cols and ' + rows + ' rows.'); + } res.end(); }); From 17d439515f334c52470bb348ca28768537845de8 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 18:59:48 -0800 Subject: [PATCH 018/124] switch from triggerDataEvnet to this._terminal.input --- addons/addon-kitty-graphics/src/19616.jpg | Bin 0 -> 960364 bytes .../src/KittyGraphicsAddon.ts | 2 +- addons/addon-kitty-graphics/src/Types.ts | 22 ++---------------- 3 files changed, 3 insertions(+), 21 deletions(-) create mode 100644 addons/addon-kitty-graphics/src/19616.jpg diff --git a/addons/addon-kitty-graphics/src/19616.jpg b/addons/addon-kitty-graphics/src/19616.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc521acec4af03f32eb187fc4163e3b0f853d4e1 GIT binary patch literal 960364 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
%JPL7?P!mV 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¨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�b*gSbx80vu`*fOgJJQvv2Md`xB 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

AIbDl*ns_P)lI-z5}@@UF$3BV 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 z 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%0A*Ccb#Qxot6WJLD@z;%Lt; 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

b>P_!UARCG!r?S-?+9!He&Blt;WRD5V6 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

^mnAy~Z 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 literal 0 HcmV?d00001 diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 670ec77e5..31ab21b48 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -509,7 +509,7 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { } const response = `\x1b_Gi=${id};${message}\x1b\\`; - this._terminal._core.coreService.triggerDataEvent(response); + this._terminal.input(response, false); if (this._debug) { console.log(`[KittyGraphicsAddon] Sent response: i=${id};${message}`); diff --git a/addons/addon-kitty-graphics/src/Types.ts b/addons/addon-kitty-graphics/src/Types.ts index a2c502ece..ac4011b35 100644 --- a/addons/addon-kitty-graphics/src/Types.ts +++ b/addons/addon-kitty-graphics/src/Types.ts @@ -6,24 +6,6 @@ import type { Terminal } from '@xterm/xterm'; /** - * Core service interface for triggering data events. - * This is used to send responses back to the terminal client. +Question: Can I delete this since we switched from triggerDataEvent to this._terminal.input */ -export interface ICoreService { - triggerDataEvent(data: string, wasUserInput?: boolean): void; -} - -/** - * Core terminal interface exposing internal services. - */ -export interface ICoreTerminal { - coreService: ICoreService; -} - -/** - * Extended terminal interface that exposes the internal _core property. - * This is needed to send responses back to the client. - */ -export interface ITerminalExt extends Terminal { - _core: ICoreTerminal; -} +export interface ITerminalExt extends Terminal {} From d58e8597cdc54c3cff42e21ad8a752b85762118a Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 19:04:17 -0800 Subject: [PATCH 019/124] Use Terminal.dimensions intead --- .../src/KittyImageRenderer.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyImageRenderer.ts b/addons/addon-kitty-graphics/src/KittyImageRenderer.ts index 4d9501059..39f90de2f 100644 --- a/addons/addon-kitty-graphics/src/KittyImageRenderer.ts +++ b/addons/addon-kitty-graphics/src/KittyImageRenderer.ts @@ -75,9 +75,9 @@ export class KittyImageRenderer implements IDisposable { } // Get dimensions from terminal - const dimensions = (this._terminal as any).dimensions; - const width = dimensions?.css?.canvas?.width || 800; - const height = dimensions?.css?.canvas?.height || 600; + const dimensions = this._terminal.dimensions; + const width = dimensions?.css.canvas.width || 800; + const height = dimensions?.css.canvas.height || 600; // Create canvas this._canvas = document.createElement('canvas'); @@ -106,10 +106,10 @@ export class KittyImageRenderer implements IDisposable { * Get cell dimensions from terminal. */ public getCellSize(): { width: number, height: number } { - const dimensions = (this._terminal as any).dimensions; + const dimensions = this._terminal.dimensions; return { - width: dimensions?.css?.cell?.width || 9, - height: dimensions?.css?.cell?.height || 17 + width: dimensions?.css.cell.width || 9, + height: dimensions?.css.cell.height || 17 }; } @@ -224,9 +224,9 @@ export class KittyImageRenderer implements IDisposable { return; } - const dimensions = (this._terminal as any).dimensions; - const width = dimensions?.css?.canvas?.width || 800; - const height = dimensions?.css?.canvas?.height || 600; + const dimensions = this._terminal.dimensions; + const width = dimensions?.css.canvas.width || 800; + const height = dimensions?.css.canvas.height || 600; if (this._canvas.width !== width || this._canvas.height !== height) { this._canvas.width = width; From b0b0868e9052c39e5dcffdeff91db736edd6fd23 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 19:14:06 -0800 Subject: [PATCH 020/124] Conste num for keys, describe in jsdoc --- .../src/KittyGraphicsAddon.ts | 56 ++++++++++++++----- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 31ab21b48..76fb7b10e 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -40,6 +40,37 @@ const enum KittyCompression { ZLIB = 'z' } +/** + * Kitty graphics protocol control data keys. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference + */ +const enum KittyKey { + // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete) + ACTION = 'a', + // Image format (24=RGB, 32=RGBA, 100=PNG) + FORMAT = 'f', + // Image ID for referencing stored images + ID = 'i', + // Source image width in pixels + WIDTH = 's', + // Source image height in pixels + HEIGHT = 'v', + // The left edge (in pixels) of the image area to display + X_OFFSET = 'x', + // The top edge (in pixels) of the image area to display + Y_OFFSET = 'y', + // Number of terminal columns to display the image over + COLUMNS = 'c', + // Number of terminal rows to display the image over + ROWS = 'r', + // More data flag (1=more chunks coming, 0=final chunk) + MORE = 'm', + // Compression type (z=zlib) + COMPRESSION = 'o', + // Quiet mode (1=suppress OK responses, 2=suppress error responses) + QUIET = 'q' +} + /** * Parsed Kitty graphics command. */ @@ -75,19 +106,18 @@ export function parseKittyCommand(data: string): IKittyCommand { const value = part.substring(eqIdx + 1); switch (key) { - // These are key(s) from: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference - case 'a': cmd.action = value; break; - case 'f': cmd.format = parseInt(value); break; - case 'i': cmd.id = parseInt(value); break; - case 's': cmd.width = parseInt(value); break; - case 'v': cmd.height = parseInt(value); break; - case 'x': cmd.x = parseInt(value); break; - case 'y': cmd.y = parseInt(value); break; - case 'c': cmd.columns = parseInt(value); break; - case 'r': cmd.rows = parseInt(value); break; - case 'm': cmd.more = parseInt(value); break; - case 'o': cmd.compression = value; break; - case 'q': cmd.quiet = parseInt(value); break; + case KittyKey.ACTION: cmd.action = value; break; + case KittyKey.FORMAT: cmd.format = parseInt(value); break; + case KittyKey.ID: cmd.id = parseInt(value); break; + case KittyKey.WIDTH: cmd.width = parseInt(value); break; + case KittyKey.HEIGHT: cmd.height = parseInt(value); break; + case KittyKey.X_OFFSET: cmd.x = parseInt(value); break; + case KittyKey.Y_OFFSET: cmd.y = parseInt(value); break; + case KittyKey.COLUMNS: cmd.columns = parseInt(value); break; + case KittyKey.ROWS: cmd.rows = parseInt(value); break; + case KittyKey.MORE: cmd.more = parseInt(value); break; + case KittyKey.COMPRESSION: cmd.compression = value; break; + case KittyKey.QUIET: cmd.quiet = parseInt(value); break; } } From 259cc67f1211e84410215afaaf7b90833d2387e5 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 19:20:11 -0800 Subject: [PATCH 021/124] Handle actions, compression first, then parseInt before Switch --- .../src/KittyGraphicsAddon.ts | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 76fb7b10e..e9917cb5a 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -105,19 +105,27 @@ export function parseKittyCommand(data: string): IKittyCommand { const key = part.substring(0, eqIdx); const value = part.substring(eqIdx + 1); + // Handle string keys first + if (key === KittyKey.ACTION) { + cmd.action = value; + continue; + } + if (key === KittyKey.COMPRESSION) { + cmd.compression = value; + continue; + } + const numValue = parseInt(value); switch (key) { - case KittyKey.ACTION: cmd.action = value; break; - case KittyKey.FORMAT: cmd.format = parseInt(value); break; - case KittyKey.ID: cmd.id = parseInt(value); break; - case KittyKey.WIDTH: cmd.width = parseInt(value); break; - case KittyKey.HEIGHT: cmd.height = parseInt(value); break; - case KittyKey.X_OFFSET: cmd.x = parseInt(value); break; - case KittyKey.Y_OFFSET: cmd.y = parseInt(value); break; - case KittyKey.COLUMNS: cmd.columns = parseInt(value); break; - case KittyKey.ROWS: cmd.rows = parseInt(value); break; - case KittyKey.MORE: cmd.more = parseInt(value); break; - case KittyKey.COMPRESSION: cmd.compression = value; break; - case KittyKey.QUIET: cmd.quiet = parseInt(value); break; + case KittyKey.FORMAT: cmd.format = numValue; break; + case KittyKey.ID: cmd.id = numValue; break; + case KittyKey.WIDTH: cmd.width = numValue; break; + case KittyKey.HEIGHT: cmd.height = numValue; break; + case KittyKey.X_OFFSET: cmd.x = numValue; break; + case KittyKey.Y_OFFSET: cmd.y = numValue; break; + case KittyKey.COLUMNS: cmd.columns = numValue; break; + case KittyKey.ROWS: cmd.rows = numValue; break; + case KittyKey.MORE: cmd.more = numValue; break; + case KittyKey.QUIET: cmd.quiet = numValue; break; } } From fd641370ec10c5bdd56e4a1a978d672d4ede291e Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 19:22:59 -0800 Subject: [PATCH 022/124] Dont use magic number, use symbol --- addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index e9917cb5a..1b7cb8439 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -599,7 +599,7 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { bytes[i] = binaryString.charCodeAt(i); } - const format = cmd.format || 32; + const format = cmd.format || KittyFormat.RGBA; if (format === KittyFormat.PNG) { // For PNG, we just verify base64 decoded successfully From 15c71e28c80d70d1e18ac8124de5217c944513d5 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 19:51:16 -0800 Subject: [PATCH 023/124] Replace more magic numbers with readable symbols --- .../src/KittyGraphicsAddon.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 1b7cb8439..30e321a4b 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -65,12 +65,17 @@ const enum KittyKey { ROWS = 'r', // More data flag (1=more chunks coming, 0=final chunk) MORE = 'm', - // Compression type (z=zlib) + // Compression type (z=zlib). This is essential for chunking larger images. COMPRESSION = 'o', // Quiet mode (1=suppress OK responses, 2=suppress error responses) QUIET = 'q' } +// Pixel format constants +const BYTES_PER_PIXEL_RGB = 3; +const BYTES_PER_PIXEL_RGBA = 4; +const ALPHA_OPAQUE = 255; + /** * Parsed Kitty graphics command. */ @@ -401,7 +406,7 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { throw new Error('Width and height required for raw pixel data'); } - const bytesPerPixel = format === KittyFormat.RGBA ? 4 : 3; + const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; const expectedBytes = width * height * bytesPerPixel; if (bytes.length < expectedBytes) { @@ -414,14 +419,14 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { for (let i = 0; i < width * height; i++) { const srcOffset = i * bytesPerPixel; - const dstOffset = i * 4; + const dstOffset = i * BYTES_PER_PIXEL_RGBA; data[dstOffset] = bytes[srcOffset]; // R data[dstOffset + 1] = bytes[srcOffset + 1]; // G data[dstOffset + 2] = bytes[srcOffset + 2]; // B data[dstOffset + 3] = format === KittyFormat.RGBA ? bytes[srcOffset + 3] // A from source - : 255; // Fully opaque for RGB + : ALPHA_OPAQUE; // Fully opaque for RGB } return createImageBitmap(imageData); @@ -616,7 +621,7 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { return true; } - const bytesPerPixel = format === KittyFormat.RGBA ? 4 : 3; + const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; const expectedBytes = width * height * bytesPerPixel; if (bytes.length < expectedBytes) { From a1c17025084ffe5543b2ec1df3225402e48a79f3 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 20:25:10 -0800 Subject: [PATCH 024/124] Assemble and use dataArray for ImageData, make hot-loop faster --- .../src/KittyGraphicsAddon.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 30e321a4b..a386163c4 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -414,22 +414,23 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { } // Convert to RGBA ImageData - const imageData = new ImageData(width, height); - const data = imageData.data; + // TODO: Get this checked by Daniel. + const pixelCount = width * height; + const data = new Uint8ClampedArray(pixelCount * BYTES_PER_PIXEL_RGBA); + const isRgba = format === KittyFormat.RGBA; - for (let i = 0; i < width * height; i++) { - const srcOffset = i * bytesPerPixel; - const dstOffset = i * BYTES_PER_PIXEL_RGBA; - - data[dstOffset] = bytes[srcOffset]; // R + let srcOffset = 0; + let dstOffset = 0; + for (let i = 0; i < pixelCount; i++) { + data[dstOffset ] = bytes[srcOffset ]; // R data[dstOffset + 1] = bytes[srcOffset + 1]; // G data[dstOffset + 2] = bytes[srcOffset + 2]; // B - data[dstOffset + 3] = format === KittyFormat.RGBA - ? bytes[srcOffset + 3] // A from source - : ALPHA_OPAQUE; // Fully opaque for RGB + data[dstOffset + 3] = isRgba ? bytes[srcOffset + 3] : ALPHA_OPAQUE; + srcOffset += bytesPerPixel; + dstOffset += BYTES_PER_PIXEL_RGBA; } - return createImageBitmap(imageData); + return createImageBitmap(new ImageData(data, width, height)); } /** From f89524e577241bfd6cbf6a4fcdb7dcae9041ed8e Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 21:25:31 -0800 Subject: [PATCH 025/124] Create KittyApchandler.ts --- .../src/KittyApcHandler.ts | 133 +++++++++++++++++ .../src/KittyGraphicsAddon.test.ts | 3 +- .../src/KittyGraphicsAddon.ts | 139 ++---------------- 3 files changed, 145 insertions(+), 130 deletions(-) create mode 100644 addons/addon-kitty-graphics/src/KittyApcHandler.ts diff --git a/addons/addon-kitty-graphics/src/KittyApcHandler.ts b/addons/addon-kitty-graphics/src/KittyApcHandler.ts new file mode 100644 index 000000000..062b58806 --- /dev/null +++ b/addons/addon-kitty-graphics/src/KittyApcHandler.ts @@ -0,0 +1,133 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + * + * Kitty graphics protocol types, constants, and parsing utilities. + */ + +/** + * Kitty graphics protocol action types. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'. + */ +export const enum KittyAction { + TRANSMIT = 't', + TRANSMIT_DISPLAY = 'T', + QUERY = 'q', + PLACEMENT = 'p', + DELETE = 'd' +} + +/** + * Kitty graphics protocol format types. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference + */ +export const enum KittyFormat { + RGB = 24, + RGBA = 32, + PNG = 100 +} + +/** + * Kitty graphics protocol compression types. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'. + */ +export const enum KittyCompression { + NONE = '', + ZLIB = 'z' +} + +/** + * Kitty graphics protocol control data keys. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference + */ +export const enum KittyKey { + // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete) + ACTION = 'a', + // Image format (24=RGB, 32=RGBA, 100=PNG) + FORMAT = 'f', + // Image ID for referencing stored images + ID = 'i', + // Source image width in pixels + WIDTH = 's', + // Source image height in pixels + HEIGHT = 'v', + // The left edge (in pixels) of the image area to display + X_OFFSET = 'x', + // The top edge (in pixels) of the image area to display + Y_OFFSET = 'y', + // Number of terminal columns to display the image over + COLUMNS = 'c', + // Number of terminal rows to display the image over + ROWS = 'r', + // More data flag (1=more chunks coming, 0=final chunk) + MORE = 'm', + // Compression type (z=zlib). This is essential for chunking larger images. + COMPRESSION = 'o', + // Quiet mode (1=suppress OK responses, 2=suppress error responses) + QUIET = 'q' +} + +// Pixel format constants +export const BYTES_PER_PIXEL_RGB = 3; +export const BYTES_PER_PIXEL_RGBA = 4; +export const ALPHA_OPAQUE = 255; + +/** + * Parsed Kitty graphics command. + */ +export interface IKittyCommand { + action?: string; + format?: number; + id?: number; + width?: number; + height?: number; + x?: number; + y?: number; + columns?: number; + rows?: number; + more?: number; + quiet?: number; + compression?: string; + payload?: string; +} + +/** + * Parses Kitty graphics control data into a command object. + */ +export function parseKittyCommand(data: string): IKittyCommand { + const cmd: IKittyCommand = {}; + const parts = data.split(','); + + for (const part of parts) { + const eqIdx = part.indexOf('='); + if (eqIdx === -1) continue; + + const key = part.substring(0, eqIdx); + const value = part.substring(eqIdx + 1); + + // Handle string keys first + if (key === KittyKey.ACTION) { + cmd.action = value; + continue; + } + if (key === KittyKey.COMPRESSION) { + cmd.compression = value; + continue; + } + const numValue = parseInt(value); + switch (key) { + case KittyKey.FORMAT: cmd.format = numValue; break; + case KittyKey.ID: cmd.id = numValue; break; + case KittyKey.WIDTH: cmd.width = numValue; break; + case KittyKey.HEIGHT: cmd.height = numValue; break; + case KittyKey.X_OFFSET: cmd.x = numValue; break; + case KittyKey.Y_OFFSET: cmd.y = numValue; break; + case KittyKey.COLUMNS: cmd.columns = numValue; break; + case KittyKey.ROWS: cmd.rows = numValue; break; + case KittyKey.MORE: cmd.more = numValue; break; + case KittyKey.QUIET: cmd.quiet = numValue; break; + } + } + + return cmd; +} diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts index 4066a45f1..eb7214261 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts @@ -4,7 +4,8 @@ */ import { assert } from 'chai'; import { Terminal } from 'browser/public/Terminal'; -import { KittyGraphicsAddon, parseKittyCommand } from './KittyGraphicsAddon'; +import { KittyGraphicsAddon } from './KittyGraphicsAddon'; +import { parseKittyCommand } from './KittyApcHandler'; /** * Write data to terminal and wait for completion. diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index a386163c4..7b3679a89 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -7,135 +7,16 @@ import type { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; import type { KittyGraphicsAddon as IKittyGraphicsApi, IKittyGraphicsOptions, IKittyImage } from '@xterm/addon-kitty-graphics'; import { KittyImageRenderer } from './KittyImageRenderer'; import type { ITerminalExt } from './Types'; - -/** - * Kitty graphics protocol action types. - * Possible actions from protocol. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'. - */ -const enum KittyAction { - TRANSMIT = 't', - TRANSMIT_DISPLAY = 'T', - QUERY = 'q', - PLACEMENT = 'p', - DELETE = 'd' -} - -/** - * Kitty graphics protocol format types. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference where the format for *-bit came from. - */ -const enum KittyFormat { - RGB = 24, - RGBA = 32, - PNG = 100 -} - -/** - * Kitty graphics protocol compression types. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'. - */ -const enum KittyCompression { - NONE = '', - ZLIB = 'z' -} - -/** - * Kitty graphics protocol control data keys. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference - */ -const enum KittyKey { - // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete) - ACTION = 'a', - // Image format (24=RGB, 32=RGBA, 100=PNG) - FORMAT = 'f', - // Image ID for referencing stored images - ID = 'i', - // Source image width in pixels - WIDTH = 's', - // Source image height in pixels - HEIGHT = 'v', - // The left edge (in pixels) of the image area to display - X_OFFSET = 'x', - // The top edge (in pixels) of the image area to display - Y_OFFSET = 'y', - // Number of terminal columns to display the image over - COLUMNS = 'c', - // Number of terminal rows to display the image over - ROWS = 'r', - // More data flag (1=more chunks coming, 0=final chunk) - MORE = 'm', - // Compression type (z=zlib). This is essential for chunking larger images. - COMPRESSION = 'o', - // Quiet mode (1=suppress OK responses, 2=suppress error responses) - QUIET = 'q' -} - -// Pixel format constants -const BYTES_PER_PIXEL_RGB = 3; -const BYTES_PER_PIXEL_RGBA = 4; -const ALPHA_OPAQUE = 255; - -/** - * Parsed Kitty graphics command. - */ -export interface IKittyCommand { - action?: string; - format?: number; - id?: number; - width?: number; - height?: number; - x?: number; - y?: number; - columns?: number; - rows?: number; - more?: number; - quiet?: number; - compression?: string; - payload?: string; -} - -/** - * Parses Kitty graphics control data into a command object. - * Exported for testing. - */ -export function parseKittyCommand(data: string): IKittyCommand { - const cmd: IKittyCommand = {}; - const parts = data.split(','); - - for (const part of parts) { - const eqIdx = part.indexOf('='); - if (eqIdx === -1) continue; - - const key = part.substring(0, eqIdx); - const value = part.substring(eqIdx + 1); - - // Handle string keys first - if (key === KittyKey.ACTION) { - cmd.action = value; - continue; - } - if (key === KittyKey.COMPRESSION) { - cmd.compression = value; - continue; - } - const numValue = parseInt(value); - switch (key) { - case KittyKey.FORMAT: cmd.format = numValue; break; - case KittyKey.ID: cmd.id = numValue; break; - case KittyKey.WIDTH: cmd.width = numValue; break; - case KittyKey.HEIGHT: cmd.height = numValue; break; - case KittyKey.X_OFFSET: cmd.x = numValue; break; - case KittyKey.Y_OFFSET: cmd.y = numValue; break; - case KittyKey.COLUMNS: cmd.columns = numValue; break; - case KittyKey.ROWS: cmd.rows = numValue; break; - case KittyKey.MORE: cmd.more = numValue; break; - case KittyKey.QUIET: cmd.quiet = numValue; break; - } - } - - return cmd; -} +import { + KittyAction, + KittyFormat, + KittyCompression, + BYTES_PER_PIXEL_RGB, + BYTES_PER_PIXEL_RGBA, + ALPHA_OPAQUE, + parseKittyCommand, + type IKittyCommand +} from './KittyApcHandler'; /** * Pending chunked transmission state. From 8c9afdb364f9660d802fdaf300ebcbee57896e28 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 22:13:47 -0800 Subject: [PATCH 026/124] Outsource a bunch to KittyApcHandler. TODO: go over this --- .../src/KittyApcHandler.ts | 478 ++++++++++++++++- .../src/KittyGraphicsAddon.ts | 505 +----------------- 2 files changed, 489 insertions(+), 494 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyApcHandler.ts b/addons/addon-kitty-graphics/src/KittyApcHandler.ts index 062b58806..c74e67254 100644 --- a/addons/addon-kitty-graphics/src/KittyApcHandler.ts +++ b/addons/addon-kitty-graphics/src/KittyApcHandler.ts @@ -2,9 +2,11 @@ * Copyright (c) 2025 The xterm.js authors. All rights reserved. * @license MIT * - * Kitty graphics protocol types, constants, and parsing utilities. + * Kitty graphics protocol types, constants, parsing, and APC handler. */ +import type { IKittyImage } from '@xterm/addon-kitty-graphics'; + /** * Kitty graphics protocol action types. * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'. @@ -19,7 +21,7 @@ export const enum KittyAction { /** * Kitty graphics protocol format types. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference where the format for *-bit came from. */ export const enum KittyFormat { RGB = 24, @@ -91,6 +93,35 @@ export interface IKittyCommand { payload?: string; } +/** + * Pending chunked transmission state. + * Stores metadata from the first chunk while accumulating payload data. + */ +interface IPendingTransmission { + /** The parsed command from the first chunk (contains action, format, dimensions, etc.) */ + cmd: IKittyCommand; + /** Accumulated base64 payload data */ + data: string; +} + +/** + * Terminal interface for sending responses. + * Question from Anthony: Do we really need this... + */ +interface ITerminal { + input(data: string, wasUserInput: boolean): void; +} + +/** + * Renderer interface for image display. + */ +interface IKittyRenderer { + getCellSize(): { width: number, height: number }; + placeImage(bitmap: ImageBitmap, id: number, col?: number, row?: number, width?: number, height?: number): number; + removeByImageId(id: number): void; + clearAll(): void; +} + /** * Parses Kitty graphics control data into a command object. */ @@ -131,3 +162,446 @@ export function parseKittyCommand(data: string): IKittyCommand { return cmd; } + +/** + * Handles Kitty graphics protocol APC sequences. + * Manages parsing, chunked transmissions, and dispatching to action handlers. + * + * TODO: Go over this with Daniel: Like SixelHandler, this receives direct references to storage + * and terminal rather than using callbacks. + */ +export class KittyApcHandler { + /** + * Pending chunked transmissions keyed by image ID. + * ID 0 is used for transmissions without an explicit ID (the "anonymous" transmission). + */ + private _pendingTransmissions: Map = new Map(); + private _nextImageId = 1; + + constructor( + private readonly _images: Map, + private readonly _decodedImages: Map, + private readonly _renderer: IKittyRenderer | undefined, + private readonly _terminal: ITerminal | undefined, + private readonly _debug: boolean = false + ) {} + + /** + * Handle a Kitty graphics APC sequence. + * @param data - The data portion of the APC sequence (after 'G') + * @returns true if handled successfully + */ + public handle(data: string): boolean { + const semiIdx = data.indexOf(';'); + const controlData = semiIdx === -1 ? data : data.substring(0, semiIdx); + const payload = semiIdx === -1 ? '' : data.substring(semiIdx + 1); + + const cmd = parseKittyCommand(controlData); + cmd.payload = payload; + + if (this._debug) { + console.log('[KittyApcHandler] Received command:', cmd); + } + + const action = cmd.action ?? 't'; + + switch (action) { + case KittyAction.TRANSMIT: + return this._handleTransmit(cmd); + case KittyAction.TRANSMIT_DISPLAY: + return this._handleTransmitDisplay(cmd); + case KittyAction.QUERY: + return this._handleQuery(cmd); + case KittyAction.DELETE: + return this._handleDelete(cmd); + default: + return true; + } + } + + /** + * Clear all pending transmissions. Called on dispose. + */ + public clearPendingTransmissions(): void { + this._pendingTransmissions.clear(); + } + + private _handleTransmit(cmd: IKittyCommand): boolean { + const payload = cmd.payload ?? ''; + const pendingKey = cmd.id ?? 0; + + const isMoreComing = cmd.more === 1; + const pending = this._pendingTransmissions.get(pendingKey); + + if (pending) { + pending.data += payload; + + if (this._debug) { + console.log(`[KittyApcHandler] Chunk continuation for id=${pendingKey}, total size=${pending.data.length}, more=${isMoreComing}`); + } + + if (isMoreComing) { + return true; + } + + const originalCmd = pending.cmd; + const fullPayload = pending.data; + this._pendingTransmissions.delete(pendingKey); + + const id = originalCmd.id ?? this._nextImageId++; + + const image: IKittyImage = { + id, + data: fullPayload, + width: originalCmd.width ?? 0, + height: originalCmd.height ?? 0, + format: (originalCmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, + compression: originalCmd.compression ?? '' + }; + + this._images.set(image.id, image); + + if (this._debug) { + console.log(`[KittyApcHandler] Stored chunked image ${id}, payload size=${fullPayload.length}`); + } + + if (originalCmd.action === KittyAction.TRANSMIT_DISPLAY) { + this._displayImage(image, originalCmd.columns, originalCmd.rows); + } + + cmd.id = id; + return true; + } + + if (isMoreComing) { + this._pendingTransmissions.set(pendingKey, { + cmd: { ...cmd }, + data: payload + }); + + if (this._debug) { + console.log(`[KittyApcHandler] Started chunked transmission, id=${pendingKey}, format=${cmd.format}, compression=${cmd.compression}, size=${cmd.width}x${cmd.height}, initial payload=${payload.length}`); + } + + return true; + } + + const id = cmd.id ?? this._nextImageId++; + + const image: IKittyImage = { + id, + data: payload, + width: cmd.width ?? 0, + height: cmd.height ?? 0, + format: (cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, + compression: cmd.compression ?? '' + }; + + this._images.set(image.id, image); + + if (this._debug) { + console.log(`[KittyApcHandler] Stored image ${id}`); + } + + cmd.id = id; + return true; + } + + private _handleTransmitDisplay(cmd: IKittyCommand): boolean { + const pendingKey = cmd.id ?? 0; + const wasPendingBefore = this._pendingTransmissions.has(pendingKey); + + this._handleTransmit(cmd); + + if (cmd.more === 1) { + return true; + } + + if (wasPendingBefore) { + return true; + } + + const id = cmd.id!; + const image = this._images.get(id); + if (image) { + this._displayImage(image, cmd.columns, cmd.rows); + } + + return true; + } + + /** + * Handle query action (a=q). + * + * Per the Kitty graphics protocol documentation: + * "Sometimes, using an id is not appropriate... In that case, you can use the + * query action, set a=q. Then the terminal emulator will try to load the image + * and respond with either OK or an error, as above, but it will not replace an + * existing image with the same id, nor will it store the image." + */ + private _handleQuery(cmd: IKittyCommand): boolean { + const id = cmd.id ?? 0; + const quiet = cmd.quiet ?? 0; + + if (this._debug) { + console.log(`[KittyApcHandler] Query received, id=${id}, quiet=${quiet}`); + } + + const payload = cmd.payload || ''; + + if (!payload) { + this._sendResponse(id, 'OK', quiet); + return true; + } + + try { + const binaryString = atob(payload); + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + const format = cmd.format || KittyFormat.RGBA; + + if (format === KittyFormat.PNG) { + this._sendResponse(id, 'OK', quiet); + } else { + const width = cmd.width || 0; + const height = cmd.height || 0; + + if (!width || !height) { + this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet); + return true; + } + + const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; + const expectedBytes = width * height * bytesPerPixel; + + if (bytes.length < expectedBytes) { + this._sendResponse(id, `EINVAL:insufficient pixel data, got ${bytes.length}, expected ${expectedBytes}`, quiet); + return true; + } + + this._sendResponse(id, 'OK', quiet); + } + } catch (e) { + const errorMsg = e instanceof Error ? e.message : 'unknown error'; + this._sendResponse(id, `EINVAL:${errorMsg}`, quiet); + } + + return true; + } + + private _handleDelete(cmd: IKittyCommand): boolean { + const id = cmd.id; + + if (id !== undefined) { + this._images.delete(id); + // Close and remove decoded bitmap + const bitmap = this._decodedImages.get(id); + if (bitmap) { + bitmap.close(); + this._decodedImages.delete(id); + } + // Remove from renderer + this._renderer?.removeByImageId(id); + } else { + this._images.clear(); + // Close all decoded bitmaps + for (const bitmap of this._decodedImages.values()) { + bitmap.close(); + } + this._decodedImages.clear(); + // Clear all from renderer + this._renderer?.clearAll(); + } + + return true; + } + + /** + * Send a response back to the client via the terminal's input method. + */ + private _sendResponse(id: number, message: string, quiet: number): void { + const isOk = message === 'OK'; + if (isOk && quiet === 1) { + return; + } + if (!isOk && quiet === 2) { + return; + } + + if (!this._terminal) { + return; + } + + const response = `\x1b_Gi=${id};${message}\x1b\\`; + this._terminal.input(response, false); + + if (this._debug) { + console.log(`[KittyApcHandler] Sent response: i=${id};${message}`); + } + } + + /** + * Decode and display an image at the cursor position. + */ + private _displayImage(image: IKittyImage, columns?: number, rows?: number): void { + if (!this._renderer) { + return; + } + + const storedImage = this._images.get(image.id); + if (!storedImage) { + if (this._debug) { + console.log(`[KittyApcHandler] No image found for id=${image.id} after transmit`); + } + return; + } + + this._decodeAndDisplay(storedImage, columns, rows).catch(err => { + if (this._debug) { + console.error(`[KittyApcHandler] Failed to decode/display image ${image.id}:`, err); + } + }); + } + + /** + * Decode an image and display it at the cursor position. + */ + private async _decodeAndDisplay(image: IKittyImage, columns?: number, rows?: number): Promise { + if (!this._renderer) { + return; + } + + let bitmap = this._decodedImages.get(image.id); + + if (!bitmap) { + bitmap = await this._decodeImage(image); + this._decodedImages.set(image.id, bitmap); + + if (this._debug) { + console.log(`[KittyApcHandler] Decoded image ${image.id}: ${bitmap.width}x${bitmap.height}`); + } + } + + let width = 0; + let height = 0; + if (columns || rows) { + const cellSize = this._renderer.getCellSize(); + if (columns) { + width = columns * cellSize.width; + } + if (rows) { + height = rows * cellSize.height; + } + if (width && !height) { + height = Math.round(width * (bitmap.height / bitmap.width)); + } else if (height && !width) { + width = Math.round(height * (bitmap.width / bitmap.height)); + } + } + + this._renderer.placeImage(bitmap, image.id, undefined, undefined, width, height); + + if (this._debug) { + console.log(`[KittyApcHandler] Placed image ${image.id} at cursor, size: ${width || bitmap.width}x${height || bitmap.height}`); + } + } + + /** + * Decode base64 image data into an ImageBitmap. + */ + private async _decodeImage(image: IKittyImage): Promise { + const format = image.format; + const base64Data = image.data as string; + + const binaryString = atob(base64Data); + let bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + if (image.compression === KittyCompression.ZLIB) { + bytes = await this._decompressZlib(bytes); + if (this._debug) { + console.log(`[KittyApcHandler] Decompressed ${binaryString.length} -> ${bytes.length} bytes`); + } + } + + if (format === KittyFormat.PNG) { + const blob = new Blob([bytes], { type: 'image/png' }); + return createImageBitmap(blob); + } + + const width = image.width; + const height = image.height; + + if (!width || !height) { + throw new Error('Width and height required for raw pixel data'); + } + + const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; + const expectedBytes = width * height * bytesPerPixel; + + if (bytes.length < expectedBytes) { + throw new Error(`Insufficient pixel data: got ${bytes.length}, expected ${expectedBytes}`); + } + + // Convert to RGBA ImageData + // TODO: Get this checked by Daniel. + const pixelCount = width * height; + const data = new Uint8ClampedArray(pixelCount * BYTES_PER_PIXEL_RGBA); + const isRgba = format === KittyFormat.RGBA; + + let srcOffset = 0; + let dstOffset = 0; + for (let i = 0; i < pixelCount; i++) { + data[dstOffset ] = bytes[srcOffset ]; // R + data[dstOffset + 1] = bytes[srcOffset + 1]; // G + data[dstOffset + 2] = bytes[srcOffset + 2]; // B + data[dstOffset + 3] = isRgba ? bytes[srcOffset + 3] : ALPHA_OPAQUE; + srcOffset += bytesPerPixel; + dstOffset += BYTES_PER_PIXEL_RGBA; + } + + return createImageBitmap(new ImageData(data, width, height)); + } + + /** + * Decompress zlib/deflate compressed data using the browser's DecompressionStream API. + */ + private async _decompressZlib(compressed: Uint8Array): Promise { + try { + return await this._decompress(compressed, 'deflate'); + } catch { + return await this._decompress(compressed, 'deflate-raw'); + } + } + + private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise { + const ds = new DecompressionStream(format); + const writer = ds.writable.getWriter(); + writer.write(compressed); + writer.close(); + + const chunks: Uint8Array[] = []; + const reader = ds.readable.getReader(); + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + chunks.push(value); + } + + const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0); + const result = new Uint8Array(totalLength); + let offset = 0; + for (const chunk of chunks) { + result.set(chunk, offset); + offset += chunk.length; + } + + return result; + } +} diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 7b3679a89..215499864 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -7,42 +7,17 @@ import type { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; import type { KittyGraphicsAddon as IKittyGraphicsApi, IKittyGraphicsOptions, IKittyImage } from '@xterm/addon-kitty-graphics'; import { KittyImageRenderer } from './KittyImageRenderer'; import type { ITerminalExt } from './Types'; -import { - KittyAction, - KittyFormat, - KittyCompression, - BYTES_PER_PIXEL_RGB, - BYTES_PER_PIXEL_RGBA, - ALPHA_OPAQUE, - parseKittyCommand, - type IKittyCommand -} from './KittyApcHandler'; - -/** - * Pending chunked transmission state. - * Stores metadata from the first chunk while accumulating payload data. - */ -interface IPendingTransmission { - /** The parsed command from the first chunk (contains action, format, dimensions, etc.) */ - cmd: IKittyCommand; - /** Accumulated base64 payload data */ - data: string; -} +import { KittyApcHandler } from './KittyApcHandler'; export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { private _terminal: ITerminalExt | undefined; private _apcHandler: IDisposable | undefined; + private _kittyApcHandler: KittyApcHandler | undefined; private _renderer: KittyImageRenderer | undefined; // Question: ImageAddon has ImageStorage, lot going on there though comapred to IKittyImage atm. // Maybe add more, rename to IKittyImageStorage instead of IKittyImage? private _images: Map = new Map(); private _decodedImages: Map = new Map(); - /** - * Pending chunked transmissions keyed by image ID. - * ID 0 is used for transmissions without an explicit ID (the "anonymous" transmission). - */ - private _pendingTransmissions: Map = new Map(); - private _nextImageId = 1; private _debug: boolean; constructor(options?: IKittyGraphicsOptions) { @@ -61,18 +36,26 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { console.log('[KittyGraphicsAddon] Registering APC handler for G (0x47)'); } + this._kittyApcHandler = new KittyApcHandler( + this._images, + this._decodedImages, + this._renderer, + this._terminal, + this._debug + ); + // Register APC handler for 'G' (0x47) - Kitty graphics protocol // APC sequence format: ESC _ G ESC \ this._apcHandler = terminal.parser.registerApcHandler(0x47, (data: string) => { - return this._handleKittyGraphics(data); + return this._kittyApcHandler!.handle(data); }); } public dispose(): void { this._apcHandler?.dispose(); + this._kittyApcHandler?.clearPendingTransmissions(); this._renderer?.dispose(); this._images.clear(); - this._pendingTransmissions.clear(); // Close all decoded bitmaps for (const bitmap of this._decodedImages.values()) { @@ -81,468 +64,6 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { this._decodedImages.clear(); this._terminal = undefined; - } - - private _handleKittyGraphics(data: string): boolean { - const semiIdx = data.indexOf(';'); - const controlData = semiIdx === -1 ? data : data.substring(0, semiIdx); - const payload = semiIdx === -1 ? '' : data.substring(semiIdx + 1); - - const cmd = parseKittyCommand(controlData); - cmd.payload = payload; - - if (this._debug) { - console.log('[KittyGraphicsAddon] Received command:', cmd); - } - - const action = cmd.action ?? 't'; - - // Actions from: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference - switch (action) { - case KittyAction.TRANSMIT: - return this._handleTransmit(cmd); - case KittyAction.TRANSMIT_DISPLAY: - return this._handleTransmitDisplay(cmd); - case KittyAction.QUERY: - return this._handleQuery(cmd); - case KittyAction.DELETE: - return this._handleDelete(cmd); - default: - return true; - } - } - - private _handleTransmit(cmd: IKittyCommand): boolean { - const payload = cmd.payload ?? ''; - // Use 0 as the key for anonymous transmissions (no explicit i=) - const pendingKey = cmd.id ?? 0; - - // Check if this is a continuation of a chunked transmission - const isMoreComing = cmd.more === 1; - const pending = this._pendingTransmissions.get(pendingKey); - - if (pending) { - // This is a continuation chunk - append data - pending.data += payload; - - if (this._debug) { - console.log(`[KittyGraphicsAddon] Chunk continuation for id=${pendingKey}, total size=${pending.data.length}, more=${isMoreComing}`); - } - - if (isMoreComing) { - // More chunks coming, keep waiting - return true; - } - - // Final chunk - use the stored command's metadata - const originalCmd = pending.cmd; - const fullPayload = pending.data; - this._pendingTransmissions.delete(pendingKey); - - // Assign a real ID if this was anonymous (pendingKey === 0) - const id = originalCmd.id ?? this._nextImageId++; - - const image: IKittyImage = { - id, - data: fullPayload, - width: originalCmd.width ?? 0, - height: originalCmd.height ?? 0, - format: (originalCmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, - compression: originalCmd.compression ?? '' - }; - - this._images.set(id, image); - - if (this._debug) { - console.log(`[KittyGraphicsAddon] Stored chunked image ${id}, payload size=${fullPayload.length}`); - } - - // If the original action was 'T' (transmit+display), display the image now - if (originalCmd.action === KittyAction.TRANSMIT_DISPLAY) { - this._decodeAndDisplay(image, originalCmd.columns, originalCmd.rows).catch(err => { - if (this._debug) { - console.error(`[KittyGraphicsAddon] Failed to decode/display chunked image ${id}:`, err); - } - }); - } - - cmd.id = id; - return true; - } - - // This is the first chunk (or a non-chunked transmission) - if (isMoreComing) { - // First chunk of a multi-chunk transmission - store the command and start accumulating - this._pendingTransmissions.set(pendingKey, { - cmd: { ...cmd }, // Clone the command to preserve metadata - data: payload - }); - - if (this._debug) { - console.log(`[KittyGraphicsAddon] Started chunked transmission, id=${pendingKey}, format=${cmd.format}, compression=${cmd.compression}, size=${cmd.width}x${cmd.height}, initial payload=${payload.length}`); - } - - return true; - } - - // Non-chunked transmission - store immediately - const id = cmd.id ?? this._nextImageId++; - - const image: IKittyImage = { - id, - data: payload, - width: cmd.width ?? 0, - height: cmd.height ?? 0, - format: (cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, - compression: cmd.compression ?? '' - }; - - this._images.set(id, image); - - if (this._debug) { - console.log(`[KittyGraphicsAddon] Stored image ${id}`); - } - - // Update cmd.id for _handleTransmitDisplay - cmd.id = id; - return true; - } - - private _handleTransmitDisplay(cmd: IKittyCommand): boolean { - const pendingKey = cmd.id ?? 0; - const wasPendingBefore = this._pendingTransmissions.has(pendingKey); - - // Delegate to _handleTransmit which will: - // 1. Accumulate chunks if m=1 - // 2. Store the image when complete - // 3. Trigger display when chunked transmission completes (checks original action) - this._handleTransmit(cmd); - - // If this was a chunked transmission (first chunk with m=1), _handleTransmit - // stored it as pending and will display when complete. Don't display now. - if (cmd.more === 1) { - return true; - } - - // If there was a pending transmission that just completed, _handleTransmit - // already triggered the display. Don't display again. - if (wasPendingBefore) { - return true; - } - - // For non-chunked transmission, display now - const id = cmd.id!; - const image = this._images.get(id); - - if (!image) { - if (this._debug) { - console.log(`[KittyGraphicsAddon] No image found for id=${id} after transmit`); - } - return true; - } - - // Decode and display with sizing - this._decodeAndDisplay(image, cmd.columns, cmd.rows).catch(err => { - if (this._debug) { - console.error(`[KittyGraphicsAddon] Failed to decode/display image ${id}:`, err); - } - }); - - return true; - } - - /** - * Decode base64 image data into an ImageBitmap. - */ - private async _decodeImage(image: IKittyImage): Promise { - const format = image.format; - const base64Data = image.data as string; - - // Decode base64 to binary - const binaryString = atob(base64Data); - let bytes = new Uint8Array(binaryString.length); - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - // Decompress if needed (o=z means zlib/deflate compression) - if (image.compression === KittyCompression.ZLIB) { - bytes = await this._decompressZlib(bytes); - if (this._debug) { - console.log(`[KittyGraphicsAddon] Decompressed ${binaryString.length} -> ${bytes.length} bytes`); - } - } - - if (format === KittyFormat.PNG) { - // PNG: create blob and decode - const blob = new Blob([bytes], { type: 'image/png' }); - return createImageBitmap(blob); - } - - // RGB (24) or RGBA (32): create ImageData - const width = image.width; - const height = image.height; - - if (!width || !height) { - throw new Error('Width and height required for raw pixel data'); - } - - const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; - const expectedBytes = width * height * bytesPerPixel; - - if (bytes.length < expectedBytes) { - throw new Error(`Insufficient pixel data: got ${bytes.length}, expected ${expectedBytes}`); - } - - // Convert to RGBA ImageData - // TODO: Get this checked by Daniel. - const pixelCount = width * height; - const data = new Uint8ClampedArray(pixelCount * BYTES_PER_PIXEL_RGBA); - const isRgba = format === KittyFormat.RGBA; - - let srcOffset = 0; - let dstOffset = 0; - for (let i = 0; i < pixelCount; i++) { - data[dstOffset ] = bytes[srcOffset ]; // R - data[dstOffset + 1] = bytes[srcOffset + 1]; // G - data[dstOffset + 2] = bytes[srcOffset + 2]; // B - data[dstOffset + 3] = isRgba ? bytes[srcOffset + 3] : ALPHA_OPAQUE; - srcOffset += bytesPerPixel; - dstOffset += BYTES_PER_PIXEL_RGBA; - } - - return createImageBitmap(new ImageData(data, width, height)); - } - - /** - * Decompress zlib/deflate compressed data using the browser's DecompressionStream API. - */ - private async _decompressZlib(compressed: Uint8Array): Promise { - // Use DecompressionStream API (available in modern browsers) - // 'deflate-raw' is the format used by zlib without headers - // Try 'deflate' first (zlib with header), fall back to 'deflate-raw' if that fails - try { - return await this._decompress(compressed, 'deflate'); - } catch { - // If 'deflate' fails, try 'deflate-raw' - return await this._decompress(compressed, 'deflate-raw'); - } - } - - private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise { - const ds = new DecompressionStream(format); - const writer = ds.writable.getWriter(); - writer.write(compressed); - writer.close(); - - const chunks: Uint8Array[] = []; - const reader = ds.readable.getReader(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - chunks.push(value); - } - - // Combine chunks into single Uint8Array - const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0); - const result = new Uint8Array(totalLength); - let offset = 0; - for (const chunk of chunks) { - result.set(chunk, offset); - offset += chunk.length; - } - - return result; - } - - /** - * Decode an image and display it at the cursor position. - * @param image - The Kitty image to decode and display - * @param columns - Optional: number of terminal columns to span - * @param rows - Optional: number of terminal rows to span - */ - private async _decodeAndDisplay(image: IKittyImage, columns?: number, rows?: number): Promise { - if (!this._renderer) { - return; - } - - // Check if already decoded - let bitmap = this._decodedImages.get(image.id); - - if (!bitmap) { - bitmap = await this._decodeImage(image); - this._decodedImages.set(image.id, bitmap); - - if (this._debug) { - console.log(`[KittyGraphicsAddon] Decoded image ${image.id}: ${bitmap.width}x${bitmap.height}`); - } - } - - // Calculate pixel dimensions from columns/rows if specified - let width = 0; - let height = 0; - if (columns || rows) { - const cellSize = this._renderer.getCellSize(); - if (columns) { - width = columns * cellSize.width; - } - if (rows) { - height = rows * cellSize.height; - } - // If only one dimension specified, maintain aspect ratio - if (width && !height) { - height = Math.round(width * (bitmap.height / bitmap.width)); - } else if (height && !width) { - width = Math.round(height * (bitmap.width / bitmap.height)); - } - } - - // Place at cursor position - this._renderer.placeImage(bitmap, image.id, undefined, undefined, width, height); - - if (this._debug) { - console.log(`[KittyGraphicsAddon] Placed image ${image.id} at cursor, size: ${width || bitmap.width}x${height || bitmap.height}`); - } - } - - /** - * Send a response back to the client via the terminal's data event. - * Per the Kitty protocol, responses are sent when an image id (i=) is specified. - * Format: ESC _ G i=;message ESC \ - * - * The quiet flag (q=) can suppress responses: - * - q=1: suppress OK responses - * - q=2: suppress error responses - * - * @param id - The image ID to include in the response - * @param message - The message (e.g., 'OK' or 'EINVAL:error description') - * @param quiet - The quiet flag value (0, 1, or 2) - */ - private _sendResponse(id: number, message: string, quiet: number): void { - // Check quiet flag: q=1 suppresses OK, q=2 suppresses errors - const isOk = message === 'OK'; - if (isOk && quiet === 1) { - return; - } - if (!isOk && quiet === 2) { - return; - } - - if (!this._terminal) { - return; - } - - const response = `\x1b_Gi=${id};${message}\x1b\\`; - this._terminal.input(response, false); - - if (this._debug) { - console.log(`[KittyGraphicsAddon] Sent response: i=${id};${message}`); - } - } - - /** - * Handle query action (a=q). - * - * Per the Kitty graphics protocol documentation: - * "Sometimes, using an id is not appropriate... In that case, you can use the - * query action, set a=q. Then the terminal emulator will try to load the image - * and respond with either OK or an error, as above, but it will not replace an - * existing image with the same id, nor will it store the image." - * - * The query is used by clients to check if the terminal supports the graphics - * protocol. A typical query looks like: - * ESC _ G i=31,s=1,v=1,a=q,t=d,f=24;AAAA ESC \ ESC [c - * - * If the terminal supports graphics, it responds with: - * ESC _ G i=31;OK ESC \ - * - * @param cmd - The parsed Kitty command - */ - private _handleQuery(cmd: IKittyCommand): boolean { - const id = cmd.id ?? 0; - const quiet = cmd.quiet ?? 0; - - if (this._debug) { - console.log(`[KittyGraphicsAddon] Query received, id=${id}, quiet=${quiet}`); - } - - // Try to validate the image data without storing it - const payload = cmd.payload || ''; - - if (!payload) { - // No payload - just checking if graphics protocol is supported - // Respond with OK to indicate support - this._sendResponse(id, 'OK', quiet); - return true; - } - - // Validate the image data can be decoded - try { - // Decode base64 to verify it's valid - const binaryString = atob(payload); - const bytes = new Uint8Array(binaryString.length); - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - const format = cmd.format || KittyFormat.RGBA; - - if (format === KittyFormat.PNG) { - // For PNG, we just verify base64 decoded successfully - // Full PNG validation would require async createImageBitmap - // which we can't do synchronously, so we trust the data is valid PNG - this._sendResponse(id, 'OK', quiet); - } else { - // RGB (24) or RGBA (32): verify we have enough bytes - const width = cmd.width || 0; - const height = cmd.height || 0; - - if (!width || !height) { - this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet); - return true; - } - - const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; - const expectedBytes = width * height * bytesPerPixel; - - if (bytes.length < expectedBytes) { - this._sendResponse(id, `EINVAL:insufficient pixel data, got ${bytes.length}, expected ${expectedBytes}`, quiet); - return true; - } - - this._sendResponse(id, 'OK', quiet); - } - } catch (e) { - // Base64 decode failed or other error - const errorMsg = e instanceof Error ? e.message : 'unknown error'; - this._sendResponse(id, `EINVAL:${errorMsg}`, quiet); - } - - return true; - } - - private _handleDelete(cmd: IKittyCommand): boolean { - if (cmd.id !== undefined) { - this._images.delete(cmd.id); - // Close and remove decoded bitmap - const bitmap = this._decodedImages.get(cmd.id); - if (bitmap) { - bitmap.close(); - this._decodedImages.delete(cmd.id); - } - // Remove from renderer - this._renderer?.removeByImageId(cmd.id); - } else { - this._images.clear(); - // Close all decoded bitmaps - for (const bitmap of this._decodedImages.values()) { - bitmap.close(); - } - this._decodedImages.clear(); - // Clear all from renderer - this._renderer?.clearAll(); - } - return true; + this._kittyApcHandler = undefined; } } From 3e8fc48b33e69c6c8cfdee36df9e75d4f7f4aadf Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 22:20:21 -0800 Subject: [PATCH 027/124] Small details --- addons/addon-kitty-graphics/src/KittyApcHandler.ts | 1 + addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/addon-kitty-graphics/src/KittyApcHandler.ts b/addons/addon-kitty-graphics/src/KittyApcHandler.ts index c74e67254..a4acaed37 100644 --- a/addons/addon-kitty-graphics/src/KittyApcHandler.ts +++ b/addons/addon-kitty-graphics/src/KittyApcHandler.ts @@ -230,6 +230,7 @@ export class KittyApcHandler { const payload = cmd.payload ?? ''; const pendingKey = cmd.id ?? 0; + // larger image would require chunking. const isMoreComing = cmd.more === 1; const pending = this._pendingTransmissions.get(pendingKey); diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 215499864..1a4411b6d 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -47,7 +47,7 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { // Register APC handler for 'G' (0x47) - Kitty graphics protocol // APC sequence format: ESC _ G ESC \ this._apcHandler = terminal.parser.registerApcHandler(0x47, (data: string) => { - return this._kittyApcHandler!.handle(data); + return this._kittyApcHandler?.handle(data) ?? true; }); } From 5a79b08661fb628038b16ce45467aa3e79fda0bc Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 23:12:13 -0800 Subject: [PATCH 028/124] stale comments --- addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 1a4411b6d..69bc7986d 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -14,8 +14,6 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { private _apcHandler: IDisposable | undefined; private _kittyApcHandler: KittyApcHandler | undefined; private _renderer: KittyImageRenderer | undefined; - // Question: ImageAddon has ImageStorage, lot going on there though comapred to IKittyImage atm. - // Maybe add more, rename to IKittyImageStorage instead of IKittyImage? private _images: Map = new Map(); private _decodedImages: Map = new Map(); private _debug: boolean; From d77711936fe3f5289fd59389bd37f84b185d260e Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 23:22:31 -0800 Subject: [PATCH 029/124] comments on file system --- addons/addon-kitty-graphics/src/KittyApcHandler.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/addon-kitty-graphics/src/KittyApcHandler.ts b/addons/addon-kitty-graphics/src/KittyApcHandler.ts index a4acaed37..c5d107f70 100644 --- a/addons/addon-kitty-graphics/src/KittyApcHandler.ts +++ b/addons/addon-kitty-graphics/src/KittyApcHandler.ts @@ -169,6 +169,9 @@ export function parseKittyCommand(data: string): IKittyCommand { * * TODO: Go over this with Daniel: Like SixelHandler, this receives direct references to storage * and terminal rather than using callbacks. + * + * TODO: File transmission (t=f) is not supported since browsers cannot access the filesystem. + * Maybe we need something from VS Code? */ export class KittyApcHandler { /** From a1b69e5ac8e67cf337728c3497662f94d835a3da Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 27 Jan 2026 23:26:38 -0800 Subject: [PATCH 030/124] TODO on wasm stuff --- addons/addon-kitty-graphics/src/KittyApcHandler.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/addon-kitty-graphics/src/KittyApcHandler.ts b/addons/addon-kitty-graphics/src/KittyApcHandler.ts index c5d107f70..689492ff7 100644 --- a/addons/addon-kitty-graphics/src/KittyApcHandler.ts +++ b/addons/addon-kitty-graphics/src/KittyApcHandler.ts @@ -520,6 +520,9 @@ export class KittyApcHandler { const format = image.format; const base64Data = image.data as string; + // TODO: This atob + charCodeAt loop has bad runtime and creates memory pressure with large + // images. Consider using the wasm-based base64 decoder from xterm-wasm-parts which also + // supports chunked data ingestion. See addon-image/src/IIPHandler.ts for chunked usage. const binaryString = atob(base64Data); let bytes = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) { From 492d950b644ac98d147968336da7acc935d443ed Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 28 Jan 2026 09:17:44 -0800 Subject: [PATCH 031/124] Add TODOs from jerch's comments --- addons/addon-kitty-graphics/src/KittyApcHandler.ts | 4 ++++ addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/addons/addon-kitty-graphics/src/KittyApcHandler.ts b/addons/addon-kitty-graphics/src/KittyApcHandler.ts index 689492ff7..b622556c1 100644 --- a/addons/addon-kitty-graphics/src/KittyApcHandler.ts +++ b/addons/addon-kitty-graphics/src/KittyApcHandler.ts @@ -537,6 +537,9 @@ export class KittyApcHandler { } if (format === KittyFormat.PNG) { + // TODO: Older Safari versions cannot createImageBitmap from Blob and need a workaround + // with new Image() instead. See IIPHandler for the Safari fallback pattern. + // ---> Things seem to work for my safari, but still try to see how I can verify. const blob = new Blob([bytes], { type: 'image/png' }); return createImageBitmap(blob); } @@ -557,6 +560,7 @@ export class KittyApcHandler { // Convert to RGBA ImageData // TODO: Get this checked by Daniel. + // TODO: Follow Jerch's feedback! const pixelCount = width * height; const data = new Uint8ClampedArray(pixelCount * BYTES_PER_PIXEL_RGBA); const isRgba = format === KittyFormat.RGBA; diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts index 69bc7986d..d46679ed9 100644 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts @@ -44,6 +44,10 @@ export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { // Register APC handler for 'G' (0x47) - Kitty graphics protocol // APC sequence format: ESC _ G ESC \ + // TODO: Follow jerch's feedback: The string-based handler interface is limited to 10MB + // and has bad runtime due to string conversion overhead. Implement IApcHandler interface with + // start/put/end methods to receive raw Uint32Array codepoints without copying. + // See SixelHandler and IIPHandler. this._apcHandler = terminal.parser.registerApcHandler(0x47, (data: string) => { return this._kittyApcHandler?.handle(data) ?? true; }); From cb8159c4f2593922f66574fee405b3a2829b457d Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 29 Jan 2026 00:53:10 -0800 Subject: [PATCH 032/124] Start integrating KittyGraphics stuff into imageAddon as suggested --- .github/workflows/ci.yml | 5 - .../fixture/kitty}/black-1x1.png | Bin .../fixture/kitty}/rgb-3x1.png | Bin addons/addon-image/src/ImageAddon.ts | 14 +- addons/addon-image/src/Types.ts | 6 +- .../src/kitty/KittyGraphicsHandler.ts | 494 ++++++++++++++ .../src/kitty/KittyGraphicsTypes.test.ts | 80 +++ .../src/kitty/KittyGraphicsTypes.ts | 156 +++++ addons/addon-image/test/ImageAddon.test.ts | 255 +++++++- addons/addon-image/typings/addon-image.d.ts | 9 + addons/addon-kitty-graphics/LICENSE | 19 - addons/addon-kitty-graphics/README.md | 47 -- addons/addon-kitty-graphics/package.json | 27 - addons/addon-kitty-graphics/src/19616.jpg | Bin 960364 -> 0 bytes .../src/KittyApcHandler.ts | 618 ------------------ .../src/KittyGraphicsAddon.test.ts | 188 ------ .../src/KittyGraphicsAddon.ts | 71 -- .../src/KittyImageRenderer.ts | 237 ------- addons/addon-kitty-graphics/src/Types.ts | 11 - addons/addon-kitty-graphics/src/tsconfig.json | 27 - .../test/KittyGraphicsAddon.test.ts | 269 -------- .../test/playwright.config.ts | 35 - .../addon-kitty-graphics/test/tsconfig.json | 30 - addons/addon-kitty-graphics/tsconfig.json | 5 - .../typings/addon-kitty-graphics.d.ts | 89 --- addons/addon-kitty-graphics/webpack.config.js | 44 -- bin/esbuild.mjs | 1 - demo/client/client.ts | 6 - demo/client/tsconfig.json | 10 +- demo/client/types.ts | 45 +- tsconfig.all.json | 1 - 31 files changed, 1034 insertions(+), 1765 deletions(-) rename addons/{addon-kitty-graphics/fixture => addon-image/fixture/kitty}/black-1x1.png (100%) rename addons/{addon-kitty-graphics/fixture => addon-image/fixture/kitty}/rgb-3x1.png (100%) create mode 100644 addons/addon-image/src/kitty/KittyGraphicsHandler.ts create mode 100644 addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts create mode 100644 addons/addon-image/src/kitty/KittyGraphicsTypes.ts delete mode 100644 addons/addon-kitty-graphics/LICENSE delete mode 100644 addons/addon-kitty-graphics/README.md delete mode 100644 addons/addon-kitty-graphics/package.json delete mode 100644 addons/addon-kitty-graphics/src/19616.jpg delete mode 100644 addons/addon-kitty-graphics/src/KittyApcHandler.ts delete mode 100644 addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts delete mode 100644 addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts delete mode 100644 addons/addon-kitty-graphics/src/KittyImageRenderer.ts delete mode 100644 addons/addon-kitty-graphics/src/Types.ts delete mode 100644 addons/addon-kitty-graphics/src/tsconfig.json delete mode 100644 addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts delete mode 100644 addons/addon-kitty-graphics/test/playwright.config.ts delete mode 100644 addons/addon-kitty-graphics/test/tsconfig.json delete mode 100644 addons/addon-kitty-graphics/tsconfig.json delete mode 100644 addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts delete mode 100644 addons/addon-kitty-graphics/webpack.config.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03f289b9b..c40e86ff2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,9 +41,6 @@ jobs: ./addons/addon-image/lib/* \ ./addons/addon-image/out/* \ ./addons/addon-image/out-*/* \ - ./addons/addon-kitty-graphics/lib/* \ - ./addons/addon-kitty-graphics/out/* \ - ./addons/addon-kitty-graphics/out-*/* \ ./addons/addon-ligatures/lib/* \ ./addons/addon-ligatures/out/* \ ./addons/addon-ligatures/out-*/* \ @@ -219,8 +216,6 @@ jobs: run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit - name: Integration tests (addon-image) run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image - - name: Integration tests (addon-kitty-graphics) - run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-kitty-graphics - name: Integration tests (addon-progress) run: npm run test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress - name: Integration tests (addon-search) diff --git a/addons/addon-kitty-graphics/fixture/black-1x1.png b/addons/addon-image/fixture/kitty/black-1x1.png similarity index 100% rename from addons/addon-kitty-graphics/fixture/black-1x1.png rename to addons/addon-image/fixture/kitty/black-1x1.png diff --git a/addons/addon-kitty-graphics/fixture/rgb-3x1.png b/addons/addon-image/fixture/kitty/rgb-3x1.png similarity index 100% rename from addons/addon-kitty-graphics/fixture/rgb-3x1.png rename to addons/addon-image/fixture/kitty/rgb-3x1.png diff --git a/addons/addon-image/src/ImageAddon.ts b/addons/addon-image/src/ImageAddon.ts index 167e93a79..0d0406013 100644 --- a/addons/addon-image/src/ImageAddon.ts +++ b/addons/addon-image/src/ImageAddon.ts @@ -8,6 +8,7 @@ import type { ImageAddon as IImageApi } from '@xterm/addon-image'; import { IIPHandler } from './IIPHandler'; import { ImageRenderer } from './ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; +import { KittyGraphicsHandler } from './kitty/KittyGraphicsHandler'; import { SixelHandler } from './SixelHandler'; import { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types'; @@ -22,7 +23,9 @@ const DEFAULT_OPTIONS: IImageAddonOptions = { storageLimit: 128, showPlaceholder: true, iipSupport: true, - iipSizeLimit: 20000000 + iipSizeLimit: 20000000, + kittySupport: true, + kittySizeLimit: 20000000 }; // max palette size supported by the sixel lib (compile time setting) @@ -144,6 +147,15 @@ export class ImageAddon implements ITerminalAddon , IImageApi { terminal._core._inputHandler._parser.registerOscHandler(1337, iipHandler) ); } + + // Kitty graphics handler + if (this._opts.kittySupport) { + const kittyHandler = new KittyGraphicsHandler(this._opts, this._renderer!, this._storage!, terminal); + this._handlers.set('kitty', kittyHandler); + this._disposeLater( + terminal._core._inputHandler._parser.registerApcHandler(0x47, kittyHandler) + ); + } } // Note: storageLimit is skipped here to not intoduce a surprising side effect. diff --git a/addons/addon-image/src/Types.ts b/addons/addon-image/src/Types.ts index 60de0f3d2..480a48530 100644 --- a/addons/addon-image/src/Types.ts +++ b/addons/addon-image/src/Types.ts @@ -8,7 +8,7 @@ import { IDisposable, IMarker, Terminal } from '@xterm/xterm'; // private imports from base repo we build against import { Attributes, BgFlags, Content, ExtFlags, UnderlineStyle } from 'common/buffer/Constants'; import type { AttributeData } from 'common/buffer/AttributeData'; -import type { IParams, IDcsHandler, IOscHandler, IEscapeSequenceParser } from 'common/parser/Types'; +import type { IParams, IDcsHandler, IOscHandler, IApcHandler, IEscapeSequenceParser } from 'common/parser/Types'; import type { IBufferLine, IExtendedAttrs, IInputHandler } from 'common/Types'; import type { ITerminal, ReadonlyColorSet } from 'browser/Types'; import type { IRenderDimensions } from 'browser/renderer/shared/Types'; @@ -22,7 +22,7 @@ export const enum Cell { } // export some privates for local usage -export { AttributeData, IParams, IDcsHandler, IOscHandler, BgFlags, IRenderDimensions, IRenderService, Content, ExtFlags, Attributes, UnderlineStyle, ReadonlyColorSet }; +export { AttributeData, IParams, IDcsHandler, IOscHandler, IApcHandler, BgFlags, IRenderDimensions, IRenderService, Content, ExtFlags, Attributes, UnderlineStyle, ReadonlyColorSet }; /** * Plugin ctor options. @@ -38,6 +38,8 @@ export interface IImageAddonOptions { sixelSizeLimit: number; iipSupport: boolean; iipSizeLimit: number; + kittySupport: boolean; + kittySizeLimit: number; } export interface IResetHandler { diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts new file mode 100644 index 000000000..97ef87041 --- /dev/null +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -0,0 +1,494 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + * + * Kitty graphics protocol APC handler. + * Implements IApcHandler to integrate with xterm.js parser. + */ + +import { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt } from '../Types'; +import { ImageRenderer } from '../ImageRenderer'; +import { ImageStorage, CELL_SIZE_DEFAULT } from '../ImageStorage'; +import { + KittyAction, + KittyFormat, + KittyCompression, + IKittyCommand, + IPendingTransmission, + IKittyImageData, + BYTES_PER_PIXEL_RGB, + BYTES_PER_PIXEL_RGBA, + ALPHA_OPAQUE, + parseKittyCommand +} from './KittyGraphicsTypes'; + +/** + * Kitty graphics protocol handler. + * + * Handles APC sequences for the Kitty graphics protocol, supporting: + * - Image transmission (a=t) + * - Image transmission + display (a=T) + * - Query (a=q) + * - Delete (a=d) + * + * TODO: File transmission (t=f) is not supported since browsers cannot access the filesystem. + * Explore using the File System Access API for opt-in filesystem access when available. + */ +export class KittyGraphicsHandler implements IApcHandler, IResetHandler { + private _aborted = false; + private _data: string = ''; + + /** + * Pending chunked transmissions keyed by image ID. + * ID 0 is used for transmissions without an explicit ID (the "anonymous" transmission). + */ + private _pendingTransmissions: Map = new Map(); + private _nextImageId = 1; + + /** + * Stored images - kept for protocol compliance (transmit without display, then display later). + */ + private _images: Map = new Map(); + + /** + * Cached decoded bitmaps. + */ + private _decodedImages: Map = new Map(); + + constructor( + private readonly _opts: IImageAddonOptions, + private readonly _renderer: ImageRenderer, + private readonly _storage: ImageStorage, + private readonly _coreTerminal: ITerminalExt + ) {} + + public reset(): void { + // Clear pending transmissions + this._pendingTransmissions.clear(); + // Clear stored images + this._images.clear(); + // Close decoded bitmaps + for (const bitmap of this._decodedImages.values()) { + bitmap.close(); + } + this._decodedImages.clear(); + } + + /** + * Called at the start of a new APC sequence. + */ + public start(): void { + this._aborted = false; + this._data = ''; + } + + /** + * Called for each chunk of data in the APC sequence. + * Accumulates codepoints as a string. + */ + public put(data: Uint32Array, start: number, end: number): void { + if (this._aborted) return; + + // Check size limit + if (this._data.length + (end - start) > this._opts.kittySizeLimit) { + console.warn('[KittyHandler] Data exceeds size limit, aborting'); + this._aborted = true; + return; + } + + // Convert Uint32Array codepoints to string + // TODO: This atob + charCodeAt pattern has bad runtime. Consider using the wasm-based + // base64 decoder from xterm-wasm-parts which supports chunked data ingestion. + // For now, we accumulate as string and decode at the end. + for (let i = start; i < end; i++) { + this._data += String.fromCodePoint(data[i]); + } + } + + /** + * Called at the end of the APC sequence. + */ + public end(success: boolean): boolean | Promise { + if (this._aborted || !success) { + return true; + } + + return this._handleCommand(this._data); + } + + /** + * Handle a complete Kitty graphics command. + */ + private _handleCommand(data: string): boolean | Promise { + const semiIdx = data.indexOf(';'); + const controlData = semiIdx === -1 ? data : data.substring(0, semiIdx); + const payload = semiIdx === -1 ? '' : data.substring(semiIdx + 1); + + const cmd = parseKittyCommand(controlData); + cmd.payload = payload; + + const action = cmd.action ?? 't'; + + switch (action) { + case KittyAction.TRANSMIT: + return this._handleTransmit(cmd); + case KittyAction.TRANSMIT_DISPLAY: + return this._handleTransmitDisplay(cmd); + case KittyAction.QUERY: + return this._handleQuery(cmd); + case KittyAction.DELETE: + return this._handleDelete(cmd); + default: + return true; + } + } + + private _handleTransmit(cmd: IKittyCommand): boolean { + const payload = cmd.payload ?? ''; + const pendingKey = cmd.id ?? 0; + const isMoreComing = cmd.more === 1; + const pending = this._pendingTransmissions.get(pendingKey); + + if (pending) { + pending.data += payload; + + if (isMoreComing) { + return true; + } + + const originalCmd = pending.cmd; + const fullPayload = pending.data; + this._pendingTransmissions.delete(pendingKey); + + const id = originalCmd.id ?? this._nextImageId++; + + const image: IKittyImageData = { + id, + data: fullPayload, + width: originalCmd.width ?? 0, + height: originalCmd.height ?? 0, + format: (originalCmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, + compression: originalCmd.compression ?? '' + }; + + this._images.set(image.id, image); + + if (originalCmd.action === KittyAction.TRANSMIT_DISPLAY) { + // Fire-and-forget the display, transmit itself succeeded + void this._displayImage(image, originalCmd.columns, originalCmd.rows); + return true; + } + + cmd.id = id; + return true; + } + + if (isMoreComing) { + this._pendingTransmissions.set(pendingKey, { + cmd: { ...cmd }, + data: payload + }); + return true; + } + + const id = cmd.id ?? this._nextImageId++; + + const image: IKittyImageData = { + id, + data: payload, + width: cmd.width ?? 0, + height: cmd.height ?? 0, + format: (cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, + compression: cmd.compression ?? '' + }; + + this._images.set(image.id, image); + cmd.id = id; + return true; + } + + private _handleTransmitDisplay(cmd: IKittyCommand): boolean | Promise { + const pendingKey = cmd.id ?? 0; + const wasPendingBefore = this._pendingTransmissions.has(pendingKey); + + this._handleTransmit(cmd); + + if (cmd.more === 1) { + return true; + } + + if (wasPendingBefore) { + return true; + } + + const id = cmd.id!; + const image = this._images.get(id); + if (image) { + return this._displayImage(image, cmd.columns, cmd.rows); + } + + return true; + } + + /** + * Handle query action (a=q). + */ + private _handleQuery(cmd: IKittyCommand): boolean { + const id = cmd.id ?? 0; + const quiet = cmd.quiet ?? 0; + const payload = cmd.payload || ''; + + if (!payload) { + this._sendResponse(id, 'OK', quiet); + return true; + } + + try { + const binaryString = atob(payload); + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + const format = cmd.format || KittyFormat.RGBA; + + if (format === KittyFormat.PNG) { + this._sendResponse(id, 'OK', quiet); + } else { + const width = cmd.width || 0; + const height = cmd.height || 0; + + if (!width || !height) { + this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet); + return true; + } + + const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; + const expectedBytes = width * height * bytesPerPixel; + + if (bytes.length < expectedBytes) { + this._sendResponse(id, `EINVAL:insufficient pixel data, got ${bytes.length}, expected ${expectedBytes}`, quiet); + return true; + } + + this._sendResponse(id, 'OK', quiet); + } + } catch (e) { + const errorMsg = e instanceof Error ? e.message : 'unknown error'; + this._sendResponse(id, `EINVAL:${errorMsg}`, quiet); + } + + return true; + } + + private _handleDelete(cmd: IKittyCommand): boolean { + const id = cmd.id; + + if (id !== undefined) { + this._images.delete(id); + const bitmap = this._decodedImages.get(id); + if (bitmap) { + bitmap.close(); + this._decodedImages.delete(id); + } + } else { + this._images.clear(); + for (const bitmap of this._decodedImages.values()) { + bitmap.close(); + } + this._decodedImages.clear(); + } + + return true; + } + + /** + * Send a response back to the client. + */ + private _sendResponse(id: number, message: string, quiet: number): void { + const isOk = message === 'OK'; + if (isOk && quiet === 1) return; + if (!isOk && quiet === 2) return; + + const response = `\x1b_Gi=${id};${message}\x1b\\`; + this._coreTerminal._core.coreService.triggerDataEvent(response); + } + + /** + * Decode and display an image using the shared ImageStorage. + */ + private _displayImage(image: IKittyImageData, columns?: number, rows?: number): boolean | Promise { + return this._decodeAndDisplay(image, columns, rows) + .then(() => true) + .catch(err => { + console.warn('[KittyHandler] Failed to decode/display image:', err); + return true; + }); + } + + private async _decodeAndDisplay(image: IKittyImageData, columns?: number, rows?: number): Promise { + let bitmap = this._decodedImages.get(image.id); + + if (!bitmap) { + bitmap = await this._decodeImage(image); + this._decodedImages.set(image.id, bitmap); + } + + // Calculate display size + let w = bitmap.width; + let h = bitmap.height; + + if (columns || rows) { + const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width; + const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height; + + if (columns) { + w = columns * cw; + } + if (rows) { + h = rows * ch; + } + // Maintain aspect ratio if only one dimension specified + if (columns && !rows) { + h = Math.round(w * (bitmap.height / bitmap.width)); + } else if (rows && !columns) { + w = Math.round(h * (bitmap.width / bitmap.height)); + } + } + + // Check pixel limit + if (w * h > this._opts.pixelLimit) { + console.warn('[KittyHandler] Image exceeds pixel limit'); + return; + } + + // Use shared ImageStorage to add the image + // This handles cursor movement and integration with the terminal + if (w !== bitmap.width || h !== bitmap.height) { + // Resize if needed + const resized = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); + this._storage.addImage(resized); + } else { + this._storage.addImage(bitmap); + } + } + + /** + * Decode base64 image data into an ImageBitmap. + */ + private async _decodeImage(image: IKittyImageData): Promise { + const format = image.format; + const base64Data = image.data; + + // TODO: This atob + charCodeAt loop has bad runtime and creates memory pressure with large + // images. Consider using the wasm-based base64 decoder from xterm-wasm-parts. + const binaryString = atob(base64Data); + let bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + if (image.compression === KittyCompression.ZLIB) { + bytes = await this._decompressZlib(bytes) as Uint8Array; + } + + if (format === KittyFormat.PNG) { + const blob = new Blob([bytes], { type: 'image/png' }); + // Safari fallback pattern (from IIPHandler) + if (!window.createImageBitmap) { + const url = URL.createObjectURL(blob); + const img = new Image(); + return new Promise((resolve, reject) => { + img.addEventListener('load', () => { + URL.revokeObjectURL(url); + const canvas = ImageRenderer.createCanvas(window.document, img.width, img.height); + canvas.getContext('2d')?.drawImage(img, 0, 0); + createImageBitmap(canvas).then(resolve).catch(reject); + }); + img.addEventListener('error', reject); + img.src = url; + }); + } + return createImageBitmap(blob); + } + + // Raw pixel data (RGB or RGBA) + const width = image.width; + const height = image.height; + + if (!width || !height) { + throw new Error('Width and height required for raw pixel data'); + } + + const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; + const expectedBytes = width * height * bytesPerPixel; + + if (bytes.length < expectedBytes) { + throw new Error(`Insufficient pixel data: got ${bytes.length}, expected ${expectedBytes}`); + } + + // Convert to RGBA ImageData + // TODO: For RGBA, use bytes directly. For RGB, use Uint32Array bit manipulation + // for 5-6x speedup. + const pixelCount = width * height; + const data = new Uint8ClampedArray(pixelCount * BYTES_PER_PIXEL_RGBA); + const isRgba = format === KittyFormat.RGBA; + + let srcOffset = 0; + let dstOffset = 0; + for (let i = 0; i < pixelCount; i++) { + data[dstOffset ] = bytes[srcOffset ]; // R + data[dstOffset + 1] = bytes[srcOffset + 1]; // G + data[dstOffset + 2] = bytes[srcOffset + 2]; // B + data[dstOffset + 3] = isRgba ? bytes[srcOffset + 3] : ALPHA_OPAQUE; + srcOffset += bytesPerPixel; + dstOffset += BYTES_PER_PIXEL_RGBA; + } + + return createImageBitmap(new ImageData(data, width, height)); + } + + /** + * Decompress zlib/deflate compressed data using the browser's DecompressionStream API. + */ + private async _decompressZlib(compressed: Uint8Array): Promise { + try { + return await this._decompress(compressed, 'deflate'); + } catch { + return await this._decompress(compressed, 'deflate-raw'); + } + } + + private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise { + const ds = new DecompressionStream(format); + const writer = ds.writable.getWriter(); + writer.write(new Uint8Array(compressed) as Uint8Array); + writer.close(); + + const chunks: Uint8Array[] = []; + const reader = ds.readable.getReader(); + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + chunks.push(value); + } + + const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0); + const result = new Uint8Array(totalLength); + let offset = 0; + for (const chunk of chunks) { + result.set(chunk, offset); + offset += chunk.length; + } + + return result; + } + + /** + * Get stored images (for testing/debugging). + */ + public get images(): ReadonlyMap { + return this._images; + } +} diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts new file mode 100644 index 000000000..1bbfac675 --- /dev/null +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + */ +import { assert } from 'chai'; +import { parseKittyCommand, KittyAction, KittyFormat } from './KittyGraphicsTypes'; + +describe('KittyGraphicsTypes', () => { + describe('parseKittyCommand', () => { + it('should parse control data with action and format', () => { + const cmd = parseKittyCommand('a=T,f=100'); + assert.strictEqual(cmd.action, 'T'); + assert.strictEqual(cmd.format, 100); + }); + + it('should parse control data with all options', () => { + const cmd = parseKittyCommand('a=t,f=32,i=5,s=10,v=20,c=3,r=2,m=1,q=2'); + assert.strictEqual(cmd.action, 't'); + assert.strictEqual(cmd.format, 32); + assert.strictEqual(cmd.id, 5); + assert.strictEqual(cmd.width, 10); + assert.strictEqual(cmd.height, 20); + assert.strictEqual(cmd.columns, 3); + assert.strictEqual(cmd.rows, 2); + assert.strictEqual(cmd.more, 1); + assert.strictEqual(cmd.quiet, 2); + }); + + it('should handle empty control data', () => { + const cmd = parseKittyCommand(''); + assert.strictEqual(cmd.action, undefined); + assert.strictEqual(cmd.format, undefined); + }); + + it('should parse transmit action', () => { + const cmd = parseKittyCommand('a=t,f=100'); + assert.strictEqual(cmd.action, KittyAction.TRANSMIT); + assert.strictEqual(cmd.format, KittyFormat.PNG); + }); + + it('should parse delete action', () => { + const cmd = parseKittyCommand('a=d,i=5'); + assert.strictEqual(cmd.action, KittyAction.DELETE); + assert.strictEqual(cmd.id, 5); + }); + + it('should parse empty action as empty string', () => { + const cmd = parseKittyCommand('a=,f=100'); + assert.strictEqual(cmd.action, ''); + assert.strictEqual(cmd.format, 100); + }); + + it('should leave action undefined when key is not present', () => { + const cmd = parseKittyCommand('f=100,i=5'); + assert.strictEqual(cmd.action, undefined); + assert.strictEqual(cmd.format, 100); + assert.strictEqual(cmd.id, 5); + }); + + it('should parse compression key', () => { + const cmd = parseKittyCommand('a=t,f=32,o=z'); + assert.strictEqual(cmd.action, 't'); + assert.strictEqual(cmd.format, 32); + assert.strictEqual(cmd.compression, 'z'); + }); + + it('should parse x and y offset', () => { + const cmd = parseKittyCommand('a=T,x=10,y=20'); + assert.strictEqual(cmd.x, 10); + assert.strictEqual(cmd.y, 20); + }); + + it('should handle keys without values', () => { + const cmd = parseKittyCommand('a=t,f=,i=5'); + assert.strictEqual(cmd.action, 't'); + assert.ok(isNaN(cmd.format!)); + assert.strictEqual(cmd.id, 5); + }); + }); +}); diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts new file mode 100644 index 000000000..7afb5b3ba --- /dev/null +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -0,0 +1,156 @@ +/** + * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * @license MIT + * + * Kitty graphics protocol types, constants, and parsing utilities. + */ + +/** + * Kitty graphics protocol action types. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'. + */ +export const enum KittyAction { + TRANSMIT = 't', + TRANSMIT_DISPLAY = 'T', + QUERY = 'q', + PLACEMENT = 'p', + DELETE = 'd' +} + +/** + * Kitty graphics protocol format types. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference + */ +export const enum KittyFormat { + RGB = 24, + RGBA = 32, + PNG = 100 +} + +/** + * Kitty graphics protocol compression types. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'. + */ +export const enum KittyCompression { + NONE = '', + ZLIB = 'z' +} + +/** + * Kitty graphics protocol control data keys. + * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference + */ +export const enum KittyKey { + // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete) + ACTION = 'a', + // Image format (24=RGB, 32=RGBA, 100=PNG) + FORMAT = 'f', + // Image ID for referencing stored images + ID = 'i', + // Source image width in pixels + WIDTH = 's', + // Source image height in pixels + HEIGHT = 'v', + // The left edge (in pixels) of the image area to display + X_OFFSET = 'x', + // The top edge (in pixels) of the image area to display + Y_OFFSET = 'y', + // Number of terminal columns to display the image over + COLUMNS = 'c', + // Number of terminal rows to display the image over + ROWS = 'r', + // More data flag (1=more chunks coming, 0=final chunk) + MORE = 'm', + // Compression type (z=zlib). This is essential for chunking larger images. + COMPRESSION = 'o', + // Quiet mode (1=suppress OK responses, 2=suppress error responses) + QUIET = 'q' +} + +// Pixel format constants +export const BYTES_PER_PIXEL_RGB = 3; +export const BYTES_PER_PIXEL_RGBA = 4; +export const ALPHA_OPAQUE = 255; + +/** + * Parsed Kitty graphics command. + */ +export interface IKittyCommand { + action?: string; + format?: number; + id?: number; + width?: number; + height?: number; + x?: number; + y?: number; + columns?: number; + rows?: number; + more?: number; + quiet?: number; + compression?: string; + payload?: string; +} + +/** + * Pending chunked transmission state. + * Stores metadata from the first chunk while accumulating payload data. + */ +export interface IPendingTransmission { + /** The parsed command from the first chunk (contains action, format, dimensions, etc.) */ + cmd: IKittyCommand; + /** Accumulated base64 payload data */ + data: string; +} + +/** + * Stored Kitty image data. + */ +export interface IKittyImageData { + id: number; + data: string; + width: number; + height: number; + format: 24 | 32 | 100; + compression?: string; +} + +/** + * Parses Kitty graphics control data into a command object. + */ +export function parseKittyCommand(data: string): IKittyCommand { + const cmd: IKittyCommand = {}; + const parts = data.split(','); + + for (const part of parts) { + const eqIdx = part.indexOf('='); + if (eqIdx === -1) continue; + + const key = part.substring(0, eqIdx); + const value = part.substring(eqIdx + 1); + + // Handle string keys first + if (key === KittyKey.ACTION) { + cmd.action = value; + continue; + } + if (key === KittyKey.COMPRESSION) { + cmd.compression = value; + continue; + } + const numValue = parseInt(value); + switch (key) { + case KittyKey.FORMAT: cmd.format = numValue; break; + case KittyKey.ID: cmd.id = numValue; break; + case KittyKey.WIDTH: cmd.width = numValue; break; + case KittyKey.HEIGHT: cmd.height = numValue; break; + case KittyKey.X_OFFSET: cmd.x = numValue; break; + case KittyKey.Y_OFFSET: cmd.y = numValue; break; + case KittyKey.COLUMNS: cmd.columns = numValue; break; + case KittyKey.ROWS: cmd.rows = numValue; break; + case KittyKey.MORE: cmd.more = numValue; break; + case KittyKey.QUIET: cmd.quiet = numValue; break; + } + } + + return cmd; +} diff --git a/addons/addon-image/test/ImageAddon.test.ts b/addons/addon-image/test/ImageAddon.test.ts index a26ba0f48..a7bb25434 100644 --- a/addons/addon-image/test/ImageAddon.test.ts +++ b/addons/addon-image/test/ImageAddon.test.ts @@ -23,6 +23,8 @@ export interface IImageAddonOptions { sixelSizeLimit: number; iipSupport: boolean; iipSizeLimit: number; + kittySupport: boolean; + kittySizeLimit: number; } // eslint-disable-next-line @@ -73,6 +75,10 @@ const TESTDATA_IIP: [string, [number, number]][] = [ [readFileSync('./addons/addon-image/fixture/iip/w3c_png.iip', { encoding: 'utf-8' }), [72, 48]] ]; +// Kitty graphics test images +const KITTY_BLACK_1X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png').toString('base64'); +const KITTY_RGB_3X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/rgb-3x1.png').toString('base64'); + let ctx: ITestContext; test.beforeAll(async ({ browser }) => { ctx = await createTestContext(browser); @@ -134,7 +140,9 @@ test.describe('ImageAddon', () => { storageLimit: 128, showPlaceholder: true, iipSupport: true, - iipSizeLimit: 20000000 + iipSizeLimit: 20000000, + kittySupport: true, + kittySizeLimit: 20000000 }; deepStrictEqual(await ctx.page.evaluate(`window.imageAddon._opts`), DEFAULT_OPTIONS); }); @@ -149,7 +157,9 @@ test.describe('ImageAddon', () => { storageLimit: 10, showPlaceholder: false, iipSupport: false, - iipSizeLimit: 1000 + iipSizeLimit: 1000, + kittySupport: false, + kittySizeLimit: 1000 }; await ctx.page.evaluate(opts => { (window as any).imageAddonCustom = new ImageAddon(opts.opts); @@ -294,6 +304,247 @@ test.describe('ImageAddon', () => { deepStrictEqual(await getOrigSize(1), TESTDATA_IIP[4][1]); }); }); + + test.describe('Kitty graphics support', () => { + test('stores 1x1 black PNG with a=T (transmit and display)', async () => { + const seq = `\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [1, 1]); + }); + + test('stores 3x1 RGB PNG with a=T', async () => { + const seq = `\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [3, 1]); + }); + + test('transmit only (a=t) does not display but stores in handler', async () => { + const seq = `\x1b_Ga=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + }); + + test('uses specified image ID', async () => { + const seq = `\x1b_Ga=t,f=100,i=42;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(42)`), true); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(1)`), false); + }); + + test('assigns auto-incrementing IDs when not specified', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(1)`), true); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(2)`), true); + }); + + test('defaults to transmit action when action is omitted', async () => { + const seq = `\x1b_Gf=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + }); + + test('ignores command when action is empty string', async () => { + const seq = `\x1b_Ga=,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); + }); + + test('handles chunked transmission (m=1)', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + const seq1 = `\x1b_Ga=T,f=100,i=99,m=1;${part1}\x1b\\`; + const seq2 = `\x1b_Ga=T,f=100,i=99;${part2}\x1b\\`; + + await ctx.proxy.write(seq1); + await timeout(50); + strictEqual(await getImageStorageLength(), 0); + + await ctx.proxy.write(seq2); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + }); + + test('verifies chunked data is assembled correctly', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=99,m=1;${part1}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=99;${part2}\x1b\\`); + await timeout(100); + + const storedData = await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.get(99).data`); + strictEqual(storedData, KITTY_BLACK_1X1_BASE64); + }); + + test('delete command (a=d) removes specific image by id', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=10;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + + await ctx.proxy.write(`\x1b_Ga=d,i=10\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); + }); + + test('delete command (a=d) removes all images when no id specified', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=2;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); + + await ctx.proxy.write(`\x1b_Ga=d\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); + }); + }); + + test.describe('Kitty query support (a=q)', () => { + test('responds with OK for capability query without payload', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write('\x1b_Gi=31,a=q;\x1b\\'); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=31;OK\x1b\\'); + }); + + test('responds with OK for valid PNG query', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=42,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=42;OK\x1b\\'); + }); + + test('query does NOT store the image (unlike transmit)', async () => { + await ctx.page.evaluate(() => { + (window as any).term.onData(() => { /* consume response */ }); + }); + + await ctx.proxy.write(`\x1b_Gi=50,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(50)`), false); + }); + + test('responds with error for invalid base64', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write('\x1b_Gi=60,a=q,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=60;EINVAL:'), true); + }); + + test('responds with error for RGB data without dimensions', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write('\x1b_Gi=70,a=q,f=24;AAAA\x1b\\'); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=70;EINVAL:width and height required for raw pixel data\x1b\\'); + }); + + test('suppresses OK response when q=1', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write(`\x1b_Gi=80,a=q,q=1,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + + test('suppresses error response when q=2', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write('\x1b_Gi=90,a=q,q=2,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + }); + + test.describe('Kitty pixel verification', () => { + test('renders 1x1 black PNG at cursor position', async () => { + const seq = `\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + + const pixel = await ctx.page.evaluate(() => { + const canvas = (window as any).imageAddon.getImageAtBufferCell(0, 0); + if (!canvas) return null; + const ctx = canvas.getContext('2d'); + if (!ctx) return null; + return Array.from(ctx.getImageData(0, 0, 1, 1).data); + }); + + deepStrictEqual(pixel, [0, 0, 0, 255]); + }); + + test('renders 3x1 RGB PNG (red, green, blue pixels)', async () => { + const seq = `\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + + const pixels = await ctx.page.evaluate(() => { + const canvas = (window as any).imageAddon.getImageAtBufferCell(0, 0); + if (!canvas) return null; + const ctx = canvas.getContext('2d'); + if (!ctx) return null; + const imageData = ctx.getImageData(0, 0, 3, 1).data; + return { + red: Array.from(imageData.slice(0, 4)), + green: Array.from(imageData.slice(4, 8)), + blue: Array.from(imageData.slice(8, 12)) + }; + }); + + deepStrictEqual(pixels?.red, [255, 0, 0, 255]); + deepStrictEqual(pixels?.green, [0, 255, 0, 255]); + deepStrictEqual(pixels?.blue, [0, 0, 255, 255]); + }); + }); }); /** diff --git a/addons/addon-image/typings/addon-image.d.ts b/addons/addon-image/typings/addon-image.d.ts index 48ba488cf..856063e3e 100644 --- a/addons/addon-image/typings/addon-image.d.ts +++ b/addons/addon-image/typings/addon-image.d.ts @@ -76,6 +76,15 @@ declare module '@xterm/addon-image' { iipSupport?: boolean; /** IIP sequence size limit (default 20000000 bytes). */ iipSizeLimit?: number; + + /** + * Kitty graphics protocol settings + */ + + /** Whether Kitty graphics protocol is enabled (default is true). */ + kittySupport?: boolean; + /** Kitty image size limit in bytes (default 20000000 bytes). */ + kittySizeLimit?: number; } export class ImageAddon implements ITerminalAddon { diff --git a/addons/addon-kitty-graphics/LICENSE b/addons/addon-kitty-graphics/LICENSE deleted file mode 100644 index a6db9edcf..000000000 --- a/addons/addon-kitty-graphics/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2025, The xterm.js authors (https://github.com/xtermjs/xterm.js) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/addons/addon-kitty-graphics/README.md b/addons/addon-kitty-graphics/README.md deleted file mode 100644 index 650f84e03..000000000 --- a/addons/addon-kitty-graphics/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# @xterm/addon-kitty-graphics - -An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that adds support for the [Kitty graphics protocol](https://sw.kovidgoyal.net/kitty/graphics-protocol/). - -## Install - -```bash -npm install --save @xterm/addon-kitty-graphics @xterm/xterm -``` - -## Usage - -```typescript -import { Terminal } from '@xterm/xterm'; -import { KittyGraphicsAddon } from '@xterm/addon-kitty-graphics'; - -const terminal = new Terminal(); -const kittyGraphicsAddon = new KittyGraphicsAddon(); -terminal.loadAddon(kittyGraphicsAddon); -``` - -## Features - -This addon implements the Kitty graphics protocol, allowing applications to display images directly in the terminal using APC (Application Program Command) escape sequences. - -### Supported Features - -- PNG image transmission (f=100) -- Direct RGB/RGBA pixel data (f=24, f=32) -- Image placement at cursor position -- Basic query support (a=q) - -### Protocol Format - -The Kitty graphics protocol uses APC escape sequences: - -``` -_G=,=,...;\ -``` - -Key parameters: -- `a`: Action (t=transmit, T=transmit+display, q=query) -- `f`: Format (100=PNG, 24=RGB, 32=RGBA) -- `i`: Image ID -- `m`: More data follows (1=yes, 0=no) - -See the [Kitty graphics protocol documentation](https://sw.kovidgoyal.net/kitty/graphics-protocol/) for full details. diff --git a/addons/addon-kitty-graphics/package.json b/addons/addon-kitty-graphics/package.json deleted file mode 100644 index 5bb560e7e..000000000 --- a/addons/addon-kitty-graphics/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "@xterm/addon-kitty-graphics", - "version": "0.1.0", - "author": { - "name": "The xterm.js authors", - "url": "https://xtermjs.org/" - }, - "main": "lib/addon-kitty-graphics.js", - "module": "lib/addon-kitty-graphics.mjs", - "types": "typings/addon-kitty-graphics.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-kitty-graphics", - "license": "MIT", - "keywords": [ - "terminal", - "xterm", - "xterm.js", - "kitty", - "graphics" - ], - "scripts": { - "build": "../../node_modules/.bin/tsc -p .", - "prepackage": "npm run build", - "package": "../../node_modules/.bin/webpack", - "prepublishOnly": "npm run package", - "start": "node ../../demo/start" - } -} diff --git a/addons/addon-kitty-graphics/src/19616.jpg b/addons/addon-kitty-graphics/src/19616.jpg deleted file mode 100644 index fc521acec4af03f32eb187fc4163e3b0f853d4e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 960364 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
%JPL7?P!mV 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¨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�b*gSbx80vu`*fOgJJQvv2Md`xB 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

AIbDl*ns_P)lI-z5}@@UF$3BV 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 z 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%0A*Ccb#Qxot6WJLD@z;%Lt; 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

b>P_!UARCG!r?S-?+9!He&Blt;WRD5V6 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

^mnAy~Z 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 diff --git a/addons/addon-kitty-graphics/src/KittyApcHandler.ts b/addons/addon-kitty-graphics/src/KittyApcHandler.ts deleted file mode 100644 index b622556c1..000000000 --- a/addons/addon-kitty-graphics/src/KittyApcHandler.ts +++ /dev/null @@ -1,618 +0,0 @@ -/** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. - * @license MIT - * - * Kitty graphics protocol types, constants, parsing, and APC handler. - */ - -import type { IKittyImage } from '@xterm/addon-kitty-graphics'; - -/** - * Kitty graphics protocol action types. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'. - */ -export const enum KittyAction { - TRANSMIT = 't', - TRANSMIT_DISPLAY = 'T', - QUERY = 'q', - PLACEMENT = 'p', - DELETE = 'd' -} - -/** - * Kitty graphics protocol format types. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference where the format for *-bit came from. - */ -export const enum KittyFormat { - RGB = 24, - RGBA = 32, - PNG = 100 -} - -/** - * Kitty graphics protocol compression types. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'. - */ -export const enum KittyCompression { - NONE = '', - ZLIB = 'z' -} - -/** - * Kitty graphics protocol control data keys. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference - */ -export const enum KittyKey { - // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete) - ACTION = 'a', - // Image format (24=RGB, 32=RGBA, 100=PNG) - FORMAT = 'f', - // Image ID for referencing stored images - ID = 'i', - // Source image width in pixels - WIDTH = 's', - // Source image height in pixels - HEIGHT = 'v', - // The left edge (in pixels) of the image area to display - X_OFFSET = 'x', - // The top edge (in pixels) of the image area to display - Y_OFFSET = 'y', - // Number of terminal columns to display the image over - COLUMNS = 'c', - // Number of terminal rows to display the image over - ROWS = 'r', - // More data flag (1=more chunks coming, 0=final chunk) - MORE = 'm', - // Compression type (z=zlib). This is essential for chunking larger images. - COMPRESSION = 'o', - // Quiet mode (1=suppress OK responses, 2=suppress error responses) - QUIET = 'q' -} - -// Pixel format constants -export const BYTES_PER_PIXEL_RGB = 3; -export const BYTES_PER_PIXEL_RGBA = 4; -export const ALPHA_OPAQUE = 255; - -/** - * Parsed Kitty graphics command. - */ -export interface IKittyCommand { - action?: string; - format?: number; - id?: number; - width?: number; - height?: number; - x?: number; - y?: number; - columns?: number; - rows?: number; - more?: number; - quiet?: number; - compression?: string; - payload?: string; -} - -/** - * Pending chunked transmission state. - * Stores metadata from the first chunk while accumulating payload data. - */ -interface IPendingTransmission { - /** The parsed command from the first chunk (contains action, format, dimensions, etc.) */ - cmd: IKittyCommand; - /** Accumulated base64 payload data */ - data: string; -} - -/** - * Terminal interface for sending responses. - * Question from Anthony: Do we really need this... - */ -interface ITerminal { - input(data: string, wasUserInput: boolean): void; -} - -/** - * Renderer interface for image display. - */ -interface IKittyRenderer { - getCellSize(): { width: number, height: number }; - placeImage(bitmap: ImageBitmap, id: number, col?: number, row?: number, width?: number, height?: number): number; - removeByImageId(id: number): void; - clearAll(): void; -} - -/** - * Parses Kitty graphics control data into a command object. - */ -export function parseKittyCommand(data: string): IKittyCommand { - const cmd: IKittyCommand = {}; - const parts = data.split(','); - - for (const part of parts) { - const eqIdx = part.indexOf('='); - if (eqIdx === -1) continue; - - const key = part.substring(0, eqIdx); - const value = part.substring(eqIdx + 1); - - // Handle string keys first - if (key === KittyKey.ACTION) { - cmd.action = value; - continue; - } - if (key === KittyKey.COMPRESSION) { - cmd.compression = value; - continue; - } - const numValue = parseInt(value); - switch (key) { - case KittyKey.FORMAT: cmd.format = numValue; break; - case KittyKey.ID: cmd.id = numValue; break; - case KittyKey.WIDTH: cmd.width = numValue; break; - case KittyKey.HEIGHT: cmd.height = numValue; break; - case KittyKey.X_OFFSET: cmd.x = numValue; break; - case KittyKey.Y_OFFSET: cmd.y = numValue; break; - case KittyKey.COLUMNS: cmd.columns = numValue; break; - case KittyKey.ROWS: cmd.rows = numValue; break; - case KittyKey.MORE: cmd.more = numValue; break; - case KittyKey.QUIET: cmd.quiet = numValue; break; - } - } - - return cmd; -} - -/** - * Handles Kitty graphics protocol APC sequences. - * Manages parsing, chunked transmissions, and dispatching to action handlers. - * - * TODO: Go over this with Daniel: Like SixelHandler, this receives direct references to storage - * and terminal rather than using callbacks. - * - * TODO: File transmission (t=f) is not supported since browsers cannot access the filesystem. - * Maybe we need something from VS Code? - */ -export class KittyApcHandler { - /** - * Pending chunked transmissions keyed by image ID. - * ID 0 is used for transmissions without an explicit ID (the "anonymous" transmission). - */ - private _pendingTransmissions: Map = new Map(); - private _nextImageId = 1; - - constructor( - private readonly _images: Map, - private readonly _decodedImages: Map, - private readonly _renderer: IKittyRenderer | undefined, - private readonly _terminal: ITerminal | undefined, - private readonly _debug: boolean = false - ) {} - - /** - * Handle a Kitty graphics APC sequence. - * @param data - The data portion of the APC sequence (after 'G') - * @returns true if handled successfully - */ - public handle(data: string): boolean { - const semiIdx = data.indexOf(';'); - const controlData = semiIdx === -1 ? data : data.substring(0, semiIdx); - const payload = semiIdx === -1 ? '' : data.substring(semiIdx + 1); - - const cmd = parseKittyCommand(controlData); - cmd.payload = payload; - - if (this._debug) { - console.log('[KittyApcHandler] Received command:', cmd); - } - - const action = cmd.action ?? 't'; - - switch (action) { - case KittyAction.TRANSMIT: - return this._handleTransmit(cmd); - case KittyAction.TRANSMIT_DISPLAY: - return this._handleTransmitDisplay(cmd); - case KittyAction.QUERY: - return this._handleQuery(cmd); - case KittyAction.DELETE: - return this._handleDelete(cmd); - default: - return true; - } - } - - /** - * Clear all pending transmissions. Called on dispose. - */ - public clearPendingTransmissions(): void { - this._pendingTransmissions.clear(); - } - - private _handleTransmit(cmd: IKittyCommand): boolean { - const payload = cmd.payload ?? ''; - const pendingKey = cmd.id ?? 0; - - // larger image would require chunking. - const isMoreComing = cmd.more === 1; - const pending = this._pendingTransmissions.get(pendingKey); - - if (pending) { - pending.data += payload; - - if (this._debug) { - console.log(`[KittyApcHandler] Chunk continuation for id=${pendingKey}, total size=${pending.data.length}, more=${isMoreComing}`); - } - - if (isMoreComing) { - return true; - } - - const originalCmd = pending.cmd; - const fullPayload = pending.data; - this._pendingTransmissions.delete(pendingKey); - - const id = originalCmd.id ?? this._nextImageId++; - - const image: IKittyImage = { - id, - data: fullPayload, - width: originalCmd.width ?? 0, - height: originalCmd.height ?? 0, - format: (originalCmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, - compression: originalCmd.compression ?? '' - }; - - this._images.set(image.id, image); - - if (this._debug) { - console.log(`[KittyApcHandler] Stored chunked image ${id}, payload size=${fullPayload.length}`); - } - - if (originalCmd.action === KittyAction.TRANSMIT_DISPLAY) { - this._displayImage(image, originalCmd.columns, originalCmd.rows); - } - - cmd.id = id; - return true; - } - - if (isMoreComing) { - this._pendingTransmissions.set(pendingKey, { - cmd: { ...cmd }, - data: payload - }); - - if (this._debug) { - console.log(`[KittyApcHandler] Started chunked transmission, id=${pendingKey}, format=${cmd.format}, compression=${cmd.compression}, size=${cmd.width}x${cmd.height}, initial payload=${payload.length}`); - } - - return true; - } - - const id = cmd.id ?? this._nextImageId++; - - const image: IKittyImage = { - id, - data: payload, - width: cmd.width ?? 0, - height: cmd.height ?? 0, - format: (cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, - compression: cmd.compression ?? '' - }; - - this._images.set(image.id, image); - - if (this._debug) { - console.log(`[KittyApcHandler] Stored image ${id}`); - } - - cmd.id = id; - return true; - } - - private _handleTransmitDisplay(cmd: IKittyCommand): boolean { - const pendingKey = cmd.id ?? 0; - const wasPendingBefore = this._pendingTransmissions.has(pendingKey); - - this._handleTransmit(cmd); - - if (cmd.more === 1) { - return true; - } - - if (wasPendingBefore) { - return true; - } - - const id = cmd.id!; - const image = this._images.get(id); - if (image) { - this._displayImage(image, cmd.columns, cmd.rows); - } - - return true; - } - - /** - * Handle query action (a=q). - * - * Per the Kitty graphics protocol documentation: - * "Sometimes, using an id is not appropriate... In that case, you can use the - * query action, set a=q. Then the terminal emulator will try to load the image - * and respond with either OK or an error, as above, but it will not replace an - * existing image with the same id, nor will it store the image." - */ - private _handleQuery(cmd: IKittyCommand): boolean { - const id = cmd.id ?? 0; - const quiet = cmd.quiet ?? 0; - - if (this._debug) { - console.log(`[KittyApcHandler] Query received, id=${id}, quiet=${quiet}`); - } - - const payload = cmd.payload || ''; - - if (!payload) { - this._sendResponse(id, 'OK', quiet); - return true; - } - - try { - const binaryString = atob(payload); - const bytes = new Uint8Array(binaryString.length); - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - const format = cmd.format || KittyFormat.RGBA; - - if (format === KittyFormat.PNG) { - this._sendResponse(id, 'OK', quiet); - } else { - const width = cmd.width || 0; - const height = cmd.height || 0; - - if (!width || !height) { - this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet); - return true; - } - - const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; - const expectedBytes = width * height * bytesPerPixel; - - if (bytes.length < expectedBytes) { - this._sendResponse(id, `EINVAL:insufficient pixel data, got ${bytes.length}, expected ${expectedBytes}`, quiet); - return true; - } - - this._sendResponse(id, 'OK', quiet); - } - } catch (e) { - const errorMsg = e instanceof Error ? e.message : 'unknown error'; - this._sendResponse(id, `EINVAL:${errorMsg}`, quiet); - } - - return true; - } - - private _handleDelete(cmd: IKittyCommand): boolean { - const id = cmd.id; - - if (id !== undefined) { - this._images.delete(id); - // Close and remove decoded bitmap - const bitmap = this._decodedImages.get(id); - if (bitmap) { - bitmap.close(); - this._decodedImages.delete(id); - } - // Remove from renderer - this._renderer?.removeByImageId(id); - } else { - this._images.clear(); - // Close all decoded bitmaps - for (const bitmap of this._decodedImages.values()) { - bitmap.close(); - } - this._decodedImages.clear(); - // Clear all from renderer - this._renderer?.clearAll(); - } - - return true; - } - - /** - * Send a response back to the client via the terminal's input method. - */ - private _sendResponse(id: number, message: string, quiet: number): void { - const isOk = message === 'OK'; - if (isOk && quiet === 1) { - return; - } - if (!isOk && quiet === 2) { - return; - } - - if (!this._terminal) { - return; - } - - const response = `\x1b_Gi=${id};${message}\x1b\\`; - this._terminal.input(response, false); - - if (this._debug) { - console.log(`[KittyApcHandler] Sent response: i=${id};${message}`); - } - } - - /** - * Decode and display an image at the cursor position. - */ - private _displayImage(image: IKittyImage, columns?: number, rows?: number): void { - if (!this._renderer) { - return; - } - - const storedImage = this._images.get(image.id); - if (!storedImage) { - if (this._debug) { - console.log(`[KittyApcHandler] No image found for id=${image.id} after transmit`); - } - return; - } - - this._decodeAndDisplay(storedImage, columns, rows).catch(err => { - if (this._debug) { - console.error(`[KittyApcHandler] Failed to decode/display image ${image.id}:`, err); - } - }); - } - - /** - * Decode an image and display it at the cursor position. - */ - private async _decodeAndDisplay(image: IKittyImage, columns?: number, rows?: number): Promise { - if (!this._renderer) { - return; - } - - let bitmap = this._decodedImages.get(image.id); - - if (!bitmap) { - bitmap = await this._decodeImage(image); - this._decodedImages.set(image.id, bitmap); - - if (this._debug) { - console.log(`[KittyApcHandler] Decoded image ${image.id}: ${bitmap.width}x${bitmap.height}`); - } - } - - let width = 0; - let height = 0; - if (columns || rows) { - const cellSize = this._renderer.getCellSize(); - if (columns) { - width = columns * cellSize.width; - } - if (rows) { - height = rows * cellSize.height; - } - if (width && !height) { - height = Math.round(width * (bitmap.height / bitmap.width)); - } else if (height && !width) { - width = Math.round(height * (bitmap.width / bitmap.height)); - } - } - - this._renderer.placeImage(bitmap, image.id, undefined, undefined, width, height); - - if (this._debug) { - console.log(`[KittyApcHandler] Placed image ${image.id} at cursor, size: ${width || bitmap.width}x${height || bitmap.height}`); - } - } - - /** - * Decode base64 image data into an ImageBitmap. - */ - private async _decodeImage(image: IKittyImage): Promise { - const format = image.format; - const base64Data = image.data as string; - - // TODO: This atob + charCodeAt loop has bad runtime and creates memory pressure with large - // images. Consider using the wasm-based base64 decoder from xterm-wasm-parts which also - // supports chunked data ingestion. See addon-image/src/IIPHandler.ts for chunked usage. - const binaryString = atob(base64Data); - let bytes = new Uint8Array(binaryString.length); - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - if (image.compression === KittyCompression.ZLIB) { - bytes = await this._decompressZlib(bytes); - if (this._debug) { - console.log(`[KittyApcHandler] Decompressed ${binaryString.length} -> ${bytes.length} bytes`); - } - } - - if (format === KittyFormat.PNG) { - // TODO: Older Safari versions cannot createImageBitmap from Blob and need a workaround - // with new Image() instead. See IIPHandler for the Safari fallback pattern. - // ---> Things seem to work for my safari, but still try to see how I can verify. - const blob = new Blob([bytes], { type: 'image/png' }); - return createImageBitmap(blob); - } - - const width = image.width; - const height = image.height; - - if (!width || !height) { - throw new Error('Width and height required for raw pixel data'); - } - - const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; - const expectedBytes = width * height * bytesPerPixel; - - if (bytes.length < expectedBytes) { - throw new Error(`Insufficient pixel data: got ${bytes.length}, expected ${expectedBytes}`); - } - - // Convert to RGBA ImageData - // TODO: Get this checked by Daniel. - // TODO: Follow Jerch's feedback! - const pixelCount = width * height; - const data = new Uint8ClampedArray(pixelCount * BYTES_PER_PIXEL_RGBA); - const isRgba = format === KittyFormat.RGBA; - - let srcOffset = 0; - let dstOffset = 0; - for (let i = 0; i < pixelCount; i++) { - data[dstOffset ] = bytes[srcOffset ]; // R - data[dstOffset + 1] = bytes[srcOffset + 1]; // G - data[dstOffset + 2] = bytes[srcOffset + 2]; // B - data[dstOffset + 3] = isRgba ? bytes[srcOffset + 3] : ALPHA_OPAQUE; - srcOffset += bytesPerPixel; - dstOffset += BYTES_PER_PIXEL_RGBA; - } - - return createImageBitmap(new ImageData(data, width, height)); - } - - /** - * Decompress zlib/deflate compressed data using the browser's DecompressionStream API. - */ - private async _decompressZlib(compressed: Uint8Array): Promise { - try { - return await this._decompress(compressed, 'deflate'); - } catch { - return await this._decompress(compressed, 'deflate-raw'); - } - } - - private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise { - const ds = new DecompressionStream(format); - const writer = ds.writable.getWriter(); - writer.write(compressed); - writer.close(); - - const chunks: Uint8Array[] = []; - const reader = ds.readable.getReader(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - chunks.push(value); - } - - const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0); - const result = new Uint8Array(totalLength); - let offset = 0; - for (const chunk of chunks) { - result.set(chunk, offset); - offset += chunk.length; - } - - return result; - } -} diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts deleted file mode 100644 index eb7214261..000000000 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.test.ts +++ /dev/null @@ -1,188 +0,0 @@ -/** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. - * @license MIT - */ -import { assert } from 'chai'; -import { Terminal } from 'browser/public/Terminal'; -import { KittyGraphicsAddon } from './KittyGraphicsAddon'; -import { parseKittyCommand } from './KittyApcHandler'; - -/** - * Write data to terminal and wait for completion. - */ -function writeP(terminal: Terminal, data: string | Uint8Array): Promise { - return new Promise(r => terminal.write(data, r)); -} - -// Test image: 1x1 black PNG (captured from `send-png fixture/black-1x1.png`) -// Get the below base64-encoded PNG file by: `python3 send-png addons/addon-kitty-graphics/fixture/black-1x1.png` -const BLACK_1X1_BASE64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAA1BMVEUAAACnej3aAAAACklEQVR4nGNgAAAAAgABSK+kcQAAAAt0RVh0Q29tbWVudAAA1LTqjgAAAApJREFUeJxjYAAAAGQA2AAAAAt0RVh0Q29tbWVudAAA1LTqjg5JREFUAAAAASUVORK5CYII='; - -// Test image: 3x1 RGB PNG (red, green, blue pixels) -const RGB_3X1_BASE64 = 'iVBORw0KGgoAAAANSUhEUgAAAAMAAAABCAMAAAAsPuSGAAAACVBMVEX/AAAA/wAAAP8tSs2KAAAADElEQVR4nGNgYGQCAAAIAAQ24LCmAAAAHXRFWHRTb2Z0d2FyZQBAbHVuYXBhaW50L3BuZy1jb2RlY/VDGR4AAAAASUVORK5CYII='; - -// Currently tests the flow: write escape sequence -> addon stores image. -// Pixel-level verification of rendered images is done in Playwright tests. -describe('KittyGraphicsAddon', () => { - let terminal: Terminal; - let addon: KittyGraphicsAddon; - - beforeEach(() => { - terminal = new Terminal({ cols: 80, rows: 24, allowProposedApi: true }); - addon = new KittyGraphicsAddon({ debug: false }); - terminal.loadAddon(addon); - }); - - describe('parseKittyCommand', () => { - it('should parse control data with action and format', () => { - const cmd = parseKittyCommand('a=T,f=100'); - assert.equal(cmd.action, 'T'); - assert.equal(cmd.format, 100); - }); - - it('should parse control data with all options', () => { - const cmd = parseKittyCommand('a=t,f=32,i=5,s=10,v=20,c=3,r=2,m=1,q=2'); - assert.equal(cmd.action, 't'); - assert.equal(cmd.format, 32); - assert.equal(cmd.id, 5); - assert.equal(cmd.width, 10); - assert.equal(cmd.height, 20); - assert.equal(cmd.columns, 3); - assert.equal(cmd.rows, 2); - assert.equal(cmd.more, 1); - assert.equal(cmd.quiet, 2); - }); - - it('should handle empty control data', () => { - const cmd = parseKittyCommand(''); - assert.equal(cmd.action, undefined); - assert.equal(cmd.format, undefined); - }); - - it('should parse transmit action', () => { - const cmd = parseKittyCommand('a=t,f=100'); - assert.equal(cmd.action, 't'); - assert.equal(cmd.format, 100); - }); - - it('should parse delete action', () => { - const cmd = parseKittyCommand('a=d,i=5'); - assert.equal(cmd.action, 'd'); - assert.equal(cmd.id, 5); - }); - - it('should parse empty action as empty string', () => { - const cmd = parseKittyCommand('a=,f=100'); - assert.equal(cmd.action, ''); - assert.equal(cmd.format, 100); - }); - - it('should leave action undefined when key is not present (parser only)', () => { - const cmd = parseKittyCommand('f=100,i=5'); - assert.equal(cmd.action, undefined); - assert.equal(cmd.format, 100); - assert.equal(cmd.id, 5); - }); - }); - - describe('APC handler', () => { - it('should store image when transmit+display sequence is written', async () => { - // Write Kitty graphics sequence: ESC _ G ; ESC \ - const sequence = `\x1b_Ga=T,f=100;${BLACK_1X1_BASE64}\x1b\\`; - await writeP(terminal, sequence); - - // Addon should have stored the image - assert.equal(addon.images.size, 1); - - const image = addon.images.get(1)!; - assert.exists(image); - assert.equal(image.format, 100); // PNG format - assert.equal(image.data, BLACK_1X1_BASE64); - }); - - it('should store RGB image with correct payload', async () => { - const sequence = `\x1b_Ga=T,f=100;${RGB_3X1_BASE64}\x1b\\`; - await writeP(terminal, sequence); - - assert.equal(addon.images.size, 1); - const image = addon.images.get(1)!; - assert.equal(image.data, RGB_3X1_BASE64); - }); - - it('should use explicit image id when provided', async () => { - const sequence = `\x1b_Ga=T,f=100,i=42;${BLACK_1X1_BASE64}\x1b\\`; - await writeP(terminal, sequence); - - assert.equal(addon.images.size, 1); - assert.isTrue(addon.images.has(42)); - assert.isFalse(addon.images.has(1)); - }); - - it('should handle transmit-only (a=t) without display', async () => { - const sequence = `\x1b_Ga=t,f=100;${BLACK_1X1_BASE64}\x1b\\`; - await writeP(terminal, sequence); - - // Image should still be stored?? - assert.equal(addon.images.size, 1); - }); - - it('should default to transmit action when action is omitted', async () => { - // No a= key - should default to 't' (transmit) - const sequence = `\x1b_Gf=100;${BLACK_1X1_BASE64}\x1b\\`; - await writeP(terminal, sequence); - - // Image should be stored (transmit action) - assert.equal(addon.images.size, 1); - }); - - it('should ignore command when action is empty string', async () => { - // a= with no value is invalid - should be ignored - const sequence = `\x1b_Ga=,f=100;${BLACK_1X1_BASE64}\x1b\\`; - await writeP(terminal, sequence); - - // Empty action is invalid, command should be ignored - assert.equal(addon.images.size, 0); - }); - - it('should delete image by id', async () => { - // First store an image with id=5 - await writeP(terminal, `\x1b_Ga=T,f=100,i=5;${BLACK_1X1_BASE64}\x1b\\`); - assert.equal(addon.images.size, 1); - - // Delete it - await writeP(terminal, `\x1b_Ga=d,i=5\x1b\\`); - assert.equal(addon.images.size, 0); - }); - - it('should delete all images when no id specified', async () => { - // Store multiple images - await writeP(terminal, `\x1b_Ga=T,f=100,i=1;${BLACK_1X1_BASE64}\x1b\\`); - await writeP(terminal, `\x1b_Ga=T,f=100,i=2;${RGB_3X1_BASE64}\x1b\\`); - assert.equal(addon.images.size, 2); - - // Delete all - await writeP(terminal, `\x1b_Ga=d\x1b\\`); - assert.equal(addon.images.size, 0); - }); - - it('should handle chunked transmission (m=1 flag)', async () => { - // Split payload into chunks using m=1 (more data coming) - const half = Math.floor(BLACK_1X1_BASE64.length / 2); - const chunk1 = BLACK_1X1_BASE64.substring(0, half); - const chunk2 = BLACK_1X1_BASE64.substring(half); - - // First chunk with m=1 - await writeP(terminal, `\x1b_Ga=t,f=100,i=10,m=1;${chunk1}\x1b\\`); - // Image not complete yet (pending) - assert.equal(addon.images.size, 0); - - // Final chunk without m=1 - await writeP(terminal, `\x1b_Ga=t,f=100,i=10;${chunk2}\x1b\\`); - // Now image should be stored - assert.equal(addon.images.size, 1); - - const image = addon.images.get(10)!; - assert.equal(image.data, BLACK_1X1_BASE64); - }); - }); -}); diff --git a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts b/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts deleted file mode 100644 index d46679ed9..000000000 --- a/addons/addon-kitty-graphics/src/KittyGraphicsAddon.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. - * @license MIT - */ - -import type { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; -import type { KittyGraphicsAddon as IKittyGraphicsApi, IKittyGraphicsOptions, IKittyImage } from '@xterm/addon-kitty-graphics'; -import { KittyImageRenderer } from './KittyImageRenderer'; -import type { ITerminalExt } from './Types'; -import { KittyApcHandler } from './KittyApcHandler'; - -export class KittyGraphicsAddon implements ITerminalAddon, IKittyGraphicsApi { - private _terminal: ITerminalExt | undefined; - private _apcHandler: IDisposable | undefined; - private _kittyApcHandler: KittyApcHandler | undefined; - private _renderer: KittyImageRenderer | undefined; - private _images: Map = new Map(); - private _decodedImages: Map = new Map(); - private _debug: boolean; - - constructor(options?: IKittyGraphicsOptions) { - this._debug = options?.debug ?? false; - } - - public get images(): ReadonlyMap { - return this._images; - } - - public activate(terminal: Terminal): void { - this._terminal = terminal as ITerminalExt; - this._renderer = new KittyImageRenderer(terminal); - - if (this._debug) { - console.log('[KittyGraphicsAddon] Registering APC handler for G (0x47)'); - } - - this._kittyApcHandler = new KittyApcHandler( - this._images, - this._decodedImages, - this._renderer, - this._terminal, - this._debug - ); - - // Register APC handler for 'G' (0x47) - Kitty graphics protocol - // APC sequence format: ESC _ G ESC \ - // TODO: Follow jerch's feedback: The string-based handler interface is limited to 10MB - // and has bad runtime due to string conversion overhead. Implement IApcHandler interface with - // start/put/end methods to receive raw Uint32Array codepoints without copying. - // See SixelHandler and IIPHandler. - this._apcHandler = terminal.parser.registerApcHandler(0x47, (data: string) => { - return this._kittyApcHandler?.handle(data) ?? true; - }); - } - - public dispose(): void { - this._apcHandler?.dispose(); - this._kittyApcHandler?.clearPendingTransmissions(); - this._renderer?.dispose(); - this._images.clear(); - - // Close all decoded bitmaps - for (const bitmap of this._decodedImages.values()) { - bitmap.close(); - } - this._decodedImages.clear(); - - this._terminal = undefined; - this._kittyApcHandler = undefined; - } -} diff --git a/addons/addon-kitty-graphics/src/KittyImageRenderer.ts b/addons/addon-kitty-graphics/src/KittyImageRenderer.ts deleted file mode 100644 index 39f90de2f..000000000 --- a/addons/addon-kitty-graphics/src/KittyImageRenderer.ts +++ /dev/null @@ -1,237 +0,0 @@ -/** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. - * @license MIT - */ - -import type { Terminal, IDisposable } from '@xterm/xterm'; - -/** - * A placed image in the terminal. - */ -export interface IPlacedImage { - /** The decoded image bitmap */ - bitmap: ImageBitmap; - /** Column position in terminal */ - col: number; - /** Row position in terminal (relative to buffer, not viewport) */ - row: number; - /** Width to render (in pixels, 0 = original) */ - width: number; - /** Height to render (in pixels, 0 = original) */ - height: number; - /** The image ID for reference */ - id: number; -} - -/** - * Handles canvas layer management and image rendering for Kitty graphics. - * - * Similar to ImageRenderer in addon-image but simplified for Kitty protocol. - */ -export class KittyImageRenderer implements IDisposable { - private _canvas: HTMLCanvasElement | undefined; - private _ctx: CanvasRenderingContext2D | null | undefined; - private _terminal: Terminal; - private _placements: Map = new Map(); - private _placementIdCounter = 0; - private _renderDisposable: IDisposable | undefined; - private _resizeDisposable: IDisposable | undefined; - - constructor(terminal: Terminal) { - this._terminal = terminal; - } - - public dispose(): void { - this._renderDisposable?.dispose(); - this._resizeDisposable?.dispose(); - - // Close all bitmaps - for (const placement of this._placements.values()) { - placement.bitmap.close(); - } - this._placements.clear(); - - if (this._canvas) { - this._canvas.remove(); - this._canvas = undefined; - this._ctx = undefined; - } - } - - /** - * Initialize the canvas layer. Called when first image is placed. - */ - public ensureCanvasLayer(): void { - if (this._canvas) { - return; - } - - // Access internal screenElement - const core = (this._terminal as any)._core; - const screenElement = core?.screenElement; - if (!screenElement) { - console.warn('[KittyGraphicsAddon] Cannot create canvas: no screenElement'); - return; - } - - // Get dimensions from terminal - const dimensions = this._terminal.dimensions; - const width = dimensions?.css.canvas.width || 800; - const height = dimensions?.css.canvas.height || 600; - - // Create canvas - this._canvas = document.createElement('canvas'); - this._canvas.width = width; - this._canvas.height = height; - this._canvas.classList.add('xterm-kitty-graphics-layer'); - - // Position absolutely over the terminal - this._canvas.style.position = 'absolute'; - this._canvas.style.top = '0'; - this._canvas.style.left = '0'; - this._canvas.style.pointerEvents = 'none'; - this._canvas.style.zIndex = '10'; - - screenElement.appendChild(this._canvas); - this._ctx = this._canvas.getContext('2d', { alpha: true }); - - // Hook into render events to redraw when terminal scrolls - this._renderDisposable = this._terminal.onRender(() => this._draw()); - - // Handle resize - this._resizeDisposable = this._terminal.onResize(() => this._resizeCanvas()); - } - - /** - * Get cell dimensions from terminal. - */ - public getCellSize(): { width: number, height: number } { - const dimensions = this._terminal.dimensions; - return { - width: dimensions?.css.cell.width || 9, - height: dimensions?.css.cell.height || 17 - }; - } - - /** - * Place a decoded image at cursor position. - * @param bitmap - The decoded ImageBitmap to place - * @param id - The image ID this placement belongs to - * @param col - Optional column position (defaults to cursor X) - * @param row - Optional row position (defaults to cursor Y + baseY) - * @param width - Optional width in pixels (0 = original) - * @param height - Optional height in pixels (0 = original) - */ - public placeImage(bitmap: ImageBitmap, id: number, col?: number, row?: number, width?: number, height?: number): number { - this.ensureCanvasLayer(); - - const buffer = this._terminal.buffer.active; - const placementId = ++this._placementIdCounter; - - const placement: IPlacedImage = { - bitmap, - col: col ?? buffer.cursorX, - row: row ?? (buffer.cursorY + buffer.baseY), - width: width || 0, - height: height || 0, - id - }; - - this._placements.set(placementId, placement); - this._draw(); - - return placementId; - } - - /** - * Remove a placed image. - */ - public removePlacement(placementId: number): void { - const placement = this._placements.get(placementId); - if (placement) { - this._placements.delete(placementId); - this._draw(); - } - } - - /** - * Remove all placements for an image ID. - */ - public removeByImageId(imageId: number): void { - const toDelete: number[] = []; - for (const [placementId, placement] of this._placements) { - if (placement.id === imageId) { - toDelete.push(placementId); - } - } - for (const id of toDelete) { - this._placements.delete(id); - } - if (toDelete.length > 0) { - this._draw(); - } - } - - /** - * Clear all images. - */ - public clearAll(): void { - this._placements.clear(); - if (this._ctx && this._canvas) { - this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); - } - } - - /** - * Redraw all placed images. - */ - private _draw(): void { - if (!this._ctx || !this._canvas) { - return; - } - - // Clear canvas - this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); - - const buffer = this._terminal.buffer.active; - const viewportStartRow = buffer.baseY; - const viewportRows = this._terminal.rows; - const cellSize = this.getCellSize(); - - // Draw each placement that's visible - for (const placement of this._placements.values()) { - // Check if placement is in viewport - const relativeRow = placement.row - viewportStartRow; - if (relativeRow < 0 || relativeRow >= viewportRows) { - continue; // Not in viewport - } - - const x = placement.col * cellSize.width; - const y = relativeRow * cellSize.height; - - const width = placement.width || placement.bitmap.width; - const height = placement.height || placement.bitmap.height; - - this._ctx.drawImage(placement.bitmap, x, y, width, height); - } - } - - /** - * Called when terminal resizes. - */ - private _resizeCanvas(): void { - if (!this._canvas) { - return; - } - - const dimensions = this._terminal.dimensions; - const width = dimensions?.css.canvas.width || 800; - const height = dimensions?.css.canvas.height || 600; - - if (this._canvas.width !== width || this._canvas.height !== height) { - this._canvas.width = width; - this._canvas.height = height; - this._draw(); - } - } -} diff --git a/addons/addon-kitty-graphics/src/Types.ts b/addons/addon-kitty-graphics/src/Types.ts deleted file mode 100644 index ac4011b35..000000000 --- a/addons/addon-kitty-graphics/src/Types.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. - * @license MIT - */ - -import type { Terminal } from '@xterm/xterm'; - -/** -Question: Can I delete this since we switched from triggerDataEvent to this._terminal.input - */ -export interface ITerminalExt extends Terminal {} diff --git a/addons/addon-kitty-graphics/src/tsconfig.json b/addons/addon-kitty-graphics/src/tsconfig.json deleted file mode 100644 index 570d4af57..000000000 --- a/addons/addon-kitty-graphics/src/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es2021", - "lib": ["dom", "es2015"], - "rootDir": ".", - "outDir": "../out", - "sourceMap": true, - "removeComments": true, - "strict": true, - "types": ["../../../node_modules/@types/mocha"], - "paths": { - "browser/*": ["../../../src/browser/*"], - "vs/*": ["../../../src/vs/*"], - "@xterm/addon-kitty-graphics": ["../typings/addon-kitty-graphics.d.ts"] - } - }, - "include": ["./**/*", "../../../typings/xterm.d.ts"], - "references": [ - { - "path": "../../../src/browser" - }, - { - "path": "../../../src/vs" - } - ] -} diff --git a/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts b/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts deleted file mode 100644 index 57b22f150..000000000 --- a/addons/addon-kitty-graphics/test/KittyGraphicsAddon.test.ts +++ /dev/null @@ -1,269 +0,0 @@ -/** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. - * @license MIT - * - * Playwright integration tests for Kitty Graphics Addon. - * These test the addon in a real browser with visual verification. - * - * Unit tests for parsing are in src/KittyGraphicsAddon.test.ts - */ - -import test from '@playwright/test'; -import { readFileSync } from 'fs'; -import { deepStrictEqual, strictEqual } from 'assert'; -import { ITestContext, createTestContext, openTerminal, timeout } from '../../../test/playwright/TestUtils'; - -// Load test images as base64 -const BLACK_1X1_BASE64 = readFileSync('./addons/addon-kitty-graphics/fixture/black-1x1.png').toString('base64'); -const RGB_3X1_BASE64 = readFileSync('./addons/addon-kitty-graphics/fixture/rgb-3x1.png').toString('base64'); - -let ctx: ITestContext; - -test.beforeAll(async ({ browser }) => { - ctx = await createTestContext(browser); -}); - -test.afterAll(async () => { - await ctx.page.close(); -}); - -test.describe('KittyGraphicsAddon', () => { - test.beforeEach(async () => { - await openTerminal(ctx, { cols: 80, rows: 24 }); - await ctx.page.evaluate(` - window.term.reset(); - window.kittyAddon?.dispose(); - window.kittyAddon = new KittyGraphicsAddon({ debug: true }); - window.term.loadAddon(window.kittyAddon); - `); - }); - - test('addon should be loaded and activated', async () => { - const hasAddon = await ctx.page.evaluate(`typeof window.KittyGraphicsAddon !== 'undefined'`); - strictEqual(hasAddon, true, 'KittyGraphicsAddon should be available'); - }); - - test.describe('image storage', () => { - test('stores PNG image with a=t (transmit only)', async () => { - const seq = `\x1b_Ga=t,f=100;${BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(50); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 1); - }); - - test('stores PNG image with a=T (transmit and display)', async () => { - const seq = `\x1b_Ga=T,f=100;${BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(50); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 1); - }); - - test('assigns auto-incrementing IDs when not specified', async () => { - const seq1 = `\x1b_Ga=t,f=100;${BLACK_1X1_BASE64}\x1b\\`; - const seq2 = `\x1b_Ga=t,f=100;${RGB_3X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq1); - await ctx.proxy.write(seq2); - await timeout(50); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 2); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(1)'), true); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(2)'), true); - }); - - test('uses specified image ID', async () => { - const seq = `\x1b_Ga=t,f=100,i=42;${BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(50); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(42)'), true); - }); - - test('deletes specific image with a=d', async () => { - const seq1 = `\x1b_Ga=t,f=100,i=10;${BLACK_1X1_BASE64}\x1b\\`; - const seq2 = `\x1b_Ga=d,i=10;\x1b\\`; - await ctx.proxy.write(seq1); - await timeout(50); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 1); - await ctx.proxy.write(seq2); - await timeout(50); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 0); - }); - - test('deletes all images with a=d (no id)', async () => { - const seq1 = `\x1b_Ga=t,f=100,i=1;${BLACK_1X1_BASE64}\x1b\\`; - const seq2 = `\x1b_Ga=t,f=100,i=2;${RGB_3X1_BASE64}\x1b\\`; - const seqDelete = `\x1b_Ga=d;\x1b\\`; - await ctx.proxy.write(seq1); - await ctx.proxy.write(seq2); - await timeout(50); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 2); - await ctx.proxy.write(seqDelete); - await timeout(50); - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.size'), 0); - }); - }); - - test.describe('chunked transmission (m=1)', () => { - test('assembles multi-chunk image', async () => { - // Split the base64 in half - const half = Math.floor(BLACK_1X1_BASE64.length / 2); - const part1 = BLACK_1X1_BASE64.substring(0, half); - const part2 = BLACK_1X1_BASE64.substring(half); - - const seq1 = `\x1b_Ga=t,f=100,i=99,m=1;${part1}\x1b\\`; - const seq2 = `\x1b_Ga=t,f=100,i=99;${part2}\x1b\\`; - - await ctx.proxy.write(seq1); - await timeout(50); - // Image should not be stored yet (still pending) - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(99)'), false); - - await ctx.proxy.write(seq2); - await timeout(50); - // Now it should be stored - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(99)'), true); - - // Verify the full data was assembled - const storedData = await ctx.page.evaluate('window.kittyAddon.images.get(99).data'); - strictEqual(storedData, BLACK_1X1_BASE64); - }); - }); - - test.describe('pixel verification', () => { - // TODO: Add more intense ones. - test('renders 1x1 black PNG at cursor position', async () => { - // Send image with a=T to transmit and display - const seq = `\x1b_Ga=T,f=100;${BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - - // Read pixel from addon's canvas overlay - const pixel = await ctx.page.evaluate(() => { - const canvas = document.querySelector('.xterm-kitty-graphics-layer') as HTMLCanvasElement; - if (!canvas) return null; - const ctx = canvas.getContext('2d'); - if (!ctx) return null; - return Array.from(ctx.getImageData(0, 0, 1, 1).data); - }); - - // Black pixel: [0, 0, 0, 255] - deepStrictEqual(pixel, [0, 0, 0, 255]); - }); - - test('renders 3x1 RGB PNG (red, green, blue pixels)', async () => { - const seq = `\x1b_Ga=T,f=100;${RGB_3X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - - const pixels = await ctx.page.evaluate(() => { - const canvas = document.querySelector('.xterm-kitty-graphics-layer') as HTMLCanvasElement; - if (!canvas) return null; - const ctx = canvas.getContext('2d'); - if (!ctx) return null; - const imageData = ctx.getImageData(0, 0, 3, 1).data; - return { - red: Array.from(imageData.slice(0, 4)), - green: Array.from(imageData.slice(4, 8)), - blue: Array.from(imageData.slice(8, 12)) - }; - }); - - // Verify RGB pixels - deepStrictEqual(pixels?.red, [255, 0, 0, 255]); - deepStrictEqual(pixels?.green, [0, 255, 0, 255]); - deepStrictEqual(pixels?.blue, [0, 0, 255, 255]); - }); - }); - - test.describe('query support (a=q)', () => { - test('responds with OK for capability query without payload', async () => { - let response = ''; - const disposable = ctx.proxy.onData(data => { response = data; }); - - await ctx.proxy.write('\x1b_Gi=31,a=q;\x1b\\'); - await timeout(100); - - disposable.dispose(); - - strictEqual(response, '\x1b_Gi=31;OK\x1b\\'); - }); - - test('responds with OK for valid PNG query', async () => { - let response = ''; - const disposable = ctx.proxy.onData(data => { response = data; }); - - // Send query with PNG data - await ctx.proxy.write(`\x1b_Gi=42,a=q,f=100;${BLACK_1X1_BASE64}\x1b\\`); - await timeout(100); - - disposable.dispose(); - - strictEqual(response, '\x1b_Gi=42;OK\x1b\\'); - }); - - test('query does NOT store the image (unlike transmit)', async () => { - const disposable = ctx.proxy.onData(() => { /* consume response */ }); - - await ctx.proxy.write(`\x1b_Gi=50,a=q,f=100;${BLACK_1X1_BASE64}\x1b\\`); - await timeout(100); - - disposable.dispose(); - - // Image should NOT be stored - strictEqual(await ctx.page.evaluate('window.kittyAddon.images.has(50)'), false); - }); - - test('responds with error for invalid base64', async () => { - let response = ''; - const disposable = ctx.proxy.onData(data => { response = data; }); - - // Send query with invalid base64 - await ctx.proxy.write('\x1b_Gi=60,a=q,f=100;!!!invalid!!!\x1b\\'); - await timeout(100); - - disposable.dispose(); - - // Should contain EINVAL error - strictEqual(response.startsWith('\x1b_Gi=60;EINVAL:'), true); - }); - - test('responds with error for RGB data without dimensions', async () => { - let response = ''; - const disposable = ctx.proxy.onData(data => { response = data; }); - - // RGB format (f=24) requires width (s) and height (v) - // Send RGB data without specifying s= and v= - await ctx.proxy.write('\x1b_Gi=70,a=q,f=24;AAAA\x1b\\'); - await timeout(100); - - disposable.dispose(); - - strictEqual(response, '\x1b_Gi=70;EINVAL:width and height required for raw pixel data\x1b\\'); - }); - - test('suppresses OK response when q=1', async () => { - // q=1 means suppress OK responses - let gotResponse = false; - const disposable = ctx.proxy.onData(() => { gotResponse = true; }); - - await ctx.proxy.write(`\x1b_Gi=80,a=q,q=1,f=100;${BLACK_1X1_BASE64}\x1b\\`); - await timeout(100); - - disposable.dispose(); - - strictEqual(gotResponse, false); - }); - - test('suppresses error response when q=2', async () => { - // q=2 means suppress error responses - let gotResponse = false; - const disposable = ctx.proxy.onData(() => { gotResponse = true; }); - - // Send invalid data with q=2 - await ctx.proxy.write('\x1b_Gi=90,a=q,q=2,f=100;!!!invalid!!!\x1b\\'); - await timeout(100); - - disposable.dispose(); - - strictEqual(gotResponse, false); - }); - }); -}); diff --git a/addons/addon-kitty-graphics/test/playwright.config.ts b/addons/addon-kitty-graphics/test/playwright.config.ts deleted file mode 100644 index 22834be11..000000000 --- a/addons/addon-kitty-graphics/test/playwright.config.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { PlaywrightTestConfig } from '@playwright/test'; - -const config: PlaywrightTestConfig = { - testDir: '.', - timeout: 10000, - projects: [ - { - name: 'ChromeStable', - use: { - browserName: 'chromium', - channel: 'chrome' - } - }, - { - name: 'FirefoxStable', - use: { - browserName: 'firefox' - } - }, - { - name: 'WebKit', - use: { - browserName: 'webkit' - } - } - ], - reporter: 'list', - webServer: { - command: 'npm run start', - port: 3000, - timeout: 120000, - reuseExistingServer: !process.env.CI - } -}; -export default config; diff --git a/addons/addon-kitty-graphics/test/tsconfig.json b/addons/addon-kitty-graphics/test/tsconfig.json deleted file mode 100644 index 8a7426703..000000000 --- a/addons/addon-kitty-graphics/test/tsconfig.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "ESNext", - "lib": ["es2021"], - "rootDir": ".", - "outDir": "../out-test", - "sourceMap": true, - "removeComments": true, - "baseUrl": ".", - "paths": { - "common/*": ["../../../src/common/*"], - "browser/*": ["../../../src/browser/*"] - }, - "strict": true, - "types": ["../../../node_modules/@types/node"] - }, - "include": ["./**/*", "../../../typings/xterm.d.ts"], - "references": [ - { - "path": "../../../src/common" - }, - { - "path": "../../../src/browser" - }, - { - "path": "../../../test/playwright" - } - ] -} diff --git a/addons/addon-kitty-graphics/tsconfig.json b/addons/addon-kitty-graphics/tsconfig.json deleted file mode 100644 index 6531dac8b..000000000 --- a/addons/addon-kitty-graphics/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files": [], - "include": [], - "references": [{ "path": "./src" }, { "path": "./test" }] -} diff --git a/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts b/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts deleted file mode 100644 index 32a137cb0..000000000 --- a/addons/addon-kitty-graphics/typings/addon-kitty-graphics.d.ts +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. - * @license MIT - */ - -import { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; - -declare module '@xterm/addon-kitty-graphics' { - /** - * An xterm.js addon that provides support for the Kitty graphics protocol. - * This allows applications to display images in the terminal using APC - * escape sequences. - */ - export class KittyGraphicsAddon implements ITerminalAddon, IDisposable { - /** - * Creates a new Kitty graphics addon. - * @param options Optional configuration for the addon. - */ - constructor(options?: IKittyGraphicsOptions); - - /** - * Activates the addon. - * @param terminal The terminal the addon is being loaded in. - */ - public activate(terminal: Terminal): void; - - /** - * Disposes the addon. - */ - public dispose(): void; - - /** - * Gets the current images stored in the addon. - * Returns a map of image IDs to their image data. - */ - public readonly images: ReadonlyMap; - } - - /** - * Options for the Kitty graphics addon. - */ - export interface IKittyGraphicsOptions { - /** - * Enable debug logging of received graphics commands. - * Default: false - */ - debug?: boolean; - } - - /** - * Represents a stored Kitty graphics image. - */ - export interface IKittyImage { - /** - * The image ID assigned by the terminal or the application. - */ - id: number; - - /** - * The image data as a base64 string or ImageData object. - */ - data: string | ImageData; - - /** - * Width of the image in pixels. - */ - width: number; - - /** - * Height of the image in pixels. - */ - height: number; - - /** - * Format of the image data. - * - 24: RGB (3 bytes per pixel) - * - 32: RGBA (4 bytes per pixel) - * - 100: PNG - */ - format: 24 | 32 | 100; - - /** - * Compression type. - * - '': no compression - * - 'z': zlib compression - */ - compression?: string; - } -} diff --git a/addons/addon-kitty-graphics/webpack.config.js b/addons/addon-kitty-graphics/webpack.config.js deleted file mode 100644 index 89ed51dec..000000000 --- a/addons/addon-kitty-graphics/webpack.config.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. - * @license MIT - */ - -const path = require('path'); - -const addonName = 'KittyGraphicsAddon'; -const mainFile = 'addon-kitty-graphics.js'; - -const addon = { - entry: `./out/${addonName}.js`, - devtool: 'source-map', - module: { - rules: [ - { - test: /\.js$/, - use: ["source-map-loader"], - enforce: "pre", - exclude: /node_modules/ - } - ] - }, - resolve: { - modules: ['./node_modules'], - extensions: [ '.js' ], - alias: { - common: path.resolve('../../out/common'), - browser: path.resolve('../../out/browser'), - vs: path.resolve('../../out/vs') - } - }, - output: { - filename: mainFile, - path: path.resolve('./lib'), - library: addonName, - libraryTarget: 'umd', - // Force usage of globalThis instead of global / self. (This is cross-env compatible) - globalObject: 'globalThis', - }, - mode: 'production' -}; - -module.exports = [addon]; diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 5c7e5afea..5e0a370ca 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -137,7 +137,6 @@ if (config.addon) { "@xterm/addon-clipboard": "./addons/addon-clipboard/lib/addon-clipboard.mjs", "@xterm/addon-fit": "./addons/addon-fit/lib/addon-fit.mjs", "@xterm/addon-image": "./addons/addon-image/lib/addon-image.mjs", - "@xterm/addon-kitty-graphics": "./addons/addon-kitty-graphics/lib/addon-kitty-graphics.mjs", "@xterm/addon-progress": "./addons/addon-progress/lib/addon-progress.mjs", "@xterm/addon-search": "./addons/addon-search/lib/addon-search.mjs", "@xterm/addon-serialize": "./addons/addon-serialize/lib/addon-serialize.mjs", diff --git a/demo/client/client.ts b/demo/client/client.ts index a2ccd40af..baa989c13 100644 --- a/demo/client/client.ts +++ b/demo/client/client.ts @@ -29,7 +29,6 @@ import { TestWindow } from './components/window/testWindow'; import { VtWindow } from './components/window/vtWindow'; import { ClipboardAddon } from '@xterm/addon-clipboard'; import { FitAddon } from '@xterm/addon-fit'; -import { KittyGraphicsAddon } from '@xterm/addon-kitty-graphics'; import { LigaturesAddon } from '@xterm/addon-ligatures'; import { ProgressAddon } from '@xterm/addon-progress'; import { SearchAddon, ISearchOptions } from '@xterm/addon-search'; @@ -48,7 +47,6 @@ export interface IWindowWithTerminal extends Window { ClipboardAddon?: typeof ClipboardAddon; FitAddon?: typeof FitAddon; ImageAddon?: typeof ImageAddon; - KittyGraphicsAddon?: typeof KittyGraphicsAddon; ProgressAddon?: typeof ProgressAddon; SearchAddon?: typeof SearchAddon; SerializeAddon?: typeof SerializeAddon; @@ -76,7 +74,6 @@ const addons: AddonCollection = { clipboard: { name: 'clipboard', ctor: ClipboardAddon, canChange: true }, fit: { name: 'fit', ctor: FitAddon, canChange: false }, image: { name: 'image', ctor: ImageAddon, canChange: true }, - kittyGraphics: { name: 'kittyGraphics', ctor: KittyGraphicsAddon, canChange: true }, progress: { name: 'progress', ctor: ProgressAddon, canChange: true }, search: { name: 'search', ctor: SearchAddon, canChange: true }, serialize: { name: 'serialize', ctor: SerializeAddon, canChange: true }, @@ -199,7 +196,6 @@ if (document.location.pathname === '/test') { window.ClipboardAddon = ClipboardAddon; window.FitAddon = FitAddon; window.ImageAddon = ImageAddon; - window.KittyGraphicsAddon = KittyGraphicsAddon; window.ProgressAddon = ProgressAddon; window.SearchAddon = SearchAddon; window.SerializeAddon = SerializeAddon; @@ -298,7 +294,6 @@ function createTerminal(): Terminal { addons.serialize.instance = new SerializeAddon(); addons.fit.instance = new FitAddon(); addons.image.instance = new ImageAddon(); - addons.kittyGraphics.instance = new KittyGraphicsAddon(); addons.progress.instance = new ProgressAddon(); addons.unicodeGraphemes.instance = new UnicodeGraphemesAddon(); addons.clipboard.instance = new ClipboardAddon(); @@ -311,7 +306,6 @@ function createTerminal(): Terminal { addons.webFonts.instance = new WebFontsAddon(); typedTerm.loadAddon(addons.fit.instance); typedTerm.loadAddon(addons.image.instance); - typedTerm.loadAddon(addons.kittyGraphics.instance); typedTerm.loadAddon(addons.progress.instance); typedTerm.loadAddon(addons.search.instance); typedTerm.loadAddon(addons.serialize.instance); diff --git a/demo/client/tsconfig.json b/demo/client/tsconfig.json index 554272dec..1113cfdd7 100644 --- a/demo/client/tsconfig.json +++ b/demo/client/tsconfig.json @@ -11,7 +11,6 @@ "@xterm/addon-clipboard": ["../../addons/addon-clipboard"], "@xterm/addon-fit": ["../../addons/addon-fit"], "@xterm/addon-image": ["../../addons/addon-image"], - "@xterm/addon-kitty-graphics": ["../../addons/addon-kitty-graphics"], "@xterm/addon-progress": ["../../addons/addon-progress"], "@xterm/addon-search": ["../../addons/addon-search"], "@xterm/addon-serialize": ["../../addons/addon-serialize"], @@ -19,12 +18,11 @@ "@xterm/addon-web-links": ["../../addons/addon-web-links"], "@xterm/addon-webgl": ["../../addons/addon-webgl"], "@xterm/addon-unicode11": ["../../addons/addon-unicode11"], - "@xterm/addon-unicode-graphemes": ["../../addons/addon-unicode-graphemes"], + "@xterm/addon-unicode-graphemes": [ + "../../addons/addon-unicode-graphemes" + ], "@xterm/addon-ligatures": ["../../addons/addon-ligatures"] } }, - "include": [ - "./**/*", - "../../typings/xterm.d.ts" - ] + "include": ["./**/*", "../../typings/xterm.d.ts"] } diff --git a/demo/client/types.ts b/demo/client/types.ts index 8cafdd506..c73f31e20 100644 --- a/demo/client/types.ts +++ b/demo/client/types.ts @@ -9,7 +9,6 @@ import type { ImageAddon } from '@xterm/addon-image'; import type { AttachAddon } from '@xterm/addon-attach'; import type { ClipboardAddon } from '@xterm/addon-clipboard'; import type { FitAddon } from '@xterm/addon-fit'; -import type { KittyGraphicsAddon } from '@xterm/addon-kitty-graphics'; import type { LigaturesAddon } from '@xterm/addon-ligatures'; import type { ProgressAddon } from '@xterm/addon-progress'; import type { SearchAddon } from '@xterm/addon-search'; @@ -20,7 +19,7 @@ import type { WebFontsAddon } from '@xterm/addon-web-fonts'; import type { WebLinksAddon } from '@xterm/addon-web-links'; import type { WebglAddon } from '@xterm/addon-webgl'; -export type AddonType = 'attach' | 'clipboard' | 'fit' | 'image' | 'kittyGraphics' | 'progress' | 'search' | 'serialize' | 'unicode11' | 'unicodeGraphemes' | 'webFonts' | 'webLinks' | 'webgl' | 'ligatures'; +export type AddonType = 'attach' | 'clipboard' | 'fit' | 'image' | 'ligatures' | 'progress' | 'search' | 'serialize' | 'unicode11' | 'unicodeGraphemes' | 'webFonts' | 'webLinks' | 'webgl'; export interface IDemoAddon { name: T; @@ -30,34 +29,32 @@ export interface IDemoAddon { T extends 'clipboard' ? typeof ClipboardAddon : T extends 'fit' ? typeof FitAddon : T extends 'image' ? typeof ImageAddon : - T extends 'kittyGraphics' ? typeof KittyGraphicsAddon : - T extends 'ligatures' ? typeof LigaturesAddon : - T extends 'progress' ? typeof ProgressAddon : - T extends 'search' ? typeof SearchAddon : - T extends 'serialize' ? typeof SerializeAddon : - T extends 'webFonts' ? typeof WebFontsAddon : - T extends 'webLinks' ? typeof WebLinksAddon : - T extends 'unicode11' ? typeof Unicode11Addon : - T extends 'unicodeGraphemes' ? typeof UnicodeGraphemesAddon : - T extends 'webgl' ? typeof WebglAddon : - never + T extends 'ligatures' ? typeof LigaturesAddon : + T extends 'progress' ? typeof ProgressAddon : + T extends 'search' ? typeof SearchAddon : + T extends 'serialize' ? typeof SerializeAddon : + T extends 'webFonts' ? typeof WebFontsAddon : + T extends 'webLinks' ? typeof WebLinksAddon : + T extends 'unicode11' ? typeof Unicode11Addon : + T extends 'unicodeGraphemes' ? typeof UnicodeGraphemesAddon : + T extends 'webgl' ? typeof WebglAddon : + never ); instance?: ( T extends 'attach' ? AttachAddon : T extends 'clipboard' ? ClipboardAddon : T extends 'fit' ? FitAddon : T extends 'image' ? ImageAddon : - T extends 'kittyGraphics' ? KittyGraphicsAddon : - T extends 'ligatures' ? LigaturesAddon : - T extends 'progress' ? ProgressAddon : - T extends 'search' ? SearchAddon : - T extends 'serialize' ? SerializeAddon : - T extends 'webFonts' ? WebFontsAddon : - T extends 'webLinks' ? WebLinksAddon : - T extends 'unicode11' ? Unicode11Addon : - T extends 'unicodeGraphemes' ? UnicodeGraphemesAddon : - T extends 'webgl' ? WebglAddon : - never + T extends 'ligatures' ? LigaturesAddon : + T extends 'progress' ? ProgressAddon : + T extends 'search' ? SearchAddon : + T extends 'serialize' ? SerializeAddon : + T extends 'webFonts' ? WebFontsAddon : + T extends 'webLinks' ? WebLinksAddon : + T extends 'unicode11' ? Unicode11Addon : + T extends 'unicodeGraphemes' ? UnicodeGraphemesAddon : + T extends 'webgl' ? WebglAddon : + never ); } diff --git a/tsconfig.all.json b/tsconfig.all.json index 2f6827393..b0ed02799 100644 --- a/tsconfig.all.json +++ b/tsconfig.all.json @@ -11,7 +11,6 @@ { "path": "./addons/addon-clipboard" }, { "path": "./addons/addon-fit" }, { "path": "./addons/addon-image" }, - { "path": "./addons/addon-kitty-graphics" }, { "path": "./addons/addon-ligatures" }, { "path": "./addons/addon-progress" }, { "path": "./addons/addon-search" }, From bae314f67c7d0ba4d031f22d4a4ecabd49e2ffef Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 29 Jan 2026 01:12:09 -0800 Subject: [PATCH 033/124] Try using the wasm base64 decoder --- .../src/kitty/KittyGraphicsHandler.ts | 107 ++++++++++++++---- 1 file changed, 88 insertions(+), 19 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 97ef87041..bc5d6c024 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -9,6 +9,7 @@ import { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt } from '../Types'; import { ImageRenderer } from '../ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from '../ImageStorage'; +import Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; import { KittyAction, KittyFormat, @@ -22,6 +23,13 @@ import { parseKittyCommand } from './KittyGraphicsTypes'; +// Memory limit for base64 decoder (4MB, same as IIPHandler) +const DECODER_KEEP_DATA = 4194304; + +// Base64 shard size for chunked decoding (1MB encoded → ~768KB decoded) +// This prevents memory pressure with large images +const BASE64_SHARD_SIZE = 1048576; + /** * Kitty graphics protocol handler. * @@ -84,22 +92,22 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { /** * Called for each chunk of data in the APC sequence. - * Accumulates codepoints as a string. + * Accumulates codepoints as a string for control data parsing. + * The base64 payload is decoded later using the wasm decoder. */ public put(data: Uint32Array, start: number, end: number): void { if (this._aborted) return; // Check size limit if (this._data.length + (end - start) > this._opts.kittySizeLimit) { - console.warn('[KittyHandler] Data exceeds size limit, aborting'); + console.warn('[KittyGraphicsHandler] Data exceeds size limit, aborting'); this._aborted = true; return; } - // Convert Uint32Array codepoints to string - // TODO: This atob + charCodeAt pattern has bad runtime. Consider using the wasm-based - // base64 decoder from xterm-wasm-parts which supports chunked data ingestion. - // For now, we accumulate as string and decode at the end. + // Convert Uint32Array codepoints to string for control data parsing + // Note: We accumulate as string because we need to parse control data (before semicolon). + // The base64 payload is decoded efficiently using the wasm-based decoder in _decodeImage(). for (let i = start; i < end; i++) { this._data += String.fromCodePoint(data[i]); } @@ -244,11 +252,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } try { - const binaryString = atob(payload); - const bytes = new Uint8Array(binaryString.length); - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } + const bytes = this._decodeBase64(payload); const format = cmd.format || KittyFormat.RGBA; @@ -375,25 +379,21 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { /** * Decode base64 image data into an ImageBitmap. + * Uses the wasm-based decoder from xterm-wasm-parts for better performance. */ private async _decodeImage(image: IKittyImageData): Promise { const format = image.format; const base64Data = image.data; - // TODO: This atob + charCodeAt loop has bad runtime and creates memory pressure with large - // images. Consider using the wasm-based base64 decoder from xterm-wasm-parts. - const binaryString = atob(base64Data); - let bytes = new Uint8Array(binaryString.length); - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } + // TODO: Get this confirmed! + let bytes = this._decodeBase64(base64Data); if (image.compression === KittyCompression.ZLIB) { bytes = await this._decompressZlib(bytes) as Uint8Array; } if (format === KittyFormat.PNG) { - const blob = new Blob([bytes], { type: 'image/png' }); + const blob = new Blob([new Uint8Array(bytes)], { type: 'image/png' }); // Safari fallback pattern (from IIPHandler) if (!window.createImageBitmap) { const url = URL.createObjectURL(blob); @@ -485,6 +485,75 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { return result; } + /** + * Decode base64 string using the wasm-based decoder for better performance. + * Uses shard-based decoding (1MB chunks) to prevent memory pressure with large images. + */ + private _decodeBase64(base64Data: string): Uint8Array { + const length = base64Data.length; + + // For small data, decode directly without sharding + if (length <= BASE64_SHARD_SIZE) { + return this._decodeBase64Shard(base64Data); + } + + // For large data, decode in 1MB shards and accumulate + // Base64 must be decoded in multiples of 4 chars, so align shard boundaries + const shardSize = BASE64_SHARD_SIZE - (BASE64_SHARD_SIZE % 4); + const chunks: Uint8Array[] = []; + let totalLength = 0; + + for (let offset = 0; offset < length; offset += shardSize) { + const end = Math.min(offset + shardSize, length); + const shard = base64Data.substring(offset, end); + const decoded = this._decodeBase64Shard(shard); + chunks.push(decoded); + totalLength += decoded.length; + } + + // Combine all chunks into final result + const result = new Uint8Array(totalLength); + let writeOffset = 0; + for (const chunk of chunks) { + result.set(chunk, writeOffset); + writeOffset += chunk.length; + } + + return result; + } + + /** + * Decode a single base64 shard using the wasm decoder. + */ + private _decodeBase64Shard(base64Data: string): Uint8Array { + // Calculate exact decoded size from base64 string + // Formula: (encoded_length * 3) / 4 - padding_count + let padding = 0; + if (base64Data.endsWith('==')) padding = 2; + else if (base64Data.endsWith('=')) padding = 1; + const decodedSize = Math.floor(base64Data.length * 3 / 4) - padding; + + // Convert string to Uint32Array of codepoints for the wasm decoder + const codepoints = new Uint32Array(base64Data.length); + for (let i = 0; i < base64Data.length; i++) { + codepoints[i] = base64Data.charCodeAt(i); + } + + const decoder = new Base64Decoder(DECODER_KEEP_DATA); + decoder.init(decodedSize); + decoder.put(codepoints, 0, codepoints.length); + + if (decoder.end()) { + decoder.release(); + throw new Error('Base64 decode failed'); + } + + // Copy the decoded data before releasing + const result = new Uint8Array(decoder.data8); + decoder.release(); + return result; + } + /** * Get stored images (for testing/debugging). */ From e4710d3286cf2e80e6c78a92a27571cd41a6820f Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 1 Feb 2026 12:37:09 -0800 Subject: [PATCH 034/124] Use sharding, decode with streaming --- .../src/kitty/KittyGraphicsHandler.ts | 694 +++++++++++------- .../src/kitty/KittyGraphicsTypes.ts | 15 +- addons/addon-image/test/ImageAddon.test.ts | 5 +- 3 files changed, 440 insertions(+), 274 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index bc5d6c024..6886df4e9 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -1,9 +1,6 @@ /** * Copyright (c) 2025 The xterm.js authors. All rights reserved. * @license MIT - * - * Kitty graphics protocol APC handler. - * Implements IApcHandler to integrate with xterm.js parser. */ import { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt } from '../Types'; @@ -26,41 +23,53 @@ import { // Memory limit for base64 decoder (4MB, same as IIPHandler) const DECODER_KEEP_DATA = 4194304; -// Base64 shard size for chunked decoding (1MB encoded → ~768KB decoded) -// This prevents memory pressure with large images +// Base64 shard size (~1MB, must be divisible by 4) const BASE64_SHARD_SIZE = 1048576; +// Decoded shard size: 1MB base64 → 768KB decoded +const DECODED_SHARD_SIZE = 786432; + +// Maximum control data size +const MAX_CONTROL_DATA_SIZE = 4096; + +// Semicolon codepoint +const SEMICOLON = 0x3B; + +// Padding character '=' +const EQUALS = 0x3D; + /** - * Kitty graphics protocol handler. - * - * Handles APC sequences for the Kitty graphics protocol, supporting: - * - Image transmission (a=t) - * - Image transmission + display (a=T) - * - Query (a=q) - * - Delete (a=d) - * - * TODO: File transmission (t=f) is not supported since browsers cannot access the filesystem. - * Explore using the File System Access API for opt-in filesystem access when available. + * Kitty graphics protocol handler with streaming base64 decoding. */ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _aborted = false; - private _data: string = ''; + private _decodeError = false; + + /** Reusable base64 decoder - avoids WASM cold-start on each chunk */ + private _decoder = new Base64Decoder(DECODER_KEEP_DATA); + + // Streaming related states + + /** True while receiving control data (before semicolon). */ + private _inControlData = true; + + /** Buffer for control data. */ + private _controlData = new Uint32Array(MAX_CONTROL_DATA_SIZE); + private _controlLength = 0; + + /** Shard buffer for base64 bytes (filled until 4-byte aligned boundary). */ + private _shardBuffer = new Uint32Array(BASE64_SHARD_SIZE); + private _shardBufferPos = 0; + + /** Accumulated decoded chunks. */ + private _decodedChunks: Uint8Array[] = []; + private _totalDecodedSize = 0; + + // Storage related states - /** - * Pending chunked transmissions keyed by image ID. - * ID 0 is used for transmissions without an explicit ID (the "anonymous" transmission). - */ private _pendingTransmissions: Map = new Map(); private _nextImageId = 1; - - /** - * Stored images - kept for protocol compliance (transmit without display, then display later). - */ private _images: Map = new Map(); - - /** - * Cached decoded bitmaps. - */ private _decodedImages: Map = new Map(); constructor( @@ -71,217 +80,473 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { ) {} public reset(): void { - // Clear pending transmissions this._pendingTransmissions.clear(); - // Clear stored images this._images.clear(); - // Close decoded bitmaps for (const bitmap of this._decodedImages.values()) { bitmap.close(); } this._decodedImages.clear(); } - /** - * Called at the start of a new APC sequence. - */ public start(): void { this._aborted = false; - this._data = ''; + this._decodeError = false; + this._inControlData = true; + this._controlLength = 0; + this._shardBufferPos = 0; + this._decodedChunks = []; + this._totalDecodedSize = 0; } - /** - * Called for each chunk of data in the APC sequence. - * Accumulates codepoints as a string for control data parsing. - * The base64 payload is decoded later using the wasm decoder. - */ public put(data: Uint32Array, start: number, end: number): void { if (this._aborted) return; + if (this._inControlData) { + // Scan for semicolon + let controlEnd = end; + for (let i = start; i < end; i++) { + if (data[i] === SEMICOLON) { + this._inControlData = false; + controlEnd = i; + break; + } + } + + // Copy control data + const copyLength = controlEnd - start; + if (this._controlLength + copyLength > MAX_CONTROL_DATA_SIZE) { + this._aborted = true; + return; + } + this._controlData.set(data.subarray(start, controlEnd), this._controlLength); + this._controlLength += copyLength; + + if (!this._inControlData) { + // Found semicolon - stream remaining as payload + const payloadStart = controlEnd + 1; + if (payloadStart < end) { + this._streamPayload(data, payloadStart, end); + } + } + } else { + this._streamPayload(data, start, end); + } + } + + /** + * Stream payload bytes, decode at 4-byte aligned boundaries. + */ + private _streamPayload(data: Uint32Array, start: number, end: number): void { + if (this._aborted) return; + // Check size limit - if (this._data.length + (end - start) > this._opts.kittySizeLimit) { - console.warn('[KittyGraphicsHandler] Data exceeds size limit, aborting'); + const estimatedTotal = this._totalDecodedSize + Math.ceil(this._shardBufferPos * 3 / 4) + Math.ceil((end - start) * 3 / 4); + if (estimatedTotal > this._opts.kittySizeLimit) { this._aborted = true; return; } - // Convert Uint32Array codepoints to string for control data parsing - // Note: We accumulate as string because we need to parse control data (before semicolon). - // The base64 payload is decoded efficiently using the wasm-based decoder in _decodeImage(). - for (let i = start; i < end; i++) { - this._data += String.fromCodePoint(data[i]); + const inputLength = end - start; + const freeSpace = BASE64_SHARD_SIZE - this._shardBufferPos; + + if (inputLength < freeSpace) { + // Fits in current shard + this._shardBuffer.set(data.subarray(start, end), this._shardBufferPos); + this._shardBufferPos += inputLength; + return; + } + + // Fill shard to capacity + this._shardBuffer.set(data.subarray(start, start + freeSpace), this._shardBufferPos); + this._shardBufferPos = BASE64_SHARD_SIZE; + + // Decode full shard (exactly 1MB → 768KB) + if (!this._decodeFullShard()) { + this._aborted = true; + return; + } + + // Reset and process remaining + this._shardBufferPos = 0; + const remaining = start + freeSpace; + if (remaining < end) { + this._streamPayload(data, remaining, end); } } /** - * Called at the end of the APC sequence. + * Decode a full 1MB shard (768KB output). */ + private _decodeFullShard(): boolean { + this._decoder.init(DECODED_SHARD_SIZE); + + if (this._decoder.put(this._shardBuffer, 0, BASE64_SHARD_SIZE)) { + this._decoder.release(); + this._decodeError = true; + return false; + } + + if (this._decoder.end()) { + this._decoder.release(); + this._decodeError = true; + return false; + } + + const chunk = new Uint8Array(this._decoder.data8); + this._decodedChunks.push(chunk); + this._totalDecodedSize += chunk.length; + this._decoder.release(); + return true; + } + public end(success: boolean): boolean | Promise { if (this._aborted || !success) { return true; } - return this._handleCommand(this._data); + // No semicolon = no payload (delete, capability query) + if (this._inControlData) { + return this._handleNoPayloadCommand(); + } + + // Parse command to check m=1 and get pending key + const cmd = parseKittyCommand(this._parseControlDataString()); + const pendingKey = cmd.id ?? 0; + const isMoreComing = cmd.more === 1; + const pending = this._pendingTransmissions.get(pendingKey); + + // If continuing a pending transmission, prepend leftover bytes + if (pending && pending.leftoverLength > 0) { + // Shift current buffer to make room for leftover + const newPos = pending.leftoverLength + this._shardBufferPos; + if (newPos <= BASE64_SHARD_SIZE) { + // Shift existing data right + for (let i = this._shardBufferPos - 1; i >= 0; i--) { + this._shardBuffer[i + pending.leftoverLength] = this._shardBuffer[i]; + } + // Prepend leftover + this._shardBuffer.set(pending.leftover.subarray(0, pending.leftoverLength), 0); + this._shardBufferPos = newPos; + } + pending.leftoverLength = 0; + } + + // Decode with 4-byte alignment, preserving leftover if m=1 + if (this._shardBufferPos > 0) { + if (isMoreComing) { + this._decodePartialShardWithLeftover(pendingKey, cmd); + } else { + this._decodePartialShard(); + } + } + + // Combine all decoded chunks + const imageBytes = this._combineChunks(); + + return this._handleCommandWithBytesAndCmd(cmd, imageBytes, this._decodeError); } /** - * Handle a complete Kitty graphics command. + * Decode partial shard, storing leftover bytes for m=1 chunks. */ - private _handleCommand(data: string): boolean | Promise { - const semiIdx = data.indexOf(';'); - const controlData = semiIdx === -1 ? data : data.substring(0, semiIdx); - const payload = semiIdx === -1 ? '' : data.substring(semiIdx + 1); + private _decodePartialShardWithLeftover(pendingKey: number, cmd: IKittyCommand): boolean { + let length = this._shardBufferPos; + if (length === 0) return true; - const cmd = parseKittyCommand(controlData); - cmd.payload = payload; + // Align to 4 bytes + const aligned = Math.floor(length / 4) * 4; + const leftoverCount = length - aligned; + // Store leftover bytes for next chunk + if (leftoverCount > 0) { + let pending = this._pendingTransmissions.get(pendingKey); + if (!pending) { + pending = { + cmd: { ...cmd }, + chunks: [], + totalSize: 0, + leftover: new Uint32Array(4), + leftoverLength: 0 + }; + this._pendingTransmissions.set(pendingKey, pending); + } + pending.leftover.set(this._shardBuffer.subarray(aligned, length), 0); + pending.leftoverLength = leftoverCount; + } + + if (aligned === 0) return true; + + // Count padding (shouldn't have padding in m=1 chunks, but be safe) + let padding = 0; + if (aligned >= 1 && this._shardBuffer[aligned - 1] === EQUALS) padding++; + if (aligned >= 2 && this._shardBuffer[aligned - 2] === EQUALS) padding++; + + const decodedSize = Math.floor(aligned * 3 / 4) - padding; + if (decodedSize <= 0) return true; + + this._decoder.init(decodedSize); + + if (this._decoder.put(this._shardBuffer, 0, aligned)) { + this._decoder.release(); + this._decodeError = true; + return false; + } + + if (this._decoder.end()) { + this._decoder.release(); + this._decodeError = true; + return false; + } + + const chunk = new Uint8Array(this._decoder.data8); + this._decodedChunks.push(chunk); + this._totalDecodedSize += chunk.length; + this._decoder.release(); + return true; + } + + /** + * Decode partial shard with proper 4-byte alignment. + * For final chunks, pad with = if not aligned instead of truncating. + */ + private _decodePartialShard(): boolean { + let length = this._shardBufferPos; + if (length === 0) return true; + + + // Count ORIGINAL padding BEFORE we add any + let padding = 0; + if (length >= 1 && this._shardBuffer[length - 1] === EQUALS) padding++; + if (length >= 2 && this._shardBuffer[length - 2] === EQUALS) padding++; + + // Pad to 4-byte boundary with = if needed (instead of truncating) + const remainder = length % 4; + if (remainder > 0) { + const paddingNeeded = 4 - remainder; + for (let i = 0; i < paddingNeeded; i++) { + this._shardBuffer[length + i] = EQUALS; + } + length += paddingNeeded; + // Count the artificial padding too! + padding += paddingNeeded; + } + + // Calculate decoded size + const decodedSize = Math.floor(length * 3 / 4) - padding; + if (decodedSize <= 0) return true; + + this._decoder.init(decodedSize); + + if (this._decoder.put(this._shardBuffer, 0, length)) { + this._decoder.release(); + this._decodeError = true; + return false; + } + + if (this._decoder.end()) { + this._decoder.release(); + this._decodeError = true; + return false; + } + + const chunk = new Uint8Array(this._decoder.data8); + this._decodedChunks.push(chunk); + this._totalDecodedSize += chunk.length; + this._decoder.release(); + return true; + } + + private _combineChunks(): Uint8Array { + if (this._decodedChunks.length === 0) return new Uint8Array(0); + if (this._decodedChunks.length === 1) return this._decodedChunks[0]; + + const result = new Uint8Array(this._totalDecodedSize); + let offset = 0; + for (const chunk of this._decodedChunks) { + result.set(chunk, offset); + offset += chunk.length; + } + return result; + } + + // Command handling + + private _parseControlDataString(): string { + let str = ''; + for (let i = 0; i < this._controlLength; i++) { + str += String.fromCodePoint(this._controlData[i]); + } + return str; + } + + private _handleNoPayloadCommand(): boolean | Promise { + const cmd = parseKittyCommand(this._parseControlDataString()); const action = cmd.action ?? 't'; switch (action) { - case KittyAction.TRANSMIT: - return this._handleTransmit(cmd); - case KittyAction.TRANSMIT_DISPLAY: - return this._handleTransmitDisplay(cmd); - case KittyAction.QUERY: - return this._handleQuery(cmd); case KittyAction.DELETE: return this._handleDelete(cmd); + case KittyAction.QUERY: + this._sendResponse(cmd.id ?? 0, 'OK', cmd.quiet ?? 0); + return true; default: return true; } } - private _handleTransmit(cmd: IKittyCommand): boolean { - const payload = cmd.payload ?? ''; + private _handleCommandWithBytesAndCmd(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise { + const action = cmd.action ?? 't'; + + switch (action) { + case KittyAction.TRANSMIT: + return this._handleTransmit(cmd, bytes, decodeError); + case KittyAction.TRANSMIT_DISPLAY: + return this._handleTransmitDisplay(cmd, bytes, decodeError); + case KittyAction.QUERY: + return this._handleQuery(cmd, bytes, decodeError); + default: + return true; + } + } + + private _handleTransmit(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean { const pendingKey = cmd.id ?? 0; const isMoreComing = cmd.more === 1; const pending = this._pendingTransmissions.get(pendingKey); - if (pending) { - pending.data += payload; - if (isMoreComing) { - return true; + // For m=1 intermediate chunks, reject if decode error + if (decodeError && !pending && isMoreComing) return true; + + if (pending) { + // Append to existing pending transmission (even if decode error, we keep accumulated data) + if (bytes.length > 0) { + pending.chunks.push(bytes); + pending.totalSize += bytes.length; } - const originalCmd = pending.cmd; - const fullPayload = pending.data; + if (isMoreComing) return true; + + // Final chunk - merge all (even if the final chunk had a decode error) + const fullData = this._mergeChunks(pending.chunks, pending.totalSize); this._pendingTransmissions.delete(pendingKey); - const id = originalCmd.id ?? this._nextImageId++; + if (fullData.length === 0) return true; // Nothing to store + + const id = pending.cmd.id ?? this._nextImageId++; const image: IKittyImageData = { id, - data: fullPayload, - width: originalCmd.width ?? 0, - height: originalCmd.height ?? 0, - format: (originalCmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, - compression: originalCmd.compression ?? '' + data: fullData, + width: pending.cmd.width ?? 0, + height: pending.cmd.height ?? 0, + format: (pending.cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, + compression: pending.cmd.compression ?? '' }; + this._images.set(id, image); - this._images.set(image.id, image); - - if (originalCmd.action === KittyAction.TRANSMIT_DISPLAY) { - // Fire-and-forget the display, transmit itself succeeded - void this._displayImage(image, originalCmd.columns, originalCmd.rows); - return true; - } - - cmd.id = id; + // Note: Don't display here - _handleTransmitDisplay will do it return true; } if (isMoreComing) { + // Start new pending transmission (reject if decode error for first chunk) + if (decodeError) return true; this._pendingTransmissions.set(pendingKey, { cmd: { ...cmd }, - data: payload + chunks: bytes.length > 0 ? [bytes] : [], + totalSize: bytes.length, + leftover: new Uint32Array(4), + leftoverLength: 0 }); return true; } - const id = cmd.id ?? this._nextImageId++; + // Single-chunk transmission - reject if decode error or no data + if (decodeError || bytes.length === 0) return true; + const id = cmd.id ?? this._nextImageId++; const image: IKittyImageData = { id, - data: payload, + data: bytes, width: cmd.width ?? 0, height: cmd.height ?? 0, format: (cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, compression: cmd.compression ?? '' }; - - this._images.set(image.id, image); - cmd.id = id; + this._images.set(id, image); return true; } - private _handleTransmitDisplay(cmd: IKittyCommand): boolean | Promise { + private _mergeChunks(chunks: Uint8Array[], totalSize: number): Uint8Array { + if (chunks.length === 1) return chunks[0]; + const result = new Uint8Array(totalSize); + let offset = 0; + for (const chunk of chunks) { + result.set(chunk, offset); + offset += chunk.length; + } + return result; + } + + private _handleTransmitDisplay(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise { + if (decodeError) return true; + const pendingKey = cmd.id ?? 0; - const wasPendingBefore = this._pendingTransmissions.has(pendingKey); - this._handleTransmit(cmd); + this._handleTransmit(cmd, bytes, decodeError); - if (cmd.more === 1) { - return true; - } + // If still accumulating chunks, don't display yet + if (this._pendingTransmissions.has(pendingKey)) return true; - if (wasPendingBefore) { - return true; - } - - const id = cmd.id!; + // Display the completed image + const id = cmd.id ?? this._nextImageId - 1; const image = this._images.get(id); if (image) { return this._displayImage(image, cmd.columns, cmd.rows); } - return true; } - /** - * Handle query action (a=q). - */ - private _handleQuery(cmd: IKittyCommand): boolean { + private _handleQuery(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean { const id = cmd.id ?? 0; const quiet = cmd.quiet ?? 0; - const payload = cmd.payload || ''; - if (!payload) { + // Check decode error first (invalid base64) + if (decodeError) { + this._sendResponse(id, 'EINVAL:invalid base64 data', quiet); + return true; + } + + // Capability query (no payload) - just respond OK + if (bytes.length === 0) { this._sendResponse(id, 'OK', quiet); return true; } - try { - const bytes = this._decodeBase64(payload); + const format = cmd.format ?? KittyFormat.RGBA; - const format = cmd.format || KittyFormat.RGBA; + if (format === KittyFormat.PNG) { + this._sendResponse(id, 'OK', quiet); + } else { + const width = cmd.width ?? 0; + const height = cmd.height ?? 0; - if (format === KittyFormat.PNG) { - this._sendResponse(id, 'OK', quiet); - } else { - const width = cmd.width || 0; - const height = cmd.height || 0; - - if (!width || !height) { - this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet); - return true; - } - - const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; - const expectedBytes = width * height * bytesPerPixel; - - if (bytes.length < expectedBytes) { - this._sendResponse(id, `EINVAL:insufficient pixel data, got ${bytes.length}, expected ${expectedBytes}`, quiet); - return true; - } - - this._sendResponse(id, 'OK', quiet); + if (!width || !height) { + this._sendResponse(id, 'EINVAL:width and height required for raw pixel data', quiet); + return true; } - } catch (e) { - const errorMsg = e instanceof Error ? e.message : 'unknown error'; - this._sendResponse(id, `EINVAL:${errorMsg}`, quiet); - } + const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; + const expectedBytes = width * height * bytesPerPixel; + + if (bytes.length < expectedBytes) { + this._sendResponse(id, `EINVAL:insufficient pixel data`, quiet); + return true; + } + + this._sendResponse(id, 'OK', quiet); + } return true; } @@ -302,13 +567,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } this._decodedImages.clear(); } - return true; } - /** - * Send a response back to the client. - */ private _sendResponse(id: number, message: string, quiet: number): void { const isOk = message === 'OK'; if (isOk && quiet === 1) return; @@ -318,27 +579,22 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._coreTerminal._core.coreService.triggerDataEvent(response); } - /** - * Decode and display an image using the shared ImageStorage. - */ + // Image display + private _displayImage(image: IKittyImageData, columns?: number, rows?: number): boolean | Promise { return this._decodeAndDisplay(image, columns, rows) .then(() => true) - .catch(err => { - console.warn('[KittyHandler] Failed to decode/display image:', err); - return true; - }); + .catch(() => true); } private async _decodeAndDisplay(image: IKittyImageData, columns?: number, rows?: number): Promise { let bitmap = this._decodedImages.get(image.id); if (!bitmap) { - bitmap = await this._decodeImage(image); + bitmap = await this._createBitmap(image); this._decodedImages.set(image.id, bitmap); } - // Calculate display size let w = bitmap.width; let h = bitmap.height; @@ -346,30 +602,16 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width; const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height; - if (columns) { - w = columns * cw; - } - if (rows) { - h = rows * ch; - } - // Maintain aspect ratio if only one dimension specified - if (columns && !rows) { - h = Math.round(w * (bitmap.height / bitmap.width)); - } else if (rows && !columns) { - w = Math.round(h * (bitmap.width / bitmap.height)); - } + if (columns) w = columns * cw; + if (rows) h = rows * ch; + + if (columns && !rows) h = Math.round(w * (bitmap.height / bitmap.width)); + else if (rows && !columns) w = Math.round(h * (bitmap.width / bitmap.height)); } - // Check pixel limit - if (w * h > this._opts.pixelLimit) { - console.warn('[KittyHandler] Image exceeds pixel limit'); - return; - } + if (w * h > this._opts.pixelLimit) return; - // Use shared ImageStorage to add the image - // This handles cursor movement and integration with the terminal if (w !== bitmap.width || h !== bitmap.height) { - // Resize if needed const resized = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); this._storage.addImage(resized); } else { @@ -378,23 +620,18 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } /** - * Decode base64 image data into an ImageBitmap. - * Uses the wasm-based decoder from xterm-wasm-parts for better performance. + * Create ImageBitmap from already-decoded image data. */ - private async _decodeImage(image: IKittyImageData): Promise { - const format = image.format; - const base64Data = image.data; + private async _createBitmap(image: IKittyImageData): Promise { + let bytes = image.data; - // TODO: Get this confirmed! - let bytes = this._decodeBase64(base64Data); if (image.compression === KittyCompression.ZLIB) { - bytes = await this._decompressZlib(bytes) as Uint8Array; + bytes = await this._decompressZlib(bytes); } - if (format === KittyFormat.PNG) { - const blob = new Blob([new Uint8Array(bytes)], { type: 'image/png' }); - // Safari fallback pattern (from IIPHandler) + if (image.format === KittyFormat.PNG) { + const blob = new Blob([bytes as BlobPart], { type: 'image/png' }); if (!window.createImageBitmap) { const url = URL.createObjectURL(blob); const img = new Image(); @@ -412,7 +649,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { return createImageBitmap(blob); } - // Raw pixel data (RGB or RGBA) + // Raw pixel data const width = image.width; const height = image.height; @@ -420,26 +657,23 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { throw new Error('Width and height required for raw pixel data'); } - const bytesPerPixel = format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; + const bytesPerPixel = image.format === KittyFormat.RGBA ? BYTES_PER_PIXEL_RGBA : BYTES_PER_PIXEL_RGB; const expectedBytes = width * height * bytesPerPixel; if (bytes.length < expectedBytes) { - throw new Error(`Insufficient pixel data: got ${bytes.length}, expected ${expectedBytes}`); + throw new Error('Insufficient pixel data'); } - // Convert to RGBA ImageData - // TODO: For RGBA, use bytes directly. For RGB, use Uint32Array bit manipulation - // for 5-6x speedup. const pixelCount = width * height; const data = new Uint8ClampedArray(pixelCount * BYTES_PER_PIXEL_RGBA); - const isRgba = format === KittyFormat.RGBA; + const isRgba = image.format === KittyFormat.RGBA; let srcOffset = 0; let dstOffset = 0; for (let i = 0; i < pixelCount; i++) { - data[dstOffset ] = bytes[srcOffset ]; // R - data[dstOffset + 1] = bytes[srcOffset + 1]; // G - data[dstOffset + 2] = bytes[srcOffset + 2]; // B + data[dstOffset] = bytes[srcOffset]; + data[dstOffset + 1] = bytes[srcOffset + 1]; + data[dstOffset + 2] = bytes[srcOffset + 2]; data[dstOffset + 3] = isRgba ? bytes[srcOffset + 3] : ALPHA_OPAQUE; srcOffset += bytesPerPixel; dstOffset += BYTES_PER_PIXEL_RGBA; @@ -448,13 +682,10 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { return createImageBitmap(new ImageData(data, width, height)); } - /** - * Decompress zlib/deflate compressed data using the browser's DecompressionStream API. - */ private async _decompressZlib(compressed: Uint8Array): Promise { try { return await this._decompress(compressed, 'deflate'); - } catch { + } catch (e) { return await this._decompress(compressed, 'deflate-raw'); } } @@ -462,7 +693,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private async _decompress(compressed: Uint8Array, format: 'deflate' | 'deflate-raw'): Promise { const ds = new DecompressionStream(format); const writer = ds.writable.getWriter(); - writer.write(new Uint8Array(compressed) as Uint8Array); + writer.write(compressed as BufferSource); writer.close(); const chunks: Uint8Array[] = []; @@ -481,82 +712,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { result.set(chunk, offset); offset += chunk.length; } - return result; } - /** - * Decode base64 string using the wasm-based decoder for better performance. - * Uses shard-based decoding (1MB chunks) to prevent memory pressure with large images. - */ - private _decodeBase64(base64Data: string): Uint8Array { - const length = base64Data.length; - - // For small data, decode directly without sharding - if (length <= BASE64_SHARD_SIZE) { - return this._decodeBase64Shard(base64Data); - } - - // For large data, decode in 1MB shards and accumulate - // Base64 must be decoded in multiples of 4 chars, so align shard boundaries - const shardSize = BASE64_SHARD_SIZE - (BASE64_SHARD_SIZE % 4); - const chunks: Uint8Array[] = []; - let totalLength = 0; - - for (let offset = 0; offset < length; offset += shardSize) { - const end = Math.min(offset + shardSize, length); - const shard = base64Data.substring(offset, end); - const decoded = this._decodeBase64Shard(shard); - chunks.push(decoded); - totalLength += decoded.length; - } - - // Combine all chunks into final result - const result = new Uint8Array(totalLength); - let writeOffset = 0; - for (const chunk of chunks) { - result.set(chunk, writeOffset); - writeOffset += chunk.length; - } - - return result; - } - - /** - * Decode a single base64 shard using the wasm decoder. - */ - private _decodeBase64Shard(base64Data: string): Uint8Array { - // Calculate exact decoded size from base64 string - // Formula: (encoded_length * 3) / 4 - padding_count - let padding = 0; - if (base64Data.endsWith('==')) padding = 2; - else if (base64Data.endsWith('=')) padding = 1; - const decodedSize = Math.floor(base64Data.length * 3 / 4) - padding; - - // Convert string to Uint32Array of codepoints for the wasm decoder - const codepoints = new Uint32Array(base64Data.length); - for (let i = 0; i < base64Data.length; i++) { - codepoints[i] = base64Data.charCodeAt(i); - } - - const decoder = new Base64Decoder(DECODER_KEEP_DATA); - decoder.init(decodedSize); - decoder.put(codepoints, 0, codepoints.length); - - if (decoder.end()) { - decoder.release(); - throw new Error('Base64 decode failed'); - } - - // Copy the decoded data before releasing - const result = new Uint8Array(decoder.data8); - decoder.release(); - return result; - } - - /** - * Get stored images (for testing/debugging). - */ public get images(): ReadonlyMap { return this._images; } diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index 7afb5b3ba..17ebefc1b 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -93,13 +93,19 @@ export interface IKittyCommand { /** * Pending chunked transmission state. - * Stores metadata from the first chunk while accumulating payload data. + * Stores metadata from the first chunk while accumulating decoded payload data. */ export interface IPendingTransmission { /** The parsed command from the first chunk (contains action, format, dimensions, etc.) */ cmd: IKittyCommand; - /** Accumulated base64 payload data */ - data: string; + /** Accumulated decoded payload chunks */ + chunks: Uint8Array[]; + /** Total size of accumulated chunks */ + totalSize: number; + /** Leftover base64 bytes (0-3) that weren't aligned in previous chunk */ + leftover: Uint32Array; + /** Number of valid bytes in leftover */ + leftoverLength: number; } /** @@ -107,7 +113,8 @@ export interface IPendingTransmission { */ export interface IKittyImageData { id: number; - data: string; + /** Decoded image bytes (already decoded from base64) */ + data: Uint8Array; width: number; height: number; format: 24 | 32 | 100; diff --git a/addons/addon-image/test/ImageAddon.test.ts b/addons/addon-image/test/ImageAddon.test.ts index a7bb25434..923da858c 100644 --- a/addons/addon-image/test/ImageAddon.test.ts +++ b/addons/addon-image/test/ImageAddon.test.ts @@ -77,6 +77,7 @@ const TESTDATA_IIP: [string, [number, number]][] = [ // Kitty graphics test images const KITTY_BLACK_1X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png').toString('base64'); +const KITTY_BLACK_1X1_BYTES = Array.from(readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png')); const KITTY_RGB_3X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/rgb-3x1.png').toString('base64'); let ctx: ITestContext; @@ -386,8 +387,8 @@ test.describe('ImageAddon', () => { await ctx.proxy.write(`\x1b_Ga=t,f=100,i=99;${part2}\x1b\\`); await timeout(100); - const storedData = await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.get(99).data`); - strictEqual(storedData, KITTY_BLACK_1X1_BASE64); + const storedData = await ctx.page.evaluate(`Array.from(window.imageAddon._handlers.get('kitty').images.get(99).data)`); + deepStrictEqual(storedData, KITTY_BLACK_1X1_BYTES); }); test('delete command (a=d) removes specific image by id', async () => { From c9dc99409007234a9b6c3dcd99231f803f93ffa7 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 1 Feb 2026 12:57:45 -0800 Subject: [PATCH 035/124] TODO for file system stufff --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 6886df4e9..38dd97076 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -410,6 +410,16 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } private _handleTransmit(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean { + // TODO: Support file-based transmission modes (t=f, t=t, t=s) + // Currently only supports direct transmission (t=d, the default). + // - t=f (file): Payload is base64-encoded file path. Terminal reads image from that path. + // - t=t (temp file): Payload is base64-encoded path in temp directory. Terminal reads, deletes. + // - t=s Payload is base64-encoded POSIX shm name. Terminal reads from shared memory. + // These modes require filesystem/IPC access not available in browsers. For Node.js/Electron: + // 1. Check cmd.transmission (t key) before treating bytes as image data + // 2. For t=f/t/s: decode bytes as UTF-8 string (the path/name), then read file contents + // 3. For t=d: treat bytes as image data (current behavior) + const pendingKey = cmd.id ?? 0; const isMoreComing = cmd.more === 1; const pending = this._pendingTransmissions.get(pendingKey); From a7c4a160a859136944f4e17ebf545bcf6b23a761 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 1 Feb 2026 13:08:41 -0800 Subject: [PATCH 036/124] flip inControlData thing like in C --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 38dd97076..735ca44ea 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -101,7 +101,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { public put(data: Uint32Array, start: number, end: number): void { if (this._aborted) return; - if (this._inControlData) { + if (!this._inControlData) { + this._streamPayload(data, start, end); + } else { // Scan for semicolon let controlEnd = end; for (let i = start; i < end; i++) { @@ -128,8 +130,6 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._streamPayload(data, payloadStart, end); } } - } else { - this._streamPayload(data, start, end); } } From 429b2882f15c386caa5df4a099a3270120acc75c Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 1 Feb 2026 13:18:46 -0800 Subject: [PATCH 037/124] Terminal eixst --- demo/client/client.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/client/client.ts b/demo/client/client.ts index c16216de4..4996bcd2a 100644 --- a/demo/client/client.ts +++ b/demo/client/client.ts @@ -327,8 +327,8 @@ function createTerminal(): Terminal { } const cols = size.cols; const rows = size.rows; - const pixelWidth = Math.round(term.dimensions?.css?.canvas?.width ?? 0); - const pixelHeight = Math.round(term.dimensions?.css?.canvas?.height ?? 0); + const pixelWidth = Math.round(term!.dimensions?.css?.canvas?.width ?? 0); + const pixelHeight = Math.round(term!.dimensions?.css?.canvas?.height ?? 0); const url = '/terminals/' + pid + '/size?cols=' + cols + '&rows=' + rows + '&pixelWidth=' + pixelWidth + '&pixelHeight=' + pixelHeight; fetch(url, { method: 'POST' }); @@ -380,8 +380,8 @@ function createTerminal(): Terminal { if (useRealTerminal instanceof HTMLInputElement && !useRealTerminal.checked) { runFakeTerminal(); } else { - const pixelWidth = Math.round(term.dimensions?.css?.canvas?.width ?? 0); - const pixelHeight = Math.round(term.dimensions?.css?.canvas?.height ?? 0); + const pixelWidth = Math.round(term!.dimensions?.css?.canvas?.width ?? 0); + const pixelHeight = Math.round(term!.dimensions?.css?.canvas?.height ?? 0); const res = await fetch('/terminals?cols=' + term!.cols + '&rows=' + term!.rows + '&pixelWidth=' + pixelWidth + '&pixelHeight=' + pixelHeight, { method: 'POST' }); const processId = await res.text(); pid = processId; From ae58176bcba97ef6e4c0682f221b15835b8bcba6 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 1 Feb 2026 13:22:02 -0800 Subject: [PATCH 038/124] Lint --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 735ca44ea..028f58d80 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -250,7 +250,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { * Decode partial shard, storing leftover bytes for m=1 chunks. */ private _decodePartialShardWithLeftover(pendingKey: number, cmd: IKittyCommand): boolean { - let length = this._shardBufferPos; + const length = this._shardBufferPos; if (length === 0) return true; // Align to 4 bytes @@ -695,7 +695,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private async _decompressZlib(compressed: Uint8Array): Promise { try { return await this._decompress(compressed, 'deflate'); - } catch (e) { + } catch { return await this._decompress(compressed, 'deflate-raw'); } } From 5f724c59247b723c9880ea4a6025ca3c6a517f32 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 2 Feb 2026 20:17:21 -0800 Subject: [PATCH 039/124] Reduce MAX_CONTROL_DATA_SIZE + EINVAL for i and I --- .../src/kitty/KittyGraphicsHandler.ts | 16 +++++++++- .../src/kitty/KittyGraphicsTypes.ts | 4 +++ addons/addon-image/test/ImageAddon.test.ts | 30 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 028f58d80..f9843644f 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -30,7 +30,7 @@ const BASE64_SHARD_SIZE = 1048576; const DECODED_SHARD_SIZE = 786432; // Maximum control data size -const MAX_CONTROL_DATA_SIZE = 4096; +const MAX_CONTROL_DATA_SIZE = 512; // Semicolon codepoint const SEMICOLON = 0x3B; @@ -211,6 +211,13 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { // Parse command to check m=1 and get pending key const cmd = parseKittyCommand(this._parseControlDataString()); + + // Per spec: specifying both i and I is an error + if (cmd.id !== undefined && cmd.imageNumber !== undefined) { + this._sendResponse(cmd.id, 'EINVAL:cannot specify both i and I keys', cmd.quiet ?? 0); + return true; + } + const pendingKey = cmd.id ?? 0; const isMoreComing = cmd.more === 1; const pending = this._pendingTransmissions.get(pendingKey); @@ -381,6 +388,13 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _handleNoPayloadCommand(): boolean | Promise { const cmd = parseKittyCommand(this._parseControlDataString()); + + // Per spec: specifying both i and I is an error + if (cmd.id !== undefined && cmd.imageNumber !== undefined) { + this._sendResponse(cmd.id, 'EINVAL:cannot specify both i and I keys', cmd.quiet ?? 0); + return true; + } + const action = cmd.action ?? 't'; switch (action) { diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index 17ebefc1b..ef91bf574 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -47,6 +47,8 @@ export const enum KittyKey { FORMAT = 'f', // Image ID for referencing stored images ID = 'i', + // Image number (alternative to ID, terminal assigns ID) + IMAGE_NUMBER = 'I', // Source image width in pixels WIDTH = 's', // Source image height in pixels @@ -79,6 +81,7 @@ export interface IKittyCommand { action?: string; format?: number; id?: number; + imageNumber?: number; width?: number; height?: number; x?: number; @@ -148,6 +151,7 @@ export function parseKittyCommand(data: string): IKittyCommand { switch (key) { case KittyKey.FORMAT: cmd.format = numValue; break; case KittyKey.ID: cmd.id = numValue; break; + case KittyKey.IMAGE_NUMBER: cmd.imageNumber = numValue; break; case KittyKey.WIDTH: cmd.width = numValue; break; case KittyKey.HEIGHT: cmd.height = numValue; break; case KittyKey.X_OFFSET: cmd.x = numValue; break; diff --git a/addons/addon-image/test/ImageAddon.test.ts b/addons/addon-image/test/ImageAddon.test.ts index 923da858c..d07990dc8 100644 --- a/addons/addon-image/test/ImageAddon.test.ts +++ b/addons/addon-image/test/ImageAddon.test.ts @@ -504,6 +504,36 @@ test.describe('ImageAddon', () => { strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); }); + + test('responds with EINVAL when both i and I keys are specified', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + // Per spec: "Specifying both i and I keys in any command is an error" + await ctx.proxy.write(`\x1b_Gi=100,I=200,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=100;EINVAL:cannot specify both i and I keys\x1b\\'); + }); + + test('responds with EINVAL for i+I conflict even without payload', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + // Delete command with both i and I (no payload case) + await ctx.proxy.write('\x1b_Gi=101,I=201,a=d\x1b\\'); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=101;EINVAL:cannot specify both i and I keys\x1b\\'); + }); }); test.describe('Kitty pixel verification', () => { From d44900faa2f9133acac97db03b40e67e0893acf0 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 2 Feb 2026 20:47:29 -0800 Subject: [PATCH 040/124] Parse control data early as suggested --- .../src/kitty/KittyGraphicsHandler.ts | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index f9843644f..810f114fa 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -65,6 +65,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _decodedChunks: Uint8Array[] = []; private _totalDecodedSize = 0; + /** Parsed command. These are the control data before semicolon. */ + private _parsedCommand: IKittyCommand | null = null; + // Storage related states private _pendingTransmissions: Map = new Map(); @@ -96,6 +99,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._shardBufferPos = 0; this._decodedChunks = []; this._totalDecodedSize = 0; + this._parsedCommand = null; } public put(data: Uint32Array, start: number, end: number): void { @@ -124,7 +128,22 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._controlLength += copyLength; if (!this._inControlData) { - // Found semicolon - stream remaining as payload + // Found semicolon - parse control data early for validation + this._parsedCommand = parseKittyCommand(this._parseControlDataString()); + + // Early validation: i+I conflict + if (this._parsedCommand.id !== undefined && this._parsedCommand.imageNumber !== undefined) { + this._sendResponse(this._parsedCommand.id, 'EINVAL:cannot specify both i and I keys', this._parsedCommand.quiet ?? 0); + this._aborted = true; + return; + } + + // Delete action doesn't need payload - skip streaming + if (this._parsedCommand.action === KittyAction.DELETE) { + return; + } + + // Stream remaining as payload const payloadStart = controlEnd + 1; if (payloadStart < end) { this._streamPayload(data, payloadStart, end); @@ -209,13 +228,12 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { return this._handleNoPayloadCommand(); } - // Parse command to check m=1 and get pending key - const cmd = parseKittyCommand(this._parseControlDataString()); + // Use command parsed early in put() - i+I already validated there + const cmd = this._parsedCommand!; - // Per spec: specifying both i and I is an error - if (cmd.id !== undefined && cmd.imageNumber !== undefined) { - this._sendResponse(cmd.id, 'EINVAL:cannot specify both i and I keys', cmd.quiet ?? 0); - return true; + // Delete action was handled by skipping payload - just execute + if (cmd.action === KittyAction.DELETE) { + return this._handleDelete(cmd); } const pendingKey = cmd.id ?? 0; From 1029e19b57c9cb9bc0daab4f1f703c808a476e8c Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 2 Feb 2026 21:27:47 -0800 Subject: [PATCH 041/124] Pre-calculate + fix bug to make sure we dont reset per chunk --- .../src/kitty/KittyGraphicsHandler.ts | 22 +++++++++++-- .../src/kitty/KittyGraphicsTypes.ts | 4 ++- addons/addon-image/test/ImageAddon.test.ts | 33 +++++++++++++++++++ 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 810f114fa..eb2029085 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -65,6 +65,10 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _decodedChunks: Uint8Array[] = []; private _totalDecodedSize = 0; + /** Pre-calculated encoded size limit */ + private _encodedSizeLimit = 0; + private _totalEncodedSize = 0; + /** Parsed command. These are the control data before semicolon. */ private _parsedCommand: IKittyCommand | null = null; @@ -100,6 +104,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._decodedChunks = []; this._totalDecodedSize = 0; this._parsedCommand = null; + // Pre-calculate encoded limit once: base64 is 4 bytes encoded → 3 bytes decoded + this._encodedSizeLimit = Math.ceil(this._opts.kittySizeLimit * 4 / 3); + this._totalEncodedSize = 0; } public put(data: Uint32Array, start: number, end: number): void { @@ -158,9 +165,14 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _streamPayload(data: Uint32Array, start: number, end: number): void { if (this._aborted) return; - // Check size limit - const estimatedTotal = this._totalDecodedSize + Math.ceil(this._shardBufferPos * 3 / 4) + Math.ceil((end - start) * 3 / 4); - if (estimatedTotal > this._opts.kittySizeLimit) { + // Check size limit (compare encoded bytes against pre-calculated limit) + // Include cumulative size from pending transmission for multi-chunk images + const pendingKey = this._parsedCommand?.id ?? 0; + const pending = this._pendingTransmissions.get(pendingKey); + const previousEncodedSize = pending?.totalEncodedSize ?? 0; + this._totalEncodedSize += end - start; + const cumulativeEncodedSize = previousEncodedSize + this._totalEncodedSize; + if (cumulativeEncodedSize > this._encodedSizeLimit) { this._aborted = true; return; } @@ -290,6 +302,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { cmd: { ...cmd }, chunks: [], totalSize: 0, + totalEncodedSize: 0, leftover: new Uint32Array(4), leftoverLength: 0 }; @@ -466,6 +479,8 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { pending.chunks.push(bytes); pending.totalSize += bytes.length; } + // Track cumulative encoded size for size limit enforcement + pending.totalEncodedSize += this._totalEncodedSize; if (isMoreComing) return true; @@ -498,6 +513,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { cmd: { ...cmd }, chunks: bytes.length > 0 ? [bytes] : [], totalSize: bytes.length, + totalEncodedSize: this._totalEncodedSize, leftover: new Uint32Array(4), leftoverLength: 0 }); diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index ef91bf574..d58a51a79 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -103,8 +103,10 @@ export interface IPendingTransmission { cmd: IKittyCommand; /** Accumulated decoded payload chunks */ chunks: Uint8Array[]; - /** Total size of accumulated chunks */ + /** Total size of accumulated decoded chunks */ totalSize: number; + /** Total encoded (base64) bytes received across all chunks - for size limit enforcement */ + totalEncodedSize: number; /** Leftover base64 bytes (0-3) that weren't aligned in previous chunk */ leftover: Uint32Array; /** Number of valid bytes in leftover */ diff --git a/addons/addon-image/test/ImageAddon.test.ts b/addons/addon-image/test/ImageAddon.test.ts index d07990dc8..55282d46c 100644 --- a/addons/addon-image/test/ImageAddon.test.ts +++ b/addons/addon-image/test/ImageAddon.test.ts @@ -391,6 +391,39 @@ test.describe('ImageAddon', () => { deepStrictEqual(storedData, KITTY_BLACK_1X1_BYTES); }); + test('enforces size limit across chunked transmissions', async () => { + // Create a custom addon with very small size limit (100 bytes) + // The 1x1 PNG is ~164 bytes base64, so 2 chunks should exceed 100 + await ctx.page.evaluate(() => { + (window as any).smallLimitAddon = new ImageAddon({ + kittySupport: true, + kittySizeLimit: 100 // Very small limit + }); + (window as any).term.loadAddon((window as any).smallLimitAddon); + }); + + // Split the base64 data into two chunks + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + // Send chunked data - first chunk (~82 bytes) is under limit + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=777,m=1;${part1}\x1b\\`); + await timeout(50); + + // Second chunk brings total to ~164 bytes, exceeding 100 byte limit + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=777;${part2}\x1b\\`); + await timeout(100); + + // Image should NOT be stored due to size limit + strictEqual(await ctx.page.evaluate(`window.smallLimitAddon._handlers.get('kitty').images.has(777)`), false); + + // Cleanup + await ctx.page.evaluate(() => { + (window as any).smallLimitAddon.dispose(); + }); + }); + test('delete command (a=d) removes specific image by id', async () => { await ctx.proxy.write(`\x1b_Ga=t,f=100,i=10;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(50); From c907edd75fa444940026bd51f3c14cb45a03ec61 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 3 Feb 2026 13:53:33 -0800 Subject: [PATCH 042/124] Separate out test, add failing//skip test for cursor placements --- .../src/kitty/KittyGraphicsHandler.ts | 16 + addons/addon-image/test/ImageAddon.test.ts | 309 ---------- addons/addon-image/test/KittyGraphics.test.ts | 553 ++++++++++++++++++ 3 files changed, 569 insertions(+), 309 deletions(-) create mode 100644 addons/addon-image/test/KittyGraphics.test.ts diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index eb2029085..b44200983 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -675,6 +675,22 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } else { this._storage.addImage(bitmap); } + + // TODO: Implement cursor movement per Kitty graphics protocol spec + // Per spec: "After placing an image on the screen the cursor must be moved to the + // right by the number of cols in the image placement rectangle and down by the + // number of rows in the image placement rectangle." + // + // Default behavior (C=0 or unspecified): Move cursor by cols/rows + // With C=1: Don't move cursor at all + // + // Implementation would need: + // 1. Get placement.C value (cursor movement policy) + // 2. Calculate cols = placement.columns || Math.ceil(w / cellWidth) + // 3. Calculate rows = placement.rows || Math.ceil(h / cellHeight) + // 4. If C !== 1: Move cursor right by cols and down by rows + // this._bufferService.buffer.x += cols; + // this._bufferService.buffer.y += rows; } /** diff --git a/addons/addon-image/test/ImageAddon.test.ts b/addons/addon-image/test/ImageAddon.test.ts index 55282d46c..d6178ff50 100644 --- a/addons/addon-image/test/ImageAddon.test.ts +++ b/addons/addon-image/test/ImageAddon.test.ts @@ -75,11 +75,6 @@ const TESTDATA_IIP: [string, [number, number]][] = [ [readFileSync('./addons/addon-image/fixture/iip/w3c_png.iip', { encoding: 'utf-8' }), [72, 48]] ]; -// Kitty graphics test images -const KITTY_BLACK_1X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png').toString('base64'); -const KITTY_BLACK_1X1_BYTES = Array.from(readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png')); -const KITTY_RGB_3X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/rgb-3x1.png').toString('base64'); - let ctx: ITestContext; test.beforeAll(async ({ browser }) => { ctx = await createTestContext(browser); @@ -305,310 +300,6 @@ test.describe('ImageAddon', () => { deepStrictEqual(await getOrigSize(1), TESTDATA_IIP[4][1]); }); }); - - test.describe('Kitty graphics support', () => { - test('stores 1x1 black PNG with a=T (transmit and display)', async () => { - const seq = `\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - strictEqual(await getImageStorageLength(), 1); - deepStrictEqual(await getOrigSize(1), [1, 1]); - }); - - test('stores 3x1 RGB PNG with a=T', async () => { - const seq = `\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - strictEqual(await getImageStorageLength(), 1); - deepStrictEqual(await getOrigSize(1), [3, 1]); - }); - - test('transmit only (a=t) does not display but stores in handler', async () => { - const seq = `\x1b_Ga=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); - }); - - test('uses specified image ID', async () => { - const seq = `\x1b_Ga=t,f=100,i=42;${KITTY_BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(42)`), true); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(1)`), false); - }); - - test('assigns auto-incrementing IDs when not specified', async () => { - await ctx.proxy.write(`\x1b_Ga=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); - await ctx.proxy.write(`\x1b_Ga=t,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`); - await timeout(100); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(1)`), true); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(2)`), true); - }); - - test('defaults to transmit action when action is omitted', async () => { - const seq = `\x1b_Gf=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); - }); - - test('ignores command when action is empty string', async () => { - const seq = `\x1b_Ga=,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); - }); - - test('handles chunked transmission (m=1)', async () => { - const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); - const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); - const part2 = KITTY_BLACK_1X1_BASE64.substring(half); - - const seq1 = `\x1b_Ga=T,f=100,i=99,m=1;${part1}\x1b\\`; - const seq2 = `\x1b_Ga=T,f=100,i=99;${part2}\x1b\\`; - - await ctx.proxy.write(seq1); - await timeout(50); - strictEqual(await getImageStorageLength(), 0); - - await ctx.proxy.write(seq2); - await timeout(100); - strictEqual(await getImageStorageLength(), 1); - }); - - test('verifies chunked data is assembled correctly', async () => { - const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); - const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); - const part2 = KITTY_BLACK_1X1_BASE64.substring(half); - - await ctx.proxy.write(`\x1b_Ga=t,f=100,i=99,m=1;${part1}\x1b\\`); - await ctx.proxy.write(`\x1b_Ga=t,f=100,i=99;${part2}\x1b\\`); - await timeout(100); - - const storedData = await ctx.page.evaluate(`Array.from(window.imageAddon._handlers.get('kitty').images.get(99).data)`); - deepStrictEqual(storedData, KITTY_BLACK_1X1_BYTES); - }); - - test('enforces size limit across chunked transmissions', async () => { - // Create a custom addon with very small size limit (100 bytes) - // The 1x1 PNG is ~164 bytes base64, so 2 chunks should exceed 100 - await ctx.page.evaluate(() => { - (window as any).smallLimitAddon = new ImageAddon({ - kittySupport: true, - kittySizeLimit: 100 // Very small limit - }); - (window as any).term.loadAddon((window as any).smallLimitAddon); - }); - - // Split the base64 data into two chunks - const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); - const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); - const part2 = KITTY_BLACK_1X1_BASE64.substring(half); - - // Send chunked data - first chunk (~82 bytes) is under limit - await ctx.proxy.write(`\x1b_Ga=t,f=100,i=777,m=1;${part1}\x1b\\`); - await timeout(50); - - // Second chunk brings total to ~164 bytes, exceeding 100 byte limit - await ctx.proxy.write(`\x1b_Ga=t,f=100,i=777;${part2}\x1b\\`); - await timeout(100); - - // Image should NOT be stored due to size limit - strictEqual(await ctx.page.evaluate(`window.smallLimitAddon._handlers.get('kitty').images.has(777)`), false); - - // Cleanup - await ctx.page.evaluate(() => { - (window as any).smallLimitAddon.dispose(); - }); - }); - - test('delete command (a=d) removes specific image by id', async () => { - await ctx.proxy.write(`\x1b_Ga=t,f=100,i=10;${KITTY_BLACK_1X1_BASE64}\x1b\\`); - await timeout(50); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); - - await ctx.proxy.write(`\x1b_Ga=d,i=10\x1b\\`); - await timeout(50); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); - }); - - test('delete command (a=d) removes all images when no id specified', async () => { - await ctx.proxy.write(`\x1b_Ga=t,f=100,i=1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); - await ctx.proxy.write(`\x1b_Ga=t,f=100,i=2;${KITTY_RGB_3X1_BASE64}\x1b\\`); - await timeout(50); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); - - await ctx.proxy.write(`\x1b_Ga=d\x1b\\`); - await timeout(50); - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); - }); - }); - - test.describe('Kitty query support (a=q)', () => { - test('responds with OK for capability query without payload', async () => { - let response = ''; - await ctx.page.evaluate(() => { - (window as any).kittyResponse = ''; - (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); - }); - - await ctx.proxy.write('\x1b_Gi=31,a=q;\x1b\\'); - await timeout(100); - - response = await ctx.page.evaluate('window.kittyResponse'); - strictEqual(response, '\x1b_Gi=31;OK\x1b\\'); - }); - - test('responds with OK for valid PNG query', async () => { - let response = ''; - await ctx.page.evaluate(() => { - (window as any).kittyResponse = ''; - (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); - }); - - await ctx.proxy.write(`\x1b_Gi=42,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); - await timeout(100); - - response = await ctx.page.evaluate('window.kittyResponse'); - strictEqual(response, '\x1b_Gi=42;OK\x1b\\'); - }); - - test('query does NOT store the image (unlike transmit)', async () => { - await ctx.page.evaluate(() => { - (window as any).term.onData(() => { /* consume response */ }); - }); - - await ctx.proxy.write(`\x1b_Gi=50,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); - await timeout(100); - - strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(50)`), false); - }); - - test('responds with error for invalid base64', async () => { - let response = ''; - await ctx.page.evaluate(() => { - (window as any).kittyResponse = ''; - (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); - }); - - await ctx.proxy.write('\x1b_Gi=60,a=q,f=100;!!!invalid!!!\x1b\\'); - await timeout(100); - - response = await ctx.page.evaluate('window.kittyResponse'); - strictEqual(response.startsWith('\x1b_Gi=60;EINVAL:'), true); - }); - - test('responds with error for RGB data without dimensions', async () => { - let response = ''; - await ctx.page.evaluate(() => { - (window as any).kittyResponse = ''; - (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); - }); - - await ctx.proxy.write('\x1b_Gi=70,a=q,f=24;AAAA\x1b\\'); - await timeout(100); - - response = await ctx.page.evaluate('window.kittyResponse'); - strictEqual(response, '\x1b_Gi=70;EINVAL:width and height required for raw pixel data\x1b\\'); - }); - - test('suppresses OK response when q=1', async () => { - await ctx.page.evaluate(() => { - (window as any).kittyGotResponse = false; - (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); - }); - - await ctx.proxy.write(`\x1b_Gi=80,a=q,q=1,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); - await timeout(100); - - strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); - }); - - test('suppresses error response when q=2', async () => { - await ctx.page.evaluate(() => { - (window as any).kittyGotResponse = false; - (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); - }); - - await ctx.proxy.write('\x1b_Gi=90,a=q,q=2,f=100;!!!invalid!!!\x1b\\'); - await timeout(100); - - strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); - }); - - test('responds with EINVAL when both i and I keys are specified', async () => { - let response = ''; - await ctx.page.evaluate(() => { - (window as any).kittyResponse = ''; - (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); - }); - - // Per spec: "Specifying both i and I keys in any command is an error" - await ctx.proxy.write(`\x1b_Gi=100,I=200,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); - await timeout(100); - - response = await ctx.page.evaluate('window.kittyResponse'); - strictEqual(response, '\x1b_Gi=100;EINVAL:cannot specify both i and I keys\x1b\\'); - }); - - test('responds with EINVAL for i+I conflict even without payload', async () => { - let response = ''; - await ctx.page.evaluate(() => { - (window as any).kittyResponse = ''; - (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); - }); - - // Delete command with both i and I (no payload case) - await ctx.proxy.write('\x1b_Gi=101,I=201,a=d\x1b\\'); - await timeout(100); - - response = await ctx.page.evaluate('window.kittyResponse'); - strictEqual(response, '\x1b_Gi=101;EINVAL:cannot specify both i and I keys\x1b\\'); - }); - }); - - test.describe('Kitty pixel verification', () => { - test('renders 1x1 black PNG at cursor position', async () => { - const seq = `\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - - const pixel = await ctx.page.evaluate(() => { - const canvas = (window as any).imageAddon.getImageAtBufferCell(0, 0); - if (!canvas) return null; - const ctx = canvas.getContext('2d'); - if (!ctx) return null; - return Array.from(ctx.getImageData(0, 0, 1, 1).data); - }); - - deepStrictEqual(pixel, [0, 0, 0, 255]); - }); - - test('renders 3x1 RGB PNG (red, green, blue pixels)', async () => { - const seq = `\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`; - await ctx.proxy.write(seq); - await timeout(100); - - const pixels = await ctx.page.evaluate(() => { - const canvas = (window as any).imageAddon.getImageAtBufferCell(0, 0); - if (!canvas) return null; - const ctx = canvas.getContext('2d'); - if (!ctx) return null; - const imageData = ctx.getImageData(0, 0, 3, 1).data; - return { - red: Array.from(imageData.slice(0, 4)), - green: Array.from(imageData.slice(4, 8)), - blue: Array.from(imageData.slice(8, 12)) - }; - }); - - deepStrictEqual(pixels?.red, [255, 0, 0, 255]); - deepStrictEqual(pixels?.green, [0, 255, 0, 255]); - deepStrictEqual(pixels?.blue, [0, 0, 255, 255]); - }); - }); }); /** diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts new file mode 100644 index 000000000..c5ef6364e --- /dev/null +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -0,0 +1,553 @@ +/** + * Copyright (c) 2020 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import test from '@playwright/test'; +import { readFileSync } from 'fs'; +import { ITestContext, createTestContext, openTerminal, timeout } from '../../../test/playwright/TestUtils'; +import { deepStrictEqual, strictEqual } from 'assert'; + +/** + * Plugin ctor options. + */ +export interface IImageAddonOptions { + enableSizeReports: boolean; + pixelLimit: number; + storageLimit: number; + showPlaceholder: boolean; + sixelSupport: boolean; + sixelScrolling: boolean; + sixelPaletteLimit: number; + sixelSizeLimit: number; + iipSupport: boolean; + iipSizeLimit: number; + kittySupport: boolean; + kittySizeLimit: number; +} + +// eslint-disable-next-line +declare const ImageAddon: { + new(options?: Partial): any; +}; + +interface IDimensions { + cellWidth: number; + cellHeight: number; + width: number; + height: number; +} + +// Kitty graphics test images +const KITTY_BLACK_1X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png').toString('base64'); +const KITTY_BLACK_1X1_BYTES = Array.from(readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png')); +const KITTY_RGB_3X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/rgb-3x1.png').toString('base64'); + +let ctx: ITestContext; +test.beforeAll(async ({ browser }) => { + ctx = await createTestContext(browser); + await openTerminal(ctx, { cols: 80, rows: 24 }); +}); +test.afterAll(async () => await ctx.page.close()); + +test.describe('Kitty Graphics Protocol', () => { + // TODO: Add tests for larger images with various dimensions + // TODO: Add tests for different compression formats (f=24, f=32) + // TODO: Add tests for image placement keys (x, y, w, h, X, Y, c, r) + // TODO: Add tests for virtual placement (U=1) + // TODO: Add tests for animation frames + // TODO: Add performance tests for streaming large images + // TODO: Implement cursor movement per Kitty spec - cursor should move by cols/rows after placement (unless C=1) + + test.beforeEach(async ({}, testInfo) => { + // DEBT: This test never worked on webkit + if (ctx.browser.browserType().name() === 'webkit') { + testInfo.skip(); + return; + } + await ctx.page.evaluate(` + window.term.reset() + window.imageAddon?.dispose(); + window.imageAddon = new ImageAddon({ sixelPaletteLimit: 512 }); + window.term.loadAddon(window.imageAddon); + `); + }); + + test.describe('Basic transmission and storage', () => { + test('stores 1x1 black PNG with a=T (transmit and display)', async () => { + const seq = `\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [1, 1]); + }); + + test('stores 3x1 RGB PNG with a=T', async () => { + const seq = `\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [3, 1]); + }); + + test('transmit only (a=t) does not display but stores in handler', async () => { + const seq = `\x1b_Ga=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + }); + + test('uses specified image ID', async () => { + const seq = `\x1b_Ga=t,f=100,i=42;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(42)`), true); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(1)`), false); + }); + + test('assigns auto-incrementing IDs when not specified', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(1)`), true); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(2)`), true); + }); + + test('defaults to transmit action when action is omitted', async () => { + const seq = `\x1b_Gf=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + }); + + test('ignores command when action is empty string', async () => { + const seq = `\x1b_Ga=,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); + }); + }); + + test.describe('Chunked transmission', () => { + test('handles chunked transmission (m=1)', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + const seq1 = `\x1b_Ga=T,f=100,i=99,m=1;${part1}\x1b\\`; + const seq2 = `\x1b_Ga=T,f=100,i=99;${part2}\x1b\\`; + + await ctx.proxy.write(seq1); + await timeout(50); + strictEqual(await getImageStorageLength(), 0); + + await ctx.proxy.write(seq2); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + }); + + test('verifies chunked data is assembled correctly', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=99,m=1;${part1}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=99;${part2}\x1b\\`); + await timeout(100); + + const storedData = await ctx.page.evaluate(`Array.from(window.imageAddon._handlers.get('kitty').images.get(99).data)`); + deepStrictEqual(storedData, KITTY_BLACK_1X1_BYTES); + }); + + test('enforces size limit across chunked transmissions', async () => { + // Create a custom addon with very small size limit (100 bytes) + // The 1x1 PNG is ~164 bytes base64, so 2 chunks should exceed 100 + await ctx.page.evaluate(() => { + (window as any).smallLimitAddon = new ImageAddon({ + kittySupport: true, + kittySizeLimit: 100 // Very small limit + }); + (window as any).term.loadAddon((window as any).smallLimitAddon); + }); + + // Split the base64 data into two chunks + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + // Send chunked data - first chunk (~82 bytes) is under limit + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=777,m=1;${part1}\x1b\\`); + await timeout(50); + + // Second chunk brings total to ~164 bytes, exceeding 100 byte limit + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=777;${part2}\x1b\\`); + await timeout(100); + + // Image should NOT be stored due to size limit + strictEqual(await ctx.page.evaluate(`window.smallLimitAddon._handlers.get('kitty').images.has(777)`), false); + + // Cleanup + await ctx.page.evaluate(() => { + (window as any).smallLimitAddon.dispose(); + }); + }); + }); + + test.describe('Delete commands', () => { + test('delete command (a=d) removes specific image by id', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=10;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + + await ctx.proxy.write(`\x1b_Ga=d,i=10\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); + }); + + test('delete command (a=d) removes all images when no id specified', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=2;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); + + await ctx.proxy.write(`\x1b_Ga=d\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); + }); + }); + + test.describe('Query support (a=q)', () => { + test('responds with OK for capability query without payload', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write('\x1b_Gi=31,a=q;\x1b\\'); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=31;OK\x1b\\'); + }); + + test('responds with OK for valid PNG query', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=42,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=42;OK\x1b\\'); + }); + + test('query does NOT store the image (unlike transmit)', async () => { + await ctx.page.evaluate(() => { + (window as any).term.onData(() => { /* consume response */ }); + }); + + await ctx.proxy.write(`\x1b_Gi=50,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(50)`), false); + }); + + test('responds with error for invalid base64', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write('\x1b_Gi=60,a=q,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=60;EINVAL:'), true); + }); + + test('responds with error for RGB data without dimensions', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write('\x1b_Gi=70,a=q,f=24;AAAA\x1b\\'); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=70;EINVAL:width and height required for raw pixel data\x1b\\'); + }); + + test('suppresses OK response when q=1', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write(`\x1b_Gi=80,a=q,q=1,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + + test('suppresses error response when q=2', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write('\x1b_Gi=90,a=q,q=2,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + + test('responds with EINVAL when both i and I keys are specified', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + // Per spec: "Specifying both i and I keys in any command is an error" + await ctx.proxy.write(`\x1b_Gi=100,I=200,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=100;EINVAL:cannot specify both i and I keys\x1b\\'); + }); + + test('responds with EINVAL for i+I conflict even without payload', async () => { + let response = ''; + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + // Delete command with both i and I (no payload case) + await ctx.proxy.write('\x1b_Gi=101,I=201,a=d\x1b\\'); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=101;EINVAL:cannot specify both i and I keys\x1b\\'); + }); + }); + + test.describe('Cursor positioning', () => { + // NOTE: Current tests document ACTUAL behavior (MVP - cursor doesn't move) + // Kitty spec says cursor SHOULD move by cols/rows unless C=1 is specified + // See skipped tests below for spec-compliant behavior + + test('cursor remains at origin after transmit and display (a=T) - CURRENT MVP BEHAVIOR', async () => { + // TODO: This test documents current incomplete behavior + // Per Kitty spec, cursor should move, but MVP implementation doesn't move it + const cursorBefore = await getCursor(); + const seq = `\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + const cursorAfter = await getCursor(); + deepStrictEqual(cursorBefore, [0, 0]); + deepStrictEqual(cursorAfter, [0, 0]); + }); + + test('cursor advances with text before image', async () => { + await ctx.proxy.write('Hello'); + deepStrictEqual(await getCursor(), [5, 0]); + + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + // Cursor should remain at position after "Hello" + deepStrictEqual(await getCursor(), [5, 0]); + }); + + test('cursor advances with text after image', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + deepStrictEqual(await getCursor(), [0, 0]); + + await ctx.proxy.write('World'); + deepStrictEqual(await getCursor(), [5, 0]); + }); + + test('cursor position with multiple images on same line', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(50); + deepStrictEqual(await getCursor(), [0, 0]); + + await ctx.proxy.write('###'); + deepStrictEqual(await getCursor(), [3, 0]); + + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(50); + deepStrictEqual(await getCursor(), [3, 0]); + }); + + test('cursor advances on newline after image', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + deepStrictEqual(await getCursor(), [0, 0]); + + await ctx.proxy.write('\n'); + deepStrictEqual(await getCursor(), [0, 1]); + }); + + test('cursor with placement at specific column (C key)', async () => { + // Move cursor to column 10 + await ctx.proxy.write('\x1b[11G'); // CHA - move to column 10 (1-indexed) + deepStrictEqual(await getCursor(), [10, 0]); + + // Place image with column specification + await ctx.proxy.write(`\x1b_Ga=T,f=100,C=5;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + // Cursor should still be at column 10 (Kitty protocol doesn't move cursor) + deepStrictEqual(await getCursor(), [10, 0]); + }); + + // ============================================================================ + // SPEC-COMPLIANT CURSOR MOVEMENT TESTS (Currently failing - to be implemented) + // ============================================================================ + // Per Kitty spec: "After placing an image on the screen the cursor must be + // moved to the right by the number of cols in the image placement rectangle + // and down by the number of rows in the image placement rectangle." + + test.skip('cursor should move right by cols when image placed (SPEC BEHAVIOR)', async () => { + // TODO: Implement cursor movement per Kitty spec + // When c=5 (5 columns), cursor should move right by 5 + const dim = await getDimensions(); + await ctx.proxy.write(`\x1b_Ga=T,f=100,c=5;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + // Cursor should move right by 5 columns + deepStrictEqual(await getCursor(), [5, 0]); + }); + + test.skip('cursor should move down by rows when image placed (SPEC BEHAVIOR)', async () => { + // TODO: Implement cursor movement per Kitty spec + // When r=3 (3 rows), cursor should move down by 3 + const dim = await getDimensions(); + await ctx.proxy.write(`\x1b_Ga=T,f=100,r=3;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + // Cursor should move down by 3 rows + deepStrictEqual(await getCursor(), [0, 3]); + }); + + test.skip('cursor should move by cols AND rows when both specified (SPEC BEHAVIOR)', async () => { + // TODO: Implement cursor movement per Kitty spec + await ctx.proxy.write(`\x1b_Ga=T,f=100,c=4,r=2;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + // Cursor should move right by 4 cols and down by 2 rows + deepStrictEqual(await getCursor(), [4, 2]); + }); + + test.skip('cursor should NOT move when C=1 is specified (SPEC BEHAVIOR)', async () => { + // TODO: Implement cursor movement per Kitty spec + // C=1 means "no cursor movement" + await ctx.proxy.write(`\x1b_Ga=T,f=100,c=5,r=3,C=1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + // With C=1, cursor should stay at origin even though c=5,r=3 + deepStrictEqual(await getCursor(), [0, 0]); + }); + + test.skip('cursor should calculate cols/rows from image size when not specified (SPEC BEHAVIOR)', async () => { + // TODO: Implement cursor movement per Kitty spec + // When c and r are not specified, they should be calculated from image size + const dim = await getDimensions(); + + // 3x1 image at default cell size should occupy certain columns + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(100); + + // Cursor should move based on image pixel size / cell size + // For 3x1 pixel image, this would be Math.ceil(3/cellWidth) cols and Math.ceil(1/cellHeight) rows + const expectedCols = Math.ceil(3 / dim.cellWidth); + const expectedRows = Math.ceil(1 / dim.cellHeight); + const cursor = await getCursor(); + + // For a 3x1 pixel image, cursor should move at least 1 column and row + // Exact values depend on cell dimensions + strictEqual(cursor[0] >= 1, true, 'cursor should move at least 1 column'); + strictEqual(cursor[1] >= 1, true, 'cursor should move at least 1 row'); + }); + }); + + test.describe('Pixel verification', () => { + test('renders 1x1 black PNG at cursor position', async () => { + const seq = `\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + + const pixel = await ctx.page.evaluate(() => { + const canvas = (window as any).imageAddon.getImageAtBufferCell(0, 0); + if (!canvas) return null; + const ctx = canvas.getContext('2d'); + if (!ctx) return null; + return Array.from(ctx.getImageData(0, 0, 1, 1).data); + }); + + deepStrictEqual(pixel, [0, 0, 0, 255]); + }); + + test('renders 3x1 RGB PNG (red, green, blue pixels)', async () => { + const seq = `\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`; + await ctx.proxy.write(seq); + await timeout(100); + + const pixels = await ctx.page.evaluate(() => { + const canvas = (window as any).imageAddon.getImageAtBufferCell(0, 0); + if (!canvas) return null; + const ctx = canvas.getContext('2d'); + if (!ctx) return null; + const imageData = ctx.getImageData(0, 0, 3, 1).data; + return { + red: Array.from(imageData.slice(0, 4)), + green: Array.from(imageData.slice(4, 8)), + blue: Array.from(imageData.slice(8, 12)) + }; + }); + + deepStrictEqual(pixels?.red, [255, 0, 0, 255]); + deepStrictEqual(pixels?.green, [0, 255, 0, 255]); + deepStrictEqual(pixels?.blue, [0, 0, 255, 255]); + }); + }); +}); + +/** + * Helper functions + */ +async function getDimensions(): Promise { + const dimensions: any = await ctx.page.evaluate(`term.dimensions`); + return { + cellWidth: Math.round(dimensions.css.cell.width), + cellHeight: Math.round(dimensions.css.cell.height), + width: Math.round(dimensions.css.canvas.width), + height: Math.round(dimensions.css.canvas.height) + }; +} + +async function getCursor(): Promise<[number, number]> { + return ctx.page.evaluate('[window.term.buffer.active.cursorX, window.term.buffer.active.cursorY]'); +} + +async function getImageStorageLength(): Promise { + return ctx.page.evaluate('window.imageAddon._storage._images.size'); +} + +async function getOrigSize(id: number): Promise<[number, number]> { + return ctx.page.evaluate(`[ + window.imageAddon._storage._images.get(${id}).orig.width, + window.imageAddon._storage._images.get(${id}).orig.height + ]`); +} From d15b426bd492438f0e6a83e51f23de74f255c407 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 3 Feb 2026 13:53:47 -0800 Subject: [PATCH 043/124] Readme edit for kittySupport --- addons/addon-image/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/addon-image/README.md b/addons/addon-image/README.md index 9fd327e38..dc225d13b 100644 --- a/addons/addon-image/README.md +++ b/addons/addon-image/README.md @@ -30,7 +30,9 @@ const customSettings: IImageAddonOptions = { storageLimit: 128, // FIFO storage limit in MB showPlaceholder: true, // whether to show a placeholder for evicted images iipSupport: true, // enable iTerm IIP support - iipSizeLimit: 20000000 // size limit of a single IIP sequence + iipSizeLimit: 20000000, // size limit of a single IIP sequence + kittySupport: true, // enable Kitty graphics support + kittySizeLimit: 20000000 // size limit of a single Kitty sequence } // initialization From e95ec8d4bc0375882d21d29ad9cac13a67682ee7 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 3 Feb 2026 17:26:59 -0800 Subject: [PATCH 044/124] feed to decoder directly, try to clean things before getting upgraded base64 decoder --- .../src/kitty/KittyGraphicsHandler.ts | 258 ++++++++---------- 1 file changed, 109 insertions(+), 149 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index b44200983..74867cf87 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -23,11 +23,9 @@ import { // Memory limit for base64 decoder (4MB, same as IIPHandler) const DECODER_KEEP_DATA = 4194304; -// Base64 shard size (~1MB, must be divisible by 4) -const BASE64_SHARD_SIZE = 1048576; - -// Decoded shard size: 1MB base64 → 768KB decoded -const DECODED_SHARD_SIZE = 786432; +// Base64 alignment size +// TODO: Remove once decoder handles alignment internally +const BASE64_ALIGNMENT = 4; // Maximum control data size const MAX_CONTROL_DATA_SIZE = 512; @@ -57,9 +55,10 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _controlData = new Uint32Array(MAX_CONTROL_DATA_SIZE); private _controlLength = 0; - /** Shard buffer for base64 bytes (filled until 4-byte aligned boundary). */ - private _shardBuffer = new Uint32Array(BASE64_SHARD_SIZE); - private _shardBufferPos = 0; + /** Leftover base64 bytes (0-3) to preserve 4-byte alignment across chunks. + * TODO: Remove once decoder handles alignment internally */ + private _leftover = new Uint32Array(BASE64_ALIGNMENT); + private _leftoverLength = 0; /** Accumulated decoded chunks. */ private _decodedChunks: Uint8Array[] = []; @@ -100,7 +99,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._decodeError = false; this._inControlData = true; this._controlLength = 0; - this._shardBufferPos = 0; + this._leftoverLength = 0; this._decodedChunks = []; this._totalDecodedSize = 0; this._parsedCommand = null; @@ -177,57 +176,61 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { return; } - const inputLength = end - start; - const freeSpace = BASE64_SHARD_SIZE - this._shardBufferPos; + if (this._decodeError) return; - if (inputLength < freeSpace) { - // Fits in current shard - this._shardBuffer.set(data.subarray(start, end), this._shardBufferPos); - this._shardBufferPos += inputLength; + if (this._leftoverLength === 0 && pending?.leftoverLength) { + this._leftover.set(pending.leftover.subarray(0, pending.leftoverLength), 0); + this._leftoverLength = pending.leftoverLength; + pending.leftoverLength = 0; + } + + const dataLength = end - start; + const totalLength = this._leftoverLength + dataLength; + const alignedLength = Math.floor(totalLength / BASE64_ALIGNMENT) * BASE64_ALIGNMENT; + + if (alignedLength === 0) { + for (let i = start; i < end; i++) { + this._leftover[this._leftoverLength++] = data[i]; + } return; } - // Fill shard to capacity - this._shardBuffer.set(data.subarray(start, start + freeSpace), this._shardBufferPos); - this._shardBufferPos = BASE64_SHARD_SIZE; + const alignedFromData = alignedLength - this._leftoverLength; + const padding = this._countAlignedPadding(data, start, alignedLength); + const decodedSize = Math.floor(alignedLength / 4) * 3 - padding; - // Decode full shard (exactly 1MB → 768KB) - if (!this._decodeFullShard()) { - this._aborted = true; - return; - } + if (decodedSize > 0) { + this._decoder.init(decodedSize); - // Reset and process remaining - this._shardBufferPos = 0; - const remaining = start + freeSpace; - if (remaining < end) { - this._streamPayload(data, remaining, end); - } - } + if (this._leftoverLength > 0 && this._decoder.put(this._leftover, 0, this._leftoverLength)) { + this._decoder.release(); + this._decodeError = true; + return; + } - /** - * Decode a full 1MB shard (768KB output). - */ - private _decodeFullShard(): boolean { - this._decoder.init(DECODED_SHARD_SIZE); + if (alignedFromData > 0 && this._decoder.put(data, start, start + alignedFromData)) { + this._decoder.release(); + this._decodeError = true; + return; + } - if (this._decoder.put(this._shardBuffer, 0, BASE64_SHARD_SIZE)) { + if (this._decoder.end()) { + this._decoder.release(); + this._decodeError = true; + return; + } + + const chunk = new Uint8Array(this._decoder.data8); + this._decodedChunks.push(chunk); + this._totalDecodedSize += chunk.length; this._decoder.release(); - this._decodeError = true; - return false; } - if (this._decoder.end()) { - this._decoder.release(); - this._decodeError = true; - return false; + this._leftoverLength = 0; + const leftoverStart = start + alignedFromData; + for (let i = leftoverStart; i < end; i++) { + this._leftover[this._leftoverLength++] = data[i]; } - - const chunk = new Uint8Array(this._decoder.data8); - this._decodedChunks.push(chunk); - this._totalDecodedSize += chunk.length; - this._decoder.release(); - return true; } public end(success: boolean): boolean | Promise { @@ -252,29 +255,27 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const isMoreComing = cmd.more === 1; const pending = this._pendingTransmissions.get(pendingKey); - // If continuing a pending transmission, prepend leftover bytes - if (pending && pending.leftoverLength > 0) { - // Shift current buffer to make room for leftover - const newPos = pending.leftoverLength + this._shardBufferPos; - if (newPos <= BASE64_SHARD_SIZE) { - // Shift existing data right - for (let i = this._shardBufferPos - 1; i >= 0; i--) { - this._shardBuffer[i + pending.leftoverLength] = this._shardBuffer[i]; + if (isMoreComing) { + if (this._leftoverLength > 0) { + let pendingEntry = pending; + if (!pendingEntry) { + pendingEntry = { + cmd: { ...cmd }, + chunks: [], + totalSize: 0, + totalEncodedSize: 0, + leftover: new Uint32Array(BASE64_ALIGNMENT), + leftoverLength: 0 + }; + this._pendingTransmissions.set(pendingKey, pendingEntry); } - // Prepend leftover - this._shardBuffer.set(pending.leftover.subarray(0, pending.leftoverLength), 0); - this._shardBufferPos = newPos; - } - pending.leftoverLength = 0; - } - - // Decode with 4-byte alignment, preserving leftover if m=1 - if (this._shardBufferPos > 0) { - if (isMoreComing) { - this._decodePartialShardWithLeftover(pendingKey, cmd); - } else { - this._decodePartialShard(); + pendingEntry.leftover.set(this._leftover.subarray(0, this._leftoverLength), 0); + pendingEntry.leftoverLength = this._leftoverLength; } + this._leftoverLength = 0; + } else if (this._leftoverLength > 0) { + this._decodePaddedLeftover(); + this._leftoverLength = 0; } // Combine all decoded chunks @@ -284,114 +285,73 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } /** - * Decode partial shard, storing leftover bytes for m=1 chunks. + * TODO: Remove once decoder handles alignment internally. + * This and related alignment helpers become unnecessary when decoder.init() + * no longer requires decoded size and decoder handles base64 padding. */ - private _decodePartialShardWithLeftover(pendingKey: number, cmd: IKittyCommand): boolean { - const length = this._shardBufferPos; - if (length === 0) return true; - - // Align to 4 bytes - const aligned = Math.floor(length / 4) * 4; - const leftoverCount = length - aligned; - - // Store leftover bytes for next chunk - if (leftoverCount > 0) { - let pending = this._pendingTransmissions.get(pendingKey); - if (!pending) { - pending = { - cmd: { ...cmd }, - chunks: [], - totalSize: 0, - totalEncodedSize: 0, - leftover: new Uint32Array(4), - leftoverLength: 0 - }; - this._pendingTransmissions.set(pendingKey, pending); - } - pending.leftover.set(this._shardBuffer.subarray(aligned, length), 0); - pending.leftoverLength = leftoverCount; - } - - if (aligned === 0) return true; - - // Count padding (shouldn't have padding in m=1 chunks, but be safe) + private _countAlignedPadding( + data: Uint32Array, + start: number, + alignedLength: number + ): number { let padding = 0; - if (aligned >= 1 && this._shardBuffer[aligned - 1] === EQUALS) padding++; - if (aligned >= 2 && this._shardBuffer[aligned - 2] === EQUALS) padding++; - - const decodedSize = Math.floor(aligned * 3 / 4) - padding; - if (decodedSize <= 0) return true; - - this._decoder.init(decodedSize); - - if (this._decoder.put(this._shardBuffer, 0, aligned)) { - this._decoder.release(); - this._decodeError = true; - return false; + if (alignedLength >= 1 && this._getAlignedCharFromEnd(data, start, alignedLength, 1) === EQUALS) { + padding++; } - - if (this._decoder.end()) { - this._decoder.release(); - this._decodeError = true; - return false; + if (alignedLength >= 2 && this._getAlignedCharFromEnd(data, start, alignedLength, 2) === EQUALS) { + padding++; } + return padding; + } - const chunk = new Uint8Array(this._decoder.data8); - this._decodedChunks.push(chunk); - this._totalDecodedSize += chunk.length; - this._decoder.release(); - return true; + private _getAlignedCharFromEnd( + data: Uint32Array, + start: number, + alignedLength: number, + offsetFromEnd: number + ): number { + const index = alignedLength - offsetFromEnd; + if (index < this._leftoverLength) { + return this._leftover[index]; + } + return data[start + index - this._leftoverLength]; } /** - * Decode partial shard with proper 4-byte alignment. - * For final chunks, pad with = if not aligned instead of truncating. + * TODO: Remove once decoder handles alignment internally */ - private _decodePartialShard(): boolean { - let length = this._shardBufferPos; - if (length === 0) return true; + private _decodePaddedLeftover(): void { + if (this._decodeError) return; + if (this._leftoverLength === 0) return; + const padded = new Uint32Array(BASE64_ALIGNMENT); + padded.set(this._leftover.subarray(0, this._leftoverLength), 0); - // Count ORIGINAL padding BEFORE we add any - let padding = 0; - if (length >= 1 && this._shardBuffer[length - 1] === EQUALS) padding++; - if (length >= 2 && this._shardBuffer[length - 2] === EQUALS) padding++; - - // Pad to 4-byte boundary with = if needed (instead of truncating) - const remainder = length % 4; - if (remainder > 0) { - const paddingNeeded = 4 - remainder; - for (let i = 0; i < paddingNeeded; i++) { - this._shardBuffer[length + i] = EQUALS; - } - length += paddingNeeded; - // Count the artificial padding too! - padding += paddingNeeded; + const paddingNeeded = BASE64_ALIGNMENT - this._leftoverLength; + for (let i = 0; i < paddingNeeded; i++) { + padded[this._leftoverLength + i] = EQUALS; } - // Calculate decoded size - const decodedSize = Math.floor(length * 3 / 4) - padding; - if (decodedSize <= 0) return true; + const decodedSize = 3 - paddingNeeded; + if (decodedSize <= 0) return; this._decoder.init(decodedSize); - - if (this._decoder.put(this._shardBuffer, 0, length)) { + if (this._decoder.put(padded, 0, BASE64_ALIGNMENT)) { this._decoder.release(); this._decodeError = true; - return false; + return; } if (this._decoder.end()) { this._decoder.release(); this._decodeError = true; - return false; + return; } const chunk = new Uint8Array(this._decoder.data8); this._decodedChunks.push(chunk); this._totalDecodedSize += chunk.length; this._decoder.release(); - return true; } private _combineChunks(): Uint8Array { From 08f85cf826778f9ff13f1e07cfa2776b00a6782f Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 5 Feb 2026 00:20:39 -0800 Subject: [PATCH 045/124] Use wasm-parts v0.3.0., remove manual sharding/leftover, update iip! --- addons/addon-image/package.json | 2 +- addons/addon-image/src/IIPHandler.ts | 34 +- .../src/kitty/KittyGraphicsHandler.ts | 313 +++++------------- .../src/kitty/KittyGraphicsTypes.ts | 14 +- package-lock.json | 295 +---------------- 5 files changed, 114 insertions(+), 544 deletions(-) diff --git a/addons/addon-image/package.json b/addons/addon-image/package.json index 10933a2e2..5078a57f4 100644 --- a/addons/addon-image/package.json +++ b/addons/addon-image/package.json @@ -25,6 +25,6 @@ }, "devDependencies": { "sixel": "^0.16.0", - "xterm-wasm-parts": "^0.1.0" + "xterm-wasm-parts": "^0.3.0" } } diff --git a/addons/addon-image/src/IIPHandler.ts b/addons/addon-image/src/IIPHandler.ts index cca3f2acb..17ab4c4a9 100644 --- a/addons/addon-image/src/IIPHandler.ts +++ b/addons/addon-image/src/IIPHandler.ts @@ -9,8 +9,10 @@ import Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; import { HeaderParser, IHeaderFields, HeaderState } from './IIPHeaderParser'; import { imageType, UNSUPPORTED_TYPE } from './IIPMetrics'; -// limit hold memory in base64 decoder +// limit hold memory in base64 decoder (encoded bytes) const KEEP_DATA = 4194304; +const INITIAL_DATA = 1048576; +const DECODER_SUCCESS = 0; // default IIP header values const DEFAULT_HEADER: IHeaderFields = { @@ -27,7 +29,7 @@ export class IIPHandler implements IOscHandler, IResetHandler { private _aborted = false; private _hp = new HeaderParser(); private _header: IHeaderFields = DEFAULT_HEADER; - private _dec = new Base64Decoder(KEEP_DATA); + private _dec: Base64Decoder; private _metrics = UNSUPPORTED_TYPE; constructor( @@ -35,7 +37,11 @@ export class IIPHandler implements IOscHandler, IResetHandler { private readonly _renderer: ImageRenderer, private readonly _storage: ImageStorage, private readonly _coreTerminal: ITerminalExt - ) {} + ) { + const maxEncodedBytes = Math.ceil(this._opts.iipSizeLimit * 4 / 3); + const initialBytes = Math.min(INITIAL_DATA, maxEncodedBytes); + this._dec = new Base64Decoder(KEEP_DATA, maxEncodedBytes, initialBytes); + } public reset(): void {} @@ -50,7 +56,7 @@ export class IIPHandler implements IOscHandler, IResetHandler { if (this._aborted) return; if (this._hp.state === HeaderState.END) { - if (this._dec.put(data, start, end)) { + if (this._dec.put(data.subarray(start, end)) !== DECODER_SUCCESS) { this._dec.release(); this._aborted = true; } @@ -66,8 +72,8 @@ export class IIPHandler implements IOscHandler, IResetHandler { this._aborted = true; return; } - this._dec.init(this._header.size); - if (this._dec.put(data, dataPos, end)) { + this._dec.init(); + if (this._dec.put(data.subarray(dataPos, end)) !== DECODER_SUCCESS) { this._dec.release(); this._aborted = true; } @@ -85,13 +91,15 @@ export class IIPHandler implements IOscHandler, IResetHandler { let cond: number | boolean = true; if (cond = success) { if (cond = !this._dec.end()) { - this._metrics = imageType(this._dec.data8); - if (cond = this._metrics.mime !== 'unsupported') { - w = this._metrics.width; - h = this._metrics.height; - if (cond = w && h && w * h < this._opts.pixelLimit) { - [w, h] = this._resize(w, h).map(Math.floor); - cond = w && h && w * h < this._opts.pixelLimit; + if (cond = this._dec.data8.length === this._header.size) { + this._metrics = imageType(this._dec.data8); + if (cond = this._metrics.mime !== 'unsupported') { + w = this._metrics.width; + h = this._metrics.height; + if (cond = w && h && w * h < this._opts.pixelLimit) { + [w, h] = this._resize(w, h).map(Math.floor); + cond = w && h && w * h < this._opts.pixelLimit; + } } } } diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 74867cf87..2c2c4baf5 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -22,10 +22,8 @@ import { // Memory limit for base64 decoder (4MB, same as IIPHandler) const DECODER_KEEP_DATA = 4194304; - -// Base64 alignment size -// TODO: Remove once decoder handles alignment internally -const BASE64_ALIGNMENT = 4; +const DECODER_INITIAL_DATA = 4194304; // 4MB +const DECODER_SUCCESS = 0; // Maximum control data size const MAX_CONTROL_DATA_SIZE = 512; @@ -33,9 +31,6 @@ const MAX_CONTROL_DATA_SIZE = 512; // Semicolon codepoint const SEMICOLON = 0x3B; -// Padding character '=' -const EQUALS = 0x3D; - /** * Kitty graphics protocol handler with streaming base64 decoding. */ @@ -43,8 +38,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _aborted = false; private _decodeError = false; - /** Reusable base64 decoder - avoids WASM cold-start on each chunk */ - private _decoder = new Base64Decoder(DECODER_KEEP_DATA); + private _activeDecoder: Base64Decoder | null = null; + private readonly _maxEncodedBytes: number; + private readonly _initialEncodedBytes: number; // Streaming related states @@ -55,15 +51,6 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _controlData = new Uint32Array(MAX_CONTROL_DATA_SIZE); private _controlLength = 0; - /** Leftover base64 bytes (0-3) to preserve 4-byte alignment across chunks. - * TODO: Remove once decoder handles alignment internally */ - private _leftover = new Uint32Array(BASE64_ALIGNMENT); - private _leftoverLength = 0; - - /** Accumulated decoded chunks. */ - private _decodedChunks: Uint8Array[] = []; - private _totalDecodedSize = 0; - /** Pre-calculated encoded size limit */ private _encodedSizeLimit = 0; private _totalEncodedSize = 0; @@ -83,10 +70,22 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private readonly _renderer: ImageRenderer, private readonly _storage: ImageStorage, private readonly _coreTerminal: ITerminalExt - ) {} + ) { + // Convert decoded size limit -> max encoded bytes. + this._maxEncodedBytes = Math.ceil(this._opts.kittySizeLimit * 4 / 3); + // ensure we preallocate more than configured limit while using 4mb initial size. + this._initialEncodedBytes = Math.min(DECODER_INITIAL_DATA, this._maxEncodedBytes); + } public reset(): void { + for (const pending of this._pendingTransmissions.values()) { + pending.decoder.release(); + } this._pendingTransmissions.clear(); + if (this._activeDecoder) { + this._activeDecoder.release(); + this._activeDecoder = null; + } this._images.clear(); for (const bitmap of this._decodedImages.values()) { bitmap.close(); @@ -99,13 +98,11 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._decodeError = false; this._inControlData = true; this._controlLength = 0; - this._leftoverLength = 0; - this._decodedChunks = []; - this._totalDecodedSize = 0; this._parsedCommand = null; // Pre-calculate encoded limit once: base64 is 4 bytes encoded → 3 bytes decoded - this._encodedSizeLimit = Math.ceil(this._opts.kittySizeLimit * 4 / 3); + this._encodedSizeLimit = this._maxEncodedBytes; this._totalEncodedSize = 0; + this._activeDecoder = null; } public put(data: Uint32Array, start: number, end: number): void { @@ -159,7 +156,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } /** - * Stream payload bytes, decode at 4-byte aligned boundaries. + * Stream payload bytes into the base64 decoder. */ private _streamPayload(data: Uint32Array, start: number, end: number): void { if (this._aborted) return; @@ -172,69 +169,44 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._totalEncodedSize += end - start; const cumulativeEncodedSize = previousEncodedSize + this._totalEncodedSize; if (cumulativeEncodedSize > this._encodedSizeLimit) { + const decoderToRelease = this._activeDecoder ?? pending?.decoder; + if (decoderToRelease) { + decoderToRelease.release(); + } + this._activeDecoder = null; + if (pending) { + this._pendingTransmissions.delete(pendingKey); + } this._aborted = true; return; } if (this._decodeError) return; - if (this._leftoverLength === 0 && pending?.leftoverLength) { - this._leftover.set(pending.leftover.subarray(0, pending.leftoverLength), 0); - this._leftoverLength = pending.leftoverLength; - pending.leftoverLength = 0; + if (pending?.decoder && !this._activeDecoder) { + this._activeDecoder = pending.decoder; + } + if (!this._activeDecoder) { + this._activeDecoder = new Base64Decoder(DECODER_KEEP_DATA, this._maxEncodedBytes, this._initialEncodedBytes); + this._activeDecoder.init(); } - const dataLength = end - start; - const totalLength = this._leftoverLength + dataLength; - const alignedLength = Math.floor(totalLength / BASE64_ALIGNMENT) * BASE64_ALIGNMENT; - - if (alignedLength === 0) { - for (let i = start; i < end; i++) { - this._leftover[this._leftoverLength++] = data[i]; + if (this._activeDecoder.put(data.subarray(start, end)) !== DECODER_SUCCESS) { + this._activeDecoder.release(); + this._activeDecoder = null; + this._decodeError = true; + if (pending) { + this._pendingTransmissions.delete(pendingKey); } - return; - } - - const alignedFromData = alignedLength - this._leftoverLength; - const padding = this._countAlignedPadding(data, start, alignedLength); - const decodedSize = Math.floor(alignedLength / 4) * 3 - padding; - - if (decodedSize > 0) { - this._decoder.init(decodedSize); - - if (this._leftoverLength > 0 && this._decoder.put(this._leftover, 0, this._leftoverLength)) { - this._decoder.release(); - this._decodeError = true; - return; - } - - if (alignedFromData > 0 && this._decoder.put(data, start, start + alignedFromData)) { - this._decoder.release(); - this._decodeError = true; - return; - } - - if (this._decoder.end()) { - this._decoder.release(); - this._decodeError = true; - return; - } - - const chunk = new Uint8Array(this._decoder.data8); - this._decodedChunks.push(chunk); - this._totalDecodedSize += chunk.length; - this._decoder.release(); - } - - this._leftoverLength = 0; - const leftoverStart = start + alignedFromData; - for (let i = leftoverStart; i < end; i++) { - this._leftover[this._leftoverLength++] = data[i]; } } public end(success: boolean): boolean | Promise { if (this._aborted || !success) { + if (this._activeDecoder) { + this._activeDecoder.release(); + this._activeDecoder = null; + } return true; } @@ -256,115 +228,45 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const pending = this._pendingTransmissions.get(pendingKey); if (isMoreComing) { - if (this._leftoverLength > 0) { - let pendingEntry = pending; - if (!pendingEntry) { - pendingEntry = { + if (this._activeDecoder) { + if (pending) { + pending.totalEncodedSize += this._totalEncodedSize; + pending.decodeError = pending.decodeError || this._decodeError; + } else { + this._pendingTransmissions.set(pendingKey, { cmd: { ...cmd }, - chunks: [], - totalSize: 0, - totalEncodedSize: 0, - leftover: new Uint32Array(BASE64_ALIGNMENT), - leftoverLength: 0 - }; - this._pendingTransmissions.set(pendingKey, pendingEntry); + decoder: this._activeDecoder, + totalEncodedSize: this._totalEncodedSize, + decodeError: this._decodeError + }); } - pendingEntry.leftover.set(this._leftover.subarray(0, this._leftoverLength), 0); - pendingEntry.leftoverLength = this._leftoverLength; + this._activeDecoder = null; } - this._leftoverLength = 0; - } else if (this._leftoverLength > 0) { - this._decodePaddedLeftover(); - this._leftoverLength = 0; + return true; } - // Combine all decoded chunks - const imageBytes = this._combineChunks(); + let decodeError = this._decodeError; + let finalCmd = cmd; + let decoder = this._activeDecoder; - return this._handleCommandWithBytesAndCmd(cmd, imageBytes, this._decodeError); - } - - /** - * TODO: Remove once decoder handles alignment internally. - * This and related alignment helpers become unnecessary when decoder.init() - * no longer requires decoded size and decoder handles base64 padding. - */ - private _countAlignedPadding( - data: Uint32Array, - start: number, - alignedLength: number - ): number { - let padding = 0; - if (alignedLength >= 1 && this._getAlignedCharFromEnd(data, start, alignedLength, 1) === EQUALS) { - padding++; - } - if (alignedLength >= 2 && this._getAlignedCharFromEnd(data, start, alignedLength, 2) === EQUALS) { - padding++; - } - return padding; - } - - private _getAlignedCharFromEnd( - data: Uint32Array, - start: number, - alignedLength: number, - offsetFromEnd: number - ): number { - const index = alignedLength - offsetFromEnd; - if (index < this._leftoverLength) { - return this._leftover[index]; - } - return data[start + index - this._leftoverLength]; - } - - /** - * TODO: Remove once decoder handles alignment internally - */ - private _decodePaddedLeftover(): void { - if (this._decodeError) return; - if (this._leftoverLength === 0) return; - - const padded = new Uint32Array(BASE64_ALIGNMENT); - padded.set(this._leftover.subarray(0, this._leftoverLength), 0); - - const paddingNeeded = BASE64_ALIGNMENT - this._leftoverLength; - for (let i = 0; i < paddingNeeded; i++) { - padded[this._leftoverLength + i] = EQUALS; + if (pending) { + finalCmd = pending.cmd; + decoder = pending.decoder; + decodeError = decodeError || pending.decodeError; + this._pendingTransmissions.delete(pendingKey); } - const decodedSize = 3 - paddingNeeded; - if (decodedSize <= 0) return; - - this._decoder.init(decodedSize); - if (this._decoder.put(padded, 0, BASE64_ALIGNMENT)) { - this._decoder.release(); - this._decodeError = true; - return; + let imageBytes = new Uint8Array(0); + if (decoder) { + if (decoder.end() !== DECODER_SUCCESS) { + decodeError = true; + } + imageBytes = decoder.data8; + decoder.release(); } + this._activeDecoder = null; - if (this._decoder.end()) { - this._decoder.release(); - this._decodeError = true; - return; - } - - const chunk = new Uint8Array(this._decoder.data8); - this._decodedChunks.push(chunk); - this._totalDecodedSize += chunk.length; - this._decoder.release(); - } - - private _combineChunks(): Uint8Array { - if (this._decodedChunks.length === 0) return new Uint8Array(0); - if (this._decodedChunks.length === 1) return this._decodedChunks[0]; - - const result = new Uint8Array(this._totalDecodedSize); - let offset = 0; - for (const chunk of this._decodedChunks) { - result.set(chunk, offset); - offset += chunk.length; - } - return result; + return this._handleCommandWithBytesAndCmd(finalCmd, imageBytes, decodeError); } // Command handling @@ -425,62 +327,6 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { // 2. For t=f/t/s: decode bytes as UTF-8 string (the path/name), then read file contents // 3. For t=d: treat bytes as image data (current behavior) - const pendingKey = cmd.id ?? 0; - const isMoreComing = cmd.more === 1; - const pending = this._pendingTransmissions.get(pendingKey); - - - // For m=1 intermediate chunks, reject if decode error - if (decodeError && !pending && isMoreComing) return true; - - if (pending) { - // Append to existing pending transmission (even if decode error, we keep accumulated data) - if (bytes.length > 0) { - pending.chunks.push(bytes); - pending.totalSize += bytes.length; - } - // Track cumulative encoded size for size limit enforcement - pending.totalEncodedSize += this._totalEncodedSize; - - if (isMoreComing) return true; - - // Final chunk - merge all (even if the final chunk had a decode error) - const fullData = this._mergeChunks(pending.chunks, pending.totalSize); - this._pendingTransmissions.delete(pendingKey); - - - if (fullData.length === 0) return true; // Nothing to store - - const id = pending.cmd.id ?? this._nextImageId++; - const image: IKittyImageData = { - id, - data: fullData, - width: pending.cmd.width ?? 0, - height: pending.cmd.height ?? 0, - format: (pending.cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, - compression: pending.cmd.compression ?? '' - }; - this._images.set(id, image); - - // Note: Don't display here - _handleTransmitDisplay will do it - return true; - } - - if (isMoreComing) { - // Start new pending transmission (reject if decode error for first chunk) - if (decodeError) return true; - this._pendingTransmissions.set(pendingKey, { - cmd: { ...cmd }, - chunks: bytes.length > 0 ? [bytes] : [], - totalSize: bytes.length, - totalEncodedSize: this._totalEncodedSize, - leftover: new Uint32Array(4), - leftoverLength: 0 - }); - return true; - } - - // Single-chunk transmission - reject if decode error or no data if (decodeError || bytes.length === 0) return true; const id = cmd.id ?? this._nextImageId++; @@ -496,17 +342,6 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { return true; } - private _mergeChunks(chunks: Uint8Array[], totalSize: number): Uint8Array { - if (chunks.length === 1) return chunks[0]; - const result = new Uint8Array(totalSize); - let offset = 0; - for (const chunk of chunks) { - result.set(chunk, offset); - offset += chunk.length; - } - return result; - } - private _handleTransmitDisplay(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise { if (decodeError) return true; diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index d58a51a79..d5f9c3f3d 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -5,6 +5,8 @@ * Kitty graphics protocol types, constants, and parsing utilities. */ +import type Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; + /** * Kitty graphics protocol action types. * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'. @@ -101,16 +103,12 @@ export interface IKittyCommand { export interface IPendingTransmission { /** The parsed command from the first chunk (contains action, format, dimensions, etc.) */ cmd: IKittyCommand; - /** Accumulated decoded payload chunks */ - chunks: Uint8Array[]; - /** Total size of accumulated decoded chunks */ - totalSize: number; + /** Decoder used across chunked payloads */ + decoder: Base64Decoder; /** Total encoded (base64) bytes received across all chunks - for size limit enforcement */ totalEncodedSize: number; - /** Leftover base64 bytes (0-3) that weren't aligned in previous chunk */ - leftover: Uint32Array; - /** Number of valid bytes in leftover */ - leftoverLength: number; + /** Whether any chunk has failed to decode */ + decodeError: boolean; } /** diff --git a/package-lock.json b/package-lock.json index 1967b9baa..de50eec71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,12 +79,13 @@ "license": "MIT", "devDependencies": { "sixel": "^0.16.0", - "xterm-wasm-parts": "^0.1.0" + "xterm-wasm-parts": "^0.3.0" } }, "addons/addon-kitty-graphics": { "name": "@xterm/addon-kitty-graphics", "version": "0.1.0", + "extraneous": true, "license": "MIT" }, "addons/addon-ligatures": { @@ -1283,102 +1284,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1551,16 +1456,6 @@ "pako": "^2.0.4" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@playwright/test": { "version": "1.57.0", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", @@ -2279,10 +2174,6 @@ "resolved": "addons/addon-image", "link": true }, - "node_modules/@xterm/addon-kitty-graphics": { - "resolved": "addons/addon-kitty-graphics", - "link": true - }, "node_modules/@xterm/addon-ligatures": { "resolved": "addons/addon-ligatures", "link": true @@ -3520,12 +3411,6 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4877,54 +4762,12 @@ "node": ">= 0.10" } }, - "node_modules/inwasm": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/inwasm/-/inwasm-0.0.13.tgz", - "integrity": "sha512-gmULhw1wfF3tQ19y0TvcNH6A5jN7IuTD51kbZuy+ittUU59d+ZTQMb53wbGQuciMrledgagL3/ohnjUj5qJikQ==", + "node_modules/inwasm-runtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/inwasm-runtime/-/inwasm-runtime-0.1.2.tgz", + "integrity": "sha512-in+Lk4d7PGwQnG1zxRe6qHB2nvvc5LUOsI9ByoJRuaDONTY8xDlaF+CvapGoPiqreJ0cMHxRzKtS0SJBccpYfA==", "dev": true, - "dependencies": { - "acorn": "^8.8.2", - "acorn-walk": "^8.2.0", - "chokidar": "^3.5.3", - "colorette": "^2.0.20", - "glob": "^10.0.0", - "wabt": "^1.0.32" - }, - "bin": { - "inwasm": "lib/cli.js" - } - }, - "node_modules/inwasm/node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/inwasm/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT" }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -5424,21 +5267,6 @@ "node": ">=8" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/javascript-natural-sort": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", @@ -5887,15 +5715,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -6433,12 +6252,6 @@ "node": ">=8" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -6526,28 +6339,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -7541,21 +7332,6 @@ "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7568,19 +7344,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -8099,23 +7862,6 @@ "node": ">=18" } }, - "node_modules/wabt": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/wabt/-/wabt-1.0.39.tgz", - "integrity": "sha512-ba+dRL/75VQQY7RkU/CgriGbkoWAfS8TDyUlJfJhJ8KhtXgMl5dhNvoPNUcQ9IWRhW8u41glMSuZeTvsYq2rRg==", - "dev": true, - "bin": { - "wasm-decompile": "bin/wasm-decompile", - "wasm-interp": "bin/wasm-interp", - "wasm-objdump": "bin/wasm-objdump", - "wasm-stats": "bin/wasm-stats", - "wasm-strip": "bin/wasm-strip", - "wasm-validate": "bin/wasm-validate", - "wasm2c": "bin/wasm2c", - "wasm2wat": "bin/wasm2wat", - "wat2wasm": "bin/wat2wasm" - } - }, "node_modules/watchpack": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.0.tgz", @@ -8459,24 +8205,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -8589,12 +8317,13 @@ } }, "node_modules/xterm-wasm-parts": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/xterm-wasm-parts/-/xterm-wasm-parts-0.1.0.tgz", - "integrity": "sha512-GFE8yNJfdkytGpcsOZhkL3B8XyUqkR/Du3SdxRyFbJg+BBCKm3raaaflgIM4TwNQ2AOLz01BEEuB5FZXx8aNTQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xterm-wasm-parts/-/xterm-wasm-parts-0.3.0.tgz", + "integrity": "sha512-V/lhvDv2Scov2ukhTNmmur6jMq2DSL8QOdQdXWgfqcAYbUf7bgixwl2sB1gYPGE21NTw2OvbAw+vANRncWzR4w==", "dev": true, + "license": "MIT", "dependencies": { - "inwasm": "^0.0.13" + "inwasm-runtime": "^0.1.2" } }, "node_modules/y18n": { From a59d527d1a31117f7e9bd157db6f8cf83b9b5135 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 5 Feb 2026 21:38:33 -0800 Subject: [PATCH 046/124] Mirror const enum since esbuild cant inline const enum --- addons/addon-image/src/IIPHandler.ts | 10 ++++++---- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/addons/addon-image/src/IIPHandler.ts b/addons/addon-image/src/IIPHandler.ts index 17ab4c4a9..c0d28c001 100644 --- a/addons/addon-image/src/IIPHandler.ts +++ b/addons/addon-image/src/IIPHandler.ts @@ -5,14 +5,16 @@ import { IImageAddonOptions, IOscHandler, IResetHandler, ITerminalExt } from './Types'; import { ImageRenderer } from './ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; -import Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; +import Base64Decoder, { type DecodeStatus } from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; import { HeaderParser, IHeaderFields, HeaderState } from './IIPHeaderParser'; import { imageType, UNSUPPORTED_TYPE } from './IIPMetrics'; // limit hold memory in base64 decoder (encoded bytes) const KEEP_DATA = 4194304; const INITIAL_DATA = 1048576; -const DECODER_SUCCESS = 0; + +// Local mirror of const enum (esbuild can't inline const enums from external packages) +const DECODER_OK: DecodeStatus.OK = 0; // default IIP header values const DEFAULT_HEADER: IHeaderFields = { @@ -56,7 +58,7 @@ export class IIPHandler implements IOscHandler, IResetHandler { if (this._aborted) return; if (this._hp.state === HeaderState.END) { - if (this._dec.put(data.subarray(start, end)) !== DECODER_SUCCESS) { + if (this._dec.put(data.subarray(start, end)) !== DECODER_OK) { this._dec.release(); this._aborted = true; } @@ -73,7 +75,7 @@ export class IIPHandler implements IOscHandler, IResetHandler { return; } this._dec.init(); - if (this._dec.put(data.subarray(dataPos, end)) !== DECODER_SUCCESS) { + if (this._dec.put(data.subarray(dataPos, end)) !== DECODER_OK) { this._dec.release(); this._aborted = true; } diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 2c2c4baf5..01bb84c63 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -6,7 +6,7 @@ import { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt } from '../Types'; import { ImageRenderer } from '../ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from '../ImageStorage'; -import Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; +import Base64Decoder, { type DecodeStatus } from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; import { KittyAction, KittyFormat, @@ -23,7 +23,9 @@ import { // Memory limit for base64 decoder (4MB, same as IIPHandler) const DECODER_KEEP_DATA = 4194304; const DECODER_INITIAL_DATA = 4194304; // 4MB -const DECODER_SUCCESS = 0; + +// Local mirror of const enum (esbuild can't inline const enums from external packages) +const DECODER_OK: DecodeStatus.OK = 0; // Maximum control data size const MAX_CONTROL_DATA_SIZE = 512; @@ -191,7 +193,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._activeDecoder.init(); } - if (this._activeDecoder.put(data.subarray(start, end)) !== DECODER_SUCCESS) { + if (this._activeDecoder.put(data.subarray(start, end)) !== DECODER_OK) { this._activeDecoder.release(); this._activeDecoder = null; this._decodeError = true; @@ -258,7 +260,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { let imageBytes = new Uint8Array(0); if (decoder) { - if (decoder.end() !== DECODER_SUCCESS) { + if (decoder.end() !== DECODER_OK) { decodeError = true; } imageBytes = decoder.data8; From 596ab845d0c741bea4294ae792e2578f118b708b Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 5 Feb 2026 22:04:04 -0800 Subject: [PATCH 047/124] Make copy of bytes with Uint8Array since they can be reused by decoder --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 01bb84c63..37455c1e6 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -308,9 +308,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { switch (action) { case KittyAction.TRANSMIT: - return this._handleTransmit(cmd, bytes, decodeError); + return this._handleTransmit(cmd, new Uint8Array(bytes), decodeError); case KittyAction.TRANSMIT_DISPLAY: - return this._handleTransmitDisplay(cmd, bytes, decodeError); + return this._handleTransmitDisplay(cmd, new Uint8Array(bytes), decodeError); case KittyAction.QUERY: return this._handleQuery(cmd, bytes, decodeError); default: From 38913e4ae15289227b79da4f9004e1ccd608071c Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 7 Feb 2026 16:09:03 -0800 Subject: [PATCH 048/124] Fix scrolling with touch Part of #5377 --- src/browser/CoreBrowserTerminal.ts | 73 ++++++++++++++++++++++++++++++ src/browser/Viewport.ts | 12 ++--- src/browser/scrollable/touch.ts | 4 ++ 3 files changed, 80 insertions(+), 9 deletions(-) diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index 8ad8409f4..607b12199 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -57,6 +57,7 @@ import { AccessibilityManager } from './AccessibilityManager'; import { Linkifier } from './Linkifier'; import { Emitter, EventUtils, type IEvent } from 'common/Event'; import { addDisposableListener } from 'browser/Dom'; +import { Gesture, EventType as GestureEventType, type IGestureEvent } from 'browser/scrollable/touch'; import { MutableDisposable, toDisposable } from 'common/Lifecycle'; export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { @@ -78,6 +79,7 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { private _customKeyEventHandler: CustomKeyEventHandler | undefined; private _customWheelEventHandler: CustomWheelEventHandler | undefined; + private _touchScrollAccumulator: number = 0; // Browser services private readonly _decorationService: DecorationService; @@ -914,9 +916,80 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { return false; } }, { passive: false })); + + // Touch/gesture scrolling support + this._register(Gesture.addTarget(this.screenElement!)); + this._register(addDisposableListener(this.screenElement!, GestureEventType.START, () => { + this._touchScrollAccumulator = 0; + })); + this._register(addDisposableListener(this.screenElement!, GestureEventType.CHANGE, (e: IGestureEvent) => { + e.preventDefault(); + e.stopPropagation(); + + // When mouse protocol has wheel events active, send as mouse wheel events + if (requestedEvents.wheel) { + this._handleTouchScrollAsWheel(e, sendEvent); + return; + } + + // When in alt buffer (no scrollback), send up/down key sequences + if (!this.buffer.hasScrollback) { + this._handleTouchScrollAsKeys(e); + return; + } + + // Normal scrollback: delegate to viewport + this._viewport?.handleTouchScroll(e.translationY); + })); } + private _handleTouchScrollAsKeys(e: IGestureEvent): void { + const cellHeight = this._renderService?.dimensions.css.cell.height; + if (!cellHeight) return; + + this._touchScrollAccumulator -= e.translationY; + const lines = Math.trunc(this._touchScrollAccumulator / cellHeight); + if (lines === 0) return; + + this._touchScrollAccumulator -= lines * cellHeight; + const sequence = C0.ESC + + (this.coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + + (lines < 0 ? 'A' : 'B'); + for (let i = 0; i < Math.abs(lines); i++) { + this.coreService.triggerDataEvent(sequence, true); + } + } + + private _handleTouchScrollAsWheel(e: IGestureEvent, sendEvent: (ev: MouseEvent | WheelEvent) => boolean): void { + const cellHeight = this._renderService?.dimensions.css.cell.height; + if (!cellHeight) return; + + this._touchScrollAccumulator -= e.translationY; + const lines = Math.trunc(this._touchScrollAccumulator / cellHeight); + if (lines === 0) return; + + this._touchScrollAccumulator -= lines * cellHeight; + + // Get coordinates from gesture event + const pos = this._mouseService?.getMouseReportCoords(e, this.screenElement!); + if (!pos) return; + + for (let i = 0; i < Math.abs(lines); i++) { + this.coreMouseService.triggerMouseEvent({ + col: pos.col, + row: pos.row, + x: pos.x, + y: pos.y, + button: CoreMouseButton.WHEEL, + action: lines < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN, + ctrl: false, + alt: false, + shift: false + }); + } + } + /** * Tells the renderer to refresh terminal content between two rows (inclusive) at the next * opportunity. diff --git a/src/browser/Viewport.ts b/src/browser/Viewport.ts index 09864f7ac..fd98ab7cc 100644 --- a/src/browser/Viewport.ts +++ b/src/browser/Viewport.ts @@ -8,12 +8,11 @@ import { ViewportConstants } from 'browser/shared/Constants'; import { Disposable, toDisposable } from 'common/Lifecycle'; import { IBufferService, ICoreMouseService, IOptionsService } from 'common/services/Services'; import { CoreMouseEventType } from 'common/Types'; -import { addDisposableListener, scheduleAtNextAnimationFrame } from 'browser/Dom'; +import { scheduleAtNextAnimationFrame } from 'browser/Dom'; import { SmoothScrollableElement } from 'browser/scrollable/scrollableElement'; import type { IScrollableElementChangeOptions } from 'browser/scrollable/scrollableElementOptions'; import { Emitter, EventUtils } from 'common/Event'; import { Scrollable, ScrollbarVisibility, type IScrollEvent } from 'browser/scrollable/scrollable'; -import { Gesture, EventType as GestureEventType, type IGestureEvent } from 'browser/scrollable/touch'; export class Viewport extends Disposable { @@ -107,9 +106,6 @@ export class Viewport extends Disposable { this._register(this._scrollableElement.onScroll(e => this._handleScroll(e))); - // Touch/gesture scrolling support - this._register(Gesture.addTarget(screenElement)); - this._register(addDisposableListener(screenElement, GestureEventType.CHANGE, (e: IGestureEvent) => this._handleGestureChange(e))); } public scrollLines(disp: number): void { @@ -204,12 +200,10 @@ export class Viewport extends Disposable { this._isHandlingScroll = false; } - private _handleGestureChange(e: IGestureEvent): void { - e.preventDefault(); - e.stopPropagation(); + public handleTouchScroll(translationY: number): void { const pos = this._scrollableElement.getScrollPosition(); this._scrollableElement.setScrollPosition({ - scrollTop: pos.scrollTop - e.translationY + scrollTop: pos.scrollTop - translationY }); } } diff --git a/src/browser/scrollable/touch.ts b/src/browser/scrollable/touch.ts index cba4e5b57..8ffdfe699 100644 --- a/src/browser/scrollable/touch.ts +++ b/src/browser/scrollable/touch.ts @@ -153,6 +153,8 @@ export interface IGestureEvent extends MouseEvent { translationY: number; pageX: number; pageY: number; + clientX: number; + clientY: number; tapCount: number; } @@ -459,6 +461,8 @@ export class Gesture extends Disposable { evt.translationY = touch.pageY - tail(data.rollingPageY)!; evt.pageX = touch.pageX; evt.pageY = touch.pageY; + evt.clientX = touch.clientX; + evt.clientY = touch.clientY; this._dispatchEvent(evt); if (data.rollingPageX.length > 3) { From cf3939af4aba0c5f0dc5b8c29e23a909583e5e87 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sat, 7 Feb 2026 23:11:19 -0800 Subject: [PATCH 049/124] Remove redundant _decodedImages bitmap cache --- .../src/kitty/KittyGraphicsHandler.ts | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 37455c1e6..ec305b731 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -65,7 +65,6 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _pendingTransmissions: Map = new Map(); private _nextImageId = 1; private _images: Map = new Map(); - private _decodedImages: Map = new Map(); constructor( private readonly _opts: IImageAddonOptions, @@ -89,10 +88,6 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._activeDecoder = null; } this._images.clear(); - for (const bitmap of this._decodedImages.values()) { - bitmap.close(); - } - this._decodedImages.clear(); } public start(): void { @@ -410,17 +405,8 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { if (id !== undefined) { this._images.delete(id); - const bitmap = this._decodedImages.get(id); - if (bitmap) { - bitmap.close(); - this._decodedImages.delete(id); - } } else { this._images.clear(); - for (const bitmap of this._decodedImages.values()) { - bitmap.close(); - } - this._decodedImages.clear(); } return true; } @@ -443,12 +429,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } private async _decodeAndDisplay(image: IKittyImageData, columns?: number, rows?: number): Promise { - let bitmap = this._decodedImages.get(image.id); - - if (!bitmap) { - bitmap = await this._createBitmap(image); - this._decodedImages.set(image.id, bitmap); - } + const bitmap = await this._createBitmap(image); let w = bitmap.width; let h = bitmap.height; From d32089823117d73fd126b5907bc2d22b6d064cce Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sat, 7 Feb 2026 23:30:06 -0800 Subject: [PATCH 050/124] offload raw image data to Blob for off-heap storage --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 9 ++++----- addons/addon-image/src/kitty/KittyGraphicsTypes.ts | 4 ++-- addons/addon-image/test/KittyGraphics.test.ts | 6 +++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index ec305b731..923e19255 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -303,9 +303,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { switch (action) { case KittyAction.TRANSMIT: - return this._handleTransmit(cmd, new Uint8Array(bytes), decodeError); + return this._handleTransmit(cmd, bytes, decodeError); case KittyAction.TRANSMIT_DISPLAY: - return this._handleTransmitDisplay(cmd, new Uint8Array(bytes), decodeError); + return this._handleTransmitDisplay(cmd, bytes, decodeError); case KittyAction.QUERY: return this._handleQuery(cmd, bytes, decodeError); default: @@ -329,7 +329,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const id = cmd.id ?? this._nextImageId++; const image: IKittyImageData = { id, - data: bytes, + data: new Blob([bytes as BlobPart]), width: cmd.width ?? 0, height: cmd.height ?? 0, format: (cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, @@ -475,8 +475,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { * Create ImageBitmap from already-decoded image data. */ private async _createBitmap(image: IKittyImageData): Promise { - let bytes = image.data; - + let bytes: Uint8Array = new Uint8Array(await image.data.arrayBuffer()); if (image.compression === KittyCompression.ZLIB) { bytes = await this._decompressZlib(bytes); diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index d5f9c3f3d..d4e1fe797 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -116,8 +116,8 @@ export interface IPendingTransmission { */ export interface IKittyImageData { id: number; - /** Decoded image bytes (already decoded from base64) */ - data: Uint8Array; + /** Decoded image data stored as Blob (off JS heap) to avoid 2GB heap limit */ + data: Blob; width: number; height: number; format: 24 | 32 | 100; diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index c5ef6364e..7d06b99d6 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -156,7 +156,11 @@ test.describe('Kitty Graphics Protocol', () => { await ctx.proxy.write(`\x1b_Ga=t,f=100,i=99;${part2}\x1b\\`); await timeout(100); - const storedData = await ctx.page.evaluate(`Array.from(window.imageAddon._handlers.get('kitty').images.get(99).data)`); + const storedData = await ctx.page.evaluate(async () => { + const blob = (window as any).imageAddon._handlers.get('kitty').images.get(99).data; + const buffer = await blob.arrayBuffer(); + return Array.from(new Uint8Array(buffer)); + }); deepStrictEqual(storedData, KITTY_BLACK_1X1_BYTES); }); From 5ceb02b9c6ac81f9857673a1ff58366010458be5 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 8 Feb 2026 00:16:01 -0800 Subject: [PATCH 051/124] Release decoder after command ahandler consumes bytes --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 923e19255..9c2ed2929 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -259,11 +259,17 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { decodeError = true; } imageBytes = decoder.data8; - decoder.release(); } this._activeDecoder = null; - return this._handleCommandWithBytesAndCmd(finalCmd, imageBytes, decodeError); + // Handle command first — handlers create Blob/ImageData from imageBytes, + // which copies the data. Only then is it safe to release the decoder's + // wasm memory that imageBytes points into. + const result = this._handleCommandWithBytesAndCmd(finalCmd, imageBytes, decodeError); + if (decoder) { + decoder.release(); + } + return result; } // Command handling From 376268157c8c3796b520c24f0f58289544d9c95e Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 9 Feb 2026 09:35:00 -0800 Subject: [PATCH 052/124] add f=24 rgb, f=32 rgba format tests --- addons/addon-image/test/KittyGraphics.test.ts | 302 ++++++++++++++++-- 1 file changed, 278 insertions(+), 24 deletions(-) diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 7d06b99d6..0cb94b75a 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -43,6 +43,33 @@ const KITTY_BLACK_1X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/ const KITTY_BLACK_1X1_BYTES = Array.from(readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png')); const KITTY_RGB_3X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/rgb-3x1.png').toString('base64'); +// Raw RGB pixel data (f=24): 3 bytes per pixel, no header — requires s= and v= +const RAW_RGB_1X1_BLACK = Buffer.from([0, 0, 0]).toString('base64'); +const RAW_RGB_1X1_RED = Buffer.from([255, 0, 0]).toString('base64'); +const RAW_RGB_3X1 = Buffer.from([ + 255, 0, 0, + 0, 255, 0, + 0, 0, 255 +]).toString('base64'); +const RAW_RGB_2X2 = Buffer.from([ + 255, 0, 0, 0, 255, 0, + 0, 0, 255, 255, 255, 0 +]).toString('base64'); + +// Raw RGBA pixel data (f=32): 4 bytes per pixel, no header — requires s= and v= +const RAW_RGBA_1X1_WHITE = Buffer.from([255, 255, 255, 255]).toString('base64'); +const RAW_RGBA_1X1_RED = Buffer.from([255, 0, 0, 255]).toString('base64'); +const RAW_RGBA_1X1_TRANSPARENT = Buffer.from([0, 0, 0, 0]).toString('base64'); +const RAW_RGBA_3X1 = Buffer.from([ + 255, 0, 0, 255, + 0, 255, 0, 255, + 0, 0, 255, 255 +]).toString('base64'); +const RAW_RGBA_2X2 = Buffer.from([ + 255, 0, 0, 255, 0, 255, 0, 255, + 0, 0, 255, 255, 255, 255, 0, 255 +]).toString('base64'); + let ctx: ITestContext; test.beforeAll(async ({ browser }) => { ctx = await createTestContext(browser); @@ -52,7 +79,6 @@ test.afterAll(async () => await ctx.page.close()); test.describe('Kitty Graphics Protocol', () => { // TODO: Add tests for larger images with various dimensions - // TODO: Add tests for different compression formats (f=24, f=32) // TODO: Add tests for image placement keys (x, y, w, h, X, Y, c, r) // TODO: Add tests for virtual placement (U=1) // TODO: Add tests for animation frames @@ -492,15 +518,7 @@ test.describe('Kitty Graphics Protocol', () => { await ctx.proxy.write(seq); await timeout(100); - const pixel = await ctx.page.evaluate(() => { - const canvas = (window as any).imageAddon.getImageAtBufferCell(0, 0); - if (!canvas) return null; - const ctx = canvas.getContext('2d'); - if (!ctx) return null; - return Array.from(ctx.getImageData(0, 0, 1, 1).data); - }); - - deepStrictEqual(pixel, [0, 0, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 0, 0), [0, 0, 0, 255]); }); test('renders 3x1 RGB PNG (red, green, blue pixels)', async () => { @@ -508,22 +526,238 @@ test.describe('Kitty Graphics Protocol', () => { await ctx.proxy.write(seq); await timeout(100); - const pixels = await ctx.page.evaluate(() => { - const canvas = (window as any).imageAddon.getImageAtBufferCell(0, 0); - if (!canvas) return null; - const ctx = canvas.getContext('2d'); - if (!ctx) return null; - const imageData = ctx.getImageData(0, 0, 3, 1).data; - return { - red: Array.from(imageData.slice(0, 4)), - green: Array.from(imageData.slice(4, 8)), - blue: Array.from(imageData.slice(8, 12)) - }; + const pixels = await getPixels(0, 0, 0, 0, 3, 1); + + deepStrictEqual(pixels?.slice(0, 4), [255, 0, 0, 255]); + deepStrictEqual(pixels?.slice(4, 8), [0, 255, 0, 255]); + deepStrictEqual(pixels?.slice(8, 12), [0, 0, 255, 255]); + }); + }); + + test.describe('Raw RGB pixel format (f=24)', () => { + test.describe('Pixel verification', () => { + test('renders 1x1 black pixel with alpha set to 255', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=1,v=1;${RAW_RGB_1X1_BLACK}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [0, 0, 0, 255]); }); - deepStrictEqual(pixels?.red, [255, 0, 0, 255]); - deepStrictEqual(pixels?.green, [0, 255, 0, 255]); - deepStrictEqual(pixels?.blue, [0, 0, 255, 255]); + test('renders 1x1 red pixel with alpha set to 255', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=1,v=1;${RAW_RGB_1X1_RED}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + }); + + test('renders 3x1 strip (red, green, blue)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=3,v=1;${RAW_RGB_3X1}\x1b\\`); + await timeout(100); + + const pixels = await getPixels(0, 0, 0, 0, 3, 1); + deepStrictEqual(pixels?.slice(0, 4), [255, 0, 0, 255]); + deepStrictEqual(pixels?.slice(4, 8), [0, 255, 0, 255]); + deepStrictEqual(pixels?.slice(8, 12), [0, 0, 255, 255]); + }); + + test('renders 2x2 grid with correct pixel layout', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=2,v=2;${RAW_RGB_2X2}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 1, 0), [0, 255, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 0, 1), [0, 0, 255, 255]); + deepStrictEqual(await getPixel(0, 0, 1, 1), [255, 255, 0, 255]); + }); + }); + + test.describe('Storage and dimensions', () => { + test('stores image with correct original dimensions (3x1)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=3,v=1;${RAW_RGB_3X1}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [3, 1]); + }); + + test('stores image with correct original dimensions (2x2)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=2,v=2;${RAW_RGB_2X2}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [2, 2]); + }); + }); + + test.describe('Validation', () => { + test('does not render without width (s=)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,v=1;${RAW_RGB_1X1_BLACK}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + }); + + test('does not render without height (v=)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=1;${RAW_RGB_1X1_BLACK}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + }); + + test('does not render without either dimension', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24;${RAW_RGB_1X1_BLACK}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + }); + + test('does not render with insufficient byte count', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=2,v=2;${RAW_RGB_1X1_BLACK}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + }); + + test('query returns EINVAL without dimensions', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + await ctx.proxy.write(`\x1b_Gi=200,a=q,f=24;${RAW_RGB_1X1_BLACK}\x1b\\`); + await timeout(100); + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=200;EINVAL:width and height required for raw pixel data\x1b\\'); + }); + + test('query returns EINVAL for insufficient pixel data', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + await ctx.proxy.write(`\x1b_Gi=201,a=q,f=24,s=2,v=2;${RAW_RGB_1X1_BLACK}\x1b\\`); + await timeout(100); + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=201;EINVAL:insufficient pixel data\x1b\\'); + }); + + test('query returns OK for valid RGB data with correct dimensions', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + await ctx.proxy.write(`\x1b_Gi=202,a=q,f=24,s=1,v=1;${RAW_RGB_1X1_RED}\x1b\\`); + await timeout(100); + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=202;OK\x1b\\'); + }); + }); + }); + + test.describe('Raw RGBA pixel format (f=32)', () => { + test.describe('Pixel verification', () => { + test('renders 1x1 opaque white pixel', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=1,v=1;${RAW_RGBA_1X1_WHITE}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 255, 255, 255]); + }); + + test('renders 1x1 opaque red pixel', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=1,v=1;${RAW_RGBA_1X1_RED}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + }); + + test('preserves full transparency (alpha=0)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=1,v=1;${RAW_RGBA_1X1_TRANSPARENT}\x1b\\`); + await timeout(100); + const pixel = await getPixel(0, 0, 0, 0); + strictEqual(pixel?.[3], 0); + }); + + test('renders 3x1 strip (red, green, blue opaque)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=3,v=1;${RAW_RGBA_3X1}\x1b\\`); + await timeout(100); + + const pixels = await getPixels(0, 0, 0, 0, 3, 1); + deepStrictEqual(pixels?.slice(0, 4), [255, 0, 0, 255]); + deepStrictEqual(pixels?.slice(4, 8), [0, 255, 0, 255]); + deepStrictEqual(pixels?.slice(8, 12), [0, 0, 255, 255]); + }); + + test('renders 2x2 grid with correct pixel layout', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=2,v=2;${RAW_RGBA_2X2}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 1, 0), [0, 255, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 0, 1), [0, 0, 255, 255]); + deepStrictEqual(await getPixel(0, 0, 1, 1), [255, 255, 0, 255]); + }); + }); + + test.describe('Storage and dimensions', () => { + test('stores image with correct original dimensions (3x1)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=3,v=1;${RAW_RGBA_3X1}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [3, 1]); + }); + + test('stores image with correct original dimensions (2x2)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=2,v=2;${RAW_RGBA_2X2}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [2, 2]); + }); + }); + + test.describe('Validation', () => { + test('does not render without width (s=)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,v=1;${RAW_RGBA_1X1_RED}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + }); + + test('does not render without height (v=)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=1;${RAW_RGBA_1X1_RED}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + }); + + test('does not render without either dimension', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32;${RAW_RGBA_1X1_RED}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + }); + + test('does not render with insufficient byte count', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=2,v=2;${RAW_RGBA_1X1_RED}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + }); + + test('query returns EINVAL without dimensions', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + await ctx.proxy.write(`\x1b_Gi=300,a=q,f=32;${RAW_RGBA_1X1_RED}\x1b\\`); + await timeout(100); + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=300;EINVAL:width and height required for raw pixel data\x1b\\'); + }); + + test('query returns EINVAL for insufficient pixel data', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + await ctx.proxy.write(`\x1b_Gi=301,a=q,f=32,s=2,v=2;${RAW_RGBA_1X1_RED}\x1b\\`); + await timeout(100); + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=301;EINVAL:insufficient pixel data\x1b\\'); + }); + + test('query returns OK for valid RGBA data with correct dimensions', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + await ctx.proxy.write(`\x1b_Gi=302,a=q,f=32,s=1,v=1;${RAW_RGBA_1X1_RED}\x1b\\`); + await timeout(100); + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=302;OK\x1b\\'); + }); }); }); }); @@ -555,3 +789,23 @@ async function getOrigSize(id: number): Promise<[number, number]> { window.imageAddon._storage._images.get(${id}).orig.height ]`); } + +async function getPixel(col: number, row: number, x: number, y: number): Promise { + return ctx.page.evaluate(([col, row, x, y]: number[]) => { + const canvas = (window as any).imageAddon.getImageAtBufferCell(col, row); + if (!canvas) return null; + const ctx2d = canvas.getContext('2d'); + if (!ctx2d) return null; + return Array.from(ctx2d.getImageData(x, y, 1, 1).data); + }, [col, row, x, y]); +} + +async function getPixels(col: number, row: number, x: number, y: number, w: number, h: number): Promise { + return ctx.page.evaluate(([col, row, x, y, w, h]: number[]) => { + const canvas = (window as any).imageAddon.getImageAtBufferCell(col, row); + if (!canvas) return null; + const ctx2d = canvas.getContext('2d'); + if (!ctx2d) return null; + return Array.from(ctx2d.getImageData(x, y, w, h).data); + }, [col, row, x, y, w, h]); +} From fcb3cc1a21a5debaa35c11c732fdea56bbf7e81d Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 9 Feb 2026 11:31:20 -0800 Subject: [PATCH 053/124] add delelteImage, map kitty ID to storage IDs --- addons/addon-image/src/ImageStorage.ts | 18 ++++++++++++-- .../src/kitty/KittyGraphicsHandler.ts | 24 +++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/addons/addon-image/src/ImageStorage.ts b/addons/addon-image/src/ImageStorage.ts index aea9b5e5f..03925f0b0 100644 --- a/addons/addon-image/src/ImageStorage.ts +++ b/addons/addon-image/src/ImageStorage.ts @@ -235,9 +235,22 @@ export class ImageStorage implements IDisposable { } /** - * Method to add an image to the storage. + * Delete an image by its internal storage ID. + * Used by protocols that support explicit deletion (e.g. Kitty a=d). */ - public addImage(img: HTMLCanvasElement | ImageBitmap): void { + public deleteImage(id: number): void { + const spec = this._images.get(id); + if (spec) { + spec.marker?.dispose(); + this._delImg(id); + } + } + + /** + * Method to add an image to the storage. + * Returns the internal image ID assigned to the stored image. + */ + public addImage(img: HTMLCanvasElement | ImageBitmap): number { // never allow storage to exceed memory limit this._evictOldest(img.width * img.height); @@ -331,6 +344,7 @@ export class ImageStorage implements IDisposable { // finally add the image this._images.set(imageId, imgSpec); + return imageId; } diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 9c2ed2929..1062a3cc9 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -64,6 +64,14 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { private _pendingTransmissions: Map = new Map(); private _nextImageId = 1; + /** Maps Kitty protocol image ID → ImageStorage internal ID for deletion/lookup. */ + private _kittyIdToStorageId: Map = new Map(); + // TODO: Eliminate double storage — raw image data lives here (as Blob) AND rendered + // ImageBitmaps live in ImageStorage. Currently we only use ImageStorage.addImage(bitmap) + // for tiling + cursor movement + marker-based eviction. + // + + // See: https://github.com/xtermjs/xterm.js/pull/5619#issuecomment-3853678815 private _images: Map = new Map(); constructor( @@ -88,6 +96,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._activeDecoder = null; } this._images.clear(); + this._kittyIdToStorageId.clear(); } public start(): void { @@ -411,8 +420,17 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { if (id !== undefined) { this._images.delete(id); + const storageId = this._kittyIdToStorageId.get(id); + if (storageId !== undefined) { + this._storage.deleteImage(storageId); + this._kittyIdToStorageId.delete(id); + } } else { this._images.clear(); + for (const storageId of this._kittyIdToStorageId.values()) { + this._storage.deleteImage(storageId); + } + this._kittyIdToStorageId.clear(); } return true; } @@ -453,12 +471,14 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { if (w * h > this._opts.pixelLimit) return; + let storageId: number; if (w !== bitmap.width || h !== bitmap.height) { const resized = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); - this._storage.addImage(resized); + storageId = this._storage.addImage(resized); } else { - this._storage.addImage(bitmap); + storageId = this._storage.addImage(bitmap); } + this._kittyIdToStorageId.set(image.id, storageId); // TODO: Implement cursor movement per Kitty graphics protocol spec // Per spec: "After placing an image on the screen the cursor must be moved to the From be44833f12641a3408e793cb24670dbc10e2300f Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 9 Feb 2026 13:04:34 -0800 Subject: [PATCH 054/124] send OK response for a=t, a=T transmissions when image id present --- .../src/kitty/KittyGraphicsHandler.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 1062a3cc9..18cdc65c9 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -317,8 +317,13 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const action = cmd.action ?? 't'; switch (action) { - case KittyAction.TRANSMIT: - return this._handleTransmit(cmd, bytes, decodeError); + case KittyAction.TRANSMIT: { + const result = this._handleTransmit(cmd, bytes, decodeError); + if (cmd.id !== undefined && !decodeError && bytes.length > 0) { + this._sendResponse(cmd.id, 'OK', cmd.quiet ?? 0); + } + return result; + } case KittyAction.TRANSMIT_DISPLAY: return this._handleTransmitDisplay(cmd, bytes, decodeError); case KittyAction.QUERY: @@ -368,7 +373,14 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const id = cmd.id ?? this._nextImageId - 1; const image = this._images.get(id); if (image) { - return this._displayImage(image, cmd.columns, cmd.rows); + const result = this._displayImage(image, cmd.columns, cmd.rows); + if (cmd.id !== undefined) { + return (result as Promise).then(r => { + this._sendResponse(id, 'OK', cmd.quiet ?? 0); + return r; + }); + } + return result; } return true; } From d7ba56cd282db94181f2344a8ae73ec58fb0ad02 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 9 Feb 2026 13:19:41 -0800 Subject: [PATCH 055/124] default format png -> rgba perspec --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 18cdc65c9..9739d3d3e 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -352,7 +352,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { data: new Blob([bytes as BlobPart]), width: cmd.width ?? 0, height: cmd.height ?? 0, - format: (cmd.format ?? KittyFormat.PNG) as 24 | 32 | 100, + format: (cmd.format ?? KittyFormat.RGBA) as 24 | 32 | 100, compression: cmd.compression ?? '' }; this._images.set(id, image); From c11a8f43f43ce75caeb7af213e146ee3c01cfe1e Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 9 Feb 2026 13:34:27 -0800 Subject: [PATCH 056/124] abort in-flight kitty chunks on delete --- .../src/kitty/KittyGraphicsHandler.ts | 17 +++++ addons/addon-image/test/KittyGraphics.test.ts | 67 ++++++++++++++++++- 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 9739d3d3e..0262af6a2 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -431,6 +431,13 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const id = cmd.id; if (id !== undefined) { + // Abort in-flight chunked upload for this specific image + const pending = this._pendingTransmissions.get(id); + if (pending) { + pending.decoder.release(); + this._pendingTransmissions.delete(id); + } + this._images.delete(id); const storageId = this._kittyIdToStorageId.get(id); if (storageId !== undefined) { @@ -438,6 +445,12 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._kittyIdToStorageId.delete(id); } } else { + // Abort all in-flight chunked uploads + for (const pending of this._pendingTransmissions.values()) { + pending.decoder.release(); + } + this._pendingTransmissions.clear(); + this._images.clear(); for (const storageId of this._kittyIdToStorageId.values()) { this._storage.deleteImage(storageId); @@ -607,4 +620,8 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { public get images(): ReadonlyMap { return this._images; } + + public get pendingTransmissions(): ReadonlyMap { + return this._pendingTransmissions; + } } diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 0cb94b75a..2ddd5eb4c 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -6,7 +6,7 @@ import test from '@playwright/test'; import { readFileSync } from 'fs'; import { ITestContext, createTestContext, openTerminal, timeout } from '../../../test/playwright/TestUtils'; -import { deepStrictEqual, strictEqual } from 'assert'; +import { deepStrictEqual, ok, strictEqual } from 'assert'; /** * Plugin ctor options. @@ -245,6 +245,71 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(50); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); }); + + test('delete by id aborts in-flight chunked upload', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=50,m=1;${part1}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 1); + + await ctx.proxy.write(`\x1b_Ga=d,i=50\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 0); + }); + + test('delete by id only aborts targeted upload, not others', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=55,m=1;${part1}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=56,m=1;${part1}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 2); + + await ctx.proxy.write(`\x1b_Ga=d,i=55\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.has(56)`), true); + }); + + test('delete all aborts in-flight chunked upload', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=60,m=1;${part1}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=61,m=1;${part1}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 2); + + await ctx.proxy.write(`\x1b_Ga=d\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 0); + }); + + test('chunks sent after delete are not assembled with previous data', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=70,m=1;${part1}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 1); + + await ctx.proxy.write(`\x1b_Ga=d\x1b\\`); + await timeout(50); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=70;${part2}\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(70)`), true); + const storedSize: number = await ctx.page.evaluate(async () => { + const blob = (window as any).imageAddon._handlers.get('kitty').images.get(70).data; + return blob.size; + }); + ok(storedSize < KITTY_BLACK_1X1_BYTES.length, 'stored data should be smaller than full image (only second half)'); + }); }); test.describe('Query support (a=q)', () => { From a4502a6d002eb2cd47e88e3ce9d79d3aa837b9c7 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 9 Feb 2026 14:30:35 -0800 Subject: [PATCH 057/124] Impelement cursor movement after image placement --- .../src/kitty/KittyGraphicsHandler.ts | 62 ++++++------ .../src/kitty/KittyGraphicsTypes.test.ts | 10 ++ .../src/kitty/KittyGraphicsTypes.ts | 6 +- addons/addon-image/test/KittyGraphics.test.ts | 97 ++++++------------- 4 files changed, 81 insertions(+), 94 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 0262af6a2..a6d46f5b8 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -373,7 +373,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const id = cmd.id ?? this._nextImageId - 1; const image = this._images.get(id); if (image) { - const result = this._displayImage(image, cmd.columns, cmd.rows); + const result = this._displayImage(image, cmd); if (cmd.id !== undefined) { return (result as Promise).then(r => { this._sendResponse(id, 'OK', cmd.quiet ?? 0); @@ -471,31 +471,39 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { // Image display - private _displayImage(image: IKittyImageData, columns?: number, rows?: number): boolean | Promise { - return this._decodeAndDisplay(image, columns, rows) + private _displayImage(image: IKittyImageData, cmd: IKittyCommand): boolean | Promise { + return this._decodeAndDisplay(image, cmd) .then(() => true) .catch(() => true); } - private async _decodeAndDisplay(image: IKittyImageData, columns?: number, rows?: number): Promise { + private async _decodeAndDisplay(image: IKittyImageData, cmd: IKittyCommand): Promise { const bitmap = await this._createBitmap(image); + const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width; + const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height; + + // Per spec: c/r default to image's natural cell dimensions + const imgCols = cmd.columns ?? Math.ceil(bitmap.width / cw); + const imgRows = cmd.rows ?? Math.ceil(bitmap.height / ch); + let w = bitmap.width; let h = bitmap.height; - if (columns || rows) { - const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width; - const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height; - - if (columns) w = columns * cw; - if (rows) h = rows * ch; - - if (columns && !rows) h = Math.round(w * (bitmap.height / bitmap.width)); - else if (rows && !columns) w = Math.round(h * (bitmap.width / bitmap.height)); + // Scale bitmap to fit placement rectangle when c/r are specified + if (cmd.columns !== undefined || cmd.rows !== undefined) { + w = Math.round(imgCols * cw); + h = Math.round(imgRows * ch); } if (w * h > this._opts.pixelLimit) return; + // Save cursor position before addImage modifies it + const buffer = this._coreTerminal._core.buffer; + const savedX = buffer.x; + const savedY = buffer.y; + const savedYbase = buffer.ybase; + let storageId: number; if (w !== bitmap.width || h !== bitmap.height) { const resized = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); @@ -505,21 +513,19 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } this._kittyIdToStorageId.set(image.id, storageId); - // TODO: Implement cursor movement per Kitty graphics protocol spec - // Per spec: "After placing an image on the screen the cursor must be moved to the - // right by the number of cols in the image placement rectangle and down by the - // number of rows in the image placement rectangle." - // - // Default behavior (C=0 or unspecified): Move cursor by cols/rows - // With C=1: Don't move cursor at all - // - // Implementation would need: - // 1. Get placement.C value (cursor movement policy) - // 2. Calculate cols = placement.columns || Math.ceil(w / cellWidth) - // 3. Calculate rows = placement.rows || Math.ceil(h / cellHeight) - // 4. If C !== 1: Move cursor right by cols and down by rows - // this._bufferService.buffer.x += cols; - // this._bufferService.buffer.y += rows; + // Kitty cursor movement + // Per spec: cursor placed at first column after last image column, + // on the last row of the image. C=1 means don't move cursor. + if (cmd.cursorMovement === 1) { + // C=1: restore cursor to position before image was placed + const scrolled = buffer.ybase - savedYbase; + buffer.x = savedX; + buffer.y = Math.max(savedY - scrolled, 0); + } else { + // Default (C=0): advance cursor horizontally past the image + // addImage already positioned cursor on the last row via lineFeeds + buffer.x = Math.min(savedX + imgCols, this._coreTerminal.cols); + } } /** diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts index 1bbfac675..ac79c09ab 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts @@ -64,6 +64,16 @@ describe('KittyGraphicsTypes', () => { assert.strictEqual(cmd.compression, 'z'); }); + it('should parse cursor movement key', () => { + const cmd = parseKittyCommand('a=T,f=100,C=1'); + assert.strictEqual(cmd.cursorMovement, 1); + }); + + it('should parse cursor movement key C=0', () => { + const cmd = parseKittyCommand('a=T,f=100,C=0'); + assert.strictEqual(cmd.cursorMovement, 0); + }); + it('should parse x and y offset', () => { const cmd = parseKittyCommand('a=T,x=10,y=20'); assert.strictEqual(cmd.x, 10); diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index d4e1fe797..f49df0280 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -68,7 +68,9 @@ export const enum KittyKey { // Compression type (z=zlib). This is essential for chunking larger images. COMPRESSION = 'o', // Quiet mode (1=suppress OK responses, 2=suppress error responses) - QUIET = 'q' + QUIET = 'q', + // Cursor movement policy (0=move cursor after image, 1=don't move cursor) + CURSOR_MOVEMENT = 'C' } // Pixel format constants @@ -92,6 +94,7 @@ export interface IKittyCommand { rows?: number; more?: number; quiet?: number; + cursorMovement?: number; compression?: string; payload?: string; } @@ -160,6 +163,7 @@ export function parseKittyCommand(data: string): IKittyCommand { case KittyKey.ROWS: cmd.rows = numValue; break; case KittyKey.MORE: cmd.more = numValue; break; case KittyKey.QUIET: cmd.quiet = numValue; break; + case KittyKey.CURSOR_MOVEMENT: cmd.cursorMovement = numValue; break; } } diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 2ddd5eb4c..063cc1ac1 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -437,19 +437,18 @@ test.describe('Kitty Graphics Protocol', () => { test.describe('Cursor positioning', () => { // NOTE: Current tests document ACTUAL behavior (MVP - cursor doesn't move) - // Kitty spec says cursor SHOULD move by cols/rows unless C=1 is specified - // See skipped tests below for spec-compliant behavior + // Per Kitty spec: cursor placed at first column after last image column, + // on the last row of the image. C=1 means don't move cursor. - test('cursor remains at origin after transmit and display (a=T) - CURRENT MVP BEHAVIOR', async () => { - // TODO: This test documents current incomplete behavior - // Per Kitty spec, cursor should move, but MVP implementation doesn't move it + test('cursor advances past 1x1 image', async () => { const cursorBefore = await getCursor(); const seq = `\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; await ctx.proxy.write(seq); await timeout(100); const cursorAfter = await getCursor(); deepStrictEqual(cursorBefore, [0, 0]); - deepStrictEqual(cursorAfter, [0, 0]); + // 1x1 pixel image occupies 1 column, cursor advances past it + deepStrictEqual(cursorAfter, [1, 0]); }); test('cursor advances with text before image', async () => { @@ -459,121 +458,89 @@ test.describe('Kitty Graphics Protocol', () => { await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); - // Cursor should remain at position after "Hello" - deepStrictEqual(await getCursor(), [5, 0]); + // Cursor advances 1 column past the image + deepStrictEqual(await getCursor(), [6, 0]); }); test('cursor advances with text after image', async () => { await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); - deepStrictEqual(await getCursor(), [0, 0]); + // Cursor at column 1 (past 1-col image) + deepStrictEqual(await getCursor(), [1, 0]); await ctx.proxy.write('World'); - deepStrictEqual(await getCursor(), [5, 0]); + deepStrictEqual(await getCursor(), [6, 0]); }); test('cursor position with multiple images on same line', async () => { await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(50); - deepStrictEqual(await getCursor(), [0, 0]); + deepStrictEqual(await getCursor(), [1, 0]); await ctx.proxy.write('###'); - deepStrictEqual(await getCursor(), [3, 0]); + deepStrictEqual(await getCursor(), [4, 0]); + // 3x1 pixel image: ceil(3/cellWidth)=1 column await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`); await timeout(50); - deepStrictEqual(await getCursor(), [3, 0]); + deepStrictEqual(await getCursor(), [5, 0]); }); test('cursor advances on newline after image', async () => { await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); - deepStrictEqual(await getCursor(), [0, 0]); + deepStrictEqual(await getCursor(), [1, 0]); await ctx.proxy.write('\n'); - deepStrictEqual(await getCursor(), [0, 1]); + deepStrictEqual(await getCursor(), [1, 1]); }); - test('cursor with placement at specific column (C key)', async () => { - // Move cursor to column 10 - await ctx.proxy.write('\x1b[11G'); // CHA - move to column 10 (1-indexed) - deepStrictEqual(await getCursor(), [10, 0]); - - // Place image with column specification - await ctx.proxy.write(`\x1b_Ga=T,f=100,C=5;${KITTY_BLACK_1X1_BASE64}\x1b\\`); - await timeout(100); - - // Cursor should still be at column 10 (Kitty protocol doesn't move cursor) - deepStrictEqual(await getCursor(), [10, 0]); - }); - - // ============================================================================ - // SPEC-COMPLIANT CURSOR MOVEMENT TESTS (Currently failing - to be implemented) - // ============================================================================ - // Per Kitty spec: "After placing an image on the screen the cursor must be - // moved to the right by the number of cols in the image placement rectangle - // and down by the number of rows in the image placement rectangle." - - test.skip('cursor should move right by cols when image placed (SPEC BEHAVIOR)', async () => { - // TODO: Implement cursor movement per Kitty spec - // When c=5 (5 columns), cursor should move right by 5 - const dim = await getDimensions(); + test('cursor should move right by cols when c specified', async () => { + // c=5: image displayed over 5 columns, r auto = ceil(1/cellHeight) = 1 await ctx.proxy.write(`\x1b_Ga=T,f=100,c=5;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); - // Cursor should move right by 5 columns deepStrictEqual(await getCursor(), [5, 0]); }); - test.skip('cursor should move down by rows when image placed (SPEC BEHAVIOR)', async () => { - // TODO: Implement cursor movement per Kitty spec - // When r=3 (3 rows), cursor should move down by 3 - const dim = await getDimensions(); + test('cursor should move down by rows when r specified', async () => { + // r=3: image displayed over 3 rows, c auto = ceil(1/cellWidth) = 1 await ctx.proxy.write(`\x1b_Ga=T,f=100,r=3;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); - // Cursor should move down by 3 rows - deepStrictEqual(await getCursor(), [0, 3]); + // Cursor at first column after image (col 1), on last row (row 2) + deepStrictEqual(await getCursor(), [1, 2]); }); - test.skip('cursor should move by cols AND rows when both specified (SPEC BEHAVIOR)', async () => { - // TODO: Implement cursor movement per Kitty spec + test('cursor should move by cols AND rows when both specified', async () => { await ctx.proxy.write(`\x1b_Ga=T,f=100,c=4,r=2;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); - // Cursor should move right by 4 cols and down by 2 rows - deepStrictEqual(await getCursor(), [4, 2]); + // cursor at (4, 1): past 4 columns, on last row (row 1) + deepStrictEqual(await getCursor(), [4, 1]); }); - test.skip('cursor should NOT move when C=1 is specified (SPEC BEHAVIOR)', async () => { - // TODO: Implement cursor movement per Kitty spec - // C=1 means "no cursor movement" + test('cursor should NOT move when C=1 is specified', async () => { await ctx.proxy.write(`\x1b_Ga=T,f=100,c=5,r=3,C=1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); - // With C=1, cursor should stay at origin even though c=5,r=3 + // C=1: cursor stays at origin deepStrictEqual(await getCursor(), [0, 0]); }); - test.skip('cursor should calculate cols/rows from image size when not specified (SPEC BEHAVIOR)', async () => { - // TODO: Implement cursor movement per Kitty spec - // When c and r are not specified, they should be calculated from image size + test('cursor should calculate cols/rows from image size when not specified', async () => { const dim = await getDimensions(); - // 3x1 image at default cell size should occupy certain columns + // 3x1 pixel image: cols = ceil(3/cellWidth), rows = ceil(1/cellHeight) await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`); await timeout(100); - // Cursor should move based on image pixel size / cell size - // For 3x1 pixel image, this would be Math.ceil(3/cellWidth) cols and Math.ceil(1/cellHeight) rows const expectedCols = Math.ceil(3 / dim.cellWidth); - const expectedRows = Math.ceil(1 / dim.cellHeight); const cursor = await getCursor(); - // For a 3x1 pixel image, cursor should move at least 1 column and row - // Exact values depend on cell dimensions - strictEqual(cursor[0] >= 1, true, 'cursor should move at least 1 column'); - strictEqual(cursor[1] >= 1, true, 'cursor should move at least 1 row'); + // Cursor advances past image columns, stays on row 0 (single row image) + strictEqual(cursor[0], expectedCols, 'cursor should advance by image columns'); + strictEqual(cursor[1], 0, 'cursor should stay on row 0 for single-row image'); }); }); From eb0f5383c32516d38069c10bf16a81394f6095ee Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 9 Feb 2026 16:43:55 -0800 Subject: [PATCH 058/124] question.. --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index a6d46f5b8..84bd4d8cb 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -520,6 +520,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { // C=1: restore cursor to position before image was placed const scrolled = buffer.ybase - savedYbase; buffer.x = savedX; + // Can't restore cursor to scrollback? buffer.y = Math.max(savedY - scrolled, 0); } else { // Default (C=0): advance cursor horizontally past the image From 16ea2ec0ef04c51b681255fe720a85df27939ff3 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 10 Feb 2026 21:32:41 -0800 Subject: [PATCH 059/124] Add image demo test for kitty --- .../components/window/addonImageWindow.ts | 45 +++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/demo/client/components/window/addonImageWindow.ts b/demo/client/components/window/addonImageWindow.ts index ce5ab9de2..392b7177b 100644 --- a/demo/client/components/window/addonImageWindow.ts +++ b/demo/client/components/window/addonImageWindow.ts @@ -51,14 +51,30 @@ export class AddonImageWindow extends BaseWindow implements IControlWindow { container.appendChild(document.createElement('br')); container.appendChild(document.createElement('br')); - const dl = document.createElement('dl'); - const dt = document.createElement('dt'); - dt.textContent = 'Image Test'; - dl.appendChild(dt); - this._addDdWithButton(dl, 'image-demo1', 'snake (sixel)'); - this._addDdWithButton(dl, 'image-demo2', 'oranges (sixel)'); - this._addDdWithButton(dl, 'image-demo3', 'palette (iip)'); - container.appendChild(dl); + // Sixel demos + const dlSixel = document.createElement('dl'); + const dtSixel = document.createElement('dt'); + dtSixel.textContent = 'Sixel'; + dlSixel.appendChild(dtSixel); + this._addDdWithButton(dlSixel, 'image-demo1', 'snake'); + this._addDdWithButton(dlSixel, 'image-demo2', 'oranges'); + container.appendChild(dlSixel); + + // IIP demos + const dlIip = document.createElement('dl'); + const dtIip = document.createElement('dt'); + dtIip.textContent = 'IIP (iTerm)'; + dlIip.appendChild(dtIip); + this._addDdWithButton(dlIip, 'image-demo3', 'palette'); + container.appendChild(dlIip); + + // Kitty demos + const dlKitty = document.createElement('dl'); + const dtKitty = document.createElement('dt'); + dtKitty.textContent = 'Kitty'; + dlKitty.appendChild(dtKitty); + this._addDdWithButton(dlKitty, 'image-demo-kitty1', 'palette'); + container.appendChild(dlKitty); this._initImageAddonExposed(); } @@ -125,12 +141,25 @@ export class AddonImageWindow extends BaseWindow implements IControlWindow { this._terminal.write(`\x1b]1337;File=inline=1;size=${data.length}:${btoa(sdata)}\x1b\\`); }); + const kittyDemo = (url: string) => () => fetch(url) + .then(resp => resp.arrayBuffer()) + .then(buffer => { + const data = new Uint8Array(buffer); + let sdata = ''; + for (let i = 0; i < data.length; ++i) sdata += String.fromCharCode(data[i]); + const payload = btoa(sdata); + this._terminal.write('\r\n'); + this._terminal.write(`\x1b_Ga=T,f=100;${payload}\x1b\\`); + }); + document.getElementById('image-demo1')!.addEventListener('click', sixelDemo('https://raw.githubusercontent.com/saitoha/libsixel/master/images/snake.six')); document.getElementById('image-demo2')!.addEventListener('click', sixelDemo('https://raw.githubusercontent.com/jerch/node-sixel/master/testfiles/test2.sixel')); document.getElementById('image-demo3')!.addEventListener('click', iipDemo('https://raw.githubusercontent.com/jerch/node-sixel/master/palette.png')); + document.getElementById('image-demo-kitty1')!.addEventListener('click', + kittyDemo('https://raw.githubusercontent.com/jerch/node-sixel/master/palette.png')); // demo for image retrieval API this._terminal.element!.addEventListener('click', (ev: MouseEvent) => { From 2c4997f52968c77e9756df3a41e95147c7b5b9e2 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 11 Feb 2026 10:27:12 -0800 Subject: [PATCH 060/124] Add test for 200x100 pixel --- .../fixture/kitty/multicolor-200x100.png | Bin 0 -> 449 bytes addons/addon-image/test/KittyGraphics.test.ts | 221 ++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 addons/addon-image/fixture/kitty/multicolor-200x100.png diff --git a/addons/addon-image/fixture/kitty/multicolor-200x100.png b/addons/addon-image/fixture/kitty/multicolor-200x100.png new file mode 100644 index 0000000000000000000000000000000000000000..59080f31915fdf169216978a64a182c624c6b007 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^CxAGGg9%9bJb4krz`)qy>EaktG3V{2gPeyA1Y82I zKGq7FHLFm5-*Szmts9#8ne%6^cKC4LD*NpA=D9zcqMum5G>m}lOiYQVP{7&Q!@u6{1-oD!M< DI4qW9 literal 0 HcmV?d00001 diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 063cc1ac1..f317ebde8 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -42,6 +42,8 @@ interface IDimensions { const KITTY_BLACK_1X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png').toString('base64'); const KITTY_BLACK_1X1_BYTES = Array.from(readFileSync('./addons/addon-image/fixture/kitty/black-1x1.png')); const KITTY_RGB_3X1_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/rgb-3x1.png').toString('base64'); +const KITTY_MULTICOLOR_200X100_BASE64 = readFileSync('./addons/addon-image/fixture/kitty/multicolor-200x100.png').toString('base64'); +const KITTY_MULTICOLOR_200X100_BYTES = Array.from(readFileSync('./addons/addon-image/fixture/kitty/multicolor-200x100.png')); // Raw RGB pixel data (f=24): 3 bytes per pixel, no header — requires s= and v= const RAW_RGB_1X1_BLACK = Buffer.from([0, 0, 0]).toString('base64'); @@ -566,6 +568,225 @@ test.describe('Kitty Graphics Protocol', () => { }); }); + test.describe('Larger image (200x100 multicolor PNG)', () => { + test.describe('Basic transmission and storage', () => { + test('stores 200x100 PNG with a=T', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [200, 100]); + }); + + test('transmit only (a=t) stores 200x100 image without display', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + }); + + test('stores with specified image ID', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=400;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(400)`), true); + }); + }); + + test.describe('Chunked transmission', () => { + test('handles 2-chunk transmission', async () => { + const half = Math.floor(KITTY_MULTICOLOR_200X100_BASE64.length / 2); + const part1 = KITTY_MULTICOLOR_200X100_BASE64.substring(0, half); + const part2 = KITTY_MULTICOLOR_200X100_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=500,m=1;${part1}\x1b\\`); + await timeout(50); + strictEqual(await getImageStorageLength(), 0); + + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=500;${part2}\x1b\\`); + await timeout(200); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [200, 100]); + }); + + test('handles 3-chunk transmission', async () => { + const third = Math.floor(KITTY_MULTICOLOR_200X100_BASE64.length / 3); + const p1 = KITTY_MULTICOLOR_200X100_BASE64.substring(0, third); + const p2 = KITTY_MULTICOLOR_200X100_BASE64.substring(third, third * 2); + const p3 = KITTY_MULTICOLOR_200X100_BASE64.substring(third * 2); + + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=501,m=1;${p1}\x1b\\`); + await timeout(50); + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=501,m=1;${p2}\x1b\\`); + await timeout(50); + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=501;${p3}\x1b\\`); + await timeout(200); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [200, 100]); + }); + + test('verifies chunked data assembles correctly', async () => { + const half = Math.floor(KITTY_MULTICOLOR_200X100_BASE64.length / 2); + const part1 = KITTY_MULTICOLOR_200X100_BASE64.substring(0, half); + const part2 = KITTY_MULTICOLOR_200X100_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=502,m=1;${part1}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=502;${part2}\x1b\\`); + await timeout(200); + + const storedData = await ctx.page.evaluate(async () => { + const blob = (window as any).imageAddon._handlers.get('kitty').images.get(502).data; + const buffer = await blob.arrayBuffer(); + return Array.from(new Uint8Array(buffer)); + }); + deepStrictEqual(storedData, KITTY_MULTICOLOR_200X100_BYTES); + }); + }); + + test.describe('Cursor positioning', () => { + test('cursor advances past multi-cell image', async () => { + const dim = await getDimensions(); + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + const expectedCols = Math.ceil(200 / dim.cellWidth); + const expectedRows = Math.ceil(100 / dim.cellHeight) - 1; + const cursor = await getCursor(); + strictEqual(cursor[0], expectedCols, 'cursor should advance by image columns'); + strictEqual(cursor[1], expectedRows, 'cursor should be on last row of image'); + }); + + test('cursor does not move with C=1', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,C=1;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + deepStrictEqual(await getCursor(), [0, 0]); + }); + + test('cursor uses explicit c and r over image dimensions', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,c=10,r=5;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + deepStrictEqual(await getCursor(), [10, 4]); + }); + }); + + test.describe('Pixel verification', () => { + // The 200x100 image has 20 colored rectangles in a 10x2 grid. + // Each rectangle is 20px wide x 50px tall. + // Top row (y=0..49): Red, Orange, Yellow, Lime, Green, Cyan, SkyBlue, Blue, Purple, Magenta + // Bottom row (y=50..99): Pink, Brown, Maroon, Olive, Teal, Navy, Gray, DarkGray, LightGray, White + + test('renders red rectangle at top-left origin (0,0)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + // Pixel (0,0) is in the first rectangle: Red + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + }); + + test('renders top row colors at rectangle centers', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + // Sample center of each top-row rectangle (y=25, x=10,30,50,...,190) + // All within the first cell row, so we read from the canvas at cell (0,0) + // Red at x=10 + deepStrictEqual(await getPixel(0, 0, 10, 25), [255, 0, 0, 255]); + // Orange at x=30 + deepStrictEqual(await getPixel(0, 0, 30, 25), [255, 128, 0, 255]); + // Yellow at x=50 + deepStrictEqual(await getPixel(0, 0, 50, 25), [255, 255, 0, 255]); + // Lime at x=70 + deepStrictEqual(await getPixel(0, 0, 70, 25), [0, 255, 0, 255]); + // Green at x=90 + deepStrictEqual(await getPixel(0, 0, 90, 25), [0, 128, 0, 255]); + }); + + test('renders bottom row colors at rectangle centers', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + // Bottom row starts at y=50. Center at y=75. + // Pink at x=10 + deepStrictEqual(await getPixel(0, 0, 10, 75), [255, 192, 203, 255]); + // Brown at x=30 + deepStrictEqual(await getPixel(0, 0, 30, 75), [165, 42, 42, 255]); + // Maroon at x=50 + deepStrictEqual(await getPixel(0, 0, 50, 75), [128, 0, 0, 255]); + // Olive at x=70 + deepStrictEqual(await getPixel(0, 0, 70, 75), [128, 128, 0, 255]); + // Teal at x=90 + deepStrictEqual(await getPixel(0, 0, 90, 75), [0, 128, 128, 255]); + }); + + test('renders correct colors at rectangle boundaries', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + // Last pixel of first rectangle (x=19, y=0): still Red + deepStrictEqual(await getPixel(0, 0, 19, 0), [255, 0, 0, 255]); + // First pixel of second rectangle (x=20, y=0): Orange + deepStrictEqual(await getPixel(0, 0, 20, 0), [255, 128, 0, 255]); + // Last pixel of top row (x=199, y=49): Magenta + deepStrictEqual(await getPixel(0, 0, 199, 49), [255, 0, 255, 255]); + // First pixel of bottom row (x=0, y=50): Pink + deepStrictEqual(await getPixel(0, 0, 0, 50), [255, 192, 203, 255]); + }); + + test('renders correct color at bottom-right corner', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + // Bottom-right corner (x=199, y=99): White + deepStrictEqual(await getPixel(0, 0, 199, 99), [255, 255, 255, 255]); + }); + + test('renders a strip of top-row pixels via getPixels', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + // Read 3 pixels starting at x=18 y=0, spanning the Red/Orange boundary + const pixels = await getPixels(0, 0, 18, 0, 3, 1); + // x=18,19 -> Red; x=20 -> Orange + deepStrictEqual(pixels?.slice(0, 4), [255, 0, 0, 255]); // x=18: Red + deepStrictEqual(pixels?.slice(4, 8), [255, 0, 0, 255]); // x=19: Red + deepStrictEqual(pixels?.slice(8, 12), [255, 128, 0, 255]); // x=20: Orange + }); + }); + + test.describe('Query support', () => { + test('responds with OK for valid 200x100 PNG query', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=600,a=q,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=600;OK\x1b\\'); + }); + + test('query does not store the 200x100 image', async () => { + await ctx.page.evaluate(() => { + (window as any).term.onData(() => { /* consume response */ }); + }); + + await ctx.proxy.write(`\x1b_Gi=601,a=q,f=100;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(601)`), false); + }); + }); + + test.describe('Delete commands', () => { + test('delete removes 200x100 image by id', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=700;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(700)`), true); + + await ctx.proxy.write(`\x1b_Ga=d,i=700\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(700)`), false); + }); + }); + }); + test.describe('Raw RGB pixel format (f=24)', () => { test.describe('Pixel verification', () => { test('renders 1x1 black pixel with alpha set to 255', async () => { From c01e4b7be7f98ee6f75369c36faaecde60d71d70 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 11 Feb 2026 10:56:30 -0800 Subject: [PATCH 061/124] Separate image storage per mechanism (sixel, iip) --- addons/addon-image/src/IIPHandler.ts | 5 ++- addons/addon-image/src/IIPImageStorage.ts | 26 +++++++++++ addons/addon-image/src/ImageAddon.ts | 8 +++- addons/addon-image/src/ImageStorage.ts | 31 ++++--------- addons/addon-image/src/SixelHandler.ts | 4 +- addons/addon-image/src/SixelImageStorage.ts | 50 +++++++++++++++++++++ 6 files changed, 96 insertions(+), 28 deletions(-) create mode 100644 addons/addon-image/src/IIPImageStorage.ts create mode 100644 addons/addon-image/src/SixelImageStorage.ts diff --git a/addons/addon-image/src/IIPHandler.ts b/addons/addon-image/src/IIPHandler.ts index 9662303f9..76492c405 100644 --- a/addons/addon-image/src/IIPHandler.ts +++ b/addons/addon-image/src/IIPHandler.ts @@ -4,7 +4,8 @@ */ import { IImageAddonOptions, IOscHandler, IResetHandler, ITerminalExt } from './Types'; import { ImageRenderer } from './ImageRenderer'; -import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; +import { IIPImageStorage } from './IIPImageStorage'; +import { CELL_SIZE_DEFAULT } from './ImageStorage'; import Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; import { HeaderParser, IHeaderFields, HeaderState } from './IIPHeaderParser'; import { imageType, UNSUPPORTED_TYPE } from './IIPMetrics'; @@ -40,7 +41,7 @@ export class IIPHandler implements IOscHandler, IResetHandler { constructor( private readonly _opts: IImageAddonOptions, private readonly _renderer: ImageRenderer, - private readonly _storage: ImageStorage, + private readonly _storage: IIPImageStorage, private readonly _coreTerminal: ITerminalExt ) { const maxEncodedBytes = Math.ceil(this._opts.iipSizeLimit * 4 / 3); diff --git a/addons/addon-image/src/IIPImageStorage.ts b/addons/addon-image/src/IIPImageStorage.ts new file mode 100644 index 000000000..0da91607f --- /dev/null +++ b/addons/addon-image/src/IIPImageStorage.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2023 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { ImageStorage } from './ImageStorage'; + +/** + * IIP (iTerm Image Protocol) specific image storage controller. + * + * Wraps the shared ImageStorage with IIP protocol semantics: + * - Always uses scrolling mode (cursor advances with image) + */ +export class IIPImageStorage { + constructor( + private readonly _storage: ImageStorage + ) {} + + /** + * Add an IIP image to storage. + * Always uses scrolling mode — cursor advances past the image. + */ + public addImage(img: HTMLCanvasElement | ImageBitmap): void { + this._storage.addImage(img, true); + } +} diff --git a/addons/addon-image/src/ImageAddon.ts b/addons/addon-image/src/ImageAddon.ts index d18b59a06..4c30a1049 100644 --- a/addons/addon-image/src/ImageAddon.ts +++ b/addons/addon-image/src/ImageAddon.ts @@ -9,6 +9,8 @@ import { IIPHandler } from './IIPHandler'; import { ImageRenderer } from './ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; import { SixelHandler } from './SixelHandler'; +import { SixelImageStorage } from './SixelImageStorage'; +import { IIPImageStorage } from './IIPImageStorage'; import { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types'; // default values of addon ctor options @@ -129,7 +131,8 @@ export class ImageAddon implements ITerminalAddon, IImageApi { // SIXEL handler if (this._opts.sixelSupport) { - const sixelHandler = new SixelHandler(this._opts, this._storage!, terminal); + const sixelStorage = new SixelImageStorage(this._storage!, this._opts, this._renderer!, terminal); + const sixelHandler = new SixelHandler(this._opts, sixelStorage, terminal); this._handlers.set('sixel', sixelHandler); this._disposeLater( terminal._core._inputHandler._parser.registerDcsHandler({ final: 'q' }, sixelHandler) @@ -138,7 +141,8 @@ export class ImageAddon implements ITerminalAddon, IImageApi { // iTerm IIP handler if (this._opts.iipSupport) { - const iipHandler = new IIPHandler(this._opts, this._renderer!, this._storage!, terminal); + const iipStorage = new IIPImageStorage(this._storage!); + const iipHandler = new IIPHandler(this._opts, this._renderer!, iipStorage, terminal); this._handlers.set('iip', iipHandler); this._disposeLater( terminal._core._inputHandler._parser.registerOscHandler(1337, iipHandler) diff --git a/addons/addon-image/src/ImageStorage.ts b/addons/addon-image/src/ImageStorage.ts index aea9b5e5f..73a7cd690 100644 --- a/addons/addon-image/src/ImageStorage.ts +++ b/addons/addon-image/src/ImageStorage.ts @@ -216,28 +216,14 @@ export class ImageStorage implements IDisposable { this._fullyCleared = false; } - /** - * Only advance text cursor. - * This is an edge case from empty sixels carrying only a height but no pixels. - * Partially fixes https://github.com/jerch/xterm-addon-image/issues/37. - */ - public advanceCursor(height: number): void { - if (this._opts.sixelScrolling) { - let cellSize = this._renderer.cellSize; - if (cellSize.width === -1 || cellSize.height === -1) { - cellSize = CELL_SIZE_DEFAULT; - } - const rows = Math.ceil(height / cellSize.height); - for (let i = 1; i < rows; ++i) { - this._terminal._core._inputHandler.lineFeed(); - } - } - } - /** * Method to add an image to the storage. + * @param img - The image to add (canvas or bitmap). + * @param scrolling - When true, cursor advances with the image (lineFeed per row). + * When false, image is placed at (0,0) and cursor is restored (DECSET 80 / sixel origin mode). + * @returns The internal image ID assigned to the stored image. */ - public addImage(img: HTMLCanvasElement | ImageBitmap): void { + public addImage(img: HTMLCanvasElement | ImageBitmap, scrolling: boolean): number { // never allow storage to exceed memory limit this._evictOldest(img.width * img.height); @@ -259,7 +245,7 @@ export class ImageStorage implements IDisposable { let offset = originX; let tileCount = 0; - if (!this._opts.sixelScrolling) { + if (!scrolling) { buffer.x = 0; buffer.y = 0; offset = 0; @@ -273,7 +259,7 @@ export class ImageStorage implements IDisposable { this._writeToCell(line as IBufferLineExt, offset + col, imageId, row * cols + col); tileCount++; } - if (this._opts.sixelScrolling) { + if (scrolling) { if (row < rows - 1) this._terminal._core._inputHandler.lineFeed(); } else { if (++buffer.y >= termRows) break; @@ -283,7 +269,7 @@ export class ImageStorage implements IDisposable { this._terminal._core._inputHandler._dirtyRowTracker.markDirty(buffer.y); // cursor positioning modes - if (this._opts.sixelScrolling) { + if (scrolling) { buffer.x = offset; } else { buffer.x = originX; @@ -331,6 +317,7 @@ export class ImageStorage implements IDisposable { // finally add the image this._images.set(imageId, imgSpec); + return imageId; } diff --git a/addons/addon-image/src/SixelHandler.ts b/addons/addon-image/src/SixelHandler.ts index 07d90341c..2f12fbe19 100644 --- a/addons/addon-image/src/SixelHandler.ts +++ b/addons/addon-image/src/SixelHandler.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { ImageStorage } from './ImageStorage'; +import { SixelImageStorage } from './SixelImageStorage'; import { IDcsHandler, IParams, IImageAddonOptions, ITerminalExt, AttributeData, IResetHandler, ReadonlyColorSet } from './Types'; import { toRGBA8888, BIG_ENDIAN, PALETTE_ANSI_256, PALETTE_VT340_COLOR } from 'sixel/lib/Colors'; import { RGBA8888 } from 'sixel/lib/Types'; @@ -26,7 +26,7 @@ export class SixelHandler implements IDcsHandler, IResetHandler { constructor( private readonly _opts: IImageAddonOptions, - private readonly _storage: ImageStorage, + private readonly _storage: SixelImageStorage, private readonly _coreTerminal: ITerminalExt ) { DecoderAsync({ diff --git a/addons/addon-image/src/SixelImageStorage.ts b/addons/addon-image/src/SixelImageStorage.ts new file mode 100644 index 000000000..4c5f555bb --- /dev/null +++ b/addons/addon-image/src/SixelImageStorage.ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2020 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; +import { IImageAddonOptions, ITerminalExt } from './Types'; +import { ImageRenderer } from './ImageRenderer'; + +/** + * Sixel-specific image storage controller. + * + * Wraps the shared ImageStorage with sixel protocol semantics: + * - Cursor behavior governed by DECSET 80 (sixelScrolling option) + * - advanceCursor for empty sixels carrying only height + */ +export class SixelImageStorage { + constructor( + private readonly _storage: ImageStorage, + private readonly _opts: IImageAddonOptions, + private readonly _renderer: ImageRenderer, + private readonly _terminal: ITerminalExt + ) {} + + /** + * Add a sixel image to storage. + * Cursor behavior depends on the sixelScrolling option (DECSET 80). + */ + public addImage(img: HTMLCanvasElement | ImageBitmap): void { + this._storage.addImage(img, this._opts.sixelScrolling); + } + + /** + * Only advance text cursor. + * This is an edge case from empty sixels carrying only a height but no pixels. + * Partially fixes https://github.com/jerch/xterm-addon-image/issues/37. + */ + public advanceCursor(height: number): void { + if (this._opts.sixelScrolling) { + let cellSize = this._renderer.cellSize; + if (cellSize.width === -1 || cellSize.height === -1) { + cellSize = CELL_SIZE_DEFAULT; + } + const rows = Math.ceil(height / cellSize.height); + for (let i = 1; i < rows; ++i) { + this._terminal._core._inputHandler.lineFeed(); + } + } + } +} From 1d0cf32b280295bbd30304902838c7b23ec24862 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 11 Feb 2026 14:19:27 -0800 Subject: [PATCH 062/124] support z-index + dual canvas for DOM. Doesnt work for webgl --- addons/addon-image/src/ImageRenderer.ts | 115 ++++++++++++------ addons/addon-image/src/ImageStorage.ts | 50 ++++++-- addons/addon-image/src/Types.ts | 3 + .../src/kitty/KittyGraphicsHandler.ts | 12 +- .../src/kitty/KittyGraphicsTypes.test.ts | 20 +++ .../src/kitty/KittyGraphicsTypes.ts | 6 +- addons/addon-image/test/KittyGraphics.test.ts | 79 ++++++++++++ 7 files changed, 235 insertions(+), 50 deletions(-) diff --git a/addons/addon-image/src/ImageRenderer.ts b/addons/addon-image/src/ImageRenderer.ts index 1e87aa971..24a15d433 100644 --- a/addons/addon-image/src/ImageRenderer.ts +++ b/addons/addon-image/src/ImageRenderer.ts @@ -5,7 +5,7 @@ import { toRGBA8888 } from 'sixel/lib/Colors'; import { IDisposable } from '@xterm/xterm'; -import { ICellSize, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types'; +import { ICellSize, ImageLayer, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types'; import { Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; const PLACEHOLDER_LENGTH = 4096; @@ -18,8 +18,12 @@ const PLACEHOLDER_HEIGHT = 24; * - draw image tiles onRender */ export class ImageRenderer extends Disposable implements IDisposable { - public canvas: HTMLCanvasElement | undefined; - private _ctx: CanvasRenderingContext2D | null | undefined; + /** @deprecated Use canvasTop instead. Kept for backward compat — points to canvasTop. */ + public get canvas(): HTMLCanvasElement | undefined { return this._canvasTop; } + private _canvasTop: HTMLCanvasElement | undefined; + private _canvasBottom: HTMLCanvasElement | undefined; + private _ctxTop: CanvasRenderingContext2D | null | undefined; + private _ctxBottom: CanvasRenderingContext2D | null | undefined; private _placeholder: HTMLCanvasElement | undefined; private _placeholderBitmap: ImageBitmap | undefined; private _optionsRefresh = this._register(new MutableDisposable()); @@ -86,6 +90,7 @@ export class ImageRenderer extends Disposable implements IDisposable { }); this._register(toDisposable(() => { this.removeLayerFromDom(); + this.removeLayerFromDom('bottom'); if (this._terminal._core && this._oldOpen) { this._terminal._core.open = this._oldOpen; this._oldOpen = undefined; @@ -95,8 +100,10 @@ export class ImageRenderer extends Disposable implements IDisposable { this._oldSetRenderer = undefined; } this._renderService = undefined; - this.canvas = undefined; - this._ctx = undefined; + this._canvasTop = undefined; + this._canvasBottom = undefined; + this._ctxTop = undefined; + this._ctxBottom = undefined; this._placeholderBitmap?.close(); this._placeholderBitmap = undefined; this._placeholder = undefined; @@ -140,27 +147,36 @@ export class ImageRenderer extends Disposable implements IDisposable { /** * Clear a region of the image layer canvas. */ - public clearLines(start: number, end: number): void { - this._ctx?.clearRect( - 0, - start * (this.dimensions?.css.cell.height || 0), - this.dimensions?.css.canvas.width || 0, - (++end - start) * (this.dimensions?.css.cell.height || 0) - ); + public clearLines(start: number, end: number, layer?: ImageLayer): void { + const y = start * (this.dimensions?.css.cell.height || 0); + const w = this.dimensions?.css.canvas.width || 0; + const h = (++end - start) * (this.dimensions?.css.cell.height || 0); + if (!layer || layer === 'top') { + this._ctxTop?.clearRect(0, y, w, h); + } + if (!layer || layer === 'bottom') { + this._ctxBottom?.clearRect(0, y, w, h); + } } /** * Clear whole image canvas. */ - public clearAll(): void { - this._ctx?.clearRect(0, 0, this.canvas?.width || 0, this.canvas?.height || 0); + public clearAll(layer?: ImageLayer): void { + if (!layer || layer === 'top') { + this._ctxTop?.clearRect(0, 0, this._canvasTop?.width || 0, this._canvasTop?.height || 0); + } + if (!layer || layer === 'bottom') { + this._ctxBottom?.clearRect(0, 0, this._canvasBottom?.width || 0, this._canvasBottom?.height || 0); + } } /** * Draw neighboring tiles on the image layer canvas. */ public draw(imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number = 1): void { - if (!this._ctx) { + const ctx = imgSpec.layer === 'bottom' ? this._ctxBottom : this._ctxTop; + if (!ctx) { return; } const { width, height } = this.cellSize; @@ -187,7 +203,7 @@ export class ImageRenderer extends Disposable implements IDisposable { // Note: For not pixel perfect aligned cells like in the DOM renderer // this will move a tile slightly to the top/left (subpixel range, thus ignore it). // FIX #34: avoid striping on displays with pixelDeviceRatio != 1 by ceiling height and width - this._ctx.drawImage( + ctx.drawImage( img, Math.floor(sx), Math.floor(sy), Math.ceil(finalWidth), Math.ceil(finalHeight), Math.floor(dx), Math.floor(dy), Math.ceil(finalWidth), Math.ceil(finalHeight) @@ -227,7 +243,7 @@ export class ImageRenderer extends Disposable implements IDisposable { * Draw a line with placeholder on the image layer canvas. */ public drawPlaceholder(col: number, row: number, count: number = 1): void { - if (this._ctx) { + if (this._ctxTop) { const { width, height } = this.cellSize; // Don't try to draw anything, if we cannot get valid renderer metrics. @@ -241,7 +257,7 @@ export class ImageRenderer extends Disposable implements IDisposable { this._createPlaceHolder(height + 1); } if (!this._placeholder) return; - this._ctx.drawImage( + this._ctxTop.drawImage( this._placeholderBitmap ?? this._placeholder!, col * width, (row * height) % 2 ? 0 : 1, // needs %2 offset correction @@ -260,12 +276,15 @@ export class ImageRenderer extends Disposable implements IDisposable { * Checked once from `ImageStorage.render`. */ public rescaleCanvas(): void { - if (!this.canvas) { - return; + const w = this.dimensions?.css.canvas.width || 0; + const h = this.dimensions?.css.canvas.height || 0; + if (this._canvasTop && (this._canvasTop.width !== w || this._canvasTop.height !== h)) { + this._canvasTop.width = w; + this._canvasTop.height = h; } - if (this.canvas.width !== this.dimensions!.css.canvas.width || this.canvas.height !== this.dimensions!.css.canvas.height) { - this.canvas.width = this.dimensions!.css.canvas.width || 0; - this.canvas.height = this.dimensions!.css.canvas.height || 0; + if (this._canvasBottom && (this._canvasBottom.width !== w || this._canvasBottom.height !== h)) { + this._canvasBottom.width = w; + this._canvasBottom.height = h; } } @@ -305,34 +324,60 @@ export class ImageRenderer extends Disposable implements IDisposable { this._oldSetRenderer = this._renderService.setRenderer.bind(this._renderService); this._renderService.setRenderer = (renderer: any) => { this.removeLayerFromDom(); + this.removeLayerFromDom('bottom'); this._oldSetRenderer?.call(this._renderService, renderer); }; } - public insertLayerToDom(): void { + public insertLayerToDom(layer: ImageLayer = 'top'): void { // make sure that the terminal is attached to a document and to DOM if (this.document && this._terminal._core.screenElement) { - if (!this.canvas) { - this.canvas = ImageRenderer.createCanvas( + if (layer === 'top' && !this._canvasTop) { + this._canvasTop = ImageRenderer.createCanvas( this.document, this.dimensions?.css.canvas.width || 0, this.dimensions?.css.canvas.height || 0 ); - this.canvas.classList.add('xterm-image-layer'); - this._terminal._core.screenElement.appendChild(this.canvas); - this._ctx = this.canvas.getContext('2d', { alpha: true, desynchronized: true }); - this.clearAll(); + this._canvasTop.classList.add('xterm-image-layer-top'); + this._terminal._core.screenElement.appendChild(this._canvasTop); + this._ctxTop = this._canvasTop.getContext('2d', { alpha: true, desynchronized: true }); + this.clearAll('top'); + } + if (layer === 'bottom' && !this._canvasBottom) { + this._canvasBottom = ImageRenderer.createCanvas( + this.document, this.dimensions?.css.canvas.width || 0, + this.dimensions?.css.canvas.height || 0 + ); + this._canvasBottom.classList.add('xterm-image-layer-bottom'); + // Use z-index:-1 so it paints behind non-positioned text elements. + // The screen element needs to be a stacking context to contain the + // negative z-index, otherwise it would go behind the entire terminal. + this._canvasBottom.style.zIndex = '-1'; + const screenElement = this._terminal._core.screenElement; + screenElement.style.zIndex = '0'; + screenElement.insertBefore(this._canvasBottom, screenElement.firstChild); + this._ctxBottom = this._canvasBottom.getContext('2d', { alpha: true, desynchronized: true }); + this.clearAll('bottom'); } } else { console.warn('image addon: cannot insert output canvas to DOM, missing document or screenElement'); } } - public removeLayerFromDom(): void { - if (this.canvas) { - this._ctx = undefined; - this.canvas.remove(); - this.canvas = undefined; + public removeLayerFromDom(layer: ImageLayer = 'top'): void { + if (layer === 'top' && this._canvasTop) { + this._ctxTop = undefined; + this._canvasTop.remove(); + this._canvasTop = undefined; } + if (layer === 'bottom' && this._canvasBottom) { + this._ctxBottom = undefined; + this._canvasBottom.remove(); + this._canvasBottom = undefined; + } + } + + public hasLayer(layer: ImageLayer): boolean { + return layer === 'top' ? !!this._canvasTop : !!this._canvasBottom; } private _createPlaceHolder(height: number = PLACEHOLDER_HEIGHT): void { diff --git a/addons/addon-image/src/ImageStorage.ts b/addons/addon-image/src/ImageStorage.ts index 03925f0b0..3609b2791 100644 --- a/addons/addon-image/src/ImageStorage.ts +++ b/addons/addon-image/src/ImageStorage.ts @@ -5,7 +5,7 @@ import { IDisposable } from '@xterm/xterm'; import { ImageRenderer } from './ImageRenderer'; -import { ITerminalExt, IExtendedAttrsImage, IImageAddonOptions, IImageSpec, IBufferLineExt, BgFlags, Cell, Content, ICellSize, ExtFlags, Attributes, UnderlineStyle } from './Types'; +import { ITerminalExt, IExtendedAttrsImage, IImageAddonOptions, IImageSpec, IBufferLineExt, BgFlags, Cell, Content, ICellSize, ExtFlags, Attributes, UnderlineStyle, ImageLayer } from './Types'; // fallback default cell size @@ -250,7 +250,7 @@ export class ImageStorage implements IDisposable { * Method to add an image to the storage. * Returns the internal image ID assigned to the stored image. */ - public addImage(img: HTMLCanvasElement | ImageBitmap): number { + public addImage(img: HTMLCanvasElement | ImageBitmap, layer: ImageLayer = 'top'): number { // never allow storage to exceed memory limit this._evictOldest(img.width * img.height); @@ -339,7 +339,8 @@ export class ImageStorage implements IDisposable { actualCellSize: { ...cellSize }, // clone needed, since later modified marker: endMarker || undefined, tileCount, - bufferType: this._terminal.buffer.active.type + bufferType: this._terminal.buffer.active.type, + layer }; // finally add the image @@ -354,16 +355,30 @@ export class ImageStorage implements IDisposable { */ // TODO: Should we move this to the ImageRenderer? public render(range: { start: number, end: number }): void { - // setup image canvas in case we have none yet, but have images in store - if (!this._renderer.canvas && this._images.size) { - this._renderer.insertLayerToDom(); - // safety measure - in case we cannot spawn a canvas at all, just exit - if (!this._renderer.canvas) { - return; + // Determine which layers have images + let hasTopImages = false; + let hasBottomImages = false; + for (const spec of this._images.values()) { + if (spec.layer === 'bottom') { + hasBottomImages = true; + } else { + hasTopImages = true; } + if (hasTopImages && hasBottomImages) break; } + + // Lazily insert layers that are needed + if (hasTopImages && !this._renderer.hasLayer('top')) { + this._renderer.insertLayerToDom('top'); + if (!this._renderer.hasLayer('top')) return; + } + if (hasBottomImages && !this._renderer.hasLayer('bottom')) { + this._renderer.insertLayerToDom('bottom'); + } + // rescale if needed this._renderer.rescaleCanvas(); + // exit early if we dont have any images to test for if (!this._images.size) { if (!this._fullyCleared) { @@ -371,12 +386,25 @@ export class ImageStorage implements IDisposable { this._fullyCleared = true; this._needsFullClear = false; } - if (this._renderer.canvas) { - this._renderer.removeLayerFromDom(); + if (this._renderer.hasLayer('top')) { + this._renderer.removeLayerFromDom('top'); + } + if (this._renderer.hasLayer('bottom')) { + this._renderer.removeLayerFromDom('bottom'); } return; } + // Remove layers no longer needed + if (!hasTopImages && this._renderer.hasLayer('top')) { + this._renderer.clearAll('top'); + this._renderer.removeLayerFromDom('top'); + } + if (!hasBottomImages && this._renderer.hasLayer('bottom')) { + this._renderer.clearAll('bottom'); + this._renderer.removeLayerFromDom('bottom'); + } + // buffer switches force a full clear if (this._needsFullClear) { this._renderer.clearAll(); diff --git a/addons/addon-image/src/Types.ts b/addons/addon-image/src/Types.ts index 480a48530..a9f3310be 100644 --- a/addons/addon-image/src/Types.ts +++ b/addons/addon-image/src/Types.ts @@ -99,6 +99,8 @@ export interface ICellSize { height: number; } +export type ImageLayer = 'top' | 'bottom'; + export interface IImageSpec { orig: HTMLCanvasElement | ImageBitmap | undefined; origCellSize: ICellSize; @@ -107,4 +109,5 @@ export interface IImageSpec { marker: IMarker | undefined; tileCount: number; bufferType: 'alternate' | 'normal'; + layer: ImageLayer; } diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 84bd4d8cb..8e3821f15 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt } from '../Types'; +import { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt, ImageLayer } from '../Types'; import { ImageRenderer } from '../ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from '../ImageStorage'; import Base64Decoder, { type DecodeStatus } from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; @@ -504,12 +504,18 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const savedY = buffer.y; const savedYbase = buffer.ybase; + // Determine layer based on z-index: negative = behind text, 0+ = on top. + // Bottom layer only works when allowTransparency is enabled (otherwise text + // canvas background is opaque and hides the bottom canvas). Fall back to top. + const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0; + const layer: ImageLayer = (wantsBottom && this._coreTerminal.options.allowTransparency) ? 'bottom' : 'top'; + let storageId: number; if (w !== bitmap.width || h !== bitmap.height) { const resized = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); - storageId = this._storage.addImage(resized); + storageId = this._storage.addImage(resized, layer); } else { - storageId = this._storage.addImage(bitmap); + storageId = this._storage.addImage(bitmap, layer); } this._kittyIdToStorageId.set(image.id, storageId); diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts index ac79c09ab..04d95dd30 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts @@ -86,5 +86,25 @@ describe('KittyGraphicsTypes', () => { assert.ok(isNaN(cmd.format!)); assert.strictEqual(cmd.id, 5); }); + + it('should parse z-index key with positive value', () => { + const cmd = parseKittyCommand('a=T,f=100,z=10'); + assert.strictEqual(cmd.zIndex, 10); + }); + + it('should parse z-index key with zero', () => { + const cmd = parseKittyCommand('a=T,f=100,z=0'); + assert.strictEqual(cmd.zIndex, 0); + }); + + it('should parse z-index key with negative value', () => { + const cmd = parseKittyCommand('a=T,f=100,z=-1'); + assert.strictEqual(cmd.zIndex, -1); + }); + + it('should leave zIndex undefined when not specified', () => { + const cmd = parseKittyCommand('a=T,f=100'); + assert.strictEqual(cmd.zIndex, undefined); + }); }); }); diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index f49df0280..b3f871fdd 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -70,7 +70,9 @@ export const enum KittyKey { // Quiet mode (1=suppress OK responses, 2=suppress error responses) QUIET = 'q', // Cursor movement policy (0=move cursor after image, 1=don't move cursor) - CURSOR_MOVEMENT = 'C' + CURSOR_MOVEMENT = 'C', + // Z-index for image layering (negative = behind text, 0+ = on top) + Z_INDEX = 'z' } // Pixel format constants @@ -95,6 +97,7 @@ export interface IKittyCommand { more?: number; quiet?: number; cursorMovement?: number; + zIndex?: number; compression?: string; payload?: string; } @@ -164,6 +167,7 @@ export function parseKittyCommand(data: string): IKittyCommand { case KittyKey.MORE: cmd.more = numValue; break; case KittyKey.QUIET: cmd.quiet = numValue; break; case KittyKey.CURSOR_MOVEMENT: cmd.cursorMovement = numValue; break; + case KittyKey.Z_INDEX: cmd.zIndex = numValue; break; } } diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index f317ebde8..38a70c175 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -546,6 +546,85 @@ test.describe('Kitty Graphics Protocol', () => { }); }); + test.describe('Z-index layer placement', () => { + test('default placement (no z key) stores image on top layer', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'top'); + }); + + test('z=0 stores image on top layer', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,z=0;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'top'); + }); + + test('z=1 (positive) stores image on top layer', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,z=1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'top'); + }); + + test('z=-1 falls back to top layer when allowTransparency is disabled', async () => { + await ctx.page.evaluate(`window.term.options.allowTransparency = false`); + await ctx.proxy.write(`\x1b_Ga=T,f=100,z=-1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'top'); + }); + + test('z=-1 (negative) stores image on bottom layer when allowTransparency is enabled', async () => { + await ctx.page.evaluate(`window.term.options.allowTransparency = true`); + await ctx.proxy.write(`\x1b_Ga=T,f=100,z=-1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'bottom'); + }); + + test('z=-100 (large negative) stores image on bottom layer when allowTransparency is enabled', async () => { + await ctx.page.evaluate(`window.term.options.allowTransparency = true`); + await ctx.proxy.write(`\x1b_Ga=T,f=100,z=-100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'bottom'); + }); + + test('top layer canvas has correct CSS class', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + const hasClass = await ctx.page.evaluate(() => { + const el = document.querySelector('.xterm-image-layer-top'); + return el !== null; + }); + strictEqual(hasClass, true); + }); + + test('bottom layer canvas has correct CSS class', async () => { + await ctx.page.evaluate(`window.term.options.allowTransparency = true`); + await ctx.proxy.write(`\x1b_Ga=T,f=100,z=-1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + const hasClass = await ctx.page.evaluate(() => { + const el = document.querySelector('.xterm-image-layer-bottom'); + return el !== null; + }); + strictEqual(hasClass, true); + }); + + test('bottom layer canvas is before text canvas in DOM order', async () => { + await ctx.page.evaluate(`window.term.options.allowTransparency = true`); + await ctx.proxy.write(`\x1b_Ga=T,f=100,z=-1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + const isFirst = await ctx.page.evaluate(() => { + const screen = document.querySelector('.xterm-screen'); + return screen?.firstElementChild?.classList.contains('xterm-image-layer-bottom') ?? false; + }); + strictEqual(isFirst, true); + }); + }); + test.describe('Pixel verification', () => { test('renders 1x1 black PNG at cursor position', async () => { const seq = `\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`; From 008aa1bfb5eea7571b75ac4b30fb93b3020535d6 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 12 Feb 2026 07:00:56 -0800 Subject: [PATCH 063/124] Avoid forced layout in overview ruler impl Fixes #5696 --- src/browser/decorations/OverviewRulerRenderer.ts | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/browser/decorations/OverviewRulerRenderer.ts b/src/browser/decorations/OverviewRulerRenderer.ts index c5492f55d..4302b3420 100644 --- a/src/browser/decorations/OverviewRulerRenderer.ts +++ b/src/browser/decorations/OverviewRulerRenderer.ts @@ -51,8 +51,6 @@ export class OverviewRulerRenderer extends Disposable { private _shouldUpdateAnchor: boolean | undefined = true; private _lastKnownBufferLength: number = 0; - private _containerHeight: number | undefined; - constructor( private readonly _viewportElement: HTMLElement, private readonly _screenElement: HTMLElement, @@ -91,13 +89,7 @@ export class OverviewRulerRenderer extends Disposable { } })); - // Container height changed - this._register(this._renderService.onRender((): void => { - if (!this._containerHeight || this._containerHeight !== this._screenElement.clientHeight) { - this._queueRefresh(true); - this._containerHeight = this._screenElement.clientHeight; - } - })); + this._register(this._renderService.onDimensionsChange(() => this._queueRefresh(true))); this._register(this._coreBrowserService.onDprChange(() => this._queueRefresh(true))); this._register(this._optionsService.onSpecificOptionChange('scrollbar', () => this._queueRefresh(true))); @@ -144,10 +136,12 @@ export class OverviewRulerRenderer extends Disposable { } private _refreshCanvasDimensions(): void { + const cssCanvasHeight = this._renderService.dimensions.css.canvas.height; + const deviceCanvasHeight = this._renderService.dimensions.device.canvas.height; this._canvas.style.width = `${this._width}px`; this._canvas.width = Math.round(this._width * this._coreBrowserService.dpr); - this._canvas.style.height = `${this._screenElement.clientHeight}px`; - this._canvas.height = Math.round(this._screenElement.clientHeight * this._coreBrowserService.dpr); + this._canvas.style.height = `${cssCanvasHeight}px`; + this._canvas.height = deviceCanvasHeight; this._refreshDrawConstants(); this._refreshColorZonePadding(); } From d4c3b693bbc4734d7f52f87ee34fe92e6b39554f Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 12 Feb 2026 09:28:51 -0800 Subject: [PATCH 064/124] Remove unnecessary kittyAddon from test_integrations.js --- bin/test_integration.js | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/test_integration.js b/bin/test_integration.js index caceaf9be..37e6aca7c 100644 --- a/bin/test_integration.js +++ b/bin/test_integration.js @@ -25,7 +25,6 @@ const addons = [ 'clipboard', 'fit', 'image', - 'kitty-graphics', 'progress', 'search', 'serialize', From 677e5275f9fcecc39df90f0e19cbe0836efefb76 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 12 Feb 2026 10:27:32 -0800 Subject: [PATCH 065/124] Store z-index for drawing order --- addons/addon-image/src/ImageStorage.ts | 28 +++++++++++++++---- addons/addon-image/src/Types.ts | 1 + .../src/kitty/KittyGraphicsHandler.ts | 5 ++-- addons/addon-image/test/KittyGraphics.test.ts | 6 ++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/addons/addon-image/src/ImageStorage.ts b/addons/addon-image/src/ImageStorage.ts index 3609b2791..b06c7d597 100644 --- a/addons/addon-image/src/ImageStorage.ts +++ b/addons/addon-image/src/ImageStorage.ts @@ -250,7 +250,7 @@ export class ImageStorage implements IDisposable { * Method to add an image to the storage. * Returns the internal image ID assigned to the stored image. */ - public addImage(img: HTMLCanvasElement | ImageBitmap, layer: ImageLayer = 'top'): number { + public addImage(img: HTMLCanvasElement | ImageBitmap, layer: ImageLayer = 'top', zIndex: number = 0): number { // never allow storage to exceed memory limit this._evictOldest(img.width * img.height); @@ -340,7 +340,8 @@ export class ImageStorage implements IDisposable { marker: endMarker || undefined, tileCount, bufferType: this._terminal.buffer.active.type, - layer + layer, + zIndex }; // finally add the image @@ -419,7 +420,11 @@ export class ImageStorage implements IDisposable { // clear drawing area this._renderer.clearLines(start, end); - // walk all cells in viewport and draw tiles found + // Collect draw calls so we can sort by z-index (lower z drawn first). + const drawCalls: { imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number }[] = []; + const placeholderCalls: { col: number, row: number, count: number }[] = []; + + // walk all cells in viewport and collect tiles found for (let row = start; row <= end; ++row) { const line = buffer.lines.get(row + buffer.ydisp) as IBufferLineExt; if (!line) return; @@ -453,16 +458,29 @@ export class ImageStorage implements IDisposable { col--; if (imgSpec) { if (imgSpec.actual) { - this._renderer.draw(imgSpec, startTile, startCol, row, count); + drawCalls.push({ imgSpec, tileId: startTile, col: startCol, row, count }); } } else if (this._opts.showPlaceholder) { - this._renderer.drawPlaceholder(startCol, row, count); + placeholderCalls.push({ col: startCol, row, count }); } this._fullyCleared = false; } } } } + + // Sort by z-index so lower z draws first (higher z renders on top) + drawCalls.sort((a, b) => a.imgSpec.zIndex - b.imgSpec.zIndex); + + // Draw placeholders first (lowest priority) + for (const call of placeholderCalls) { + this._renderer.drawPlaceholder(call.col, call.row, call.count); + } + + // Draw images in z-index order + for (const call of drawCalls) { + this._renderer.draw(call.imgSpec, call.tileId, call.col, call.row, call.count); + } } public viewportResize(metrics: { cols: number, rows: number }): void { diff --git a/addons/addon-image/src/Types.ts b/addons/addon-image/src/Types.ts index a9f3310be..80cec9e24 100644 --- a/addons/addon-image/src/Types.ts +++ b/addons/addon-image/src/Types.ts @@ -110,4 +110,5 @@ export interface IImageSpec { tileCount: number; bufferType: 'alternate' | 'normal'; layer: ImageLayer; + zIndex: number; } diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 8e3821f15..12caf59df 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -510,12 +510,13 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0; const layer: ImageLayer = (wantsBottom && this._coreTerminal.options.allowTransparency) ? 'bottom' : 'top'; + const zIndex = cmd.zIndex ?? 0; let storageId: number; if (w !== bitmap.width || h !== bitmap.height) { const resized = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); - storageId = this._storage.addImage(resized, layer); + storageId = this._storage.addImage(resized, layer, zIndex); } else { - storageId = this._storage.addImage(bitmap, layer); + storageId = this._storage.addImage(bitmap, layer, zIndex); } this._kittyIdToStorageId.set(image.id, storageId); diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 38a70c175..5655660bf 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -552,6 +552,7 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(100); strictEqual(await getImageStorageLength(), 1); strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'top'); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).zIndex`), 0); }); test('z=0 stores image on top layer', async () => { @@ -559,6 +560,7 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(100); strictEqual(await getImageStorageLength(), 1); strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'top'); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).zIndex`), 0); }); test('z=1 (positive) stores image on top layer', async () => { @@ -566,6 +568,7 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(100); strictEqual(await getImageStorageLength(), 1); strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'top'); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).zIndex`), 1); }); test('z=-1 falls back to top layer when allowTransparency is disabled', async () => { @@ -574,6 +577,7 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(100); strictEqual(await getImageStorageLength(), 1); strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'top'); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).zIndex`), -1); }); test('z=-1 (negative) stores image on bottom layer when allowTransparency is enabled', async () => { @@ -582,6 +586,7 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(100); strictEqual(await getImageStorageLength(), 1); strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'bottom'); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).zIndex`), -1); }); test('z=-100 (large negative) stores image on bottom layer when allowTransparency is enabled', async () => { @@ -590,6 +595,7 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(100); strictEqual(await getImageStorageLength(), 1); strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'bottom'); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).zIndex`), -100); }); test('top layer canvas has correct CSS class', async () => { From 4de03aaa383bc7e5cb4b52dc937c5e7aa3ab52c3 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 12 Feb 2026 11:03:46 -0800 Subject: [PATCH 066/124] Try to reduce duplication from 1d0cf32 --- addons/addon-image/src/ImageRenderer.ts | 119 +++++++++++------------- 1 file changed, 55 insertions(+), 64 deletions(-) diff --git a/addons/addon-image/src/ImageRenderer.ts b/addons/addon-image/src/ImageRenderer.ts index 24a15d433..1cb304b9b 100644 --- a/addons/addon-image/src/ImageRenderer.ts +++ b/addons/addon-image/src/ImageRenderer.ts @@ -18,12 +18,9 @@ const PLACEHOLDER_HEIGHT = 24; * - draw image tiles onRender */ export class ImageRenderer extends Disposable implements IDisposable { - /** @deprecated Use canvasTop instead. Kept for backward compat — points to canvasTop. */ - public get canvas(): HTMLCanvasElement | undefined { return this._canvasTop; } - private _canvasTop: HTMLCanvasElement | undefined; - private _canvasBottom: HTMLCanvasElement | undefined; - private _ctxTop: CanvasRenderingContext2D | null | undefined; - private _ctxBottom: CanvasRenderingContext2D | null | undefined; + /** @deprecated Kept for backward compat — points to top layer canvas. */ + public get canvas(): HTMLCanvasElement | undefined { return this._layers.get('top')?.canvas; } + private _layers = new Map(); private _placeholder: HTMLCanvasElement | undefined; private _placeholderBitmap: ImageBitmap | undefined; private _optionsRefresh = this._register(new MutableDisposable()); @@ -100,10 +97,7 @@ export class ImageRenderer extends Disposable implements IDisposable { this._oldSetRenderer = undefined; } this._renderService = undefined; - this._canvasTop = undefined; - this._canvasBottom = undefined; - this._ctxTop = undefined; - this._ctxBottom = undefined; + this._layers.clear(); this._placeholderBitmap?.close(); this._placeholderBitmap = undefined; this._placeholder = undefined; @@ -152,10 +146,10 @@ export class ImageRenderer extends Disposable implements IDisposable { const w = this.dimensions?.css.canvas.width || 0; const h = (++end - start) * (this.dimensions?.css.cell.height || 0); if (!layer || layer === 'top') { - this._ctxTop?.clearRect(0, y, w, h); + this._layers.get('top')?.clearRect(0, y, w, h); } if (!layer || layer === 'bottom') { - this._ctxBottom?.clearRect(0, y, w, h); + this._layers.get('bottom')?.clearRect(0, y, w, h); } } @@ -164,10 +158,12 @@ export class ImageRenderer extends Disposable implements IDisposable { */ public clearAll(layer?: ImageLayer): void { if (!layer || layer === 'top') { - this._ctxTop?.clearRect(0, 0, this._canvasTop?.width || 0, this._canvasTop?.height || 0); + const ctx = this._layers.get('top'); + ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); } if (!layer || layer === 'bottom') { - this._ctxBottom?.clearRect(0, 0, this._canvasBottom?.width || 0, this._canvasBottom?.height || 0); + const ctx = this._layers.get('bottom'); + ctx?.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); } } @@ -175,7 +171,7 @@ export class ImageRenderer extends Disposable implements IDisposable { * Draw neighboring tiles on the image layer canvas. */ public draw(imgSpec: IImageSpec, tileId: number, col: number, row: number, count: number = 1): void { - const ctx = imgSpec.layer === 'bottom' ? this._ctxBottom : this._ctxTop; + const ctx = this._layers.get(imgSpec.layer); if (!ctx) { return; } @@ -243,7 +239,8 @@ export class ImageRenderer extends Disposable implements IDisposable { * Draw a line with placeholder on the image layer canvas. */ public drawPlaceholder(col: number, row: number, count: number = 1): void { - if (this._ctxTop) { + const ctx = this._layers.get('top'); + if (ctx) { const { width, height } = this.cellSize; // Don't try to draw anything, if we cannot get valid renderer metrics. @@ -257,7 +254,7 @@ export class ImageRenderer extends Disposable implements IDisposable { this._createPlaceHolder(height + 1); } if (!this._placeholder) return; - this._ctxTop.drawImage( + ctx.drawImage( this._placeholderBitmap ?? this._placeholder!, col * width, (row * height) % 2 ? 0 : 1, // needs %2 offset correction @@ -278,13 +275,11 @@ export class ImageRenderer extends Disposable implements IDisposable { public rescaleCanvas(): void { const w = this.dimensions?.css.canvas.width || 0; const h = this.dimensions?.css.canvas.height || 0; - if (this._canvasTop && (this._canvasTop.width !== w || this._canvasTop.height !== h)) { - this._canvasTop.width = w; - this._canvasTop.height = h; - } - if (this._canvasBottom && (this._canvasBottom.width !== w || this._canvasBottom.height !== h)) { - this._canvasBottom.width = w; - this._canvasBottom.height = h; + for (const ctx of this._layers.values()) { + if (ctx.canvas.width !== w || ctx.canvas.height !== h) { + ctx.canvas.width = w; + ctx.canvas.height = h; + } } } @@ -323,61 +318,57 @@ export class ImageRenderer extends Disposable implements IDisposable { this._renderService = this._terminal._core._renderService; this._oldSetRenderer = this._renderService.setRenderer.bind(this._renderService); this._renderService.setRenderer = (renderer: any) => { - this.removeLayerFromDom(); - this.removeLayerFromDom('bottom'); + for (const key of [...this._layers.keys()]) { + this.removeLayerFromDom(key); + } this._oldSetRenderer?.call(this._renderService, renderer); }; } public insertLayerToDom(layer: ImageLayer = 'top'): void { // make sure that the terminal is attached to a document and to DOM - if (this.document && this._terminal._core.screenElement) { - if (layer === 'top' && !this._canvasTop) { - this._canvasTop = ImageRenderer.createCanvas( - this.document, this.dimensions?.css.canvas.width || 0, - this.dimensions?.css.canvas.height || 0 - ); - this._canvasTop.classList.add('xterm-image-layer-top'); - this._terminal._core.screenElement.appendChild(this._canvasTop); - this._ctxTop = this._canvasTop.getContext('2d', { alpha: true, desynchronized: true }); - this.clearAll('top'); - } - if (layer === 'bottom' && !this._canvasBottom) { - this._canvasBottom = ImageRenderer.createCanvas( - this.document, this.dimensions?.css.canvas.width || 0, - this.dimensions?.css.canvas.height || 0 - ); - this._canvasBottom.classList.add('xterm-image-layer-bottom'); - // Use z-index:-1 so it paints behind non-positioned text elements. - // The screen element needs to be a stacking context to contain the - // negative z-index, otherwise it would go behind the entire terminal. - this._canvasBottom.style.zIndex = '-1'; - const screenElement = this._terminal._core.screenElement; - screenElement.style.zIndex = '0'; - screenElement.insertBefore(this._canvasBottom, screenElement.firstChild); - this._ctxBottom = this._canvasBottom.getContext('2d', { alpha: true, desynchronized: true }); - this.clearAll('bottom'); - } - } else { + if (!this.document || !this._terminal._core.screenElement) { console.warn('image addon: cannot insert output canvas to DOM, missing document or screenElement'); + return; } + if (this._layers.has(layer)) { + return; + } + const canvas = ImageRenderer.createCanvas( + this.document, this.dimensions?.css.canvas.width || 0, + this.dimensions?.css.canvas.height || 0 + ); + canvas.classList.add(`xterm-image-layer-${layer}`); + const screenElement = this._terminal._core.screenElement; + if (layer === 'bottom') { + // Use z-index:-1 so it paints behind non-positioned text elements. + // The screen element needs to be a stacking context to contain the + // negative z-index, otherwise it would go behind the entire terminal. + canvas.style.zIndex = '-1'; + screenElement.style.zIndex = '0'; + screenElement.insertBefore(canvas, screenElement.firstChild); + } else { + screenElement.appendChild(canvas); + } + const ctx = canvas.getContext('2d', { alpha: true, desynchronized: true }); + if (!ctx) { + canvas.remove(); + return; + } + this._layers.set(layer, ctx); + this.clearAll(layer); } public removeLayerFromDom(layer: ImageLayer = 'top'): void { - if (layer === 'top' && this._canvasTop) { - this._ctxTop = undefined; - this._canvasTop.remove(); - this._canvasTop = undefined; - } - if (layer === 'bottom' && this._canvasBottom) { - this._ctxBottom = undefined; - this._canvasBottom.remove(); - this._canvasBottom = undefined; + const ctx = this._layers.get(layer); + if (ctx) { + ctx.canvas.remove(); + this._layers.delete(layer); } } public hasLayer(layer: ImageLayer): boolean { - return layer === 'top' ? !!this._canvasTop : !!this._canvasBottom; + return this._layers.has(layer); } private _createPlaceHolder(height: number = PLACEHOLDER_HEIGHT): void { From 457542b7b391ceee277d358438eb25b873afcd3b Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 12 Feb 2026 14:53:37 -0800 Subject: [PATCH 067/124] Support deletion --- .../src/kitty/KittyGraphicsHandler.ts | 74 +++++++---- .../src/kitty/KittyGraphicsTypes.test.ts | 39 ++++++ .../src/kitty/KittyGraphicsTypes.ts | 13 +- addons/addon-image/test/KittyGraphics.test.ts | 117 +++++++++++++++++- 4 files changed, 210 insertions(+), 33 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 12caf59df..674b92efe 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -428,38 +428,58 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } private _handleDelete(cmd: IKittyCommand): boolean { - const id = cmd.id; + // Per spec: default delete selector is 'a' (delete all visible placements) + const selector = cmd.deleteSelector ?? 'a'; - if (id !== undefined) { - // Abort in-flight chunked upload for this specific image - const pending = this._pendingTransmissions.get(id); - if (pending) { - pending.decoder.release(); - this._pendingTransmissions.delete(id); - } - - this._images.delete(id); - const storageId = this._kittyIdToStorageId.get(id); - if (storageId !== undefined) { - this._storage.deleteImage(storageId); - this._kittyIdToStorageId.delete(id); - } - } else { - // Abort all in-flight chunked uploads - for (const pending of this._pendingTransmissions.values()) { - pending.decoder.release(); - } - this._pendingTransmissions.clear(); - - this._images.clear(); - for (const storageId of this._kittyIdToStorageId.values()) { - this._storage.deleteImage(storageId); - } - this._kittyIdToStorageId.clear(); + // TODO: Distinguish lowercase (delete placements only) from uppercase + // (delete placements + free stored image data). Currently both variants + // free everything since we don't separate stored data from placements. + switch (selector) { + case 'a': + case 'A': + // Delete all — also abort all in-flight uploads + for (const pending of this._pendingTransmissions.values()) { + pending.decoder.release(); + } + this._pendingTransmissions.clear(); + this._deleteAll(); + break; + case 'i': + case 'I': + // Delete by image ID — only abort the targeted upload + if (cmd.id !== undefined) { + const pending = this._pendingTransmissions.get(cmd.id); + if (pending) { + pending.decoder.release(); + this._pendingTransmissions.delete(cmd.id); + } + this._deleteById(cmd.id); + } + break; + default: + // Unsupported selectors (c, n, p, q, r, x, y, z, f) — ignore for now + break; } return true; } + private _deleteById(id: number): void { + this._images.delete(id); + const storageId = this._kittyIdToStorageId.get(id); + if (storageId !== undefined) { + this._storage.deleteImage(storageId); + this._kittyIdToStorageId.delete(id); + } + } + + private _deleteAll(): void { + this._images.clear(); + for (const storageId of this._kittyIdToStorageId.values()) { + this._storage.deleteImage(storageId); + } + this._kittyIdToStorageId.clear(); + } + private _sendResponse(id: number, message: string, quiet: number): void { const isOk = message === 'OK'; if (isOk && quiet === 1) return; diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts index 04d95dd30..31d963f79 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts @@ -106,5 +106,44 @@ describe('KittyGraphicsTypes', () => { const cmd = parseKittyCommand('a=T,f=100'); assert.strictEqual(cmd.zIndex, undefined); }); + + it('should parse delete selector key', () => { + const cmd = parseKittyCommand('a=d,d=i,i=5'); + assert.strictEqual(cmd.action, 'd'); + assert.strictEqual(cmd.deleteSelector, 'i'); + assert.strictEqual(cmd.id, 5); + }); + + it('should parse uppercase delete selector', () => { + const cmd = parseKittyCommand('a=d,d=A'); + assert.strictEqual(cmd.deleteSelector, 'A'); + }); + + it('should parse delete selector d=a (all)', () => { + const cmd = parseKittyCommand('a=d,d=a'); + assert.strictEqual(cmd.deleteSelector, 'a'); + }); + + it('should leave deleteSelector undefined when not specified', () => { + const cmd = parseKittyCommand('a=d,i=5'); + assert.strictEqual(cmd.deleteSelector, undefined); + }); + + it('should parse placement id key', () => { + const cmd = parseKittyCommand('a=d,d=i,i=5,p=3'); + assert.strictEqual(cmd.placementId, 3); + assert.strictEqual(cmd.deleteSelector, 'i'); + assert.strictEqual(cmd.id, 5); + }); + + it('should leave placementId undefined when not specified', () => { + const cmd = parseKittyCommand('a=d,d=i,i=5'); + assert.strictEqual(cmd.placementId, undefined); + }); + + it('should parse image number key', () => { + const cmd = parseKittyCommand('a=t,f=100,I=42'); + assert.strictEqual(cmd.imageNumber, 42); + }); }); }); diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index b3f871fdd..df4021f88 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -72,7 +72,11 @@ export const enum KittyKey { // Cursor movement policy (0=move cursor after image, 1=don't move cursor) CURSOR_MOVEMENT = 'C', // Z-index for image layering (negative = behind text, 0+ = on top) - Z_INDEX = 'z' + Z_INDEX = 'z', + // Delete selector (a/A=all, i/I=by id, c/C=at cursor, etc.) — only used when a=d + DELETE_SELECTOR = 'd', + // Placement ID for targeting specific placements + PLACEMENT_ID = 'p' } // Pixel format constants @@ -98,6 +102,8 @@ export interface IKittyCommand { quiet?: number; cursorMovement?: number; zIndex?: number; + deleteSelector?: string; + placementId?: number; compression?: string; payload?: string; } @@ -153,6 +159,10 @@ export function parseKittyCommand(data: string): IKittyCommand { cmd.compression = value; continue; } + if (key === KittyKey.DELETE_SELECTOR) { + cmd.deleteSelector = value; + continue; + } const numValue = parseInt(value); switch (key) { case KittyKey.FORMAT: cmd.format = numValue; break; @@ -168,6 +178,7 @@ export function parseKittyCommand(data: string): IKittyCommand { case KittyKey.QUIET: cmd.quiet = numValue; break; case KittyKey.CURSOR_MOVEMENT: cmd.cursorMovement = numValue; break; case KittyKey.Z_INDEX: cmd.zIndex = numValue; break; + case KittyKey.PLACEMENT_ID: cmd.placementId = numValue; break; } } diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 5655660bf..676eda0f4 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -86,6 +86,7 @@ test.describe('Kitty Graphics Protocol', () => { // TODO: Add tests for animation frames // TODO: Add performance tests for streaming large images // TODO: Implement cursor movement per Kitty spec - cursor should move by cols/rows after placement (unless C=1) + // TODO: Distinguish lowercase delete selectors (placement only) from uppercase (placement + free data) test.beforeEach(async ({}, testInfo) => { // DEBT: This test never worked on webkit @@ -227,12 +228,12 @@ test.describe('Kitty Graphics Protocol', () => { }); test.describe('Delete commands', () => { - test('delete command (a=d) removes specific image by id', async () => { + test('delete command (a=d,d=i) removes specific image by id', async () => { await ctx.proxy.write(`\x1b_Ga=t,f=100,i=10;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(50); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); - await ctx.proxy.write(`\x1b_Ga=d,i=10\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=d,d=i,i=10\x1b\\`); await timeout(50); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); }); @@ -256,7 +257,7 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(50); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 1); - await ctx.proxy.write(`\x1b_Ga=d,i=50\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=d,d=i,i=50\x1b\\`); await timeout(50); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 0); }); @@ -270,7 +271,7 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(50); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 2); - await ctx.proxy.write(`\x1b_Ga=d,i=55\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=d,d=i,i=55\x1b\\`); await timeout(50); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 1); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.has(56)`), true); @@ -290,6 +291,112 @@ test.describe('Kitty Graphics Protocol', () => { strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').pendingTransmissions.size`), 0); }); + test('d=i selector deletes specific image by id', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=80;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=81;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); + + await ctx.proxy.write(`\x1b_Ga=d,d=i,i=80\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(81)`), true); + }); + + test('d=I selector deletes specific image by id (uppercase)', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=82;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=83;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); + + await ctx.proxy.write(`\x1b_Ga=d,d=I,i=82\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(83)`), true); + }); + + test('d=a selector deletes all images', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=84;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=85;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); + + await ctx.proxy.write(`\x1b_Ga=d,d=a\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); + }); + + test('d=A selector deletes all images (uppercase)', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=86;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=87;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 2); + + await ctx.proxy.write(`\x1b_Ga=d,d=A\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 0); + }); + + test('d=a selector also removes displayed images from storage', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=88;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + + await ctx.proxy.write(`\x1b_Ga=d,d=a\x1b\\`); + await timeout(50); + strictEqual(await getImageStorageLength(), 0); + }); + + test('d=i selector also removes displayed image from storage', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=89;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + + await ctx.proxy.write(`\x1b_Ga=d,d=i,i=89\x1b\\`); + await timeout(50); + strictEqual(await getImageStorageLength(), 0); + }); + + test('d=i without id does nothing', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=90;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + + await ctx.proxy.write(`\x1b_Ga=d,d=i\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + }); + + test('d=i selector clears pixels from canvas', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=92,q=1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [0, 0, 0, 255]); + + await ctx.proxy.write(`\x1b_Ga=d,d=i,i=92\x1b\\`); + await timeout(100); + strictEqual(await getPixel(0, 0, 0, 0), null); + }); + + test('d=a selector clears all pixels from canvas', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=93,q=1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [0, 0, 0, 255]); + + await ctx.proxy.write(`\x1b_Ga=d,d=a\x1b\\`); + await timeout(100); + strictEqual(await getPixel(0, 0, 0, 0), null); + }); + + test('unsupported delete selector is ignored', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=91;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + + await ctx.proxy.write(`\x1b_Ga=d,d=c\x1b\\`); + await timeout(50); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.size`), 1); + }); + test('chunks sent after delete are not assembled with previous data', async () => { const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); @@ -865,7 +972,7 @@ test.describe('Kitty Graphics Protocol', () => { await timeout(200); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(700)`), true); - await ctx.proxy.write(`\x1b_Ga=d,i=700\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=d,d=i,i=700\x1b\\`); await timeout(50); strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(700)`), false); }); From 3c7f313c3480e0d7a3b9d6110ecd85bc75dfc367 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 12 Feb 2026 16:00:48 -0800 Subject: [PATCH 068/124] Dont send false query --- .../src/kitty/KittyGraphicsHandler.ts | 59 ++++- .../src/kitty/KittyGraphicsTypes.ts | 7 + addons/addon-image/test/KittyGraphics.test.ts | 233 ++++++++++++++++++ 3 files changed, 288 insertions(+), 11 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 674b92efe..052898edf 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -309,6 +309,14 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._sendResponse(cmd.id ?? 0, 'OK', cmd.quiet ?? 0); return true; default: + // TODO: Implement remaining actions when needed: + // - a=p (placement): place a previously transmitted image + // - a=f (frame): animation frame operations + // - a=a (animation): animation control + // - a=c (compose): compose images + if (cmd.id !== undefined) { + this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0); + } return true; } } @@ -319,8 +327,12 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { switch (action) { case KittyAction.TRANSMIT: { const result = this._handleTransmit(cmd, bytes, decodeError); - if (cmd.id !== undefined && !decodeError && bytes.length > 0) { - this._sendResponse(cmd.id, 'OK', cmd.quiet ?? 0); + if (cmd.id !== undefined) { + if (decodeError) { + this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0); + } else if (bytes.length > 0) { + this._sendResponse(cmd.id, 'OK', cmd.quiet ?? 0); + } } return result; } @@ -329,6 +341,14 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { case KittyAction.QUERY: return this._handleQuery(cmd, bytes, decodeError); default: + // TODO: Implement remaining actions when needed: + // - a=p (placement): place a previously transmitted image + // - a=f (frame): animation frame operations + // - a=a (animation): animation control + // - a=c (compose): compose images + if (cmd.id !== undefined) { + this._sendResponse(cmd.id, 'EINVAL:unsupported action', cmd.quiet ?? 0); + } return true; } } @@ -338,11 +358,12 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { // Currently only supports direct transmission (t=d, the default). // - t=f (file): Payload is base64-encoded file path. Terminal reads image from that path. // - t=t (temp file): Payload is base64-encoded path in temp directory. Terminal reads, deletes. - // - t=s Payload is base64-encoded POSIX shm name. Terminal reads from shared memory. + // - t=s: Payload is base64-encoded POSIX shm name. Terminal reads from shared memory. // These modes require filesystem/IPC access not available in browsers. For Node.js/Electron: // 1. Check cmd.transmission (t key) before treating bytes as image data // 2. For t=f/t/s: decode bytes as UTF-8 string (the path/name), then read file contents // 3. For t=d: treat bytes as image data (current behavior) + // When implementing, also update _handleQuery to accept these transmission mediums. if (decodeError || bytes.length === 0) return true; @@ -360,7 +381,12 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } private _handleTransmitDisplay(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean | Promise { - if (decodeError) return true; + if (decodeError) { + if (cmd.id !== undefined) { + this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0); + } + return true; + } const pendingKey = cmd.id ?? 0; @@ -375,12 +401,12 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { if (image) { const result = this._displayImage(image, cmd); if (cmd.id !== undefined) { - return (result as Promise).then(r => { - this._sendResponse(id, 'OK', cmd.quiet ?? 0); - return r; + return result.then(success => { + this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0); + return true; }); } - return result; + return result.then(() => true); } return true; } @@ -389,6 +415,15 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const id = cmd.id ?? 0; const quiet = cmd.quiet ?? 0; + // Per spec: reject unsupported transmission mediums (only t=d is supported atm) + // TODO: When filesystem support is added (Node.js/Electron), update this to accept + // t=f (file), t=t (temp file), and t=s (shared memory) and respond OK for queries. + const transmission = cmd.transmission ?? 'd'; + if (transmission !== 'd') { + this._sendResponse(id, 'EINVAL:unsupported transmission medium', quiet); + return true; + } + // Check decode error first (invalid base64) if (decodeError) { this._sendResponse(id, 'EINVAL:invalid base64 data', quiet); @@ -491,10 +526,10 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { // Image display - private _displayImage(image: IKittyImageData, cmd: IKittyCommand): boolean | Promise { + private _displayImage(image: IKittyImageData, cmd: IKittyCommand): Promise { return this._decodeAndDisplay(image, cmd) .then(() => true) - .catch(() => true); + .catch(() => false); } private async _decodeAndDisplay(image: IKittyImageData, cmd: IKittyCommand): Promise { @@ -516,7 +551,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { h = Math.round(imgRows * ch); } - if (w * h > this._opts.pixelLimit) return; + if (w * h > this._opts.pixelLimit) { + throw new Error('image exceeds pixel limit'); + } // Save cursor position before addImage modifies it const buffer = this._coreTerminal._core.buffer; diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index df4021f88..cbba1a81a 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -73,6 +73,8 @@ export const enum KittyKey { CURSOR_MOVEMENT = 'C', // Z-index for image layering (negative = behind text, 0+ = on top) Z_INDEX = 'z', + // Transmission medium (d=direct, f=file, t=temp file, s=shared memory) + TRANSMISSION = 't', // Delete selector (a/A=all, i/I=by id, c/C=at cursor, etc.) — only used when a=d DELETE_SELECTOR = 'd', // Placement ID for targeting specific placements @@ -102,6 +104,7 @@ export interface IKittyCommand { quiet?: number; cursorMovement?: number; zIndex?: number; + transmission?: string; deleteSelector?: string; placementId?: number; compression?: string; @@ -159,6 +162,10 @@ export function parseKittyCommand(data: string): IKittyCommand { cmd.compression = value; continue; } + if (key === KittyKey.TRANSMISSION) { + cmd.transmission = value; + continue; + } if (key === KittyKey.DELETE_SELECTOR) { cmd.deleteSelector = value; continue; diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 676eda0f4..7df3d503f 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -544,6 +544,239 @@ test.describe('Kitty Graphics Protocol', () => { }); }); + test.describe('Error responses for transmit and display', () => { + test('a=t sends EINVAL on decode error when id is specified', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write('\x1b_Gi=110,a=t,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=110;EINVAL:invalid base64 data\x1b\\'); + }); + + test('a=t sends no response on decode error without id', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write('\x1b_Ga=t,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + + test('a=T sends EINVAL on decode error when id is specified', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write('\x1b_Gi=120,a=T,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=120;EINVAL:invalid base64 data\x1b\\'); + }); + + test('a=T sends no response on decode error without id', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write('\x1b_Ga=T,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + + test('a=T sends EINVAL when raw pixel render fails (missing dimensions)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=130,a=T,f=24;${RAW_RGB_1X1_BLACK}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=130;EINVAL:'), true); + }); + + test('a=T sends OK on successful render with id', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=140,a=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=140;OK\x1b\\'); + }); + + test('a=t sends OK on successful transmit with id', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=150,a=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=150;OK\x1b\\'); + }); + + test('a=t EINVAL suppressed by q=2', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write('\x1b_Gi=160,a=t,q=2,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + + test('a=T EINVAL suppressed by q=2', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write('\x1b_Gi=170,a=T,q=2,f=100;!!!invalid!!!\x1b\\'); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + + test('a=t OK suppressed by q=1', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write(`\x1b_Gi=180,a=t,q=1,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + + test('a=T OK suppressed by q=1', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write(`\x1b_Gi=190,a=T,q=1,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + }); + + test.describe('Transmission medium rejection', () => { + test('query rejects t=f (file transmission)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=200,a=q,t=f,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=200;EINVAL:'), true); + }); + + test('query rejects t=s (shared memory)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=201,a=q,t=s,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=201;EINVAL:'), true); + }); + + test('query rejects t=t (temp file)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=202,a=q,t=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=202;EINVAL:'), true); + }); + + test('query accepts t=d (direct transmission)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=203,a=q,t=d,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=203;OK\x1b\\'); + }); + + test('query without t key defaults to direct (OK)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=204,a=q,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=204;OK\x1b\\'); + }); + }); + + test.describe('Unimplemented action responses', () => { + test('a=p with id responds EINVAL', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=210,a=p\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=210;EINVAL:'), true); + }); + + test('a=p without id sends no response', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write(`\x1b_Ga=p\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + }); + test.describe('Cursor positioning', () => { // NOTE: Current tests document ACTUAL behavior (MVP - cursor doesn't move) // Per Kitty spec: cursor placed at first column after last image column, From 10182cc656a37b1e6a4619a6ac9d8a66c36054f6 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 12 Feb 2026 18:03:19 -0800 Subject: [PATCH 069/124] Reject unsupporteed transmission medium for a=t and a=T --- .../src/kitty/KittyGraphicsHandler.ts | 11 +- addons/addon-image/test/KittyGraphics.test.ts | 108 ++++++++++++++++++ 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 052898edf..100f48536 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -327,7 +327,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { switch (action) { case KittyAction.TRANSMIT: { const result = this._handleTransmit(cmd, bytes, decodeError); - if (cmd.id !== undefined) { + // Only send response when _handleTransmit didn't already respond + // (it handles unsupported transmission medium responses internally) + if ((cmd.transmission ?? 'd') === 'd' && cmd.id !== undefined) { if (decodeError) { this._sendResponse(cmd.id, 'EINVAL:invalid base64 data', cmd.quiet ?? 0); } else if (bytes.length > 0) { @@ -364,6 +366,13 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { // 2. For t=f/t/s: decode bytes as UTF-8 string (the path/name), then read file contents // 3. For t=d: treat bytes as image data (current behavior) // When implementing, also update _handleQuery to accept these transmission mediums. + const transmission = cmd.transmission ?? 'd'; + if (transmission !== 'd') { + if (cmd.id !== undefined) { + this._sendResponse(cmd.id, 'EINVAL:unsupported transmission medium', cmd.quiet ?? 0); + } + return true; + } if (decodeError || bytes.length === 0) return true; diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 7df3d503f..7aa15a780 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -748,6 +748,114 @@ test.describe('Kitty Graphics Protocol', () => { const response = await ctx.page.evaluate('window.kittyResponse'); strictEqual(response, '\x1b_Gi=204;OK\x1b\\'); }); + + // TODO: When file-based transmission mediums (t=f, t=t, t=s) are supported, + // update these tests to verify successful transmission instead of EINVAL. + test('transmit rejects t=f with id (EINVAL response)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=300,a=t,t=f,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=300;EINVAL:'), true); + }); + + test('transmit rejects t=s with id (EINVAL response)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=301,a=t,t=s,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=301;EINVAL:'), true); + }); + + test('transmit rejects t=t with id (EINVAL response)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=302,a=t,t=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=302;EINVAL:'), true); + }); + + test('transmit rejects t=f without id (no response)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Ga=t,t=f,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, ''); + }); + + // TODO: When file-based transmission mediums (t=f, t=t, t=s) are supported, + // update these tests to verify successful transmit+display instead of EINVAL. + test('transmit+display rejects t=f with id (EINVAL response)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=310,a=T,t=f,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=310;EINVAL:'), true); + }); + + test('transmit+display rejects t=s with id (EINVAL response)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=311,a=T,t=s,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=311;EINVAL:'), true); + }); + + test('transmit+display rejects t=t with id (EINVAL response)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Gi=312,a=T,t=t,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response.startsWith('\x1b_Gi=312;EINVAL:'), true); + }); + + test('transmit+display rejects t=f without id (no response)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Ga=T,t=f,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, ''); + }); }); test.describe('Unimplemented action responses', () => { From 6b646609346068fe3e040d2990edcf750232ac9f Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 12 Feb 2026 20:04:21 -0800 Subject: [PATCH 070/124] fix chunked transfer without repeated i = key --- .../src/kitty/KittyGraphicsHandler.ts | 31 +++++- addons/addon-image/test/KittyGraphics.test.ts | 105 +++++++++++++++++- 2 files changed, 129 insertions(+), 7 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 100f48536..27232c526 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -63,6 +63,12 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { // Storage related states private _pendingTransmissions: Map = new Map(); + /** + * Tracks the pending key of the most recently started chunked upload. + * Per spec, subsequent chunks only need m= (and optionally q=), without i=. + * When a chunk arrives with no i=, this key is used to find the pending upload. + */ + private _lastPendingKey: number | undefined; private _nextImageId = 1; /** Maps Kitty protocol image ID → ImageStorage internal ID for deletion/lookup. */ private _kittyIdToStorageId: Map = new Map(); @@ -91,6 +97,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { pending.decoder.release(); } this._pendingTransmissions.clear(); + this._lastPendingKey = undefined; if (this._activeDecoder) { this._activeDecoder.release(); this._activeDecoder = null; @@ -168,8 +175,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { if (this._aborted) return; // Check size limit (compare encoded bytes against pre-calculated limit) - // Include cumulative size from pending transmission for multi-chunk images - const pendingKey = this._parsedCommand?.id ?? 0; + // Include cumulative size from pending transmission for multi-chunk images. + // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey. + const pendingKey = this._parsedCommand?.id ?? this._lastPendingKey ?? 0; const pending = this._pendingTransmissions.get(pendingKey); const previousEncodedSize = pending?.totalEncodedSize ?? 0; this._totalEncodedSize += end - start; @@ -182,6 +190,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._activeDecoder = null; if (pending) { this._pendingTransmissions.delete(pendingKey); + if (this._lastPendingKey === pendingKey) { + this._lastPendingKey = undefined; + } } this._aborted = true; return; @@ -203,6 +214,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._decodeError = true; if (pending) { this._pendingTransmissions.delete(pendingKey); + if (this._lastPendingKey === pendingKey) { + this._lastPendingKey = undefined; + } } } } @@ -229,7 +243,8 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { return this._handleDelete(cmd); } - const pendingKey = cmd.id ?? 0; + // Per spec, subsequent chunks may omit i=, so fall back to _lastPendingKey. + const pendingKey = cmd.id ?? this._lastPendingKey ?? 0; const isMoreComing = cmd.more === 1; const pending = this._pendingTransmissions.get(pendingKey); @@ -246,11 +261,17 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { decodeError: this._decodeError }); } + this._lastPendingKey = pendingKey; this._activeDecoder = null; } return true; } + // Final chunk received — clear the last pending key + if (pending) { + this._lastPendingKey = undefined; + } + let decodeError = this._decodeError; let finalCmd = cmd; let decoder = this._activeDecoder; @@ -486,6 +507,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { pending.decoder.release(); } this._pendingTransmissions.clear(); + this._lastPendingKey = undefined; this._deleteAll(); break; case 'i': @@ -496,6 +518,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { if (pending) { pending.decoder.release(); this._pendingTransmissions.delete(cmd.id); + if (this._lastPendingKey === cmd.id) { + this._lastPendingKey = undefined; + } } this._deleteById(cmd.id); } diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 7aa15a780..07964110f 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -225,6 +225,107 @@ test.describe('Kitty Graphics Protocol', () => { (window as any).smallLimitAddon.dispose(); }); }); + + test('chunked a=T works when subsequent chunks omit i= (spec pattern)', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=400,m=1;${part1}\x1b\\`); + await timeout(50); + strictEqual(await getImageStorageLength(), 0); + + await ctx.proxy.write(`\x1b_Gm=0;${part2}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + }); + + test('chunked a=t works when subsequent chunks omit i= (spec pattern)', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=401,m=1;${part1}\x1b\\`); + await ctx.proxy.write(`\x1b_Gm=0;${part2}\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(401)`), true); + }); + + test('chunked data without i= on subsequent chunks is assembled correctly', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=402,m=1;${part1}\x1b\\`); + await ctx.proxy.write(`\x1b_Gm=0;${part2}\x1b\\`); + await timeout(100); + + const storedData = await ctx.page.evaluate(async () => { + const blob = (window as any).imageAddon._handlers.get('kitty').images.get(402).data; + const buffer = await blob.arrayBuffer(); + return Array.from(new Uint8Array(buffer)); + }); + deepStrictEqual(storedData, KITTY_BLACK_1X1_BYTES); + }); + + test('three-chunk transfer with only m= on middle and last chunks', async () => { + const third = Math.floor(KITTY_BLACK_1X1_BASE64.length / 3); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, third); + const part2End = third + Math.floor((KITTY_BLACK_1X1_BASE64.length - third) / 2); + const alignedPart2End = part2End - (part2End - third) % 4 + third; + const part2 = KITTY_BLACK_1X1_BASE64.substring(third, alignedPart2End); + const part3 = KITTY_BLACK_1X1_BASE64.substring(alignedPart2End); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=403,m=1;${part1}\x1b\\`); + await ctx.proxy.write(`\x1b_Gm=1;${part2}\x1b\\`); + await ctx.proxy.write(`\x1b_Gm=0;${part3}\x1b\\`); + await timeout(100); + + const storedData = await ctx.page.evaluate(async () => { + const blob = (window as any).imageAddon._handlers.get('kitty').images.get(403).data; + const buffer = await blob.arrayBuffer(); + return Array.from(new Uint8Array(buffer)); + }); + deepStrictEqual(storedData, KITTY_BLACK_1X1_BYTES); + }); + + test('chunked a=T without i= on any chunk works (no response)', async () => { + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=T,f=100,m=1;${part1}\x1b\\`); + await timeout(50); + strictEqual(await getImageStorageLength(), 0); + + await ctx.proxy.write(`\x1b_Gm=0;${part2}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + }); + + test('chunked transfer responds OK on final chunk when i= on first only', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + const half = Math.floor(KITTY_BLACK_1X1_BASE64.length / 2); + const part1 = KITTY_BLACK_1X1_BASE64.substring(0, half); + const part2 = KITTY_BLACK_1X1_BASE64.substring(half); + + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=405,m=1;${part1}\x1b\\`); + await timeout(50); + + let response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, ''); + + await ctx.proxy.write(`\x1b_Gm=0;${part2}\x1b\\`); + await timeout(100); + + response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=405;OK\x1b\\'); + }); }); test.describe('Delete commands', () => { @@ -749,8 +850,6 @@ test.describe('Kitty Graphics Protocol', () => { strictEqual(response, '\x1b_Gi=204;OK\x1b\\'); }); - // TODO: When file-based transmission mediums (t=f, t=t, t=s) are supported, - // update these tests to verify successful transmission instead of EINVAL. test('transmit rejects t=f with id (EINVAL response)', async () => { await ctx.page.evaluate(() => { (window as any).kittyResponse = ''; @@ -803,8 +902,6 @@ test.describe('Kitty Graphics Protocol', () => { strictEqual(response, ''); }); - // TODO: When file-based transmission mediums (t=f, t=t, t=s) are supported, - // update these tests to verify successful transmit+display instead of EINVAL. test('transmit+display rejects t=f with id (EINVAL response)', async () => { await ctx.page.evaluate(() => { (window as any).kittyResponse = ''; From eccbc60aa0f0b05ef74bbc48d7ec29570a7ae9c4 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 13 Feb 2026 05:29:22 -0800 Subject: [PATCH 071/124] Migrate to tsgo Fixes #5689 --- addons/addon-attach/package.json | 2 +- addons/addon-attach/test/tsconfig.json | 4 +- addons/addon-clipboard/package.json | 2 +- addons/addon-clipboard/test/tsconfig.json | 4 +- addons/addon-fit/package.json | 2 +- addons/addon-fit/test/tsconfig.json | 4 +- addons/addon-image/package.json | 2 +- addons/addon-image/src/tsconfig.json | 4 +- addons/addon-image/test/tsconfig.json | 4 +- addons/addon-ligatures/package.json | 4 +- addons/addon-ligatures/test/tsconfig.json | 6 +- addons/addon-progress/package.json | 2 +- addons/addon-progress/test/tsconfig.json | 4 +- addons/addon-search/package.json | 2 +- addons/addon-search/test/tsconfig.json | 4 +- .../addon-serialize/benchmark/tsconfig.json | 2 +- addons/addon-serialize/package.json | 2 +- addons/addon-serialize/src/tsconfig.json | 2 +- addons/addon-serialize/test/tsconfig.json | 1 - .../benchmark/tsconfig.json | 2 +- addons/addon-unicode-graphemes/package.json | 2 +- .../addon-unicode-graphemes/src/tsconfig.json | 1 - .../test/tsconfig.json | 1 - addons/addon-unicode11/package.json | 2 +- addons/addon-unicode11/src/tsconfig.json | 4 +- addons/addon-unicode11/test/tsconfig.json | 4 +- addons/addon-web-fonts/package.json | 2 +- addons/addon-web-fonts/test/tsconfig.json | 4 +- addons/addon-web-links/package.json | 2 +- addons/addon-web-links/test/tsconfig.json | 4 +- addons/addon-webgl/package.json | 2 +- .../customGlyphs/CustomGlyphDefinitions.ts | 57 ++++----- addons/addon-webgl/src/tsconfig.json | 4 +- addons/addon-webgl/test/tsconfig.json | 4 +- demo/client/tsconfig.json | 5 +- demo/server/tsconfig.json | 3 +- package-lock.json | 118 ++++++++++++++++++ package.json | 5 +- src/browser/tsconfig.json | 5 +- src/common/services/Services.ts | 2 +- src/common/tsconfig.json | 4 +- src/headless/tsconfig.json | 4 +- test/benchmark/tsconfig.json | 1 - test/playwright/TestUtils.ts | 17 +-- test/playwright/tsconfig.json | 3 +- 45 files changed, 234 insertions(+), 85 deletions(-) diff --git a/addons/addon-attach/package.json b/addons/addon-attach/package.json index ca4ee237d..7d874cd0b 100644 --- a/addons/addon-attach/package.json +++ b/addons/addon-attach/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-attach/test/tsconfig.json b/addons/addon-attach/test/tsconfig.json index cff277055..900a727ed 100644 --- a/addons/addon-attach/test/tsconfig.json +++ b/addons/addon-attach/test/tsconfig.json @@ -9,13 +9,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-clipboard/package.json b/addons/addon-clipboard/package.json index 3ab8e7f3a..176fa861a 100644 --- a/addons/addon-clipboard/package.json +++ b/addons/addon-clipboard/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-clipboard/test/tsconfig.json b/addons/addon-clipboard/test/tsconfig.json index cff277055..900a727ed 100644 --- a/addons/addon-clipboard/test/tsconfig.json +++ b/addons/addon-clipboard/test/tsconfig.json @@ -9,13 +9,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-fit/package.json b/addons/addon-fit/package.json index 5b00a3b23..22158e79f 100644 --- a/addons/addon-fit/package.json +++ b/addons/addon-fit/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-fit/test/tsconfig.json b/addons/addon-fit/test/tsconfig.json index cff277055..900a727ed 100644 --- a/addons/addon-fit/test/tsconfig.json +++ b/addons/addon-fit/test/tsconfig.json @@ -9,13 +9,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-image/package.json b/addons/addon-image/package.json index 5078a57f4..3d5fa37f6 100644 --- a/addons/addon-image/package.json +++ b/addons/addon-image/package.json @@ -18,7 +18,7 @@ "xterm.js" ], "scripts": { - "prepackage": "../../node_modules/.bin/tsc -p .", + "prepackage": "../../node_modules/.bin/tsgo -p .", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", "start": "node ../../demo/start" diff --git a/addons/addon-image/src/tsconfig.json b/addons/addon-image/src/tsconfig.json index a18b47c9c..9a5d24c1f 100644 --- a/addons/addon-image/src/tsconfig.json +++ b/addons/addon-image/src/tsconfig.json @@ -11,11 +11,11 @@ "types": [ "../../../node_modules/@types/mocha" ], - "baseUrl": ".", "paths": { "browser/*": [ "../../../src/browser/*" ], "common/*": [ "../../../src/common/*" ], - "@xterm/addon-image": [ "../typings/addon-image.d.ts" ] + "@xterm/addon-image": [ "../typings/addon-image.d.ts" ], + "*": [ "./*" ] } }, "include": [ diff --git a/addons/addon-image/test/tsconfig.json b/addons/addon-image/test/tsconfig.json index cff277055..900a727ed 100644 --- a/addons/addon-image/test/tsconfig.json +++ b/addons/addon-image/test/tsconfig.json @@ -9,13 +9,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-ligatures/package.json b/addons/addon-ligatures/package.json index 3117b7e80..1b972c957 100644 --- a/addons/addon-ligatures/package.json +++ b/addons/addon-ligatures/package.json @@ -14,8 +14,8 @@ "node": ">8.0.0" }, "scripts": { - "build": "tsc -p src", - "watch": "tsc -w -p src", + "build": "tsgo -p src", + "watch": "tsgo -w -p src", "prepackage": "npm run build", "package": "webpack", "pretest": "npm run build", diff --git a/addons/addon-ligatures/test/tsconfig.json b/addons/addon-ligatures/test/tsconfig.json index ca68b4685..6986e2b46 100644 --- a/addons/addon-ligatures/test/tsconfig.json +++ b/addons/addon-ligatures/test/tsconfig.json @@ -9,8 +9,12 @@ "outDir": "../out-esbuild-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "strict": true, + "paths": { + "*": [ + "./*" + ] + }, "types": [ "../../../node_modules/@types/mocha", "../../../node_modules/@types/node" diff --git a/addons/addon-progress/package.json b/addons/addon-progress/package.json index 11e13abbe..8b130d6ce 100644 --- a/addons/addon-progress/package.json +++ b/addons/addon-progress/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-progress/test/tsconfig.json b/addons/addon-progress/test/tsconfig.json index cff277055..900a727ed 100644 --- a/addons/addon-progress/test/tsconfig.json +++ b/addons/addon-progress/test/tsconfig.json @@ -9,13 +9,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-search/package.json b/addons/addon-search/package.json index 2a8ca6f72..ebec5a8b8 100644 --- a/addons/addon-search/package.json +++ b/addons/addon-search/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "prepackage": "../../node_modules/.bin/tsc -p .", + "prepackage": "../../node_modules/.bin/tsgo -p .", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", "start": "node ../../demo/start" diff --git a/addons/addon-search/test/tsconfig.json b/addons/addon-search/test/tsconfig.json index cff277055..900a727ed 100644 --- a/addons/addon-search/test/tsconfig.json +++ b/addons/addon-search/test/tsconfig.json @@ -9,13 +9,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-serialize/benchmark/tsconfig.json b/addons/addon-serialize/benchmark/tsconfig.json index 1f6429f6e..afc3944a2 100644 --- a/addons/addon-serialize/benchmark/tsconfig.json +++ b/addons/addon-serialize/benchmark/tsconfig.json @@ -4,13 +4,13 @@ "dom", "es2021" ], + "rootDir": "..", "outDir": "../out-benchmark", "types": ["../../../node_modules/@types/node"], "moduleResolution": "node", "strict": false, "target": "es2021", "module": "commonjs", - "baseUrl": ".", "paths": { "common/*": ["../../../src/common/*"], "browser/*": ["../../../src/browser/*"], diff --git a/addons/addon-serialize/package.json b/addons/addon-serialize/package.json index f6acb018b..6fa91ffee 100644 --- a/addons/addon-serialize/package.json +++ b/addons/addon-serialize/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-serialize/src/tsconfig.json b/addons/addon-serialize/src/tsconfig.json index 6fb641ef4..725647366 100644 --- a/addons/addon-serialize/src/tsconfig.json +++ b/addons/addon-serialize/src/tsconfig.json @@ -10,7 +10,6 @@ "outDir": "../out", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" @@ -23,6 +22,7 @@ ] }, "strict": true, + "skipLibCheck": true, "types": [ "../../../node_modules/@types/mocha" ] diff --git a/addons/addon-serialize/test/tsconfig.json b/addons/addon-serialize/test/tsconfig.json index cff277055..769909b19 100644 --- a/addons/addon-serialize/test/tsconfig.json +++ b/addons/addon-serialize/test/tsconfig.json @@ -9,7 +9,6 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" diff --git a/addons/addon-unicode-graphemes/benchmark/tsconfig.json b/addons/addon-unicode-graphemes/benchmark/tsconfig.json index c6f37a6ce..47e6b53a4 100644 --- a/addons/addon-unicode-graphemes/benchmark/tsconfig.json +++ b/addons/addon-unicode-graphemes/benchmark/tsconfig.json @@ -1,13 +1,13 @@ { "compilerOptions": { "lib": ["dom", "es6"], + "rootDir": "..", "outDir": "../out-benchmark", "types": ["../../../node_modules/@types/node"], "moduleResolution": "node", "strict": false, "target": "es2015", "module": "commonjs", - "baseUrl": ".", "paths": { "common/*": ["../../../src/common/*"], "browser/*": ["../../../src/browser/*"], diff --git a/addons/addon-unicode-graphemes/package.json b/addons/addon-unicode-graphemes/package.json index 168407702..640a61a7d 100644 --- a/addons/addon-unicode-graphemes/package.json +++ b/addons/addon-unicode-graphemes/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-unicode-graphemes/src/tsconfig.json b/addons/addon-unicode-graphemes/src/tsconfig.json index e9967bbe2..824909dbd 100644 --- a/addons/addon-unicode-graphemes/src/tsconfig.json +++ b/addons/addon-unicode-graphemes/src/tsconfig.json @@ -11,7 +11,6 @@ "sourceMap": true, "removeComments": true, "strict": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" diff --git a/addons/addon-unicode-graphemes/test/tsconfig.json b/addons/addon-unicode-graphemes/test/tsconfig.json index cff277055..769909b19 100644 --- a/addons/addon-unicode-graphemes/test/tsconfig.json +++ b/addons/addon-unicode-graphemes/test/tsconfig.json @@ -9,7 +9,6 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" diff --git a/addons/addon-unicode11/package.json b/addons/addon-unicode11/package.json index d027996b5..65c9b076e 100644 --- a/addons/addon-unicode11/package.json +++ b/addons/addon-unicode11/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-unicode11/src/tsconfig.json b/addons/addon-unicode11/src/tsconfig.json index 8eb7752bd..31286fb0f 100644 --- a/addons/addon-unicode11/src/tsconfig.json +++ b/addons/addon-unicode11/src/tsconfig.json @@ -11,13 +11,15 @@ "sourceMap": true, "removeComments": true, "strict": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "@xterm/addon-unicode11": [ "../typings/addon-unicode11.d.ts" + ], + "*": [ + "./*" ] }, "types": [ diff --git a/addons/addon-unicode11/test/tsconfig.json b/addons/addon-unicode11/test/tsconfig.json index cff277055..900a727ed 100644 --- a/addons/addon-unicode11/test/tsconfig.json +++ b/addons/addon-unicode11/test/tsconfig.json @@ -9,13 +9,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-web-fonts/package.json b/addons/addon-web-fonts/package.json index 856c7e258..ee52931da 100644 --- a/addons/addon-web-fonts/package.json +++ b/addons/addon-web-fonts/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-web-fonts/test/tsconfig.json b/addons/addon-web-fonts/test/tsconfig.json index 120fccdc3..4151488a8 100644 --- a/addons/addon-web-fonts/test/tsconfig.json +++ b/addons/addon-web-fonts/test/tsconfig.json @@ -10,13 +10,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-web-links/package.json b/addons/addon-web-links/package.json index 214a26d4c..d058376c8 100644 --- a/addons/addon-web-links/package.json +++ b/addons/addon-web-links/package.json @@ -16,7 +16,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-web-links/test/tsconfig.json b/addons/addon-web-links/test/tsconfig.json index 120fccdc3..4151488a8 100644 --- a/addons/addon-web-links/test/tsconfig.json +++ b/addons/addon-web-links/test/tsconfig.json @@ -10,13 +10,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-webgl/package.json b/addons/addon-webgl/package.json index d8aea18c0..4ad686b04 100644 --- a/addons/addon-webgl/package.json +++ b/addons/addon-webgl/package.json @@ -17,7 +17,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", + "build": "../../node_modules/.bin/tsgo -p .", "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", diff --git a/addons/addon-webgl/src/customGlyphs/CustomGlyphDefinitions.ts b/addons/addon-webgl/src/customGlyphs/CustomGlyphDefinitions.ts index 22ffdfa91..c35299809 100644 --- a/addons/addon-webgl/src/customGlyphs/CustomGlyphDefinitions.ts +++ b/addons/addon-webgl/src/customGlyphs/CustomGlyphDefinitions.ts @@ -7,6 +7,35 @@ import { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, /* eslint-disable max-len */ +const enum Shapes { + /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1', + /** ─ */ LEFT_TO_RIGHT = 'M0,.5 L1,.5', + + /** └ */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5', + /** ┘ */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5', + /** ┐ */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1', + /** ┌ */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5', + + /** ╵ */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0', + /** ╴ */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5', + /** ╶ */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5', + /** ╷ */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1', + + /** ┴ */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0', + /** ┤ */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5', + /** ├ */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5', + /** ┬ */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1', + + /** ┼ */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1', + + /** ╌ */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled + /** ┄ */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled + /** ┉ */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled + /** ╎ */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9', + /** ┆ */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333', + /** ┊ */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95', +} + namespace GitBranchSymbolsParts { // Lines export const LINE_H: CustomGlyphDefinitionPart = Object.freeze({ type: CustomGlyphDefinitionType.PATH_FUNCTION, data: Shapes.LEFT_TO_RIGHT, strokeWidth: 1 }); @@ -988,31 +1017,3 @@ function segmentedDigit(pattern: number): string { return paths.join(' '); } -const enum Shapes { - /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1', - /** ─ */ LEFT_TO_RIGHT = 'M0,.5 L1,.5', - - /** └ */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5', - /** ┘ */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5', - /** ┐ */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1', - /** ┌ */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5', - - /** ╵ */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0', - /** ╴ */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5', - /** ╶ */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5', - /** ╷ */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1', - - /** ┴ */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0', - /** ┤ */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5', - /** ├ */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5', - /** ┬ */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1', - - /** ┼ */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1', - - /** ╌ */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled - /** ┄ */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled - /** ┉ */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled - /** ╎ */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9', - /** ┆ */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333', - /** ┊ */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95', -} diff --git a/addons/addon-webgl/src/tsconfig.json b/addons/addon-webgl/src/tsconfig.json index 924d3762d..aeb42a1bf 100644 --- a/addons/addon-webgl/src/tsconfig.json +++ b/addons/addon-webgl/src/tsconfig.json @@ -10,7 +10,6 @@ "outDir": "../out", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" @@ -20,6 +19,9 @@ ], "@xterm/addon-webgl": [ "../typings/addon-webgl.d.ts" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/addons/addon-webgl/test/tsconfig.json b/addons/addon-webgl/test/tsconfig.json index c602c462a..73439ddc1 100644 --- a/addons/addon-webgl/test/tsconfig.json +++ b/addons/addon-webgl/test/tsconfig.json @@ -9,13 +9,15 @@ "outDir": "../out-test", "sourceMap": true, "removeComments": true, - "baseUrl": ".", "paths": { "common/*": [ "../../../src/common/*" ], "browser/*": [ "../../../src/browser/*" + ], + "*": [ + "./*" ] }, "strict": true, diff --git a/demo/client/tsconfig.json b/demo/client/tsconfig.json index 6c6015318..244f19c6e 100644 --- a/demo/client/tsconfig.json +++ b/demo/client/tsconfig.json @@ -5,8 +5,8 @@ "outDir": "../out-demo/client", "rootDir": ".", "sourceMap": true, - "baseUrl": ".", "strict": true, + "skipLibCheck": true, "paths": { "@xterm/addon-attach": ["../../addons/addon-attach"], "@xterm/addon-clipboard": ["../../addons/addon-clipboard"], @@ -20,7 +20,8 @@ "@xterm/addon-webgl": ["../../addons/addon-webgl"], "@xterm/addon-unicode11": ["../../addons/addon-unicode11"], "@xterm/addon-unicode-graphemes": ["../../addons/addon-unicode-graphemes"], - "@xterm/addon-ligatures": ["../../addons/addon-ligatures"] + "@xterm/addon-ligatures": ["../../addons/addon-ligatures"], + "*": ["./*"] } }, "include": [ diff --git a/demo/server/tsconfig.json b/demo/server/tsconfig.json index 2cddc3c94..e31d6904a 100644 --- a/demo/server/tsconfig.json +++ b/demo/server/tsconfig.json @@ -5,7 +5,8 @@ "outDir": "../out-demo/server", "rootDir": ".", "sourceMap": true, - "esModuleInterop": true + "esModuleInterop": true, + "skipLibCheck": true }, "include": [ "./**/*", diff --git a/package-lock.json b/package-lock.json index 791c05217..9c83261b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "@types/ws": "^8.2.0", "@typescript-eslint/eslint-plugin": "^8.50.1", "@typescript-eslint/parser": "^8.50.1", + "@typescript/native-preview": "^7.0.0-dev.20260213.1", "chai": "^4.3.4", "concurrently": "^9.1.2", "cross-env": "^7.0.3", @@ -1970,6 +1971,123 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript/native-preview": { + "version": "7.0.0-dev.20260213.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260213.1.tgz", + "integrity": "sha512-TZ/0Tv954jRpn5IHQJZQF0gaNmw//ZTvkgr3nC2H8u9t4GxUhIk5vfAHVFgdl8JnNGbl7gZks37FVsEwXjdHqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsgo": "bin/tsgo.js" + }, + "optionalDependencies": { + "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260213.1", + "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260213.1", + "@typescript/native-preview-linux-arm": "7.0.0-dev.20260213.1", + "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260213.1", + "@typescript/native-preview-linux-x64": "7.0.0-dev.20260213.1", + "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260213.1", + "@typescript/native-preview-win32-x64": "7.0.0-dev.20260213.1" + } + }, + "node_modules/@typescript/native-preview-darwin-arm64": { + "version": "7.0.0-dev.20260213.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260213.1.tgz", + "integrity": "sha512-nqfuHgFZ8MvaHeb1XOkAGIGc6cR91dwQdlHmlbH918n63JguKzkYjzzulpr48IVn1SVewGwjtfs1moCpaDpWcg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@typescript/native-preview-darwin-x64": { + "version": "7.0.0-dev.20260213.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260213.1.tgz", + "integrity": "sha512-JDVDVLPIYhYZR12omTKwzKbdw+wnPEtLnkmM+nioqbISlV29fg7IBgFx0/mf1D+Gz1ztUQVHDTqw4GEgOZ9VTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@typescript/native-preview-linux-arm": { + "version": "7.0.0-dev.20260213.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260213.1.tgz", + "integrity": "sha512-O6iVB8tTnLZJVYrChH6VJuCwqAa2ObWVdMtrKQw5UtmLXBhsOhZ3isttSuGzQrPfTiGN091IdW1KuRi8Ft1lnQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@typescript/native-preview-linux-arm64": { + "version": "7.0.0-dev.20260213.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260213.1.tgz", + "integrity": "sha512-d7Gwl8W4aics0KI4H0zz3TP1ngnP8L5COND0TPBZ7ifWVrxKDNSLhF2V9OuStW43RPfA4Gzik9iIv+l0Lg+eGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@typescript/native-preview-linux-x64": { + "version": "7.0.0-dev.20260213.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260213.1.tgz", + "integrity": "sha512-Aq55fID1fE5/8K4XvfVddgw8LKUgY3kp5IOb+QEklfyle4MuAV5gtat3MnEv9XMbiidk8iKVxYrYASlUQEQzDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@typescript/native-preview-win32-arm64": { + "version": "7.0.0-dev.20260213.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260213.1.tgz", + "integrity": "sha512-VlyULgXApmGMSqAANjskGx0AcjHchf3I8rhZ47AxF/XKAkZPe/5ewfleJ97iln7dg1UL3lq2cJY2CXxU+JPcFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@typescript/native-preview-win32-x64": { + "version": "7.0.0-dev.20260213.1", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260213.1.tgz", + "integrity": "sha512-lEtWvZDa2oCgqJ2gbP6BRLUeTyHLyrt5BfJmVlvmVSTZzdoBpFROJdp9yprsa2Zry2o5GK8HFAxd3RlvxkOU5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", diff --git a/package.json b/package.json index 5ae5a4e7b..8c0f44628 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,8 @@ "dev": "concurrently -k -p [{name}] -n tsc,esbuild,esbuild-demo-client,esbuild-demo-server,server -c blue,yellow,cyan,green,magenta \"npm:tsc-watch\" \"npm:esbuild-watch\" \"npm:esbuild-demo-client-watch\" \"npm:esbuild-demo-server-watch\" \"npm:start\"", "build": "npm run tsc", "watch": "npm run tsc-watch", - "tsc": "tsc -b ./tsconfig.all.json", - "tsc-watch": "tsc -b -w ./tsconfig.all.json --preserveWatchOutput", + "tsc": "tsgo -b ./tsconfig.all.json", + "tsc-watch": "tsgo -b -w ./tsconfig.all.json --preserveWatchOutput", "esbuild": "node bin/esbuild_all.mjs", "esbuild-watch": "node bin/esbuild_all.mjs --watch", "esbuild-package": "node bin/esbuild_all.mjs --prod", @@ -92,6 +92,7 @@ "@types/ws": "^8.2.0", "@typescript-eslint/eslint-plugin": "^8.50.1", "@typescript-eslint/parser": "^8.50.1", + "@typescript/native-preview": "^7.0.0-dev.20260213.1", "chai": "^4.3.4", "concurrently": "^9.1.2", "cross-env": "^7.0.3", diff --git a/src/browser/tsconfig.json b/src/browser/tsconfig.json index 673a55a6c..ff5bf6ad7 100644 --- a/src/browser/tsconfig.json +++ b/src/browser/tsconfig.json @@ -9,9 +9,10 @@ "types": [ "../../node_modules/@types/mocha" ], - "baseUrl": "..", + "skipLibCheck": true, "paths": { - "common/*": [ "./common/*" ] + "common/*": [ "./../common/*" ], + "*": [ "./../*" ] } }, "include": [ diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index b40f16fd2..e0af27eee 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, type IOverviewRulerOptions } from '@xterm/xterm'; +import type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm'; import { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, IAttributeData, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from 'common/Types'; import { IBuffer, IBufferSet } from 'common/buffer/Types'; import { createDecorator } from 'common/services/ServiceRegistry'; diff --git a/src/common/tsconfig.json b/src/common/tsconfig.json index 28f5205ca..22501b9cf 100644 --- a/src/common/tsconfig.json +++ b/src/common/tsconfig.json @@ -9,9 +9,9 @@ "types": [ "../../node_modules/@types/mocha" ], - "baseUrl": "..", "paths": { - "common/*": [ "./common/*" ] + "common/*": [ "./../common/*" ], + "*": [ "./../*" ] } }, "include": [ diff --git a/src/headless/tsconfig.json b/src/headless/tsconfig.json index e48c4fd5b..6ae7b1dc9 100644 --- a/src/headless/tsconfig.json +++ b/src/headless/tsconfig.json @@ -10,9 +10,9 @@ "../../node_modules/@types/mocha", "../../node_modules/@types/node" ], - "baseUrl": "../", "paths": { - "common/*": [ "./common/*" ] + "common/*": [ "./../common/*" ], + "*": [ "./../*" ] } }, "include": [ diff --git a/test/benchmark/tsconfig.json b/test/benchmark/tsconfig.json index 8d1736df7..2f24f0762 100644 --- a/test/benchmark/tsconfig.json +++ b/test/benchmark/tsconfig.json @@ -12,7 +12,6 @@ "strict": false, "target": "es2021", "module": "commonjs", - "baseUrl": ".", "paths": { "common/*": [ "../../src/common/*" ], "browser/*": [ "../../src/browser/*" ], diff --git a/test/playwright/TestUtils.ts b/test/playwright/TestUtils.ts index f1569d41b..8a76c8820 100644 --- a/test/playwright/TestUtils.ts +++ b/test/playwright/TestUtils.ts @@ -9,9 +9,10 @@ import type { IRenderDimensions as IRenderDimensionsInternal } from 'browser/ren import type { IRenderService } from 'browser/services/Services'; import type { ICoreTerminal, IDisposable, IMarker } from 'common/Types'; import * as playwright from '@playwright/test'; -import { PageFunction } from 'playwright-core/types/structs'; import { IBuffer, IBufferCell, IBufferLine, IBufferNamespace, IBufferRange, IDecoration, IDecorationOptions, IModes, IRenderDimensions, ITerminalInitOnlyOptions, ITerminalOptions, Terminal } from '@xterm/xterm'; +type PageFunction = (arg: Arg) => R | Promise; + export interface ITestContext { browser: Browser; page: Page; @@ -106,7 +107,7 @@ type PlaywrightApiProxy(pageFunction: PageFunction[], T>): Promise; + evaluate(pageFunction: PageFunction): Promise; write(data: string | Uint8Array): Promise; } @@ -288,11 +289,11 @@ export class TerminalProxy implements ITerminalProxyCustomMethods, PlaywrightApi public async clearTextureAtlas(): Promise { return this.evaluate(([term]) => term.clearTextureAtlas()); } // #endregion - public async evaluate(pageFunction: PageFunction[], T>): Promise { + public async evaluate(pageFunction: PageFunction): Promise { return this._page.evaluate(pageFunction, [await this.getHandle()]); } - public async evaluateHandle(pageFunction: PageFunction[], T>): Promise> { + public async evaluateHandle(pageFunction: PageFunction): Promise> { return this._page.evaluateHandle(pageFunction, [await this.getHandle()]); } @@ -342,7 +343,7 @@ class TerminalBufferProxy /* implements EnsureAsyncProperties*/ { return undefined; } - public async evaluate(pageFunction: PageFunction[], T>): Promise { + public async evaluate(pageFunction: PageFunction): Promise { return this._page.evaluate(pageFunction, [await this._handle]); } } @@ -373,7 +374,7 @@ class TerminalBufferLine { return undefined; } - public async evaluate(pageFunction: PageFunction[], T>): Promise { + public async evaluate(pageFunction: PageFunction): Promise { return this._page.evaluate(pageFunction, [this._handle]); } } @@ -414,7 +415,7 @@ class TerminalBufferCell { public isAttributeDefault(): Promise { return this.evaluate(([cell]) => cell.isAttributeDefault()); } - public async evaluate(pageFunction: PageFunction[], T>): Promise { + public async evaluate(pageFunction: PageFunction): Promise { return this._page.evaluate(pageFunction, [this._handle]); } } @@ -438,7 +439,7 @@ class TerminalCoreProxy { return this._proxy.evaluateHandle(([term]) => (term as any)._core as ICoreTerminal); } - public async evaluate(pageFunction: PageFunction[], T>): Promise { + public async evaluate(pageFunction: PageFunction): Promise { return this._page.evaluate(pageFunction, [await this._getCoreHandle()]); } } diff --git a/test/playwright/tsconfig.json b/test/playwright/tsconfig.json index 255e6eb0e..f1372e89f 100644 --- a/test/playwright/tsconfig.json +++ b/test/playwright/tsconfig.json @@ -14,8 +14,9 @@ "removeComments": true, "pretty": true, "strict": true, + "noImplicitAny": false, "declaration": true, - "baseUrl": ".", + "moduleResolution": "node", "paths": { "browser/*": [ "../../src/browser/*" From 375be976157b9b5332be8deb7f1862a21ea39626 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Feb 2026 15:15:15 +0000 Subject: [PATCH 072/124] Bump qs from 6.14.1 to 6.14.2 Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.14.2. - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.14.1...v6.14.2) --- updated-dependencies: - dependency-name: qs dependency-version: 6.14.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c83261b2..2233efd33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6667,9 +6667,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { From e60c96823d45e89c2d8dea6e0ab7cb280dccd57a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 13 Feb 2026 08:10:16 -0800 Subject: [PATCH 073/124] Add hook to setup repo when agent starts Fixes #5605 --- .github/hooks/setupRepo.json | 10 +++ bin/agent/setup-repo.mjs | 138 +++++++++++++++++++++++++++++++++++ package.json | 3 +- 3 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 .github/hooks/setupRepo.json create mode 100644 bin/agent/setup-repo.mjs diff --git a/.github/hooks/setupRepo.json b/.github/hooks/setupRepo.json new file mode 100644 index 000000000..5dd0c6560 --- /dev/null +++ b/.github/hooks/setupRepo.json @@ -0,0 +1,10 @@ +{ + "hooks": { + "SessionStart": [ + { + "type": "command", + "command": "npm run agent:setup-repo" + } + ] + } +} \ No newline at end of file diff --git a/bin/agent/setup-repo.mjs b/bin/agent/setup-repo.mjs new file mode 100644 index 000000000..2db85d87a --- /dev/null +++ b/bin/agent/setup-repo.mjs @@ -0,0 +1,138 @@ +// @ts-check + +import { cpSync, existsSync, lstatSync, readFileSync } from 'node:fs'; +import { spawnSync } from 'node:child_process'; +import { basename, dirname, resolve, sep } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../..'); +const nodeModulesPath = resolve(repoRoot, 'node_modules'); +const npmExecutable = process.platform === 'win32' ? 'npm.cmd' : 'npm'; + +/** @typedef {{ folder: string; reason: string }} Candidate */ + +/** @param {string} message */ +function log(message) { + console.info(`[setup-fast] ${message}`); +} + +/** @param {string[]} args */ +function runNpm(args) { + log(`Running: npm ${args.join(' ')}`); + const result = spawnSync(npmExecutable, args, { + cwd: repoRoot, + stdio: 'inherit' + }); + if (result.error) { + throw result.error; + } + if ((result.status ?? 1) !== 0) { + process.exit(result.status ?? 1); + } +} + +/** + * @param {Candidate[]} candidates + * @param {string | undefined} folder + * @param {string} reason + */ +function addCandidate(candidates, folder, reason) { + if (!folder) { + return; + } + if (candidates.some(candidate => candidate.folder === folder)) { + return; + } + candidates.push({ folder, reason }); + log(`Candidate found (${reason}): ${folder}`); +} + +function detectMainSiblingFolder() { + const currentFolderName = basename(repoRoot); + if (!currentFolderName.startsWith('xterm.js') || currentFolderName === 'xterm.js') { + log(`Current folder is "${currentFolderName}", skipping xterm.js sibling lookup.`); + return undefined; + } + const siblingFolder = resolve(dirname(repoRoot), 'xterm.js'); + log(`Current folder is "${currentFolderName}", sibling main folder candidate: ${siblingFolder}`); + return siblingFolder; +} + +function detectWorktreeMainFolder() { + const gitPath = resolve(repoRoot, '.git'); + if (!existsSync(gitPath)) { + log('No .git entry found at repo root.'); + return undefined; + } + const gitStat = lstatSync(gitPath); + if (!gitStat.isFile()) { + log('.git is not a file, this repo does not appear to be a worktree checkout.'); + return undefined; + } + const gitFileContent = readFileSync(gitPath, 'utf8').trim(); + const gitDirMatch = /^gitdir:\s*(.+)$/m.exec(gitFileContent); + if (!gitDirMatch) { + log('Could not parse gitdir from .git file.'); + return undefined; + } + + const gitDirPath = resolve(repoRoot, gitDirMatch[1].trim()); + log(`Parsed gitdir from .git file: ${gitDirPath}`); + + const normalizedGitDirPath = gitDirPath.replace(/\\/g, '/'); + const worktreeMarker = '/.git/worktrees/'; + const markerIndex = normalizedGitDirPath.indexOf(worktreeMarker); + if (markerIndex === -1) { + log('gitdir path does not contain /.git/worktrees/, skipping worktree main folder lookup.'); + return undefined; + } + + const normalizedMainFolder = normalizedGitDirPath.slice(0, markerIndex); + const mainFolder = sep === '/' ? normalizedMainFolder : normalizedMainFolder.split('/').join(sep); + log(`Worktree main folder candidate: ${mainFolder}`); + return mainFolder; +} + +function resolveSourceFolder() { + /** @type {Candidate[]} */ + const candidates = []; + addCandidate(candidates, detectMainSiblingFolder(), 'xterm.js sibling'); + addCandidate(candidates, detectWorktreeMainFolder(), 'worktree main repo'); + + for (const candidate of candidates) { + const candidateNodeModulesPath = resolve(candidate.folder, 'node_modules'); + if (existsSync(candidateNodeModulesPath)) { + log(`Using candidate (${candidate.reason}) with node_modules: ${candidate.folder}`); + return candidate.folder; + } + log(`Candidate skipped (${candidate.reason}), node_modules missing: ${candidateNodeModulesPath}`); + } + + log('No candidate folder with node_modules was found.'); + return undefined; +} + +if (!existsSync(nodeModulesPath)) { + log(`node_modules missing: ${nodeModulesPath}`); + const sourceFolder = resolveSourceFolder(); + if (sourceFolder) { + const sourceNodeModulesPath = resolve(sourceFolder, 'node_modules'); + log(`Copying node_modules from ${sourceNodeModulesPath} to ${nodeModulesPath}`); + try { + cpSync(sourceNodeModulesPath, nodeModulesPath, { recursive: true }); + log('node_modules copy completed.'); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + log(`node_modules copy failed: ${message}`); + log('Falling back to npm ci.'); + runNpm(['ci']); + } + } else { + log('No source folder available, running npm ci.'); + runNpm(['ci']); + } +} else { + log(`node_modules already exists: ${nodeModulesPath}`); +} + +runNpm(['run', 'setup']); diff --git a/package.json b/package.json index 8c0f44628..267477a1c 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,8 @@ "prepackage-headless": "npm run esbuild-package-headless-only", "package-headless": "webpack --config ./webpack.config.headless.js", "postpackage-headless": "node ./bin/package_headless.js", - "prepublishOnly": "npm run package" + "prepublishOnly": "npm run package", + "agent:session-start": "node bin/agent/setup-repo.mjs" }, "devDependencies": { "@lunapaint/png-codec": "^0.2.0", From fbf1f7bc5d48e1c092182ed6eea7dee3e30278ec Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 13 Feb 2026 08:25:59 -0800 Subject: [PATCH 074/124] Fix hook npm script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 267477a1c..151566544 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "package-headless": "webpack --config ./webpack.config.headless.js", "postpackage-headless": "node ./bin/package_headless.js", "prepublishOnly": "npm run package", - "agent:session-start": "node bin/agent/setup-repo.mjs" + "agent:setup-repo": "node bin/agent/setup-repo.mjs" }, "devDependencies": { "@lunapaint/png-codec": "^0.2.0", From 27b01b22ef7976a2026589852bf310636a57612e Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sat, 14 Feb 2026 15:17:29 -0800 Subject: [PATCH 075/124] Extract KittyImageStorage, prevent mem leak on eviction --- addons/addon-image/src/ImageAddon.ts | 6 +- addons/addon-image/src/ImageStorage.ts | 5 +- .../src/kitty/KittyGraphicsHandler.ts | 69 +++------ .../src/kitty/KittyImageStorage.ts | 131 ++++++++++++++++++ addons/addon-image/test/KittyGraphics.test.ts | 91 +++++++++++- 5 files changed, 253 insertions(+), 49 deletions(-) create mode 100644 addons/addon-image/src/kitty/KittyImageStorage.ts diff --git a/addons/addon-image/src/ImageAddon.ts b/addons/addon-image/src/ImageAddon.ts index 93768b5cf..fb3368f40 100644 --- a/addons/addon-image/src/ImageAddon.ts +++ b/addons/addon-image/src/ImageAddon.ts @@ -9,6 +9,7 @@ import { IIPHandler } from './IIPHandler'; import { ImageRenderer } from './ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; import { KittyGraphicsHandler } from './kitty/KittyGraphicsHandler'; +import { KittyImageStorage } from './kitty/KittyImageStorage'; import { SixelHandler } from './SixelHandler'; import { SixelImageStorage } from './SixelImageStorage'; import { IIPImageStorage } from './IIPImageStorage'; @@ -154,9 +155,12 @@ export class ImageAddon implements ITerminalAddon, IImageApi { // Kitty graphics handler if (this._opts.kittySupport) { - const kittyHandler = new KittyGraphicsHandler(this._opts, this._renderer!, this._storage!, terminal); + const kittyStorage = new KittyImageStorage(this._storage!); + const kittyHandler = new KittyGraphicsHandler(this._opts, this._renderer!, kittyStorage, terminal); this._handlers.set('kitty', kittyHandler); this._disposeLater( + kittyStorage, + kittyHandler, terminal._core._inputHandler._parser.registerApcHandler(0x47, kittyHandler) ); } diff --git a/addons/addon-image/src/ImageStorage.ts b/addons/addon-image/src/ImageStorage.ts index 6b57b3ce3..2ad1c6993 100644 --- a/addons/addon-image/src/ImageStorage.ts +++ b/addons/addon-image/src/ImageStorage.ts @@ -124,6 +124,7 @@ export class ImageStorage implements IDisposable { private _pixelLimit: number = 2500000; private _viewportMetrics: { cols: number, rows: number }; + public onImageDeleted: ((storageId: number) => void) | undefined; constructor( private _terminal: ITerminalExt, @@ -189,11 +190,13 @@ export class ImageStorage implements IDisposable { private _delImg(id: number): void { const spec = this._images.get(id); + if (!spec) return; this._images.delete(id); // FIXME: really ugly workaround to get bitmaps deallocated :( - if (spec && window.ImageBitmap && spec.orig instanceof ImageBitmap) { + if (window.ImageBitmap && spec.orig instanceof ImageBitmap) { spec.orig.close(); } + this.onImageDeleted?.(id); } /** diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 27c98c050..8fc096dc5 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -3,9 +3,11 @@ * @license MIT */ +import { IDisposable } from '@xterm/xterm'; import { IApcHandler, IImageAddonOptions, IResetHandler, ITerminalExt, ImageLayer } from '../Types'; import { ImageRenderer } from '../ImageRenderer'; -import { ImageStorage, CELL_SIZE_DEFAULT } from '../ImageStorage'; +import { CELL_SIZE_DEFAULT } from '../ImageStorage'; +import { KittyImageStorage } from './KittyImageStorage'; import Base64Decoder, { type DecodeStatus } from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; import { KittyAction, @@ -36,7 +38,7 @@ const SEMICOLON = 0x3B; /** * Kitty graphics protocol handler with streaming base64 decoding. */ -export class KittyGraphicsHandler implements IApcHandler, IResetHandler { +export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDisposable { private _aborted = false; private _decodeError = false; @@ -69,21 +71,11 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { * When a chunk arrives with no i=, this key is used to find the pending upload. */ private _lastPendingKey: number | undefined; - private _nextImageId = 1; - /** Maps Kitty protocol image ID → ImageStorage internal ID for deletion/lookup. */ - private _kittyIdToStorageId: Map = new Map(); - // TODO: Eliminate double storage — raw image data lives here (as Blob) AND rendered - // ImageBitmaps live in ImageStorage. Currently we only use ImageStorage.addImage(bitmap) - // for tiling + cursor movement + marker-based eviction. - // - - // See: https://github.com/xtermjs/xterm.js/pull/5619#issuecomment-3853678815 - private _images: Map = new Map(); constructor( private readonly _opts: IImageAddonOptions, private readonly _renderer: ImageRenderer, - private readonly _storage: ImageStorage, + private readonly _kittyStorage: KittyImageStorage, private readonly _coreTerminal: ITerminalExt ) { // Convert decoded size limit -> max encoded bytes. @@ -102,8 +94,11 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._activeDecoder.release(); this._activeDecoder = null; } - this._images.clear(); - this._kittyIdToStorageId.clear(); + this._kittyStorage.reset(); + } + + public dispose(): void { + this.reset(); } public start(): void { @@ -397,16 +392,13 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { if (decodeError || bytes.length === 0) return true; - const id = cmd.id ?? this._nextImageId++; - const image: IKittyImageData = { - id, + this._kittyStorage.storeImage(cmd.id, { data: new Blob([bytes as BlobPart]), width: cmd.width ?? 0, height: cmd.height ?? 0, format: (cmd.format ?? KittyFormat.RGBA) as 24 | 32 | 100, compression: cmd.compression ?? '' - }; - this._images.set(id, image); + }); return true; } @@ -426,8 +418,8 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { if (this._pendingTransmissions.has(pendingKey)) return true; // Display the completed image - const id = cmd.id ?? this._nextImageId - 1; - const image = this._images.get(id); + const id = cmd.id ?? this._kittyStorage.lastImageId; + const image = this._kittyStorage.getImage(id); if (image) { const result = this._displayImage(image, cmd); if (cmd.id !== undefined) { @@ -508,7 +500,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } this._pendingTransmissions.clear(); this._lastPendingKey = undefined; - this._deleteAll(); + this._kittyStorage.deleteAll(); break; case 'i': case 'I': @@ -522,7 +514,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { this._lastPendingKey = undefined; } } - this._deleteById(cmd.id); + this._kittyStorage.deleteById(cmd.id); } break; default: @@ -532,23 +524,6 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { return true; } - private _deleteById(id: number): void { - this._images.delete(id); - const storageId = this._kittyIdToStorageId.get(id); - if (storageId !== undefined) { - this._storage.deleteImage(storageId); - this._kittyIdToStorageId.delete(id); - } - } - - private _deleteAll(): void { - this._images.clear(); - for (const storageId of this._kittyIdToStorageId.values()) { - this._storage.deleteImage(storageId); - } - this._kittyIdToStorageId.clear(); - } - private _sendResponse(id: number, message: string, quiet: number): void { const isOk = message === 'OK'; if (isOk && quiet === 1) return; @@ -602,14 +577,12 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { const layer: ImageLayer = (wantsBottom && this._coreTerminal.options.allowTransparency) ? 'bottom' : 'top'; const zIndex = cmd.zIndex ?? 0; - let storageId: number; if (w !== bitmap.width || h !== bitmap.height) { const resized = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); - storageId = this._storage.addImage(resized, true, layer, zIndex); + this._kittyStorage.addImage(image.id, resized, true, layer, zIndex); } else { - storageId = this._storage.addImage(bitmap, true, layer, zIndex); + this._kittyStorage.addImage(image.id, bitmap, true, layer, zIndex); } - this._kittyIdToStorageId.set(image.id, storageId); // Kitty cursor movement // Per spec: cursor placed at first column after last image column, @@ -723,7 +696,11 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler { } public get images(): ReadonlyMap { - return this._images; + return this._kittyStorage.images; + } + + public get _kittyIdToStorageId(): ReadonlyMap { + return this._kittyStorage.kittyIdToStorageId; } public get pendingTransmissions(): ReadonlyMap { diff --git a/addons/addon-image/src/kitty/KittyImageStorage.ts b/addons/addon-image/src/kitty/KittyImageStorage.ts new file mode 100644 index 000000000..849ccb8e4 --- /dev/null +++ b/addons/addon-image/src/kitty/KittyImageStorage.ts @@ -0,0 +1,131 @@ +/** + * Copyright (c) 2026 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { IDisposable } from '@xterm/xterm'; +import { ImageStorage } from '../ImageStorage'; +import { ImageLayer } from '../Types'; +import { IKittyImageData } from './KittyGraphicsTypes'; + +/** + * Kitty-specific image storage controller. + * + * Wraps shared ImageStorage with kitty protocol semantics: + * - tracks transmitted image payloads by kitty image id + * - tracks kitty image id -> shared ImageStorage id mapping for displayed images + * - mirrors shared-storage evictions into kitty maps + * - applies protocol-level undisplayed-image eviction policy + */ +export class KittyImageStorage implements IDisposable { + private static readonly _maxStoredImages = 256; + + private _nextImageId = 1; + private readonly _images: Map = new Map(); + private readonly _kittyIdToStorageId: Map = new Map(); + + private readonly _previousOnImageDeleted: ((storageId: number) => void) | undefined; + private readonly _wrappedOnImageDeleted: (storageId: number) => void; + private readonly _handleStorageImageDeleted = (storageId: number): void => { + for (const [kittyId, mappedStorageId] of this._kittyIdToStorageId) { + if (mappedStorageId === storageId) { + this._kittyIdToStorageId.delete(kittyId); + this._images.delete(kittyId); + break; + } + } + }; + + constructor( + private readonly _storage: ImageStorage + ) { + this._previousOnImageDeleted = this._storage.onImageDeleted; + this._wrappedOnImageDeleted = (storageId: number) => { + this._previousOnImageDeleted?.(storageId); + this._handleStorageImageDeleted(storageId); + }; + this._storage.onImageDeleted = this._wrappedOnImageDeleted; + } + + public reset(): void { + this._nextImageId = 1; + this._images.clear(); + this._kittyIdToStorageId.clear(); + } + + public dispose(): void { + this.reset(); + if (this._storage.onImageDeleted === this._wrappedOnImageDeleted) { + this._storage.onImageDeleted = this._previousOnImageDeleted; + } + } + + public storeImage(id: number | undefined, imageData: Omit): number { + const imageId = id ?? this._nextImageId++; + + const oldStorageId = this._kittyIdToStorageId.get(imageId); + if (oldStorageId !== undefined) { + this._storage.deleteImage(oldStorageId); + this._kittyIdToStorageId.delete(imageId); + } + + if (!this._images.has(imageId) && this._images.size >= KittyImageStorage._maxStoredImages) { + this._evictUndisplayedImages(); + } + + this._images.set(imageId, { + ...imageData, + id: imageId + }); + return imageId; + } + + public addImage(kittyId: number, image: HTMLCanvasElement | ImageBitmap, scrolling: boolean, layer: ImageLayer, zIndex: number): void { + const storageId = this._storage.addImage(image, scrolling, layer, zIndex); + this._kittyIdToStorageId.set(kittyId, storageId); + } + + public getImage(kittyId: number): IKittyImageData | undefined { + return this._images.get(kittyId); + } + + public deleteById(kittyId: number): void { + this._images.delete(kittyId); + const storageId = this._kittyIdToStorageId.get(kittyId); + if (storageId !== undefined) { + this._storage.deleteImage(storageId); + this._kittyIdToStorageId.delete(kittyId); + } + } + + public deleteAll(): void { + this._images.clear(); + for (const storageId of this._kittyIdToStorageId.values()) { + this._storage.deleteImage(storageId); + } + this._kittyIdToStorageId.clear(); + } + + public get images(): ReadonlyMap { + return this._images; + } + + public get kittyIdToStorageId(): ReadonlyMap { + return this._kittyIdToStorageId; + } + + public get lastImageId(): number { + return this._nextImageId - 1; + } + + private _evictUndisplayedImages(): void { + for (const [kittyId] of this._images) { + if (this._images.size <= KittyImageStorage._maxStoredImages / 2) { + break; + } + if (!this._kittyIdToStorageId.has(kittyId)) { + this._images.delete(kittyId); + } + } + } +} \ No newline at end of file diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 07964110f..adccd9dbb 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -5,7 +5,7 @@ import test from '@playwright/test'; import { readFileSync } from 'fs'; -import { ITestContext, createTestContext, openTerminal, timeout } from '../../../test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal, pollFor, timeout } from '../../../test/playwright/TestUtils'; import { deepStrictEqual, ok, strictEqual } from 'assert'; /** @@ -1643,6 +1643,95 @@ test.describe('Kitty Graphics Protocol', () => { }); }); }); + + test.describe('Eviction and memory leak prevention', () => { + test('re-transmit with same i= cleans up old storage entry', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=50;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(50)`), true); + const oldStorageId = await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty')._kittyIdToStorageId.get(50)`); + ok(oldStorageId !== undefined); + + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=50;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(50)`), true); + const newStorageId = await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty')._kittyIdToStorageId.get(50)`); + ok(newStorageId !== undefined); + ok(newStorageId !== oldStorageId); + }); + + test('memory limit eviction cleans Kitty handler maps', async () => { + // Resize terminal to fit 7 non-overlapping 200x100 images without scrolling. + // Each image ≈ 29 cols × 8 rows at default cell size. + await ctx.page.evaluate(` + window.term.reset(); + window.imageAddon?.dispose(); + window.term.resize(80, 48); + window.imageAddon = new ImageAddon({ storageLimit: 0.5 }); + window.term.loadAddon(window.imageAddon); + `); + + // storageLimit 0.5 MB = 125,000 pixels. Each 200x100 image = 20,000 pixels. + // 6 images = 120K pixels (under limit). 7th triggers eviction (140K > 125K). + // Place non-overlapping so tile-count eviction doesn't interfere. + const positions = [[1, 1], [30, 1], [1, 9], [30, 9], [1, 17], [30, 17]]; + for (let n = 0; n < 6; n++) { + const [c, r] = positions[n]; + const id = 60 + n; + await ctx.proxy.write(`\x1b[${r};${c}H\x1b_Ga=T,f=100,i=${id},C=1;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + } + await pollFor(ctx.page, 'window.imageAddon._storage._images.size', 6); + + // 7th image pushes total past 125K pixels — oldest evicted + await ctx.proxy.write(`\x1b[25;1H\x1b_Ga=T,f=100,i=66,C=1;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await pollFor(ctx.page, `window.imageAddon._handlers.get('kitty').images.has(60)`, false); + + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty')._kittyIdToStorageId.has(60)`), false); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(66)`), true); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty')._kittyIdToStorageId.has(66)`), true); + + // Restore terminal size + await ctx.page.evaluate('window.term.resize(80, 24)'); + }); + + test('scrollback eviction cleans Kitty handler maps', async () => { + await ctx.page.evaluate(` + window.term.reset(); + window.imageAddon?.dispose(); + window.imageAddon = new ImageAddon(); + window.term.loadAddon(window.imageAddon); + `); + + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=70;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(70)`), true); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty')._kittyIdToStorageId.has(70)`), true); + + // Scroll past scrollback + viewport to push image's marker off the buffer + await ctx.page.evaluate(() => new Promise(res => { + const term = (window as any).term; + const amount: number = (term.options.scrollback as number) + (term.rows as number) + 10; + term.write('\n'.repeat(amount), res); + })); + + await pollFor(ctx.page, `window.imageAddon._handlers.get('kitty').images.has(70)`, false); + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty')._kittyIdToStorageId.has(70)`), false); + }); + + test('re-transmit with a=t then a=T cleans old storage before display', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,i=80;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + const oldStorageId = await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty')._kittyIdToStorageId.get(80)`); + ok(oldStorageId !== undefined); + + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=80;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.has(${oldStorageId})`), false); + }); + }); }); /** From 21f51564d1713dab5179eaaf15b1d6005152ce83 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sat, 14 Feb 2026 20:55:55 -0800 Subject: [PATCH 076/124] Fix image layer stacking + tile survival across text write --- addons/addon-image/src/ImageRenderer.ts | 5 ++ addons/addon-image/src/ImageStorage.ts | 72 +++++++++++-------- .../src/kitty/KittyGraphicsHandler.ts | 7 +- addons/addon-image/test/KittyGraphics.test.ts | 4 +- 4 files changed, 52 insertions(+), 36 deletions(-) diff --git a/addons/addon-image/src/ImageRenderer.ts b/addons/addon-image/src/ImageRenderer.ts index 8e87e386c..2d10a2699 100644 --- a/addons/addon-image/src/ImageRenderer.ts +++ b/addons/addon-image/src/ImageRenderer.ts @@ -348,6 +348,11 @@ export class ImageRenderer extends Disposable implements IDisposable { screenElement.style.zIndex = '0'; screenElement.insertBefore(canvas, screenElement.firstChild); } else { + // Explicit z-index ensures the image canvas reliably stacks above + // the text layer (DOM renderer rows). z-index: 0 is below the + // selection overlay (z-index: 1). + canvas.style.zIndex = '0'; + screenElement.style.zIndex = '0'; screenElement.appendChild(canvas); } const ctx = canvas.getContext('2d', { alpha: true, desynchronized: true }); diff --git a/addons/addon-image/src/ImageStorage.ts b/addons/addon-image/src/ImageStorage.ts index 2ad1c6993..2809c0fbd 100644 --- a/addons/addon-image/src/ImageStorage.ts +++ b/addons/addon-image/src/ImageStorage.ts @@ -415,46 +415,56 @@ export class ImageStorage implements IDisposable { const placeholderCalls: { col: number, row: number, count: number }[] = []; // walk all cells in viewport and collect tiles found + // Note: We check _extendedAttrs directly (not just HAS_EXTENDED flag) + // because text writes clear the BG flag but leave image tile data intact. + // This lets top-layer images survive text overwrites (kitty C=1 behavior). for (let row = start; row <= end; ++row) { const line = buffer.lines.get(row + buffer.ydisp) as IBufferLineExt; if (!line) return; for (let col = 0; col < cols; ++col) { + let e: IExtendedAttrsImage; if (line.getBg(col) & BgFlags.HAS_EXTENDED) { - let e: IExtendedAttrsImage = line._extendedAttrs[col] ?? EMPTY_ATTRS; - const imageId = e.imageId; - if (imageId === undefined || imageId === -1) { + e = line._extendedAttrs[col] ?? EMPTY_ATTRS; + } else { + const maybeImg = line._extendedAttrs[col] as IExtendedAttrsImage | undefined; + if (!maybeImg || maybeImg.imageId === undefined || maybeImg.imageId === -1) { continue; } - const imgSpec = this._images.get(imageId); - if (e.tileId !== -1) { - const startTile = e.tileId; - const startCol = col; - let count = 1; - /** - * merge tiles to the right into a single draw call, if: - * - not at end of line - * - cell has same image id - * - cell has consecutive tile id - */ - while ( - ++col < cols - && (line.getBg(col) & BgFlags.HAS_EXTENDED) - && (e = line._extendedAttrs[col] ?? EMPTY_ATTRS) - && (e.imageId === imageId) - && (e.tileId === startTile + count) - ) { - count++; + e = maybeImg; + } + const imageId = e.imageId; + if (imageId === undefined || imageId === -1) { + continue; + } + const imgSpec = this._images.get(imageId); + if (e.tileId !== -1) { + const startTile = e.tileId; + const startCol = col; + let count = 1; + /** + * merge tiles to the right into a single draw call, if: + * - not at end of line + * - cell has same image id + * - cell has consecutive tile id + * Also check _extendedAttrs directly for cells where text cleared HAS_EXTENDED. + */ + while (++col < cols) { + const nextE = line._extendedAttrs[col] as IExtendedAttrsImage | undefined; + if (!nextE || nextE.imageId !== imageId || nextE.tileId !== startTile + count) { + break; } - col--; - if (imgSpec) { - if (imgSpec.actual) { - drawCalls.push({ imgSpec, tileId: startTile, col: startCol, row, count }); - } - } else if (this._opts.showPlaceholder) { - placeholderCalls.push({ col: startCol, row, count }); - } - this._fullyCleared = false; + e = nextE; + count++; } + col--; + if (imgSpec) { + if (imgSpec.actual) { + drawCalls.push({ imgSpec, tileId: startTile, col: startCol, row, count }); + } + } else if (this._opts.showPlaceholder) { + placeholderCalls.push({ col: startCol, row, count }); + } + this._fullyCleared = false; } } } diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 8fc096dc5..a6313526c 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -571,10 +571,11 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos const savedYbase = buffer.ybase; // Determine layer based on z-index: negative = behind text, 0+ = on top. - // Bottom layer only works when allowTransparency is enabled (otherwise text - // canvas background is opaque and hides the bottom canvas). Fall back to top. + // When z<0 we always use the bottom layer even without allowTransparency — + // the image will simply be hidden behind the opaque text background, which + // is the correct behavior (client asked for "behind text"). const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0; - const layer: ImageLayer = (wantsBottom && this._coreTerminal.options.allowTransparency) ? 'bottom' : 'top'; + const layer: ImageLayer = wantsBottom ? 'bottom' : 'top'; const zIndex = cmd.zIndex ?? 0; if (w !== bitmap.width || h !== bitmap.height) { diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index adccd9dbb..ced1f52d0 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -1116,12 +1116,12 @@ test.describe('Kitty Graphics Protocol', () => { strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).zIndex`), 1); }); - test('z=-1 falls back to top layer when allowTransparency is disabled', async () => { + test('z=-1 uses bottom layer even when allowTransparency is disabled', async () => { await ctx.page.evaluate(`window.term.options.allowTransparency = false`); await ctx.proxy.write(`\x1b_Ga=T,f=100,z=-1;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); strictEqual(await getImageStorageLength(), 1); - strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'top'); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'bottom'); strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).zIndex`), -1); }); From c30fedff6b3aa333c1db279f10800aa64e66b291 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 15 Feb 2026 18:55:21 -0800 Subject: [PATCH 077/124] Start clean-up --- demo/client/tsconfig.json | 4 +++- package-lock.json | 6 ------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/demo/client/tsconfig.json b/demo/client/tsconfig.json index 86a7b9b69..c1a828977 100644 --- a/demo/client/tsconfig.json +++ b/demo/client/tsconfig.json @@ -19,7 +19,9 @@ "@xterm/addon-web-links": ["../../addons/addon-web-links"], "@xterm/addon-webgl": ["../../addons/addon-webgl"], "@xterm/addon-unicode11": ["../../addons/addon-unicode11"], - "@xterm/addon-unicode-graphemes": ["../../addons/addon-unicode-graphemes"], + "@xterm/addon-unicode-graphemes": [ + "../../addons/addon-unicode-graphemes" + ], "@xterm/addon-ligatures": ["../../addons/addon-ligatures"], "*": ["./*"] } diff --git a/package-lock.json b/package-lock.json index 4928878ee..9c83261b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,12 +83,6 @@ "xterm-wasm-parts": "^0.3.0" } }, - "addons/addon-kitty-graphics": { - "name": "@xterm/addon-kitty-graphics", - "version": "0.1.0", - "extraneous": true, - "license": "MIT" - }, "addons/addon-ligatures": { "name": "@xterm/addon-ligatures", "version": "0.10.0", From ee85a1da9e907159a2247480122bb92f1331bf30 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 15 Feb 2026 19:15:58 -0800 Subject: [PATCH 078/124] Copyright is to 2026 --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 2 +- addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts | 2 +- addons/addon-image/src/kitty/KittyGraphicsTypes.ts | 2 +- addons/addon-image/test/KittyGraphics.test.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index a6313526c..57479a315 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * Copyright (c) 2026 The xterm.js authors. All rights reserved. * @license MIT */ diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts index 31d963f79..4c61eccf7 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.test.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * Copyright (c) 2026 The xterm.js authors. All rights reserved. * @license MIT */ import { assert } from 'chai'; diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index cbba1a81a..aa96b9d05 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2025 The xterm.js authors. All rights reserved. + * Copyright (c) 2026 The xterm.js authors. All rights reserved. * @license MIT * * Kitty graphics protocol types, constants, and parsing utilities. diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index ced1f52d0..12ac202fb 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2020 The xterm.js authors. All rights reserved. + * Copyright (c) 2026 The xterm.js authors. All rights reserved. * @license MIT */ From 5efff43e9371cd767091b70832dc6b7e1adbc02d Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 15 Feb 2026 19:21:27 -0800 Subject: [PATCH 079/124] Convert JSDoc to line comments --- .../src/kitty/KittyGraphicsHandler.ts | 28 ++++------ .../src/kitty/KittyGraphicsTypes.ts | 52 +++++++------------ .../src/kitty/KittyImageStorage.ts | 18 +++---- 3 files changed, 36 insertions(+), 62 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 57479a315..9636c7e94 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -35,9 +35,7 @@ const MAX_CONTROL_DATA_SIZE = 512; // Semicolon codepoint const SEMICOLON = 0x3B; -/** - * Kitty graphics protocol handler with streaming base64 decoding. - */ +// Kitty graphics protocol handler with streaming base64 decoding. export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDisposable { private _aborted = false; private _decodeError = false; @@ -48,28 +46,26 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos // Streaming related states - /** True while receiving control data (before semicolon). */ + // True while receiving control data (before semicolon). private _inControlData = true; - /** Buffer for control data. */ + // Buffer for control data. private _controlData = new Uint32Array(MAX_CONTROL_DATA_SIZE); private _controlLength = 0; - /** Pre-calculated encoded size limit */ + // Pre-calculated encoded size limit private _encodedSizeLimit = 0; private _totalEncodedSize = 0; - /** Parsed command. These are the control data before semicolon. */ + // Parsed command. These are the control data before semicolon. private _parsedCommand: IKittyCommand | null = null; // Storage related states private _pendingTransmissions: Map = new Map(); - /** - * Tracks the pending key of the most recently started chunked upload. - * Per spec, subsequent chunks only need m= (and optionally q=), without i=. - * When a chunk arrives with no i=, this key is used to find the pending upload. - */ + // Tracks the pending key of the most recently started chunked upload. + // Per spec, subsequent chunks only need m= (and optionally q=), without i=. + // When a chunk arrives with no i=, this key is used to find the pending upload. private _lastPendingKey: number | undefined; constructor( @@ -163,9 +159,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos } } - /** - * Stream payload bytes into the base64 decoder. - */ + // Stream payload bytes into the base64 decoder. private _streamPayload(data: Uint32Array, start: number, end: number): void { if (this._aborted) return; @@ -601,9 +595,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos } } - /** - * Create ImageBitmap from already-decoded image data. - */ + // Create ImageBitmap from already-decoded image data. private async _createBitmap(image: IKittyImageData): Promise { let bytes: Uint8Array = new Uint8Array(await image.data.arrayBuffer()); diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index aa96b9d05..c441bbb03 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -7,10 +7,8 @@ import type Base64Decoder from 'xterm-wasm-parts/lib/base64/Base64Decoder.wasm'; -/** - * Kitty graphics protocol action types. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'. - */ +// Kitty graphics protocol action types. +// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'a'. export const enum KittyAction { TRANSMIT = 't', TRANSMIT_DISPLAY = 'T', @@ -19,29 +17,23 @@ export const enum KittyAction { DELETE = 'd' } -/** - * Kitty graphics protocol format types. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference - */ +// Kitty graphics protocol format types. +// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference export const enum KittyFormat { RGB = 24, RGBA = 32, PNG = 100 } -/** - * Kitty graphics protocol compression types. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'. - */ +// Kitty graphics protocol compression types. +// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference under key 'o'. export const enum KittyCompression { NONE = '', ZLIB = 'z' } -/** - * Kitty graphics protocol control data keys. - * See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference - */ +// Kitty graphics protocol control data keys. +// See: https://sw.kovidgoyal.net/kitty/graphics-protocol/#control-data-reference export const enum KittyKey { // Action to perform (t=transmit, T=transmit+display, q=query, p=placement, d=delete) ACTION = 'a', @@ -86,9 +78,7 @@ export const BYTES_PER_PIXEL_RGB = 3; export const BYTES_PER_PIXEL_RGBA = 4; export const ALPHA_OPAQUE = 255; -/** - * Parsed Kitty graphics command. - */ +// Parsed Kitty graphics command. export interface IKittyCommand { action?: string; format?: number; @@ -111,27 +101,23 @@ export interface IKittyCommand { payload?: string; } -/** - * Pending chunked transmission state. - * Stores metadata from the first chunk while accumulating decoded payload data. - */ +// Pending chunked transmission state. +// Stores metadata from the first chunk while accumulating decoded payload data. export interface IPendingTransmission { - /** The parsed command from the first chunk (contains action, format, dimensions, etc.) */ + // The parsed command from the first chunk (contains action, format, dimensions, etc.) cmd: IKittyCommand; - /** Decoder used across chunked payloads */ + // Decoder used across chunked payloads decoder: Base64Decoder; - /** Total encoded (base64) bytes received across all chunks - for size limit enforcement */ + // Total encoded (base64) bytes received across all chunks - for size limit enforcement totalEncodedSize: number; - /** Whether any chunk has failed to decode */ + // Whether any chunk has failed to decode decodeError: boolean; } -/** - * Stored Kitty image data. - */ +// Stored Kitty image data. export interface IKittyImageData { id: number; - /** Decoded image data stored as Blob (off JS heap) to avoid 2GB heap limit */ + // Decoded image data stored as Blob (off JS heap) to avoid 2GB heap limit data: Blob; width: number; height: number; @@ -139,9 +125,7 @@ export interface IKittyImageData { compression?: string; } -/** - * Parses Kitty graphics control data into a command object. - */ +// Parses Kitty graphics control data into a command object. export function parseKittyCommand(data: string): IKittyCommand { const cmd: IKittyCommand = {}; const parts = data.split(','); diff --git a/addons/addon-image/src/kitty/KittyImageStorage.ts b/addons/addon-image/src/kitty/KittyImageStorage.ts index 849ccb8e4..1f63daef8 100644 --- a/addons/addon-image/src/kitty/KittyImageStorage.ts +++ b/addons/addon-image/src/kitty/KittyImageStorage.ts @@ -8,15 +8,13 @@ import { ImageStorage } from '../ImageStorage'; import { ImageLayer } from '../Types'; import { IKittyImageData } from './KittyGraphicsTypes'; -/** - * Kitty-specific image storage controller. - * - * Wraps shared ImageStorage with kitty protocol semantics: - * - tracks transmitted image payloads by kitty image id - * - tracks kitty image id -> shared ImageStorage id mapping for displayed images - * - mirrors shared-storage evictions into kitty maps - * - applies protocol-level undisplayed-image eviction policy - */ +// Kitty-specific image storage controller. +// +// Wraps shared ImageStorage with kitty protocol semantics: +// - tracks transmitted image payloads by kitty image id +// - tracks kitty image id -> shared ImageStorage id mapping for displayed images +// - mirrors shared-storage evictions into kitty maps +// - applies protocol-level undisplayed-image eviction policy export class KittyImageStorage implements IDisposable { private static readonly _maxStoredImages = 256; @@ -128,4 +126,4 @@ export class KittyImageStorage implements IDisposable { } } } -} \ No newline at end of file +} From d5ae437dda10e40146caacb752a10ee3a9eae034 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 15 Feb 2026 20:00:16 -0800 Subject: [PATCH 080/124] fix more mem leak + cleanups --- .../src/kitty/KittyGraphicsHandler.ts | 56 +++++++++---------- .../src/kitty/KittyImageStorage.ts | 17 ++++-- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 9636c7e94..fe97a4588 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -81,11 +81,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos } public reset(): void { - for (const pending of this._pendingTransmissions.values()) { - pending.decoder.release(); - } - this._pendingTransmissions.clear(); - this._lastPendingKey = undefined; + this._cleanupAllPending(); if (this._activeDecoder) { this._activeDecoder.release(); this._activeDecoder = null; @@ -97,6 +93,21 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos this.reset(); } + private _removePendingEntry(key: number): void { + this._pendingTransmissions.delete(key); + if (this._lastPendingKey === key) { + this._lastPendingKey = undefined; + } + } + + private _cleanupAllPending(): void { + for (const pending of this._pendingTransmissions.values()) { + pending.decoder.release(); + } + this._pendingTransmissions.clear(); + this._lastPendingKey = undefined; + } + public start(): void { this._aborted = false; this._decodeError = false; @@ -178,10 +189,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos } this._activeDecoder = null; if (pending) { - this._pendingTransmissions.delete(pendingKey); - if (this._lastPendingKey === pendingKey) { - this._lastPendingKey = undefined; - } + this._removePendingEntry(pendingKey); } this._aborted = true; return; @@ -202,10 +210,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos this._activeDecoder = null; this._decodeError = true; if (pending) { - this._pendingTransmissions.delete(pendingKey); - if (this._lastPendingKey === pendingKey) { - this._lastPendingKey = undefined; - } + this._removePendingEntry(pendingKey); } } } @@ -404,14 +409,8 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos return true; } - const pendingKey = cmd.id ?? 0; - this._handleTransmit(cmd, bytes, decodeError); - // If still accumulating chunks, don't display yet - if (this._pendingTransmissions.has(pendingKey)) return true; - - // Display the completed image const id = cmd.id ?? this._kittyStorage.lastImageId; const image = this._kittyStorage.getImage(id); if (image) { @@ -488,26 +487,17 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos switch (selector) { case 'a': case 'A': - // Delete all — also abort all in-flight uploads - for (const pending of this._pendingTransmissions.values()) { - pending.decoder.release(); - } - this._pendingTransmissions.clear(); - this._lastPendingKey = undefined; + this._cleanupAllPending(); this._kittyStorage.deleteAll(); break; case 'i': case 'I': - // Delete by image ID — only abort the targeted upload if (cmd.id !== undefined) { const pending = this._pendingTransmissions.get(cmd.id); if (pending) { pending.decoder.release(); - this._pendingTransmissions.delete(cmd.id); - if (this._lastPendingKey === cmd.id) { - this._lastPendingKey = undefined; - } } + this._removePendingEntry(cmd.id); this._kittyStorage.deleteById(cmd.id); } break; @@ -574,6 +564,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos const zIndex = cmd.zIndex ?? 0; if (w !== bitmap.width || h !== bitmap.height) { const resized = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); + bitmap.close(); this._kittyStorage.addImage(image.id, resized, true, layer, zIndex); } else { this._kittyStorage.addImage(image.id, bitmap, true, layer, zIndex); @@ -615,7 +606,10 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos canvas.getContext('2d')?.drawImage(img, 0, 0); createImageBitmap(canvas).then(resolve).catch(reject); }); - img.addEventListener('error', reject); + img.addEventListener('error', () => { + URL.revokeObjectURL(url); + reject(new Error('Failed to load image')); + }); img.src = url; }); } diff --git a/addons/addon-image/src/kitty/KittyImageStorage.ts b/addons/addon-image/src/kitty/KittyImageStorage.ts index 1f63daef8..cd6e46dcb 100644 --- a/addons/addon-image/src/kitty/KittyImageStorage.ts +++ b/addons/addon-image/src/kitty/KittyImageStorage.ts @@ -21,16 +21,16 @@ export class KittyImageStorage implements IDisposable { private _nextImageId = 1; private readonly _images: Map = new Map(); private readonly _kittyIdToStorageId: Map = new Map(); + private readonly _storageIdToKittyId: Map = new Map(); private readonly _previousOnImageDeleted: ((storageId: number) => void) | undefined; private readonly _wrappedOnImageDeleted: (storageId: number) => void; private readonly _handleStorageImageDeleted = (storageId: number): void => { - for (const [kittyId, mappedStorageId] of this._kittyIdToStorageId) { - if (mappedStorageId === storageId) { - this._kittyIdToStorageId.delete(kittyId); - this._images.delete(kittyId); - break; - } + const kittyId = this._storageIdToKittyId.get(storageId); + if (kittyId !== undefined) { + this._kittyIdToStorageId.delete(kittyId); + this._storageIdToKittyId.delete(storageId); + this._images.delete(kittyId); } }; @@ -49,6 +49,7 @@ export class KittyImageStorage implements IDisposable { this._nextImageId = 1; this._images.clear(); this._kittyIdToStorageId.clear(); + this._storageIdToKittyId.clear(); } public dispose(): void { @@ -65,6 +66,7 @@ export class KittyImageStorage implements IDisposable { if (oldStorageId !== undefined) { this._storage.deleteImage(oldStorageId); this._kittyIdToStorageId.delete(imageId); + this._storageIdToKittyId.delete(oldStorageId); } if (!this._images.has(imageId) && this._images.size >= KittyImageStorage._maxStoredImages) { @@ -81,6 +83,7 @@ export class KittyImageStorage implements IDisposable { public addImage(kittyId: number, image: HTMLCanvasElement | ImageBitmap, scrolling: boolean, layer: ImageLayer, zIndex: number): void { const storageId = this._storage.addImage(image, scrolling, layer, zIndex); this._kittyIdToStorageId.set(kittyId, storageId); + this._storageIdToKittyId.set(storageId, kittyId); } public getImage(kittyId: number): IKittyImageData | undefined { @@ -93,6 +96,7 @@ export class KittyImageStorage implements IDisposable { if (storageId !== undefined) { this._storage.deleteImage(storageId); this._kittyIdToStorageId.delete(kittyId); + this._storageIdToKittyId.delete(storageId); } } @@ -102,6 +106,7 @@ export class KittyImageStorage implements IDisposable { this._storage.deleteImage(storageId); } this._kittyIdToStorageId.clear(); + this._storageIdToKittyId.clear(); } public get images(): ReadonlyMap { From 24e2eb9d7b015b5ffbbe7f4a121632cd69a27d72 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 15 Feb 2026 22:15:43 -0800 Subject: [PATCH 081/124] Use uint32 bit-shifting for rgb->rgba interleaving --- .../src/kitty/KittyGraphicsHandler.ts | 41 ++++++++-- addons/addon-image/test/KittyGraphics.test.ts | 75 +++++++++++++++++++ 2 files changed, 108 insertions(+), 8 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index fe97a4588..0daab3cd7 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -632,18 +632,43 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos } const pixelCount = width * height; + + if (image.format === KittyFormat.RGBA) { + // RGBA: use bytes directly — no copy needed + return createImageBitmap(new ImageData(new Uint8ClampedArray(bytes.buffer as ArrayBuffer, bytes.byteOffset, pixelCount * BYTES_PER_PIXEL_RGBA), width, height)); + } + + // RGB→RGBA: interleave alpha using uint32 block processing (4 pixels per iteration). + // 3 uint32 reads + 4 uint32 writes per 4 pixels vs 28 byte reads/writes — ~6x faster. + // Assumes little-endian (all modern browsers/Node.js). const data = new Uint8ClampedArray(pixelCount * BYTES_PER_PIXEL_RGBA); - const isRgba = image.format === KittyFormat.RGBA; + const src32 = new Uint32Array(bytes.buffer, bytes.byteOffset, Math.floor(bytes.byteLength / 4)); + const dst32 = new Uint32Array(data.buffer); + const alignedPixels = pixelCount & ~3; // round down to multiple of 4 let srcOffset = 0; let dstOffset = 0; - for (let i = 0; i < pixelCount; i++) { - data[dstOffset] = bytes[srcOffset]; - data[dstOffset + 1] = bytes[srcOffset + 1]; - data[dstOffset + 2] = bytes[srcOffset + 2]; - data[dstOffset + 3] = isRgba ? bytes[srcOffset + 3] : ALPHA_OPAQUE; - srcOffset += bytesPerPixel; - dstOffset += BYTES_PER_PIXEL_RGBA; + for (let i = 0; i < alignedPixels; i += 4) { + const b0 = src32[srcOffset++]; + const b1 = src32[srcOffset++]; + const b2 = src32[srcOffset++]; + // Little-endian: pixel bytes are [R,G,B] → uint32 ABGR layout + dst32[dstOffset++] = (b0 & 0x00FFFFFF) | 0xFF000000; + dst32[dstOffset++] = ((b0 >>> 24) | (b1 << 8)) & 0x00FFFFFF | 0xFF000000; + dst32[dstOffset++] = ((b1 >>> 16) | (b2 << 16)) & 0x00FFFFFF | 0xFF000000; + dst32[dstOffset++] = (b2 >>> 8) | 0xFF000000; + } + + // Handle remaining 1–3 pixels + let srcByte = alignedPixels * BYTES_PER_PIXEL_RGB; + let dstByte = alignedPixels * BYTES_PER_PIXEL_RGBA; + for (let i = alignedPixels; i < pixelCount; i++) { + data[dstByte] = bytes[srcByte]; + data[dstByte + 1] = bytes[srcByte + 1]; + data[dstByte + 2] = bytes[srcByte + 2]; + data[dstByte + 3] = ALPHA_OPAQUE; + srcByte += BYTES_PER_PIXEL_RGB; + dstByte += BYTES_PER_PIXEL_RGBA; } return createImageBitmap(new ImageData(data, width, height)); diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 12ac202fb..2b638a0dc 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -57,6 +57,19 @@ const RAW_RGB_2X2 = Buffer.from([ 255, 0, 0, 0, 255, 0, 0, 0, 255, 255, 255, 0 ]).toString('base64'); +// 5 pixels (1 uint32 block + 1 remainder) — tests block+tail boundary +const RAW_RGB_5X1 = Buffer.from([ + 255, 0, 0, + 0, 255, 0, + 0, 0, 255, + 255, 255, 0, + 255, 0, 255 +]).toString('base64'); +// 8 pixels (2 full uint32 blocks, 0 remainder) — tests multi-block path +const RAW_RGB_4X2 = Buffer.from([ + 255, 0, 0, 0, 255, 0, 0, 0, 255, 255, 255, 0, + 255, 0, 255, 0, 255, 255, 128, 128, 128, 255, 255, 255 +]).toString('base64'); // Raw RGBA pixel data (f=32): 4 bytes per pixel, no header — requires s= and v= const RAW_RGBA_1X1_WHITE = Buffer.from([255, 255, 255, 255]).toString('base64'); @@ -71,6 +84,14 @@ const RAW_RGBA_2X2 = Buffer.from([ 255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255, 255, 255, 0, 255 ]).toString('base64'); +// 5 pixels — tests RGBA zero-copy with non-power-of-2 count +const RAW_RGBA_5X1 = Buffer.from([ + 255, 0, 0, 255, + 0, 255, 0, 255, + 0, 0, 255, 255, + 255, 255, 0, 255, + 255, 0, 255, 255 +]).toString('base64'); let ctx: ITestContext; test.beforeAll(async ({ browser }) => { @@ -1449,6 +1470,29 @@ test.describe('Kitty Graphics Protocol', () => { deepStrictEqual(await getPixel(0, 0, 0, 1), [0, 0, 255, 255]); deepStrictEqual(await getPixel(0, 0, 1, 1), [255, 255, 0, 255]); }); + + test('renders 5x1 row with block+remainder pixel layout', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=5,v=1;${RAW_RGB_5X1}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 1, 0), [0, 255, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 2, 0), [0, 0, 255, 255]); + deepStrictEqual(await getPixel(0, 0, 3, 0), [255, 255, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 4, 0), [255, 0, 255, 255]); + }); + + test('renders 4x2 grid with multi-block pixel layout', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=4,v=2;${RAW_RGB_4X2}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 1, 0), [0, 255, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 2, 0), [0, 0, 255, 255]); + deepStrictEqual(await getPixel(0, 0, 3, 0), [255, 255, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 0, 1), [255, 0, 255, 255]); + deepStrictEqual(await getPixel(0, 0, 1, 1), [0, 255, 255, 255]); + deepStrictEqual(await getPixel(0, 0, 2, 1), [128, 128, 128, 255]); + deepStrictEqual(await getPixel(0, 0, 3, 1), [255, 255, 255, 255]); + }); }); test.describe('Storage and dimensions', () => { @@ -1465,6 +1509,20 @@ test.describe('Kitty Graphics Protocol', () => { strictEqual(await getImageStorageLength(), 1); deepStrictEqual(await getOrigSize(1), [2, 2]); }); + + test('stores image with correct original dimensions (5x1)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=5,v=1;${RAW_RGB_5X1}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [5, 1]); + }); + + test('stores image with correct original dimensions (4x2)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=24,s=4,v=2;${RAW_RGB_4X2}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [4, 2]); + }); }); test.describe('Validation', () => { @@ -1566,6 +1624,16 @@ test.describe('Kitty Graphics Protocol', () => { deepStrictEqual(await getPixel(0, 0, 0, 1), [0, 0, 255, 255]); deepStrictEqual(await getPixel(0, 0, 1, 1), [255, 255, 0, 255]); }); + + test('renders 5x1 row with zero-copy pixel layout', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=5,v=1;${RAW_RGBA_5X1}\x1b\\`); + await timeout(100); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 1, 0), [0, 255, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 2, 0), [0, 0, 255, 255]); + deepStrictEqual(await getPixel(0, 0, 3, 0), [255, 255, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 4, 0), [255, 0, 255, 255]); + }); }); test.describe('Storage and dimensions', () => { @@ -1582,6 +1650,13 @@ test.describe('Kitty Graphics Protocol', () => { strictEqual(await getImageStorageLength(), 1); deepStrictEqual(await getOrigSize(1), [2, 2]); }); + + test('stores image with correct original dimensions (5x1)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=32,s=5,v=1;${RAW_RGBA_5X1}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [5, 1]); + }); }); test.describe('Validation', () => { From 209e5aa6b91a3c072a161c7cfb4e1c2ff832a64a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 16 Feb 2026 07:56:50 -0800 Subject: [PATCH 082/124] Revert formatting to demo/client/tsconfig.json --- demo/client/tsconfig.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/demo/client/tsconfig.json b/demo/client/tsconfig.json index c1a828977..244f19c6e 100644 --- a/demo/client/tsconfig.json +++ b/demo/client/tsconfig.json @@ -19,12 +19,13 @@ "@xterm/addon-web-links": ["../../addons/addon-web-links"], "@xterm/addon-webgl": ["../../addons/addon-webgl"], "@xterm/addon-unicode11": ["../../addons/addon-unicode11"], - "@xterm/addon-unicode-graphemes": [ - "../../addons/addon-unicode-graphemes" - ], + "@xterm/addon-unicode-graphemes": ["../../addons/addon-unicode-graphemes"], "@xterm/addon-ligatures": ["../../addons/addon-ligatures"], "*": ["./*"] } }, - "include": ["./**/*", "../../typings/xterm.d.ts"] + "include": [ + "./**/*", + "../../typings/xterm.d.ts" + ] } From 6b756318f0e008486f3a42bee84e9591519bcd2e Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 17 Feb 2026 08:31:53 -0800 Subject: [PATCH 083/124] Dont useDefineForClassField after tsgo migration --- src/tsconfig-base.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tsconfig-base.json b/src/tsconfig-base.json index 5ea04ea27..e29f3b255 100644 --- a/src/tsconfig-base.json +++ b/src/tsconfig-base.json @@ -9,6 +9,7 @@ "pretty": true, "incremental": true, - "experimentalDecorators": true + "experimentalDecorators": true, + "useDefineForClassFields": false } } From 898c0d91c3eba4f7ce5d53eab4fc6163a961d4e4 Mon Sep 17 00:00:00 2001 From: Eli Edds Date: Tue, 17 Feb 2026 12:19:40 -0500 Subject: [PATCH 084/124] feat: sanitize user text when in bracketed paste mode --- src/browser/Clipboard.test.ts | 10 ++++++++++ src/browser/Clipboard.ts | 9 ++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/browser/Clipboard.test.ts b/src/browser/Clipboard.test.ts index aa7bdabdd..2028504ec 100644 --- a/src/browser/Clipboard.test.ts +++ b/src/browser/Clipboard.test.ts @@ -29,4 +29,14 @@ describe('evaluatePastedTextProcessing', () => { assert.equal(unbracketedText, 'foo bar'); assert.equal(bracketedText, '\x1b[200~foo bar\x1b[201~'); }); + + it('should escape embedded escape sequences in pasted text only when bracketed', () => { + const ESC_SYMBOL = '\u241b'; + const pastedText = '\x1b[201~foo\x1b[200~bar'; + const unbracketedText = Clipboard.bracketTextForPaste(pastedText, false); + const bracketedText = Clipboard.bracketTextForPaste(pastedText, true); + + assert.equal(unbracketedText, pastedText, 'non bracketed paste should remain unchanged'); + assert.equal(bracketedText, `\x1b[200~${ESC_SYMBOL}[201~foo${ESC_SYMBOL}[200~bar\x1b[201~`); + }); }); diff --git a/src/browser/Clipboard.ts b/src/browser/Clipboard.ts index ec85b5836..aaf8a48e4 100644 --- a/src/browser/Clipboard.ts +++ b/src/browser/Clipboard.ts @@ -19,10 +19,13 @@ export function prepareTextForTerminal(text: string): string { * @param text The pasted text to bracket */ export function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string { - if (bracketedPasteMode) { - return '\x1b[200~' + text + '\x1b[201~'; + if (!bracketedPasteMode) { + return text; } - return text; + // Sanitize pasted text to prevent injected escape sequences (e.g. exiting bracketed paste) + // by replacing ESC (\x1b) with its visible representation U+241B (␛). + const sanitizedText = text.replace(/\x1b/g, '\u241b'); + return `\x1b[200~${sanitizedText}\x1b[201~`; } /** From e3980a27db4a506bce72f6306a371290f35b9fdd Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 17 Feb 2026 09:24:01 -0800 Subject: [PATCH 085/124] Revert useDefineForClassFields, fix screenDpr Constructor --- src/browser/services/CoreBrowserService.ts | 4 +++- src/tsconfig-base.json | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/browser/services/CoreBrowserService.ts b/src/browser/services/CoreBrowserService.ts index 5052de6d2..f9c758c2b 100644 --- a/src/browser/services/CoreBrowserService.ts +++ b/src/browser/services/CoreBrowserService.ts @@ -13,7 +13,7 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic private _isFocused = false; private _cachedIsFocused: boolean | undefined = undefined; - private _screenDprMonitor = this._register(new ScreenDprMonitor(this._window)); + private _screenDprMonitor!: ScreenDprMonitor; private readonly _onDprChange = this._register(new Emitter()); public readonly onDprChange = this._onDprChange.event; @@ -27,6 +27,8 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic ) { super(); + this._screenDprMonitor = this._register(new ScreenDprMonitor(this._window)); + // Monitor device pixel ratio this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w))); this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange)); diff --git a/src/tsconfig-base.json b/src/tsconfig-base.json index e29f3b255..5ea04ea27 100644 --- a/src/tsconfig-base.json +++ b/src/tsconfig-base.json @@ -9,7 +9,6 @@ "pretty": true, "incremental": true, - "experimentalDecorators": true, - "useDefineForClassFields": false + "experimentalDecorators": true } } From 79c94de968ffa6367a97020127664f72e6a76edb Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 17 Feb 2026 09:25:44 -0800 Subject: [PATCH 086/124] try not to use ! --- src/browser/services/CoreBrowserService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/services/CoreBrowserService.ts b/src/browser/services/CoreBrowserService.ts index f9c758c2b..658caaeb1 100644 --- a/src/browser/services/CoreBrowserService.ts +++ b/src/browser/services/CoreBrowserService.ts @@ -13,7 +13,7 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic private _isFocused = false; private _cachedIsFocused: boolean | undefined = undefined; - private _screenDprMonitor!: ScreenDprMonitor; + private _screenDprMonitor: ScreenDprMonitor; private readonly _onDprChange = this._register(new Emitter()); public readonly onDprChange = this._onDprChange.event; From 579a0a530f8b81fa0269858f3a45f07a8c54d754 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 17 Feb 2026 14:47:43 -0800 Subject: [PATCH 087/124] Fix image addon overriding screen element z-index --- addons/addon-image/src/ImageRenderer.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/addons/addon-image/src/ImageRenderer.ts b/addons/addon-image/src/ImageRenderer.ts index 2d10a2699..53a0a9c9b 100644 --- a/addons/addon-image/src/ImageRenderer.ts +++ b/addons/addon-image/src/ImageRenderer.ts @@ -340,19 +340,22 @@ export class ImageRenderer extends Disposable implements IDisposable { ); canvas.classList.add(`xterm-image-layer-${layer}`); const screenElement = this._terminal._core.screenElement; + // Use isolation to create a stacking context without overriding z-index, + // which would conflict with integrators (e.g. VS Code) that set their + // own z-index on the screen element. + screenElement.style.isolation = 'isolate'; if (layer === 'bottom') { // Use z-index:-1 so it paints behind non-positioned text elements. - // The screen element needs to be a stacking context to contain the - // negative z-index, otherwise it would go behind the entire terminal. + // The screen element needs to be a stacking context (via isolation) + // to contain the negative z-index, otherwise it would go behind the + // entire terminal. canvas.style.zIndex = '-1'; - screenElement.style.zIndex = '0'; screenElement.insertBefore(canvas, screenElement.firstChild); } else { // Explicit z-index ensures the image canvas reliably stacks above // the text layer (DOM renderer rows). z-index: 0 is below the // selection overlay (z-index: 1). canvas.style.zIndex = '0'; - screenElement.style.zIndex = '0'; screenElement.appendChild(canvas); } const ctx = canvas.getContext('2d', { alpha: true, desynchronized: true }); From 1186d09e05b1e23182dc55b2f48aea63ee698c87 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 18 Feb 2026 14:36:02 -0800 Subject: [PATCH 088/124] add kitty graphics source crop (x/y/w/h) and sub-cell offset (X/Y) --- .../src/kitty/KittyGraphicsHandler.ts | 68 ++++++++++++++++--- .../src/kitty/KittyGraphicsTypes.ts | 16 +++++ addons/addon-image/test/KittyGraphics.test.ts | 35 +++++++++- 3 files changed, 110 insertions(+), 9 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 0daab3cd7..68bc1df0d 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -526,14 +526,35 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos } private async _decodeAndDisplay(image: IKittyImageData, cmd: IKittyCommand): Promise { - const bitmap = await this._createBitmap(image); + let bitmap = await this._createBitmap(image); + + const cropX = Math.max(0, cmd.x ?? 0); + const cropY = Math.max(0, cmd.y ?? 0); + const cropW = cmd.sourceWidth ?? (bitmap.width - cropX); + const cropH = cmd.sourceHeight ?? (bitmap.height - cropY); + + const maxCropW = Math.max(0, bitmap.width - cropX); + const maxCropH = Math.max(0, bitmap.height - cropY); + const finalCropW = Math.max(0, Math.min(cropW, maxCropW)); + const finalCropH = Math.max(0, Math.min(cropH, maxCropH)); + + if (finalCropW === 0 || finalCropH === 0) { + bitmap.close(); + throw new Error('invalid source rectangle'); + } + + if (cropX !== 0 || cropY !== 0 || finalCropW !== bitmap.width || finalCropH !== bitmap.height) { + const cropped = await createImageBitmap(bitmap, cropX, cropY, finalCropW, finalCropH); + bitmap.close(); + bitmap = cropped; + } const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width; const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height; // Per spec: c/r default to image's natural cell dimensions - const imgCols = cmd.columns ?? Math.ceil(bitmap.width / cw); - const imgRows = cmd.rows ?? Math.ceil(bitmap.height / ch); + let imgCols = cmd.columns ?? Math.ceil(bitmap.width / cw); + let imgRows = cmd.rows ?? Math.ceil(bitmap.height / ch); let w = bitmap.width; let h = bitmap.height; @@ -545,6 +566,7 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos } if (w * h > this._opts.pixelLimit) { + bitmap.close(); throw new Error('image exceeds pixel limit'); } @@ -561,15 +583,45 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0; const layer: ImageLayer = wantsBottom ? 'bottom' : 'top'; - const zIndex = cmd.zIndex ?? 0; + let finalBitmap = bitmap; if (w !== bitmap.width || h !== bitmap.height) { - const resized = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); + finalBitmap = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); bitmap.close(); - this._kittyStorage.addImage(image.id, resized, true, layer, zIndex); - } else { - this._kittyStorage.addImage(image.id, bitmap, true, layer, zIndex); } + // Per spec: X/Y are pixel offsets within the first cell, so clamp to cell dimensions + const xOffset = Math.min(Math.max(0, cmd.xOffset ?? 0), cw - 1); + const yOffset = Math.min(Math.max(0, cmd.yOffset ?? 0), ch - 1); + if (xOffset !== 0 || yOffset !== 0) { + const offsetCanvas = ImageRenderer.createCanvas(window.document, finalBitmap.width + xOffset, finalBitmap.height + yOffset); + const offsetCtx = offsetCanvas.getContext('2d'); + if (!offsetCtx) { + finalBitmap.close(); + throw new Error('Failed to create offset canvas context'); + } + offsetCtx.drawImage(finalBitmap, xOffset, yOffset); + + const offsetBitmap = await createImageBitmap(offsetCanvas); + offsetCanvas.width = offsetCanvas.height = 0; + finalBitmap.close(); + finalBitmap = offsetBitmap; + w = finalBitmap.width; + h = finalBitmap.height; + if (w * h > this._opts.pixelLimit) { + finalBitmap.close(); + throw new Error('image exceeds pixel limit'); + } + if (cmd.columns === undefined) { + imgCols = Math.ceil(finalBitmap.width / cw); + } + if (cmd.rows === undefined) { + imgRows = Math.ceil(finalBitmap.height / ch); + } + } + + const zIndex = cmd.zIndex ?? 0; + this._kittyStorage.addImage(image.id, finalBitmap, true, layer, zIndex); + // Kitty cursor movement // Per spec: cursor placed at first column after last image column, // on the last row of the image. C=1 means don't move cursor. diff --git a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts index c441bbb03..82b2b0a9a 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsTypes.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsTypes.ts @@ -51,6 +51,14 @@ export const enum KittyKey { X_OFFSET = 'x', // The top edge (in pixels) of the image area to display Y_OFFSET = 'y', + // Width (in pixels) of the source rectangle to display + SOURCE_WIDTH = 'w', + // Height (in pixels) of the source rectangle to display + SOURCE_HEIGHT = 'h', + // Horizontal offset (in pixels) within the first cell + X_PLACEMENT_OFFSET = 'X', + // Vertical offset (in pixels) within the first cell + Y_PLACEMENT_OFFSET = 'Y', // Number of terminal columns to display the image over COLUMNS = 'c', // Number of terminal rows to display the image over @@ -88,6 +96,10 @@ export interface IKittyCommand { height?: number; x?: number; y?: number; + sourceWidth?: number; + sourceHeight?: number; + xOffset?: number; + yOffset?: number; columns?: number; rows?: number; more?: number; @@ -163,6 +175,10 @@ export function parseKittyCommand(data: string): IKittyCommand { case KittyKey.HEIGHT: cmd.height = numValue; break; case KittyKey.X_OFFSET: cmd.x = numValue; break; case KittyKey.Y_OFFSET: cmd.y = numValue; break; + case KittyKey.SOURCE_WIDTH: cmd.sourceWidth = numValue; break; + case KittyKey.SOURCE_HEIGHT: cmd.sourceHeight = numValue; break; + case KittyKey.X_PLACEMENT_OFFSET: cmd.xOffset = numValue; break; + case KittyKey.Y_PLACEMENT_OFFSET: cmd.yOffset = numValue; break; case KittyKey.COLUMNS: cmd.columns = numValue; break; case KittyKey.ROWS: cmd.rows = numValue; break; case KittyKey.MORE: cmd.more = numValue; break; diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 2b638a0dc..aa68bf60a 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -102,7 +102,6 @@ test.afterAll(async () => await ctx.page.close()); test.describe('Kitty Graphics Protocol', () => { // TODO: Add tests for larger images with various dimensions - // TODO: Add tests for image placement keys (x, y, w, h, X, Y, c, r) // TODO: Add tests for virtual placement (U=1) // TODO: Add tests for animation frames // TODO: Add performance tests for streaming large images @@ -1398,6 +1397,40 @@ test.describe('Kitty Graphics Protocol', () => { deepStrictEqual(pixels?.slice(4, 8), [255, 0, 0, 255]); // x=19: Red deepStrictEqual(pixels?.slice(8, 12), [255, 128, 0, 255]); // x=20: Orange }); + + test('applies source crop via x/y/w/h before display', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,x=20,y=0,w=20,h=50;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + deepStrictEqual(await getOrigSize(1), [20, 50]); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 128, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 19, 49), [255, 128, 0, 255]); + }); + + test('scales cropped source region to c/r placement rectangle', async () => { + // Firefox's createImageBitmap uses different resize sampling, producing + // slightly off pixel values compared to Chromium, so skip on Firefox. + if (ctx.browser.browserType().name() === 'firefox') { + test.skip(); + } + await ctx.proxy.write(`\x1b_Ga=T,f=100,x=1,y=0,w=1,h=1,c=4,r=2;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(200); + + deepStrictEqual(await getCursor(), [4, 1]); + const left = await getPixel(0, 0, 2, 10); + const right = await getPixel(0, 0, 25, 10); + deepStrictEqual(left, [0, 255, 0, 255]); + deepStrictEqual(right, [0, 255, 0, 255]); + }); + + test('applies sub-cell offset via X/Y within first cell', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,X=5,Y=3;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + deepStrictEqual(await getPixel(0, 0, 0, 0), [0, 0, 0, 0]); + deepStrictEqual(await getPixel(0, 0, 4, 2), [0, 0, 0, 0]); + deepStrictEqual(await getPixel(0, 0, 5, 3), [0, 0, 0, 255]); + }); }); test.describe('Query support', () => { From 30c97a225c45c597e0c63a7b52632856769ae96b Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Wed, 18 Feb 2026 14:41:58 -0800 Subject: [PATCH 089/124] Handle more edge cases --- .../src/kitty/KittyGraphicsHandler.ts | 4 +- addons/addon-image/test/KittyGraphics.test.ts | 49 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 68bc1df0d..a7bd0dd62 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -530,8 +530,8 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos const cropX = Math.max(0, cmd.x ?? 0); const cropY = Math.max(0, cmd.y ?? 0); - const cropW = cmd.sourceWidth ?? (bitmap.width - cropX); - const cropH = cmd.sourceHeight ?? (bitmap.height - cropY); + const cropW = cmd.sourceWidth || (bitmap.width - cropX); + const cropH = cmd.sourceHeight || (bitmap.height - cropY); const maxCropW = Math.max(0, bitmap.width - cropX); const maxCropH = Math.max(0, bitmap.height - cropY); diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index aa68bf60a..562527ca5 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -1431,6 +1431,55 @@ test.describe('Kitty Graphics Protocol', () => { deepStrictEqual(await getPixel(0, 0, 4, 2), [0, 0, 0, 0]); deepStrictEqual(await getPixel(0, 0, 5, 3), [0, 0, 0, 255]); }); + + test('w=0 is treated as unset (displays full width)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,w=0;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + deepStrictEqual(await getOrigSize(1), [200, 100]); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 199, 99), [255, 255, 255, 255]); + }); + + test('h=0 is treated as unset (displays full height)', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,h=0;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + deepStrictEqual(await getOrigSize(1), [200, 100]); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + deepStrictEqual(await getPixel(0, 0, 0, 50), [255, 192, 203, 255]); + }); + + test('x exceeding image width produces no display', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,x=999;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + strictEqual(await getImageStorageLength(), 0); + }); + + test('negative x/y values are clamped to 0', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,x=-10,y=-10;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + deepStrictEqual(await getOrigSize(1), [200, 100]); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 0, 0, 255]); + }); + + test('combined crop and sub-cell offset', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,x=20,y=0,w=20,h=50,X=5,Y=3;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(200); + + deepStrictEqual(await getPixel(0, 0, 0, 0), [0, 0, 0, 0]); + deepStrictEqual(await getPixel(0, 0, 4, 2), [0, 0, 0, 0]); + deepStrictEqual(await getPixel(0, 0, 5, 3), [255, 128, 0, 255]); + }); + + test('sub-cell offset with explicit c/r advances cursor correctly', async () => { + await ctx.proxy.write(`\x1b_Ga=T,f=100,X=5,Y=3,c=4,r=2;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + deepStrictEqual(await getCursor(), [4, 1]); + }); }); test.describe('Query support', () => { From 5c28e2706271904082c7111ede0ad7d331abf62b Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 19 Feb 2026 15:00:33 -0800 Subject: [PATCH 090/124] Implment kitty graphics placement action --- .../src/kitty/KittyGraphicsHandler.ts | 56 +++- .../src/kitty/KittyImageStorage.ts | 8 + addons/addon-image/test/KittyGraphics.test.ts | 290 +++++++++++++++++- 3 files changed, 336 insertions(+), 18 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index a7bd0dd62..60f9b1727 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -323,9 +323,10 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos case KittyAction.QUERY: this._sendResponse(cmd.id ?? 0, 'OK', cmd.quiet ?? 0); return true; + case KittyAction.PLACEMENT: + return this._handlePlacement(cmd); default: // TODO: Implement remaining actions when needed: - // - a=p (placement): place a previously transmitted image // - a=f (frame): animation frame operations // - a=a (animation): animation control // - a=c (compose): compose images @@ -357,9 +358,11 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos return this._handleTransmitDisplay(cmd, bytes, decodeError); case KittyAction.QUERY: return this._handleQuery(cmd, bytes, decodeError); + case KittyAction.PLACEMENT: + // a=p ignores any payload — image data was already transmitted + return this._handlePlacement(cmd); default: // TODO: Implement remaining actions when needed: - // - a=p (placement): place a previously transmitted image // - a=f (frame): animation frame operations // - a=a (animation): animation control // - a=c (compose): compose images @@ -370,6 +373,22 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos } } + private _handlePlacement(cmd: IKittyCommand): boolean | Promise { + if (cmd.id === undefined) { + return true; + } + const image = this._kittyStorage.getImage(cmd.id); + if (!image) { + this._sendResponse(cmd.id, 'ENOENT:image not found', cmd.quiet ?? 0, cmd.placementId); + return true; + } + const result = this._displayImage(image, cmd); + return result.then(success => { + this._sendResponse(cmd.id!, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0, cmd.placementId); + return true; + }); + } + private _handleTransmit(cmd: IKittyCommand, bytes: Uint8Array, decodeError: boolean): boolean { // TODO: Support file-based transmission modes (t=f, t=t, t=s) // Currently only supports direct transmission (t=d, the default). @@ -508,12 +527,13 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos return true; } - private _sendResponse(id: number, message: string, quiet: number): void { + private _sendResponse(id: number, message: string, quiet: number, placementId?: number): void { const isOk = message === 'OK'; if (isOk && quiet === 1) return; if (!isOk && quiet === 2) return; - const response = `\x1b_Gi=${id};${message}\x1b\\`; + const pPart = placementId ? `,p=${placementId}` : ''; + const response = `\x1b_Gi=${id}${pPart};${message}\x1b\\`; this._coreTerminal._core.coreService.triggerDataEvent(response); } @@ -552,9 +572,23 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width; const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height; - // Per spec: c/r default to image's natural cell dimensions - let imgCols = cmd.columns ?? Math.ceil(bitmap.width / cw); - let imgRows = cmd.rows ?? Math.ceil(bitmap.height / ch); + // Per spec: c/r default to image's natural cell dimensions. + // If only one of c/r is specified, compute the other from image aspect ratio. + let imgCols: number; + let imgRows: number; + if (cmd.columns !== undefined && cmd.rows !== undefined) { + imgCols = cmd.columns; + imgRows = cmd.rows; + } else if (cmd.columns !== undefined) { + imgCols = cmd.columns; + imgRows = Math.max(1, Math.ceil((bitmap.height / bitmap.width) * (imgCols * cw) / ch)); + } else if (cmd.rows !== undefined) { + imgRows = cmd.rows; + imgCols = Math.max(1, Math.ceil((bitmap.width / bitmap.height) * (imgRows * ch) / cw)); + } else { + imgCols = Math.ceil(bitmap.width / cw); + imgRows = Math.ceil(bitmap.height / ch); + } let w = bitmap.width; let h = bitmap.height; @@ -593,7 +627,13 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos const xOffset = Math.min(Math.max(0, cmd.xOffset ?? 0), cw - 1); const yOffset = Math.min(Math.max(0, cmd.yOffset ?? 0), ch - 1); if (xOffset !== 0 || yOffset !== 0) { - const offsetCanvas = ImageRenderer.createCanvas(window.document, finalBitmap.width + xOffset, finalBitmap.height + yOffset); + // Per spec: X/Y is not added to c/r area. When c/r are explicit, the + // total placement area remains c*cw × r*ch pixels and the offset image + // is clipped to fit. When c/r are unset, the padded canvas determines + // the natural cell dimensions. + const canvasW = (cmd.columns !== undefined) ? Math.round(imgCols * cw) : finalBitmap.width + xOffset; + const canvasH = (cmd.rows !== undefined) ? Math.round(imgRows * ch) : finalBitmap.height + yOffset; + const offsetCanvas = ImageRenderer.createCanvas(window.document, canvasW, canvasH); const offsetCtx = offsetCanvas.getContext('2d'); if (!offsetCtx) { finalBitmap.close(); diff --git a/addons/addon-image/src/kitty/KittyImageStorage.ts b/addons/addon-image/src/kitty/KittyImageStorage.ts index cd6e46dcb..146d854dd 100644 --- a/addons/addon-image/src/kitty/KittyImageStorage.ts +++ b/addons/addon-image/src/kitty/KittyImageStorage.ts @@ -81,6 +81,14 @@ export class KittyImageStorage implements IDisposable { } public addImage(kittyId: number, image: HTMLCanvasElement | ImageBitmap, scrolling: boolean, layer: ImageLayer, zIndex: number): void { + // Clean up stale reverse-mapping from a previous placement of the same + // kitty image. The old shared-storage entry is kept (it may still be + // visible on screen) but its reverse mapping is removed so that eviction + // of the old entry won't incorrectly delete the kitty image data. + const oldStorageId = this._kittyIdToStorageId.get(kittyId); + if (oldStorageId !== undefined) { + this._storageIdToKittyId.delete(oldStorageId); + } const storageId = this._storage.addImage(image, scrolling, layer, zIndex); this._kittyIdToStorageId.set(kittyId, storageId); this._storageIdToKittyId.set(storageId, kittyId); diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index 562527ca5..b28c3422a 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -975,21 +975,50 @@ test.describe('Kitty Graphics Protocol', () => { }); }); - test.describe('Unimplemented action responses', () => { - test('a=p with id responds EINVAL', async () => { + test.describe('Placement action (a=p)', () => { + test('displays a previously transmitted image at cursor', async () => { + // Transmit image without display + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=210;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + + // Place the previously transmitted image + await ctx.proxy.write(`\x1b_Ga=p,i=210\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getPixel(0, 0, 0, 0), [0, 0, 0, 255]); + }); + + test('responds OK on successful placement', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=211;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + await ctx.page.evaluate(() => { (window as any).kittyResponse = ''; (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); }); - await ctx.proxy.write(`\x1b_Gi=210,a=p\x1b\\`); + await ctx.proxy.write(`\x1b_Ga=p,i=211\x1b\\`); + await timeout(100); + + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=211;OK\x1b\\'); + }); + + test('responds ENOENT for non-existent image id', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Ga=p,i=9999\x1b\\`); await timeout(100); const response: string = await ctx.page.evaluate('window.kittyResponse'); - strictEqual(response.startsWith('\x1b_Gi=210;EINVAL:'), true); + strictEqual(response, '\x1b_Gi=9999;ENOENT:image not found\x1b\\'); }); - test('a=p without id sends no response', async () => { + test('without id sends no response', async () => { await ctx.page.evaluate(() => { (window as any).kittyGotResponse = false; (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); @@ -1000,6 +1029,243 @@ test.describe('Kitty Graphics Protocol', () => { strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); }); + + test('places at specified column/row size (c/r)', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=212;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(100); + + await ctx.proxy.write(`\x1b_Ga=p,i=212,c=5,r=3\x1b\\`); + await timeout(200); + + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getCursor(), [5, 2]); + }); + + test('cursor advances past placed image (default C=0)', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=213;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + deepStrictEqual(await getCursor(), [0, 0]); + + await ctx.proxy.write(`\x1b_Ga=p,i=213\x1b\\`); + await timeout(100); + deepStrictEqual(await getCursor(), [1, 0]); + }); + + test('cursor does not move when C=1', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=214;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(100); + deepStrictEqual(await getCursor(), [0, 0]); + + await ctx.proxy.write(`\x1b_Ga=p,i=214,c=5,r=3,C=1\x1b\\`); + await timeout(200); + deepStrictEqual(await getCursor(), [0, 0]); + }); + + test('supports z-index (negative = bottom layer)', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=215;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + await ctx.proxy.write(`\x1b_Ga=p,i=215,z=-1\x1b\\`); + await timeout(100); + + strictEqual(await getImageStorageLength(), 1); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).layer`), 'bottom'); + strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.get(1).zIndex`), -1); + }); + + test('supports source crop via x/y', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=216;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(100); + + // Crop to the Orange rectangle (x=20, y=0, 20x50) + await ctx.proxy.write(`\x1b_Ga=p,i=216,x=20,y=0,w=20,h=50\x1b\\`); + await timeout(200); + + strictEqual(await getImageStorageLength(), 1); + deepStrictEqual(await getOrigSize(1), [20, 50]); + deepStrictEqual(await getPixel(0, 0, 0, 0), [255, 128, 0, 255]); + }); + + test('supports sub-cell offset via X/Y', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=217;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + await ctx.proxy.write(`\x1b_Ga=p,i=217,X=5,Y=3\x1b\\`); + await timeout(100); + + deepStrictEqual(await getPixel(0, 0, 0, 0), [0, 0, 0, 0]); + deepStrictEqual(await getPixel(0, 0, 4, 2), [0, 0, 0, 0]); + deepStrictEqual(await getPixel(0, 0, 5, 3), [0, 0, 0, 255]); + }); + + test('multiple placements of same image create separate displays', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=218;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 0); + + // First placement + await ctx.proxy.write(`\x1b_Ga=p,i=218,p=1\x1b\\`); + await timeout(100); + strictEqual(await getImageStorageLength(), 1); + + // Move cursor down and place again with different placement ID + await ctx.proxy.write('\x1b[3;1H'); + await ctx.proxy.write(`\x1b_Ga=p,i=218,p=2\x1b\\`); + await timeout(100); + + // Both placements should be in shared storage + strictEqual(await getImageStorageLength(), 2); + }); + + test('image data remains available after placement for future placements', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=219;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + // Place three times + await ctx.proxy.write(`\x1b_Ga=p,i=219\x1b\\`); + await timeout(100); + await ctx.proxy.write('\x1b[2;1H'); + await ctx.proxy.write(`\x1b_Ga=p,i=219\x1b\\`); + await timeout(100); + await ctx.proxy.write('\x1b[3;1H'); + await ctx.proxy.write(`\x1b_Ga=p,i=219\x1b\\`); + await timeout(100); + + // Image data should still be available + strictEqual(await ctx.page.evaluate(`window.imageAddon._handlers.get('kitty').images.has(219)`), true); + }); + + test('OK response suppressed by q=1', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=220;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write(`\x1b_Ga=p,i=220,q=1\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + strictEqual(await getImageStorageLength(), 1); + }); + + test('ENOENT error suppressed by q=2', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyGotResponse = false; + (window as any).term.onData(() => { (window as any).kittyGotResponse = true; }); + }); + + await ctx.proxy.write(`\x1b_Ga=p,i=9998,q=2\x1b\\`); + await timeout(100); + + strictEqual(await ctx.page.evaluate('window.kittyGotResponse'), false); + }); + + test('ENOENT still reported when q=1 (only suppresses OK)', async () => { + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Ga=p,i=9997,q=1\x1b\\`); + await timeout(100); + + const response: string = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=9997;ENOENT:image not found\x1b\\'); + }); + + test('renders pixels correctly when placing a PNG image', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=221;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await timeout(100); + + await ctx.proxy.write(`\x1b_Ga=p,i=221\x1b\\`); + await timeout(100); + + const pixels = await getPixels(0, 0, 0, 0, 3, 1); + deepStrictEqual(pixels?.slice(0, 4), [255, 0, 0, 255]); + deepStrictEqual(pixels?.slice(4, 8), [0, 255, 0, 255]); + deepStrictEqual(pixels?.slice(8, 12), [0, 0, 255, 255]); + }); + + test('renders pixels correctly when placing raw RGB image', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=24,s=3,v=1,i=222;${RAW_RGB_3X1}\x1b\\`); + await timeout(100); + + await ctx.proxy.write(`\x1b_Ga=p,i=222\x1b\\`); + await timeout(100); + + const pixels = await getPixels(0, 0, 0, 0, 3, 1); + deepStrictEqual(pixels?.slice(0, 4), [255, 0, 0, 255]); + deepStrictEqual(pixels?.slice(4, 8), [0, 255, 0, 255]); + deepStrictEqual(pixels?.slice(8, 12), [0, 0, 255, 255]); + }); + + test('renders pixels correctly when placing raw RGBA image', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=32,s=3,v=1,i=223;${RAW_RGBA_3X1}\x1b\\`); + await timeout(100); + + await ctx.proxy.write(`\x1b_Ga=p,i=223\x1b\\`); + await timeout(100); + + const pixels = await getPixels(0, 0, 0, 0, 3, 1); + deepStrictEqual(pixels?.slice(0, 4), [255, 0, 0, 255]); + deepStrictEqual(pixels?.slice(4, 8), [0, 255, 0, 255]); + deepStrictEqual(pixels?.slice(8, 12), [0, 0, 255, 255]); + }); + + test('response includes placement id when p is specified', async () => { + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=224;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await timeout(100); + + await ctx.page.evaluate(() => { + (window as any).kittyResponse = ''; + (window as any).term.onData((data: string) => { (window as any).kittyResponse = data; }); + }); + + await ctx.proxy.write(`\x1b_Ga=p,i=224,p=42\x1b\\`); + await timeout(100); + + const response = await ctx.page.evaluate('window.kittyResponse'); + strictEqual(response, '\x1b_Gi=224,p=42;OK\x1b\\'); + }); + + test('only c specified computes r from aspect ratio', async () => { + // 200x100 image (2:1 aspect) with c=10. + // Per spec: r = ceil((h/w) * c * cw / ch) = ceil(0.5 * 10 * cw / ch) + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=225;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(100); + + await ctx.proxy.write(`\x1b_Ga=p,i=225,c=10\x1b\\`); + await timeout(200); + + const cursor = await getCursor(); + const cellDims: number[] = await ctx.page.evaluate(() => { + const d = (window as any).term._core._renderService.dimensions.css.cell; + return [d.width, d.height]; + }); + const expectedR = Math.ceil((100 / 200) * 10 * cellDims[0] / cellDims[1]); + deepStrictEqual(cursor, [10, expectedR - 1]); + }); + + test('only r specified computes c from aspect ratio', async () => { + // 200x100 image (2:1 aspect) with r=5. + // Per spec: c = ceil((w/h) * r * ch / cw) = ceil(2 * 5 * ch / cw) + await ctx.proxy.write(`\x1b_Ga=t,f=100,i=226;${KITTY_MULTICOLOR_200X100_BASE64}\x1b\\`); + await timeout(100); + + await ctx.proxy.write(`\x1b_Ga=p,i=226,r=5\x1b\\`); + await timeout(200); + + const cursor = await getCursor(); + const cellDims: number[] = await ctx.page.evaluate(() => { + const d = (window as any).term._core._renderService.dimensions.css.cell; + return [d.width, d.height]; + }); + const expectedC = Math.ceil((200 / 100) * 5 * cellDims[1] / cellDims[0]); + deepStrictEqual(cursor, [expectedC, 4]); + }); }); test.describe('Cursor positioning', () => { @@ -1063,20 +1329,24 @@ test.describe('Kitty Graphics Protocol', () => { }); test('cursor should move right by cols when c specified', async () => { - // c=5: image displayed over 5 columns, r auto = ceil(1/cellHeight) = 1 + // c=5, r computed from 1x1 aspect ratio: r = ceil((1/1) * (5*cw) / ch) + // With 1:1 aspect, image height in pixels = 5*cw, so r = ceil(5*cw/ch) await ctx.proxy.write(`\x1b_Ga=T,f=100,c=5;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); - deepStrictEqual(await getCursor(), [5, 0]); + const cursor = await getCursor(); + strictEqual(cursor[0], 5); + // r is computed from aspect ratio, so y > 0 for a square image at c=5 }); test('cursor should move down by rows when r specified', async () => { - // r=3: image displayed over 3 rows, c auto = ceil(1/cellWidth) = 1 + // r=3, c computed from 1x1 aspect ratio: c = ceil((1/1) * (3*ch) / cw) await ctx.proxy.write(`\x1b_Ga=T,f=100,r=3;${KITTY_BLACK_1X1_BASE64}\x1b\\`); await timeout(100); - // Cursor at first column after image (col 1), on last row (row 2) - deepStrictEqual(await getCursor(), [1, 2]); + const cursor = await getCursor(); + strictEqual(cursor[1], 2); + // c is computed from aspect ratio, so x > 1 for a square image at r=3 }); test('cursor should move by cols AND rows when both specified', async () => { From 2158827b25873b2743b59027e47acd4fc18ce959 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 19 Feb 2026 15:51:22 -0800 Subject: [PATCH 091/124] remove non-null assertion, improve lifecycle for bitmap --- .../src/kitty/KittyGraphicsHandler.ts | 251 +++++++++--------- .../src/kitty/KittyImageStorage.ts | 9 + 2 files changed, 138 insertions(+), 122 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 60f9b1727..2e43accb4 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -377,14 +377,15 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos if (cmd.id === undefined) { return true; } - const image = this._kittyStorage.getImage(cmd.id); + const id = cmd.id; + const image = this._kittyStorage.getImage(id); if (!image) { - this._sendResponse(cmd.id, 'ENOENT:image not found', cmd.quiet ?? 0, cmd.placementId); + this._sendResponse(id, 'ENOENT:image not found', cmd.quiet ?? 0, cmd.placementId); return true; } const result = this._displayImage(image, cmd); return result.then(success => { - this._sendResponse(cmd.id!, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0, cmd.placementId); + this._sendResponse(id, success ? 'OK' : 'EINVAL:image rendering failed', cmd.quiet ?? 0, cmd.placementId); return true; }); } @@ -511,6 +512,10 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos break; case 'i': case 'I': + // TODO: When placement id tracking is implemented (see TODO in + // KittyImageStorage), d=i with p= should delete only that + // specific placement, while d=i without p should delete all + // placements for the image. if (cmd.id !== undefined) { const pending = this._pendingTransmissions.get(cmd.id); if (pending) { @@ -546,135 +551,137 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos } private async _decodeAndDisplay(image: IKittyImageData, cmd: IKittyCommand): Promise { - let bitmap = await this._createBitmap(image); + let bitmap: ImageBitmap | undefined = await this._createBitmap(image); - const cropX = Math.max(0, cmd.x ?? 0); - const cropY = Math.max(0, cmd.y ?? 0); - const cropW = cmd.sourceWidth || (bitmap.width - cropX); - const cropH = cmd.sourceHeight || (bitmap.height - cropY); + try { + const cropX = Math.max(0, cmd.x ?? 0); + const cropY = Math.max(0, cmd.y ?? 0); + const cropW = cmd.sourceWidth || (bitmap.width - cropX); + const cropH = cmd.sourceHeight || (bitmap.height - cropY); - const maxCropW = Math.max(0, bitmap.width - cropX); - const maxCropH = Math.max(0, bitmap.height - cropY); - const finalCropW = Math.max(0, Math.min(cropW, maxCropW)); - const finalCropH = Math.max(0, Math.min(cropH, maxCropH)); + const maxCropW = Math.max(0, bitmap.width - cropX); + const maxCropH = Math.max(0, bitmap.height - cropY); + const finalCropW = Math.max(0, Math.min(cropW, maxCropW)); + const finalCropH = Math.max(0, Math.min(cropH, maxCropH)); - if (finalCropW === 0 || finalCropH === 0) { - bitmap.close(); - throw new Error('invalid source rectangle'); - } - - if (cropX !== 0 || cropY !== 0 || finalCropW !== bitmap.width || finalCropH !== bitmap.height) { - const cropped = await createImageBitmap(bitmap, cropX, cropY, finalCropW, finalCropH); - bitmap.close(); - bitmap = cropped; - } - - const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width; - const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height; - - // Per spec: c/r default to image's natural cell dimensions. - // If only one of c/r is specified, compute the other from image aspect ratio. - let imgCols: number; - let imgRows: number; - if (cmd.columns !== undefined && cmd.rows !== undefined) { - imgCols = cmd.columns; - imgRows = cmd.rows; - } else if (cmd.columns !== undefined) { - imgCols = cmd.columns; - imgRows = Math.max(1, Math.ceil((bitmap.height / bitmap.width) * (imgCols * cw) / ch)); - } else if (cmd.rows !== undefined) { - imgRows = cmd.rows; - imgCols = Math.max(1, Math.ceil((bitmap.width / bitmap.height) * (imgRows * ch) / cw)); - } else { - imgCols = Math.ceil(bitmap.width / cw); - imgRows = Math.ceil(bitmap.height / ch); - } - - let w = bitmap.width; - let h = bitmap.height; - - // Scale bitmap to fit placement rectangle when c/r are specified - if (cmd.columns !== undefined || cmd.rows !== undefined) { - w = Math.round(imgCols * cw); - h = Math.round(imgRows * ch); - } - - if (w * h > this._opts.pixelLimit) { - bitmap.close(); - throw new Error('image exceeds pixel limit'); - } - - // Save cursor position before addImage modifies it - const buffer = this._coreTerminal._core.buffer; - const savedX = buffer.x; - const savedY = buffer.y; - const savedYbase = buffer.ybase; - - // Determine layer based on z-index: negative = behind text, 0+ = on top. - // When z<0 we always use the bottom layer even without allowTransparency — - // the image will simply be hidden behind the opaque text background, which - // is the correct behavior (client asked for "behind text"). - const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0; - const layer: ImageLayer = wantsBottom ? 'bottom' : 'top'; - - let finalBitmap = bitmap; - if (w !== bitmap.width || h !== bitmap.height) { - finalBitmap = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); - bitmap.close(); - } - - // Per spec: X/Y are pixel offsets within the first cell, so clamp to cell dimensions - const xOffset = Math.min(Math.max(0, cmd.xOffset ?? 0), cw - 1); - const yOffset = Math.min(Math.max(0, cmd.yOffset ?? 0), ch - 1); - if (xOffset !== 0 || yOffset !== 0) { - // Per spec: X/Y is not added to c/r area. When c/r are explicit, the - // total placement area remains c*cw × r*ch pixels and the offset image - // is clipped to fit. When c/r are unset, the padded canvas determines - // the natural cell dimensions. - const canvasW = (cmd.columns !== undefined) ? Math.round(imgCols * cw) : finalBitmap.width + xOffset; - const canvasH = (cmd.rows !== undefined) ? Math.round(imgRows * ch) : finalBitmap.height + yOffset; - const offsetCanvas = ImageRenderer.createCanvas(window.document, canvasW, canvasH); - const offsetCtx = offsetCanvas.getContext('2d'); - if (!offsetCtx) { - finalBitmap.close(); - throw new Error('Failed to create offset canvas context'); + if (finalCropW === 0 || finalCropH === 0) { + throw new Error('invalid source rectangle'); + } + + if (cropX !== 0 || cropY !== 0 || finalCropW !== bitmap.width || finalCropH !== bitmap.height) { + const cropped = await createImageBitmap(bitmap, cropX, cropY, finalCropW, finalCropH); + bitmap.close(); + bitmap = cropped; + } + + const cw = this._renderer.dimensions?.css.cell.width || CELL_SIZE_DEFAULT.width; + const ch = this._renderer.dimensions?.css.cell.height || CELL_SIZE_DEFAULT.height; + + // Per spec: c/r default to image's natural cell dimensions. + // If only one of c/r is specified, compute the other from image aspect ratio. + let imgCols: number; + let imgRows: number; + if (cmd.columns !== undefined && cmd.rows !== undefined) { + imgCols = cmd.columns; + imgRows = cmd.rows; + } else if (cmd.columns !== undefined) { + imgCols = cmd.columns; + imgRows = Math.max(1, Math.ceil((bitmap.height / bitmap.width) * (imgCols * cw) / ch)); + } else if (cmd.rows !== undefined) { + imgRows = cmd.rows; + imgCols = Math.max(1, Math.ceil((bitmap.width / bitmap.height) * (imgRows * ch) / cw)); + } else { + imgCols = Math.ceil(bitmap.width / cw); + imgRows = Math.ceil(bitmap.height / ch); + } + + let w = bitmap.width; + let h = bitmap.height; + + // Scale bitmap to fit placement rectangle when c/r are specified + if (cmd.columns !== undefined || cmd.rows !== undefined) { + w = Math.round(imgCols * cw); + h = Math.round(imgRows * ch); } - offsetCtx.drawImage(finalBitmap, xOffset, yOffset); - const offsetBitmap = await createImageBitmap(offsetCanvas); - offsetCanvas.width = offsetCanvas.height = 0; - finalBitmap.close(); - finalBitmap = offsetBitmap; - w = finalBitmap.width; - h = finalBitmap.height; if (w * h > this._opts.pixelLimit) { - finalBitmap.close(); throw new Error('image exceeds pixel limit'); } - if (cmd.columns === undefined) { - imgCols = Math.ceil(finalBitmap.width / cw); - } - if (cmd.rows === undefined) { - imgRows = Math.ceil(finalBitmap.height / ch); - } - } - const zIndex = cmd.zIndex ?? 0; - this._kittyStorage.addImage(image.id, finalBitmap, true, layer, zIndex); + // Save cursor position before addImage modifies it + const buffer = this._coreTerminal._core.buffer; + const savedX = buffer.x; + const savedY = buffer.y; + const savedYbase = buffer.ybase; - // Kitty cursor movement - // Per spec: cursor placed at first column after last image column, - // on the last row of the image. C=1 means don't move cursor. - if (cmd.cursorMovement === 1) { - // C=1: restore cursor to position before image was placed - const scrolled = buffer.ybase - savedYbase; - buffer.x = savedX; - // Can't restore cursor to scrollback? - buffer.y = Math.max(savedY - scrolled, 0); - } else { - // Default (C=0): advance cursor horizontally past the image - // addImage already positioned cursor on the last row via lineFeeds - buffer.x = Math.min(savedX + imgCols, this._coreTerminal.cols); + // Determine layer based on z-index: negative = behind text, 0+ = on top. + // When z<0 we always use the bottom layer even without allowTransparency — + // the image will simply be hidden behind the opaque text background, which + // is the correct behavior (client asked for "behind text"). + const wantsBottom = cmd.zIndex !== undefined && cmd.zIndex < 0; + const layer: ImageLayer = wantsBottom ? 'bottom' : 'top'; + + if (w !== bitmap.width || h !== bitmap.height) { + const scaled = await createImageBitmap(bitmap, { resizeWidth: w, resizeHeight: h }); + bitmap.close(); + bitmap = scaled; + } + + // Per spec: X/Y are pixel offsets within the first cell, so clamp to cell dimensions + const xOffset = Math.min(Math.max(0, cmd.xOffset ?? 0), cw - 1); + const yOffset = Math.min(Math.max(0, cmd.yOffset ?? 0), ch - 1); + if (xOffset !== 0 || yOffset !== 0) { + // Per spec: X/Y is not added to c/r area. When c/r are explicit, the + // total placement area remains c*cw × r*ch pixels and the offset image + // is clipped to fit. When c/r are unset, the padded canvas determines + // the natural cell dimensions. + const canvasW = (cmd.columns !== undefined) ? Math.round(imgCols * cw) : bitmap.width + xOffset; + const canvasH = (cmd.rows !== undefined) ? Math.round(imgRows * ch) : bitmap.height + yOffset; + const offsetCanvas = ImageRenderer.createCanvas(window.document, canvasW, canvasH); + const offsetCtx = offsetCanvas.getContext('2d'); + if (!offsetCtx) { + throw new Error('Failed to create offset canvas context'); + } + offsetCtx.drawImage(bitmap, xOffset, yOffset); + + const offsetBitmap = await createImageBitmap(offsetCanvas); + offsetCanvas.width = offsetCanvas.height = 0; + bitmap.close(); + bitmap = offsetBitmap; + w = bitmap.width; + h = bitmap.height; + if (w * h > this._opts.pixelLimit) { + throw new Error('image exceeds pixel limit'); + } + if (cmd.columns === undefined) { + imgCols = Math.ceil(bitmap.width / cw); + } + if (cmd.rows === undefined) { + imgRows = Math.ceil(bitmap.height / ch); + } + } + + const zIndex = cmd.zIndex ?? 0; + this._kittyStorage.addImage(image.id, bitmap, true, layer, zIndex); + bitmap = undefined; // ownership transferred to storage + + // Kitty cursor movement + // Per spec: cursor placed at first column after last image column, + // on the last row of the image. C=1 means don't move cursor. + if (cmd.cursorMovement === 1) { + // C=1: restore cursor to position before image was placed + const scrolled = buffer.ybase - savedYbase; + buffer.x = savedX; + // Can't restore cursor to scrollback? + buffer.y = Math.max(savedY - scrolled, 0); + } else { + // Default (C=0): advance cursor horizontally past the image + // addImage already positioned cursor on the last row via lineFeeds + buffer.x = Math.min(savedX + imgCols, this._coreTerminal.cols); + } + } catch (e) { + bitmap?.close(); + throw e; } } diff --git a/addons/addon-image/src/kitty/KittyImageStorage.ts b/addons/addon-image/src/kitty/KittyImageStorage.ts index 146d854dd..95ea594c7 100644 --- a/addons/addon-image/src/kitty/KittyImageStorage.ts +++ b/addons/addon-image/src/kitty/KittyImageStorage.ts @@ -20,6 +20,15 @@ export class KittyImageStorage implements IDisposable { private _nextImageId = 1; private readonly _images: Map = new Map(); + // TODO: Support multiple placements per image. The kitty spec identifies + // placements by an (image id, placement id) pair — same i + different p + // values should coexist, and same i + same p should replace the prior + // placement. Currently we track only one storage entry per kitty image id, + // so multiple placements of the same image overwrite each other. Fixing + // this requires changing these maps to Map> + // (kittyId → placementId → storageId) and updating addImage/deleteById + // accordingly. The underlying shared ImageStorage would also need to + // support multiple entries per logical image. private readonly _kittyIdToStorageId: Map = new Map(); private readonly _storageIdToKittyId: Map = new Map(); From fe9650ce16ddc1432f71678474e511a9751b46f3 Mon Sep 17 00:00:00 2001 From: amtrend Date: Sun, 22 Feb 2026 17:32:48 +0300 Subject: [PATCH 092/124] docs: add SSH Connection Manager to real-world uses --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d001f1606..fa36e75d8 100644 --- a/README.md +++ b/README.md @@ -229,6 +229,7 @@ Xterm.js is used in many world-class applications to provide great terminal expe - [**ecmaOS**](https://ecmaos.sh): A kernel and suite of applications tying modern web technologies into a browser-based operating system. - [**LabEx**](https://labex.io): Interactive learning platform with hands-on labs and xterm.js-based online terminals, focused on learn-by-doing approach. - [**EmuDevz**](https://afska.github.io/emudevz): A free coding game where players learn how to build an emulator from scratch. +- [**SSH Connection Manager**](https://github.com/Amtrend/ssh-manager): Modern web-based SSH terminal and SFTP manager with AES-256 encryption, PWA support, and session management. - [And much more...](https://github.com/xtermjs/xterm.js/network/dependents?package_id=UGFja2FnZS0xNjYzMjc4OQ%3D%3D) Do you use xterm.js in your application as well? Please [open a Pull Request](https://github.com/sourcelair/xterm.js/pulls) to include it here. We would love to have it on our list. Please add any new contributions to the end of the list. From 114c66c86ca836ccddb65ffb559dbce20711665a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 03:15:03 +0000 Subject: [PATCH 093/124] Bump minimatch from 3.1.2 to 3.1.5 Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.1.2 to 3.1.5. - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.5) --- updated-dependencies: - dependency-name: minimatch dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 65 +++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c83261b2..2df1786d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1108,10 +1108,11 @@ } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1186,10 +1187,11 @@ } }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3869,10 +3871,11 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4558,10 +4561,11 @@ "dev": true }, "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5804,12 +5808,13 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5875,10 +5880,11 @@ } }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6090,10 +6096,11 @@ } }, "node_modules/nyc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6905,10 +6912,11 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7618,10 +7626,11 @@ } }, "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, From a2cb36e6dd26e25478de855920bcd55ad1a76aa4 Mon Sep 17 00:00:00 2001 From: Kain Date: Mon, 2 Mar 2026 04:23:54 +0100 Subject: [PATCH 094/124] Add WooTTY project to README Added WooTTY to the list of projects using xterm.js. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d001f1606..706414050 100644 --- a/README.md +++ b/README.md @@ -229,6 +229,7 @@ Xterm.js is used in many world-class applications to provide great terminal expe - [**ecmaOS**](https://ecmaos.sh): A kernel and suite of applications tying modern web technologies into a browser-based operating system. - [**LabEx**](https://labex.io): Interactive learning platform with hands-on labs and xterm.js-based online terminals, focused on learn-by-doing approach. - [**EmuDevz**](https://afska.github.io/emudevz): A free coding game where players learn how to build an emulator from scratch. +- [**WooTTY**](https://github.com/icoretech/wootty): Flawless browser terminal for real operators. - [And much more...](https://github.com/xtermjs/xterm.js/network/dependents?package_id=UGFja2FnZS0xNjYzMjc4OQ%3D%3D) Do you use xterm.js in your application as well? Please [open a Pull Request](https://github.com/sourcelair/xterm.js/pulls) to include it here. We would love to have it on our list. Please add any new contributions to the end of the list. From d6c872bb2c7c62c343ad795fdba0f494f60c27cd Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 3 Mar 2026 12:19:14 -0800 Subject: [PATCH 095/124] add onImageAdded to api --- addons/addon-image/src/ImageAddon.ts | 5 +++++ addons/addon-image/src/ImageStorage.ts | 2 ++ addons/addon-image/test/ImageAddon.test.ts | 12 ++++++++++++ addons/addon-image/test/KittyGraphics.test.ts | 13 +++++++++++++ addons/addon-image/typings/addon-image.d.ts | 7 ++++++- 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/addons/addon-image/src/ImageAddon.ts b/addons/addon-image/src/ImageAddon.ts index fb3368f40..7af0e519c 100644 --- a/addons/addon-image/src/ImageAddon.ts +++ b/addons/addon-image/src/ImageAddon.ts @@ -5,6 +5,7 @@ import type { ITerminalAddon, IDisposable } from '@xterm/xterm'; import type { ImageAddon as IImageApi } from '@xterm/addon-image'; +import { Emitter, type IEvent } from 'common/Event'; import { IIPHandler } from './IIPHandler'; import { ImageRenderer } from './ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; @@ -62,6 +63,8 @@ export class ImageAddon implements ITerminalAddon, IImageApi { private _disposables: IDisposable[] = []; private _terminal: ITerminalExt | undefined; private _handlers: Map = new Map(); + private readonly _onImageAdded = new Emitter(); + public readonly onImageAdded: IEvent = this._onImageAdded.event; constructor(opts?: Partial) { this._opts = Object.assign({}, DEFAULT_OPTIONS, opts); @@ -74,6 +77,7 @@ export class ImageAddon implements ITerminalAddon, IImageApi { } this._disposables.length = 0; this._handlers.clear(); + this._onImageAdded.dispose(); } private _disposeLater(...args: IDisposable[]): void { @@ -88,6 +92,7 @@ export class ImageAddon implements ITerminalAddon, IImageApi { // internal data structures this._renderer = new ImageRenderer(terminal); this._storage = new ImageStorage(terminal, this._renderer, this._opts); + this._storage.onImageAdded = () => this._onImageAdded.fire(); // enable size reports if (this._opts.enableSizeReports) { diff --git a/addons/addon-image/src/ImageStorage.ts b/addons/addon-image/src/ImageStorage.ts index 2809c0fbd..8c89a16b0 100644 --- a/addons/addon-image/src/ImageStorage.ts +++ b/addons/addon-image/src/ImageStorage.ts @@ -124,6 +124,7 @@ export class ImageStorage implements IDisposable { private _pixelLimit: number = 2500000; private _viewportMetrics: { cols: number, rows: number }; + public onImageAdded: (() => void) | undefined; public onImageDeleted: ((storageId: number) => void) | undefined; constructor( @@ -336,6 +337,7 @@ export class ImageStorage implements IDisposable { // finally add the image this._images.set(imageId, imgSpec); + this.onImageAdded?.(); return imageId; } diff --git a/addons/addon-image/test/ImageAddon.test.ts b/addons/addon-image/test/ImageAddon.test.ts index d6178ff50..67769204f 100644 --- a/addons/addon-image/test/ImageAddon.test.ts +++ b/addons/addon-image/test/ImageAddon.test.ts @@ -196,6 +196,18 @@ test.describe('ImageAddon', () => { }); test.describe('image lifecycle & eviction', () => { + test('onImageAdded fires for each image', async () => { + await ctx.page.evaluate(` + window._imageAddedCount = 0; + window.imageAddon.onImageAdded(() => { window._imageAddedCount++; }); + `); + await ctx.proxy.write(SIXEL_SEQ_0); + await pollFor(ctx.page, 'window._imageAddedCount', 1); + await ctx.proxy.write(SIXEL_SEQ_0); + await pollFor(ctx.page, 'window._imageAddedCount', 2); + await ctx.proxy.write(SIXEL_SEQ_0); + await pollFor(ctx.page, 'window._imageAddedCount', 3); + }); test('delete image once scrolled off', async () => { await ctx.proxy.write(SIXEL_SEQ_0); pollFor(ctx.page, 'window.imageAddon._storage._images.size', 1); diff --git a/addons/addon-image/test/KittyGraphics.test.ts b/addons/addon-image/test/KittyGraphics.test.ts index b28c3422a..315538aa1 100644 --- a/addons/addon-image/test/KittyGraphics.test.ts +++ b/addons/addon-image/test/KittyGraphics.test.ts @@ -2159,6 +2159,19 @@ test.describe('Kitty Graphics Protocol', () => { strictEqual(await ctx.page.evaluate(`window.imageAddon._storage._images.has(${oldStorageId})`), false); }); }); + + test.describe('onImageAdded callback', () => { + test('onImageAdded fires for each kitty image', async () => { + await ctx.page.evaluate(` + window._imageAddedCount = 0; + window.imageAddon.onImageAdded(() => { window._imageAddedCount++; }); + `); + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_BLACK_1X1_BASE64}\x1b\\`); + await pollFor(ctx.page, 'window._imageAddedCount', 1); + await ctx.proxy.write(`\x1b_Ga=T,f=100;${KITTY_RGB_3X1_BASE64}\x1b\\`); + await pollFor(ctx.page, 'window._imageAddedCount', 2); + }); + }); }); /** diff --git a/addons/addon-image/typings/addon-image.d.ts b/addons/addon-image/typings/addon-image.d.ts index 856063e3e..a3fc9e1c8 100644 --- a/addons/addon-image/typings/addon-image.d.ts +++ b/addons/addon-image/typings/addon-image.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon } from '@xterm/xterm'; +import { Terminal, ITerminalAddon, IEvent } from '@xterm/xterm'; declare module '@xterm/addon-image' { export interface IImageAddonOptions { @@ -116,6 +116,11 @@ declare module '@xterm/addon-image' { */ public showPlaceholder: boolean; + /** + * Event fired whenever a new image is added to storage. + */ + public readonly onImageAdded: IEvent; + /** * Get original image canvas at buffer position. */ From f5e81afba76761912e4fa1f28f75c75624226764 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Thu, 5 Mar 2026 16:46:03 -0800 Subject: [PATCH 096/124] Fix ^C not working to end for newer fish + kitty keyboard protocol --- src/common/InputHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/InputHandler.ts b/src/common/InputHandler.ts index 1997d9f11..327eb2ec6 100644 --- a/src/common/InputHandler.ts +++ b/src/common/InputHandler.ts @@ -3570,7 +3570,7 @@ export class InputHandler extends Disposable implements IInputHandler { return true; } const flags = params.params[0] || 0; - const mode = params.params[1] || 1; + const mode = params.length > 1 ? (params.params[1] || 1) : 1; const state = this._coreService.kittyKeyboard; switch (mode) { From 7ec41471da52dae5686f82bfca612bcea6fd2ef2 Mon Sep 17 00:00:00 2001 From: ScottMorse Date: Fri, 6 Mar 2026 00:10:32 -0700 Subject: [PATCH 097/124] Fix deprecated references of xterm-headless to @xterm/headless --- README.md | 2 +- headless/README.md | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d001f1606..d8d3fb144 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ Since xterm.js is typically implemented as a developer tool, generally only mode ### Node.js Support -We also publish [`xterm-headless`](https://www.npmjs.com/package/xterm-headless) which is a stripped down version of xterm.js that runs headless in Node.js. An example use case for this is to keep track of a terminal's state where the process is running and using the [serialize addon](https://www.npmjs.com/package/@xterm/addon-serialize) so it can get all state restored upon reconnection. +We also publish [`@xterm/headless`](https://www.npmjs.com/package/@xterm/headless) which is a stripped down version of xterm.js that runs headless in Node.js. An example use case for this is to keep track of a terminal's state where the process is running and using the [serialize addon](https://www.npmjs.com/package/@xterm/addon-serialize) so it can get all state restored upon reconnection. ## API diff --git a/headless/README.md b/headless/README.md index 205fd79c5..fe98e12fd 100644 --- a/headless/README.md +++ b/headless/README.md @@ -2,17 +2,17 @@ ⚠ This package is experimental -`xterm-headless` is a headless terminal that can be run in node.js. This is useful in combination with the frontend [`xterm`](https://www.npmjs.com/package/xterm) for example to keep track of a terminal's state on a remote server where the process is hosted. +`@xterm/headless` is a headless terminal that can be run in node.js. This is useful in combination with the frontend [`xterm`](https://www.npmjs.com/package/xterm) for example to keep track of a terminal's state on a remote server where the process is hosted. ## Getting Started First, you need to install the module, we ship exclusively through npm, so you need that installed and then add xterm.js as a dependency by running: ```sh -npm install xterm-headless +npm install @xterm/headless ``` -Then import as you would a regular node package. The recommended way to load `xterm-headless` is with TypeScript and the ES6 module syntax: +Then import as you would a regular node package. The recommended way to load `@xterm/headless` is with TypeScript and the ES6 module syntax: ```javascript import { Terminal } from '@xterm/headless'; @@ -20,12 +20,12 @@ import { Terminal } from '@xterm/headless'; ## API -The full API for `xterm-headless` is contained within the [TypeScript declaration file](https://github.com/xtermjs/xterm.js/blob/master/typings/xterm-headless.d.ts), use the branch/tag picker in GitHub (`w`) to navigate to the correct version of the API. +The full API for `@xterm/headless` is contained within the [TypeScript declaration file](https://github.com/xtermjs/xterm.js/blob/master/typings/xterm-headless.d.ts), use the branch/tag picker in GitHub (`w`) to navigate to the correct version of the API. Note that some APIs are marked *experimental*, these are added to enable experimentation with new ideas without committing to support it like a normal [semver](https://semver.org/) API. Note that these APIs can change radically between versions, so be sure to read release notes if you plan on using experimental APIs. ### Addons -Addons in `xterm-headless` work the [same as in `xterm`](https://github.com/xtermjs/xterm.js/blob/master/README.md#addons) with the one caveat being that the addon needs to be packaged for node.js and not use any DOM APIs. +Addons in `@xterm/headless` work the [same as in `xterm`](https://github.com/xtermjs/xterm.js/blob/master/README.md#addons) with the one caveat being that the addon needs to be packaged for node.js and not use any DOM APIs. Currently no official addons are packaged on npm. From f7a353cd341866efb122d825f5cd6edd555e0fd5 Mon Sep 17 00:00:00 2001 From: ScottMorse Date: Fri, 6 Mar 2026 00:14:20 -0700 Subject: [PATCH 098/124] Fix npm link to deprecated xterm package to @xterm/xterm --- headless/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headless/README.md b/headless/README.md index fe98e12fd..cf9169ec9 100644 --- a/headless/README.md +++ b/headless/README.md @@ -2,7 +2,7 @@ ⚠ This package is experimental -`@xterm/headless` is a headless terminal that can be run in node.js. This is useful in combination with the frontend [`xterm`](https://www.npmjs.com/package/xterm) for example to keep track of a terminal's state on a remote server where the process is hosted. +`@xterm/headless` is a headless terminal that can be run in node.js. This is useful in combination with the frontend [`xterm`](https://www.npmjs.com/package/@xterm/xterm) for example to keep track of a terminal's state on a remote server where the process is hosted. ## Getting Started From 163868ff601c0fe5d160ed6518f76d6653aafa14 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sat, 7 Mar 2026 23:32:02 -0800 Subject: [PATCH 099/124] Remove redundant bitmask in RGB->RGBA conversion --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 2e43accb4..7964fe9c1 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -752,9 +752,9 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos const b1 = src32[srcOffset++]; const b2 = src32[srcOffset++]; // Little-endian: pixel bytes are [R,G,B] → uint32 ABGR layout - dst32[dstOffset++] = (b0 & 0x00FFFFFF) | 0xFF000000; - dst32[dstOffset++] = ((b0 >>> 24) | (b1 << 8)) & 0x00FFFFFF | 0xFF000000; - dst32[dstOffset++] = ((b1 >>> 16) | (b2 << 16)) & 0x00FFFFFF | 0xFF000000; + dst32[dstOffset++] = b0 | 0xFF000000; + dst32[dstOffset++] = ((b0 >>> 24) | (b1 << 8)) | 0xFF000000; + dst32[dstOffset++] = ((b1 >>> 16) | (b2 << 16)) | 0xFF000000; dst32[dstOffset++] = (b2 >>> 8) | 0xFF000000; } From 0cea95d3b3f65737115456ead2e05e2c45700c49 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Sun, 8 Mar 2026 20:33:01 -0700 Subject: [PATCH 100/124] Make code more readable --- addons/addon-image/src/kitty/KittyGraphicsHandler.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts index 7964fe9c1..17cd5ed9f 100644 --- a/addons/addon-image/src/kitty/KittyGraphicsHandler.ts +++ b/addons/addon-image/src/kitty/KittyGraphicsHandler.ts @@ -752,10 +752,10 @@ export class KittyGraphicsHandler implements IApcHandler, IResetHandler, IDispos const b1 = src32[srcOffset++]; const b2 = src32[srcOffset++]; // Little-endian: pixel bytes are [R,G,B] → uint32 ABGR layout - dst32[dstOffset++] = b0 | 0xFF000000; - dst32[dstOffset++] = ((b0 >>> 24) | (b1 << 8)) | 0xFF000000; - dst32[dstOffset++] = ((b1 >>> 16) | (b2 << 16)) | 0xFF000000; - dst32[dstOffset++] = (b2 >>> 8) | 0xFF000000; + dst32[dstOffset++] = 0xFF000000 | b0; + dst32[dstOffset++] = 0xFF000000 | (b0 >>> 24) | (b1 << 8); + dst32[dstOffset++] = 0xFF000000 | (b1 >>> 16) | (b2 << 16); + dst32[dstOffset++] = 0xFF000000 | (b2 >>> 8); } // Handle remaining 1–3 pixels From b2553c17b4e074f2029d9a302555a9a53a56d77d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 9 Mar 2026 12:42:38 +0900 Subject: [PATCH 101/124] Clarify indexes in CharData and IColorRGB Part of #5740 --- src/common/Types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/Types.ts b/src/common/Types.ts index a46f47b2a..a4040ab55 100644 --- a/src/common/Types.ts +++ b/src/common/Types.ts @@ -101,13 +101,13 @@ export interface ICharset { [key: string]: string | undefined; } -export type CharData = [number, string, number, number]; +export type CharData = [attrIndex: number, charIndex: string, width: number, code: number]; export interface IColor { readonly css: string; readonly rgba: number; // 32-bit int with rgba in each byte } -export type IColorRGB = [number, number, number]; +export type IColorRGB = [red: number, green: number, blue: number]; export interface IExtendedAttrs { ext: number; From df5393ec45714736aea308d6ed29d597429f53d4 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 9 Mar 2026 12:54:27 +0900 Subject: [PATCH 102/124] Use helper function and const for cell data tests --- src/common/Types.ts | 2 +- src/common/buffer/BufferLine.test.ts | 350 ++++++++++++++------------- 2 files changed, 179 insertions(+), 173 deletions(-) diff --git a/src/common/Types.ts b/src/common/Types.ts index a4040ab55..7ceda21d2 100644 --- a/src/common/Types.ts +++ b/src/common/Types.ts @@ -101,7 +101,7 @@ export interface ICharset { [key: string]: string | undefined; } -export type CharData = [attrIndex: number, charIndex: string, width: number, code: number]; +export type CharData = [attr: number, char: string, width: number, code: number]; export interface IColor { readonly css: string; diff --git a/src/common/buffer/BufferLine.test.ts b/src/common/buffer/BufferLine.test.ts index 9d08c2bef..eaceaa45f 100644 --- a/src/common/buffer/BufferLine.test.ts +++ b/src/common/buffer/BufferLine.test.ts @@ -24,6 +24,12 @@ class TestBufferLine extends BufferLine { } } +function createCellData(attr: number, char: string, width: number): CellData { + return CellData.fromCharData([attr, char, width, char.length === 0 ? 0 : char.charCodeAt(0)]); +} + +const NULL_CELL_DATA = Object.freeze(createCellData(DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH)); + describe('AttributeData', () => { describe('extended attributes', () => { it('hasExtendedAttrs', () => { @@ -173,78 +179,78 @@ describe('BufferLine', function(): void { assert.equal(line.length, 10); assert.deepEqual(line.loadCell(0, new CellData()).getAsCharData(), [0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]); assert.equal(line.isWrapped, true); - line = new TestBufferLine(10, CellData.fromCharData([123, 'a', 456, 'a'.charCodeAt(0)]), true); + line = new TestBufferLine(10, createCellData(123, 'a', 456), true); assert.equal(line.length, 10); assert.deepEqual(line.loadCell(0, new CellData()).getAsCharData(), [123, 'a', 456, 'a'.charCodeAt(0)]); assert.equal(line.isWrapped, true); }); it('insertCells', function(): void { const line = new TestBufferLine(3); - line.setCell(0, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - line.setCell(1, CellData.fromCharData([2, 'b', 0, 'b'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([3, 'c', 0, 'c'.charCodeAt(0)])); - line.insertCells(1, 3, CellData.fromCharData([4, 'd', 0, 'd'.charCodeAt(0)])); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(1, createCellData(2, 'b', 1)); + line.setCell(2, createCellData(3, 'c', 1)); + line.insertCells(1, 3, createCellData(4, 'd', 1)); assert.deepEqual(line.toArray(), [ - [1, 'a', 0, 'a'.charCodeAt(0)], - [4, 'd', 0, 'd'.charCodeAt(0)], - [4, 'd', 0, 'd'.charCodeAt(0)] + [1, 'a', 1, 'a'.charCodeAt(0)], + [4, 'd', 1, 'd'.charCodeAt(0)], + [4, 'd', 1, 'd'.charCodeAt(0)] ]); }); it('deleteCells', function(): void { const line = new TestBufferLine(5); - line.setCell(0, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - line.setCell(1, CellData.fromCharData([2, 'b', 0, 'b'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([3, 'c', 0, 'c'.charCodeAt(0)])); - line.setCell(3, CellData.fromCharData([4, 'd', 0, 'd'.charCodeAt(0)])); - line.setCell(4, CellData.fromCharData([5, 'e', 0, 'e'.charCodeAt(0)])); - line.deleteCells(1, 2, CellData.fromCharData([6, 'f', 0, 'f'.charCodeAt(0)])); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(1, createCellData(2, 'b', 1)); + line.setCell(2, createCellData(3, 'c', 1)); + line.setCell(3, createCellData(4, 'd', 1)); + line.setCell(4, createCellData(5, 'e', 1)); + line.deleteCells(1, 2, createCellData(6, 'f', 1)); assert.deepEqual(line.toArray(), [ - [1, 'a', 0, 'a'.charCodeAt(0)], - [4, 'd', 0, 'd'.charCodeAt(0)], - [5, 'e', 0, 'e'.charCodeAt(0)], - [6, 'f', 0, 'f'.charCodeAt(0)], - [6, 'f', 0, 'f'.charCodeAt(0)] + [1, 'a', 1, 'a'.charCodeAt(0)], + [4, 'd', 1, 'd'.charCodeAt(0)], + [5, 'e', 1, 'e'.charCodeAt(0)], + [6, 'f', 1, 'f'.charCodeAt(0)], + [6, 'f', 1, 'f'.charCodeAt(0)] ]); }); it('replaceCells', function(): void { const line = new TestBufferLine(5); - line.setCell(0, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - line.setCell(1, CellData.fromCharData([2, 'b', 0, 'b'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([3, 'c', 0, 'c'.charCodeAt(0)])); - line.setCell(3, CellData.fromCharData([4, 'd', 0, 'd'.charCodeAt(0)])); - line.setCell(4, CellData.fromCharData([5, 'e', 0, 'e'.charCodeAt(0)])); - line.replaceCells(2, 4, CellData.fromCharData([6, 'f', 0, 'f'.charCodeAt(0)])); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(1, createCellData(2, 'b', 1)); + line.setCell(2, createCellData(3, 'c', 1)); + line.setCell(3, createCellData(4, 'd', 1)); + line.setCell(4, createCellData(5, 'e', 1)); + line.replaceCells(2, 4, createCellData(6, 'f', 1)); assert.deepEqual(line.toArray(), [ - [1, 'a', 0, 'a'.charCodeAt(0)], - [2, 'b', 0, 'b'.charCodeAt(0)], - [6, 'f', 0, 'f'.charCodeAt(0)], - [6, 'f', 0, 'f'.charCodeAt(0)], - [5, 'e', 0, 'e'.charCodeAt(0)] + [1, 'a', 1, 'a'.charCodeAt(0)], + [2, 'b', 1, 'b'.charCodeAt(0)], + [6, 'f', 1, 'f'.charCodeAt(0)], + [6, 'f', 1, 'f'.charCodeAt(0)], + [5, 'e', 1, 'e'.charCodeAt(0)] ]); }); it('fill', function(): void { const line = new TestBufferLine(5); - line.setCell(0, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - line.setCell(1, CellData.fromCharData([2, 'b', 0, 'b'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([3, 'c', 0, 'c'.charCodeAt(0)])); - line.setCell(3, CellData.fromCharData([4, 'd', 0, 'd'.charCodeAt(0)])); - line.setCell(4, CellData.fromCharData([5, 'e', 0, 'e'.charCodeAt(0)])); - line.fill(CellData.fromCharData([123, 'z', 0, 'z'.charCodeAt(0)])); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(1, createCellData(2, 'b', 1)); + line.setCell(2, createCellData(3, 'c', 1)); + line.setCell(3, createCellData(4, 'd', 1)); + line.setCell(4, createCellData(5, 'e', 1)); + line.fill(createCellData(123, 'z', 1)); assert.deepEqual(line.toArray(), [ - [123, 'z', 0, 'z'.charCodeAt(0)], - [123, 'z', 0, 'z'.charCodeAt(0)], - [123, 'z', 0, 'z'.charCodeAt(0)], - [123, 'z', 0, 'z'.charCodeAt(0)], - [123, 'z', 0, 'z'.charCodeAt(0)] + [123, 'z', 1, 'z'.charCodeAt(0)], + [123, 'z', 1, 'z'.charCodeAt(0)], + [123, 'z', 1, 'z'.charCodeAt(0)], + [123, 'z', 1, 'z'.charCodeAt(0)], + [123, 'z', 1, 'z'.charCodeAt(0)] ]); }); it('clone', function(): void { const line = new TestBufferLine(5, undefined, true); - line.setCell(0, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - line.setCell(1, CellData.fromCharData([2, 'b', 0, 'b'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([3, 'c', 0, 'c'.charCodeAt(0)])); - line.setCell(3, CellData.fromCharData([4, 'd', 0, 'd'.charCodeAt(0)])); - line.setCell(4, CellData.fromCharData([5, 'e', 0, 'e'.charCodeAt(0)])); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(1, createCellData(2, 'b', 1)); + line.setCell(2, createCellData(3, 'c', 1)); + line.setCell(3, createCellData(4, 'd', 1)); + line.setCell(4, createCellData(5, 'e', 1)); const line2 = line.clone(); assert.deepEqual(TestBufferLine.prototype.toArray.apply(line2), line.toArray()); assert.equal(line2.length, line.length); @@ -252,12 +258,12 @@ describe('BufferLine', function(): void { }); it('copyFrom', function(): void { const line = new TestBufferLine(5); - line.setCell(0, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - line.setCell(1, CellData.fromCharData([2, 'b', 0, 'b'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([3, 'c', 0, 'c'.charCodeAt(0)])); - line.setCell(3, CellData.fromCharData([4, 'd', 0, 'd'.charCodeAt(0)])); - line.setCell(4, CellData.fromCharData([5, 'e', 0, 'e'.charCodeAt(0)])); - const line2 = new TestBufferLine(5, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]), true); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(1, createCellData(2, 'b', 1)); + line.setCell(2, createCellData(3, 'c', 1)); + line.setCell(3, createCellData(4, 'd', 1)); + line.setCell(4, createCellData(5, 'e', 1)); + const line2 = new TestBufferLine(5, createCellData(1, 'a', 1), true); line2.copyFrom(line); assert.deepEqual(line2.toArray(), line.toArray()); assert.equal(line2.length, line.length); @@ -267,9 +273,9 @@ describe('BufferLine', function(): void { // CHAR_DATA_CODE_INDEX resembles current behavior in InputHandler.print // --> set code to the last charCodeAt value of the string // Note: needs to be fixed once the string pointer is in place - const line = new TestBufferLine(2, CellData.fromCharData([1, 'e\u0301', 0, '\u0301'.charCodeAt(0)])); - assert.deepEqual(line.toArray(), [[1, 'e\u0301', 0, '\u0301'.charCodeAt(0)], [1, 'e\u0301', 0, '\u0301'.charCodeAt(0)]]); - const line2 = new TestBufferLine(5, CellData.fromCharData([1, 'a', 0, '\u0301'.charCodeAt(0)]), true); + const line = new TestBufferLine(2, createCellData(1, 'e\u0301', 1)); + assert.deepEqual(line.toArray(), [[1, 'e\u0301', 1, '\u0301'.charCodeAt(0)], [1, 'e\u0301', 1, '\u0301'.charCodeAt(0)]]); + const line2 = new TestBufferLine(5, createCellData(1, 'a', 1), true); line2.copyFrom(line); assert.deepEqual(line2.toArray(), line.toArray()); const line3 = line.clone(); @@ -277,72 +283,72 @@ describe('BufferLine', function(): void { }); describe('resize', function(): void { it('enlarge(false)', function(): void { - const line = new TestBufferLine(5, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]), false); - line.resize(10, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - assert.deepEqual(line.toArray(), (Array(10) as any).fill([1, 'a', 0, 'a'.charCodeAt(0)])); + const line = new TestBufferLine(5, createCellData(1, 'a', 1), false); + line.resize(10, createCellData(1, 'a', 1)); + assert.deepEqual(line.toArray(), (Array(10) as any).fill([1, 'a', 1, 'a'.charCodeAt(0)])); }); it('enlarge(true)', function(): void { - const line = new TestBufferLine(5, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]), false); - line.resize(10, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - assert.deepEqual(line.toArray(), (Array(10) as any).fill([1, 'a', 0, 'a'.charCodeAt(0)])); + const line = new TestBufferLine(5, createCellData(1, 'a', 1), false); + line.resize(10, createCellData(1, 'a', 1)); + assert.deepEqual(line.toArray(), (Array(10) as any).fill([1, 'a', 1, 'a'.charCodeAt(0)])); }); it('shrink(true) - should apply new size', function(): void { - const line = new TestBufferLine(10, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]), false); - line.resize(5, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - assert.deepEqual(line.toArray(), (Array(5) as any).fill([1, 'a', 0, 'a'.charCodeAt(0)])); + const line = new TestBufferLine(10, createCellData(1, 'a', 1), false); + line.resize(5, createCellData(1, 'a', 1)); + assert.deepEqual(line.toArray(), (Array(5) as any).fill([1, 'a', 1, 'a'.charCodeAt(0)])); }); it('shrink to 0 length', function(): void { - const line = new TestBufferLine(10, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]), false); - line.resize(0, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); - assert.deepEqual(line.toArray(), (Array(0) as any).fill([1, 'a', 0, 'a'.charCodeAt(0)])); + const line = new TestBufferLine(10, createCellData(1, 'a', 1), false); + line.resize(0, createCellData(1, 'a', 1)); + assert.deepEqual(line.toArray(), (Array(0) as any).fill([1, 'a', 1, 'a'.charCodeAt(0)])); }); it('should remove combining data on replaced cells after shrinking then enlarging', () => { - const line = new TestBufferLine(10, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]), false); + const line = new TestBufferLine(10, createCellData(1, 'a', 1), false); line.set(2, [ 0, '😁', 1, '😁'.charCodeAt(0) ]); line.set(9, [ 0, '😁', 1, '😁'.charCodeAt(0) ]); assert.equal(line.translateToString(), 'aa😁aaaaaa😁'); assert.equal(Object.keys(line.combined).length, 2); - line.resize(5, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); + line.resize(5, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aa😁aa'); - line.resize(10, CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)])); + line.resize(10, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aa😁aaaaaaa'); assert.equal(Object.keys(line.combined).length, 1); }); }); describe('getTrimLength', function(): void { it('empty line', function(): void { - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); assert.equal(line.getTrimmedLength(), 0); }); it('ASCII', function(): void { - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(2, createCellData(1, 'a', 1)); assert.equal(line.getTrimmedLength(), 3); }); it('surrogate', function(): void { - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([1, '𝄞', 1, '𝄞'.charCodeAt(0)])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(2, createCellData(1, '𝄞', 1)); assert.equal(line.getTrimmedLength(), 3); }); it('combining', function(): void { - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([1, 'e\u0301', 1, '\u0301'.charCodeAt(0)])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(2, createCellData(1, 'e\u0301', 1)); assert.equal(line.getTrimmedLength(), 3); }); it('fullwidth', function(): void { - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([1, '1', 2, '1'.charCodeAt(0)])); - line.setCell(3, CellData.fromCharData([0, '', 0, 0])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(2, createCellData(1, '1', 2)); + line.setCell(3, createCellData(0, '', 0)); assert.equal(line.getTrimmedLength(), 4); // also counts null cell after fullwidth }); }); describe('translateToString with and w\'o trimming', function(): void { it('empty line', function(): void { - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); const columns: number[] = []; assert.equal(line.translateToString(false, undefined, undefined, columns), ' '); assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); @@ -351,11 +357,11 @@ describe('BufferLine', function(): void { }); it('ASCII', function(): void { const columns: number[] = []; - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(4, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(5, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(2, createCellData(1, 'a', 1)); + line.setCell(4, createCellData(1, 'a', 1)); + line.setCell(5, createCellData(1, 'a', 1)); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a a aa '); assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a a aa'); @@ -372,11 +378,11 @@ describe('BufferLine', function(): void { }); it('surrogate', function(): void { const columns: number[] = []; - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([1, '𝄞', 1, '𝄞'.charCodeAt(0)])); - line.setCell(4, CellData.fromCharData([1, '𝄞', 1, '𝄞'.charCodeAt(0)])); - line.setCell(5, CellData.fromCharData([1, '𝄞', 1, '𝄞'.charCodeAt(0)])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(2, createCellData(1, '𝄞', 1)); + line.setCell(4, createCellData(1, '𝄞', 1)); + line.setCell(5, createCellData(1, '𝄞', 1)); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a 𝄞 𝄞𝄞 '); assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a 𝄞 𝄞𝄞'); @@ -392,11 +398,11 @@ describe('BufferLine', function(): void { }); it('combining', function(): void { const columns: number[] = []; - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([1, 'e\u0301', 1, '\u0301'.charCodeAt(0)])); - line.setCell(4, CellData.fromCharData([1, 'e\u0301', 1, '\u0301'.charCodeAt(0)])); - line.setCell(5, CellData.fromCharData([1, 'e\u0301', 1, '\u0301'.charCodeAt(0)])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(2, createCellData(1, 'e\u0301', 1)); + line.setCell(4, createCellData(1, 'e\u0301', 1)); + line.setCell(5, createCellData(1, 'e\u0301', 1)); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a e\u0301 e\u0301e\u0301 '); assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a e\u0301 e\u0301e\u0301'); @@ -412,14 +418,14 @@ describe('BufferLine', function(): void { }); it('fullwidth', function(): void { const columns: number[] = []; - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([1, '1', 2, '1'.charCodeAt(0)])); - line.setCell(3, CellData.fromCharData([0, '', 0, 0])); - line.setCell(5, CellData.fromCharData([1, '1', 2, '1'.charCodeAt(0)])); - line.setCell(6, CellData.fromCharData([0, '', 0, 0])); - line.setCell(7, CellData.fromCharData([1, '1', 2, '1'.charCodeAt(0)])); - line.setCell(8, CellData.fromCharData([0, '', 0, 0])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(2, createCellData(1, '1', 2)); + line.setCell(3, createCellData(0, '', 0)); + line.setCell(5, createCellData(1, '1', 2)); + line.setCell(6, createCellData(0, '', 0)); + line.setCell(7, createCellData(1, '1', 2)); + line.setCell(8, createCellData(0, '', 0)); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a 1 11 '); assert.deepEqual(columns, [0, 1, 2, 4, 5, 7, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a 1 11'); @@ -441,12 +447,12 @@ describe('BufferLine', function(): void { }); it('space at end', function(): void { const columns: number[] = []; - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(4, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(5, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(6, CellData.fromCharData([1, ' ', 1, ' '.charCodeAt(0)])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); + line.setCell(2, createCellData(1, 'a', 1)); + line.setCell(4, createCellData(1, 'a', 1)); + line.setCell(5, createCellData(1, 'a', 1)); + line.setCell(6, createCellData(1, ' ', 1)); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a a aa '); assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a a aa '); @@ -457,7 +463,7 @@ describe('BufferLine', function(): void { // sanity check - broken line with invalid out of bound null width cells // this can atm happen with deleting/inserting chars in inputhandler by "breaking" // fullwidth pairs --> needs to be fixed after settling BufferLine impl - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); assert.equal(line.translateToString(false, undefined, undefined, columns), ' '); assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), ''); @@ -465,15 +471,15 @@ describe('BufferLine', function(): void { }); it('should work with endCol=0', () => { const columns: number[] = []; - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); - line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); + line.setCell(0, createCellData(1, 'a', 1)); assert.equal(line.translateToString(true, 0, 0, columns), ''); assert.deepEqual(columns, [0]); }); }); describe('addCharToCell', () => { it('should set width to 1 for empty cell', () => { - const line = new TestBufferLine(3, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); + const line = new TestBufferLine(3, NULL_CELL_DATA, false); line.addCodepointToCell(0, '\u0301'.charCodeAt(0), 0); const cell = line.loadCell(0, new CellData()); // chars contains single combining char @@ -483,7 +489,7 @@ describe('BufferLine', function(): void { assert.equal(cell.isCombined(), 0); }); it('should add char to combining string in cell', () => { - const line = new TestBufferLine(3, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); + const line = new TestBufferLine(3, NULL_CELL_DATA, false); const cell = line .loadCell(0, new CellData()); cell.setFromCharData([123, 'e\u0301', 1, 'e\u0301'.charCodeAt(1)]); line.setCell(0, cell); @@ -496,7 +502,7 @@ describe('BufferLine', function(): void { assert.equal(cell.isCombined(), Content.IS_COMBINED_MASK); }); it('should create combining string on taken cell', () => { - const line = new TestBufferLine(3, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); + const line = new TestBufferLine(3, NULL_CELL_DATA, false); const cell = line .loadCell(0, new CellData()); cell.setFromCharData([123, 'e', 1, 'e'.charCodeAt(1)]); line.setCell(0, cell); @@ -511,98 +517,98 @@ describe('BufferLine', function(): void { }); describe('correct fullwidth handling', () => { function populate(line: BufferLine): void { - const cell = CellData.fromCharData([1, '¥', 2, '¥'.charCodeAt(0)]); + const cell = createCellData(1, '¥', 2); for (let i = 0; i < line.length; i += 2) { line.setCell(i, cell); } } it('insert - wide char at pos', () => { - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.insertCells(9, 1, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.insertCells(9, 1, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), '¥¥¥¥ a'); - line.insertCells(8, 1, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.insertCells(8, 1, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), '¥¥¥¥a '); - line.insertCells(1, 1, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.insertCells(1, 1, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' a ¥¥¥a'); }); it('insert - wide char at end', () => { - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.insertCells(0, 3, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.insertCells(0, 3, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aaa¥¥¥ '); - line.insertCells(4, 1, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.insertCells(4, 1, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aaa a ¥¥'); - line.insertCells(4, 1, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.insertCells(4, 1, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aaa aa ¥ '); }); it('delete', () => { - const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + const line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.deleteCells(0, 1, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.deleteCells(0, 1, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' ¥¥¥¥a'); - line.deleteCells(5, 2, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.deleteCells(5, 2, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' ¥¥¥aaa'); - line.deleteCells(0, 2, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.deleteCells(0, 2, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' ¥¥aaaaa'); }); it('replace - start at 0', () => { - let line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + let line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(0, 1, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(0, 1, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'a ¥¥¥¥'); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(0, 2, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(0, 2, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aa¥¥¥¥'); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(0, 3, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(0, 3, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aaa ¥¥¥'); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(0, 8, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(0, 8, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aaaaaaaa¥'); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(0, 9, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(0, 9, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aaaaaaaaa '); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(0, 10, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(0, 10, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), 'aaaaaaaaaa'); }); it('replace - start at 1', () => { - let line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + let line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(1, 2, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(1, 2, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' a¥¥¥¥'); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(1, 3, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(1, 3, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' aa ¥¥¥'); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(1, 4, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(1, 4, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' aaa¥¥¥'); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(1, 8, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(1, 8, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' aaaaaaa¥'); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(1, 9, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(1, 9, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' aaaaaaaa '); - line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); + line = new TestBufferLine(10, NULL_CELL_DATA, false); populate(line); - line.replaceCells(1, 10, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); + line.replaceCells(1, 10, createCellData(1, 'a', 1)); assert.equal(line.translateToString(), ' aaaaaaaaa'); }); }); describe('extended attributes', () => { it('setCells', function(): void { const line = new TestBufferLine(5); - const cell = CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]); + const cell = createCellData(1, 'a', 1); // no eAttrs line.setCell(0, cell); @@ -612,7 +618,7 @@ describe('BufferLine', function(): void { line.setCell(1, cell); // same eAttr, different codepoint - cell.content = 65; // 'A' + cell.content = createCellData(1, 'A', 1).content; line.setCell(2, cell); // different eAttr @@ -625,11 +631,11 @@ describe('BufferLine', function(): void { line.setCell(4, cell); assert.deepEqual(line.toArray(), [ - [1, 'a', 0, 'a'.charCodeAt(0)], - [1, 'a', 0, 'a'.charCodeAt(0)], - [1, 'A', 0, 'A'.charCodeAt(0)], - [1, 'A', 0, 'A'.charCodeAt(0)], - [1, 'A', 0, 'A'.charCodeAt(0)] + [1, 'a', 1, 'a'.charCodeAt(0)], + [1, 'a', 1, 'a'.charCodeAt(0)], + [1, 'A', 1, 'A'.charCodeAt(0)], + [1, 'A', 1, 'A'.charCodeAt(0)], + [1, 'A', 1, 'A'.charCodeAt(0)] ]); assert.equal((line as any)._extendedAttrs[0], undefined); assert.equal((line as any)._extendedAttrs[1].underlineStyle, UnderlineStyle.CURLY); @@ -643,7 +649,7 @@ describe('BufferLine', function(): void { }); it('loadCell', () => { const line = new TestBufferLine(5); - const cell = CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]); + const cell = createCellData(1, 'a', 1); // no eAttrs line.setCell(0, cell); @@ -686,7 +692,7 @@ describe('BufferLine', function(): void { }); it('fill', () => { const line = new TestBufferLine(3); - const cell = CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]); + const cell = createCellData(1, 'a', 1); cell.extended.underlineStyle = UnderlineStyle.CURLY; cell.bg |= BgFlags.HAS_EXTENDED; line.fill(cell); @@ -696,7 +702,7 @@ describe('BufferLine', function(): void { }); it('insertCells', () => { const line = new TestBufferLine(5); - const cell = CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]); + const cell = createCellData(1, 'a', 1); cell.extended.underlineStyle = UnderlineStyle.CURLY; cell.bg |= BgFlags.HAS_EXTENDED; line.insertCells(1, 3, cell); @@ -714,7 +720,7 @@ describe('BufferLine', function(): void { }); it('deleteCells', () => { const line = new TestBufferLine(5); - const fillCell = CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]); + const fillCell = createCellData(1, 'a', 1); fillCell.extended.underlineStyle = UnderlineStyle.CURLY; fillCell.bg |= BgFlags.HAS_EXTENDED; line.fill(fillCell); @@ -729,7 +735,7 @@ describe('BufferLine', function(): void { }); it('replaceCells', () => { const line = new TestBufferLine(5); - const fillCell = CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]); + const fillCell = createCellData(1, 'a', 1); fillCell.extended.underlineStyle = UnderlineStyle.CURLY; fillCell.bg |= BgFlags.HAS_EXTENDED; line.fill(fillCell); @@ -744,7 +750,7 @@ describe('BufferLine', function(): void { }); it('clone', () => { const line = new TestBufferLine(5); - const cell = CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]); + const cell = createCellData(1, 'a', 1); // no eAttrs line.setCell(0, cell); @@ -775,7 +781,7 @@ describe('BufferLine', function(): void { }); it('copyFrom', () => { const initial = new TestBufferLine(5); - const cell = CellData.fromCharData([1, 'a', 0, 'a'.charCodeAt(0)]); + const cell = createCellData(1, 'a', 1); // no eAttrs initial.setCell(0, cell); @@ -798,7 +804,7 @@ describe('BufferLine', function(): void { initial.setCell(4, cell); const line = new TestBufferLine(5); - line.fill(CellData.fromCharData([1, 'b', 0, 'b'.charCodeAt(0)])); + line.fill(createCellData(1, 'b', 1)); line.copyFrom(initial); assert.equal((line as any)._extendedAttrs[0], (initial as any)._extendedAttrs[0]); assert.equal((line as any)._extendedAttrs[1], (initial as any)._extendedAttrs[1]); From 671425bf5a6530ce664f68dc2298108364db1374 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:03:00 +0900 Subject: [PATCH 103/124] Use helpers in other tests --- src/browser/Terminal.test.ts | 64 +++++----- .../dom/DomRendererRowFactory.test.ts | 110 +++++++++--------- .../services/CharacterJoinerService.test.ts | 16 +-- src/browser/services/SelectionService.test.ts | 6 +- src/common/TestUtils.test.ts | 8 ++ src/common/buffer/Buffer.test.ts | 36 +++--- src/common/buffer/BufferLine.test.ts | 7 +- 7 files changed, 125 insertions(+), 122 deletions(-) diff --git a/src/browser/Terminal.test.ts b/src/browser/Terminal.test.ts index ba2ce6dd5..c651c248a 100644 --- a/src/browser/Terminal.test.ts +++ b/src/browser/Terminal.test.ts @@ -8,7 +8,7 @@ import type { IBrowser } from 'browser/Types'; import { assert } from 'chai'; import { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { CellData } from 'common/buffer/CellData'; -import { MockUnicodeService } from 'common/TestUtils.test'; +import { MockUnicodeService, createCellData } from 'common/TestUtils.test'; import { IMarker } from 'common/Types'; const INIT_COLS = 80; @@ -440,8 +440,8 @@ describe('Terminal', () => { describe('scroll() function', () => { describe('when scrollback > 0', () => { it('should create a new line and scroll', () => { - term.buffer.lines.get(0)!.setCell(0, CellData.fromCharData([0, 'a', 0, 'a'.charCodeAt(0)])); - term.buffer.lines.get(INIT_ROWS - 1)!.setCell(0, CellData.fromCharData([0, 'b', 0, 'b'.charCodeAt(0)])); + term.buffer.lines.get(0)!.setCell(0, createCellData(0, 'a', 0)); + term.buffer.lines.get(INIT_ROWS - 1)!.setCell(0, createCellData(0, 'b', 0)); term.buffer.y = INIT_ROWS - 1; // Move cursor to last line term.scroll(DEFAULT_ATTR_DATA.clone()); assert.equal(term.buffer.lines.length, INIT_ROWS + 1); @@ -451,9 +451,9 @@ describe('Terminal', () => { }); it('should properly scroll inside a scroll region (scrollTop set)', () => { - term.buffer.lines.get(0)!.setCell(0, CellData.fromCharData([0, 'a', 0, 'a'.charCodeAt(0)])); - term.buffer.lines.get(1)!.setCell(0, CellData.fromCharData([0, 'b', 0, 'b'.charCodeAt(0)])); - term.buffer.lines.get(2)!.setCell(0, CellData.fromCharData([0, 'c', 0, 'c'.charCodeAt(0)])); + term.buffer.lines.get(0)!.setCell(0, createCellData(0, 'a', 0)); + term.buffer.lines.get(1)!.setCell(0, createCellData(0, 'b', 0)); + term.buffer.lines.get(2)!.setCell(0, createCellData(0, 'c', 0)); term.buffer.y = INIT_ROWS - 1; // Move cursor to last line term.buffer.scrollTop = 1; term.scroll(DEFAULT_ATTR_DATA.clone()); @@ -463,11 +463,11 @@ describe('Terminal', () => { }); it('should properly scroll inside a scroll region (scrollBottom set)', () => { - term.buffer.lines.get(0)!.setCell(0, CellData.fromCharData([0, 'a', 0, 'a'.charCodeAt(0)])); - term.buffer.lines.get(1)!.setCell(0, CellData.fromCharData([0, 'b', 0, 'b'.charCodeAt(0)])); - term.buffer.lines.get(2)!.setCell(0, CellData.fromCharData([0, 'c', 0, 'c'.charCodeAt(0)])); - term.buffer.lines.get(3)!.setCell(0, CellData.fromCharData([0, 'd', 0, 'd'.charCodeAt(0)])); - term.buffer.lines.get(4)!.setCell(0, CellData.fromCharData([0, 'e', 0, 'e'.charCodeAt(0)])); + term.buffer.lines.get(0)!.setCell(0, createCellData(0, 'a', 0)); + term.buffer.lines.get(1)!.setCell(0, createCellData(0, 'b', 0)); + term.buffer.lines.get(2)!.setCell(0, createCellData(0, 'c', 0)); + term.buffer.lines.get(3)!.setCell(0, createCellData(0, 'd', 0)); + term.buffer.lines.get(4)!.setCell(0, createCellData(0, 'e', 0)); term.buffer.y = 3; term.buffer.scrollBottom = 3; term.scroll(DEFAULT_ATTR_DATA.clone()); @@ -481,11 +481,11 @@ describe('Terminal', () => { }); it('should properly scroll inside a scroll region (scrollTop and scrollBottom set)', () => { - term.buffer.lines.get(0)!.setCell(0, CellData.fromCharData([0, 'a', 0, 'a'.charCodeAt(0)])); - term.buffer.lines.get(1)!.setCell(0, CellData.fromCharData([0, 'b', 0, 'b'.charCodeAt(0)])); - term.buffer.lines.get(2)!.setCell(0, CellData.fromCharData([0, 'c', 0, 'c'.charCodeAt(0)])); - term.buffer.lines.get(3)!.setCell(0, CellData.fromCharData([0, 'd', 0, 'd'.charCodeAt(0)])); - term.buffer.lines.get(4)!.setCell(0, CellData.fromCharData([0, 'e', 0, 'e'.charCodeAt(0)])); + term.buffer.lines.get(0)!.setCell(0, createCellData(0, 'a', 0)); + term.buffer.lines.get(1)!.setCell(0, createCellData(0, 'b', 0)); + term.buffer.lines.get(2)!.setCell(0, createCellData(0, 'c', 0)); + term.buffer.lines.get(3)!.setCell(0, createCellData(0, 'd', 0)); + term.buffer.lines.get(4)!.setCell(0, createCellData(0, 'e', 0)); term.buffer.y = INIT_ROWS - 1; // Move cursor to last line term.buffer.scrollTop = 1; term.buffer.scrollBottom = 3; @@ -506,9 +506,9 @@ describe('Terminal', () => { }); it('should create a new line and shift everything up', () => { - term.buffer.lines.get(0)!.setCell(0, CellData.fromCharData([0, 'a', 0, 'a'.charCodeAt(0)])); - term.buffer.lines.get(1)!.setCell(0, CellData.fromCharData([0, 'b', 0, 'b'.charCodeAt(0)])); - term.buffer.lines.get(INIT_ROWS - 1)!.setCell(0, CellData.fromCharData([0, 'c', 0, 'c'.charCodeAt(0)])); + term.buffer.lines.get(0)!.setCell(0, createCellData(0, 'a', 0)); + term.buffer.lines.get(1)!.setCell(0, createCellData(0, 'b', 0)); + term.buffer.lines.get(INIT_ROWS - 1)!.setCell(0, createCellData(0, 'c', 0)); term.buffer.y = INIT_ROWS - 1; // Move cursor to last line assert.equal(term.buffer.lines.length, INIT_ROWS); term.scroll(DEFAULT_ATTR_DATA.clone()); @@ -521,9 +521,9 @@ describe('Terminal', () => { }); it('should properly scroll inside a scroll region (scrollTop set)', () => { - term.buffer.lines.get(0)!.setCell(0, CellData.fromCharData([0, 'a', 0, 'a'.charCodeAt(0)])); - term.buffer.lines.get(1)!.setCell(0, CellData.fromCharData([0, 'b', 0, 'b'.charCodeAt(0)])); - term.buffer.lines.get(2)!.setCell(0, CellData.fromCharData([0, 'c', 0, 'c'.charCodeAt(0)])); + term.buffer.lines.get(0)!.setCell(0, createCellData(0, 'a', 0)); + term.buffer.lines.get(1)!.setCell(0, createCellData(0, 'b', 0)); + term.buffer.lines.get(2)!.setCell(0, createCellData(0, 'c', 0)); term.buffer.y = INIT_ROWS - 1; // Move cursor to last line term.buffer.scrollTop = 1; term.scroll(DEFAULT_ATTR_DATA.clone()); @@ -533,11 +533,11 @@ describe('Terminal', () => { }); it('should properly scroll inside a scroll region (scrollBottom set)', () => { - term.buffer.lines.get(0)!.setCell(0, CellData.fromCharData([0, 'a', 0, 'a'.charCodeAt(0)])); - term.buffer.lines.get(1)!.setCell(0, CellData.fromCharData([0, 'b', 0, 'b'.charCodeAt(0)])); - term.buffer.lines.get(2)!.setCell(0, CellData.fromCharData([0, 'c', 0, 'c'.charCodeAt(0)])); - term.buffer.lines.get(3)!.setCell(0, CellData.fromCharData([0, 'd', 0, 'd'.charCodeAt(0)])); - term.buffer.lines.get(4)!.setCell(0, CellData.fromCharData([0, 'e', 0, 'e'.charCodeAt(0)])); + term.buffer.lines.get(0)!.setCell(0, createCellData(0, 'a', 0)); + term.buffer.lines.get(1)!.setCell(0, createCellData(0, 'b', 0)); + term.buffer.lines.get(2)!.setCell(0, createCellData(0, 'c', 0)); + term.buffer.lines.get(3)!.setCell(0, createCellData(0, 'd', 0)); + term.buffer.lines.get(4)!.setCell(0, createCellData(0, 'e', 0)); term.buffer.y = 3; term.buffer.scrollBottom = 3; term.scroll(DEFAULT_ATTR_DATA.clone()); @@ -550,11 +550,11 @@ describe('Terminal', () => { }); it('should properly scroll inside a scroll region (scrollTop and scrollBottom set)', () => { - term.buffer.lines.get(0)!.setCell(0, CellData.fromCharData([0, 'a', 0, 'a'.charCodeAt(0)])); - term.buffer.lines.get(1)!.setCell(0, CellData.fromCharData([0, 'b', 0, 'b'.charCodeAt(0)])); - term.buffer.lines.get(2)!.setCell(0, CellData.fromCharData([0, 'c', 0, 'c'.charCodeAt(0)])); - term.buffer.lines.get(3)!.setCell(0, CellData.fromCharData([0, 'd', 0, 'd'.charCodeAt(0)])); - term.buffer.lines.get(4)!.setCell(0, CellData.fromCharData([0, 'e', 0, 'e'.charCodeAt(0)])); + term.buffer.lines.get(0)!.setCell(0, createCellData(0, 'a', 0)); + term.buffer.lines.get(1)!.setCell(0, createCellData(0, 'b', 0)); + term.buffer.lines.get(2)!.setCell(0, createCellData(0, 'c', 0)); + term.buffer.lines.get(3)!.setCell(0, createCellData(0, 'd', 0)); + term.buffer.lines.get(4)!.setCell(0, createCellData(0, 'e', 0)); term.buffer.y = INIT_ROWS - 1; // Move cursor to last line term.buffer.scrollTop = 1; term.buffer.scrollBottom = 3; diff --git a/src/browser/renderer/dom/DomRendererRowFactory.test.ts b/src/browser/renderer/dom/DomRendererRowFactory.test.ts index b6f6eedca..05fc8000c 100644 --- a/src/browser/renderer/dom/DomRendererRowFactory.test.ts +++ b/src/browser/renderer/dom/DomRendererRowFactory.test.ts @@ -10,7 +10,7 @@ import { NULL_CELL_CODE, NULL_CELL_WIDTH, NULL_CELL_CHAR, DEFAULT_ATTR, FgFlags, import { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { IBufferLine } from 'common/Types'; import { CellData } from 'common/buffer/CellData'; -import { MockCoreService, MockDecorationService, MockOptionsService } from 'common/TestUtils.test'; +import { MockCoreService, MockDecorationService, MockOptionsService, createCellData, NULL_CELL_DATA } from 'common/TestUtils.test'; import { MockCharacterJoinerService, MockCoreBrowserService, MockThemeService } from 'browser/TestUtils.test'; import { TestWidthCache } from 'browser/renderer/dom/WidthCache.test'; @@ -48,9 +48,9 @@ describe('DomRendererRowFactory', () => { it('should set correct attributes for double width characters', () => { widthCache.setWidths({ '語': 10 }); - lineData.setCell(0, CellData.fromCharData([DEFAULT_ATTR, '語', 2, '語'.charCodeAt(0)])); + lineData.setCell(0, createCellData(DEFAULT_ATTR, '語', 2)); // There should be no element for the following "empty" cell - lineData.setCell(1, CellData.fromCharData([DEFAULT_ATTR, '', 0, 0])); + lineData.setCell(1, createCellData(DEFAULT_ATTR, '', 0)); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); assert.equal(extractHtml(spans), '語' @@ -117,7 +117,7 @@ describe('DomRendererRowFactory', () => { describe('attributes', () => { it('should add class for bold', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg = DEFAULT_ATTR_DATA.fg | FgFlags.BOLD; lineData.setCell(0, cell); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); @@ -127,7 +127,7 @@ describe('DomRendererRowFactory', () => { }); it('should add class for italic', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.bg = DEFAULT_ATTR_DATA.bg | BgFlags.ITALIC; lineData.setCell(0, cell); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); @@ -137,7 +137,7 @@ describe('DomRendererRowFactory', () => { }); it('should add class for dim', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.bg = DEFAULT_ATTR_DATA.bg | BgFlags.DIM; lineData.setCell(0, cell); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); @@ -148,7 +148,7 @@ describe('DomRendererRowFactory', () => { describe('underline', () => { it('should add class for straight underline style', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg = DEFAULT_ATTR_DATA.fg | FgFlags.UNDERLINE; cell.bg = DEFAULT_ATTR_DATA.bg | BgFlags.HAS_EXTENDED; cell.extended.underlineStyle = UnderlineStyle.SINGLE; @@ -159,7 +159,7 @@ describe('DomRendererRowFactory', () => { ); }); it('should add class for double underline style', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg = DEFAULT_ATTR_DATA.fg | FgFlags.UNDERLINE; cell.bg = DEFAULT_ATTR_DATA.bg | BgFlags.HAS_EXTENDED; cell.extended.underlineStyle = UnderlineStyle.DOUBLE; @@ -170,7 +170,7 @@ describe('DomRendererRowFactory', () => { ); }); it('should add class for curly underline style', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg = DEFAULT_ATTR_DATA.fg | FgFlags.UNDERLINE; cell.bg = DEFAULT_ATTR_DATA.bg | BgFlags.HAS_EXTENDED; cell.extended.underlineStyle = UnderlineStyle.CURLY; @@ -181,7 +181,7 @@ describe('DomRendererRowFactory', () => { ); }); it('should add class for double dotted style', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg = DEFAULT_ATTR_DATA.fg | FgFlags.UNDERLINE; cell.bg = DEFAULT_ATTR_DATA.bg | BgFlags.HAS_EXTENDED; cell.extended.underlineStyle = UnderlineStyle.DOTTED; @@ -192,7 +192,7 @@ describe('DomRendererRowFactory', () => { ); }); it('should add class for dashed underline style', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg = DEFAULT_ATTR_DATA.fg | FgFlags.UNDERLINE; cell.bg = DEFAULT_ATTR_DATA.bg | BgFlags.HAS_EXTENDED; cell.extended.underlineStyle = UnderlineStyle.DASHED; @@ -205,7 +205,7 @@ describe('DomRendererRowFactory', () => { }); it('should add class for overline', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.bg = DEFAULT_ATTR_DATA.bg | BgFlags.OVERLINE; lineData.setCell(0, cell); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); @@ -215,7 +215,7 @@ describe('DomRendererRowFactory', () => { }); it('should add class for strikethrough', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg = DEFAULT_ATTR_DATA.fg | FgFlags.STRIKETHROUGH; lineData.setCell(0, cell); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); @@ -225,7 +225,7 @@ describe('DomRendererRowFactory', () => { }); it('should hide blinking text when blink is off', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg = DEFAULT_ATTR_DATA.fg | FgFlags.BLINK | FgFlags.UNDERLINE; cell.bg = DEFAULT_ATTR_DATA.bg | BgFlags.HAS_EXTENDED; cell.extended.underlineStyle = UnderlineStyle.SINGLE; @@ -241,7 +241,7 @@ describe('DomRendererRowFactory', () => { }); it('should add classes for 256 foreground colors', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg |= Attributes.CM_P256; for (let i = 0; i < 256; i++) { cell.fg &= ~Attributes.PCOLOR_MASK; @@ -255,7 +255,7 @@ describe('DomRendererRowFactory', () => { }); it('should add classes for 256 background colors', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.bg |= Attributes.CM_P256; for (let i = 0; i < 256; i++) { cell.bg &= ~Attributes.PCOLOR_MASK; @@ -269,7 +269,7 @@ describe('DomRendererRowFactory', () => { }); it('should correctly invert colors', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg |= Attributes.CM_P16 | 2 | FgFlags.INVERSE; cell.bg |= Attributes.CM_P16 | 1; lineData.setCell(0, cell); @@ -280,7 +280,7 @@ describe('DomRendererRowFactory', () => { }); it('should correctly invert default fg color', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg |= FgFlags.INVERSE; cell.bg |= Attributes.CM_P16 | 1; lineData.setCell(0, cell); @@ -291,7 +291,7 @@ describe('DomRendererRowFactory', () => { }); it('should correctly invert default bg color', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg |= Attributes.CM_P16 | 1 | FgFlags.INVERSE; lineData.setCell(0, cell); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); @@ -301,7 +301,7 @@ describe('DomRendererRowFactory', () => { }); it('should turn bold fg text bright', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg |= FgFlags.BOLD | Attributes.CM_P16; for (let i = 0; i < 8; i++) { cell.fg &= ~Attributes.PCOLOR_MASK; @@ -315,7 +315,7 @@ describe('DomRendererRowFactory', () => { }); it('should set style attribute for RBG', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg |= Attributes.CM_RGB | 1 << 16 | 2 << 8 | 3; cell.bg |= Attributes.CM_RGB | 4 << 16 | 5 << 8 | 6; lineData.setCell(0, cell); @@ -326,7 +326,7 @@ describe('DomRendererRowFactory', () => { }); it('should correctly invert RGB colors', () => { - const cell = CellData.fromCharData([0, 'a', 1, 'a'.charCodeAt(0)]); + const cell = createCellData(0, 'a', 1); cell.fg |= Attributes.CM_RGB | 1 << 16 | 2 << 8 | 3 | FgFlags.INVERSE; cell.bg |= Attributes.CM_RGB | 4 << 16 | 5 << 8 | 6; lineData.setCell(0, cell); @@ -339,8 +339,8 @@ describe('DomRendererRowFactory', () => { describe('selectionForeground', () => { it('should force selected cells with content to be rendered above the background', () => { - lineData.setCell(0, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(1, CellData.fromCharData([DEFAULT_ATTR, 'b', 1, 'b'.charCodeAt(0)])); + lineData.setCell(0, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(1, createCellData(DEFAULT_ATTR, 'b', 1)); rowFactory.handleSelectionChanged([1, 0], [2, 0], false); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); assert.equal(extractHtml(spans), @@ -348,7 +348,7 @@ describe('DomRendererRowFactory', () => { ); }); it('should force whitespace cells to be rendered above the background', () => { - lineData.setCell(1, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); + lineData.setCell(1, createCellData(DEFAULT_ATTR, 'a', 1)); rowFactory.handleSelectionChanged([0, 0], [2, 0], false); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); assert.equal(extractHtml(spans), @@ -374,9 +374,9 @@ describe('DomRendererRowFactory', () => { }); it('can merge codepoints for equal spacing', () => { - lineData.setCell(0, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(1, CellData.fromCharData([DEFAULT_ATTR, 'b', 1, 'b'.charCodeAt(0)])); - lineData.setCell(2, CellData.fromCharData([DEFAULT_ATTR, 'c', 1, 'c'.charCodeAt(0)])); + lineData.setCell(0, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(1, createCellData(DEFAULT_ATTR, 'b', 1)); + lineData.setCell(2, createCellData(DEFAULT_ATTR, 'c', 1)); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); assert.equal(extractHtml(spans), 'abc' @@ -385,9 +385,9 @@ describe('DomRendererRowFactory', () => { it('should not merge codepoints with different spacing', () => { widthCache.setWidths({ '€': 2 }); - lineData.setCell(0, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(1, CellData.fromCharData([DEFAULT_ATTR, '€', 1, '€'.charCodeAt(0)])); - lineData.setCell(2, CellData.fromCharData([DEFAULT_ATTR, 'c', 1, 'c'.charCodeAt(0)])); + lineData.setCell(0, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(1, createCellData(DEFAULT_ATTR, '€', 1)); + lineData.setCell(2, createCellData(DEFAULT_ATTR, 'c', 1)); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); assert.equal(extractHtml(spans), 'a€c' @@ -395,9 +395,9 @@ describe('DomRendererRowFactory', () => { }); it('should not merge on FG change', () => { - const aColor1 = CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)]); + const aColor1 = createCellData(DEFAULT_ATTR, 'a', 1); aColor1.fg |= Attributes.CM_P16 | 1; - const bColor2 = CellData.fromCharData([DEFAULT_ATTR, 'b', 1, 'b'.charCodeAt(0)]); + const bColor2 = createCellData(DEFAULT_ATTR, 'b', 1); bColor2.fg |= Attributes.CM_P16 | 2; lineData.setCell(0, aColor1); lineData.setCell(1, aColor1); @@ -410,11 +410,11 @@ describe('DomRendererRowFactory', () => { }); it('should not merge cursor cell', () => { - lineData.setCell(0, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(1, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(2, CellData.fromCharData([DEFAULT_ATTR, 'X', 1, 'X'.charCodeAt(0)])); - lineData.setCell(3, CellData.fromCharData([DEFAULT_ATTR, 'b', 1, 'b'.charCodeAt(0)])); - lineData.setCell(4, CellData.fromCharData([DEFAULT_ATTR, 'b', 1, 'b'.charCodeAt(0)])); + lineData.setCell(0, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(1, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(2, createCellData(DEFAULT_ATTR, 'X', 1)); + lineData.setCell(3, createCellData(DEFAULT_ATTR, 'b', 1)); + lineData.setCell(4, createCellData(DEFAULT_ATTR, 'b', 1)); const spans = rowFactory.createRow(lineData, 0, true, undefined, undefined, 2, false, true, 5, widthCache, -1, -1); assert.equal(extractHtml(spans), 'aaXbb' @@ -453,7 +453,7 @@ describe('DomRendererRowFactory', () => { assert.equal(extractHtml(spans), ' ' ); - lineData.setCell(4, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); + lineData.setCell(4, createCellData(DEFAULT_ATTR, 'a', 1)); spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); assert.equal(extractHtml(spans), ' a' @@ -462,9 +462,9 @@ describe('DomRendererRowFactory', () => { it('should apply correct positive or negative spacing', () => { widthCache.setWidths({ '€': 2, '語': 10, '𝄞': 7 }); // €: too small (+3px), 語: exact, 𝄞: too wide (-2px) - lineData.setCell(0, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(1, CellData.fromCharData([DEFAULT_ATTR, '€', 1, '€'.charCodeAt(0)])); - lineData.setCell(2, CellData.fromCharData([DEFAULT_ATTR, 'c', 1, 'c'.charCodeAt(0)])); + lineData.setCell(0, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(1, createCellData(DEFAULT_ATTR, '€', 1)); + lineData.setCell(2, createCellData(DEFAULT_ATTR, 'c', 1)); lineData.setCell(3, CellData.fromCharData([DEFAULT_ATTR, '語', 2, 'c'.charCodeAt(0)])); lineData.setCell(4, CellData.fromCharData([DEFAULT_ATTR, '𝄞', 1, 'c'.charCodeAt(0)])); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -1, -1); @@ -474,13 +474,13 @@ describe('DomRendererRowFactory', () => { }); it('should not merge across link borders', () => { - lineData.setCell(0, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(1, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(2, CellData.fromCharData([DEFAULT_ATTR, 'x', 1, 'x'.charCodeAt(0)])); - lineData.setCell(3, CellData.fromCharData([DEFAULT_ATTR, 'x', 1, 'x'.charCodeAt(0)])); - lineData.setCell(4, CellData.fromCharData([DEFAULT_ATTR, 'x', 1, 'x'.charCodeAt(0)])); - lineData.setCell(5, CellData.fromCharData([DEFAULT_ATTR, 'b', 1, 'b'.charCodeAt(0)])); - lineData.setCell(6, CellData.fromCharData([DEFAULT_ATTR, 'b', 1, 'b'.charCodeAt(0)])); + lineData.setCell(0, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(1, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(2, createCellData(DEFAULT_ATTR, 'x', 1)); + lineData.setCell(3, createCellData(DEFAULT_ATTR, 'x', 1)); + lineData.setCell(4, createCellData(DEFAULT_ATTR, 'x', 1)); + lineData.setCell(5, createCellData(DEFAULT_ATTR, 'b', 1)); + lineData.setCell(6, createCellData(DEFAULT_ATTR, 'b', 1)); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, 2, 4); assert.equal(extractHtml(spans), 'aaxxxbb' @@ -488,10 +488,10 @@ describe('DomRendererRowFactory', () => { }); it('empty cells included in link underline', () => { - lineData.setCell(0, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(1, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); - lineData.setCell(2, CellData.fromCharData([DEFAULT_ATTR, 'x', 1, 'x'.charCodeAt(0)])); - lineData.setCell(4, CellData.fromCharData([DEFAULT_ATTR, 'x', 1, 'x'.charCodeAt(0)])); + lineData.setCell(0, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(1, createCellData(DEFAULT_ATTR, 'a', 1)); + lineData.setCell(2, createCellData(DEFAULT_ATTR, 'x', 1)); + lineData.setCell(4, createCellData(DEFAULT_ATTR, 'x', 1)); const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, 2, 4); assert.equal(extractHtml(spans), 'aax x' @@ -500,7 +500,7 @@ describe('DomRendererRowFactory', () => { it('link range gets capped to actual line borders', () => { for (let i = 0; i < 10; ++i) { - lineData.setCell(i, CellData.fromCharData([DEFAULT_ATTR, 'a', 1, 'a'.charCodeAt(0)])); + lineData.setCell(i, createCellData(DEFAULT_ATTR, 'a', 1)); } const spans = rowFactory.createRow(lineData, 0, false, undefined, undefined, 0, false, true, 5, widthCache, -100, 100); assert.equal(extractHtml(spans), @@ -519,7 +519,7 @@ describe('DomRendererRowFactory', () => { function createEmptyLineData(cols: number): IBufferLine { const lineData = new BufferLine(cols); for (let i = 0; i < cols; i++) { - lineData.setCell(i, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE])); + lineData.setCell(i, NULL_CELL_DATA); } return lineData; } diff --git a/src/browser/services/CharacterJoinerService.test.ts b/src/browser/services/CharacterJoinerService.test.ts index 6b5326d93..a0ccc67d6 100644 --- a/src/browser/services/CharacterJoinerService.test.ts +++ b/src/browser/services/CharacterJoinerService.test.ts @@ -9,7 +9,7 @@ import { CharacterJoinerService } from 'browser/services/CharacterJoinerService' import { BufferLine } from 'common/buffer/BufferLine'; import { IBufferLine } from 'common/Types'; import { CellData } from 'common/buffer/CellData'; -import { MockBufferService } from 'common/TestUtils.test'; +import { MockBufferService, createCellData } from 'common/TestUtils.test'; describe('CharacterJoinerService', () => { let service: ICharacterJoinerService; @@ -25,17 +25,17 @@ describe('CharacterJoinerService', () => { lines.set(4, new BufferLine(0)); lines.set(5, lineData([['a', 0x11111111], [' -> b -> c -> '], ['d', 0x22222222]])); const line6 = lineData([['wi']]); - line6.resize(line6.length + 1, CellData.fromCharData([0, '¥', 2, '¥'.charCodeAt(0)])); - line6.resize(line6.length + 1, CellData.fromCharData([0, '', 0, 0])); + line6.resize(line6.length + 1, createCellData(0, '¥', 2)); + line6.resize(line6.length + 1, createCellData(0, '', 0)); let sub = lineData([['deemo']]); let oldSize = line6.length; - line6.resize(oldSize + sub.length, CellData.fromCharData([0, '', 0, 0])); + line6.resize(oldSize + sub.length, createCellData(0, '', 0)); for (let i = 0; i < sub.length; ++i) line6.setCell(i + oldSize, sub.loadCell(i, new CellData())); line6.resize(line6.length + 1, CellData.fromCharData([0, '\xf0\x9f\x98\x81', 1, 128513])); - line6.resize(line6.length + 1, CellData.fromCharData([0, ' ', 1, ' '.charCodeAt(0)])); + line6.resize(line6.length + 1, createCellData(0, ' ', 1)); sub = lineData([['jiabc']]); oldSize = line6.length; - line6.resize(oldSize + sub.length, CellData.fromCharData([0, '', 0, 0])); + line6.resize(oldSize + sub.length, createCellData(0, '', 0)); for (let i = 0; i < sub.length; ++i) line6.setCell(i + oldSize, sub.loadCell(i, new CellData())); lines.set(6, line6); @@ -272,8 +272,8 @@ function lineData(data: IPartialLineData[]): IBufferLine { const line = data[i][0]; const attr = (data[i][1] || 0) as number; const offset = tline.length; - tline.resize(tline.length + line.split('').length, CellData.fromCharData([0, '', 0, 0])); - line.split('').map((char, idx) => tline.setCell(idx + offset, CellData.fromCharData([attr, char, 1, char.charCodeAt(0)]))); + tline.resize(tline.length + line.split('').length, createCellData(0, '', 0)); + line.split('').map((char, idx) => tline.setCell(idx + offset, createCellData(attr, char, 1))); } return tline; } diff --git a/src/browser/services/SelectionService.test.ts b/src/browser/services/SelectionService.test.ts index 67158def0..8deedb751 100644 --- a/src/browser/services/SelectionService.test.ts +++ b/src/browser/services/SelectionService.test.ts @@ -7,7 +7,7 @@ import { assert } from 'chai'; import { SelectionService, SelectionMode } from './SelectionService'; import { SelectionModel } from 'browser/selection/SelectionModel'; import { IBufferLine } from 'common/Types'; -import { MockBufferService, MockOptionsService, MockCoreService } from 'common/TestUtils.test'; +import { MockBufferService, MockOptionsService, MockCoreService, createCellData } from 'common/TestUtils.test'; import { BufferLine } from 'common/buffer/BufferLine'; import { IBufferService, IOptionsService } from 'common/services/Services'; import { MockCoreBrowserService, MockMouseService, MockRenderService } from 'browser/TestUtils.test'; @@ -57,14 +57,14 @@ describe('SelectionService', () => { function stringToRow(text: string): IBufferLine { const result = new BufferLine(text.length); for (let i = 0; i < text.length; i++) { - result.setCell(i, CellData.fromCharData([0, text.charAt(i), 1, text.charCodeAt(i)])); + result.setCell(i, createCellData(0, text.charAt(i), 1)); } return result; } function stringArrayToRow(chars: string[]): IBufferLine { const line = new BufferLine(chars.length); - chars.map((c, idx) => line.setCell(idx, CellData.fromCharData([0, c, 1, c.charCodeAt(0)]))); + chars.map((c, idx) => line.setCell(idx, createCellData(0, c, 1))); return line; } diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index 6e6f0b642..0f982b302 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -13,6 +13,14 @@ import { IDecPrivateModes, ICoreMouseEvent, CoreMouseEventType, ICharset, IModes import { UnicodeV6 } from 'common/input/UnicodeV6'; import { IDecorationOptions, IDecoration } from '@xterm/xterm'; import { Emitter, type IEvent } from 'common/Event'; +import { CellData } from 'common/buffer/CellData'; +import { DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH } from 'common/buffer/Constants'; + +export function createCellData(attr: number, char: string, width: number): CellData { + return CellData.fromCharData([attr, char, width, char.length === 0 ? 0 : char.charCodeAt(0)]); +} + +export const NULL_CELL_DATA = Object.freeze(createCellData(DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH)); export class MockBufferService implements IBufferService { public serviceBrand: any; diff --git a/src/common/buffer/Buffer.test.ts b/src/common/buffer/Buffer.test.ts index f9e3e1b14..9c013c5de 100644 --- a/src/common/buffer/Buffer.test.ts +++ b/src/common/buffer/Buffer.test.ts @@ -6,7 +6,7 @@ import { assert } from 'chai'; import { Buffer } from 'common/buffer/Buffer'; import { CircularList } from 'common/CircularList'; -import { MockOptionsService, MockBufferService, MockLogService } from 'common/TestUtils.test'; +import { MockOptionsService, MockBufferService, MockLogService, createCellData } from 'common/TestUtils.test'; import { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { CellData } from 'common/buffer/CellData'; import { ExtendedAttrs } from 'common/buffer/AttributeData'; @@ -1105,10 +1105,10 @@ describe('Buffer', () => { describe ('translateBufferLineToString', () => { it('should handle selecting a section of ascii text', () => { const line = new BufferLine(4); - line.setCell(0, CellData.fromCharData([ 0, 'a', 1, 'a'.charCodeAt(0)])); - line.setCell(1, CellData.fromCharData([ 0, 'b', 1, 'b'.charCodeAt(0)])); - line.setCell(2, CellData.fromCharData([ 0, 'c', 1, 'c'.charCodeAt(0)])); - line.setCell(3, CellData.fromCharData([ 0, 'd', 1, 'd'.charCodeAt(0)])); + line.setCell(0, createCellData(0, 'a', 1)); + line.setCell(1, createCellData(0, 'b', 1)); + line.setCell(2, createCellData(0, 'c', 1)); + line.setCell(3, createCellData(0, 'd', 1)); buffer.lines.set(0, line); const str = buffer.translateBufferLineToString(0, true, 0, 2); @@ -1117,9 +1117,9 @@ describe('Buffer', () => { it('should handle a cut-off double width character by including it', () => { const line = new BufferLine(3); - line.setCell(0, CellData.fromCharData([ 0, '語', 2, 35486 ])); - line.setCell(1, CellData.fromCharData([ 0, '', 0, 0])); - line.setCell(2, CellData.fromCharData([ 0, 'a', 1, 'a'.charCodeAt(0)])); + line.setCell(0, createCellData(0, '語', 2)); + line.setCell(1, createCellData(0, '', 0)); + line.setCell(2, createCellData(0, 'a', 1)); buffer.lines.set(0, line); const str1 = buffer.translateBufferLineToString(0, true, 0, 1); @@ -1128,9 +1128,9 @@ describe('Buffer', () => { it('should handle a zero width character in the middle of the string by not including it', () => { const line = new BufferLine(3); - line.setCell(0, CellData.fromCharData([ 0, '語', 2, '語'.charCodeAt(0) ])); - line.setCell(1, CellData.fromCharData([ 0, '', 0, 0])); - line.setCell(2, CellData.fromCharData([ 0, 'a', 1, 'a'.charCodeAt(0)])); + line.setCell(0, createCellData(0, '語', 2)); + line.setCell(1, createCellData(0, '', 0)); + line.setCell(2, createCellData(0, 'a', 1)); buffer.lines.set(0, line); const str0 = buffer.translateBufferLineToString(0, true, 0, 1); @@ -1145,8 +1145,8 @@ describe('Buffer', () => { it('should handle single width emojis', () => { const line = new BufferLine(2); - line.setCell(0, CellData.fromCharData([ 0, '😁', 1, '😁'.charCodeAt(0) ])); - line.setCell(1, CellData.fromCharData([ 0, 'a', 1, 'a'.charCodeAt(0)])); + line.setCell(0, createCellData(0, '😁', 1)); + line.setCell(1, createCellData(0, 'a', 1)); buffer.lines.set(0, line); const str1 = buffer.translateBufferLineToString(0, true, 0, 1); @@ -1158,8 +1158,8 @@ describe('Buffer', () => { it('should handle double width emojis', () => { const line = new BufferLine(2); - line.setCell(0, CellData.fromCharData([ 0, '😁', 2, '😁'.charCodeAt(0) ])); - line.setCell(1, CellData.fromCharData([ 0, '', 0, 0])); + line.setCell(0, createCellData(0, '😁', 2)); + line.setCell(1, createCellData(0, '', 0)); buffer.lines.set(0, line); const str1 = buffer.translateBufferLineToString(0, true, 0, 1); @@ -1169,9 +1169,9 @@ describe('Buffer', () => { assert.equal(str2, '😁'); const line2 = new BufferLine(3); - line2.setCell(0, CellData.fromCharData([ 0, '😁', 2, '😁'.charCodeAt(0) ])); - line2.setCell(1, CellData.fromCharData([ 0, '', 0, 0])); - line2.setCell(2, CellData.fromCharData([ 0, 'a', 1, 'a'.charCodeAt(0)])); + line2.setCell(0, createCellData(0, '😁', 2)); + line2.setCell(1, createCellData(0, '', 0)); + line2.setCell(2, createCellData(0, 'a', 1)); buffer.lines.set(0, line2); const str3 = buffer.translateBufferLineToString(0, true, 0, 3); diff --git a/src/common/buffer/BufferLine.test.ts b/src/common/buffer/BufferLine.test.ts index eaceaa45f..100b730d9 100644 --- a/src/common/buffer/BufferLine.test.ts +++ b/src/common/buffer/BufferLine.test.ts @@ -8,6 +8,7 @@ import { CellData } from 'common/buffer/CellData'; import { CharData, IBufferLine } from '../Types'; import { assert } from 'chai'; import { AttributeData } from 'common/buffer/AttributeData'; +import { createCellData, NULL_CELL_DATA } from 'common/TestUtils.test'; class TestBufferLine extends BufferLine { @@ -24,12 +25,6 @@ class TestBufferLine extends BufferLine { } } -function createCellData(attr: number, char: string, width: number): CellData { - return CellData.fromCharData([attr, char, width, char.length === 0 ? 0 : char.charCodeAt(0)]); -} - -const NULL_CELL_DATA = Object.freeze(createCellData(DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH)); - describe('AttributeData', () => { describe('extended attributes', () => { it('hasExtendedAttrs', () => { From f155c65e5aca2f3762d20d7e58ce463e1845ddfd Mon Sep 17 00:00:00 2001 From: Serge Date: Thu, 19 Feb 2026 12:12:57 +0100 Subject: [PATCH 104/124] work around Safari sending keycode 13 (enter) when typing ctrl-c on iphone, iPad, AppleVisionPro --- src/common/input/Keyboard.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index 320854677..79a0ed07c 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -99,7 +99,12 @@ export function evaluateKeyboardEvent( break; case 13: // return/enter - result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR; + if (ev.key == 'c' && ev.ctrlKey) { + // Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware keyboard + result.key = C0.ETX; + } else { + result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR; + } result.cancel = true; break; case 27: From 87bf81cf96fc86de6c6ef77ae49b8a376f524c94 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:44:02 +0900 Subject: [PATCH 105/124] Call out hack, fix lint --- src/common/input/Keyboard.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index 79a0ed07c..545b436c8 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -99,8 +99,9 @@ export function evaluateKeyboardEvent( break; case 13: // return/enter - if (ev.key == 'c' && ev.ctrlKey) { - // Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware keyboard + if (ev.key === 'c' && ev.ctrlKey) { + // HACK: Safari on iPad, iOS, AppleVisionPro sends key 13 when typing ctrl-c on hardware + // keyboard result.key = C0.ETX; } else { result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR; From 55281022a0a54e46db1727ef62bdb769ae899b7e Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Mon, 9 Mar 2026 14:32:38 -0700 Subject: [PATCH 106/124] Fix IME composition text overflowing terminal --- src/browser/input/CompositionHelper.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/browser/input/CompositionHelper.ts b/src/browser/input/CompositionHelper.ts index b4b03a842..d170eae3b 100644 --- a/src/browser/input/CompositionHelper.ts +++ b/src/browser/input/CompositionHelper.ts @@ -239,6 +239,12 @@ export class CompositionHelper { this._compositionView.style.lineHeight = cellHeight + 'px'; this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily; this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px'; + // Limit the composition view width to the space between the cursor and + // the terminal's right edge, preventing it from overflowing the terminal. + const maxWidth = this._bufferService.cols * this._renderService.dimensions.css.cell.width - cursorLeft; + this._compositionView.style.maxWidth = maxWidth + 'px'; + this._compositionView.style.overflow = 'hidden'; + this._compositionView.style.direction = 'rtl'; // Sync the textarea to the exact position of the composition view so the IME knows where the // text is. const compositionViewBounds = this._compositionView.getBoundingClientRect(); From 8d6ff3a27bb86b4507fe75dc0d952f1e5a040bad Mon Sep 17 00:00:00 2001 From: Per Bothner Date: Mon, 9 Mar 2026 18:19:04 -0700 Subject: [PATCH 107/124] Fix testsuite access to internal _extendedAttrs --- src/common/buffer/BufferLine.test.ts | 84 +++++++++++++++------------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/src/common/buffer/BufferLine.test.ts b/src/common/buffer/BufferLine.test.ts index 100b730d9..b1c554781 100644 --- a/src/common/buffer/BufferLine.test.ts +++ b/src/common/buffer/BufferLine.test.ts @@ -5,7 +5,7 @@ import { NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE, DEFAULT_ATTR, Content, UnderlineStyle, BgFlags, Attributes, FgFlags } from 'common/buffer/Constants'; import { BufferLine } from 'common/buffer//BufferLine'; import { CellData } from 'common/buffer/CellData'; -import { CharData, IBufferLine } from '../Types'; +import { CharData, IBufferLine, IExtendedAttrs } from '../Types'; import { assert } from 'chai'; import { AttributeData } from 'common/buffer/AttributeData'; import { createCellData, NULL_CELL_DATA } from 'common/TestUtils.test'; @@ -25,6 +25,12 @@ class TestBufferLine extends BufferLine { } } +function extendedAttributes(line: IBufferLine, index: number): IExtendedAttrs | undefined { + const cell = new CellData(); + line.loadCell(index, cell); + return cell.hasExtendedAttrs() !== 0 ? cell.extended : undefined; +} + describe('AttributeData', () => { describe('extended attributes', () => { it('hasExtendedAttrs', () => { @@ -632,15 +638,15 @@ describe('BufferLine', function(): void { [1, 'A', 1, 'A'.charCodeAt(0)], [1, 'A', 1, 'A'.charCodeAt(0)] ]); - assert.equal((line as any)._extendedAttrs[0], undefined); - assert.equal((line as any)._extendedAttrs[1].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[2].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[3].underlineStyle, UnderlineStyle.DOTTED); - assert.equal((line as any)._extendedAttrs[4], undefined); + assert.equal(extendedAttributes(line, 0), undefined); + assert.equal(extendedAttributes(line, 1)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 2)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 3)?.underlineStyle, UnderlineStyle.DOTTED); + assert.equal(extendedAttributes(line, 4)?.underlineStyle, undefined); // should be ref to the same object - assert.equal((line as any)._extendedAttrs[1], (line as any)._extendedAttrs[2]); + assert.equal(extendedAttributes(line, 1), extendedAttributes(line, 2)); // should be a different obj - assert.notEqual((line as any)._extendedAttrs[1], (line as any)._extendedAttrs[3]); + assert.notEqual(extendedAttributes(line, 1), extendedAttributes(line, 3)); }); it('loadCell', () => { const line = new TestBufferLine(5); @@ -691,9 +697,9 @@ describe('BufferLine', function(): void { cell.extended.underlineStyle = UnderlineStyle.CURLY; cell.bg |= BgFlags.HAS_EXTENDED; line.fill(cell); - assert.equal((line as any)._extendedAttrs[0].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[1].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[2].underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 0)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 1)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 2)?.underlineStyle, UnderlineStyle.CURLY); }); it('insertCells', () => { const line = new TestBufferLine(5); @@ -701,17 +707,17 @@ describe('BufferLine', function(): void { cell.extended.underlineStyle = UnderlineStyle.CURLY; cell.bg |= BgFlags.HAS_EXTENDED; line.insertCells(1, 3, cell); - assert.equal((line as any)._extendedAttrs[1].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[2].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[3].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[4], undefined); + assert.equal(extendedAttributes(line, 1)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 2)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 3)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 4), undefined); cell.extended = cell.extended.clone(); cell.extended.underlineStyle = UnderlineStyle.DOTTED; line.insertCells(2, 2, cell); - assert.equal((line as any)._extendedAttrs[1].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[2].underlineStyle, UnderlineStyle.DOTTED); - assert.equal((line as any)._extendedAttrs[3].underlineStyle, UnderlineStyle.DOTTED); - assert.equal((line as any)._extendedAttrs[4].underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 1)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 2)?.underlineStyle, UnderlineStyle.DOTTED); + assert.equal(extendedAttributes(line, 3)?.underlineStyle, UnderlineStyle.DOTTED); + assert.equal(extendedAttributes(line, 4)?.underlineStyle, UnderlineStyle.CURLY); }); it('deleteCells', () => { const line = new TestBufferLine(5); @@ -722,11 +728,11 @@ describe('BufferLine', function(): void { fillCell.extended = fillCell.extended.clone(); fillCell.extended.underlineStyle = UnderlineStyle.DOUBLE; line.deleteCells(1, 3, fillCell); - assert.equal((line as any)._extendedAttrs[0].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[1].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[2].underlineStyle, UnderlineStyle.DOUBLE); - assert.equal((line as any)._extendedAttrs[3].underlineStyle, UnderlineStyle.DOUBLE); - assert.equal((line as any)._extendedAttrs[4].underlineStyle, UnderlineStyle.DOUBLE); + assert.equal(extendedAttributes(line, 0)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 1)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 2)?.underlineStyle, UnderlineStyle.DOUBLE); + assert.equal(extendedAttributes(line, 3)?.underlineStyle, UnderlineStyle.DOUBLE); + assert.equal(extendedAttributes(line, 4)?.underlineStyle, UnderlineStyle.DOUBLE); }); it('replaceCells', () => { const line = new TestBufferLine(5); @@ -737,11 +743,11 @@ describe('BufferLine', function(): void { fillCell.extended = fillCell.extended.clone(); fillCell.extended.underlineStyle = UnderlineStyle.DOUBLE; line.replaceCells(1, 3, fillCell); - assert.equal((line as any)._extendedAttrs[0].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[1].underlineStyle, UnderlineStyle.DOUBLE); - assert.equal((line as any)._extendedAttrs[2].underlineStyle, UnderlineStyle.DOUBLE); - assert.equal((line as any)._extendedAttrs[3].underlineStyle, UnderlineStyle.CURLY); - assert.equal((line as any)._extendedAttrs[4].underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 0)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 1)?.underlineStyle, UnderlineStyle.DOUBLE); + assert.equal(extendedAttributes(line, 2)?.underlineStyle, UnderlineStyle.DOUBLE); + assert.equal(extendedAttributes(line, 3)?.underlineStyle, UnderlineStyle.CURLY); + assert.equal(extendedAttributes(line, 4)?.underlineStyle, UnderlineStyle.CURLY); }); it('clone', () => { const line = new TestBufferLine(5); @@ -768,11 +774,11 @@ describe('BufferLine', function(): void { line.setCell(4, cell); const nLine = line.clone(); - assert.equal((nLine as any)._extendedAttrs[0], (line as any)._extendedAttrs[0]); - assert.equal((nLine as any)._extendedAttrs[1], (line as any)._extendedAttrs[1]); - assert.equal((nLine as any)._extendedAttrs[2], (line as any)._extendedAttrs[2]); - assert.equal((nLine as any)._extendedAttrs[3], (line as any)._extendedAttrs[3]); - assert.equal((nLine as any)._extendedAttrs[4], (line as any)._extendedAttrs[4]); + assert.equal(extendedAttributes(nLine, 0), extendedAttributes(line, 0)); + assert.equal(extendedAttributes(nLine, 1), extendedAttributes(line, 1)); + assert.equal(extendedAttributes(nLine, 2), extendedAttributes(line, 2)); + assert.equal(extendedAttributes(nLine, 3), extendedAttributes(line, 3)); + assert.equal(extendedAttributes(nLine, 4), extendedAttributes(line, 4)); }); it('copyFrom', () => { const initial = new TestBufferLine(5); @@ -801,11 +807,11 @@ describe('BufferLine', function(): void { const line = new TestBufferLine(5); line.fill(createCellData(1, 'b', 1)); line.copyFrom(initial); - assert.equal((line as any)._extendedAttrs[0], (initial as any)._extendedAttrs[0]); - assert.equal((line as any)._extendedAttrs[1], (initial as any)._extendedAttrs[1]); - assert.equal((line as any)._extendedAttrs[2], (initial as any)._extendedAttrs[2]); - assert.equal((line as any)._extendedAttrs[3], (initial as any)._extendedAttrs[3]); - assert.equal((line as any)._extendedAttrs[4], (initial as any)._extendedAttrs[4]); + assert.equal(extendedAttributes(line, 0), extendedAttributes(initial, 0)); + assert.equal(extendedAttributes(line, 1), extendedAttributes(initial, 1)); + assert.equal(extendedAttributes(line, 2), extendedAttributes(initial, 2)); + assert.equal(extendedAttributes(line, 3), extendedAttributes(initial, 3)); + assert.equal(extendedAttributes(line, 4), extendedAttributes(initial, 4)); }); }); }); From 47235f47fecf2a215c45c277ea06ef5a97432f88 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 10 Mar 2026 10:55:57 +0900 Subject: [PATCH 108/124] Build out getting started section Fixes #5725 --- README.md | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index ab8698f82..e41133597 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,39 @@ First, you need to install the module. We ship exclusively through [npm](https:/ npm install --save @xterm/xterm ``` -To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to the head of your HTML page. Then create a `
` onto which xterm can attach itself. Finally, instantiate the `Terminal` object and then call the `open` function with the DOM object of the `div`. +The recommended way to load xterm.js with the ES module syntax, either using TypeScript or a modern JS tooling. + +```javascript +import { Terminal } from '@xterm/xterm'; +``` + +> ![TIP] +> xterm.js ships both a CommonJS (`main` in package.json) and ES module files (`module` in package.json). + +Then instantiate a `Terminal` object, open it on an element and write to it: + +```javascript +const term = new Terminal(); +term.open(document.getElementById('terminal')); +term.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ') +``` + +Most use cases will hook up input and output to a pseudoterminal API such as [node-pty](https://www.npmjs.com/package/node-pty) which will drive the terminal. + +```javascript +pty.onData(data => term.write(data)); +term.onData(data => pty.write(data)); +``` + +Then make sure to also include the `css/xterm.css` file, for example in HTML: + +```html + +``` + +### Standalone example + +Here is a complete standalone example in a HTML file: ```html @@ -36,7 +68,7 @@ To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to t
@@ -44,14 +76,6 @@ To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to t ``` -### Importing - -The recommended way to load xterm.js is via the ES6 module syntax: - -```javascript -import { Terminal } from '@xterm/xterm'; -``` - ### Addons Addons are separate modules that extend the `Terminal` by building on the [xterm.js API](https://github.com/xtermjs/xterm.js/blob/master/typings/xterm.d.ts). To use an addon, you first need to install it in your project: From ec6ad20e335b7587d72edfe9895d537b4d329dfd Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 10 Mar 2026 11:04:09 +0900 Subject: [PATCH 109/124] Clean up note about cjs --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index e41133597..a6fecc191 100644 --- a/README.md +++ b/README.md @@ -24,15 +24,12 @@ First, you need to install the module. We ship exclusively through [npm](https:/ npm install --save @xterm/xterm ``` -The recommended way to load xterm.js with the ES module syntax, either using TypeScript or a modern JS tooling. +The recommended way to load xterm.js with the ES module syntax, either using TypeScript or a modern JS tooling. Note that both CommonJS and ES module files are shipped with the npm package. ```javascript import { Terminal } from '@xterm/xterm'; ``` -> ![TIP] -> xterm.js ships both a CommonJS (`main` in package.json) and ES module files (`module` in package.json). - Then instantiate a `Terminal` object, open it on an element and write to it: ```javascript From fdb7346f3a15c5a5e0df32367fd1ffd455549e26 Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 10 Mar 2026 00:27:27 -0700 Subject: [PATCH 110/124] Fix kitty keyboard disambiguate mode for space, enter, tab, backspace --- src/common/input/KittyKeyboard.test.ts | 31 +++++++++++++++++++------- src/common/input/KittyKeyboard.ts | 13 +++++++---- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/common/input/KittyKeyboard.test.ts b/src/common/input/KittyKeyboard.test.ts index e495ac591..a0422ecb1 100644 --- a/src/common/input/KittyKeyboard.test.ts +++ b/src/common/input/KittyKeyboard.test.ts @@ -100,24 +100,24 @@ describe('KittyKeyboard', () => { assert.strictEqual(result.key, '\x1b[27u'); }); - it('Enter → CSI 13 u', () => { + it('Enter → legacy \\r', () => { const result = kitty.evaluate(createEvent({ key: 'Enter' }), flags); - assert.strictEqual(result.key, '\x1b[13u'); + assert.strictEqual(result.key, '\r'); }); - it('Tab → CSI 9 u', () => { + it('Tab → legacy \\t', () => { const result = kitty.evaluate(createEvent({ key: 'Tab' }), flags); - assert.strictEqual(result.key, '\x1b[9u'); + assert.strictEqual(result.key, '\t'); }); - it('Backspace → CSI 127 u', () => { + it('Backspace → legacy \\x7f', () => { const result = kitty.evaluate(createEvent({ key: 'Backspace' }), flags); - assert.strictEqual(result.key, '\x1b[127u'); + assert.strictEqual(result.key, '\x7f'); }); - it('Space → CSI 32 u', () => { + it('Space → plain space (text-generating key)', () => { const result = kitty.evaluate(createEvent({ key: ' ' }), flags); - assert.strictEqual(result.key, '\x1b[32u'); + assert.strictEqual(result.key, ' '); }); it('Shift+Tab → CSI 9;2 u', () => { @@ -134,6 +134,21 @@ describe('KittyKeyboard', () => { const result = kitty.evaluate(createEvent({ key: 'Escape', altKey: true }), flags); assert.strictEqual(result.key, '\x1b[27;3u'); }); + + it('Ctrl+Backspace → CSI 127;5 u', () => { + const result = kitty.evaluate(createEvent({ key: 'Backspace', ctrlKey: true }), flags); + assert.strictEqual(result.key, '\x1b[127;5u'); + }); + + it('Ctrl+Space → CSI 32;5 u', () => { + const result = kitty.evaluate(createEvent({ key: ' ', ctrlKey: true }), flags); + assert.strictEqual(result.key, '\x1b[32;5u'); + }); + + it('Alt+Space → CSI 32;3 u', () => { + const result = kitty.evaluate(createEvent({ key: ' ', altKey: true }), flags); + assert.strictEqual(result.key, '\x1b[32;3u'); + }); }); describe('navigation keys', () => { diff --git a/src/common/input/KittyKeyboard.ts b/src/common/input/KittyKeyboard.ts index b296695c5..606b121c3 100644 --- a/src/common/input/KittyKeyboard.ts +++ b/src/common/input/KittyKeyboard.ts @@ -457,9 +457,11 @@ export class KittyKeyboard { } else if (reportEventTypes) { useCsiU = true; } else if (flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES) { - if (keyCode === 27 || keyCode === 127 || keyCode === 13 || keyCode === 9 || keyCode === 32) { - useCsiU = true; - } else if (isFunc) { + // Per spec, Enter/Tab/Backspace "still generate the same bytes as in legacy + // mode" and Space is a text-generating key, so these skip the isFunc fast-path + // and only get CSI u when modifiers are present (handled below). + const isDisambiguateLegacy = keyCode === 13 || keyCode === 9 || keyCode === 127; + if (isFunc && !isDisambiguateLegacy) { useCsiU = true; } else if (modifiers > 0) { if (ev.shiftKey && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.key.length === 1) { @@ -474,7 +476,10 @@ export class KittyKeyboard { result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod); result.cancel = true; } else { - if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) { + const legacyByte = keyCode === 13 ? '\r' : keyCode === 9 ? '\t' : keyCode === 127 ? '\x7f' : undefined; + if (legacyByte) { + result.key = legacyByte; + } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) { result.key = ev.key; } } From 6f3ce7b0febf2de350174ffd5e9bd4fe75e13acc Mon Sep 17 00:00:00 2001 From: Anthony Kim Date: Tue, 10 Mar 2026 00:30:29 -0700 Subject: [PATCH 111/124] comment --- src/common/input/KittyKeyboard.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/input/KittyKeyboard.ts b/src/common/input/KittyKeyboard.ts index 606b121c3..76c468cc4 100644 --- a/src/common/input/KittyKeyboard.ts +++ b/src/common/input/KittyKeyboard.ts @@ -458,7 +458,7 @@ export class KittyKeyboard { useCsiU = true; } else if (flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES) { // Per spec, Enter/Tab/Backspace "still generate the same bytes as in legacy - // mode" and Space is a text-generating key, so these skip the isFunc fast-path + // mode" and consider space to be a text-generating key, so these skip the isFunc fast-path // and only get CSI u when modifiers are present (handled below). const isDisambiguateLegacy = keyCode === 13 || keyCode === 9 || keyCode === 127; if (isFunc && !isDisambiguateLegacy) { From 4f3a7331bd4d0d5da7c05dd90a866ba9041779de Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 10 Mar 2026 12:33:07 +0900 Subject: [PATCH 112/124] Fix error in loadTestLongLines Fixes #5750 --- demo/client/components/window/testWindow.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/demo/client/components/window/testWindow.ts b/demo/client/components/window/testWindow.ts index a67fef16c..1ea6b3e67 100644 --- a/demo/client/components/window/testWindow.ts +++ b/demo/client/components/window/testWindow.ts @@ -705,13 +705,13 @@ function loadTest(term: Terminal, addons: AddonCollection): void { term.write('', () => { const time = Math.round(performance.now() - start); const mbs = ((byteCount / 1024) * (1 / (time / 1000))).toFixed(2); - term.write(`\n\r\nWrote ${byteCount}kB in ${time}ms (${mbs}MB/s) using the (${rendererName} renderer)`); + term.write(`\n\r\nWrote ${byteCount}KiB in ${time}ms (${mbs}MiB/s) using the (${rendererName} renderer)`); // Send ^C to get a new prompt (term as any)._core._onData.fire('\x03'); }); } -function loadTestLongLines(term: Terminal, addons: AddonCollection): void { +async function loadTestLongLines(term: Terminal, addons: AddonCollection): Promise { const rendererName = addons.webgl.instance ? 'webgl' : 'dom'; const testData = []; let byteCount = 0; @@ -729,16 +729,23 @@ function loadTestLongLines(term: Terminal, addons: AddonCollection): void { testData.push(data); } const start = performance.now(); - for (let i = 0; i < 1024 * 50; i++) { + for (let i = 0; i < 1024; i++) { for (const d of testData) { - term.write(d); + try { + term.write(d); + } catch { + // Flush events when cap is hit and try again(workaround for not having flow control in + // demo) + await new Promise(r => term.write('', () => r())); + term.write(d); + } } } // Wait for all data to be parsed before evaluating time term.write('', () => { const time = Math.round(performance.now() - start); const mbs = ((byteCount / 1024) * (1 / (time / 1000))).toFixed(2); - term.write(`\n\r\nWrote ${byteCount}kB in ${time}ms (${mbs}MB/s) using the (${rendererName} renderer)`); + term.write(`\n\r\nWrote ${byteCount}KiB in ${time}ms (${mbs}MiB/s) using the (${rendererName} renderer)`); // Send ^C to get a new prompt (term as any)._core._onData.fire('\x03'); }); From 1fc8a4687d5d4a568e463fadab1caa608f268e79 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 09:36:05 +0900 Subject: [PATCH 113/124] Suppress scrollbar warning in demo --- demo/client/components/window/optionsWindow.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/demo/client/components/window/optionsWindow.ts b/demo/client/components/window/optionsWindow.ts index c24fb2688..18ab9254d 100644 --- a/demo/client/components/window/optionsWindow.ts +++ b/demo/client/components/window/optionsWindow.ts @@ -116,6 +116,7 @@ export class OptionsWindow extends BaseWindow implements IControlWindow { 'linkHandler', 'logger', 'quirks', + 'scrollbar', 'theme', 'vtExtensions', 'windowOptions', From 649ce22081ecc35774c5b0b0e6680ceeb7810022 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:10:13 +0900 Subject: [PATCH 114/124] Move bindMouse into MouseService Fixes #5754 --- src/browser/CoreBrowserTerminal.ts | 287 +----------------------- src/browser/TestUtils.test.ts | 4 + src/browser/services/MouseService.ts | 314 ++++++++++++++++++++++++++- src/browser/services/Services.ts | 9 +- 4 files changed, 333 insertions(+), 281 deletions(-) diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index 8ad8409f4..207e469d3 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -45,7 +45,7 @@ import { KeyboardService } from 'browser/services/KeyboardService'; import { channels, color, rgb } from 'common/Color'; import { CoreTerminal } from 'common/CoreTerminal'; import * as Browser from 'common/Platform'; -import { ColorRequestType, CoreMouseAction, CoreMouseButton, CoreMouseEventType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from 'common/Types'; +import { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from 'common/Types'; import { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { IBuffer } from 'common/buffer/Types'; import { C0, C1ESCAPED } from 'common/data/EscapeSequences'; @@ -543,9 +543,6 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView); this._helperContainer.appendChild(this._compositionView); - this._mouseService = this._instantiationService.createInstance(MouseService); - this._instantiationService.setService(IMouseService, this._mouseService); - const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement)); // Performance: Add viewport and helper elements from the fragment @@ -579,6 +576,9 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { linkifier )); this._instantiationService.setService(ISelectionService, this._selectionService); + this._mouseService = this._instantiationService.createInstance(MouseService); + this._mouseService.setCustomWheelEventHandler(this._customWheelEventHandler); + this._instantiationService.setService(IMouseService, this._mouseService); this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent))); this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire())); this._register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode))); @@ -638,285 +638,17 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { // Listen for mouse events and translate // them into terminal mouse protocols. - this.bindMouse(); + this._mouseService!.bindMouse({ + element: this.element!, + screenElement: this.screenElement!, + document: this._document! + }, disposable => this._register(disposable), () => this.focus()); } private _createRenderer(): IRenderer { return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier!); } - /** - * Bind certain mouse events to the terminal. - * By default only 3 button + wheel up/down is ativated. For higher buttons - * no mouse report will be created. Typically the standard actions will be active. - * - * There are several reasons not to enable support for higher buttons/wheel: - * - Button 4 and 5 are typically used for history back and forward navigation, - * there is no straight forward way to supress/intercept those standard actions. - * - Support for higher buttons does not work in some platform/browser combinations. - * - Left/right wheel was not tested. - * - Emulators vary in mouse button support, typically only 3 buttons and - * wheel up/down work reliable. - * - * TODO: Move mouse event code into its own file. - */ - public bindMouse(): void { - const self = this; - const el = this.element!; - - // send event to CoreMouseService - function sendEvent(ev: MouseEvent | WheelEvent): boolean { - // Get mouse coordinates - const pos = self._mouseService?.getMouseReportCoords(ev, self.screenElement!); - if (!pos) { - return false; - } - - let but: CoreMouseButton; - let action: CoreMouseAction | undefined; - switch ((ev as any).overrideType || ev.type) { - case 'mousemove': - action = CoreMouseAction.MOVE; - if (ev.buttons === undefined) { - // buttons is not supported on macOS, try to get a value from button instead - but = CoreMouseButton.NONE; - if (ev.button !== undefined) { - but = ev.button < 3 ? ev.button : CoreMouseButton.NONE; - } - } else { - // according to MDN buttons only reports up to button 5 (AUX2) - but = ev.buttons & 1 ? CoreMouseButton.LEFT : - ev.buttons & 4 ? CoreMouseButton.MIDDLE : - ev.buttons & 2 ? CoreMouseButton.RIGHT : - CoreMouseButton.NONE; // fallback to NONE - } - break; - case 'mouseup': - action = CoreMouseAction.UP; - but = ev.button < 3 ? ev.button : CoreMouseButton.NONE; - break; - case 'mousedown': - action = CoreMouseAction.DOWN; - but = ev.button < 3 ? ev.button : CoreMouseButton.NONE; - break; - case 'wheel': - if (self._customWheelEventHandler && self._customWheelEventHandler(ev as WheelEvent) === false) { - return false; - } - const deltaY = (ev as WheelEvent).deltaY; - if (deltaY === 0) { - return false; - } - const lines = self.coreMouseService.consumeWheelEvent( - ev as WheelEvent, - self._renderService?.dimensions?.device?.cell?.height, - self._coreBrowserService?.dpr - ); - if (lines === 0) { - return false; - } - action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN; - but = CoreMouseButton.WHEEL; - break; - default: - // dont handle other event types by accident - return false; - } - - // exit if we cannot determine valid button/action values - // do nothing for higher buttons than wheel - if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) { - return false; - } - - return self.coreMouseService.triggerMouseEvent({ - col: pos.col, - row: pos.row, - x: pos.x, - y: pos.y, - button: but, - action, - ctrl: ev.ctrlKey, - alt: ev.altKey, - shift: ev.shiftKey - }); - } - - /** - * Event listener state handling. - * We listen to the onProtocolChange event of CoreMouseService and put - * requested listeners in `requestedEvents`. With this the listeners - * have all bits to do the event listener juggling. - * Note: 'mousedown' currently is "always on" and not managed - * by onProtocolChange. - */ - const requestedEvents: { [key: string]: ((ev: MouseEvent | WheelEvent) => void) | null } = { - mouseup: null, - wheel: null, - mousedrag: null, - mousemove: null - }; - const eventListeners: { [key: string]: (ev: any) => void | boolean } = { - mouseup: (ev: MouseEvent) => { - sendEvent(ev); - if (!ev.buttons) { - // if no other button is held remove global handlers - this._document!.removeEventListener('mouseup', requestedEvents.mouseup!); - if (requestedEvents.mousedrag) { - this._document!.removeEventListener('mousemove', requestedEvents.mousedrag); - } - } - }, - wheel: (ev: WheelEvent) => { - sendEvent(ev); - ev.preventDefault(); - ev.stopPropagation(); - return false; - }, - mousedrag: (ev: MouseEvent) => { - // deal only with move while a button is held - if (ev.buttons) { - sendEvent(ev); - } - }, - mousemove: (ev: MouseEvent) => { - // deal only with move without any button - if (!ev.buttons) { - sendEvent(ev); - } - } - }; - this._register(this.coreMouseService.onProtocolChange(events => { - // apply global changes on events - if (events) { - if (this.optionsService.rawOptions.logLevel === 'debug') { - this._logService.debug('Binding to mouse events:', this.coreMouseService.explainEvents(events)); - } - this.element!.classList.add('enable-mouse-events'); - this._selectionService!.disable(); - } else { - this._logService.debug('Unbinding from mouse events.'); - this.element!.classList.remove('enable-mouse-events'); - this._selectionService!.enable(); - } - - // add/remove handlers from requestedEvents - - if (!(events & CoreMouseEventType.MOVE)) { - el.removeEventListener('mousemove', requestedEvents.mousemove!); - requestedEvents.mousemove = null; - } else if (!requestedEvents.mousemove) { - el.addEventListener('mousemove', eventListeners.mousemove); - requestedEvents.mousemove = eventListeners.mousemove; - } - - if (!(events & CoreMouseEventType.WHEEL)) { - el.removeEventListener('wheel', requestedEvents.wheel!); - requestedEvents.wheel = null; - } else if (!requestedEvents.wheel) { - el.addEventListener('wheel', eventListeners.wheel, { passive: false }); - requestedEvents.wheel = eventListeners.wheel; - } - - if (!(events & CoreMouseEventType.UP)) { - this._document!.removeEventListener('mouseup', requestedEvents.mouseup!); - requestedEvents.mouseup = null; - } else { - requestedEvents.mouseup ??= eventListeners.mouseup; - } - - if (!(events & CoreMouseEventType.DRAG)) { - this._document!.removeEventListener('mousemove', requestedEvents.mousedrag!); - requestedEvents.mousedrag = null; - } else { - requestedEvents.mousedrag ??= eventListeners.mousedrag; - } - })); - // force initial onProtocolChange so we dont miss early mouse requests - this.coreMouseService.activeProtocol = this.coreMouseService.activeProtocol; - - // Ensure document-level listeners are removed on dispose - this._register(toDisposable(() => { - if (requestedEvents.mouseup) { - this._document!.removeEventListener('mouseup', requestedEvents.mouseup); - } - if (requestedEvents.mousedrag) { - this._document!.removeEventListener('mousemove', requestedEvents.mousedrag); - } - })); - - /** - * "Always on" event listeners. - */ - this._register(addDisposableListener(el, 'mousedown', (ev: MouseEvent) => { - ev.preventDefault(); - this.focus(); - - // Don't send the mouse button to the pty if mouse events are disabled or - // if the selection manager is having selection forced (ie. a modifier is - // held). - if (!this.coreMouseService.areMouseEventsActive || this._selectionService!.shouldForceSelection(ev)) { - return; - } - - sendEvent(ev); - - // Register additional global handlers which should keep reporting outside - // of the terminal element. - // Note: Other emulators also do this for 'mousedown' while a button - // is held, we currently limit 'mousedown' to the terminal only. - if (requestedEvents.mouseup) { - this._document!.addEventListener('mouseup', requestedEvents.mouseup); - } - if (requestedEvents.mousedrag) { - this._document!.addEventListener('mousemove', requestedEvents.mousedrag); - } - })); - - this._register(addDisposableListener(el, 'wheel', (ev: WheelEvent) => { - // do nothing, if app side handles wheel itself - if (requestedEvents.wheel) return; - - if (this._customWheelEventHandler && this._customWheelEventHandler(ev) === false) { - return false; - } - - if (!this.buffer.hasScrollback) { - // Convert wheel events into up/down events when the buffer does not have scrollback, this - // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse - // events are not enabled. - // This used implementation used get the actual lines/partial lines scrolled from the - // viewport but since moving to the new viewport implementation has been simplified to - // simply send a single up or down sequence. - - // Do nothing if there's no vertical scroll - const deltaY = (ev as WheelEvent).deltaY; - if (deltaY === 0) { - return false; - } - - const lines = self.coreMouseService.consumeWheelEvent( - ev as WheelEvent, - self._renderService?.dimensions?.device?.cell?.height, - self._coreBrowserService?.dpr - ); - if (lines === 0) { - ev.preventDefault(); - ev.stopPropagation(); - return false; - } - - // Construct and send sequences - const sequence = C0.ESC + (this.coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B'); - this.coreService.triggerDataEvent(sequence, true); - ev.preventDefault(); - ev.stopPropagation(); - return false; - } - }, { passive: false })); - } - - /** * Tells the renderer to refresh terminal content between two rows (inclusive) at the next * opportunity. @@ -991,6 +723,7 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void { this._customWheelEventHandler = customWheelEventHandler; + this._mouseService?.setCustomWheelEventHandler(customWheelEventHandler); } public registerLinkProvider(linkProvider: ILinkProvider): IDisposable { diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index c46ee0fb7..a9acf889d 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -392,6 +392,10 @@ export class MockMouseService implements IMouseService { public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined { throw new Error('Not implemented'); } + + public bindMouse(): void { + throw new Error('Not implemented'); + } } export class MockRenderService implements IRenderService { diff --git a/src/browser/services/MouseService.ts b/src/browser/services/MouseService.ts index 3e382575e..005dd9e45 100644 --- a/src/browser/services/MouseService.ts +++ b/src/browser/services/MouseService.ts @@ -3,19 +3,327 @@ * @license MIT */ -import { getWindow } from 'browser/Dom'; -import { ICharSizeService, IRenderService, IMouseService } from './Services'; +import { addDisposableListener, getWindow } from 'browser/Dom'; import { getCoords, getCoordsRelativeToElement } from 'browser/input/Mouse'; +import { IBufferService, ICoreMouseService, ICoreService, ILogService, IOptionsService } from 'common/services/Services'; +import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, IDisposable } from 'common/Types'; +import { C0 } from 'common/data/EscapeSequences'; +import { toDisposable } from 'common/Lifecycle'; +import { CustomWheelEventHandler } from 'browser/Types'; +import { ICharSizeService, ICoreBrowserService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services'; + +type RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>; + +interface IMouseBindContext { + readonly target: IMouseServiceTarget; + readonly focus: () => void; + readonly requestedEvents: RequestedMouseEvents; +} export class MouseService implements IMouseService { public serviceBrand: undefined; + private _customWheelEventHandler: CustomWheelEventHandler | undefined; + constructor( @IRenderService private readonly _renderService: IRenderService, - @ICharSizeService private readonly _charSizeService: ICharSizeService + @ICharSizeService private readonly _charSizeService: ICharSizeService, + @ICoreMouseService private readonly _coreMouseService: ICoreMouseService, + @ICoreService private readonly _coreService: ICoreService, + @IBufferService private readonly _bufferService: IBufferService, + @IOptionsService private readonly _optionsService: IOptionsService, + @ISelectionService private readonly _selectionService: ISelectionService, + @ILogService private readonly _logService: ILogService, + @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService ) { } + public bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void { + const { element, document } = target; + + /** + * Event listener state handling. + * We listen to the onProtocolChange event of CoreMouseService and put + * requested listeners in `requestedEvents`. With this the listeners + * have all bits to do the event listener juggling. + * Note: 'mousedown' currently is "always on" and not managed + * by onProtocolChange. + */ + const requestedEvents: RequestedMouseEvents = { + mouseup: null, + wheel: null, + mousedrag: null, + mousemove: null + }; + const ctx: IMouseBindContext = { target, focus, requestedEvents }; + const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = { + mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent), + wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent), + mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent), + mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent) + }; + register(this._coreMouseService.onProtocolChange(events => { + this._handleProtocolChange(ctx, eventListeners, events); + })); + // force initial onProtocolChange so we dont miss early mouse requests + this._coreMouseService.activeProtocol = this._coreMouseService.activeProtocol; + + // Ensure document-level listeners are removed on dispose + register(toDisposable(() => { + if (requestedEvents.mouseup) { + document.removeEventListener('mouseup', requestedEvents.mouseup); + } + if (requestedEvents.mousedrag) { + document.removeEventListener('mousemove', requestedEvents.mousedrag); + } + })); + + /** + * "Always on" event listeners. + */ + register(addDisposableListener(element, 'mousedown', (ev: MouseEvent) => this._handleMouseDown(ctx, ev))); + register(addDisposableListener(element, 'wheel', (ev: WheelEvent) => this._handlePassiveWheel(ctx, ev), { passive: false })); + } + + private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean { + // Get mouse coordinates + const pos = this.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement); + if (!pos) { + return false; + } + + let but: CoreMouseButton; + let action: CoreMouseAction | undefined; + switch ((ev as MouseEvent & { overrideType?: string }).overrideType || ev.type) { + case 'mousemove': + action = CoreMouseAction.MOVE; + if (ev.buttons === undefined) { + // buttons is not supported on macOS, try to get a value from button instead + but = CoreMouseButton.NONE; + if (ev.button !== undefined) { + but = ev.button < 3 ? ev.button : CoreMouseButton.NONE; + } + } else { + // according to MDN buttons only reports up to button 5 (AUX2) + but = ev.buttons & 1 ? CoreMouseButton.LEFT : + ev.buttons & 4 ? CoreMouseButton.MIDDLE : + ev.buttons & 2 ? CoreMouseButton.RIGHT : + CoreMouseButton.NONE; // fallback to NONE + } + break; + case 'mouseup': + action = CoreMouseAction.UP; + but = ev.button < 3 ? ev.button : CoreMouseButton.NONE; + break; + case 'mousedown': + action = CoreMouseAction.DOWN; + but = ev.button < 3 ? ev.button : CoreMouseButton.NONE; + break; + case 'wheel': + if (this._customWheelEventHandler && this._customWheelEventHandler(ev as WheelEvent) === false) { + return false; + } + const deltaY = (ev as WheelEvent).deltaY; + if (deltaY === 0) { + return false; + } + const lines = this._coreMouseService.consumeWheelEvent( + ev as WheelEvent, + this._renderService?.dimensions?.device?.cell?.height, + this._coreBrowserService?.dpr + ); + if (lines === 0) { + return false; + } + action = deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN; + but = CoreMouseButton.WHEEL; + break; + default: + // dont handle other event types by accident + return false; + } + + // exit if we cannot determine valid button/action values + // do nothing for higher buttons than wheel + if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) { + return false; + } + + return this._coreMouseService.triggerMouseEvent({ + col: pos.col, + row: pos.row, + x: pos.x, + y: pos.y, + button: but, + action, + ctrl: ev.ctrlKey, + alt: ev.altKey, + shift: ev.shiftKey + }); + } + + private _handleMouseUp(ctx: IMouseBindContext, ev: MouseEvent): void { + this._sendEvent(ctx, ev); + if (!ev.buttons) { + // if no other button is held remove global handlers + if (ctx.requestedEvents.mouseup) { + ctx.target.document.removeEventListener('mouseup', ctx.requestedEvents.mouseup); + } + if (ctx.requestedEvents.mousedrag) { + ctx.target.document.removeEventListener('mousemove', ctx.requestedEvents.mousedrag); + } + } + } + + private _handleWheel(ctx: IMouseBindContext, ev: WheelEvent): false { + this._sendEvent(ctx, ev); + ev.preventDefault(); + ev.stopPropagation(); + return false; + } + + private _handleMouseDrag(ctx: IMouseBindContext, ev: MouseEvent): void { + // deal only with move while a button is held + if (ev.buttons) { + this._sendEvent(ctx, ev); + } + } + + private _handleMouseMove(ctx: IMouseBindContext, ev: MouseEvent): void { + // deal only with move without any button + if (!ev.buttons) { + this._sendEvent(ctx, ev); + } + } + + private _handleMouseDown(ctx: IMouseBindContext, ev: MouseEvent): void { + ev.preventDefault(); + ctx.focus(); + + // Don't send the mouse button to the pty if mouse events are disabled or + // if the selection manager is having selection forced (ie. a modifier is + // held). + if (!this._coreMouseService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) { + return; + } + + this._sendEvent(ctx, ev); + + // Register additional global handlers which should keep reporting outside + // of the terminal element. + // Note: Other emulators also do this for 'mousedown' while a button + // is held, we currently limit 'mousedown' to the terminal only. + if (ctx.requestedEvents.mouseup) { + ctx.target.document.addEventListener('mouseup', ctx.requestedEvents.mouseup); + } + if (ctx.requestedEvents.mousedrag) { + ctx.target.document.addEventListener('mousemove', ctx.requestedEvents.mousedrag); + } + } + + private _handlePassiveWheel(ctx: IMouseBindContext, ev: WheelEvent): false | void { + // do nothing, if app side handles wheel itself + if (ctx.requestedEvents.wheel) { + return; + } + + if (this._customWheelEventHandler && this._customWheelEventHandler(ev) === false) { + return false; + } + + if (!this._bufferService.buffer.hasScrollback) { + // Convert wheel events into up/down events when the buffer does not have scrollback, this + // enables scrolling in apps hosted in the alt buffer such as vim or tmux even when mouse + // events are not enabled. + // This used implementation used get the actual lines/partial lines scrolled from the + // viewport but since moving to the new viewport implementation has been simplified to + // simply send a single up or down sequence. + + // Do nothing if there's no vertical scroll + const deltaY = ev.deltaY; + if (deltaY === 0) { + return false; + } + + const lines = this._coreMouseService.consumeWheelEvent( + ev, + this._renderService?.dimensions?.device?.cell?.height, + this._coreBrowserService?.dpr + ); + if (lines === 0) { + ev.preventDefault(); + ev.stopPropagation(); + return false; + } + + // Construct and send sequences + const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B'); + this._coreService.triggerDataEvent(sequence, true); + ev.preventDefault(); + ev.stopPropagation(); + return false; + } + } + + private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void { + const { element, document } = ctx.target; + const { requestedEvents } = ctx; + // apply global changes on events + if (events) { + if (this._optionsService.rawOptions.logLevel === 'debug') { + this._logService.debug('Binding to mouse events:', this._coreMouseService.explainEvents(events)); + } + element.classList.add('enable-mouse-events'); + this._selectionService.disable(); + } else { + this._logService.debug('Unbinding from mouse events.'); + element.classList.remove('enable-mouse-events'); + this._selectionService.enable(); + } + + // add/remove handlers from requestedEvents + if (!(events & CoreMouseEventType.MOVE)) { + if (requestedEvents.mousemove) { + element.removeEventListener('mousemove', requestedEvents.mousemove); + } + requestedEvents.mousemove = null; + } else if (!requestedEvents.mousemove) { + element.addEventListener('mousemove', eventListeners.mousemove); + requestedEvents.mousemove = eventListeners.mousemove; + } + + if (!(events & CoreMouseEventType.WHEEL)) { + if (requestedEvents.wheel) { + element.removeEventListener('wheel', requestedEvents.wheel); + } + requestedEvents.wheel = null; + } else if (!requestedEvents.wheel) { + element.addEventListener('wheel', eventListeners.wheel, { passive: false }); + requestedEvents.wheel = eventListeners.wheel; + } + + if (!(events & CoreMouseEventType.UP)) { + if (requestedEvents.mouseup) { + document.removeEventListener('mouseup', requestedEvents.mouseup); + } + requestedEvents.mouseup = null; + } else { + requestedEvents.mouseup ??= eventListeners.mouseup; + } + + if (!(events & CoreMouseEventType.DRAG)) { + if (requestedEvents.mousedrag) { + document.removeEventListener('mousemove', requestedEvents.mousedrag); + } + requestedEvents.mousedrag = null; + } else { + requestedEvents.mousedrag ??= eventListeners.mousedrag; + } + } + + public setCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler | undefined): void { + this._customWheelEventHandler = customWheelEventHandler; + } public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined { return getCoords( window, diff --git a/src/browser/services/Services.ts b/src/browser/services/Services.ts index 1c82b28bd..1c75df61e 100644 --- a/src/browser/services/Services.ts +++ b/src/browser/services/Services.ts @@ -4,7 +4,7 @@ */ import { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types'; -import { IColorSet, ILink, ReadonlyColorSet } from 'browser/Types'; +import { CustomWheelEventHandler, IColorSet, ILink, ReadonlyColorSet } from 'browser/Types'; import { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types'; import { createDecorator } from 'common/services/ServiceRegistry'; import { AllColorIndex, IDisposable, IKeyboardResult } from 'common/Types'; @@ -50,11 +50,18 @@ export interface ICoreBrowserService { } export const IMouseService = createDecorator('MouseService'); +export interface IMouseServiceTarget { + element: HTMLElement; + screenElement: HTMLElement; + document: Document; +} export interface IMouseService { serviceBrand: undefined; getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined; getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined; + setCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler | undefined): void; + bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void; } export const IRenderService = createDecorator('RenderService'); From c727240f16305660217651ee76a573c4c29f6990 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:23:38 +0900 Subject: [PATCH 115/124] Fix cyclic dependency Linkifier -> MouseService -> SelectionService -> Linkifier --- .../components/window/cellInspectorWindow.ts | 2 +- src/browser/CoreBrowserTerminal.ts | 7 ++- src/browser/Linkifier.ts | 16 +++---- src/browser/TestUtils.test.ts | 4 ++ src/browser/services/MouseCoordsService.ts | 47 +++++++++++++++++++ src/browser/services/MouseService.ts | 37 ++------------- src/browser/services/SelectionService.ts | 8 ++-- src/browser/services/Services.ts | 20 +++++--- 8 files changed, 87 insertions(+), 54 deletions(-) create mode 100644 src/browser/services/MouseCoordsService.ts diff --git a/demo/client/components/window/cellInspectorWindow.ts b/demo/client/components/window/cellInspectorWindow.ts index b7a50bf6d..8bc28a974 100644 --- a/demo/client/components/window/cellInspectorWindow.ts +++ b/demo/client/components/window/cellInspectorWindow.ts @@ -85,7 +85,7 @@ export class CellInspectorWindow extends BaseWindow implements IControlWindow { terminal.element.addEventListener('mousemove', (e: MouseEvent) => { const core = (terminal as any)._core; - const coords = core._mouseService?.getCoords(e, core.screenElement, terminal.cols, terminal.rows); + const coords = core._mouseCoordsService?.getCoords(e, core.screenElement, terminal.cols, terminal.rows); if (!coords) { this._clearDisplay(); return; diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index 207e469d3..62ff36c29 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -36,10 +36,11 @@ import { CharSizeService } from 'browser/services/CharSizeService'; import { CharacterJoinerService } from 'browser/services/CharacterJoinerService'; import { CoreBrowserService } from 'browser/services/CoreBrowserService'; import { LinkProviderService } from 'browser/services/LinkProviderService'; +import { MouseCoordsService } from 'browser/services/MouseCoordsService'; import { MouseService } from 'browser/services/MouseService'; import { RenderService } from 'browser/services/RenderService'; import { SelectionService } from 'browser/services/SelectionService'; -import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services'; +import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services'; import { ThemeService } from 'browser/services/ThemeService'; import { KeyboardService } from 'browser/services/KeyboardService'; import { channels, color, rgb } from 'common/Color'; @@ -87,6 +88,7 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { // Optional browser services private _charSizeService: ICharSizeService | undefined; private _coreBrowserService: ICoreBrowserService | undefined; + private _mouseCoordsService: IMouseCoordsService | undefined; private _mouseService: IMouseService | undefined; private _renderService: IRenderService | undefined; private _themeService: IThemeService | undefined; @@ -543,6 +545,9 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView); this._helperContainer.appendChild(this._compositionView); + this._mouseCoordsService = this._instantiationService.createInstance(MouseCoordsService); + this._instantiationService.setService(IMouseCoordsService, this._mouseCoordsService); + const linkifier = this._linkifier.value = this._register(this._instantiationService.createInstance(Linkifier, this.screenElement)); // Performance: Add viewport and helper elements from the fragment diff --git a/src/browser/Linkifier.ts b/src/browser/Linkifier.ts index 5e43782d4..31c91daee 100644 --- a/src/browser/Linkifier.ts +++ b/src/browser/Linkifier.ts @@ -7,7 +7,7 @@ import { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifie import { Disposable, dispose, toDisposable } from 'common/Lifecycle'; import { IDisposable } from 'common/Types'; import { IBufferService } from 'common/services/Services'; -import { ILinkProviderService, IMouseService, IRenderService } from './services/Services'; +import { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services'; import { Emitter } from 'common/Event'; import { addDisposableListener } from 'browser/Dom'; @@ -30,7 +30,7 @@ export class Linkifier extends Disposable implements ILinkifier2 { constructor( private readonly _element: HTMLElement, - @IMouseService private readonly _mouseService: IMouseService, + @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService, @IRenderService private readonly _renderService: IRenderService, @IBufferService private readonly _bufferService: IBufferService, @ILinkProviderService private readonly _linkProviderService: ILinkProviderService @@ -60,7 +60,7 @@ export class Linkifier extends Disposable implements ILinkifier2 { private _handleMouseMove(event: MouseEvent): void { this._lastMouseEvent = event; - const position = this._positionFromMouseEvent(event, this._element, this._mouseService); + const position = this._positionFromMouseEvent(event, this._element); if (!position) { return; } @@ -222,7 +222,7 @@ export class Linkifier extends Disposable implements ILinkifier2 { return; } - const position = this._positionFromMouseEvent(event, this._element, this._mouseService); + const position = this._positionFromMouseEvent(event, this._element); if (!position) { return; } @@ -251,7 +251,7 @@ export class Linkifier extends Disposable implements ILinkifier2 { return; } - const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService); + const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element); if (!position) { return; @@ -312,7 +312,7 @@ export class Linkifier extends Disposable implements ILinkifier2 { this._clearCurrentLink(start, end); if (this._lastMouseEvent) { // re-eval previously active link after changes - const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService!); + const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element); if (position) { this._askForLink(position, false); } @@ -378,8 +378,8 @@ export class Linkifier extends Disposable implements ILinkifier2 { * Get the buffer position from a mouse event * @param event */ - private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement, mouseService: IMouseService): IBufferCellPosition | undefined { - const coords = mouseService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows); + private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement): IBufferCellPosition | undefined { + const coords = this._mouseCoordsService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows); if (!coords) { return; } diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index a9acf889d..a682913e2 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -393,6 +393,10 @@ export class MockMouseService implements IMouseService { throw new Error('Not implemented'); } + public setCustomWheelEventHandler(): void { + throw new Error('Not implemented'); + } + public bindMouse(): void { throw new Error('Not implemented'); } diff --git a/src/browser/services/MouseCoordsService.ts b/src/browser/services/MouseCoordsService.ts new file mode 100644 index 000000000..e2455fd2b --- /dev/null +++ b/src/browser/services/MouseCoordsService.ts @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2026 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { getWindow } from 'browser/Dom'; +import { getCoords, getCoordsRelativeToElement } from 'browser/input/Mouse'; +import { ICharSizeService, IMouseCoordsService, IRenderService } from 'browser/services/Services'; + +export class MouseCoordsService implements IMouseCoordsService { + public serviceBrand: undefined; + + constructor( + @ICharSizeService private readonly _charSizeService: ICharSizeService, + @IRenderService private readonly _renderService: IRenderService + ) { + } + + public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined { + return getCoords( + window, + event, + element, + colCount, + rowCount, + this._charSizeService.hasValidSize, + this._renderService.dimensions.css.cell.width, + this._renderService.dimensions.css.cell.height, + isSelection + ); + } + + public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined { + const coords = getCoordsRelativeToElement(getWindow(element), event, element); + if (!this._charSizeService.hasValidSize) { + return undefined; + } + coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1); + coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1); + return { + col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width), + row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height), + x: Math.floor(coords[0]), + y: Math.floor(coords[1]) + }; + } +} diff --git a/src/browser/services/MouseService.ts b/src/browser/services/MouseService.ts index 005dd9e45..f53f22a57 100644 --- a/src/browser/services/MouseService.ts +++ b/src/browser/services/MouseService.ts @@ -3,14 +3,13 @@ * @license MIT */ -import { addDisposableListener, getWindow } from 'browser/Dom'; -import { getCoords, getCoordsRelativeToElement } from 'browser/input/Mouse'; +import { addDisposableListener } from 'browser/Dom'; import { IBufferService, ICoreMouseService, ICoreService, ILogService, IOptionsService } from 'common/services/Services'; import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, IDisposable } from 'common/Types'; import { C0 } from 'common/data/EscapeSequences'; import { toDisposable } from 'common/Lifecycle'; import { CustomWheelEventHandler } from 'browser/Types'; -import { ICharSizeService, ICoreBrowserService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services'; +import { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services'; type RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>; @@ -27,7 +26,7 @@ export class MouseService implements IMouseService { constructor( @IRenderService private readonly _renderService: IRenderService, - @ICharSizeService private readonly _charSizeService: ICharSizeService, + @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService, @ICoreMouseService private readonly _coreMouseService: ICoreMouseService, @ICoreService private readonly _coreService: ICoreService, @IBufferService private readonly _bufferService: IBufferService, @@ -87,7 +86,7 @@ export class MouseService implements IMouseService { private _sendEvent(ctx: IMouseBindContext, ev: MouseEvent | WheelEvent): boolean { // Get mouse coordinates - const pos = this.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement); + const pos = this._mouseCoordsService.getMouseReportCoords(ev as MouseEvent, ctx.target.screenElement); if (!pos) { return false; } @@ -324,32 +323,4 @@ export class MouseService implements IMouseService { public setCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler | undefined): void { this._customWheelEventHandler = customWheelEventHandler; } - public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined { - return getCoords( - window, - event, - element, - colCount, - rowCount, - this._charSizeService.hasValidSize, - this._renderService.dimensions.css.cell.width, - this._renderService.dimensions.css.cell.height, - isSelection - ); - } - - public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined { - const coords = getCoordsRelativeToElement(getWindow(element), event, element); - if (!this._charSizeService.hasValidSize) { - return undefined; - } - coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1); - coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1); - return { - col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width), - row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height), - x: Math.floor(coords[0]), - y: Math.floor(coords[1]) - }; - } } diff --git a/src/browser/services/SelectionService.ts b/src/browser/services/SelectionService.ts index a5d1d759b..e1b8510e9 100644 --- a/src/browser/services/SelectionService.ts +++ b/src/browser/services/SelectionService.ts @@ -8,7 +8,7 @@ import { getCoordsRelativeToElement } from 'browser/input/Mouse'; import { moveToCellSequence } from 'browser/input/MoveToCell'; import { SelectionModel } from 'browser/selection/SelectionModel'; import { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types'; -import { ICoreBrowserService, IMouseService, IRenderService, ISelectionService } from 'browser/services/Services'; +import { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from 'browser/services/Services'; import { Disposable, toDisposable } from 'common/Lifecycle'; import * as Browser from 'common/Platform'; import { IBufferLine, ICellData, IDisposable } from 'common/Types'; @@ -126,7 +126,7 @@ export class SelectionService extends Disposable implements ISelectionService { private readonly _linkifier: ILinkifier2, @IBufferService private readonly _bufferService: IBufferService, @ICoreService private readonly _coreService: ICoreService, - @IMouseService private readonly _mouseService: IMouseService, + @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService, @IOptionsService private readonly _optionsService: IOptionsService, @IRenderService private readonly _renderService: IRenderService, @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService @@ -395,7 +395,7 @@ export class SelectionService extends Disposable implements ISelectionService { * @param event The mouse event. */ private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined { - const coords = this._mouseService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true); + const coords = this._mouseCoordsService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true); if (!coords) { return undefined; } @@ -715,7 +715,7 @@ export class SelectionService extends Disposable implements ISelectionService { if (this.selectionText.length <= 1 && timeElapsed < ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) { if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) { - const coordinates = this._mouseService.getCoords( + const coordinates = this._mouseCoordsService.getCoords( event, this._element, this._bufferService.cols, diff --git a/src/browser/services/Services.ts b/src/browser/services/Services.ts index 1c75df61e..7f1c10576 100644 --- a/src/browser/services/Services.ts +++ b/src/browser/services/Services.ts @@ -49,20 +49,26 @@ export interface ICoreBrowserService { readonly dpr: number; } -export const IMouseService = createDecorator('MouseService'); -export interface IMouseServiceTarget { - element: HTMLElement; - screenElement: HTMLElement; - document: Document; -} -export interface IMouseService { +export const IMouseCoordsService = createDecorator('MouseCoordsService'); +export interface IMouseCoordsService { serviceBrand: undefined; getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined; getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined; +} + +export const IMouseService = createDecorator('MouseService'); +export interface IMouseService { + serviceBrand: undefined; + setCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler | undefined): void; bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void; } +export interface IMouseServiceTarget { + element: HTMLElement; + screenElement: HTMLElement; + document: Document; +} export const IRenderService = createDecorator('RenderService'); export interface IRenderService extends IDisposable { From b66128b239a00e76837929792defcf235645c67d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:24:46 +0900 Subject: [PATCH 116/124] Avoid unnecessary --- src/browser/CoreBrowserTerminal.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index 62ff36c29..6793266f6 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -643,7 +643,7 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { // Listen for mouse events and translate // them into terminal mouse protocols. - this._mouseService!.bindMouse({ + this._mouseService.bindMouse({ element: this.element!, screenElement: this.screenElement!, document: this._document! From 2331abe6bd6790291517ecff5f6de7802c3605c3 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:31:57 +0900 Subject: [PATCH 117/124] Rename CoreMouseService to MouseStateService Part of #5756 --- src/browser/CoreBrowserTerminal.ts | 2 +- src/browser/TestUtils.test.ts | 4 +-- src/browser/Viewport.ts | 6 ++-- src/browser/public/Terminal.ts | 2 +- src/browser/services/MouseService.ts | 20 ++++++------ src/common/CoreTerminal.ts | 14 ++++---- src/common/InputHandler.test.ts | 32 +++++++++---------- src/common/InputHandler.ts | 24 +++++++------- src/common/TestUtils.test.ts | 4 +-- src/common/Types.ts | 12 +++---- ...vice.test.ts => MouseStateService.test.ts} | 22 ++++++------- ...reMouseService.ts => MouseStateService.ts} | 6 ++-- src/common/services/Services.ts | 4 +-- src/headless/public/Terminal.ts | 2 +- test/playwright/InputHandler.test.ts | 32 +++++++++---------- 15 files changed, 93 insertions(+), 93 deletions(-) rename src/common/services/{CoreMouseService.test.ts => MouseStateService.test.ts} (94%) rename src/common/services/{CoreMouseService.ts => MouseStateService.ts} (98%) diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index 6793266f6..fe74f3d80 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -607,7 +607,7 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._register(addDisposableListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e))); // apply mouse event classes set by escape codes before terminal was attached - if (this.coreMouseService.areMouseEventsActive) { + if (this.mouseStateService.areMouseEventsActive) { this._selectionService.disable(); this.element.classList.add('enable-mouse-events'); } else { diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index a682913e2..fc62b4c4b 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -12,7 +12,7 @@ import { IBufferLine, ICellData, IAttributeData, ICircularList, XtermListener, I import { Buffer } from 'common/buffer/Buffer'; import * as Browser from 'common/Platform'; import { CoreBrowserTerminal } from 'browser/CoreBrowserTerminal'; -import { IUnicodeService, IOptionsService, ICoreService, ICoreMouseService } from 'common/services/Services'; +import { IUnicodeService, IOptionsService, ICoreService, IMouseStateService } from 'common/services/Services'; import { IFunctionIdentifier, IParams } from 'common/parser/Types'; import { AttributeData } from 'common/buffer/AttributeData'; import { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types'; @@ -51,7 +51,7 @@ export class MockTerminal implements ITerminal { public dimensions: IRenderDimensionsApi | undefined; public markers!: IMarker[]; public linkifier: ILinkifier2 | undefined; - public coreMouseService!: ICoreMouseService; + public mouseStateService!: IMouseStateService; public coreService!: ICoreService; public optionsService!: IOptionsService; public unicodeService!: IUnicodeService; diff --git a/src/browser/Viewport.ts b/src/browser/Viewport.ts index 09864f7ac..c627c916e 100644 --- a/src/browser/Viewport.ts +++ b/src/browser/Viewport.ts @@ -6,7 +6,7 @@ import { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; import { ViewportConstants } from 'browser/shared/Constants'; import { Disposable, toDisposable } from 'common/Lifecycle'; -import { IBufferService, ICoreMouseService, IOptionsService } from 'common/services/Services'; +import { IBufferService, IMouseStateService, IOptionsService } from 'common/services/Services'; import { CoreMouseEventType } from 'common/Types'; import { addDisposableListener, scheduleAtNextAnimationFrame } from 'browser/Dom'; import { SmoothScrollableElement } from 'browser/scrollable/scrollableElement'; @@ -34,7 +34,7 @@ export class Viewport extends Disposable { screenElement: HTMLElement, @IBufferService private readonly _bufferService: IBufferService, @ICoreBrowserService coreBrowserService: ICoreBrowserService, - @ICoreMouseService coreMouseService: ICoreMouseService, + @IMouseStateService mouseStateService: IMouseStateService, @IThemeService themeService: IThemeService, @IOptionsService private readonly _optionsService: IOptionsService, @IRenderService private readonly _renderService: IRenderService @@ -65,7 +65,7 @@ export class Viewport extends Disposable { 'scrollbar' ], () => this._scrollableElement.updateOptions(this._getChangeOptions()))); // Don't handle mouse wheel if wheel events are supported by the current mouse prototcol - this._register(coreMouseService.onProtocolChange(type => { + this._register(mouseStateService.onProtocolChange(type => { this._scrollableElement.updateOptions({ handleMouseWheel: !(type & CoreMouseEventType.WHEEL) }); diff --git a/src/browser/public/Terminal.ts b/src/browser/public/Terminal.ts index f25da387e..75aada048 100644 --- a/src/browser/public/Terminal.ts +++ b/src/browser/public/Terminal.ts @@ -103,7 +103,7 @@ export class Terminal extends Disposable implements ITerminalApi { public get modes(): IModes { const m = this._core.coreService.decPrivateModes; let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none'; - switch (this._core.coreMouseService.activeProtocol) { + switch (this._core.mouseStateService.activeProtocol) { case 'X10': mouseTrackingMode = 'x10'; break; case 'VT200': mouseTrackingMode = 'vt200'; break; case 'DRAG': mouseTrackingMode = 'drag'; break; diff --git a/src/browser/services/MouseService.ts b/src/browser/services/MouseService.ts index f53f22a57..b75ee15b8 100644 --- a/src/browser/services/MouseService.ts +++ b/src/browser/services/MouseService.ts @@ -4,7 +4,7 @@ */ import { addDisposableListener } from 'browser/Dom'; -import { IBufferService, ICoreMouseService, ICoreService, ILogService, IOptionsService } from 'common/services/Services'; +import { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from 'common/services/Services'; import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, IDisposable } from 'common/Types'; import { C0 } from 'common/data/EscapeSequences'; import { toDisposable } from 'common/Lifecycle'; @@ -27,7 +27,7 @@ export class MouseService implements IMouseService { constructor( @IRenderService private readonly _renderService: IRenderService, @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService, - @ICoreMouseService private readonly _coreMouseService: ICoreMouseService, + @IMouseStateService private readonly _mouseStateService: IMouseStateService, @ICoreService private readonly _coreService: ICoreService, @IBufferService private readonly _bufferService: IBufferService, @IOptionsService private readonly _optionsService: IOptionsService, @@ -42,7 +42,7 @@ export class MouseService implements IMouseService { /** * Event listener state handling. - * We listen to the onProtocolChange event of CoreMouseService and put + * We listen to the onProtocolChange event of MouseStateService and put * requested listeners in `requestedEvents`. With this the listeners * have all bits to do the event listener juggling. * Note: 'mousedown' currently is "always on" and not managed @@ -61,11 +61,11 @@ export class MouseService implements IMouseService { mousedrag: (ev: Event) => this._handleMouseDrag(ctx, ev as MouseEvent), mousemove: (ev: Event) => this._handleMouseMove(ctx, ev as MouseEvent) }; - register(this._coreMouseService.onProtocolChange(events => { + register(this._mouseStateService.onProtocolChange(events => { this._handleProtocolChange(ctx, eventListeners, events); })); // force initial onProtocolChange so we dont miss early mouse requests - this._coreMouseService.activeProtocol = this._coreMouseService.activeProtocol; + this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol; // Ensure document-level listeners are removed on dispose register(toDisposable(() => { @@ -126,7 +126,7 @@ export class MouseService implements IMouseService { if (deltaY === 0) { return false; } - const lines = this._coreMouseService.consumeWheelEvent( + const lines = this._mouseStateService.consumeWheelEvent( ev as WheelEvent, this._renderService?.dimensions?.device?.cell?.height, this._coreBrowserService?.dpr @@ -148,7 +148,7 @@ export class MouseService implements IMouseService { return false; } - return this._coreMouseService.triggerMouseEvent({ + return this._mouseStateService.triggerMouseEvent({ col: pos.col, row: pos.row, x: pos.x, @@ -202,7 +202,7 @@ export class MouseService implements IMouseService { // Don't send the mouse button to the pty if mouse events are disabled or // if the selection manager is having selection forced (ie. a modifier is // held). - if (!this._coreMouseService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) { + if (!this._mouseStateService.areMouseEventsActive || this._selectionService.shouldForceSelection(ev)) { return; } @@ -244,7 +244,7 @@ export class MouseService implements IMouseService { return false; } - const lines = this._coreMouseService.consumeWheelEvent( + const lines = this._mouseStateService.consumeWheelEvent( ev, this._renderService?.dimensions?.device?.cell?.height, this._coreBrowserService?.dpr @@ -270,7 +270,7 @@ export class MouseService implements IMouseService { // apply global changes on events if (events) { if (this._optionsService.rawOptions.logLevel === 'debug') { - this._logService.debug('Binding to mouse events:', this._coreMouseService.explainEvents(events)); + this._logService.debug('Binding to mouse events:', this._mouseStateService.explainEvents(events)); } element.classList.add('enable-mouse-events'); this._selectionService.disable(); diff --git a/src/common/CoreTerminal.ts b/src/common/CoreTerminal.ts index 0ce19a4d1..e2a3adf72 100644 --- a/src/common/CoreTerminal.ts +++ b/src/common/CoreTerminal.ts @@ -21,14 +21,14 @@ * http://linux.die.net/man/7/urxvt */ -import { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, ICoreMouseService, IUnicodeService, LogLevelEnum, ITerminalOptions, IOscLinkService } from 'common/services/Services'; +import { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, ITerminalOptions, IOscLinkService } from 'common/services/Services'; import { InstantiationService } from 'common/services/InstantiationService'; import { LogService } from 'common/services/LogService'; import { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService'; import { OptionsService } from 'common/services/OptionsService'; import { IDisposable, IAttributeData, ICoreTerminal, IScrollEvent } from 'common/Types'; import { CoreService } from 'common/services/CoreService'; -import { CoreMouseService } from 'common/services/CoreMouseService'; +import { MouseStateService } from 'common/services/MouseStateService'; import { UnicodeService } from 'common/services/UnicodeService'; import { CharsetService } from 'common/services/CharsetService'; import { updateWindowsModeWrappedState } from 'common/WindowsMode'; @@ -50,7 +50,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { protected readonly _charsetService: ICharsetService; protected readonly _oscLinkService: IOscLinkService; - public readonly coreMouseService: ICoreMouseService; + public readonly mouseStateService: IMouseStateService; public readonly coreService: ICoreService; public readonly unicodeService: IUnicodeService; public readonly optionsService: IOptionsService; @@ -113,8 +113,8 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { this._instantiationService.setService(IBufferService, this._bufferService); this.coreService = this._register(this._instantiationService.createInstance(CoreService)); this._instantiationService.setService(ICoreService, this.coreService); - this.coreMouseService = this._register(this._instantiationService.createInstance(CoreMouseService)); - this._instantiationService.setService(ICoreMouseService, this.coreMouseService); + this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService)); + this._instantiationService.setService(IMouseStateService, this.mouseStateService); this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService)); this._instantiationService.setService(IUnicodeService, this.unicodeService); this._charsetService = this._instantiationService.createInstance(CharsetService); @@ -124,7 +124,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { // Register input handler and handle/forward events - this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService)); + this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.mouseStateService, this.unicodeService)); this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed)); // Setup listeners @@ -256,7 +256,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { this._bufferService.reset(); this._charsetService.reset(); this.coreService.reset(); - this.coreMouseService.reset(); + this.mouseStateService.reset(); } diff --git a/src/common/InputHandler.test.ts b/src/common/InputHandler.test.ts index f36c28b45..4d19ef4f1 100644 --- a/src/common/InputHandler.test.ts +++ b/src/common/InputHandler.test.ts @@ -11,7 +11,7 @@ import { CellData } from 'common/buffer/CellData'; import { Attributes, BgFlags, UnderlineStyle } from 'common/buffer/Constants'; import { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData'; import { Params } from 'common/parser/Params'; -import { MockCoreService, MockBufferService, MockOptionsService, MockLogService, MockCoreMouseService, MockCharsetService, MockUnicodeService, MockOscLinkService } from 'common/TestUtils.test'; +import { MockCoreService, MockBufferService, MockOptionsService, MockLogService, MockMouseStateService, MockCharsetService, MockUnicodeService, MockOscLinkService } from 'common/TestUtils.test'; import { IBufferService, ICoreService, type IOscLinkService } from 'common/services/Services'; import { DEFAULT_OPTIONS } from 'common/services/OptionsService'; import { clone } from 'common/Clone'; @@ -70,7 +70,7 @@ describe('InputHandler', () => { coreService = new CoreService(bufferService, new MockLogService(), optionsService); oscLinkService = new OscLinkService(bufferService); - inputHandler = new TestInputHandler(bufferService, new MockCharsetService(), coreService, new MockLogService(), optionsService, oscLinkService, new MockCoreMouseService(), new MockUnicodeService()); + inputHandler = new TestInputHandler(bufferService, new MockCharsetService(), coreService, new MockLogService(), optionsService, oscLinkService, new MockMouseStateService(), new MockUnicodeService()); }); describe('SL/SR/DECIC/DECDC', () => { @@ -261,7 +261,7 @@ describe('InputHandler', () => { describe('setMode', () => { it('should toggle bracketedPasteMode', () => { const coreService = new MockCoreService(); - const inputHandler = new TestInputHandler(new MockBufferService(80, 30), new MockCharsetService(), coreService, new MockLogService(), new MockOptionsService(), new MockOscLinkService(), new MockCoreMouseService(), new MockUnicodeService()); + const inputHandler = new TestInputHandler(new MockBufferService(80, 30), new MockCharsetService(), coreService, new MockLogService(), new MockOptionsService(), new MockOscLinkService(), new MockMouseStateService(), new MockUnicodeService()); // Set bracketed paste mode inputHandler.setModePrivate(Params.fromArray([2004])); assert.equal(coreService.decPrivateModes.bracketedPasteMode, true); @@ -272,7 +272,7 @@ describe('InputHandler', () => { it('should toggle colorSchemeUpdates (DECSET 2031)', () => { const coreService = new MockCoreService(); const optionsService = new MockOptionsService(); - const inputHandler = new TestInputHandler(new MockBufferService(80, 30), new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockCoreMouseService(), new MockUnicodeService()); + const inputHandler = new TestInputHandler(new MockBufferService(80, 30), new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockMouseStateService(), new MockUnicodeService()); // Set color scheme updates mode (default colorSchemeQuery=true) inputHandler.setModePrivate(Params.fromArray([2031])); assert.equal(coreService.decPrivateModes.colorSchemeUpdates, true); @@ -284,7 +284,7 @@ describe('InputHandler', () => { const coreService = new MockCoreService(); const optionsService = new MockOptionsService(); optionsService.rawOptions.vtExtensions = { colorSchemeQuery: false }; - const inputHandler = new TestInputHandler(new MockBufferService(80, 30), new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockCoreMouseService(), new MockUnicodeService()); + const inputHandler = new TestInputHandler(new MockBufferService(80, 30), new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockMouseStateService(), new MockUnicodeService()); // Attempt to set color scheme updates mode inputHandler.setModePrivate(Params.fromArray([2031])); assert.equal(coreService.decPrivateModes.colorSchemeUpdates, false); @@ -306,7 +306,7 @@ describe('InputHandler', () => { new MockLogService(), new MockOptionsService(), new MockOscLinkService(), - new MockCoreMouseService(), + new MockMouseStateService(), new MockUnicodeService() ); @@ -352,7 +352,7 @@ describe('InputHandler', () => { new MockLogService(), new MockOptionsService(), new MockOscLinkService(), - new MockCoreMouseService(), + new MockMouseStateService(), new MockUnicodeService() ); @@ -402,7 +402,7 @@ describe('InputHandler', () => { new MockLogService(), new MockOptionsService(), new MockOscLinkService(), - new MockCoreMouseService(), + new MockMouseStateService(), new MockUnicodeService() ); @@ -439,7 +439,7 @@ describe('InputHandler', () => { new MockLogService(), new MockOptionsService(), new MockOscLinkService(), - new MockCoreMouseService(), + new MockMouseStateService(), new MockUnicodeService() ); @@ -488,7 +488,7 @@ describe('InputHandler', () => { new MockLogService(), new MockOptionsService({ scrollOnEraseInDisplay: true }), new MockOscLinkService(), - new MockCoreMouseService(), + new MockMouseStateService(), new MockUnicodeService() ); const aLine = Array(bufferService.cols + 1).join('a'); @@ -520,7 +520,7 @@ describe('InputHandler', () => { new MockLogService(), new MockOptionsService(), new MockOscLinkService(), - new MockCoreMouseService(), + new MockMouseStateService(), new MockUnicodeService() ); @@ -646,7 +646,7 @@ describe('InputHandler', () => { new MockLogService(), new MockOptionsService(), new MockOscLinkService(), - new MockCoreMouseService(), + new MockMouseStateService(), new MockUnicodeService() ); const container = new Uint32Array(10); @@ -674,7 +674,7 @@ describe('InputHandler', () => { beforeEach(() => { bufferService = new MockBufferService(80, 30); - handler = new TestInputHandler(bufferService, new MockCharsetService(), new MockCoreService(), new MockLogService(), new MockOptionsService(), new MockOscLinkService(), new MockCoreMouseService(), new MockUnicodeService()); + handler = new TestInputHandler(bufferService, new MockCharsetService(), new MockCoreService(), new MockLogService(), new MockOptionsService(), new MockOscLinkService(), new MockMouseStateService(), new MockUnicodeService()); }); it('should handle DECSET/DECRST 47 (alt screen buffer)', async () => { await handler.parseP('\x1b[?47h\r\n\x1b[31mJUNK\x1b[?47lTEST'); @@ -887,7 +887,7 @@ describe('InputHandler', () => { describe('colon notation', () => { let inputHandler2: TestInputHandler; beforeEach(() => { - inputHandler2 = new TestInputHandler(bufferService, new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockCoreMouseService(), new MockUnicodeService()); + inputHandler2 = new TestInputHandler(bufferService, new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockMouseStateService(), new MockUnicodeService()); }); describe('should equal to semicolon', () => { it('CSI 38:2::50:100:150 m', async () => { @@ -2461,7 +2461,7 @@ describe('InputHandler', () => { bufferService = new BufferService(optionsService, new MockLogService()); bufferService.resize(80, 30); coreService = new CoreService(bufferService, new MockLogService(), optionsService); - inputHandler = new TestInputHandler(bufferService, new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockCoreMouseService(), new MockUnicodeService()); + inputHandler = new TestInputHandler(bufferService, new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockMouseStateService(), new MockUnicodeService()); }); describe('stack limit', () => { @@ -2513,7 +2513,7 @@ describe('InputHandler', () => { coreService = new CoreService(bufferService, new MockLogService(), optionsService); coreService.onData(data => { console.log(data); }); - inputHandler = new TestInputHandler(bufferService, new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockCoreMouseService(), new MockUnicodeService()); + inputHandler = new TestInputHandler(bufferService, new MockCharsetService(), coreService, new MockLogService(), optionsService, new MockOscLinkService(), new MockMouseStateService(), new MockUnicodeService()); }); it('async CUP with CPR check', async () => { diff --git a/src/common/InputHandler.ts b/src/common/InputHandler.ts index 327eb2ec6..68265c5df 100644 --- a/src/common/InputHandler.ts +++ b/src/common/InputHandler.ts @@ -15,7 +15,7 @@ import { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } fr import { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from 'common/buffer/Constants'; import { CellData } from 'common/buffer/CellData'; import { AttributeData } from 'common/buffer/AttributeData'; -import { ICoreService, IBufferService, IOptionsService, ILogService, ICoreMouseService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from 'common/services/Services'; +import { ICoreService, IBufferService, IOptionsService, ILogService, IMouseStateService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from 'common/services/Services'; import { UnicodeService } from 'common/services/UnicodeService'; import { OscHandler } from 'common/parser/OscParser'; import { DcsHandler } from 'common/parser/DcsParser'; @@ -178,7 +178,7 @@ export class InputHandler extends Disposable implements IInputHandler { private readonly _logService: ILogService, private readonly _optionsService: IOptionsService, private readonly _oscLinkService: IOscLinkService, - private readonly _coreMouseService: ICoreMouseService, + private readonly _mouseStateService: IMouseStateService, private readonly _unicodeService: IUnicodeService, private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser() ) { @@ -1987,19 +1987,19 @@ export class InputHandler extends Disposable implements IInputHandler { break; case 9: // X10 Mouse // no release, no motion, no wheel, no modifiers. - this._coreMouseService.activeProtocol = 'X10'; + this._mouseStateService.activeProtocol = 'X10'; break; case 1000: // vt200 mouse // no motion. - this._coreMouseService.activeProtocol = 'VT200'; + this._mouseStateService.activeProtocol = 'VT200'; break; case 1002: // button event mouse - this._coreMouseService.activeProtocol = 'DRAG'; + this._mouseStateService.activeProtocol = 'DRAG'; break; case 1003: // any event mouse // any event - sends motion events, // even if there is no button held down. - this._coreMouseService.activeProtocol = 'ANY'; + this._mouseStateService.activeProtocol = 'ANY'; break; case 1004: // send focusin/focusout events // focusin: ^[[I @@ -2011,13 +2011,13 @@ export class InputHandler extends Disposable implements IInputHandler { this._logService.debug('DECSET 1005 not supported (see #2507)'); break; case 1006: // sgr ext mode mouse - this._coreMouseService.activeEncoding = 'SGR'; + this._mouseStateService.activeEncoding = 'SGR'; break; case 1015: // urxvt ext mode mouse - removed in #2507 this._logService.debug('DECSET 1015 not supported (see #2507)'); break; case 1016: // sgr pixels mode mouse - this._coreMouseService.activeEncoding = 'SGR_PIXELS'; + this._mouseStateService.activeEncoding = 'SGR_PIXELS'; break; case 25: // show cursor this._coreService.isCursorHidden = false; @@ -2248,7 +2248,7 @@ export class InputHandler extends Disposable implements IInputHandler { case 1000: // vt200 mouse case 1002: // button event mouse case 1003: // any event mouse - this._coreMouseService.activeProtocol = 'NONE'; + this._mouseStateService.activeProtocol = 'NONE'; break; case 1004: // send focusin/focusout events this._coreService.decPrivateModes.sendFocus = false; @@ -2257,13 +2257,13 @@ export class InputHandler extends Disposable implements IInputHandler { this._logService.debug('DECRST 1005 not supported (see #2507)'); break; case 1006: // sgr ext mode mouse - this._coreMouseService.activeEncoding = 'DEFAULT'; + this._mouseStateService.activeEncoding = 'DEFAULT'; break; case 1015: // urxvt ext mode mouse - removed in #2507 this._logService.debug('DECRST 1015 not supported (see #2507)'); break; case 1016: // sgr pixels mode mouse - this._coreMouseService.activeEncoding = 'DEFAULT'; + this._mouseStateService.activeEncoding = 'DEFAULT'; break; case 25: // hide cursor this._coreService.isCursorHidden = true; @@ -2357,7 +2357,7 @@ export class InputHandler extends Disposable implements IInputHandler { // access helpers const dm = this._coreService.decPrivateModes; - const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._coreMouseService; + const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._mouseStateService; const cs = this._coreService; const { buffers, cols } = this._bufferService; const { active, alt } = buffers; diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index 0f982b302..cd09be569 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IBufferService, ICoreService, ILogService, IOptionsService, ITerminalOptions, ICoreMouseService, ICharsetService, UnicodeCharProperties, UnicodeCharWidth, IUnicodeService, IUnicodeVersionProvider, LogLevelEnum, IDecorationService, IInternalDecoration, IOscLinkService, type IBufferResizeEvent } from 'common/services/Services'; +import { IBufferService, ICoreService, ILogService, IOptionsService, ITerminalOptions, IMouseStateService, ICharsetService, UnicodeCharProperties, UnicodeCharWidth, IUnicodeService, IUnicodeVersionProvider, LogLevelEnum, IDecorationService, IInternalDecoration, IOscLinkService, type IBufferResizeEvent } from 'common/services/Services'; import { UnicodeService } from 'common/services/UnicodeService'; import { clone } from 'common/Clone'; import { DEFAULT_OPTIONS } from 'common/services/OptionsService'; @@ -66,7 +66,7 @@ export class MockBufferService implements IBufferService { public reset(): void { } } -export class MockCoreMouseService implements ICoreMouseService { +export class MockMouseStateService implements IMouseStateService { public serviceBrand: any; public areMouseEventsActive: boolean = false; public activeEncoding: string = ''; diff --git a/src/common/Types.ts b/src/common/Types.ts index 7ceda21d2..0a9c89a1a 100644 --- a/src/common/Types.ts +++ b/src/common/Types.ts @@ -7,12 +7,12 @@ import { IDeleteEvent, IInsertEvent } from 'common/CircularList'; import { UnderlineStyle } from 'common/buffer/Constants'; import { IBufferSet } from 'common/buffer/Types'; import { IParams } from 'common/parser/Types'; -import { ICoreMouseService, ICoreService, IOptionsService, IUnicodeService } from 'common/services/Services'; +import { IMouseStateService, ICoreService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { IFunctionIdentifier, ITerminalOptions as IPublicTerminalOptions } from '@xterm/xterm'; import type { Emitter, IEvent } from 'common/Event'; export interface ICoreTerminal { - coreMouseService: ICoreMouseService; + mouseStateService: IMouseStateService; coreService: ICoreService; optionsService: IOptionsService; unicodeService: IUnicodeService; @@ -343,7 +343,7 @@ export interface ICoreMouseEvent { * it is not possible to report multiple buttons at once. * Wheel is treated as a button. * There are invalid combinations of buttons and actions possible - * (like move + wheel), those are silently ignored by the CoreMouseService. + * (like move + wheel), those are silently ignored by the MouseStateService. */ button: CoreMouseButton; action: CoreMouseAction; @@ -360,7 +360,7 @@ export interface ICoreMouseEvent { * CoreMouseEventType * To be reported to the browser component which events a mouse * protocol wants to be catched and forwarded as an ICoreMouseEvent - * to CoreMouseService. + * to MouseStateService. */ export const enum CoreMouseEventType { NONE = 0, @@ -378,7 +378,7 @@ export const enum CoreMouseEventType { /** * Mouse protocol interface. - * A mouse protocol can be registered and activated at the CoreMouseService. + * A mouse protocol can be registered and activated at the MouseStateService. * `events` should contain a list of needed events as a hint for the browser component * to install/remove the appropriate event handlers. * `restrict` applies further protocol specific restrictions like not allowed @@ -391,7 +391,7 @@ export interface ICoreMouseProtocol { /** * CoreMouseEncoding - * The tracking encoding can be registered and activated at the CoreMouseService. + * The tracking encoding can be registered and activated at the MouseStateService. * If a ICoreMouseEvent passes all procotol restrictions it will be encoded * with the active encoding and sent out. * Note: Returning an empty string will supress sending a mouse report, diff --git a/src/common/services/CoreMouseService.test.ts b/src/common/services/MouseStateService.test.ts similarity index 94% rename from src/common/services/CoreMouseService.test.ts rename to src/common/services/MouseStateService.test.ts index 3b79596d2..ce8c1f10d 100644 --- a/src/common/services/CoreMouseService.test.ts +++ b/src/common/services/MouseStateService.test.ts @@ -2,7 +2,7 @@ * Copyright (c) 2019 The xterm.js authors. All rights reserved. * @license MIT */ -import { CoreMouseService } from 'common/services/CoreMouseService'; +import { MouseStateService } from 'common/services/MouseStateService'; import { MockCoreService, MockBufferService, MockOptionsService } from 'common/TestUtils.test'; import { assert } from 'chai'; import { ICoreMouseEvent, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types'; @@ -23,22 +23,22 @@ function toBytes(s: string | undefined): number[] { return res; } -describe('CoreMouseService', () => { +describe('MouseStateService', () => { it('init', () => { - const cms = new CoreMouseService(bufferService, coreService, optionsService); + const cms = new MouseStateService(bufferService, coreService, optionsService); assert.equal(cms.activeEncoding, 'DEFAULT'); assert.equal(cms.activeProtocol, 'NONE'); }); it('default protocols - NONE, X10, VT200, DRAG, ANY', () => { - const cms = new CoreMouseService(bufferService, coreService, optionsService); + const cms = new MouseStateService(bufferService, coreService, optionsService); assert.deepEqual(Object.keys((cms as any)._protocols), ['NONE', 'X10', 'VT200', 'DRAG', 'ANY']); }); it('default encodings - DEFAULT, SGR', () => { - const cms = new CoreMouseService(bufferService, coreService, optionsService); + const cms = new MouseStateService(bufferService, coreService, optionsService); assert.deepEqual(Object.keys((cms as any)._encodings), ['DEFAULT', 'SGR', 'SGR_PIXELS']); }); it('protocol/encoding setter, reset', () => { - const cms = new CoreMouseService(bufferService, coreService, optionsService); + const cms = new MouseStateService(bufferService, coreService, optionsService); cms.activeEncoding = 'SGR'; cms.activeProtocol = 'ANY'; assert.equal(cms.activeEncoding, 'SGR'); @@ -50,19 +50,19 @@ describe('CoreMouseService', () => { assert.throws(() => { cms.activeProtocol = 'xyz'; }, 'unknown protocol "xyz"'); }); it('addEncoding', () => { - const cms = new CoreMouseService(bufferService, coreService, optionsService); + const cms = new MouseStateService(bufferService, coreService, optionsService); cms.addEncoding('XYZ', (e: ICoreMouseEvent) => ''); cms.activeEncoding = 'XYZ'; assert.equal(cms.activeEncoding, 'XYZ'); }); it('addProtocol', () => { - const cms = new CoreMouseService(bufferService, coreService, optionsService); + const cms = new MouseStateService(bufferService, coreService, optionsService); cms.addProtocol('XYZ', { events: CoreMouseEventType.NONE, restrict: (e: ICoreMouseEvent) => false }); cms.activeProtocol = 'XYZ'; assert.equal(cms.activeProtocol, 'XYZ'); }); it('onProtocolChange', () => { - const cms = new CoreMouseService(bufferService, coreService, optionsService); + const cms = new MouseStateService(bufferService, coreService, optionsService); const wantedEvents: CoreMouseEventType[] = []; cms.onProtocolChange(events => wantedEvents.push(events)); cms.activeProtocol = 'NONE'; @@ -74,10 +74,10 @@ describe('CoreMouseService', () => { ]); }); describe('triggerMouseEvent', () => { - let cms: CoreMouseService; + let cms: MouseStateService; let reports: string[]; beforeEach(() => { - cms = new CoreMouseService(bufferService, coreService, optionsService); + cms = new MouseStateService(bufferService, coreService, optionsService); reports = []; coreService.triggerDataEvent = (data: string, userInput?: boolean) => reports.push(data); coreService.triggerBinaryEvent = (data: string) => reports.push(data); diff --git a/src/common/services/CoreMouseService.ts b/src/common/services/MouseStateService.ts similarity index 98% rename from src/common/services/CoreMouseService.ts rename to src/common/services/MouseStateService.ts index d569f0460..7a52d97ed 100644 --- a/src/common/services/CoreMouseService.ts +++ b/src/common/services/MouseStateService.ts @@ -2,7 +2,7 @@ * Copyright (c) 2019 The xterm.js authors. All rights reserved. * @license MIT */ -import { IBufferService, ICoreService, ICoreMouseService, IOptionsService } from 'common/services/Services'; +import { IBufferService, ICoreService, IMouseStateService, IOptionsService } from 'common/services/Services'; import { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types'; import { Disposable } from 'common/Lifecycle'; import { Emitter } from 'common/Event'; @@ -151,7 +151,7 @@ const DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = { }; /** - * CoreMouseService + * MouseStateService * * Provides mouse tracking reports with different protocols and encodings. * - protocols: NONE (default), X10, VT200, DRAG, ANY @@ -166,7 +166,7 @@ const DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = { * a tracking report to the backend based on protocol and encoding limitations. * To send a mouse event call `triggerMouseEvent`. */ -export class CoreMouseService extends Disposable implements ICoreMouseService { +export class MouseStateService extends Disposable implements IMouseStateService { public serviceBrand: any; private _protocols: { [name: string]: ICoreMouseProtocol } = {}; diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index e0af27eee..9a7561be0 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -33,8 +33,8 @@ export interface IBufferResizeEvent { rowsChanged: boolean; } -export const ICoreMouseService = createDecorator('CoreMouseService'); -export interface ICoreMouseService { +export const IMouseStateService = createDecorator('MouseStateService'); +export interface IMouseStateService { serviceBrand: undefined; activeProtocol: string; diff --git a/src/headless/public/Terminal.ts b/src/headless/public/Terminal.ts index 726149338..0d4e6e93b 100644 --- a/src/headless/public/Terminal.ts +++ b/src/headless/public/Terminal.ts @@ -103,7 +103,7 @@ export class Terminal extends Disposable implements ITerminalApi { public get modes(): IModes { const m = this._core.coreService.decPrivateModes; let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none'; - switch (this._core.coreMouseService.activeProtocol) { + switch (this._core.mouseStateService.activeProtocol) { case 'X10': mouseTrackingMode = 'x10'; break; case 'VT200': mouseTrackingMode = 'vt200'; break; case 'DRAG': mouseTrackingMode = 'drag'; break; diff --git a/test/playwright/InputHandler.test.ts b/test/playwright/InputHandler.test.ts index a62d1fbcc..eec2938a8 100644 --- a/test/playwright/InputHandler.test.ts +++ b/test/playwright/InputHandler.test.ts @@ -584,13 +584,13 @@ test.describe('InputHandler Integration Tests', () => { }); test('Ps = 1 0 0 5 - Enable UTF-8 Mouse Mode, xterm', async () => { await ctx.proxy.write('\x1b[?1006h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); await ctx.proxy.write('\x1b[?1005h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); }); test('Ps = 1 0 0 6 - Enable SGR Mouse Mode, xterm', async () => { await ctx.proxy.write('\x1b[?1006h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); }); test('Ps = 1 0 0 7 - Enable Alternate Scroll Mode, xterm', async () => { await assertNoModeChange('\x1b[?1007h'); @@ -603,13 +603,13 @@ test.describe('InputHandler Integration Tests', () => { }); test('Ps = 1 0 1 5 - Enable urxvt Mouse Mode', async () => { await ctx.proxy.write('\x1b[?1006h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); await ctx.proxy.write('\x1b[?1015h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); }); test('Ps = 1 0 1 6 - Enable SGR Mouse PixelMode, xterm', async () => { await ctx.proxy.write('\x1b[?1016h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR_PIXELS'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR_PIXELS'); }); test('Ps = 1 0 3 4 - Interpret "meta" key, xterm', async () => { await assertNoModeChange('\x1b[?1034h'); @@ -916,15 +916,15 @@ test.describe('InputHandler Integration Tests', () => { }); test('Ps = 1 0 0 5 - Disable UTF-8 Mouse Mode, xterm.', async () => { await ctx.proxy.write('\x1b[?1006h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); await ctx.proxy.write('\x1b[?1005l'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); }); test('Ps = 1 0 0 6 - Disable SGR Mouse Mode, xterm.', async () => { await ctx.proxy.write('\x1b[?1006h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); await ctx.proxy.write('\x1b[?1006l'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'DEFAULT'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'DEFAULT'); }); test('Ps = 1 0 0 7 - Disable Alternate Scroll Mode, xterm. This corresponds to the alternateScroll resource.', async () => { await assertNoModeChange('\x1b[?1007l'); @@ -937,15 +937,15 @@ test.describe('InputHandler Integration Tests', () => { }); test('Ps = 1 0 1 5 - Disable urxvt Mouse Mode.', async () => { await ctx.proxy.write('\x1b[?1006h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); await ctx.proxy.write('\x1b[?1015l'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR'); }); test('Ps = 1 0 1 6 - Disable SGR Mouse Pixel-Mode, xterm.', async () => { await ctx.proxy.write('\x1b[?1016h'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'SGR_PIXELS'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'SGR_PIXELS'); await ctx.proxy.write('\x1b[?1016l'); - await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding), 'DEFAULT'); + await pollFor(ctx.page, async () => await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding), 'DEFAULT'); }); test('Ps = 1 0 3 4 - Don\'t interpret "meta" key, xterm. This disables the eightBitInput resource.', async () => { await assertNoModeChange('\x1b[?1034l'); @@ -1849,8 +1849,8 @@ async function getModeSnapshot(): Promise { cols: await ctx.proxy.cols, rows: await ctx.proxy.rows, bufferType: await ctx.proxy.buffer.active.type, - mouseProtocol: await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeProtocol), - mouseEncoding: await ctx.proxy.core.evaluate(([core]) => core.coreMouseService.activeEncoding) + mouseProtocol: await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeProtocol), + mouseEncoding: await ctx.proxy.core.evaluate(([core]) => core.mouseStateService.activeEncoding) }; } From d63445be9489eb876920b39ffa9f2e461747d541 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:36:35 +0900 Subject: [PATCH 118/124] Move custom mouse event handler into MouseStateService Don't need to keep it in CoreBrowserTerminal --- src/browser/CoreBrowserTerminal.ts | 5 +---- src/browser/TestUtils.test.ts | 4 ---- src/browser/services/MouseService.ts | 10 ++-------- src/browser/services/Services.ts | 3 +-- src/common/TestUtils.test.ts | 2 ++ src/common/services/MouseStateService.ts | 9 +++++++++ src/common/services/Services.ts | 10 ++++++++++ 7 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index fe74f3d80..de2d76a36 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -78,7 +78,6 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { public browser: IBrowser = Browser as any; private _customKeyEventHandler: CustomKeyEventHandler | undefined; - private _customWheelEventHandler: CustomWheelEventHandler | undefined; // Browser services private readonly _decorationService: DecorationService; @@ -582,7 +581,6 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { )); this._instantiationService.setService(ISelectionService, this._selectionService); this._mouseService = this._instantiationService.createInstance(MouseService); - this._mouseService.setCustomWheelEventHandler(this._customWheelEventHandler); this._instantiationService.setService(IMouseService, this._mouseService); this._register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent))); this._register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire())); @@ -727,8 +725,7 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { } public attachCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler): void { - this._customWheelEventHandler = customWheelEventHandler; - this._mouseService?.setCustomWheelEventHandler(customWheelEventHandler); + this.mouseStateService.setCustomWheelEventHandler(customWheelEventHandler); } public registerLinkProvider(linkProvider: ILinkProvider): IDisposable { diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index fc62b4c4b..4f38faa2e 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -393,10 +393,6 @@ export class MockMouseService implements IMouseService { throw new Error('Not implemented'); } - public setCustomWheelEventHandler(): void { - throw new Error('Not implemented'); - } - public bindMouse(): void { throw new Error('Not implemented'); } diff --git a/src/browser/services/MouseService.ts b/src/browser/services/MouseService.ts index b75ee15b8..d21b3debf 100644 --- a/src/browser/services/MouseService.ts +++ b/src/browser/services/MouseService.ts @@ -8,7 +8,6 @@ import { IBufferService, IMouseStateService, ICoreService, ILogService, IOptions import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, IDisposable } from 'common/Types'; import { C0 } from 'common/data/EscapeSequences'; import { toDisposable } from 'common/Lifecycle'; -import { CustomWheelEventHandler } from 'browser/Types'; import { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services'; type RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>; @@ -22,8 +21,6 @@ interface IMouseBindContext { export class MouseService implements IMouseService { public serviceBrand: undefined; - private _customWheelEventHandler: CustomWheelEventHandler | undefined; - constructor( @IRenderService private readonly _renderService: IRenderService, @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService, @@ -119,7 +116,7 @@ export class MouseService implements IMouseService { but = ev.button < 3 ? ev.button : CoreMouseButton.NONE; break; case 'wheel': - if (this._customWheelEventHandler && this._customWheelEventHandler(ev as WheelEvent) === false) { + if (!this._mouseStateService.allowCustomWheelEvent(ev as WheelEvent)) { return false; } const deltaY = (ev as WheelEvent).deltaY; @@ -226,7 +223,7 @@ export class MouseService implements IMouseService { return; } - if (this._customWheelEventHandler && this._customWheelEventHandler(ev) === false) { + if (!this._mouseStateService.allowCustomWheelEvent(ev)) { return false; } @@ -320,7 +317,4 @@ export class MouseService implements IMouseService { } } - public setCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler | undefined): void { - this._customWheelEventHandler = customWheelEventHandler; - } } diff --git a/src/browser/services/Services.ts b/src/browser/services/Services.ts index 7f1c10576..2471d5718 100644 --- a/src/browser/services/Services.ts +++ b/src/browser/services/Services.ts @@ -4,7 +4,7 @@ */ import { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types'; -import { CustomWheelEventHandler, IColorSet, ILink, ReadonlyColorSet } from 'browser/Types'; +import { IColorSet, ILink, ReadonlyColorSet } from 'browser/Types'; import { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types'; import { createDecorator } from 'common/services/ServiceRegistry'; import { AllColorIndex, IDisposable, IKeyboardResult } from 'common/Types'; @@ -61,7 +61,6 @@ export const IMouseService = createDecorator('MouseService'); export interface IMouseService { serviceBrand: undefined; - setCustomWheelEventHandler(customWheelEventHandler: CustomWheelEventHandler | undefined): void; bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void; } export interface IMouseServiceTarget { diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index cd09be569..cd5798d4f 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -82,6 +82,8 @@ export class MockMouseStateService implements IMouseStateService { public consumeWheelEvent(ev: WheelEvent, cellHeight: number, dpr: number): number { return 1; } + public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void { } + public allowCustomWheelEvent(ev: WheelEvent): boolean { return true; } } export class MockCharsetService implements ICharsetService { diff --git a/src/common/services/MouseStateService.ts b/src/common/services/MouseStateService.ts index 7a52d97ed..8a2629482 100644 --- a/src/common/services/MouseStateService.ts +++ b/src/common/services/MouseStateService.ts @@ -175,6 +175,7 @@ export class MouseStateService extends Disposable implements IMouseStateService private _activeEncoding: string = ''; private _lastEvent: ICoreMouseEvent | null = null; private _wheelPartialScroll: number = 0; + private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined; private readonly _onProtocolChange = this._register(new Emitter()); public readonly onProtocolChange = this._onProtocolChange.event; @@ -268,6 +269,14 @@ export class MouseStateService extends Disposable implements IMouseStateService return amount; } + public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void { + this._customWheelEventHandler = customWheelEventHandler; + } + + public allowCustomWheelEvent(ev: WheelEvent): boolean { + return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true; + } + private _applyScrollModifier(amount: number, ev: WheelEvent): number { // Multiply the scroll speed when the modifier key is pressed if (ev.altKey || ev.ctrlKey || ev.shiftKey) { diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index 9a7561be0..5b298d720 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -70,6 +70,16 @@ export interface IMouseStateService { * Process wheel event taking partial scroll into account. */ consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number; + + /** + * Sets a custom wheel event handler that can veto wheel processing. + */ + setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void; + + /** + * Checks whether a wheel event should be processed. + */ + allowCustomWheelEvent(ev: WheelEvent): boolean; } export const ICoreService = createDecorator('CoreService'); From 5f3a4646bef61a3d6bc4b3e2e93c085d47bbf76e Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 10:49:55 +0900 Subject: [PATCH 119/124] Move non-state methods into MouseService Fixes #5756 --- src/browser/CoreBrowserTerminal.ts | 1 + src/browser/TestUtils.test.ts | 5 +- src/browser/services/MouseService.ts | 145 ++++++++++++++- src/browser/services/Services.ts | 1 + src/common/TestUtils.test.ts | 11 +- src/common/services/MouseStateService.test.ts | 174 +++--------------- src/common/services/MouseStateService.ts | 142 ++------------ src/common/services/Services.ts | 38 +--- 8 files changed, 190 insertions(+), 327 deletions(-) diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index de2d76a36..828013e9e 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -1095,6 +1095,7 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._setup(); super.reset(); + this._mouseService?.reset(); this._selectionService?.reset(); this._decorationService.reset(); diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index 4f38faa2e..485900e41 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -393,9 +393,8 @@ export class MockMouseService implements IMouseService { throw new Error('Not implemented'); } - public bindMouse(): void { - throw new Error('Not implemented'); - } + public bindMouse(): void { } + public reset(): void { } } export class MockRenderService implements IRenderService { diff --git a/src/browser/services/MouseService.ts b/src/browser/services/MouseService.ts index d21b3debf..ddb457365 100644 --- a/src/browser/services/MouseService.ts +++ b/src/browser/services/MouseService.ts @@ -5,7 +5,7 @@ import { addDisposableListener } from 'browser/Dom'; import { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from 'common/services/Services'; -import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, IDisposable } from 'common/Types'; +import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from 'common/Types'; import { C0 } from 'common/data/EscapeSequences'; import { toDisposable } from 'common/Lifecycle'; import { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services'; @@ -21,6 +21,9 @@ interface IMouseBindContext { export class MouseService implements IMouseService { public serviceBrand: undefined; + private _lastEvent: ICoreMouseEvent | null = null; + private _wheelPartialScroll: number = 0; + constructor( @IRenderService private readonly _renderService: IRenderService, @IMouseCoordsService private readonly _mouseCoordsService: IMouseCoordsService, @@ -123,7 +126,7 @@ export class MouseService implements IMouseService { if (deltaY === 0) { return false; } - const lines = this._mouseStateService.consumeWheelEvent( + const lines = this._consumeWheelEvent( ev as WheelEvent, this._renderService?.dimensions?.device?.cell?.height, this._coreBrowserService?.dpr @@ -145,7 +148,7 @@ export class MouseService implements IMouseService { return false; } - return this._mouseStateService.triggerMouseEvent({ + return this._triggerMouseEvent({ col: pos.col, row: pos.row, x: pos.x, @@ -241,7 +244,7 @@ export class MouseService implements IMouseService { return false; } - const lines = this._mouseStateService.consumeWheelEvent( + const lines = this._consumeWheelEvent( ev, this._renderService?.dimensions?.device?.cell?.height, this._coreBrowserService?.dpr @@ -261,13 +264,18 @@ export class MouseService implements IMouseService { } } + public reset(): void { + this._lastEvent = null; + this._wheelPartialScroll = 0; + } + private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void { const { element, document } = ctx.target; const { requestedEvents } = ctx; // apply global changes on events if (events) { if (this._optionsService.rawOptions.logLevel === 'debug') { - this._logService.debug('Binding to mouse events:', this._mouseStateService.explainEvents(events)); + this._logService.debug('Binding to mouse events:', this._explainEvents(events)); } element.classList.add('enable-mouse-events'); this._selectionService.disable(); @@ -317,4 +325,131 @@ export class MouseService implements IMouseService { } } + private _applyScrollModifier(amount: number, ev: WheelEvent): number { + // Multiply the scroll speed when the modifier key is pressed + if (ev.altKey || ev.ctrlKey || ev.shiftKey) { + return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity; + } + return amount * this._optionsService.rawOptions.scrollSensitivity; + } + + /** + * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls. + * This prevents hyper-sensitive scrolling in alt buffer. + */ + private _consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number { + // Do nothing if it's not a vertical scroll event + if (ev.deltaY === 0 || ev.shiftKey) { + return 0; + } + + if (cellHeight === undefined || dpr === undefined) { + return 0; + } + + const targetWheelEventPixels = cellHeight / dpr; + let amount = this._applyScrollModifier(ev.deltaY, ev); + + if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) { + amount /= (targetWheelEventPixels + 0.0); // Prevent integer division + + const isLikelyTrackpad = Math.abs(ev.deltaY) < 50; + if (isLikelyTrackpad) { + amount *= 0.3; + } + + this._wheelPartialScroll += amount; + amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1); + this._wheelPartialScroll %= 1; + } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) { + amount *= this._bufferService.rows; + } + return amount; + } + + /** + * Triggers a mouse event to be sent. + * + * Returns true if the event passed all protocol restrictions and a report + * was sent, otherwise false. The return value may be used to decide whether + * the default event action in the browser component should be omitted. + * + * Note: The method will change values of the given event object + * to fulfill protocol and encoding restrictions. + */ + private _triggerMouseEvent(e: ICoreMouseEvent): boolean { + // range check for col/row + if (e.col < 0 || e.col >= this._bufferService.cols + || e.row < 0 || e.row >= this._bufferService.rows) { + return false; + } + + // filter nonsense combinations of button + action + if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) { + return false; + } + if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) { + return false; + } + if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) { + return false; + } + + // report 1-based coords + e.col++; + e.row++; + + // debounce move events at grid or pixel level + if (e.action === CoreMouseAction.MOVE + && this._lastEvent + && this._equalEvents(this._lastEvent, e, this._mouseStateService.isPixelEncoding) + ) { + return false; + } + + // apply protocol restrictions + if (!this._mouseStateService.restrictMouseEvent(e)) { + return false; + } + + // encode report and send + const report = this._mouseStateService.encodeMouseEvent(e); + if (report) { + if (this._mouseStateService.isDefaultEncoding) { + this._coreService.triggerBinaryEvent(report); + } else { + this._coreService.triggerDataEvent(report, true); + } + } + + this._lastEvent = e; + return true; + } + + private _explainEvents(events: CoreMouseEventType): { [event: string]: boolean } { + return { + down: !!(events & CoreMouseEventType.DOWN), + up: !!(events & CoreMouseEventType.UP), + drag: !!(events & CoreMouseEventType.DRAG), + move: !!(events & CoreMouseEventType.MOVE), + wheel: !!(events & CoreMouseEventType.WHEEL) + }; + } + + private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean { + if (pixels) { + if (e1.x !== e2.x) return false; + if (e1.y !== e2.y) return false; + } else { + if (e1.col !== e2.col) return false; + if (e1.row !== e2.row) return false; + } + if (e1.button !== e2.button) return false; + if (e1.action !== e2.action) return false; + if (e1.ctrl !== e2.ctrl) return false; + if (e1.alt !== e2.alt) return false; + if (e1.shift !== e2.shift) return false; + return true; + } + } diff --git a/src/browser/services/Services.ts b/src/browser/services/Services.ts index 2471d5718..47c46ec66 100644 --- a/src/browser/services/Services.ts +++ b/src/browser/services/Services.ts @@ -62,6 +62,7 @@ export interface IMouseService { serviceBrand: undefined; bindMouse(target: IMouseServiceTarget, register: (disposable: IDisposable) => void, focus: () => void): void; + reset(): void; } export interface IMouseServiceTarget { element: HTMLElement; diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index cd5798d4f..0884a4ab4 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -71,17 +71,14 @@ export class MockMouseStateService implements IMouseStateService { public areMouseEventsActive: boolean = false; public activeEncoding: string = ''; public activeProtocol: string = ''; + public isDefaultEncoding: boolean = true; + public isPixelEncoding: boolean = false; public addEncoding(name: string): void { } public addProtocol(name: string): void { } public reset(): void { } - public triggerMouseEvent(event: ICoreMouseEvent): boolean { return false; } public onProtocolChange: IEvent = new Emitter().event; - public explainEvents(events: CoreMouseEventType): { [event: string]: boolean } { - throw new Error('Method not implemented.'); - } - public consumeWheelEvent(ev: WheelEvent, cellHeight: number, dpr: number): number { - return 1; - } + public restrictMouseEvent(event: ICoreMouseEvent): boolean { return true; } + public encodeMouseEvent(event: ICoreMouseEvent): string { return ''; } public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void { } public allowCustomWheelEvent(ev: WheelEvent): boolean { return true; } } diff --git a/src/common/services/MouseStateService.test.ts b/src/common/services/MouseStateService.test.ts index ce8c1f10d..06c619fdd 100644 --- a/src/common/services/MouseStateService.test.ts +++ b/src/common/services/MouseStateService.test.ts @@ -3,14 +3,8 @@ * @license MIT */ import { MouseStateService } from 'common/services/MouseStateService'; -import { MockCoreService, MockBufferService, MockOptionsService } from 'common/TestUtils.test'; import { assert } from 'chai'; -import { ICoreMouseEvent, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types'; - -// needed mock services -const bufferService = new MockBufferService(300, 100); -const coreService = new MockCoreService(); -const optionsService = new MockOptionsService(); +import { ICoreMouseEvent, CoreMouseEventType } from 'common/Types'; function toBytes(s: string | undefined): number[] { if (!s) { @@ -25,20 +19,20 @@ function toBytes(s: string | undefined): number[] { describe('MouseStateService', () => { it('init', () => { - const cms = new MouseStateService(bufferService, coreService, optionsService); + const cms = new MouseStateService(); assert.equal(cms.activeEncoding, 'DEFAULT'); assert.equal(cms.activeProtocol, 'NONE'); }); it('default protocols - NONE, X10, VT200, DRAG, ANY', () => { - const cms = new MouseStateService(bufferService, coreService, optionsService); + const cms = new MouseStateService(); assert.deepEqual(Object.keys((cms as any)._protocols), ['NONE', 'X10', 'VT200', 'DRAG', 'ANY']); }); it('default encodings - DEFAULT, SGR', () => { - const cms = new MouseStateService(bufferService, coreService, optionsService); + const cms = new MouseStateService(); assert.deepEqual(Object.keys((cms as any)._encodings), ['DEFAULT', 'SGR', 'SGR_PIXELS']); }); it('protocol/encoding setter, reset', () => { - const cms = new MouseStateService(bufferService, coreService, optionsService); + const cms = new MouseStateService(); cms.activeEncoding = 'SGR'; cms.activeProtocol = 'ANY'; assert.equal(cms.activeEncoding, 'SGR'); @@ -50,19 +44,19 @@ describe('MouseStateService', () => { assert.throws(() => { cms.activeProtocol = 'xyz'; }, 'unknown protocol "xyz"'); }); it('addEncoding', () => { - const cms = new MouseStateService(bufferService, coreService, optionsService); + const cms = new MouseStateService(); cms.addEncoding('XYZ', (e: ICoreMouseEvent) => ''); cms.activeEncoding = 'XYZ'; assert.equal(cms.activeEncoding, 'XYZ'); }); it('addProtocol', () => { - const cms = new MouseStateService(bufferService, coreService, optionsService); + const cms = new MouseStateService(); cms.addProtocol('XYZ', { events: CoreMouseEventType.NONE, restrict: (e: ICoreMouseEvent) => false }); cms.activeProtocol = 'XYZ'; assert.equal(cms.activeProtocol, 'XYZ'); }); it('onProtocolChange', () => { - const cms = new MouseStateService(bufferService, coreService, optionsService); + const cms = new MouseStateService(); const wantedEvents: CoreMouseEventType[] = []; cms.onProtocolChange(events => wantedEvents.push(events)); cms.activeProtocol = 'NONE'; @@ -73,140 +67,22 @@ describe('MouseStateService', () => { CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE ]); }); - describe('triggerMouseEvent', () => { - let cms: MouseStateService; - let reports: string[]; - beforeEach(() => { - cms = new MouseStateService(bufferService, coreService, optionsService); - reports = []; - coreService.triggerDataEvent = (data: string, userInput?: boolean) => reports.push(data); - coreService.triggerBinaryEvent = (data: string) => reports.push(data); - }); - it('NONE', () => { - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE }), false); - }); - it('X10', () => { - cms.activeProtocol = 'X10'; - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE }), false); - }); - it('VT200', () => { - cms.activeProtocol = 'VT200'; - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE }), false); - }); - it('DRAG', () => { - cms.activeProtocol = 'DRAG'; - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), true); - }); - it('ANY', () => { - cms.activeProtocol = 'ANY'; - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE }), true); - // should not report in any case - // invalid button + action combinations - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.MOVE }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.DOWN }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.UP }), false); - // invalid coords - assert.equal(cms.triggerMouseEvent({ col: -1, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); - assert.equal(cms.triggerMouseEvent({ col: 500, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: -1, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 500, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); - }); - describe('coords', () => { - it('DEFAULT encoding', () => { - cms.activeProtocol = 'ANY'; - for (let i = 0; i < bufferService.cols; ++i) { - assert.equal(cms.triggerMouseEvent({ col: i, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); - if (i > 222) { - // supress mouse reports if we are out of addressible range (max. 222) - assert.deepEqual(toBytes(reports.pop()), []); - } else { - assert.deepEqual(toBytes(reports.pop()), [0x1b, 0x5b, 0x4d, 0x20, i + 33, 0x21]); - } - } - }); - it('SGR encoding', () => { - cms.activeProtocol = 'ANY'; - cms.activeEncoding = 'SGR'; - for (let i = 0; i < bufferService.cols; ++i) { - assert.equal(cms.triggerMouseEvent({ col: i, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); - assert.deepEqual(reports.pop(), `\x1b[<0;${i + 1};1M`); - } - }); - it('SGR_PIXELS encoding', () => { - cms.activeProtocol = 'ANY'; - cms.activeEncoding = 'SGR_PIXELS'; - for (let i = 0; i < 500; ++i) { - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: i, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); - assert.deepEqual(reports.pop(), `\x1b[<0;${i};0M`); - } - }); - }); - it('eventCodes with modifiers (DEFAULT encoding)', () => { - // TODO: implement AUX button tests - cms.activeProtocol = 'ANY'; - cms.activeEncoding = 'DEFAULT'; - // all buttons + down + no modifer - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN, ctrl: false, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN, ctrl: false, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN, ctrl: false, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.DOWN, ctrl: false, alt: false, shift: false }), true); - assert.deepEqual(reports, ['\x1b[M !!', '\x1b[M!!!', '\x1b[M"!!', '\x1b[Ma!!']); - reports = []; - - // all buttons + up + no modifier - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP, ctrl: false, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.UP, ctrl: false, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.UP, ctrl: false, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP, ctrl: false, alt: false, shift: false }), true); - assert.deepEqual(reports, ['\x1b[M#!!', '\x1b[M#!!', '\x1b[M#!!', '\x1b[M`!!']); - reports = []; - - // all buttons + move + no modifier - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: false }), true); - assert.deepEqual(reports, ['\x1b[M@!!', '\x1b[MA!!', '\x1b[MB!!', '\x1b[MC!!']); - reports = []; - - // button none + move + modifiers - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: true, alt: false, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: false, alt: true, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: true }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: true, alt: true, shift: false }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: false, alt: true, shift: true }), true); - assert.equal(cms.triggerMouseEvent({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: true, alt: true, shift: true }), true); - assert.deepEqual(reports, ['\x1b[MS!!', '\x1b[MK!!', '\x1b[MG!!', '\x1b[M[!!', '\x1b[MO!!', '\x1b[M_!!']); - reports = []; - }); + it('restrictMouseEvent/encodeMouseEvent', () => { + const cms = new MouseStateService(); + const event: ICoreMouseEvent = { + col: 1, + row: 1, + x: 0, + y: 0, + button: 0, + action: 1, + ctrl: false, + alt: false, + shift: false + }; + cms.activeProtocol = 'ANY'; + cms.activeEncoding = 'DEFAULT'; + assert.equal(cms.restrictMouseEvent(event), true); + assert.deepEqual(toBytes(cms.encodeMouseEvent(event)), [0x1b, 0x5b, 0x4d, 0x21, 0x21, 0x21]); }); }); diff --git a/src/common/services/MouseStateService.ts b/src/common/services/MouseStateService.ts index 8a2629482..21420460a 100644 --- a/src/common/services/MouseStateService.ts +++ b/src/common/services/MouseStateService.ts @@ -2,7 +2,7 @@ * Copyright (c) 2019 The xterm.js authors. All rights reserved. * @license MIT */ -import { IBufferService, ICoreService, IMouseStateService, IOptionsService } from 'common/services/Services'; +import { IMouseStateService } from 'common/services/Services'; import { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types'; import { Disposable } from 'common/Lifecycle'; import { Emitter } from 'common/Event'; @@ -173,19 +173,14 @@ export class MouseStateService extends Disposable implements IMouseStateService private _encodings: { [name: string]: CoreMouseEncoding } = {}; private _activeProtocol: string = ''; private _activeEncoding: string = ''; - private _lastEvent: ICoreMouseEvent | null = null; - private _wheelPartialScroll: number = 0; private _customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined; private readonly _onProtocolChange = this._register(new Emitter()); public readonly onProtocolChange = this._onProtocolChange.event; - constructor( - @IBufferService private readonly _bufferService: IBufferService, - @ICoreService private readonly _coreService: ICoreService, - @IOptionsService private readonly _optionsService: IOptionsService - ) { + constructor() { super(); + // register default protocols and encodings for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]); for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]); @@ -231,42 +226,6 @@ export class MouseStateService extends Disposable implements IMouseStateService public reset(): void { this.activeProtocol = 'NONE'; this.activeEncoding = 'DEFAULT'; - this._lastEvent = null; - this._wheelPartialScroll = 0; - } - - /** - * Processes a wheel event, accounting for partial scrolls for trackpad, mouse scrolls. - * This prevents hyper-sensitive scrolling in alt buffer. - */ - public consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number { - // Do nothing if it's not a vertical scroll event - if (ev.deltaY === 0 || ev.shiftKey) { - return 0; - } - - if (cellHeight === undefined || dpr === undefined) { - return 0; - } - - const targetWheelEventPixels = cellHeight / dpr; - let amount = this._applyScrollModifier(ev.deltaY, ev); - - if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) { - amount /= (targetWheelEventPixels + 0.0); // Prevent integer division - - const isLikelyTrackpad = Math.abs(ev.deltaY) < 50; - if (isLikelyTrackpad) { - amount *= 0.3; - } - - this._wheelPartialScroll += amount; - amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1); - this._wheelPartialScroll %= 1; - } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) { - amount *= this._bufferService.rows; - } - return amount; } public setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void { @@ -277,98 +236,19 @@ export class MouseStateService extends Disposable implements IMouseStateService return this._customWheelEventHandler ? this._customWheelEventHandler(ev) !== false : true; } - private _applyScrollModifier(amount: number, ev: WheelEvent): number { - // Multiply the scroll speed when the modifier key is pressed - if (ev.altKey || ev.ctrlKey || ev.shiftKey) { - return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity; - } - return amount * this._optionsService.rawOptions.scrollSensitivity; + public restrictMouseEvent(e: ICoreMouseEvent): boolean { + return this._protocols[this._activeProtocol].restrict(e); } - /** - * Triggers a mouse event to be sent. - * - * Returns true if the event passed all protocol restrictions and a report - * was sent, otherwise false. The return value may be used to decide whether - * the default event action in the bowser component should be omitted. - * - * Note: The method will change values of the given event object - * to fullfill protocol and encoding restrictions. - */ - public triggerMouseEvent(e: ICoreMouseEvent): boolean { - // range check for col/row - if (e.col < 0 || e.col >= this._bufferService.cols - || e.row < 0 || e.row >= this._bufferService.rows) { - return false; - } - - // filter nonsense combinations of button + action - if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) { - return false; - } - if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) { - return false; - } - if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) { - return false; - } - - // report 1-based coords - e.col++; - e.row++; - - // debounce move events at grid or pixel level - if (e.action === CoreMouseAction.MOVE - && this._lastEvent - && this._equalEvents(this._lastEvent, e, this._activeEncoding === 'SGR_PIXELS') - ) { - return false; - } - - // apply protocol restrictions - if (!this._protocols[this._activeProtocol].restrict(e)) { - return false; - } - - // encode report and send - const report = this._encodings[this._activeEncoding](e); - if (report) { - // always send DEFAULT as binary data - if (this._activeEncoding === 'DEFAULT') { - this._coreService.triggerBinaryEvent(report); - } else { - this._coreService.triggerDataEvent(report, true); - } - } - - this._lastEvent = e; - - return true; + public encodeMouseEvent(e: ICoreMouseEvent): string { + return this._encodings[this._activeEncoding](e); } - public explainEvents(events: CoreMouseEventType): { [event: string]: boolean } { - return { - down: !!(events & CoreMouseEventType.DOWN), - up: !!(events & CoreMouseEventType.UP), - drag: !!(events & CoreMouseEventType.DRAG), - move: !!(events & CoreMouseEventType.MOVE), - wheel: !!(events & CoreMouseEventType.WHEEL) - }; + public get isDefaultEncoding(): boolean { + return this._activeEncoding === 'DEFAULT'; } - private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean { - if (pixels) { - if (e1.x !== e2.x) return false; - if (e1.y !== e2.y) return false; - } else { - if (e1.col !== e2.col) return false; - if (e1.row !== e2.row) return false; - } - if (e1.button !== e2.button) return false; - if (e1.action !== e2.action) return false; - if (e1.ctrl !== e2.ctrl) return false; - if (e1.alt !== e2.alt) return false; - if (e1.shift !== e2.shift) return false; - return true; + public get isPixelEncoding(): boolean { + return this._activeEncoding === 'SGR_PIXELS'; } } diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index 5b298d720..a15dc23dc 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -43,43 +43,17 @@ export interface IMouseStateService { addProtocol(name: string, protocol: ICoreMouseProtocol): void; addEncoding(name: string, encoding: CoreMouseEncoding): void; reset(): void; - - /** - * Triggers a mouse event to be sent. - * - * Returns true if the event passed all protocol restrictions and a report - * was sent, otherwise false. The return value may be used to decide whether - * the default event action in the bowser component should be omitted. - * - * Note: The method will change values of the given event object - * to fullfill protocol and encoding restrictions. - */ - triggerMouseEvent(event: ICoreMouseEvent): boolean; + setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void; + allowCustomWheelEvent(ev: WheelEvent): boolean; /** * Event to announce changes in mouse tracking. */ onProtocolChange: IEvent; - - /** - * Human readable version of mouse events. - */ - explainEvents(events: CoreMouseEventType): { [event: string]: boolean }; - - /** - * Process wheel event taking partial scroll into account. - */ - consumeWheelEvent(ev: WheelEvent, cellHeight?: number, dpr?: number): number; - - /** - * Sets a custom wheel event handler that can veto wheel processing. - */ - setCustomWheelEventHandler(customWheelEventHandler: ((event: WheelEvent) => boolean) | undefined): void; - - /** - * Checks whether a wheel event should be processed. - */ - allowCustomWheelEvent(ev: WheelEvent): boolean; + restrictMouseEvent(event: ICoreMouseEvent): boolean; + encodeMouseEvent(event: ICoreMouseEvent): string; + readonly isDefaultEncoding: boolean; + readonly isPixelEncoding: boolean; } export const ICoreService = createDecorator('CoreService'); From 16b5da5c4c4b29704844f0f54bdce09cc413c3f5 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 11:02:25 +0900 Subject: [PATCH 120/124] Fix assertion, bring back triggerMouseEvent tests --- src/browser/services/MouseService.test.ts | 213 ++++++++++++++++++ src/common/services/MouseStateService.test.ts | 2 +- 2 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 src/browser/services/MouseService.test.ts diff --git a/src/browser/services/MouseService.test.ts b/src/browser/services/MouseService.test.ts new file mode 100644 index 000000000..f395083e3 --- /dev/null +++ b/src/browser/services/MouseService.test.ts @@ -0,0 +1,213 @@ +/** + * Copyright (c) 2019 The xterm.js authors. All rights reserved. + * @license MIT + */ +import { assert } from 'chai'; +import { MouseService } from 'browser/services/MouseService'; +import { MouseStateService } from 'common/services/MouseStateService'; +import { CoreMouseAction, CoreMouseButton } from 'common/Types'; +import { IBufferService, ICoreService, ILogService, IOptionsService } from 'common/services/Services'; +import { MockCoreBrowserService, MockRenderService, MockSelectionService } from 'browser/TestUtils.test'; + +function toBytes(s: string | undefined): number[] { + if (!s) { + return []; + } + const res: number[] = []; + for (let i = 0; i < s.length; ++i) { + res.push(s.charCodeAt(i)); + } + return res; +} + +// Minimal mocks for deps that MouseService touches in these tests +const bufferService: IBufferService = { + buffer: { hasScrollback: true } as any, + cols: 500, + rows: 500 +} as any; + +const optionsService: IOptionsService = { + rawOptions: { + logLevel: 'info', + fastScrollSensitivity: 1, + scrollSensitivity: 1 + } +} as any; + +const logService: ILogService = { + debug: () => {}, + info: () => {}, + warn: () => {}, + error: () => {} +} as any; + +describe('MouseService _triggerMouseEvent', () => { + let mouseService: MouseService; + let mouseStateService: MouseStateService; + let coreService: ICoreService; + let reports: string[]; + + beforeEach(() => { + reports = []; + mouseStateService = new MouseStateService(); + coreService = { + triggerDataEvent: (data: string) => reports.push(data), + triggerBinaryEvent: (data: string) => reports.push(data), + decPrivateModes: { applicationCursorKeys: false } + } as any; + + mouseService = new MouseService( + new MockRenderService(), + { + getMouseReportCoords: (_ev: MouseEvent, _el: HTMLElement) => ({ col: 0, row: 0, x: 0, y: 0 }) + } as any, + mouseStateService, + coreService, + bufferService, + optionsService, + new MockSelectionService(), + logService, + new MockCoreBrowserService() + ); + }); + + function trigger(e: Parameters[0]): boolean { + return (mouseService as any)._triggerMouseEvent(e); + } + + it('NONE', () => { + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE }), false); + }); + + it('X10', () => { + mouseStateService.activeProtocol = 'X10'; + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE }), false); + }); + + it('VT200', () => { + mouseStateService.activeProtocol = 'VT200'; + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE }), false); + }); + + it('DRAG', () => { + mouseStateService.activeProtocol = 'DRAG'; + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), true); + }); + + it('ANY', () => { + mouseStateService.activeProtocol = 'ANY'; + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE }), true); + // should not report in any case + // invalid button + action combinations + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.MOVE }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.DOWN }), false); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.UP }), false); + // invalid coords + assert.equal(trigger({ col: -1, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); + assert.equal(trigger({ col: 500, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); + assert.equal(trigger({ col: 0, row: -1, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); + assert.equal(trigger({ col: 0, row: 500, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), false); + }); + + describe('coords', () => { + it('DEFAULT encoding', () => { + mouseStateService.activeProtocol = 'ANY'; + for (let i = 0; i < bufferService.cols; ++i) { + assert.equal(trigger({ col: i, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); + if (i > 222) { + // supress mouse reports if we are out of addressible range (max. 222) + assert.deepEqual(toBytes(reports.pop()), []); + } else { + assert.deepEqual(toBytes(reports.pop()), [0x1b, 0x5b, 0x4d, 0x20, i + 33, 0x21]); + } + } + }); + + it('SGR encoding', () => { + mouseStateService.activeProtocol = 'ANY'; + mouseStateService.activeEncoding = 'SGR'; + for (let i = 0; i < bufferService.cols; ++i) { + assert.equal(trigger({ col: i, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); + assert.deepEqual(reports.pop(), `\x1b[<0;${i + 1};1M`); + } + }); + + it('SGR_PIXELS encoding', () => { + mouseStateService.activeProtocol = 'ANY'; + mouseStateService.activeEncoding = 'SGR_PIXELS'; + for (let i = 0; i < 500; ++i) { + assert.equal(trigger({ col: 0, row: 0, x: i, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN }), true); + assert.deepEqual(reports.pop(), `\x1b[<0;${i};0M`); + } + }); + }); + + it('eventCodes with modifiers (DEFAULT encoding)', () => { + // TODO: implement AUX button tests + mouseStateService.activeProtocol = 'ANY'; + mouseStateService.activeEncoding = 'DEFAULT'; + // all buttons + down + no modifer + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.DOWN, ctrl: false, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.DOWN, ctrl: false, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.DOWN, ctrl: false, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.DOWN, ctrl: false, alt: false, shift: false }), true); + assert.deepEqual(reports, ['\x1b[M !!', '\x1b[M!!!', '\x1b[M"!!', '\x1b[Ma!!']); + reports = []; + + // all buttons + up + no modifier + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.UP, ctrl: false, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.UP, ctrl: false, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.UP, ctrl: false, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.WHEEL, action: CoreMouseAction.UP, ctrl: false, alt: false, shift: false }), true); + assert.deepEqual(reports, ['\x1b[M#!!', '\x1b[M#!!', '\x1b[M#!!', '\x1b[M`!!']); + reports = []; + + // all buttons + move + no modifier + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.LEFT, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.MIDDLE, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.RIGHT, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: false }), true); + assert.deepEqual(reports, ['\x1b[M@!!', '\x1b[MA!!', '\x1b[MB!!', '\x1b[MC!!']); + reports = []; + + // button none + move + modifiers + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: true, alt: false, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: false, alt: true, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: false, alt: false, shift: true }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: true, alt: true, shift: false }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: false, alt: true, shift: true }), true); + assert.equal(trigger({ col: 0, row: 0, x: 0, y: 0, button: CoreMouseButton.NONE, action: CoreMouseAction.MOVE, ctrl: true, alt: true, shift: true }), true); + assert.deepEqual(reports, ['\x1b[MS!!', '\x1b[MK!!', '\x1b[MG!!', '\x1b[M[!!', '\x1b[MO!!', '\x1b[M_!!']); + reports = []; + }); +}); diff --git a/src/common/services/MouseStateService.test.ts b/src/common/services/MouseStateService.test.ts index 06c619fdd..0f2cd489a 100644 --- a/src/common/services/MouseStateService.test.ts +++ b/src/common/services/MouseStateService.test.ts @@ -83,6 +83,6 @@ describe('MouseStateService', () => { cms.activeProtocol = 'ANY'; cms.activeEncoding = 'DEFAULT'; assert.equal(cms.restrictMouseEvent(event), true); - assert.deepEqual(toBytes(cms.encodeMouseEvent(event)), [0x1b, 0x5b, 0x4d, 0x21, 0x21, 0x21]); + assert.deepEqual(toBytes(cms.encodeMouseEvent(event)), [0x1b, 0x5b, 0x4d, 0x20, 0x21, 0x21]); }); }); From 9e1b89651ade95bd5b5308741591705ca4fcc750 Mon Sep 17 00:00:00 2001 From: sergiochan Date: Tue, 10 Mar 2026 19:36:17 -0700 Subject: [PATCH 121/124] fix(ime): resync textarea position on composition start --- src/browser/CoreBrowserTerminal.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index 828013e9e..057b7837a 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -414,7 +414,14 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._register(addDisposableListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true)); this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true)); this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true)); - this._register(addDisposableListener(this.textarea!, 'compositionstart', () => this._compositionHelper!.compositionstart())); + this._register(addDisposableListener(this.textarea!, 'compositionstart', () => { + // Ensure the textarea is synced to the latest cursor location before composition begins. + // Some prompt UIs briefly draw helper text and then restore the cursor without triggering a + // new key event, which can leave IME anchoring stale until the first render tick. + this._syncTextArea(); + this._compositionHelper!.compositionstart(); + this._compositionHelper!.updateCompositionElements(); + })); this._register(addDisposableListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e))); this._register(addDisposableListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend())); this._register(addDisposableListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true)); From 409f049f39beabd05f2756b3e5c5728aad6e1f53 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 12:02:02 +0900 Subject: [PATCH 122/124] Update src/browser/CoreBrowserTerminal.ts --- src/browser/CoreBrowserTerminal.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index 057b7837a..cedf889b4 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -415,9 +415,11 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._register(addDisposableListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true)); this._register(addDisposableListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true)); this._register(addDisposableListener(this.textarea!, 'compositionstart', () => { - // Ensure the textarea is synced to the latest cursor location before composition begins. - // Some prompt UIs briefly draw helper text and then restore the cursor without triggering a - // new key event, which can leave IME anchoring stale until the first render tick. + // Ensure the textarea is synced to the latest cursor location before composition begins. This + // is to workaround a problem where highly dynamic TUIs like agentic CLIs reprint agressively + // would cause the IME to appear in the wrong position. The theory is that when the IME is + // triggered during a partial render the textarea position becomes locked and will not move + // until it is hidden and a custom move occurs. this._syncTextArea(); this._compositionHelper!.compositionstart(); this._compositionHelper!.updateCompositionElements(); From 5302e62c90ab7f0ae21518bbd5b36e6617390f11 Mon Sep 17 00:00:00 2001 From: sergiochan Date: Tue, 10 Mar 2026 20:38:45 -0700 Subject: [PATCH 123/124] fix: sync helper textarea position after terminal resize --- src/browser/CoreBrowserTerminal.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index 1b18a17ee..52eb00025 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -573,7 +573,10 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._renderService!.handleCursorMove(); this._syncTextArea(); })); - this._register(this.onResize(() => this._renderService!.handleResize(this.cols, this.rows))); + this._register(this.onResize(() => { + this._renderService!.handleResize(this.cols, this.rows); + this._syncTextArea(); + })); this._register(this.onBlur(() => this._renderService!.handleBlur())); this._register(this.onFocus(() => this._renderService!.handleFocus())); From 2285ac6ab8a88bdb3eb339fdd952af36f45c64e7 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 11 Mar 2026 12:41:48 +0900 Subject: [PATCH 124/124] Fix RTL breaking IME composition rendering Fixes #5760 --- src/browser/input/CompositionHelper.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/browser/input/CompositionHelper.ts b/src/browser/input/CompositionHelper.ts index d170eae3b..0f4ef7789 100644 --- a/src/browser/input/CompositionHelper.ts +++ b/src/browser/input/CompositionHelper.ts @@ -76,7 +76,9 @@ export class CompositionHelper { * @param ev The event. */ public compositionupdate(ev: Pick): void { - this._compositionView.textContent = ev.data; + // Mark text as LTR, direction=rtl is used in CSS so the end of the text is followed for long + // compositions + this._compositionView.textContent = `\u200E${ev.data}\u200E`; this.updateCompositionElements(); setTimeout(() => { this._compositionPosition.end = this._textarea.value.length;