staff-mcp 1.1.2 → 1.3.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 (66) hide show
  1. package/README.md +46 -1
  2. package/README_zh.md +36 -1
  3. package/dist/src/constants.d.ts +6 -0
  4. package/dist/src/constants.js +6 -0
  5. package/dist/src/constants.js.map +1 -1
  6. package/dist/src/index.js +41 -5
  7. package/dist/src/index.js.map +1 -1
  8. package/dist/src/lsp/manager.d.ts +2 -0
  9. package/dist/src/lsp/manager.js +22 -10
  10. package/dist/src/lsp/manager.js.map +1 -1
  11. package/dist/src/server.js +1 -1
  12. package/dist/src/server.js.map +1 -1
  13. package/dist/src/tools/mcp-client-tools.js +7 -3
  14. package/dist/src/tools/mcp-client-tools.js.map +1 -1
  15. package/dist/src/tools/shell-tools.js +13 -4
  16. package/dist/src/tools/shell-tools.js.map +1 -1
  17. package/dist/src/tools/skills.js +2 -2
  18. package/dist/src/tools/skills.js.map +1 -1
  19. package/dist/src/tools/system-tools.d.ts +9 -3
  20. package/dist/src/tools/system-tools.js +31 -48
  21. package/dist/src/tools/system-tools.js.map +1 -1
  22. package/dist/src/transports/http.d.ts +2 -1
  23. package/dist/src/transports/http.js +26 -3
  24. package/dist/src/transports/http.js.map +1 -1
  25. package/dist/src/transports/reverse.d.ts +5 -1
  26. package/dist/src/transports/reverse.js +4 -2
  27. package/dist/src/transports/reverse.js.map +1 -1
  28. package/dist/src/transports/stdio.d.ts +1 -0
  29. package/dist/src/transports/stdio.js +6 -4
  30. package/dist/src/transports/stdio.js.map +1 -1
  31. package/dist/src/utils/proxy.d.ts +1 -1
  32. package/dist/src/utils/proxy.js.map +1 -1
  33. package/package.json +15 -16
  34. package/dist/tests/docker-proxy.test.d.ts +0 -1
  35. package/dist/tests/docker-proxy.test.js +0 -395
  36. package/dist/tests/docker-proxy.test.js.map +0 -1
  37. package/dist/tests/file-write-queue.test.d.ts +0 -1
  38. package/dist/tests/file-write-queue.test.js +0 -105
  39. package/dist/tests/file-write-queue.test.js.map +0 -1
  40. package/dist/tests/fte-lifecycle.test.d.ts +0 -1
  41. package/dist/tests/fte-lifecycle.test.js +0 -118
  42. package/dist/tests/fte-lifecycle.test.js.map +0 -1
  43. package/dist/tests/lsp-client.test.d.ts +0 -1
  44. package/dist/tests/lsp-client.test.js +0 -52
  45. package/dist/tests/lsp-client.test.js.map +0 -1
  46. package/dist/tests/package-info.test.d.ts +0 -1
  47. package/dist/tests/package-info.test.js +0 -54
  48. package/dist/tests/package-info.test.js.map +0 -1
  49. package/dist/tests/proxy-no-proxy.test.d.ts +0 -1
  50. package/dist/tests/proxy-no-proxy.test.js +0 -156
  51. package/dist/tests/proxy-no-proxy.test.js.map +0 -1
  52. package/dist/tests/proxy.test.d.ts +0 -1
  53. package/dist/tests/proxy.test.js +0 -89
  54. package/dist/tests/proxy.test.js.map +0 -1
  55. package/dist/tests/reverse-reconnect.test.d.ts +0 -1
  56. package/dist/tests/reverse-reconnect.test.js +0 -89
  57. package/dist/tests/reverse-reconnect.test.js.map +0 -1
  58. package/dist/tests/security.test.d.ts +0 -1
  59. package/dist/tests/security.test.js +0 -21
  60. package/dist/tests/security.test.js.map +0 -1
  61. package/dist/tests/shell-tools.test.d.ts +0 -1
  62. package/dist/tests/shell-tools.test.js +0 -113
  63. package/dist/tests/shell-tools.test.js.map +0 -1
  64. package/dist/tests/test_files/test.d.ts +0 -1
  65. package/dist/tests/test_files/test.js +0 -4
  66. package/dist/tests/test_files/test.js.map +0 -1
@@ -1,89 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { test } from "node:test";
3
- import { Agent, ProxyAgent, getGlobalDispatcher, setGlobalDispatcher, } from "undici";
4
- import { EnvProxyDispatcher, configureGlobalProxy, hasProxyEnv, maskProxyUrl, } from "../src/utils/proxy.js";
5
- const PROXY_ENV_KEYS = [
6
- "HTTP_PROXY",
7
- "http_proxy",
8
- "HTTPS_PROXY",
9
- "https_proxy",
10
- "NO_PROXY",
11
- "no_proxy",
12
- ];
13
- /** Run fn with all proxy-related env vars removed, then restore them. */
14
- function withCleanProxyEnv(fn) {
15
- const saved = new Map();
16
- for (const key of PROXY_ENV_KEYS) {
17
- saved.set(key, process.env[key]);
18
- delete process.env[key];
19
- }
20
- try {
21
- return fn();
22
- }
23
- finally {
24
- for (const [key, value] of saved) {
25
- if (value === undefined)
26
- delete process.env[key];
27
- else
28
- process.env[key] = value;
29
- }
30
- }
31
- }
32
- function restoreDefaultDispatcher() {
33
- setGlobalDispatcher(new Agent());
34
- }
35
- test("maskProxyUrl redacts credentials", () => {
36
- assert.equal(maskProxyUrl("http://user:secret@proxy.example.com:8080"), "http://***:***@proxy.example.com:8080/");
37
- assert.equal(maskProxyUrl("http://proxy.example.com:8080"), "http://proxy.example.com:8080/");
38
- assert.equal(maskProxyUrl("not a url"), "<invalid proxy URL>");
39
- });
40
- test("hasProxyEnv detects uppercase and lowercase variables", () => {
41
- assert.equal(hasProxyEnv({}), false);
42
- assert.equal(hasProxyEnv({ HTTP_PROXY: "http://127.0.0.1:8080" }), true);
43
- assert.equal(hasProxyEnv({ https_proxy: "http://127.0.0.1:8080" }), true);
44
- assert.equal(hasProxyEnv({ NO_PROXY: "localhost" }), false);
45
- });
46
- test("explicit --proxy installs a ProxyAgent for all traffic", () => withCleanProxyEnv(() => {
47
- try {
48
- assert.equal(configureGlobalProxy("http://127.0.0.1:8080"), true);
49
- assert.ok(getGlobalDispatcher() instanceof ProxyAgent);
50
- }
51
- finally {
52
- restoreDefaultDispatcher();
53
- }
54
- }));
55
- test("proxy env vars install an EnvProxyDispatcher", () => withCleanProxyEnv(() => {
56
- process.env.HTTPS_PROXY = "http://127.0.0.1:8080";
57
- try {
58
- assert.equal(configureGlobalProxy(), true);
59
- assert.ok(getGlobalDispatcher() instanceof EnvProxyDispatcher);
60
- }
61
- finally {
62
- restoreDefaultDispatcher();
63
- }
64
- }));
65
- test("explicit --proxy wins over env vars", () => withCleanProxyEnv(() => {
66
- process.env.HTTPS_PROXY = "http://127.0.0.1:8080";
67
- try {
68
- assert.equal(configureGlobalProxy("http://127.0.0.1:9090"), true);
69
- assert.ok(getGlobalDispatcher() instanceof ProxyAgent);
70
- }
71
- finally {
72
- restoreDefaultDispatcher();
73
- }
74
- }));
75
- test("no proxy configuration leaves the default dispatcher untouched", () => withCleanProxyEnv(() => {
76
- restoreDefaultDispatcher();
77
- const before = getGlobalDispatcher();
78
- assert.equal(configureGlobalProxy(), false);
79
- assert.equal(getGlobalDispatcher(), before);
80
- }));
81
- test("an invalid explicit proxy does not throw and reports failure", () => withCleanProxyEnv(() => {
82
- restoreDefaultDispatcher();
83
- // ProxyAgent constructor accepts arbitrary strings; verify the call
84
- // path is resilient either way and never crashes startup.
85
- const result = configureGlobalProxy("://invalid");
86
- assert.equal(typeof result, "boolean");
87
- restoreDefaultDispatcher();
88
- }));
89
- //# sourceMappingURL=proxy.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy.test.js","sourceRoot":"","sources":["../../tests/proxy.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,89 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { createServer as createNetServer } from "node:net";
3
- import { test } from "node:test";
4
- import { Client } from "@modelcontextprotocol/sdk/client/index.js";
5
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
- import { SSEAcceptor } from "mcp-reverse";
7
- import { installFteTransportLifecycle } from "../src/transports/fte-lifecycle.js";
8
- import { startReverseServer } from "../src/transports/reverse.js";
9
- const noopLogger = {
10
- debug: () => { },
11
- info: () => { },
12
- warn: () => { },
13
- error: () => { },
14
- };
15
- async function freePort() {
16
- const server = createNetServer();
17
- await new Promise((resolve, reject) => {
18
- server.once("error", reject);
19
- server.listen(0, "127.0.0.1", resolve);
20
- });
21
- const address = server.address();
22
- if (!address || typeof address === "string")
23
- throw new Error("Could not allocate port");
24
- await new Promise((resolve) => server.close(() => resolve()));
25
- return address.port;
26
- }
27
- async function waitFor(predicate, timeout = 10_000) {
28
- const deadline = Date.now() + timeout;
29
- while (!predicate()) {
30
- if (Date.now() >= deadline)
31
- throw new Error("Timed out waiting for condition");
32
- await new Promise((resolve) => setTimeout(resolve, 10));
33
- }
34
- }
35
- test("staff reverse mode reconnects through a gateway restart with FTE wrapping enabled", async () => {
36
- const port = await freePort();
37
- const serverName = "staff-restart-test";
38
- const token = "staff-restart-token";
39
- const gatewayClients = [];
40
- const createAcceptor = () => {
41
- const acceptor = new SSEAcceptor({
42
- port,
43
- host: "127.0.0.1",
44
- authTokens: { [serverName]: token },
45
- heartbeat: { enabled: false },
46
- sessionTimeout: 5_000,
47
- }, noopLogger);
48
- acceptor.onConnection(async (connection) => {
49
- const gatewayClient = new Client({ name: "gateway-test", version: "1.0.0" });
50
- gatewayClients.push(gatewayClient);
51
- await gatewayClient.connect(connection.transport);
52
- });
53
- return acceptor;
54
- };
55
- let acceptor = createAcceptor();
56
- await acceptor.start();
57
- const mcpServer = new McpServer({ name: serverName, version: "1.0.0" });
58
- installFteTransportLifecycle(mcpServer, []);
59
- const reverseClient = await startReverseServer(mcpServer, `http://127.0.0.1:${port}/mcp-reverse`, token, serverName, {
60
- connectTimeout: 500,
61
- reconnect: {
62
- initialDelay: 10,
63
- maxDelay: 20,
64
- multiplier: 1,
65
- jitter: false,
66
- maxRetries: 0,
67
- },
68
- logger: noopLogger,
69
- });
70
- try {
71
- await waitFor(() => gatewayClients.length === 1 && gatewayClients[0].getServerVersion() !== undefined);
72
- assert.equal(acceptor.sessionCount, 1);
73
- await acceptor.close();
74
- await waitFor(() => !mcpServer.isConnected());
75
- // Leave the gateway down long enough for at least one failed attempt.
76
- await new Promise((resolve) => setTimeout(resolve, 100));
77
- acceptor = createAcceptor();
78
- await acceptor.start();
79
- await waitFor(() => gatewayClients.length >= 2 && gatewayClients[1].getServerVersion() !== undefined);
80
- assert.equal(acceptor.sessionCount, 1);
81
- assert.equal(mcpServer.isConnected(), true);
82
- }
83
- finally {
84
- await reverseClient.stop();
85
- await Promise.allSettled(gatewayClients.map((client) => client.close()));
86
- await acceptor.close();
87
- }
88
- });
89
- //# sourceMappingURL=reverse-reconnect.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reverse-reconnect.test.js","sourceRoot":"","sources":["../../tests/reverse-reconnect.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,UAAU,GAAW;IACzB,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;CAChB,CAAC;AAEF,KAAK,UAAU,QAAQ;IACrB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACxF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpE,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,SAAwB,EAAE,OAAO,GAAG,MAAM;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IACtC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC/E,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,IAAI,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;IACnG,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,oBAAoB,CAAC;IACxC,MAAM,KAAK,GAAG,qBAAqB,CAAC;IACpC,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC;YAC/B,IAAI;YACJ,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE;YACnC,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;YAC7B,cAAc,EAAE,KAAK;SACtB,EAAE,UAAU,CAAC,CAAC;QACf,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;YACzC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7E,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACnC,MAAM,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,IAAI,QAAQ,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,4BAA4B,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAC5C,SAAS,EACT,oBAAoB,IAAI,cAAc,EACtC,KAAK,EACL,UAAU,EACV;QACE,cAAc,EAAE,GAAG;QACnB,SAAS,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,CAAC;SACd;QACD,MAAM,EAAE,UAAU;KACnB,CACF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,KAAK,SAAS,CAAC,CAAC;QACvG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAEvC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAE9C,sEAAsE;QACtE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEzD,QAAQ,GAAG,cAAc,EAAE,CAAC;QAC5B,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,KAAK,SAAS,CAAC,CAAC;QAEtG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,21 +0,0 @@
1
- import { test } from "node:test";
2
- import assert from "node:assert";
3
- import path from "path";
4
- import { SecurityManager } from "../src/security.js";
5
- test("SecurityManager - Should allow paths inside allowed directories", () => {
6
- const security = new SecurityManager("/tmp/sandbox");
7
- const validated = security.resolveAndValidatePath("test.txt", "/tmp/sandbox");
8
- assert.strictEqual(validated, path.resolve("/tmp/sandbox/test.txt"));
9
- });
10
- test("SecurityManager - Should block paths outside allowed directories", () => {
11
- const security = new SecurityManager("/tmp/sandbox");
12
- assert.throws(() => {
13
- security.resolveAndValidatePath("../outside.txt", "/tmp/sandbox");
14
- }, /Security Error/);
15
- });
16
- test("SecurityManager - Should allow subdirectory access", () => {
17
- const security = new SecurityManager("/tmp/sandbox");
18
- const validated = security.resolveAndValidatePath("subdir/file.ts", "/tmp/sandbox");
19
- assert.strictEqual(validated, path.resolve("/tmp/sandbox/subdir/file.ts"));
20
- });
21
- //# sourceMappingURL=security.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security.test.js","sourceRoot":"","sources":["../../tests/security.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,sBAAsB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC9E,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC5E,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACjB,QAAQ,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IACpE,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IACpF,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,113 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { test, after } from "node:test";
3
- import { executeCommandCore, getTaskLogsCore, stopTaskCore, listTasksCore, cleanupAllTasks, } from "../src/tools/shell-tools.js";
4
- const CWD = process.cwd();
5
- const NODE = `"${process.execPath}"`;
6
- const IS_WIN = process.platform === "win32";
7
- after(() => {
8
- cleanupAllTasks();
9
- });
10
- test("fast command completes within the wait window and leaves no task behind", async () => {
11
- const result = await executeCommandCore(`${NODE} -e "console.log('hello-from-test')"`, CWD, 5000);
12
- assert.equal(result.isError, false);
13
- assert.equal(result.taskId, undefined);
14
- assert.match(result.text, /Exit Code: 0/);
15
- assert.match(result.text, /hello-from-test/);
16
- // one-shot commands are not tracked
17
- assert.match(listTasksCore().text, /No background tasks found/);
18
- });
19
- test("failing command reports a non-zero exit code as an error", async () => {
20
- const result = await executeCommandCore(`${NODE} -e "process.exit(3)"`, CWD, 5000);
21
- assert.equal(result.isError, true);
22
- assert.match(result.text, /Exit Code: 3/);
23
- });
24
- test("output larger than 1MB completes instead of dying with maxBuffer exceeded", async () => {
25
- // 2MB of output — the old exec-based implementation failed here (Node default maxBuffer = 1MB)
26
- const result = await executeCommandCore(`${NODE} -e "process.stdout.write('x'.repeat(2 * 1024 * 1024))"`, CWD, 30000);
27
- assert.equal(result.isError, false);
28
- assert.match(result.text, /Exit Code: 0/);
29
- // ring buffer (100KB) and result cap (50KB) must have kicked in
30
- assert.match(result.text, /truncated|dropped/i);
31
- assert.ok(result.text.length < 200_000, `result should be bounded, got ${result.text.length}`);
32
- });
33
- test("slow command yields a task ID, logs(wait) follows it to completion, stop reports already-exited", async () => {
34
- const result = await executeCommandCore(`${NODE} -e "console.log('started'); setTimeout(() => console.log('finished'), 2500)"`, CWD, 300);
35
- // not killed on timeout: moved to background with a task ID, NOT an error
36
- assert.equal(result.isError, false);
37
- assert.ok(result.taskId, "expected a task ID for the still-running process");
38
- assert.match(result.text, /still running/);
39
- assert.match(result.text, /NOT killed/);
40
- assert.match(result.text, /started/);
41
- assert.match(result.text, new RegExp(result.taskId));
42
- // logs(wait) blocks until new output OR exit; poll until the exit is observed
43
- const t0 = Date.now();
44
- let logs = await getTaskLogsCore(result.taskId, 100, 15000);
45
- for (let i = 0; i < 10 && !/exited \(code: 0\)/.test(logs.text); i++) {
46
- logs = await getTaskLogsCore(result.taskId, 100, 15000);
47
- }
48
- const elapsed = Date.now() - t0;
49
- assert.equal(logs.isError, false);
50
- assert.match(logs.text, /finished/);
51
- assert.match(logs.text, /exited \(code: 0\)/);
52
- assert.ok(elapsed < 14000, `logs(wait) returned after ${elapsed}ms, expected early wakeup on exit`);
53
- // stopping an already-exited task is a no-op, not an error
54
- const stop = await stopTaskCore(result.taskId);
55
- assert.equal(stop.isError, false);
56
- assert.match(stop.text, /already/);
57
- // exited task is still listed for postmortem
58
- assert.match(listTasksCore().text, new RegExp(result.taskId));
59
- });
60
- test("unknown task ID produces a helpful not-found error", async () => {
61
- const logs = await getTaskLogsCore("task_does_not_exist", 100, 0);
62
- assert.equal(logs.isError, true);
63
- assert.match(logs.text, /not found/);
64
- const stop = await stopTaskCore("task_does_not_exist");
65
- assert.equal(stop.isError, true);
66
- assert.match(stop.text, /not found/);
67
- });
68
- test("stop terminates the whole process group and keeps logs for postmortem", { skip: IS_WIN }, async () => {
69
- // Parent spawns a grandchild in the same process group, then both idle.
70
- const result = await executeCommandCore(`${NODE} -e "const { spawn } = require('child_process'); const g = spawn(process.execPath, ['-e', 'setInterval(() => {}, 1000)']); console.log('grandchild:' + g.pid); setInterval(() => {}, 1000);"`, CWD, 300);
71
- assert.equal(result.isError, false);
72
- assert.ok(result.taskId, "expected a task ID");
73
- // wait until the grandchild PID shows up in the logs
74
- let grandchildPid = null;
75
- for (let i = 0; i < 20 && grandchildPid === null; i++) {
76
- const logs = await getTaskLogsCore(result.taskId, 100, 1000);
77
- const m = logs.text.match(/grandchild:(\d+)/);
78
- if (m)
79
- grandchildPid = Number(m[1]);
80
- }
81
- assert.ok(grandchildPid, "grandchild PID should appear in task logs");
82
- const stop = await stopTaskCore(result.taskId);
83
- assert.equal(stop.isError, false);
84
- assert.match(stop.text, /stopped/);
85
- // the grandchild must be gone too (process-group kill, not just the shell)
86
- let alive = true;
87
- for (let i = 0; i < 30 && alive; i++) {
88
- try {
89
- process.kill(grandchildPid, 0);
90
- await new Promise((r) => setTimeout(r, 100));
91
- }
92
- catch {
93
- alive = false;
94
- }
95
- }
96
- assert.equal(alive, false, `grandchild process ${grandchildPid} should have been killed`);
97
- // postmortem: logs still available, status reflects the kill
98
- const postmortem = await getTaskLogsCore(result.taskId, 100, 0);
99
- assert.equal(postmortem.isError, false);
100
- assert.match(postmortem.text, /killed by stop/);
101
- });
102
- test("logs(wait) wakes up early when new output arrives", async () => {
103
- const result = await executeCommandCore(`${NODE} -e "setInterval(() => console.log('tick'), 400); setTimeout(() => process.exit(0), 5000);"`, CWD, 300);
104
- assert.ok(result.taskId);
105
- const t0 = Date.now();
106
- const logs = await getTaskLogsCore(result.taskId, 100, 30000); // generous cap
107
- const elapsed = Date.now() - t0;
108
- assert.equal(logs.isError, false);
109
- assert.match(logs.text, /tick/);
110
- assert.ok(elapsed < 10000, `logs(wait) should wake on new output, took ${elapsed}ms`);
111
- await stopTaskCore(result.taskId);
112
- });
113
- //# sourceMappingURL=shell-tools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shell-tools.test.js","sourceRoot":"","sources":["../../tests/shell-tools.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,4 +0,0 @@
1
- const message = "Hello World";
2
- console.log(message);
3
- export {};
4
- //# sourceMappingURL=test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../tests/test_files/test.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAW,aAAa,CAAC;AACtC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC"}