staff-mcp 1.2.0 → 2.0.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 (133) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +178 -49
  3. package/README_zh.md +176 -47
  4. package/dist/src/data/HttpDataSession.d.ts +22 -0
  5. package/dist/src/data/HttpDataSession.js +925 -0
  6. package/dist/src/data/HttpDataSession.js.map +1 -0
  7. package/dist/src/data/node.d.ts +4 -0
  8. package/dist/src/data/node.js +93 -0
  9. package/dist/src/data/node.js.map +1 -0
  10. package/dist/src/data/types.d.ts +54 -0
  11. package/dist/src/data/types.js +2 -0
  12. package/dist/src/data/types.js.map +1 -0
  13. package/dist/src/data-stdio-docker.d.ts +10 -0
  14. package/dist/src/data-stdio-docker.js +140 -0
  15. package/dist/src/data-stdio-docker.js.map +1 -0
  16. package/dist/src/docker-proxy.d.ts +6 -1
  17. package/dist/src/docker-proxy.js +324 -147
  18. package/dist/src/docker-proxy.js.map +1 -1
  19. package/dist/src/extensions/apps.d.ts +12 -0
  20. package/dist/src/extensions/apps.js +85 -0
  21. package/dist/src/extensions/apps.js.map +1 -0
  22. package/dist/src/extensions/config.d.ts +27 -0
  23. package/dist/src/extensions/config.js +91 -0
  24. package/dist/src/extensions/config.js.map +1 -0
  25. package/dist/src/extensions/protocol.d.ts +35 -0
  26. package/dist/src/extensions/protocol.js +47 -0
  27. package/dist/src/extensions/protocol.js.map +1 -0
  28. package/dist/src/extensions/runtime.d.ts +16 -0
  29. package/dist/src/extensions/runtime.js +266 -0
  30. package/dist/src/extensions/runtime.js.map +1 -0
  31. package/dist/src/file-manager/extension.d.ts +21 -0
  32. package/dist/src/file-manager/extension.js +514 -0
  33. package/dist/src/file-manager/extension.js.map +1 -0
  34. package/dist/src/file-manager/file-core.d.ts +128 -0
  35. package/dist/src/file-manager/file-core.js +750 -0
  36. package/dist/src/file-manager/file-core.js.map +1 -0
  37. package/dist/src/file-manager/transfers.d.ts +423 -0
  38. package/dist/src/file-manager/transfers.js +540 -0
  39. package/dist/src/file-manager/transfers.js.map +1 -0
  40. package/dist/src/file-manager/ui/index.html +81 -0
  41. package/dist/src/index.js +289 -128
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/lsp/manager.d.ts +2 -0
  44. package/dist/src/lsp/manager.js +22 -10
  45. package/dist/src/lsp/manager.js.map +1 -1
  46. package/dist/src/reverse/SseTransport.d.ts +34 -0
  47. package/dist/src/reverse/SseTransport.js +215 -0
  48. package/dist/src/reverse/SseTransport.js.map +1 -0
  49. package/dist/src/reverse/http.d.ts +7 -0
  50. package/dist/src/reverse/http.js +85 -0
  51. package/dist/src/reverse/http.js.map +1 -0
  52. package/dist/src/server.d.ts +4 -2
  53. package/dist/src/server.js +80 -18
  54. package/dist/src/server.js.map +1 -1
  55. package/dist/src/terminal/extension.d.ts +4 -0
  56. package/dist/src/terminal/extension.js +108 -0
  57. package/dist/src/terminal/extension.js.map +1 -0
  58. package/dist/src/terminal/pty.d.ts +14 -0
  59. package/dist/src/terminal/pty.js +121 -0
  60. package/dist/src/terminal/pty.js.map +1 -0
  61. package/dist/src/terminal/session.d.ts +136 -0
  62. package/dist/src/terminal/session.js +422 -0
  63. package/dist/src/terminal/session.js.map +1 -0
  64. package/dist/src/terminal/ui/index.html +183 -0
  65. package/dist/src/tools/file-tools.d.ts +2 -1
  66. package/dist/src/tools/file-tools.js +19 -7
  67. package/dist/src/tools/file-tools.js.map +1 -1
  68. package/dist/src/tools/mcp-client-tools.js +244 -104
  69. package/dist/src/tools/mcp-client-tools.js.map +1 -1
  70. package/dist/src/tools/shell-tools.js +1 -1
  71. package/dist/src/tools/shell-tools.js.map +1 -1
  72. package/dist/src/tools/skills.js +26 -1
  73. package/dist/src/tools/skills.js.map +1 -1
  74. package/dist/src/tools/system-tools.d.ts +9 -3
  75. package/dist/src/tools/system-tools.js +31 -48
  76. package/dist/src/tools/system-tools.js.map +1 -1
  77. package/dist/src/transports/http.d.ts +16 -2
  78. package/dist/src/transports/http.js +261 -59
  79. package/dist/src/transports/http.js.map +1 -1
  80. package/dist/src/transports/reverse.d.ts +23 -19
  81. package/dist/src/transports/reverse.js +130 -74
  82. package/dist/src/transports/reverse.js.map +1 -1
  83. package/dist/src/transports/stdio.d.ts +6 -2
  84. package/dist/src/transports/stdio.js +131 -19
  85. package/dist/src/transports/stdio.js.map +1 -1
  86. package/dist/src/utils/proxy.d.ts +3 -3
  87. package/dist/src/utils/proxy.js +84 -62
  88. package/dist/src/utils/proxy.js.map +1 -1
  89. package/dist/src/utils/server-activity.d.ts +6 -0
  90. package/dist/src/utils/server-activity.js +46 -0
  91. package/dist/src/utils/server-activity.js.map +1 -0
  92. package/dist/src/utils/server-lifecycle.d.ts +5 -0
  93. package/dist/src/utils/server-lifecycle.js +51 -0
  94. package/dist/src/utils/server-lifecycle.js.map +1 -0
  95. package/docs/file-manager.md +179 -0
  96. package/docs/terminal.md +66 -0
  97. package/package.json +40 -19
  98. package/dist/src/transports/fte-lifecycle.d.ts +0 -13
  99. package/dist/src/transports/fte-lifecycle.js +0 -76
  100. package/dist/src/transports/fte-lifecycle.js.map +0 -1
  101. package/dist/tests/docker-proxy.test.d.ts +0 -1
  102. package/dist/tests/docker-proxy.test.js +0 -395
  103. package/dist/tests/docker-proxy.test.js.map +0 -1
  104. package/dist/tests/file-write-queue.test.d.ts +0 -1
  105. package/dist/tests/file-write-queue.test.js +0 -105
  106. package/dist/tests/file-write-queue.test.js.map +0 -1
  107. package/dist/tests/fte-lifecycle.test.d.ts +0 -1
  108. package/dist/tests/fte-lifecycle.test.js +0 -118
  109. package/dist/tests/fte-lifecycle.test.js.map +0 -1
  110. package/dist/tests/lsp-client.test.d.ts +0 -1
  111. package/dist/tests/lsp-client.test.js +0 -52
  112. package/dist/tests/lsp-client.test.js.map +0 -1
  113. package/dist/tests/package-info.test.d.ts +0 -1
  114. package/dist/tests/package-info.test.js +0 -54
  115. package/dist/tests/package-info.test.js.map +0 -1
  116. package/dist/tests/proxy-no-proxy.test.d.ts +0 -1
  117. package/dist/tests/proxy-no-proxy.test.js +0 -156
  118. package/dist/tests/proxy-no-proxy.test.js.map +0 -1
  119. package/dist/tests/proxy.test.d.ts +0 -1
  120. package/dist/tests/proxy.test.js +0 -89
  121. package/dist/tests/proxy.test.js.map +0 -1
  122. package/dist/tests/reverse-reconnect.test.d.ts +0 -1
  123. package/dist/tests/reverse-reconnect.test.js +0 -89
  124. package/dist/tests/reverse-reconnect.test.js.map +0 -1
  125. package/dist/tests/security.test.d.ts +0 -1
  126. package/dist/tests/security.test.js +0 -21
  127. package/dist/tests/security.test.js.map +0 -1
  128. package/dist/tests/shell-tools.test.d.ts +0 -1
  129. package/dist/tests/shell-tools.test.js +0 -113
  130. package/dist/tests/shell-tools.test.js.map +0 -1
  131. package/dist/tests/test_files/test.d.ts +0 -1
  132. package/dist/tests/test_files/test.js +0 -4
  133. package/dist/tests/test_files/test.js.map +0 -1
@@ -0,0 +1,422 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import { performance } from 'node:perf_hooks';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { TERMINAL, LEASE_MS, MAX_RECORDS, RECORD_TTL_MS, extensionError, } from '../extensions/protocol.js';
5
+ import { signalGroup, writeInput } from './pty.js';
6
+ const INPUT_LIMIT = 32 * 1024;
7
+ const OUTPUT_LIMIT = 256 * 1024;
8
+ const sessions = new Set();
9
+ process.once('exit', () => {
10
+ for (const session of sessions)
11
+ session.cleanupOnExit();
12
+ });
13
+ export class TerminalSession {
14
+ core;
15
+ runtime;
16
+ authorize;
17
+ operations = new Map();
18
+ resources = new Map();
19
+ outputBytes = 0;
20
+ disposed = false;
21
+ closing;
22
+ timer;
23
+ constructor(core, runtime, authorize) {
24
+ this.core = core;
25
+ this.runtime = runtime;
26
+ this.authorize = authorize;
27
+ sessions.add(this);
28
+ this.timer = setInterval(() => this.sweep(), 1000);
29
+ this.timer.unref();
30
+ }
31
+ /** PTY ownership and output draining remain active even with no new bytes. */
32
+ hasActivity() {
33
+ const now = performance.now();
34
+ for (const item of this.operations.values()) {
35
+ if (item.job ||
36
+ item.resolveExit ||
37
+ item.pumping ||
38
+ item.state === 'starting' ||
39
+ item.state === 'running' ||
40
+ item.state === 'closing' ||
41
+ (item.state === 'closed' &&
42
+ item.bound &&
43
+ !item.fenced &&
44
+ item.expires > now))
45
+ return true;
46
+ }
47
+ return false;
48
+ }
49
+ sweep() {
50
+ const now = performance.now();
51
+ for (const [operationId, item] of this.operations) {
52
+ if ((item.state === 'starting' ||
53
+ item.state === 'running' ||
54
+ (item.state === 'closed' && item.bound && !item.fenced)) &&
55
+ item.expires <= now)
56
+ this.stop(item, 'LEASE_EXPIRED');
57
+ if (item.finished !== undefined &&
58
+ now - item.finished >= RECORD_TTL_MS &&
59
+ !item.job &&
60
+ !item.pumping) {
61
+ this.operations.delete(operationId);
62
+ if (item.terminalId)
63
+ this.resources.delete(item.terminalId);
64
+ }
65
+ }
66
+ }
67
+ check(item) {
68
+ this.authorize();
69
+ if (this.disposed)
70
+ extensionError('STALE_CONNECTION', 'Terminal connection closed');
71
+ if (item.expires <= performance.now()) {
72
+ this.stop(item, 'LEASE_EXPIRED');
73
+ extensionError('LEASE_EXPIRED', 'Terminal lease expired');
74
+ }
75
+ if (item.fenced ||
76
+ (item.state !== 'starting' && item.state !== 'running'))
77
+ extensionError('INVALID_STATE', 'Terminal is not running');
78
+ }
79
+ view(item) {
80
+ const base = {
81
+ operationId: item.operationId,
82
+ ...(item.terminalId ? { terminalId: item.terminalId } : {}),
83
+ state: item.state,
84
+ };
85
+ if (item.state === 'closed')
86
+ return {
87
+ ...base,
88
+ exit: item.exit,
89
+ ...(item.outputIncomplete
90
+ ? {
91
+ error: {
92
+ code: 'OUTPUT_INCOMPLETE',
93
+ message: 'PTY exited while output was backpressured; output may be incomplete',
94
+ },
95
+ }
96
+ : {}),
97
+ };
98
+ if (item.state === 'failed')
99
+ return {
100
+ ...base,
101
+ error: {
102
+ code: 'TERMINAL_START_FAILED',
103
+ message: 'Terminal could not be started',
104
+ },
105
+ };
106
+ return base;
107
+ }
108
+ createView(item) {
109
+ return {
110
+ ...this.view(item),
111
+ ...(item.state === 'running'
112
+ ? {
113
+ rootId: item.params.rootId,
114
+ path: item.cwd,
115
+ shell: this.runtime.shell,
116
+ leaseMs: Math.max(1, Math.ceil(item.expires - performance.now())),
117
+ recordTtlMs: RECORD_TTL_MS,
118
+ link: {
119
+ kind: 'channel',
120
+ purpose: TERMINAL,
121
+ resourceId: item.terminalId,
122
+ direction: 'duplex',
123
+ },
124
+ }
125
+ : {}),
126
+ };
127
+ }
128
+ async create(params) {
129
+ this.authorize();
130
+ if (this.disposed)
131
+ extensionError('STALE_CONNECTION', 'Terminal connection closed');
132
+ this.sweep();
133
+ const fingerprint = JSON.stringify([
134
+ params.rootId,
135
+ params.cols,
136
+ params.rows,
137
+ ]);
138
+ const existing = this.operations.get(params.operationId);
139
+ if (existing) {
140
+ if (existing.fingerprint && existing.fingerprint !== fingerprint)
141
+ extensionError('IDEMPOTENCY_CONFLICT', 'Terminal creation parameters changed');
142
+ await existing.job;
143
+ return this.createView(existing);
144
+ }
145
+ if (this.operations.size >= MAX_RECORDS)
146
+ extensionError('RESOURCE_LIMIT', 'Terminal record limit reached');
147
+ if ([...this.operations.values()].filter((item) => ['starting', 'running', 'closing'].includes(item.state)).length >= 2)
148
+ extensionError('RESOURCE_LIMIT', 'At most two terminals are allowed per connection');
149
+ const item = {
150
+ operationId: params.operationId,
151
+ params,
152
+ fingerprint,
153
+ state: 'starting',
154
+ expires: performance.now() + LEASE_MS,
155
+ bound: false,
156
+ fenced: false,
157
+ queue: [],
158
+ bytes: 0,
159
+ pumping: false,
160
+ subscriptions: [],
161
+ exit: { code: null, signal: null },
162
+ };
163
+ this.operations.set(params.operationId, item);
164
+ const job = this.start(item, params);
165
+ item.job = job;
166
+ try {
167
+ await job;
168
+ }
169
+ finally {
170
+ item.job = undefined;
171
+ }
172
+ return this.createView(item);
173
+ }
174
+ async start(item, params) {
175
+ try {
176
+ // cwd starts at an administrator-configured root; it is not a shell sandbox.
177
+ const cwd = await this.core.resolve(params.rootId, '');
178
+ item.cwd = cwd;
179
+ if (!(await fs.lstat(cwd)).isDirectory())
180
+ extensionError('INVALID_PARAMS', 'Terminal cwd must be a directory');
181
+ this.check(item);
182
+ const pty = this.runtime.spawn(cwd, params.cols, params.rows);
183
+ item.pty = pty;
184
+ item.exited = new Promise((resolve) => {
185
+ item.resolveExit = resolve;
186
+ });
187
+ pty.pause();
188
+ item.terminalId = randomUUID();
189
+ this.resources.set(item.terminalId, item);
190
+ item.subscriptions.push(pty.onData((raw) => {
191
+ // encoding:null makes node-pty emit raw Buffers. No per-chunk UTF-8 decoding.
192
+ const data = Buffer.isBuffer(raw)
193
+ ? raw
194
+ : Buffer.from(raw, 'utf8');
195
+ pty.pause();
196
+ if (item.fenced || this.disposed || !data.length)
197
+ return;
198
+ if (this.outputBytes + data.length > OUTPUT_LIMIT) {
199
+ this.stop(item, 'OUTPUT_LIMIT');
200
+ return;
201
+ }
202
+ this.outputBytes += data.length;
203
+ item.bytes += data.length;
204
+ item.queue.push(data);
205
+ void this.pump(item);
206
+ }));
207
+ item.subscriptions.push(pty.onExit((event) => {
208
+ item.exit = {
209
+ code: event.exitCode ?? null,
210
+ signal: event.signal ? String(event.signal) : null,
211
+ };
212
+ this.exited(item);
213
+ }));
214
+ this.check(item);
215
+ item.state = 'running';
216
+ }
217
+ catch {
218
+ if (item.pty)
219
+ this.stop(item, 'START_FAILED');
220
+ else if (item.state === 'starting') {
221
+ item.state = 'failed';
222
+ item.finished = performance.now();
223
+ }
224
+ }
225
+ }
226
+ async pump(item) {
227
+ if (item.pumping || !item.channel)
228
+ return;
229
+ item.pumping = true;
230
+ try {
231
+ while (item.queue.length && !item.fenced && !this.disposed) {
232
+ this.authorize();
233
+ const data = item.queue[0];
234
+ for (let offset = 0; offset < data.length; offset += 65536) {
235
+ if (item.fenced || this.disposed)
236
+ return;
237
+ await item.channel.write(data.subarray(offset, offset + 65536));
238
+ }
239
+ // Include the in-flight chunk in the bounded budget until write releases it.
240
+ if (item.queue[0] === data) {
241
+ item.queue.shift();
242
+ item.bytes -= data.length;
243
+ this.outputBytes -= data.length;
244
+ }
245
+ }
246
+ if (!item.fenced && !this.disposed) {
247
+ if (item.state === 'closed')
248
+ await item.channel.end();
249
+ else if (item.state === 'running')
250
+ item.pty?.resume();
251
+ }
252
+ }
253
+ catch {
254
+ this.stop(item, 'OUTPUT_FAILED');
255
+ }
256
+ finally {
257
+ item.pumping = false;
258
+ }
259
+ }
260
+ exited(item) {
261
+ // node-pty destroys the read socket 200ms after child exit, even while paused.
262
+ // A congested exit therefore cannot promise a complete output stream.
263
+ item.outputIncomplete =
264
+ !item.fenced && (!item.bound || item.pumping || item.bytes > 0);
265
+ clearTimeout(item.killTimer);
266
+ item.state = 'closed';
267
+ item.finished = performance.now();
268
+ for (const subscription of item.subscriptions)
269
+ subscription.dispose();
270
+ item.subscriptions.length = 0;
271
+ if (item.outputIncomplete)
272
+ this.stop(item, 'OUTPUT_INCOMPLETE');
273
+ else if (item.fenced)
274
+ this.clearOutput(item);
275
+ else
276
+ void this.pump(item);
277
+ item.resolveExit?.();
278
+ item.resolveExit = undefined;
279
+ }
280
+ clearOutput(item) {
281
+ this.outputBytes -= item.bytes;
282
+ item.bytes = 0;
283
+ item.queue.length = 0;
284
+ }
285
+ stop(item, code) {
286
+ if (item.fenced)
287
+ return;
288
+ item.fenced = true;
289
+ item.channel?.close(code);
290
+ this.clearOutput(item);
291
+ if (!item.pty || item.state === 'closed' || item.state === 'failed') {
292
+ if (item.state !== 'failed')
293
+ item.state = 'closed';
294
+ item.finished ??= performance.now();
295
+ return;
296
+ }
297
+ item.state = 'closing';
298
+ item.pty.pause();
299
+ signalGroup(item.pty, 'SIGTERM');
300
+ item.killTimer = setTimeout(() => {
301
+ if (item.pty && item.state === 'closing')
302
+ signalGroup(item.pty, 'SIGKILL');
303
+ }, 1000);
304
+ item.killTimer.unref();
305
+ }
306
+ status(operationId) {
307
+ this.sweep();
308
+ const item = this.operations.get(operationId);
309
+ return item ? this.view(item) : { operationId, state: 'unknown' };
310
+ }
311
+ resize(terminalId, cols, rows) {
312
+ const item = this.resource(terminalId);
313
+ this.check(item);
314
+ if (item.state !== 'running')
315
+ extensionError('INVALID_STATE', 'Terminal is not running');
316
+ try {
317
+ item.pty.resize(cols, rows);
318
+ }
319
+ catch {
320
+ extensionError('INVALID_STATE', 'Terminal resize failed');
321
+ }
322
+ return { terminalId, cols, rows };
323
+ }
324
+ renew(terminalId) {
325
+ const item = this.resource(terminalId);
326
+ this.check(item);
327
+ item.expires = performance.now() + LEASE_MS;
328
+ return { terminalId, leaseMs: LEASE_MS };
329
+ }
330
+ closeOperation(operationId, reason) {
331
+ this.sweep();
332
+ let item = this.operations.get(operationId);
333
+ if (!item) {
334
+ if (this.operations.size >= MAX_RECORDS)
335
+ extensionError('RESOURCE_LIMIT', 'Terminal record limit reached');
336
+ item = {
337
+ operationId,
338
+ state: 'closed',
339
+ expires: 0,
340
+ finished: performance.now(),
341
+ bound: false,
342
+ fenced: true,
343
+ queue: [],
344
+ bytes: 0,
345
+ pumping: false,
346
+ subscriptions: [],
347
+ exit: { code: null, signal: null },
348
+ };
349
+ this.operations.set(operationId, item);
350
+ }
351
+ else
352
+ this.stop(item, reason === 'page-exit' ? 'PAGE_EXIT' : 'USER');
353
+ return this.view(item);
354
+ }
355
+ resource(terminalId) {
356
+ const item = this.resources.get(terminalId);
357
+ if (!item)
358
+ extensionError('RESOURCE_NOT_FOUND', 'Unknown terminal in this connection');
359
+ return item;
360
+ }
361
+ async acceptChannel(open, channel) {
362
+ if (open.purpose !== TERMINAL || open.direction !== 'duplex')
363
+ extensionError('INVALID_PARAMS', 'Terminal channel must be duplex');
364
+ const item = this.resource(open.resourceId);
365
+ this.check(item);
366
+ if (item.bound || item.state !== 'running')
367
+ extensionError('WRITER_CONFLICT', 'Terminal may be bound only once');
368
+ item.bound = true;
369
+ item.channel = channel;
370
+ void this.pump(item);
371
+ return {
372
+ data: async (data) => {
373
+ this.check(item);
374
+ if (data.byteLength > 64 * 1024)
375
+ extensionError('LIMIT_EXCEEDED', 'Terminal input delivery limit is 64 KiB');
376
+ try {
377
+ // HTTP delivery boundaries need not match the host's <=32 KiB
378
+ // inputs. Split raw bytes, not UTF-8 text, and await each write.
379
+ for (let offset = 0; offset < data.byteLength; offset += INPUT_LIMIT) {
380
+ await writeInput(item.pty, data.subarray(offset, offset + INPUT_LIMIT), () => this.check(item));
381
+ }
382
+ }
383
+ catch {
384
+ this.stop(item, 'INPUT_FAILED');
385
+ extensionError('INVALID_STATE', 'Terminal input failed');
386
+ }
387
+ },
388
+ end: () => {
389
+ this.stop(item, 'INPUT_ENDED');
390
+ },
391
+ close: (reason) => {
392
+ this.stop(item, reason ? 'CHANNEL_CLOSED' : 'CHANNEL_ENDED');
393
+ },
394
+ };
395
+ }
396
+ cleanupOnExit() {
397
+ for (const item of this.operations.values()) {
398
+ if (item.pty &&
399
+ (item.state === 'running' || item.state === 'closing'))
400
+ signalGroup(item.pty, 'SIGKILL');
401
+ }
402
+ }
403
+ close() {
404
+ if (this.closing)
405
+ return this.closing;
406
+ this.disposed = true;
407
+ clearInterval(this.timer);
408
+ for (const item of this.operations.values()) {
409
+ this.stop(item, 'STALE_CONNECTION');
410
+ // Normal shutdown must remain alive through TERM -> KILL -> exit.
411
+ item.killTimer?.ref();
412
+ }
413
+ this.closing = Promise.all([...this.operations.values()].map(async (item) => {
414
+ await item.job;
415
+ await item.exited;
416
+ })).then(() => {
417
+ sessions.delete(this);
418
+ });
419
+ return this.closing;
420
+ }
421
+ }
422
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/terminal/session.ts"],"names":[],"mappings":"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"}