staff-mcp 1.3.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 (94) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +152 -55
  3. package/README_zh.md +155 -53
  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 +276 -131
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/reverse/SseTransport.d.ts +34 -0
  44. package/dist/src/reverse/SseTransport.js +215 -0
  45. package/dist/src/reverse/SseTransport.js.map +1 -0
  46. package/dist/src/reverse/http.d.ts +7 -0
  47. package/dist/src/reverse/http.js +85 -0
  48. package/dist/src/reverse/http.js.map +1 -0
  49. package/dist/src/server.d.ts +4 -2
  50. package/dist/src/server.js +80 -18
  51. package/dist/src/server.js.map +1 -1
  52. package/dist/src/terminal/extension.d.ts +4 -0
  53. package/dist/src/terminal/extension.js +108 -0
  54. package/dist/src/terminal/extension.js.map +1 -0
  55. package/dist/src/terminal/pty.d.ts +14 -0
  56. package/dist/src/terminal/pty.js +121 -0
  57. package/dist/src/terminal/pty.js.map +1 -0
  58. package/dist/src/terminal/session.d.ts +136 -0
  59. package/dist/src/terminal/session.js +422 -0
  60. package/dist/src/terminal/session.js.map +1 -0
  61. package/dist/src/terminal/ui/index.html +183 -0
  62. package/dist/src/tools/file-tools.d.ts +2 -1
  63. package/dist/src/tools/file-tools.js +19 -7
  64. package/dist/src/tools/file-tools.js.map +1 -1
  65. package/dist/src/tools/mcp-client-tools.js +243 -103
  66. package/dist/src/tools/mcp-client-tools.js.map +1 -1
  67. package/dist/src/tools/shell-tools.js +1 -1
  68. package/dist/src/tools/shell-tools.js.map +1 -1
  69. package/dist/src/tools/skills.js +26 -1
  70. package/dist/src/tools/skills.js.map +1 -1
  71. package/dist/src/transports/http.d.ts +15 -2
  72. package/dist/src/transports/http.js +244 -65
  73. package/dist/src/transports/http.js.map +1 -1
  74. package/dist/src/transports/reverse.d.ts +23 -19
  75. package/dist/src/transports/reverse.js +130 -74
  76. package/dist/src/transports/reverse.js.map +1 -1
  77. package/dist/src/transports/stdio.d.ts +5 -2
  78. package/dist/src/transports/stdio.js +130 -20
  79. package/dist/src/transports/stdio.js.map +1 -1
  80. package/dist/src/utils/proxy.d.ts +2 -2
  81. package/dist/src/utils/proxy.js +84 -62
  82. package/dist/src/utils/proxy.js.map +1 -1
  83. package/dist/src/utils/server-activity.d.ts +6 -0
  84. package/dist/src/utils/server-activity.js +46 -0
  85. package/dist/src/utils/server-activity.js.map +1 -0
  86. package/dist/src/utils/server-lifecycle.d.ts +5 -0
  87. package/dist/src/utils/server-lifecycle.js +51 -0
  88. package/dist/src/utils/server-lifecycle.js.map +1 -0
  89. package/docs/file-manager.md +179 -0
  90. package/docs/terminal.md +66 -0
  91. package/package.json +28 -6
  92. package/dist/src/transports/fte-lifecycle.d.ts +0 -13
  93. package/dist/src/transports/fte-lifecycle.js +0 -76
  94. package/dist/src/transports/fte-lifecycle.js.map +0 -1
@@ -1,78 +1,134 @@
1
- import { ReverseMCPClient } from "mcp-reverse/client";
2
- const DEFAULT_CONNECT_TIMEOUT_MS = 15_000;
3
- /**
4
- * Render an error with its full `cause` chain. Network failures from
5
- * Node's fetch surface as a bare "fetch failed" message; the actionable
6
- * reason (ECONNREFUSED, certificate errors, ...) lives in error.cause.
7
- */
8
- function formatErrorChain(error) {
9
- const messages = [];
10
- let current = error;
11
- while (current instanceof Error) {
12
- messages.push(current.message);
13
- current = current.cause;
14
- }
15
- return messages.length > 0 ? messages.join("; cause: ") : String(error);
16
- }
17
- function createReverseLogger() {
18
- const debugEnabled = process.env.STAFF_MCP_REVERSE_DEBUG === "1";
19
- return {
20
- debug: debugEnabled
21
- ? (message, ...args) => console.error(`[staff-mcp][reverse][debug] ${message}`, ...args)
22
- : () => { },
23
- info: (message, ...args) => console.error(`[staff-mcp][reverse][info] ${message}`, ...args),
24
- warn: (message, ...args) => console.error(`[staff-mcp][reverse][warn] ${message}`, ...args),
25
- error: (message, ...args) => console.error(`[staff-mcp][reverse][error] ${message}`, ...args),
1
+ import { performance } from 'node:perf_hooks';
2
+ import { setTimeout as delay } from 'node:timers/promises';
3
+ import { configureExtensionData } from '../extensions/runtime.js';
4
+ import { HttpDataSession } from '../data/HttpDataSession.js';
5
+ import { ReverseSseTransport } from '../reverse/SseTransport.js';
6
+ import { createReverseHttp, reverseProxyUrl, validateReverseUrl, } from '../reverse/http.js';
7
+ export { reverseProxyUrl, validateReverseUrl } from '../reverse/http.js';
8
+ /** New HTTP pool, SDK transport and data resources per attempt; never replay requests or input. */
9
+ export async function startReverseServer(serverFactory, value, token, name, options = {}) {
10
+ const url = validateReverseUrl(value);
11
+ const proxy = reverseProxyUrl(url, options.proxy);
12
+ if (!token || /\s/.test(token) || token.length > 4096)
13
+ throw new Error('Invalid reverse token.');
14
+ if (!name || name.length > 512 || /[\u0000-\u001f\u007f]/.test(name))
15
+ throw new Error('Invalid reverse server name.');
16
+ const log = options.logger ?? {
17
+ info: (message) => console.error(`[staff-mcp][reverse] ${message}`),
18
+ warn: (message) => console.error(`[staff-mcp][reverse] ${message}`),
19
+ error: (message) => console.error(`[staff-mcp][reverse] ${message}`),
26
20
  };
27
- }
28
- /**
29
- * Start a reverse MCP connection to a public gateway.
30
- *
31
- * The ReverseMCPClient owns transport lifecycle, reconnection, and MCP
32
- * protocol re-binding. start() launches the connection loop; readiness is
33
- * reported asynchronously through the connected event/log.
34
- */
35
- export async function startReverseServer(server, url, token, name, options = {}) {
36
- const reconnectEnabled = options.reconnect?.enabled !== false;
37
- const reverseLogger = options.logger ?? createReverseLogger();
38
- const client = await ReverseMCPClient.createSSE(server, {
39
- url,
40
- serverName: name,
41
- authToken: token,
42
- connectTimeout: options.connectTimeout ?? DEFAULT_CONNECT_TIMEOUT_MS,
43
- initializationTimeout: options.initializationTimeout,
44
- heartbeat: options.heartbeat,
45
- reconnect: {
46
- initialDelay: 1000,
47
- maxDelay: 30000,
48
- multiplier: 2,
49
- maxRetries: 0, // 0 = infinite
50
- ...options.reconnect,
51
- },
52
- }, reverseLogger);
53
- client.on("connected", () => {
54
- reverseLogger.info(`MCP initialized and ready as "${name}"`);
55
- });
56
- client.on("disconnected", () => {
57
- reverseLogger.warn(reconnectEnabled
58
- ? "Gateway connection closed; automatic reconnect is enabled"
59
- : "Gateway connection closed; automatic reconnect is disabled");
60
- });
61
- client.on("reconnecting", (completedAttempts) => {
62
- if (completedAttempts === 0) {
63
- reverseLogger.info("Reconnect cycle started");
64
- }
65
- else {
66
- reverseLogger.info(`Connection lost after ${completedAttempts} attempt(s) in the current retry cycle`);
21
+ if (url.protocol === 'http:')
22
+ log.warn('Explicit HTTP reverse control uses plaintext; use HTTPS on untrusted networks.');
23
+ const abort = new AbortController();
24
+ let active;
25
+ let backoff = options.reconnect?.initialDelay ?? 1000;
26
+ const run = async () => {
27
+ while (!abort.signal.aborted) {
28
+ let server;
29
+ let initializedAt;
30
+ let previousInitialized;
31
+ let initializationTimer;
32
+ const attempt = new AbortController();
33
+ const stopped = () => {
34
+ attempt.abort();
35
+ void active?.close();
36
+ };
37
+ abort.signal.addEventListener('abort', stopped, { once: true });
38
+ const http = createReverseHttp(url, proxy, attempt.signal);
39
+ const transport = new ReverseSseTransport(url, { Authorization: `Bearer ${token}`, 'X-MCP-Server-Name': name }, http.fetch, options.connectTimeout, options.heartbeat?.readTimeout);
40
+ active = transport;
41
+ try {
42
+ server = serverFactory();
43
+ configureExtensionData(server, (binding, accept, signal, origin, supportsPurpose) => {
44
+ if (origin !== undefined)
45
+ throw new Error('Reverse data does not accept an advertised origin');
46
+ const sessionId = transport.sessionId;
47
+ if (!sessionId ||
48
+ attempt.signal.aborted ||
49
+ signal.aborted)
50
+ throw new Error('Reverse data control session unavailable');
51
+ const expected = new URL(url.href);
52
+ expected.pathname =
53
+ url.pathname.replace(/\/$/, '') +
54
+ '/data/' +
55
+ sessionId;
56
+ return {
57
+ session: new HttpDataSession({
58
+ role: 'remote',
59
+ binding,
60
+ accept,
61
+ supportsPurpose,
62
+ fetch: http.fetch,
63
+ validateEndpoint: (endpoint) => {
64
+ if (endpoint.origin !== expected.origin ||
65
+ endpoint.pathname !==
66
+ expected.pathname ||
67
+ endpoint.username ||
68
+ endpoint.password ||
69
+ endpoint.search ||
70
+ endpoint.hash)
71
+ throw new Error('Reverse data endpoint rejected');
72
+ },
73
+ }),
74
+ };
75
+ });
76
+ previousInitialized = server.server.oninitialized;
77
+ server.server.oninitialized = () => {
78
+ previousInitialized?.();
79
+ initializedAt = performance.now();
80
+ clearTimeout(initializationTimer);
81
+ log.info('MCP initialized on a new SSE session.');
82
+ };
83
+ await server.connect(transport);
84
+ // start() completes once the SSE endpoint is admitted; only then start the initialization deadline.
85
+ if (initializedAt === undefined) {
86
+ initializationTimer = setTimeout(() => {
87
+ void transport.close();
88
+ }, options.initializationTimeout ?? 15000);
89
+ initializationTimer.unref();
90
+ }
91
+ await transport.closed;
92
+ }
93
+ catch {
94
+ if (!abort.signal.aborted)
95
+ log.warn('Connection attempt ended before readiness or control connection closed.');
96
+ }
97
+ finally {
98
+ clearTimeout(initializationTimer);
99
+ await transport.close().catch(() => { });
100
+ attempt.abort();
101
+ await http.close().catch(() => { });
102
+ abort.signal.removeEventListener('abort', stopped);
103
+ await server?.close();
104
+ if (server)
105
+ server.server.oninitialized = previousInitialized;
106
+ active = undefined;
107
+ }
108
+ if (abort.signal.aborted || options.reconnect?.enabled === false)
109
+ break;
110
+ if (initializedAt !== undefined &&
111
+ performance.now() - initializedAt >=
112
+ (options.reconnect?.stableConnectionMs ?? 30000))
113
+ backoff = options.reconnect?.initialDelay ?? 1000;
114
+ log.info('Disconnected; retrying with a new session and no replay.');
115
+ try {
116
+ await delay(backoff, undefined, { signal: abort.signal });
117
+ }
118
+ catch {
119
+ break;
120
+ }
121
+ backoff = Math.min(options.reconnect?.maxDelay ?? 30000, backoff * 2);
67
122
  }
68
- });
69
- client.on("error", (error) => {
70
- reverseLogger.error(`Transport reported an error: ${formatErrorChain(error)}`);
71
- });
72
- client.on("failed", (error) => {
73
- reverseLogger.error(`Reconnect budget exhausted: ${formatErrorChain(error)}`);
74
- });
75
- await client.start();
76
- return client;
123
+ };
124
+ const closed = run();
125
+ return {
126
+ closed,
127
+ stop: async () => {
128
+ abort.abort();
129
+ await active?.close().catch(() => { });
130
+ await closed;
131
+ },
132
+ };
77
133
  }
78
134
  //# sourceMappingURL=reverse.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reverse.js","sourceRoot":"","sources":["../../../src/transports/reverse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reverse.js","sourceRoot":"","sources":["../../../src/transports/reverse.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,6 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  export declare function redirectStdioLogsToStderr(): void;
3
- export declare function startStdioServer(server: McpServer): Promise<void>;
3
+ export declare function startStdioServer(server: McpServer): Promise<{
4
+ stop: () => Promise<void>;
5
+ closed: Promise<void>;
6
+ }>;
@@ -1,31 +1,141 @@
1
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
1
+ import { createServer } from 'node:http';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { HttpDataSession } from '../data/HttpDataSession.js';
4
+ import { handleNodeRequest } from '../data/node.js';
5
+ import { readDockerDataBaseUrl } from '../data-stdio-docker.js';
6
+ import { configureExtensionData } from '../extensions/runtime.js';
7
+ import { extensionError } from '../extensions/protocol.js';
2
8
  export function redirectStdioLogsToStderr() {
3
- // MCP stdio reserves stdout for JSON-RPC frames. Redirect ordinary
4
- // console.log output before bootstrap code can write to stdout.
5
- console.log = (...args) => {
6
- console.error(...args);
7
- };
9
+ // MCP stdio reserves stdout for JSON-RPC frames.
10
+ console.log = (...args) => console.error(...args);
8
11
  }
9
12
  export async function startStdioServer(server) {
13
+ configureExtensionData(server, async (binding, accept, signal, origin, supportsPurpose) => {
14
+ if (origin !== undefined)
15
+ extensionError('INVALID_PARAMS', 'Stdio data does not accept an advertised origin');
16
+ const dockerBase = await readDockerDataBaseUrl();
17
+ signal.throwIfAborted();
18
+ const host = dockerBase
19
+ ? process.env.STAFF_MCP_DATA_HOST
20
+ : '127.0.0.1';
21
+ const port = dockerBase
22
+ ? Number(process.env.STAFF_MCP_DATA_PORT)
23
+ : 0;
24
+ if (dockerBase && (host !== '0.0.0.0' || port !== 39173))
25
+ throw new Error('Invalid Docker data listener configuration.');
26
+ let session;
27
+ const listener = createServer((request, response) => {
28
+ if (!session) {
29
+ response.writeHead(503);
30
+ response.end();
31
+ return;
32
+ }
33
+ void handleNodeRequest(session, request, response).then((handled) => {
34
+ if (!handled) {
35
+ response.writeHead(404);
36
+ response.end();
37
+ }
38
+ });
39
+ });
40
+ const close = () => new Promise((resolve) => {
41
+ listener.closeAllConnections();
42
+ listener.close(() => resolve());
43
+ });
44
+ const onAbort = () => {
45
+ void close();
46
+ };
47
+ signal.addEventListener('abort', onAbort, { once: true });
48
+ try {
49
+ await new Promise((resolve, reject) => {
50
+ listener.once('error', reject);
51
+ listener.listen(port, host, () => {
52
+ listener.removeListener('error', reject);
53
+ resolve();
54
+ });
55
+ });
56
+ signal.throwIfAborted();
57
+ const localBase = `http://127.0.0.1:${listener.address().port}`;
58
+ const endpoint = `${dockerBase ?? localBase}/mcp/data/${binding}`;
59
+ session = new HttpDataSession({
60
+ role: 'remote',
61
+ binding,
62
+ endpoint,
63
+ accept,
64
+ supportsPurpose,
65
+ // Listener mode must never follow a peer-supplied outbound descriptor.
66
+ fetch: async () => {
67
+ throw new Error('Outbound data is unavailable in stdio listener mode');
68
+ },
69
+ validateEndpoint: () => {
70
+ throw new Error('Outbound data endpoint is unavailable in stdio listener mode');
71
+ },
72
+ });
73
+ return {
74
+ session,
75
+ endpoint,
76
+ close: () => {
77
+ signal.removeEventListener('abort', onAbort);
78
+ return close();
79
+ },
80
+ };
81
+ }
82
+ catch (error) {
83
+ signal.removeEventListener('abort', onAbort);
84
+ session?.close();
85
+ await close();
86
+ throw error;
87
+ }
88
+ });
10
89
  const transport = new StdioServerTransport();
90
+ let resolveClosed;
91
+ let rejectClosed;
92
+ const closed = new Promise((resolve, reject) => {
93
+ resolveClosed = resolve;
94
+ rejectClosed = reject;
95
+ });
96
+ // EOF may arrive before the caller receives the controller.
97
+ void closed.catch(() => { });
98
+ let stopping;
99
+ let inputError;
100
+ const stop = () => {
101
+ stopping ??= Promise.resolve().then(async () => {
102
+ process.stdin.removeListener('end', onStdinClosed);
103
+ process.stdin.removeListener('close', onStdinClosed);
104
+ process.stdin.removeListener('error', onStdinError);
105
+ try {
106
+ await server.close();
107
+ if (inputError)
108
+ throw inputError;
109
+ resolveClosed();
110
+ }
111
+ catch (error) {
112
+ rejectClosed(error);
113
+ throw error;
114
+ }
115
+ });
116
+ return stopping;
117
+ };
118
+ const onStdinClosed = () => {
119
+ void stop().catch(() => { });
120
+ };
121
+ const onStdinError = () => {
122
+ inputError = new Error('MCP input stream failed.');
123
+ onStdinClosed();
124
+ };
125
+ transport.onclose = onStdinClosed;
126
+ process.stdin.once('end', onStdinClosed);
127
+ process.stdin.once('close', onStdinClosed);
128
+ process.stdin.once('error', onStdinError);
11
129
  try {
12
130
  await server.connect(transport);
13
- console.error("MCP Server (Stdio) is running.");
14
- // The SDK's StdioServerTransport only listens for 'data'/'error' on stdin
15
- // and never notices EOF. When the client goes away, stdin closes — shut
16
- // down instead of lingering as an orphan held up by long-lived handles
17
- // (LSP servers, intervals, background tasks). The process 'exit' hook
18
- // registered by the shell tools also cleans up any background task groups.
19
- const onStdinClosed = () => {
20
- console.error("[staff-mcp] stdin closed (client disconnected), shutting down.");
21
- process.exit(0);
22
- };
23
- process.stdin.on("end", onStdinClosed);
24
- process.stdin.on("close", onStdinClosed);
131
+ if (process.stdin.readableEnded || process.stdin.destroyed)
132
+ onStdinClosed();
133
+ console.error('MCP Server (Stdio) is running.');
134
+ return { stop, closed };
25
135
  }
26
136
  catch (error) {
27
- console.error("Stdio connection failed:", error);
28
- process.exit(1);
137
+ await stop().catch(() => { });
138
+ throw error;
29
139
  }
30
140
  }
31
141
  //# sourceMappingURL=stdio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/transports/stdio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,MAAM,UAAU,yBAAyB;IACvC,mEAAmE;IACnE,gEAAgE;IAChE,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAEhD,0EAA0E;QAC1E,wEAAwE;QACxE,uEAAuE;QACvE,sEAAsE;QACtE,2EAA2E;QAC3E,MAAM,aAAa,GAAG,GAAG,EAAE;YACzB,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/transports/stdio.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { Agent, Dispatcher } from "undici";
1
+ import { Agent, Dispatcher } from 'undici';
2
2
  /**
3
3
  * Whether proxy environment variables are present (NO_PROXY alone does not count).
4
4
  */
5
5
  export declare function hasProxyEnv(env?: NodeJS.ProcessEnv): boolean;
6
- export type NoProxyEntryKind = "wildcard" | "exact" | "suffix" | "cidr4" | "cidr6";
6
+ export type NoProxyEntryKind = 'wildcard' | 'exact' | 'suffix' | 'cidr4' | 'cidr6';
7
7
  export interface NoProxyEntry {
8
8
  kind: NoProxyEntryKind;
9
9
  /** normalized host: lowercase, no trailing dot, no IPv6 brackets */