@floegence/floeterm-terminal-web 0.5.0 → 0.5.1

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.
Files changed (44) hide show
  1. package/dist/core/TerminalCore.d.ts +19 -0
  2. package/dist/core/TerminalCore.d.ts.map +1 -1
  3. package/dist/core/TerminalCore.js +414 -41
  4. package/dist/core/TerminalCore.js.map +1 -1
  5. package/dist/core/TerminalRenderScheduler.d.ts +4 -0
  6. package/dist/core/TerminalRenderScheduler.d.ts.map +1 -1
  7. package/dist/core/TerminalRenderScheduler.js +35 -2
  8. package/dist/core/TerminalRenderScheduler.js.map +1 -1
  9. package/dist/fabric/BeamtermFabricRenderer.d.ts +59 -0
  10. package/dist/fabric/BeamtermFabricRenderer.d.ts.map +1 -0
  11. package/dist/fabric/BeamtermFabricRenderer.js +448 -0
  12. package/dist/fabric/BeamtermFabricRenderer.js.map +1 -0
  13. package/dist/fabric/TerminalFabricCoordinator.d.ts +40 -0
  14. package/dist/fabric/TerminalFabricCoordinator.d.ts.map +1 -0
  15. package/dist/fabric/TerminalFabricCoordinator.js +140 -0
  16. package/dist/fabric/TerminalFabricCoordinator.js.map +1 -0
  17. package/dist/fabric/TerminalLiveFabric.d.ts +84 -0
  18. package/dist/fabric/TerminalLiveFabric.d.ts.map +1 -0
  19. package/dist/fabric/TerminalLiveFabric.js +211 -0
  20. package/dist/fabric/TerminalLiveFabric.js.map +1 -0
  21. package/dist/fabric/types.d.ts +112 -0
  22. package/dist/fabric/types.d.ts.map +1 -0
  23. package/dist/fabric/types.js +2 -0
  24. package/dist/fabric/types.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/internal/TerminalInitializationScheduler.d.ts +22 -0
  30. package/dist/internal/TerminalInitializationScheduler.d.ts.map +1 -0
  31. package/dist/internal/TerminalInitializationScheduler.js +79 -0
  32. package/dist/internal/TerminalInitializationScheduler.js.map +1 -0
  33. package/dist/internal/scheduleUiTurn.d.ts +5 -0
  34. package/dist/internal/scheduleUiTurn.d.ts.map +1 -0
  35. package/dist/internal/scheduleUiTurn.js +37 -0
  36. package/dist/internal/scheduleUiTurn.js.map +1 -0
  37. package/dist/manager/TerminalInstanceController.d.ts +1 -0
  38. package/dist/manager/TerminalInstanceController.d.ts.map +1 -1
  39. package/dist/manager/TerminalInstanceController.js +67 -30
  40. package/dist/manager/TerminalInstanceController.js.map +1 -1
  41. package/dist/types.d.ts +3 -1
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/types.js.map +1 -1
  44. package/package.json +2 -1
@@ -0,0 +1,448 @@
1
+ import { terminalFabricCoordinator } from './TerminalFabricCoordinator';
2
+ const DEFAULT_BACKGROUND = 0x000000;
3
+ const DEFAULT_FOREGROUND = 0xffffff;
4
+ const MAX_STYLE_CACHE_ENTRIES = 4096;
5
+ let beamtermModulePromise = null;
6
+ export const loadBeamtermModule = async () => {
7
+ if (!beamtermModulePromise) {
8
+ beamtermModulePromise = import('@beamterm/renderer').then(async (module) => {
9
+ await module.main();
10
+ return module;
11
+ });
12
+ }
13
+ return beamtermModulePromise;
14
+ };
15
+ export const parseHexColor = (value, fallback) => {
16
+ if (!value) {
17
+ return fallback;
18
+ }
19
+ const trimmed = value.trim();
20
+ const shortHex = /^#([0-9a-fA-F]{3})$/.exec(trimmed);
21
+ if (shortHex) {
22
+ const [r, g, b] = shortHex[1].split('');
23
+ return Number.parseInt(`${r}${r}${g}${g}${b}${b}`, 16);
24
+ }
25
+ const longHex = /^#([0-9a-fA-F]{6})$/.exec(trimmed);
26
+ if (longHex) {
27
+ return Number.parseInt(longHex[1], 16);
28
+ }
29
+ return fallback;
30
+ };
31
+ export const formatHexColor = (value) => {
32
+ const normalized = Number.isFinite(value) ? Math.max(0, Math.min(0xffffff, Math.trunc(value))) : 0;
33
+ return `#${normalized.toString(16).padStart(6, '0')}`;
34
+ };
35
+ export const normalizeCanvasSelector = (canvas) => {
36
+ if (!canvas.id) {
37
+ canvas.id = `floeterm-beamterm-${Math.random().toString(36).slice(2)}`;
38
+ }
39
+ return `#${escapeCssIdentifier(canvas.id)}`;
40
+ };
41
+ const escapeCssIdentifier = (value) => {
42
+ const cssGlobal = globalThis;
43
+ if (typeof cssGlobal.CSS?.escape === 'function') {
44
+ return cssGlobal.CSS.escape(value);
45
+ }
46
+ return value.replace(/[^a-zA-Z0-9_-]/g, match => `\\${match}`);
47
+ };
48
+ export const createStyle = (module, cell, defaultTheme, cache) => {
49
+ const fg = cell.attrs.inverse
50
+ ? defaultTheme.background
51
+ : (cell.fg.r << 16) | (cell.fg.g << 8) | cell.fg.b;
52
+ const bg = cell.attrs.inverse
53
+ ? defaultTheme.foreground
54
+ : (cell.bg.r << 16) | (cell.bg.g << 8) | cell.bg.b;
55
+ const key = cache ? styleCacheKey(fg, bg, cell.attrs) : '';
56
+ const existing = key ? cache?.get(key) : undefined;
57
+ if (existing) {
58
+ return existing;
59
+ }
60
+ let style = module.style().fg(fg).bg(bg);
61
+ if (cell.attrs.bold) {
62
+ style = style.bold();
63
+ }
64
+ if (cell.attrs.italic) {
65
+ style = style.italic();
66
+ }
67
+ if (cell.attrs.underline) {
68
+ style = style.underline();
69
+ }
70
+ if (cell.attrs.strikethrough) {
71
+ style = style.strikethrough();
72
+ }
73
+ if (cache && key) {
74
+ if (cache.size >= MAX_STYLE_CACHE_ENTRIES) {
75
+ cache.clear();
76
+ }
77
+ cache.set(key, style);
78
+ }
79
+ return style;
80
+ };
81
+ export const hasWebGL2 = () => {
82
+ if (typeof document === 'undefined') {
83
+ return false;
84
+ }
85
+ const canvas = document.createElement('canvas');
86
+ try {
87
+ return Boolean(canvas.getContext('webgl2'));
88
+ }
89
+ catch {
90
+ return false;
91
+ }
92
+ };
93
+ export const createBeamtermRenderer = (module, selector, fontFamilies, fontSize) => module.BeamtermRenderer.withDynamicAtlas(selector, fontFamilies, fontSize, false);
94
+ export const createCell = (module, symbol, style) => new module.Cell(symbol, style);
95
+ export class BeamtermFabricRenderer {
96
+ constructor() {
97
+ this.backend = 'beamterm_webgl2';
98
+ this.renderPath = 'main_thread_webgl2';
99
+ this.module = null;
100
+ this.renderer = null;
101
+ this.target = null;
102
+ this.canvas = null;
103
+ this.visible = true;
104
+ this.initialized = false;
105
+ this.fontFamilies = ['monospace'];
106
+ this.fontSize = 12;
107
+ this.currentTheme = {
108
+ background: DEFAULT_BACKGROUND,
109
+ foreground: DEFAULT_FOREGROUND,
110
+ };
111
+ this.styleCache = new Map();
112
+ this.lastRenderedRows = 0;
113
+ this.lastDirtyCells = 0;
114
+ this.geometry = null;
115
+ this.surfaceBackgroundCss = null;
116
+ this.hostInlineBackgroundColor = null;
117
+ }
118
+ async initialize(target) {
119
+ this.target = target;
120
+ this.currentTheme = {
121
+ background: parseHexColor(target.theme.background, DEFAULT_BACKGROUND),
122
+ foreground: parseHexColor(target.theme.foreground, DEFAULT_FOREGROUND),
123
+ };
124
+ let canvas = null;
125
+ let ghosttyCanvas = null;
126
+ try {
127
+ const webgl2Supported = hasWebGL2();
128
+ terminalFabricCoordinator.setRendererState({
129
+ webgl2Supported,
130
+ backend: webgl2Supported ? 'beamterm_webgl2' : 'main_thread_canvas_live',
131
+ renderPath: webgl2Supported ? 'main_thread_webgl2' : 'canvas_live_fallback',
132
+ });
133
+ if (!webgl2Supported) {
134
+ throw new Error('WebGL2 is not available for Beamterm');
135
+ }
136
+ this.module = await loadBeamtermModule();
137
+ terminalFabricCoordinator.setRendererState({ beamtermLoaded: true });
138
+ canvas = document.createElement('canvas');
139
+ canvas.className = 'floeterm-beamterm-canvas';
140
+ canvas.setAttribute('aria-hidden', 'true');
141
+ canvas.style.position = 'absolute';
142
+ canvas.style.inset = '0';
143
+ canvas.style.width = '100%';
144
+ canvas.style.height = '100%';
145
+ canvas.style.pointerEvents = 'none';
146
+ canvas.style.zIndex = '2';
147
+ ghosttyCanvas = target.getGhosttyCanvas();
148
+ if (ghosttyCanvas) {
149
+ ghosttyCanvas.style.opacity = '0';
150
+ }
151
+ const host = target.container;
152
+ const computed = getComputedStyle(host);
153
+ if (computed.position === 'static') {
154
+ host.style.position = 'relative';
155
+ }
156
+ this.hostInlineBackgroundColor = host.style.backgroundColor;
157
+ host.appendChild(canvas);
158
+ this.canvas = canvas;
159
+ this.syncBackgroundSurface();
160
+ const selector = normalizeCanvasSelector(canvas);
161
+ this.fontFamilies = normalizeFontFamilies(target.fontFamily);
162
+ this.fontSize = target.fontSize;
163
+ this.renderer = createBeamtermRenderer(this.module, selector, this.fontFamilies, this.fontSize);
164
+ this.installEventForwarding(canvas);
165
+ this.resize(host.clientWidth, host.clientHeight);
166
+ this.initialized = true;
167
+ terminalFabricCoordinator.incrementRendererCounts({ active: 1, visible: 1 });
168
+ terminalFabricCoordinator.setRendererState({
169
+ backend: 'beamterm_webgl2',
170
+ renderPath: 'main_thread_webgl2',
171
+ lastError: '',
172
+ });
173
+ }
174
+ catch (error) {
175
+ this.renderer?.free();
176
+ this.renderer = null;
177
+ this.module = null;
178
+ this.canvas = null;
179
+ canvas?.remove();
180
+ this.restoreBackgroundSurface();
181
+ if (ghosttyCanvas) {
182
+ ghosttyCanvas.style.opacity = '';
183
+ }
184
+ throw error;
185
+ }
186
+ }
187
+ isActive() {
188
+ return this.initialized && Boolean(this.renderer && this.module);
189
+ }
190
+ startFrame(frame, options) {
191
+ void frame;
192
+ if (!this.renderer || !this.visible) {
193
+ return;
194
+ }
195
+ this.currentTheme = options.theme;
196
+ this.syncBackgroundSurface();
197
+ this.lastRenderedRows = 0;
198
+ this.lastDirtyCells = 0;
199
+ if (frame.forceAll) {
200
+ const batch = this.renderer.batch();
201
+ batch.clear(options.theme.background);
202
+ }
203
+ }
204
+ writeRow(row, cells, cols) {
205
+ if (!this.renderer || !this.module || !this.visible) {
206
+ return;
207
+ }
208
+ const batch = this.renderer.batch();
209
+ for (let col = 0; col < cols; col += 1) {
210
+ const current = cells[col];
211
+ if (!current) {
212
+ continue;
213
+ }
214
+ const style = createStyle(this.module, current, this.currentTheme, this.styleCache);
215
+ const text = current.attrs.invisible ? ' ' : current.symbol || ' ';
216
+ batch.cell(col, row, createCell(this.module, text, style));
217
+ this.lastDirtyCells += 1;
218
+ }
219
+ this.lastRenderedRows += 1;
220
+ }
221
+ finishFrame(cursor) {
222
+ if (!this.renderer || !this.visible) {
223
+ return {
224
+ rendered: false,
225
+ renderedRows: 0,
226
+ dirtyCells: 0,
227
+ };
228
+ }
229
+ if (cursor?.visible && this.module) {
230
+ const batch = this.renderer.batch();
231
+ batch.cell(Math.max(0, cursor.x), Math.max(0, cursor.y), createCell(this.module, ' ', this.module.style().fg(this.currentTheme.background).bg(this.currentTheme.foreground)));
232
+ }
233
+ this.renderer.render();
234
+ return {
235
+ rendered: true,
236
+ renderedRows: this.lastRenderedRows,
237
+ dirtyCells: this.lastDirtyCells,
238
+ };
239
+ }
240
+ resize(width, height) {
241
+ if (!this.renderer || !this.canvas) {
242
+ return;
243
+ }
244
+ const cssWidth = Math.max(1, Math.floor(width));
245
+ const cssHeight = Math.max(1, Math.floor(height));
246
+ this.canvas.style.width = `${cssWidth}px`;
247
+ this.canvas.style.height = `${cssHeight}px`;
248
+ this.renderer.resize(cssWidth, cssHeight);
249
+ this.geometry = readBeamtermGeometry(this.renderer, this.canvas, cssWidth, cssHeight);
250
+ }
251
+ getGeometry() {
252
+ return this.geometry ? { ...this.geometry } : null;
253
+ }
254
+ setAppearance(appearance) {
255
+ if (appearance.theme) {
256
+ this.currentTheme = {
257
+ background: parseHexColor(appearance.theme.background, this.currentTheme.background),
258
+ foreground: parseHexColor(appearance.theme.foreground, this.currentTheme.foreground),
259
+ };
260
+ this.syncBackgroundSurface();
261
+ this.styleCache.clear();
262
+ }
263
+ if (!this.renderer || (!appearance.fontFamily && typeof appearance.fontSize !== 'number')) {
264
+ return;
265
+ }
266
+ const family = appearance.fontFamily ? normalizeFontFamilies(appearance.fontFamily) : this.fontFamilies;
267
+ const size = typeof appearance.fontSize === 'number' ? appearance.fontSize : this.fontSize;
268
+ try {
269
+ this.fontFamilies = family;
270
+ this.fontSize = size;
271
+ this.styleCache.clear();
272
+ this.renderer.replaceWithDynamicAtlas(family, size);
273
+ if (this.geometry) {
274
+ this.resize(this.geometry.width, this.geometry.height);
275
+ }
276
+ }
277
+ catch (error) {
278
+ this.target?.logger.warn('[BeamtermFabricRenderer] Dynamic atlas replacement failed', { error });
279
+ }
280
+ }
281
+ setVisible(visible) {
282
+ if (visible === this.visible) {
283
+ return;
284
+ }
285
+ this.visible = visible;
286
+ if (this.canvas) {
287
+ this.canvas.style.display = visible ? 'block' : 'none';
288
+ }
289
+ terminalFabricCoordinator.incrementRendererCounts({
290
+ visible: visible ? 1 : -1,
291
+ offscreen: visible ? -1 : 1,
292
+ });
293
+ }
294
+ loseContextForTest() {
295
+ const gl = this.canvas?.getContext('webgl2');
296
+ const extension = gl?.getExtension('WEBGL_lose_context');
297
+ extension?.loseContext();
298
+ }
299
+ getDiagnostics() {
300
+ return terminalFabricCoordinator.getDiagnostics();
301
+ }
302
+ dispose() {
303
+ if (!this.initialized && !this.renderer && !this.canvas) {
304
+ return;
305
+ }
306
+ this.renderer?.free();
307
+ this.renderer = null;
308
+ this.module = null;
309
+ this.initialized = false;
310
+ this.geometry = null;
311
+ const wasVisible = this.visible;
312
+ this.visible = false;
313
+ this.styleCache.clear();
314
+ this.canvas?.remove();
315
+ this.canvas = null;
316
+ const ghosttyCanvas = this.target?.getGhosttyCanvas();
317
+ if (ghosttyCanvas) {
318
+ ghosttyCanvas.style.opacity = '';
319
+ }
320
+ this.restoreBackgroundSurface();
321
+ terminalFabricCoordinator.incrementRendererCounts({
322
+ active: -1,
323
+ visible: wasVisible ? -1 : 0,
324
+ offscreen: wasVisible ? 0 : -1,
325
+ });
326
+ }
327
+ syncBackgroundSurface() {
328
+ const nextBackground = formatHexColor(this.currentTheme.background);
329
+ if (this.surfaceBackgroundCss === nextBackground) {
330
+ return;
331
+ }
332
+ this.surfaceBackgroundCss = nextBackground;
333
+ if (this.canvas) {
334
+ this.canvas.style.backgroundColor = nextBackground;
335
+ }
336
+ if (this.target?.container) {
337
+ this.target.container.style.backgroundColor = nextBackground;
338
+ }
339
+ }
340
+ restoreBackgroundSurface() {
341
+ if (this.target?.container && this.hostInlineBackgroundColor !== null) {
342
+ this.target.container.style.backgroundColor = this.hostInlineBackgroundColor;
343
+ }
344
+ this.hostInlineBackgroundColor = null;
345
+ this.surfaceBackgroundCss = null;
346
+ }
347
+ installEventForwarding(canvas) {
348
+ canvas.addEventListener('webglcontextlost', event => {
349
+ event.preventDefault();
350
+ terminalFabricCoordinator.noteFallback('Beamterm WebGL2 context lost');
351
+ });
352
+ canvas.addEventListener('webglcontextrestored', () => {
353
+ terminalFabricCoordinator.noteContextRestore();
354
+ });
355
+ }
356
+ }
357
+ export const sameRenderableStyle = (left, right) => (left.fg.r === right.fg.r
358
+ && left.fg.g === right.fg.g
359
+ && left.fg.b === right.fg.b
360
+ && left.bg.r === right.bg.r
361
+ && left.bg.g === right.bg.g
362
+ && left.bg.b === right.bg.b
363
+ && Boolean(left.attrs.bold) === Boolean(right.attrs.bold)
364
+ && Boolean(left.attrs.italic) === Boolean(right.attrs.italic)
365
+ && Boolean(left.attrs.underline) === Boolean(right.attrs.underline)
366
+ && Boolean(left.attrs.strikethrough) === Boolean(right.attrs.strikethrough)
367
+ && Boolean(left.attrs.inverse) === Boolean(right.attrs.inverse)
368
+ && Boolean(left.attrs.invisible) === Boolean(right.attrs.invisible)
369
+ && Boolean(left.attrs.faint) === Boolean(right.attrs.faint));
370
+ const readBeamtermGeometry = (renderer, canvas, width, height) => {
371
+ const cellSize = renderer.cellSize();
372
+ const terminalSize = renderer.terminalSize();
373
+ try {
374
+ const cellWidth = Number(cellSize.width);
375
+ const cellHeight = Number(cellSize.height);
376
+ const cols = Math.floor(Number(terminalSize.cols));
377
+ const rows = Math.floor(Number(terminalSize.rows));
378
+ if (!Number.isFinite(cellWidth)
379
+ || !Number.isFinite(cellHeight)
380
+ || !Number.isFinite(cols)
381
+ || !Number.isFinite(rows)
382
+ || cellWidth <= 0
383
+ || cellHeight <= 0
384
+ || cols <= 0
385
+ || rows <= 0) {
386
+ return null;
387
+ }
388
+ const scaleX = resolveBeamtermCellScale(cellWidth, cols, canvas.width, width);
389
+ const scaleY = resolveBeamtermCellScale(cellHeight, rows, canvas.height, height);
390
+ const cssCellWidth = cellWidth / scaleX;
391
+ const cssCellHeight = cellHeight / scaleY;
392
+ return {
393
+ width,
394
+ height,
395
+ cellWidth: cssCellWidth,
396
+ cellHeight: cssCellHeight,
397
+ cols,
398
+ rows,
399
+ };
400
+ }
401
+ finally {
402
+ cellSize.free();
403
+ terminalSize.free();
404
+ }
405
+ };
406
+ const resolveBeamtermCellScale = (cellSize, cellCount, backingExtent, cssExtent) => {
407
+ const backingScale = resolveCanvasBackingScale(backingExtent, cssExtent);
408
+ if (backingScale <= 1) {
409
+ return 1;
410
+ }
411
+ const gridExtent = cellSize * cellCount;
412
+ const cssError = relativeExtentError(gridExtent, cssExtent);
413
+ const backingError = relativeExtentError(gridExtent, backingExtent);
414
+ return backingError < cssError ? backingScale : 1;
415
+ };
416
+ const relativeExtentError = (actual, expected) => {
417
+ if (!Number.isFinite(actual) || !Number.isFinite(expected) || expected <= 0) {
418
+ return Number.POSITIVE_INFINITY;
419
+ }
420
+ return Math.abs(actual - expected) / expected;
421
+ };
422
+ const resolveCanvasBackingScale = (backingSize, cssSize) => {
423
+ const scale = Number(backingSize) / Number(cssSize);
424
+ if (Number.isFinite(scale) && scale > 0) {
425
+ return scale;
426
+ }
427
+ const dpr = typeof window !== 'undefined' ? Number(window.devicePixelRatio) : 1;
428
+ return Number.isFinite(dpr) && dpr > 0 ? dpr : 1;
429
+ };
430
+ export const normalizeFontFamilies = (fontFamily) => {
431
+ const families = fontFamily
432
+ .split(',')
433
+ .map(part => part.trim().replace(/^['"]|['"]$/g, ''))
434
+ .filter(Boolean);
435
+ return families.length > 0 ? families : ['monospace'];
436
+ };
437
+ const styleCacheKey = (fg, bg, attrs) => [
438
+ fg,
439
+ bg,
440
+ attrs.bold ? 1 : 0,
441
+ attrs.italic ? 1 : 0,
442
+ attrs.underline ? 1 : 0,
443
+ attrs.strikethrough ? 1 : 0,
444
+ attrs.inverse ? 1 : 0,
445
+ attrs.invisible ? 1 : 0,
446
+ attrs.faint ? 1 : 0,
447
+ ].join(':');
448
+ //# sourceMappingURL=BeamtermFabricRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BeamtermFabricRenderer.js","sourceRoot":"","sources":["../../src/fabric/BeamtermFabricRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { TerminalFabricBackend, TerminalFabricDiagnostics, TerminalFabricFrame, TerminalFabricFrameReason, TerminalFabricRenderPath } from './types';
2
+ export declare class TerminalFabricCoordinator {
3
+ private nextFrameId;
4
+ private stats;
5
+ private webgl2Supported;
6
+ private beamtermLoaded;
7
+ private lastError;
8
+ private activeRendererCount;
9
+ private visibleViewCount;
10
+ private offscreenViewCount;
11
+ beginFrame(reason: TerminalFabricFrameReason, forceAll: boolean, now?: number): TerminalFabricFrame;
12
+ completeFrame(frame: TerminalFabricFrame, renderedRows: number, dirtyCells: number, now?: number): void;
13
+ noteCoalescedFrame(): void;
14
+ noteFallback(error: unknown): void;
15
+ noteContextRestore(): void;
16
+ noteWorkerRestart(): void;
17
+ setRendererState(next: {
18
+ activeRendererCount?: number;
19
+ visibleViewCount?: number;
20
+ offscreenViewCount?: number;
21
+ pendingDeltaCount?: number;
22
+ webgl2Supported?: boolean;
23
+ beamtermLoaded?: boolean;
24
+ backend?: TerminalFabricBackend;
25
+ renderPath?: TerminalFabricRenderPath;
26
+ lastError?: string;
27
+ }): void;
28
+ incrementRendererCounts(delta: {
29
+ active?: number;
30
+ visible?: number;
31
+ offscreen?: number;
32
+ }): void;
33
+ getDiagnostics(): TerminalFabricDiagnostics;
34
+ resetStats(): void;
35
+ resetAll(): void;
36
+ }
37
+ export declare const terminalFabricCoordinator: TerminalFabricCoordinator;
38
+ export declare const getTerminalFabricDiagnostics: () => TerminalFabricDiagnostics;
39
+ export declare const resetTerminalFabricDiagnostics: () => void;
40
+ //# sourceMappingURL=TerminalFabricCoordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalFabricCoordinator.d.ts","sourceRoot":"","sources":["../../src/fabric/TerminalFabricCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EAEzB,MAAM,SAAS,CAAC;AAqBjB,qBAAa,yBAAyB;IACpC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,kBAAkB,CAAK;IAE/B,UAAU,CAAC,MAAM,EAAE,yBAAyB,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAoB,GAAG,mBAAmB;IAe9G,aAAa,CAAC,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAoB,GAAG,IAAI;IAOlH,kBAAkB,IAAI,IAAI;IAI1B,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAOlC,kBAAkB,IAAI,IAAI;IAK1B,iBAAiB,IAAI,IAAI;IAIzB,gBAAgB,CAAC,IAAI,EAAE;QACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,OAAO,CAAC,EAAE,qBAAqB,CAAC;QAChC,UAAU,CAAC,EAAE,wBAAwB,CAAC;QACtC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI;IA8BR,uBAAuB,CAAC,KAAK,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQ/F,cAAc,IAAI,yBAAyB;IAS3C,UAAU,IAAI,IAAI;IAelB,QAAQ,IAAI,IAAI;CAUjB;AAED,eAAO,MAAM,yBAAyB,2BAAkC,CAAC;AAEzE,eAAO,MAAM,4BAA4B,QAAO,yBAE/C,CAAC;AAEF,eAAO,MAAM,8BAA8B,QAAO,IAEjD,CAAC"}
@@ -0,0 +1,140 @@
1
+ const createEmptyStats = () => ({
2
+ backend: 'main_thread_canvas_live',
3
+ renderPath: 'canvas_live_fallback',
4
+ activeRendererCount: 0,
5
+ visibleViewCount: 0,
6
+ offscreenViewCount: 0,
7
+ frameCount: 0,
8
+ renderedFrameCount: 0,
9
+ lastFrameDurationMs: 0,
10
+ lastFrameRenderedRows: 0,
11
+ lastFrameDirtyCells: 0,
12
+ fullRepaintCount: 0,
13
+ contextRestoreCount: 0,
14
+ fallbackCount: 0,
15
+ workerRestartCount: 0,
16
+ pendingDeltaCount: 0,
17
+ coalescedFrameCount: 0,
18
+ });
19
+ export class TerminalFabricCoordinator {
20
+ constructor() {
21
+ this.nextFrameId = 1;
22
+ this.stats = createEmptyStats();
23
+ this.webgl2Supported = false;
24
+ this.beamtermLoaded = false;
25
+ this.lastError = '';
26
+ this.activeRendererCount = 0;
27
+ this.visibleViewCount = 0;
28
+ this.offscreenViewCount = 0;
29
+ }
30
+ beginFrame(reason, forceAll, now = performance.now()) {
31
+ const frame = {
32
+ id: this.nextFrameId,
33
+ forceAll,
34
+ reason,
35
+ startedAtMs: now,
36
+ };
37
+ this.nextFrameId += 1;
38
+ this.stats.frameCount += 1;
39
+ if (forceAll) {
40
+ this.stats.fullRepaintCount += 1;
41
+ }
42
+ return frame;
43
+ }
44
+ completeFrame(frame, renderedRows, dirtyCells, now = performance.now()) {
45
+ this.stats.renderedFrameCount += 1;
46
+ this.stats.lastFrameDurationMs = Math.max(0, now - frame.startedAtMs);
47
+ this.stats.lastFrameRenderedRows = Math.max(0, renderedRows);
48
+ this.stats.lastFrameDirtyCells = Math.max(0, dirtyCells);
49
+ }
50
+ noteCoalescedFrame() {
51
+ this.stats.coalescedFrameCount += 1;
52
+ }
53
+ noteFallback(error) {
54
+ this.stats.fallbackCount += 1;
55
+ this.stats.backend = 'main_thread_canvas_live';
56
+ this.stats.renderPath = 'canvas_live_fallback';
57
+ this.lastError = error instanceof Error ? error.message : String(error ?? 'unknown fallback');
58
+ }
59
+ noteContextRestore() {
60
+ this.stats.contextRestoreCount += 1;
61
+ this.lastError = '';
62
+ }
63
+ noteWorkerRestart() {
64
+ this.stats.workerRestartCount += 1;
65
+ }
66
+ setRendererState(next) {
67
+ if (typeof next.activeRendererCount === 'number') {
68
+ this.activeRendererCount = Math.max(0, next.activeRendererCount);
69
+ }
70
+ if (typeof next.visibleViewCount === 'number') {
71
+ this.visibleViewCount = Math.max(0, next.visibleViewCount);
72
+ }
73
+ if (typeof next.offscreenViewCount === 'number') {
74
+ this.offscreenViewCount = Math.max(0, next.offscreenViewCount);
75
+ }
76
+ this.stats = {
77
+ ...this.stats,
78
+ activeRendererCount: this.activeRendererCount,
79
+ visibleViewCount: this.visibleViewCount,
80
+ offscreenViewCount: this.offscreenViewCount,
81
+ ...(typeof next.pendingDeltaCount === 'number' ? { pendingDeltaCount: next.pendingDeltaCount } : {}),
82
+ ...(next.backend ? { backend: next.backend } : {}),
83
+ ...(next.renderPath ? { renderPath: next.renderPath } : {}),
84
+ };
85
+ if (typeof next.webgl2Supported === 'boolean') {
86
+ this.webgl2Supported = next.webgl2Supported;
87
+ }
88
+ if (typeof next.beamtermLoaded === 'boolean') {
89
+ this.beamtermLoaded = next.beamtermLoaded;
90
+ }
91
+ if (typeof next.lastError === 'string') {
92
+ this.lastError = next.lastError;
93
+ }
94
+ }
95
+ incrementRendererCounts(delta) {
96
+ this.setRendererState({
97
+ activeRendererCount: this.activeRendererCount + (delta.active ?? 0),
98
+ visibleViewCount: this.visibleViewCount + (delta.visible ?? 0),
99
+ offscreenViewCount: this.offscreenViewCount + (delta.offscreen ?? 0),
100
+ });
101
+ }
102
+ getDiagnostics() {
103
+ return {
104
+ ...this.stats,
105
+ webgl2Supported: this.webgl2Supported,
106
+ beamtermLoaded: this.beamtermLoaded,
107
+ lastError: this.lastError,
108
+ };
109
+ }
110
+ resetStats() {
111
+ const current = this.stats;
112
+ this.stats = {
113
+ ...createEmptyStats(),
114
+ backend: current.backend,
115
+ renderPath: current.renderPath,
116
+ activeRendererCount: this.activeRendererCount,
117
+ visibleViewCount: this.visibleViewCount,
118
+ offscreenViewCount: this.offscreenViewCount,
119
+ fallbackCount: current.fallbackCount,
120
+ contextRestoreCount: current.contextRestoreCount,
121
+ workerRestartCount: current.workerRestartCount,
122
+ };
123
+ }
124
+ resetAll() {
125
+ this.nextFrameId = 1;
126
+ this.stats = createEmptyStats();
127
+ this.webgl2Supported = false;
128
+ this.beamtermLoaded = false;
129
+ this.lastError = '';
130
+ this.activeRendererCount = 0;
131
+ this.visibleViewCount = 0;
132
+ this.offscreenViewCount = 0;
133
+ }
134
+ }
135
+ export const terminalFabricCoordinator = new TerminalFabricCoordinator();
136
+ export const getTerminalFabricDiagnostics = () => (terminalFabricCoordinator.getDiagnostics());
137
+ export const resetTerminalFabricDiagnostics = () => {
138
+ terminalFabricCoordinator.resetStats();
139
+ };
140
+ //# sourceMappingURL=TerminalFabricCoordinator.js.map