@sagmans/dsh-tui 0.4.0 → 0.5.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 (200) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +270 -68
  3. package/lib/agent/present.js +1 -1
  4. package/lib/agent/present.js.map +1 -1
  5. package/lib/agent/prompt-history.d.ts.map +1 -1
  6. package/lib/agent/prompt-history.js +5 -3
  7. package/lib/agent/prompt-history.js.map +1 -1
  8. package/lib/agent/status.d.ts +1 -1
  9. package/lib/cards.d.ts +83 -13
  10. package/lib/cards.d.ts.map +1 -1
  11. package/lib/cards.js +96 -28
  12. package/lib/cards.js.map +1 -1
  13. package/lib/export.d.ts +3 -3
  14. package/lib/export.d.ts.map +1 -1
  15. package/lib/export.js +23 -13
  16. package/lib/export.js.map +1 -1
  17. package/lib/fold-cursor.d.ts +12 -5
  18. package/lib/fold-cursor.d.ts.map +1 -1
  19. package/lib/fold-cursor.js +16 -5
  20. package/lib/fold-cursor.js.map +1 -1
  21. package/lib/gates.d.ts.map +1 -1
  22. package/lib/gates.js +42 -9
  23. package/lib/gates.js.map +1 -1
  24. package/lib/index.d.ts.map +1 -1
  25. package/lib/index.js +459 -72
  26. package/lib/index.js.map +1 -1
  27. package/lib/injection.d.ts +9 -0
  28. package/lib/injection.d.ts.map +1 -0
  29. package/lib/injection.js +128 -0
  30. package/lib/injection.js.map +1 -0
  31. package/lib/input/actions.d.ts +19 -2
  32. package/lib/input/actions.d.ts.map +1 -1
  33. package/lib/input/actions.js +57 -11
  34. package/lib/input/actions.js.map +1 -1
  35. package/lib/input/cancel.d.ts +55 -0
  36. package/lib/input/cancel.d.ts.map +1 -0
  37. package/lib/input/cancel.js +47 -0
  38. package/lib/input/cancel.js.map +1 -0
  39. package/lib/input/completion.d.ts +5 -2
  40. package/lib/input/completion.d.ts.map +1 -1
  41. package/lib/input/completion.js +79 -4
  42. package/lib/input/completion.js.map +1 -1
  43. package/lib/input/file-search.d.ts +105 -0
  44. package/lib/input/file-search.d.ts.map +1 -0
  45. package/lib/input/file-search.js +665 -0
  46. package/lib/input/file-search.js.map +1 -0
  47. package/lib/input/fuzzy.d.ts +42 -0
  48. package/lib/input/fuzzy.d.ts.map +1 -0
  49. package/lib/input/fuzzy.js +289 -0
  50. package/lib/input/fuzzy.js.map +1 -0
  51. package/lib/input/keymap.d.ts +3 -1
  52. package/lib/input/keymap.d.ts.map +1 -1
  53. package/lib/input/keymap.js +14 -3
  54. package/lib/input/keymap.js.map +1 -1
  55. package/lib/input/match.d.ts +12 -4
  56. package/lib/input/match.d.ts.map +1 -1
  57. package/lib/input/match.js +50 -51
  58. package/lib/input/match.js.map +1 -1
  59. package/lib/input/submission.d.ts +10 -0
  60. package/lib/input/submission.d.ts.map +1 -1
  61. package/lib/input/submission.js +7 -6
  62. package/lib/input/submission.js.map +1 -1
  63. package/lib/keys-command.d.ts +19 -3
  64. package/lib/keys-command.d.ts.map +1 -1
  65. package/lib/keys-command.js +34 -31
  66. package/lib/keys-command.js.map +1 -1
  67. package/lib/settings-notice.d.ts +5 -0
  68. package/lib/settings-notice.d.ts.map +1 -1
  69. package/lib/settings-notice.js +9 -7
  70. package/lib/settings-notice.js.map +1 -1
  71. package/lib/stash/paths.d.ts +8 -8
  72. package/lib/stash/paths.d.ts.map +1 -1
  73. package/lib/stash/paths.js +19 -18
  74. package/lib/stash/paths.js.map +1 -1
  75. package/lib/stash/schema.d.ts +11 -12
  76. package/lib/stash/schema.d.ts.map +1 -1
  77. package/lib/stash/schema.js +10 -29
  78. package/lib/stash/schema.js.map +1 -1
  79. package/lib/stash/store.js +10 -10
  80. package/lib/stash/store.js.map +1 -1
  81. package/lib/stash.d.ts +37 -6
  82. package/lib/stash.d.ts.map +1 -1
  83. package/lib/stash.js +93 -36
  84. package/lib/stash.js.map +1 -1
  85. package/lib/terminal/external-editor.d.ts +93 -0
  86. package/lib/terminal/external-editor.d.ts.map +1 -0
  87. package/lib/terminal/external-editor.js +263 -0
  88. package/lib/terminal/external-editor.js.map +1 -0
  89. package/lib/terminal/host-writes.d.ts +39 -0
  90. package/lib/terminal/host-writes.d.ts.map +1 -0
  91. package/lib/terminal/host-writes.js +136 -0
  92. package/lib/terminal/host-writes.js.map +1 -0
  93. package/lib/terminal/signals.d.ts +25 -0
  94. package/lib/terminal/signals.d.ts.map +1 -0
  95. package/lib/terminal/signals.js +39 -0
  96. package/lib/terminal/signals.js.map +1 -0
  97. package/lib/terminal/warning-screen.d.ts +19 -1
  98. package/lib/terminal/warning-screen.d.ts.map +1 -1
  99. package/lib/terminal/warning-screen.js +37 -1
  100. package/lib/terminal/warning-screen.js.map +1 -1
  101. package/lib/terminal-text.d.ts +72 -0
  102. package/lib/terminal-text.d.ts.map +1 -0
  103. package/lib/terminal-text.js +603 -0
  104. package/lib/terminal-text.js.map +1 -0
  105. package/lib/text.d.ts +45 -6
  106. package/lib/text.d.ts.map +1 -1
  107. package/lib/text.js +106 -46
  108. package/lib/text.js.map +1 -1
  109. package/lib/theme-command.d.ts +7 -4
  110. package/lib/theme-command.d.ts.map +1 -1
  111. package/lib/theme-command.js +32 -12
  112. package/lib/theme-command.js.map +1 -1
  113. package/lib/theme-files.d.ts +110 -0
  114. package/lib/theme-files.d.ts.map +1 -0
  115. package/lib/theme-files.js +352 -0
  116. package/lib/theme-files.js.map +1 -0
  117. package/lib/theme-schema.d.ts +121 -0
  118. package/lib/theme-schema.d.ts.map +1 -0
  119. package/lib/theme-schema.js +87 -0
  120. package/lib/theme-schema.js.map +1 -0
  121. package/lib/theme-settings.d.ts +43 -10
  122. package/lib/theme-settings.d.ts.map +1 -1
  123. package/lib/theme-settings.js +103 -43
  124. package/lib/theme-settings.js.map +1 -1
  125. package/lib/theme-tokens.d.ts +39 -7
  126. package/lib/theme-tokens.d.ts.map +1 -1
  127. package/lib/theme-tokens.js +96 -13
  128. package/lib/theme-tokens.js.map +1 -1
  129. package/lib/theme.d.ts +24 -2
  130. package/lib/theme.d.ts.map +1 -1
  131. package/lib/theme.js +49 -6
  132. package/lib/theme.js.map +1 -1
  133. package/lib/tool-display.d.ts +57 -0
  134. package/lib/tool-display.d.ts.map +1 -0
  135. package/lib/tool-display.js +51 -0
  136. package/lib/tool-display.js.map +1 -0
  137. package/lib/transcript.d.ts +28 -0
  138. package/lib/transcript.d.ts.map +1 -1
  139. package/lib/transcript.js +126 -37
  140. package/lib/transcript.js.map +1 -1
  141. package/lib/ui/diff.d.ts +49 -0
  142. package/lib/ui/diff.d.ts.map +1 -0
  143. package/lib/ui/diff.js +208 -0
  144. package/lib/ui/diff.js.map +1 -0
  145. package/lib/ui/dock.d.ts.map +1 -1
  146. package/lib/ui/dock.js +9 -6
  147. package/lib/ui/dock.js.map +1 -1
  148. package/lib/ui/editor.d.ts.map +1 -1
  149. package/lib/ui/editor.js +4 -2
  150. package/lib/ui/editor.js.map +1 -1
  151. package/lib/ui/frame.d.ts +16 -5
  152. package/lib/ui/frame.d.ts.map +1 -1
  153. package/lib/ui/frame.js +32 -13
  154. package/lib/ui/frame.js.map +1 -1
  155. package/lib/ui/keymap-picker.d.ts +16 -0
  156. package/lib/ui/keymap-picker.d.ts.map +1 -0
  157. package/lib/ui/keymap-picker.js +41 -0
  158. package/lib/ui/keymap-picker.js.map +1 -0
  159. package/lib/ui/layout.d.ts +33 -0
  160. package/lib/ui/layout.d.ts.map +1 -0
  161. package/lib/ui/layout.js +33 -0
  162. package/lib/ui/layout.js.map +1 -0
  163. package/lib/ui/markdown.d.ts +25 -3
  164. package/lib/ui/markdown.d.ts.map +1 -1
  165. package/lib/ui/markdown.js +12 -8
  166. package/lib/ui/markdown.js.map +1 -1
  167. package/lib/ui/picker-card.d.ts +42 -0
  168. package/lib/ui/picker-card.d.ts.map +1 -0
  169. package/lib/ui/picker-card.js +148 -0
  170. package/lib/ui/picker-card.js.map +1 -0
  171. package/lib/ui/picker.d.ts +40 -2
  172. package/lib/ui/picker.d.ts.map +1 -1
  173. package/lib/ui/picker.js +50 -6
  174. package/lib/ui/picker.js.map +1 -1
  175. package/lib/ui/prompt.d.ts +10 -2
  176. package/lib/ui/prompt.d.ts.map +1 -1
  177. package/lib/ui/prompt.js +21 -2
  178. package/lib/ui/prompt.js.map +1 -1
  179. package/lib/ui/rows.d.ts +8 -6
  180. package/lib/ui/rows.d.ts.map +1 -1
  181. package/lib/ui/rows.js +10 -18
  182. package/lib/ui/rows.js.map +1 -1
  183. package/lib/ui/stash-picker.d.ts +2 -2
  184. package/lib/ui/stash-picker.d.ts.map +1 -1
  185. package/lib/ui/stash-picker.js +4 -4
  186. package/lib/ui/stash-picker.js.map +1 -1
  187. package/lib/ui/status.d.ts.map +1 -1
  188. package/lib/ui/status.js +18 -16
  189. package/lib/ui/status.js.map +1 -1
  190. package/lib/ui/theme-picker.d.ts +18 -0
  191. package/lib/ui/theme-picker.d.ts.map +1 -0
  192. package/lib/ui/theme-picker.js +68 -0
  193. package/lib/ui/theme-picker.js.map +1 -0
  194. package/lib/ui/view.d.ts +146 -22
  195. package/lib/ui/view.d.ts.map +1 -1
  196. package/lib/ui/view.js +461 -154
  197. package/lib/ui/view.js.map +1 -1
  198. package/package.json +3 -1
  199. package/themes/deepseek-blue.yaml +183 -0
  200. package/themes/violet-orbit.yaml +178 -0
@@ -0,0 +1,603 @@
1
+ /**
2
+ * Terminal text, read the way a terminal would read it.
3
+ *
4
+ * Tool output, file content, and model text all reach the screen, and this
5
+ * module is the only place that decides what a control byte means. It offers
6
+ * two policies over one token stream, so they can never disagree about where a
7
+ * sequence ends:
8
+ *
9
+ * - {@link renderTerminalText} draws what the terminal would have drawn: a
10
+ * whitelisted SGR subset becomes real colour at the session's colour budget,
11
+ * a tab lands on its stop, a carriage return repaints the row it sits on, and
12
+ * every sequence a terminal would *act* on is consumed, so it acts on
13
+ * nothing. Bytes that are not a sequence are still spelled out rather than
14
+ * dropped, because silently swallowing text would hide what a tool said.
15
+ * - {@link escapeTerminalText} is for text a buffer or a file will hold: every
16
+ * control character is spelled out, because an editor cannot draw an escape
17
+ * and must not execute one.
18
+ *
19
+ * Sharing one scanner matters for more than agreement: pi-tui's own escape
20
+ * scanner recognises less than a terminal does (a `\x1b[?25l` left in a drawn
21
+ * string would make its width arithmetic swallow the text after it), so a
22
+ * sequence that is not SGR must be gone before any width is measured.
23
+ */
24
+ import { visibleWidth } from '@earendil-works/pi-tui';
25
+ import { sgrBackgroundPrefix, sgrPrefix } from "./theme-capability.js";
26
+ /** Columns between tab stops: the POSIX default, and what every terminal still uses. */
27
+ export const TAB_STOP = 8;
28
+ const ESC = '\u001b';
29
+ const CSI = `${ESC}[`;
30
+ const REPLACEMENT = '\uFFFD';
31
+ const C0_PREFIX = '\\x';
32
+ const UNICODE_PREFIX = '\\u';
33
+ const HEX2 = 2;
34
+ const HEX4 = 4;
35
+ const LAST_C0 = 0x1f;
36
+ const TAB = 0x09;
37
+ const LINE_FEED = 0x0a;
38
+ const CARRIAGE_RETURN = 0x0d;
39
+ const BACKSPACE = 0x08;
40
+ const DELETE = 0x7f;
41
+ const FIRST_C1 = 0x80;
42
+ const LAST_C1 = 0x9f;
43
+ const FIRST_SURROGATE = 0xd800;
44
+ const LAST_SURROGATE = 0xdfff;
45
+ /** The bytes a text fragment cannot be drawn with: they are either sequences to read or marks to spell. */
46
+ const NEEDS_READING = /[\u0000-\u0009\u000B-\u001F\u007F-\u009F\u061C\u200E\u200F\u2028\u2029\u202A-\u202E\u2066-\u2069\uD800-\uDFFF]/u;
47
+ /** Directional overrides and isolates, which reorder a row without drawing anything. */
48
+ const BIDI_CONTROLS = new Set([0x202a, 0x202b, 0x202c, 0x202d, 0x202e, 0x2066, 0x2067, 0x2068, 0x2069]);
49
+ const LINE_SEPARATOR = 0x2028;
50
+ const PARAGRAPH_SEPARATOR = 0x2029;
51
+ const ARABIC_LETTER_MARK = 0x061c;
52
+ const LEFT_TO_RIGHT_MARK = 0x200e;
53
+ const RIGHT_TO_LEFT_MARK = 0x200f;
54
+ const GRAPHEMES = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
55
+ /** The SGR final byte, and the parameter bytes a sequence may carry before it. */
56
+ const SGR_FINAL = 'm';
57
+ const CSI_PARAMETER_LAST = 0x3f;
58
+ const CSI_INTERMEDIATE_FIRST = 0x20;
59
+ const CSI_INTERMEDIATE_LAST = 0x2f;
60
+ const CSI_FINAL_FIRST = 0x40;
61
+ const CSI_FINAL_LAST = 0x7e;
62
+ const ESCAPE_FINAL_FIRST = 0x30;
63
+ const OSC_INTRODUCER = ']';
64
+ const STRING_INTRODUCERS = new Set(['P', 'X', '^', '_']);
65
+ const STRING_END = '\u0007';
66
+ /** The attributes a run may carry, in the order they are emitted. */
67
+ const ATTRIBUTES = ['bold', 'dim', 'italic', 'underline', 'inverse', 'strike'];
68
+ const ATTRIBUTE_ON = {
69
+ bold: `${CSI}1m`,
70
+ dim: `${CSI}2m`,
71
+ italic: `${CSI}3m`,
72
+ underline: `${CSI}4m`,
73
+ inverse: `${CSI}7m`,
74
+ strike: `${CSI}9m`,
75
+ };
76
+ const ATTRIBUTE_OFF = {
77
+ bold: `${CSI}22m`,
78
+ dim: `${CSI}22m`,
79
+ italic: `${CSI}23m`,
80
+ underline: `${CSI}24m`,
81
+ inverse: `${CSI}27m`,
82
+ strike: `${CSI}29m`,
83
+ };
84
+ const SGR_ATTRIBUTE_ON = { 1: 'bold', 2: 'dim', 3: 'italic', 4: 'underline', 7: 'inverse', 9: 'strike' };
85
+ const SGR_ATTRIBUTE_OFF = {
86
+ 21: ['bold', 'dim'],
87
+ 22: ['bold', 'dim'],
88
+ 23: ['italic'],
89
+ 24: ['underline'],
90
+ 27: ['inverse'],
91
+ 29: ['strike'],
92
+ };
93
+ const FIRST_FG_SLOT = 30;
94
+ const LAST_FG_SLOT = 37;
95
+ const FIRST_BRIGHT_FG_SLOT = 90;
96
+ const LAST_BRIGHT_FG_SLOT = 97;
97
+ const FIRST_BG_SLOT = 40;
98
+ const LAST_BG_SLOT = 47;
99
+ const FIRST_BRIGHT_BG_SLOT = 100;
100
+ const LAST_BRIGHT_BG_SLOT = 107;
101
+ const FG_DEFAULT = 39;
102
+ const BG_DEFAULT = 49;
103
+ const EXTENDED_FG = 38;
104
+ const EXTENDED_BG = 48;
105
+ const EXTENDED_INDEXED = 5;
106
+ const EXTENDED_RGB = 2;
107
+ const RGB_COMPONENTS = 3;
108
+ const HEX_PREFIX = '#';
109
+ const HEX_PAD = 2;
110
+ const COLOUR_MAX = 0xff;
111
+ const BRIGHT_OFFSET = 8;
112
+ const RESET = 0;
113
+ const GROUND_FG = `${CSI}${FG_DEFAULT}m`;
114
+ const GROUND_BG = `${CSI}${BG_DEFAULT}m`;
115
+ function escapeCode(prefix, code, digits) {
116
+ return prefix + code.toString(16).toUpperCase().padStart(digits, '0');
117
+ }
118
+ /** Whether a code point is a mark this module spells instead of drawing. */
119
+ function isSpelledControl(code) {
120
+ if (code <= LAST_C0 || code === DELETE)
121
+ return true;
122
+ if (code >= FIRST_C1 && code <= LAST_C1)
123
+ return true;
124
+ return BIDI_CONTROLS.has(code) || code === LINE_SEPARATOR || code === PARAGRAPH_SEPARATOR || code === ARABIC_LETTER_MARK || code === LEFT_TO_RIGHT_MARK || code === RIGHT_TO_LEFT_MARK;
125
+ }
126
+ function spelled(code) {
127
+ if (code <= 0xff)
128
+ return escapeCode(C0_PREFIX, code, HEX2);
129
+ return escapeCode(UNICODE_PREFIX, code, HEX4);
130
+ }
131
+ /** Every character of a sequence that is a control, spelled; the rest of it is printable. */
132
+ function spellControls(raw) {
133
+ let out = '';
134
+ for (const character of raw) {
135
+ const code = character.codePointAt(0) ?? 0;
136
+ out += isSpelledControl(code) ? spelled(code) : character;
137
+ }
138
+ return out;
139
+ }
140
+ function isCsiFinal(code) {
141
+ return code >= CSI_FINAL_FIRST && code <= CSI_FINAL_LAST;
142
+ }
143
+ /**
144
+ * Read one escape sequence at `at`.
145
+ *
146
+ * A string sequence (OSC, DCS, and their siblings) runs to BEL or ST; when its
147
+ * terminator never arrives the sequence is reported incomplete rather than
148
+ * swallowed to the end of the row, because the renderer and the editor want
149
+ * different answers for a truncated sequence and only the scanner knows where
150
+ * it stopped.
151
+ */
152
+ function readEscape(raw, at) {
153
+ const introducer = raw[at + 1];
154
+ if (introducer === undefined)
155
+ return undefined;
156
+ if (introducer === '[') {
157
+ let end = at + 2;
158
+ while (end < raw.length) {
159
+ const code = raw.charCodeAt(end);
160
+ if (isCsiFinal(code)) {
161
+ const source = raw.slice(at, end + 1);
162
+ if (raw[end] === SGR_FINAL) {
163
+ const params = parseSgrParams(source.slice(2, -1));
164
+ if (params !== undefined)
165
+ return { token: { kind: 'sgr', params }, raw: source };
166
+ }
167
+ return { token: { kind: 'consumed' }, raw: source };
168
+ }
169
+ if (code > CSI_PARAMETER_LAST && (code < CSI_INTERMEDIATE_FIRST || code > CSI_INTERMEDIATE_LAST)) {
170
+ // A byte outside the CSI grammar ends the sequence as malformed; the
171
+ // sequence is consumed so its bytes cannot be drawn as text.
172
+ return { token: { kind: 'consumed' }, raw: raw.slice(at, end) };
173
+ }
174
+ end += 1;
175
+ }
176
+ return { token: { kind: 'incomplete' }, raw: raw.slice(at) };
177
+ }
178
+ if (introducer === OSC_INTRODUCER || STRING_INTRODUCERS.has(introducer)) {
179
+ let end = at + 2;
180
+ while (end < raw.length) {
181
+ if (raw[end] === STRING_END)
182
+ return { token: { kind: 'consumed' }, raw: raw.slice(at, end + 1) };
183
+ if (raw[end] === ESC && raw[end + 1] === '\\')
184
+ return { token: { kind: 'consumed' }, raw: raw.slice(at, end + 2) };
185
+ end += 1;
186
+ }
187
+ return { token: { kind: 'incomplete' }, raw: raw.slice(at) };
188
+ }
189
+ const code = raw.charCodeAt(at + 1);
190
+ if (code >= ESCAPE_FINAL_FIRST && code <= CSI_FINAL_LAST) {
191
+ return { token: { kind: 'consumed' }, raw: raw.slice(at, at + 2) };
192
+ }
193
+ return undefined;
194
+ }
195
+ /** The parameters of an SGR sequence, or nothing when it uses a form this module does not model. */
196
+ function parseSgrParams(body) {
197
+ if (body === '')
198
+ return [RESET];
199
+ const params = [];
200
+ for (const part of body.split(';')) {
201
+ if (!/^[0-9]*$/.test(part))
202
+ return undefined;
203
+ params.push(part === '' ? RESET : Number(part));
204
+ }
205
+ return params;
206
+ }
207
+ /** Split a text fragment into the pieces a policy draws or spells. */
208
+ function scan(raw) {
209
+ const pieces = [];
210
+ let text = '';
211
+ const flush = () => {
212
+ if (text === '')
213
+ return;
214
+ pieces.push({ token: { kind: 'text' }, raw: text });
215
+ text = '';
216
+ };
217
+ let at = 0;
218
+ while (at < raw.length) {
219
+ const code = raw.codePointAt(at) ?? 0;
220
+ const character = String.fromCodePoint(code);
221
+ if (code === LINE_FEED) {
222
+ flush();
223
+ pieces.push({ token: { kind: 'lineFeed' }, raw: character });
224
+ }
225
+ else if (code === TAB) {
226
+ flush();
227
+ pieces.push({ token: { kind: 'tab' }, raw: character });
228
+ }
229
+ else if (code === CARRIAGE_RETURN) {
230
+ flush();
231
+ pieces.push({ token: { kind: 'carriageReturn' }, raw: character });
232
+ }
233
+ else if (code === BACKSPACE) {
234
+ flush();
235
+ pieces.push({ token: { kind: 'backspace' }, raw: character });
236
+ }
237
+ else if (code === 0x1b) {
238
+ flush();
239
+ const sequence = readEscape(raw, at);
240
+ if (sequence === undefined) {
241
+ pieces.push({ token: { kind: 'control' }, raw: character });
242
+ }
243
+ else {
244
+ pieces.push(sequence);
245
+ at += sequence.raw.length;
246
+ continue;
247
+ }
248
+ }
249
+ else if (code >= FIRST_SURROGATE && code <= LAST_SURROGATE) {
250
+ text += REPLACEMENT;
251
+ }
252
+ else if (isSpelledControl(code)) {
253
+ flush();
254
+ pieces.push({ token: { kind: 'control' }, raw: character });
255
+ }
256
+ else {
257
+ text += character;
258
+ }
259
+ at += character.length;
260
+ }
261
+ flush();
262
+ return pieces;
263
+ }
264
+ /** How many characters a reader sees in this piece, which is what a row budget pays for. */
265
+ function visibleLength(piece) {
266
+ switch (piece.token.kind) {
267
+ case 'text': {
268
+ let count = 0;
269
+ for (const _ of GRAPHEMES.segment(piece.raw))
270
+ count += 1;
271
+ return count;
272
+ }
273
+ case 'sgr':
274
+ case 'consumed':
275
+ case 'incomplete': return 0;
276
+ default: return 1;
277
+ }
278
+ }
279
+ /**
280
+ * The tab stop a tab at `column` reaches.
281
+ *
282
+ * Strictly after the cursor, the way a terminal steps: a tab that is already on
283
+ * a stop still advances a full stop rather than standing still, which is what
284
+ * makes a column of tabs line up.
285
+ */
286
+ function nextStop(column) {
287
+ return (Math.floor(column / TAB_STOP) + 1) * TAB_STOP;
288
+ }
289
+ /**
290
+ * Spell every control character, expanding a tab to the stop the terminal would
291
+ * have used.
292
+ *
293
+ * The column is what makes a tab land where it landed for the tool that wrote
294
+ * it: a row indented by four columns reaches its stop four columns later than
295
+ * the same row at the left edge.
296
+ */
297
+ export function escapeTerminalText(raw, options = {}) {
298
+ const tab = options.tab ?? 'expand';
299
+ const expandTabs = tab === 'expand';
300
+ let column = options.column ?? 0;
301
+ let out = '';
302
+ for (const piece of scan(raw)) {
303
+ switch (piece.token.kind) {
304
+ case 'text':
305
+ out += piece.raw;
306
+ if (expandTabs)
307
+ column += visibleWidth(piece.raw);
308
+ break;
309
+ case 'lineFeed':
310
+ out += '\n';
311
+ column = 0;
312
+ break;
313
+ case 'tab': {
314
+ if (!expandTabs) {
315
+ out += '\t';
316
+ break;
317
+ }
318
+ const stop = nextStop(column);
319
+ out += ' '.repeat(stop - column);
320
+ column = stop;
321
+ break;
322
+ }
323
+ default: {
324
+ const spelledText = spellControls(piece.raw);
325
+ out += spelledText;
326
+ column += spelledText.length;
327
+ break;
328
+ }
329
+ }
330
+ }
331
+ return out;
332
+ }
333
+ const GROUND = { attributes: 0 };
334
+ function withAttributes(style, on, off) {
335
+ let attributes = style.attributes;
336
+ if (off !== undefined)
337
+ for (const attribute of off)
338
+ attributes &= ~(1 << ATTRIBUTES.indexOf(attribute));
339
+ if (on !== undefined)
340
+ attributes |= 1 << ATTRIBUTES.indexOf(on);
341
+ return attributes === style.attributes ? style : { ...style, attributes };
342
+ }
343
+ function hasAttribute(style, attribute) {
344
+ return (style.attributes & (1 << ATTRIBUTES.indexOf(attribute))) !== 0;
345
+ }
346
+ /**
347
+ * Build the encoder for one colour budget.
348
+ *
349
+ * The element's own colour is the ground state rather than a reset, because a
350
+ * tool that ends a coloured run must not clear the colour the card drew it in;
351
+ * a full reset is never emitted, so nothing outside the run is disturbed.
352
+ */
353
+ function encoder(color, base) {
354
+ if (color === 'none')
355
+ return { between: () => '' };
356
+ const groundCodes = (style) => {
357
+ let out = '';
358
+ for (const attribute of ATTRIBUTES)
359
+ if (hasAttribute(style, attribute))
360
+ out += ATTRIBUTE_OFF[attribute];
361
+ if (style.fg !== undefined)
362
+ out += GROUND_FG + base;
363
+ if (style.bg !== undefined)
364
+ out += GROUND_BG + base;
365
+ return out;
366
+ };
367
+ return {
368
+ between(previous, next) {
369
+ if (previous === next)
370
+ return '';
371
+ let out = '';
372
+ for (const attribute of ATTRIBUTES) {
373
+ if (hasAttribute(previous, attribute) && !hasAttribute(next, attribute))
374
+ out += ATTRIBUTE_OFF[attribute];
375
+ }
376
+ for (const attribute of ATTRIBUTES) {
377
+ if (!hasAttribute(previous, attribute) && hasAttribute(next, attribute))
378
+ out += ATTRIBUTE_ON[attribute];
379
+ }
380
+ if (next.fg !== previous.fg)
381
+ out += next.fg ?? GROUND_FG + base;
382
+ if (next.bg !== previous.bg)
383
+ out += next.bg ?? GROUND_BG + base;
384
+ return out;
385
+ },
386
+ };
387
+ }
388
+ function colourFor(params, at, color) {
389
+ const kind = params[at + 1];
390
+ if (kind === EXTENDED_INDEXED) {
391
+ const index = params[at + 2];
392
+ if (index === undefined)
393
+ return { next: params.length };
394
+ const code = params[at] === EXTENDED_FG ? sgrPrefix(index, color) : sgrBackgroundPrefix(index, color);
395
+ return { code: code === '' ? undefined : code, next: at + 3 };
396
+ }
397
+ if (kind === EXTENDED_RGB) {
398
+ const r = params[at + 2];
399
+ const g = params[at + 3];
400
+ const b = params[at + 4];
401
+ const spec = r === undefined || g === undefined || b === undefined ? undefined : rgbSpec(r, g, b);
402
+ if (spec === undefined)
403
+ return { next: at + 2 + RGB_COMPONENTS };
404
+ const code = params[at] === EXTENDED_FG ? sgrPrefix(spec, color) : sgrBackgroundPrefix(spec, color);
405
+ return { code: code === '' ? undefined : code, next: at + 2 + RGB_COMPONENTS };
406
+ }
407
+ return { next: at + 1 };
408
+ }
409
+ /** Apply an SGR sequence to the state a cell is written with. */
410
+ function applySgr(style, params, color) {
411
+ let next = style;
412
+ let at = 0;
413
+ while (at < params.length) {
414
+ const param = params[at] ?? RESET;
415
+ if (param === RESET) {
416
+ next = GROUND;
417
+ at += 1;
418
+ continue;
419
+ }
420
+ const on = SGR_ATTRIBUTE_ON[param];
421
+ if (on !== undefined) {
422
+ next = withAttributes(next, on, undefined);
423
+ at += 1;
424
+ continue;
425
+ }
426
+ const off = SGR_ATTRIBUTE_OFF[param];
427
+ if (off !== undefined) {
428
+ next = withAttributes(next, undefined, off);
429
+ at += 1;
430
+ continue;
431
+ }
432
+ if (param === EXTENDED_FG || param === EXTENDED_BG) {
433
+ const extended = colourFor(params, at, color);
434
+ if (extended.next <= at)
435
+ break;
436
+ next = extended.code === undefined
437
+ ? { ...next, ...(param === EXTENDED_FG ? { fg: undefined } : { bg: undefined }) }
438
+ : { ...next, ...(param === EXTENDED_FG ? { fg: extended.code } : { bg: extended.code }) };
439
+ at = extended.next;
440
+ continue;
441
+ }
442
+ if (param >= FIRST_FG_SLOT && param <= LAST_FG_SLOT) {
443
+ next = { ...next, fg: slotColour(param - FIRST_FG_SLOT, color, 'fg') };
444
+ }
445
+ else if (param >= FIRST_BRIGHT_FG_SLOT && param <= LAST_BRIGHT_FG_SLOT) {
446
+ next = { ...next, fg: slotColour(param - FIRST_BRIGHT_FG_SLOT + BRIGHT_OFFSET, color, 'fg') };
447
+ }
448
+ else if (param === FG_DEFAULT) {
449
+ next = { ...next, fg: undefined };
450
+ }
451
+ else if (param >= FIRST_BG_SLOT && param <= LAST_BG_SLOT) {
452
+ next = { ...next, bg: slotColour(param - FIRST_BG_SLOT, color, 'bg') };
453
+ }
454
+ else if (param >= FIRST_BRIGHT_BG_SLOT && param <= LAST_BRIGHT_BG_SLOT) {
455
+ next = { ...next, bg: slotColour(param - FIRST_BRIGHT_BG_SLOT + BRIGHT_OFFSET, color, 'bg') };
456
+ }
457
+ else if (param === BG_DEFAULT) {
458
+ next = { ...next, bg: undefined };
459
+ }
460
+ at += 1;
461
+ }
462
+ return next;
463
+ }
464
+ /** The hex spec the colour helpers take, or nothing when a tool sent a component a colour cannot hold. */
465
+ function rgbSpec(r, g, b) {
466
+ for (const value of [r, g, b]) {
467
+ if (!Number.isInteger(value) || value < 0 || value > COLOUR_MAX)
468
+ return undefined;
469
+ }
470
+ return HEX_PREFIX + [r, g, b].map(value => value.toString(16).padStart(HEX_PAD, '0')).join('');
471
+ }
472
+ function slotColour(slot, color, layer) {
473
+ const code = layer === 'fg' ? sgrPrefix(slot, color) : sgrBackgroundPrefix(slot, color);
474
+ return code === '' ? undefined : code;
475
+ }
476
+ /**
477
+ * Draw text as the terminal that produced it would have drawn it.
478
+ *
479
+ * A carriage return repaints the row from the column the fragment starts at
480
+ * and a backspace moves one column left, so a progress bar collapses to the
481
+ * state it settled on instead of showing every repaint in a row. That starting
482
+ * column is also a left margin: a row indented by the layout cannot be repainted
483
+ * by the text it holds, which is the one thing a carriage return could
484
+ * otherwise do to the frame. Styling is kept per cell, so what survives a
485
+ * repaint keeps the colour it was written with.
486
+ */
487
+ export function renderTerminalText(raw, options) {
488
+ if (!NEEDS_READING.test(raw))
489
+ return raw;
490
+ const { color, base = '', column = 0 } = options;
491
+ const codes = encoder(color, base);
492
+ let style = GROUND;
493
+ let previous = GROUND;
494
+ let cells = [];
495
+ let cursor = column;
496
+ let out = '';
497
+ const write = (text, width) => {
498
+ if (width === 0) {
499
+ const last = cells[cells.length - 1];
500
+ if (last !== undefined && last.col + last.width === cursor)
501
+ last.text += text;
502
+ return;
503
+ }
504
+ cells = cells.filter(cell => cell.col >= cursor + width || cell.col + cell.width <= cursor);
505
+ let at = cells.findIndex(cell => cell.col >= cursor + width);
506
+ if (at < 0)
507
+ at = cells.length;
508
+ cells.splice(at, 0, { col: cursor, width, text, style });
509
+ cursor += width;
510
+ };
511
+ const flush = () => {
512
+ if (cells.length > 0) {
513
+ let drawn = column;
514
+ for (const cell of cells) {
515
+ if (cell.col > drawn) {
516
+ out += codes.between(previous, GROUND);
517
+ previous = GROUND;
518
+ out += ' '.repeat(cell.col - drawn);
519
+ }
520
+ out += codes.between(previous, cell.style);
521
+ previous = cell.style;
522
+ out += cell.text;
523
+ drawn = cell.col + cell.width;
524
+ }
525
+ }
526
+ cells = [];
527
+ cursor = column;
528
+ };
529
+ for (const piece of scan(raw)) {
530
+ switch (piece.token.kind) {
531
+ case 'text':
532
+ for (const { segment } of GRAPHEMES.segment(piece.raw))
533
+ write(segment, visibleWidth(segment));
534
+ break;
535
+ case 'lineFeed':
536
+ flush();
537
+ out += '\n';
538
+ break;
539
+ case 'tab':
540
+ cursor = nextStop(cursor);
541
+ break;
542
+ case 'carriageReturn':
543
+ cursor = column;
544
+ break;
545
+ case 'backspace':
546
+ cursor = Math.max(column, cursor - 1);
547
+ break;
548
+ case 'sgr':
549
+ style = applySgr(style, piece.token.params, color);
550
+ break;
551
+ case 'control': {
552
+ const mark = spellControls(piece.raw);
553
+ write(mark, mark.length);
554
+ break;
555
+ }
556
+ case 'consumed':
557
+ case 'incomplete':
558
+ break;
559
+ }
560
+ }
561
+ flush();
562
+ return out;
563
+ }
564
+ /**
565
+ * Cut text to a budget of the characters a reader sees.
566
+ *
567
+ * Sequences are not content: counting them would let a coloured row lose its
568
+ * words sooner than a plain one, and cutting through one would leave a half
569
+ * sequence for a renderer to guess at. The cut falls between grapheme clusters
570
+ * for the same reason every other cut in the surface does — half a joined emoji
571
+ * is the same glitch as half a colour code.
572
+ */
573
+ export function clipVisibleGraphemes(raw, limit) {
574
+ const pieces = scan(raw);
575
+ let total = 0;
576
+ for (const piece of pieces)
577
+ total += visibleLength(piece);
578
+ if (total <= limit)
579
+ return raw;
580
+ const budget = Math.max(0, limit - 1);
581
+ let kept = 0;
582
+ let out = '';
583
+ for (const piece of pieces) {
584
+ if (kept >= budget)
585
+ break;
586
+ if (piece.token.kind === 'text') {
587
+ for (const { segment } of GRAPHEMES.segment(piece.raw)) {
588
+ if (kept >= budget)
589
+ break;
590
+ out += segment;
591
+ kept += 1;
592
+ }
593
+ continue;
594
+ }
595
+ const length = visibleLength(piece);
596
+ if (kept + length > budget)
597
+ break;
598
+ out += piece.raw;
599
+ kept += length;
600
+ }
601
+ return `${out}…`;
602
+ }
603
+ //# sourceMappingURL=terminal-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-text.js","sourceRoot":"","sources":["../src/terminal-text.ts"],"names":[],"mappings":"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"}