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,150 @@
1
+ #!/usr/bin/env node
2
+ import { TerminalManager } from '../terminal-manager.js';
3
+ /**
4
+ * 测试所有 MCP 工具功能
5
+ */
6
+ async function testAllTools() {
7
+ console.log('=== Testing All MCP Tools ===\n');
8
+ const terminalManager = new TerminalManager({
9
+ maxBufferSize: 1000,
10
+ sessionTimeout: 60000
11
+ });
12
+ let testsPassed = 0;
13
+ let testsFailed = 0;
14
+ try {
15
+ // 测试 1: create_terminal
16
+ console.log('✓ Test 1: create_terminal');
17
+ const terminalId = await terminalManager.createTerminal({
18
+ shell: process.platform === 'win32' ? 'cmd.exe' : '/bin/bash',
19
+ cwd: process.cwd()
20
+ });
21
+ console.log(` Terminal created: ${terminalId}`);
22
+ testsPassed++;
23
+ // 测试 2: write_terminal
24
+ console.log('\n✓ Test 2: write_terminal');
25
+ await terminalManager.writeToTerminal({
26
+ terminalId,
27
+ input: 'echo "Hello from MCP"\n'
28
+ });
29
+ console.log(' Input sent successfully');
30
+ testsPassed++;
31
+ // 等待输出
32
+ await new Promise(resolve => setTimeout(resolve, 1000));
33
+ // 测试 3: read_terminal (基本模式)
34
+ console.log('\n✓ Test 3: read_terminal (full mode)');
35
+ const readResult = await terminalManager.readFromTerminal({
36
+ terminalId,
37
+ mode: 'full'
38
+ });
39
+ console.log(` Output lines: ${readResult.totalLines}`);
40
+ console.log(` Has more: ${readResult.hasMore}`);
41
+ testsPassed++;
42
+ // 测试 4: get_terminal_stats
43
+ console.log('\n✓ Test 4: get_terminal_stats');
44
+ const stats = await terminalManager.getTerminalStats(terminalId);
45
+ console.log(` Total lines: ${stats.totalLines}`);
46
+ console.log(` Total bytes: ${stats.totalBytes}`);
47
+ console.log(` Estimated tokens: ${stats.estimatedTokens}`);
48
+ console.log(` Is active: ${stats.isActive}`);
49
+ testsPassed++;
50
+ // 测试 5: list_terminals
51
+ console.log('\n✓ Test 5: list_terminals');
52
+ const listResult = await terminalManager.listTerminals();
53
+ console.log(` Active terminals: ${listResult.terminals.length}`);
54
+ console.log(` Terminal IDs: ${listResult.terminals.map(t => t.id).join(', ')}`);
55
+ testsPassed++;
56
+ // 添加更多输出用于测试智能读取
57
+ console.log('\n✓ Test 6: Generating more output for smart reading...');
58
+ for (let i = 1; i <= 20; i++) {
59
+ await terminalManager.writeToTerminal({
60
+ terminalId,
61
+ input: `echo "Line ${i}"\n`
62
+ });
63
+ await new Promise(resolve => setTimeout(resolve, 50));
64
+ }
65
+ console.log(' Generated 20 lines of output');
66
+ testsPassed++;
67
+ await new Promise(resolve => setTimeout(resolve, 1000));
68
+ // 测试 7: read_terminal (head mode)
69
+ console.log('\n✓ Test 7: read_terminal (head mode)');
70
+ const headResult = await terminalManager.readFromTerminal({
71
+ terminalId,
72
+ mode: 'head',
73
+ headLines: 5
74
+ });
75
+ console.log(` Truncated: ${headResult.truncated}`);
76
+ if (headResult.stats) {
77
+ console.log(` Lines shown: ${headResult.stats.linesShown}`);
78
+ console.log(` Lines omitted: ${headResult.stats.linesOmitted}`);
79
+ }
80
+ testsPassed++;
81
+ // 测试 8: read_terminal (tail mode)
82
+ console.log('\n✓ Test 8: read_terminal (tail mode)');
83
+ const tailResult = await terminalManager.readFromTerminal({
84
+ terminalId,
85
+ mode: 'tail',
86
+ tailLines: 5
87
+ });
88
+ console.log(` Truncated: ${tailResult.truncated}`);
89
+ if (tailResult.stats) {
90
+ console.log(` Lines shown: ${tailResult.stats.linesShown}`);
91
+ console.log(` Lines omitted: ${tailResult.stats.linesOmitted}`);
92
+ }
93
+ testsPassed++;
94
+ // 测试 9: read_terminal (head-tail mode)
95
+ console.log('\n✓ Test 9: read_terminal (head-tail mode)');
96
+ const headTailResult = await terminalManager.readFromTerminal({
97
+ terminalId,
98
+ mode: 'head-tail',
99
+ headLines: 3,
100
+ tailLines: 3
101
+ });
102
+ console.log(` Truncated: ${headTailResult.truncated}`);
103
+ if (headTailResult.stats) {
104
+ console.log(` Lines shown: ${headTailResult.stats.linesShown}`);
105
+ console.log(` Lines omitted: ${headTailResult.stats.linesOmitted}`);
106
+ }
107
+ testsPassed++;
108
+ // 测试 10: kill_terminal
109
+ console.log('\n✓ Test 10: kill_terminal');
110
+ await terminalManager.killTerminal(terminalId);
111
+ console.log(' Terminal terminated successfully');
112
+ testsPassed++;
113
+ // 验证终端已被终止
114
+ console.log('\n✓ Test 11: Verify terminal is terminated');
115
+ const finalList = await terminalManager.listTerminals();
116
+ const isTerminated = !finalList.terminals.some(t => t.id === terminalId && t.status === 'active');
117
+ if (isTerminated) {
118
+ console.log(' Terminal is no longer active');
119
+ testsPassed++;
120
+ }
121
+ else {
122
+ console.log(' ✗ Terminal is still active (unexpected)');
123
+ testsFailed++;
124
+ }
125
+ console.log('\n=== Test Summary ===');
126
+ console.log(`✓ Passed: ${testsPassed}`);
127
+ console.log(`✗ Failed: ${testsFailed}`);
128
+ console.log(`Total: ${testsPassed + testsFailed}`);
129
+ if (testsFailed === 0) {
130
+ console.log('\n🎉 All tests passed!');
131
+ }
132
+ else {
133
+ console.log('\n⚠️ Some tests failed');
134
+ }
135
+ }
136
+ catch (error) {
137
+ console.error('\n✗ Test failed with error:', error);
138
+ testsFailed++;
139
+ }
140
+ finally {
141
+ console.log('\nShutting down terminal manager...');
142
+ await terminalManager.shutdown();
143
+ console.log('Cleanup complete');
144
+ }
145
+ }
146
+ // 运行测试
147
+ if (import.meta.url === `file://${process.argv[1]}`) {
148
+ testAllTools().catch(console.error);
149
+ }
150
+ //# sourceMappingURL=test-all-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-all-tools.js","sourceRoot":"","sources":["../../src/examples/test-all-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 测试修复后的功能
4
+ * 验证:
5
+ * 1. 命令自动执行(不需要手动添加 \n)
6
+ * 2. kill 后终端从列表中移除
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=test-fixes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-fixes.d.ts","sourceRoot":"","sources":["../../src/examples/test-fixes.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 测试修复后的功能
4
+ * 验证:
5
+ * 1. 命令自动执行(不需要手动添加 \n)
6
+ * 2. kill 后终端从列表中移除
7
+ */
8
+ import { TerminalManager } from '../terminal-manager.js';
9
+ async function wait(ms) {
10
+ return new Promise(resolve => setTimeout(resolve, ms));
11
+ }
12
+ async function testFixes() {
13
+ console.log('🧪 开始测试修复...\n');
14
+ const manager = new TerminalManager();
15
+ try {
16
+ // ========== 测试 1: 命令自动执行 ==========
17
+ console.log('📝 测试 1: 命令自动执行(不需要手动添加换行符)');
18
+ console.log('----------------------------------------');
19
+ const terminalId = await manager.createTerminal({
20
+ cwd: process.cwd()
21
+ });
22
+ console.log(`✅ 创建终端: ${terminalId}\n`);
23
+ // 测试 1.1: 发送不带换行符的命令
24
+ console.log('测试 1.1: 发送 "pwd" (不带换行符)');
25
+ await manager.writeToTerminal({
26
+ terminalId,
27
+ input: 'pwd' // 不带 \n
28
+ });
29
+ console.log('✅ 命令已发送\n');
30
+ await wait(1000);
31
+ const output1 = await manager.readFromTerminal({
32
+ terminalId,
33
+ mode: 'tail',
34
+ tailLines: 10
35
+ });
36
+ console.log('📤 输出:');
37
+ console.log(output1.output);
38
+ let nextReadFrom = output1.since;
39
+ if (output1.output.includes(process.cwd())) {
40
+ console.log('✅ 测试 1.1 通过: 命令自动执行了!\n');
41
+ }
42
+ else {
43
+ console.log('❌ 测试 1.1 失败: 命令没有执行\n');
44
+ }
45
+ // 测试 1.2: 发送带换行符的命令(应该仍然工作)
46
+ console.log('测试 1.2: 发送 "echo test\\n" (带换行符)');
47
+ await manager.writeToTerminal({
48
+ terminalId,
49
+ input: 'echo test\n' // 带 \n
50
+ });
51
+ console.log('✅ 命令已发送\n');
52
+ await wait(1000);
53
+ const output2 = await manager.readFromTerminal({
54
+ terminalId,
55
+ since: nextReadFrom,
56
+ mode: 'tail',
57
+ tailLines: 10
58
+ });
59
+ console.log('📤 输出:');
60
+ console.log(output2.output);
61
+ nextReadFrom = output2.since;
62
+ if (output2.output.includes('test')) {
63
+ console.log('✅ 测试 1.2 通过: 带换行符的命令也正常工作!\n');
64
+ }
65
+ else {
66
+ console.log('❌ 测试 1.2 失败: 命令没有执行\n');
67
+ }
68
+ // 测试 1.3: 发送多个命令
69
+ console.log('测试 1.3: 连续发送多个命令');
70
+ await manager.writeToTerminal({
71
+ terminalId,
72
+ input: 'echo "Command 1"'
73
+ });
74
+ await wait(500);
75
+ await manager.writeToTerminal({
76
+ terminalId,
77
+ input: 'echo "Command 2"'
78
+ });
79
+ await wait(500);
80
+ await manager.writeToTerminal({
81
+ terminalId,
82
+ input: 'echo "Command 3"'
83
+ });
84
+ console.log('✅ 3 个命令已发送\n');
85
+ await wait(1000);
86
+ const output3 = await manager.readFromTerminal({
87
+ terminalId,
88
+ since: nextReadFrom,
89
+ mode: 'tail',
90
+ tailLines: 20
91
+ });
92
+ console.log('📤 输出:');
93
+ console.log(output3.output);
94
+ nextReadFrom = output3.since;
95
+ const hasCmd1 = output3.output.includes('Command 1');
96
+ const hasCmd2 = output3.output.includes('Command 2');
97
+ const hasCmd3 = output3.output.includes('Command 3');
98
+ if (hasCmd1 && hasCmd2 && hasCmd3) {
99
+ console.log('✅ 测试 1.3 通过: 所有命令都执行了!\n');
100
+ }
101
+ else {
102
+ console.log(`❌ 测试 1.3 失败: 缺少命令输出 (1:${hasCmd1}, 2:${hasCmd2}, 3:${hasCmd3})\n`);
103
+ }
104
+ console.log('========================================\n');
105
+ // ========== 测试 2: kill 后终端从列表中移除 ==========
106
+ console.log('📝 测试 2: kill 后终端从列表中移除');
107
+ console.log('----------------------------------------');
108
+ // 创建第二个终端用于测试
109
+ const terminalId2 = await manager.createTerminal({
110
+ cwd: process.cwd()
111
+ });
112
+ console.log(`✅ 创建第二个终端: ${terminalId2}\n`);
113
+ // 列出所有终端
114
+ const beforeKillResult = await manager.listTerminals();
115
+ const beforeKill = beforeKillResult.terminals;
116
+ console.log(`📋 Kill 前的终端列表 (${beforeKill.length} 个):`);
117
+ beforeKill.forEach(t => {
118
+ console.log(` - ${t.id} (${t.status})`);
119
+ });
120
+ console.log();
121
+ if (beforeKill.length !== 2) {
122
+ console.log(`❌ 预期有 2 个终端,实际有 ${beforeKill.length} 个\n`);
123
+ }
124
+ // Kill 第一个终端
125
+ console.log(`🔪 终止终端: ${terminalId}`);
126
+ await manager.killTerminal(terminalId);
127
+ console.log('✅ 终端已终止\n');
128
+ await wait(500);
129
+ // 再次列出终端
130
+ const afterKillResult = await manager.listTerminals();
131
+ const afterKill = afterKillResult.terminals;
132
+ console.log(`📋 Kill 后的终端列表 (${afterKill.length} 个):`);
133
+ afterKill.forEach(t => {
134
+ console.log(` - ${t.id} (${t.status})`);
135
+ });
136
+ console.log();
137
+ if (afterKill.length === 1 && !afterKill.find(t => t.id === terminalId)) {
138
+ console.log('✅ 测试 2 通过: 被 kill 的终端已从列表中移除!\n');
139
+ }
140
+ else {
141
+ console.log('❌ 测试 2 失败: 被 kill 的终端仍在列表中\n');
142
+ }
143
+ // 清理:终止第二个终端
144
+ console.log(`🧹 清理: 终止终端 ${terminalId2}`);
145
+ await manager.killTerminal(terminalId2);
146
+ const finalListResult = await manager.listTerminals();
147
+ const finalList = finalListResult.terminals;
148
+ console.log(`📋 最终终端列表: ${finalList.length} 个\n`);
149
+ if (finalList.length === 0) {
150
+ console.log('✅ 清理成功: 所有终端都已移除\n');
151
+ }
152
+ else {
153
+ console.log('⚠️ 警告: 仍有终端残留\n');
154
+ }
155
+ console.log('========================================\n');
156
+ console.log('🎉 所有测试完成!\n');
157
+ }
158
+ catch (error) {
159
+ console.error('❌ 测试失败:', error);
160
+ process.exit(1);
161
+ }
162
+ }
163
+ // 运行测试
164
+ testFixes().catch(error => {
165
+ console.error('Fatal error:', error);
166
+ process.exit(1);
167
+ });
168
+ //# sourceMappingURL=test-fixes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-fixes.js","sourceRoot":"","sources":["../../src/examples/test-fixes.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,KAAK,UAAU,IAAI,CAAC,EAAU;IAC5B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAE9B,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAExD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC;YAC9C,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,IAAI,CAAC,CAAC;QAEvC,qBAAqB;QACrB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,OAAO,CAAC,eAAe,CAAC;YAC5B,UAAU;YACV,KAAK,EAAE,KAAK,CAAE,QAAQ;SACvB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEzB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC;YAC7C,UAAU;YACV,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5B,IAAI,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;QAEjC,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QAED,4BAA4B;QAC5B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,OAAO,CAAC,eAAe,CAAC;YAC5B,UAAU;YACV,KAAK,EAAE,aAAa,CAAE,OAAO;SAC9B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEzB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC;YAC7C,UAAU;YACV,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5B,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;QAE7B,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QAED,iBAAiB;QACjB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,MAAM,OAAO,CAAC,eAAe,CAAC;YAC5B,UAAU;YACV,KAAK,EAAE,kBAAkB;SAC1B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,OAAO,CAAC,eAAe,CAAC;YAC5B,UAAU;YACV,KAAK,EAAE,kBAAkB;SAC1B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,OAAO,CAAC,eAAe,CAAC;YAC5B,UAAU;YACV,KAAK,EAAE,kBAAkB;SAC1B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAE5B,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC;YAC7C,UAAU;YACV,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5B,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;QAE7B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAErD,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAE1D,6CAA6C;QAC7C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAExD,cAAc;QACd,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC;YAC/C,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,IAAI,CAAC,CAAC;QAE3C,SAAS;QACT,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC;QACxD,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACrB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC;QAC1D,CAAC;QAED,aAAa;QACb,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;QACtC,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEzB,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAEhB,SAAS;QACT,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC;QACvD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;QAED,aAAa;QACb,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAExC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC;QAElD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAE9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO;AACP,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * 测试 Spinner 压缩功能
4
+ *
5
+ * 这个脚本演示了如何使用 spinner 压缩功能来处理进度动画
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=test-spinner-compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-spinner-compaction.d.ts","sourceRoot":"","sources":["../../src/examples/test-spinner-compaction.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * 测试 Spinner 压缩功能
4
+ *
5
+ * 这个脚本演示了如何使用 spinner 压缩功能来处理进度动画
6
+ */
7
+ import { TerminalManager } from '../terminal-manager.js';
8
+ async function sleep(ms) {
9
+ return new Promise(resolve => setTimeout(resolve, ms));
10
+ }
11
+ async function testSpinnerCompaction() {
12
+ console.log('='.repeat(80));
13
+ console.log('测试 Spinner 压缩功能');
14
+ console.log('='.repeat(80));
15
+ console.log();
16
+ // 测试 1: 启用压缩(默认)
17
+ console.log('测试 1: 启用 Spinner 压缩(默认设置)');
18
+ console.log('-'.repeat(80));
19
+ const manager1 = new TerminalManager({
20
+ maxBufferSize: 1000,
21
+ compactAnimations: true,
22
+ animationThrottleMs: 100
23
+ });
24
+ try {
25
+ const terminalId1 = await manager1.createTerminal();
26
+ console.log(`✓ 创建终端: ${terminalId1}`);
27
+ // 模拟一个会产生 spinner 的命令
28
+ console.log('执行命令: echo "开始"; for i in {1..20}; do echo -ne "\\r⠋ 处理中 $i"; sleep 0.05; done; echo -e "\\r✓ 完成!"');
29
+ await manager1.writeToTerminal({
30
+ terminalId: terminalId1,
31
+ input: 'echo "开始"; for i in {1..20}; do echo -ne "\\r⠋ 处理中 $i"; sleep 0.05; done; echo -e "\\r✓ 完成!"'
32
+ });
33
+ // 等待命令执行
34
+ await sleep(2000);
35
+ // 读取输出
36
+ const result1 = await manager1.readFromTerminal({ terminalId: terminalId1 });
37
+ console.log('\n输出行数:', result1.totalLines);
38
+ console.log('输出内容:');
39
+ console.log(result1.output);
40
+ console.log();
41
+ await manager1.killTerminal(terminalId1);
42
+ }
43
+ finally {
44
+ await manager1.shutdown();
45
+ }
46
+ console.log();
47
+ // 测试 2: 禁用压缩
48
+ console.log('测试 2: 禁用 Spinner 压缩');
49
+ console.log('-'.repeat(80));
50
+ const manager2 = new TerminalManager({
51
+ maxBufferSize: 1000,
52
+ compactAnimations: false
53
+ });
54
+ try {
55
+ const terminalId2 = await manager2.createTerminal();
56
+ console.log(`✓ 创建终端: ${terminalId2}`);
57
+ // 执行相同的命令
58
+ console.log('执行命令: echo "开始"; for i in {1..20}; do echo -ne "\\r⠋ 处理中 $i"; sleep 0.05; done; echo -e "\\r✓ 完成!"');
59
+ await manager2.writeToTerminal({
60
+ terminalId: terminalId2,
61
+ input: 'echo "开始"; for i in {1..20}; do echo -ne "\\r⠋ 处理中 $i"; sleep 0.05; done; echo -e "\\r✓ 完成!"'
62
+ });
63
+ // 等待命令执行
64
+ await sleep(2000);
65
+ // 读取输出
66
+ const result2 = await manager2.readFromTerminal({ terminalId: terminalId2 });
67
+ console.log('\n输出行数:', result2.totalLines);
68
+ console.log('输出内容:');
69
+ console.log(result2.output);
70
+ console.log();
71
+ await manager2.killTerminal(terminalId2);
72
+ }
73
+ finally {
74
+ await manager2.shutdown();
75
+ }
76
+ console.log();
77
+ // 测试 3: 模拟 npm install 风格的输出
78
+ console.log('测试 3: 模拟 npm install 风格的输出(启用压缩)');
79
+ console.log('-'.repeat(80));
80
+ const manager3 = new TerminalManager({
81
+ maxBufferSize: 1000,
82
+ compactAnimations: true,
83
+ animationThrottleMs: 100
84
+ });
85
+ try {
86
+ const terminalId3 = await manager3.createTerminal();
87
+ console.log(`✓ 创建终端: ${terminalId3}`);
88
+ // 模拟 npm install 的输出模式
89
+ const command = `
90
+ cat << 'EOF'
91
+ npm install
92
+ ⠋ Installing dependencies
93
+ ⠙ Installing dependencies
94
+ ⠹ Installing dependencies
95
+ ⠸ Installing dependencies
96
+ ⠼ Installing dependencies
97
+ ⠴ Installing dependencies
98
+ ⠦ Installing dependencies
99
+ ⠧ Installing dependencies
100
+ ⠇ Installing dependencies
101
+ ⠏ Installing dependencies
102
+ ✓ Dependencies installed
103
+
104
+ ⠋ Building project
105
+ ⠙ Building project
106
+ ⠹ Building project
107
+ ⠸ Building project
108
+ ⠼ Building project
109
+ ✓ Build complete
110
+
111
+ All done!
112
+ EOF
113
+ `.trim();
114
+ await manager3.writeToTerminal({
115
+ terminalId: terminalId3,
116
+ input: command
117
+ });
118
+ // 等待命令执行
119
+ await sleep(1000);
120
+ // 读取输出
121
+ const result3 = await manager3.readFromTerminal({ terminalId: terminalId3 });
122
+ console.log('\n输出行数:', result3.totalLines);
123
+ console.log('输出内容:');
124
+ console.log(result3.output);
125
+ console.log();
126
+ // 获取统计信息
127
+ const stats3 = await manager3.getTerminalStats(terminalId3);
128
+ console.log('统计信息:');
129
+ console.log(` 总行数: ${stats3.totalLines}`);
130
+ console.log(` 总字节数: ${stats3.totalBytes}`);
131
+ console.log(` 估计 Token 数: ${stats3.estimatedTokens}`);
132
+ console.log(` 缓冲区大小: ${stats3.bufferSize} 行`);
133
+ console.log();
134
+ await manager3.killTerminal(terminalId3);
135
+ }
136
+ finally {
137
+ await manager3.shutdown();
138
+ }
139
+ console.log('='.repeat(80));
140
+ console.log('测试完成!');
141
+ console.log('='.repeat(80));
142
+ console.log();
143
+ console.log('总结:');
144
+ console.log('- 启用 spinner 压缩后,重复的动画帧会被合并');
145
+ console.log('- 真实的日志内容会被保留');
146
+ console.log('- 可以通过环境变量 COMPACT_ANIMATIONS=false 来禁用此功能');
147
+ console.log('- 可以通过环境变量 ANIMATION_THROTTLE_MS 来调整节流时间(默认 100ms)');
148
+ console.log();
149
+ }
150
+ // 运行测试
151
+ testSpinnerCompaction().catch(error => {
152
+ console.error('测试失败:', error);
153
+ process.exit(1);
154
+ });
155
+ //# sourceMappingURL=test-spinner-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-spinner-compaction.js","sourceRoot":"","sources":["../../src/examples/test-spinner-compaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Test script for Web UI feature
4
+ *
5
+ * This script tests the open_terminal_ui tool by:
6
+ * 1. Creating a terminal manager
7
+ * 2. Creating some test terminals
8
+ * 3. Starting the Web UI
9
+ * 4. Keeping the server running for manual testing
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=test-web-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-web-ui.d.ts","sourceRoot":"","sources":["../../src/examples/test-web-ui.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Test script for Web UI feature
4
+ *
5
+ * This script tests the open_terminal_ui tool by:
6
+ * 1. Creating a terminal manager
7
+ * 2. Creating some test terminals
8
+ * 3. Starting the Web UI
9
+ * 4. Keeping the server running for manual testing
10
+ */
11
+ import { TerminalManager } from '../terminal-manager.js';
12
+ import { WebUIManager } from '../web-ui-manager.js';
13
+ async function main() {
14
+ console.log('🧪 Testing Web UI Feature...\n');
15
+ // Create terminal manager
16
+ console.log('1️⃣ Creating terminal manager...');
17
+ const terminalManager = new TerminalManager({
18
+ maxBufferSize: 10000,
19
+ sessionTimeout: 86400000
20
+ });
21
+ console.log('✅ Terminal manager created\n');
22
+ // Create some test terminals
23
+ console.log('2️⃣ Creating test terminals...');
24
+ const terminal1 = await terminalManager.createTerminal({
25
+ shell: '/bin/bash',
26
+ cwd: process.cwd()
27
+ });
28
+ console.log(`✅ Terminal 1 created: ${terminal1}`);
29
+ const terminal2 = await terminalManager.createTerminal({
30
+ shell: '/bin/bash',
31
+ cwd: process.cwd()
32
+ });
33
+ console.log(`✅ Terminal 2 created: ${terminal2}`);
34
+ // Send some commands to make them interesting
35
+ await terminalManager.writeToTerminal({
36
+ terminalId: terminal1,
37
+ input: 'echo "Hello from Terminal 1"'
38
+ });
39
+ await terminalManager.writeToTerminal({
40
+ terminalId: terminal2,
41
+ input: 'echo "Hello from Terminal 2"'
42
+ });
43
+ // Wait a bit for output
44
+ await new Promise(resolve => setTimeout(resolve, 500));
45
+ console.log('\n3️⃣ Starting Web UI...');
46
+ // Create and start Web UI
47
+ const webUiManager = new WebUIManager();
48
+ try {
49
+ const result = await webUiManager.start({
50
+ port: 3002,
51
+ autoOpen: true,
52
+ terminalManager
53
+ });
54
+ console.log('✅ Web UI started successfully!\n');
55
+ console.log('📊 Details:');
56
+ console.log(` URL: ${result.url}`);
57
+ console.log(` Port: ${result.port}`);
58
+ console.log(` Mode: ${result.mode}`);
59
+ console.log(` Browser opened: ${result.autoOpened ? 'Yes' : 'No'}\n`);
60
+ console.log('🌐 Web UI is now running!');
61
+ console.log(' Open your browser to: ' + result.url);
62
+ console.log('\n📝 You can:');
63
+ console.log(' - View the terminal list');
64
+ console.log(' - Click on a terminal to see its output');
65
+ console.log(' - Create new terminals');
66
+ console.log(' - Send commands to terminals');
67
+ console.log(' - Kill terminals');
68
+ console.log('\n⏸️ Press Ctrl+C to stop the server\n');
69
+ // Keep the process running
70
+ process.on('SIGINT', async () => {
71
+ console.log('\n\n🛑 Shutting down...');
72
+ await webUiManager.stop();
73
+ await terminalManager.shutdown();
74
+ console.log('✅ Cleanup complete');
75
+ process.exit(0);
76
+ });
77
+ // Keep alive
78
+ await new Promise(() => { });
79
+ }
80
+ catch (error) {
81
+ console.error('❌ Error starting Web UI:', error);
82
+ await terminalManager.shutdown();
83
+ process.exit(1);
84
+ }
85
+ }
86
+ main().catch((error) => {
87
+ console.error('❌ Fatal error:', error);
88
+ process.exit(1);
89
+ });
90
+ //# sourceMappingURL=test-web-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-web-ui.js","sourceRoot":"","sources":["../../src/examples/test-web-ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export { PersistentTerminalMcpServer } from './mcp-server.js';
3
+ export { TerminalManager } from './terminal-manager.js';
4
+ export { WebUIManager } from './web-ui-manager.js';
5
+ export { WebUIServer } from './web-ui-server.js';
6
+ export { RestApiServer } from './rest-api.js';
7
+ export type { TerminalManagerConfig, TerminalReadOptions, TerminalReadResult, TerminalWriteOptions, TerminalCreateOptions, TerminalStatsResult, TerminalStatsInput, TerminalReadStatus, TerminalListResult, TerminalSession, TerminalError, CommandRuntimeInfo, CommandSummary, OutputBufferEntry, BufferReadOptions, BufferReadResult, WriteTerminalResult, ReadTerminalInput, KillTerminalInput, KillTerminalResult, CreateTerminalInput, CreateTerminalResult, WriteTerminalInput, ListTerminalsResult } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map