persistent-terminal-mcp 1.0.2

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 (87) hide show
  1. package/CHANGELOG.md +278 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +259 -0
  4. package/README.md +608 -0
  5. package/dist/examples/basic-usage.d.ts +3 -0
  6. package/dist/examples/basic-usage.d.ts.map +1 -0
  7. package/dist/examples/basic-usage.js +116 -0
  8. package/dist/examples/basic-usage.js.map +1 -0
  9. package/dist/examples/codex-bug-fix-demo.d.ts +3 -0
  10. package/dist/examples/codex-bug-fix-demo.d.ts.map +1 -0
  11. package/dist/examples/codex-bug-fix-demo.js +134 -0
  12. package/dist/examples/codex-bug-fix-demo.js.map +1 -0
  13. package/dist/examples/interactive-demo.d.ts +3 -0
  14. package/dist/examples/interactive-demo.d.ts.map +1 -0
  15. package/dist/examples/interactive-demo.js +235 -0
  16. package/dist/examples/interactive-demo.js.map +1 -0
  17. package/dist/examples/rest-api-demo.d.ts +7 -0
  18. package/dist/examples/rest-api-demo.d.ts.map +1 -0
  19. package/dist/examples/rest-api-demo.js +160 -0
  20. package/dist/examples/rest-api-demo.js.map +1 -0
  21. package/dist/examples/smart-reading-demo.d.ts +3 -0
  22. package/dist/examples/smart-reading-demo.d.ts.map +1 -0
  23. package/dist/examples/smart-reading-demo.js +153 -0
  24. package/dist/examples/smart-reading-demo.js.map +1 -0
  25. package/dist/examples/test-all-9-tools.d.ts +8 -0
  26. package/dist/examples/test-all-9-tools.d.ts.map +1 -0
  27. package/dist/examples/test-all-9-tools.js +162 -0
  28. package/dist/examples/test-all-9-tools.js.map +1 -0
  29. package/dist/examples/test-all-tools.d.ts +3 -0
  30. package/dist/examples/test-all-tools.d.ts.map +1 -0
  31. package/dist/examples/test-all-tools.js +150 -0
  32. package/dist/examples/test-all-tools.js.map +1 -0
  33. package/dist/examples/test-fixes.d.ts +9 -0
  34. package/dist/examples/test-fixes.d.ts.map +1 -0
  35. package/dist/examples/test-fixes.js +168 -0
  36. package/dist/examples/test-fixes.js.map +1 -0
  37. package/dist/examples/test-spinner-compaction.d.ts +8 -0
  38. package/dist/examples/test-spinner-compaction.d.ts.map +1 -0
  39. package/dist/examples/test-spinner-compaction.js +155 -0
  40. package/dist/examples/test-spinner-compaction.js.map +1 -0
  41. package/dist/examples/test-web-ui.d.ts +12 -0
  42. package/dist/examples/test-web-ui.d.ts.map +1 -0
  43. package/dist/examples/test-web-ui.js +90 -0
  44. package/dist/examples/test-web-ui.js.map +1 -0
  45. package/dist/index.d.ts +8 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +81 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/mcp-server.d.ts +49 -0
  50. package/dist/mcp-server.d.ts.map +1 -0
  51. package/dist/mcp-server.js +1056 -0
  52. package/dist/mcp-server.js.map +1 -0
  53. package/dist/output-buffer.d.ts +134 -0
  54. package/dist/output-buffer.d.ts.map +1 -0
  55. package/dist/output-buffer.js +553 -0
  56. package/dist/output-buffer.js.map +1 -0
  57. package/dist/rest-api.d.ts +33 -0
  58. package/dist/rest-api.d.ts.map +1 -0
  59. package/dist/rest-api.js +325 -0
  60. package/dist/rest-api.js.map +1 -0
  61. package/dist/rest-server.d.ts +3 -0
  62. package/dist/rest-server.d.ts.map +1 -0
  63. package/dist/rest-server.js +72 -0
  64. package/dist/rest-server.js.map +1 -0
  65. package/dist/terminal-manager.d.ts +93 -0
  66. package/dist/terminal-manager.d.ts.map +1 -0
  67. package/dist/terminal-manager.js +702 -0
  68. package/dist/terminal-manager.js.map +1 -0
  69. package/dist/types.d.ts +201 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +5 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/web-ui-manager.d.ts +38 -0
  74. package/dist/web-ui-manager.d.ts.map +1 -0
  75. package/dist/web-ui-manager.js +130 -0
  76. package/dist/web-ui-manager.js.map +1 -0
  77. package/dist/web-ui-server.d.ts +42 -0
  78. package/dist/web-ui-server.d.ts.map +1 -0
  79. package/dist/web-ui-server.js +324 -0
  80. package/dist/web-ui-server.js.map +1 -0
  81. package/package.json +129 -0
  82. package/public/app.js +265 -0
  83. package/public/index.html +63 -0
  84. package/public/styles.css +383 -0
  85. package/public/terminal.html +56 -0
  86. package/public/terminal.js +244 -0
  87. package/public/test.html +97 -0
@@ -0,0 +1,553 @@
1
+ import { EventEmitter } from 'events';
2
+ /**
3
+ * 终端输出缓冲器
4
+ * 负责缓存终端输出,支持历史查询和实时流式读取
5
+ */
6
+ export class OutputBuffer extends EventEmitter {
7
+ buffer = [];
8
+ maxSize;
9
+ currentLineNumber = 0;
10
+ terminalId;
11
+ currentLineEntry = null;
12
+ sequenceCounter = 0;
13
+ oldestSequence = 0;
14
+ latestSequence = 0;
15
+ // Spinner detection and throttling
16
+ compactAnimations;
17
+ animationThrottleMs;
18
+ spinnerBuffer = '';
19
+ spinnerCount = 0;
20
+ lastSpinnerFlush = 0;
21
+ spinnerFlushTimer = null;
22
+ // Common spinner characters used by npm, yarn, pnpm, etc.
23
+ static SPINNER_CHARS = new Set([
24
+ '⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏', // Braille spinners
25
+ '◐', '◓', '◑', '◒', // Circle spinners
26
+ '◴', '◷', '◶', '◵', // Quarter circle spinners
27
+ '◰', '◳', '◲', '◱', // Box spinners
28
+ '▖', '▘', '▝', '▗', // Block spinners
29
+ '|', '/', '-', '\\', // Classic ASCII spinner
30
+ '●', '○', '◉', '◎', // Dot spinners
31
+ ]);
32
+ constructor(terminalId, maxSize = 10000, options = {}) {
33
+ super();
34
+ this.terminalId = terminalId;
35
+ this.maxSize = maxSize;
36
+ this.compactAnimations = options.compactAnimations ?? true;
37
+ this.animationThrottleMs = options.animationThrottleMs ?? 100;
38
+ this.sequenceCounter = 0;
39
+ }
40
+ nextSequence() {
41
+ const next = ++this.sequenceCounter;
42
+ this.latestSequence = next;
43
+ if (this.oldestSequence === 0) {
44
+ this.oldestSequence = next;
45
+ }
46
+ return next;
47
+ }
48
+ stampSequence(entry) {
49
+ entry.sequence = this.nextSequence();
50
+ }
51
+ /**
52
+ * 检测字符串是否主要包含 spinner 字符
53
+ */
54
+ isSpinnerLine(content) {
55
+ if (!content || content.length === 0)
56
+ return false;
57
+ // Remove ANSI escape sequences for analysis
58
+ const cleanContent = content.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '');
59
+ // Check if the line contains spinner characters
60
+ let spinnerCharCount = 0;
61
+ for (const char of cleanContent) {
62
+ if (OutputBuffer.SPINNER_CHARS.has(char)) {
63
+ spinnerCharCount++;
64
+ }
65
+ }
66
+ // If more than 30% of visible characters are spinner chars, consider it a spinner line
67
+ const visibleChars = cleanContent.replace(/\s/g, '').length;
68
+ return visibleChars > 0 && spinnerCharCount / visibleChars > 0.3;
69
+ }
70
+ /**
71
+ * 刷新 spinner 缓冲区
72
+ */
73
+ flushSpinnerBuffer(newEntries, force = false, markUpdated) {
74
+ if (!this.compactAnimations)
75
+ return;
76
+ const now = Date.now();
77
+ const timeSinceLastFlush = now - this.lastSpinnerFlush;
78
+ // Only flush if forced or enough time has passed
79
+ if (!force && timeSinceLastFlush < this.animationThrottleMs) {
80
+ return;
81
+ }
82
+ if (this.spinnerCount > 0) {
83
+ // Create a compact representation of the spinner updates
84
+ const compactMessage = this.spinnerBuffer
85
+ ? this.spinnerBuffer
86
+ : `[spinner ×${this.spinnerCount}]`;
87
+ const line = this.touchCurrentLine(newEntries, true);
88
+ if (line) {
89
+ line.content = compactMessage;
90
+ if (markUpdated) {
91
+ markUpdated(line);
92
+ }
93
+ else {
94
+ this.stampSequence(line);
95
+ }
96
+ }
97
+ this.spinnerBuffer = '';
98
+ this.spinnerCount = 0;
99
+ this.lastSpinnerFlush = now;
100
+ }
101
+ }
102
+ /**
103
+ * 清除 spinner 刷新定时器
104
+ */
105
+ clearSpinnerTimer() {
106
+ if (this.spinnerFlushTimer) {
107
+ clearTimeout(this.spinnerFlushTimer);
108
+ this.spinnerFlushTimer = null;
109
+ }
110
+ }
111
+ /**
112
+ * 创建新的缓冲条目
113
+ */
114
+ createEntry(initialContent, newEntries, skipIfDuplicateBlank) {
115
+ if (skipIfDuplicateBlank &&
116
+ initialContent === '' &&
117
+ this.buffer.length > 0 &&
118
+ this.buffer[this.buffer.length - 1].content === '') {
119
+ return null;
120
+ }
121
+ const entry = {
122
+ timestamp: new Date(),
123
+ content: initialContent,
124
+ lineNumber: this.currentLineNumber++,
125
+ sequence: this.nextSequence()
126
+ };
127
+ this.buffer.push(entry);
128
+ newEntries.push(entry);
129
+ this.trimBuffer();
130
+ return entry;
131
+ }
132
+ touchCurrentLine(newEntries, reuseLast = false) {
133
+ if (this.currentLineEntry) {
134
+ if (!newEntries.includes(this.currentLineEntry)) {
135
+ newEntries.push(this.currentLineEntry);
136
+ }
137
+ return this.currentLineEntry;
138
+ }
139
+ if (reuseLast && this.buffer.length > 0) {
140
+ const entry = this.buffer[this.buffer.length - 1];
141
+ this.currentLineEntry = entry;
142
+ if (!newEntries.includes(entry)) {
143
+ newEntries.push(entry);
144
+ }
145
+ return entry;
146
+ }
147
+ const entry = this.createEntry('', newEntries, false);
148
+ this.currentLineEntry = entry;
149
+ return entry;
150
+ }
151
+ /**
152
+ * 结束当前行,将其标记为完成
153
+ */
154
+ finalizeCurrentLine(newEntries) {
155
+ if (!this.currentLineEntry) {
156
+ const entry = this.createEntry('', newEntries, true);
157
+ if (entry) {
158
+ this.stampSequence(entry);
159
+ }
160
+ }
161
+ else if (this.currentLineEntry.content === '') {
162
+ const lastIndex = this.buffer.length - 1;
163
+ if (lastIndex >= 0 && this.buffer[lastIndex] === this.currentLineEntry) {
164
+ const previous = this.buffer[lastIndex - 1];
165
+ if (previous && previous.content === '') {
166
+ this.buffer.pop();
167
+ }
168
+ }
169
+ }
170
+ this.currentLineEntry = null;
171
+ }
172
+ /**
173
+ * 修剪缓冲区,确保不超过最大容量
174
+ */
175
+ trimBuffer() {
176
+ while (this.buffer.length > this.maxSize) {
177
+ const removed = this.buffer.shift();
178
+ if (removed && this.currentLineEntry === removed) {
179
+ this.currentLineEntry = null;
180
+ }
181
+ if (removed) {
182
+ this.oldestSequence = this.buffer.length > 0 ? this.buffer[0].sequence : this.latestSequence;
183
+ }
184
+ }
185
+ }
186
+ consumeEscapeSequence(input, startIndex) {
187
+ let endIndex = startIndex + 1;
188
+ if (endIndex >= input.length) {
189
+ return {
190
+ sequence: input[startIndex],
191
+ nextIndex: startIndex
192
+ };
193
+ }
194
+ const nextChar = input[endIndex];
195
+ if (nextChar === '[') {
196
+ endIndex++;
197
+ while (endIndex < input.length) {
198
+ const ch = input[endIndex];
199
+ if ((ch >= '0' && ch <= '9') || ch === ';' || ch === '?' || ch === ':' || ch === '>' || ch === '<') {
200
+ endIndex++;
201
+ continue;
202
+ }
203
+ endIndex++;
204
+ break;
205
+ }
206
+ }
207
+ else if (nextChar === ']') {
208
+ endIndex++;
209
+ while (endIndex < input.length) {
210
+ const ch = input[endIndex];
211
+ if (ch === '') {
212
+ endIndex++;
213
+ break;
214
+ }
215
+ if (ch === '' && input[endIndex + 1] === '\\') {
216
+ endIndex += 2;
217
+ break;
218
+ }
219
+ endIndex++;
220
+ }
221
+ }
222
+ else {
223
+ endIndex++;
224
+ }
225
+ if (endIndex > input.length) {
226
+ endIndex = input.length;
227
+ }
228
+ return {
229
+ sequence: input.slice(startIndex, endIndex),
230
+ nextIndex: endIndex - 1
231
+ };
232
+ }
233
+ handleEscapeSequence(sequence, newEntries, markUpdated) {
234
+ if (!sequence || sequence.length === 0) {
235
+ return;
236
+ }
237
+ if (sequence.startsWith('[')) {
238
+ const finalChar = sequence[sequence.length - 1];
239
+ switch (finalChar) {
240
+ case 'K':
241
+ case 'J':
242
+ case 'G':
243
+ case 'D':
244
+ case 'C': {
245
+ // When we receive erase/move sequences after a newline, ensure we
246
+ // operate on the current (possibly new) line instead of mutating the
247
+ // previously finalized entry.
248
+ const line = this.touchCurrentLine(newEntries);
249
+ if (line) {
250
+ line.content = '';
251
+ markUpdated(line);
252
+ }
253
+ break;
254
+ }
255
+ default:
256
+ break;
257
+ }
258
+ }
259
+ // 其他 ANSI 转义序列(如颜色设置)对文本内容无影响,这里直接忽略
260
+ }
261
+ /**
262
+ * 添加新的输出内容
263
+ */
264
+ append(content) {
265
+ if (!content)
266
+ return;
267
+ const newEntries = [];
268
+ const updatedEntries = new Set();
269
+ const markUpdated = (entry) => {
270
+ if (!entry) {
271
+ return;
272
+ }
273
+ entry.timestamp = new Date();
274
+ if (!newEntries.includes(entry)) {
275
+ newEntries.push(entry);
276
+ }
277
+ if (!updatedEntries.has(entry)) {
278
+ this.stampSequence(entry);
279
+ updatedEntries.add(entry);
280
+ }
281
+ };
282
+ for (let i = 0; i < content.length; i++) {
283
+ const char = content[i];
284
+ if (char === '') {
285
+ const { sequence, nextIndex } = this.consumeEscapeSequence(content, i);
286
+ this.handleEscapeSequence(sequence, newEntries, markUpdated);
287
+ i = nextIndex;
288
+ continue;
289
+ }
290
+ if (char === '\r') {
291
+ const nextChar = content[i + 1];
292
+ if (nextChar === '\n') {
293
+ // Flush any pending spinner before finalizing line
294
+ if (this.compactAnimations && this.currentLineEntry) {
295
+ const isSpinner = this.isSpinnerLine(this.currentLineEntry.content);
296
+ if (isSpinner) {
297
+ this.spinnerCount++;
298
+ this.spinnerBuffer = this.currentLineEntry.content;
299
+ // Schedule a flush if not already scheduled
300
+ this.clearSpinnerTimer();
301
+ this.spinnerFlushTimer = setTimeout(() => {
302
+ const flushEntries = [];
303
+ this.flushSpinnerBuffer(flushEntries, true, markUpdated);
304
+ if (flushEntries.length > 0) {
305
+ this.emit('data', flushEntries);
306
+ }
307
+ }, this.animationThrottleMs);
308
+ // Clear current line to prevent it from being finalized
309
+ this.currentLineEntry = null;
310
+ }
311
+ else {
312
+ // Non-spinner content, flush any pending spinners
313
+ this.flushSpinnerBuffer(newEntries, true, markUpdated);
314
+ }
315
+ }
316
+ this.finalizeCurrentLine(newEntries);
317
+ i++; // Skip the '\n' as we've already handled the newline
318
+ }
319
+ else {
320
+ // Carriage return without newline: check if it's a spinner update
321
+ if (this.compactAnimations && this.currentLineEntry) {
322
+ const isSpinner = this.isSpinnerLine(this.currentLineEntry.content);
323
+ if (isSpinner) {
324
+ this.spinnerCount++;
325
+ this.spinnerBuffer = this.currentLineEntry.content;
326
+ // Schedule a flush
327
+ this.clearSpinnerTimer();
328
+ this.spinnerFlushTimer = setTimeout(() => {
329
+ const flushEntries = [];
330
+ this.flushSpinnerBuffer(flushEntries, true, markUpdated);
331
+ if (flushEntries.length > 0) {
332
+ this.emit('data', flushEntries);
333
+ }
334
+ }, this.animationThrottleMs);
335
+ }
336
+ else {
337
+ // Non-spinner content, flush any pending spinners
338
+ this.flushSpinnerBuffer(newEntries, true, markUpdated);
339
+ }
340
+ }
341
+ // Overwrite current line
342
+ const line = this.touchCurrentLine(newEntries, true);
343
+ if (line) {
344
+ line.content = '';
345
+ markUpdated(line);
346
+ }
347
+ }
348
+ continue;
349
+ }
350
+ if (char === '\n') {
351
+ // Flush any pending spinner before finalizing line
352
+ if (this.compactAnimations && this.currentLineEntry) {
353
+ const isSpinner = this.isSpinnerLine(this.currentLineEntry.content);
354
+ if (!isSpinner) {
355
+ this.flushSpinnerBuffer(newEntries, true, markUpdated);
356
+ }
357
+ }
358
+ this.finalizeCurrentLine(newEntries);
359
+ continue;
360
+ }
361
+ const line = this.touchCurrentLine(newEntries);
362
+ if (line) {
363
+ line.content += char;
364
+ markUpdated(line);
365
+ }
366
+ }
367
+ if (newEntries.length > 0) {
368
+ this.emit('data', newEntries);
369
+ }
370
+ }
371
+ /**
372
+ * 读取缓冲区内容
373
+ */
374
+ read(options = {}) {
375
+ const { since = 0, maxLines = 1000 } = options;
376
+ const filtered = this.buffer.filter(entry => entry.sequence > since);
377
+ const entries = maxLines ? filtered.slice(-maxLines) : filtered;
378
+ const truncated = Boolean(maxLines && filtered.length > entries.length);
379
+ const nextCursor = entries.length > 0 ? entries[entries.length - 1].sequence : since;
380
+ const hasMore = truncated || (this.oldestSequence > 0 && since > 0 && since < this.oldestSequence);
381
+ return {
382
+ entries,
383
+ totalLines: this.currentLineNumber,
384
+ hasMore,
385
+ nextCursor
386
+ };
387
+ }
388
+ /**
389
+ * 智能读取:支持头尾模式
390
+ */
391
+ readSmart(options = {}) {
392
+ const { since = 0, mode = 'full', headLines = 50, tailLines = 50, maxLines = 1000 } = options;
393
+ const allEntries = this.buffer.filter(entry => entry.sequence > since);
394
+ let resultEntries = [];
395
+ let truncated = false;
396
+ let linesOmitted = 0;
397
+ // 计算总字节数和估算 token 数
398
+ const totalText = allEntries.map(e => e.content).join('\n');
399
+ const totalBytes = Buffer.byteLength(totalText, 'utf8');
400
+ const estimatedTokens = Math.ceil(totalText.length / 4); // 粗略估算:4字符≈1token
401
+ switch (mode) {
402
+ case 'head':
403
+ if (allEntries.length > headLines) {
404
+ resultEntries = allEntries.slice(0, headLines);
405
+ truncated = true;
406
+ linesOmitted = allEntries.length - headLines;
407
+ }
408
+ else {
409
+ resultEntries = allEntries;
410
+ }
411
+ break;
412
+ case 'tail':
413
+ if (allEntries.length > tailLines) {
414
+ resultEntries = allEntries.slice(-tailLines);
415
+ truncated = true;
416
+ linesOmitted = allEntries.length - tailLines;
417
+ }
418
+ else {
419
+ resultEntries = allEntries;
420
+ }
421
+ break;
422
+ case 'head-tail':
423
+ if (allEntries.length > headLines + tailLines) {
424
+ const head = allEntries.slice(0, headLines);
425
+ const tail = allEntries.slice(-tailLines);
426
+ resultEntries = [...head, ...tail];
427
+ truncated = true;
428
+ linesOmitted = allEntries.length - headLines - tailLines;
429
+ }
430
+ else {
431
+ resultEntries = allEntries;
432
+ }
433
+ break;
434
+ case 'full':
435
+ default:
436
+ if (maxLines && allEntries.length > maxLines) {
437
+ resultEntries = allEntries.slice(-maxLines);
438
+ truncated = true;
439
+ linesOmitted = allEntries.length - maxLines;
440
+ }
441
+ else {
442
+ resultEntries = allEntries;
443
+ }
444
+ break;
445
+ }
446
+ const hasMore = this.oldestSequence > 0 && since > 0 && since < this.oldestSequence;
447
+ const nextCursor = resultEntries.length > 0 ? resultEntries[resultEntries.length - 1].sequence : since;
448
+ return {
449
+ entries: resultEntries,
450
+ totalLines: this.currentLineNumber,
451
+ hasMore,
452
+ truncated,
453
+ nextCursor,
454
+ stats: {
455
+ totalBytes,
456
+ estimatedTokens,
457
+ linesShown: resultEntries.length,
458
+ linesOmitted
459
+ }
460
+ };
461
+ }
462
+ /**
463
+ * 获取最新的输出内容
464
+ */
465
+ getLatest(maxLines = 100) {
466
+ const startIndex = Math.max(0, this.buffer.length - maxLines);
467
+ return this.buffer.slice(startIndex);
468
+ }
469
+ /**
470
+ * 获取所有输出内容的文本形式
471
+ */
472
+ getAllText() {
473
+ return this.buffer.map(entry => entry.content).join('\n');
474
+ }
475
+ /**
476
+ * 获取指定范围的文本内容
477
+ */
478
+ getText(since = 0, maxLines = 1000) {
479
+ const result = this.read({ since, maxLines });
480
+ return result.entries.map(entry => entry.content).join('\n');
481
+ }
482
+ /**
483
+ * 清空缓冲区
484
+ */
485
+ clear() {
486
+ this.clearSpinnerTimer();
487
+ this.buffer = [];
488
+ this.currentLineNumber = 0;
489
+ this.currentLineEntry = null;
490
+ this.spinnerBuffer = '';
491
+ this.spinnerCount = 0;
492
+ this.lastSpinnerFlush = 0;
493
+ this.sequenceCounter = 0;
494
+ this.oldestSequence = 0;
495
+ this.latestSequence = 0;
496
+ this.emit('clear');
497
+ }
498
+ /**
499
+ * 获取缓冲区统计信息
500
+ */
501
+ getStats() {
502
+ return {
503
+ terminalId: this.terminalId,
504
+ totalLines: this.currentLineNumber,
505
+ bufferedLines: this.buffer.length,
506
+ maxSize: this.maxSize,
507
+ oldestLine: this.buffer.length > 0 ? this.buffer[0].lineNumber : 0,
508
+ newestLine: this.buffer.length > 0 ? this.buffer[this.buffer.length - 1].lineNumber : 0
509
+ };
510
+ }
511
+ /**
512
+ * 设置最大缓冲区大小
513
+ */
514
+ setMaxSize(maxSize) {
515
+ this.maxSize = maxSize;
516
+ // 如果当前缓冲区超过新的最大大小,删除最旧的条目
517
+ this.trimBuffer();
518
+ }
519
+ /**
520
+ * 获取当前行号
521
+ */
522
+ getCurrentLineNumber() {
523
+ return this.currentLineNumber;
524
+ }
525
+ /**
526
+ * 检查是否有指定行号之后的新内容
527
+ */
528
+ hasNewContent(since) {
529
+ return this.currentLineNumber > since;
530
+ }
531
+ /**
532
+ * 设置动画压缩选项
533
+ */
534
+ setCompactAnimations(enabled) {
535
+ this.compactAnimations = enabled;
536
+ if (!enabled) {
537
+ // If disabling, flush any pending spinners
538
+ this.clearSpinnerTimer();
539
+ const flushEntries = [];
540
+ this.flushSpinnerBuffer(flushEntries, true);
541
+ if (flushEntries.length > 0) {
542
+ this.emit('data', flushEntries);
543
+ }
544
+ }
545
+ }
546
+ /**
547
+ * 获取动画压缩状态
548
+ */
549
+ getCompactAnimations() {
550
+ return this.compactAnimations;
551
+ }
552
+ }
553
+ //# sourceMappingURL=output-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-buffer.js","sourceRoot":"","sources":["../src/output-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import express from 'express';
2
+ import { TerminalManager } from './terminal-manager.js';
3
+ /**
4
+ * REST API 服务器
5
+ * 提供 HTTP 接口来管理终端会话
6
+ */
7
+ export declare class RestApiServer {
8
+ private app;
9
+ private terminalManager;
10
+ private server;
11
+ constructor(terminalManager: TerminalManager);
12
+ /**
13
+ * 设置中间件
14
+ */
15
+ private setupMiddleware;
16
+ /**
17
+ * 设置路由
18
+ */
19
+ private setupRoutes;
20
+ /**
21
+ * 启动服务器
22
+ */
23
+ start(port?: number): Promise<void>;
24
+ /**
25
+ * 停止服务器
26
+ */
27
+ stop(): Promise<void>;
28
+ /**
29
+ * 获取 Express 应用实例
30
+ */
31
+ getApp(): express.Application;
32
+ }
33
+ //# sourceMappingURL=rest-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-api.d.ts","sourceRoot":"","sources":["../src/rest-api.ts"],"names":[],"mappings":"AAAA,OAAO,OAA8B,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQxD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,MAAM,CAAM;gBAER,eAAe,EAAE,eAAe;IAO5C;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAkQnB;;OAEG;IACH,KAAK,CAAC,IAAI,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjC;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,WAAW;CAG9B"}