@profullstack/hqtui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +144 -0
  2. package/dist/ansi.d.ts +42 -0
  3. package/dist/ansi.d.ts.map +1 -0
  4. package/dist/ansi.js +66 -0
  5. package/dist/ansi.js.map +1 -0
  6. package/dist/app.d.ts +128 -0
  7. package/dist/app.d.ts.map +1 -0
  8. package/dist/app.js +296 -0
  9. package/dist/app.js.map +1 -0
  10. package/dist/buffer.d.ts +50 -0
  11. package/dist/buffer.d.ts.map +1 -0
  12. package/dist/buffer.js +184 -0
  13. package/dist/buffer.js.map +1 -0
  14. package/dist/capabilities.d.ts +36 -0
  15. package/dist/capabilities.d.ts.map +1 -0
  16. package/dist/capabilities.js +93 -0
  17. package/dist/capabilities.js.map +1 -0
  18. package/dist/color.d.ts +47 -0
  19. package/dist/color.d.ts.map +1 -0
  20. package/dist/color.js +176 -0
  21. package/dist/color.js.map +1 -0
  22. package/dist/diff.d.ts +39 -0
  23. package/dist/diff.d.ts.map +1 -0
  24. package/dist/diff.js +203 -0
  25. package/dist/diff.js.map +1 -0
  26. package/dist/graphics/blocks.d.ts +26 -0
  27. package/dist/graphics/blocks.d.ts.map +1 -0
  28. package/dist/graphics/blocks.js +49 -0
  29. package/dist/graphics/blocks.js.map +1 -0
  30. package/dist/graphics/braille.d.ts +33 -0
  31. package/dist/graphics/braille.d.ts.map +1 -0
  32. package/dist/graphics/braille.js +166 -0
  33. package/dist/graphics/braille.js.map +1 -0
  34. package/dist/graphics/index.d.ts +4 -0
  35. package/dist/graphics/index.d.ts.map +1 -0
  36. package/dist/graphics/index.js +4 -0
  37. package/dist/graphics/index.js.map +1 -0
  38. package/dist/graphics/plot.d.ts +91 -0
  39. package/dist/graphics/plot.d.ts.map +1 -0
  40. package/dist/graphics/plot.js +291 -0
  41. package/dist/graphics/plot.js.map +1 -0
  42. package/dist/index.d.ts +34 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +42 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/input.d.ts +62 -0
  47. package/dist/input.d.ts.map +1 -0
  48. package/dist/input.js +245 -0
  49. package/dist/input.js.map +1 -0
  50. package/dist/layout.d.ts +51 -0
  51. package/dist/layout.d.ts.map +1 -0
  52. package/dist/layout.js +163 -0
  53. package/dist/layout.js.map +1 -0
  54. package/dist/surface.d.ts +81 -0
  55. package/dist/surface.d.ts.map +1 -0
  56. package/dist/surface.js +181 -0
  57. package/dist/surface.js.map +1 -0
  58. package/dist/terminal.d.ts +63 -0
  59. package/dist/terminal.d.ts.map +1 -0
  60. package/dist/terminal.js +189 -0
  61. package/dist/terminal.js.map +1 -0
  62. package/dist/testing.d.ts +71 -0
  63. package/dist/testing.d.ts.map +1 -0
  64. package/dist/testing.js +171 -0
  65. package/dist/testing.js.map +1 -0
  66. package/dist/theme.d.ts +58 -0
  67. package/dist/theme.d.ts.map +1 -0
  68. package/dist/theme.js +238 -0
  69. package/dist/theme.js.map +1 -0
  70. package/dist/ui.d.ts +194 -0
  71. package/dist/ui.d.ts.map +1 -0
  72. package/dist/ui.js +439 -0
  73. package/dist/ui.js.map +1 -0
  74. package/dist/unicode.d.ts +36 -0
  75. package/dist/unicode.d.ts.map +1 -0
  76. package/dist/unicode.js +221 -0
  77. package/dist/unicode.js.map +1 -0
  78. package/dist/widgets/controls.d.ts +95 -0
  79. package/dist/widgets/controls.d.ts.map +1 -0
  80. package/dist/widgets/controls.js +231 -0
  81. package/dist/widgets/controls.js.map +1 -0
  82. package/dist/widgets/index.d.ts +5 -0
  83. package/dist/widgets/index.d.ts.map +1 -0
  84. package/dist/widgets/index.js +5 -0
  85. package/dist/widgets/index.js.map +1 -0
  86. package/dist/widgets/meters.d.ts +100 -0
  87. package/dist/widgets/meters.d.ts.map +1 -0
  88. package/dist/widgets/meters.js +209 -0
  89. package/dist/widgets/meters.js.map +1 -0
  90. package/dist/widgets/table.d.ts +92 -0
  91. package/dist/widgets/table.d.ts.map +1 -0
  92. package/dist/widgets/table.js +228 -0
  93. package/dist/widgets/table.js.map +1 -0
  94. package/dist/widgets/text.d.ts +64 -0
  95. package/dist/widgets/text.d.ts.map +1 -0
  96. package/dist/widgets/text.js +123 -0
  97. package/dist/widgets/text.js.map +1 -0
  98. package/package.json +56 -0
package/dist/app.js ADDED
@@ -0,0 +1,296 @@
1
+ import { FrameBuffer } from "./buffer.js";
2
+ import { Encoder } from "./diff.js";
3
+ import { ansi } from "./ansi.js";
4
+ import { Terminal, emergencyRestore } from "./terminal.js";
5
+ import { resolveTheme, themes } from "./theme.js";
6
+ import { Surface, createSurface } from "./surface.js";
7
+ import { Container } from "./ui.js";
8
+ import { matchKey } from "./input.js";
9
+ /**
10
+ * The application: owns the terminal, both framebuffers, the scheduler and the
11
+ * event loop. Everything else in the library is reachable from here.
12
+ */
13
+ export class App {
14
+ terminal;
15
+ capabilities;
16
+ theme;
17
+ current;
18
+ previous;
19
+ encoder;
20
+ renderFn = () => { };
21
+ options;
22
+ listeners = new Map();
23
+ running = false;
24
+ dirty = true;
25
+ forceRepaint = true;
26
+ timer = null;
27
+ startedAt = 0;
28
+ frameCount = 0;
29
+ lastFrameAt = 0;
30
+ exitResolve = null;
31
+ focusIndex = 0;
32
+ focusCount = 0;
33
+ focusActions = [];
34
+ hits = [];
35
+ overlays = [];
36
+ lastStats = { frame: 0, renderMs: 0, changedCells: 0, dirtyRows: 0, bytes: 0, fps: 0 };
37
+ constructor(options = {}) {
38
+ this.options = options;
39
+ this.terminal = new Terminal(options);
40
+ this.capabilities = this.terminal.capabilities;
41
+ this.theme = resolveTheme(options.theme);
42
+ const { columns, rows } = this.terminal.size();
43
+ this.current = new FrameBuffer(columns, rows);
44
+ this.previous = new FrameBuffer(columns, rows);
45
+ this.encoder = new Encoder({
46
+ colors: this.capabilities.colors,
47
+ monochrome: options.monochrome ?? this.capabilities.colors === "none",
48
+ });
49
+ }
50
+ get width() {
51
+ return this.current.width;
52
+ }
53
+ get height() {
54
+ return this.current.height;
55
+ }
56
+ /** Stats for the most recent frame. */
57
+ get stats() {
58
+ return this.lastStats;
59
+ }
60
+ /** Register the view. Called on every frame; keep it pure and cheap. */
61
+ render(fn) {
62
+ this.renderFn = fn;
63
+ this.dirty = true;
64
+ return this;
65
+ }
66
+ /** Ask for a redraw. The scheduler coalesces repeated calls into one frame. */
67
+ invalidate() {
68
+ this.dirty = true;
69
+ }
70
+ /** Force a full repaint, e.g. after another process wrote to the terminal. */
71
+ redraw() {
72
+ this.forceRepaint = true;
73
+ this.dirty = true;
74
+ }
75
+ setTheme(theme) {
76
+ this.theme = resolveTheme(theme);
77
+ this.redraw();
78
+ return this;
79
+ }
80
+ on(event, listener) {
81
+ let set = this.listeners.get(event);
82
+ if (!set) {
83
+ set = new Set();
84
+ this.listeners.set(event, set);
85
+ }
86
+ set.add(listener);
87
+ return () => set.delete(listener);
88
+ }
89
+ emit(event, value) {
90
+ const set = this.listeners.get(event);
91
+ if (!set)
92
+ return;
93
+ for (const listener of set)
94
+ listener(value);
95
+ }
96
+ /** Move keyboard focus. Wraps around. */
97
+ focusNext(delta = 1) {
98
+ if (this.focusCount === 0)
99
+ return;
100
+ this.focusIndex = (this.focusIndex + delta + this.focusCount) % this.focusCount;
101
+ this.dirty = true;
102
+ }
103
+ /** Activate the focused control, as Enter does. */
104
+ activateFocused() {
105
+ this.focusActions[this.focusIndex]?.();
106
+ this.dirty = true;
107
+ }
108
+ /** Start the loop. Resolves when the app exits. */
109
+ async start() {
110
+ if (this.running)
111
+ return;
112
+ this.running = true;
113
+ this.startedAt = Date.now();
114
+ this.terminal.enter();
115
+ this.terminal.onInput((event) => this.handleInput(event));
116
+ this.terminal.onResizeEvent(({ columns, rows }) => {
117
+ this.current.resize(columns, rows);
118
+ this.previous.resize(columns, rows);
119
+ this.forceRepaint = true;
120
+ this.dirty = true;
121
+ this.emit("resize", { width: columns, height: rows });
122
+ this.frame();
123
+ });
124
+ const fps = this.targetFps();
125
+ const interval = Math.max(8, Math.floor(1000 / fps));
126
+ this.frame();
127
+ this.timer = setInterval(() => {
128
+ if (this.options.alwaysRender || this.dirty)
129
+ this.frame();
130
+ }, interval);
131
+ this.timer.unref?.();
132
+ await new Promise((resolve) => {
133
+ this.exitResolve = resolve;
134
+ });
135
+ }
136
+ targetFps() {
137
+ const base = this.options.fps ?? 30;
138
+ if (this.capabilities.ssh)
139
+ return Math.min(base, this.options.remoteFps ?? 15);
140
+ return base;
141
+ }
142
+ /** Stop the loop and restore the terminal. */
143
+ stop() {
144
+ if (!this.running)
145
+ return;
146
+ this.running = false;
147
+ if (this.timer)
148
+ clearInterval(this.timer);
149
+ this.timer = null;
150
+ this.terminal.restore();
151
+ this.emit("exit", undefined);
152
+ this.exitResolve?.();
153
+ this.exitResolve = null;
154
+ }
155
+ /** Alias for `stop()`, matching what users type in their key handlers. */
156
+ quit() {
157
+ this.stop();
158
+ }
159
+ handleInput(event) {
160
+ if (event.type === "key") {
161
+ const quitKeys = this.options.quitKeys ?? ["ctrl+c", "q"];
162
+ if (quitKeys.some((k) => matchKey(event, k))) {
163
+ this.emit("key", event);
164
+ this.stop();
165
+ return;
166
+ }
167
+ if (this.options.focusNavigation !== false) {
168
+ if (event.name === "tab") {
169
+ this.focusNext(event.shift ? -1 : 1);
170
+ }
171
+ else if (event.name === "enter" || event.name === "space") {
172
+ this.activateFocused();
173
+ }
174
+ }
175
+ this.emit("key", event);
176
+ this.dirty = true;
177
+ return;
178
+ }
179
+ if (event.type === "mouse") {
180
+ this.dispatchMouse(event);
181
+ this.emit("mouse", event);
182
+ return;
183
+ }
184
+ if (event.type === "paste") {
185
+ this.emit("paste", event);
186
+ this.dirty = true;
187
+ return;
188
+ }
189
+ this.emit("focus", event);
190
+ }
191
+ dispatchMouse(event) {
192
+ // Later regions are drawn on top, so hit-test in reverse.
193
+ for (let i = this.hits.length - 1; i >= 0; i--) {
194
+ const hit = this.hits[i];
195
+ const r = hit.rect;
196
+ if (event.x < r.x || event.y < r.y || event.x >= r.x + r.width || event.y >= r.y + r.height)
197
+ continue;
198
+ if (event.action === "scroll")
199
+ hit.onScroll?.(event.scroll);
200
+ else if (event.action === "press")
201
+ hit.onClick?.(event.x - r.x, event.y - r.y, event.button);
202
+ else if (event.action === "move")
203
+ hit.onHover?.(event.x - r.x, event.y - r.y);
204
+ this.dirty = true;
205
+ return;
206
+ }
207
+ }
208
+ /** Build one frame and push the difference to the terminal. */
209
+ frame() {
210
+ const started = performance.now();
211
+ this.dirty = false;
212
+ const size = this.terminal.size();
213
+ if (size.columns !== this.current.width || size.rows !== this.current.height) {
214
+ this.current.resize(size.columns, size.rows);
215
+ this.previous.resize(size.columns, size.rows);
216
+ this.forceRepaint = true;
217
+ }
218
+ this.current.clear(this.options.paintBackground === false ? undefined : this.theme.background, this.theme.foreground);
219
+ this.hits = [];
220
+ this.overlays = [];
221
+ this.focusActions = [];
222
+ let focusCursor = 0;
223
+ const ctx = {
224
+ theme: this.theme,
225
+ capabilities: this.capabilities,
226
+ width: this.current.width,
227
+ height: this.current.height,
228
+ frame: this.frameCount,
229
+ elapsed: Date.now() - this.startedAt,
230
+ focusIndex: this.focusIndex,
231
+ registerFocus: (action) => {
232
+ const index = focusCursor++;
233
+ if (action)
234
+ this.focusActions[index] = action;
235
+ return { index, focused: index === this.focusIndex };
236
+ },
237
+ hit: (region) => this.hits.push(region),
238
+ overlay: (draw) => this.overlays.push(draw),
239
+ invalidate: () => this.invalidate(),
240
+ };
241
+ const root = createSurface(this.current, this.theme);
242
+ const container = new Container(root, ctx, "column");
243
+ this.renderFn({
244
+ ui: container,
245
+ theme: this.theme,
246
+ capabilities: this.capabilities,
247
+ width: this.current.width,
248
+ height: this.current.height,
249
+ frame: this.frameCount,
250
+ elapsed: ctx.elapsed,
251
+ focus: this.focusIndex,
252
+ app: this,
253
+ });
254
+ container.flush();
255
+ for (const overlay of this.overlays)
256
+ overlay(root);
257
+ this.focusCount = Math.max(focusCursor, 0);
258
+ if (this.focusCount > 0 && this.focusIndex >= this.focusCount)
259
+ this.focusIndex = 0;
260
+ const result = this.encoder.encode(this.previous, this.current, this.forceRepaint);
261
+ this.forceRepaint = false;
262
+ let output = result.output;
263
+ if (output.length > 0) {
264
+ if (this.capabilities.synchronizedOutput)
265
+ output = ansi.beginSync + output + ansi.endSync;
266
+ this.terminal.write(output);
267
+ }
268
+ this.previous.copyFrom(this.current);
269
+ const now = performance.now();
270
+ const stats = {
271
+ frame: this.frameCount++,
272
+ renderMs: now - started,
273
+ changedCells: result.changedCells,
274
+ dirtyRows: result.dirtyRows,
275
+ bytes: output.length,
276
+ fps: this.lastFrameAt ? 1000 / Math.max(1, now - this.lastFrameAt) : 0,
277
+ };
278
+ this.lastFrameAt = now;
279
+ this.lastStats = stats;
280
+ this.emit("frame", stats);
281
+ return stats;
282
+ }
283
+ }
284
+ /**
285
+ * Create an app. Every option has a sensible default: dark theme, mouse on,
286
+ * 30fps, alternate screen, terminal restored no matter how the process dies.
287
+ *
288
+ * const app = await createApp();
289
+ * app.render(({ ui }) => ui.panel({ title: "Hello" }, p => p.text("Hi")));
290
+ * await app.start();
291
+ */
292
+ export async function createApp(options = {}) {
293
+ return new App(options);
294
+ }
295
+ export { emergencyRestore, themes };
296
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type Color } from "./color.ts";
2
+ /** Style attribute bits packed into the cell's 16-bit attribute slot. */
3
+ export declare const Attr: {
4
+ readonly None: 0;
5
+ readonly Bold: number;
6
+ readonly Dim: number;
7
+ readonly Italic: number;
8
+ readonly Underline: number;
9
+ readonly Blink: number;
10
+ readonly Reverse: number;
11
+ readonly Strike: number;
12
+ };
13
+ export type Attributes = number;
14
+ export interface Style {
15
+ fg?: Color;
16
+ bg?: Color;
17
+ attrs?: Attributes;
18
+ }
19
+ /**
20
+ * The screen is one grid of cells, not a tree of widgets. Four parallel typed
21
+ * arrays keep a frame allocation-free: no object is created per cell, ever.
22
+ */
23
+ export declare class FrameBuffer {
24
+ width: number;
25
+ height: number;
26
+ chars: Uint32Array;
27
+ fg: Uint32Array;
28
+ bg: Uint32Array;
29
+ attrs: Uint16Array;
30
+ constructor(width: number, height: number);
31
+ /** Resize in place, reusing the existing allocation when it is large enough. */
32
+ resize(width: number, height: number): void;
33
+ index(x: number, y: number): number;
34
+ clear(fill?: Color, fg?: Color): void;
35
+ inBounds(x: number, y: number): boolean;
36
+ /** Write one already-decoded cell value. Returns columns consumed. */
37
+ setCell(x: number, y: number, value: number, style?: Style): number;
38
+ /** Write text left to right. Returns the number of columns written. */
39
+ write(x: number, y: number, text: string, style?: Style, maxWidth?: number): number;
40
+ fillRect(x: number, y: number, w: number, h: number, ch?: number, style?: Style): void;
41
+ /** Restyle a region without touching its characters. */
42
+ styleRect(x: number, y: number, w: number, h: number, style: Style): void;
43
+ /** Copy another buffer's contents into this one (same dimensions assumed). */
44
+ copyFrom(other: FrameBuffer): void;
45
+ /** Plain text of one row, for tests and headless rendering. */
46
+ rowText(y: number): string;
47
+ /** Whole buffer as plain text. */
48
+ toText(trimEnd?: boolean): string;
49
+ }
50
+ //# sourceMappingURL=buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffer.d.ts","sourceRoot":"","sources":["../src/buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAGvD,yEAAyE;AACzE,eAAO,MAAM,IAAI;;;;;;;;;CASP,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,MAAM,WAAW,KAAK;IACpB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,WAAW,CAAC;IAChB,EAAE,EAAE,WAAW,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;gBAEP,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAWzC,gFAAgF;IAChF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAgB3C,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAInC,KAAK,CAAC,IAAI,GAAE,KAAqB,EAAE,EAAE,GAAE,KAAqB,GAAG,IAAI;IAQnE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAIvC,sEAAsE;IACtE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM;IA8BnE,uEAAuE;IACvE,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,SAAW,GAAG,MAAM;IAiBrF,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,SAAK,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAUlF,wDAAwD;IACxD,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAezE,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAQlC,+DAA+D;IAC/D,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAW1B,kCAAkC;IAClC,MAAM,CAAC,OAAO,UAAO,GAAG,MAAM;CAQ/B"}
package/dist/buffer.js ADDED
@@ -0,0 +1,184 @@
1
+ import { DEFAULT_COLOR } from "./color.js";
2
+ import { CONTINUATION, cellWidth, graphemes, cellText } from "./unicode.js";
3
+ /** Style attribute bits packed into the cell's 16-bit attribute slot. */
4
+ export const Attr = {
5
+ None: 0,
6
+ Bold: 1 << 0,
7
+ Dim: 1 << 1,
8
+ Italic: 1 << 2,
9
+ Underline: 1 << 3,
10
+ Blink: 1 << 4,
11
+ Reverse: 1 << 5,
12
+ Strike: 1 << 6,
13
+ };
14
+ /**
15
+ * The screen is one grid of cells, not a tree of widgets. Four parallel typed
16
+ * arrays keep a frame allocation-free: no object is created per cell, ever.
17
+ */
18
+ export class FrameBuffer {
19
+ width;
20
+ height;
21
+ chars;
22
+ fg;
23
+ bg;
24
+ attrs;
25
+ constructor(width, height) {
26
+ this.width = Math.max(0, width | 0);
27
+ this.height = Math.max(0, height | 0);
28
+ const n = this.width * this.height;
29
+ this.chars = new Uint32Array(n);
30
+ this.fg = new Uint32Array(n);
31
+ this.bg = new Uint32Array(n);
32
+ this.attrs = new Uint16Array(n);
33
+ this.clear();
34
+ }
35
+ /** Resize in place, reusing the existing allocation when it is large enough. */
36
+ resize(width, height) {
37
+ const w = Math.max(0, width | 0);
38
+ const h = Math.max(0, height | 0);
39
+ if (w === this.width && h === this.height)
40
+ return;
41
+ const n = w * h;
42
+ if (n > this.chars.length) {
43
+ this.chars = new Uint32Array(n);
44
+ this.fg = new Uint32Array(n);
45
+ this.bg = new Uint32Array(n);
46
+ this.attrs = new Uint16Array(n);
47
+ }
48
+ this.width = w;
49
+ this.height = h;
50
+ this.clear();
51
+ }
52
+ index(x, y) {
53
+ return y * this.width + x;
54
+ }
55
+ clear(fill = DEFAULT_COLOR, fg = DEFAULT_COLOR) {
56
+ const n = this.width * this.height;
57
+ this.chars.fill(32, 0, n);
58
+ this.fg.fill(fg, 0, n);
59
+ this.bg.fill(fill, 0, n);
60
+ this.attrs.fill(0, 0, n);
61
+ }
62
+ inBounds(x, y) {
63
+ return x >= 0 && y >= 0 && x < this.width && y < this.height;
64
+ }
65
+ /** Write one already-decoded cell value. Returns columns consumed. */
66
+ setCell(x, y, value, style) {
67
+ if (!this.inBounds(x, y))
68
+ return 0;
69
+ const w = cellWidth(value);
70
+ const i = this.index(x, y);
71
+ // Overwriting the tail of a wide char to our left would orphan it; blank it.
72
+ if (this.chars[i] === CONTINUATION && x > 0)
73
+ this.chars[i - 1] = 32;
74
+ this.chars[i] = value;
75
+ if (style) {
76
+ if (style.fg !== undefined)
77
+ this.fg[i] = style.fg;
78
+ if (style.bg !== undefined)
79
+ this.bg[i] = style.bg;
80
+ if (style.attrs !== undefined)
81
+ this.attrs[i] = style.attrs;
82
+ }
83
+ if (w === 2) {
84
+ if (x + 1 < this.width) {
85
+ const j = i + 1;
86
+ this.chars[j] = CONTINUATION;
87
+ if (style) {
88
+ if (style.fg !== undefined)
89
+ this.fg[j] = style.fg;
90
+ if (style.bg !== undefined)
91
+ this.bg[j] = style.bg;
92
+ if (style.attrs !== undefined)
93
+ this.attrs[j] = style.attrs;
94
+ }
95
+ }
96
+ else {
97
+ // No room for the second half: draw a space rather than corrupt the row.
98
+ this.chars[i] = 32;
99
+ return 1;
100
+ }
101
+ }
102
+ return Math.max(1, w);
103
+ }
104
+ /** Write text left to right. Returns the number of columns written. */
105
+ write(x, y, text, style, maxWidth = Infinity) {
106
+ if (y < 0 || y >= this.height)
107
+ return 0;
108
+ let cx = x;
109
+ let used = 0;
110
+ for (const g of graphemes(text)) {
111
+ if (used + g.width > maxWidth)
112
+ break;
113
+ if (cx >= this.width)
114
+ break;
115
+ if (cx + g.width > this.width)
116
+ break;
117
+ if (cx >= 0) {
118
+ this.setCell(cx, y, g.value, style);
119
+ }
120
+ cx += g.width;
121
+ used += g.width;
122
+ }
123
+ return used;
124
+ }
125
+ fillRect(x, y, w, h, ch = 32, style) {
126
+ const x0 = Math.max(0, x);
127
+ const y0 = Math.max(0, y);
128
+ const x1 = Math.min(this.width, x + w);
129
+ const y1 = Math.min(this.height, y + h);
130
+ for (let cy = y0; cy < y1; cy++) {
131
+ for (let cx = x0; cx < x1; cx++)
132
+ this.setCell(cx, cy, ch, style);
133
+ }
134
+ }
135
+ /** Restyle a region without touching its characters. */
136
+ styleRect(x, y, w, h, style) {
137
+ const x0 = Math.max(0, x);
138
+ const y0 = Math.max(0, y);
139
+ const x1 = Math.min(this.width, x + w);
140
+ const y1 = Math.min(this.height, y + h);
141
+ for (let cy = y0; cy < y1; cy++) {
142
+ for (let cx = x0; cx < x1; cx++) {
143
+ const i = this.index(cx, cy);
144
+ if (style.fg !== undefined)
145
+ this.fg[i] = style.fg;
146
+ if (style.bg !== undefined)
147
+ this.bg[i] = style.bg;
148
+ if (style.attrs !== undefined)
149
+ this.attrs[i] = style.attrs;
150
+ }
151
+ }
152
+ }
153
+ /** Copy another buffer's contents into this one (same dimensions assumed). */
154
+ copyFrom(other) {
155
+ const n = Math.min(this.width * this.height, other.width * other.height);
156
+ this.chars.set(other.chars.subarray(0, n));
157
+ this.fg.set(other.fg.subarray(0, n));
158
+ this.bg.set(other.bg.subarray(0, n));
159
+ this.attrs.set(other.attrs.subarray(0, n));
160
+ }
161
+ /** Plain text of one row, for tests and headless rendering. */
162
+ rowText(y) {
163
+ if (y < 0 || y >= this.height)
164
+ return "";
165
+ let out = "";
166
+ for (let x = 0; x < this.width; x++) {
167
+ const v = this.chars[this.index(x, y)];
168
+ if (v === CONTINUATION)
169
+ continue;
170
+ out += v === 0 ? " " : cellText(v);
171
+ }
172
+ return out;
173
+ }
174
+ /** Whole buffer as plain text. */
175
+ toText(trimEnd = true) {
176
+ const rows = [];
177
+ for (let y = 0; y < this.height; y++) {
178
+ const r = this.rowText(y);
179
+ rows.push(trimEnd ? r.replace(/\s+$/, "") : r);
180
+ }
181
+ return rows.join("\n");
182
+ }
183
+ }
184
+ //# sourceMappingURL=buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffer.js","sourceRoot":"","sources":["../src/buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE5E,yEAAyE;AACzE,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,GAAG,EAAE,CAAC,IAAI,CAAC;IACX,MAAM,EAAE,CAAC,IAAI,CAAC;IACd,SAAS,EAAE,CAAC,IAAI,CAAC;IACjB,KAAK,EAAE,CAAC,IAAI,CAAC;IACb,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,MAAM,EAAE,CAAC,IAAI,CAAC;CACN,CAAC;AAUX;;;GAGG;AACH,MAAM,OAAO,WAAW;IACtB,KAAK,CAAS;IACd,MAAM,CAAS;IACf,KAAK,CAAc;IACnB,EAAE,CAAc;IAChB,EAAE,CAAc;IAChB,KAAK,CAAc;IAEnB,YAAY,KAAa,EAAE,MAAc;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,gFAAgF;IAChF,MAAM,CAAC,KAAa,EAAE,MAAc;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO;QAClD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,EAAE,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,EAAE,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,KAAK,CAAC,CAAS,EAAE,CAAS;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAc,aAAa,EAAE,KAAY,aAAa;QAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,QAAQ,CAAC,CAAS,EAAE,CAAS;QAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/D,CAAC;IAED,sEAAsE;IACtE,OAAO,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,KAAa;QACxD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,6EAA6E;QAC7E,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;gBAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;gBAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;gBAC7B,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;wBAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;oBAClD,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;wBAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;oBAClD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;wBAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;gBAC7D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,yEAAyE;gBACzE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBACnB,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,CAAS,EAAE,CAAS,EAAE,IAAY,EAAE,KAAa,EAAE,QAAQ,GAAG,QAAQ;QAC1E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;QACxC,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,QAAQ;gBAAE,MAAM;YACrC,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM;YAC5B,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;gBAAE,MAAM;YACrC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACZ,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;YACD,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC;YACd,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE,GAAG,EAAE,EAAE,KAAa;QACzE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAChC,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;gBAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,SAAS,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,KAAY;QAChE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAChC,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;oBAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;gBAClD,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;oBAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;gBAClD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;oBAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,QAAQ,CAAC,KAAkB;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,+DAA+D;IAC/D,OAAO,CAAC,CAAS;QACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACzC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,YAAY;gBAAE,SAAS;YACjC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,kCAAkC;IAClC,MAAM,CAAC,OAAO,GAAG,IAAI;QACnB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * What the terminal can actually do. Detection is deliberately conservative:
3
+ * we degrade colors and glyphs rather than print mojibake on someone's console.
4
+ */
5
+ export type ColorDepth = "truecolor" | "ansi256" | "ansi16" | "none";
6
+ export interface Capabilities {
7
+ /** stdout is a real TTY, not a pipe or a file. */
8
+ tty: boolean;
9
+ colors: ColorDepth;
10
+ trueColor: boolean;
11
+ unicode: boolean;
12
+ braille: boolean;
13
+ mouse: boolean;
14
+ /** DEC 2026 atomic frame updates. */
15
+ synchronizedOutput: boolean;
16
+ bracketedPaste: boolean;
17
+ focusEvents: boolean;
18
+ tmux: boolean;
19
+ screen: boolean;
20
+ ssh: boolean;
21
+ windows: boolean;
22
+ /** Best guess at the emulator: kitty, wezterm, ghostty, iterm, alacritty, vscode, windows-terminal, xterm, unknown. */
23
+ program: string;
24
+ }
25
+ export interface CapabilityOverrides {
26
+ colors?: ColorDepth;
27
+ unicode?: boolean;
28
+ braille?: boolean;
29
+ mouse?: boolean;
30
+ synchronizedOutput?: boolean;
31
+ tty?: boolean;
32
+ }
33
+ export declare function detectCapabilities(overrides?: CapabilityOverrides, env?: NodeJS.ProcessEnv, stream?: {
34
+ isTTY?: boolean;
35
+ }): Capabilities;
36
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,qCAAqC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,uHAAuH;IACvH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AA4CD,wBAAgB,kBAAkB,CAChC,SAAS,GAAE,mBAAwB,EACnC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,MAAM,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAmB,GAC3C,YAAY,CA6Bd"}