@simon_he/vue-tui 0.0.7 → 0.0.8

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/index.d.ts CHANGED
@@ -1,99 +1,11 @@
1
- import * as vue12 from "vue";
2
- import * as vue13 from "vue";
1
+ import { AnsiColorName, BufferSnapshot, Cell, Style, TERMINAL_RENDER_PLANES, Terminal, TerminalCommitEvent, TerminalEventMap, TerminalRenderPlane, TerminalRenderPlanes, TerminalResizeEvent, TerminalScrollOperation, ThemeModeId } from "./types-ClIV2h1o.js";
2
+ import { TuiMarkdownTheme, TuiMarkdownThemeOverrides } from "./theme-Bsm65g8k.js";
3
+ import * as vue15 from "vue";
4
+ import * as vue16 from "vue";
3
5
  import { App, Component as Component$1, ComputedRef, InjectionKey, Ref, VNode } from "vue";
4
6
 
5
- //#region src/core/render-plane.d.ts
6
- declare const TERMINAL_RENDER_PLANES: readonly ["default", "transcript", "chrome", "overlay"];
7
- type TerminalRenderPlane = (typeof TERMINAL_RENDER_PLANES)[number];
8
- type TerminalRenderPlanes = readonly TerminalRenderPlane[];
9
-
10
- //#endregion
11
- //#region src/core/types.d.ts
12
- type AnsiColorName = 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white' | 'blackBright' | 'redBright' | 'greenBright' | 'yellowBright' | 'blueBright' | 'magentaBright' | 'cyanBright' | 'whiteBright';
13
- type Style = Readonly<{
14
- fg?: AnsiColorName;
15
- bg?: AnsiColorName;
16
- bold?: boolean;
17
- dim?: boolean;
18
- italic?: boolean;
19
- underline?: boolean;
20
- inverse?: boolean;
21
- /**
22
- * Optional terminal hyperlink target (OSC 8).
23
- * When set, renderers may emit a clickable hyperlink while keeping text width unchanged.
24
- */
25
- href?: string;
26
- }>;
27
- type Cell = Readonly<{
28
- ch: string;
29
- width: 1 | 2;
30
- continuation?: true;
31
- style: Style;
32
- }>;
33
- type BufferSnapshot = Readonly<{
34
- cols: number;
35
- rows: number;
36
- lines: readonly string[];
37
- }>;
38
- type TerminalSize = Readonly<{
39
- cols: number;
40
- rows: number;
41
- }>;
42
- type TerminalScrollOperation = Readonly<{
43
- startY: number;
44
- endY: number;
45
- delta: number;
46
- }>;
47
- type TerminalCommitEvent = Readonly<{
48
- dirtyRows: readonly number[] | null;
49
- planes: TerminalRenderPlanes | null;
50
- sync?: boolean;
51
- scrollOperations?: readonly TerminalScrollOperation[] | null;
52
- }>;
53
- type TerminalResizeEvent = Readonly<{
54
- cols: number;
55
- rows: number;
56
- }>;
57
- interface TerminalEventMap {
58
- commit: TerminalCommitEvent;
59
- resize: TerminalResizeEvent;
60
- }
61
- interface Terminal {
62
- resize: (cols: number, rows: number) => void;
63
- clear: (x?: number, y?: number, w?: number, h?: number) => void;
64
- write: (text: string, opts?: {
65
- x?: number;
66
- y?: number;
67
- style?: Style;
68
- }) => void;
69
- writeAnsi: (text: string, opts?: {
70
- x?: number;
71
- y?: number;
72
- }) => void;
73
- put: (x: number, y: number, ch: string, style?: Style) => void;
74
- fill: (x: number, y: number, w: number, h: number, ch?: string, style?: Style) => void;
75
- scroll: (lines: number) => void;
76
- setCursor: (x: number, y: number, visible?: boolean) => void;
77
- batch: <T>(fn: () => T) => T;
78
- commit: (meta?: {
79
- planes?: TerminalRenderPlanes | null;
80
- sync?: boolean;
81
- }) => readonly number[] | null;
82
- on: <K extends keyof TerminalEventMap>(event: K, cb: (payload: TerminalEventMap[K]) => void) => () => void;
83
- dispose: () => void;
84
- size: () => TerminalSize;
85
- snapshot: () => BufferSnapshot;
86
- getCell: (x: number, y: number) => Cell;
87
- getRow: (y: number) => readonly Cell[];
88
- setScrollbackLimit: (limit: number) => void;
89
- getScrollbackLines: (count?: number) => readonly string[];
90
- /** Register fingerprint function for SoA pre-computation on the composite buffer. */
91
- setFingerprintFn: (fn: (ch: string, style: Style) => number) => void;
92
- /** Get pre-computed fingerprints for a composite buffer row (null if not enabled). */
93
- getRowFingerprints: (y: number) => Uint32Array | null;
94
- } //#endregion
95
7
  //#region src/core/ansi/colors.d.ts
96
- type TerminalColorMode = 'ansi8' | 'ansi16' | 'ansi256' | 'truecolor';
8
+ type TerminalColorMode = "ansi8" | "ansi16" | "ansi256" | "truecolor";
97
9
  type TerminalColorLevel = 8 | 16 | 256;
98
10
  type AnsiRgb = Readonly<{
99
11
  r: number;
@@ -103,9 +15,7 @@ type AnsiRgb = Readonly<{
103
15
  declare const SGR_RESET = "\u001B[0m";
104
16
  declare function truecolorFgOpen(rgb: AnsiRgb): string;
105
17
  declare function truecolorBgOpen(rgb: AnsiRgb): string;
106
- declare function rgbToAnsi256(rgb: AnsiRgb): number;
107
-
108
- //#endregion
18
+ declare function rgbToAnsi256(rgb: AnsiRgb): number; //#endregion
109
19
  //#region src/ansi-styles.d.ts
110
20
  declare const ansiStyles: Readonly<{
111
21
  reset: Readonly<{
@@ -307,7 +217,7 @@ declare function ansiColors(level: 8 | 16 | 256): readonly Readonly<{
307
217
  }>[]; //#endregion
308
218
  //#region src/events/recording.d.ts
309
219
  type TerminalEventRecord = Readonly<{
310
- type: 'keydown' | 'keyup';
220
+ type: "keydown" | "keyup";
311
221
  key: string;
312
222
  code?: string;
313
223
  ctrlKey?: boolean;
@@ -317,7 +227,7 @@ type TerminalEventRecord = Readonly<{
317
227
  repeat?: boolean;
318
228
  time?: number;
319
229
  }> | Readonly<{
320
- type: 'pointerdown' | 'pointerup' | 'pointermove' | 'click' | 'dblclick' | 'contextmenu';
230
+ type: "pointerdown" | "pointerup" | "pointermove" | "click" | "dblclick" | "contextmenu";
321
231
  cellX: number;
322
232
  cellY: number;
323
233
  clientX?: number;
@@ -330,19 +240,20 @@ type TerminalEventRecord = Readonly<{
330
240
  metaKey?: boolean;
331
241
  time?: number;
332
242
  }> | Readonly<{
333
- type: 'wheel';
243
+ type: "wheel";
334
244
  cellX: number;
335
245
  cellY: number;
336
246
  clientX?: number;
337
247
  clientY?: number;
338
248
  deltaY: number;
249
+ deltaMode?: number;
339
250
  ctrlKey?: boolean;
340
251
  shiftKey?: boolean;
341
252
  altKey?: boolean;
342
253
  metaKey?: boolean;
343
254
  time?: number;
344
255
  }> | Readonly<{
345
- type: 'beforeinput' | 'input' | 'compositionstart' | 'compositionupdate' | 'compositionend' | 'paste';
256
+ type: "beforeinput" | "input" | "compositionstart" | "compositionupdate" | "compositionend" | "paste";
346
257
  data?: string;
347
258
  inputType?: string;
348
259
  isComposing?: boolean;
@@ -353,7 +264,7 @@ type TerminalEventRecord = Readonly<{
353
264
  //#endregion
354
265
  //#region src/cli/input.d.ts
355
266
  type Stdin = NodeJS.ReadStream;
356
- type KeyboardProtocol = 'auto' | 'kitty' | 'xterm' | 'off';
267
+ type KeyboardProtocol = "auto" | "kitty" | "xterm" | "off";
357
268
  type StdinDriver = Readonly<{
358
269
  dispose: () => void;
359
270
  }>;
@@ -375,9 +286,9 @@ declare function createStdinDriver(options: Readonly<{
375
286
 
376
287
  //#endregion
377
288
  //#region src/cli/path-suggest-core.d.ts
378
- type PathPickMode = 'directory' | 'file' | 'any';
289
+ type PathPickMode = "directory" | "file" | "any";
379
290
  type PathSuggestion = Readonly<{
380
- kind: 'directory' | 'file';
291
+ kind: "directory" | "file";
381
292
  display: string;
382
293
  completion: string;
383
294
  absPath: string;
@@ -391,7 +302,7 @@ type SuggestPathsResult = Readonly<{
391
302
 
392
303
  //#endregion
393
304
  //#region src/cli/path-provider.d.ts
394
- type FsEntryKind = 'file' | 'directory' | 'other';
305
+ type FsEntryKind = "file" | "directory" | "other";
395
306
  type FsDirEntry = Readonly<{
396
307
  name: string;
397
308
  kind: FsEntryKind;
@@ -410,7 +321,7 @@ type PathPickerProvider = Readonly<{
410
321
  max: number;
411
322
  showHidden?: boolean;
412
323
  maxDepth?: number;
413
- gitignore?: 'blocking' | 'nonBlocking';
324
+ gitignore?: "blocking" | "nonBlocking";
414
325
  }>) => Promise<SuggestPathsResult>;
415
326
  resolvePath?: (workspaceAbs: string, input: string) => string | Promise<string>;
416
327
  }>;
@@ -426,7 +337,7 @@ declare function suggestPaths(options: Readonly<{
426
337
  showHidden?: boolean;
427
338
  listDir: (absDir: string) => Promise<FsDirEntry[]>;
428
339
  maxDepth?: number;
429
- gitignore?: 'blocking' | 'nonBlocking';
340
+ gitignore?: "blocking" | "nonBlocking";
430
341
  }>): Promise<SuggestPathsResult>;
431
342
  declare function resolveUserPath(workspaceAbs: string, input: string): string;
432
343
 
@@ -458,6 +369,10 @@ declare function detectTerminalColorCapability(opts?: Readonly<{
458
369
  platform?: string;
459
370
  }>): TerminalColorCapability;
460
371
 
372
+ //#endregion
373
+ //#region src/core/ansi-palette.d.ts
374
+ type ThemePalette = Partial<Record<AnsiColorName, string>>;
375
+
461
376
  //#endregion
462
377
  //#region src/core/ansi/sgr.d.ts
463
378
  interface AnsiSegment {
@@ -477,24 +392,132 @@ declare function createTerminal(opts: {
477
392
  rows: number;
478
393
  }): Terminal;
479
394
 
395
+ //#endregion
396
+ //#region src/renderer/capabilities.d.ts
397
+ type RendererCapabilities = Readonly<{
398
+ syncFlush: boolean;
399
+ scrollOperations: boolean;
400
+ domRows: boolean;
401
+ }>;
402
+ type TerminalRendererLike = Readonly<{
403
+ capabilities: RendererCapabilities;
404
+ container?: HTMLElement;
405
+ debugStats?: unknown;
406
+ }>;
407
+ declare const DOM_RENDERER_CAPABILITIES: RendererCapabilities;
408
+ declare const HEADLESS_RENDERER_CAPABILITIES: RendererCapabilities;
409
+
480
410
  //#endregion
481
411
  //#region src/renderer/dom/dom-renderer.d.ts
482
412
  type CellMetrics = Readonly<{
483
413
  cellWidth: number;
484
414
  cellHeight: number;
485
415
  }>;
416
+ type DomRendererSyncFlushDecision = Readonly<{
417
+ performed: boolean;
418
+ deferredReason?: "budget";
419
+ rows: number;
420
+ planes: number;
421
+ cells: number;
422
+ maxRows: number;
423
+ maxCells: number;
424
+ }>;
425
+ type DomRendererSyncFlushStats = Readonly<{
426
+ requested: number;
427
+ performed: number;
428
+ deferred: number;
429
+ last: DomRendererSyncFlushDecision | null;
430
+ }>;
431
+ type DomRendererFlushSample = Readonly<{
432
+ mode: "sync" | "deferred";
433
+ startedAt: number;
434
+ durationMs: number;
435
+ planeRows: number;
436
+ planes: number;
437
+ }>;
438
+ type DomRendererFlushStats = Readonly<{
439
+ count: number;
440
+ last: DomRendererFlushSample | null;
441
+ }>;
442
+ type DomRendererRowRenderStats = Readonly<{
443
+ rows: number;
444
+ cacheHits: number;
445
+ rowKeyPrepassChecks: number;
446
+ rowKeyPrepassHits: number;
447
+ rowKeyPrepassMisses: number;
448
+ transparentBlankRows: number;
449
+ plainTextRows: number;
450
+ singleStyledRows: number;
451
+ segmentReuseRows: number;
452
+ fragmentRows: number;
453
+ spansCreated: number;
454
+ spansReused: number;
455
+ textNodeUpdates: number;
456
+ replaceChildren: number;
457
+ }>;
458
+ type DomRendererRowRenderDebugStats = Readonly<{
459
+ total: DomRendererRowRenderStats;
460
+ lastFlush: DomRendererRowRenderStats | null;
461
+ }>;
462
+ type DomRendererRowKeyPrepassMode = boolean | "auto";
463
+ type DomRendererRowKeyPrepassDecision = "forced-enabled" | "forced-disabled" | "sampling" | "enabled" | "disabled";
464
+ type DomRendererRowKeyPrepassDebugStats = Readonly<{
465
+ mode: DomRendererRowKeyPrepassMode;
466
+ decision: DomRendererRowKeyPrepassDecision;
467
+ sampleRows: number;
468
+ sampleHits: number;
469
+ sampleMisses: number;
470
+ sampleHitRatio: number | null;
471
+ lastSampleRows: number;
472
+ lastSampleHitRatio: number | null;
473
+ }>;
474
+ type DomRendererDebugStats = Readonly<{
475
+ syncFlush: DomRendererSyncFlushStats;
476
+ flush: DomRendererFlushStats;
477
+ rowRender: DomRendererRowRenderDebugStats;
478
+ rowKeyPrepass: DomRendererRowKeyPrepassDebugStats;
479
+ }>;
486
480
  interface DomRenderer {
487
481
  readonly container: HTMLElement;
482
+ readonly capabilities: RendererCapabilities;
483
+ readonly debugStats: DomRendererDebugStats;
488
484
  readonly metrics: CellMetrics;
489
485
  dispose: () => void;
490
486
  refresh: () => void;
487
+ updateTheme: (next: Readonly<{
488
+ palette?: ThemePalette | null;
489
+ }>) => void;
491
490
  setPlaneOffset: (plane: TerminalRenderPlane, offsetPx: number) => void;
492
491
  setPlaneViewport: (plane: TerminalRenderPlane, viewport: Readonly<{
493
492
  topPx: number;
494
493
  heightPx: number;
495
494
  }> | null) => void;
496
495
  }
497
- declare function createDomRenderer(terminal: Terminal, container: HTMLElement): DomRenderer;
496
+ interface DomRendererOptions {
497
+ /**
498
+ * Maximum dirty row count allowed for same-call DOM flush when commit({ sync: true }).
499
+ * Larger updates are rAF-batched to avoid blocking the main thread.
500
+ */
501
+ syncFlushMaxRows?: number;
502
+ /**
503
+ * Maximum estimated cell work for sync DOM flush: dirtyRows * cols * activePlanes.
504
+ */
505
+ syncFlushCellBudget?: number;
506
+ /**
507
+ * Enables DOM line-node shifting for terminal scrollOperations.
508
+ */
509
+ enableScrollOperations?: boolean;
510
+ /** Optional ANSI-name palette exposed as DOM CSS variables. */
511
+ palette?: ThemePalette | null;
512
+ /**
513
+ * Controls a key-only early bailout before row segment allocation.
514
+ * The normal row cache remains enabled regardless of this option.
515
+ * Defaults to "auto": sample cached-row hit ratio and keep prepass enabled only
516
+ * when it pays for itself.
517
+ */
518
+ enableRowKeyPrepass?: DomRendererRowKeyPrepassMode;
519
+ }
520
+ declare function createDomRenderer(terminal: Terminal, container: HTMLElement, options?: DomRendererOptions): DomRenderer;
498
521
 
499
522
  //#endregion
500
523
  //#region src/events/manager/types.d.ts
@@ -504,7 +527,7 @@ type Rect = Readonly<{
504
527
  w: number;
505
528
  h: number;
506
529
  }>;
507
- type TerminalEventType = 'click' | 'dblclick' | 'contextmenu' | 'pointerdown' | 'pointerup' | 'pointermove' | 'pointerenter' | 'pointerleave' | 'wheel' | 'keydown' | 'keyup' | 'beforeinput' | 'input' | 'compositionstart' | 'compositionupdate' | 'compositionend' | 'paste' | 'focus' | 'blur';
530
+ type TerminalEventType = "click" | "dblclick" | "contextmenu" | "pointerdown" | "pointerup" | "pointermove" | "pointerenter" | "pointerleave" | "wheel" | "keydown" | "keyup" | "beforeinput" | "input" | "compositionstart" | "compositionupdate" | "compositionend" | "paste" | "focus" | "blur";
508
531
  interface TerminalBaseEvent {
509
532
  type: TerminalEventType;
510
533
  target: TerminalNode | null;
@@ -531,6 +554,7 @@ type TerminalPointerEvent = TerminalBaseEvent & {
531
554
  altKey?: boolean;
532
555
  metaKey?: boolean;
533
556
  deltaY?: number;
557
+ deltaMode?: number;
534
558
  };
535
559
  type TerminalKeyboardEvent = TerminalBaseEvent & {
536
560
  key: string;
@@ -608,10 +632,10 @@ type TerminalDebugNode = Readonly<{
608
632
  //#endregion
609
633
  //#region src/events/manager/cli-event-manager.d.ts
610
634
  interface CliEventManager {
611
- register: (node: Omit<TerminalNode, 'id'> & {
635
+ register: (node: Omit<TerminalNode, "id"> & {
612
636
  id?: string;
613
637
  }) => TerminalNode;
614
- update: (id: string, next: Partial<Omit<TerminalNode, 'id'>>) => void;
638
+ update: (id: string, next: Partial<Omit<TerminalNode, "id">>) => void;
615
639
  unregister: (id: string) => void;
616
640
  setMetrics: (next: CellMetrics) => void;
617
641
  focus: (id: string | null) => void;
@@ -628,10 +652,10 @@ declare function createCliEventManager(options?: Readonly<{
628
652
  //#endregion
629
653
  //#region src/events/manager/event-manager.d.ts
630
654
  interface EventManager {
631
- register: (node: Omit<TerminalNode, 'id'> & {
655
+ register: (node: Omit<TerminalNode, "id"> & {
632
656
  id?: string;
633
657
  }) => TerminalNode;
634
- update: (id: string, next: Partial<Omit<TerminalNode, 'id'>>) => void;
658
+ update: (id: string, next: Partial<Omit<TerminalNode, "id">>) => void;
635
659
  unregister: (id: string) => void;
636
660
  setMetrics: (next: CellMetrics) => void;
637
661
  focus: (id: string | null) => void;
@@ -646,36 +670,6 @@ declare function createEventManager(container: HTMLElement, metrics: CellMetrics
646
670
  onFocusChange?: (prev: string | null, next: string | null) => void;
647
671
  }>): EventManager;
648
672
 
649
- //#endregion
650
- //#region src/observability/trace.d.ts
651
- type TraceRecord = Readonly<{
652
- type: 'event';
653
- at: number;
654
- event: TerminalEventRecord;
655
- }> | Readonly<{
656
- type: 'focus';
657
- at: number;
658
- prev: string | null;
659
- next: string | null;
660
- }> | Readonly<{
661
- type: 'commit';
662
- at: number;
663
- dirtyRows: readonly number[] | null;
664
- planes: TerminalRenderPlanes | null;
665
- focusedId: string | null;
666
- }>;
667
- type TraceStore = Readonly<{
668
- enabled: Ref<boolean>;
669
- records: TraceRecord[];
670
- push: (record: TraceRecord) => void;
671
- clear: () => void;
672
- snapshot: () => TraceRecord[];
673
- }>;
674
- declare function createTraceStore(opts?: Readonly<{
675
- enabled?: boolean;
676
- max?: number;
677
- }>): TraceStore;
678
-
679
673
  //#endregion
680
674
  //#region src/renderer/cli/stdout-renderer.d.ts
681
675
  type CliOutput = Readonly<{
@@ -689,21 +683,22 @@ type StdoutRenderer = Readonly<{
689
683
  setCursor: (x: number, y: number) => void;
690
684
  /** Show or hide the terminal cursor */
691
685
  showCursor: (visible: boolean) => void;
692
- /** Update palette/default background without recreating the renderer. */
686
+ /** Update default background without recreating the renderer. */
693
687
  updateTheme?: (next: Readonly<{
694
- defaultBg?: AnsiColorName;
695
- palette?: Partial<Record<AnsiColorName, string>>;
688
+ defaultBg?: string | null;
689
+ palette?: ThemePalette | null;
696
690
  }>) => void;
697
691
  }>;
698
- type StdoutColorMode = 'auto' | 'truecolor' | 'ansi256' | 'ansi16' | 'ansi8';
692
+ type StdoutColorMode = "auto" | "truecolor" | "ansi256" | "ansi16" | "ansi8";
699
693
  declare function createStdoutRenderer(terminal: Terminal, options?: Readonly<{
700
694
  output?: CliOutput;
701
695
  clear?: boolean;
702
696
  hideCursor?: boolean;
703
697
  altScreen?: boolean;
704
- /** Fallback background color when a cell has no explicit bg. */
705
- defaultBg?: AnsiColorName;
706
- palette?: Partial<Record<AnsiColorName, string>>;
698
+ /** Fallback background color when a cell has no explicit bg. `null` = transparent (terminal default). */
699
+ defaultBg?: string | null;
700
+ /** Optional ANSI-name palette used when emitting ansi256/truecolor sequences. */
701
+ palette?: ThemePalette | null;
707
702
  /** Track TTY resize events (process.stdout 'resize') and call terminal.resize(). */
708
703
  trackResize?: boolean;
709
704
  /** Color mode for ANSI output (auto detects truecolor via env). */
@@ -717,6 +712,94 @@ declare function createStdoutRenderer(terminal: Terminal, options?: Readonly<{
717
712
  useSyncOutput?: boolean;
718
713
  }>): StdoutRenderer;
719
714
 
715
+ //#endregion
716
+ //#region src/observability/trace.d.ts
717
+ type TraceRecord = Readonly<{
718
+ type: "event";
719
+ at: number;
720
+ event: TerminalEventRecord;
721
+ }> | Readonly<{
722
+ type: "focus";
723
+ at: number;
724
+ prev: string | null;
725
+ next: string | null;
726
+ }> | Readonly<{
727
+ type: "commit";
728
+ at: number;
729
+ dirtyRows: readonly number[] | null;
730
+ planes: TerminalRenderPlanes | null;
731
+ sync?: boolean;
732
+ rendererSyncFlush?: DomRendererSyncFlushDecision | null;
733
+ focusedId: string | null;
734
+ }>;
735
+ type TraceStore = Readonly<{
736
+ enabled: Ref<boolean>;
737
+ records: TraceRecord[];
738
+ push: (record: TraceRecord) => void;
739
+ clear: () => void;
740
+ snapshot: () => TraceRecord[];
741
+ }>;
742
+ declare function createTraceStore(opts?: Readonly<{
743
+ enabled?: boolean;
744
+ max?: number;
745
+ }>): TraceStore;
746
+
747
+ //#endregion
748
+ //#region src/observability/frame-perf.d.ts
749
+ type FramePerfReason = "scroll" | "input" | "stream" | "resize" | "data" | "manual" | "unknown";
750
+ type FramePerfRowBucketFallback = Readonly<{
751
+ plane: string;
752
+ reason: "dirty-ratio" | "candidate-ratio";
753
+ dirtyRows: number;
754
+ planeNodes: number;
755
+ candidates?: number;
756
+ }>;
757
+ type FramePerfMailboxFailure = Readonly<{
758
+ id: string;
759
+ queued: number;
760
+ dropped: number;
761
+ }>;
762
+ type FramePerfSample = Readonly<{
763
+ frameId: number;
764
+ reason: FramePerfReason;
765
+ startedAt: number;
766
+ durationMs: number;
767
+ renderManagerMs: number;
768
+ commitMs: number;
769
+ domFlushMs?: number;
770
+ stdoutFlushMs?: number;
771
+ dirtyRows: number | null;
772
+ activePlanes: readonly string[] | null;
773
+ scannedNodes: number;
774
+ paintedNodes: number;
775
+ rowBucketFallbacks?: readonly FramePerfRowBucketFallback[];
776
+ coalescedInvalidates: number;
777
+ frameTaskCount: number;
778
+ coalescedFrameTasks: number;
779
+ frameTaskQueueDepthBeforeRun: number;
780
+ frameTaskQueueDepthAfterRun: number;
781
+ remainingFrameTasks: number;
782
+ droppedUpdates: number;
783
+ mailboxFailure?: FramePerfMailboxFailure;
784
+ queueDepth: number;
785
+ liveReasons?: readonly string[];
786
+ }>;
787
+ declare function framePerfNow(): number;
788
+
789
+ //#endregion
790
+ //#region src/observability/frame-perf-store.d.ts
791
+ type FramePerfStore = Readonly<{
792
+ enabled: Ref<boolean>;
793
+ acquire: (reason?: string) => () => void;
794
+ push: (sample: FramePerfSample) => void;
795
+ latest: () => FramePerfSample | null;
796
+ list: () => FramePerfSample[];
797
+ clear: () => void;
798
+ }>;
799
+ declare function createFramePerfStore(limit?: number, opts?: Readonly<{
800
+ enabled?: boolean;
801
+ }>): FramePerfStore;
802
+
720
803
  //#endregion
721
804
  //#region src/vue/render/render-manager.d.ts
722
805
  type RenderRect = Readonly<{
@@ -740,13 +823,22 @@ type RenderNode = Readonly<{
740
823
  rect: RenderRect | null;
741
824
  rectY0: number;
742
825
  rectY1: number;
826
+ /**
827
+ * dirtyRows are absolute terminal rows for this node's plane.
828
+ * Components must ignore rows outside their rect.
829
+ */
743
830
  paint: (dirtyRows?: readonly number[]) => void;
744
831
  }>;
745
832
  type RenderManager = Readonly<{
746
833
  rootStack: RenderStack;
747
834
  createStack: (parent: RenderStack, zIndex: number) => RenderStack;
748
835
  invalidatePlane: (plane: TerminalRenderPlane) => void;
749
- scrollPlane: (plane: TerminalRenderPlane, startY: number, endY: number, delta: number) => void;
836
+ /**
837
+ * Dangerous escape hatch: shifts whole terminal rows for the target plane, not a
838
+ * component-local region. Only call when the active renderer consumes terminal
839
+ * scrollOperations or when the caller repaints the whole affected viewport.
840
+ */
841
+ unsafeScrollPlaneRows: (plane: TerminalRenderPlane, startY: number, endY: number, delta: number) => void;
750
842
  register: (node: {
751
843
  stack: RenderStack;
752
844
  plane?: TerminalRenderPlane;
@@ -759,19 +851,40 @@ type RenderManager = Readonly<{
759
851
  plane: TerminalRenderPlane;
760
852
  zIndex: number;
761
853
  rect: RenderRect | null;
854
+ /**
855
+ * Consumed synchronously during update() and must not be retained.
856
+ * Callers may pass scratch arrays for hot-path invalidation.
857
+ * Rows are absolute terminal Y coordinates for the node's plane.
858
+ */
762
859
  dirtyRowsHint: readonly number[];
763
860
  paint: (dirtyRows?: readonly number[]) => void;
764
861
  }>) => void;
862
+ /**
863
+ * Hot-path dirty row marker for stable nodes. Consumed synchronously and does
864
+ * not replace the RenderNode object.
865
+ *
866
+ * rows are absolute terminal Y coordinates, not local component row offsets.
867
+ * For rect-bound nodes, rows outside the node rect are ignored.
868
+ */
869
+ markDirtyRows: (id: string, rows: readonly number[]) => boolean;
765
870
  unregister: (id: string) => void;
766
871
  render: (options?: {
767
872
  activePlanes?: TerminalRenderPlanes | null;
768
873
  }) => RenderStats | null;
769
874
  }>;
875
+ type RowBucketFallback = Readonly<{
876
+ plane: TerminalRenderPlane;
877
+ reason: "dirty-ratio" | "candidate-ratio";
878
+ dirtyRows: number;
879
+ planeNodes: number;
880
+ candidates?: number;
881
+ }>;
770
882
  type RenderStats = Readonly<{
771
883
  rows: number;
772
884
  scannedNodes: number;
773
885
  paintedNodes: number;
774
886
  candidatePlanes: readonly TerminalRenderPlane[];
887
+ rowBucketFallbacks?: readonly RowBucketFallback[];
775
888
  }>;
776
889
 
777
890
  //#endregion
@@ -781,15 +894,72 @@ interface LayoutContext {
781
894
  originY: number;
782
895
  clipRect: Rect | null;
783
896
  }
784
- type TerminalSchedulerPriority = 'high' | 'normal' | 'low';
897
+ type TerminalSchedulerPriority = "high" | "normal" | "low";
785
898
  type TerminalSchedulerInvalidateOptions = Readonly<{
786
899
  priority?: TerminalSchedulerPriority;
787
900
  plane?: TerminalRenderPlane;
901
+ reason?: FramePerfReason;
902
+ }>;
903
+ type TerminalFrameTaskPriority = "high" | "normal" | "low";
904
+ type TerminalFrameContext = Readonly<{
905
+ frameId: number;
906
+ startedAt: number;
907
+ now: () => number;
908
+ budgetMs: number;
909
+ remainingMs: () => number;
910
+ requestMore: () => void;
911
+ invalidate: (options?: TerminalSchedulerInvalidateOptions) => void;
912
+ /**
913
+ * Internal scheduler metric hook used by frame tasks/mailboxes to report
914
+ * dropped producer updates that were intentionally coalesced before paint.
915
+ *
916
+ * Compatibility note:
917
+ * TerminalFrameContext is an exported type, so additions here are public.
918
+ */
919
+ reportDroppedUpdates?: (count: number) => void;
920
+ reportMailboxDeliveryAttempt?: (attempt: {
921
+ id: string;
922
+ queued: number;
923
+ dropped: number;
924
+ }) => void;
925
+ }>;
926
+ type TerminalFrameTask = Readonly<{
927
+ id?: string;
928
+ reason?: FramePerfReason;
929
+ priority?: TerminalFrameTaskPriority;
930
+ sync?: boolean;
931
+ run: (ctx: TerminalFrameContext) => void;
932
+ }>;
933
+ type TerminalSchedulerConfig = Readonly<{
934
+ targetFps?: number;
935
+ maxFps?: number;
936
+ frameBudgetMs?: number;
788
937
  }>;
789
938
  type TerminalScheduler = Readonly<{
790
939
  invalidate: (options?: TerminalSchedulerInvalidateOptions) => void;
791
940
  flush: () => void;
941
+ /**
942
+ * Flushes render-manager work and requests a sync terminal commit immediately.
943
+ * DOM row updates may still defer to rAF when they exceed the renderer sync budget.
944
+ */
792
945
  flushNow: () => void;
946
+ configure: (options: TerminalSchedulerConfig) => void;
947
+ /**
948
+ * Queues a frame task for the next scheduler frame.
949
+ * false means the scheduler explicitly rejected the task; producers must clear
950
+ * local pending state. true or undefined means accepted so legacy schedulers
951
+ * that do not return a value remain valid.
952
+ */
953
+ queueFrameTask: (task: TerminalFrameTask) => boolean | void;
954
+ /**
955
+ * Best-effort cancellation for a pending id task.
956
+ * If the scheduler has already taken the task for the current frame,
957
+ * the task run() still needs to guard its own stale state.
958
+ */
959
+ cancelFrameTask?: (id: string) => boolean | void;
960
+ requestLive: (reason: string) => () => void;
961
+ dropLive: (reason: string) => void;
962
+ isInsideFrame: () => boolean;
793
963
  }>;
794
964
  type TerminalRuntimeHandle = Readonly<{
795
965
  update: (props: Record<string, unknown>) => void;
@@ -808,12 +978,14 @@ type ImeAnchor = Readonly<{
808
978
  }>;
809
979
  type TerminalContext = Readonly<{
810
980
  terminal: Terminal;
811
- renderer: Ref<DomRenderer | null>;
981
+ renderer: Ref<TerminalRendererLike | null>;
982
+ rendererCapabilities: Ref<RendererCapabilities>;
812
983
  events: Ref<EventManager | null>;
813
984
  scheduler: TerminalScheduler;
814
985
  runtime: TerminalRuntime;
815
986
  observability: Readonly<{
816
987
  trace: TraceStore;
988
+ framePerf: FramePerfStore;
817
989
  }>;
818
990
  defaultStyle: Ref<Style>;
819
991
  render: RenderManager;
@@ -846,7 +1018,7 @@ type PromptSuggestion = Readonly<{
846
1018
  detail?: string;
847
1019
  keywords?: readonly string[];
848
1020
  mentionValue?: string;
849
- mentionBehavior?: 'collect' | 'inline';
1021
+ mentionBehavior?: "collect" | "inline";
850
1022
  onSelect?: (info: Readonly<{
851
1023
  value: string;
852
1024
  query: string;
@@ -860,14 +1032,18 @@ type TInputPluginContext = Readonly<{
860
1032
  promptTrigger: string;
861
1033
  promptTriggers?: readonly string[];
862
1034
  promptMaxItems: number;
863
- promptAlign: 'input' | 'center';
1035
+ promptAlign: "input" | "center";
864
1036
  promptSelectedStyle?: Style;
1037
+ promptPopupStyle?: Style;
1038
+ promptPopupBorderStyle?: Style;
1039
+ promptPopupMatchStyle?: Style;
865
1040
  mentionTrigger: string;
866
1041
  mentionWorkspace: string;
867
1042
  mentionMode: PathPickMode;
868
1043
  mentionShowHidden: boolean;
869
1044
  mentionSuggestions: readonly PromptSuggestion[];
870
1045
  mentionMaxItems: number;
1046
+ mentionChipStyle?: Style;
871
1047
  collectMentions: boolean;
872
1048
  mentions: readonly string[];
873
1049
  skillTrigger?: string;
@@ -903,7 +1079,7 @@ type TInputPluginContext = Readonly<{
903
1079
  }>) => string) => void;
904
1080
  registerChipStyleProvider: (provider: Readonly<{
905
1081
  getStyle: (baseStyle: Style, chip: Readonly<{
906
- kind: 'multiline' | 'mention';
1082
+ kind: "multiline" | "mention";
907
1083
  absPath?: string;
908
1084
  }>) => Style | null | undefined;
909
1085
  version: Ref<number>;
@@ -925,11 +1101,7 @@ type TerminalApp = Readonly<{
925
1101
  app: App;
926
1102
  terminal: Terminal;
927
1103
  events: CliEventManager;
928
- scheduler: {
929
- invalidate: (options?: TerminalSchedulerInvalidateOptions) => void;
930
- flush: () => void;
931
- flushNow: () => void;
932
- };
1104
+ scheduler: TerminalScheduler;
933
1105
  defaultStyle: Ref<Style>;
934
1106
  /** Returns the current IME anchor position (cursor position in cell coordinates), or null if no input is focused */
935
1107
  getImeAnchor: () => ImeAnchor | null;
@@ -994,7 +1166,7 @@ declare function getCliLatencyProfiler(): CliLatencyProfiler | null;
994
1166
 
995
1167
  //#endregion
996
1168
  //#region src/renderer/cli/stdout-metrics.d.ts
997
- type StdoutRendererWriteMode = 'stream' | 'sync' | 'chunked';
1169
+ type StdoutRendererWriteMode = "stream" | "sync" | "chunked";
998
1170
  interface StdoutRendererMetrics {
999
1171
  lastFrameAt: number;
1000
1172
  lastFrameBytes: number;
@@ -1008,7 +1180,7 @@ declare function getStdoutRendererMetrics(): StdoutRendererMetrics;
1008
1180
 
1009
1181
  //#endregion
1010
1182
  //#region src/runtime/index.d.ts
1011
- type RuntimeEnv = 'browser' | 'terminal' | 'unknown';
1183
+ type RuntimeEnv = "browser" | "terminal" | "unknown";
1012
1184
  type TimerApi = Readonly<{
1013
1185
  setTimeout: typeof setTimeout;
1014
1186
  clearTimeout: typeof clearTimeout;
@@ -1064,7 +1236,7 @@ type PromptSuggestion$1 = Readonly<{
1064
1236
  detail?: string;
1065
1237
  keywords?: readonly string[];
1066
1238
  mentionValue?: string;
1067
- mentionBehavior?: 'collect' | 'inline';
1239
+ mentionBehavior?: "collect" | "inline";
1068
1240
  onSelect?: (info: Readonly<{
1069
1241
  value: string;
1070
1242
  query: string;
@@ -1165,7 +1337,7 @@ declare const TInputBox: any;
1165
1337
  //#endregion
1166
1338
  //#region src/vue/components/TJsonEditor.d.ts
1167
1339
  type JsonLintStatus = Readonly<{
1168
- state: 'idle' | 'success' | 'error';
1340
+ state: "idle" | "success" | "error";
1169
1341
  message?: string;
1170
1342
  line?: number;
1171
1343
  column?: number;
@@ -1219,6 +1391,10 @@ interface RenderNodeOptions {
1219
1391
  zIndex?: number;
1220
1392
  stack?: RenderStack;
1221
1393
  rect?: RenderRect | null;
1394
+ /**
1395
+ * One-shot absolute terminal rows for row-local content changes on this node's plane only.
1396
+ * Omit this when geometry, z-order, style, data identity, or paint semantics changed.
1397
+ */
1222
1398
  dirtyRowsHint?: readonly number[];
1223
1399
  priority?: TerminalSchedulerPriority;
1224
1400
  deps?: unknown;
@@ -1289,14 +1465,14 @@ type TerminalRouteLocationRaw = string | Readonly<{
1289
1465
  type NavigationGuardReturn = void | boolean | TerminalRouteLocationRaw;
1290
1466
  type NavigationGuard = (to: TerminalRoute, from: TerminalRoute | null) => NavigationGuardReturn | Promise<NavigationGuardReturn>;
1291
1467
  type TerminalRouter = Readonly<{
1292
- currentRoute: vue12.Ref<TerminalRoute>;
1468
+ currentRoute: vue15.Ref<TerminalRoute>;
1293
1469
  push: (to: TerminalRouteLocationRaw) => Promise<void>;
1294
1470
  replace: (to: TerminalRouteLocationRaw) => Promise<void>;
1295
1471
  back: () => Promise<void>;
1296
1472
  beforeEach: (guard: NavigationGuard) => () => void;
1297
1473
  beforeResolve: (guard: NavigationGuard) => () => void;
1298
1474
  afterEach: (guard: (to: TerminalRoute, from: TerminalRoute | null) => void) => () => void;
1299
- install: (app: vue13.App) => void;
1475
+ install: (app: vue16.App) => void;
1300
1476
  }>;
1301
1477
 
1302
1478
  //#endregion
@@ -1335,14 +1511,13 @@ interface WheelScrollState {
1335
1511
  lastAt: number;
1336
1512
  lastEdgeDir: number;
1337
1513
  lastEdgeAt: number;
1338
- lastLineUnitDir: number;
1339
1514
  }
1340
1515
  interface WheelScrollResult {
1341
1516
  nextTop: number;
1342
1517
  dir: -1 | 0 | 1;
1343
1518
  lines: number;
1344
1519
  }
1345
- type WheelDeltaMode = 'auto' | 'line' | 'pixel';
1520
+ type WheelDeltaMode = "auto" | "line" | "pixel";
1346
1521
  interface WheelScrollOptions {
1347
1522
  disableAcceleration?: boolean;
1348
1523
  }
@@ -1350,4 +1525,4 @@ declare function createWheelScrollState(): WheelScrollState;
1350
1525
  declare function applyWheelScroll(state: WheelScrollState, deltaY: number, scrollTop: number, maxTop: number, now?: number, deltaMode?: WheelDeltaMode, options?: WheelScrollOptions): WheelScrollResult;
1351
1526
 
1352
1527
  //#endregion
1353
- export { ANSI16_COLORS, ANSI256_COLORS, ANSI8_COLORS, AnsiColorName, BufferSnapshot, Cell, CellMetrics, CliEventManager, ClipboardApi, CreateTerminalAppOptions, DomRenderer, EventManager, FsDirEntry, FsEntryKind, FsStat, LayoutContext, MentionPathProvider, MentionSuggestionProvider, PathPickMode, PathPickerProvider, PathSuggestion, PromptMentionPluginOptions, PromptSuggestion, RafApi, Rect, Runtime, RuntimeEnv, SGR_RESET, StdinDriver, StdoutRenderer, StdoutRendererMetrics, Style, SuggestPathsResult, TAnchor, TBox, TDebugOverlay, TDialog, TERMINAL_RENDER_PLANES, TFlow, TInput, TInputBox, TInputHostAdapter, TInputPlugin, TInputPluginContext, TInputPluginsContextKey, TJsonEditor, TList, TMultilineModal, TPathPicker, TRenderLayer, TRenderPlane, TRouterView, TSelect, TText, TTransition, TView, Terminal, TerminalApp, TerminalBaseEvent, TerminalColorCapability, TerminalColorLevel, TerminalColorMode, TerminalCommitEvent, TerminalContext, TerminalDebugNode, TerminalEventHandlerMap, TerminalEventMap, TerminalEventRecord, TerminalEventType, TerminalInputEvent, TerminalKeyboardEvent, TerminalNode, TerminalPointerEvent, TerminalProvider, TerminalRenderPlane, TerminalRenderPlanes, TerminalResizeEvent, TerminalRoute, TerminalRouteLocationRaw, TerminalRouteRecord, TerminalRouter, TerminalRuntime, TerminalRuntimeHandle, TerminalScheduler, TerminalSchedulerInvalidateOptions, TerminalScrollOperation, TimerApi, TraceRecord, TraceStore, ansiColors, ansiStyles, applyWheelScroll, charCellWidth, clearTextCaches, createCliEventManager, createDefaultTInputHostAdapter, createDomRenderer, createEventManager, createNodeMentionPathProvider, createNodePathPickerProvider, createPromptMentionPlugin, createRuntime, createStdinDriver, createStdoutRenderer, createTInputHostPlugin, createTerminal, createTerminalApp, createTerminalRouter, createTextRestrictionPlugin, createTraceStore, createWheelScrollState, defaultTInputHostPlugin, detectTerminalColorCapability, formatInlineCellLine, getCliLatencyProfiler, getStdoutRendererMetrics, lintJsonText, normalizeNewlines, padEndByCells, parseAnsiSgr, readEventLog, resolveUserPath, rgbToAnsi256, sanitizeInlineText, sanitizeTextBlock, sliceByCells, sliceByCellsRange, spaces, suggestPaths, textCellWidth, truecolorBgOpen, truecolorFgOpen, useLayout, useRenderNode, useRoute, useRouter, useTerminal, useTerminalNode, useTerminalRuntime, useVisibility, wrapByCells, writeEventLog, writeSnapshot };
1528
+ export { ANSI16_COLORS, ANSI256_COLORS, ANSI8_COLORS, AnsiColorName, BufferSnapshot, Cell, CellMetrics, CliEventManager, ClipboardApi, CreateTerminalAppOptions, DOM_RENDERER_CAPABILITIES, DomRenderer, DomRendererDebugStats, DomRendererFlushSample, DomRendererFlushStats, DomRendererOptions, DomRendererRowKeyPrepassDebugStats, DomRendererRowKeyPrepassDecision, DomRendererRowKeyPrepassMode, DomRendererRowRenderDebugStats, DomRendererRowRenderStats, DomRendererSyncFlushDecision, DomRendererSyncFlushStats, EventManager, FramePerfReason, FramePerfRowBucketFallback, FramePerfSample, FramePerfStore, FsDirEntry, FsEntryKind, FsStat, HEADLESS_RENDERER_CAPABILITIES, LayoutContext, MentionPathProvider, MentionSuggestionProvider, PathPickMode, PathPickerProvider, PathSuggestion, PromptMentionPluginOptions, PromptSuggestion, RafApi, Rect, RendererCapabilities, Runtime, RuntimeEnv, SGR_RESET, StdinDriver, StdoutRenderer, StdoutRendererMetrics, Style, SuggestPathsResult, TAnchor, TBox, TDebugOverlay, TDialog, TERMINAL_RENDER_PLANES, TFlow, TInput, TInputBox, TInputHostAdapter, TInputPlugin, TInputPluginContext, TInputPluginsContextKey, TJsonEditor, TList, TMultilineModal, TPathPicker, TRenderLayer, TRenderPlane, TRouterView, TSelect, TText, TTransition, TView, Terminal, TerminalApp, TerminalBaseEvent, TerminalColorCapability, TerminalColorLevel, TerminalColorMode, TerminalCommitEvent, TerminalContext, TerminalDebugNode, TerminalEventHandlerMap, TerminalEventMap, TerminalEventRecord, TerminalEventType, TerminalFrameContext, TerminalFrameTask, TerminalFrameTaskPriority, TerminalInputEvent, TerminalKeyboardEvent, TerminalNode, TerminalPointerEvent, TerminalProvider, TerminalRenderPlane, TerminalRenderPlanes, TerminalRendererLike, TerminalResizeEvent, TerminalRoute, TerminalRouteLocationRaw, TerminalRouteRecord, TerminalRouter, TerminalRuntime, TerminalRuntimeHandle, TerminalScheduler, TerminalSchedulerConfig, TerminalSchedulerInvalidateOptions, TerminalScrollOperation, ThemeModeId, ThemePalette, TimerApi, TraceRecord, TraceStore, TuiMarkdownTheme, TuiMarkdownThemeOverrides, ansiColors, ansiStyles, applyWheelScroll, charCellWidth, clearTextCaches, createCliEventManager, createDefaultTInputHostAdapter, createDomRenderer, createEventManager, createFramePerfStore, createNodeMentionPathProvider, createNodePathPickerProvider, createPromptMentionPlugin, createRuntime, createStdinDriver, createStdoutRenderer, createTInputHostPlugin, createTerminal, createTerminalApp, createTerminalRouter, createTextRestrictionPlugin, createTraceStore, createWheelScrollState, defaultTInputHostPlugin, detectTerminalColorCapability, formatInlineCellLine, framePerfNow, getCliLatencyProfiler, getStdoutRendererMetrics, lintJsonText, normalizeNewlines, padEndByCells, parseAnsiSgr, readEventLog, resolveUserPath, rgbToAnsi256, sanitizeInlineText, sanitizeTextBlock, sliceByCells, sliceByCellsRange, spaces, suggestPaths, textCellWidth, truecolorBgOpen, truecolorFgOpen, useLayout, useRenderNode, useRoute, useRouter, useTerminal, useTerminalNode, useTerminalRuntime, useVisibility, wrapByCells, writeEventLog, writeSnapshot };