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.
- package/CHANGELOG.md +29 -0
- package/README.md +178 -49
- package/README_zh.md +176 -47
- package/dist/src/data/HttpDataSession.d.ts +22 -0
- package/dist/src/data/HttpDataSession.js +925 -0
- package/dist/src/data/HttpDataSession.js.map +1 -0
- package/dist/src/data/node.d.ts +4 -0
- package/dist/src/data/node.js +93 -0
- package/dist/src/data/node.js.map +1 -0
- package/dist/src/data/types.d.ts +54 -0
- package/dist/src/data/types.js +2 -0
- package/dist/src/data/types.js.map +1 -0
- package/dist/src/data-stdio-docker.d.ts +10 -0
- package/dist/src/data-stdio-docker.js +140 -0
- package/dist/src/data-stdio-docker.js.map +1 -0
- package/dist/src/docker-proxy.d.ts +6 -1
- package/dist/src/docker-proxy.js +324 -147
- package/dist/src/docker-proxy.js.map +1 -1
- package/dist/src/extensions/apps.d.ts +12 -0
- package/dist/src/extensions/apps.js +85 -0
- package/dist/src/extensions/apps.js.map +1 -0
- package/dist/src/extensions/config.d.ts +27 -0
- package/dist/src/extensions/config.js +91 -0
- package/dist/src/extensions/config.js.map +1 -0
- package/dist/src/extensions/protocol.d.ts +35 -0
- package/dist/src/extensions/protocol.js +47 -0
- package/dist/src/extensions/protocol.js.map +1 -0
- package/dist/src/extensions/runtime.d.ts +16 -0
- package/dist/src/extensions/runtime.js +266 -0
- package/dist/src/extensions/runtime.js.map +1 -0
- package/dist/src/file-manager/extension.d.ts +21 -0
- package/dist/src/file-manager/extension.js +514 -0
- package/dist/src/file-manager/extension.js.map +1 -0
- package/dist/src/file-manager/file-core.d.ts +128 -0
- package/dist/src/file-manager/file-core.js +750 -0
- package/dist/src/file-manager/file-core.js.map +1 -0
- package/dist/src/file-manager/transfers.d.ts +423 -0
- package/dist/src/file-manager/transfers.js +540 -0
- package/dist/src/file-manager/transfers.js.map +1 -0
- package/dist/src/file-manager/ui/index.html +81 -0
- package/dist/src/index.js +289 -128
- package/dist/src/index.js.map +1 -1
- package/dist/src/lsp/manager.d.ts +2 -0
- package/dist/src/lsp/manager.js +22 -10
- package/dist/src/lsp/manager.js.map +1 -1
- package/dist/src/reverse/SseTransport.d.ts +34 -0
- package/dist/src/reverse/SseTransport.js +215 -0
- package/dist/src/reverse/SseTransport.js.map +1 -0
- package/dist/src/reverse/http.d.ts +7 -0
- package/dist/src/reverse/http.js +85 -0
- package/dist/src/reverse/http.js.map +1 -0
- package/dist/src/server.d.ts +4 -2
- package/dist/src/server.js +80 -18
- package/dist/src/server.js.map +1 -1
- package/dist/src/terminal/extension.d.ts +4 -0
- package/dist/src/terminal/extension.js +108 -0
- package/dist/src/terminal/extension.js.map +1 -0
- package/dist/src/terminal/pty.d.ts +14 -0
- package/dist/src/terminal/pty.js +121 -0
- package/dist/src/terminal/pty.js.map +1 -0
- package/dist/src/terminal/session.d.ts +136 -0
- package/dist/src/terminal/session.js +422 -0
- package/dist/src/terminal/session.js.map +1 -0
- package/dist/src/terminal/ui/index.html +183 -0
- package/dist/src/tools/file-tools.d.ts +2 -1
- package/dist/src/tools/file-tools.js +19 -7
- package/dist/src/tools/file-tools.js.map +1 -1
- package/dist/src/tools/mcp-client-tools.js +244 -104
- package/dist/src/tools/mcp-client-tools.js.map +1 -1
- package/dist/src/tools/shell-tools.js +1 -1
- package/dist/src/tools/shell-tools.js.map +1 -1
- package/dist/src/tools/skills.js +26 -1
- package/dist/src/tools/skills.js.map +1 -1
- package/dist/src/tools/system-tools.d.ts +9 -3
- package/dist/src/tools/system-tools.js +31 -48
- package/dist/src/tools/system-tools.js.map +1 -1
- package/dist/src/transports/http.d.ts +16 -2
- package/dist/src/transports/http.js +261 -59
- package/dist/src/transports/http.js.map +1 -1
- package/dist/src/transports/reverse.d.ts +23 -19
- package/dist/src/transports/reverse.js +130 -74
- package/dist/src/transports/reverse.js.map +1 -1
- package/dist/src/transports/stdio.d.ts +6 -2
- package/dist/src/transports/stdio.js +131 -19
- package/dist/src/transports/stdio.js.map +1 -1
- package/dist/src/utils/proxy.d.ts +3 -3
- package/dist/src/utils/proxy.js +84 -62
- package/dist/src/utils/proxy.js.map +1 -1
- package/dist/src/utils/server-activity.d.ts +6 -0
- package/dist/src/utils/server-activity.js +46 -0
- package/dist/src/utils/server-activity.js.map +1 -0
- package/dist/src/utils/server-lifecycle.d.ts +5 -0
- package/dist/src/utils/server-lifecycle.js +51 -0
- package/dist/src/utils/server-lifecycle.js.map +1 -0
- package/docs/file-manager.md +179 -0
- package/docs/terminal.md +66 -0
- package/package.json +40 -19
- package/dist/src/transports/fte-lifecycle.d.ts +0 -13
- package/dist/src/transports/fte-lifecycle.js +0 -76
- package/dist/src/transports/fte-lifecycle.js.map +0 -1
- package/dist/tests/docker-proxy.test.d.ts +0 -1
- package/dist/tests/docker-proxy.test.js +0 -395
- package/dist/tests/docker-proxy.test.js.map +0 -1
- package/dist/tests/file-write-queue.test.d.ts +0 -1
- package/dist/tests/file-write-queue.test.js +0 -105
- package/dist/tests/file-write-queue.test.js.map +0 -1
- package/dist/tests/fte-lifecycle.test.d.ts +0 -1
- package/dist/tests/fte-lifecycle.test.js +0 -118
- package/dist/tests/fte-lifecycle.test.js.map +0 -1
- package/dist/tests/lsp-client.test.d.ts +0 -1
- package/dist/tests/lsp-client.test.js +0 -52
- package/dist/tests/lsp-client.test.js.map +0 -1
- package/dist/tests/package-info.test.d.ts +0 -1
- package/dist/tests/package-info.test.js +0 -54
- package/dist/tests/package-info.test.js.map +0 -1
- package/dist/tests/proxy-no-proxy.test.d.ts +0 -1
- package/dist/tests/proxy-no-proxy.test.js +0 -156
- package/dist/tests/proxy-no-proxy.test.js.map +0 -1
- package/dist/tests/proxy.test.d.ts +0 -1
- package/dist/tests/proxy.test.js +0 -89
- package/dist/tests/proxy.test.js.map +0 -1
- package/dist/tests/reverse-reconnect.test.d.ts +0 -1
- package/dist/tests/reverse-reconnect.test.js +0 -89
- package/dist/tests/reverse-reconnect.test.js.map +0 -1
- package/dist/tests/security.test.d.ts +0 -1
- package/dist/tests/security.test.js +0 -21
- package/dist/tests/security.test.js.map +0 -1
- package/dist/tests/shell-tools.test.d.ts +0 -1
- package/dist/tests/shell-tools.test.js +0 -113
- package/dist/tests/shell-tools.test.js.map +0 -1
- package/dist/tests/test_files/test.d.ts +0 -1
- package/dist/tests/test_files/test.js +0 -4
- package/dist/tests/test_files/test.js.map +0 -1
package/dist/src/index.js
CHANGED
|
@@ -1,60 +1,169 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { Command, InvalidArgumentError } from
|
|
3
|
-
import * as path from
|
|
4
|
-
import * as os from
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
2
|
+
import { Command, InvalidArgumentError, Option } from 'commander';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
import { mkdirSync } from 'node:fs';
|
|
6
|
+
import { createServerFactory } from './server.js';
|
|
7
|
+
import { buildDockerNameHint, runDockerProxy, preflightDockerExtensions, } from './docker-proxy.js';
|
|
8
|
+
import { STAFF_MCP_PACKAGE_ROOT, STAFF_MCP_VERSION } from './package-info.js';
|
|
9
|
+
import { redirectStdioLogsToStderr, startStdioServer, } from './transports/stdio.js';
|
|
10
|
+
import { getHttpAuthToken, startHttpServer, resolveHttpSessionPolicy, HTTP_MAX_SESSIONS, HTTP_SESSION_IDLE_MS, } from './transports/http.js';
|
|
11
|
+
import { startReverseServer } from './transports/reverse.js';
|
|
12
|
+
import { ensureStaffDirs, STAFF_TOOLS_DIR, STAFF_SKILLS_DIR, STAFF_PROFILES_DIR, } from './utils/paths.js';
|
|
13
|
+
import { ensureRipgrep } from './utils/tool-utils.js';
|
|
14
|
+
import { configureGlobalProxy } from './utils/proxy.js';
|
|
15
|
+
import { dockerPrivatePaths, parseExtensions, parseFileRoot, resolveExtensionOptions, } from './extensions/config.js';
|
|
14
16
|
// Global error handlers to prevent the MCP server from crashing due to unhandled child process errors
|
|
15
|
-
process.on(
|
|
16
|
-
if (err.code ===
|
|
17
|
+
process.on('uncaughtException', (err) => {
|
|
18
|
+
if (err.code === 'ENOENT' &&
|
|
19
|
+
err.syscall &&
|
|
20
|
+
err.syscall.startsWith('spawn')) {
|
|
17
21
|
console.error(`[staff-mcp] Captured unhandled spawn error: ${err.message}. A background tool failed to start.`);
|
|
18
22
|
}
|
|
19
23
|
else {
|
|
20
|
-
console.error(
|
|
24
|
+
console.error('[staff-mcp] Uncaught Exception:', err);
|
|
21
25
|
}
|
|
22
26
|
});
|
|
23
|
-
process.on(
|
|
24
|
-
console.error(
|
|
27
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
28
|
+
console.error('[staff-mcp] Unhandled Rejection at:', promise, 'reason:', reason);
|
|
25
29
|
});
|
|
26
30
|
function milliseconds(value, minimum = 1) {
|
|
27
31
|
const parsed = Number(value);
|
|
28
|
-
if (!Number.isInteger(parsed) ||
|
|
32
|
+
if (!Number.isInteger(parsed) ||
|
|
33
|
+
parsed < minimum ||
|
|
34
|
+
parsed > 2_147_483_647) {
|
|
29
35
|
throw new InvalidArgumentError(`Expected milliseconds between ${minimum} and 2147483647.`);
|
|
30
36
|
}
|
|
31
37
|
return parsed;
|
|
32
38
|
}
|
|
39
|
+
/** CLI owns process exit; transports own and await their session resources. */
|
|
40
|
+
async function runHostService(start, watchHostPipe) {
|
|
41
|
+
const starting = start();
|
|
42
|
+
let stopping = false;
|
|
43
|
+
const shutdown = async (code) => {
|
|
44
|
+
if (stopping)
|
|
45
|
+
return;
|
|
46
|
+
stopping = true;
|
|
47
|
+
try {
|
|
48
|
+
const service = await starting;
|
|
49
|
+
await service.stop();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
console.error('[staff-mcp] Startup or shutdown cleanup failed.');
|
|
53
|
+
code = 1;
|
|
54
|
+
}
|
|
55
|
+
process.exit(code);
|
|
56
|
+
};
|
|
57
|
+
const stop = () => void shutdown(0);
|
|
58
|
+
const failed = () => void shutdown(1);
|
|
59
|
+
process.once('SIGINT', stop);
|
|
60
|
+
process.once('SIGTERM', stop);
|
|
61
|
+
process.once('SIGHUP', stop);
|
|
62
|
+
if (watchHostPipe) {
|
|
63
|
+
process.stdin.once('end', stop);
|
|
64
|
+
process.stdin.once('close', stop);
|
|
65
|
+
process.stdin.once('error', failed);
|
|
66
|
+
process.stdin.resume();
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const service = await starting;
|
|
70
|
+
void service.closed?.then(stop, failed);
|
|
71
|
+
if (watchHostPipe &&
|
|
72
|
+
(process.stdin.readableEnded || process.stdin.destroyed))
|
|
73
|
+
stop();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error('[staff-mcp] Transport startup failed:', error);
|
|
77
|
+
await shutdown(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
33
80
|
const program = new Command();
|
|
34
81
|
program
|
|
35
|
-
.name(
|
|
36
|
-
.description(
|
|
82
|
+
.name('staff-mcp')
|
|
83
|
+
.description('MCP Server with file, shell, and LSP capabilities.')
|
|
37
84
|
.version(STAFF_MCP_VERSION)
|
|
38
|
-
.option(
|
|
39
|
-
.option(
|
|
40
|
-
.option(
|
|
41
|
-
.option(
|
|
42
|
-
.option(
|
|
43
|
-
|
|
44
|
-
.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
.option(
|
|
49
|
-
.option(
|
|
50
|
-
.option(
|
|
51
|
-
.option(
|
|
52
|
-
.option(
|
|
53
|
-
.option(
|
|
54
|
-
.option(
|
|
55
|
-
.option(
|
|
56
|
-
.
|
|
85
|
+
.option('-t, --transport <type>', 'Transport type (stdio, http, reverse)', 'stdio')
|
|
86
|
+
.option('-p, --port <number>', 'Port for HTTP server', '3000')
|
|
87
|
+
.option('-h, --host <address>', 'Host for HTTP server', '127.0.0.1')
|
|
88
|
+
.option('--ht, --http-token <token>', 'Optional bearer token for HTTP transport')
|
|
89
|
+
.option('--http-max-sessions <count>', 'Maximum HTTP sessions per listener, including startup and cleanup', (value) => {
|
|
90
|
+
const count = Number(value);
|
|
91
|
+
if (!Number.isSafeInteger(count) || count <= 0)
|
|
92
|
+
throw new InvalidArgumentError('Expected a positive safe integer.');
|
|
93
|
+
return count;
|
|
94
|
+
}, HTTP_MAX_SESSIONS)
|
|
95
|
+
.option('--http-session-idle-ms <ms>', 'HTTP session idle timeout; active operations and resources prevent eviction', (value) => milliseconds(value), HTTP_SESSION_IDLE_MS)
|
|
96
|
+
.option('--ru, --reverse-url <url>', 'HTTP(S) Web reverse endpoint (e.g. https://web.example/api/mcp/reverse)')
|
|
97
|
+
.option('--rt, --reverse-token <token>', 'Security token for Reverse MCP')
|
|
98
|
+
.option('--rn, --reverse-name <name>', 'Server name for Reverse MCP')
|
|
99
|
+
.option('--reverse-connect-timeout <ms>', 'SSE connection timeout (0 disables it)', (value) => milliseconds(value, 0), 15000)
|
|
100
|
+
.option('--reverse-initialization-timeout <ms>', 'MCP initialization timeout after reverse pairing', (value) => milliseconds(value), 15000)
|
|
101
|
+
.option('--reverse-read-timeout <ms>', 'SSE heartbeat read timeout, independent of tool duration', (value) => milliseconds(value), 45000)
|
|
102
|
+
.option('--reverse-stable-time <ms>', 'Connection lifetime required to reset reconnect backoff', (value) => milliseconds(value, 0), 30000)
|
|
103
|
+
.option('-w, --working-dir <path>', 'Working directory for the server (defaults to current execution path)', process.cwd())
|
|
104
|
+
.option('-d, --allowed-dir <paths...>', 'Additional directories allowed for sandbox', [])
|
|
105
|
+
.option('-r, --profile <name>', 'The active profile for skills and instructions (e.g., android-reverse, default)', 'default')
|
|
106
|
+
.option('-m, --max-mcp-sessions <number>', 'Maximum number of concurrent MCP sessions allowed', '5')
|
|
107
|
+
.option('--enable-lsp', 'Enable LSP capabilities (disabled by default)', false)
|
|
108
|
+
.option('--extensions <features>', 'Enable files and/or terminal (comma-separated; all disabled by default)', (value) => {
|
|
109
|
+
try {
|
|
110
|
+
return parseExtensions(value);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new InvalidArgumentError(error.message);
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
.option('--file-root <id=path>', 'Files root (repeatable; defaults to main=workspace; system=/ explicitly allows the full filesystem)', (value, previous = []) => {
|
|
117
|
+
try {
|
|
118
|
+
const root = parseFileRoot(value);
|
|
119
|
+
if (previous.some((item) => item.rootId === root.rootId))
|
|
120
|
+
throw new Error('Duplicate file root id');
|
|
121
|
+
return [...previous, root];
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
throw new InvalidArgumentError(error.message);
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
.option('--shell <path>', 'Terminal shell (default: executable $SHELL or /bin/bash)')
|
|
128
|
+
.addOption(new Option('--internal-file-private-path <path>')
|
|
129
|
+
.hideHelp()
|
|
130
|
+
.argParser((value, previous = []) => {
|
|
131
|
+
if (!path.posix.isAbsolute(value) || value.includes('\0'))
|
|
132
|
+
throw new InvalidArgumentError('Private path must be absolute');
|
|
133
|
+
return [...previous, value];
|
|
134
|
+
}))
|
|
135
|
+
.option('--docker <image>', 'Run the MCP server inside a Docker container using the specified image')
|
|
136
|
+
.option('-D, --docker-args <args...>', 'Additional arguments to pass to the docker run command (e.g., -e ADB_SERVER_SOCKET=...)')
|
|
137
|
+
.option('--proxy <url>', 'HTTP(S) proxy for outbound requests (e.g. http://127.0.0.1:8080); defaults to honoring HTTP_PROXY/HTTPS_PROXY/NO_PROXY env vars')
|
|
57
138
|
.action(async (options, command) => {
|
|
139
|
+
if (options.transport === 'stdio') {
|
|
140
|
+
redirectStdioLogsToStderr();
|
|
141
|
+
}
|
|
142
|
+
let extensions;
|
|
143
|
+
try {
|
|
144
|
+
extensions = resolveExtensionOptions({
|
|
145
|
+
enabled: options.extensions,
|
|
146
|
+
fileRoots: options.fileRoot,
|
|
147
|
+
shell: options.shell,
|
|
148
|
+
}, path.resolve(options.workingDir));
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
command.error(error.message);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (options.transport === 'http') {
|
|
155
|
+
try {
|
|
156
|
+
getHttpAuthToken(options.httpToken);
|
|
157
|
+
resolveHttpSessionPolicy({
|
|
158
|
+
maxSessions: options.httpMaxSessions,
|
|
159
|
+
idleTimeoutMs: options.httpSessionIdleMs,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.error(`[staff-mcp] ${error instanceof Error ? error.message : String(error)}`);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
58
167
|
// Install a proxy-aware global fetch dispatcher before anything can
|
|
59
168
|
// issue an outbound request. In --docker mode this also runs inside the
|
|
60
169
|
// container, where the same entry point is re-executed.
|
|
@@ -63,115 +172,162 @@ program
|
|
|
63
172
|
// Docker Transparent Proxy Mode
|
|
64
173
|
// -------------------------------------------------------------
|
|
65
174
|
if (options.docker) {
|
|
175
|
+
const additionalDockerArgs = [];
|
|
176
|
+
for (const arg of options.dockerArgs ?? []) {
|
|
177
|
+
// Preserve backslashes in Windows bind paths; only unwrap quotes.
|
|
178
|
+
const parts = arg.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) || [arg];
|
|
179
|
+
for (const part of parts) {
|
|
180
|
+
additionalDockerArgs.push(part.replace(/^['"]|['"]$/g, ''));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
extensions = {
|
|
185
|
+
...extensions,
|
|
186
|
+
enabled: await preflightDockerExtensions(extensions.enabled, options.transport, additionalDockerArgs),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
command.error(error.message);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const dataAuto = options.transport === 'stdio' && extensions.enabled.length > 0;
|
|
66
194
|
// 1. Locate the package root (where package.json is)
|
|
67
195
|
const pkgRoot = STAFF_MCP_PACKAGE_ROOT;
|
|
68
196
|
// 2. Cross-platform path normalizer for Volume Mounts
|
|
69
197
|
const toDockerVolumePath = (p) => {
|
|
70
|
-
if (os.platform() ===
|
|
71
|
-
return p
|
|
198
|
+
if (os.platform() === 'win32') {
|
|
199
|
+
return p
|
|
200
|
+
.replace(/^([a-zA-Z]):/, (_, drive) => `/${drive.toLowerCase()}`)
|
|
201
|
+
.replace(/\\/g, '/');
|
|
72
202
|
}
|
|
73
203
|
return p;
|
|
74
204
|
};
|
|
75
205
|
const hostCwd = path.resolve(options.workingDir);
|
|
76
|
-
const dockerArgs = [
|
|
206
|
+
const dockerArgs = ['run', '-i', '--rm'];
|
|
207
|
+
const binds = [];
|
|
208
|
+
const bind = (source, target, readOnly = false) => {
|
|
209
|
+
binds.push({ source, target });
|
|
210
|
+
dockerArgs.push('-v', `${toDockerVolumePath(source)}:${target}${readOnly ? ':ro' : ''}`);
|
|
211
|
+
};
|
|
77
212
|
// 3. Mount working directory and package source
|
|
78
|
-
|
|
79
|
-
dockerArgs.push(
|
|
80
|
-
|
|
213
|
+
bind(hostCwd, '/workspace');
|
|
214
|
+
dockerArgs.push('-w', '/workspace');
|
|
215
|
+
bind(pkgRoot, '/opt/staff-mcp', true);
|
|
81
216
|
// 3.5 Check if we are nested inside a node_modules folder (npx/pnpm global scenario)
|
|
82
217
|
// If yes, map the parent node_modules into the container as well so dependencies can be resolved
|
|
83
|
-
const isNestedInNodeModules = pkgRoot.includes(
|
|
218
|
+
const isNestedInNodeModules = pkgRoot.includes('node_modules');
|
|
84
219
|
if (isNestedInNodeModules) {
|
|
85
220
|
// By mapping the parent directory of staff-mcp's pkgRoot to /opt/node_modules,
|
|
86
221
|
// Node.js inside the container can look up and find shared dependencies.
|
|
87
|
-
const outerNodeModules = path.resolve(pkgRoot,
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
// 3.8
|
|
91
|
-
//
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
222
|
+
const outerNodeModules = path.resolve(pkgRoot, '..');
|
|
223
|
+
bind(outerNodeModules, '/opt/node_modules', true);
|
|
224
|
+
}
|
|
225
|
+
// 3.8 Keep Docker-installed tools separate from host-native binaries.
|
|
226
|
+
// Keep the existing container identity and host permissions unchanged.
|
|
227
|
+
const dockerToolsDir = path.join(STAFF_TOOLS_DIR, 'docker');
|
|
228
|
+
try {
|
|
229
|
+
// Create as the host caller, never let Docker create root-owned dirs.
|
|
230
|
+
ensureStaffDirs();
|
|
231
|
+
mkdirSync(dockerToolsDir, { recursive: true });
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
command.error('Cannot prepare Docker user directories/tools cache.');
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
// Fixed paths do not assume the image's user or HOME directory.
|
|
238
|
+
const containerStaffDir = '/opt/.staff';
|
|
239
|
+
dockerArgs.push('-e', `STAFF_GLOBAL_DIR=${containerStaffDir}`);
|
|
240
|
+
bind(dockerToolsDir, `${containerStaffDir}/tools`);
|
|
241
|
+
bind(STAFF_SKILLS_DIR, `${containerStaffDir}/skills`);
|
|
242
|
+
bind(STAFF_PROFILES_DIR, `${containerStaffDir}/profiles`);
|
|
99
243
|
// 4. Mount additional allowed directories
|
|
100
244
|
if (options.allowedDir && options.allowedDir.length > 0) {
|
|
101
245
|
options.allowedDir.forEach((dir) => {
|
|
102
246
|
const absDir = path.resolve(dir);
|
|
103
|
-
|
|
247
|
+
bind(absDir, absDir);
|
|
104
248
|
});
|
|
105
249
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
// 6. Inject advanced custom args (e.g., ADB pass-through, network configs)
|
|
111
|
-
if (options.dockerArgs && options.dockerArgs.length > 0) {
|
|
112
|
-
const additionalDockerArgs = [];
|
|
113
|
-
// commander parses varargs as an array of strings
|
|
114
|
-
options.dockerArgs.forEach((arg) => {
|
|
115
|
-
// simple split by space if the user quoted them (e.g., "-e FOO=1")
|
|
116
|
-
// If the user uses standard bash expansion, commander already handles it.
|
|
117
|
-
const parts = arg.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) || [arg];
|
|
118
|
-
parts.forEach((part) => additionalDockerArgs.push(part.replace(/^['"]|['"]$/g, "")));
|
|
119
|
-
});
|
|
120
|
-
try {
|
|
121
|
-
validateAdditionalDockerArgs(additionalDockerArgs);
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
125
|
-
console.error(`[staff-mcp] Invalid Docker arguments: ${message}`);
|
|
126
|
-
process.exit(1);
|
|
250
|
+
const dockerRoots = options.fileRoot?.map((root) => {
|
|
251
|
+
const directory = `/opt/staff-file-roots/${root.rootId}`;
|
|
252
|
+
if (extensions.enabled.includes('files')) {
|
|
253
|
+
bind(root.directory, directory);
|
|
127
254
|
}
|
|
128
|
-
|
|
255
|
+
return { rootId: root.rootId, directory };
|
|
256
|
+
});
|
|
257
|
+
// 5. Handle HTTP port forwarding
|
|
258
|
+
if (options.transport === 'http') {
|
|
259
|
+
dockerArgs.push('-p', `${options.port}:${options.port}`);
|
|
129
260
|
}
|
|
261
|
+
// 6. Inject the already validated custom Docker options.
|
|
262
|
+
dockerArgs.push(...additionalDockerArgs);
|
|
263
|
+
// Only wrapper-owned mounts are known here, not arbitrary -D mounts.
|
|
264
|
+
// A bind of a staging descendant is protected in its entirety.
|
|
265
|
+
const privateAliases = dockerPrivatePaths(hostCwd, binds);
|
|
130
266
|
// 7. Inject environment variable to detect docker proxy mode
|
|
131
|
-
dockerArgs.push(
|
|
267
|
+
dockerArgs.push('-e', 'STAFF_MCP_IS_DOCKER=1');
|
|
132
268
|
// 8. Specify the target image
|
|
133
269
|
dockerArgs.push(options.docker);
|
|
134
270
|
// 9. Reconstruct the command inside the container
|
|
135
|
-
dockerArgs.push(
|
|
136
|
-
dockerArgs.push(
|
|
137
|
-
if (options.transport ===
|
|
271
|
+
dockerArgs.push('node', '/opt/staff-mcp/dist/src/index.js');
|
|
272
|
+
dockerArgs.push('-t', options.transport);
|
|
273
|
+
if (options.transport === 'reverse') {
|
|
138
274
|
if (options.reverseUrl)
|
|
139
|
-
dockerArgs.push(
|
|
275
|
+
dockerArgs.push('--ru', options.reverseUrl);
|
|
140
276
|
if (options.reverseToken)
|
|
141
|
-
dockerArgs.push(
|
|
277
|
+
dockerArgs.push('--rt', options.reverseToken);
|
|
142
278
|
if (options.reverseName)
|
|
143
|
-
dockerArgs.push(
|
|
144
|
-
dockerArgs.push(
|
|
145
|
-
dockerArgs.push(
|
|
146
|
-
dockerArgs.push(
|
|
147
|
-
dockerArgs.push(
|
|
279
|
+
dockerArgs.push('--rn', options.reverseName);
|
|
280
|
+
dockerArgs.push('--reverse-connect-timeout', String(options.reverseConnectTimeout));
|
|
281
|
+
dockerArgs.push('--reverse-initialization-timeout', String(options.reverseInitializationTimeout));
|
|
282
|
+
dockerArgs.push('--reverse-read-timeout', String(options.reverseReadTimeout));
|
|
283
|
+
dockerArgs.push('--reverse-stable-time', String(options.reverseStableTime));
|
|
148
284
|
}
|
|
149
285
|
else {
|
|
150
|
-
dockerArgs.push(
|
|
286
|
+
dockerArgs.push('-p', String(options.port));
|
|
151
287
|
// Inside container, we must listen on all interfaces for HTTP to be exposed
|
|
152
|
-
if (options.transport ===
|
|
153
|
-
dockerArgs.push(
|
|
288
|
+
if (options.transport === 'http') {
|
|
289
|
+
dockerArgs.push('-h', '0.0.0.0');
|
|
290
|
+
dockerArgs.push('--http-max-sessions', String(options.httpMaxSessions));
|
|
291
|
+
dockerArgs.push('--http-session-idle-ms', String(options.httpSessionIdleMs));
|
|
292
|
+
if (options.httpToken !== undefined) {
|
|
293
|
+
dockerArgs.push('--http-token', options.httpToken);
|
|
294
|
+
}
|
|
154
295
|
}
|
|
155
296
|
else {
|
|
156
|
-
dockerArgs.push(
|
|
297
|
+
dockerArgs.push('-h', options.host);
|
|
157
298
|
}
|
|
158
299
|
}
|
|
159
|
-
dockerArgs.push(
|
|
300
|
+
dockerArgs.push('-w', '/workspace');
|
|
301
|
+
for (const privatePath of new Set([
|
|
302
|
+
...(options.internalFilePrivatePath ?? []),
|
|
303
|
+
...privateAliases,
|
|
304
|
+
])) {
|
|
305
|
+
dockerArgs.push('--internal-file-private-path', privatePath);
|
|
306
|
+
}
|
|
160
307
|
if (options.allowedDir && options.allowedDir.length > 0) {
|
|
161
308
|
options.allowedDir.forEach((dir) => {
|
|
162
|
-
dockerArgs.push(
|
|
309
|
+
dockerArgs.push('-d', path.resolve(dir)); // paths inside container match host
|
|
163
310
|
});
|
|
164
311
|
}
|
|
165
|
-
dockerArgs.push(
|
|
166
|
-
dockerArgs.push(
|
|
312
|
+
dockerArgs.push('-r', options.profile);
|
|
313
|
+
dockerArgs.push('-m', String(options.maxMcpSessions));
|
|
167
314
|
if (options.enableLsp) {
|
|
168
|
-
dockerArgs.push(
|
|
315
|
+
dockerArgs.push('--enable-lsp');
|
|
316
|
+
}
|
|
317
|
+
if (extensions.enabled.length) {
|
|
318
|
+
dockerArgs.push('--extensions', extensions.enabled.join(','));
|
|
319
|
+
}
|
|
320
|
+
for (const root of dockerRoots ?? []) {
|
|
321
|
+
dockerArgs.push('--file-root', `${root.rootId}=${root.directory}`);
|
|
322
|
+
}
|
|
323
|
+
if (extensions.shell !== undefined) {
|
|
324
|
+
dockerArgs.push('--shell', extensions.shell);
|
|
169
325
|
}
|
|
170
326
|
// Forward an explicit --proxy so the containerized process uses it too.
|
|
171
327
|
// (Env-var proxies reach the container through docker's own env injection
|
|
172
328
|
// or user-supplied -D "-e HTTP_PROXY=..." args.)
|
|
173
329
|
if (options.proxy) {
|
|
174
|
-
dockerArgs.push(
|
|
330
|
+
dockerArgs.push('--proxy', options.proxy);
|
|
175
331
|
}
|
|
176
332
|
// 10. Run Docker with transport-aware stdin and a controlled shutdown lifecycle.
|
|
177
333
|
// Reverse/HTTP keep a private lifecycle pipe open instead of depending on
|
|
@@ -179,6 +335,7 @@ program
|
|
|
179
335
|
// The name hint makes containers distinguishable in `docker ps`
|
|
180
336
|
// (e.g. staff-mcp-chat-poc-18000-a1b2c3).
|
|
181
337
|
const exitCode = await runDockerProxy(dockerArgs, options.transport, {
|
|
338
|
+
dataAuto,
|
|
182
339
|
nameHint: buildDockerNameHint({
|
|
183
340
|
workspaceDir: hostCwd,
|
|
184
341
|
transport: options.transport,
|
|
@@ -194,48 +351,52 @@ program
|
|
|
194
351
|
// -------------------------------------------------------------
|
|
195
352
|
// Standard Host Mode
|
|
196
353
|
// -------------------------------------------------------------
|
|
197
|
-
// Auto-exit if we are running as a proxy child and the host pipe breaks
|
|
198
|
-
if (process.env.STAFF_MCP_IS_DOCKER === "1") {
|
|
199
|
-
if (options.transport !== "stdio") {
|
|
200
|
-
process.stdin.resume(); // keep reading to detect end in non-stdio modes
|
|
201
|
-
}
|
|
202
|
-
process.stdin.on("end", () => {
|
|
203
|
-
console.error("[staff-mcp] Host pipe closed, terminating container...");
|
|
204
|
-
process.exit(0);
|
|
205
|
-
});
|
|
206
|
-
process.stdin.on("error", () => {
|
|
207
|
-
process.exit(1);
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
354
|
ensureStaffDirs();
|
|
211
355
|
// Pre-warm ripgrep: trigger background install if not present, so it's
|
|
212
356
|
// likely ready by the time the first search_workspace call happens.
|
|
213
|
-
ensureRipgrep().catch(err => {
|
|
214
|
-
console.error(
|
|
357
|
+
ensureRipgrep().catch((err) => {
|
|
358
|
+
console.error('[staff-mcp] Background ripgrep install failed:', err.message);
|
|
215
359
|
});
|
|
216
360
|
const workingDir = path.resolve(options.workingDir);
|
|
217
361
|
const allowedDirs = options.allowedDir.map((d) => path.resolve(d));
|
|
218
362
|
const profile = options.profile;
|
|
219
363
|
const maxMcpSessions = parseInt(options.maxMcpSessions, 10) || 5;
|
|
220
364
|
const enableLsp = !!options.enableLsp;
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
365
|
+
let serverFactory;
|
|
366
|
+
try {
|
|
367
|
+
serverFactory = createServerFactory('staff-mcp', STAFF_MCP_VERSION, workingDir, allowedDirs, profile, maxMcpSessions, enableLsp, extensions, options.internalFilePrivatePath);
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
command.error(error.message);
|
|
371
|
+
return;
|
|
224
372
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
373
|
+
if (options.transport === 'http') {
|
|
374
|
+
await runHostService(() => startHttpServer(serverFactory, parseInt(options.port, 10), options.host, options.httpToken, {
|
|
375
|
+
maxSessions: options.httpMaxSessions,
|
|
376
|
+
idleTimeoutMs: options.httpSessionIdleMs,
|
|
377
|
+
}), process.env.STAFF_MCP_IS_DOCKER === '1');
|
|
378
|
+
}
|
|
379
|
+
else if (options.transport === 'reverse') {
|
|
380
|
+
if (!options.reverseUrl ||
|
|
381
|
+
!options.reverseToken ||
|
|
382
|
+
!options.reverseName) {
|
|
383
|
+
console.error('[staff-mcp] Error: --ru (reverse-url), --rt (reverse-token), and --rn (reverse-name) are required for reverse transport.');
|
|
228
384
|
process.exit(1);
|
|
229
385
|
}
|
|
230
|
-
await startReverseServer(serverFactory
|
|
386
|
+
await runHostService(() => startReverseServer(serverFactory, options.reverseUrl, options.reverseToken, options.reverseName, {
|
|
387
|
+
proxy: options.proxy,
|
|
231
388
|
connectTimeout: options.reverseConnectTimeout,
|
|
232
389
|
initializationTimeout: options.reverseInitializationTimeout,
|
|
233
|
-
heartbeat: {
|
|
234
|
-
|
|
235
|
-
|
|
390
|
+
heartbeat: {
|
|
391
|
+
readTimeout: options.reverseReadTimeout,
|
|
392
|
+
},
|
|
393
|
+
reconnect: {
|
|
394
|
+
stableConnectionMs: options.reverseStableTime,
|
|
395
|
+
},
|
|
396
|
+
}), process.env.STAFF_MCP_IS_DOCKER === '1');
|
|
236
397
|
}
|
|
237
398
|
else {
|
|
238
|
-
await startStdioServer(serverFactory());
|
|
399
|
+
await runHostService(() => startStdioServer(serverFactory()), false);
|
|
239
400
|
}
|
|
240
401
|
});
|
|
241
402
|
await program.parseAsync(process.argv);
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|