tformula 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/proxy.js ADDED
@@ -0,0 +1,150 @@
1
+ import process from "node:process";
2
+ import { chmodSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, join } from "node:path";
5
+ import * as pty from "node-pty";
6
+ import { FormulaScreen } from "./screen.js";
7
+ import { OutputCheckpointSplitter } from "./output-checkpoints.js";
8
+ import { parseTerminalResponses } from "./probe.js";
9
+ function ensureNodePtyHelper() {
10
+ if (process.platform !== "darwin")
11
+ return;
12
+ try {
13
+ const entry = createRequire(import.meta.url).resolve("node-pty");
14
+ const packageRoot = dirname(dirname(entry));
15
+ chmodSync(join(packageRoot, "prebuilds", `darwin-${process.arch}`, "spawn-helper"), 0o755);
16
+ }
17
+ catch {
18
+ // Standard npm installs already preserve this executable bit. The fallback
19
+ // is only needed for package managers that suppress dependency scripts.
20
+ }
21
+ }
22
+ export async function runProxy(options, initialCapabilities, pendingInput = "") {
23
+ const cols = Math.max(2, process.stdout.columns ?? 80);
24
+ const rows = Math.max(2, process.stdout.rows ?? 24);
25
+ let capabilities = initialCapabilities;
26
+ let child;
27
+ let probeCapture = "";
28
+ let probeTimer;
29
+ let exiting = false;
30
+ let outputQueue = Promise.resolve();
31
+ const debug = (message) => {
32
+ if (options.debug)
33
+ process.stderr.write(`\r\n[tformula] ${message}\r\n`);
34
+ };
35
+ const writeOuter = (data) => {
36
+ process.stdout.write(data);
37
+ };
38
+ const screen = options.renderMath
39
+ ? new FormulaScreen({ cols, rows, capabilities, scale: options.scale, writeOuter, debug })
40
+ : undefined;
41
+ const outputSplitter = new OutputCheckpointSplitter(Math.max(2, Math.floor(rows / 3)));
42
+ const finishProbe = () => {
43
+ probeTimer = undefined;
44
+ const captured = probeCapture;
45
+ probeCapture = "";
46
+ if (!captured)
47
+ return;
48
+ const parsed = parseTerminalResponses(captured);
49
+ const nextCell = options.cellOverride
50
+ ? { ...options.cellOverride, source: "override" }
51
+ : parsed.cell
52
+ ? { ...parsed.cell, source: "cell-query" }
53
+ : parsed.windowPixels
54
+ ? {
55
+ width: parsed.windowPixels.width / Math.max(1, process.stdout.columns ?? cols),
56
+ height: parsed.windowPixels.height / Math.max(1, process.stdout.rows ?? rows),
57
+ source: "window-query"
58
+ }
59
+ : capabilities.cell;
60
+ capabilities = {
61
+ ...capabilities,
62
+ cell: nextCell,
63
+ windowPixels: parsed.windowPixels ?? capabilities.windowPixels,
64
+ foreground: parsed.foreground ?? capabilities.foreground,
65
+ background: parsed.background ?? capabilities.background
66
+ };
67
+ screen?.updateCapabilities(capabilities);
68
+ if (parsed.residual)
69
+ child.write(parsed.residual);
70
+ debug(`cell ${nextCell.width.toFixed(2)}x${nextCell.height.toFixed(2)}px (${nextCell.source})`);
71
+ };
72
+ const requestProbe = () => {
73
+ if (!process.stdin.isTTY || options.cellOverride)
74
+ return;
75
+ if (probeTimer) {
76
+ clearTimeout(probeTimer);
77
+ finishProbe();
78
+ }
79
+ probeCapture = "";
80
+ writeOuter("\x1b[16t\x1b[14t\x1b]10;?\x1b\\\x1b]11;?\x1b\\");
81
+ probeTimer = setTimeout(finishProbe, 160);
82
+ };
83
+ ensureNodePtyHelper();
84
+ child = pty.spawn(options.command, options.args, {
85
+ name: process.env.TERM || "xterm-256color",
86
+ cols,
87
+ rows,
88
+ cwd: options.cwd,
89
+ env: { ...process.env, TFORMULA_ACTIVE: "1" }
90
+ });
91
+ const previousRaw = process.stdin.isRaw;
92
+ if (process.stdin.isTTY && typeof process.stdin.setRawMode === "function")
93
+ process.stdin.setRawMode(true);
94
+ process.stdin.resume();
95
+ process.stdin.on("data", (chunk) => {
96
+ const data = Buffer.isBuffer(chunk) ? chunk.toString("utf8") : chunk;
97
+ if (probeTimer)
98
+ probeCapture += data;
99
+ else
100
+ child.write(data);
101
+ });
102
+ child.onData((data) => {
103
+ if (!screen) {
104
+ writeOuter(data);
105
+ return;
106
+ }
107
+ for (const slice of outputSplitter.push(data)) {
108
+ outputQueue = outputQueue.then(async () => {
109
+ writeOuter(slice.data);
110
+ await screen.write(slice.data);
111
+ if (slice.checkpoint)
112
+ await screen.flushScan();
113
+ }).catch((error) => {
114
+ debug(`output checkpoint failed: ${error instanceof Error ? error.message : String(error)}`);
115
+ });
116
+ }
117
+ });
118
+ const onResize = () => {
119
+ const nextCols = Math.max(2, process.stdout.columns ?? 80);
120
+ const nextRows = Math.max(2, process.stdout.rows ?? 24);
121
+ outputSplitter.setLineInterval(Math.max(2, Math.floor(nextRows / 3)));
122
+ child.resize(nextCols, nextRows);
123
+ screen?.resize(nextCols, nextRows);
124
+ requestProbe();
125
+ };
126
+ process.on("SIGWINCH", onResize);
127
+ if (pendingInput)
128
+ child.write(pendingInput);
129
+ debug(`started ${options.command}; math=${Boolean(screen && capabilities.kittyGraphics)}; cell=${capabilities.cell.width.toFixed(2)}x${capabilities.cell.height.toFixed(2)}px`);
130
+ return await new Promise((resolve) => {
131
+ child.onExit(({ exitCode, signal }) => {
132
+ if (exiting)
133
+ return;
134
+ exiting = true;
135
+ void outputQueue.finally(async () => {
136
+ await screen?.flushScan();
137
+ if (probeTimer)
138
+ clearTimeout(probeTimer);
139
+ process.off("SIGWINCH", onResize);
140
+ screen?.dispose();
141
+ process.stdin.pause();
142
+ if (process.stdin.isTTY && typeof process.stdin.setRawMode === "function" && !previousRaw) {
143
+ process.stdin.setRawMode(false);
144
+ }
145
+ resolve(signal ? 128 + signal : exitCode);
146
+ });
147
+ });
148
+ });
149
+ }
150
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Terminal as XtermTerminal } from "@xterm/headless";
2
+ import { MathRenderer } from "./math-renderer.js";
3
+ import type { TerminalCapabilities } from "./types.js";
4
+ export declare class FormulaScreen {
5
+ #private;
6
+ readonly terminal: XtermTerminal;
7
+ constructor(options: {
8
+ cols: number;
9
+ rows: number;
10
+ capabilities: TerminalCapabilities;
11
+ scale: number;
12
+ writeOuter: (data: string | Uint8Array) => void;
13
+ debug?: (message: string) => void;
14
+ renderer?: MathRenderer;
15
+ });
16
+ write(data: string): Promise<void>;
17
+ /** Complete a scan before more PTY rows are allowed to scroll the viewport. */
18
+ flushScan(): Promise<void>;
19
+ resize(cols: number, rows: number): void;
20
+ updateCapabilities(capabilities: TerminalCapabilities): void;
21
+ setScale(scale: number): void;
22
+ scheduleScan(delayMs?: number): void;
23
+ resetPlacements(): void;
24
+ dispose(): void;
25
+ }
package/dist/screen.js ADDED
@@ -0,0 +1,397 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createRequire } from "node:module";
3
+ import { detectFormulaRegions } from "./detect.js";
4
+ import { MathRenderer } from "./math-renderer.js";
5
+ import { cursorPosition, kittyDeleteByZIndex, kittyDeleteImage, kittyDeletePlacement, kittyDeleteRange, kittyPlaceImage, kittyTransmitImage, synchronizedOutput, TFORMULA_IMAGE_ID_MAX, TFORMULA_IMAGE_ID_MIN } from "./kitty.js";
6
+ const { Terminal } = createRequire(import.meta.url)("@xterm/headless");
7
+ function rgbHex(value) {
8
+ return `#${value.toString(16).padStart(6, "0").slice(-6)}`;
9
+ }
10
+ export class FormulaScreen {
11
+ terminal;
12
+ #renderer;
13
+ #placed = new Map();
14
+ #terminalImages = new Map();
15
+ #writeOuter;
16
+ #debug;
17
+ #capabilities;
18
+ #scale;
19
+ #imageId = TFORMULA_IMAGE_ID_MIN;
20
+ #placementId = 1;
21
+ #scanTimer;
22
+ #scanVersion = 0;
23
+ #layoutVersion = 0;
24
+ #scanning = false;
25
+ #rescanRequested = false;
26
+ #scanWaiters = [];
27
+ #disposed = false;
28
+ #controlTail = "";
29
+ constructor(options) {
30
+ this.terminal = new Terminal({
31
+ cols: options.cols,
32
+ rows: options.rows,
33
+ scrollback: 10_000,
34
+ allowProposedApi: true
35
+ });
36
+ this.#capabilities = options.capabilities;
37
+ this.#scale = options.scale;
38
+ this.#renderer = options.renderer ?? new MathRenderer();
39
+ this.#writeOuter = options.writeOuter;
40
+ this.#debug = options.debug ?? (() => undefined);
41
+ this.terminal.buffer.onBufferChange(() => {
42
+ // The alternate buffer is cleared when entering or leaving it. The
43
+ // normal buffer and its scrollback are restored, not cleared, so their
44
+ // placements must remain tracked to avoid placing duplicates on return.
45
+ this.#invalidateBufferPlacements("alternate", false);
46
+ });
47
+ }
48
+ write(data) {
49
+ const controls = this.#controlTail + data;
50
+ if (/\x1bc|\x1b\[(?:[0-9;]*)3J/u.test(controls)) {
51
+ // RIS and ED 3 clear scrollback as well as the live screen.
52
+ this.resetPlacements();
53
+ this.#debug("terminal reset invalidated all formula placements");
54
+ }
55
+ else if (/\x1b\[(?:[0-9;]*)2J/u.test(controls)) {
56
+ // Kitty images are cleared by ED 2/3 and RIS independently of xterm's
57
+ // text buffer. ED 2 only affects the live viewport; scrollback images
58
+ // continue to be owned and scrolled by the terminal.
59
+ this.#invalidateVisiblePlacements(false);
60
+ this.#debug("terminal clear invalidated visible formula placements");
61
+ }
62
+ this.#controlTail = this.#incompleteControlSuffix(controls);
63
+ return new Promise((resolve) => {
64
+ this.terminal.write(data, () => {
65
+ this.scheduleScan();
66
+ resolve();
67
+ });
68
+ });
69
+ }
70
+ /** Complete a scan before more PTY rows are allowed to scroll the viewport. */
71
+ async flushScan() {
72
+ while (!this.#disposed) {
73
+ if (this.#scanTimer)
74
+ clearTimeout(this.#scanTimer);
75
+ this.#scanTimer = undefined;
76
+ if (this.#scanning) {
77
+ await new Promise((resolve) => this.#scanWaiters.push(resolve));
78
+ }
79
+ else {
80
+ await this.#scan();
81
+ }
82
+ if (!this.#scanning && !this.#scanTimer && !this.#rescanRequested)
83
+ return;
84
+ }
85
+ }
86
+ resize(cols, rows) {
87
+ this.terminal.resize(Math.max(2, cols), Math.max(2, rows));
88
+ // Kitty placements are cell-based and resize with the terminal. Keep them
89
+ // until the next scan selectively replaces formulas still in the live
90
+ // viewport; off-screen scrollback cannot be reconstructed later.
91
+ this.#layoutVersion += 1;
92
+ // Font zoom can move a formula through the viewport in a fraction of the
93
+ // normal debounce interval. Scan promptly; transactional replacement
94
+ // prevents rapid resize events from destroying the previous placement.
95
+ this.scheduleScan(16);
96
+ }
97
+ updateCapabilities(capabilities) {
98
+ const dimensionsChanged = capabilities.cell.width !== this.#capabilities.cell.width
99
+ || capabilities.cell.height !== this.#capabilities.cell.height;
100
+ const colorsChanged = capabilities.foreground !== this.#capabilities.foreground
101
+ || capabilities.background !== this.#capabilities.background;
102
+ this.#capabilities = capabilities;
103
+ if (dimensionsChanged || colorsChanged) {
104
+ this.#layoutVersion += 1;
105
+ this.scheduleScan(16);
106
+ }
107
+ }
108
+ setScale(scale) {
109
+ this.#scale = scale;
110
+ this.#layoutVersion += 1;
111
+ this.scheduleScan();
112
+ }
113
+ scheduleScan(delayMs = 110) {
114
+ if (this.#disposed)
115
+ return;
116
+ this.#scanVersion += 1;
117
+ // Coalesce bursts without postponing forever. Agent status bars and
118
+ // spinners can write more frequently than the scan delay.
119
+ if (this.#scanTimer)
120
+ return;
121
+ this.#scanTimer = setTimeout(() => {
122
+ this.#scanTimer = undefined;
123
+ void this.#scan();
124
+ }, delayMs);
125
+ }
126
+ resetPlacements() {
127
+ this.#layoutVersion += 1;
128
+ if (this.#capabilities.kittyGraphics) {
129
+ const imageIds = new Set(Array.from(this.#terminalImages.values(), (image) => image.imageId));
130
+ const commands = [
131
+ // Range deletion also catches an image transmitted by an interrupted
132
+ // scan before it could be entered into #placed. Older terminals can
133
+ // ignore this command and fall back to the ID and z-index deletions.
134
+ kittyDeleteRange(),
135
+ ...Array.from(imageIds, (imageId) => kittyDeleteImage(imageId)),
136
+ // Also remove any placement that an earlier interrupted scan may have
137
+ // transmitted before it could be recorded in #placed.
138
+ kittyDeleteByZIndex()
139
+ ];
140
+ this.#writeOuter(synchronizedOutput(commands.join("")));
141
+ }
142
+ for (const placement of this.#placed.values())
143
+ this.#releasePlacement(placement);
144
+ this.#placed.clear();
145
+ this.#terminalImages.clear();
146
+ }
147
+ #placementIsVisible(placement) {
148
+ const buffer = this.terminal.buffer.active;
149
+ const viewportStart = buffer.viewportY;
150
+ const viewportEnd = viewportStart + this.terminal.rows - 1;
151
+ if (placement.startMarker || placement.endMarker) {
152
+ const start = placement.startMarker?.line ?? placement.endMarker?.line ?? -1;
153
+ const end = placement.endMarker?.line ?? placement.startMarker?.line ?? -1;
154
+ return placement.bufferType === buffer.type
155
+ && start >= 0
156
+ && end >= viewportStart
157
+ && start <= viewportEnd;
158
+ }
159
+ return placement.bufferType === buffer.type
160
+ && placement.absoluteEndRow >= viewportStart
161
+ && placement.absoluteStartRow <= viewportEnd;
162
+ }
163
+ #invalidateVisiblePlacements(deleteImages) {
164
+ this.#layoutVersion += 1;
165
+ const placements = [];
166
+ for (const [anchor, placement] of this.#placed) {
167
+ if (!this.#placementIsVisible(placement))
168
+ continue;
169
+ if (deleteImages)
170
+ placements.push(placement);
171
+ this.#releasePlacement(placement);
172
+ this.#placed.delete(anchor);
173
+ }
174
+ if (placements.length > 0 && this.#capabilities.kittyGraphics) {
175
+ this.#writeOuter(synchronizedOutput(placements.map((placement) => kittyDeletePlacement(placement.imageId, placement.placementId)).join("")));
176
+ }
177
+ }
178
+ #invalidateBufferPlacements(bufferType, deleteImages) {
179
+ this.#layoutVersion += 1;
180
+ const placements = [];
181
+ for (const [anchor, placement] of this.#placed) {
182
+ if (placement.bufferType !== bufferType)
183
+ continue;
184
+ if (deleteImages)
185
+ placements.push(placement);
186
+ this.#releasePlacement(placement);
187
+ this.#placed.delete(anchor);
188
+ }
189
+ if (placements.length > 0 && this.#capabilities.kittyGraphics) {
190
+ this.#writeOuter(synchronizedOutput(placements.map((placement) => kittyDeletePlacement(placement.imageId, placement.placementId)).join("")));
191
+ }
192
+ }
193
+ #releasePlacement(placement) {
194
+ const image = this.#terminalImages.get(placement.imageKey);
195
+ if (image)
196
+ image.placements = Math.max(0, image.placements - 1);
197
+ placement.startMarker?.dispose();
198
+ if (placement.endMarker !== placement.startMarker)
199
+ placement.endMarker?.dispose();
200
+ }
201
+ #markersForRegion(region) {
202
+ const buffer = this.terminal.buffer.active;
203
+ if (buffer.type !== "normal")
204
+ return {};
205
+ const cursorAbsoluteRow = buffer.baseY + buffer.cursorY;
206
+ const startAbsoluteRow = buffer.viewportY + region.startRow;
207
+ const endAbsoluteRow = buffer.viewportY + region.endRow;
208
+ return {
209
+ startMarker: this.terminal.registerMarker(startAbsoluteRow - cursorAbsoluteRow),
210
+ endMarker: this.terminal.registerMarker(endAbsoluteRow - cursorAbsoluteRow)
211
+ };
212
+ }
213
+ #nextImageId() {
214
+ const imageId = this.#imageId++;
215
+ if (this.#imageId > TFORMULA_IMAGE_ID_MAX)
216
+ this.#imageId = TFORMULA_IMAGE_ID_MIN;
217
+ return imageId;
218
+ }
219
+ #nextPlacementId() {
220
+ const placementId = this.#placementId++;
221
+ if (this.#placementId > 2_147_483_647)
222
+ this.#placementId = 1;
223
+ return placementId;
224
+ }
225
+ dispose() {
226
+ this.#disposed = true;
227
+ if (this.#scanTimer)
228
+ clearTimeout(this.#scanTimer);
229
+ this.#scanTimer = undefined;
230
+ for (const resolve of this.#scanWaiters.splice(0))
231
+ resolve();
232
+ this.resetPlacements();
233
+ this.terminal.dispose();
234
+ }
235
+ #visibleLines() {
236
+ const buffer = this.terminal.buffer.active;
237
+ return Array.from({ length: this.terminal.rows }, (_, row) => buffer.getLine(buffer.viewportY + row)?.translateToString(true) ?? "");
238
+ }
239
+ #incompleteControlSuffix(data) {
240
+ const escapeIndex = data.lastIndexOf("\x1b");
241
+ if (escapeIndex < 0)
242
+ return "";
243
+ const suffix = data.slice(escapeIndex);
244
+ if (suffix === "\x1b")
245
+ return suffix;
246
+ if (!suffix.startsWith("\x1b["))
247
+ return "";
248
+ // A CSI sequence is incomplete until its final byte in the 0x40-0x7e
249
+ // range arrives. Keep only that suffix for split PTY writes.
250
+ return /[\x40-\x7e]/u.test(suffix.slice(2)) ? "" : suffix.slice(-32);
251
+ }
252
+ #regionColors(region) {
253
+ const buffer = this.terminal.buffer.active;
254
+ const line = buffer.getLine(buffer.viewportY + region.startRow);
255
+ const cell = line?.getCell(Math.min(region.startCol, this.terminal.cols - 1));
256
+ if (!cell)
257
+ return this.#capabilities;
258
+ let foreground = cell.isFgRGB() ? rgbHex(cell.getFgColor()) : this.#capabilities.foreground;
259
+ let background = cell.isBgRGB() ? rgbHex(cell.getBgColor()) : this.#capabilities.background;
260
+ if (cell.isInverse())
261
+ [foreground, background] = [background, foreground];
262
+ return { foreground, background };
263
+ }
264
+ #anchor(region, columns, rows) {
265
+ const buffer = this.terminal.buffer.active;
266
+ return `${buffer.type}:${buffer.viewportY + region.startRow}:${region.startCol}:${columns}:${rows}`;
267
+ }
268
+ #regionStillVisible(region, viewportY) {
269
+ const buffer = this.terminal.buffer.active;
270
+ if (buffer.viewportY !== viewportY)
271
+ return false;
272
+ return detectFormulaRegions(this.#visibleLines()).some((candidate) => candidate.startRow === region.startRow
273
+ && candidate.endRow === region.endRow
274
+ && candidate.startCol === region.startCol
275
+ && candidate.endCol === region.endCol
276
+ && candidate.latex === region.latex
277
+ && candidate.display === region.display
278
+ && candidate.compact === region.compact);
279
+ }
280
+ async #scan() {
281
+ if (this.#disposed || !this.#capabilities.kittyGraphics || this.terminal.modes.originMode)
282
+ return;
283
+ if (this.#scanning) {
284
+ this.#rescanRequested = true;
285
+ return;
286
+ }
287
+ this.#scanning = true;
288
+ const version = this.#scanVersion;
289
+ const layoutVersion = this.#layoutVersion;
290
+ const viewportY = this.terminal.buffer.active.viewportY;
291
+ try {
292
+ const regions = detectFormulaRegions(this.#visibleLines());
293
+ const prepared = regions.map((region) => {
294
+ const rows = region.endRow - region.startRow + 1;
295
+ const columns = rows > 1 && !region.compact
296
+ ? this.terminal.cols
297
+ : Math.max(1, Math.min(this.terminal.cols - region.startCol, region.endCol - region.startCol));
298
+ const anchor = this.#anchor(region, columns, rows);
299
+ return { region, rows, columns, anchor };
300
+ });
301
+ const desiredAnchors = new Set(prepared.map(({ anchor }) => anchor));
302
+ for (const { region, rows, columns, anchor } of prepared) {
303
+ if (this.#disposed || layoutVersion !== this.#layoutVersion)
304
+ break;
305
+ if (version !== this.#scanVersion && !this.#regionStillVisible(region, viewportY))
306
+ continue;
307
+ const colors = this.#regionColors(region);
308
+ const fingerprint = createHash("sha1").update(JSON.stringify({
309
+ latex: region.latex,
310
+ display: region.display,
311
+ compact: region.compact,
312
+ colors,
313
+ cell: this.#capabilities.cell,
314
+ scale: this.#scale
315
+ })).digest("hex");
316
+ const existing = this.#placed.get(anchor);
317
+ if (existing?.fingerprint === fingerprint)
318
+ continue;
319
+ try {
320
+ const rendered = await this.#renderer.render(region, columns, rows, this.#capabilities, this.#scale, colors.foreground, colors.background);
321
+ if (this.#disposed || layoutVersion !== this.#layoutVersion)
322
+ break;
323
+ // Unrelated output (for example a spinner in the status bar) should
324
+ // not starve formulas that are unchanged at their screen location.
325
+ if (version !== this.#scanVersion && !this.#regionStillVisible(region, viewportY))
326
+ continue;
327
+ const buffer = this.terminal.buffer.active;
328
+ // CUP cannot reproduce xterm's pending-wrap state exactly.
329
+ if (buffer.cursorX >= this.terminal.cols) {
330
+ this.#rescanRequested = true;
331
+ break;
332
+ }
333
+ let image = this.#terminalImages.get(rendered.cacheKey);
334
+ let transmission = "";
335
+ if (!image) {
336
+ image = { imageId: this.#nextImageId(), placements: 0 };
337
+ this.#terminalImages.set(rendered.cacheKey, image);
338
+ transmission = kittyTransmitImage(rendered.png, image.imageId);
339
+ }
340
+ const placementId = this.#nextPlacementId();
341
+ const placement = [
342
+ existing ? kittyDeletePlacement(existing.imageId, existing.placementId) : "",
343
+ cursorPosition(region.startRow + 1, region.startCol + 1),
344
+ transmission,
345
+ kittyPlaceImage(image.imageId, placementId, columns, rows),
346
+ cursorPosition(buffer.cursorY + 1, buffer.cursorX + 1)
347
+ ].join("");
348
+ this.#writeOuter(synchronizedOutput(placement));
349
+ if (existing) {
350
+ this.#releasePlacement(existing);
351
+ this.#placed.delete(anchor);
352
+ }
353
+ image.placements += 1;
354
+ const markers = this.#markersForRegion(region);
355
+ this.#placed.set(anchor, {
356
+ imageId: image.imageId,
357
+ placementId,
358
+ imageKey: rendered.cacheKey,
359
+ fingerprint,
360
+ bufferType: buffer.type,
361
+ absoluteStartRow: buffer.viewportY + region.startRow,
362
+ absoluteEndRow: buffer.viewportY + region.endRow,
363
+ ...markers
364
+ });
365
+ this.#debug(`rendered ${region.confidence} formula at ${anchor} (${rendered.widthPx}x${rendered.heightPx}px)`);
366
+ }
367
+ catch (error) {
368
+ this.#debug(`formula render skipped: ${error instanceof Error ? error.message : String(error)}`);
369
+ }
370
+ }
371
+ // Stale placement deletion is deliberately transactional as well. A
372
+ // resize can invalidate an in-flight scan; deleting before all current
373
+ // formulas are prepared would permanently lose an image that has just
374
+ // moved into scrollback. Markers keep this visibility check valid after
375
+ // normal-buffer reflow.
376
+ if (layoutVersion === this.#layoutVersion && version === this.#scanVersion) {
377
+ for (const [anchor, placement] of this.#placed) {
378
+ if (desiredAnchors.has(anchor) || !this.#placementIsVisible(placement))
379
+ continue;
380
+ this.#writeOuter(kittyDeletePlacement(placement.imageId, placement.placementId));
381
+ this.#releasePlacement(placement);
382
+ this.#placed.delete(anchor);
383
+ }
384
+ }
385
+ }
386
+ finally {
387
+ this.#scanning = false;
388
+ for (const resolve of this.#scanWaiters.splice(0))
389
+ resolve();
390
+ if (!this.#disposed && (this.#rescanRequested || version !== this.#scanVersion)) {
391
+ this.#rescanRequested = false;
392
+ this.scheduleScan(140);
393
+ }
394
+ }
395
+ }
396
+ }
397
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export interface CellMetrics {
2
+ width: number;
3
+ height: number;
4
+ source: "cell-query" | "window-query" | "override" | "fallback";
5
+ }
6
+ export interface TerminalCapabilities {
7
+ kittyGraphics: boolean;
8
+ foreground: string;
9
+ background: string;
10
+ cell: CellMetrics;
11
+ windowPixels?: {
12
+ width: number;
13
+ height: number;
14
+ };
15
+ }
16
+ export interface FormulaRegion {
17
+ startRow: number;
18
+ endRow: number;
19
+ startCol: number;
20
+ endCol: number;
21
+ latex: string;
22
+ display: boolean;
23
+ confidence: "explicit" | "inferred";
24
+ /** Use the detected region width even when the formula spans several rows. */
25
+ compact?: boolean;
26
+ }
27
+ export interface RenderedFormula {
28
+ png: Uint8Array;
29
+ /** Content-addressed key for this exact terminal-ready PNG variant. */
30
+ cacheKey: string;
31
+ columns: number;
32
+ rows: number;
33
+ widthPx: number;
34
+ heightPx: number;
35
+ }
36
+ export interface CliOptions {
37
+ command: string;
38
+ args: string[];
39
+ cwd: string;
40
+ renderMath: boolean;
41
+ debug: boolean;
42
+ scale: number;
43
+ cellOverride?: {
44
+ width: number;
45
+ height: number;
46
+ };
47
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map