@zakmandhro/bunti 0.1.5 → 0.2.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 (192) hide show
  1. package/AGENTS.md +65 -0
  2. package/README.md +81 -11
  3. package/dist/cli.d.ts +44 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +147 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/colors.d.ts +77 -7
  8. package/dist/colors.d.ts.map +1 -1
  9. package/dist/colors.js +238 -39
  10. package/dist/colors.js.map +1 -1
  11. package/dist/components/Box.d.ts +6 -0
  12. package/dist/components/Box.d.ts.map +1 -1
  13. package/dist/components/Box.js +5 -0
  14. package/dist/components/Box.js.map +1 -1
  15. package/dist/components/Button.d.ts +12 -2
  16. package/dist/components/Button.d.ts.map +1 -1
  17. package/dist/components/Button.js +35 -24
  18. package/dist/components/Button.js.map +1 -1
  19. package/dist/components/Card.d.ts +24 -2
  20. package/dist/components/Card.d.ts.map +1 -1
  21. package/dist/components/Card.js +56 -14
  22. package/dist/components/Card.js.map +1 -1
  23. package/dist/components/Header.d.ts +11 -1
  24. package/dist/components/Header.d.ts.map +1 -1
  25. package/dist/components/Header.js +12 -8
  26. package/dist/components/Header.js.map +1 -1
  27. package/dist/components/Input.d.ts +10 -1
  28. package/dist/components/Input.d.ts.map +1 -1
  29. package/dist/components/Input.js +172 -41
  30. package/dist/components/Input.js.map +1 -1
  31. package/dist/components/Link.d.ts +21 -0
  32. package/dist/components/Link.d.ts.map +1 -0
  33. package/dist/components/Link.js +29 -0
  34. package/dist/components/Link.js.map +1 -0
  35. package/dist/components/Modal.d.ts +25 -0
  36. package/dist/components/Modal.d.ts.map +1 -1
  37. package/dist/components/Modal.js +83 -24
  38. package/dist/components/Modal.js.map +1 -1
  39. package/dist/components/Progress.d.ts +27 -0
  40. package/dist/components/Progress.d.ts.map +1 -0
  41. package/dist/components/Progress.js +39 -0
  42. package/dist/components/Progress.js.map +1 -0
  43. package/dist/components/Spinner.d.ts +19 -0
  44. package/dist/components/Spinner.d.ts.map +1 -0
  45. package/dist/components/Spinner.js +27 -0
  46. package/dist/components/Spinner.js.map +1 -0
  47. package/dist/components/index.d.ts +3 -0
  48. package/dist/components/index.d.ts.map +1 -1
  49. package/dist/components/index.js +3 -0
  50. package/dist/components/index.js.map +1 -1
  51. package/dist/data/nf-glyphs.d.ts +11 -0
  52. package/dist/data/nf-glyphs.d.ts.map +1 -0
  53. package/dist/data/nf-glyphs.js +535 -0
  54. package/dist/data/nf-glyphs.js.map +1 -0
  55. package/dist/data/nf-names.d.ts +8 -0
  56. package/dist/data/nf-names.d.ts.map +1 -0
  57. package/dist/data/nf-names.js +2 -0
  58. package/dist/data/nf-names.js.map +1 -0
  59. package/dist/demo-registry.d.ts +27 -0
  60. package/dist/demo-registry.d.ts.map +1 -0
  61. package/dist/demo-registry.js +57 -0
  62. package/dist/demo-registry.js.map +1 -0
  63. package/dist/demos/2048.ts +743 -0
  64. package/dist/demos/animation.ts +246 -0
  65. package/dist/demos/demo-layout.ts +124 -0
  66. package/dist/demos/engine.ts +374 -0
  67. package/dist/demos/interaction.ts +91 -0
  68. package/dist/demos/login.ts +203 -0
  69. package/dist/demos/mission-control.ts +558 -0
  70. package/dist/demos/showcase.ts +224 -0
  71. package/dist/detect.d.ts +92 -3
  72. package/dist/detect.d.ts.map +1 -1
  73. package/dist/detect.js +218 -40
  74. package/dist/detect.js.map +1 -1
  75. package/dist/diagnostics.d.ts +73 -0
  76. package/dist/diagnostics.d.ts.map +1 -0
  77. package/dist/diagnostics.js +225 -0
  78. package/dist/diagnostics.js.map +1 -0
  79. package/dist/dsl/context.d.ts +11 -0
  80. package/dist/dsl/context.d.ts.map +1 -0
  81. package/dist/dsl/context.js +563 -0
  82. package/dist/dsl/context.js.map +1 -0
  83. package/dist/dsl/hooks.d.ts +12 -0
  84. package/dist/dsl/hooks.d.ts.map +1 -0
  85. package/dist/dsl/hooks.js +148 -0
  86. package/dist/dsl/hooks.js.map +1 -0
  87. package/dist/dsl/interaction.d.ts +16 -0
  88. package/dist/dsl/interaction.d.ts.map +1 -0
  89. package/dist/dsl/interaction.js +101 -0
  90. package/dist/dsl/interaction.js.map +1 -0
  91. package/dist/dsl/layers.d.ts +14 -0
  92. package/dist/dsl/layers.d.ts.map +1 -0
  93. package/dist/dsl/layers.js +87 -0
  94. package/dist/dsl/layers.js.map +1 -0
  95. package/dist/dsl/motion.d.ts +10 -0
  96. package/dist/dsl/motion.d.ts.map +1 -0
  97. package/dist/dsl/motion.js +150 -0
  98. package/dist/dsl/motion.js.map +1 -0
  99. package/dist/dsl/render.d.ts +22 -0
  100. package/dist/dsl/render.d.ts.map +1 -0
  101. package/dist/dsl/render.js +69 -0
  102. package/dist/dsl/render.js.map +1 -0
  103. package/dist/dsl/types.d.ts +510 -0
  104. package/dist/dsl/types.d.ts.map +1 -0
  105. package/dist/dsl/types.js +33 -0
  106. package/dist/dsl/types.js.map +1 -0
  107. package/dist/dsl.d.ts +13 -154
  108. package/dist/dsl.d.ts.map +1 -1
  109. package/dist/dsl.js +12 -658
  110. package/dist/dsl.js.map +1 -1
  111. package/dist/easing.d.ts +41 -1
  112. package/dist/easing.d.ts.map +1 -1
  113. package/dist/easing.js +105 -2
  114. package/dist/easing.js.map +1 -1
  115. package/dist/geometry.d.ts +39 -0
  116. package/dist/geometry.d.ts.map +1 -1
  117. package/dist/geometry.js +20 -0
  118. package/dist/geometry.js.map +1 -1
  119. package/dist/icons-full.d.ts +5 -0
  120. package/dist/icons-full.d.ts.map +1 -0
  121. package/dist/icons-full.js +31 -0
  122. package/dist/icons-full.js.map +1 -0
  123. package/dist/icons.d.ts +426 -5
  124. package/dist/icons.d.ts.map +1 -1
  125. package/dist/icons.js +144 -15
  126. package/dist/icons.js.map +1 -1
  127. package/dist/index.d.ts +93 -22
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +17 -7
  130. package/dist/index.js.map +1 -1
  131. package/dist/input.d.ts +177 -0
  132. package/dist/input.d.ts.map +1 -0
  133. package/dist/input.js +533 -0
  134. package/dist/input.js.map +1 -0
  135. package/dist/layout.d.ts +111 -6
  136. package/dist/layout.d.ts.map +1 -1
  137. package/dist/layout.js +163 -23
  138. package/dist/layout.js.map +1 -1
  139. package/dist/render.d.ts +33 -1
  140. package/dist/render.d.ts.map +1 -1
  141. package/dist/render.js +431 -116
  142. package/dist/render.js.map +1 -1
  143. package/dist/state.d.ts +137 -3
  144. package/dist/state.d.ts.map +1 -1
  145. package/dist/state.js +25 -0
  146. package/dist/state.js.map +1 -1
  147. package/dist/theme.d.ts +129 -0
  148. package/dist/theme.d.ts.map +1 -0
  149. package/dist/theme.js +167 -0
  150. package/dist/theme.js.map +1 -0
  151. package/dist/themes/catppuccin-mocha.d.ts +19 -0
  152. package/dist/themes/catppuccin-mocha.d.ts.map +1 -0
  153. package/dist/themes/catppuccin-mocha.js +36 -0
  154. package/dist/themes/catppuccin-mocha.js.map +1 -0
  155. package/dist/themes/dracula.d.ts +21 -0
  156. package/dist/themes/dracula.d.ts.map +1 -0
  157. package/dist/themes/dracula.js +37 -0
  158. package/dist/themes/dracula.js.map +1 -0
  159. package/dist/themes/github-light.d.ts +21 -0
  160. package/dist/themes/github-light.d.ts.map +1 -0
  161. package/dist/themes/github-light.js +36 -0
  162. package/dist/themes/github-light.js.map +1 -0
  163. package/dist/themes/index.d.ts +19 -0
  164. package/dist/themes/index.d.ts.map +1 -0
  165. package/dist/themes/index.js +17 -0
  166. package/dist/themes/index.js.map +1 -0
  167. package/dist/themes/nord.d.ts +23 -0
  168. package/dist/themes/nord.d.ts.map +1 -0
  169. package/dist/themes/nord.js +38 -0
  170. package/dist/themes/nord.js.map +1 -0
  171. package/dist/themes/one-dark-pro.d.ts +21 -0
  172. package/dist/themes/one-dark-pro.d.ts.map +1 -0
  173. package/dist/themes/one-dark-pro.js +36 -0
  174. package/dist/themes/one-dark-pro.js.map +1 -0
  175. package/dist/themes/tokyo-night.d.ts +20 -0
  176. package/dist/themes/tokyo-night.d.ts.map +1 -0
  177. package/dist/themes/tokyo-night.js +37 -0
  178. package/dist/themes/tokyo-night.js.map +1 -0
  179. package/dist/utils.d.ts +1 -0
  180. package/dist/utils.d.ts.map +1 -1
  181. package/dist/utils.js +1 -0
  182. package/dist/utils.js.map +1 -1
  183. package/dist/vendor/colors.d.ts +45 -0
  184. package/dist/vendor/colors.d.ts.map +1 -0
  185. package/dist/vendor/colors.js +72 -0
  186. package/dist/vendor/colors.js.map +1 -0
  187. package/llms.txt +79 -0
  188. package/package.json +23 -7
  189. package/dist/data/glyphs.d.ts +0 -5
  190. package/dist/data/glyphs.d.ts.map +0 -1
  191. package/dist/data/glyphs.js +0 -29
  192. package/dist/data/glyphs.js.map +0 -1
package/dist/input.js ADDED
@@ -0,0 +1,533 @@
1
+ /**
2
+ * Bunti Input Tokenizer & Key Event Model
3
+ *
4
+ * A stateful tokenizer that turns raw stdin chunks into discrete input
5
+ * tokens. It handles the realities of terminal input that a naive
6
+ * chunk-per-key parser gets wrong:
7
+ *
8
+ * - Escape sequences split across stdin chunks (the tail is carried until
9
+ * the sequence completes or the ESC-disambiguation timeout fires).
10
+ * - Multiple key/mouse events packed into a single chunk (each one becomes
11
+ * its own token, including every SGR mouse event in the chunk).
12
+ * - CSI modifier parameters (xterm encoding: 2=shift 3=alt 5=ctrl ...),
13
+ * SS3 sequences, navigation keys, ctrl bytes (\x01-\x1a), and
14
+ * alt-prefixed ESC+char.
15
+ * - Terminal RESPONSES (cursor position reports, DA1/DA2, DECRQM, DCS
16
+ * replies like XTVERSION) are routed to a separate response channel and
17
+ * never enter the key stream — capability-detection probes depend on this.
18
+ * - Printable text is segmented per grapheme (Intl.Segmenter), so emoji
19
+ * arrive as whole key events.
20
+ *
21
+ * The KeyEvent shape below is FROZEN for launch. Post-launch protocol work
22
+ * (kitty keyboard protocol, bracketed paste) must slot into this shape
23
+ * without breaking it:
24
+ * - `kind: 'release'` is currently only synthesized by the HeldKeyTracker
25
+ * when a held key's repeat stream expires (legacy terminals never report
26
+ * releases). The kitty protocol will later produce real release events.
27
+ * - `kind: 'repeat'` is classified by the HeldKeyTracker heuristic, not by
28
+ * the terminal.
29
+ */
30
+ const ESC = '\x1b';
31
+ const ST = '\x1b\\'; // String Terminator
32
+ const BEL = '\x07';
33
+ /** Creates a KeyEvent with press semantics and explicit defaults. */
34
+ export function createKeyEvent(key, raw = key, mods = {}) {
35
+ return {
36
+ key,
37
+ kind: mods.kind ?? 'press',
38
+ ctrl: mods.ctrl ?? false,
39
+ alt: mods.alt ?? false,
40
+ shift: mods.shift ?? false,
41
+ raw,
42
+ };
43
+ }
44
+ /** xterm modifier parameter decoding: value - 1 is a bitfield. */
45
+ function decodeModifierParam(code) {
46
+ const bits = Number.isFinite(code) && code > 0 ? code - 1 : 0;
47
+ return {
48
+ shift: (bits & 1) !== 0,
49
+ alt: (bits & 2) !== 0,
50
+ ctrl: (bits & 4) !== 0,
51
+ };
52
+ }
53
+ /** CSI final byte -> key name (arrow/home/end). */
54
+ const CSI_FINAL_KEYS = {
55
+ A: 'up',
56
+ B: 'down',
57
+ C: 'right',
58
+ D: 'left',
59
+ H: 'home',
60
+ F: 'end',
61
+ };
62
+ /** CSI <code> ~ key names. */
63
+ const CSI_TILDE_KEYS = {
64
+ 1: 'home',
65
+ 2: 'insert',
66
+ 3: 'delete',
67
+ 4: 'end',
68
+ 5: 'pageup',
69
+ 6: 'pagedown',
70
+ 7: 'home',
71
+ 8: 'end',
72
+ 11: 'f1',
73
+ 12: 'f2',
74
+ 13: 'f3',
75
+ 14: 'f4',
76
+ 15: 'f5',
77
+ 17: 'f6',
78
+ 18: 'f7',
79
+ 19: 'f8',
80
+ 20: 'f9',
81
+ 21: 'f10',
82
+ 23: 'f11',
83
+ 24: 'f12',
84
+ };
85
+ /** SS3 (ESC O <char>) key names. */
86
+ const SS3_KEYS = {
87
+ A: 'up',
88
+ B: 'down',
89
+ C: 'right',
90
+ D: 'left',
91
+ H: 'home',
92
+ F: 'end',
93
+ P: 'f1',
94
+ Q: 'f2',
95
+ R: 'f3',
96
+ S: 'f4',
97
+ };
98
+ /**
99
+ * Normalizes a single control character to a key name.
100
+ * Returns null for bytes we deliberately drop (\x00, \x1c-\x1f).
101
+ */
102
+ function normalizeControlChar(ch) {
103
+ switch (ch) {
104
+ case '\r':
105
+ case '\n':
106
+ return { key: 'enter', ctrl: false };
107
+ case '\t':
108
+ return { key: 'tab', ctrl: false };
109
+ case '\x7f':
110
+ case '\x08':
111
+ return { key: 'backspace', ctrl: false };
112
+ case ESC:
113
+ return { key: 'escape', ctrl: false };
114
+ default: {
115
+ const code = ch.charCodeAt(0);
116
+ // \x01-\x1a -> ctrl+a .. ctrl+z (\x03 = ctrl+c stays a key event here;
117
+ // the render layer maps it to stop/SIGINT behavior).
118
+ if (code >= 0x01 && code <= 0x1a) {
119
+ return { key: String.fromCharCode(code + 96), ctrl: true };
120
+ }
121
+ return null;
122
+ }
123
+ }
124
+ }
125
+ // Precompiled ASCII fast path: printable ASCII never needs the grapheme
126
+ // segmenter (matches the draw hot path convention in layout/utils).
127
+ const ASCII_PRINTABLE_RE = /^[\x20-\x7e]*$/;
128
+ let segmenter;
129
+ /** Splits printable text into graphemes; emoji/ZWJ clusters stay whole. */
130
+ function splitGraphemes(text) {
131
+ if (text.length === 1 || ASCII_PRINTABLE_RE.test(text)) {
132
+ return text.split('');
133
+ }
134
+ segmenter ??= new Intl.Segmenter(undefined, { granularity: 'grapheme' });
135
+ const out = [];
136
+ for (const part of segmenter.segment(text))
137
+ out.push(part.segment);
138
+ return out;
139
+ }
140
+ /** Classifies a pending DCS/OSC fragment flushed by the timer. */
141
+ function responseFromPending(raw) {
142
+ if (raw.startsWith('\x1bP>|'))
143
+ return { kind: 'terminal-version', raw };
144
+ if (raw.startsWith('\x1bP'))
145
+ return { kind: 'unknown', raw };
146
+ return { kind: 'osc', raw };
147
+ }
148
+ /** Hard cap for the carried partial-sequence buffer. */
149
+ const MAX_PENDING = 4096;
150
+ /**
151
+ * Stateful input tokenizer. Feed it stdin chunks via push(); it returns the
152
+ * tokens completed by that chunk and carries any trailing partial escape
153
+ * sequence into the next call. A bare ESC (or unfinished sequence) is only
154
+ * flushed as the 'escape' key after `escTimeoutMs` with no follow-up bytes
155
+ * (tokens produced that way arrive via `onFlush`).
156
+ */
157
+ export class InputTokenizer {
158
+ options;
159
+ pending = '';
160
+ timer = null;
161
+ onFlush;
162
+ constructor(options = {}) {
163
+ this.options = options;
164
+ this.onFlush = options.onFlush;
165
+ }
166
+ /** Parses a chunk. Returns completed tokens; partial tails are carried. */
167
+ push(chunk) {
168
+ this.cancelTimer();
169
+ const buffer = this.pending + chunk;
170
+ this.pending = '';
171
+ const tokens = [];
172
+ this.parse(buffer, tokens);
173
+ if (this.pending.length > MAX_PENDING) {
174
+ tokens.push(...this.flushPending());
175
+ }
176
+ else if (this.pending) {
177
+ this.scheduleTimer();
178
+ }
179
+ return tokens;
180
+ }
181
+ /** True if a partial sequence is being carried. */
182
+ hasPending() {
183
+ return this.pending.length > 0;
184
+ }
185
+ /**
186
+ * Force-resolves the carried partial sequence (what the ESC timer does):
187
+ * a bare ESC becomes the 'escape' key; a partial DCS/OSC becomes a
188
+ * response; anything else becomes 'escape' plus its remainder as text.
189
+ */
190
+ flushPending() {
191
+ this.cancelTimer();
192
+ if (!this.pending)
193
+ return [];
194
+ const pending = this.pending;
195
+ this.pending = '';
196
+ const tokens = [];
197
+ if (pending.startsWith('\x1bP') || pending.startsWith('\x1b]')) {
198
+ tokens.push({ type: 'response', response: responseFromPending(pending) });
199
+ return tokens;
200
+ }
201
+ tokens.push({ type: 'key', event: createKeyEvent('escape', ESC) });
202
+ if (pending.length > 1) {
203
+ // The remainder of a carried partial never contains another ESC.
204
+ this.tokenizeText(pending.slice(1), tokens);
205
+ }
206
+ return tokens;
207
+ }
208
+ /** Cancels the ESC-disambiguation timer (loop teardown). */
209
+ dispose() {
210
+ this.cancelTimer();
211
+ }
212
+ scheduleTimer() {
213
+ const schedule = this.options.schedule ??
214
+ ((callback, ms) => setTimeout(callback, ms));
215
+ this.timer = schedule(() => {
216
+ this.timer = null;
217
+ const tokens = this.flushPending();
218
+ if (tokens.length > 0)
219
+ this.onFlush?.(tokens);
220
+ }, this.options.escTimeoutMs ?? 30);
221
+ }
222
+ cancelTimer() {
223
+ if (this.timer === null)
224
+ return;
225
+ const cancel = this.options.cancel ??
226
+ ((handle) => clearTimeout(handle));
227
+ cancel(this.timer);
228
+ this.timer = null;
229
+ }
230
+ parse(buffer, tokens) {
231
+ const len = buffer.length;
232
+ let i = 0;
233
+ let textStart = -1;
234
+ const flushText = (end) => {
235
+ if (textStart !== -1 && end > textStart) {
236
+ this.tokenizeText(buffer.slice(textStart, end), tokens);
237
+ }
238
+ textStart = -1;
239
+ };
240
+ while (i < len) {
241
+ if (buffer[i] !== ESC) {
242
+ if (textStart === -1)
243
+ textStart = i;
244
+ i++;
245
+ continue;
246
+ }
247
+ flushText(i);
248
+ const consumed = this.parseEscape(buffer, i, tokens);
249
+ if (consumed === -1) {
250
+ // Incomplete sequence: carry the tail into the next chunk.
251
+ this.pending = buffer.slice(i);
252
+ return;
253
+ }
254
+ i += consumed;
255
+ }
256
+ flushText(len);
257
+ }
258
+ /**
259
+ * Parses one escape sequence starting at buffer[i] (=== ESC).
260
+ * Returns the number of chars consumed, or -1 if incomplete.
261
+ */
262
+ parseEscape(buffer, i, tokens) {
263
+ const len = buffer.length;
264
+ if (i + 1 >= len)
265
+ return -1; // bare ESC at end of chunk
266
+ const next = buffer[i + 1];
267
+ if (next === '[')
268
+ return this.parseCsi(buffer, i, tokens);
269
+ if (next === 'O') {
270
+ // SS3
271
+ if (i + 2 >= len)
272
+ return -1;
273
+ const key = SS3_KEYS[buffer[i + 2]];
274
+ if (key) {
275
+ tokens.push({
276
+ type: 'key',
277
+ event: createKeyEvent(key, buffer.slice(i, i + 3)),
278
+ });
279
+ }
280
+ return 3;
281
+ }
282
+ if (next === 'P') {
283
+ // DCS ... ST (e.g. XTVERSION reply ESC P > | ... ST)
284
+ const end = buffer.indexOf(ST, i + 2);
285
+ if (end === -1)
286
+ return -1;
287
+ const raw = buffer.slice(i, end + ST.length);
288
+ tokens.push({ type: 'response', response: responseFromPending(raw) });
289
+ return raw.length;
290
+ }
291
+ if (next === ']') {
292
+ // OSC ... (BEL | ST) — color query replies etc.
293
+ const bel = buffer.indexOf(BEL, i + 2);
294
+ const st = buffer.indexOf(ST, i + 2);
295
+ let end = -1;
296
+ let termLen = 0;
297
+ if (bel !== -1 && (st === -1 || bel < st)) {
298
+ end = bel;
299
+ termLen = 1;
300
+ }
301
+ else if (st !== -1) {
302
+ end = st;
303
+ termLen = ST.length;
304
+ }
305
+ if (end === -1)
306
+ return -1;
307
+ const raw = buffer.slice(i, end + termLen);
308
+ tokens.push({ type: 'response', response: { kind: 'osc', raw } });
309
+ return raw.length;
310
+ }
311
+ if (next === ESC) {
312
+ // ESC ESC: the first is a standalone escape press.
313
+ tokens.push({ type: 'key', event: createKeyEvent('escape', ESC) });
314
+ return 1;
315
+ }
316
+ // Alt-prefixed key: ESC + char.
317
+ const codePoint = buffer.codePointAt(i + 1);
318
+ const ch = String.fromCodePoint(codePoint);
319
+ if (codePoint < 0x20 || codePoint === 0x7f) {
320
+ const normalized = normalizeControlChar(ch);
321
+ if (normalized) {
322
+ tokens.push({
323
+ type: 'key',
324
+ event: createKeyEvent(normalized.key, buffer.slice(i, i + 2), {
325
+ ctrl: normalized.ctrl,
326
+ alt: true,
327
+ }),
328
+ });
329
+ }
330
+ return 2;
331
+ }
332
+ tokens.push({
333
+ type: 'key',
334
+ event: createKeyEvent(ch, ESC + ch, { alt: true }),
335
+ });
336
+ return 1 + ch.length;
337
+ }
338
+ /**
339
+ * Parses a CSI sequence starting at buffer[i] (=== ESC, buffer[i+1] === '[').
340
+ * Returns chars consumed or -1 if the final byte hasn't arrived yet.
341
+ */
342
+ parseCsi(buffer, i, tokens) {
343
+ const len = buffer.length;
344
+ let j = i + 2;
345
+ while (j < len) {
346
+ const code = buffer.charCodeAt(j);
347
+ if (code >= 0x40 && code <= 0x7e)
348
+ break; // final byte
349
+ if (code < 0x20 || code > 0x3f) {
350
+ // Malformed sequence (e.g. a stray ESC): drop what we consumed.
351
+ return j - i;
352
+ }
353
+ j++;
354
+ }
355
+ if (j >= len)
356
+ return -1;
357
+ const final = buffer[j];
358
+ const params = buffer.slice(i + 2, j);
359
+ const raw = buffer.slice(i, j + 1);
360
+ const consumed = raw.length;
361
+ // SGR mouse: CSI < b ; x ; y (M|m)
362
+ if ((final === 'M' || final === 'm') && params.startsWith('<')) {
363
+ const parts = params.slice(1).split(';');
364
+ const button = Number.parseInt(parts[0] ?? '', 10);
365
+ const x = Number.parseInt(parts[1] ?? '', 10);
366
+ const y = Number.parseInt(parts[2] ?? '', 10);
367
+ if (Number.isFinite(button) && Number.isFinite(x) && Number.isFinite(y)) {
368
+ tokens.push({
369
+ type: 'mouse',
370
+ button,
371
+ x,
372
+ y,
373
+ action: final === 'M' ? 'press' : 'release',
374
+ raw,
375
+ });
376
+ }
377
+ return consumed;
378
+ }
379
+ // Terminal responses — routed to the response channel, never keys.
380
+ if (final === 'R') {
381
+ // Cursor position report: CSI <row> ; <col> R
382
+ const parts = params.split(';');
383
+ const row = Number.parseInt(parts[0] ?? '', 10);
384
+ const col = Number.parseInt(parts[1] ?? '', 10);
385
+ const response = { kind: 'cursor-position', raw };
386
+ if (Number.isFinite(row))
387
+ response.row = row;
388
+ if (Number.isFinite(col))
389
+ response.col = col;
390
+ tokens.push({ type: 'response', response });
391
+ return consumed;
392
+ }
393
+ if (final === 'c' && (params.startsWith('?') || params.startsWith('>'))) {
394
+ tokens.push({
395
+ type: 'response',
396
+ response: {
397
+ kind: params.startsWith('?')
398
+ ? 'device-attributes'
399
+ : 'device-attributes-secondary',
400
+ raw,
401
+ },
402
+ });
403
+ return consumed;
404
+ }
405
+ if (final === 'y' && params.endsWith('$')) {
406
+ tokens.push({ type: 'response', response: { kind: 'mode-report', raw } });
407
+ return consumed;
408
+ }
409
+ // Focus tracking
410
+ if (final === 'I' && params === '') {
411
+ tokens.push({ type: 'focus', focused: true, raw });
412
+ return consumed;
413
+ }
414
+ if (final === 'O' && params === '') {
415
+ tokens.push({ type: 'focus', focused: false, raw });
416
+ return consumed;
417
+ }
418
+ // Shift+Tab
419
+ if (final === 'Z') {
420
+ tokens.push({
421
+ type: 'key',
422
+ event: createKeyEvent('tab', raw, { shift: true }),
423
+ });
424
+ return consumed;
425
+ }
426
+ const parts = params.split(';');
427
+ const modParam = Number.parseInt(parts[1] ?? '1', 10);
428
+ const mods = decodeModifierParam(modParam);
429
+ // CSI <code> [; <mod>] ~ navigation / function keys
430
+ if (final === '~') {
431
+ const code = Number.parseInt(parts[0] ?? '', 10);
432
+ const key = CSI_TILDE_KEYS[code];
433
+ if (key)
434
+ tokens.push({ type: 'key', event: createKeyEvent(key, raw, mods) });
435
+ return consumed;
436
+ }
437
+ // CSI [1 ; <mod>] (A|B|C|D|H|F) arrows / home / end
438
+ const key = CSI_FINAL_KEYS[final];
439
+ if (key) {
440
+ tokens.push({ type: 'key', event: createKeyEvent(key, raw, mods) });
441
+ return consumed;
442
+ }
443
+ // Unknown CSI sequences are consumed and dropped.
444
+ return consumed;
445
+ }
446
+ /** Tokenizes a run of non-ESC text: control bytes + printable graphemes. */
447
+ tokenizeText(text, tokens) {
448
+ const len = text.length;
449
+ let i = 0;
450
+ while (i < len) {
451
+ const code = text.charCodeAt(i);
452
+ if (code < 0x20 || code === 0x7f) {
453
+ const normalized = normalizeControlChar(text[i]);
454
+ if (normalized) {
455
+ tokens.push({
456
+ type: 'key',
457
+ event: createKeyEvent(normalized.key, text[i], {
458
+ ctrl: normalized.ctrl,
459
+ }),
460
+ });
461
+ }
462
+ i++;
463
+ continue;
464
+ }
465
+ let j = i + 1;
466
+ while (j < len) {
467
+ const c = text.charCodeAt(j);
468
+ if (c < 0x20 || c === 0x7f)
469
+ break;
470
+ j++;
471
+ }
472
+ for (const grapheme of splitGraphemes(text.slice(i, j))) {
473
+ tokens.push({ type: 'key', event: createKeyEvent(grapheme) });
474
+ }
475
+ i = j;
476
+ }
477
+ }
478
+ }
479
+ /**
480
+ * Held-key heuristic for legacy terminals (which report no key releases):
481
+ * a key is "held" from its first press until no repeat arrives within the
482
+ * hold window. On expiry a synthetic kind:'release' KeyEvent is emitted.
483
+ * Good enough for platformer-style movement pre-kitty-protocol.
484
+ */
485
+ export class HeldKeyTracker {
486
+ options;
487
+ held = new Map();
488
+ constructor(options = {}) {
489
+ this.options = options;
490
+ }
491
+ get window() {
492
+ return this.options.holdWindowMs ?? 150;
493
+ }
494
+ now() {
495
+ return (this.options.now ?? Date.now)();
496
+ }
497
+ /**
498
+ * Records a press-stream event and classifies it: a key seen again within
499
+ * the hold window becomes kind:'repeat'. Release events pass through.
500
+ */
501
+ record(event) {
502
+ if (event.kind === 'release')
503
+ return event;
504
+ const now = this.now();
505
+ const lastSeen = this.held.get(event.key);
506
+ const kind = lastSeen !== undefined && now - lastSeen <= this.window
507
+ ? 'repeat'
508
+ : 'press';
509
+ this.held.set(event.key, now);
510
+ return event.kind === kind ? event : { ...event, kind };
511
+ }
512
+ /** True while the key's repeat stream is inside the hold window. */
513
+ isHeld(key) {
514
+ const lastSeen = this.held.get(key);
515
+ return lastSeen !== undefined && this.now() - lastSeen <= this.window;
516
+ }
517
+ /**
518
+ * Expires held keys whose repeat stream went silent and synthesizes a
519
+ * kind:'release' KeyEvent for each (raw '' — there were no real bytes).
520
+ */
521
+ collectReleases() {
522
+ const now = this.now();
523
+ const releases = [];
524
+ for (const [key, lastSeen] of this.held) {
525
+ if (now - lastSeen > this.window) {
526
+ this.held.delete(key);
527
+ releases.push(createKeyEvent(key, '', { kind: 'release' }));
528
+ }
529
+ }
530
+ return releases;
531
+ }
532
+ }
533
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}