@simon_he/vue-tui 0.0.6 → 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 { 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";
1
3
  import * as vue15 from "vue";
2
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,6 +264,7 @@ type TerminalEventRecord = Readonly<{
353
264
  //#endregion
354
265
  //#region src/cli/input.d.ts
355
266
  type Stdin = NodeJS.ReadStream;
267
+ type KeyboardProtocol = "auto" | "kitty" | "xterm" | "off";
356
268
  type StdinDriver = Readonly<{
357
269
  dispose: () => void;
358
270
  }>;
@@ -360,7 +272,9 @@ declare function createStdinDriver(options: Readonly<{
360
272
  dispatch: (event: TerminalEventRecord) => boolean | void;
361
273
  stdin?: Stdin;
362
274
  stdout?: NodeJS.WriteStream;
275
+ env?: Readonly<Record<string, unknown>>;
363
276
  enableMouse?: boolean;
277
+ keyboardProtocol?: KeyboardProtocol;
364
278
  /**
365
279
  * Enable "any-motion" mouse tracking (xterm DECSET ?1003).
366
280
  * This is required for hover interactions in the CLI, but can increase event volume.
@@ -372,9 +286,9 @@ declare function createStdinDriver(options: Readonly<{
372
286
 
373
287
  //#endregion
374
288
  //#region src/cli/path-suggest-core.d.ts
375
- type PathPickMode = 'directory' | 'file' | 'any';
289
+ type PathPickMode = "directory" | "file" | "any";
376
290
  type PathSuggestion = Readonly<{
377
- kind: 'directory' | 'file';
291
+ kind: "directory" | "file";
378
292
  display: string;
379
293
  completion: string;
380
294
  absPath: string;
@@ -388,7 +302,7 @@ type SuggestPathsResult = Readonly<{
388
302
 
389
303
  //#endregion
390
304
  //#region src/cli/path-provider.d.ts
391
- type FsEntryKind = 'file' | 'directory' | 'other';
305
+ type FsEntryKind = "file" | "directory" | "other";
392
306
  type FsDirEntry = Readonly<{
393
307
  name: string;
394
308
  kind: FsEntryKind;
@@ -407,7 +321,7 @@ type PathPickerProvider = Readonly<{
407
321
  max: number;
408
322
  showHidden?: boolean;
409
323
  maxDepth?: number;
410
- gitignore?: 'blocking' | 'nonBlocking';
324
+ gitignore?: "blocking" | "nonBlocking";
411
325
  }>) => Promise<SuggestPathsResult>;
412
326
  resolvePath?: (workspaceAbs: string, input: string) => string | Promise<string>;
413
327
  }>;
@@ -423,7 +337,7 @@ declare function suggestPaths(options: Readonly<{
423
337
  showHidden?: boolean;
424
338
  listDir: (absDir: string) => Promise<FsDirEntry[]>;
425
339
  maxDepth?: number;
426
- gitignore?: 'blocking' | 'nonBlocking';
340
+ gitignore?: "blocking" | "nonBlocking";
427
341
  }>): Promise<SuggestPathsResult>;
428
342
  declare function resolveUserPath(workspaceAbs: string, input: string): string;
429
343
 
@@ -455,6 +369,10 @@ declare function detectTerminalColorCapability(opts?: Readonly<{
455
369
  platform?: string;
456
370
  }>): TerminalColorCapability;
457
371
 
372
+ //#endregion
373
+ //#region src/core/ansi-palette.d.ts
374
+ type ThemePalette = Partial<Record<AnsiColorName, string>>;
375
+
458
376
  //#endregion
459
377
  //#region src/core/ansi/sgr.d.ts
460
378
  interface AnsiSegment {
@@ -474,19 +392,132 @@ declare function createTerminal(opts: {
474
392
  rows: number;
475
393
  }): Terminal;
476
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
+
477
410
  //#endregion
478
411
  //#region src/renderer/dom/dom-renderer.d.ts
479
412
  type CellMetrics = Readonly<{
480
413
  cellWidth: number;
481
414
  cellHeight: number;
482
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
+ }>;
483
480
  interface DomRenderer {
484
481
  readonly container: HTMLElement;
482
+ readonly capabilities: RendererCapabilities;
483
+ readonly debugStats: DomRendererDebugStats;
485
484
  readonly metrics: CellMetrics;
486
485
  dispose: () => void;
487
486
  refresh: () => void;
487
+ updateTheme: (next: Readonly<{
488
+ palette?: ThemePalette | null;
489
+ }>) => void;
490
+ setPlaneOffset: (plane: TerminalRenderPlane, offsetPx: number) => void;
491
+ setPlaneViewport: (plane: TerminalRenderPlane, viewport: Readonly<{
492
+ topPx: number;
493
+ heightPx: number;
494
+ }> | null) => void;
488
495
  }
489
- 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;
490
521
 
491
522
  //#endregion
492
523
  //#region src/events/manager/types.d.ts
@@ -496,7 +527,7 @@ type Rect = Readonly<{
496
527
  w: number;
497
528
  h: number;
498
529
  }>;
499
- 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";
500
531
  interface TerminalBaseEvent {
501
532
  type: TerminalEventType;
502
533
  target: TerminalNode | null;
@@ -523,6 +554,7 @@ type TerminalPointerEvent = TerminalBaseEvent & {
523
554
  altKey?: boolean;
524
555
  metaKey?: boolean;
525
556
  deltaY?: number;
557
+ deltaMode?: number;
526
558
  };
527
559
  type TerminalKeyboardEvent = TerminalBaseEvent & {
528
560
  key: string;
@@ -600,10 +632,10 @@ type TerminalDebugNode = Readonly<{
600
632
  //#endregion
601
633
  //#region src/events/manager/cli-event-manager.d.ts
602
634
  interface CliEventManager {
603
- register: (node: Omit<TerminalNode, 'id'> & {
635
+ register: (node: Omit<TerminalNode, "id"> & {
604
636
  id?: string;
605
637
  }) => TerminalNode;
606
- update: (id: string, next: Partial<Omit<TerminalNode, 'id'>>) => void;
638
+ update: (id: string, next: Partial<Omit<TerminalNode, "id">>) => void;
607
639
  unregister: (id: string) => void;
608
640
  setMetrics: (next: CellMetrics) => void;
609
641
  focus: (id: string | null) => void;
@@ -620,10 +652,10 @@ declare function createCliEventManager(options?: Readonly<{
620
652
  //#endregion
621
653
  //#region src/events/manager/event-manager.d.ts
622
654
  interface EventManager {
623
- register: (node: Omit<TerminalNode, 'id'> & {
655
+ register: (node: Omit<TerminalNode, "id"> & {
624
656
  id?: string;
625
657
  }) => TerminalNode;
626
- update: (id: string, next: Partial<Omit<TerminalNode, 'id'>>) => void;
658
+ update: (id: string, next: Partial<Omit<TerminalNode, "id">>) => void;
627
659
  unregister: (id: string) => void;
628
660
  setMetrics: (next: CellMetrics) => void;
629
661
  focus: (id: string | null) => void;
@@ -638,36 +670,6 @@ declare function createEventManager(container: HTMLElement, metrics: CellMetrics
638
670
  onFocusChange?: (prev: string | null, next: string | null) => void;
639
671
  }>): EventManager;
640
672
 
641
- //#endregion
642
- //#region src/observability/trace.d.ts
643
- type TraceRecord = Readonly<{
644
- type: 'event';
645
- at: number;
646
- event: TerminalEventRecord;
647
- }> | Readonly<{
648
- type: 'focus';
649
- at: number;
650
- prev: string | null;
651
- next: string | null;
652
- }> | Readonly<{
653
- type: 'commit';
654
- at: number;
655
- dirtyRows: readonly number[] | null;
656
- planes: TerminalRenderPlanes | null;
657
- focusedId: string | null;
658
- }>;
659
- type TraceStore = Readonly<{
660
- enabled: Ref<boolean>;
661
- records: TraceRecord[];
662
- push: (record: TraceRecord) => void;
663
- clear: () => void;
664
- snapshot: () => TraceRecord[];
665
- }>;
666
- declare function createTraceStore(opts?: Readonly<{
667
- enabled?: boolean;
668
- max?: number;
669
- }>): TraceStore;
670
-
671
673
  //#endregion
672
674
  //#region src/renderer/cli/stdout-renderer.d.ts
673
675
  type CliOutput = Readonly<{
@@ -681,21 +683,22 @@ type StdoutRenderer = Readonly<{
681
683
  setCursor: (x: number, y: number) => void;
682
684
  /** Show or hide the terminal cursor */
683
685
  showCursor: (visible: boolean) => void;
684
- /** Update palette/default background without recreating the renderer. */
686
+ /** Update default background without recreating the renderer. */
685
687
  updateTheme?: (next: Readonly<{
686
- defaultBg?: AnsiColorName;
687
- palette?: Partial<Record<AnsiColorName, string>>;
688
+ defaultBg?: string | null;
689
+ palette?: ThemePalette | null;
688
690
  }>) => void;
689
691
  }>;
690
- type StdoutColorMode = 'auto' | 'truecolor' | 'ansi256' | 'ansi16' | 'ansi8';
692
+ type StdoutColorMode = "auto" | "truecolor" | "ansi256" | "ansi16" | "ansi8";
691
693
  declare function createStdoutRenderer(terminal: Terminal, options?: Readonly<{
692
694
  output?: CliOutput;
693
695
  clear?: boolean;
694
696
  hideCursor?: boolean;
695
697
  altScreen?: boolean;
696
- /** Fallback background color when a cell has no explicit bg. */
697
- defaultBg?: AnsiColorName;
698
- 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;
699
702
  /** Track TTY resize events (process.stdout 'resize') and call terminal.resize(). */
700
703
  trackResize?: boolean;
701
704
  /** Color mode for ANSI output (auto detects truecolor via env). */
@@ -709,6 +712,94 @@ declare function createStdoutRenderer(terminal: Terminal, options?: Readonly<{
709
712
  useSyncOutput?: boolean;
710
713
  }>): StdoutRenderer;
711
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
+
712
803
  //#endregion
713
804
  //#region src/vue/render/render-manager.d.ts
714
805
  type RenderRect = Readonly<{
@@ -732,13 +823,22 @@ type RenderNode = Readonly<{
732
823
  rect: RenderRect | null;
733
824
  rectY0: number;
734
825
  rectY1: number;
826
+ /**
827
+ * dirtyRows are absolute terminal rows for this node's plane.
828
+ * Components must ignore rows outside their rect.
829
+ */
735
830
  paint: (dirtyRows?: readonly number[]) => void;
736
831
  }>;
737
832
  type RenderManager = Readonly<{
738
833
  rootStack: RenderStack;
739
834
  createStack: (parent: RenderStack, zIndex: number) => RenderStack;
740
835
  invalidatePlane: (plane: TerminalRenderPlane) => void;
741
- 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;
742
842
  register: (node: {
743
843
  stack: RenderStack;
744
844
  plane?: TerminalRenderPlane;
@@ -751,19 +851,40 @@ type RenderManager = Readonly<{
751
851
  plane: TerminalRenderPlane;
752
852
  zIndex: number;
753
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
+ */
754
859
  dirtyRowsHint: readonly number[];
755
860
  paint: (dirtyRows?: readonly number[]) => void;
756
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;
757
870
  unregister: (id: string) => void;
758
871
  render: (options?: {
759
872
  activePlanes?: TerminalRenderPlanes | null;
760
873
  }) => RenderStats | null;
761
874
  }>;
875
+ type RowBucketFallback = Readonly<{
876
+ plane: TerminalRenderPlane;
877
+ reason: "dirty-ratio" | "candidate-ratio";
878
+ dirtyRows: number;
879
+ planeNodes: number;
880
+ candidates?: number;
881
+ }>;
762
882
  type RenderStats = Readonly<{
763
883
  rows: number;
764
884
  scannedNodes: number;
765
885
  paintedNodes: number;
766
886
  candidatePlanes: readonly TerminalRenderPlane[];
887
+ rowBucketFallbacks?: readonly RowBucketFallback[];
767
888
  }>;
768
889
 
769
890
  //#endregion
@@ -773,15 +894,72 @@ interface LayoutContext {
773
894
  originY: number;
774
895
  clipRect: Rect | null;
775
896
  }
776
- type TerminalSchedulerPriority = 'high' | 'normal' | 'low';
897
+ type TerminalSchedulerPriority = "high" | "normal" | "low";
777
898
  type TerminalSchedulerInvalidateOptions = Readonly<{
778
899
  priority?: TerminalSchedulerPriority;
779
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;
780
937
  }>;
781
938
  type TerminalScheduler = Readonly<{
782
939
  invalidate: (options?: TerminalSchedulerInvalidateOptions) => void;
783
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
+ */
784
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;
785
963
  }>;
786
964
  type TerminalRuntimeHandle = Readonly<{
787
965
  update: (props: Record<string, unknown>) => void;
@@ -800,12 +978,14 @@ type ImeAnchor = Readonly<{
800
978
  }>;
801
979
  type TerminalContext = Readonly<{
802
980
  terminal: Terminal;
803
- renderer: Ref<DomRenderer | null>;
981
+ renderer: Ref<TerminalRendererLike | null>;
982
+ rendererCapabilities: Ref<RendererCapabilities>;
804
983
  events: Ref<EventManager | null>;
805
984
  scheduler: TerminalScheduler;
806
985
  runtime: TerminalRuntime;
807
986
  observability: Readonly<{
808
987
  trace: TraceStore;
988
+ framePerf: FramePerfStore;
809
989
  }>;
810
990
  defaultStyle: Ref<Style>;
811
991
  render: RenderManager;
@@ -838,7 +1018,7 @@ type PromptSuggestion = Readonly<{
838
1018
  detail?: string;
839
1019
  keywords?: readonly string[];
840
1020
  mentionValue?: string;
841
- mentionBehavior?: 'collect' | 'inline';
1021
+ mentionBehavior?: "collect" | "inline";
842
1022
  onSelect?: (info: Readonly<{
843
1023
  value: string;
844
1024
  query: string;
@@ -852,14 +1032,18 @@ type TInputPluginContext = Readonly<{
852
1032
  promptTrigger: string;
853
1033
  promptTriggers?: readonly string[];
854
1034
  promptMaxItems: number;
855
- promptAlign: 'input' | 'center';
1035
+ promptAlign: "input" | "center";
856
1036
  promptSelectedStyle?: Style;
1037
+ promptPopupStyle?: Style;
1038
+ promptPopupBorderStyle?: Style;
1039
+ promptPopupMatchStyle?: Style;
857
1040
  mentionTrigger: string;
858
1041
  mentionWorkspace: string;
859
1042
  mentionMode: PathPickMode;
860
1043
  mentionShowHidden: boolean;
861
1044
  mentionSuggestions: readonly PromptSuggestion[];
862
1045
  mentionMaxItems: number;
1046
+ mentionChipStyle?: Style;
863
1047
  collectMentions: boolean;
864
1048
  mentions: readonly string[];
865
1049
  skillTrigger?: string;
@@ -895,7 +1079,7 @@ type TInputPluginContext = Readonly<{
895
1079
  }>) => string) => void;
896
1080
  registerChipStyleProvider: (provider: Readonly<{
897
1081
  getStyle: (baseStyle: Style, chip: Readonly<{
898
- kind: 'multiline' | 'mention';
1082
+ kind: "multiline" | "mention";
899
1083
  absPath?: string;
900
1084
  }>) => Style | null | undefined;
901
1085
  version: Ref<number>;
@@ -917,11 +1101,7 @@ type TerminalApp = Readonly<{
917
1101
  app: App;
918
1102
  terminal: Terminal;
919
1103
  events: CliEventManager;
920
- scheduler: {
921
- invalidate: (options?: TerminalSchedulerInvalidateOptions) => void;
922
- flush: () => void;
923
- flushNow: () => void;
924
- };
1104
+ scheduler: TerminalScheduler;
925
1105
  defaultStyle: Ref<Style>;
926
1106
  /** Returns the current IME anchor position (cursor position in cell coordinates), or null if no input is focused */
927
1107
  getImeAnchor: () => ImeAnchor | null;
@@ -939,9 +1119,54 @@ type CreateTerminalAppOptions = Readonly<{
939
1119
  }>;
940
1120
  declare function createTerminalApp(options: CreateTerminalAppOptions): TerminalApp;
941
1121
 
1122
+ //#endregion
1123
+ //#region src/observability/cli-latency.d.ts
1124
+ type StageEvent = Readonly<Record<string, unknown>> & {
1125
+ type?: unknown;
1126
+ key?: unknown;
1127
+ code?: unknown;
1128
+ };
1129
+ type CliLatencyProfiler = Readonly<{
1130
+ enabled: true;
1131
+ recordRawInput: (info?: Readonly<{
1132
+ bytes?: number;
1133
+ }>) => void;
1134
+ recordStdinDispatch: (event: StageEvent, info?: Readonly<{
1135
+ parser?: string | null;
1136
+ }>) => void;
1137
+ recordEventDispatchStart: (event: StageEvent) => void;
1138
+ recordEventDispatchEnd: (event: StageEvent, info: Readonly<{
1139
+ defaultPrevented: boolean;
1140
+ }>) => void;
1141
+ recordSchedulerInvalidate: (info?: Readonly<{
1142
+ priority?: string | null;
1143
+ plane?: string | null;
1144
+ }>) => void;
1145
+ recordFlushStart: (info?: Readonly<{
1146
+ sync?: boolean;
1147
+ activePlanes?: readonly string[] | null;
1148
+ }>) => void;
1149
+ recordFlushEnd: () => void;
1150
+ recordCommit: (info?: Readonly<{
1151
+ sync?: boolean;
1152
+ dirtyRows?: readonly number[] | null;
1153
+ planes?: readonly string[] | null;
1154
+ }>) => void;
1155
+ recordStdoutQueued: (delayMs: number) => void;
1156
+ recordStdoutRenderStart: () => void;
1157
+ recordStdoutNoOutput: () => void;
1158
+ recordStdoutWrite: (info: Readonly<{
1159
+ durationMs: number;
1160
+ bytes: number;
1161
+ mode: string;
1162
+ }>) => void;
1163
+ markOperation: (operation: string) => void;
1164
+ }>;
1165
+ declare function getCliLatencyProfiler(): CliLatencyProfiler | null;
1166
+
942
1167
  //#endregion
943
1168
  //#region src/renderer/cli/stdout-metrics.d.ts
944
- type StdoutRendererWriteMode = 'stream' | 'sync' | 'chunked';
1169
+ type StdoutRendererWriteMode = "stream" | "sync" | "chunked";
945
1170
  interface StdoutRendererMetrics {
946
1171
  lastFrameAt: number;
947
1172
  lastFrameBytes: number;
@@ -955,7 +1180,7 @@ declare function getStdoutRendererMetrics(): StdoutRendererMetrics;
955
1180
 
956
1181
  //#endregion
957
1182
  //#region src/runtime/index.d.ts
958
- type RuntimeEnv = 'browser' | 'terminal' | 'unknown';
1183
+ type RuntimeEnv = "browser" | "terminal" | "unknown";
959
1184
  type TimerApi = Readonly<{
960
1185
  setTimeout: typeof setTimeout;
961
1186
  clearTimeout: typeof clearTimeout;
@@ -1011,7 +1236,7 @@ type PromptSuggestion$1 = Readonly<{
1011
1236
  detail?: string;
1012
1237
  keywords?: readonly string[];
1013
1238
  mentionValue?: string;
1014
- mentionBehavior?: 'collect' | 'inline';
1239
+ mentionBehavior?: "collect" | "inline";
1015
1240
  onSelect?: (info: Readonly<{
1016
1241
  value: string;
1017
1242
  query: string;
@@ -1112,7 +1337,7 @@ declare const TInputBox: any;
1112
1337
  //#endregion
1113
1338
  //#region src/vue/components/TJsonEditor.d.ts
1114
1339
  type JsonLintStatus = Readonly<{
1115
- state: 'idle' | 'success' | 'error';
1340
+ state: "idle" | "success" | "error";
1116
1341
  message?: string;
1117
1342
  line?: number;
1118
1343
  column?: number;
@@ -1166,6 +1391,10 @@ interface RenderNodeOptions {
1166
1391
  zIndex?: number;
1167
1392
  stack?: RenderStack;
1168
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
+ */
1169
1398
  dirtyRowsHint?: readonly number[];
1170
1399
  priority?: TerminalSchedulerPriority;
1171
1400
  deps?: unknown;
@@ -1288,9 +1517,12 @@ interface WheelScrollResult {
1288
1517
  dir: -1 | 0 | 1;
1289
1518
  lines: number;
1290
1519
  }
1291
- type WheelDeltaMode = 'auto' | 'line' | 'pixel';
1520
+ type WheelDeltaMode = "auto" | "line" | "pixel";
1521
+ interface WheelScrollOptions {
1522
+ disableAcceleration?: boolean;
1523
+ }
1292
1524
  declare function createWheelScrollState(): WheelScrollState;
1293
- declare function applyWheelScroll(state: WheelScrollState, deltaY: number, scrollTop: number, maxTop: number, now?: number, deltaMode?: WheelDeltaMode): WheelScrollResult;
1525
+ declare function applyWheelScroll(state: WheelScrollState, deltaY: number, scrollTop: number, maxTop: number, now?: number, deltaMode?: WheelDeltaMode, options?: WheelScrollOptions): WheelScrollResult;
1294
1526
 
1295
1527
  //#endregion
1296
- 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, 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 };