anti-trace 0.1.0 → 0.1.4
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/README.en.md +129 -154
- package/README.md +129 -153
- package/byok.providers.example.json +81 -81
- package/dist/harness/compaction.js +88 -88
- package/dist/harness/prompt.js +16 -16
- package/dist/harness/tools/powershell.js +11 -11
- package/package.json +68 -66
- package/dist/cli/input/stash/cli-prompt.d.ts +0 -28
- package/dist/cli/input/stash/cli-prompt.js +0 -289
- package/dist/cli/input/stash/cli-prompt.js.map +0 -1
- package/dist/cli/input/stash/cli-renderer.d.ts +0 -24
- package/dist/cli/input/stash/cli-renderer.js +0 -221
- package/dist/cli/input/stash/cli-renderer.js.map +0 -1
- package/dist/cli/input/stash/draft.d.ts +0 -40
- package/dist/cli/input/stash/draft.js +0 -278
- package/dist/cli/input/stash/draft.js.map +0 -1
- package/dist/cli/input/stash/paste-burst.d.ts +0 -39
- package/dist/cli/input/stash/paste-burst.js +0 -120
- package/dist/cli/input/stash/paste-burst.js.map +0 -1
- package/dist/cli/input/stash/terminal.d.ts +0 -62
- package/dist/cli/input/stash/terminal.js +0 -353
- package/dist/cli/input/stash/terminal.js.map +0 -1
- package/dist/cli/utils/image.d.ts +0 -15
- package/dist/cli/utils/image.js +0 -175
- package/dist/cli/utils/image.js.map +0 -1
- package/dist/tui/permissions/permission-policy.d.ts +0 -42
- package/dist/tui/permissions/permission-policy.js +0 -144
- package/dist/tui/permissions/permission-policy.js.map +0 -1
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A terminal-independent editable prompt. Input decoders decide whether bytes are
|
|
3
|
-
* typing, paste, or a key; renderers only read this state. Neither can submit the
|
|
4
|
-
* draft accidentally: submission happens only through submit().
|
|
5
|
-
*
|
|
6
|
-
* `cursor` is a UTF-16 offset into `text`. It is always on a grapheme boundary,
|
|
7
|
-
* so callers can use it with String.slice without splitting an emoji or accent.
|
|
8
|
-
*/
|
|
9
|
-
const graphemes = new Intl.Segmenter(undefined, { granularity: "grapheme" });
|
|
10
|
-
function normalizeNewlines(value) {
|
|
11
|
-
return value.replace(/\r\n?/g, "\n");
|
|
12
|
-
}
|
|
13
|
-
function boundaries(value) {
|
|
14
|
-
const result = [0];
|
|
15
|
-
for (const part of graphemes.segment(value)) {
|
|
16
|
-
result.push(part.index + part.segment.length);
|
|
17
|
-
}
|
|
18
|
-
return result;
|
|
19
|
-
}
|
|
20
|
-
function lowerBound(points, offset) {
|
|
21
|
-
let left = 0;
|
|
22
|
-
let right = points.length;
|
|
23
|
-
while (left < right) {
|
|
24
|
-
const middle = (left + right) >>> 1;
|
|
25
|
-
if (points[middle] < offset) {
|
|
26
|
-
left = middle + 1;
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
right = middle;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return left;
|
|
33
|
-
}
|
|
34
|
-
function upperBound(points, offset) {
|
|
35
|
-
let left = 0;
|
|
36
|
-
let right = points.length;
|
|
37
|
-
while (left < right) {
|
|
38
|
-
const middle = (left + right) >>> 1;
|
|
39
|
-
if (points[middle] <= offset) {
|
|
40
|
-
left = middle + 1;
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
right = middle;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return left;
|
|
47
|
-
}
|
|
48
|
-
function offsetForColumn(line, column) {
|
|
49
|
-
const points = boundaries(line);
|
|
50
|
-
return points[Math.min(column, points.length - 1)];
|
|
51
|
-
}
|
|
52
|
-
export class DraftEditor {
|
|
53
|
-
#text = "";
|
|
54
|
-
#cursor = 0;
|
|
55
|
-
#preferredColumn;
|
|
56
|
-
#history = [];
|
|
57
|
-
#historyIndex;
|
|
58
|
-
#historyScratch = "";
|
|
59
|
-
#boundaries;
|
|
60
|
-
#newlines;
|
|
61
|
-
constructor(initialText = "") {
|
|
62
|
-
this.setText(initialText);
|
|
63
|
-
}
|
|
64
|
-
get text() {
|
|
65
|
-
return this.#text;
|
|
66
|
-
}
|
|
67
|
-
/** UTF-16 offset into text, guaranteed to be a grapheme boundary. */
|
|
68
|
-
get cursor() {
|
|
69
|
-
return this.#cursor;
|
|
70
|
-
}
|
|
71
|
-
/** Zero-based logical line and grapheme column. Screen wrapping is renderer-owned. */
|
|
72
|
-
get position() {
|
|
73
|
-
const row = lowerBound(this.#newlineOffsets(), this.#cursor);
|
|
74
|
-
const start = this.#lineStart();
|
|
75
|
-
const points = this.#graphemeBoundaries();
|
|
76
|
-
return { row, column: lowerBound(points, this.#cursor) - lowerBound(points, start) };
|
|
77
|
-
}
|
|
78
|
-
setText(value) {
|
|
79
|
-
this.#text = normalizeNewlines(value);
|
|
80
|
-
this.#invalidateIndexes();
|
|
81
|
-
this.#cursor = this.#text.length;
|
|
82
|
-
this.#preferredColumn = undefined;
|
|
83
|
-
this.#historyIndex = undefined;
|
|
84
|
-
this.#historyScratch = "";
|
|
85
|
-
}
|
|
86
|
-
/** Clamp an arbitrary UTF-16 offset to the preceding grapheme boundary. */
|
|
87
|
-
setCursor(offset) {
|
|
88
|
-
const clamped = Math.max(0, Math.min(this.#text.length, Math.trunc(offset) || 0));
|
|
89
|
-
const points = this.#graphemeBoundaries();
|
|
90
|
-
this.#cursor = points[upperBound(points, clamped) - 1];
|
|
91
|
-
this.#preferredColumn = undefined;
|
|
92
|
-
}
|
|
93
|
-
/** Insert typed or pasted content exactly, except for CRLF/CR normalization. */
|
|
94
|
-
insert(value) {
|
|
95
|
-
const content = normalizeNewlines(value);
|
|
96
|
-
if (content.length === 0) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
this.#detachHistory();
|
|
100
|
-
const insertedEnd = this.#cursor + content.length;
|
|
101
|
-
this.#text = this.#text.slice(0, this.#cursor) + content + this.#text.slice(this.#cursor);
|
|
102
|
-
this.#invalidateIndexes();
|
|
103
|
-
const points = this.#graphemeBoundaries();
|
|
104
|
-
this.#cursor = points[lowerBound(points, insertedEnd)];
|
|
105
|
-
this.#preferredColumn = undefined;
|
|
106
|
-
}
|
|
107
|
-
newline() {
|
|
108
|
-
this.insert("\n");
|
|
109
|
-
}
|
|
110
|
-
backspace() {
|
|
111
|
-
if (this.#cursor === 0) {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
this.#detachHistory();
|
|
115
|
-
const points = this.#graphemeBoundaries();
|
|
116
|
-
const start = points[lowerBound(points, this.#cursor) - 1];
|
|
117
|
-
this.#text = this.#text.slice(0, start) + this.#text.slice(this.#cursor);
|
|
118
|
-
this.#invalidateIndexes();
|
|
119
|
-
const newPoints = this.#graphemeBoundaries();
|
|
120
|
-
this.#cursor = newPoints[upperBound(newPoints, start) - 1];
|
|
121
|
-
this.#preferredColumn = undefined;
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
deleteForward() {
|
|
125
|
-
if (this.#cursor === this.#text.length) {
|
|
126
|
-
return false;
|
|
127
|
-
}
|
|
128
|
-
this.#detachHistory();
|
|
129
|
-
const points = this.#graphemeBoundaries();
|
|
130
|
-
const end = points[upperBound(points, this.#cursor)];
|
|
131
|
-
this.#text = this.#text.slice(0, this.#cursor) + this.#text.slice(end);
|
|
132
|
-
this.#invalidateIndexes();
|
|
133
|
-
const newPoints = this.#graphemeBoundaries();
|
|
134
|
-
this.#cursor = newPoints[upperBound(newPoints, this.#cursor) - 1];
|
|
135
|
-
this.#preferredColumn = undefined;
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
moveLeft() {
|
|
139
|
-
if (this.#cursor === 0) {
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
const points = this.#graphemeBoundaries();
|
|
143
|
-
this.#cursor = points[lowerBound(points, this.#cursor) - 1];
|
|
144
|
-
this.#preferredColumn = undefined;
|
|
145
|
-
return true;
|
|
146
|
-
}
|
|
147
|
-
moveRight() {
|
|
148
|
-
if (this.#cursor === this.#text.length) {
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
const points = this.#graphemeBoundaries();
|
|
152
|
-
this.#cursor = points[upperBound(points, this.#cursor)];
|
|
153
|
-
this.#preferredColumn = undefined;
|
|
154
|
-
return true;
|
|
155
|
-
}
|
|
156
|
-
moveHome() {
|
|
157
|
-
const start = this.#lineStart();
|
|
158
|
-
this.#preferredColumn = undefined;
|
|
159
|
-
const changed = this.#cursor !== start;
|
|
160
|
-
this.#cursor = start;
|
|
161
|
-
return changed;
|
|
162
|
-
}
|
|
163
|
-
moveEnd() {
|
|
164
|
-
const end = this.#lineEnd();
|
|
165
|
-
this.#preferredColumn = undefined;
|
|
166
|
-
const changed = this.#cursor !== end;
|
|
167
|
-
this.#cursor = end;
|
|
168
|
-
return changed;
|
|
169
|
-
}
|
|
170
|
-
moveUp() {
|
|
171
|
-
const start = this.#lineStart();
|
|
172
|
-
if (start === 0) {
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
const column = this.#preferredColumn ?? this.position.column;
|
|
176
|
-
this.#preferredColumn = column;
|
|
177
|
-
const previousEnd = start - 1;
|
|
178
|
-
const newlines = this.#newlineOffsets();
|
|
179
|
-
const previousNewline = newlines[lowerBound(newlines, previousEnd) - 1];
|
|
180
|
-
const previousStart = previousNewline === undefined ? 0 : previousNewline + 1;
|
|
181
|
-
const line = this.#text.slice(previousStart, previousEnd);
|
|
182
|
-
this.#cursor = previousStart + offsetForColumn(line, column);
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
moveDown() {
|
|
186
|
-
const end = this.#lineEnd();
|
|
187
|
-
if (end === this.#text.length) {
|
|
188
|
-
return false;
|
|
189
|
-
}
|
|
190
|
-
const column = this.#preferredColumn ?? this.position.column;
|
|
191
|
-
this.#preferredColumn = column;
|
|
192
|
-
const nextStart = end + 1;
|
|
193
|
-
const newlines = this.#newlineOffsets();
|
|
194
|
-
const nextEnd = newlines[lowerBound(newlines, nextStart)] ?? this.#text.length;
|
|
195
|
-
const line = this.#text.slice(nextStart, nextEnd);
|
|
196
|
-
this.#cursor = nextStart + offsetForColumn(line, column);
|
|
197
|
-
return true;
|
|
198
|
-
}
|
|
199
|
-
/** Return the untrimmed draft and clear it. Callers decide whether to send it. */
|
|
200
|
-
submit() {
|
|
201
|
-
const value = this.#text;
|
|
202
|
-
if (value.length > 0 && this.#history.at(-1) !== value) {
|
|
203
|
-
this.#history.push(value);
|
|
204
|
-
}
|
|
205
|
-
this.setText("");
|
|
206
|
-
return value;
|
|
207
|
-
}
|
|
208
|
-
/** Recall previous submitted text, preserving the current unsent draft. */
|
|
209
|
-
previousHistory() {
|
|
210
|
-
if (this.#history.length === 0) {
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
if (this.#historyIndex === undefined) {
|
|
214
|
-
this.#historyScratch = this.#text;
|
|
215
|
-
this.#historyIndex = this.#history.length - 1;
|
|
216
|
-
}
|
|
217
|
-
else if (this.#historyIndex > 0) {
|
|
218
|
-
this.#historyIndex -= 1;
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
this.#loadHistoryText(this.#history[this.#historyIndex]);
|
|
224
|
-
return true;
|
|
225
|
-
}
|
|
226
|
-
/** Move toward the unsent draft after browsing history. */
|
|
227
|
-
nextHistory() {
|
|
228
|
-
if (this.#historyIndex === undefined) {
|
|
229
|
-
return false;
|
|
230
|
-
}
|
|
231
|
-
if (this.#historyIndex === this.#history.length - 1) {
|
|
232
|
-
this.#loadHistoryText(this.#historyScratch);
|
|
233
|
-
this.#historyIndex = undefined;
|
|
234
|
-
this.#historyScratch = "";
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
this.#historyIndex += 1;
|
|
238
|
-
this.#loadHistoryText(this.#history[this.#historyIndex]);
|
|
239
|
-
}
|
|
240
|
-
return true;
|
|
241
|
-
}
|
|
242
|
-
#lineStart() {
|
|
243
|
-
const newlines = this.#newlineOffsets();
|
|
244
|
-
const previous = newlines[lowerBound(newlines, this.#cursor) - 1];
|
|
245
|
-
return previous === undefined ? 0 : previous + 1;
|
|
246
|
-
}
|
|
247
|
-
#lineEnd() {
|
|
248
|
-
const newlines = this.#newlineOffsets();
|
|
249
|
-
return newlines[lowerBound(newlines, this.#cursor)] ?? this.#text.length;
|
|
250
|
-
}
|
|
251
|
-
#loadHistoryText(value) {
|
|
252
|
-
this.#text = value;
|
|
253
|
-
this.#invalidateIndexes();
|
|
254
|
-
this.#cursor = value.length;
|
|
255
|
-
this.#preferredColumn = undefined;
|
|
256
|
-
}
|
|
257
|
-
#detachHistory() {
|
|
258
|
-
this.#historyIndex = undefined;
|
|
259
|
-
this.#historyScratch = "";
|
|
260
|
-
}
|
|
261
|
-
#invalidateIndexes() {
|
|
262
|
-
this.#boundaries = undefined;
|
|
263
|
-
this.#newlines = undefined;
|
|
264
|
-
}
|
|
265
|
-
#graphemeBoundaries() {
|
|
266
|
-
return (this.#boundaries ??= boundaries(this.#text));
|
|
267
|
-
}
|
|
268
|
-
#newlineOffsets() {
|
|
269
|
-
if (this.#newlines === undefined) {
|
|
270
|
-
this.#newlines = [];
|
|
271
|
-
for (let index = this.#text.indexOf("\n"); index !== -1; index = this.#text.indexOf("\n", index + 1)) {
|
|
272
|
-
this.#newlines.push(index);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
return this.#newlines;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
//# sourceMappingURL=draft.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../../../../src/cli/input/stash/draft.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A best-effort fallback for terminals that send a paste as ordinary key events.
|
|
3
|
-
* Bracketed paste is handled by TerminalInput and never passes through this class.
|
|
4
|
-
*
|
|
5
|
-
* The classifier only observes event order and time. No timing rule can distinguish
|
|
6
|
-
* every unmarked paste from someone typing the same keys, so callers should also
|
|
7
|
-
* offer an explicit multiline input path on terminals without paste reporting.
|
|
8
|
-
*/
|
|
9
|
-
export type BurstDelimiter = "enter" | "tab";
|
|
10
|
-
export type BurstOutput = {
|
|
11
|
-
type: "text";
|
|
12
|
-
text: string;
|
|
13
|
-
} | {
|
|
14
|
-
type: "paste";
|
|
15
|
-
text: string;
|
|
16
|
-
} | {
|
|
17
|
-
type: "key";
|
|
18
|
-
key: BurstDelimiter;
|
|
19
|
-
};
|
|
20
|
-
export interface PasteBurstOptions {
|
|
21
|
-
/** Maximum gap between characters before considering them one fast sequence. */
|
|
22
|
-
characterGapMs?: number;
|
|
23
|
-
/** How long to wait for the next piece of an active unmarked paste. */
|
|
24
|
-
burstIdleMs?: number;
|
|
25
|
-
/** Keep a trailing Enter from submitting just after an inferred paste. */
|
|
26
|
-
enterGuardMs?: number;
|
|
27
|
-
}
|
|
28
|
-
export declare class PasteBurst {
|
|
29
|
-
#private;
|
|
30
|
-
constructor(options?: PasteBurstOptions);
|
|
31
|
-
/** The next time the owner should call flushIfDue(), or undefined when idle. */
|
|
32
|
-
get deadline(): number | undefined;
|
|
33
|
-
feedText(text: string, now: number): BurstOutput[];
|
|
34
|
-
feedDelimiter(key: BurstDelimiter, now: number): BurstOutput[];
|
|
35
|
-
/** Flush buffered typing before a cursor movement, shortcut, or explicit paste. */
|
|
36
|
-
flushAll(now: number): BurstOutput[];
|
|
37
|
-
flushIfDue(now: number): BurstOutput[];
|
|
38
|
-
reset(): void;
|
|
39
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A best-effort fallback for terminals that send a paste as ordinary key events.
|
|
3
|
-
* Bracketed paste is handled by TerminalInput and never passes through this class.
|
|
4
|
-
*
|
|
5
|
-
* The classifier only observes event order and time. No timing rule can distinguish
|
|
6
|
-
* every unmarked paste from someone typing the same keys, so callers should also
|
|
7
|
-
* offer an explicit multiline input path on terminals without paste reporting.
|
|
8
|
-
*/
|
|
9
|
-
export class PasteBurst {
|
|
10
|
-
#characterGapMs;
|
|
11
|
-
#burstIdleMs;
|
|
12
|
-
#enterGuardMs;
|
|
13
|
-
#pending = "";
|
|
14
|
-
#pendingCharCount = 0;
|
|
15
|
-
#pendingEnter = false;
|
|
16
|
-
#lastAt = 0;
|
|
17
|
-
#burst = false;
|
|
18
|
-
#enterGuardUntil = 0;
|
|
19
|
-
constructor(options = {}) {
|
|
20
|
-
this.#characterGapMs = options.characterGapMs ?? 8;
|
|
21
|
-
this.#burstIdleMs = options.burstIdleMs ?? (process.platform === "win32" ? 60 : 16);
|
|
22
|
-
this.#enterGuardMs = options.enterGuardMs ?? 120;
|
|
23
|
-
}
|
|
24
|
-
/** The next time the owner should call flushIfDue(), or undefined when idle. */
|
|
25
|
-
get deadline() {
|
|
26
|
-
if (this.#pending.length === 0) {
|
|
27
|
-
return undefined;
|
|
28
|
-
}
|
|
29
|
-
return this.#lastAt + (this.#burst ? this.#burstIdleMs : this.#characterGapMs);
|
|
30
|
-
}
|
|
31
|
-
feedText(text, now) {
|
|
32
|
-
if (text.length === 0) {
|
|
33
|
-
return [];
|
|
34
|
-
}
|
|
35
|
-
const output = this.flushIfDue(now);
|
|
36
|
-
const closeToPrevious = this.#pending.length > 0 && now - this.#lastAt <= this.#characterGapMs;
|
|
37
|
-
if (this.#pendingEnter) {
|
|
38
|
-
// A newline followed immediately by text is an unmarked paste prefix.
|
|
39
|
-
this.#pendingEnter = false;
|
|
40
|
-
this.#burst = true;
|
|
41
|
-
}
|
|
42
|
-
this.#pending += text;
|
|
43
|
-
const addedCount = [...text].length;
|
|
44
|
-
this.#pendingCharCount += addedCount;
|
|
45
|
-
this.#lastAt = now;
|
|
46
|
-
if (closeToPrevious && this.#pendingCharCount >= 3) {
|
|
47
|
-
this.#burst = true;
|
|
48
|
-
}
|
|
49
|
-
// A terminal may deliver several characters in one decoded text event.
|
|
50
|
-
if (addedCount >= 3) {
|
|
51
|
-
this.#burst = true;
|
|
52
|
-
}
|
|
53
|
-
return output;
|
|
54
|
-
}
|
|
55
|
-
feedDelimiter(key, now) {
|
|
56
|
-
const output = this.flushIfDue(now);
|
|
57
|
-
if (this.#burst && now - this.#lastAt <= this.#burstIdleMs) {
|
|
58
|
-
this.#pending += key === "enter" ? "\n" : "\t";
|
|
59
|
-
this.#pendingCharCount += 1;
|
|
60
|
-
this.#lastAt = now;
|
|
61
|
-
return output;
|
|
62
|
-
}
|
|
63
|
-
if (key === "enter" && now < this.#enterGuardUntil) {
|
|
64
|
-
output.push({ type: "paste", text: "\n" });
|
|
65
|
-
return output;
|
|
66
|
-
}
|
|
67
|
-
if (this.#pending.length > 0 && now - this.#lastAt <= this.#characterGapMs) {
|
|
68
|
-
// Conservatively treat a fast one- or two-character prefix plus Enter
|
|
69
|
-
// as paste. The next separate Enter still submits after the idle window.
|
|
70
|
-
this.#pending += key === "enter" ? "\n" : "\t";
|
|
71
|
-
this.#pendingCharCount += 1;
|
|
72
|
-
this.#pendingEnter = false;
|
|
73
|
-
this.#burst = true;
|
|
74
|
-
this.#lastAt = now;
|
|
75
|
-
return output;
|
|
76
|
-
}
|
|
77
|
-
if (key === "enter") {
|
|
78
|
-
// Hold a bare Enter very briefly so a paste beginning with a newline
|
|
79
|
-
// can be recognized when its next character arrives.
|
|
80
|
-
this.#pending = "\n";
|
|
81
|
-
this.#pendingCharCount = 1;
|
|
82
|
-
this.#pendingEnter = true;
|
|
83
|
-
this.#lastAt = now;
|
|
84
|
-
return output;
|
|
85
|
-
}
|
|
86
|
-
output.push(...this.flushAll(now), { type: "key", key });
|
|
87
|
-
return output;
|
|
88
|
-
}
|
|
89
|
-
/** Flush buffered typing before a cursor movement, shortcut, or explicit paste. */
|
|
90
|
-
flushAll(now) {
|
|
91
|
-
if (this.#pending.length === 0) {
|
|
92
|
-
return [];
|
|
93
|
-
}
|
|
94
|
-
const value = this.#pending;
|
|
95
|
-
const wasBurst = this.#burst;
|
|
96
|
-
const wasEnter = this.#pendingEnter;
|
|
97
|
-
this.#pending = "";
|
|
98
|
-
this.#pendingCharCount = 0;
|
|
99
|
-
this.#pendingEnter = false;
|
|
100
|
-
this.#burst = false;
|
|
101
|
-
if (wasBurst) {
|
|
102
|
-
this.#enterGuardUntil = now + this.#enterGuardMs;
|
|
103
|
-
}
|
|
104
|
-
return wasEnter
|
|
105
|
-
? [{ type: "key", key: "enter" }]
|
|
106
|
-
: [{ type: wasBurst ? "paste" : "text", text: value }];
|
|
107
|
-
}
|
|
108
|
-
flushIfDue(now) {
|
|
109
|
-
const deadline = this.deadline;
|
|
110
|
-
return deadline !== undefined && now >= deadline ? this.flushAll(now) : [];
|
|
111
|
-
}
|
|
112
|
-
reset() {
|
|
113
|
-
this.#pending = "";
|
|
114
|
-
this.#pendingCharCount = 0;
|
|
115
|
-
this.#pendingEnter = false;
|
|
116
|
-
this.#burst = false;
|
|
117
|
-
this.#enterGuardUntil = 0;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=paste-burst.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paste-burst.js","sourceRoot":"","sources":["../../../../src/cli/input/stash/paste-burst.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { Readable, Writable } from "node:stream";
|
|
2
|
-
export type TerminalKey = "enter" | "backspace" | "delete" | "left" | "right" | "up" | "down" | "home" | "end" | "page-up" | "page-down" | "insert" | "tab" | "escape" | "ctrl-c" | "ctrl-d" | "ctrl-j" | "ctrl-g" | "ctrl-v" | "ctrl-a" | "ctrl-e" | "ctrl-k" | "ctrl-u" | "ctrl-w" | "ctrl-l" | "alt-v" | "unknown";
|
|
3
|
-
export type TerminalInputEvent = {
|
|
4
|
-
type: "text";
|
|
5
|
-
text: string;
|
|
6
|
-
} | {
|
|
7
|
-
type: "key";
|
|
8
|
-
key: TerminalKey;
|
|
9
|
-
raw: string;
|
|
10
|
-
ctrl: boolean;
|
|
11
|
-
alt: boolean;
|
|
12
|
-
shift: boolean;
|
|
13
|
-
} | {
|
|
14
|
-
type: "paste";
|
|
15
|
-
text: string;
|
|
16
|
-
} | {
|
|
17
|
-
type: "end";
|
|
18
|
-
};
|
|
19
|
-
export type TerminalInputStream = Readable & {
|
|
20
|
-
isTTY?: boolean;
|
|
21
|
-
isRaw?: boolean;
|
|
22
|
-
setRawMode?: (mode: boolean) => void;
|
|
23
|
-
};
|
|
24
|
-
export interface TerminalInputOptions {
|
|
25
|
-
input?: TerminalInputStream;
|
|
26
|
-
output?: Writable;
|
|
27
|
-
onEvent: (event: TerminalInputEvent) => void;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Owns the byte stream and turns terminal input into text, key, and atomic paste
|
|
31
|
-
* events. In a non-TTY pipeline, the complete input is emitted as one paste at
|
|
32
|
-
* EOF, followed by `end`; a newline in piped data never acts as Enter.
|
|
33
|
-
*/
|
|
34
|
-
export declare class TerminalInput {
|
|
35
|
-
private readonly input;
|
|
36
|
-
private readonly output;
|
|
37
|
-
private readonly onEvent;
|
|
38
|
-
private decoder;
|
|
39
|
-
private started;
|
|
40
|
-
private wasRaw;
|
|
41
|
-
private tty;
|
|
42
|
-
private bracketed;
|
|
43
|
-
private pending;
|
|
44
|
-
private paste;
|
|
45
|
-
private inPaste;
|
|
46
|
-
private escapeTimer;
|
|
47
|
-
private skipNextLF;
|
|
48
|
-
constructor(options: TerminalInputOptions);
|
|
49
|
-
start(): void;
|
|
50
|
-
stop(): void;
|
|
51
|
-
private readonly handleData;
|
|
52
|
-
private readonly handleEnd;
|
|
53
|
-
private drain;
|
|
54
|
-
private consumeEscape;
|
|
55
|
-
private consumeCSI;
|
|
56
|
-
private consumeModifiedCharacter;
|
|
57
|
-
private consumeCharacter;
|
|
58
|
-
private emitKey;
|
|
59
|
-
private finishPaste;
|
|
60
|
-
private scheduleEscapeTimer;
|
|
61
|
-
private clearEscapeTimer;
|
|
62
|
-
}
|