botmux 1.13.5 → 1.13.6
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/dist/server.d.ts.map +1 -1
- package/dist/server.js +35 -40
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsCpE,wBAAgB,YAAY,IAAI,SAAS,CA8ExC"}
|
package/dist/server.js
CHANGED
|
@@ -1,40 +1,39 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import {
|
|
4
|
-
import { join } from 'node:path';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
5
4
|
import { registerBot, loadBotConfigs } from './bot-registry.js';
|
|
6
5
|
import * as sessionStore from './services/session-store.js';
|
|
7
6
|
import { tools } from './tools/index.js';
|
|
8
7
|
import { logger } from './utils/logger.js';
|
|
9
8
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
9
|
+
* Walk up the process tree and check whether any ancestor has BOTMUX=1 in
|
|
10
|
+
* its environment. This precisely distinguishes a botmux-spawned MCP server
|
|
11
|
+
* (whose ancestor chain includes a worker with BOTMUX=1) from a standalone
|
|
12
|
+
* CLI-spawned one (whose ancestors are the user's shell — no BOTMUX).
|
|
13
|
+
*
|
|
14
|
+
* Process chains:
|
|
15
|
+
* botmux PTY: daemon → worker(BOTMUX=1) → CLI(inherits) → MCP server
|
|
16
|
+
* botmux tmux: daemon → worker(BOTMUX=1) → tmux(-e BOTMUX=1) → CLI → MCP server
|
|
17
|
+
* standalone: shell → CLI → MCP server (no BOTMUX anywhere in ancestry)
|
|
18
|
+
*
|
|
19
|
+
* Linux-specific: reads /proc/<pid>/environ (null-byte separated).
|
|
16
20
|
*/
|
|
17
|
-
function
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
// PID stale or file unreadable
|
|
33
|
-
}
|
|
21
|
+
function isAncestorBotmux() {
|
|
22
|
+
let pid = process.ppid;
|
|
23
|
+
for (let depth = 0; depth < 8 && pid > 1; depth++) {
|
|
24
|
+
try {
|
|
25
|
+
const environ = readFileSync(`/proc/${pid}/environ`, 'utf-8');
|
|
26
|
+
if (environ.split('\0').some(e => e === 'BOTMUX=1'))
|
|
27
|
+
return true;
|
|
28
|
+
const status = readFileSync(`/proc/${pid}/status`, 'utf-8');
|
|
29
|
+
const m = status.match(/PPid:\s*(\d+)/);
|
|
30
|
+
if (!m)
|
|
31
|
+
break;
|
|
32
|
+
pid = parseInt(m[1], 10);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
break; // process gone or unreadable
|
|
34
36
|
}
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
// dataDir unreadable
|
|
38
37
|
}
|
|
39
38
|
return false;
|
|
40
39
|
}
|
|
@@ -60,19 +59,15 @@ export function createServer() {
|
|
|
60
59
|
}
|
|
61
60
|
// Two-gate session detection:
|
|
62
61
|
//
|
|
63
|
-
// 1. BOTMUX=1 — set in the static MCP config
|
|
64
|
-
// MCP servers (the MCP SDK only passes config env + a
|
|
65
|
-
// to the server subprocess, NOT the full parent env).
|
|
66
|
-
//
|
|
67
|
-
// 2. isDaemonRunning() — verifies a botmux daemon is actually alive via
|
|
68
|
-
// PID files in SESSION_DATA_DIR. This prevents standalone CLI sessions
|
|
69
|
-
// (after daemon has stopped) from registering tools just because the
|
|
70
|
-
// static BOTMUX=1 flag persists in the config.
|
|
62
|
+
// 1. BOTMUX=1 in env — set in the static MCP config so it reaches all
|
|
63
|
+
// CLI MCP servers (the MCP SDK only passes config env + a 6-var
|
|
64
|
+
// whitelist to the server subprocess, NOT the full parent env).
|
|
71
65
|
//
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
|
|
66
|
+
// 2. isAncestorBotmux() — walks /proc/<pid>/environ up the process tree
|
|
67
|
+
// to verify THIS MCP server was actually spawned by a botmux worker.
|
|
68
|
+
// A standalone CLI's ancestors (user shell) won't have BOTMUX=1,
|
|
69
|
+
// even if a botmux daemon happens to be running on the same machine.
|
|
70
|
+
const isBotmuxSession = process.env.BOTMUX === '1' && isAncestorBotmux();
|
|
76
71
|
const instructions = isBotmuxSession
|
|
77
72
|
? [
|
|
78
73
|
'You are connected to a Lark (Feishu) topic group. The user reads Lark, not your terminal.',
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|